diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-23 16:37:29 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-23 16:37:29 -0700 |
commit | 1212663fba7c5e003e05d24f043d5ed57eb18b24 (patch) | |
tree | d6d1327b1e852721952e2efc8aabca25e73573f0 | |
parent | af76bbabbdf5cebea6a3863446f9f74b469c4bdc (diff) | |
parent | af2709fd0d127cd590e7a77ab50b23cdb9f6f48f (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (39 commits)
[SCSI] qla2xxx: Update version number to 8.02.00-k5.
[SCSI] qla2xxx: Correct display of ISP serial-number.
[SCSI] qla2xxx: Correct residual-count handling discrepancies during UNDERRUN handling.
[SCSI] qla2xxx: Make driver (mostly) legacy I/O port free.
[SCSI] qla2xxx: Fix issue where final flash-segment updates were falling into the slow-path write handler.
[SCSI] qla2xxx: Handle unaligned sector writes during NVRAM/VPD updates.
[SCSI] qla2xxx: Defer explicit interrupt-polling processing to init-time scenarios.
[SCSI] qla2xxx: Resync with latest HBA SSID specification -- 2.2u.
[SCSI] sym53c8xx: Remove sym_xpt_async_sent_bdr
[SCSI] sym53c8xx: Remove pci_dev pointer from sym_shcb
[SCSI] sym53c8xx: Make interrupt handler capable of returning IRQ_NONE
[SCSI] sym53c8xx: Get rid of IRQ_FMT and IRQ_PRM
[SCSI] sym53c8xx: Use scmd_printk where appropriate
[SCSI] sym53c8xx: Simplify DAC DMA handling
[SCSI] sym53c8xx: Remove tag_ctrl module parameter
[SCSI] sym53c8xx: Remove io_ws, mmio_ws and ram_ws elements
[SCSI] sym53c8xx: Remove ->device_id
[SCSI] sym53c8xx: Use pdev->revision
[SCSI] sym53c8xx: PCI Error Recovery support
[SCSI] sym53c8xx: Stop overriding scsi_done
...
60 files changed, 675 insertions, 5316 deletions
diff --git a/Documentation/scsi/sym53c8xx_2.txt b/Documentation/scsi/sym53c8xx_2.txt index 3d9f06bb3d0..49ea5c58c6b 100644 --- a/Documentation/scsi/sym53c8xx_2.txt +++ b/Documentation/scsi/sym53c8xx_2.txt @@ -449,25 +449,14 @@ options as above. cmd_per_lun=#tags (#tags > 1) tagged command queuing enabled #tags will be truncated to the max queued commands configuration parameter. -10.2.2 Detailed control of tagged commands - This option allows you to specify a command queue depth for each device - that supports tagged command queueing. - Example: - tag_ctrl=10/t2t3q16-t5q24/t1u2q32 - will set devices queue depth as follow: - - controller #0 target #2 and target #3 -> 16 commands, - - controller #0 target #5 -> 24 commands, - - controller #1 target #1 logical unit #2 -> 32 commands, - - all other logical units (all targets, all controllers) -> 10 commands. - -10.2.3 Burst max +10.2.2 Burst max burst=0 burst disabled burst=255 get burst length from initial IO register settings. burst=#x burst enabled (1<<#x burst transfers max) #x is an integer value which is log base 2 of the burst transfers max. By default the driver uses the maximum value supported by the chip. -10.2.4 LED support +10.2.3 LED support led=1 enable LED support led=0 disable LED support Do not enable LED support if your scsi board does not use SDMS BIOS. @@ -560,9 +549,9 @@ Previously, the sym2 driver accepted arguments of the form sym53c8xx=tags:4,sync:10,debug:0x200 As a result of the new module parameters, this is no longer available. -Most of the options have remained the same, but tags has split into -cmd_per_lun and tag_ctrl for its two different purposes. The sample above -would be specified as: +Most of the options have remained the same, but tags has become +cmd_per_lun to reflect its different purposes. The sample above would +be specified as: modprobe sym53c8xx cmd_per_lun=4 sync=10 debug=0x200 or on the kernel boot line as: diff --git a/MAINTAINERS b/MAINTAINERS index 40245af2d0e..05504f2ff11 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -325,6 +325,12 @@ M: Juergen Fischer <fischer@norbit.de> L: linux-scsi@vger.kernel.org S: Maintained +AIC7XXX / AIC79XX SCSI DRIVER +P: Hannes Reinecke +M: hare@suse.de +L: linux-scsi@vger.kernel.org +S: Maintained + ALCATEL SPEEDTOUCH USB DRIVER P: Duncan Sands M: duncan.sands@free.fr diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig index 03c4e5c1b94..bd59ab0760b 100644 --- a/arch/sparc64/Kconfig +++ b/arch/sparc64/Kconfig @@ -460,8 +460,6 @@ source "drivers/Kconfig" source "drivers/sbus/char/Kconfig" -source "drivers/fc4/Kconfig" - source "fs/Kconfig" source "kernel/Kconfig.instrumentation" diff --git a/drivers/Makefile b/drivers/Makefile index 560496b4330..8cb37e3557d 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -34,7 +34,6 @@ obj-$(CONFIG_NUBUS) += nubus/ obj-$(CONFIG_ATM) += atm/ obj-y += macintosh/ obj-$(CONFIG_IDE) += ide/ -obj-$(CONFIG_FC4) += fc4/ obj-$(CONFIG_SCSI) += scsi/ obj-$(CONFIG_ATA) += ata/ obj-$(CONFIG_FUSION) += message/ diff --git a/drivers/fc4/Kconfig b/drivers/fc4/Kconfig deleted file mode 100644 index 345dbe6f10d..00000000000 --- a/drivers/fc4/Kconfig +++ /dev/null @@ -1,81 +0,0 @@ -# -# FC4 device configuration -# - -menu "Fibre Channel support" - -config FC4 - tristate "Fibre Channel and FC4 SCSI support" - ---help--- - Fibre Channel is a high speed serial protocol mainly used to - connect large storage devices to the computer; it is compatible with - and intended to replace SCSI. - - This is an experimental support for storage arrays connected to your - computer using optical fibre cables and the "X3.269-199X Fibre - Channel Protocol for SCSI" specification. If you want to use this, - you need to say Y here and to "SCSI support" as well as to the - drivers for the storage array itself and for the interface adapter - such as SOC or SOC+. This subsystem could even serve for IP - networking, with some code extensions. - - If unsure, say N. - -comment "FC4 drivers" - depends on FC4 - -config FC4_SOC - tristate "Sun SOC/Sbus" - depends on FC4!=n && SPARC - help - Serial Optical Channel is an interface card with one or two Fibre - Optic ports, each of which can be connected to a disk array. Note - that if you have older firmware in the card, you'll need the - microcode from the Solaris driver to make it work. - - To compile this support as a module, choose M here: the module will - be called soc. - -config FC4_SOCAL - tristate "Sun SOC+ (aka SOCAL)" - depends on FC4!=n && SPARC - ---help--- - Serial Optical Channel Plus is an interface card with up to two - Fibre Optic ports. This card supports FC Arbitrated Loop (usually - A5000 or internal FC disks in E[3-6]000 machines through the - Interface Board). You'll probably need the microcode from the - Solaris driver to make it work. - - To compile this support as a module, choose M here: the module will - be called socal. - -comment "FC4 targets" - depends on FC4 - -config SCSI_PLUTO - tristate "SparcSTORAGE Array 100 and 200 series" - depends on FC4!=n && SCSI - help - If you never bought a disk array made by Sun, go with N. - - To compile this support as a module, choose M here: the module will - be called pluto. - -config SCSI_FCAL - tristate "Sun Enterprise Network Array (A5000 and EX500)" if SPARC - depends on FC4!=n && SCSI - help - This driver drives FC-AL disks connected through a Fibre Channel - card using the drivers/fc4 layer (currently only SOCAL). The most - common is either A5000 array or internal disks in E[3-6]000 - machines. - - To compile this support as a module, choose M here: the module will - be called fcal. - -config SCSI_FCAL - prompt "Generic FC-AL disk driver" - depends on FC4!=n && SCSI && !SPARC - -endmenu - diff --git a/drivers/fc4/Makefile b/drivers/fc4/Makefile deleted file mode 100644 index 0db3fbb553e..00000000000 --- a/drivers/fc4/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# -# Makefile for the Linux Fibre Channel device drivers. -# - -fc4-objs := fc.o fc_syms.o - -obj-$(CONFIG_FC4) += fc4.o -obj-$(CONFIG_FC4_SOC) += soc.o -obj-$(CONFIG_FC4_SOCAL) += socal.o diff --git a/drivers/fc4/fc-al.h b/drivers/fc4/fc-al.h deleted file mode 100644 index 62d3ca436d7..00000000000 --- a/drivers/fc4/fc-al.h +++ /dev/null @@ -1,27 +0,0 @@ -/* fc-al.h: Definitions for Fibre Channel Arbitrated Loop topology. - * - * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) - * - * Sources: - * Fibre Channel Arbitrated Loop (FC-AL), ANSI, Rev. 4.5, 1995 - */ - -#ifndef __FC_AL_H -#define __FC_AL_H - -/* Loop initialization payloads */ -#define FC_AL_LISM 0x11010000 /* Select Master, 12B payload */ -#define FC_AL_LIFA 0x11020000 /* Fabric Assign AL_PA bitmap, 20B payload */ -#define FC_AL_LIPA 0x11030000 /* Previously Acquired AL_PA bitmap, 20B payload */ -#define FC_AL_LIHA 0x11040000 /* Hard Assigned AL_PA bitmap, 20B payload */ -#define FC_AL_LISA 0x11050000 /* Soft Assigned AL_PA bitmap, 20B payload */ -#define FC_AL_LIRP 0x11060000 /* Report AL_PA position map, 132B payload */ -#define FC_AL_LILP 0x11070000 /* Loop AL_PA position map, 132B payload */ - -typedef struct { - u32 magic; - u8 len; - u8 alpa[127]; -} fc_al_posmap; - -#endif /* !(__FC_H) */ diff --git a/drivers/fc4/fc.c b/drivers/fc4/fc.c deleted file mode 100644 index 82de9e1adb1..00000000000 --- a/drivers/fc4/fc.c +++ /dev/null @@ -1,1146 +0,0 @@ -/* fc.c: Generic Fibre Channel and FC4 SCSI driver. - * - * Copyright (C) 1997,1998,1999 Jakub Jelinek (jj@ultra.linux.cz) - * Copyright (C) 1997,1998 Jirka Hanika (geo@ff.cuni.cz) - * - * There are two kinds of Fibre Channel adapters used in Linux. Either - * the adapter is "smart" and does all FC bookkeeping by itself and - * just presents a standard SCSI interface to the operating system - * (that's e.g. the case with Qlogic FC cards), or leaves most of the FC - * bookkeeping to the OS (e.g. soc, socal). Drivers for the former adapters - * will look like normal SCSI drivers (with the exception of max_id will be - * usually 127), the latter on the other side allows SCSI, IP over FC and other - * protocols. This driver tree is for the latter adapters. - * - * This file should support both Point-to-Point and Arbitrated Loop topologies. - * - * Sources: - * Fibre Channel Physical & Signaling Interface (FC-PH), dpANS, 1994 - * dpANS Fibre Channel Protocol for SCSI (X3.269-199X), Rev. 012, 1995 - * Fibre Channel Arbitrated Loop (FC-AL), Rev. 4.5, 1995 - * Fibre Channel Private Loop SCSI Direct Attach (FC-PLDA), Rev. 2.1, 1997 - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/jiffies.h> -#include <linux/types.h> -#include <linux/fcntl.h> -#include <linux/interrupt.h> -#include <linux/ptrace.h> -#include <linux/ioport.h> -#include <linux/in.h> -#include <linux/slab.h> -#include <linux/string.h> -#include <linux/init.h> - -#include <asm/pgtable.h> -#include <asm/irq.h> -#include <asm/semaphore.h> -#include "fcp_impl.h" -#include <scsi/scsi_host.h> - -/* #define FCDEBUG */ - -#define fc_printk printk ("%s: ", fc->name); printk - -#ifdef FCDEBUG -#define FCD(x) fc_printk x; -#define FCND(x) printk ("FC: "); printk x; -#else -#define FCD(x) -#define FCND(x) -#endif - -#ifdef __sparc__ -#define dma_alloc_consistent(d,s,p) sbus_alloc_consistent(d,s,p) -#define dma_free_consistent(d,s,v,h) sbus_free_consistent(d,s,v,h) -#define dma_map_single(d,v,s,dir) sbus_map_single(d,v,s,dir) -#define dma_unmap_single(d,h,s,dir) sbus_unmap_single(d,h,s,dir) -#define dma_map_sg(d,s,n,dir) sbus_map_sg(d,s,n,dir) -#define dma_unmap_sg(d,s,n,dir) sbus_unmap_sg(d,s,n,dir) -#else -#define dma_alloc_consistent(d,s,p) pci_alloc_consistent(d,s,p) -#define dma_free_consistent(d,s,v,h) pci_free_consistent(d,s,v,h) -#define dma_map_single(d,v,s,dir) pci_map_single(d,v,s,dir) -#define dma_unmap_single(d,h,s,dir) pci_unmap_single(d,h,s,dir) -#define dma_map_sg(d,s,n,dir) pci_map_sg(d,s,n,dir) -#define dma_unmap_sg(d,s,n,dir) pci_unmap_sg(d,s,n,dir) -#endif - -#define FCP_CMND(SCpnt) ((fcp_cmnd *)&(SCpnt->SCp)) -#define FC_SCMND(SCpnt) ((fc_channel *)(SCpnt->device->host->hostdata[0])) -#define SC_FCMND(fcmnd) ((struct scsi_cmnd *)((long)fcmnd - (long)&(((struct scsi_cmnd *)0)->SCp))) - -static int fcp_scsi_queue_it(fc_channel *, struct scsi_cmnd *, fcp_cmnd *, int); -void fcp_queue_empty(fc_channel *); - -static void fcp_scsi_insert_queue (fc_channel *fc, fcp_cmnd *fcmd) -{ - if (!fc->scsi_que) { - fc->scsi_que = fcmd; - fcmd->next = fcmd; - fcmd->prev = fcmd; - } else { - fc->scsi_que->prev->next = fcmd; - fcmd->prev = fc->scsi_que->prev; - fc->scsi_que->prev = fcmd; - fcmd->next = fc->scsi_que; - } -} - -static void fcp_scsi_remove_queue (fc_channel *fc, fcp_cmnd *fcmd) -{ - if (fcmd == fcmd->next) { - fc->scsi_que = NULL; - return; - } - if (fcmd == fc->scsi_que) - fc->scsi_que = fcmd->next; - fcmd->prev->next = fcmd->next; - fcmd->next->prev = fcmd->prev; -} - -fc_channel *fc_channels = NULL; - -#define LSMAGIC 620829043 -typedef struct { - /* Must be first */ - struct semaphore sem; - int magic; - int count; - logi *logi; - fcp_cmnd *fcmds; - atomic_t todo; - struct timer_list timer; - unsigned char grace[0]; -} ls; - -#define LSOMAGIC 654907799 -typedef struct { - /* Must be first */ - struct semaphore sem; - int magic; - int count; - fcp_cmnd *fcmds; - atomic_t todo; - struct timer_list timer; -} lso; - -#define LSEMAGIC 84482456 -typedef struct { - /* Must be first */ - struct semaphore sem; - int magic; - int status; - struct timer_list timer; -} lse; - -static void fcp_login_timeout(unsigned long data) -{ - ls *l = (ls *)data; - FCND(("Login timeout\n")) - up(&l->sem); -} - -static void fcp_login_done(fc_channel *fc, int i, int status) -{ - fcp_cmnd *fcmd; - logi *plogi; - fc_hdr *fch; - ls *l = (ls *)fc->ls; - - FCD(("Login done %d %d\n", i, status)) - if (i < l->count) { - if (fc->state == FC_STATE_FPORT_OK) { - FCD(("Additional FPORT_OK received with status %d\n", status)) - return; - } - switch (status) { - case FC_STATUS_OK: /* Oh, we found a fabric */ - case FC_STATUS_P_RJT: /* Oh, we haven't found any */ - fc->state = FC_STATE_FPORT_OK; - fcmd = l->fcmds + i; - plogi = l->logi + 3 * i; - dma_unmap_single (fc->dev, fcmd->cmd, 3 * sizeof(logi), - DMA_BIDIRECTIONAL); - plogi->code = LS_PLOGI; - memcpy (&plogi->nport_wwn, &fc->wwn_nport, sizeof(fc_wwn)); - memcpy (&plogi->node_wwn, &fc->wwn_node, sizeof(fc_wwn)); - memcpy (&plogi->common, fc->common_svc, sizeof(common_svc_parm)); - memcpy (&plogi->class1, fc->class_svcs, 3*sizeof(svc_parm)); - fch = &fcmd->fch; - fcmd->token += l->count; - FILL_FCHDR_RCTL_DID(fch, R_CTL_ELS_REQ, fc->did); - FILL_FCHDR_SID(fch, fc->sid); -#ifdef FCDEBUG - { - int i; - unsigned *x = (unsigned *)plogi; - printk ("logi: "); - for (i = 0; i < 21; i++) - printk ("%08x ", x[i]); - printk ("\n"); - } -#endif - fcmd->cmd = dma_map_single (fc->dev, plogi, 3 * sizeof(logi), - DMA_BIDIRECTIONAL); - fcmd->rsp = fcmd->cmd + 2 * sizeof(logi); - if (fc->hw_enque (fc, fcmd)) - printk ("FC: Cannot enque PLOGI packet on %s\n", fc->name); - break; - case FC_STATUS_ERR_OFFLINE: - fc->state = FC_STATE_MAYBEOFFLINE; - FCD (("FC is offline %d\n", l->grace[i])) - break; - default: - printk ("FLOGI failed for %s with status %d\n", fc->name, status); - /* Do some sort of error recovery here */ - break; - } - } else { - i -= l->count; - if (fc->state != FC_STATE_FPORT_OK) { - FCD(("Unexpected N-PORT rsp received")) - return; - } - switch (status) { - case FC_STATUS_OK: - plogi = l->logi + 3 * i; - dma_unmap_single (fc->dev, l->fcmds[i].cmd, 3 * sizeof(logi), - DMA_BIDIRECTIONAL); - if (!fc->wwn_dest.lo && !fc->wwn_dest.hi) { - memcpy (&fc->wwn_dest, &plogi[1].node_wwn, sizeof(fc_wwn)); - FCD(("Dest WWN %08x%08x\n", *(u32 *)&fc->wwn_dest, fc->wwn_dest.lo)) - } else if (fc->wwn_dest.lo != plogi[1].node_wwn.lo || - fc->wwn_dest.hi != plogi[1].node_wwn.hi) { - printk ("%s: mismatch in wwns. Got %08x%08x, expected %08x%08x\n", - fc->name, - *(u32 *)&plogi[1].node_wwn, plogi[1].node_wwn.lo, - *(u32 *)&fc->wwn_dest, fc->wwn_dest.lo); - } - fc->state = FC_STATE_ONLINE; - printk ("%s: ONLINE\n", fc->name); - if (atomic_dec_and_test (&l->todo)) - up(&l->sem); - break; - case FC_STATUS_ERR_OFFLINE: - fc->state = FC_STATE_OFFLINE; - dma_unmap_single (fc->dev, l->fcmds[i].cmd, 3 * sizeof(logi), - DMA_BIDIRECTIONAL); - printk ("%s: FC is offline\n", fc->name); - if (atomic_dec_and_test (&l->todo)) - up(&l->sem); - break; - default: - printk ("PLOGI failed for %s with status %d\n", fc->name, status); - /* Do some sort of error recovery here */ - break; - } - } -} - -static void fcp_report_map_done(fc_channel *fc, int i, int status) -{ - fcp_cmnd *fcmd; - fc_hdr *fch; - unsigned char j; - ls *l = (ls *)fc->ls; - fc_al_posmap *p; - - FCD(("Report map done %d %d\n", i, status)) - switch (status) { - case FC_STATUS_OK: /* Ok, let's have a fun on a loop */ - dma_unmap_single (fc->dev, l->fcmds[i].cmd, 3 * sizeof(logi), - DMA_BIDIRECTIONAL); - p = (fc_al_posmap *)(l->logi + 3 * i); -#ifdef FCDEBUG - { - u32 *u = (u32 *)p; - FCD(("%08x\n", u[0])) - u ++; - FCD(("%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x\n", u[0],u[1],u[2],u[3],u[4],u[5],u[6],u[7])) - } -#endif - if ((p->magic & 0xffff0000) != FC_AL_LILP || !p->len) { - printk ("FC: Bad magic from REPORT_AL_MAP on %s - %08x\n", fc->name, p->magic); - fc->state = FC_STATE_OFFLINE; - } else { - fc->posmap = kzalloc(sizeof(fcp_posmap)+p->len, GFP_KERNEL); - if (!fc->posmap) { - printk("FC: Not enough memory, offlining channel\n"); - fc->state = FC_STATE_OFFLINE; - } else { - int k; - /* FIXME: This is where SOCAL transfers our AL-PA. - Keep it here till we found out what other cards do... */ - fc->sid = (p->magic & 0xff); - for (i = 0; i < p->len; i++) - if (p->alpa[i] == fc->sid) - break; - k = p->len; - if (i == p->len) - i = 0; - else { - p->len--; - i++; - } - fc->posmap->len = p->len; - for (j = 0; j < p->len; j++) { - if (i == k) i = 0; - fc->posmap->list[j] = p->alpa[i++]; - } - fc->state = FC_STATE_ONLINE; - } - } - printk ("%s: ONLINE\n", fc->name); - if (atomic_dec_and_test (&l->todo)) - up(&l->sem); - break; - case FC_STATUS_POINTTOPOINT: /* We're Point-to-Point, no AL... */ - FCD(("SID %d DID %d\n", fc->sid, fc->did)) - fcmd = l->fcmds + i; - dma_unmap_single(fc->dev, fcmd->cmd, 3 * sizeof(logi), - DMA_BIDIRECTIONAL); - fch = &fcmd->fch; - memset(l->logi + 3 * i, 0, 3 * sizeof(logi)); - FILL_FCHDR_RCTL_DID(fch, R_CTL_ELS_REQ, FS_FABRIC_F_PORT); - FILL_FCHDR_SID(fch, 0); - FILL_FCHDR_TYPE_FCTL(fch, TYPE_EXTENDED_LS, F_CTL_FIRST_SEQ | F_CTL_SEQ_INITIATIVE); - FILL_FCHDR_SEQ_DF_SEQ(fch, 0, 0, 0); - FILL_FCHDR_OXRX(fch, 0xffff, 0xffff); - fch->param = 0; - l->logi [3 * i].code = LS_FLOGI; - fcmd->cmd = dma_map_single (fc->dev, l->logi + 3 * i, 3 * sizeof(logi), - DMA_BIDIRECTIONAL); - fcmd->rsp = fcmd->cmd + sizeof(logi); - fcmd->cmdlen = sizeof(logi); - fcmd->rsplen = sizeof(logi); - fcmd->data = (dma_addr_t)NULL; - fcmd->class = FC_CLASS_SIMPLE; - fcmd->proto = TYPE_EXTENDED_LS; - if (fc->hw_enque (fc, fcmd)) - printk ("FC: Cannot enque FLOGI packet on %s\n", fc->name); - break; - case FC_STATUS_ERR_OFFLINE: - fc->state = FC_STATE_MAYBEOFFLINE; - FCD (("FC is offline %d\n", l->grace[i])) - break; - default: - printk ("FLOGI failed for %s with status %d\n", fc->name, status); - /* Do some sort of error recovery here */ - break; - } -} - -void fcp_register(fc_channel *fc, u8 type, int unregister) -{ - int size, i; - int slots = (fc->can_queue * 3) >> 1; - - FCND(("Going to %sregister\n", unregister ? "un" : "")) - - if (type == TYPE_SCSI_FCP) { - if (!unregister) { - fc->scsi_cmd_pool = (fcp_cmd *) - dma_alloc_consistent (fc->dev, - slots * (sizeof (fcp_cmd) + fc->rsp_size), - &fc->dma_scsi_cmd); - fc->scsi_rsp_pool = (char *)(fc->scsi_cmd_pool + slots); - fc->dma_scsi_rsp = fc->dma_scsi_cmd + slots * sizeof (fcp_cmd); - fc->scsi_bitmap_end = (slots + 63) & ~63; - size = fc->scsi_bitmap_end / 8; - fc->scsi_bitmap = kzalloc (size, GFP_K |