[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