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 *,
next 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.