public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] megaraid 2.00.09
@ 2003-10-08  1:32 James Bottomley
  2003-10-17 12:39 ` Christoph Hellwig
  0 siblings, 1 reply; 2+ messages in thread
From: James Bottomley @ 2003-10-08  1:32 UTC (permalink / raw)
  To: SCSI Mailing List; +Cc: atulm

[-- 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 *,

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] megaraid 2.00.09
  2003-10-08  1:32 [PATCH] megaraid 2.00.09 James Bottomley
@ 2003-10-17 12:39 ` Christoph Hellwig
  0 siblings, 0 replies; 2+ messages in thread
From: Christoph Hellwig @ 2003-10-17 12:39 UTC (permalink / raw)
  To: James Bottomley; +Cc: SCSI Mailing List, atulm

- * Copyright © 2002  LSI Logic Corporation.
+ * Copyright © 2002  LSI Logic Corporation.

Strange encoding?

@@ -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;

	This is wrong.  We have the consistent_dma_mask for this.

+
+		got_ipdev_f = 1;

this got_foo / did_foo stuff is crap - use proper gotos for unwinding,

+
+		adapter->host_lock = &adapter->lock;
+
 		scsi_assign_lock(host, &adapter->lock);

still b0rked.  The driver shouldn't use scsi_assign_lock which
it's one of the last users of but just use host->host_lock directly
everywhere.
		
 
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-10-17 12:39 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-10-08  1:32 [PATCH] megaraid 2.00.09 James Bottomley
2003-10-17 12:39 ` Christoph Hellwig

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox