diff options
author | Matthew Wilcox <matthew@wil.cx> | 2007-10-16 07:05:07 +0200 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.localdomain> | 2007-10-18 03:53:55 +0200 |
commit | 1ecd3902c6e16c2445165b872c49e73770b72da7 (patch) | |
tree | cbfa9132a033801872003523e0d8e1be9dc23f77 /drivers/scsi | |
parent | Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/... (diff) | |
download | linux-1ecd3902c6e16c2445165b872c49e73770b72da7.tar.xz linux-1ecd3902c6e16c2445165b872c49e73770b72da7.zip |
[SCSI] fc4: remove this and all associated drivers
This code has been slowly rotting for about eight years. It's currently
impeding a few SCSI cleanups, and nobody seems to have hardware to test
it any more. I talked to Dave Miller about it, and he agrees we can
delete it. If anyone wants a software FC stack in future, they can
retrieve this driver from git.
Signed-off-by: Matthew Wilcox <matthew@wil.cx>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/Makefile | 2 | ||||
-rw-r--r-- | drivers/scsi/fcal.c | 317 | ||||
-rw-r--r-- | drivers/scsi/fcal.h | 27 | ||||
-rw-r--r-- | drivers/scsi/pluto.c | 349 | ||||
-rw-r--r-- | drivers/scsi/pluto.h | 47 |
5 files changed, 0 insertions, 742 deletions
diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile index 6141389dcdb2..2e6129f13d38 100644 --- a/drivers/scsi/Makefile +++ b/drivers/scsi/Makefile @@ -115,7 +115,6 @@ obj-$(CONFIG_SCSI_QLOGICPTI) += qlogicpti.o obj-$(CONFIG_BLK_DEV_IDESCSI) += ide-scsi.o obj-$(CONFIG_SCSI_MESH) += mesh.o obj-$(CONFIG_SCSI_MAC53C94) += mac53c94.o -obj-$(CONFIG_SCSI_PLUTO) += pluto.o obj-$(CONFIG_SCSI_DECNCR) += NCR53C9x.o dec_esp.o obj-$(CONFIG_BLK_DEV_3W_XXXX_RAID) += 3w-xxxx.o obj-$(CONFIG_SCSI_3W_9XXX) += 3w-9xxx.o @@ -123,7 +122,6 @@ obj-$(CONFIG_SCSI_PPA) += ppa.o obj-$(CONFIG_SCSI_IMM) += imm.o obj-$(CONFIG_JAZZ_ESP) += esp_scsi.o jazz_esp.o obj-$(CONFIG_SUN3X_ESP) += NCR53C9x.o sun3x_esp.o -obj-$(CONFIG_SCSI_FCAL) += fcal.o obj-$(CONFIG_SCSI_LASI700) += 53c700.o lasi700.o obj-$(CONFIG_SCSI_SNI_53C710) += 53c700.o sni_53c710.o obj-$(CONFIG_SCSI_NSP32) += nsp32.o diff --git a/drivers/scsi/fcal.c b/drivers/scsi/fcal.c deleted file mode 100644 index c4e16c0775de..000000000000 --- a/drivers/scsi/fcal.c +++ /dev/null @@ -1,317 +0,0 @@ -/* fcal.c: Fibre Channel Arbitrated Loop SCSI host adapter driver. - * - * Copyright (C) 1998,1999 Jakub Jelinek (jj@ultra.linux.cz) - * - */ - -#include <linux/kernel.h> -#include <linux/delay.h> -#include <linux/types.h> -#include <linux/string.h> -#include <linux/slab.h> -#include <linux/blkdev.h> -#include <linux/proc_fs.h> -#include <linux/stat.h> -#include <linux/init.h> -#ifdef CONFIG_KMOD -#include <linux/kmod.h> -#endif - -#include <asm/irq.h> - -#include "scsi.h" -#include <scsi/scsi_host.h> -#include "../fc4/fcp_impl.h" -#include "fcal.h" - -#include <linux/module.h> - -/* #define FCAL_DEBUG */ - -#define fcal_printk printk ("FCAL %s: ", fc->name); printk - -#ifdef FCAL_DEBUG -#define FCALD(x) fcal_printk x; -#define FCALND(x) printk ("FCAL: "); printk x; -#else -#define FCALD(x) -#define FCALND(x) -#endif - -static unsigned char alpa2target[] = { -0x7e, 0x7d, 0x7c, 0xff, 0x7b, 0xff, 0xff, 0xff, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x79, -0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x76, 0xff, 0xff, 0x75, 0xff, 0x74, 0x73, 0x72, -0xff, 0xff, 0xff, 0x71, 0xff, 0x70, 0x6f, 0x6e, 0xff, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68, 0xff, -0xff, 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0xff, 0xff, 0x61, 0x60, 0xff, 0x5f, 0xff, 0xff, 0xff, -0xff, 0xff, 0xff, 0x5e, 0xff, 0x5d, 0x5c, 0x5b, 0xff, 0x5a, 0x59, 0x58, 0x57, 0x56, 0x55, 0xff, -0xff, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4f, 0xff, 0xff, 0x4e, 0x4d, 0xff, 0x4c, 0xff, 0xff, 0xff, -0xff, 0xff, 0xff, 0x4b, 0xff, 0x4a, 0x49, 0x48, 0xff, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0xff, -0xff, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0xff, 0xff, 0x3b, 0x3a, 0xff, 0x39, 0xff, 0xff, 0xff, -0x38, 0x37, 0x36, 0xff, 0x35, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, -0x32, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x31, 0x30, 0xff, 0xff, 0x2f, 0xff, 0x2e, 0x2d, 0x2c, -0xff, 0xff, 0xff, 0x2b, 0xff, 0x2a, 0x29, 0x28, 0xff, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0xff, -0xff, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0xff, 0xff, 0x1b, 0x1a, 0xff, 0x19, 0xff, 0xff, 0xff, -0xff, 0xff, 0xff, 0x18, 0xff, 0x17, 0x16, 0x15, 0xff, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0xff, -0xff, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0xff, 0xff, 0x08, 0x07, 0xff, 0x06, 0xff, 0xff, 0xff, -0x05, 0x04, 0x03, 0xff, 0x02, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 -}; - -static unsigned char target2alpa[] = { -0xef, 0xe8, 0xe4, 0xe2, 0xe1, 0xe0, 0xdc, 0xda, 0xd9, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xce, -0xcd, 0xcc, 0xcb, 0xca, 0xc9, 0xc7, 0xc6, 0xc5, 0xc3, 0xbc, 0xba, 0xb9, 0xb6, 0xb5, 0xb4, 0xb3, -0xb2, 0xb1, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xa7, 0xa6, 0xa5, 0xa3, 0x9f, 0x9e, 0x9d, 0x9b, -0x98, 0x97, 0x90, 0x8f, 0x88, 0x84, 0x82, 0x81, 0x80, 0x7c, 0x7a, 0x79, 0x76, 0x75, 0x74, 0x73, -0x72, 0x71, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x67, 0x66, 0x65, 0x63, 0x5c, 0x5a, 0x59, 0x56, -0x55, 0x54, 0x53, 0x52, 0x51, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x47, 0x46, 0x45, 0x43, 0x3c, -0x3a, 0x39, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x27, 0x26, -0x25, 0x23, 0x1f, 0x1e, 0x1d, 0x1b, 0x18, 0x17, 0x10, 0x0f, 0x08, 0x04, 0x02, 0x01, 0x00 -}; - -static int fcal_encode_addr(Scsi_Cmnd *SCpnt, u16 *addr, fc_channel *fc, fcp_cmnd *fcmd); - -int fcal_slave_configure(struct scsi_device *device) -{ - int depth_to_use; - - if (device->tagged_supported) - depth_to_use = /* 254 */ 8; - else - depth_to_use = 2; - - scsi_adjust_queue_depth(device, - (device->tagged_supported ? - MSG_SIMPLE_TAG : 0), - depth_to_use); - - return 0; -} - -/* Detect all FC Arbitrated Loops attached to the machine. - fc4 module has done all the work for us... */ -int __init fcal_detect(struct scsi_host_template *tpnt) -{ - int nfcals = 0; - fc_channel *fc; - int fcalcount; - int i; - - tpnt->proc_name = "fcal"; - fcalcount = 0; - for_each_online_fc_channel(fc) - if (fc->posmap) - fcalcount++; - FCALND(("%d channels online\n", fcalcount)) - if (!fcalcount) { -#if defined(MODULE) && defined(CONFIG_FC4_SOCAL_MODULE) && defined(CONFIG_KMOD) - request_module("socal"); - - for_each_online_fc_channel(fc) - if (fc->posmap) - fcalcount++; - if (!fcalcount) -#endif - return 0; - } - for_each_online_fc_channel(fc) { - struct Scsi_Host *host; - long *ages; - struct fcal *fcal; - - if (!fc->posmap) continue; - - /* Strange, this is already registered to some other SCSI host, then it cannot be fcal */ - if (fc->scsi_name[0]) continue; - memcpy (fc->scsi_name, "FCAL", 4); - - fc->can_queue = FCAL_CAN_QUEUE; - fc->rsp_size = 64; - fc->encode_addr = fcal_encode_addr; - - ages = kmalloc (128 * sizeof(long), GFP_KERNEL); - if (!ages) continue; - - host = scsi_register (tpnt, sizeof (struct fcal)); - if (!host) - { - kfree(ages); - continue; - } - - if (!try_module_get(fc->module)) { - kfree(ages); - scsi_unregister(host); - continue; - } - - nfcals++; - - fcal = (struct fcal *)host->hostdata; - - fc->fcp_register(fc, TYPE_SCSI_FCP, 0); - - for (i = 0; i < fc->posmap->len; i++) { - int status, target, alpa; - - alpa = fc->posmap->list[i]; - FCALD(("Sending PLOGI to %02x\n", alpa)) - target = alpa2target[alpa]; - status = fc_do_plogi(fc, alpa, fcal->node_wwn + target, - fcal->nport_wwn + target); - FCALD(("PLOGI returned with status %d\n", status)) - if (status != FC_STATUS_OK) - continue; - FCALD(("Sending PRLI to %02x\n", alpa)) - status = fc_do_prli(fc, alpa); - FCALD(("PRLI returned with status %d\n", status)) - if (status == FC_STATUS_OK) - fcal->map[target] = 1; - } - - host->max_id = 127; - host->irq = fc->irq; -#ifdef __sparc_v9__ - host->unchecked_isa_dma = 1; -#endif - - fc->channels = 1; - fc->targets = 127; - fc->ages = ages; - memset (ages, 0, 128 * sizeof(long)); - - fcal->fc = fc; - - FCALD(("Found FCAL\n")) - } - if (nfcals) -#ifdef __sparc__ - printk ("FCAL: Total of %d Sun Enterprise Network Array (A5000 or EX500) channels found\n", nfcals); -#else - printk ("FCAL: Total of %d Fibre Channel Arbitrated Loops found\n", nfcals); -#endif - return nfcals; -} - -int fcal_release(struct Scsi_Host *host) -{ - struct fcal *fcal = (struct fcal *)host->hostdata; - fc_channel *fc = fcal->fc; - - module_put(fc->module); - - fc->fcp_register(fc, TYPE_SCSI_FCP, 1); - FCALND((" releasing fcal.\n")); - kfree (fc->ages); - FCALND(("released fcal!\n")); - return 0; -} - -#undef SPRINTF -#define SPRINTF(args...) { if (pos < (buffer + length)) pos += sprintf (pos, ## args); } - -int fcal_proc_info (struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, int inout) -{ - struct fcal *fcal; - fc_channel *fc; - char *pos = buffer; - int i, j; - - if (inout) return length; - - fcal = (struct fcal *)host->hostdata; - fc = fcal->fc; - -#ifdef __sparc__ - SPRINTF ("Sun Enterprise Network Array (A5000 or E?500) on %s PROM node %x\n", fc->name, fc->dev->prom_node); -#else - SPRINTF ("Fibre Channel Arbitrated Loop on %s\n", fc->name); -#endif - SPRINTF ("Initiator AL-PA: %02x\n", fc->sid); - - SPRINTF ("\nAttached devices:\n"); - - for (i = 0; i < fc->posmap->len; i++) { - unsigned char alpa = fc->posmap->list[i]; - unsigned char target; - u32 *u1, *u2; - - target = alpa2target[alpa]; - u1 = (u32 *)&fcal->nport_wwn[target]; - u2 = (u32 *)&fcal->node_wwn[target]; - if (!u1[0] && !u1[1]) { - SPRINTF (" [AL-PA: %02x] Not responded to PLOGI\n", alpa); - } else if (!fcal->map[target]) { - SPRINTF (" [AL-PA: %02x, Port WWN: %08x%08x, Node WWN: %08x%08x] Not responded to PRLI\n", - alpa, u1[0], u1[1], u2[0], u2[1]); - } else { - struct scsi_device *scd; - shost_for_each_device(scd, host) - if (scd->id == target) { - SPRINTF (" [AL-PA: %02x, Id: %02d, Port WWN: %08x%08x, Node WWN: %08x%08x] ", - alpa, target, u1[0], u1[1], u2[0], u2[1]); - SPRINTF ("%s ", scsi_device_type(scd->type)); - - for (j = 0; (j < 8) && (scd->vendor[j] >= 0x20); j++) - SPRINTF ("%c", scd->vendor[j]); - SPRINTF (" "); - - for (j = 0; (j < 16) && (scd->model[j] >= 0x20); j++) - SPRINTF ("%c", scd->model[j]); - - SPRINTF ("\n"); - } - } - } - SPRINTF ("\n"); - - *start = buffer + offset; - - if ((pos - buffer) < offset) - return 0; - else if (pos - buffer - offset < length) - return pos - buffer - offset; - else - return length; -} - -/* - For FC-AL, we use a simple addressing: we have just one channel 0, - and all AL-PAs are mapped to targets 0..0x7e - */ -static int fcal_encode_addr(Scsi_Cmnd *SCpnt, u16 *addr, fc_channel *fc, fcp_cmnd *fcmd) -{ - struct fcal *f; - - /* We don't support LUNs yet - I'm not sure if LUN should be in SCSI fcp_cdb, or in second byte of addr[0] */ - if (SCpnt->cmnd[1] & 0xe0) return -EINVAL; - /* FC-PLDA tells us... */ - memset(addr, 0, 8); - f = (struct fcal *)SCpnt->device->host->hostdata; - if (!f->map[SCpnt->device->id]) - return -EINVAL; - /* Now, determine DID: It will be Native Identifier, so we zero upper - 2 bytes of the 3 byte DID, lowest byte will be AL-PA */ - fcmd->did = target2alpa[SCpnt->device->id]; - FCALD(("trying DID %06x\n", fcmd->did)) - return 0; -} - -static struct scsi_host_template driver_template = { - .name = "Fibre Channel Arbitrated Loop", - .detect = fcal_detect, - .release = fcal_release, - .proc_info = fcal_proc_info, - .queuecommand = fcp_scsi_queuecommand, - .slave_configure = fcal_slave_configure, - .can_queue = FCAL_CAN_QUEUE, - .this_id = -1, - .sg_tablesize = 1, - .cmd_per_lun = 1, - .use_clustering = ENABLE_CLUSTERING, - .eh_abort_handler = fcp_scsi_abort, - .eh_device_reset_handler = fcp_scsi_dev_reset, - .eh_host_reset_handler = fcp_scsi_host_reset, -}; -#include "scsi_module.c" - -MODULE_LICENSE("GPL"); - diff --git a/drivers/scsi/fcal.h b/drivers/scsi/fcal.h deleted file mode 100644 index 7ff2c3494f9e..000000000000 --- a/drivers/scsi/fcal.h +++ /dev/null @@ -1,27 +0,0 @@ -/* fcal.h: Generic Fibre Channel Arbitrated Loop SCSI host adapter driver definitions. - * - * Copyright (C) 1998,1999 Jakub Jelinek (jj@ultra.linux.cz) - */ - -#ifndef _FCAL_H -#define _FCAL_H - -#include "../fc4/fcp_impl.h" - -struct fcal { - /* fc must be first */ - fc_channel *fc; - unsigned char map[128]; - fc_wwn nport_wwn[128]; - fc_wwn node_wwn[128]; -}; - -/* Arbitrary constant. Cannot be too large, as fc4 layer has limitations - for a particular channel */ -#define FCAL_CAN_QUEUE 512 - -int fcal_detect(struct scsi_host_template *); -int fcal_release(struct Scsi_Host *); -int fcal_slave_configure(struct scsi_device *); - -#endif /* !(_FCAL_H) */ diff --git a/drivers/scsi/pluto.c b/drivers/scsi/pluto.c deleted file mode 100644 index 0363c1cd68c1..000000000000 --- a/drivers/scsi/pluto.c +++ /dev/null @@ -1,349 +0,0 @@ -/* pluto.c: SparcSTORAGE Array SCSI host adapter driver. - * - * Copyright (C) 1997,1998,1999 Jakub Jelinek (jj@sunsite.mff.cuni.cz) - * - */ - -#include <linux/completion.h> -#include <linux/kernel.h> -#include <linux/delay.h> -#include <linux/types.h> -#include <linux/string.h> -#include <linux/slab.h> -#include <linux/blkdev.h> -#include <linux/proc_fs.h> -#include <linux/stat.h> -#include <linux/init.h> -#ifdef CONFIG_KMOD -#include <linux/kmod.h> -#endif - -#include <asm/irq.h> - -#include "scsi.h" -#include <scsi/scsi_host.h> -#include "../fc4/fcp_impl.h" -#include "pluto.h" - -#include <linux/module.h> - -#define RQ_SCSI_BUSY 0xffff -#define RQ_SCSI_DONE 0xfffe - -/* #define PLUTO_DEBUG */ - -#define pluto_printk printk ("PLUTO %s: ", fc->name); printk - -#ifdef PLUTO_DEBUG -#define PLD(x) pluto_printk x; -#define PLND(x) printk ("PLUTO: "); printk x; -#else -#define PLD(x) -#define PLND(x) -#endif - -static struct ctrl_inquiry { - struct Scsi_Host host; - struct pluto pluto; - Scsi_Cmnd cmd; - char inquiry[256]; - fc_channel *fc; -} *fcs __initdata; -static int fcscount __initdata = 0; -static atomic_t fcss __initdata = ATOMIC_INIT(0); -static DECLARE_COMPLETION(fc_detect_complete); - -static int pluto_encode_addr(Scsi_Cmnd *SCpnt, u16 *addr, fc_channel *fc, fcp_cmnd *fcmd); - -static void __init pluto_detect_done(Scsi_Cmnd *SCpnt) -{ - /* Do nothing */ -} - -static void __init pluto_detect_scsi_done(Scsi_Cmnd *SCpnt) -{ - PLND(("Detect done %08lx\n", (long)SCpnt)) - if (atomic_dec_and_test (&fcss)) - complete(&fc_detect_complete); -} - -int pluto_slave_configure(struct scsi_device *device) -{ - int depth_to_use; - - if (device->tagged_supported) - depth_to_use = /* 254 */ 8; - else - depth_to_use = 2; - - scsi_adjust_queue_depth(device, - (device->tagged_supported ? - MSG_SIMPLE_TAG : 0), - depth_to_use); - - return 0; -} - -/* Detect all SSAs attached to the machine. - To be fast, do it on all online FC channels at the same time. */ -int __init pluto_detect(struct scsi_host_template *tpnt) -{ - int i, retry, nplutos; - fc_channel *fc; - struct scsi_device dev; - - tpnt->proc_name = "pluto"; - fcscount = 0; - for_each_online_fc_channel(fc) { - if (!fc->posmap) - fcscount++; - } - PLND(("%d channels online\n", fcscount)) - if (!fcscount) { -#if defined(MODULE) && defined(CONFIG_FC4_SOC_MODULE) && defined(CONFIG_KMOD) - request_module("soc"); - - for_each_online_fc_channel(fc) { - if (!fc->posmap) - fcscount++; - } - if (!fcscount) -#endif - return 0; - } - fcs = kcalloc(fcscount, sizeof (struct ctrl_inquiry), GFP_DMA); - if (!fcs) { - printk ("PLUTO: Not enough memory to probe\n"); - return 0; - } - - memset (&dev, 0, sizeof(dev)); - atomic_set (&fcss, fcscount); - - i = 0; - for_each_online_fc_channel(fc) { - Scsi_Cmnd *SCpnt; - struct Scsi_Host *host; - struct pluto *pluto; - - if (i == fcscount) break; - if (fc->posmap) continue; - - PLD(("trying to find SSA\n")) - - /* If this is already registered to some other SCSI host, then it cannot be pluto */ - if (fc->scsi_name[0]) continue; - memcpy (fc->scsi_name, "SSA", 4); - - fcs[i].fc = fc; - - fc->can_queue = PLUTO_CAN_QUEUE; - fc->rsp_size = 64; - fc->encode_addr = pluto_encode_addr; - - fc->fcp_register(fc, TYPE_SCSI_FCP, 0); - - SCpnt = &(fcs[i].cmd); - host = &(fcs[i].host); - pluto = (struct pluto *)host->hostdata; - - pluto->fc = fc; - - SCpnt->cmnd[0] = INQUIRY; - SCpnt->cmnd[4] = 255; - - /* FC layer requires this, so that SCpnt->device->tagged_supported is initially 0 */ - SCpnt->device = &dev; - dev.host = host; - - SCpnt->cmd_len = COMMAND_SIZE(INQUIRY); - - SCpnt->request->cmd_flags &= ~REQ_STARTED; - - SCpnt->request_bufflen = 256; - SCpnt->request_buffer = fcs[i].inquiry; - PLD(("set up %d %08lx\n", i, (long)SCpnt)) - i++; - } - - for (retry = 0; retry < 5; retry++) { - for (i = 0; i < fcscount; i++) { - if (!fcs[i].fc) break; - if (!(fcs[i].cmd.request->cmd_flags & REQ_STARTED)) { - fcs[i].cmd.request->cmd_flags |= REQ_STARTED; - disable_irq(fcs[i].fc->irq); - PLND(("queuecommand %d %d\n", retry, i)) - fcp_scsi_queuecommand (&(fcs[i].cmd), - pluto_detect_scsi_done); - enable_irq(fcs[i].fc->irq); - } - } - - wait_for_completion_timeout(&fc_detect_complete, 10 * HZ); - PLND(("Woken up\n")) - if (!atomic_read(&fcss)) - break; /* All fc channels have answered us */ - } - - PLND(("Finished search\n")) - for (i = 0, nplutos = 0; i < fcscount; i++) { - Scsi_Cmnd *SCpnt; - - if (!(fc = fcs[i].fc)) break; - - SCpnt = &(fcs[i].cmd); - - /* Let FC mid-level free allocated resources */ - pluto_detect_scsi_done(SCpnt); - - if (!SCpnt->result) { - struct pluto_inquiry *inq; - struct pluto *pluto; - struct Scsi_Host *host; - - inq = (struct pluto_inquiry *)fcs[i].inquiry; - - if ((inq->dtype & 0x1f) == TYPE_PROCESSOR && - !strncmp (inq->vendor_id, "SUN", 3) && - !strncmp (inq->product_id, "SSA", 3)) { - char *p; - long *ages; - - ages = kcalloc((inq->channels + 1) * inq->targets, sizeof(long), GFP_KERNEL); - if (!ages) continue; - - host = scsi_register (tpnt, sizeof (struct pluto)); - if(!host) - { - kfree(ages); - continue; - } - - if (!try_module_get(fc->module)) { - kfree(ages); - scsi_unregister(host); - continue; - } - - nplutos++; - - pluto = (struct pluto *)host->hostdata; - - host->max_id = inq->targets; - host->max_channel = inq->channels; - host->irq = fc->irq; - - fc->channels = inq->channels + 1; - fc->targets = inq->targets; - fc->ages = ages; - - pluto->fc = fc; - memcpy (pluto->rev_str, inq->revision, 4); - pluto->rev_str[4] = 0; - p = strchr (pluto->rev_str, ' '); - if (p) *p = 0; - memcpy (pluto->fw_rev_str, inq->fw_revision, 4); - pluto->fw_rev_str[4] = 0; - p = strchr (pluto->fw_rev_str, ' '); - if (p) *p = 0; - memcpy (pluto->serial_str, inq->serial, 12); - pluto->serial_str[12] = 0; - p = strchr (pluto->serial_str, ' '); - if (p) *p = 0; - - PLD(("Found SSA rev %s fw rev %s serial %s %dx%d\n", pluto->rev_str, pluto->fw_rev_str, pluto->serial_str, host->max_channel, host->max_id)) - } else - fc->fcp_register(fc, TYPE_SCSI_FCP, 1); - } else - fc->fcp_register(fc, TYPE_SCSI_FCP, 1); - } - kfree(fcs); - if (nplutos) - printk ("PLUTO: Total of %d SparcSTORAGE Arrays found\n", nplutos); - return nplutos; -} - -int pluto_release(struct Scsi_Host *host) -{ - struct pluto *pluto = (struct pluto *)host->hostdata; - fc_channel *fc = pluto->fc; - - module_put(fc->module); - - fc->fcp_register(fc, TYPE_SCSI_FCP, 1); - PLND((" releasing pluto.\n")); - kfree (fc->ages); - PLND(("released pluto!\n")); - return 0; -} - -const char *pluto_info(struct Scsi_Host *host) -{ - static char buf[128], *p; - struct pluto *pluto = (struct pluto *) host->hostdata; - - sprintf(buf, "SUN SparcSTORAGE Array %s fw %s serial %s %dx%d on %s", - pluto->rev_str, pluto->fw_rev_str, pluto->serial_str, - host->max_channel, host->max_id, pluto->fc->name); -#ifdef __sparc__ - p = strchr(buf, 0); - sprintf(p, " PROM node %x", pluto->fc->dev->prom_node); -#endif - return buf; -} - -/* SSA uses this FC4S addressing: - switch (addr[0]) - { - case 0: CONTROLLER - All of addr[1]..addr[3] has to be 0 - case 1: SINGLE DISK - addr[1] channel, addr[2] id, addr[3] 0 - case 2: DISK GROUP - ??? - } - - So that SCSI mid-layer can access to these, we reserve - channel 0 id 0 lun 0 for CONTROLLER - and channels 1 .. max_channel are normal single disks. - */ -static int pluto_encode_addr(Scsi_Cmnd *SCpnt, u16 *addr, fc_channel *fc, fcp_cmnd *fcmd) -{ - PLND(("encode addr %d %d %d\n", SCpnt->device->channel, SCpnt->device->id, SCpnt->cmnd[1] & 0xe0)) - /* We don't support LUNs - neither does SSA :) */ - if (SCpnt->cmnd[1] & 0xe0) - return -EINVAL; - if (!SCpnt->device->channel) { - if (SCpnt->device->id) - return -EINVAL; - memset (addr, 0, 4 * sizeof(u16)); - } else { - addr[0] = 1; - addr[1] = SCpnt->device->channel - 1; - addr[2] = SCpnt->device->id; - addr[3] = 0; - } - /* We're Point-to-Point, so target it to the default DID */ - fcmd->did = fc->did; - PLND(("trying %04x%04x%04x%04x\n", addr[0], addr[1], addr[2], addr[3])) - return 0; -} - -static struct scsi_host_template driver_template = { - .name = "Sparc Storage Array 100/200", - .detect = pluto_detect, - .release = pluto_release, - .info = pluto_info, - .queuecommand = fcp_scsi_queuecommand, - .slave_configure = pluto_slave_configure, - .can_queue = PLUTO_CAN_QUEUE, - .this_id = -1, - .sg_tablesize = 1, - .cmd_per_lun = 1, - .use_clustering = ENABLE_CLUSTERING, - .eh_abort_handler = fcp_scsi_abort, - .eh_device_reset_handler = fcp_scsi_dev_reset, - .eh_host_reset_handler = fcp_scsi_host_reset, -}; - -#include "scsi_module.c" - -MODULE_LICENSE("GPL"); - diff --git a/drivers/scsi/pluto.h b/drivers/scsi/pluto.h deleted file mode 100644 index 5da20616ac36..000000000000 --- a/drivers/scsi/pluto.h +++ /dev/null @@ -1,47 +0,0 @@ -/* pluto.h: SparcSTORAGE Array SCSI host adapter driver definitions. - * - * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) - */ - -#ifndef _PLUTO_H -#define _PLUTO_H - -#include "../fc4/fcp_impl.h" - -struct pluto { - /* This must be first */ - fc_channel *fc; - char rev_str[5]; - char fw_rev_str[5]; - char serial_str[13]; -}; - -struct pluto_inquiry { - u8 dtype; - u8 removable:1, qualifier:7; - u8 iso:2, ecma:3, ansi:3; - u8 aenc:1, trmiop:1, :2, rdf:4; - u8 len; - u8 xxx1; - u8 xxx2; - u8 reladdr:1, wbus32:1, wbus16:1, sync:1, linked:1, :1, cmdque:1, softreset:1; - u8 vendor_id[8]; - u8 product_id[16]; - u8 revision[4]; - u8 fw_revision[4]; - u8 serial[12]; - u8 xxx3[2]; - u8 channels; - u8 targets; -}; - -/* This is the max number of outstanding SCSI commands per pluto */ -#define PLUTO_CAN_QUEUE 254 - -int pluto_detect(struct scsi_host_template *); -int pluto_release(struct Scsi_Host *); -const char * pluto_info(struct Scsi_Host *); -int pluto_slave_configure(struct scsi_device *); - -#endif /* !(_PLUTO_H) */ - |