2004-01-09 23:54:36

by Mukker, Atul

[permalink] [raw]
Subject: ANNOUNCE: megaraid driver version 2.10.1

All,

The megaraid driver version 2.10.1 is released and can be downloaded from
ftp://ftp.lsil.com/pub/linux-megaraid/drivers/version-2.10.1/

Following other components are also available at this location:
i. Patches for Red Hat and SuSE stock kernels
ii. Driver update disks for Red Hat and SuSE
iii. RPM packages to update drivers

Thanks
-Atul Mukker
LSI Logic


2004-01-11 14:06:57

by Christoph Hellwig

[permalink] [raw]
Subject: Re: ANNOUNCE: megaraid driver version 2.10.1

On Fri, Jan 09, 2004 at 06:54:09PM -0500, Mukker, Atul wrote:
> All,
>
> The megaraid driver version 2.10.1 is released and can be downloaded from
> ftp://ftp.lsil.com/pub/linux-megaraid/drivers/version-2.10.1/
>
> Following other components are also available at this location:
> i. Patches for Red Hat and SuSE stock kernels

Can't find patches for mainline anywhere. Also it's usually a good
idea to send the _patches_ to lkml for review.

I've diffed the driver against the 2.4 megaraid2 driver and it looks
mostly sane, the 2.6 version OTOH copletly backs out the changes that
went into the driver from outside LSI. Please try to port the changes
you made to the driver in 2.6.1.

2004-01-13 21:41:38

by Mukker, Atul

[permalink] [raw]
Subject: RE: ANNOUNCE: megaraid driver version 2.10.1

> > The megaraid driver version 2.10.1 is released and can be
> downloaded from
> > ftp://ftp.lsil.com/pub/linux-megaraid/drivers/version-2.10.1/
> >
> > Following other components are also available at this location:
> > i. Patches for Red Hat and SuSE stock kernels
>
> Can't find patches for mainline anywhere. Also it's usually a good
> idea to send the _patches_ to lkml for review.
I have inlined the patch for driver against kernel 2.4.24 version driver. It
is also available at
ftp://ftp.lsil.com/pub/linux-megaraid/drivers/version-2.10.1/megaraid-linux-
2.4.24-megaraid-2.10.1.patch

Marcelo:
Please update your tree with the latest megaraid 2.10.1 using this patch

>
> I've diffed the driver against the 2.4 megaraid2 driver and it looks
> mostly sane, the 2.6 version OTOH copletly backs out the changes that
> went into the driver from outside LSI. Please try to port the changes
> you made to the driver in 2.6.1.
>
The changes in 2.6.1 are rather extensive, so it would be sometime before
kernel 2.6.1 version of megaraid is sync'ed against megaraid-2.10.1. Also,
we would like to backport the PCI hotplug changes to 2.4.x kernel megaraid
as well.

diff -Naur megaraid-linux-2.4.24/changelog.megaraid2
megaraid-2.10.1/changelog.megaraid2
--- megaraid-linux-2.4.24/changelog.megaraid2 2004-01-13
17:22:25.000000000 -0500
+++ megaraid-2.10.1/changelog.megaraid2 2004-01-13 17:22:57.000000000 -0500
@@ -1,3 +1,31 @@
+### Version 2.10.1
+Wed Dec 3 15:34:42 EST 2003 - Atul Mukker <[email protected]>
+1. pci_dma_sync_sg(), 2nd argument is pointer to scatter-gather list.
All
+ previous drivers have a pointer which is incremented beyond the end
of
+ the scatter-gather list
+2. Remove 'ipdev', pci device pointer, to allocate memory for internal
+ commands. pci_alloc_consistent() guaranteed to allocate memory below
+ 4GB, which is a requirement for these commands -
+ Tom Coughlan <[email protected]>
+3. Added support for LSI SATA PCI-X controllers
+4. Advanced Server 3.0 version of the driver is the reference driver
now.
+ For all other kernels, we create patches.
+5. Removed superfluous white spaces.
+6. Corrected some comments
+
+### Version 2.10.0
+Tue Nov 4 14:33:43 EST 2003 - Atul Mukker <[email protected]>
+1. Added vendor ids and device ids for PCI-Express controllers,
+ PERC4E/Si, PERC4E/Di, PERC4E/DC, PERC4E/SC
+2. Backport some minor changes from 2.6 kernel version of the driver.
+
+### Version 2.00.9a
+Fri Oct 3 18:04:29 EDT 2003 - Atul Mukker <[email protected]>
+1. Minor changes which are brough in when sync'ing with kernel
2.9-test6.
+2. Use sizeof(mbox_t) in synchronous routines instead of hard-coded
value
+ of 16 bytes.
+3. De-couple adapter->host->pci_dev. Replace with adapter->pdev
+
### Version 2.00.9
Thu Sep 4 17:49:42 EDT 2003 - Atul Mukker <[email protected]>
i. For extended passthru commands, 64-bit scatter-gather list and
64-bit
diff -Naur megaraid-linux-2.4.24/megaraid2.c megaraid-2.10.1/megaraid2.c
--- megaraid-linux-2.4.24/megaraid2.c 2004-01-13 15:57:56.000000000 -0500
+++ megaraid-2.10.1/megaraid2.c 2004-01-13 17:17:52.000000000 -0500
@@ -14,7 +14,7 @@
* - speed-ups (list handling fixes, issued_list, optimizations.)
* - lots of cleanups.
*
- * Version : v2.00.9 (Sep 04, 2003) - Atul Mukker <[email protected]>
+ * Version : v2.10.1 (Dec 03, 2003) - Atul Mukker <[email protected]>
*
* Description: Linux device driver for LSI Logic MegaRAID controller
*
@@ -102,7 +102,7 @@
static struct mcontroller mcontroller[MAX_CONTROLLERS];

/* The current driver version */
-static u32 driver_ver = 0x02000000;
+static u32 driver_ver = 0x02100000;

/* major number used by the device for character interface */
static int major;
@@ -142,6 +142,7 @@
* products. All of them share the same vendor id, device id, and subsystem
* vendor id but different subsystem ids. As of now, driver does not use
the
* subsystem id.
+ * PERC4E device ids are for the PCI-Express controllers
*/
static int
megaraid_detect(Scsi_Host_Template *host_template)
@@ -150,13 +151,16 @@
u16 dev_sw_table[] = { /* Table of all supported
vendor/device ids */

- PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DISCOVERY,
- PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_PERC4_DI,
- PCI_VENDOR_ID_LSI_LOGIC,
PCI_DEVICE_ID_PERC4_QC_VERDE,
- PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID,
- PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID2,

- PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID3,

- PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_AMI_MEGARAID3,

+ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SATA_PCIX,
+ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_PERC4E_DC_SC,
+ PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_PERC4E_SI_DI,
+ PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DISCOVERY,
+ PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_PERC4_DI,
+ PCI_VENDOR_ID_LSI_LOGIC,
PCI_DEVICE_ID_PERC4_QC_VERDE,
+ PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID,
+ PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID2,
+ PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID3,
+ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_AMI_MEGARAID3,
PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_AMI_MEGARAID3
};


@@ -246,7 +250,6 @@
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;
@@ -261,7 +264,6 @@
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;
@@ -277,9 +279,15 @@
* valid and 64 bit is implicit
*/
if( (pci_vendor == PCI_VENDOR_ID_DELL &&
- pci_device == PCI_DEVICE_ID_PERC4_DI) ||
+ pci_device == PCI_DEVICE_ID_PERC4_DI) ||
(pci_vendor == PCI_VENDOR_ID_LSI_LOGIC &&
- pci_device == PCI_DEVICE_ID_PERC4_QC_VERDE) ) {
+ pci_device == PCI_DEVICE_ID_PERC4_QC_VERDE)
||
+ (pci_vendor == PCI_VENDOR_ID_LSI_LOGIC &&
+ pci_device == PCI_DEVICE_ID_PERC4E_DC_SC) ||
+ (pci_vendor == PCI_VENDOR_ID_DELL &&
+ pci_device == PCI_DEVICE_ID_PERC4E_SI_DI) ||
+ (pci_vendor == PCI_VENDOR_ID_LSI_LOGIC &&
+ pci_device == PCI_DEVICE_ID_LSI_SATA_PCIX))
{

flag |= BOARD_64BIT;
}
@@ -367,21 +375,6 @@
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);
@@ -395,10 +388,24 @@
adapter->flag = flag;
spin_lock_init(&adapter->lock);

- // replace adapter->lock with io_request_lock for kernels
w/o
- // per host lock and delete the line which tries to
initialize
- // the lock in host structure.
+#ifdef SCSI_HAS_HOST_LOCK
+# if LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,9)
+ /* This is the Red Hat AS2.1 kernel */
+ adapter->host_lock = &adapter->lock;
+ host->lock = adapter->host_lock;
+# elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+ /* This is the later Red Hat 2.4 kernels */
+ adapter->host_lock = &adapter->lock;
+ host->host_lock = adapter->host_lock;
+# else
+ /* This is the 2.6 and later kernel series */
+ adapter->host_lock = &adapter->lock;
+ scsi_set_host_lock(&adapter->lock);
+# endif
+#else
+ /* And this is the remainder of the 2.4 kernel series */
adapter->host_lock = &io_request_lock;
+#endif

host->cmd_per_lun = max_cmd_per_lun;
host->max_sectors = max_sectors_per_io;
@@ -613,14 +620,14 @@

/* Set the Mode of addressing to 64 bit if we can */
if((adapter->flag & BOARD_64BIT)&&(sizeof(dma_addr_t) == 8))
{
- pci_set_dma_mask(pdev, 0xffffffffffffffff);
+ pci_set_dma_mask(pdev, 0xffffffffffffffffULL);
adapter->has_64bit_addr = 1;
}
else {
pci_set_dma_mask(pdev, 0xffffffff);
adapter->has_64bit_addr = 0;
}
-
+
init_MUTEX(&adapter->int_mtx);
init_waitqueue_head(&adapter->int_waitq);

@@ -669,8 +676,6 @@
adapter->buf_dma_handle);
}

- if( got_ipdev_f ) kfree(adapter->ipdev);
-
if( did_scsi_reg_f ) scsi_unregister(host);

if( did_ioremap_f ) {
@@ -701,7 +706,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) &
@@ -754,7 +759,7 @@
{
dma_addr_t prod_info_dma_handle;
mega_inquiry3 *inquiry3;
- u8 raw_mbox[16];
+ u8 raw_mbox[sizeof(mbox_t)];
mbox_t *mbox;
int retval;

@@ -763,7 +768,7 @@
mbox = (mbox_t *)raw_mbox;

memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
- memset(mbox, 0, 16);
+ memset(raw_mbox, 0, sizeof(raw_mbox));

/*
* Try to issue Inquiry3 command
@@ -1695,21 +1700,22 @@
u8 status;
int i;

- raw_mbox[0x1] = 0xFE; /* Set cmdid */
- raw_mbox[0xF] = 1; /* Set busy */
-
/* 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, 16);
+ 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->xferaddr;
mbox64->xfer_segment_hi = 0;
mbox->xferaddr = 0xFFFFFFFF;
@@ -1989,6 +1995,7 @@
Scsi_Cmnd *cmd = NULL;
mega_passthru *pthru = NULL;
mbox_t *mbox = NULL;
+ int islogical;
u8 c;
scb_t *scb;
int cmdid;
@@ -2072,9 +2079,10 @@
#if MEGA_HAVE_STATS
{

- int islogical =
adapter->logdrv_chan[cmd->channel];
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
@@ -2110,23 +2118,21 @@
* hard disk and not logical, request should return failure!
-
* PJ
*/
- if(cmd->cmnd[0] == INQUIRY) {
- int islogical = adapter->logdrv_chan[cmd->channel];
+ islogical = adapter->logdrv_chan[cmd->channel];
+ if (cmd->cmnd[0] == INQUIRY && !islogical) {

- if(!islogical) {
- if( cmd->use_sg ) {
- sgl = (struct scatterlist *)
- cmd->request_buffer;
- c = *(u8 *)sgl[0].address;
- }
- else {
- c = *(u8 *)cmd->request_buffer;
- }
+ if( cmd->use_sg ) {
+ sgl = (struct scatterlist *)
+ cmd->request_buffer;
+ c = *(u8 *)sgl[0].address;
+ }
+ else {
+ c = *(u8 *)cmd->request_buffer;
+ }

- if(IS_RAID_CH(adapter, cmd->channel) &&
- ((c & 0x1F ) == TYPE_DISK))
{
- status = 0xF0;
- }
+ if(IS_RAID_CH(adapter, cmd->channel) &&
+ ((c & 0x1F ) == TYPE_DISK)) {
+ status = 0xF0;
}
}

@@ -2243,12 +2249,11 @@
break;

case MEGA_BULK_DATA:
- pci_unmap_page(adapter->host->pci_dev, scb->dma_h_bulkdata,
+ pci_unmap_page(adapter->dev, scb->dma_h_bulkdata,
scb->cmd->request_bufflen, scb->dma_direction);

if( scb->dma_direction == PCI_DMA_FROMDEVICE ) {
- pci_dma_sync_single(adapter->host->pci_dev,
- scb->dma_h_bulkdata,
+ pci_dma_sync_single(adapter->dev,
scb->dma_h_bulkdata,
scb->cmd->request_bufflen,
PCI_DMA_FROMDEVICE);
}
@@ -2256,12 +2261,11 @@
break;

case MEGA_SGLIST:
- pci_unmap_sg(adapter->host->pci_dev,
scb->cmd->request_buffer,
+ pci_unmap_sg(adapter->dev, scb->cmd->request_buffer,
scb->cmd->use_sg, scb->dma_direction);

if( scb->dma_direction == PCI_DMA_FROMDEVICE ) {
- pci_dma_sync_sg(adapter->host->pci_dev,
- scb->cmd->request_buffer,
+ pci_dma_sync_sg(adapter->dev,
scb->cmd->request_buffer,
scb->cmd->use_sg,
PCI_DMA_FROMDEVICE);
}

@@ -2332,8 +2336,7 @@

offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK);

- scb->dma_h_bulkdata = pci_map_page(adapter->host->pci_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;
@@ -2355,7 +2358,7 @@
}

if( scb->dma_direction == PCI_DMA_TODEVICE ) {
- pci_dma_sync_single(adapter->host->pci_dev,
+ pci_dma_sync_single(adapter->dev,
scb->dma_h_bulkdata,
cmd->request_bufflen,
PCI_DMA_TODEVICE);
@@ -2371,8 +2374,7 @@
*
* The number of sg elements returned must not exceed our limit
*/
- sgcnt = pci_map_sg(adapter->host->pci_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;

@@ -2400,8 +2402,8 @@
*len = (u32)cmd->request_bufflen;

if( scb->dma_direction == PCI_DMA_TODEVICE ) {
- pci_dma_sync_sg(adapter->host->pci_dev, cmd->request_buffer,
cmd->use_sg,
- PCI_DMA_TODEVICE);
+ pci_dma_sync_sg(adapter->dev, cmd->request_buffer,
+ cmd->use_sg, PCI_DMA_TODEVICE);
}

/* Return count of SG requests */
@@ -2458,7 +2460,7 @@
{
adapter_t *adapter;
mbox_t *mbox;
- u_char raw_mbox[16];
+ u_char raw_mbox[sizeof(mbox_t)];
#ifdef CONFIG_PROC_FS
char buf[12] = { 0 };
#endif
@@ -2469,7 +2471,7 @@
printk(KERN_NOTICE "megaraid: being unloaded...");

/* Flush adapter cache */
- memset(mbox, 0, 16);
+ memset(raw_mbox, 0, sizeof(raw_mbox));
raw_mbox[0] = FLUSH_ADAPTER;

irq_disable(adapter);
@@ -2479,7 +2481,7 @@
issue_scb_block(adapter, raw_mbox);

/* Flush disks cache */
- memset(mbox, 0, 16);
+ memset(raw_mbox, 0, sizeof(raw_mbox));
raw_mbox[0] = FLUSH_SYSTEM;

/* Issue a blocking (interrupts disabled) command to the card */
@@ -2540,8 +2542,6 @@
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 ) {
@@ -2723,7 +2723,7 @@
*/
if( !(iter % 1000) ) {
printk(
- "megarid: Waiting for %d commands to flush:
iter:%ld\n",
+ "megaraid: Waiting for %d commands to flush:
iter:%ld\n",
atomic_read(&adapter->pend_cmds), iter);
}

@@ -2742,7 +2742,7 @@

if( rval == SUCCESS ) {
printk(KERN_INFO
- "megaraid: abort sequence successfully
complete.\n");
+ "megaraid: abort sequence successfully
completed.\n");
}

return rval;
@@ -2803,7 +2803,7 @@
*/
if( !(iter % 1000) ) {
printk(
- "megarid: Waiting for %d commands to flush:
iter:%ld\n",
+ "megaraid: Waiting for %d commands to flush:
iter:%ld\n",
atomic_read(&adapter->pend_cmds), iter);
}

@@ -2822,7 +2822,7 @@

if( rval == SUCCESS ) {
printk(KERN_INFO
- "megaraid: reset sequence successfully
complete.\n");
+ "megaraid: reset sequence successfully
completed.\n");
}

return rval;
@@ -2953,7 +2953,7 @@
len += sprintf(page+len, "Base = %08lx, Irq = %d, ", adapter->base,
adapter->host->irq);

- len += sprintf(page+len, "Logical Drives = %d, Channels = %d\n",
+ len += sprintf(page+len, "Initial Logical Drives = %d, Channels =
%d\n",
adapter->numldrv, adapter->product_info.nchannels);

len += sprintf(page+len, "Version =%s:%s, DRAM = %dMb\n",
@@ -3109,7 +3109,7 @@
struct pci_dev *pdev;
int len = 0;

- pdev = adapter->ipdev;
+ pdev = adapter->dev;

if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) {
*eof = 1;
@@ -3171,7 +3171,7 @@
char str[256];
int len = 0;

- pdev = adapter->ipdev;
+ pdev = adapter->dev;

if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) {
*eof = 1;
@@ -3209,22 +3209,22 @@

if(battery_status & MEGA_BATT_MODULE_MISSING)
strcat(str, " Module Missing");
-
+
if(battery_status & MEGA_BATT_LOW_VOLTAGE)
strcat(str, " Low Voltage");
-
+
if(battery_status & MEGA_BATT_TEMP_HIGH)
strcat(str, " Temperature High");
-
+
if(battery_status & MEGA_BATT_PACK_MISSING)
strcat(str, " Pack Missing");
-
+
if(battery_status & MEGA_BATT_CHARGE_INPROG)
strcat(str, " Charge In-progress");
-
+
if(battery_status & MEGA_BATT_CHARGE_FAIL)
strcat(str, " Charge Fail");
-
+
if(battery_status & MEGA_BATT_CYCLES_EXCEEDED)
strcat(str, " Cycles Exceeded");

@@ -3354,7 +3354,7 @@
char str[80];
int i;

- pdev = adapter->ipdev;
+ pdev = adapter->dev;

if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) {
return len;
@@ -3403,32 +3403,27 @@
switch( state & 0x0F ) {

case PDRV_ONLINE:
- sprintf(str,
- "Channel:%2d Id:%2d State: Online",
+ sprintf(str, "Channel:%2d Id:%2d State: Online",
channel, tgt);
break;

case PDRV_FAILED:
- sprintf(str,
- "Channel:%2d Id:%2d State: Failed",
+ sprintf(str, "Channel:%2d Id:%2d State: Failed",
channel, tgt);
break;

case PDRV_RBLD:
- sprintf(str,
- "Channel:%2d Id:%2d State: Rebuild",
+ sprintf(str, "Channel:%2d Id:%2d State: Rebuild",
channel, tgt);
break;

case PDRV_HOTSPARE:
- sprintf(str,
- "Channel:%2d Id:%2d State: Hot spare",
+ sprintf(str, "Channel:%2d Id:%2d State: Hot spare",
channel, tgt);
break;

default:
- sprintf(str,
- "Channel:%2d Id:%2d State: Un-configured",
+ sprintf(str, "Channel:%2d Id:%2d State:
Un-configured",
channel, tgt);
break;

@@ -3543,7 +3538,7 @@
* @eof - set if no more data needs to be returned
* @data - pointer to our soft state
*
- * Display real time information about the logical drives 0 through 9.
+ * Display real time information about the logical drives 10 through 19.
*/
static int
proc_rdrv_20(char *page, char **start, off_t offset, int count, int *eof,
@@ -3566,7 +3561,7 @@
* @eof - set if no more data needs to be returned
* @data - pointer to our soft state
*
- * Display real time information about the logical drives 0 through 9.
+ * Display real time information about the logical drives 20 through 29.
*/
static int
proc_rdrv_30(char *page, char **start, off_t offset, int count, int *eof,
@@ -3589,7 +3584,7 @@
* @eof - set if no more data needs to be returned
* @data - pointer to our soft state
*
- * Display real time information about the logical drives 0 through 9.
+ * Display real time information about the logical drives 30 through 39.
*/
static int
proc_rdrv_40(char *page, char **start, off_t offset, int count, int *eof,
@@ -3614,7 +3609,7 @@
* /proc/scsi/scsi interface
*/
static int
-proc_rdrv(adapter_t *adapter, char *page, int start, int end )
+proc_rdrv(adapter_t *adapter, char *page, int start, int end)
{
dma_addr_t dma_handle;
logdrv_param *lparam;
@@ -3630,7 +3625,7 @@
int i;
u8 span8_flag = 1;

- pdev = adapter->ipdev;
+ pdev = adapter->dev;

if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) {
return len;
@@ -3650,7 +3645,7 @@
memset(&mc, 0, sizeof(megacmd_t));

if( adapter->flag & BOARD_40LD ) {
-
+
array_sz = sizeof(disk_array_40ld);

rdrv_state = ((mega_inquiry3 *)inquiry)->ldrv_state;
@@ -3747,7 +3742,7 @@
else {
lparam = (logdrv_param*)
&((diskarray_span4_t*)
(disk_array))->log_drv[i];
- }
+ }
}

/*
@@ -3792,7 +3787,7 @@
len += sprintf(page+len,
", initialization in progress");
}
-
+
len += sprintf(page+len, "\n");

len += sprintf(page+len, "Span depth:%3d, ",
@@ -3966,7 +3961,7 @@

if (blksize_size[ma])
block = blksize_size[ma][mi];
-
+
if (!(bh = bread(MKDEV(ma,mi), 0, block)))
return -1;

@@ -4026,7 +4021,7 @@
{
adapter_t *adapter;
struct Scsi_Host *host;
- u8 raw_mbox[16];
+ u8 raw_mbox[sizeof(mbox_t)];
mbox_t *mbox;
int i;

@@ -4042,7 +4037,7 @@
mbox = (mbox_t *)raw_mbox;

/* Flush adapter cache */
- memset(mbox, 0, 16);
+ memset(raw_mbox, 0, sizeof(raw_mbox));
raw_mbox[0] = FLUSH_ADAPTER;

irq_disable(adapter);
@@ -4055,7 +4050,7 @@
issue_scb_block(adapter, raw_mbox);

/* Flush disks cache */
- memset(mbox, 0, 16);
+ memset(raw_mbox, 0, sizeof(raw_mbox));
raw_mbox[0] = FLUSH_SYSTEM;

issue_scb_block(adapter, raw_mbox);
@@ -4374,7 +4369,7 @@
* For all internal commands, the buffer must be allocated
in
* <4GB address range
*/
- pdev = adapter->ipdev;
+ pdev = adapter->dev;

/* Is it a passthru command or a DCMD */
if( uioc.uioc_rmbox[0] == MEGA_MBOXCMD_PASSTHRU ) {
@@ -4786,13 +4781,13 @@
static int
mega_is_bios_enabled(adapter_t *adapter)
{
- unsigned char raw_mbox[16];
+ unsigned char raw_mbox[sizeof(mbox_t)];
mbox_t *mbox;
int ret;

mbox = (mbox_t *)raw_mbox;

- memset(mbox, 0, 16);
+ memset(raw_mbox, 0, sizeof(raw_mbox));

memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);

@@ -4819,13 +4814,13 @@
static void
mega_enum_raid_scsi(adapter_t *adapter)
{
- unsigned char raw_mbox[16];
+ unsigned char raw_mbox[sizeof(mbox_t)];
mbox_t *mbox;
int i;

mbox = (mbox_t *)raw_mbox;

- memset(mbox, 0, 16);
+ memset(raw_mbox, 0, sizeof(raw_mbox));

/*
* issue command to find out what channels are raid/scsi
@@ -4848,7 +4843,7 @@

}

- for( i = 0; i < adapter->product_info.nchannels; i++ ) {
+ for( i = 0; i < adapter->product_info.nchannels; i++ ) {
if( (adapter->mega_ch_class >> i) & 0x01 ) {
printk(KERN_INFO "megaraid: channel[%d] is raid.\n",
i);
@@ -4874,7 +4869,7 @@
mega_get_boot_drv(adapter_t *adapter)
{
struct private_bios_data *prv_bios_data;
- unsigned char raw_mbox[16];
+ unsigned char raw_mbox[sizeof(mbox_t)];
mbox_t *mbox;
u16 cksum = 0;
u8 *cksum_p;
@@ -4883,7 +4878,7 @@

mbox = (mbox_t *)raw_mbox;

- memset(mbox, 0, sizeof(raw_mbox));
+ memset(raw_mbox, 0, sizeof(raw_mbox));

raw_mbox[0] = BIOS_PVT_DATA;
raw_mbox[2] = GET_BIOS_PVT_DATA;
@@ -4940,13 +4935,13 @@
static int
mega_support_random_del(adapter_t *adapter)
{
- unsigned char raw_mbox[16];
+ unsigned char raw_mbox[sizeof(mbox_t)];
mbox_t *mbox;
int rval;

mbox = (mbox_t *)raw_mbox;

- memset(mbox, 0, 16);
+ memset(raw_mbox, 0, sizeof(raw_mbox));

/*
* issue command
@@ -4969,13 +4964,13 @@
static int
mega_support_ext_cdb(adapter_t *adapter)
{
- unsigned char raw_mbox[16];
+ unsigned char raw_mbox[sizeof(mbox_t)];
mbox_t *mbox;
int rval;

mbox = (mbox_t *)raw_mbox;

- memset(mbox, 0, 16);
+ memset(raw_mbox, 0, sizeof(raw_mbox));
/*
* issue command to find out if controller supports extended CDBs.
*/
@@ -5053,7 +5048,9 @@
mega_do_del_logdrv(adapter_t *adapter, int logdrv)
{
int rval;
- u8 raw_mbox[16];
+ u8 raw_mbox[sizeof(mbox_t)];
+
+ memset(raw_mbox, 0, sizeof(raw_mbox));

raw_mbox[0] = FC_DEL_LOGDRV;
raw_mbox[2] = OP_DEL_LOGDRV;
@@ -5088,12 +5085,12 @@
static void
mega_get_max_sgl(adapter_t *adapter)
{
- unsigned char raw_mbox[16];
+ 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);

@@ -5111,7 +5108,7 @@
}
else {
adapter->sglen = *((char *)adapter->mega_buffer);
-
+
/*
* Make sure this is not more than the resources we are
* planning to allocate
@@ -5133,12 +5130,12 @@
static int
mega_support_cluster(adapter_t *adapter)
{
- unsigned char raw_mbox[16];
+ 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);

@@ -5183,7 +5180,7 @@
int ldrv_num;

tgt = cmd->target;
-
+
if ( tgt > adapter->this_id )
tgt--; /* we do not get inquires for initiator id */

@@ -5485,7 +5482,7 @@
* For all internal commands, the buffer must be allocated in <4GB
* address range
*/
- pdev = adapter->ipdev;
+ pdev = adapter->dev;

pthru = pci_alloc_consistent(pdev, sizeof(mega_passthru),
&pthru_dma_handle);
diff -Naur megaraid-linux-2.4.24/megaraid2.h megaraid-2.10.1/megaraid2.h
--- megaraid-linux-2.4.24/megaraid2.h 2004-01-13 15:57:56.000000000 -0500
+++ megaraid-2.10.1/megaraid2.h 2004-01-13 17:26:38.000000000 -0500
@@ -6,7 +6,7 @@


#define MEGARAID_VERSION \
- "v2.00.9 (Release Date: Thu Sep 4 17:49:42 EDT 2003)\n"
+ "v2.10.1 (Release Date: Wed Dec 3 15:34:42 EST 2003)\n"

/*
* Driver features - change the values to enable or disable features in the
@@ -77,6 +77,9 @@
#define PCI_DEVICE_ID_DISCOVERY 0x000E
#define PCI_DEVICE_ID_PERC4_DI 0x000F
#define PCI_DEVICE_ID_PERC4_QC_VERDE 0x0407
+#define PCI_DEVICE_ID_PERC4E_SI_DI 0x0013
+#define PCI_DEVICE_ID_PERC4E_DC_SC 0x0408
+#define PCI_DEVICE_ID_LSI_SATA_PCIX 0x0409

/* Sub-System Vendor IDs */
#define AMI_SUBSYS_VID 0x101E
@@ -520,10 +523,10 @@

typedef struct {
unsigned char channel;
- unsigned char target;
+ unsigned char target;
}__attribute__ ((packed)) device_t;

-typedef struct {
+typedef struct {
unsigned long start_blk;
unsigned long total_blks;
device_t device[ MAX_STRIPES ];
@@ -537,38 +540,38 @@
unsigned long size;
}__attribute__ ((packed)) phydrv_t;

-typedef struct {
+typedef struct {
unsigned char span_depth;
unsigned char raid;
- unsigned char read_ahead; /* 0=No rdahead,1=RDAHEAD,2=adaptive
*/
+ 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 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 {
+typedef struct {
unsigned char span_depth;
unsigned char raid;
- unsigned char read_ahead; /* 0=No rdahead,1=RDAHEAD,2=adaptive
*/
+ 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 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 {
+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 {
+typedef struct {
unsigned char no_log_drives;
unsigned char pad[3];
ld_span8_t log_drv[ MAX_LOGICAL_DRIVES_8LD ];
@@ -894,9 +897,7 @@
volatile mbox64_t *mbox64;/* ptr to 64-bit mailbox */
volatile mbox_t *mbox; /* ptr to standard mailbox */
dma_addr_t mbox_dma;
-
- struct pci_dev *dev;
- struct pci_dev *ipdev; /* for internal allocation */
+ struct pci_dev *dev;

struct list_head free_list;
struct list_head pending_list;

2004-01-14 09:25:30

by Christoph Hellwig

[permalink] [raw]
Subject: Re: ANNOUNCE: megaraid driver version 2.10.1

On Tue, Jan 13, 2004 at 04:39:12PM -0500, Mukker, Atul wrote:
> The changes in 2.6.1 are rather extensive, so it would be sometime before
> kernel 2.6.1 version of megaraid is sync'ed against megaraid-2.10.1. Also,
> we would like to backport the PCI hotplug changes to 2.4.x kernel megaraid
> as well.

The problem with backporting is that the 2.4 scsi layer is not hot-plug aware,
so while you can make the driver detect a newly inserted or removed HBA there's
no way to tell the SCSI midlayer.

> +#ifdef SCSI_HAS_HOST_LOCK
> +# if LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,9)
> + /* This is the Red Hat AS2.1 kernel */
> + adapter->host_lock = &adapter->lock;
> + host->lock = adapter->host_lock;
> +# elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
> + /* This is the later Red Hat 2.4 kernels */
> + adapter->host_lock = &adapter->lock;
> + host->host_lock = adapter->host_lock;
> +# else
> + /* This is the 2.6 and later kernel series */
> + adapter->host_lock = &adapter->lock;
> + scsi_set_host_lock(&adapter->lock);
> +# endif
> +#else
> + /* And this is the remainder of the 2.4 kernel series */
> adapter->host_lock = &io_request_lock;
> +#endif

This is horribly ugly, but not your faul. Any chance you could hide
it into some macro ala megaraid_set_host_lock(adapter, host).

Also note that in 2.6 scsi_set_host_lock should and could easily be avoided,
just let your adapter->host_lock point to host->host_lock.

> if((adapter->flag & BOARD_64BIT)&&(sizeof(dma_addr_t) == 8))
> {
> - pci_set_dma_mask(pdev, 0xffffffffffffffff);
> + pci_set_dma_mask(pdev, 0xffffffffffffffffULL);

This needs error return checking. Again this no regression from the previous
version, could you please fix it in the next update?

2004-01-30 15:03:25

by Mukker, Atul

[permalink] [raw]
Subject: RE: ANNOUNCE: megaraid driver version 2.10.1

Hello Christoph,

I am in process of testing the next version of the megaraid driver. I faced
an issue while doing the insmod-rmmod sequence. Your patch for PCI hotplug
does "pci_disable_device" when the driver is unloaded.

The insmod-rmmod-insmod fails the first time unless you do an explicit
pci_set_master at driver load time, since pci_enable_device does not seem to
enable bus mastering, which is disabled by pci_disable_device.

Even with pci_set_master, insmod stalls the CPU after about 2-3 hours of
insmod-rmmod sequence. So I took out the pci_disable_device altogether to
find out it takes only longer, about 9 hours, but CPU stalls at the exact
location again with a NMI watchdog. It happens when the driver issues the
first command to the FW, which is never received by it and driver gets stuck
in a forever cpu_relax loop waiting for the command to complete

After an hour or two I get "Unable to proc_mkdir in
scsi.c/build_proc_dir_entries", but that's another story.

The kernel is a genre of 2.4.21

Any ideas....

Thanks
-Atul Mukker
LSI Logic

> -----Original Message-----
> From: '[email protected]' [mailto:[email protected]]
> Sent: Wednesday, January 14, 2004 4:22 AM
> To: Mukker, Atul
> Cc: '[email protected]'; 'James Bottomley';
> '[email protected]'; [email protected];
> '[email protected]'; [email protected]
> Subject: Re: ANNOUNCE: megaraid driver version 2.10.1
>
>
> On Tue, Jan 13, 2004 at 04:39:12PM -0500, Mukker, Atul wrote:
> > The changes in 2.6.1 are rather extensive, so it would be
> sometime before
> > kernel 2.6.1 version of megaraid is sync'ed against
> megaraid-2.10.1. Also,
> > we would like to backport the PCI hotplug changes to 2.4.x
> kernel megaraid
> > as well.
>
> The problem with backporting is that the 2.4 scsi layer is
> not hot-plug aware,
> so while you can make the driver detect a newly inserted or
> removed HBA there's
> no way to tell the SCSI midlayer.
>
> > +#ifdef SCSI_HAS_HOST_LOCK
> > +# if LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,9)
> > + /* This is the Red Hat AS2.1 kernel */
> > + adapter->host_lock = &adapter->lock;
> > + host->lock = adapter->host_lock;
> > +# elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
> > + /* This is the later Red Hat 2.4 kernels */
> > + adapter->host_lock = &adapter->lock;
> > + host->host_lock = adapter->host_lock;
> > +# else
> > + /* This is the 2.6 and later kernel series */
> > + adapter->host_lock = &adapter->lock;
> > + scsi_set_host_lock(&adapter->lock);
> > +# endif
> > +#else
> > + /* And this is the remainder of the 2.4 kernel series */
> > adapter->host_lock = &io_request_lock;
> > +#endif
>
> This is horribly ugly, but not your faul. Any chance you could hide
> it into some macro ala megaraid_set_host_lock(adapter, host).
>
> Also note that in 2.6 scsi_set_host_lock should and could
> easily be avoided,
> just let your adapter->host_lock point to host->host_lock.
>
> > if((adapter->flag &
> BOARD_64BIT)&&(sizeof(dma_addr_t) == 8))
> > {
> > - pci_set_dma_mask(pdev, 0xffffffffffffffff);
> > + pci_set_dma_mask(pdev, 0xffffffffffffffffULL);
>
> This needs error return checking. Again this no regression
> from the previous
> version, could you please fix it in the next update?
>

2004-01-30 15:40:42

by Jeff Garzik

[permalink] [raw]
Subject: Re: ANNOUNCE: megaraid driver version 2.10.1

On Fri, Jan 30, 2004 at 10:03:00AM -0500, Mukker, Atul wrote:
> Hello Christoph,
>
> I am in process of testing the next version of the megaraid driver. I faced
> an issue while doing the insmod-rmmod sequence. Your patch for PCI hotplug
> does "pci_disable_device" when the driver is unloaded.
>
> The insmod-rmmod-insmod fails the first time unless you do an explicit
> pci_set_master at driver load time, since pci_enable_device does not seem to
> enable bus mastering, which is disabled by pci_disable_device.

If your driver does DMA, but does not call pci_set_master(), that is a bug.

Jeff