[PATCH] 5/6 2.5.44 scsi multi-path IO - qla driver changes

Patrick Mansfield (patmans@us.ibm.com)
Fri, 25 Oct 2002 15:24:06 -0700


multi-path IO and 2.5.x changes for the qla 6.03.00 Beta 7 driver.

Apply this on top of the driver found at:

http://download.qlogic.com/drivers/6443/qla2x00-v6.03.00b7-dist.tgz

Makefile | 9 ++++++
qla2x00.c | 74 ++++++++++++++++++++------------------------------------
qla2x00.h | 7 ++---
qla2x00_ioctl.c | 4 ++-
qla_settings.h | 2 -
5 files changed, 43 insertions(+), 53 deletions(-)

diff -urN -X /home/patman/dontdiff qla2x00src-v6.03.00b7/Makefile qla2x00src-v6.03.00b7-mpath/Makefile
--- qla2x00src-v6.03.00b7/Makefile Wed Dec 31 16:00:00 1969
+++ qla2x00src-v6.03.00b7-mpath/Makefile Wed Oct 23 13:01:45 2002
@@ -0,0 +1,9 @@
+# andmike's condensed makefile
+# To use cd to kernel source and type the following.
+# make SUBDIRS=/path/to/your/module modules
+
+CFLAGS_qla2200.o = -I$(TOPDIR)/drivers/scsi
+CFLAGS_qla2300.o = -I$(TOPDIR)/drivers/scsi
+obj-m := qla2200.o qla2300.o
+
+include $(TOPDIR)/Rules.make
diff -urN -X /home/patman/dontdiff qla2x00src-v6.03.00b7/qla2x00.c qla2x00src-v6.03.00b7-mpath/qla2x00.c
--- qla2x00src-v6.03.00b7/qla2x00.c Mon Oct 14 06:15:26 2002
+++ qla2x00src-v6.03.00b7-mpath/qla2x00.c Wed Oct 23 13:15:06 2002
@@ -77,7 +77,6 @@
#include <linux/pci.h>
#include <linux/proc_fs.h>
#include <linux/blk.h>
-#include <linux/tqueue.h>
#include <linux/interrupt.h>
#include <linux/stat.h>
#include <linux/slab.h>
@@ -228,7 +227,7 @@
STATIC uint8_t qla2x00_register_with_Linux(scsi_qla_host_t *ha,
uint8_t maxchannels);
STATIC int qla2x00_done(scsi_qla_host_t *);
-STATIC void qla2x00_select_queue_depth(struct Scsi_Host *, Scsi_Device *);
+STATIC int qla2x00_slave_attach(Scsi_Device *);

STATIC void qla2x00_timer(scsi_qla_host_t *);

@@ -2227,7 +2226,6 @@

host->can_queue = max_srbs; /* default value:-MAX_SRBS(4096) */
host->cmd_per_lun = 1;
- host->select_queue_depths = qla2x00_select_queue_depth;
host->n_io_port = 0xFF;

#if MEMORY_MAPPED_IO
@@ -3690,11 +3688,11 @@

heads = 64;
sectors = 32;
- cylinders = disk->capacity / (heads * sectors);
+ cylinders = sector_div(disk->capacity, heads * sectors);
if (cylinders > 1024) {
heads = 255;
sectors = 63;
- cylinders = disk->capacity / (heads * sectors);
+ cylinders = sector_div(disk->capacity, heads * sectors);
}

geom[0] = heads;
@@ -4318,7 +4316,7 @@
}

/**************************************************************************
-* qla2x00_device_queue_depth
+* qla2x00_slave_attach
* Determines the queue depth for a given device. There are two ways
* a queue depth can be obtained for a tagged queueing device. One
* way is the default queue depth which is determined by whether
@@ -4326,54 +4324,25 @@
* as the default queue depth. Otherwise, we use either 4 or 8 as the
* default queue depth (dependent on the number of hardware SCBs).
**************************************************************************/
-void
-qla2x00_device_queue_depth(scsi_qla_host_t *p, Scsi_Device *device)
+STATIC int
+qla2x00_slave_attach(Scsi_Device *device)
{
- int default_depth = 16;
+ int queue_depth = 16;

- device->queue_depth = default_depth;
if (device->tagged_supported) {
device->tagged_queue = 1;
device->current_tag = 0;
#if defined(MODULE)
if (!(ql2xmaxqdepth == 0 || ql2xmaxqdepth > 256))
- device->queue_depth = ql2xmaxqdepth;
+ queue_depth = ql2xmaxqdepth;
#endif
-
- printk(KERN_INFO
- "scsi(%d:%d:%d:%d): Enabled tagged queuing, "
- "queue depth %d.\n",
- (int)p->host_no,
- device->channel,
- device->id,
- device->lun,
- device->queue_depth);
- }
-
-}
-
-/**************************************************************************
-* qla2x00_select_queue_depth
-*
-* Description:
-* Sets the queue depth for each SCSI device hanging off the input
-* host adapter. We use a queue depth of 2 for devices that do not
-* support tagged queueing.
-**************************************************************************/
-STATIC void
-qla2x00_select_queue_depth(struct Scsi_Host *host, Scsi_Device *scsi_devs)
-{
- Scsi_Device *device;
- scsi_qla_host_t *p = (scsi_qla_host_t *) host->hostdata;
-
- ENTER("qla2x00_select_queue_depth");
-
- for (device = scsi_devs; device != NULL; device = device->next) {
- if (device->host == host)
- qla2x00_device_queue_depth(p, device);
+ printk(KERN_INFO "Enabled tagged queuing, queue depth %d for ",
+ queue_depth);
+ scsi_paths_printk(device, " ", "<%d:%d:%d:%d>");
+ printk("\n");
}
-
- LEAVE("qla2x00_select_queue_depth");
+ scsi_adjust_queue_depth(device, MSG_ORDERED_TAG, queue_depth);
+ return 0;
}

/**************************************************************************
@@ -5793,7 +5762,9 @@
pci_set_master(ha->pdev);
pci_read_config_word(ha->pdev,OFFSET(creg->revision_id), &buf_wd);
ha->revision = buf_wd;
+#if (MEMORY_MAPPED_IO == 0)
if (!ha->iobase) {
+#endif
/* Get command register. */
if (pci_read_config_word(
ha->pdev,OFFSET(creg->command),
@@ -5872,7 +5843,9 @@
}
}
}
+#if (MEMORY_MAPPED_IO == 0)
} else
+#endif
status = 0;


@@ -15903,9 +15876,16 @@
unsigned int cmd, unsigned long arg)
{
Scsi_Device fake_scsi_device;
- fake_scsi_device.host = apidev_host;
+ int ret;

- return (qla2x00_ioctl(&fake_scsi_device, (int)cmd, (void*)arg));
+ if (scsi_add_path(&fake_scsi_device, apidev_host, 0,
+ apidev_host->this_id, 0))
+ return -ENODEV;
+ ret = qla2x00_ioctl(&fake_scsi_device, (int)cmd, (void*)arg);
+ scsi_remove_path(&fake_scsi_device, SCSI_FIND_ALL_HOST_NO,
+ SCSI_FIND_ALL_CHANNEL, SCSI_FIND_ALL_ID,
+ SCSI_FIND_ALL_LUN);
+ return ret;
}

static struct file_operations apidev_fops = {
diff -urN -X /home/patman/dontdiff qla2x00src-v6.03.00b7/qla2x00.h qla2x00src-v6.03.00b7-mpath/qla2x00.h
--- qla2x00src-v6.03.00b7/qla2x00.h Mon Oct 14 06:15:26 2002
+++ qla2x00src-v6.03.00b7-mpath/qla2x00.h Wed Oct 23 13:12:42 2002
@@ -129,8 +129,8 @@
/*
* I/O register
*/
-/* #define MEMORY_MAPPED_IO */ /* Enable memory mapped I/O */
-#undef MEMORY_MAPPED_IO /* Disable memory mapped I/O */
+#define MEMORY_MAPPED_IO 1 /* Enable memory mapped I/O */
+/* #undef MEMORY_MAPPED_IO Disable memory mapped I/O */

#if defined(MEMORY_MAPPED_IO)
#define RD_REG_BYTE(addr) readb(addr)
@@ -2710,7 +2710,6 @@


#define QLA2100_LINUX_TEMPLATE { \
- next: NULL, \
module: NULL, \
proc_dir: NULL, \
proc_info: qla2x00_proc_info, \
@@ -2728,7 +2727,7 @@
eh_host_reset_handler: qla2xxx_eh_host_reset, \
abort: NULL, \
reset: NULL, \
- slave_attach: NULL, \
+ slave_attach: qla2x00_slave_attach, \
bios_param: QLA2100_BIOSPARAM, \
can_queue: 255, /* max simultaneous cmds */\
this_id: -1, /* scsi id of host adapter */\
diff -urN -X /home/patman/dontdiff qla2x00src-v6.03.00b7/qla2x00_ioctl.c qla2x00src-v6.03.00b7-mpath/qla2x00_ioctl.c
--- qla2x00src-v6.03.00b7/qla2x00_ioctl.c Mon Oct 14 06:15:26 2002
+++ qla2x00src-v6.03.00b7-mpath/qla2x00_ioctl.c Wed Oct 23 13:01:02 2002
@@ -240,7 +240,9 @@
return (-EINVAL);
}

- host = dev->host;
+ host = scsi_get_host(dev);
+ if (!host)
+ return(-EINVAL);
ha = (scsi_qla_host_t *) host->hostdata; /* midlayer chosen instance */

ret = verify_area(VERIFY_READ, (void *)arg, sizeof(EXT_IOCTL));
diff -urN -X /home/patman/dontdiff qla2x00src-v6.03.00b7/qla_settings.h qla2x00src-v6.03.00b7-mpath/qla_settings.h
--- qla2x00src-v6.03.00b7/qla_settings.h Mon Oct 14 06:15:26 2002
+++ qla2x00src-v6.03.00b7-mpath/qla_settings.h Wed Oct 23 13:11:58 2002
@@ -65,7 +65,7 @@
* - a tasklet to process the done queue and send requests back to
* the OS.
*/
-#define QLA2X_PERFORMANCE 1
+#define QLA2X_PERFORMANCE 0

/* The following WORD_FW_LOAD is defined in Makefile for ia-64 builds
and can also be decommented here for Word by Word confirmation of
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/