All of lore.kernel.org
 help / color / mirror / Atom feed
From: James Bottomley <James.Bottomley@steeleye.com>
To: SCSI Mailing List <linux-scsi@vger.kernel.org>
Cc: atulm@lsil.com
Subject: [PATCH] megaraid 2.00.09
Date: 08 Oct 2003 07:02:46 +0530	[thread overview]
Message-ID: <1065576771.2684.1.camel@fuzzy> (raw)

[-- Attachment #1: Type: text/plain, Size: 67 bytes --]


Hi All,

This is a patch to the megaraid driver from LSI.

James


[-- Attachment #2: diff_megaraid2-2003-linux-2.6.0-test6_and_megaraid2-2009.patch --]
[-- Type: text/x-patch, Size: 58731 bytes --]

diff -Naur megaraid2-2003-linux-2.6.0-test6/megaraid.c megaraid2-2009/megaraid.c
--- megaraid2-2003-linux-2.6.0-test6/megaraid.c	2003-10-06 12:56:03.000000000 -0400
+++ megaraid2-2009/megaraid.c	2003-10-03 17:44:58.000000000 -0400
@@ -2,7 +2,7 @@
  *
  *			Linux MegaRAID device driver
  *
- * Copyright © 2002  LSI Logic Corporation.
+ * Copyright © 2002  LSI Logic Corporation.
  *
  *	   This program is free software; you can redistribute it and/or
  *	   modify it under the terms of the GNU General Public License
@@ -14,7 +14,8 @@
  *	  - speed-ups (list handling fixes, issued_list, optimizations.)
  *	  - lots of cleanups.
  *
- * Version : v2.00.3 (Feb 19, 2003) - Atul Mukker <Atul.Mukker@lsil.com>
+ * Version : v2.00.9a-kernel 2.6 (Oct 03, 2003) -
+ *					Atul Mukker <Atul.Mukker@lsil.com>
  *
  * Description: Linux device driver for LSI Logic MegaRAID controller
  *
@@ -77,7 +78,9 @@
 
 static int hba_count;
 static adapter_t *hba_soft_state[MAX_CONTROLLERS];
+#ifdef CONFIG_PROC_FS
 static struct proc_dir_entry *mega_proc_dir_entry;
+#endif
 
 static struct notifier_block mega_notifier = {
 	.notifier_call = megaraid_reboot_notify
@@ -160,16 +163,11 @@
 		PCI_VENDOR_ID_INTEL,		PCI_DEVICE_ID_AMI_MEGARAID3, 
 		PCI_VENDOR_ID_LSI_LOGIC,	PCI_DEVICE_ID_AMI_MEGARAID3 };
 
-	host_template->proc_name = "megaraid";
 
 	printk(KERN_NOTICE "megaraid: " MEGARAID_VERSION);
 
 	megaraid_validate_parms();
 
-	memset(mega_hbas, 0, sizeof (mega_hbas));
-
-	hba_count = 0;
-
 	/*
 	 * Scan PCI bus for our all devices.
 	 */
@@ -250,6 +248,7 @@
 	u8	did_ioremap_f = 0;
 	u8	did_req_region_f = 0;
 	u8	did_scsi_reg_f = 0;
+	u8	got_ipdev_f = 0;
 	u8	alloc_int_buf_f = 0;
 	u8	alloc_scb_f = 0;
 	u8	got_irq_f = 0;
@@ -260,6 +259,16 @@
 
 	while((pdev = pci_find_device(pci_vendor, pci_device, pdev))) {
 
+		// reset flags for all controllers in this class
+		did_ioremap_f = 0;
+		did_req_region_f = 0;
+		did_scsi_reg_f = 0;
+		got_ipdev_f = 0;
+		alloc_int_buf_f = 0;
+		alloc_scb_f = 0;
+		got_irq_f = 0;
+		did_setup_mbox_f = 0;
+
 		if(pci_enable_device (pdev)) continue;
 
 		pci_bus = pdev->bus->number;
@@ -295,6 +304,7 @@
 		if( subsysvid && (subsysvid != AMI_SUBSYS_VID) &&
 				(subsysvid != DELL_SUBSYS_VID) &&
 				(subsysvid != HP_SUBSYS_VID) &&
+				(subsysvid != INTEL_SUBSYS_VID) &&
 				(subsysvid != LSI_SUBSYS_VID) ) continue;
 
 
@@ -358,6 +368,21 @@
 		adapter = (adapter_t *)host->hostdata;
 		memset(adapter, 0, sizeof(adapter_t));
 
+		/*
+		 * Allocate a pci device structure for allocations done
+		 * internally - all of which would be in memory <4GB
+		 */
+		adapter->ipdev = kmalloc(sizeof(struct pci_dev), GFP_KERNEL);
+
+		if( adapter->ipdev == NULL ) goto fail_attach;
+
+		got_ipdev_f = 1;
+
+		memcpy(adapter->ipdev, pdev, sizeof(struct pci_dev));
+
+		if( pci_set_dma_mask(adapter->ipdev, 0xffffffff) != 0 )
+			goto fail_attach;
+
 		printk(KERN_NOTICE
 			"scsi%d:Found MegaRAID controller at 0x%lx, IRQ:%d\n",
 			host->host_no, mega_baseport, irq);
@@ -367,10 +392,12 @@
 		/* Copy resource info into structure */
 		INIT_LIST_HEAD(&adapter->free_list);
 		INIT_LIST_HEAD(&adapter->pending_list);
-		INIT_LIST_HEAD(&adapter->completed_list);
 
 		adapter->flag = flag;
 		spin_lock_init(&adapter->lock);
+
+		adapter->host_lock = &adapter->lock;
+
 		scsi_assign_lock(host, &adapter->lock);
 
 		host->cmd_per_lun = max_cmd_per_lun;
@@ -593,7 +620,7 @@
 			pci_set_dma_mask(pdev, 0xffffffff);
 			adapter->has_64bit_addr = 0;
 		}
-		
+
 		init_MUTEX(&adapter->int_mtx);
 		init_waitqueue_head(&adapter->int_waitq);
 
@@ -642,6 +669,8 @@
 					adapter->buf_dma_handle);
 		}
 
+		if( got_ipdev_f ) kfree(adapter->ipdev);
+
 		if( did_scsi_reg_f ) scsi_unregister(host);
 
 		if( did_ioremap_f ) {
@@ -672,7 +701,7 @@
 			sizeof(mbox64_t), &adapter->una_mbox64_dma);
 
 	if( !adapter->una_mbox64 ) return -1;
-		
+
 	adapter->mbox = &adapter->una_mbox64->mbox;
 
 	adapter->mbox = (mbox_t *)((((unsigned long) adapter->mbox) + 15) &
@@ -725,7 +754,7 @@
 {
 	dma_addr_t	prod_info_dma_handle;
 	mega_inquiry3	*inquiry3;
-	u8	raw_mbox[sizeof(struct mbox_out)];
+	u8	raw_mbox[sizeof(mbox_t)];
 	mbox_t	*mbox;
 	int	retval;
 
@@ -734,14 +763,14 @@
 	mbox = (mbox_t *)raw_mbox;
 
 	memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
-	memset(&mbox->m_out, 0, sizeof(raw_mbox));
+	memset(raw_mbox, 0, sizeof(raw_mbox));
 
 	/*
 	 * Try to issue Inquiry3 command
 	 * if not succeeded, then issue MEGA_MBOXCMD_ADAPTERINQ command and
 	 * update enquiry3 structure
 	 */
-	mbox->m_out.xferaddr = (u32)adapter->buf_dma_handle;
+	mbox->xferaddr = (u32)adapter->buf_dma_handle;
 
 	inquiry3 = (mega_inquiry3 *)adapter->mega_buffer;
 
@@ -764,10 +793,10 @@
 
 		inq = &ext_inq->raid_inq;
 
-		mbox->m_out.xferaddr = (u32)dma_handle;
+		mbox->xferaddr = (u32)dma_handle;
 
 		/*issue old 0x04 command to adapter */
-		mbox->m_out.cmd = MEGA_MBOXCMD_ADPEXTINQ;
+		mbox->cmd = MEGA_MBOXCMD_ADPEXTINQ;
 
 		issue_scb_block(adapter, raw_mbox);
 
@@ -792,7 +821,7 @@
 				&adapter->product_info,
 				sizeof(mega_product_info), PCI_DMA_FROMDEVICE);
 
-		mbox->m_out.xferaddr = prod_info_dma_handle;
+		mbox->xferaddr = prod_info_dma_handle;
 
 		raw_mbox[0] = FC_NEW_CONFIG;	/* i.e. mbox->cmd=0xA1 */
 		raw_mbox[2] = NC_SUBOP_PRODUCT_INFO;	/* i.e. 0x0E */
@@ -986,7 +1015,7 @@
 		}
 		else {
 			/* this is physical channel */
-			channel = cmd->device->channel; 
+			channel = cmd->device->channel;
 			target = cmd->device->id;
 
 			/*
@@ -1005,11 +1034,11 @@
 	else {
 		if( islogical ) {
 			/* this is the logical channel */
-			channel = cmd->device->channel;	
+			channel = cmd->device->channel;
 		}
 		else {
 			/* physical channel */
-			channel = cmd->device->channel - NVIRT_CHAN;	
+			channel = cmd->device->channel - NVIRT_CHAN;
 			target = cmd->device->id;
 		}
 	}
@@ -1143,10 +1172,10 @@
 			memcpy(pthru->cdb, cmd->cmnd, cmd->cmd_len);
 
 			if( adapter->has_64bit_addr ) {
-				mbox->m_out.cmd = MEGA_MBOXCMD_PASSTHRU64;
+				mbox->cmd = MEGA_MBOXCMD_PASSTHRU64;
 			}
 			else {
-				mbox->m_out.cmd = MEGA_MBOXCMD_PASSTHRU;
+				mbox->cmd = MEGA_MBOXCMD_PASSTHRU;
 			}
 
 			scb->dma_direction = PCI_DMA_FROMDEVICE;
@@ -1154,7 +1183,7 @@
 			pthru->numsgelements = mega_build_sglist(adapter, scb,
 				&pthru->dataxferaddr, &pthru->dataxferlen);
 
-			mbox->m_out.xferaddr = scb->pthru_dma_addr;
+			mbox->xferaddr = scb->pthru_dma_addr;
 
 			return scb;
 
@@ -1177,19 +1206,19 @@
 			mbox = (mbox_t *)scb->raw_mbox;
 
 			memset(mbox, 0, sizeof(scb->raw_mbox));
-			mbox->m_out.logdrv = ldrv_num;
+			mbox->logdrv = ldrv_num;
 
 			/*
 			 * A little hack: 2nd bit is zero for all scsi read
 			 * commands and is set for all scsi write commands
 			 */
 			if( adapter->has_64bit_addr ) {
-				mbox->m_out.cmd = (*cmd->cmnd & 0x02) ?
+				mbox->cmd = (*cmd->cmnd & 0x02) ?
 					MEGA_MBOXCMD_LWRITE64:
 					MEGA_MBOXCMD_LREAD64 ;
 			}
 			else {
-				mbox->m_out.cmd = (*cmd->cmnd & 0x02) ?
+				mbox->cmd = (*cmd->cmnd & 0x02) ?
 					MEGA_MBOXCMD_LWRITE:
 					MEGA_MBOXCMD_LREAD ;
 			}
@@ -1198,13 +1227,13 @@
 			 * 6-byte READ(0x08) or WRITE(0x0A) cdb
 			 */
 			if( cmd->cmd_len == 6 ) {
-				mbox->m_out.numsectors = (u32) cmd->cmnd[4];
-				mbox->m_out.lba =
+				mbox->numsectors = (u32) cmd->cmnd[4];
+				mbox->lba =
 					((u32)cmd->cmnd[1] << 16) |
 					((u32)cmd->cmnd[2] << 8) |
 					(u32)cmd->cmnd[3];
 
-				mbox->m_out.lba &= 0x1FFFFF;
+				mbox->lba &= 0x1FFFFF;
 
 #if MEGA_HAVE_STATS
 				/*
@@ -1215,11 +1244,11 @@
 				if (*cmd->cmnd == READ_6) {
 					adapter->nreads[ldrv_num%0x80]++;
 					adapter->nreadblocks[ldrv_num%0x80] +=
-						mbox->m_out.numsectors;
+						mbox->numsectors;
 				} else {
 					adapter->nwrites[ldrv_num%0x80]++;
 					adapter->nwriteblocks[ldrv_num%0x80] +=
-						mbox->m_out.numsectors;
+						mbox->numsectors;
 				}
 #endif
 			}
@@ -1228,10 +1257,10 @@
 			 * 10-byte READ(0x28) or WRITE(0x2A) cdb
 			 */
 			if( cmd->cmd_len == 10 ) {
-				mbox->m_out.numsectors =
+				mbox->numsectors =
 					(u32)cmd->cmnd[8] |
 					((u32)cmd->cmnd[7] << 8);
-				mbox->m_out.lba =
+				mbox->lba =
 					((u32)cmd->cmnd[2] << 24) |
 					((u32)cmd->cmnd[3] << 16) |
 					((u32)cmd->cmnd[4] << 8) |
@@ -1241,11 +1270,11 @@
 				if (*cmd->cmnd == READ_10) {
 					adapter->nreads[ldrv_num%0x80]++;
 					adapter->nreadblocks[ldrv_num%0x80] +=
-						mbox->m_out.numsectors;
+						mbox->numsectors;
 				} else {
 					adapter->nwrites[ldrv_num%0x80]++;
 					adapter->nwriteblocks[ldrv_num%0x80] +=
-						mbox->m_out.numsectors;
+						mbox->numsectors;
 				}
 #endif
 			}
@@ -1254,13 +1283,13 @@
 			 * 12-byte READ(0xA8) or WRITE(0xAA) cdb
 			 */
 			if( cmd->cmd_len == 12 ) {
-				mbox->m_out.lba =
+				mbox->lba =
 					((u32)cmd->cmnd[2] << 24) |
 					((u32)cmd->cmnd[3] << 16) |
 					((u32)cmd->cmnd[4] << 8) |
 					(u32)cmd->cmnd[5];
 
-				mbox->m_out.numsectors =
+				mbox->numsectors =
 					((u32)cmd->cmnd[6] << 24) |
 					((u32)cmd->cmnd[7] << 16) |
 					((u32)cmd->cmnd[8] << 8) |
@@ -1270,11 +1299,11 @@
 				if (*cmd->cmnd == READ_12) {
 					adapter->nreads[ldrv_num%0x80]++;
 					adapter->nreadblocks[ldrv_num%0x80] +=
-						mbox->m_out.numsectors;
+						mbox->numsectors;
 				} else {
 					adapter->nwrites[ldrv_num%0x80]++;
 					adapter->nwriteblocks[ldrv_num%0x80] +=
-						mbox->m_out.numsectors;
+						mbox->numsectors;
 				}
 #endif
 			}
@@ -1290,8 +1319,8 @@
 			}
 
 			/* Calculate Scatter-Gather info */
-			mbox->m_out.numsgelements = mega_build_sglist(adapter, scb,
-					(u32 *)&mbox->m_out.xferaddr, (u32 *)&seg);
+			mbox->numsgelements = mega_build_sglist(adapter, scb,
+					(u32 *)&mbox->xferaddr, (u32 *)&seg);
 
 			return scb;
 
@@ -1359,9 +1388,9 @@
 			epthru = mega_prepare_extpassthru(adapter, scb, cmd,
 					channel, target);
 
-			mbox->m_out.cmd = MEGA_MBOXCMD_EXTPTHRU;
+			mbox->cmd = MEGA_MBOXCMD_EXTPTHRU;
 
-			mbox->m_out.xferaddr = scb->epthru_dma_addr;
+			mbox->xferaddr = scb->epthru_dma_addr;
 
 		}
 		else {
@@ -1371,13 +1400,13 @@
 
 			/* Initialize mailbox */
 			if( adapter->has_64bit_addr ) {
-				mbox->m_out.cmd = MEGA_MBOXCMD_PASSTHRU64;
+				mbox->cmd = MEGA_MBOXCMD_PASSTHRU64;
 			}
 			else {
-				mbox->m_out.cmd = MEGA_MBOXCMD_PASSTHRU;
+				mbox->cmd = MEGA_MBOXCMD_PASSTHRU;
 			}
 
-			mbox->m_out.xferaddr = scb->pthru_dma_addr;
+			mbox->xferaddr = scb->pthru_dma_addr;
 
 		}
 		return scb;
@@ -1595,21 +1624,20 @@
 	volatile mbox_t		*mbox = adapter->mbox;
 	unsigned int	i = 0;
 
-	if(unlikely(mbox->m_in.busy)) {
+	if(unlikely(mbox->busy)) {
 		do {
 			udelay(1);
 			i++;
-		} while( mbox->m_in.busy && (i < max_mbox_busy_wait) );
+		} while( mbox->busy && (i < max_mbox_busy_wait) );
 
-		if(mbox->m_in.busy) return -1;
+		if(mbox->busy) return -1;
 	}
 
 	/* Copy mailbox data into host structure */
-	memcpy((char *)&mbox->m_out, (char *)scb->raw_mbox, 
-			sizeof(struct mbox_out));
+	memcpy((char *)mbox, (char *)scb->raw_mbox, 16);
 
-	mbox->m_out.cmdid = scb->idx;	/* Set cmdid */
-	mbox->m_in.busy = 1;		/* Set busy */
+	mbox->cmdid = scb->idx;	/* Set cmdid */
+	mbox->busy = 1;		/* Set busy */
 
 
 	/*
@@ -1617,14 +1645,16 @@
 	 */
 	atomic_inc(&adapter->pend_cmds);
 
-	switch (mbox->m_out.cmd) {
+	switch (mbox->cmd) {
+	case MEGA_MBOXCMD_EXTPTHRU:
+		if( !adapter->has_64bit_addr ) break;
+		// else fall through
 	case MEGA_MBOXCMD_LREAD64:
 	case MEGA_MBOXCMD_LWRITE64:
 	case MEGA_MBOXCMD_PASSTHRU64:
-	case MEGA_MBOXCMD_EXTPTHRU:
-		mbox64->xfer_segment_lo = mbox->m_out.xferaddr;
+		mbox64->xfer_segment_lo = mbox->xferaddr;
 		mbox64->xfer_segment_hi = 0;
-		mbox->m_out.xferaddr = 0xFFFFFFFF;
+		mbox->xferaddr = 0xFFFFFFFF;
 		break;
 	default:
 		mbox64->xfer_segment_lo = 0;
@@ -1637,8 +1667,8 @@
 	scb->state |= SCB_ISSUED;
 
 	if( likely(adapter->flag & BOARD_MEMMAP) ) {
-		mbox->m_in.poll = 0;
-		mbox->m_in.ack = 0;
+		mbox->poll = 0;
+		mbox->ack = 0;
 		WRINDOOR(adapter, adapter->mbox_dma | 0x1);
 	}
 	else {
@@ -1663,24 +1693,28 @@
 	volatile mbox64_t *mbox64 = adapter->mbox64;
 	volatile mbox_t *mbox = adapter->mbox;
 	u8	byte;
+	u8	status;
+	int	i;
 
 	/* Wait until mailbox is free */
 	if(mega_busywait_mbox (adapter))
 		goto bug_blocked_mailbox;
 
 	/* Copy mailbox data into host structure */
-	memcpy((char *) mbox, raw_mbox, sizeof(struct mbox_out));
-	mbox->m_out.cmdid = 0xFE;
-	mbox->m_in.busy = 1;
+	memcpy((char *) mbox, raw_mbox, 16);
+	mbox->cmdid = 0xFE;
+	mbox->busy = 1;
 
 	switch (raw_mbox[0]) {
+	case MEGA_MBOXCMD_EXTPTHRU:
+		if( !adapter->has_64bit_addr ) break;
+		// else fall through
 	case MEGA_MBOXCMD_LREAD64:
 	case MEGA_MBOXCMD_LWRITE64:
 	case MEGA_MBOXCMD_PASSTHRU64:
-	case MEGA_MBOXCMD_EXTPTHRU:
-		mbox64->xfer_segment_lo = mbox->m_out.xferaddr;
+		mbox64->xfer_segment_lo = mbox->xferaddr;
 		mbox64->xfer_segment_hi = 0;
-		mbox->m_out.xferaddr = 0xFFFFFFFF;
+		mbox->xferaddr = 0xFFFFFFFF;
 		break;
 	default:
 		mbox64->xfer_segment_lo = 0;
@@ -1688,22 +1722,28 @@
 	}
 
 	if( likely(adapter->flag & BOARD_MEMMAP) ) {
-		mbox->m_in.poll = 0;
-		mbox->m_in.ack = 0;
-		mbox->m_in.numstatus = 0xFF;
-		mbox->m_in.status = 0xFF;
+		mbox->poll = 0;
+		mbox->ack = 0;
+		mbox->numstatus = 0xFF;
+		mbox->status = 0xFF;
 		WRINDOOR(adapter, adapter->mbox_dma | 0x1);
 
-		while((volatile u8)mbox->m_in.numstatus == 0xFF)
+		while (mbox->numstatus == 0xFF)
 			cpu_relax();
 
-		mbox->m_in.numstatus = 0xFF;
+		mbox->numstatus = 0xFF;
 
-		while( (volatile u8)mbox->m_in.poll != 0x77 )
+		while (mbox->status == 0xFF)
 			cpu_relax();
 
-		mbox->m_in.poll = 0;
-		mbox->m_in.ack = 0x77;
+		status = mbox->status;
+		mbox->status = 0xFF;
+
+		while (mbox->poll != 0x77 )
+			cpu_relax();
+
+		mbox->poll = 0;
+		mbox->ack = 0x77;
 
 		WRINDOOR(adapter, adapter->mbox_dma | 0x2);
 
@@ -1717,12 +1757,22 @@
 		while (!((byte = irq_state(adapter)) & INTR_VALID))
 			cpu_relax();
 
+		status = mbox->status;
+		mbox->numstatus = 0xFF;
+		mbox->status = 0xFF;
+
 		set_irq_state(adapter, byte);
 		irq_enable(adapter);
 		irq_ack(adapter);
 	}
 
-	return mbox->m_in.status;
+	// invalidate the completed command id array. After command
+	// completion, firmware would write the valid id.
+	for (i = 0; i < MAX_FIRMWARE_STATUS; i++) {
+		mbox->completed[i] = 0xFF;
+	}
+
+	return status;
 
 bug_blocked_mailbox:
 	printk(KERN_WARNING "megaraid: Blocked mailbox......!!\n");
@@ -1746,65 +1796,86 @@
 {
 	adapter_t	*adapter = devp;
 	unsigned long	flags;
+	int		rval;
+
+
+	spin_lock_irqsave(adapter->host_lock, flags);
+
+	rval = megaraid_iombox_ack_sequence(adapter);
+
+	/* Loop through any pending requests */
+	if( atomic_read(&adapter->quiescent ) == 0) {
+		mega_runpendq(adapter);
+	}
+
+	spin_unlock_irqrestore(adapter->host_lock, flags);
+
+	return IRQ_RETVAL(rval);
+}
+
+
+/**
+ * megaraid_iombox_ack_sequence - interrupt ack sequence for IO mapped HBAs
+ * @adapter	- controller's soft state
+ *
+ * Interrupt ackrowledgement sequence for IO mapped HBAs
+ */
+static inline int
+megaraid_iombox_ack_sequence(adapter_t *adapter)
+{
 	u8	status;
 	u8	nstatus;
 	u8	completed[MAX_FIRMWARE_STATUS];
 	u8	byte;
-	int	handled = 0;
+	int	i;
+	int	irq_handled = 0;
 
 
 	/*
 	 * loop till F/W has more commands for us to complete.
 	 */
-	spin_lock_irqsave(&adapter->lock, flags);
-
 	do {
 		/* Check if a valid interrupt is pending */
 		byte = irq_state(adapter);
 		if( (byte & VALID_INTR_BYTE) == 0 ) {
-			/*
-			 * No more pending commands
-			 */
-			goto out_unlock;
+			return irq_handled;
 		}
 		set_irq_state(adapter, byte);
 
-		while((nstatus = (volatile u8)adapter->mbox->m_in.numstatus)
-				== 0xFF)
+		while ((nstatus = adapter->mbox->numstatus) == 0xFF) {
 			cpu_relax();
-		adapter->mbox->m_in.numstatus = 0xFF;
+		}
+		adapter->mbox->numstatus = 0xFF;
+
+		for (i = 0; i < nstatus; i++) {
+			while ((completed[i] = adapter->mbox->completed[i])
+					== 0xFF) {
+				cpu_relax();
+			}
+
+			adapter->mbox->completed[i] = 0xFF;
+		}
 
-		status = adapter->mbox->m_in.status;
+		// we must read the valid status now
+		if ((status = adapter->mbox->status) == 0xFF) {
+			printk(KERN_WARNING
+			"megaraid critical: status 0xFF from firmware.\n");
+		}
+		adapter->mbox->status = 0xFF;
 
 		/*
 		 * decrement the pending queue counter
 		 */
 		atomic_sub(nstatus, &adapter->pend_cmds);
 
-		memcpy(completed, (void *)adapter->mbox->m_in.completed, 
-				nstatus);
-
 		/* Acknowledge interrupt */
 		irq_ack(adapter);
 
 		mega_cmd_done(adapter, completed, nstatus, status);
 
-		mega_rundoneq(adapter);
-
-		handled = 1;
-
-		/* Loop through any pending requests */
-		if(atomic_read(&adapter->quiescent) == 0) {
-			mega_runpendq(adapter);
-		}
+		irq_handled = 1;
 
 	} while(1);
-
- out_unlock:
-
-	spin_unlock_irqrestore(&adapter->lock, flags);
-
-	return IRQ_RETVAL(handled);
 }
 
 
@@ -1823,69 +1894,94 @@
 {
 	adapter_t	*adapter = devp;
 	unsigned long	flags;
+	int		rval;
+
+
+	spin_lock_irqsave(adapter->host_lock, flags);
+
+	rval = megaraid_memmbox_ack_sequence(adapter);
+
+	/* Loop through any pending requests */
+	if(atomic_read(&adapter->quiescent) == 0) {
+		mega_runpendq(adapter);
+	}
+
+	spin_unlock_irqrestore(adapter->host_lock, flags);
+
+	return IRQ_RETVAL(rval);
+}
+
+
+/**
+ * megaraid_memmbox_ack_sequence - interrupt ack sequence for memory mapped HBAs
+ * @adapter	- controller's soft state
+ *
+ * Interrupt ackrowledgement sequence for memory mapped HBAs
+ */
+static inline int
+megaraid_memmbox_ack_sequence(adapter_t *adapter)
+{
 	u8	status;
 	u32	dword = 0;
 	u8	nstatus;
 	u8	completed[MAX_FIRMWARE_STATUS];
-	int	handled = 0;
+	int	i;
+	int	irq_handled = 0;
 
 
 	/*
 	 * loop till F/W has more commands for us to complete.
 	 */
-	spin_lock_irqsave(&adapter->lock, flags);
-
 	do {
 		/* Check if a valid interrupt is pending */
 		dword = RDOUTDOOR(adapter);
-		if(dword != 0x10001234) {
+		if( dword != 0x10001234 ) {
 			/*
 			 * No more pending commands
 			 */
-			goto out_unlock;
+			return irq_handled;
 		}
 		WROUTDOOR(adapter, 0x10001234);
 
-		while((nstatus = (volatile u8)adapter->mbox->m_in.numstatus)
-				== 0xFF) {
+		while ((nstatus = adapter->mbox->numstatus) == 0xFF) {
 			cpu_relax();
 		}
-		adapter->mbox->m_in.numstatus = 0xFF;
+		adapter->mbox->numstatus = 0xFF;
 
-		status = adapter->mbox->m_in.status;
+		for (i = 0; i < nstatus; i++ ) {
+			while ((completed[i] = adapter->mbox->completed[i])
+					== 0xFF) {
+				cpu_relax();
+			}
+
+			adapter->mbox->completed[i] = 0xFF;
+		}
+
+		// we must read the valid status now
+		if ((status = adapter->mbox->status) == 0xFF) {
+			printk(KERN_WARNING
+			"megaraid critical: status 0xFF from firmware.\n");
+		}
+		adapter->mbox->status = 0xFF;
 
 		/*
 		 * decrement the pending queue counter
 		 */
 		atomic_sub(nstatus, &adapter->pend_cmds);
 
-		memcpy(completed, (void *)adapter->mbox->m_in.completed, 
-				nstatus);
-
 		/* Acknowledge interrupt */
 		WRINDOOR(adapter, 0x2);
 
-		handled = 1;
-
 		while( RDINDOOR(adapter) & 0x02 ) cpu_relax();
 
 		mega_cmd_done(adapter, completed, nstatus, status);
 
-		mega_rundoneq(adapter);
-
-		/* Loop through any pending requests */
-		if(atomic_read(&adapter->quiescent) == 0) {
-			mega_runpendq(adapter);
-		}
+		irq_handled = 1;
 
 	} while(1);
+}
 
- out_unlock:
-
-	spin_unlock_irqrestore(&adapter->lock, flags);
 
-	return IRQ_RETVAL(handled);
-}
 /**
  * mega_cmd_done()
  * @adapter - pointer to our soft state
@@ -1903,9 +1999,9 @@
 	Scsi_Cmnd	*cmd = NULL;
 	mega_passthru	*pthru = NULL;
 	mbox_t	*mbox = NULL;
+	int	islogical;
 	u8	c;
 	scb_t	*scb;
-	int	islogical;
 	int	cmdid;
 	int	i;
 
@@ -1931,6 +2027,10 @@
 		}
 		else {
 			scb = &adapter->scb_list[cmdid];
+			cmd = scb->cmd;
+			pthru = scb->pthru;
+			epthru = scb->epthru;
+			mbox = (mbox_t *)scb->raw_mbox;
 
 			/*
 			 * Make sure f/w has completed a valid command
@@ -1945,21 +2045,20 @@
 			}
 
 			/*
-			 * Was a abort issued for this command
+			 * Was an abort issued for this command
 			 */
 			if( scb->state & SCB_ABORT ) {
 
-				printk(KERN_WARNING
+				printk(KERN_NOTICE
 				"megaraid: aborted cmd %lx[%x] complete.\n",
 					scb->cmd->serial_number, scb->idx);
 
-				scb->cmd->result = (DID_ABORT << 16);
-
-				list_add_tail(SCSI_LIST(scb->cmd),
-						&adapter->completed_list);
+				cmd->result = (DID_ABORT << 16);
 
 				mega_free_scb(adapter, scb);
 
+				cmd->scsi_done(cmd);
+
 				continue;
 			}
 
@@ -1974,25 +2073,20 @@
 
 				scb->cmd->result = (DID_RESET << 16);
 
-				list_add_tail(SCSI_LIST(scb->cmd),
-						&adapter->completed_list);
-
 				mega_free_scb (adapter, scb);
 
+				cmd->scsi_done(cmd);
+
 				continue;
 			}
 
-			cmd = scb->cmd;
-			pthru = scb->pthru;
-			epthru = scb->epthru;
-			mbox = (mbox_t *)scb->raw_mbox;
-
 #if MEGA_HAVE_STATS
 			{
 
-			int	logdrv = mbox->m_out.logdrv;
+			int	logdrv = mbox->logdrv;
 
 			islogical = adapter->logdrv_chan[cmd->channel];
+
 			/*
 			 * Maintain an error counter for the logical drive.
 			 * Some application like SNMP agent need such
@@ -2029,7 +2123,7 @@
 		 * PJ
 		 */
 		islogical = adapter->logdrv_chan[cmd->device->channel];
-		if( cmd->cmnd[0] == INQUIRY && !islogical ) {
+		if (cmd->cmnd[0] == INQUIRY && !islogical) {
 
 			if( cmd->use_sg ) {
 				sgl = (struct scatterlist *)
@@ -2037,8 +2131,8 @@
 
 				if( sgl->page ) {
 					c = *(unsigned char *)
-					page_address((&sgl[0])->page) +
-					(&sgl[0])->offset; 
+						page_address((&sgl[0])->page) +
+						(&sgl[0])->offset;
 				}
 				else {
 					printk(KERN_WARNING
@@ -2069,8 +2163,8 @@
 				   SCSI_STATUS_CHECK_CONDITION */
 
 			/* set sense_buffer and result fields */
-			if( mbox->m_out.cmd == MEGA_MBOXCMD_PASSTHRU ||
-				mbox->m_out.cmd == MEGA_MBOXCMD_PASSTHRU64 ) {
+			if( mbox->cmd == MEGA_MBOXCMD_PASSTHRU ||
+				mbox->cmd == MEGA_MBOXCMD_PASSTHRU64 ) {
 
 				memcpy(cmd->sense_buffer, pthru->reqsensearea,
 						14);
@@ -2080,7 +2174,7 @@
 					(CHECK_CONDITION << 1);
 			}
 			else {
-				if (mbox->m_out.cmd == MEGA_MBOXCMD_EXTPTHRU) {
+				if (mbox->cmd == MEGA_MBOXCMD_EXTPTHRU) {
 
 					memcpy(cmd->sense_buffer,
 						epthru->reqsensearea, 14);
@@ -2148,32 +2242,11 @@
 			mega_free_scb(adapter, scb);
 		}
 
-		/* Add Scsi_Command to end of completed queue */
-		list_add_tail(SCSI_LIST(cmd), &adapter->completed_list);
-	}
-}
-
-
-/*
- * mega_runpendq()
- *
- * Run through the list of completed requests and finish it
- */
-static void
-mega_rundoneq (adapter_t *adapter)
-{
-	Scsi_Cmnd *cmd;
-	struct list_head *pos;
-
-	list_for_each(pos, &adapter->completed_list) {
-
-		Scsi_Pointer* spos = (Scsi_Pointer *)pos;
-
-		cmd = list_entry(spos, Scsi_Cmnd, SCp);
+		/*
+		 * Call the mid-layer callback for this command
+		 */
 		cmd->scsi_done(cmd);
 	}
-
-	INIT_LIST_HEAD(&adapter->completed_list);
 }
 
 
@@ -2194,8 +2267,7 @@
 			scb->cmd->request_bufflen, scb->dma_direction);
 
 		if( scb->dma_direction == PCI_DMA_FROMDEVICE ) {
-			pci_dma_sync_single(adapter->dev,
-					scb->dma_h_bulkdata,
+			pci_dma_sync_single(adapter->dev, scb->dma_h_bulkdata,
 					scb->cmd->request_bufflen,
 					PCI_DMA_FROMDEVICE);
 		}
@@ -2207,8 +2279,7 @@
 			scb->cmd->use_sg, scb->dma_direction);
 
 		if( scb->dma_direction == PCI_DMA_FROMDEVICE ) {
-			pci_dma_sync_sg(adapter->dev,
-					scb->cmd->request_buffer,
+			pci_dma_sync_sg(adapter->dev, scb->cmd->request_buffer,
 					scb->cmd->use_sg, PCI_DMA_FROMDEVICE);
 		}
 
@@ -2237,7 +2308,7 @@
 static inline int
 mega_busywait_mbox (adapter_t *adapter)
 {
-	if (adapter->mbox->m_in.busy)
+	if (adapter->mbox->busy)
 		return __mega_busywait_mbox(adapter);
 	return 0;
 }
@@ -2249,7 +2320,7 @@
 	long counter;
 
 	for (counter = 0; counter < 10000; counter++) {
-		if (!mbox->m_in.busy)
+		if (!mbox->busy)
 			return 0;
 		udelay(100); yield();
 	}
@@ -2278,8 +2349,7 @@
 		page = virt_to_page(cmd->request_buffer);
 		offset = offset_in_page(cmd->request_buffer);
 
-		scb->dma_h_bulkdata = pci_map_page(adapter->dev,
-						  page, offset,
+		scb->dma_h_bulkdata = pci_map_page(adapter->dev, page, offset,
 						  cmd->request_bufflen,
 						  scb->dma_direction);
 		scb->dma_type = MEGA_BULK_DATA;
@@ -2317,8 +2387,7 @@
 	 *
 	 * The number of sg elements returned must not exceed our limit
 	 */
-	sgcnt = pci_map_sg(adapter->dev, sgl, cmd->use_sg,
-			scb->dma_direction);
+	sgcnt = pci_map_sg(adapter->dev, sgl, cmd->use_sg, scb->dma_direction);
 
 	scb->dma_type = MEGA_SGLIST;
 
@@ -2395,6 +2464,7 @@
 		enquiry3->pdrv_state[i] = inquiry->pdrv_info.pdrv_state[i];
 }
 
+
 /*
  * Release the controller's resources
  */
@@ -2403,8 +2473,10 @@
 {
 	adapter_t	*adapter;
 	mbox_t	*mbox;
-	u_char	raw_mbox[sizeof(struct mbox_out)];
+	u_char	raw_mbox[sizeof(mbox_t)];
+#ifdef CONFIG_PROC_FS
 	char	buf[12] = { 0 };
+#endif
 
 	adapter = (adapter_t *)host->hostdata;
 	mbox = (mbox_t *)raw_mbox;
@@ -2412,7 +2484,7 @@
 	printk(KERN_NOTICE "megaraid: being unloaded...");
 
 	/* Flush adapter cache */
-	memset(&mbox->m_out, 0, sizeof(raw_mbox));
+	memset(raw_mbox, 0, sizeof(raw_mbox));
 	raw_mbox[0] = FLUSH_ADAPTER;
 
 	irq_disable(adapter);
@@ -2422,7 +2494,7 @@
 	issue_scb_block(adapter, raw_mbox);
 
 	/* Flush disks cache */
-	memset(&mbox->m_out, 0, sizeof(raw_mbox));
+	memset(raw_mbox, 0, sizeof(raw_mbox));
 	raw_mbox[0] = FLUSH_SYSTEM;
 
 	/* Issue a blocking (interrupts disabled) command to the card */
@@ -2483,6 +2555,8 @@
 	pci_free_consistent(adapter->dev, sizeof(mbox64_t),
 			(void *)adapter->una_mbox64, adapter->una_mbox64_dma);
 
+	kfree(adapter->ipdev);
+
 	hba_count--;
 
 	if( hba_count == 0 ) {
@@ -2572,25 +2646,106 @@
 	return buffer;
 }
 
-/*
+
+/**
+ * megaraid_abort - abort the scsi command
+ * @scp	- command to be aborted
+ *
  * Abort a previous SCSI request. Only commands on the pending list can be
  * aborted. All the commands issued to the F/W must complete.
  */
 static int
-megaraid_abort(Scsi_Cmnd *cmd)
+megaraid_abort(Scsi_Cmnd *scp)
 {
-	adapter_t	*adapter;
-	int		rval;
+	adapter_t		*adapter;
+	struct list_head	*pos, *next;
+	scb_t			*scb;
+	long			iter;
+	int			rval = SUCCESS;
 
-	adapter = (adapter_t *)cmd->device->host->hostdata;
+	adapter = (adapter_t *)scp->device->host->hostdata;
+
+	ASSERT( spin_is_locked(adapter->host_lock) );
 
-	rval =  megaraid_abort_and_reset(adapter, cmd, SCB_ABORT);
+	printk("megaraid: aborting-%ld cmd=%x <c=%d t=%d l=%d>\n",
+		scp->serial_number, scp->cmnd[0], scp->device->channel,
+		scp->device->id, scp->device->lun);
+
+
+	list_for_each_safe( pos, next, &adapter->pending_list ) {
+
+		scb = list_entry(pos, scb_t, list);
+
+		if( scb->cmd == scp ) { /* Found command */
+
+			scb->state |= SCB_ABORT;
+
+			/*
+			 * Check if this command was never issued. If this is
+			 * the case, take it off from the pending list and
+			 * complete.
+			 */
+			if( !(scb->state & SCB_ISSUED) ) {
+
+				printk(KERN_WARNING
+				"megaraid: %ld:%d, driver owner.\n",
+					scp->serial_number, scb->idx);
+
+				scp->result = (DID_ABORT << 16);
+
+				mega_free_scb(adapter, scb);
+
+				scp->scsi_done(scp);
+
+				break;
+			}
+		}
+	}
 
 	/*
-	 * This is required here to complete any completed requests
-	 * to be communicated over to the mid layer.
+	 * By this time, either all commands are completed or aborted by
+	 * mid-layer. Do not return until all the commands are actually
+	 * completed by the firmware
 	 */
-	mega_rundoneq(adapter);
+	iter = 0;
+	while( atomic_read(&adapter->pend_cmds) > 0 ) {
+		/*
+		 * Perform the ack sequence, since interrupts are not
+		 * available right now!
+		 */
+		if( adapter->flag & BOARD_MEMMAP ) {
+			megaraid_memmbox_ack_sequence(adapter);
+		}
+		else {
+			megaraid_iombox_ack_sequence(adapter);
+		}
+
+		/*
+		 * print a message once every second only
+		 */
+		if( !(iter % 1000) ) {
+			printk(
+			"megaraid: Waiting for %d commands to flush: iter:%ld\n",
+				atomic_read(&adapter->pend_cmds), iter);
+		}
+
+		if( iter++ < MBOX_ABORT_SLEEP*1000 ) {
+			mdelay(1);
+		}
+		else {
+			printk(KERN_WARNING
+				"megaraid: critical hardware error!\n");
+
+			rval = FAILED;
+
+			break;
+		}
+	}
+
+	if( rval == SUCCESS ) {
+		printk(KERN_INFO
+			"megaraid: abort sequence successfully complete.\n");
+	}
 
 	return rval;
 }
@@ -2601,15 +2756,23 @@
 {
 	adapter_t	*adapter;
 	megacmd_t	mc;
-	int		rval;
+	long		iter;
+	int		rval = SUCCESS;
 
 	adapter = (adapter_t *)cmd->device->host->hostdata;
 
+	ASSERT( spin_is_locked(adapter->host_lock) );
+
+	printk("megaraid: reset-%ld cmd=%x <c=%d t=%d l=%d>\n",
+		cmd->serial_number, cmd->cmnd[0], cmd->device->channel,
+		cmd->device->id, cmd->device->lun);
+
+
 #if MEGA_HAVE_CLUSTERING
 	mc.cmd = MEGA_CLUSTER_CMD;
 	mc.opcode = MEGA_RESET_RESERVATIONS;
 
-	spin_unlock_irq(&adapter->lock);
+	spin_unlock_irq(adapter->host_lock);
 	if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) != 0 ) {
 		printk(KERN_WARNING
 				"megaraid: reservation reset failed.\n");
@@ -2617,97 +2780,54 @@
 	else {
 		printk(KERN_INFO "megaraid: reservation reset.\n");
 	}
-	spin_lock_irq(&adapter->lock);
+	spin_lock_irq(adapter->host_lock);
 #endif
 
-	rval =  megaraid_abort_and_reset(adapter, cmd, SCB_RESET);
-
 	/*
-	 * This is required here to complete any completed requests
-	 * to be communicated over to the mid layer.
+	 * Do not return until all the commands are actually completed by the
+	 * firmware
 	 */
-	mega_rundoneq(adapter);
-
-	return rval;
-}
-
-
-
-/**
- * megaraid_abort_and_reset()
- * @adapter - megaraid soft state
- * @cmd - scsi command to be aborted or reset
- * @aor - abort or reset flag
- *
- * Try to locate the scsi command in the pending queue. If found and is not
- * issued to the controller, abort/reset it. Otherwise return failure
- */
-static int
-megaraid_abort_and_reset(adapter_t *adapter, Scsi_Cmnd *cmd, int aor)
-{
-	struct list_head	*pos, *next;
-	scb_t			*scb;
-
-	printk(KERN_WARNING "megaraid: %s-%lx cmd=%x <c=%d t=%d l=%d>\n",
-	     (aor == SCB_ABORT)? "ABORTING":"RESET", cmd->serial_number,
-	     cmd->cmnd[0], cmd->device->channel, 
-	     cmd->device->id, cmd->device->lun);
-
-	if(list_empty(&adapter->pending_list))
-		return FALSE;
-
-	list_for_each_safe(pos, next, &adapter->pending_list) {
-
-		scb = list_entry(pos, scb_t, list);
-
-		if (scb->cmd == cmd) { /* Found command */
-
-			scb->state |= aor;
-
-			/*
-			 * Check if this command has firmare owenership. If
-			 * yes, we cannot reset this command. Whenever, f/w
-			 * completes this command, we will return appropriate
-			 * status from ISR.
-			 */
-			if( scb->state & SCB_ISSUED ) {
-
-				printk(KERN_WARNING
-					"megaraid: %s-%lx[%x], fw owner.\n",
-					(aor==SCB_ABORT) ? "ABORTING":"RESET",
-					cmd->serial_number, scb->idx);
-
-				return FALSE;
-			}
-			else {
-
-				/*
-				 * Not yet issued! Remove from the pending
-				 * list
-				 */
-				printk(KERN_WARNING
-					"megaraid: %s-%lx[%x], driver owner.\n",
-					(aor==SCB_ABORT) ? "ABORTING":"RESET",
-					cmd->serial_number, scb->idx);
+	iter = 0;
+	while( atomic_read(&adapter->pend_cmds) > 0 ) {
+		/*
+		 * Perform the ack sequence, since interrupts are not
+		 * available right now!
+		 */
+		if( adapter->flag & BOARD_MEMMAP ) {
+			megaraid_memmbox_ack_sequence(adapter);
+		}
+		else {
+			megaraid_iombox_ack_sequence(adapter);
+		}
 
-				mega_free_scb(adapter, scb);
+		/*
+		 * print a message once every second only
+		 */
+		if( !(iter % 1000) ) {
+			printk(
+			"megaraid: Waiting for %d commands to flush: iter:%ld\n",
+				atomic_read(&adapter->pend_cmds), iter);
+		}
 
-				if( aor == SCB_ABORT ) {
-					cmd->result = (DID_ABORT << 16);
-				}
-				else {
-					cmd->result = (DID_RESET << 16);
-				}
+		if( iter++ < MBOX_RESET_SLEEP*1000 ) {
+			mdelay(1);
+		}
+		else {
+			printk(KERN_WARNING
+				"megaraid: critical hardware error!\n");
 
-				list_add_tail(SCSI_LIST(cmd),
-						&adapter->completed_list);
+			rval = FAILED;
 
-				return TRUE;
-			}
+			break;
 		}
 	}
 
-	return FALSE;
+	if( rval == SUCCESS ) {
+		printk(KERN_INFO
+			"megaraid: reset sequence successfully complete.\n");
+	}
+
+	return rval;
 }
 
 
@@ -2953,24 +3073,16 @@
 	int	len = 0;
 
 	len = sprintf(page, "Contents of Mail Box Structure\n");
-	len += sprintf(page+len, "  Fw Command   = 0x%02x\n", 
-			mbox->m_out.cmd);
-	len += sprintf(page+len, "  Cmd Sequence = 0x%02x\n", 
-			mbox->m_out.cmdid);
-	len += sprintf(page+len, "  No of Sectors= %04d\n", 
-			mbox->m_out.numsectors);
-	len += sprintf(page+len, "  LBA          = 0x%02x\n", 
-			mbox->m_out.lba);
-	len += sprintf(page+len, "  DTA          = 0x%08x\n", 
-			mbox->m_out.xferaddr);
-	len += sprintf(page+len, "  Logical Drive= 0x%02x\n", 
-			mbox->m_out.logdrv);
+	len += sprintf(page+len, "  Fw Command   = 0x%02x\n", mbox->cmd);
+	len += sprintf(page+len, "  Cmd Sequence = 0x%02x\n", mbox->cmdid);
+	len += sprintf(page+len, "  No of Sectors= %04d\n", mbox->numsectors);
+	len += sprintf(page+len, "  LBA          = 0x%02x\n", mbox->lba);
+	len += sprintf(page+len, "  DTA          = 0x%08x\n", mbox->xferaddr);
+	len += sprintf(page+len, "  Logical Drive= 0x%02x\n", mbox->logdrv);
 	len += sprintf(page+len, "  No of SG Elmt= 0x%02x\n",
-			mbox->m_out.numsgelements);
-	len += sprintf(page+len, "  Busy         = %01x\n", 
-			mbox->m_in.busy);
-	len += sprintf(page+len, "  Status       = 0x%02x\n", 
-			mbox->m_in.status);
+			mbox->numsgelements);
+	len += sprintf(page+len, "  Busy         = %01x\n", mbox->busy);
+	len += sprintf(page+len, "  Status       = 0x%02x\n", mbox->status);
 
 	*eof = 1;
 
@@ -2999,13 +3111,9 @@
 	struct pci_dev	*pdev;
 	int	len = 0;
 
-	if( make_local_pdev(adapter, &pdev) != 0 ) {
-		*eof = 1;
-		return len;
-	}
+	pdev = adapter->ipdev;
 
 	if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) {
-		free_local_pdev(pdev);
 		*eof = 1;
 		return len;
 	}
@@ -3018,8 +3126,6 @@
 
 		mega_free_inquiry(inquiry, dma_handle, pdev);
 
-		free_local_pdev(pdev);
-
 		*eof = 1;
 
 		return len;
@@ -3038,8 +3144,6 @@
 
 	mega_free_inquiry(inquiry, dma_handle, pdev);
 
-	free_local_pdev(pdev);
-
 	*eof = 1;
 
 	return len;
@@ -3069,13 +3173,9 @@
 	char	str[256];
 	int	len = 0;
 
-	if( make_local_pdev(adapter, &pdev) != 0 ) {
-		*eof = 1;
-		return len;
-	}
+	pdev = adapter->ipdev;
 
 	if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) {
-		free_local_pdev(pdev);
 		*eof = 1;
 		return len;
 	}
@@ -3088,8 +3188,6 @@
 
 		mega_free_inquiry(inquiry, dma_handle, pdev);
 
-		free_local_pdev(pdev);
-
 		*eof = 1;
 
 		return len;
@@ -3137,8 +3235,6 @@
 
 	mega_free_inquiry(inquiry, dma_handle, pdev);
 
-	free_local_pdev(pdev);
-
 	*eof = 1;
 
 	return len;
@@ -3260,12 +3356,9 @@
 	char	str[80];
 	int	i;
 
-	if( make_local_pdev(adapter, &pdev) != 0 ) {
-		return len;
-	}
+	pdev = adapter->ipdev;
 
 	if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) {
-		free_local_pdev(pdev);
 		return len;
 	}
 
@@ -3277,8 +3370,6 @@
 
 		mega_free_inquiry(inquiry, dma_handle, pdev);
 
-		free_local_pdev(pdev);
-
 		return len;
 	}
 
@@ -3290,8 +3381,6 @@
 
 		mega_free_inquiry(inquiry, dma_handle, pdev);
 
-		free_local_pdev(pdev);
-
 		return len;
 	}
 
@@ -3374,8 +3463,6 @@
 
 	mega_free_inquiry(inquiry, dma_handle, pdev);
 
-	free_local_pdev(pdev);
-
 	return len;
 }
 
@@ -3543,13 +3630,11 @@
 	u32	array_sz;
 	int	len = 0;
 	int	i;
+	u8	span8_flag = 1;
 
-	if( make_local_pdev(adapter, &pdev) != 0 ) {
-		return len;
-	}
+	pdev = adapter->ipdev;
 
 	if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) {
-		free_local_pdev(pdev);
 		return len;
 	}
 
@@ -3561,14 +3646,13 @@
 
 		mega_free_inquiry(inquiry, dma_handle, pdev);
 
-		free_local_pdev(pdev);
-
 		return len;
 	}
 
 	memset(&mc, 0, sizeof(megacmd_t));
 
 	if( adapter->flag & BOARD_40LD ) {
+		
 		array_sz = sizeof(disk_array_40ld);
 
 		rdrv_state = ((mega_inquiry3 *)inquiry)->ldrv_state;
@@ -3576,7 +3660,12 @@
 		num_ldrv = ((mega_inquiry3 *)inquiry)->num_ldrv;
 	}
 	else {
-		array_sz = sizeof(disk_array_8ld);
+		/*
+		 * 'array_sz' is either the size of diskarray_span4_t or the
+		 * size of disk_array_span8_t. We use span8_t's size because
+		 * it is bigger of the two.
+		 */
+		array_sz = sizeof( diskarray_span8_t );
 
 		rdrv_state = ((mraid_ext_inquiry *)inquiry)->
 			raid_inq.logdrv_info.ldrv_state;
@@ -3593,8 +3682,6 @@
 
 		mega_free_inquiry(inquiry, dma_handle, pdev);
 
-		free_local_pdev(pdev);
-
 		return len;
 	}
 
@@ -3613,17 +3700,22 @@
 			pci_free_consistent(pdev, array_sz, disk_array,
 					disk_array_dma_handle);
 
-			free_local_pdev(pdev);
-
 			return len;
 		}
 
 	}
 	else {
+		/*
+		 * Try 8-Span "read config" command
+		 */
 		mc.cmd = NEW_READ_CONFIG_8LD;
 
 		if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) ) {
 
+			/*
+			 * 8-Span command failed; try 4-Span command
+			 */
+			span8_flag = 0;
 			mc.cmd = READ_CONFIG_8LD;
 
 			if( mega_internal_command(adapter, LOCK_INT, &mc,
@@ -3638,8 +3730,6 @@
 						disk_array,
 						disk_array_dma_handle);
 
-				free_local_pdev(pdev);
-
 				return len;
 			}
 		}
@@ -3652,8 +3742,14 @@
 			&((disk_array_40ld *)disk_array)->ldrv[i].lparam;
 		}
 		else {
-			lparam =
-			&((disk_array_8ld *)disk_array)->ldrv[i].lparam;
+			if( span8_flag ) {
+				lparam = (logdrv_param*) &((diskarray_span8_t*)
+						(disk_array))->log_drv[i];
+			}
+			else {
+				lparam = (logdrv_param*) &((diskarray_span4_t*)
+						(disk_array))->log_drv[i];
+			}	
 		}
 
 		/*
@@ -3764,8 +3860,6 @@
 	pci_free_consistent(pdev, array_sz, disk_array,
 			disk_array_dma_handle);
 
-	free_local_pdev(pdev);
-
 	return len;
 }
 
@@ -3848,6 +3942,7 @@
 	return 0;
 }
 
+
 /**
  * megaraid_reboot_notify()
  * @this - unused
@@ -3863,9 +3958,9 @@
 {
 	adapter_t *adapter;
 	struct Scsi_Host *host;
-	u8 raw_mbox[sizeof(struct mbox_out)];
+	u8 raw_mbox[sizeof(mbox_t)];
 	mbox_t *mbox;
-	int i,j;
+	int i;
 
 	/*
 	 * Flush the controller's cache irrespective of the codes coming down.
@@ -3879,7 +3974,7 @@
 		mbox = (mbox_t *)raw_mbox;
 
 		/* Flush adapter cache */
-		memset(&mbox->m_out, 0, sizeof(raw_mbox));
+		memset(raw_mbox, 0, sizeof(raw_mbox));
 		raw_mbox[0] = FLUSH_ADAPTER;
 
 		irq_disable(adapter);
@@ -3892,7 +3987,7 @@
 		issue_scb_block(adapter, raw_mbox);
 
 		/* Flush disks cache */
-		memset(&mbox->m_out, 0, sizeof(raw_mbox));
+		memset(raw_mbox, 0, sizeof(raw_mbox));
 		raw_mbox[0] = FLUSH_SYSTEM;
 
 		issue_scb_block(adapter, raw_mbox);
@@ -3908,12 +4003,13 @@
 	 * Have a delibrate delay to make sure all the caches are
 	 * actually flushed.
 	 */
-	printk("megaraid: cache flush delay: ");
-	for( j = 10; j >= 0; j-- ) {
-		printk("[%d] ", j);
+	printk(KERN_INFO "megaraid: cache flush delay:   ");
+	for( i = 9; i >= 0; i-- ) {
+		printk("\b\b\b[%d]", i);
 		mdelay(1000);
 	}
-	printk("\n");
+	printk("\b\b\b[done]\n");
+	mdelay(1000);
 
 	return NOTIFY_DONE;
 }
@@ -4209,8 +4305,7 @@
 		 * For all internal commands, the buffer must be allocated in
 		 * <4GB address range
 		 */
-		if( make_local_pdev(adapter, &pdev) != 0 )
-			return -EIO;
+		pdev = adapter->ipdev;
 
 		/* Is it a passthru command or a DCMD */
 		if( uioc.uioc_rmbox[0] == MEGA_MBOXCMD_PASSTHRU ) {
@@ -4221,7 +4316,6 @@
 					&pthru_dma_hndl);
 
 			if( pthru == NULL ) {
-				free_local_pdev(pdev);
 				return (-ENOMEM);
 			}
 
@@ -4240,8 +4334,6 @@
 						sizeof(mega_passthru), pthru,
 						pthru_dma_hndl);
 
-				free_local_pdev(pdev);
-
 				return (-EFAULT);
 			}
 
@@ -4259,8 +4351,6 @@
 							pthru,
 							pthru_dma_hndl);
 
-					free_local_pdev(pdev);
-
 					return (-ENOMEM);
 				}
 
@@ -4329,8 +4419,6 @@
 			pci_free_consistent(pdev, sizeof(mega_passthru),
 					pthru, pthru_dma_hndl);
 
-			free_local_pdev(pdev);
-
 			return rval;
 		}
 		else {
@@ -4344,7 +4432,6 @@
 						uioc.xferlen, &data_dma_hndl);
 
 				if( data == NULL ) {
-					free_local_pdev(pdev);
 					return (-ENOMEM);
 				}
 
@@ -4365,8 +4452,6 @@
 							uioc.xferlen,
 							data, data_dma_hndl);
 
-					free_local_pdev(pdev);
-
 					return (-EFAULT);
 				}
 			}
@@ -4389,8 +4474,6 @@
 							data_dma_hndl);
 				}
 
-				free_local_pdev(pdev);
-
 				return rval;
 			}
 
@@ -4411,8 +4494,6 @@
 						data_dma_hndl);
 			}
 
-			free_local_pdev(pdev);
-
 			return rval;
 		}
 
@@ -4564,6 +4645,7 @@
 {
 	nitioctl_t	*uiocp;
 	megacmd_t	*umc;
+	megacmd_t	kmc;
 	mega_passthru	*upthru;
 	struct uioctl_t	*uioc_mimd;
 	char	signature[8] = {0};
@@ -4600,8 +4682,10 @@
 		if( mc->cmd == MEGA_MBOXCMD_PASSTHRU ) {
 
 			umc = (megacmd_t *)uioc_mimd->mbox;
+			if (copy_from_user(&kmc, umc, sizeof(megacmd_t)))
+				return -EFAULT;
 
-			upthru = (mega_passthru *)umc->xferaddr;
+			upthru = (mega_passthru *)kmc.xferaddr;
 
 			if( put_user(mc->status, (u8 *)&upthru->scsistatus) )
 				return (-EFAULT);
@@ -4625,17 +4709,17 @@
 static int
 mega_is_bios_enabled(adapter_t *adapter)
 {
-	unsigned char	raw_mbox[sizeof(struct mbox_out)];
+	unsigned char	raw_mbox[sizeof(mbox_t)];
 	mbox_t	*mbox;
 	int	ret;
 
 	mbox = (mbox_t *)raw_mbox;
 
-	memset(&mbox->m_out, 0, sizeof(raw_mbox));
+	memset(raw_mbox, 0, sizeof(raw_mbox));
 
 	memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
 
-	mbox->m_out.xferaddr = (u32)adapter->buf_dma_handle;
+	mbox->xferaddr = (u32)adapter->buf_dma_handle;
 
 	raw_mbox[0] = IS_BIOS_ENABLED;
 	raw_mbox[2] = GET_BIOS;
@@ -4658,13 +4742,13 @@
 static void
 mega_enum_raid_scsi(adapter_t *adapter)
 {
-	unsigned char raw_mbox[sizeof(struct mbox_out)];
+	unsigned char raw_mbox[sizeof(mbox_t)];
 	mbox_t *mbox;
 	int i;
 
 	mbox = (mbox_t *)raw_mbox;
 
-	memset(&mbox->m_out, 0, sizeof(raw_mbox));
+	memset(raw_mbox, 0, sizeof(raw_mbox));
 
 	/*
 	 * issue command to find out what channels are raid/scsi
@@ -4674,7 +4758,7 @@
 
 	memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
 
-	mbox->m_out.xferaddr = (u32)adapter->buf_dma_handle;
+	mbox->xferaddr = (u32)adapter->buf_dma_handle;
 
 	/*
 	 * Non-ROMB firware fail this command, so all channels
@@ -4713,7 +4797,7 @@
 mega_get_boot_drv(adapter_t *adapter)
 {
 	struct private_bios_data	*prv_bios_data;
-	unsigned char	raw_mbox[sizeof(struct mbox_out)];
+	unsigned char	raw_mbox[sizeof(mbox_t)];
 	mbox_t	*mbox;
 	u16	cksum = 0;
 	u8	*cksum_p;
@@ -4722,14 +4806,14 @@
 
 	mbox = (mbox_t *)raw_mbox;
 
-	memset(&mbox->m_out, 0, sizeof(raw_mbox));
+	memset(raw_mbox, 0, sizeof(raw_mbox));
 
 	raw_mbox[0] = BIOS_PVT_DATA;
 	raw_mbox[2] = GET_BIOS_PVT_DATA;
 
 	memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
 
-	mbox->m_out.xferaddr = (u32)adapter->buf_dma_handle;
+	mbox->xferaddr = (u32)adapter->buf_dma_handle;
 
 	adapter->boot_ldrv_enabled = 0;
 	adapter->boot_ldrv = 0;
@@ -4779,13 +4863,13 @@
 static int
 mega_support_random_del(adapter_t *adapter)
 {
-	unsigned char raw_mbox[sizeof(struct mbox_out)];
+	unsigned char raw_mbox[sizeof(mbox_t)];
 	mbox_t *mbox;
 	int rval;
 
 	mbox = (mbox_t *)raw_mbox;
 
-	memset(&mbox->m_out, 0, sizeof(raw_mbox));
+	memset(raw_mbox, 0, sizeof(raw_mbox));
 
 	/*
 	 * issue command
@@ -4808,13 +4892,13 @@
 static int
 mega_support_ext_cdb(adapter_t *adapter)
 {
-	unsigned char raw_mbox[sizeof(struct mbox_out)];
+	unsigned char raw_mbox[sizeof(mbox_t)];
 	mbox_t *mbox;
 	int rval;
 
 	mbox = (mbox_t *)raw_mbox;
 
-	memset(&mbox->m_out, 0, sizeof(raw_mbox));
+	memset(raw_mbox, 0, sizeof(raw_mbox));
 	/*
 	 * issue command to find out if controller supports extended CDBs.
 	 */
@@ -4843,6 +4927,8 @@
 	scb_t *scb;
 	int rval;
 
+	ASSERT( !spin_is_locked(adapter->host_lock) );
+
 	/*
 	 * Stop sending commands to the controller, queue them internally.
 	 * When deletion is complete, ISR will flush the queue.
@@ -4853,15 +4939,15 @@
 	 * Wait till all the issued commands are complete and there are no
 	 * commands in the pending queue
 	 */
-	while( atomic_read(&adapter->pend_cmds) > 0 ||
-			!list_empty(&adapter->pending_list) ) {
+	while( atomic_read(&adapter->pend_cmds) > 0 ) {
 
 		sleep_on_timeout( &wq, 1*HZ );	/* sleep for 1s */
 	}
 
 	rval = mega_do_del_logdrv(adapter, logdrv);
 
-	spin_lock_irqsave(&adapter->lock, flags);
+
+	spin_lock_irqsave(adapter->host_lock, flags);
 
 	/*
 	 * If delete operation was successful, add 0x80 to the logical drive
@@ -4871,8 +4957,8 @@
 		struct list_head *pos;
 		list_for_each(pos, &adapter->pending_list) {
 			scb = list_entry(pos, scb_t, list);
-			if (scb->pthru->logdrv < 0x80 )
-				scb->pthru->logdrv += 0x80;
+			if (((mbox_t *)scb->raw_mbox)->logdrv < 0x80 )
+				((mbox_t *)scb->raw_mbox)->logdrv += 0x80 ;
 		}
 	}
 
@@ -4880,7 +4966,7 @@
 
 	mega_runpendq(adapter);
 
-	spin_unlock_irqrestore(&adapter->lock, flags);
+	spin_unlock_irqrestore(adapter->host_lock, flags);
 
 	return rval;
 }
@@ -4889,16 +4975,17 @@
 static int
 mega_do_del_logdrv(adapter_t *adapter, int logdrv)
 {
-	megacmd_t	mc;
 	int	rval;
+	u8	raw_mbox[sizeof(mbox_t)];
 
-	memset( &mc, 0, sizeof(megacmd_t));
+	memset(raw_mbox, 0, sizeof(raw_mbox));
 
-	mc.cmd = FC_DEL_LOGDRV;
-	mc.opcode = OP_DEL_LOGDRV;
-	mc.subopcode = logdrv;
+	raw_mbox[0] = FC_DEL_LOGDRV;
+	raw_mbox[2] = OP_DEL_LOGDRV;
+	raw_mbox[3] = logdrv;
 
-	rval = mega_internal_command(adapter, LOCK_INT, &mc, NULL);
+	/* Issue a blocking command to the card */
+	rval = issue_scb_block(adapter, raw_mbox);
 
 	/* log this event */
 	if(rval) {
@@ -4926,16 +5013,16 @@
 static void
 mega_get_max_sgl(adapter_t *adapter)
 {
-	unsigned char	raw_mbox[sizeof(struct mbox_out)];
+	unsigned char	raw_mbox[sizeof(mbox_t)];
 	mbox_t	*mbox;
 
 	mbox = (mbox_t *)raw_mbox;
 
-	memset(mbox, 0, sizeof(raw_mbox));
+	memset(raw_mbox, 0, sizeof(raw_mbox));
 
 	memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
 
-	mbox->m_out.xferaddr = (u32)adapter->buf_dma_handle;
+	mbox->xferaddr = (u32)adapter->buf_dma_handle;
 
 	raw_mbox[0] = MAIN_MISC_OPCODE;
 	raw_mbox[2] = GET_MAX_SG_SUPPORT;
@@ -4971,16 +5058,16 @@
 static int
 mega_support_cluster(adapter_t *adapter)
 {
-	unsigned char	raw_mbox[sizeof(struct mbox_out)];
+	unsigned char	raw_mbox[sizeof(mbox_t)];
 	mbox_t	*mbox;
 
 	mbox = (mbox_t *)raw_mbox;
 
-	memset(mbox, 0, sizeof(raw_mbox));
+	memset(raw_mbox, 0, sizeof(raw_mbox));
 
 	memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
 
-	mbox->m_out.xferaddr = (u32)adapter->buf_dma_handle;
+	mbox->xferaddr = (u32)adapter->buf_dma_handle;
 
 	/*
 	 * Try to get the initiator id. This command will succeed iff the
@@ -5021,7 +5108,7 @@
 	int		ldrv_num;
 
 	tgt = cmd->device->id;
-	
+
 	if ( tgt > adapter->this_id )
 		tgt--;	/* we do not get inquires for initiator id */
 
@@ -5065,6 +5152,7 @@
 }
 
 
+#ifdef CONFIG_PROC_FS
 /**
  * mega_adapinq()
  * @adapter - pointer to our soft state
@@ -5144,13 +5232,12 @@
 	 * For all internal commands, the buffer must be allocated in <4GB
 	 * address range
 	 */
-	if( make_local_pdev(adapter, &pdev) != 0 ) return -1;
+	pdev = adapter->ipdev;
 
 	pthru = pci_alloc_consistent(pdev, sizeof(mega_passthru),
 			&pthru_dma_handle);
 
 	if( pthru == NULL ) {
-		free_local_pdev(pdev);
 		return -1;
 	}
 
@@ -5186,10 +5273,9 @@
 	pci_free_consistent(pdev, sizeof(mega_passthru), pthru,
 			pthru_dma_handle);
 
-	free_local_pdev(pdev);
-
 	return rval;
 }
+#endif	// #ifdef CONFIG_PROC_FS
 
 
 /**
@@ -5236,6 +5322,7 @@
 	scmd->device = sdev;
 
 	scmd->device->host = adapter->host;
+
 	scmd->buffer = (void *)scb;
 	scmd->cmnd[0] = MEGA_INTERNAL_CMD;
 
@@ -5259,16 +5346,18 @@
 	/*
 	 * Get the lock only if the caller has not acquired it already
 	 */
-	if( ls == LOCK_INT ) spin_lock_irqsave(&adapter->lock, flags);
+	if( ls == LOCK_INT ) spin_lock_irqsave(adapter->host_lock, flags);
 
 	megaraid_queue(scmd, mega_internal_done);
 
-	if( ls == LOCK_INT ) spin_unlock_irqrestore(&adapter->lock, flags);
+	if( ls == LOCK_INT ) spin_unlock_irqrestore(adapter->host_lock, flags);
 
 	/*
 	 * Wait till this command finishes. Do not use
 	 * wait_event_interruptible(). It causes panic if CTRL-C is hit when
 	 * dumping e.g., physical disk information through /proc interface.
+	 * Catching the return value should solve the issue but for now keep
+	 * the call non-interruptible.
 	 */
 #if 0
 	wait_event_interruptible(adapter->int_waitq, scmd->state);
@@ -5277,8 +5366,8 @@
 
 	rval = scmd->result;
 	mc->status = scmd->result;
-	kfree(sdev);
 
+	kfree(sdev);
 	/*
 	 * Print a debug message for all failed commands. Applications can use
 	 * this information.
@@ -5320,36 +5409,12 @@
 
 }
 
-
-static inline int
-make_local_pdev(adapter_t *adapter, struct pci_dev **pdev)
-{
-	*pdev = kmalloc(sizeof(struct pci_dev), GFP_KERNEL);
-
-	if( *pdev == NULL ) return -1;
-
-	memcpy(*pdev, adapter->dev, sizeof(struct pci_dev));
-
-	if( pci_set_dma_mask(*pdev, 0xffffffff) != 0 ) {
-		kfree(*pdev);
-		return -1;
-	}
-
-	return 0;
-}
-
-static inline void
-free_local_pdev(struct pci_dev *pdev)
-{
-	kfree(pdev);
-}
-
 static Scsi_Host_Template driver_template = {
 	.name =				"MegaRAID",
 	.detect =			megaraid_detect,
 	.release =			megaraid_release,
 	.info =				megaraid_info,
-	.queuecommand =			megaraid_queue,	
+	.queuecommand =			megaraid_queue,
 	.bios_param =			megaraid_biosparam,
 	.max_sectors =			MAX_SECTORS_PER_IO,
 	.can_queue =			MAX_COMMANDS,
@@ -5362,6 +5427,7 @@
 	.eh_bus_reset_handler =		megaraid_reset,
 	.eh_host_reset_handler =	megaraid_reset,
 };
+
 #include "scsi_module.c"
 
 /* vi: set ts=8 sw=8 tw=78: */
diff -Naur megaraid2-2003-linux-2.6.0-test6/megaraid.h megaraid2-2009/megaraid.h
--- megaraid2-2003-linux-2.6.0-test6/megaraid.h	2003-10-06 12:56:03.000000000 -0400
+++ megaraid2-2009/megaraid.h	2003-10-03 17:45:25.000000000 -0400
@@ -5,7 +5,7 @@
 
 
 #define MEGARAID_VERSION	\
-	"v2.00.3 (Release Date: Wed Feb 19 08:51:30 EST 2003)\n"
+	"v2.00.9.a.10.03.2003 (Release Date: Fri Oct  3 18:59:41 EDT 2003)\n"
 
 /*
  * Driver features - change the values to enable or disable features in the
@@ -82,6 +82,7 @@
 #define DELL_SUBSYS_VID			0x1028
 #define	HP_SUBSYS_VID			0x103C
 #define LSI_SUBSYS_VID			0x1000
+#define INTEL_SUBSYS_VID		0x8086
 
 #define HBA_SIGNATURE	      		0x3344
 #define HBA_SIGNATURE_471	  	0xCCCC
@@ -119,7 +120,8 @@
 
 #define NVIRT_CHAN		4	/* # of virtual channels to represent
 					   up to 60 logical drives */
-struct mbox_out {
+
+typedef struct {
 	/* 0x0 */ u8 cmd;
 	/* 0x1 */ u8 cmdid;
 	/* 0x2 */ u16 numsectors;
@@ -128,20 +130,12 @@
 	/* 0xC */ u8 logdrv;
 	/* 0xD */ u8 numsgelements;
 	/* 0xE */ u8 resvd;
-} __attribute__ ((packed));
-
-struct mbox_in {
 	/* 0xF */ volatile u8 busy;
 	/* 0x10 */ volatile u8 numstatus;
 	/* 0x11 */ volatile u8 status;
 	/* 0x12 */ volatile u8 completed[MAX_FIRMWARE_STATUS];
 	volatile u8 poll;
 	volatile u8 ack;
-} __attribute__ ((packed));
-
-typedef struct {
-	struct mbox_out	m_out;
-	struct mbox_in	m_in;
 } __attribute__ ((packed)) mbox_t;
 
 typedef struct {
@@ -487,6 +481,70 @@
 	phys_drv	pdrv[MAX_PHYSICAL_DRIVES];
 }__attribute__ ((packed)) disk_array_8ld;
 
+/*
+ *    FW Definitions & Data Structures for 8LD 4-Span and 8-Span Controllers
+ */
+#define	MAX_STRIPES	8
+#define SPAN4_DEPTH	4
+#define SPAN8_DEPTH	8
+#define MAX_PHYDRVS	5 * 16	/* 5 Channels * 16 Targets */
+
+typedef struct  {
+	unsigned char	channel;
+	unsigned char	target; 
+}__attribute__ ((packed)) device_t;
+
+typedef struct { 
+	unsigned long	start_blk;
+	unsigned long	total_blks;
+	device_t	device[ MAX_STRIPES ];
+}__attribute__ ((packed)) span_t;
+
+typedef struct {
+	unsigned char	type;
+	unsigned char	curr_status;
+	unsigned char	tag_depth;
+	unsigned char	resvd1;
+	unsigned long	size;
+}__attribute__ ((packed)) phydrv_t;
+
+typedef struct { 
+	unsigned char	span_depth;
+	unsigned char	raid;
+	unsigned char	read_ahead;	/* 0=No rdahead,1=RDAHEAD,2=adaptive */ 
+	unsigned char	stripe_sz;
+	unsigned char	status;
+	unsigned char	write_policy;	/* 0=wrthru,1=wrbak */ 
+	unsigned char	direct_io;   	/* 1=directio,0=cached */ 
+	unsigned char	no_stripes;
+	span_t		span[ SPAN4_DEPTH ];
+}__attribute__ ((packed)) ld_span4_t;
+
+typedef struct { 
+	unsigned char	span_depth;
+	unsigned char	raid;
+	unsigned char	read_ahead;	/* 0=No rdahead,1=RDAHEAD,2=adaptive */ 
+	unsigned char	stripe_sz;
+	unsigned char	status;
+	unsigned char	write_policy;	/* 0=wrthru,1=wrbak */ 
+	unsigned char	direct_io;   	/* 1=directio,0=cached */ 
+	unsigned char	no_stripes;
+	span_t		span[ SPAN8_DEPTH ];
+}__attribute__ ((packed)) ld_span8_t;
+
+typedef struct { 
+	unsigned char	no_log_drives;
+	unsigned char	pad[3];
+	ld_span4_t	log_drv[ MAX_LOGICAL_DRIVES_8LD ];
+	phydrv_t	phys_drv[ MAX_PHYDRVS ];
+}__attribute__ ((packed)) diskarray_span4_t;
+
+typedef struct { 
+	unsigned char	no_log_drives;
+	unsigned char	pad[3];
+	ld_span8_t	log_drv[ MAX_LOGICAL_DRIVES_8LD ];
+	phydrv_t	phys_drv[ MAX_PHYDRVS ];
+}__attribute__ ((packed)) diskarray_span8_t;
 
 /*
  * User ioctl structure.
@@ -790,8 +848,6 @@
 #define DIRECT_IO		1
 
 
-#define SCSI_LIST(scp) ((struct list_head *)(&(scp)->SCp))
-
 /*
  * Each controller's soft state
  */
@@ -811,10 +867,10 @@
 	dma_addr_t		mbox_dma;
 
 	struct pci_dev	*dev;
+	struct pci_dev	*ipdev;		/* for internal allocation */
 
 	struct list_head	free_list;
 	struct list_head	pending_list;
-	struct list_head	completed_list;
 
 	struct Scsi_Host	*host;
 
@@ -828,7 +884,7 @@
 	scb_t		*scb_list;
 
 	atomic_t	pend_cmds;	/* maintain a counter for pending
-					   commands in firmware */
+					commands in firmware */
 
 #if MEGA_HAVE_STATS
 	u32	nreads[MAX_LOGICAL_DRIVES_40LD];
@@ -879,6 +935,7 @@
 					   sending requests to the hba till
 					   delete operation is completed */
 	spinlock_t	lock;
+	spinlock_t	*host_lock;	// pointer to appropriate lock
 
 	u8	logdrv_chan[MAX_CHANNELS+NVIRT_CHAN]; /* logical drive are on
 							what channels. */
@@ -986,6 +1043,22 @@
  * End of SYSDEP area
  */
 
+/*
+ * ASSERT macro for megaraid. This should panic but printk should do for now
+ */
+#ifdef DEBUG
+#define ASSERT( expression )						\
+	if( !(expression) ) {						\
+		panic("assertion failed: %s, file: %s, line: %d\n",	\
+				#expression, __FILE__, __LINE__);	\
+	}
+#else
+#define ASSERT(expression)
+#endif
+
+#define MBOX_ABORT_SLEEP	60
+#define MBOX_RESET_SLEEP	30
+
 const char *megaraid_info (struct Scsi_Host *);
 
 static int megaraid_detect(Scsi_Host_Template *);
@@ -1002,23 +1075,22 @@
 static int issue_scb_block(adapter_t *, u_char *);
 
 static irqreturn_t megaraid_isr_memmapped(int, void *, struct pt_regs *);
+static inline int megaraid_memmbox_ack_sequence(adapter_t *);
 static irqreturn_t megaraid_isr_iomapped(int, void *, struct pt_regs *);
+static inline int megaraid_iombox_ack_sequence(adapter_t *);
 
 static void mega_free_scb(adapter_t *, scb_t *);
 
 static int megaraid_release (struct Scsi_Host *);
 static int megaraid_abort(Scsi_Cmnd *);
 static int megaraid_reset(Scsi_Cmnd *);
-static int megaraid_abort_and_reset(adapter_t *, Scsi_Cmnd *, int);
 static int megaraid_biosparam(struct scsi_device *, struct block_device *,
-		sector_t, int []);
-static int mega_print_inquiry(char *, char *);
+	sector_t, int []);
 
 static int mega_build_sglist (adapter_t *adapter, scb_t *scb,
 			      u32 *buffer, u32 *length);
 static inline int mega_busywait_mbox (adapter_t *);
 static int __mega_busywait_mbox (adapter_t *);
-static void mega_rundoneq (adapter_t *);
 static inline void mega_cmd_done(adapter_t *, u8 [], int, int);
 static inline void mega_free_sgl (adapter_t *adapter);
 static void mega_8_to_40ld (mraid_inquiry *inquiry,
@@ -1031,9 +1103,7 @@
 		unsigned long);
 static int mega_m_to_n(void *, nitioctl_t *);
 static int mega_n_to_m(void *, megacmd_t *);
-
 static int mega_init_scb (adapter_t *);
-
 static int mega_is_bios_enabled (adapter_t *);
 
 #ifdef CONFIG_PROC_FS
@@ -1053,14 +1123,13 @@
 static int proc_rdrv_30(char *, char **, off_t, int, int *, void *);
 static int proc_rdrv_40(char *, char **, off_t, int, int *, void *);
 static int proc_rdrv(adapter_t *, char *, int, int);
-#endif
 
 static int mega_adapinq(adapter_t *, dma_addr_t);
 static int mega_internal_dev_inquiry(adapter_t *, u8, u8, dma_addr_t);
 static inline caddr_t mega_allocate_inquiry(dma_addr_t *, struct pci_dev *);
 static inline void mega_free_inquiry(caddr_t, dma_addr_t, struct pci_dev *);
-static inline int make_local_pdev(adapter_t *, struct pci_dev **);
-static inline void free_local_pdev(struct pci_dev *);
+static int mega_print_inquiry(char *, char *);
+#endif
 
 static int mega_support_ext_cdb(adapter_t *);
 static mega_passthru* mega_prepare_passthru(adapter_t *, scb_t *,

             reply	other threads:[~2003-10-08  1:33 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-10-08  1:32 James Bottomley [this message]
2003-10-17 12:39 ` [PATCH] megaraid 2.00.09 Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1065576771.2684.1.camel@fuzzy \
    --to=james.bottomley@steeleye.com \
    --cc=atulm@lsil.com \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.