[prev in list] [next in list] [prev in thread] [next in thread]
List: linux-megaraid-devel
Subject: Re: [PATCH] megaraid 2 driver on 2.5.60
From: Mark Haverkamp <markh () osdl ! org>
Date: 2003-02-14 19:27:58
[Download RAW message or body]
On Fri, 2003-02-14 at 08:21, Mark Haverkamp wrote:
> The megaraid 2 driver in the
> http://mdomsch.bkbits.net:8080/linux-2.5-megaraid2 area doesn't compile
> under 2.5.60. I have enclosed a patch that gets it to run. I changed
> things in three areas.
>
> - fixed access of data elements such as host, channel, target, and lun
> that were previously in Scsi_Cmnd and are now in scsi_device. Also, using
> adapter->dev instead of adapter->host->pci_dev.
>
> - free_local_pdev was being called before mega_free_inquiry and
> pci_free_consistent sometimes. This didn't seem right.
>
> - in mega_internal_command, the adapter->int_scmd didn't have a valid device
> pointer. I allocated one. I'm not sure if was the correct way to fix this,
> but it is working.
>
>
> Mark.
I had the diff rooted at the wrong place for using patch in the
conventional way. Here is one diffed from the top of the kernel tree.
--
Mark Haverkamp <markh@osdl.org>
["megaraid2.diff" (megaraid2.diff)]
--- linux-2.5-megaraid2/drivers/scsi/megaraid2.c 2002-12-13 08:02:30.000000000 -0800
+++ linux-2.5-megaraid2/drivers/scsi/new_megaraid2.c 2003-02-14 07:24:56.000000000 -0800
@@ -310,13 +310,12 @@
if( pci_resource_flags(pdev, 0) & IORESOURCE_MEM ) {
- if( check_mem_region(mega_baseport, 128) ) {
+ if (!request_mem_region(mega_baseport, 128,
+ "MegaRAID: LSI Logic Corporation.")) {
printk(KERN_WARNING
"megaraid: mem region busy!\n");
continue;
}
- request_mem_region(mega_baseport, 128,
- "MegaRAID: LSI Logic Corporation.");
mega_baseport =
(unsigned long)ioremap(mega_baseport, 128);
@@ -894,7 +893,7 @@
scb_t *scb;
int busy=0;
- adapter = (adapter_t *)scmd->host->hostdata;
+ adapter = (adapter_t *)scmd->device->host->hostdata;
scmd->scsi_done = done;
@@ -968,7 +967,7 @@
/*
* We know what channels our logical drives are on - mega_find_card()
*/
- islogical = adapter->logdrv_chan[cmd->channel];
+ islogical = adapter->logdrv_chan[cmd->device->channel];
/*
* The theory: If physical drive is chosen for boot, all the physical
@@ -980,12 +979,13 @@
if( adapter->boot_pdrv_enabled ) {
if( islogical ) {
/* logical channel */
- channel = cmd->channel -
+ channel = cmd->device->channel -
adapter->product_info.nchannels;
}
else {
- channel = cmd->channel; /* this is physical channel */
- target = cmd->target;
+ /* this is physical channel */
+ channel = cmd->device->channel;
+ target = cmd->device->id;
/*
* boot from a physical disk, that disk needs to be
@@ -1002,13 +1002,13 @@
}
else {
if( islogical ) {
- channel = cmd->channel; /* this is the logical channel
- */
+ /* this is the logical channel */
+ channel = cmd->device->channel;
}
else {
- channel = cmd->channel - NVIRT_CHAN; /* physical
- channel */
- target = cmd->target;
+ /* physical channel */
+ channel = cmd->device->channel - NVIRT_CHAN;
+ target = cmd->device->id;
}
}
@@ -1016,7 +1016,7 @@
if(islogical) {
/* have just LUN 0 for each target on virtual channels */
- if (cmd->lun) {
+ if (cmd->device->lun) {
cmd->result = (DID_BAD_TARGET << 16);
cmd->scsi_done(cmd);
return NULL;
@@ -1043,7 +1043,7 @@
}
else {
- if( cmd->lun > 7) {
+ if( cmd->device->lun > 7) {
/*
* Do not support lun >7 for physically accessed
* devices
@@ -1105,15 +1105,15 @@
case READ_CAPACITY:
case INQUIRY:
- if(!(adapter->flag & (1L << cmd->channel))) {
+ if(!(adapter->flag & (1L << cmd->device->channel))) {
printk(KERN_NOTICE
"scsi%d: scanning scsi channel %d ",
adapter->host->host_no,
- cmd->channel);
+ cmd->device->channel);
printk("for logical drives.\n");
- adapter->flag |= (1L << cmd->channel);
+ adapter->flag |= (1L << cmd->device->channel);
}
/* Allocate a SCB and initialize passthru */
@@ -1415,7 +1415,7 @@
(channel << 4) | target : target;
pthru->cdblen = cmd->cmd_len;
- pthru->logdrv = cmd->lun;
+ pthru->logdrv = cmd->device->lun;
memcpy(pthru->cdb, cmd->cmnd, cmd->cmd_len);
@@ -1426,15 +1426,15 @@
switch (cmd->cmnd[0]) {
case INQUIRY:
case READ_CAPACITY:
- if(!(adapter->flag & (1L << cmd->channel))) {
+ if(!(adapter->flag & (1L << cmd->device->channel))) {
printk(KERN_NOTICE
"scsi%d: scanning scsi channel %d [P%d] ",
adapter->host->host_no,
- cmd->channel, channel);
+ cmd->device->channel, channel);
printk("for physical devices.\n");
- adapter->flag |= (1L << cmd->channel);
+ adapter->flag |= (1L << cmd->device->channel);
}
/* Fall through */
default:
@@ -1478,7 +1478,7 @@
(channel << 4) | target : target;
epthru->cdblen = cmd->cmd_len;
- epthru->logdrv = cmd->lun;
+ epthru->logdrv = cmd->device->lun;
memcpy(epthru->cdb, cmd->cmnd, cmd->cmd_len);
@@ -1488,15 +1488,15 @@
switch(cmd->cmnd[0]) {
case INQUIRY:
case READ_CAPACITY:
- if(!(adapter->flag & (1L << cmd->channel))) {
+ if(!(adapter->flag & (1L << cmd->device->channel))) {
printk(KERN_NOTICE
"scsi%d: scanning scsi channel %d [P%d] ",
adapter->host->host_no,
- cmd->channel, channel);
+ cmd->device->channel, channel);
printk("for physical devices.\n");
- adapter->flag |= (1L << cmd->channel);
+ adapter->flag |= (1L << cmd->device->channel);
}
/* Fall through */
default:
@@ -2017,7 +2017,7 @@
* PJ
*/
if(cmd->cmnd[0] == INQUIRY) {
- int islogical = adapter->logdrv_chan[cmd->channel];
+ int islogical = adapter->logdrv_chan[cmd->device->channel];
if(!islogical) {
if( cmd->use_sg ) {
@@ -2030,7 +2030,7 @@
memcpy(&c, cmd->request_buffer, 1);
}
- if(IS_RAID_CH(adapter, cmd->channel) &&
+ if(IS_RAID_CH(adapter, cmd->device->channel) &&
((c & 0x1F ) == TYPE_DISK)) {
status = 0xF0;
}
@@ -2168,11 +2168,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,
+ pci_dma_sync_single(adapter->dev,
scb->dma_h_bulkdata,
scb->cmd->request_bufflen,
PCI_DMA_FROMDEVICE);
@@ -2181,11 +2181,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,
+ pci_dma_sync_sg(adapter->dev,
scb->cmd->request_buffer,
scb->cmd->use_sg, PCI_DMA_FROMDEVICE);
}
@@ -2257,7 +2257,7 @@
offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK);
- scb->dma_h_bulkdata = pci_map_page(adapter->host->pci_dev,
+ scb->dma_h_bulkdata = pci_map_page(adapter->dev,
page, offset,
cmd->request_bufflen,
scb->dma_direction);
@@ -2280,7 +2280,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);
@@ -2296,7 +2296,7 @@
*
* The number of sg elements returned must not exceed our limit
*/
- sgcnt = pci_map_sg(adapter->host->pci_dev, sgl, cmd->use_sg,
+ sgcnt = pci_map_sg(adapter->dev, sgl, cmd->use_sg,
scb->dma_direction);
scb->dma_type = MEGA_SGLIST;
@@ -2325,7 +2325,7 @@
*len = (u32)cmd->request_bufflen;
if( scb->dma_direction == PCI_DMA_TODEVICE ) {
- pci_dma_sync_sg(adapter->host->pci_dev, sgl, cmd->use_sg,
+ pci_dma_sync_sg(adapter->dev, sgl, cmd->use_sg,
PCI_DMA_TODEVICE);
}
@@ -2605,7 +2605,7 @@
adapter_t *adapter;
int rval;
- adapter = (adapter_t *)cmd->host->hostdata;
+ adapter = (adapter_t *)cmd->device->host->hostdata;
rval = megaraid_abort_and_reset(adapter, cmd, SCB_ABORT);
@@ -2626,7 +2626,7 @@
megacmd_t mc;
int rval;
- adapter = (adapter_t *)cmd->host->hostdata;
+ adapter = (adapter_t *)cmd->device->host->hostdata;
#if MEGA_HAVE_CLUSTERING
mc.cmd = MEGA_CLUSTER_CMD;
@@ -2673,7 +2673,8 @@
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->channel, cmd->target, cmd->lun);
+ cmd->cmnd[0], cmd->device->channel,
+ cmd->device->id, cmd->device->lun);
if(list_empty(&adapter->pending_list))
return FALSE;
@@ -3031,10 +3032,10 @@
printk(KERN_WARNING "megaraid: inquiry failed.\n");
- free_local_pdev(pdev);
-
mega_free_inquiry(inquiry, dma_handle, pdev);
+ free_local_pdev(pdev);
+
*eof = 1;
return len;
@@ -3051,10 +3052,10 @@
}
- free_local_pdev(pdev);
-
mega_free_inquiry(inquiry, dma_handle, pdev);
+ free_local_pdev(pdev);
+
*eof = 1;
return len;
@@ -3101,10 +3102,10 @@
printk(KERN_WARNING "megaraid: inquiry failed.\n");
- free_local_pdev(pdev);
-
mega_free_inquiry(inquiry, dma_handle, pdev);
+ free_local_pdev(pdev);
+
*eof = 1;
return len;
@@ -3150,10 +3151,10 @@
len = sprintf(page, "%s\n", str);
- free_local_pdev(pdev);
-
mega_free_inquiry(inquiry, dma_handle, pdev);
+ free_local_pdev(pdev);
+
*eof = 1;
return len;
@@ -3290,10 +3291,10 @@
printk(KERN_WARNING "megaraid: inquiry failed.\n");
- free_local_pdev(pdev);
-
mega_free_inquiry(inquiry, dma_handle, pdev);
+ free_local_pdev(pdev);
+
return len;
}
@@ -3303,10 +3304,10 @@
if( scsi_inq == NULL ) {
len = sprintf(page, "memory not available for scsi inq.\n");
- free_local_pdev(pdev);
-
mega_free_inquiry(inquiry, dma_handle, pdev);
+ free_local_pdev(pdev);
+
return len;
}
@@ -3387,10 +3388,10 @@
pci_free_consistent(pdev, 256, scsi_inq, scsi_inq_dma_handle);
- free_local_pdev(pdev);
-
mega_free_inquiry(inquiry, dma_handle, pdev);
+ free_local_pdev(pdev);
+
return len;
}
@@ -3574,10 +3575,10 @@
printk(KERN_WARNING "megaraid: inquiry failed.\n");
- free_local_pdev(pdev);
-
mega_free_inquiry(inquiry, dma_handle, pdev);
+ free_local_pdev(pdev);
+
return len;
}
@@ -3606,10 +3607,10 @@
if( disk_array == NULL ) {
len = sprintf(page, "memory not available.\n");
- free_local_pdev(pdev);
-
mega_free_inquiry(inquiry, dma_handle, pdev);
+ free_local_pdev(pdev);
+
return len;
}
@@ -3623,13 +3624,13 @@
len = sprintf(page, "40LD read config failed.\n");
- free_local_pdev(pdev);
-
mega_free_inquiry(inquiry, dma_handle, pdev);
pci_free_consistent(pdev, array_sz, disk_array,
disk_array_dma_handle);
+ free_local_pdev(pdev);
+
return len;
}
@@ -3647,14 +3648,14 @@
len = sprintf(page,
"8LD read config failed.\n");
- free_local_pdev(pdev);
-
mega_free_inquiry(inquiry, dma_handle, pdev);
pci_free_consistent(pdev, array_sz,
disk_array,
disk_array_dma_handle);
+ free_local_pdev(pdev);
+
return len;
}
}
@@ -3774,13 +3775,13 @@
}
}
- free_local_pdev(pdev);
-
mega_free_inquiry(inquiry, dma_handle, pdev);
pci_free_consistent(pdev, array_sz, disk_array,
disk_array_dma_handle);
+ free_local_pdev(pdev);
+
return len;
}
@@ -5102,7 +5103,7 @@
int tgt;
int ldrv_num;
- tgt = cmd->target;
+ tgt = cmd->device->id;
if ( tgt > adapter->this_id )
tgt--; /* we do not get inquires for initiator id */
@@ -5294,6 +5295,7 @@
mega_passthru *pthru )
{
Scsi_Cmnd *scmd;
+ struct scsi_device *sdev;
unsigned long flags = 0;
scb_t *scb;
int rval;
@@ -5311,7 +5313,11 @@
scmd = &adapter->int_scmd;
memset(scmd, 0, sizeof(Scsi_Cmnd));
- scmd->host = adapter->host;
+ sdev = kmalloc(sizeof(struct scsi_device), GFP_KERNEL);
+ memset(sdev, 0, sizeof(struct scsi_device));
+ scmd->device = sdev;
+
+ scmd->device->host = adapter->host;
scmd->buffer = (void *)scb;
scmd->cmnd[0] = MEGA_INTERNAL_CMD;
@@ -5353,6 +5359,7 @@
rval = scmd->result;
mc->status = scmd->result;
+ kfree(sdev);
/*
* Print a debug message for all failed commands. Applications can use
@@ -5380,7 +5387,7 @@
{
adapter_t *adapter;
- adapter = (adapter_t *)scmd->host->hostdata;
+ adapter = (adapter_t *)scmd->device->host->hostdata;
scmd->state = 1; /* thread waiting for its command to complete */
_______________________________________________
Linux-megaraid-devel mailing list
Linux-megaraid-devel@dell.com
http://lists.us.dell.com/mailman/listinfo/linux-megaraid-devel
Please read the FAQ at http://lists.us.dell.com/faq or search the list archives at \
http://lists.us.dell.com/htdig/
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic