Remove FC4 and all associated drivers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



commit 2c2ed954f8a84bd9cd97ba700d7bbb9dbba66cd9
Author: Matthew Wilcox <matthew@xxxxxx>
Date:   Tue Oct 16 01:01:28 2007 -0400

    Remove FC4 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@xxxxxx>

diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig
index 33dabf5..897afd8 100644
--- a/arch/sparc64/Kconfig
+++ b/arch/sparc64/Kconfig
@@ -456,8 +456,6 @@ source "drivers/Kconfig"
 
 source "drivers/sbus/char/Kconfig"
 
-source "drivers/fc4/Kconfig"
-
 source "fs/Kconfig"
 
 menu "Instrumentation Support"
diff --git a/drivers/Makefile b/drivers/Makefile
index a168eac..c5221a1 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 345dbe6..0000000
--- 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 0db3fbb..0000000
--- 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 62d3ca4..0000000
--- 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@xxxxxxxxxxxxxxxxxxx)
- *
- * 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 82de9e1..0000000
--- 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@xxxxxxxxxxxxxx)
- * Copyright (C) 1997,1998 Jirka Hanika (geo@xxxxxxxxxx)
- *
- * 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_KERNEL);
-			set_bit (0, fc->scsi_bitmap);
-			for (i = fc->can_queue; i < fc->scsi_bitmap_end; i++)
-				set_bit (i, fc->scsi_bitmap);
-			fc->scsi_free = fc->can_queue;
-			fc->cmd_slots = kzalloc(slots * sizeof(fcp_cmnd*), GFP_KERNEL);
-			fc->abort_count = 0;
-		} else {
-			fc->scsi_name[0] = 0;
-			kfree (fc->scsi_bitmap);
-			kfree (fc->cmd_slots);
-			FCND(("Unregistering\n"));
-#if 0
-			if (fc->rst_pkt) {
-				if (fc->rst_pkt->eh_state == SCSI_STATE_UNUSED)
-					kfree(fc->rst_pkt);
-				else {
-					/* Can't happen. Some memory would be lost. */
-					printk("FC: Reset in progress. Now?!");
-				}
-			}
-#endif
-			FCND(("Unregistered\n"));
-		}
-	} else
-		printk ("FC: %segistering unknown type %02x\n", unregister ? "Unr" : "R", type);
-}
-
-static void fcp_scsi_done(struct scsi_cmnd *SCpnt);
-
-static inline void fcp_scsi_receive(fc_channel *fc, int token, int status, fc_hdr *fch)
-{
-	fcp_cmnd *fcmd;
-	fcp_rsp  *rsp;
-	int host_status;
-	struct scsi_cmnd *SCpnt;
-	int sense_len;
-	int rsp_status;
-
-	fcmd = fc->cmd_slots[token];
-	if (!fcmd) return;
-	rsp = (fcp_rsp *) (fc->scsi_rsp_pool + fc->rsp_size * token);
-	SCpnt = SC_FCMND(fcmd);
-
-	if (SCpnt->done != fcp_scsi_done)
-		return;
-
-	rsp_status = rsp->fcp_status;
-	FCD(("rsp_status %08x status %08x\n", rsp_status, status))
-	switch (status) {
-	case FC_STATUS_OK:
-		host_status=DID_OK;
-		
-		if (rsp_status & FCP_STATUS_RESID) {
-#ifdef FCDEBUG
-			FCD(("Resid %d\n", rsp->fcp_resid))
-			{
-				fcp_cmd *cmd = fc->scsi_cmd_pool + token;
-				int i;
-				
-				printk ("Command ");
-				for (i = 0; i < sizeof(fcp_cmd); i+=4)
-					printk ("%08x ", *(u32 *)(((char *)cmd)+i));
-				printk ("\nResponse ");
-				for (i = 0; i < fc->rsp_size; i+=4)
-					printk ("%08x ", *(u32 *)(((char *)rsp)+i));
-				printk ("\n");
-			}
-#endif			
-		}
-
-		if (rsp_status & FCP_STATUS_SENSE_LEN) {
-			sense_len = rsp->fcp_sense_len;
-			if (sense_len > sizeof(SCpnt->sense_buffer)) sense_len = sizeof(SCpnt->sense_buffer);
-			memcpy(SCpnt->sense_buffer, ((char *)(rsp+1)), sense_len);
-		}
-		
-		if (fcmd->data)
-			dma_unmap_sg(fc->dev, scsi_sglist(SCpnt),
-				     scsi_sg_count(SCpnt),
-				     SCpnt->sc_data_direction);
-		break;
-	default:
-		host_status=DID_ERROR; /* FIXME */
-		FCD(("Wrong FC status %d for token %d\n", status, token))
-		break;
-	}
-
-	if (status_byte(rsp_status) == QUEUE_FULL) {
-		printk ("%s: (%d,%d) Received rsp_status 0x%x\n", fc->name, SCpnt->device->channel, SCpnt->device->id, rsp_status);
-	}	
-	
-	SCpnt->result = (host_status << 16) | (rsp_status & 0xff);
-#ifdef FCDEBUG	
-	if (host_status || SCpnt->result || rsp_status) printk("FC: host_status %d, packet status %d\n",
-			host_status, SCpnt->result);
-#endif
-	SCpnt->done = fcmd->done;
-	fcmd->done=NULL;
-	clear_bit(token, fc->scsi_bitmap);
-	fc->scsi_free++;
-	FCD(("Calling scsi_done with %08x\n", SCpnt->result))
-	SCpnt->scsi_done(SCpnt);
-}
-
-void fcp_receive_solicited(fc_channel *fc, int proto, int token, int status, fc_hdr *fch)
-{
-	int magic;
-	FCD(("receive_solicited %d %d %d\n", proto, token, status))
-	switch (proto) {
-	case TYPE_SCSI_FCP:
-		fcp_scsi_receive(fc, token, status, fch); break;
-	case TYPE_EXTENDED_LS:
-	case PROTO_REPORT_AL_MAP:
-		magic = 0;
-		if (fc->ls)
-			magic = ((ls *)(fc->ls))->magic;
-		if (magic == LSMAGIC) {
-			ls *l = (ls *)fc->ls;
-			int i = (token >= l->count) ? token - l->count : token;
-
-			/* Let's be sure */
-			if ((unsigned)i < l->count && l->fcmds[i].fc == fc) {
-				if (proto == TYPE_EXTENDED_LS)
-					fcp_login_done(fc, token, status);
-				else
-					fcp_report_map_done(fc, token, status);
-				break;
-			}
-		}
-		FCD(("fc %p fc->ls %p fc->cmd_slots %p\n", fc, fc->ls, fc->cmd_slots))
-		if (proto == TYPE_EXTENDED_LS && !fc->ls && fc->cmd_slots) {
-			fcp_cmnd *fcmd;
-			
-			fcmd = fc->cmd_slots[token];
-			if (fcmd && fcmd->ls && ((ls *)(fcmd->ls))->magic == LSEMAGIC) {
-				lse *l = (lse *)fcmd->ls;
-				
-				l->status = status;
-				up (&l->sem);
-			}
-		}
-		break;
-	case PROTO_OFFLINE:
-		if (fc->ls && ((lso *)(fc->ls))->magic == LSOMAGIC) {
-			lso *l = (lso *)fc->ls;
-
-			if ((unsigned)token < l->count && l->fcmds[token].fc == fc) {
-				/* Wow, OFFLINE response arrived :) */
-				FCD(("OFFLINE Response arrived\n"))
-				fc->state = FC_STATE_OFFLINE;
-				if (atomic_dec_and_test (&l->todo))
-					up(&l->sem);
-			}
-		}
-		break;
-		
-	default:
-		break;
-	}
-}
-
-void fcp_state_change(fc_channel *fc, int state)
-{
-	FCD(("state_change %d %d\n", state, fc->state))
-	if (state == FC_STATE_ONLINE && fc->state == FC_STATE_MAYBEOFFLINE)
-		fc->state = FC_STATE_UNINITED;
-	else if (state == FC_STATE_ONLINE)
-		printk (KERN_WARNING "%s: state change to ONLINE\n", fc->name);
-	else
-		printk (KERN_ERR "%s: state change to OFFLINE\n", fc->name);
-}
-
-int fcp_initialize(fc_channel *fcchain, int count)
-{
-	fc_channel *fc;
-	fcp_cmnd *fcmd;
-	int i, retry, ret;
-	ls *l;
-
-	FCND(("fcp_inititialize %08lx\n", (long)fcp_init))
-	FCND(("fc_channels %08lx\n", (long)fc_channels))
-	FCND((" SID %d DID %d\n", fcchain->sid, fcchain->did))
-	l = kzalloc(sizeof (ls) + count, GFP_KERNEL);
-	if (!l) {
-		printk ("FC: Cannot allocate memory for initialization\n");
-		return -ENOMEM;
-	}
-	l->magic = LSMAGIC;
-	l->count = count;
-	FCND(("FCP Init for %d channels\n", count))
-	init_MUTEX_LOCKED(&l->sem);
-	init_timer(&l->timer);
-	l->timer.function = fcp_login_timeout;
-	l->timer.data = (unsigned long)l;
-	atomic_set (&l->todo, count);
-	l->logi = kzalloc (count * 3 * sizeof(logi), GFP_KERNEL);
-	l->fcmds = kzalloc (count * sizeof(fcp_cmnd), GFP_KERNEL);
-	if (!l->logi || !l->fcmds) {
-		kfree (l->logi);
-		kfree (l->fcmds);
-		kfree (l);
-		printk ("FC: Cannot allocate DMA memory for initialization\n");
-		return -ENOMEM;
-	}
-	for (fc = fcchain, i = 0; fc && i < count; fc = fc->next, i++) {
-		fc->state = FC_STATE_UNINITED;
-		fc->rst_pkt = NULL;	/* kmalloc when first used */
-	}
-	/* First try if we are in a AL topology */
-	FCND(("Initializing REPORT_MAP packets\n"))
-	for (fc = fcchain, i = 0; fc && i < count; fc = fc->next, i++) {
-		fcmd = l->fcmds + i;
-		fc->login = fcmd;
-		fc->ls = (void *)l;
-		/* Assumes sizeof(fc_al_posmap) < 3 * sizeof(logi), which is true */
-		fcmd->cmd = dma_map_single (fc->dev, l->logi + 3 * i, 3 * sizeof(logi),
-					    DMA_BIDIRECTIONAL);
-		fcmd->proto = PROTO_REPORT_AL_MAP;
-		fcmd->token = i;
-		fcmd->fc = fc;
-	}
-	for (retry = 0; retry < 8; retry++) {
-		int nqueued = 0;
-		FCND(("Sending REPORT_MAP/FLOGI/PLOGI packets\n"))
-		for (fc = fcchain, i = 0; fc && i < count; fc = fc->next, i++) {
-			if (fc->state == FC_STATE_ONLINE || fc->state == FC_STATE_OFFLINE)
-				continue;
-			disable_irq(fc->irq);
-			if (fc->state == FC_STATE_MAYBEOFFLINE) {
-				if (!l->grace[i]) {
-					l->grace[i]++;
-					FCD(("Grace\n"))
-				} else {
-					fc->state = FC_STATE_OFFLINE;
-					enable_irq(fc->irq);
-					dma_unmap_single (fc->dev, l->fcmds[i].cmd, 3 * sizeof(logi), DMA_BIDIRECTIONAL);
-					if (atomic_dec_and_test (&l->todo))
-						goto all_done;
-				}
-			}
-			ret = fc->hw_enque (fc, fc->login);
-			enable_irq(fc->irq);
-			if (!ret) {
-				nqueued++;
-				continue;
-			}
-			if (ret == -ENOSYS && fc->login->proto == PROTO_REPORT_AL_MAP) {
-				/* Oh yes, this card handles Point-to-Point only, so let's try that. */
-				fc_hdr *fch;
-
-				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;
-				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;
-			} else
-				printk ("FC: Cannot enque FLOGI/REPORT_MAP packet on %s\n", fc->name);
-		}
-		
-		if (nqueued) {
-			l->timer.expires = jiffies + 5 * HZ;
-			add_timer(&l->timer);
-
-			down(&l->sem);
-			if (!atomic_read(&l->todo)) {
-				FCND(("All channels answered in time\n"))
-				break; /* All fc channels have answered us */
-			}
-		}
-	}
-all_done:
-	for (fc = fcchain, i = 0; fc && i < count; fc = fc->next, i++) {
-		fc->ls = NULL;
-		switch (fc->state) {
-		case FC_STATE_ONLINE: break;
-		case FC_STATE_OFFLINE: break;
-		default: dma_unmap_single (fc->dev, l->fcmds[i].cmd, 3 * sizeof(logi), DMA_BIDIRECTIONAL);
-			break;
-		}
-	}
-	del_timer(&l->timer);
-	kfree (l->logi);
-	kfree (l->fcmds);
-	kfree (l);
-	return 0;
-}
-
-int fcp_forceoffline(fc_channel *fcchain, int count)
-{
-	fc_channel *fc;
-	fcp_cmnd *fcmd;
-	int i, ret;
-	lso l;
-
-	memset (&l, 0, sizeof(lso));
-	l.count = count;
-	l.magic = LSOMAGIC;
-	FCND(("FCP Force Offline for %d channels\n", count))
-	init_MUTEX_LOCKED(&l.sem);
-	init_timer(&l.timer);
-	l.timer.function = fcp_login_timeout;
-	l.timer.data = (unsigned long)&l;
-	atomic_set (&l.todo, count);
-	l.fcmds = kzalloc (count * sizeof(fcp_cmnd), GFP_KERNEL);
-	if (!l.fcmds) {
-		printk ("FC: Cannot allocate memory for forcing offline\n");
-		return -ENOMEM;
-	}
-	FCND(("Initializing OFFLINE packets\n"))
-	for (fc = fcchain, i = 0; fc && i < count; fc = fc->next, i++) {
-		fc->state = FC_STATE_UNINITED;
-		fcmd = l.fcmds + i;
-		fc->login = fcmd;
-		fc->ls = (void *)&l;
-		fcmd->did = fc->did;
-		fcmd->class = FC_CLASS_OFFLINE;
-		fcmd->proto = PROTO_OFFLINE;
-		fcmd->token = i;
-		fcmd->fc = fc;
-		disable_irq(fc->irq);
-		ret = fc->hw_enque (fc, fc->login);
-		enable_irq(fc->irq);
-		if (ret) printk ("FC: Cannot enque OFFLINE packet on %s\n", fc->name);
-	}
-		
-	l.timer.expires = jiffies + 5 * HZ;
-	add_timer(&l.timer);
-	down(&l.sem);
-	del_timer(&l.timer);
-	
-	for (fc = fcchain, i = 0; fc && i < count; fc = fc->next, i++)
-		fc->ls = NULL;
-	kfree (l.fcmds);
-	return 0;
-}
-
-int fcp_init(fc_channel *fcchain)
-{
-	fc_channel *fc;
-	int count=0;
-	int ret;
-	
-	for (fc = fcchain; fc; fc = fc->next) {
-		fc->fcp_register = fcp_register;
-		count++;
-	}
-
-	ret = fcp_initialize (fcchain, count);
-	if (ret)
-		return ret;
-		
-	if (!fc_channels)
-		fc_channels = fcchain;
-	else {
-		for (fc = fc_channels; fc->next; fc = fc->next);
-		fc->next = fcchain;
-	}
-	return ret;
-}
-
-void fcp_release(fc_channel *fcchain, int count)  /* count must > 0 */
-{
-	fc_channel *fc;
-	fc_channel *fcx;
-
-	for (fc = fcchain; --count && fc->next; fc = fc->next);
-	if (count) {
-		printk("FC: nothing to release\n");
-		return;
-	}
-	
-	if (fc_channels == fcchain)
-		fc_channels = fc->next;
-	else {
-		for (fcx = fc_channels; fcx->next != fcchain; fcx = fcx->next);
-		fcx->next = fc->next;
-	}
-	fc->next = NULL;
-
-	/*
-	 *  We've just grabbed fcchain out of the fc_channel list
-	 *  and zero-terminated it, while destroying the count.
-	 *
-	 *  Freeing the fc's is the low level driver's responsibility.
-	 */
-}
-
-
-static void fcp_scsi_done(struct scsi_cmnd *SCpnt)
-{
-	if (FCP_CMND(SCpnt)->done)
-		FCP_CMND(SCpnt)->done(SCpnt);
-}
-
-static int fcp_scsi_queue_it(fc_channel *fc, struct scsi_cmnd *SCpnt,
-			     fcp_cmnd *fcmd, int prepare)
-{
-	long i;
-	fcp_cmd *cmd;
-	u32 fcp_cntl;
-	if (prepare) {
-		i = find_first_zero_bit (fc->scsi_bitmap, fc->scsi_bitmap_end);
-		set_bit (i, fc->scsi_bitmap);
-		fcmd->token = i;
-		cmd = fc->scsi_cmd_pool + i;
-
-		if (fc->encode_addr (SCpnt, cmd->fcp_addr, fc, fcmd)) {
-			/* Invalid channel/id/lun and couldn't map it into fcp_addr */
-			clear_bit (i, fc->scsi_bitmap);
-			SCpnt->result = (DID_BAD_TARGET << 16);
-			SCpnt->scsi_done(SCpnt);
-			return 0;
-		}
-		fc->scsi_free--;
-		fc->cmd_slots[fcmd->token] = fcmd;
-
-		if (SCpnt->device->tagged_supported) {
-			if (jiffies - fc->ages[SCpnt->device->channel * fc->targets + SCpnt->device->id] > (5 * 60 * HZ)) {
-				fc->ages[SCpnt->device->channel * fc->targets + SCpnt->device->id] = jiffies;
-				fcp_cntl = FCP_CNTL_QTYPE_ORDERED;
-			} else
-				fcp_cntl = FCP_CNTL_QTYPE_SIMPLE;
-		} else
-			fcp_cntl = FCP_CNTL_QTYPE_UNTAGGED;
-
-		if (!scsi_bufflen(SCpnt)) {
-			cmd->fcp_cntl = fcp_cntl;
-			fcmd->data = (dma_addr_t)NULL;
-		} else {
-			struct scatterlist *sg;
-			int nents;
-
-			switch (SCpnt->cmnd[0]) {
-			case WRITE_6:
-			case WRITE_10:
-			case WRITE_12:
-				cmd->fcp_cntl = (FCP_CNTL_WRITE | fcp_cntl); break;
-			default:
-				cmd->fcp_cntl = (FCP_CNTL_READ | fcp_cntl); break;
-			}
-
-			sg = scsi_sglist(SCpnt);
-			nents = dma_map_sg(fc->dev, sg, scsi_sg_count(SCpnt),
-					   SCpnt->sc_data_direction);
-			fcmd->data = sg_dma_address(sg);
-			cmd->fcp_data_len = sg_dma_len(sg);
-		}
-		memcpy (cmd->fcp_cdb, SCpnt->cmnd, SCpnt->cmd_len);
-		memset (cmd->fcp_cdb+SCpnt->cmd_len, 0, sizeof(cmd->fcp_cdb)-SCpnt->cmd_len);
-		FCD(("XXX: %04x.%04x.%04x.%04x - %08x%08x%08x\n", cmd->fcp_addr[0], cmd->fcp_addr[1], cmd->fcp_addr[2], cmd->fcp_addr[3], *(u32 *)SCpnt->cmnd, *(u32 *)(SCpnt->cmnd+4), *(u32 *)(SCpnt->cmnd+8)))
-	}
-	FCD(("Trying to enque %p\n", fcmd))
-	if (!fc->scsi_que) {
-		if (!fc->hw_enque (fc, fcmd)) {
-			FCD(("hw_enque succeeded for %p\n", fcmd))
-			return 0;
-		}
-	}
-	FCD(("Putting into que1 %p\n", fcmd))
-	fcp_scsi_insert_queue (fc, fcmd);
-	return 0;
-}
-
-int fcp_scsi_queuecommand(struct scsi_cmnd *SCpnt,
-			  void (* done)(struct scsi_cmnd *))
-{
-	fcp_cmnd *fcmd = FCP_CMND(SCpnt);
-	fc_channel *fc = FC_SCMND(SCpnt);
-	
-	FCD(("Entering SCSI queuecommand %p\n", fcmd))
-	if (SCpnt->done != fcp_scsi_done) {
-		fcmd->done = SCpnt->done;
-		SCpnt->done = fcp_scsi_done;
-		SCpnt->scsi_done = done;
-		fcmd->proto = TYPE_SCSI_FCP;
-		if (!fc->scsi_free) {
-			FCD(("FC: !scsi_free, putting cmd on ML queue\n"))
-#if (FCP_SCSI_USE_NEW_EH_CODE == 0)
-			printk("fcp_scsi_queue_command: queue full, losing cmd, bad\n");
-#endif
-			return 1;
-		}
-		return fcp_scsi_queue_it(fc, SCpnt, fcmd, 1);
-	}
-	return fcp_scsi_queue_it(fc, SCpnt, fcmd, 0);
-}
-
-void fcp_queue_empty(fc_channel *fc)
-{
-	fcp_cmnd *fcmd;
-	
-	FCD(("Queue empty\n"))
-	while ((fcmd = fc->scsi_que)) {
-		/* The hw told us we can try again queue some packet */
-		if (fc->hw_enque (fc, fcmd))
-			break;
-		fcp_scsi_remove_queue (fc, fcmd);
-	}
-}
-
-int fcp_scsi_abort(struct scsi_cmnd *SCpnt)
-{
-	/* Internal bookkeeping only. Lose 1 cmd_slots slot. */
-	fcp_cmnd *fcmd = FCP_CMND(SCpnt);
-	fc_channel *fc = FC_SCMND(SCpnt);
-	
-	/*
-	 * We react to abort requests by simply forgetting
-	 * about the command and pretending everything's sweet.
-	 * This may or may not be silly. We can't, however,
-	 * immediately reuse the command's cmd_slots slot,
-	 * as its result may arrive later and we cannot
-	 * check whether it is the aborted one, can't we?
-	 *
-	 * Therefore, after the first few aborts are done,
-	 * we tell the scsi error handler to do something clever.
-	 * It will eventually call host reset, refreshing
-	 * cmd_slots for us.
-	 *
-	 * There is a theoretical chance that we sometimes allow
-	 * more than can_queue packets to the jungle this way,
-	 * but the worst outcome possible is a series of
-	 * more aborts and eventually the dev_reset catharsis.
-	 */
-
-	if (++fc->abort_count < (fc->can_queue >> 1)) {
-		SCpnt->result = DID_ABORT;
-		fcmd->done(SCpnt);
-		printk("FC: soft abort\n");
-		return SUCCESS;
-	} else {
-		printk("FC: hard abort refused\n");
-		return FAILED;
-	}
-}
-
-#if 0
-void fcp_scsi_reset_done(struct scsi_cmnd *SCpnt)
-{
-	fc_channel *fc = FC_SCMND(SCpnt);
-
-	fc->rst_pkt->eh_state = SCSI_STATE_FINISHED;
-	up(fc->rst_pkt->device->host->eh_action);
-}
-#endif
-
-#define FCP_RESET_TIMEOUT (2*HZ)
-
-int fcp_scsi_dev_reset(struct scsi_cmnd *SCpnt)
-{
-#if 0 /* broken junk, but if davem wants to compile this driver, let him.. */
-	unsigned long flags;
-	fcp_cmd *cmd;
-	fcp_cmnd *fcmd;
-	fc_channel *fc = FC_SCMND(SCpnt);
-        DECLARE_MUTEX_LOCKED(sem);
-
-	if (!fc->rst_pkt) {
-		fc->rst_pkt = kmalloc(sizeof(SCpnt), GFP_KERNEL);
-		if (!fc->rst_pkt) return FAILED;
-		
-		fcmd = FCP_CMND(fc->rst_pkt);
-
-
-		fcmd->token = 0;
-		cmd = fc->scsi_cmd_pool + 0;
-		FCD(("Preparing rst packet\n"))
-		fc->encode_addr (SCpnt, cmd->fcp_addr, fc, fcmd);
-		fc->rst_pkt->device = SCpnt->device;
-		fc->rst_pkt->cmd_len = 0;
-		
-		fc->cmd_slots[0] = fcmd;
-
-		cmd->fcp_cntl = FCP_CNTL_QTYPE_ORDERED | FCP_CNTL_RESET;
-		fcmd->data = (dma_addr_t)NULL;
-		fcmd->proto = TYPE_SCSI_FCP;
-
-		memcpy (cmd->fcp_cdb, SCpnt->cmnd, SCpnt->cmd_len);
-		memset (cmd->fcp_cdb+SCpnt->cmd_len, 0, sizeof(cmd->fcp_cdb)-SCpnt->cmd_len);
-		FCD(("XXX: %04x.%04x.%04x.%04x - %08x%08x%08x\n", cmd->fcp_addr[0], cmd->fcp_addr[1], cmd->fcp_addr[2], cmd->fcp_addr[3], *(u32 *)SCpnt->cmnd, *(u32 *)(SCpnt->cmnd+4), *(u32 *)(SCpnt->cmnd+8)))
-	} else {
-		fcmd = FCP_CMND(fc->rst_pkt);
-		if (fc->rst_pkt->eh_state == SCSI_STATE_QUEUED)
-			return FAILED; /* or SUCCESS. Only these */
-	}
-	fc->rst_pkt->done = NULL;
-
-
-        fc->rst_pkt->eh_state = SCSI_STATE_QUEUED;
-	init_timer(&fc->rst_pkt->eh_timeout);
-	fc->rst_pkt->eh_timeout.data = (unsigned long) fc->rst_pkt;
-	fc->rst_pkt->eh_timeout.expires = jiffies + FCP_RESET_TIMEOUT;
-	fc->rst_pkt->eh_timeout.function = (void (*)(unsigned long))fcp_scsi_reset_done;
-
-        add_timer(&fc->rst_pkt->eh_timeout);
-
-	/*
-	 * Set up the semaphore so we wait for the command to complete.
-	 */
-
-	fc->rst_pkt->device->host->eh_action = &sem;
-
-	fc->rst_pkt->done = fcp_scsi_reset_done;
-
-	spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
-	fcp_scsi_queue_it(fc, fc->rst_pkt, fcmd, 0);
-	spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
-	
-	down(&sem);
-
-	fc->rst_pkt->device->host->eh_action = NULL;
-	del_timer(&fc->rst_pkt->eh_timeout);
-
-	/*
-	 * See if timeout.  If so, tell the host to forget about it.
-	 * In other words, we don't want a callback any more.
-	 */
-	if (fc->rst_pkt->eh_state == SCSI_STATE_TIMEOUT ) {
-		fc->rst_pkt->eh_state = SCSI_STATE_UNUSED;
-		return FAILED;
-	}
-	fc->rst_pkt->eh_state = SCSI_STATE_UNUSED;
-#endif
-	return SUCCESS;
-}
-
-static int __fcp_scsi_host_reset(struct scsi_cmnd *SCpnt)
-{
-	fc_channel *fc = FC_SCMND(SCpnt);
-	fcp_cmnd *fcmd = FCP_CMND(SCpnt);
-	int i;
-
-	printk ("FC: host reset\n");
-
-	for (i=0; i < fc->can_queue; i++) {
-		if (fc->cmd_slots[i] && SCpnt->result != DID_ABORT) {
-			SCpnt->result = DID_RESET;
-			fcmd->done(SCpnt);
-			fc->cmd_slots[i] = NULL;
-		}
-	}
-	fc->reset(fc);
-	fc->abort_count = 0;
-	if (fcp_initialize(fc, 1)) return SUCCESS;
-	else return FAILED;
-}
-
-int fcp_scsi_host_reset(struct scsi_cmnd *SCpnt)
-{
-	unsigned long flags;
-	int rc;
-
-	spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
-	rc = __fcp_scsi_host_reset(SCpnt);
-	spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
-
-	return rc;
-}
-
-static int fcp_els_queue_it(fc_channel *fc, fcp_cmnd *fcmd)
-{
-	long i;
-
-	i = find_first_zero_bit (fc->scsi_bitmap, fc->scsi_bitmap_end);
-	set_bit (i, fc->scsi_bitmap);
-	fcmd->token = i;
-	fc->scsi_free--;
-	fc->cmd_slots[fcmd->token] = fcmd;
-	return fcp_scsi_queue_it(fc, NULL, fcmd, 0);
-}
-
-static int fc_do_els(fc_channel *fc, unsigned int alpa, void *data, int len)
-{
-	fcp_cmnd _fcmd, *fcmd;
-	fc_hdr *fch;
-	lse l;
-	int i;
-
-	fcmd = &_fcmd;
-	memset(fcmd, 0, sizeof(fcp_cmnd));
-	FCD(("PLOGI SID %d DID %d\n", fc->sid, alpa))
-	fch = &fcmd->fch;
-	FILL_FCHDR_RCTL_DID(fch, R_CTL_ELS_REQ, alpa);
-	FILL_FCHDR_SID(fch, fc->sid);
-	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;
-	fcmd->cmd = dma_map_single (fc->dev, data, 2 * len, DMA_BIDIRECTIONAL);
-	fcmd->rsp = fcmd->cmd + len;
-	fcmd->cmdlen = len;
-	fcmd->rsplen = len;
-	fcmd->data = (dma_addr_t)NULL;
-	fcmd->fc = fc;
-	fcmd->class = FC_CLASS_SIMPLE;
-	fcmd->proto = TYPE_EXTENDED_LS;
-	
-	memset (&l, 0, sizeof(lse));
-	l.magic = LSEMAGIC;
-	init_MUTEX_LOCKED(&l.sem);
-	l.timer.function = fcp_login_timeout;
-	l.timer.data = (unsigned long)&l;
-	l.status = FC_STATUS_TIMED_OUT;
-	fcmd->ls = (void *)&l;
-
-	disable_irq(fc->irq);	
-	fcp_els_queue_it(fc, fcmd);
-	enable_irq(fc->irq);
-
-	for (i = 0;;) {
-		l.timer.expires = jiffies + 5 * HZ;
-		add_timer(&l.timer);
-		down(&l.sem);
-		del_timer(&l.timer);
-		if (l.status != FC_STATUS_TIMED_OUT) break;
-		if (++i == 3) break;
-		disable_irq(fc->irq);
-		fcp_scsi_queue_it(fc, NULL, fcmd, 0);
-		enable_irq(fc->irq);
-	}
-	
-	clear_bit(fcmd->token, fc->scsi_bitmap);
-	fc->scsi_free++;
-	dma_unmap_single (fc->dev, fcmd->cmd, 2 * len, DMA_BIDIRECTIONAL);
-	return l.status;
-}
-
-int fc_do_plogi(fc_channel *fc, unsigned char alpa, fc_wwn *node, fc_wwn *nport)
-{
-	logi *l;
-	int status;
-
-	l = kzalloc(2 * sizeof(logi), GFP_KERNEL);
-	if (!l) return -ENOMEM;
-	l->code = LS_PLOGI;
-	memcpy (&l->nport_wwn, &fc->wwn_nport, sizeof(fc_wwn));
-	memcpy (&l->node_wwn, &fc->wwn_node, sizeof(fc_wwn));
-	memcpy (&l->common, fc->common_svc, sizeof(common_svc_parm));
-	memcpy (&l->class1, fc->class_svcs, 3*sizeof(svc_parm));
-	status = fc_do_els(fc, alpa, l, sizeof(logi));
-	if (status == FC_STATUS_OK) {
-		if (l[1].code == LS_ACC) {
-#ifdef FCDEBUG
-			u32 *u = (u32 *)&l[1].nport_wwn;
-			FCD(("AL-PA %02x: Port WWN %08x%08x Node WWN %08x%08x\n", alpa, 
-				u[0], u[1], u[2], u[3]))
-#endif
-			memcpy(nport, &l[1].nport_wwn, sizeof(fc_wwn));
-			memcpy(node, &l[1].node_wwn, sizeof(fc_wwn));
-		} else
-			status = FC_STATUS_BAD_RSP;
-	}
-	kfree(l);
-	return status;
-}
-
-typedef struct {
-	unsigned int code;
-	unsigned params[4];
-} prli;
-
-int fc_do_prli(fc_channel *fc, unsigned char alpa)
-{
-	prli *p;
-	int status;
-
-	p = kzalloc(2 * sizeof(prli), GFP_KERNEL);
-	if (!p) return -ENOMEM;
-	p->code = LS_PRLI;
-	p->params[0] = 0x08002000;
-	p->params[3] = 0x00000022;
-	status = fc_do_els(fc, alpa, p, sizeof(prli));
-	if (status == FC_STATUS_OK && p[1].code != LS_PRLI_ACC && p[1].code != LS_ACC)
-		status = FC_STATUS_BAD_RSP;
-	kfree(p);
-	return status;
-}
-
-MODULE_LICENSE("GPL");
-
diff --git a/drivers/fc4/fc.h b/drivers/fc4/fc.h
deleted file mode 100644
index 13f89d4..0000000
--- a/drivers/fc4/fc.h
+++ /dev/null
@@ -1,230 +0,0 @@
-/* fc.h: Definitions for Fibre Channel Physical and Signaling Interface.
- *
- * Copyright (C) 1996-1997,1999 Jakub Jelinek (jj@xxxxxxxxxxxxxx)
- *
- * Sources:
- *	Fibre Channel Physical & Signaling Interface (FC-PH), dpANS, 1994
- *	dpANS Fibre Channel Protocol for SCSI (X3.269-199X), Rev. 012, 1995
- */
-
-#ifndef __FC_H
-#define __FC_H
-
-/* World Wide Name */
-#define NAAID_IEEE		1
-#define NAAID_IEEE_EXT		2
-#define NAAID_LOCAL		3
-#define NAAID_IP		4
-#define NAAID_IEEE_REG		5
-#define NAAID_IEEE_REG_EXT	6
-#define NAAID_CCITT		12
-#define NAAID_CCITT_GRP		14
-
-/* This is NAAID_IEEE_EXT scheme */
-typedef struct {
-	u32	naaid:4;
-	u32	nportid:12;
-	u32	hi:16;
-	u32	lo;
-} fc_wwn;
-
-/* Frame header for FC-PH frames */
-
-/* r_ctl field */
-#define R_CTL_DEVICE_DATA	0x00	/* FC4 Device_Data frame */
-#define R_CTL_EXTENDED_SVC	0x20	/* Extended Link_Data frame */
-#define R_CTL_FC4_SVC		0x30	/* FC4 Link_Data frame */
-#define R_CTL_VIDEO		0x40	/* Video_Data frame */
-#define R_CTL_BASIC_SVC		0x80	/* Basic Link_Data frame */
-#define R_CTL_LINK_CTL		0xc0	/* Link_Control frame */
-/* FC4 Device_Data frames */
-#define R_CTL_UNCATEGORIZED	0x00
-#define R_CTL_SOLICITED_DATA	0x01
-#define R_CTL_UNSOL_CONTROL	0x02
-#define R_CTL_SOLICITED_CONTROL	0x03
-#define R_CTL_UNSOL_DATA	0x04
-#define R_CTL_XFER_RDY		0x05
-#define R_CTL_COMMAND		0x06
-#define R_CTL_STATUS		0x07
-/* Basic Link_Data frames */
-#define R_CTL_LS_NOP		0x80
-#define R_CTL_LS_ABTS		0x81
-#define R_CTL_LS_RMC		0x82
-#define R_CTL_LS_BA_ACC		0x84
-#define R_CTL_LS_BA_RJT		0x85
-/* Extended Link_Data frames */
-#define R_CTL_ELS_REQ		0x22
-#define R_CTL_ELS_RSP		0x23
-/* Link_Control frames */
-#define R_CTL_ACK_1		0xc0
-#define R_CTL_ACK_N		0xc1
-#define R_CTL_P_RJT		0xc2
-#define R_CTL_F_RJT		0xc3
-#define R_CTL_P_BSY		0xc4
-#define R_CTL_F_BSY_DF		0xc5
-#define R_CTL_F_BSY_LC		0xc6
-#define R_CTL_LCR		0xc7
-
-/* type field */
-#define TYPE_BASIC_LS		0x00
-#define TYPE_EXTENDED_LS	0x01
-#define TYPE_IS8802		0x04
-#define TYPE_IS8802_SNAP	0x05
-#define TYPE_SCSI_FCP		0x08
-#define TYPE_SCSI_GPP		0x09
-#define TYPE_HIPP_FP		0x0a
-#define TYPE_IPI3_MASTER	0x11
-#define TYPE_IPI3_SLAVE		0x12
-#define TYPE_IPI3_PEER		0x13
-
-/* f_ctl field */
-#define F_CTL_FILL_BYTES	0x000003
-#define F_CTL_XCHG_REASSEMBLE	0x000004
-#define F_CTL_RO_PRESENT	0x000008
-#define F_CTL_ABORT_SEQ		0x000030
-#define F_CTL_CONTINUE_SEQ	0x0000c0
-#define F_CTL_INVALIDATE_XID	0x004000
-#define F_CTL_XID_REASSIGNED	0x008000
-#define F_CTL_SEQ_INITIATIVE	0x010000
-#define F_CTL_CHAINED_SEQ	0x020000
-#define F_CTL_END_CONNECT	0x040000
-#define F_CTL_END_SEQ		0x080000
-#define F_CTL_LAST_SEQ		0x100000
-#define F_CTL_FIRST_SEQ		0x200000
-#define F_CTL_SEQ_CONTEXT	0x400000
-#define F_CTL_XCHG_CONTEXT	0x800000
-
-typedef struct {
-	u32	r_ctl:8,	did:24;
-	u32	xxx1:8,		sid:24;
-	u32	type:8,		f_ctl:24;
-	u32	seq_id:8,	df_ctl:8,	seq_cnt:16;
-	u16	ox_id,		rx_id;
-	u32	param;
-} fc_hdr;
-/* The following are ugly macros to make setup of this structure faster */
-#define FILL_FCHDR_RCTL_DID(fch, r_ctl, did) *(u32 *)(fch) = ((r_ctl) << 24) | (did);
-#define FILL_FCHDR_SID(fch, sid) *((u32 *)(fch)+1) = (sid);
-#define FILL_FCHDR_TYPE_FCTL(fch, type, f_ctl) *((u32 *)(fch)+2) = ((type) << 24) | (f_ctl);
-#define FILL_FCHDR_SEQ_DF_SEQ(fch, seq_id, df_ctl, seq_cnt) *((u32 *)(fch)+3) = ((seq_id) << 24) | ((df_ctl) << 16) | (seq_cnt);
-#define FILL_FCHDR_OXRX(fch, ox_id, rx_id) *((u32 *)(fch)+4) = ((ox_id) << 16) | (rx_id);
-
-/* Well known addresses */
-#define FS_GENERAL_MULTICAST	0xfffff7
-#define FS_WELL_KNOWN_MULTICAST	0xfffff8
-#define FS_HUNT_GROUP		0xfffff9
-#define FS_MANAGEMENT_SERVER	0xfffffa
-#define FS_TIME_SERVER		0xfffffb
-#define FS_NAME_SERVER		0xfffffc
-#define FS_FABRIC_CONTROLLER	0xfffffd
-#define FS_FABRIC_F_PORT	0xfffffe
-#define FS_BROADCAST		0xffffff
-
-/* Reject frames */
-/* The param field should be cast to this structure */
-typedef struct {
-	u8	action;
-	u8	reason;
-	u8	xxx;
-	u8	vendor_unique;
-} rjt_param;
-
-/* Reject action codes */
-#define RJT_RETRY			0x01
-#define RJT_NONRETRY			0x02
-
-/* Reject reason codes */
-#define RJT_INVALID_DID			0x01
-#define RJT_INVALID_SID			0x02
-#define RJT_NPORT_NOT_AVAIL_TEMP	0x03
-#define RJT_NPORT_NOT_AVAIL_PERM	0x04
-#define RJT_CLASS_NOT_SUPPORTED		0x05
-#define RJT_DELIMITER_ERROR		0x06
-#define RJT_TYPE_NOT_SUPPORTED		0x07
-#define RJT_INVALID_LINK_CONTROL	0x08
-#define RJT_INVALID_R_CTL		0x09
-#define RJT_INVALID_F_CTL		0x0a
-#define RJT_INVALID_OX_ID		0x0b
-#define RJT_INVALID_RX_ID		0x0c
-#define RJT_INVALID_SEQ_ID		0x0d
-#define RJT_INVALID_DF_CTL		0x0e
-#define RJT_INVALID_SEQ_CNT		0x0f
-#define RJT_INVALID_PARAMETER		0x10
-#define RJT_EXCHANGE_ERROR		0x11
-#define RJT_PROTOCOL_ERROR		0x12
-#define RJT_INCORRECT_LENGTH		0x13
-#define RJT_UNEXPECTED_ACK		0x14
-#define RJT_UNEXPECTED_LINK_RESP	0x15
-#define RJT_LOGIN_REQUIRED		0x16
-#define RJT_EXCESSIVE_SEQUENCES		0x17
-#define RJT_CANT_ESTABLISH_EXCHANGE	0x18
-#define RJT_SECURITY_NOT_SUPPORTED	0x19
-#define RJT_FABRIC_NA			0x1a
-#define RJT_VENDOR_UNIQUE		0xff
-
-
-#define SP_F_PORT_LOGIN			0x10
-
-/* Extended SVC commands */
-#define LS_RJT			0x01000000
-#define LS_ACC			0x02000000
-#define LS_PRLI_ACC		0x02100014
-#define LS_PLOGI		0x03000000
-#define LS_FLOGI		0x04000000
-#define LS_LOGO			0x05000000
-#define LS_ABTX			0x06000000
-#define LS_RCS			0x07000000
-#define LS_RES			0x08000000
-#define LS_RSS			0x09000000
-#define LS_RSI			0x0a000000
-#define LS_ESTS			0x0b000000
-#define LS_ESTC			0x0c000000
-#define LS_ADVC			0x0d000000
-#define LS_RTV			0x0e000000
-#define LS_RLS			0x0f000000
-#define LS_ECHO			0x10000000
-#define LS_TEST			0x11000000
-#define LS_RRQ			0x12000000
-#define LS_IDENT		0x20000000
-#define LS_PRLI			0x20100014
-#define LS_DISPLAY		0x21000000
-#define LS_PRLO			0x21100014
-#define LS_PDISC		0x50000000
-#define LS_ADISC		0x52000000
-
-typedef struct {
-	u8	fcph_hi, fcph_lo;
-	u16	buf2buf_credit;
-	u8	common_features;
-	u8	xxx1;
-	u16	buf2buf_size;
-	u8	xxx2;
-	u8	total_concurrent;
-	u16	off_by_info;
-	u32	e_d_tov;
-} common_svc_parm;
-
-typedef struct {
-	u16	serv_opts;
-	u16	initiator_ctl;
-	u16	rcpt_ctl;
-	u16	recv_size;
-	u8	xxx1;
-	u8	concurrent_seqs;
-	u16	end2end_credit;
-	u16	open_seqs_per_xchg;
-	u16	xxx2;
-} svc_parm;
-
-/* Login */
-typedef struct {
-	u32		code;
-	common_svc_parm	common;
-	fc_wwn		nport_wwn;
-	fc_wwn		node_wwn;
-	svc_parm	class1;
-	svc_parm	class2;
-	svc_parm	class3;
-} logi;
-
-#endif /* !(__FC_H) */
diff --git a/drivers/fc4/fc_syms.c b/drivers/fc4/fc_syms.c
deleted file mode 100644
index bd3918d..0000000
--- a/drivers/fc4/fc_syms.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * We should not even be trying to compile this if we are not doing
- * a module.
- */
-#include <linux/module.h>
-
-#ifdef CONFIG_MODULES
-
-#include <linux/types.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-
-#include "fcp_impl.h"
-
-EXPORT_SYMBOL(fcp_init);
-EXPORT_SYMBOL(fcp_release);
-EXPORT_SYMBOL(fcp_queue_empty);
-EXPORT_SYMBOL(fcp_receive_solicited);
-EXPORT_SYMBOL(fc_channels);
-EXPORT_SYMBOL(fcp_state_change);
-EXPORT_SYMBOL(fc_do_plogi);
-EXPORT_SYMBOL(fc_do_prli);
-
-/* SCSI stuff */
-EXPORT_SYMBOL(fcp_scsi_queuecommand);
-EXPORT_SYMBOL(fcp_scsi_abort);
-EXPORT_SYMBOL(fcp_scsi_dev_reset);
-EXPORT_SYMBOL(fcp_scsi_host_reset);
-
-#endif /* CONFIG_MODULES */
diff --git a/drivers/fc4/fcp.h b/drivers/fc4/fcp.h
deleted file mode 100644
index 6aa34a7..0000000
--- a/drivers/fc4/fcp.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* fcp.h: Definitions for Fibre Channel Protocol.
- *
- * Copyright (C) 1997 Jakub Jelinek (jj@xxxxxxxxxxxxxxxxxxx)
- *
- */
-
-#ifndef __FCP_H
-#define __FCP_H
-
-/* FCP addressing is hierarchical with up to 4 layers, MS first.
-   Exact meaning of the addresses is up to the vendor */
-
-/* fcp_cntl field */   
-#define FCP_CNTL_WRITE		0x00000001	/* Initiator write */
-#define FCP_CNTL_READ		0x00000002	/* Initiator read */
-#define FCP_CNTL_ABORT_TSK	0x00000200	/* Abort task set */
-#define FCP_CNTL_CLR_TASK	0x00000400	/* Clear task set */
-#define FCP_CNTL_RESET		0x00002000	/* Reset */
-#define FCP_CNTL_CLR_ACA	0x00004000	/* Clear ACA */
-#define FCP_CNTL_KILL_TASK	0x00008000	/* Terminate task */
-#define FCP_CNTL_QTYPE_MASK	0x00070000	/* Tagged queueing type */
-#define 	FCP_CNTL_QTYPE_SIMPLE		0x00000000
-#define 	FCP_CNTL_QTYPE_HEAD_OF_Q	0x00010000
-#define		FCP_CNTL_QTYPE_ORDERED		0x00020000
-#define 	FCP_CNTL_QTYPE_ACA_Q_TAG	0x00040000
-#define 	FCP_CNTL_QTYPE_UNTAGGED		0x00050000
-
-typedef struct {
-	u16	fcp_addr[4];
-	u32	fcp_cntl;
-	u8	fcp_cdb[16];
-	u32	fcp_data_len;
-} fcp_cmd;
-
-/* fcp_status field */
-#define	FCP_STATUS_MASK		0x000000ff	/* scsi status of command */
-#define FCP_STATUS_RSP_LEN	0x00000100	/* response_len != 0 */
-#define FCP_STATUS_SENSE_LEN	0x00000200	/* sense_len != 0 */
-#define FCP_STATUS_RESID	0x00000400	/* resid != 0 */
-
-typedef struct {
-	u32	xxx[2];
-	u32	fcp_status;
-	u32	fcp_resid;
-	u32	fcp_sense_len;
-	u32	fcp_response_len;
-	/* u8	fcp_sense[fcp_sense_len]; */
-	/* u8	fcp_response[fcp_response_len]; */
-} fcp_rsp;
-
-/* fcp errors */
-
-/* rsp_info_type field */
-#define FCP_RSP_SCSI_BUS_ERR	0x01
-#define FCP_RSP_SCSI_PORT_ERR	0x02
-#define FCP_RSP_CARD_ERR	0x03
-
-/* isp_status field */
-#define FCP_RSP_CMD_COMPLETE	0x0000
-#define FCP_RSP_CMD_INCOMPLETE	0x0001
-#define FCP_RSP_CMD_DMA_ERR	0x0002
-#define FCP_RSP_CMD_TRAN_ERR	0x0003
-#define FCP_RSP_CMD_RESET	0x0004
-#define FCP_RSP_CMD_ABORTED	0x0005
-#define FCP_RSP_CMD_TIMEOUT	0x0006
-#define FCP_RSP_CMD_OVERRUN	0x0007
-
-/* isp_state_flags field */
-#define FCP_RSP_ST_GOT_BUS	0x0100
-#define FCP_RSP_ST_GOT_TARGET	0x0200
-#define FCP_RSP_ST_SENT_CMD	0x0400
-#define FCP_RSP_ST_XFRD_DATA	0x0800
-#define FCP_RSP_ST_GOT_STATUS	0x1000
-#define FCP_RSP_ST_GOT_SENSE	0x2000
-
-/* isp_stat_flags field */
-#define FCP_RSP_STAT_DISC	0x0001
-#define FCP_RSP_STAT_SYNC	0x0002
-#define FCP_RSP_STAT_PERR	0x0004
-#define FCP_RSP_STAT_BUS_RESET	0x0008
-#define FCP_RSP_STAT_DEV_RESET	0x0010
-#define FCP_RSP_STAT_ABORTED	0x0020
-#define FCP_RSP_STAT_TIMEOUT	0x0040
-#define FCP_RSP_STAT_NEGOTIATE	0x0080
-
-typedef struct {
-	u8	rsp_info_type;
-	u8	xxx;
-	u16	isp_status;
-	u16	isp_state_flags;
-	u16	isp_stat_flags;
-} fcp_scsi_err;
-
-#endif /* !(__FCP_H) */
diff --git a/drivers/fc4/fcp_impl.h b/drivers/fc4/fcp_impl.h
deleted file mode 100644
index 506338a..0000000
--- a/drivers/fc4/fcp_impl.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/* fcp_impl.h: Generic SCSI on top of FC4 - our interface defines.
- *
- * Copyright (C) 1997-1999 Jakub Jelinek (jj@xxxxxxxxxxxxxx)
- * Copyright (C) 1998 Jirka Hanika (geo@xxxxxxxxxx)
- */
-
-#ifndef _FCP_SCSI_H
-#define _FCP_SCSI_H
-
-#include <linux/types.h>
-#include "../scsi/scsi.h"
-
-#include "fc.h"
-#include "fcp.h"
-#include "fc-al.h"
-
-#include <asm/io.h>
-#ifdef __sparc__
-#include <asm/sbus.h>
-#endif
-
-/* 0 or 1 */
-#define	FCP_SCSI_USE_NEW_EH_CODE	0
-
-#define FC_CLASS_OUTBOUND	0x01
-#define FC_CLASS_INBOUND	0x02
-#define FC_CLASS_SIMPLE		0x03
-#define FC_CLASS_IO_WRITE	0x04
-#define FC_CLASS_IO_READ	0x05
-#define FC_CLASS_UNSOLICITED	0x06
-#define FC_CLASS_OFFLINE	0x08
-
-#define PROTO_OFFLINE		0x02
-#define PROTO_REPORT_AL_MAP	0x03
-#define PROTO_FORCE_LIP		0x06
-
-struct _fc_channel; 
-
-typedef struct fcp_cmnd {
-	struct fcp_cmnd		*next;
-	struct fcp_cmnd		*prev;
-	void			(*done)(struct scsi_cmnd *);
-	unsigned short		proto;
-	unsigned short		token;
-	unsigned int		did;
-	/* FCP SCSI stuff */
-	dma_addr_t		data;
-	/* From now on this cannot be touched for proto == TYPE_SCSI_FCP */
-	fc_hdr			fch;
-	dma_addr_t		cmd;
-	dma_addr_t		rsp;
-	int			cmdlen;
-	int			rsplen;
-	int			class;
-	int			datalen;
-	/* This is just used as a verification during login */
-	struct _fc_channel	*fc;
-	void			*ls;
-} fcp_cmnd;
-
-typedef struct {
-	unsigned int		len;
-	unsigned char		list[0];
-} fcp_posmap;
-
-typedef struct _fc_channel {
-	struct _fc_channel	*next;
-	int			irq;
-	int			state;
-	int			sid;
-	int			did;
-	char			name[16];
-	void			(*fcp_register)(struct _fc_channel *, u8, int);
-	void			(*reset)(struct _fc_channel *);
-	int			(*hw_enque)(struct _fc_channel *, fcp_cmnd *);
-	fc_wwn			wwn_node;
-	fc_wwn			wwn_nport;
-	fc_wwn			wwn_dest;
-	common_svc_parm		*common_svc;
-	svc_parm		*class_svcs;
-#ifdef __sparc__	
-	struct sbus_dev		*dev;
-#else
-	struct pci_dev		*dev;
-#endif
-	struct module		*module;
-	/* FCP SCSI stuff */
-	short			can_queue;
-	short			abort_count;
-	int			rsp_size;
-	fcp_cmd			*scsi_cmd_pool;
-	char			*scsi_rsp_pool;
-	dma_addr_t		dma_scsi_cmd, dma_scsi_rsp;
-	unsigned long		*scsi_bitmap;
-	long			scsi_bitmap_end;
-	int			scsi_free;
-	int			(*encode_addr)(struct scsi_cmnd *, u16 *, struct _fc_channel *, fcp_cmnd *);
-	fcp_cmnd		*scsi_que;
-	char			scsi_name[4];
-	fcp_cmnd		**cmd_slots;
-	int			channels;
-	int			targets;
-	long			*ages;
-	struct scsi_cmnd	*rst_pkt;
-	fcp_posmap		*posmap;
-	/* LOGIN stuff */
-	fcp_cmnd		*login;
-	void			*ls;
-} fc_channel;
-
-extern fc_channel *fc_channels;
-
-#define FC_STATE_UNINITED	0
-#define FC_STATE_ONLINE		1
-#define FC_STATE_OFFLINE	2
-#define FC_STATE_RESETING	3
-#define FC_STATE_FPORT_OK	4
-#define FC_STATE_MAYBEOFFLINE	5
-
-#define FC_STATUS_OK			0
-#define FC_STATUS_P_RJT			2
-#define FC_STATUS_F_RJT			3
-#define FC_STATUS_P_BSY			4
-#define FC_STATUS_F_BSY			5
-#define FC_STATUS_ERR_OFFLINE		0x11
-#define FC_STATUS_TIMEOUT		0x12
-#define FC_STATUS_ERR_OVERRUN		0x13
-#define FC_STATUS_POINTTOPOINT		0x15
-#define FC_STATUS_AL			0x16
-#define FC_STATUS_UNKNOWN_CQ_TYPE	0x20
-#define FC_STATUS_BAD_SEG_CNT		0x21
-#define FC_STATUS_MAX_XCHG_EXCEEDED	0x22
-#define FC_STATUS_BAD_XID		0x23
-#define FC_STATUS_XCHG_BUSY		0x24
-#define FC_STATUS_BAD_POOL_ID		0x25
-#define FC_STATUS_INSUFFICIENT_CQES	0x26
-#define FC_STATUS_ALLOC_FAIL		0x27
-#define FC_STATUS_BAD_SID		0x28
-#define FC_STATUS_NO_SEQ_INIT		0x29
-#define FC_STATUS_TIMED_OUT		-1
-#define FC_STATUS_BAD_RSP		-2
-
-void fcp_queue_empty(fc_channel *);
-int fcp_init(fc_channel *);
-void fcp_release(fc_channel *fc_chain, int count);
-void fcp_receive_solicited(fc_channel *, int, int, int, fc_hdr *);
-void fcp_state_change(fc_channel *, int);
-int fc_do_plogi(fc_channel *, unsigned char, fc_wwn *, fc_wwn *);
-int fc_do_prli(fc_channel *, unsigned char);
-
-#define for_each_fc_channel(fc)				\
-	for (fc = fc_channels; fc; fc = fc->next)
-	
-#define for_each_online_fc_channel(fc) 			\
-	for_each_fc_channel(fc)				\
-		if (fc->state == FC_STATE_ONLINE)
-
-int fcp_scsi_queuecommand(struct scsi_cmnd *,
-			  void (* done) (struct scsi_cmnd *));
-int fcp_scsi_abort(struct scsi_cmnd *);
-int fcp_scsi_dev_reset(struct scsi_cmnd *);
-int fcp_scsi_host_reset(struct scsi_cmnd *);
-
-#endif /* !(_FCP_SCSI_H) */
diff --git a/drivers/fc4/soc.c b/drivers/fc4/soc.c
deleted file mode 100644
index d517734..0000000
--- a/drivers/fc4/soc.c
+++ /dev/null
@@ -1,764 +0,0 @@
-/* soc.c: Sparc SUNW,soc (Serial Optical Channel) Fibre Channel Sbus adapter support.
- *
- * Copyright (C) 1996,1997,1999 Jakub Jelinek (jj@xxxxxxxxxxxxxx)
- * Copyright (C) 1997,1998 Jirka Hanika (geo@xxxxxxxxxx)
- *
- * Sources:
- *	Fibre Channel Physical & Signaling Interface (FC-PH), dpANS, 1994
- *	dpANS Fibre Channel Protocol for SCSI (X3.269-199X), Rev. 012, 1995
- *
- * Supported hardware:
- *      Tested on SOC sbus card bought with SS1000 in Linux running on SS5 and Ultra1. 
- *      For SOC sbus cards, you have to make sure your FCode is 1.52 or later.
- *      If you have older FCode, you should try to upgrade or get SOC microcode from Sun
- *      (the microcode is present in Solaris soc driver as well). In that case you need
- *      to #define HAVE_SOC_UCODE and format the microcode into soc_asm.c. For the exact
- *      format mail me and I will tell you. I cannot offer you the actual microcode though,
- *      unless Sun confirms they don't mind.
- */
-
-static char *version =
-        "soc.c:v1.3 9/Feb/99 Jakub Jelinek (jj@xxxxxxxxxxxxxx), Jirka Hanika (geo@xxxxxxxxxx)\n";
-
-#include <linux/module.h>
-#include <linux/kernel.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 <linux/bitops.h>
-#include <asm/io.h>
-#include <asm/dma.h>
-#include <linux/errno.h>
-#include <asm/byteorder.h>
-
-#include <asm/openprom.h>
-#include <asm/oplib.h>
-#include <asm/pgtable.h>
-#include <asm/irq.h>
-
-/* #define SOCDEBUG */
-/* #define HAVE_SOC_UCODE */
-
-#include "fcp_impl.h"
-#include "soc.h"
-#ifdef HAVE_SOC_UCODE
-#include "soc_asm.h"
-#endif
-
-#define soc_printk printk ("soc%d: ", s->soc_no); printk 
-
-#ifdef SOCDEBUG
-#define SOD(x)  soc_printk x;
-#else
-#define SOD(x)
-#endif
-
-#define for_each_soc(s) for (s = socs; s; s = s->next)
-struct soc *socs = NULL;
-
-static inline void soc_disable(struct soc *s)
-{
-	sbus_writel(0, s->regs + IMASK);
-	sbus_writel(SOC_CMD_SOFT_RESET, s->regs + CMD);
-}
-
-static inline void soc_enable(struct soc *s)
-{
-	SOD(("enable %08x\n", s->cfg))
-	sbus_writel(0, s->regs + SAE);
-	sbus_writel(s->cfg, s->regs + CFG);
-	sbus_writel(SOC_CMD_RSP_QALL, s->regs + CMD);
-	SOC_SETIMASK(s, SOC_IMASK_RSP_QALL | SOC_IMASK_SAE);
-	SOD(("imask %08lx %08lx\n", s->imask, sbus_readl(s->regs + IMAK)));
-}
-
-static void soc_reset(fc_channel *fc)
-{
-	soc_port *port = (soc_port *)fc;
-	struct soc *s = port->s;
-	
-	/* FIXME */
-	soc_disable(s);
-	s->req[0].seqno = 1;
-	s->req[1].seqno = 1;
-	s->rsp[0].seqno = 1;
-	s->rsp[1].seqno = 1;
-	s->req[0].in = 0;
-	s->req[1].in = 0;
-	s->rsp[0].in = 0;
-	s->rsp[1].in = 0;
-	s->req[0].out = 0;
-	s->req[1].out = 0;
-	s->rsp[0].out = 0;
-	s->rsp[1].out = 0;
-
-	/* FIXME */
-	soc_enable(s);
-}
-
-static inline void soc_solicited (struct soc *s)
-{
-	fc_hdr fchdr;
-	soc_rsp __iomem *hwrsp;
-	soc_cq_rsp *sw_cq;
-	int token;
-	int status;
-	fc_channel *fc;
-
-	sw_cq = &s->rsp[SOC_SOLICITED_RSP_Q];
-
-	if (sw_cq->pool == NULL)
-		sw_cq->pool = (soc_req __iomem *)
-			(s->xram + xram_get_32low ((xram_p)&sw_cq->hw_cq->address));
-	sw_cq->in = xram_get_8 ((xram_p)&sw_cq->hw_cq->in);
-	SOD (("soc_solicited, %d pkts arrived\n", (sw_cq->in-sw_cq->out) & sw_cq->last))
-	for (;;) {
-		hwrsp = (soc_rsp __iomem *)sw_cq->pool + sw_cq->out;
-		token = xram_get_32low ((xram_p)&hwrsp->shdr.token);
-		status = xram_get_32low ((xram_p)&hwrsp->status);
-		fc = (fc_channel *)(&s->port[(token >> 11) & 1]);
-		
-		if (status == SOC_OK) {
-			fcp_receive_solicited(fc, token >> 12,
-					      token & ((1 << 11) - 1),
-					      FC_STATUS_OK, NULL);
-		} else {
-			xram_copy_from(&fchdr, (xram_p)&hwrsp->fchdr, sizeof(fchdr));
-			/* We have intentionally defined FC_STATUS_* constants
-			 * to match SOC_* constants, otherwise we'd have to
-			 * translate status.
-			 */
-			fcp_receive_solicited(fc, token >> 12,
-					      token & ((1 << 11) - 1),
-					      status, &fchdr);
-		}
-			
-		if (++sw_cq->out > sw_cq->last) {
-			sw_cq->seqno++;
-			sw_cq->out = 0;
-		}
-		
-		if (sw_cq->out == sw_cq->in) {
-			sw_cq->in = xram_get_8 ((xram_p)&sw_cq->hw_cq->in);
-			if (sw_cq->out == sw_cq->in) {
-				/* Tell the hardware about it */
-				sbus_writel((sw_cq->out << 24) |
-					    (SOC_CMD_RSP_QALL &
-					     ~(SOC_CMD_RSP_Q0 << SOC_SOLICITED_RSP_Q)),
-					    s->regs + CMD);
-
-				/* Read it, so that we're sure it has been updated */
-				sbus_readl(s->regs + CMD);
-				sw_cq->in = xram_get_8 ((xram_p)&sw_cq->hw_cq->in);
-				if (sw_cq->out == sw_cq->in)
-					break;
-			}
-		}
-	}
-}
-
-static inline void soc_request (struct soc *s, u32 cmd)
-{
-	SOC_SETIMASK(s, s->imask & ~(cmd & SOC_CMD_REQ_QALL));
-	SOD(("imask %08lx %08lx\n", s->imask, sbus_readl(s->regs + IMASK)));
-
-	SOD(("Queues available %08x OUT %X %X\n", cmd,
-	     xram_get_8((xram_p)&s->req[0].hw_cq->out),
-	     xram_get_8((xram_p)&s->req[0].hw_cq->out)))
-	if (s->port[s->curr_port].fc.state != FC_STATE_OFFLINE) {
-		fcp_queue_empty ((fc_channel *)&(s->port[s->curr_port]));
-		if (((s->req[1].in + 1) & s->req[1].last) != (s->req[1].out))
-			fcp_queue_empty ((fc_channel *)&(s->port[1 - s->curr_port]));
-	} else {
-		fcp_queue_empty ((fc_channel *)&(s->port[1 - s->curr_port]));
-	}
-	if (s->port[1 - s->curr_port].fc.state != FC_STATE_OFFLINE)
-		s->curr_port ^= 1;
-}
-
-static inline void soc_unsolicited (struct soc *s)
-{
-	soc_rsp __iomem *hwrsp, *hwrspc;
-	soc_cq_rsp *sw_cq;
-	int count;
-	int status;
-	int flags;
-	fc_channel *fc;
-
-	sw_cq = &s->rsp[SOC_UNSOLICITED_RSP_Q];
-	if (sw_cq->pool == NULL)
-		sw_cq->pool = (soc_req __iomem *)
-			(s->xram + (xram_get_32low ((xram_p)&sw_cq->hw_cq->address)));
-
-	sw_cq->in = xram_get_8 ((xram_p)&sw_cq->hw_cq->in);
-	SOD (("soc_unsolicited, %d packets arrived\n", (sw_cq->in - sw_cq->out) & sw_cq->last))
-	while (sw_cq->in != sw_cq->out) {
-		/* ...real work per entry here... */
-		hwrsp = (soc_rsp __iomem *)sw_cq->pool + sw_cq->out;
-
-		hwrspc = NULL;
-		flags = xram_get_16 ((xram_p)&hwrsp->shdr.flags);
-		count = xram_get_8 ((xram_p)&hwrsp->count);
-		fc = (fc_channel *)&s->port[flags & SOC_PORT_B];
-		SOD(("FC %08lx fcp_state_change %08lx\n",
-		     (long)fc, (long)fc->fcp_state_change))
-		
-		if (count != 1) {
-			/* Ugh, continuation entries */
-			u8 in;
-
-			if (count != 2) {
-				printk("%s: Too many continuations entries %d\n",
-				       fc->name, count);
-				goto update_out;
-			}
-			
-			in = sw_cq->in;
-			if (in < sw_cq->out) in += sw_cq->last + 1;
-			if (in < sw_cq->out + 2) {
-				/* Ask the hardware if they haven't arrived yet. */
-				sbus_writel((sw_cq->out << 24) |
-					    (SOC_CMD_RSP_QALL &
-					     ~(SOC_CMD_RSP_Q0 << SOC_UNSOLICITED_RSP_Q)),
-					    s->regs + CMD);
-
-				/* Read it, so that we're sure it has been updated */
-				sbus_readl(s->regs + CMD);
-				sw_cq->in = xram_get_8 ((xram_p)&sw_cq->hw_cq->in);
-				in = sw_cq->in;
-				if (in < sw_cq->out)
-					in += sw_cq->last + 1;
-				if (in < sw_cq->out + 2) /* Nothing came, let us wait */
-					return;
-			}
-			if (sw_cq->out == sw_cq->last)
-				hwrspc = (soc_rsp __iomem *)sw_cq->pool;
-			else
-				hwrspc = hwrsp + 1;
-		}
-		
-		switch (flags & ~SOC_PORT_B) {
-		case SOC_STATUS:
-			status = xram_get_32low ((xram_p)&hwrsp->status);
-			switch (status) {
-			case SOC_ONLINE:
-				SOD(("State change to ONLINE\n"));
-				fcp_state_change(fc, FC_STATE_ONLINE);
-				break;
-			case SOC_OFFLINE:
-				SOD(("State change to OFFLINE\n"));
-				fcp_state_change(fc, FC_STATE_OFFLINE);
-				break;
-			default:
-				printk ("%s: Unknown STATUS no %d\n",
-					fc->name, status);
-				break;
-			}
-			break;
-		case (SOC_UNSOLICITED|SOC_FC_HDR):
-			{
-				int r_ctl = xram_get_8 ((xram_p)&hwrsp->fchdr);
-				unsigned len;
-				char buf[64];
-				
-				if ((r_ctl & 0xf0) == R_CTL_EXTENDED_SVC) {
-					len = xram_get_32 ((xram_p)&hwrsp->shdr.bytecnt);
-					if (len < 4 || !hwrspc) {
-						printk ("%s: Invalid R_CTL %02x "
-							"continuation entries\n",
-							fc->name, r_ctl);
-					} else {
-						if (len > 60)
-							len = 60;
-						xram_copy_from (buf, (xram_p)hwrspc,
-								(len + 3) & ~3);
-						if (*(u32 *)buf == LS_DISPLAY) {
-							int i;
-							
-							for (i = 4; i < len; i++)
-								if (buf[i] == '\n')
-									buf[i] = ' ';
-							buf[len] = 0;
-							printk ("%s message: %s\n",
-								fc->name, buf + 4);
-						} else {
-							printk ("%s: Unknown LS_CMD "
-								"%02x\n", fc->name,
-								buf[0]);
-						}
-					}
-				} else {
-					printk ("%s: Unsolicited R_CTL %02x "
-						"not handled\n", fc->name, r_ctl);
-				}
-			}
-			break;
-		default:
-			printk ("%s: Unexpected flags %08x\n", fc->name, flags);
-			break;
-		};
-update_out:
-		if (++sw_cq->out > sw_cq->last) {
-			sw_cq->seqno++;
-			sw_cq->out = 0;
-		}
-		
-		if (hwrspc) {
-			if (++sw_cq->out > sw_cq->last) {
-				sw_cq->seqno++;
-				sw_cq->out = 0;
-			}
-		}
-		
-		if (sw_cq->out == sw_cq->in) {
-			sw_cq->in = xram_get_8 ((xram_p)&sw_cq->hw_cq->in);
-			if (sw_cq->out == sw_cq->in) {
-				/* Tell the hardware about it */
-				sbus_writel((sw_cq->out << 24) |
-					    (SOC_CMD_RSP_QALL &
-					     ~(SOC_CMD_RSP_Q0 << SOC_UNSOLICITED_RSP_Q)),
-					    s->regs + CMD);
-
-				/* Read it, so that we're sure it has been updated */
-				sbus_readl(s->regs + CMD);
-				sw_cq->in = xram_get_8 ((xram_p)&sw_cq->hw_cq->in);
-			}
-		}
-	}
-}
-
-static irqreturn_t soc_intr(int irq, void *dev_id)
-{
-	u32 cmd;
-	unsigned long flags;
-	register struct soc *s = (struct soc *)dev_id;
-
-	spin_lock_irqsave(&s->lock, flags);
-	cmd = sbus_readl(s->regs + CMD);
-	for (; (cmd = SOC_INTR (s, cmd)); cmd = sbus_readl(s->regs + CMD)) {
-		if (cmd & SOC_CMD_RSP_Q1) soc_unsolicited (s);
-		if (cmd & SOC_CMD_RSP_Q0) soc_solicited (s);
-		if (cmd & SOC_CMD_REQ_QALL) soc_request (s, cmd);
-	}
-	spin_unlock_irqrestore(&s->lock, flags);
-
-	return IRQ_HANDLED;
-}
-
-#define TOKEN(proto, port, token) (((proto)<<12)|(token)|(port))
-
-static int soc_hw_enque (fc_channel *fc, fcp_cmnd *fcmd)
-{
-	soc_port *port = (soc_port *)fc;
-	struct soc *s = port->s;
-	int qno;
-	soc_cq_req *sw_cq;
-	int cq_next_in;
-	soc_req *request;
-	fc_hdr *fch;
-	int i;
-
-	if (fcmd->proto == TYPE_SCSI_FCP)
-		qno = 1;
-	else
-		qno = 0;
-	SOD(("Putting a FCP packet type %d into hw queue %d\n", fcmd->proto, qno))
-	if (s->imask & (SOC_IMASK_REQ_Q0 << qno)) {
-		SOD(("EIO %08x\n", s->imask))
-		return -EIO;
-	}
-	sw_cq = s->req + qno;
-	cq_next_in = (sw_cq->in + 1) & sw_cq->last;
-	
-	if (cq_next_in == sw_cq->out &&
-	    cq_next_in == (sw_cq->out = xram_get_8((xram_p)&sw_cq->hw_cq->out))) {
-		SOD(("%d IN %d OUT %d LAST %d\n", qno, sw_cq->in, sw_cq->out, sw_cq->last))
-		SOC_SETIMASK(s, s->imask | (SOC_IMASK_REQ_Q0 << qno));
-		SOD(("imask %08lx %08lx\n", s->imask, sbus_readl(s->regs + IMASK)));
-		/* If queue is full, just say NO */
-		return -EBUSY;
-	}
-	
-	request = sw_cq->pool + sw_cq->in;
-	fch = &request->fchdr;
-	
-	switch (fcmd->proto) {
-	case TYPE_SCSI_FCP:
-		request->shdr.token = TOKEN(TYPE_SCSI_FCP, port->mask, fcmd->token); 
-		request->data[0].base = fc->dma_scsi_cmd + fcmd->token * sizeof(fcp_cmd);
-		request->data[0].count = sizeof(fcp_cmd);
-		request->data[1].base = fc->dma_scsi_rsp + fcmd->token * fc->rsp_size;
-		request->data[1].count = fc->rsp_size;
-		if (fcmd->data) {
-			request->shdr.segcnt = 3;
-			i = fc->scsi_cmd_pool[fcmd->token].fcp_data_len;
-			request->shdr.bytecnt = i;
-			request->data[2].base = fcmd->data;
-			request->data[2].count = i;
-			request->type =
-			    (fc->scsi_cmd_pool[fcmd->token].fcp_cntl & FCP_CNTL_WRITE) ?
-				SOC_CQTYPE_IO_WRITE : SOC_CQTYPE_IO_READ;
-		} else {
-			request->shdr.segcnt = 2;
-			request->shdr.bytecnt = 0;
-			request->data[2].base = 0;
-			request->data[2].count = 0;
-			request->type = SOC_CQTYPE_SIMPLE;
-		}
-		FILL_FCHDR_RCTL_DID(fch, R_CTL_COMMAND, fc->did);
-		FILL_FCHDR_SID(fch, fc->sid);
-		FILL_FCHDR_TYPE_FCTL(fch, TYPE_SCSI_FCP,
-				     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;
-		request->shdr.flags = port->flags;
-		request->shdr.class = 2;
-		break;
-		
-	case PROTO_OFFLINE:
-		memset (request, 0, sizeof(*request));
-		request->shdr.token = TOKEN(PROTO_OFFLINE, port->mask, fcmd->token); 
-		request->type = SOC_CQTYPE_OFFLINE;
-		FILL_FCHDR_RCTL_DID(fch, R_CTL_COMMAND, fc->did);
-		FILL_FCHDR_SID(fch, fc->sid);
-		FILL_FCHDR_TYPE_FCTL(fch, TYPE_SCSI_FCP,
-				     F_CTL_FIRST_SEQ | F_CTL_SEQ_INITIATIVE);
-		FILL_FCHDR_SEQ_DF_SEQ(fch, 0, 0, 0);
-		FILL_FCHDR_OXRX(fch, 0xffff, 0xffff);
-		request->shdr.flags = port->flags;
-		break;
-		
-	case PROTO_REPORT_AL_MAP:
-		/* SOC only supports Point-to-Point topology, no FC-AL, sorry... */
-		return -ENOSYS;
-
-	default: 
-		request->shdr.token = TOKEN(fcmd->proto, port->mask, fcmd->token);
-		request->shdr.class = 2;
-		request->shdr.flags = port->flags;
-		memcpy (fch, &fcmd->fch, sizeof(fc_hdr));
-		request->data[0].count = fcmd->cmdlen;
-		request->data[1].count = fcmd->rsplen;
-		request->type = fcmd->class;
-		switch (fcmd->class) {
-		case FC_CLASS_OUTBOUND:
-			request->data[0].base = fcmd->cmd;
-			request->data[0].count = fcmd->cmdlen;
-			request->type = SOC_CQTYPE_OUTBOUND;
-			request->shdr.bytecnt = fcmd->cmdlen;
-			request->shdr.segcnt = 1;
-			break;
-		case FC_CLASS_INBOUND:
-			request->data[0].base = fcmd->rsp;
-			request->data[0].count = fcmd->rsplen;
-			request->type = SOC_CQTYPE_INBOUND;
-			request->shdr.bytecnt = 0;
-			request->shdr.segcnt = 1;
-			break;
-		case FC_CLASS_SIMPLE:
-			request->data[0].base = fcmd->cmd;
-			request->data[1].base = fcmd->rsp;
-			request->data[0].count = fcmd->cmdlen;
-			request->data[1].count = fcmd->rsplen;
-			request->type = SOC_CQTYPE_SIMPLE;
-			request->shdr.bytecnt = fcmd->cmdlen;
-			request->shdr.segcnt = 2;
-			break;
-		case FC_CLASS_IO_READ:
-		case FC_CLASS_IO_WRITE:
-			request->data[0].base = fcmd->cmd;
-			request->data[1].base = fcmd->rsp;
-			request->data[0].count = fcmd->cmdlen;
-			request->data[1].count = fcmd->rsplen;
-			request->type =
-			      (fcmd->class == FC_CLASS_IO_READ) ?
-				SOC_CQTYPE_IO_READ : SOC_CQTYPE_IO_WRITE;
-			if (fcmd->data) {
-				request->data[2].base = fcmd->data;
-				request->data[2].count = fcmd->datalen;
-				request->shdr.bytecnt = fcmd->datalen;
-				request->shdr.segcnt = 3;
-			} else {
-				request->shdr.bytecnt = 0;
-				request->shdr.segcnt = 2;
-			}
-			break;
-		};
-		break;
-	};
-
-	request->count = 1;
-	request->flags = 0;
-	request->seqno = sw_cq->seqno;
-	
-	/* And now tell the SOC about it */
-
-	if (++sw_cq->in > sw_cq->last) {
-		sw_cq->in = 0;
-		sw_cq->seqno++;
-	}
-	
-	SOD(("Putting %08x into cmd\n",
-	     SOC_CMD_RSP_QALL | (sw_cq->in << 24) | (SOC_CMD_REQ_Q0 << qno)))
-	
-	sbus_writel(SOC_CMD_RSP_QALL | (sw_cq->in << 24) | (SOC_CMD_REQ_Q0 << qno),
-		    s->regs + CMD);
-
-	/* Read so that command is completed. */	
-	sbus_readl(s->regs + CMD);
-	
-	return 0;
-}
-
-static inline void soc_download_fw(struct soc *s)
-{
-#ifdef HAVE_SOC_UCODE
-	xram_copy_to (s->xram, soc_ucode, sizeof(soc_ucode));
-	xram_bzero (s->xram + sizeof(soc_ucode), 32768 - sizeof(soc_ucode));
-#endif
-}
-
-/* Check for what the best SBUS burst we can use happens
- * to be on this machine.
- */
-static inline void soc_init_bursts(struct soc *s, struct sbus_dev *sdev)
-{
-	int bsizes, bsizes_more;
-
-	bsizes = (prom_getintdefault(sdev->prom_node,"burst-sizes",0xff) & 0xff);
-	bsizes_more = (prom_getintdefault(sdev->bus->prom_node, "burst-sizes", 0xff) & 0xff);
-	bsizes &= bsizes_more;
-	if ((bsizes & 0x7f) == 0x7f)
-		s->cfg = SOC_CFG_BURST_64;
-	else if ((bsizes & 0x3f) == 0x3f) 
-		s->cfg = SOC_CFG_BURST_32;
-	else if ((bsizes & 0x1f) == 0x1f)
-		s->cfg = SOC_CFG_BURST_16;
-	else
-		s->cfg = SOC_CFG_BURST_4;
-}
-
-static inline void soc_init(struct sbus_dev *sdev, int no)
-{
-	unsigned char tmp[60];
-	int propl;
-	struct soc *s;
-	static int version_printed = 0;
-	soc_hw_cq cq[8];
-	int size, i;
-	int irq;
-	
-	s = kzalloc (sizeof (struct soc), GFP_KERNEL);
-	if (s == NULL)
-		return;
-	spin_lock_init(&s->lock);
-	s->soc_no = no;
-
-	SOD(("socs %08lx soc_intr %08lx soc_hw_enque %08x\n",
-	     (long)socs, (long)soc_intr, (long)soc_hw_enque))	
-	if (version_printed++ == 0)
-		printk (version);
-
-	s->port[0].fc.module = THIS_MODULE;
-	s->port[1].fc.module = THIS_MODULE;
-
-	s->next = socs;
-	socs = s;
-	s->port[0].fc.dev = sdev;
-	s->port[1].fc.dev = sdev;
-	s->port[0].s = s;
-	s->port[1].s = s;
-
-	s->port[0].fc.next = &s->port[1].fc;
-
-	/* World Wide Name of SOC */
-	propl = prom_getproperty (sdev->prom_node, "soc-wwn", tmp, sizeof(tmp));
-	if (propl != sizeof (fc_wwn)) {
-		s->wwn.naaid = NAAID_IEEE;
-		s->wwn.lo = 0x12345678;
-	} else
-		memcpy (&s->wwn, tmp, sizeof (fc_wwn));
-		
-	propl = prom_getproperty (sdev->prom_node, "port-wwns", tmp, sizeof(tmp));
-	if (propl != 2 * sizeof (fc_wwn)) {
-		s->port[0].fc.wwn_nport.naaid = NAAID_IEEE_EXT;
-		s->port[0].fc.wwn_nport.hi = s->wwn.hi;
-		s->port[0].fc.wwn_nport.lo = s->wwn.lo;
-		s->port[1].fc.wwn_nport.naaid = NAAID_IEEE_EXT;
-		s->port[1].fc.wwn_nport.nportid = 1;
-		s->port[1].fc.wwn_nport.hi = s->wwn.hi;
-		s->port[1].fc.wwn_nport.lo = s->wwn.lo;
-	} else {
-		memcpy (&s->port[0].fc.wwn_nport, tmp, sizeof (fc_wwn));
-		memcpy (&s->port[1].fc.wwn_nport, tmp + sizeof (fc_wwn), sizeof (fc_wwn));
-	}
-	memcpy (&s->port[0].fc.wwn_node, &s->wwn, sizeof (fc_wwn));
-	memcpy (&s->port[1].fc.wwn_node, &s->wwn, sizeof (fc_wwn));
-	SOD(("Got wwns %08x%08x ports %08x%08x and %08x%08x\n", 
-	     *(u32 *)&s->port[0].fc.wwn_nport, s->port[0].fc.wwn_nport.lo,
-	     *(u32 *)&s->port[0].fc.wwn_nport, s->port[0].fc.wwn_nport.lo,
-	     *(u32 *)&s->port[1].fc.wwn_nport, s->port[1].fc.wwn_nport.lo))
-		
-	s->port[0].fc.sid = 1;
-	s->port[1].fc.sid = 17;
-	s->port[0].fc.did = 2;
-	s->port[1].fc.did = 18;
-	
-	s->port[0].fc.reset = soc_reset;
-	s->port[1].fc.reset = soc_reset;
-	
-	if (sdev->num_registers == 1) {
-		/* Probably SunFire onboard SOC */
-		s->xram = sbus_ioremap(&sdev->resource[0], 0,
-				       0x10000UL, "soc xram");
-		s->regs = sbus_ioremap(&sdev->resource[0], 0x10000UL,
-				       0x10UL, "soc regs");
-	} else {
-		/* Probably SOC sbus card */
-		s->xram = sbus_ioremap(&sdev->resource[1], 0,
-				       sdev->reg_addrs[1].reg_size, "soc xram");
-		s->regs = sbus_ioremap(&sdev->resource[2], 0,
-				       sdev->reg_addrs[2].reg_size, "soc regs");
-	}
-	
-	soc_init_bursts(s, sdev);
-	
-	SOD(("Disabling SOC\n"))
-	
-	soc_disable (s);
-	
-	irq = sdev->irqs[0];
-
-	if (request_irq (irq, soc_intr, IRQF_SHARED, "SOC", (void *)s)) {
-		soc_printk ("Cannot order irq %d to go\n", irq);
-		socs = s->next;
-		return;
-	}
-
-	SOD(("SOC uses IRQ %d\n", irq))
-	
-	s->port[0].fc.irq = irq;
-	s->port[1].fc.irq = irq;
-	
-	sprintf (s->port[0].fc.name, "soc%d port A", no);
-	sprintf (s->port[1].fc.name, "soc%d port B", no);
-	s->port[0].flags = SOC_FC_HDR | SOC_PORT_A;
-	s->port[1].flags = SOC_FC_HDR | SOC_PORT_B;
-	s->port[1].mask = (1 << 11);
-	
-	s->port[0].fc.hw_enque = soc_hw_enque;
-	s->port[1].fc.hw_enque = soc_hw_enque;
-	
-	soc_download_fw (s);
-	
-	SOD(("Downloaded firmware\n"))
-
-	/* Now setup xram circular queues */
-	memset (cq, 0, sizeof(cq));
-	
-	size = (SOC_CQ_REQ0_SIZE + SOC_CQ_REQ1_SIZE) * sizeof(soc_req);
-	s->req_cpu = sbus_alloc_consistent(sdev, size, &s->req_dvma);
-	s->req[0].pool = s->req_cpu;
-	cq[0].address = s->req_dvma;
-	s->req[1].pool = s->req[0].pool + SOC_CQ_REQ0_SIZE;
-	
-	s->req[0].hw_cq = (soc_hw_cq __iomem *)(s->xram + SOC_CQ_REQ_OFFSET);
-	s->req[1].hw_cq = (soc_hw_cq __iomem *)(s->xram + SOC_CQ_REQ_OFFSET + sizeof(soc_hw_cq));
-	s->rsp[0].hw_cq = (soc_hw_cq __iomem *)(s->xram + SOC_CQ_RSP_OFFSET);
-	s->rsp[1].hw_cq = (soc_hw_cq __iomem *)(s->xram + SOC_CQ_RSP_OFFSET + sizeof(soc_hw_cq));
-	
-	cq[1].address = cq[0].address + (SOC_CQ_REQ0_SIZE * sizeof(soc_req));
-	cq[4].address = 1;
-	cq[5].address = 1;
-	cq[0].last = SOC_CQ_REQ0_SIZE - 1;
-	cq[1].last = SOC_CQ_REQ1_SIZE - 1;
-	cq[4].last = SOC_CQ_RSP0_SIZE - 1;
-	cq[5].last = SOC_CQ_RSP1_SIZE - 1;
-	for (i = 0; i < 8; i++)
-		cq[i].seqno = 1;
-	
-	s->req[0].last = SOC_CQ_REQ0_SIZE - 1;
-	s->req[1].last = SOC_CQ_REQ1_SIZE - 1;
-	s->rsp[0].last = SOC_CQ_RSP0_SIZE - 1;
-	s->rsp[1].last = SOC_CQ_RSP1_SIZE - 1;
-	
-	s->req[0].seqno = 1;
-	s->req[1].seqno = 1;
-	s->rsp[0].seqno = 1;
-	s->rsp[1].seqno = 1;
-
-	xram_copy_to (s->xram + SOC_CQ_REQ_OFFSET, cq, sizeof(cq));
-	
-	/* Make our sw copy of SOC service parameters */
-	xram_copy_from (s->serv_params, s->xram + 0x140, sizeof (s->serv_params));
-	
-	s->port[0].fc.common_svc = (common_svc_parm *)s->serv_params;
-	s->port[0].fc.class_svcs = (svc_parm *)(s->serv_params + 0x20);
-	s->port[1].fc.common_svc = (common_svc_parm *)&s->serv_params;
-	s->port[1].fc.class_svcs = (svc_parm *)(s->serv_params + 0x20);
-	
-	soc_enable (s);
-	
-	SOD(("Enabled SOC\n"))
-}
-
-static int __init soc_probe(void)
-{
-	struct sbus_bus *sbus;
-	struct sbus_dev *sdev = NULL;
-	struct soc *s;
-	int cards = 0;
-
-	for_each_sbus(sbus) {
-		for_each_sbusdev(sdev, sbus) {
-			if(!strcmp(sdev->prom_name, "SUNW,soc")) {
-				soc_init(sdev, cards);
-				cards++;
-			}
-		}
-	}
-	if (!cards) return -EIO;
-
-	for_each_soc(s)
-		if (s->next)
-			s->port[1].fc.next = &s->next->port[0].fc;
-	fcp_init (&socs->port[0].fc);
-	return 0;
-}
-
-static void __exit soc_cleanup(void)
-{
-	struct soc *s;
-	int irq;
-	struct sbus_dev *sdev;
-	
-	for_each_soc(s) {
-		irq = s->port[0].fc.irq;
-		free_irq (irq, s);
-
-		fcp_release(&(s->port[0].fc), 2);
-
-		sdev = s->port[0].fc.dev;
-		if (sdev->num_registers == 1) {
-			sbus_iounmap(s->xram, 0x10000UL);
-			sbus_iounmap(s->regs, 0x10UL);
-		} else {
-			sbus_iounmap(s->xram, sdev->reg_addrs[1].reg_size);
-			sbus_iounmap(s->regs, sdev->reg_addrs[2].reg_size);
-		}
-		sbus_free_consistent(sdev,
-				     (SOC_CQ_REQ0_SIZE+SOC_CQ_REQ1_SIZE)*sizeof(soc_req),
-				     s->req_cpu, s->req_dvma);
-	}
-}
-
-module_init(soc_probe);
-module_exit(soc_cleanup);
-MODULE_LICENSE("GPL");
diff --git a/drivers/fc4/soc.h b/drivers/fc4/soc.h
deleted file mode 100644
index d38cf5b..0000000
--- a/drivers/fc4/soc.h
+++ /dev/null
@@ -1,301 +0,0 @@
-/* soc.h: Definitions for Sparc SUNW,soc Fibre Channel Sbus driver.
- *
- * Copyright (C) 1996,1997 Jakub Jelinek (jj@xxxxxxxxxxxxxxxxxxx)
- */
-
-#ifndef __SOC_H
-#define __SOC_H
-
-#include "fc.h"
-#include "fcp.h"
-#include "fcp_impl.h"
-
-/* Hardware register offsets and constants first {{{ */
-#define CFG	0x00UL		/* Config Register */
-#define SAE	0x04UL		/* Slave Access Error Register */
-#define CMD	0x08UL		/* Command and Status Register */
-#define IMASK	0x0cUL		/* Interrupt Mask Register */
-
-/* Config Register */
-#define SOC_CFG_EXT_RAM_BANK_MASK	0x07000000
-#define SOC_CFG_EEPROM_BANK_MASK	0x00030000
-#define SOC_CFG_BURST64_MASK		0x00000700
-#define SOC_CFG_SBUS_PARITY_TEST	0x00000020
-#define SOC_CFG_SBUS_PARITY_CHECK	0x00000010
-#define SOC_CFG_SBUS_ENHANCED		0x00000008
-#define SOC_CFG_BURST_MASK		0x00000007
-/* Bursts */
-#define SOC_CFG_BURST_4			0x00000000
-#define SOC_CFG_BURST_16		0x00000004
-#define SOC_CFG_BURST_32		0x00000005
-#define SOC_CFG_BURST_64		0x00000006
-
-/* Slave Access Error Register */
-#define SOC_SAE_ALIGNMENT		0x00000004
-#define SOC_SAE_UNSUPPORTED		0x00000002
-#define SOC_SAE_PARITY			0x00000001
-
-/* Command & Status Register */
-#define SOC_CMD_RSP_QALL		0x000f0000
-#define SOC_CMD_RSP_Q0			0x00010000
-#define SOC_CMD_RSP_Q1			0x00020000
-#define SOC_CMD_RSP_Q2			0x00040000
-#define SOC_CMD_RSP_Q3			0x00080000
-#define SOC_CMD_REQ_QALL		0x00000f00
-#define SOC_CMD_REQ_Q0			0x00000100
-#define SOC_CMD_REQ_Q1			0x00000200
-#define SOC_CMD_REQ_Q2			0x00000400
-#define SOC_CMD_REQ_Q3			0x00000800
-#define SOC_CMD_SAE			0x00000080
-#define SOC_CMD_INTR_PENDING		0x00000008
-#define SOC_CMD_NON_QUEUED		0x00000004
-#define SOC_CMD_IDLE			0x00000002
-#define SOC_CMD_SOFT_RESET		0x00000001
-
-/* Interrupt Mask Register */
-#define SOC_IMASK_RSP_QALL		0x000f0000
-#define SOC_IMASK_RSP_Q0		0x00010000
-#define SOC_IMASK_RSP_Q1		0x00020000
-#define SOC_IMASK_RSP_Q2		0x00040000
-#define SOC_IMASK_RSP_Q3		0x00080000
-#define SOC_IMASK_REQ_QALL		0x00000f00
-#define SOC_IMASK_REQ_Q0		0x00000100
-#define SOC_IMASK_REQ_Q1		0x00000200
-#define SOC_IMASK_REQ_Q2		0x00000400
-#define SOC_IMASK_REQ_Q3		0x00000800
-#define SOC_IMASK_SAE			0x00000080
-#define SOC_IMASK_NON_QUEUED		0x00000004
-
-#define SOC_INTR(s, cmd) \
-	(((cmd & SOC_CMD_RSP_QALL) | ((~cmd) & SOC_CMD_REQ_QALL)) \
-	 & s->imask)
-	 
-#define SOC_SETIMASK(s, i) \
-do {	(s)->imask = (i); \
-	sbus_writel((i), (s)->regs + IMASK); \
-} while(0)
-
-/* XRAM
- *
- * This is a 64KB register area. It accepts only halfword access.
- * That's why here are the following inline functions...
- */
- 
-typedef void __iomem *xram_p;
-
-/* Get 32bit number from XRAM */
-static inline u32 xram_get_32(xram_p x)
-{
-	return ((sbus_readw(x + 0x00UL) << 16) |
-		(sbus_readw(x + 0x02UL)));
-}
-
-/* Like the above, but when we don't care about the high 16 bits */
-static inline u32 xram_get_32low(xram_p x)
-{
-	return (u32) sbus_readw(x + 0x02UL);
-}
-
-static inline u16 xram_get_16(xram_p x)
-{
-	return sbus_readw(x);
-}
-
-static inline u8 xram_get_8(xram_p x)
-{
-	if ((unsigned long)x & 0x1UL) {
-		x = x - 1;
-		return (u8) sbus_readw(x);
-	} else {
-		return (u8) (sbus_readw(x) >> 8);
-	}
-}
-
-static inline void xram_copy_from(void *p, xram_p x, int len)
-{
-	for (len >>= 2; len > 0; len--, x += sizeof(u32)) {
-		u32 val, *p32 = p;
-
-		val = ((sbus_readw(x + 0x00UL) << 16) |
-		       (sbus_readw(x + 0x02UL)));
-		*p32++ = val;
-		p = p32;
-	}
-}
-
-static inline void xram_copy_to(xram_p x, void *p, int len)
-{
-	for (len >>= 2; len > 0; len--, x += sizeof(u32)) {
-		u32 tmp, *p32 = p;
-
-		tmp = *p32++;
-		p = p32;
-		sbus_writew(tmp >> 16, x + 0x00UL);
-		sbus_writew(tmp, x + 0x02UL);
-	}
-}
-
-static inline void xram_bzero(xram_p x, int len)
-{
-	for (len >>= 1; len > 0; len--, x += sizeof(u16))
-		sbus_writew(0, x);
-}
-
-/* Circular Queue */
-
-#define SOC_CQ_REQ_OFFSET	(0x100 * sizeof(u16))
-#define SOC_CQ_RSP_OFFSET	(0x110 * sizeof(u16))
-
-typedef struct {
-	u32			address;
-	u8			in;
-	u8			out;
-	u8			last;
-	u8			seqno;
-} soc_hw_cq;
-
-#define SOC_PORT_A	0x0000	/* From/To Port A */
-#define SOC_PORT_B	0x0001	/* From/To Port A */
-#define SOC_FC_HDR	0x0002  /* Contains FC Header */
-#define SOC_NORSP	0x0004  /* Don't generate response nor interrupt */
-#define SOC_NOINT	0x0008  /* Generate response but not interrupt */
-#define SOC_XFERRDY	0x0010  /* Generate XFERRDY */
-#define SOC_IGNOREPARAM	0x0020	/* Ignore PARAM field in the FC header */
-#define SOC_COMPLETE	0x0040  /* Command completed */
-#define SOC_UNSOLICITED	0x0080	/* For request this is the packet to establish unsolicited pools, */
-				/* for rsp this is unsolicited packet */
-#define SOC_STATUS	0x0100	/* State change (on/off line) */
-
-typedef struct {
-	u32			token;
-	u16			flags;
-	u8			class;
-	u8			segcnt;
-	u32			bytecnt;
-} soc_hdr;
-
-typedef struct {
-	u32			base;
-	u32			count;
-} soc_data;
-
-#define SOC_CQTYPE_OUTBOUND	0x01
-#define SOC_CQTYPE_INBOUND	0x02
-#define SOC_CQTYPE_SIMPLE	0x03
-#define SOC_CQTYPE_IO_WRITE	0x04
-#define SOC_CQTYPE_IO_READ	0x05
-#define SOC_CQTYPE_UNSOLICITED	0x06
-#define SOC_CQTYPE_DIAG		0x07
-#define SOC_CQTYPE_OFFLINE	0x08
-#define SOC_CQTYPE_RESPONSE	0x10
-#define SOC_CQTYPE_INLINE	0x20
-
-#define SOC_CQFLAGS_CONT	0x01
-#define SOC_CQFLAGS_FULL	0x02
-#define SOC_CQFLAGS_BADHDR	0x04
-#define SOC_CQFLAGS_BADPKT	0x08
-
-typedef struct {
-	soc_hdr			shdr;
-	soc_data		data[3];
-	fc_hdr			fchdr;
-	u8			count;
-	u8			type;
-	u8			flags;
-	u8			seqno;
-} soc_req;
-
-#define SOC_OK			0
-#define SOC_P_RJT		2
-#define SOC_F_RJT		3
-#define SOC_P_BSY		4
-#define SOC_F_BSY		5
-#define SOC_ONLINE		0x10
-#define SOC_OFFLINE		0x11
-#define SOC_TIMEOUT		0x12
-#define SOC_OVERRUN		0x13
-#define SOC_UNKOWN_CQ_TYPE	0x20
-#define SOC_BAD_SEG_CNT		0x21
-#define SOC_MAX_XCHG_EXCEEDED	0x22
-#define SOC_BAD_XID		0x23
-#define SOC_XCHG_BUSY		0x24
-#define SOC_BAD_POOL_ID		0x25
-#define SOC_INSUFFICIENT_CQES	0x26
-#define SOC_ALLOC_FAIL		0x27
-#define SOC_BAD_SID		0x28
-#define SOC_NO_SEG_INIT		0x29
-
-typedef struct {
-	soc_hdr			shdr;
-	u32			status;
-	soc_data		data;
-	u8			xxx1[12];
-	fc_hdr			fchdr;
-	u8			count;
-	u8			type;
-	u8			flags;
-	u8			seqno;
-} soc_rsp;
-
-/* }}} */
-
-/* Now our software structures and constants we use to drive the beast {{{ */
-
-#define SOC_CQ_REQ0_SIZE	4
-#define SOC_CQ_REQ1_SIZE	64
-#define SOC_CQ_RSP0_SIZE	8
-#define SOC_CQ_RSP1_SIZE	4
-
-#define SOC_SOLICITED_RSP_Q	0
-#define SOC_UNSOLICITED_RSP_Q	1
-
-struct soc;
-
-typedef struct {
-	/* This must come first */
-	fc_channel		fc;
-	struct soc		*s;
-	u16			flags;
-	u16			mask;
-} soc_port; 
-
-typedef struct {
-	soc_hw_cq		__iomem *hw_cq;	/* Related XRAM cq */
-	soc_req			__iomem *pool;
-	u8			in;
-	u8			out;
-	u8			last;
-	u8			seqno;
-} soc_cq_rsp;
-
-typedef struct {
-	soc_hw_cq		__iomem *hw_cq;	/* Related XRAM cq */
-	soc_req			*pool;
-	u8			in;
-	u8			out;
-	u8			last;
-	u8			seqno;
-} soc_cq_req;
-
-struct soc {
-	spinlock_t		lock;
-	soc_port		port[2]; /* Every SOC has one or two FC ports */
-	soc_cq_req		req[2]; /* Request CQs */
-	soc_cq_rsp		rsp[2]; /* Response CQs */
-	int			soc_no;
-	void __iomem		*regs;
-	xram_p			xram;
-	fc_wwn			wwn;
-	u32			imask;	/* Our copy of regs->imask */
-	u32			cfg;	/* Our copy of regs->cfg */
-	char			serv_params[80];
-	struct soc		*next;
-	int			curr_port; /* Which port will have priority to fcp_queue_empty */
-
-	soc_req			*req_cpu;
-	u32			req_dvma;
-};
-
-/* }}} */
-
-#endif /* !(__SOC_H) */
diff --git a/drivers/fc4/socal.c b/drivers/fc4/socal.c
deleted file mode 100644
index c903ebf..0000000
--- a/drivers/fc4/socal.c
+++ /dev/null
@@ -1,904 +0,0 @@
-/* socal.c: Sparc SUNW,socal (SOC+) Fibre Channel Sbus adapter support.
- *
- * Copyright (C) 1998,1999 Jakub Jelinek (jj@xxxxxxxxxxxxxx)
- *
- * Sources:
- *	Fibre Channel Physical & Signaling Interface (FC-PH), dpANS, 1994
- *	dpANS Fibre Channel Protocol for SCSI (X3.269-199X), Rev. 012, 1995
- *	SOC+ Programming Guide 0.1
- *	Fibre Channel Arbitrated Loop (FC-AL), dpANS rev. 4.5, 1995
- *
- * Supported hardware:
- *      On-board SOC+ adapters of Ultra Enterprise servers and sun4d.
- */
-
-static char *version =
-        "socal.c: SOC+ driver v1.1 9/Feb/99 Jakub Jelinek (jj@xxxxxxxxxxxxxx)\n";
-
-#include <linux/module.h>
-#include <linux/kernel.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 <linux/bitops.h>
-#include <asm/system.h>
-#include <asm/io.h>
-#include <asm/dma.h>
-#include <linux/errno.h>
-#include <asm/byteorder.h>
-
-#include <asm/openprom.h>
-#include <asm/oplib.h>
-#include <asm/pgtable.h>
-#include <asm/irq.h>
-
-/* #define SOCALDEBUG */
-/* #define HAVE_SOCAL_UCODE */
-/* #define USE_64BIT_MODE */
-
-#include "fcp_impl.h"
-#include "socal.h"
-#ifdef HAVE_SOCAL_UCODE
-#include "socal_asm.h"
-#endif
-
-#define socal_printk printk ("socal%d: ", s->socal_no); printk 
-
-#ifdef SOCALDEBUG
-#define SOD(x)  socal_printk x;
-#else
-#define SOD(x)
-#endif
-
-#define for_each_socal(s) for (s = socals; s; s = s->next)
-struct socal *socals = NULL;
-
-static void socal_copy_from_xram(void *d, void __iomem *xram, long size)
-{
-	u32 *dp = (u32 *) d;
-	while (size) {
-		*dp++ = sbus_readl(xram);
-		xram += sizeof(u32);
-		size -= sizeof(u32);
-	}
-}
-
-static void socal_copy_to_xram(void __iomem *xram, void *s, long size)
-{
-	u32 *sp = (u32 *) s;
-	while (size) {
-		u32 val = *sp++;
-		sbus_writel(val, xram);
-		xram += sizeof(u32);
-		size -= sizeof(u32);
-	}
-}
-
-#ifdef HAVE_SOCAL_UCODE
-static void socal_bzero(unsigned long xram, int size)
-{
-	while (size) {
-		sbus_writel(0, xram);
-		xram += sizeof(u32);
-		size -= sizeof(u32);
-	}
-}
-#endif
-
-static inline void socal_disable(struct socal *s)
-{
-	sbus_writel(0, s->regs + IMASK);
-	sbus_writel(SOCAL_CMD_SOFT_RESET, s->regs + CMD);
-}
-
-static inline void socal_enable(struct socal *s)
-{
-	SOD(("enable %08x\n", s->cfg))
-	sbus_writel(0, s->regs + SAE);
-	sbus_writel(s->cfg, s->regs + CFG);
-	sbus_writel(SOCAL_CMD_RSP_QALL, s->regs + CMD);
-	SOCAL_SETIMASK(s, SOCAL_IMASK_RSP_QALL | SOCAL_IMASK_SAE);
-	SOD(("imask %08x %08x\n", s->imask, sbus_readl(s->regs + IMASK)));
-}
-
-static void socal_reset(fc_channel *fc)
-{
-	socal_port *port = (socal_port *)fc;
-	struct socal *s = port->s;
-	
-	/* FIXME */
-	socal_disable(s);
-	s->req[0].seqno = 1;
-	s->req[1].seqno = 1;
-	s->rsp[0].seqno = 1;
-	s->rsp[1].seqno = 1;
-	s->req[0].in = 0;
-	s->req[1].in = 0;
-	s->rsp[0].in = 0;
-	s->rsp[1].in = 0;
-	s->req[0].out = 0;
-	s->req[1].out = 0;
-	s->rsp[0].out = 0;
-	s->rsp[1].out = 0;
-
-	/* FIXME */
-	socal_enable(s);
-}
-
-static inline void socal_solicited(struct socal *s, unsigned long qno)
-{
-	socal_rsp *hwrsp;
-	socal_cq *sw_cq;
-	int token;
-	int status;
-	fc_channel *fc;
-
-	sw_cq = &s->rsp[qno];
-
-	/* Finally an improvement against old SOC :) */
-	sw_cq->in = sbus_readb(s->regs + RESP + qno);
-	SOD (("socal_solicited, %d packets arrived\n",
-	      (sw_cq->in - sw_cq->out) & sw_cq->last))
-	for (;;) {
-		hwrsp = (socal_rsp *)sw_cq->pool + sw_cq->out;
-		SOD(("hwrsp %p out %d\n", hwrsp, sw_cq->out))
-		
-#if defined(SOCALDEBUG) && 0
-		{
-		u32 *u = (u32 *)hwrsp;
-		SOD(("%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]))
-		u += 8;
-		SOD(("%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]))
-		u = (u32 *)s->xram;
-		while (u < ((u32 *)s->regs)) {
-			if (sbus_readl(&u[0]) == 0x00003000 ||
-			    sbus_readl(&u[0]) == 0x00003801) {
-			SOD(("Found at %04lx\n",
-			     (unsigned long)u - (unsigned long)s->xram))
-			SOD(("  %08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x\n",
-			     sbus_readl(&u[0]), sbus_readl(&u[1]),
-			     sbus_readl(&u[2]), sbus_readl(&u[3]),
-			     sbus_readl(&u[4]), sbus_readl(&u[5]),
-			     sbus_readl(&u[6]), sbus_readl(&u[7])))
-			u += 8;
-			SOD(("  %08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x\n",
-			     sbus_readl(&u[0]), sbus_readl(&u[1]),
-			     sbus_readl(&u[2]), sbus_readl(&u[3]),
-			     sbus_readl(&u[4]), sbus_readl(&u[5]),
-			     sbus_readl(&u[6]), sbus_readl(&u[7])))
-			u -= 8;
-			}
-			u++;
-		}
-		}
-#endif
-
-		token = hwrsp->shdr.token;
-		status = hwrsp->status;
-		fc = (fc_channel *)(&s->port[(token >> 11) & 1]);
-		
-		SOD(("Solicited token %08x status %08x\n", token, status))
-		if (status == SOCAL_OK) {
-			fcp_receive_solicited(fc, token >> 12,
-					      token & ((1 << 11) - 1),
-					      FC_STATUS_OK, NULL);
-		} else {
-			/* We have intentionally defined FC_STATUS_* constants
-			 * to match SOCAL_* constants, otherwise we'd have to
-			 * translate status.
-			 */
-			fcp_receive_solicited(fc, token >> 12,
-					      token & ((1 << 11) - 1), status, &hwrsp->fchdr);
-		}
-			
-		if (++sw_cq->out > sw_cq->last) {
-			sw_cq->seqno++;
-			sw_cq->out = 0;
-		}
-		
-		if (sw_cq->out == sw_cq->in) {
-			sw_cq->in = sbus_readb(s->regs + RESP + qno);
-			if (sw_cq->out == sw_cq->in) {
-				/* Tell the hardware about it */
-				sbus_writel((sw_cq->out << 24) |
-					    (SOCAL_CMD_RSP_QALL &
-					     ~(SOCAL_CMD_RSP_Q0 << qno)),
-					    s->regs + CMD);
-
-				/* Read it, so that we're sure it has been updated */
-				sbus_readl(s->regs + CMD);
-				sw_cq->in = sbus_readb(s->regs + RESP + qno);
-				if (sw_cq->out == sw_cq->in)
-					break;
-			}
-		}
-	}
-}
-
-static inline void socal_request (struct socal *s, u32 cmd)
-{
-	SOCAL_SETIMASK(s, s->imask & ~(cmd & SOCAL_CMD_REQ_QALL));
-	SOD(("imask %08x %08x\n", s->imask, sbus_readl(s->regs + IMASK)));
-
-	SOD(("Queues available %08x OUT %X\n", cmd, s->regs->reqpr[0]))
-	if (s->port[s->curr_port].fc.state != FC_STATE_OFFLINE) {
-		fcp_queue_empty ((fc_channel *)&(s->port[s->curr_port]));
-		if (((s->req[1].in + 1) & s->req[1].last) != (s->req[1].out))
-			fcp_queue_empty ((fc_channel *)&(s->port[1 - s->curr_port]));
-	} else {
-		fcp_queue_empty ((fc_channel *)&(s->port[1 - s->curr_port]));
-	}
-	if (s->port[1 - s->curr_port].fc.state != FC_STATE_OFFLINE)
-		s->curr_port ^= 1;
-}
-
-static inline void socal_unsolicited (struct socal *s, unsigned long qno)
-{
-	socal_rsp *hwrsp, *hwrspc;
-	socal_cq *sw_cq;
-	int count;
-	int status;
-	int flags;
-	fc_channel *fc;
-
-	sw_cq = &s->rsp[qno];
-
-	sw_cq->in = sbus_readb(s->regs + RESP + qno);
-	SOD (("socal_unsolicited, %d packets arrived, in %d\n",
-	      (sw_cq->in - sw_cq->out) & sw_cq->last, sw_cq->in))
-	while (sw_cq->in != sw_cq->out) {
-		/* ...real work per entry here... */
-		hwrsp = (socal_rsp *)sw_cq->pool + sw_cq->out;
-		SOD(("hwrsp %p out %d\n", hwrsp, sw_cq->out))
-
-#if defined(SOCALDEBUG) && 0
-		{
-		u32 *u = (u32 *)hwrsp;
-		SOD(("%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]))
-		u += 8;
-		SOD(("%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
-
-		hwrspc = NULL;
-		flags = hwrsp->shdr.flags;
-		count = hwrsp->count;
-		fc = (fc_channel *)&s->port[flags & SOCAL_PORT_B];
-		SOD(("FC %08lx\n", (long)fc))
-		
-		if (count != 1) {
-			/* Ugh, continuation entries */
-			u8 in;
-
-			if (count != 2) {
-				printk("%s: Too many continuations entries %d\n",
-				       fc->name, count);
-				goto update_out;
-			}
-			
-			in = sw_cq->in;
-			if (in < sw_cq->out)
-				in += sw_cq->last + 1;
-			if (in < sw_cq->out + 2) {
-				/* Ask the hardware if they haven't arrived yet. */
-				sbus_writel((sw_cq->out << 24) |
-					    (SOCAL_CMD_RSP_QALL &
-					     ~(SOCAL_CMD_RSP_Q0 << qno)),
-					    s->regs + CMD);
-
-				/* Read it, so that we're sure it has been updated */
-				sbus_readl(s->regs + CMD);
-				sw_cq->in = sbus_readb(s->regs + RESP + qno);
-				in = sw_cq->in;
-				if (in < sw_cq->out)
-					in += sw_cq->last + 1;
-				if (in < sw_cq->out + 2) /* Nothing came, let us wait */
-					return;
-			}
-			if (sw_cq->out == sw_cq->last)
-				hwrspc = (socal_rsp *)sw_cq->pool;
-			else
-				hwrspc = hwrsp + 1;
-		}
-		
-		switch (flags & ~SOCAL_PORT_B) {
-		case SOCAL_STATUS:
-			status = hwrsp->status;
-			switch (status) {
-			case SOCAL_ONLINE:
-				SOD(("State change to ONLINE\n"));
-				fcp_state_change(fc, FC_STATE_ONLINE);
-				break;
-			case SOCAL_ONLINE_LOOP:
-				SOD(("State change to ONLINE_LOOP\n"));
-				fcp_state_change(fc, FC_STATE_ONLINE);
-				break;
-			case SOCAL_OFFLINE:
-				SOD(("State change to OFFLINE\n"));
-				fcp_state_change(fc, FC_STATE_OFFLINE);
-				break;
-			default:
-				printk ("%s: Unknown STATUS no %d\n",
-					fc->name, status);
-				break;
-			};
-
-			break;
-		case (SOCAL_UNSOLICITED|SOCAL_FC_HDR):
-			{
-				int r_ctl = *((u8 *)&hwrsp->fchdr);
-				unsigned len;
-				
-				if ((r_ctl & 0xf0) == R_CTL_EXTENDED_SVC) {
-					len = hwrsp->shdr.bytecnt;
-					if (len < 4 || !hwrspc) {
-						printk ("%s: Invalid R_CTL %02x "
-							"continuation entries\n",
-							fc->name, r_ctl);
-					} else {
-						if (len > 60)
-							len = 60;
-						if (*(u32 *)hwrspc == LS_DISPLAY) {
-							int i;
-							
-							for (i = 4; i < len; i++)
-								if (((u8 *)hwrspc)[i] == '\n')
-									((u8 *)hwrspc)[i] = ' ';
-							((u8 *)hwrspc)[len] = 0;
-							printk ("%s message: %s\n",
-								fc->name, ((u8 *)hwrspc) + 4);
-						} else {
-							printk ("%s: Unknown LS_CMD "
-								"%08x\n", fc->name,
-								*(u32 *)hwrspc);
-						}
-					}
-				} else {
-					printk ("%s: Unsolicited R_CTL %02x "
-						"not handled\n", fc->name, r_ctl);
-				}
-			}
-			break;
-		default:
-			printk ("%s: Unexpected flags %08x\n", fc->name, flags);
-			break;
-		};
-update_out:
-		if (++sw_cq->out > sw_cq->last) {
-			sw_cq->seqno++;
-			sw_cq->out = 0;
-		}
-		
-		if (hwrspc) {
-			if (++sw_cq->out > sw_cq->last) {
-				sw_cq->seqno++;
-				sw_cq->out = 0;
-			}
-		}
-		
-		if (sw_cq->out == sw_cq->in) {
-			sw_cq->in = sbus_readb(s->regs + RESP + qno);
-			if (sw_cq->out == sw_cq->in) {
-				/* Tell the hardware about it */
-				sbus_writel((sw_cq->out << 24) |
-					    (SOCAL_CMD_RSP_QALL &
-					     ~(SOCAL_CMD_RSP_Q0 << qno)),
-					    s->regs + CMD);
-
-				/* Read it, so that we're sure it has been updated */
-				sbus_readl(s->regs + CMD);
-				sw_cq->in = sbus_readb(s->regs + RESP + qno);
-			}
-		}
-	}
-}
-
-static irqreturn_t socal_intr(int irq, void *dev_id)
-{
-	u32 cmd;
-	unsigned long flags;
-	register struct socal *s = (struct socal *)dev_id;
-
-	spin_lock_irqsave(&s->lock, flags);
-	cmd = sbus_readl(s->regs + CMD);
-	for (; (cmd = SOCAL_INTR (s, cmd)); cmd = sbus_readl(s->regs + CMD)) {
-#ifdef SOCALDEBUG
-		static int cnt = 0;
-		if (cnt++ < 50)
-			printk("soc_intr %08x\n", cmd);
-#endif	
-		if (cmd & SOCAL_CMD_RSP_Q2)
-			socal_unsolicited (s, SOCAL_UNSOLICITED_RSP_Q);
-		if (cmd & SOCAL_CMD_RSP_Q1)
-			socal_unsolicited (s, SOCAL_SOLICITED_BAD_RSP_Q);
-		if (cmd & SOCAL_CMD_RSP_Q0)
-			socal_solicited (s, SOCAL_SOLICITED_RSP_Q);
-		if (cmd & SOCAL_CMD_REQ_QALL)
-			socal_request (s, cmd);
-	}
-	spin_unlock_irqrestore(&s->lock, flags);
-
-	return IRQ_HANDLED;
-}
-
-#define TOKEN(proto, port, token) (((proto)<<12)|(token)|(port))
-
-static int socal_hw_enque (fc_channel *fc, fcp_cmnd *fcmd)
-{
-	socal_port *port = (socal_port *)fc;
-	struct socal *s = port->s;
-	unsigned long qno;
-	socal_cq *sw_cq;
-	int cq_next_in;
-	socal_req *request;
-	fc_hdr *fch;
-	int i;
-
-	if (fcmd->proto == TYPE_SCSI_FCP)
-		qno = 1;
-	else
-		qno = 0;
-	SOD(("Putting a FCP packet type %d into hw queue %d\n", fcmd->proto, qno))
-	if (s->imask & (SOCAL_IMASK_REQ_Q0 << qno)) {
-		SOD(("EIO %08x\n", s->imask))
-		return -EIO;
-	}
-	sw_cq = s->req + qno;
-	cq_next_in = (sw_cq->in + 1) & sw_cq->last;
-	
-	if (cq_next_in == sw_cq->out &&
-	    cq_next_in == (sw_cq->out = sbus_readb(s->regs + REQP + qno))) {
-		SOD(("%d IN %d OUT %d LAST %d\n",
-		     qno, sw_cq->in,
-		     sw_cq->out, sw_cq->last))
-		SOCAL_SETIMASK(s, s->imask | (SOCAL_IMASK_REQ_Q0 << qno));
-		SOD(("imask %08x %08x\n", s->imask, sbus_readl(s->regs + IMASK)));
-
-		/* If queue is full, just say NO. */
-		return -EBUSY;
-	}
-	
-	request = sw_cq->pool + sw_cq->in;
-	fch = &request->fchdr;
-	
-	switch (fcmd->proto) {
-	case TYPE_SCSI_FCP:
-		request->shdr.token = TOKEN(TYPE_SCSI_FCP, port->mask, fcmd->token); 
-		request->data[0].base = fc->dma_scsi_cmd + fcmd->token * sizeof(fcp_cmd);
-		request->data[0].count = sizeof(fcp_cmd);
-		request->data[1].base = fc->dma_scsi_rsp + fcmd->token * fc->rsp_size;
-		request->data[1].count = fc->rsp_size;
-		if (fcmd->data) {
-			request->shdr.segcnt = 3;
-			i = fc->scsi_cmd_pool[fcmd->token].fcp_data_len;
-			request->shdr.bytecnt = i;
-			request->data[2].base = fcmd->data;
-			request->data[2].count = i;
-			request->type = (fc->scsi_cmd_pool[fcmd->token].fcp_cntl & FCP_CNTL_WRITE) ?
-				SOCAL_CQTYPE_IO_WRITE : SOCAL_CQTYPE_IO_READ;
-		} else {
-			request->shdr.segcnt = 2;
-			request->shdr.bytecnt = 0;
-			request->data[2].base = 0;
-			request->data[2].count = 0;
-			request->type = SOCAL_CQTYPE_SIMPLE;
-		}
-		FILL_FCHDR_RCTL_DID(fch, R_CTL_COMMAND, fcmd->did);
-		FILL_FCHDR_SID(fch, fc->sid);
-		FILL_FCHDR_TYPE_FCTL(fch, TYPE_SCSI_FCP, 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;
-		request->shdr.flags = port->flags;
-		request->shdr.class = fc->posmap ? 3 : 2;
-		break;
-		
-	case PROTO_OFFLINE:
-		memset (request, 0, sizeof(*request));
-		request->shdr.token = TOKEN(PROTO_OFFLINE, port->mask, fcmd->token); 
-		request->type = SOCAL_CQTYPE_OFFLINE;
-		FILL_FCHDR_RCTL_DID(fch, R_CTL_COMMAND, fcmd->did);
-		FILL_FCHDR_SID(fch, fc->sid);
-		FILL_FCHDR_TYPE_FCTL(fch, TYPE_SCSI_FCP, F_CTL_FIRST_SEQ | F_CTL_SEQ_INITIATIVE);
-		FILL_FCHDR_SEQ_DF_SEQ(fch, 0, 0, 0);
-		FILL_FCHDR_OXRX(fch, 0xffff, 0xffff);
-		request->shdr.flags = port->flags;
-		break;
-		
-	case PROTO_REPORT_AL_MAP:
-		memset (request, 0, sizeof(*request));
-		request->shdr.token = TOKEN(PROTO_REPORT_AL_MAP, port->mask, fcmd->token); 
-		request->type = SOCAL_CQTYPE_REPORT_MAP;
-		request->shdr.flags = port->flags;
-		request->shdr.segcnt = 1;
-		request->shdr.bytecnt = sizeof(fc_al_posmap);
-		request->data[0].base = fcmd->cmd;
-		request->data[0].count = sizeof(fc_al_posmap);
-		break;
-
-	default: 
-		request->shdr.token = TOKEN(fcmd->proto, port->mask, fcmd->token);
-		request->shdr.class = fc->posmap ? 3 : 2;
-		request->shdr.flags = port->flags;
-		memcpy (fch, &fcmd->fch, sizeof(fc_hdr));
-		request->data[0].count = fcmd->cmdlen;
-		request->data[1].count = fcmd->rsplen;
-		request->type = fcmd->class;
-		switch (fcmd->class) {
-		case FC_CLASS_OUTBOUND:
-			request->data[0].base = fcmd->cmd;
-			request->data[0].count = fcmd->cmdlen;
-			request->type = SOCAL_CQTYPE_OUTBOUND;
-			request->shdr.bytecnt = fcmd->cmdlen;
-			request->shdr.segcnt = 1;
-			break;
-		case FC_CLASS_INBOUND:
-			request->data[0].base = fcmd->rsp;
-			request->data[0].count = fcmd->rsplen;
-			request->type = SOCAL_CQTYPE_INBOUND;
-			request->shdr.bytecnt = 0;
-			request->shdr.segcnt = 1;
-			break;
-		case FC_CLASS_SIMPLE:
-			request->data[0].base = fcmd->cmd;
-			request->data[1].base = fcmd->rsp;
-			request->data[0].count = fcmd->cmdlen;
-			request->data[1].count = fcmd->rsplen;
-			request->type = SOCAL_CQTYPE_SIMPLE;
-			request->shdr.bytecnt = fcmd->cmdlen;
-			request->shdr.segcnt = 2;
-			break;
-		case FC_CLASS_IO_READ:
-		case FC_CLASS_IO_WRITE:
-			request->data[0].base = fcmd->cmd;
-			request->data[1].base = fcmd->rsp;
-			request->data[0].count = fcmd->cmdlen;
-			request->data[1].count = fcmd->rsplen;
-			request->type = (fcmd->class == FC_CLASS_IO_READ) ? SOCAL_CQTYPE_IO_READ : SOCAL_CQTYPE_IO_WRITE;
-			if (fcmd->data) {
-				request->data[2].base = fcmd->data;
-				request->data[2].count = fcmd->datalen;
-				request->shdr.bytecnt = fcmd->datalen;
-				request->shdr.segcnt = 3;
-			} else {
-				request->shdr.bytecnt = 0;
-				request->shdr.segcnt = 2;
-			}
-			break;
-		}
-		break;
-	}
-
-	request->count = 1;
-	request->flags = 0;
-	request->seqno = sw_cq->seqno;
-	
-	SOD(("queueing token %08x\n", request->shdr.token))
-	
-	/* And now tell the SOCAL about it */
-
-	if (++sw_cq->in > sw_cq->last) {
-		sw_cq->in = 0;
-		sw_cq->seqno++;
-	}
-	
-	SOD(("Putting %08x into cmd\n", SOCAL_CMD_RSP_QALL | (sw_cq->in << 24) | (SOCAL_CMD_REQ_Q0 << qno)))
-	
-	sbus_writel(SOCAL_CMD_RSP_QALL | (sw_cq->in << 24) | (SOCAL_CMD_REQ_Q0 << qno),
-		    s->regs + CMD);
-
-	/* Read so that command is completed */	
-	sbus_readl(s->regs + CMD);
-	
-	return 0;
-}
-
-static inline void socal_download_fw(struct socal *s)
-{
-#ifdef HAVE_SOCAL_UCODE
-	SOD(("Loading %ld bytes from %p to %p\n", sizeof(socal_ucode), socal_ucode, s->xram))
-	socal_copy_to_xram(s->xram, socal_ucode, sizeof(socal_ucode));
-	SOD(("Clearing the rest of memory\n"))
-	socal_bzero (s->xram + sizeof(socal_ucode), 65536 - sizeof(socal_ucode));
-	SOD(("Done\n"))
-#endif
-}
-
-/* Check for what the best SBUS burst we can use happens
- * to be on this machine.
- */
-static inline void socal_init_bursts(struct socal *s, struct sbus_dev *sdev)
-{
-	int bsizes, bsizes_more;
-	u32 cfg;
-
-	bsizes = (prom_getintdefault(sdev->prom_node,"burst-sizes",0xff) & 0xff);
-	bsizes_more = (prom_getintdefault(sdev->bus->prom_node, "burst-sizes", 0xff) & 0xff);
-	bsizes &= bsizes_more;
-#ifdef USE_64BIT_MODE
-#ifdef __sparc_v9__
-	mmu_set_sbus64(sdev, bsizes >> 16);
-#endif
-#endif
-	if ((bsizes & 0x7f) == 0x7f)
-		cfg = SOCAL_CFG_BURST_64;
-	else if ((bsizes & 0x3f) == 0x3f) 
-		cfg = SOCAL_CFG_BURST_32;
-	else if ((bsizes & 0x1f) == 0x1f)
-		cfg = SOCAL_CFG_BURST_16;
-	else
-		cfg = SOCAL_CFG_BURST_4;
-#ifdef USE_64BIT_MODE
-#ifdef __sparc_v9__
-	/* What is BURST_128? -jj */
-	if ((bsizes & 0x780000) == 0x780000)
-		cfg |= (SOCAL_CFG_BURST_64 << 8) | SOCAL_CFG_SBUS_ENHANCED;
-	else if ((bsizes & 0x380000) == 0x380000) 
-		cfg |= (SOCAL_CFG_BURST_32 << 8) | SOCAL_CFG_SBUS_ENHANCED;
-	else if ((bsizes & 0x180000) == 0x180000)
-		cfg |= (SOCAL_CFG_BURST_16 << 8) | SOCAL_CFG_SBUS_ENHANCED;
-	else
-		cfg |= (SOCAL_CFG_BURST_8 << 8) | SOCAL_CFG_SBUS_ENHANCED;
-#endif
-#endif		
-	s->cfg = cfg;
-}
-
-static inline void socal_init(struct sbus_dev *sdev, int no)
-{
-	unsigned char tmp[60];
-	int propl;
-	struct socal *s;
-	static unsigned version_printed = 0;
-	socal_hw_cq cq[8];
-	int size, i;
-	int irq, node;
-	
-	s = kzalloc (sizeof (struct socal), GFP_KERNEL);
-	if (!s) return;
-	spin_lock_init(&s->lock);
-	s->socal_no = no;
-
-	SOD(("socals %08lx socal_intr %08lx socal_hw_enque %08lx\n",
-	     (long)socals, (long)socal_intr, (long)socal_hw_enque))
-	if (version_printed++ == 0)
-		printk (version);
-
-	s->port[0].fc.module = THIS_MODULE;
-	s->port[1].fc.module = THIS_MODULE;
-                                	
-	s->next = socals;
-	socals = s;
-	s->port[0].fc.dev = sdev;
-	s->port[1].fc.dev = sdev;
-	s->port[0].s = s;
-	s->port[1].s = s;
-
-	s->port[0].fc.next = &s->port[1].fc;
-
-	/* World Wide Name of SOCAL */
-	propl = prom_getproperty (sdev->prom_node, "wwn", tmp, sizeof(tmp));
-	if (propl != sizeof (fc_wwn)) {
-		s->wwn.naaid = NAAID_IEEE_REG;
-		s->wwn.nportid = 0x123;
-		s->wwn.hi = 0x1234;
-		s->wwn.lo = 0x12345678;
-	} else
-		memcpy (&s->wwn, tmp, sizeof (fc_wwn));
-	
-	memcpy (&s->port[0].fc.wwn_nport, &s->wwn, sizeof (fc_wwn));
-	s->port[0].fc.wwn_nport.lo++;
-	memcpy (&s->port[1].fc.wwn_nport, &s->wwn, sizeof (fc_wwn));
-	s->port[1].fc.wwn_nport.lo+=2;
-	
-	node = prom_getchild (sdev->prom_node);
-	while (node && (node = prom_searchsiblings (node, "sf"))) {
-		int port;
-		
-		port = prom_getintdefault(node, "port#", -1);
-		switch (port) {
-		case 0:
-		case 1:
-			if (prom_getproplen(node, "port-wwn") == sizeof (fc_wwn))
-				prom_getproperty (node, "port-wwn", 
-						  (char *)&s->port[port].fc.wwn_nport,
-						  sizeof (fc_wwn));
-			break;
-		default:
-			break;
-		};
-
-		node = prom_getsibling(node);
-	}
-
-	memcpy (&s->port[0].fc.wwn_node, &s->wwn, sizeof (fc_wwn));
-	memcpy (&s->port[1].fc.wwn_node, &s->wwn, sizeof (fc_wwn));
-	SOD(("Got wwns %08x%08x ports %08x%08x and %08x%08x\n", 
-	     *(u32 *)&s->port[0].fc.wwn_node, s->port[0].fc.wwn_node.lo,
-	     *(u32 *)&s->port[0].fc.wwn_nport, s->port[0].fc.wwn_nport.lo,
-	     *(u32 *)&s->port[1].fc.wwn_nport, s->port[1].fc.wwn_nport.lo))
-		
-	s->port[0].fc.sid = 1;
-	s->port[1].fc.sid = 17;
-	s->port[0].fc.did = 2;
-	s->port[1].fc.did = 18;
-	
-	s->port[0].fc.reset = socal_reset;
-	s->port[1].fc.reset = socal_reset;
-	
-	if (sdev->num_registers == 1) {
-		s->eeprom = sbus_ioremap(&sdev->resource[0], 0,
-					 sdev->reg_addrs[0].reg_size, "socal xram");
-		if (sdev->reg_addrs[0].reg_size > 0x20000)
-			s->xram = s->eeprom + 0x10000UL;
-		else
-			s->xram = s->eeprom;
-		s->regs = (s->xram + 0x10000UL);
-	} else {
-		/* E.g. starfire presents 3 registers for SOCAL */
-		s->xram = sbus_ioremap(&sdev->resource[1], 0,
-				       sdev->reg_addrs[1].reg_size, "socal xram");
-		s->regs = sbus_ioremap(&sdev->resource[2], 0,
-				       sdev->reg_addrs[2].reg_size, "socal regs");
-	}
-	
-	socal_init_bursts(s, sdev);
-	
-	SOD(("Disabling SOCAL\n"))
-	
-	socal_disable (s);
-	
-	irq = sdev->irqs[0];
-
-	if (request_irq (irq, socal_intr, IRQF_SHARED, "SOCAL", (void *)s)) {
-		socal_printk ("Cannot order irq %d to go\n", irq);
-		socals = s->next;
-		return;
-	}
-
-	SOD(("SOCAL uses IRQ %d\n", irq))
-	
-	s->port[0].fc.irq = irq;
-	s->port[1].fc.irq = irq;
-	
-	sprintf (s->port[0].fc.name, "socal%d port A", no);
-	sprintf (s->port[1].fc.name, "socal%d port B", no);
-	s->port[0].flags = SOCAL_FC_HDR | SOCAL_PORT_A;
-	s->port[1].flags = SOCAL_FC_HDR | SOCAL_PORT_B;
-	s->port[1].mask = (1 << 11);
-	
-	s->port[0].fc.hw_enque = socal_hw_enque;
-	s->port[1].fc.hw_enque = socal_hw_enque;
-	
-	socal_download_fw (s);
-	
-	SOD(("Downloaded firmware\n"))
-
-	/* Now setup xram circular queues */
-	memset (cq, 0, sizeof(cq));
-
-	size = (SOCAL_CQ_REQ0_SIZE + SOCAL_CQ_REQ1_SIZE +
-		SOCAL_CQ_RSP0_SIZE + SOCAL_CQ_RSP1_SIZE +
-		SOCAL_CQ_RSP2_SIZE) * sizeof(socal_req);
-	s->req_cpu = sbus_alloc_consistent(sdev, size, &s->req_dvma);
-	s->req[0].pool = s->req_cpu;
-	cq[0].address = s->req_dvma;
-	s->req[1].pool = s->req[0].pool + SOCAL_CQ_REQ0_SIZE;
-	s->rsp[0].pool = s->req[1].pool + SOCAL_CQ_REQ1_SIZE;
-	s->rsp[1].pool = s->rsp[0].pool + SOCAL_CQ_RSP0_SIZE;
-	s->rsp[2].pool = s->rsp[1].pool + SOCAL_CQ_RSP1_SIZE;
-	
-	s->req[0].hw_cq = (socal_hw_cq __iomem *)(s->xram + SOCAL_CQ_REQ_OFFSET);
-	s->req[1].hw_cq = (socal_hw_cq __iomem *)(s->xram + SOCAL_CQ_REQ_OFFSET + sizeof(socal_hw_cq));
-	s->rsp[0].hw_cq = (socal_hw_cq __iomem *)(s->xram + SOCAL_CQ_RSP_OFFSET);
-	s->rsp[1].hw_cq = (socal_hw_cq __iomem *)(s->xram + SOCAL_CQ_RSP_OFFSET + sizeof(socal_hw_cq));
-	s->rsp[2].hw_cq = (socal_hw_cq __iomem *)(s->xram + SOCAL_CQ_RSP_OFFSET + 2 * sizeof(socal_hw_cq));
-	
-	cq[1].address = cq[0].address + (SOCAL_CQ_REQ0_SIZE * sizeof(socal_req));
-	cq[4].address = cq[1].address + (SOCAL_CQ_REQ1_SIZE * sizeof(socal_req));
-	cq[5].address = cq[4].address + (SOCAL_CQ_RSP0_SIZE * sizeof(socal_req));
-	cq[6].address = cq[5].address + (SOCAL_CQ_RSP1_SIZE * sizeof(socal_req));
-
-	cq[0].last = SOCAL_CQ_REQ0_SIZE - 1;
-	cq[1].last = SOCAL_CQ_REQ1_SIZE - 1;
-	cq[4].last = SOCAL_CQ_RSP0_SIZE - 1;
-	cq[5].last = SOCAL_CQ_RSP1_SIZE - 1;
-	cq[6].last = SOCAL_CQ_RSP2_SIZE - 1;
-	for (i = 0; i < 8; i++)
-		cq[i].seqno = 1;
-	
-	s->req[0].last = SOCAL_CQ_REQ0_SIZE - 1;
-	s->req[1].last = SOCAL_CQ_REQ1_SIZE - 1;
-	s->rsp[0].last = SOCAL_CQ_RSP0_SIZE - 1;
-	s->rsp[1].last = SOCAL_CQ_RSP1_SIZE - 1;
-	s->rsp[2].last = SOCAL_CQ_RSP2_SIZE - 1;
-	
-	s->req[0].seqno = 1;
-	s->req[1].seqno = 1;
-	s->rsp[0].seqno = 1;
-	s->rsp[1].seqno = 1;
-	s->rsp[2].seqno = 1;
-	
-	socal_copy_to_xram(s->xram + SOCAL_CQ_REQ_OFFSET, cq, sizeof(cq));
-	
-	SOD(("Setting up params\n"))
-	
-	/* Make our sw copy of SOCAL service parameters */
-	socal_copy_from_xram(s->serv_params, s->xram + 0x280, sizeof (s->serv_params));
-	
-	s->port[0].fc.common_svc = (common_svc_parm *)s->serv_params;
-	s->port[0].fc.class_svcs = (svc_parm *)(s->serv_params + 0x20);
-	s->port[1].fc.common_svc = (common_svc_parm *)&s->serv_params;
-	s->port[1].fc.class_svcs = (svc_parm *)(s->serv_params + 0x20);
-	
-	socal_enable (s);
-	
-	SOD(("Enabled SOCAL\n"))
-}
-
-static int __init socal_probe(void)
-{
-	struct sbus_bus *sbus;
-	struct sbus_dev *sdev = NULL;
-	struct socal *s;
-	int cards = 0;
-
-	for_each_sbus(sbus) {
-		for_each_sbusdev(sdev, sbus) {
-			if(!strcmp(sdev->prom_name, "SUNW,socal")) {
-				socal_init(sdev, cards);
-				cards++;
-			}
-		}
-	}
-	if (!cards)
-		return -EIO;
-
-	for_each_socal(s)
-		if (s->next)
-			s->port[1].fc.next = &s->next->port[0].fc;
-			
-	fcp_init (&socals->port[0].fc);
-	return 0;
-}
-
-static void __exit socal_cleanup(void)
-{
-	struct socal *s;
-	int irq;
-	struct sbus_dev *sdev;
-	
-	for_each_socal(s) {
-		irq = s->port[0].fc.irq;
-		free_irq (irq, s);
-
-		fcp_release(&(s->port[0].fc), 2);
-
-		sdev = s->port[0].fc.dev;
-		if (sdev->num_registers == 1) {
-			sbus_iounmap(s->eeprom, sdev->reg_addrs[0].reg_size);
-		} else {
-			sbus_iounmap(s->xram, sdev->reg_addrs[1].reg_size);
-			sbus_iounmap(s->regs, sdev->reg_addrs[2].reg_size);
-		}
-		sbus_free_consistent(sdev,
-				     (SOCAL_CQ_REQ0_SIZE + SOCAL_CQ_REQ1_SIZE +
-				      SOCAL_CQ_RSP0_SIZE + SOCAL_CQ_RSP1_SIZE +
-				      SOCAL_CQ_RSP2_SIZE) * sizeof(socal_req),
-				     s->req_cpu, s->req_dvma);
-	}
-}
-
-module_init(socal_probe);
-module_exit(socal_cleanup);
-MODULE_LICENSE("GPL");
diff --git a/drivers/fc4/socal.h b/drivers/fc4/socal.h
deleted file mode 100644
index 774edf6..0000000
--- a/drivers/fc4/socal.h
+++ /dev/null
@@ -1,314 +0,0 @@
-/* socal.h: Definitions for Sparc SUNW,socal (SOC+) Fibre Channel Sbus driver.
- *
- * Copyright (C) 1998,1999 Jakub Jelinek (jj@xxxxxxxxxxxxxx)
- */
-
-#ifndef __SOCAL_H
-#define __SOCAL_H
-
-#include "fc.h"
-#include "fcp.h"
-#include "fcp_impl.h"
-
-/* Hardware register offsets and constants first {{{ */
-#define CFG	0x00UL
-#define SAE	0x04UL
-#define CMD	0x08UL
-#define IMASK	0x0cUL
-#define REQP	0x10UL
-#define RESP	0x14UL
-
-/* Config Register */
-#define SOCAL_CFG_EXT_RAM_BANK_MASK	0x07000000
-#define SOCAL_CFG_EEPROM_BANK_MASK	0x00030000
-#define SOCAL_CFG_BURST64_MASK		0x00000700
-#define SOCAL_CFG_SBUS_PARITY_TEST	0x00000020
-#define SOCAL_CFG_SBUS_PARITY_CHECK	0x00000010
-#define SOCAL_CFG_SBUS_ENHANCED		0x00000008
-#define SOCAL_CFG_BURST_MASK		0x00000007
-/* Bursts */
-#define SOCAL_CFG_BURST_4		0x00000000
-#define SOCAL_CFG_BURST_8		0x00000003
-#define SOCAL_CFG_BURST_16		0x00000004
-#define SOCAL_CFG_BURST_32		0x00000005
-#define SOCAL_CFG_BURST_64		0x00000006
-#define SOCAL_CFG_BURST_128		0x00000007
-
-/* Slave Access Error Register */
-#define SOCAL_SAE_ALIGNMENT		0x00000004
-#define SOCAL_SAE_UNSUPPORTED		0x00000002
-#define SOCAL_SAE_PARITY		0x00000001
-
-/* Command & Status Register */
-#define SOCAL_CMD_RSP_QALL		0x000f0000
-#define SOCAL_CMD_RSP_Q0		0x00010000
-#define SOCAL_CMD_RSP_Q1		0x00020000
-#define SOCAL_CMD_RSP_Q2		0x00040000
-#define SOCAL_CMD_RSP_Q3		0x00080000
-#define SOCAL_CMD_REQ_QALL		0x00000f00
-#define SOCAL_CMD_REQ_Q0		0x00000100
-#define SOCAL_CMD_REQ_Q1		0x00000200
-#define SOCAL_CMD_REQ_Q2		0x00000400
-#define SOCAL_CMD_REQ_Q3		0x00000800
-#define SOCAL_CMD_SAE			0x00000080
-#define SOCAL_CMD_INTR_PENDING		0x00000008
-#define SOCAL_CMD_NON_QUEUED		0x00000004
-#define SOCAL_CMD_IDLE			0x00000002
-#define SOCAL_CMD_SOFT_RESET		0x00000001
-
-/* Interrupt Mask Register */
-#define SOCAL_IMASK_RSP_QALL		0x000f0000
-#define SOCAL_IMASK_RSP_Q0		0x00010000
-#define SOCAL_IMASK_RSP_Q1		0x00020000
-#define SOCAL_IMASK_RSP_Q2		0x00040000
-#define SOCAL_IMASK_RSP_Q3		0x00080000
-#define SOCAL_IMASK_REQ_QALL		0x00000f00
-#define SOCAL_IMASK_REQ_Q0		0x00000100
-#define SOCAL_IMASK_REQ_Q1		0x00000200
-#define SOCAL_IMASK_REQ_Q2		0x00000400
-#define SOCAL_IMASK_REQ_Q3		0x00000800
-#define SOCAL_IMASK_SAE			0x00000080
-#define SOCAL_IMASK_NON_QUEUED		0x00000004
-
-#define SOCAL_INTR(s, cmd) \
-	(((cmd & SOCAL_CMD_RSP_QALL) | ((~cmd) & SOCAL_CMD_REQ_QALL)) \
-	 & s->imask)
-	 
-#define SOCAL_SETIMASK(s, i) \
-do {	(s)->imask = (i); \
-	sbus_writel((i), (s)->regs + IMASK); \
-} while (0)
-	
-#define SOCAL_MAX_EXCHANGES		1024
-
-/* XRAM
- *
- * This is a 64KB register area.
- * From the documentation, it seems like it is finally able to cope
- * at least with 1,2,4 byte accesses for read and 2,4 byte accesses for write.
- */
- 
-/* Circular Queue */
-
-#define SOCAL_CQ_REQ_OFFSET	0x200
-#define SOCAL_CQ_RSP_OFFSET	0x220
-
-typedef struct {
-	u32			address;
-	u8			in;
-	u8			out;
-	u8			last;
-	u8			seqno;
-} socal_hw_cq;
-
-#define SOCAL_PORT_A	0x0000	/* From/To Port A */
-#define SOCAL_PORT_B	0x0001	/* From/To Port A */
-#define SOCAL_FC_HDR	0x0002  /* Contains FC Header */
-#define SOCAL_NORSP	0x0004  /* Don't generate response nor interrupt */
-#define SOCAL_NOINT	0x0008  /* Generate response but not interrupt */
-#define SOCAL_XFERRDY	0x0010  /* Generate XFERRDY */
-#define SOCAL_IGNOREPARAM 0x0020 /* Ignore PARAM field in the FC header */
-#define SOCAL_COMPLETE	0x0040  /* Command completed */
-#define SOCAL_UNSOLICITED 0x0080 /* For request this is the packet to establish unsolicited pools, */
-				/* for rsp this is unsolicited packet */
-#define SOCAL_STATUS	0x0100	/* State change (on/off line) */
-#define SOCAL_RSP_HDR	0x0200	/* Return frame header in any case */
-
-typedef struct {
-	u32			token;
-	u16			flags;
-	u8			class;
-	u8			segcnt;
-	u32			bytecnt;
-} socal_hdr;
-
-typedef struct {
-	u32			base;
-	u32			count;
-} socal_data;
-
-#define SOCAL_CQTYPE_NOP	0x00
-#define SOCAL_CQTYPE_OUTBOUND	0x01
-#define SOCAL_CQTYPE_INBOUND	0x02
-#define SOCAL_CQTYPE_SIMPLE	0x03
-#define SOCAL_CQTYPE_IO_WRITE	0x04
-#define SOCAL_CQTYPE_IO_READ	0x05
-#define SOCAL_CQTYPE_UNSOLICITED 0x06
-#define SOCAL_CQTYPE_BYPASS_DEV	0x06
-#define SOCAL_CQTYPE_DIAG	0x07
-#define SOCAL_CQTYPE_OFFLINE	0x08
-#define SOCAL_CQTYPE_ADD_POOL	0x09
-#define SOCAL_CQTYPE_DELETE_POOL 0x0a
-#define SOCAL_CQTYPE_ADD_BUFFER	0x0b
-#define SOCAL_CQTYPE_ADD_POOL_BUFFER 0x0c
-#define SOCAL_CQTYPE_REQUEST_ABORT 0x0d
-#define SOCAL_CQTYPE_REQUEST_LIP 0x0e
-#define SOCAL_CQTYPE_REPORT_MAP	0x0f
-#define SOCAL_CQTYPE_RESPONSE	0x10
-#define SOCAL_CQTYPE_INLINE	0x20
-
-#define SOCAL_CQFLAGS_CONT	0x01
-#define SOCAL_CQFLAGS_FULL	0x02
-#define SOCAL_CQFLAGS_BADHDR	0x04
-#define SOCAL_CQFLAGS_BADPKT	0x08
-
-typedef struct {
-	socal_hdr		shdr;
-	socal_data		data[3];
-	fc_hdr			fchdr;
-	u8			count;
-	u8			type;
-	u8			flags;
-	u8			seqno;
-} socal_req;
-
-#define SOCAL_OK		0
-#define SOCAL_P_RJT		2
-#define SOCAL_F_RJT		3
-#define SOCAL_P_BSY		4
-#define SOCAL_F_BSY		5
-#define SOCAL_ONLINE		0x10
-#define SOCAL_OFFLINE		0x11
-#define SOCAL_TIMEOUT		0x12
-#define SOCAL_OVERRUN		0x13
-#define SOCAL_ONLINE_LOOP	0x14
-#define SOCAL_OLD_PORT		0x15
-#define SOCAL_AL_PORT		0x16
-#define SOCAL_UNKOWN_CQ_TYPE	0x20
-#define SOCAL_BAD_SEG_CNT	0x21
-#define SOCAL_MAX_XCHG_EXCEEDED	0x22
-#define SOCAL_BAD_XID		0x23
-#define SOCAL_XCHG_BUSY		0x24
-#define SOCAL_BAD_POOL_ID	0x25
-#define SOCAL_INSUFFICIENT_CQES	0x26
-#define SOCAL_ALLOC_FAIL	0x27
-#define SOCAL_BAD_SID		0x28
-#define SOCAL_NO_SEG_INIT	0x29
-#define SOCAL_BAD_DID		0x2a
-#define SOCAL_ABORTED		0x30
-#define SOCAL_ABORT_FAILED	0x31
-
-typedef struct {
-	socal_hdr		shdr;
-	u32			status;
-	socal_data		data;
-	u8			xxx1[10];
-	u16			ncmds;
-	fc_hdr			fchdr;
-	u8			count;
-	u8			type;
-	u8			flags;
-	u8			seqno;
-} socal_rsp;
-
-typedef struct {
-	socal_hdr		shdr;
-	u8			xxx1[48];
-	u8			count;
-	u8			type;
-	u8			flags;
-	u8			seqno;
-} socal_cmdonly;
-
-#define SOCAL_DIAG_NOP		0x00
-#define SOCAL_DIAG_INT_LOOP	0x01
-#define SOCAL_DIAG_EXT_LOOP	0x02
-#define SOCAL_DIAG_REM_LOOP	0x03
-#define SOCAL_DIAG_XRAM_TEST	0x04
-#define SOCAL_DIAG_SOC_TEST	0x05
-#define SOCAL_DIAG_HCB_TEST	0x06
-#define SOCAL_DIAG_SOCLB_TEST	0x07
-#define SOCAL_DIAG_SRDSLB_TEST	0x08
-#define SOCAL_DIAG_EXTOE_TEST	0x09
-
-typedef struct {
-	socal_hdr		shdr;
-	u32			cmd;
-	u8			xxx1[44];
-	u8			count;
-	u8			type;
-	u8			flags;
-	u8			seqno;
-} socal_diag_req;
-
-#define SOCAL_POOL_MASK_RCTL	0x800000
-#define SOCAL_POOL_MASK_DID	0x700000
-#define SOCAL_POOL_MASK_SID	0x070000
-#define SOCAL_POOL_MASK_TYPE	0x008000
-#define SOCAL_POOL_MASK_F_CTL	0x007000
-#define SOCAL_POOL_MASK_SEQ_ID	0x000800
-#define SOCAL_POOL_MASK_D_CTL	0x000400
-#define SOCAL_POOL_MASK_SEQ_CNT	0x000300
-#define SOCAL_POOL_MASK_OX_ID	0x0000f0
-#define SOCAL_POOL_MASK_PARAM	0x00000f
-
-typedef struct {
-	socal_hdr		shdr;
-	u32			pool_id;
-	u32			header_mask;
-	u32			buf_size;
-	u32			entries;
-	u8			xxx1[8];
-	fc_hdr			fchdr;
-	u8			count;
-	u8			type;
-	u8			flags;
-	u8			seqno;
-} socal_pool_req;
-
-/* }}} */
-
-/* Now our software structures and constants we use to drive the beast {{{ */
-
-#define SOCAL_CQ_REQ0_SIZE	4
-#define SOCAL_CQ_REQ1_SIZE	256
-#define SOCAL_CQ_RSP0_SIZE	8
-#define SOCAL_CQ_RSP1_SIZE	4
-#define SOCAL_CQ_RSP2_SIZE	4
-
-#define SOCAL_SOLICITED_RSP_Q	0
-#define SOCAL_SOLICITED_BAD_RSP_Q 1
-#define SOCAL_UNSOLICITED_RSP_Q	2
-
-struct socal;
-
-typedef struct {
-	/* This must come first */
-	fc_channel		fc;
-	struct socal		*s;
-	u16			flags;
-	u16			mask;
-} socal_port; 
-
-typedef struct {
-	socal_hw_cq		__iomem *hw_cq;	/* Related XRAM cq */
-	socal_req		*pool;
-	u8			in;
-	u8			out;
-	u8			last;
-	u8			seqno;
-} socal_cq;
-
-struct socal {
-	spinlock_t		lock;
-	socal_port		port[2]; /* Every SOCAL has one or two FC ports */
-	socal_cq		req[4]; /* Request CQs */
-	socal_cq		rsp[4]; /* Response CQs */
-	int			socal_no;
-	void __iomem		*regs;
-	void __iomem		*xram;
-	void __iomem		*eeprom;
-	fc_wwn			wwn;
-	u32			imask;	/* Our copy of regs->imask */
-	u32			cfg;	/* Our copy of regs->cfg */
-	char			serv_params[80];
-	struct socal		*next;
-	int			curr_port; /* Which port will have priority to fcp_queue_empty */
-
-	socal_req *		req_cpu;
-	u32			req_dvma;
-};
-
-/* }}} */
-
-#endif /* !(__SOCAL_H) */
diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile
index 6141389..2e6129f 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 c4e16c0..0000000
--- 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@xxxxxxxxxxxxxx)
- *
- */
-
-#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 7ff2c34..0000000
--- 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@xxxxxxxxxxxxxx)
- */
-
-#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 0363c1c..0000000
--- 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@xxxxxxxxxxxxxxxxxxx)
- *
- */
-
-#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 5da2061..0000000
--- 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@xxxxxxxxxxxxxxxxxxx)
- */
-
-#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) */
-

-- 
Intel are signing my paycheques ... these opinions are still mine
"Bill, look, we understand that you're interested in selling us this
operating system, but compare it to ours.  We can't possibly take such
a retrograde step."
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux