[PATCH 12/24][RFC] 53c700: Use scsi_eh API for REQUEST_SENSE invocation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



  - Use scsi_eh_prep/restor_cmnd() for synchronous
    REQUEST_SENSE invocation.
  - Refactor some code that is now commonly used in 2
    places.

Signed-off-by: Boaz Harrosh <bharrosh@xxxxxxxxxxx>
---
 drivers/scsi/53c700.c |  134 +++++++++++++++++--------------------------------
 drivers/scsi/53c700.h |   20 +++-----
 2 files changed, 54 insertions(+), 100 deletions(-)

diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c
index f5a9add..9b5c8d1 100644
--- a/drivers/scsi/53c700.c
+++ b/drivers/scsi/53c700.c
@@ -336,6 +336,8 @@ NCR_700_detect(struct scsi_host_template *tpnt,
 	if(tpnt->proc_name == NULL)
 		tpnt->proc_name = "53c700";
 
+	tpnt->sense_buffsize = SCSI_SENSE_BUFFERSIZE;
+
 	host = scsi_host_alloc(tpnt, 4);
 	if (!host)
 		return NULL;
@@ -578,6 +580,34 @@ save_for_reselection(struct NCR_700_Host_Parameters *hostdata,
 	hostdata->cmd = NULL;
 }
 
+STATIC void
+NCR_700_map(struct NCR_700_Host_Parameters *hostdata, struct scsi_cmnd *SCp,
+	      struct NCR_700_command_slot *slot, int move_ins)
+{
+	int i;
+	int sg_count;
+	struct scatterlist *sg;
+
+	sg_count = scsi_dma_map(SCp);
+	BUG_ON(sg_count < 0);
+
+	scsi_for_each_sg(SCp, sg, sg_count, i) {
+		dma_addr_t vPtr = sg_dma_address(sg);
+		__u32 count = sg_dma_len(sg);
+
+		slot->SG[i].ins = bS_to_host(move_ins | count);
+		DEBUG((" scatter block %d: move %d[%08x] from 0x%lx\n",
+		       i, count, slot->SG[i].ins, (unsigned long)vPtr));
+		slot->SG[i].pAddr = bS_to_host(vPtr);
+	}
+	slot->SG[i].ins = bS_to_host(SCRIPT_RETURN);
+	slot->SG[i].pAddr = 0;
+	dma_cache_sync(hostdata->dev, slot->SG, sizeof(slot->SG), DMA_TO_DEVICE);
+	DEBUG((" SETTING %08lx to %x\n",
+	       (&slot->pSG[i].ins),
+	       slot->SG[i].ins));
+}
+
 STATIC inline void
 NCR_700_unmap(struct NCR_700_Host_Parameters *hostdata, struct scsi_cmnd *SCp,
 	      struct NCR_700_command_slot *slot)
@@ -598,26 +628,18 @@ NCR_700_scsi_done(struct NCR_700_Host_Parameters *hostdata,
 		struct NCR_700_command_slot *slot = 
 			(struct NCR_700_command_slot *)SCp->host_scribble;
 		
-		dma_unmap_single(hostdata->dev, slot->pCmd,
-				 MAX_COMMAND_SIZE, DMA_TO_DEVICE);
+		NCR_700_unmap(hostdata, SCp, slot);
 		if (slot->flags == NCR_700_FLAG_AUTOSENSE) {
-			char *cmnd = NCR_700_get_sense_cmnd(SCp->device);
+			struct NCR_700_Device_Parameters *ndp =
+					NCR_700_Device_Parameters(SCp->device);
 #ifdef NCR_700_DEBUG
 			printk(" ORIGINAL CMD %p RETURNED %d, new return is %d sense is\n",
 			       SCp, SCp->cmnd[7], result);
 			scsi_print_sense("53c700", SCp);
 
 #endif
-			dma_unmap_single(hostdata->dev, slot->dma_handle,
-					 SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
-			/* restore the old result if the request sense was
-			 * successful */
-			if (result == 0)
-				result = cmnd[7];
-			/* restore the original length */
-			SCp->cmd_len = cmnd[8];
-		} else
-			NCR_700_unmap(hostdata, SCp, slot);
+			scsi_eh_restore_cmnd(SCp, &ndp->ses);
+		}
 
 		free_slot(slot, hostdata);
 #ifdef NCR_700_DEBUG
@@ -988,8 +1010,8 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
 					"broken device is looping in contingent allegiance: ignoring\n");
 				NCR_700_scsi_done(hostdata, SCp, hostdata->status[0]);
 			} else {
-				char *cmnd =
-					NCR_700_get_sense_cmnd(SCp->device);
+				struct NCR_700_Device_Parameters *ndp =
+					NCR_700_Device_Parameters(SCp->device);
 #ifdef NCR_DEBUG
 				scsi_print_command(SCp);
 				printk("  cmd %p has status %d, requesting sense\n",
@@ -1007,32 +1029,14 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
 						 MAX_COMMAND_SIZE,
 						 DMA_TO_DEVICE);
 
-				cmnd[0] = REQUEST_SENSE;
-				cmnd[1] = (SCp->device->lun & 0x7) << 5;
-				cmnd[2] = 0;
-				cmnd[3] = 0;
-				cmnd[4] = SCSI_SENSE_BUFFERSIZE;
-				cmnd[5] = 0;
-				/* Here's a quiet hack: the
-				 * REQUEST_SENSE command is six bytes,
-				 * so store a flag indicating that
-				 * this was an internal sense request
-				 * and the original status at the end
-				 * of the command */
-				cmnd[6] = NCR_700_INTERNAL_SENSE_MAGIC;
-				cmnd[7] = hostdata->status[0];
-				cmnd[8] = SCp->cmd_len;
-				SCp->cmd_len = 6; /* command length for
-						   * REQUEST_SENSE */
-				slot->pCmd = dma_map_single(hostdata->dev, cmnd, MAX_COMMAND_SIZE, DMA_TO_DEVICE);
-				slot->dma_handle = dma_map_single(hostdata->dev, SCp->sense_buffer, SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
-				slot->SG[0].ins = bS_to_host(SCRIPT_MOVE_DATA_IN | SCSI_SENSE_BUFFERSIZE);
-				slot->SG[0].pAddr = bS_to_host(slot->dma_handle);
-				slot->SG[1].ins = bS_to_host(SCRIPT_RETURN);
-				slot->SG[1].pAddr = 0;
+				scsi_eh_prep_cmnd(SCp, &ndp->ses, NULL, 0, ~0);
+				NCR_700_map(hostdata, SCp, slot,
+							SCRIPT_MOVE_DATA_IN);
+				slot->pCmd = dma_map_single(
+					       hostdata->dev, SCp->cmnd,
+					       MAX_COMMAND_SIZE, DMA_TO_DEVICE);
+
 				slot->resume_offset = hostdata->pScript;
-				dma_cache_sync(hostdata->dev, slot->SG, sizeof(slot->SG[0])*2, DMA_TO_DEVICE);
-				dma_cache_sync(hostdata->dev, SCp->sense_buffer, SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
 
 				/* queue the command for reissue */
 				slot->state = NCR_700_SLOT_QUEUED;
@@ -1041,27 +1045,6 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
 				hostdata->cmd = NULL;
 			}
 		} else {
-			// Currently rely on the mid layer evaluation
-			// of the tag queuing capability
-			//
-			//if(status_byte(hostdata->status[0]) == GOOD &&
-			//   SCp->cmnd[0] == INQUIRY && SCp->use_sg == 0) {
-			//	/* Piggy back the tag queueing support
-			//	 * on this command */
-			//	dma_sync_single_for_cpu(hostdata->dev,
-			//			    slot->dma_handle,
-			//			    SCp->request_bufflen,
-			//			    DMA_FROM_DEVICE);
-			//	if(((char *)SCp->request_buffer)[7] & 0x02) {
-			//		scmd_printk(KERN_INFO, SCp,
-			//		     "Enabling Tag Command Queuing\n");
-			//		hostdata->tag_negotiated |= (1<<scmd_id(SCp));
-			//		NCR_700_set_flag(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING);
-			//	} else {
-			//		NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING);
-			//		hostdata->tag_negotiated &= ~(1<<scmd_id(SCp));
-			//	}
-			//}
 			NCR_700_scsi_done(hostdata, SCp, hostdata->status[0]);
 		}
 	} else if((dsps & 0xfffff0f0) == A_UNEXPECTED_PHASE) {
@@ -1873,32 +1856,9 @@ NCR_700_queuecommand(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *))
 
 	/* now build the scatter gather list */
 	direction = SCp->sc_data_direction;
-	if(move_ins != 0) {
-		int i;
-		int sg_count;
-		dma_addr_t vPtr = 0;
-		struct scatterlist *sg;
-		__u32 count = 0;
-
-		sg_count = scsi_dma_map(SCp);
-		BUG_ON(sg_count < 0);
-
-		scsi_for_each_sg(SCp, sg, sg_count, i) {
-			vPtr = sg_dma_address(sg);
-			count = sg_dma_len(sg);
-
-			slot->SG[i].ins = bS_to_host(move_ins | count);
-			DEBUG((" scatter block %d: move %d[%08x] from 0x%lx\n",
-			       i, count, slot->SG[i].ins, (unsigned long)vPtr));
-			slot->SG[i].pAddr = bS_to_host(vPtr);
-		}
-		slot->SG[i].ins = bS_to_host(SCRIPT_RETURN);
-		slot->SG[i].pAddr = 0;
-		dma_cache_sync(hostdata->dev, slot->SG, sizeof(slot->SG), DMA_TO_DEVICE);
-		DEBUG((" SETTING %08lx to %x\n",
-		       (&slot->pSG[i].ins),
-		       slot->SG[i].ins));
-	}
+	if (move_ins != 0)
+		NCR_700_map(hostdata, SCp, slot, move_ins);
+
 	slot->resume_offset = 0;
 	slot->pCmd = dma_map_single(hostdata->dev, SCp->cmnd,
 				    MAX_COMMAND_SIZE, DMA_TO_DEVICE);
diff --git a/drivers/scsi/53c700.h b/drivers/scsi/53c700.h
index e06bdfe..568105b 100644
--- a/drivers/scsi/53c700.h
+++ b/drivers/scsi/53c700.h
@@ -13,6 +13,7 @@
 
 #include <scsi/scsi_device.h>
 #include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_eh.h>
 
 /* Turn on for general debugging---too verbose for normal use */
 #undef	NCR_700_DEBUG
@@ -77,14 +78,10 @@ struct NCR_700_SG_List {
 };
 
 struct NCR_700_Device_Parameters {
-	/* space for creating a request sense command. Really, except
-	 * for the annoying SCSI-2 requirement for LUN information in
-	 * cmnd[1], this could be in static storage */
-	unsigned char cmnd[MAX_COMMAND_SIZE];
+	struct scsi_eh_save ses;
 	__u8	depth;
 };
 
-
 /* The SYNC negotiation sequence looks like:
  * 
  * If DEV_NEGOTIATED_SYNC not set, tack and SDTR message on to the
@@ -103,26 +100,23 @@ struct NCR_700_Device_Parameters {
 #define NCR_700_DEV_BEGIN_SYNC_NEGOTIATION	(1<<17)
 #define NCR_700_DEV_PRINT_SYNC_NEGOTIATION (1<<19)
 
-static inline char *NCR_700_get_sense_cmnd(struct scsi_device *SDp)
+static inline struct NCR_700_Device_Parameters *
+NCR_700_Device_Parameters(struct scsi_device *SDp)
 {
 	struct NCR_700_Device_Parameters *hostdata = SDp->hostdata;
 
-	return hostdata->cmnd;
+	return hostdata;
 }
 
 static inline void
 NCR_700_set_depth(struct scsi_device *SDp, __u8 depth)
 {
-	struct NCR_700_Device_Parameters *hostdata = SDp->hostdata;
-
-	hostdata->depth = depth;
+	NCR_700_Device_Parameters(SDp)->depth = depth;
 }
 static inline __u8
 NCR_700_get_depth(struct scsi_device *SDp)
 {
-	struct NCR_700_Device_Parameters *hostdata = SDp->hostdata;
-
-	return hostdata->depth;
+	return NCR_700_Device_Parameters(SDp)->depth;
 }
 static inline int
 NCR_700_is_flag_set(struct scsi_device *SDp, __u32 flag)
-- 
1.5.3.3

-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux