INTRODUCTION

This is an SCST driver for ISP Qlogic chipsets commonly used in many SCSI and
FC host bus adapters. Supported chipsets are listed in the README file.

It is based on Matthew Jacob's multiplatform driver for ISP chipsets,
which has its own page at http://www.feral.com/isp.html . The update for SCST
was made by Stanislaw Gruszka <stf_xl@wp.pl> for Open-E Inc.

Driver operates on the same hardware as qla2x00t, but has one notable
advantage over it: support of 24xx and 25xx series of Qlogic adapters.
From other side, qla2x00t is simpler, smaller and much better tested
on 22xx and 23xx, hence perform more reliable and, thus, is recommended
for these adapters. Since 24xx/25xx become fully supported on qla2x00t we
encourage users to switch to this driver.

INSTALLATION

Build driver with the following command
$ make

Copy the firmware image appropriate for your HBA from the Qlogic FTP server
ftp://ftp.qlogic.com/outgoing/linux/firmware/ to one of the Linux firmware
loader directories (e.g. /lib/firmware, see the udev/hotplug documentation
for your distribution).

The next step depends on whether you have other QLA modules installed. Note
that you can't load an ISP driver when you build other Qlogic drivers in the
kernel (kerel oops may occur). Other QLA modules are acceptable, but extra
care is needed, first copy modules to a directory, e.g.:

$ mkdir /root/qla_isp
$ cp linux-2.6/build/*.ko /root/qla_isp

Each time you want to run qla_isp, unload all other qla modules

$ rmmod qla2x00tgt
$ rmmod qla2400
$ rmmod qla2300
$ rmmod qla2200
$ rmmod qla2xxx

and load ISP modules directly from the created directory, e.g.:

$ insmod /root/qla_isp/isp_scst.ko
$ insmod /root/qla_isp/isp_mod.ko

If you have neither other QLA drivers from SCST (qla2x00tgt) nor kernel
(qla2xxx and friends) you can install in the standard /lib/modules directory:

$ make install
$ depmod -ea

Then load the drivers manually the first time :

$ modprobe isp_scst
$ modprobe isp_mod

Now whenever the system is booted and a QLA card is plugged, modules will load
automatically.

When the driver is loaded, enable all channels for each HBA to work in target
mode. For Fibre Channel adapters you need to write the "enable all" string
into the procfs configuration file, e.g.:

$ echo "enable all" > /proc/scsi_tgt/qla_isp/3

To unload the isp_mod.ko module you must disable target mode for all cards,
e.g.:

$ echo "disable all" > /proc/scsi_tgt/qla_isp/3
$ echo "disable all" > /proc/scsi_tgt/qla_isp/4

To attach logical units continue with normal SCST setup.

SELECTING FIRMWARE

The firmware loading interface allows for choosing the appropriate firmware.
However, some firmware images are not available from the Qlogic site, e.g.
firmware with multichannel support. That is why you can build a firmware
image into the isp_mod module. At the beginning of the isp_linux.h file you
need to add the following line:

#define DISABLE_FW_LOADER 1

Then, if you load module with isp_vports parameter > 0, driver will use
multichannel firmware.

SUPPORTED DEVICES

You can disable support for selected chipsets by editing the isp_linux.h file.
In the following example, only the 2400 chipset is enabled:

#define ISP_DISABLE_1080_SUPPORT 1
#define ISP_DISABLE_12160_SUPPORT 1
#define ISP_DISABLE_2100_SUPPORT 1
#define ISP_DISABLE_2200_SUPPORT 1
#define ISP_DISABLE_2300_SUPPORT 1
#define ISP_DISABLE_2322_SUPPORT 1
//#define ISP_DISABLE_2400_SUPPORT 1

TARGET/INITIATOR ROLES

The driver can work as either a target or an initiator. Prior to performing
the compilation you can establish the default mode the driver will work in
by editing the file linux-2.6/build/Makefile - you need to set one of the
following values instead of ISP_ROLE_NONE
in -DISP_DEFAULT_ROLES=ISP_ROLE_NONE

ISP_ROLE_TARGET
ISP_ROLE_INITIATOR
ISP_ROLE_BOTH

You can also establish the driver role during module initialization using the
isp_roles option, e.g:

$ modprobe isp_mod isp_roles="b0300=initiator"

Number "b0300" is a DEVID value based on an address on the PCI bus, which you
can find in /proc/scsi/isp/N. Target role will be enabled automatically when
activating channels/LUNs in /proc/scsi_tgt/qla_isp/N .

The driver can also work as both a target and an initiator simultaneously, but
this will probably only function for P2P connections. To make the driver work
as a target/initator on one port with a FC switch, you can use N_PORT ID
virtualization, as seen below.

N_PORT ID VIRTUALIZATION

You can add an isp_vports option to the ISP module. It denotes the number of
ports(channels) and cannot be greater than 127. Each vport has its own WWN.
From the driver point of view each vport is a separate channel. You can define
separate role for each of the channels.

Note that firmware that supports multiple ids must be used.

PROCFS INTERFACE

Target configuration interface is located in the following file:
/proc/scsi_tgt/qla_isp/N ; where N is the Linux SCSI host number and
is the same as for proc/scsi/isp/N and /sys/class/scsi_host/hostN files.

The process for enabling options for this file is different for FC and SPI
devices. For FC it is enabling/disabling channels, while SPI it is
enabling/disabling channels and logical units. For example:
FC:
$ echo "enable 5"  >  /proc/scsi_tgt/qla_isp/4

SPI:
$ echo "enable 0 1" > /proc/scsi_tgt/qla_isp/5

You may use the string "all" instead of a number e.g.:

$echo "disable all all"  > /proc/scsi_tgt/qla_isp/5

When all LUNs and channels are disabled, the target role will also become
inactive. For N_PORT ID virtualization, when enabling channels, you need to
first enable channel 0; when disabling channels, you need to disable channel
0 last.

Send questions about this driver to scst-devel@lists.sourceforge.net, CC
Matthew Jacob <lydianconcepts@gmail.com> and Stanislaw Gruszka <stf_xl@wp.pl>.
