[PATCH 13/24][RFC] aic7xxx_old: Use scsi_eh API for REQUEST_SENSE invocation

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

 



  - Use scsi_eh_prep/restore_cmnd() for synchronous
    REQUEST_SENSE invocation.
  - Use new sense accessors where needed.

Signed-off-by: Boaz Harrosh <bharrosh@xxxxxxxxxxx>
---
 drivers/scsi/aic7xxx_old.c |   74 ++++++++++++-------------------------------
 1 files changed, 21 insertions(+), 53 deletions(-)

diff --git a/drivers/scsi/aic7xxx_old.c b/drivers/scsi/aic7xxx_old.c
index 3bfd929..520d46a 100644
--- a/drivers/scsi/aic7xxx_old.c
+++ b/drivers/scsi/aic7xxx_old.c
@@ -786,10 +786,7 @@ struct aic7xxx_scb {
 	struct hw_scatterlist	*sg_list;	/* SG list in adapter format */
 	unsigned char		tag_action;
 	unsigned char		sg_count;
-	unsigned char		*sense_cmd;	/*
-						 * Allocate 6 characters for
-						 * sense command.
-						 */
+	struct scsi_eh_save	ses;
 	unsigned char		*cmnd;
 	unsigned int		sg_length;	/*
 						 * We init this during
@@ -823,9 +820,6 @@ static struct {
   { CIOPARERR, "CIOBUS Parity Error" }
 };
 
-static unsigned char
-generic_sense[] = { REQUEST_SENSE, 0, 0, 0, 255, 0 };
-
 typedef struct {
   scb_queue_type free_scbs;        /*
                                     * SCBs assigned to free slot on
@@ -1277,6 +1271,8 @@ static void aic7xxx_print_sequencer(struct aic7xxx_host *p, int downloaded);
 #ifdef AIC7XXX_VERBOSE_DEBUGGING
 static void aic7xxx_check_scbs(struct aic7xxx_host *p, char *buffer);
 #endif
+static void aic7xxx_buildscb(struct aic7xxx_host *p, struct scsi_cmnd *cmd,
+			     struct aic7xxx_scb *scb);
 
 /****************************************************************************
  *
@@ -2528,7 +2524,7 @@ static int
 aic7xxx_allocate_scb(struct aic7xxx_host *p)
 {
   struct aic7xxx_scb   *scbp = NULL;
-  int scb_size = (sizeof (struct hw_scatterlist) * AIC7XXX_MAX_SG) + 12 + 6;
+  int scb_size = (sizeof(struct hw_scatterlist) * AIC7XXX_MAX_SG) + 12;
   int i;
   int step = PAGE_SIZE / 1024;
   unsigned long scb_count = 0;
@@ -2598,9 +2594,8 @@ aic7xxx_allocate_scb(struct aic7xxx_host *p)
       scbp = &scb_ap[i];
       scbp->hscb = &p->scb_data->hscbs[p->scb_data->numscbs];
       scbp->sg_list = &hsgp[i * AIC7XXX_MAX_SG];
-      scbp->sense_cmd = bufs;
-      scbp->cmnd = bufs + 6;
-      bufs += 12 + 6;
+      scbp->cmnd = bufs;
+      bufs += 12;
       scbp->scb_dma = scb_dma;
       memset(scbp->hscb, 0, sizeof(struct aic7xxx_hwscb));
       scbp->hscb->tag = p->scb_data->numscbs;
@@ -2694,10 +2689,7 @@ aic7xxx_done(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
 
   if (scb->flags & SCB_SENSE)
   {
-    pci_unmap_single(p->pdev,
-                     le32_to_cpu(scb->sg_list[0].address),
-                     SCSI_SENSE_BUFFERSIZE,
-                     PCI_DMA_FROMDEVICE);
+	scsi_eh_restore_cmnd(cmd, &scb->ses);
   }
   if (scb->flags & SCB_RECOVERY_SCB)
   {
@@ -2720,8 +2712,8 @@ aic7xxx_done(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
      * after failing to negotiate a wide or sync transfer message.
      */
     if ((scb->flags & SCB_SENSE) && 
-          ((scb->cmd->sense_buffer[12] == 0x43) ||  /* INVALID_MESSAGE */
-          (scb->cmd->sense_buffer[12] == 0x49))) /* MESSAGE_ERROR  */
+          ((scsi_sense(scb->cmd)[12] == 0x43) ||  /* INVALID_MESSAGE */
+          (scsi_sense(scb->cmd)[12] == 0x49))) /* MESSAGE_ERROR  */
     {
       message_error = TRUE;
     }
@@ -4263,18 +4255,8 @@ aic7xxx_handle_seqint(struct aic7xxx_host *p, unsigned char intstat)
                  * Send a sense command to the requesting target.
                  * XXX - revisit this and get rid of the memcopys.
                  */
-                memcpy(scb->sense_cmd, &generic_sense[0],
-                       sizeof(generic_sense));
-
-                scb->sense_cmd[1] = (cmd->device->lun << 5);
-                scb->sense_cmd[4] = SCSI_SENSE_BUFFERSIZE;
-
-                scb->sg_list[0].length = 
-                  cpu_to_le32(SCSI_SENSE_BUFFERSIZE);
-		scb->sg_list[0].address =
-                        cpu_to_le32(pci_map_single(p->pdev, cmd->sense_buffer,
-                                                   SCSI_SENSE_BUFFERSIZE,
-                                                   PCI_DMA_FROMDEVICE));
+		scsi_eh_prep_cmnd(cmd, &scb->ses, NULL, 0, ~0);
+		aic7xxx_buildscb(p, cmd, scb);
 
                 /*
                  * XXX - We should allow disconnection, but can't as it
@@ -4283,21 +4265,6 @@ aic7xxx_handle_seqint(struct aic7xxx_host *p, unsigned char intstat)
                 /* hscb->control &= DISCENB; */
                 hscb->control = 0;
                 hscb->target_status = 0;
-                hscb->SG_list_pointer = 
-		  cpu_to_le32(SCB_DMA_ADDR(scb, scb->sg_list));
-                hscb->SCSI_cmd_pointer = 
-                  cpu_to_le32(SCB_DMA_ADDR(scb, scb->sense_cmd));
-                hscb->data_count = scb->sg_list[0].length;
-                hscb->data_pointer = scb->sg_list[0].address;
-                hscb->SCSI_cmd_length = COMMAND_SIZE(scb->sense_cmd[0]);
-                hscb->residual_SG_segment_count = 0;
-                hscb->residual_data_count[0] = 0;
-                hscb->residual_data_count[1] = 0;
-                hscb->residual_data_count[2] = 0;
-
-                scb->sg_count = hscb->SG_segment_count = 1;
-                scb->sg_length = SCSI_SENSE_BUFFERSIZE;
-                scb->tag_action = 0;
                 scb->flags |= SCB_SENSE;
                 /*
                  * Ensure the target is busy since this will be an
@@ -6303,9 +6270,16 @@ aic7xxx_handle_command_completion_intr(struct aic7xxx_host *p)
        */
       scb->flags &= ~(SCB_ABORT|SCB_RESET);
     }
-    else if (scb->flags & SCB_SENSE)
+    cmd = scb->cmd;
+    if (scb->hscb->residual_SG_segment_count != 0)
+    {
+      aic7xxx_calculate_residual(p, scb);
+    }
+    cmd->result |= (aic7xxx_error(cmd) << 16);
+    aic7xxx_done(p, scb);
+    if (scb->flags & SCB_SENSE)
     {
-      char *buffer = &scb->cmd->sense_buffer[0];
+      const u8 *buffer = scsi_sense(cmd);
 
       if (buffer[12] == 0x47 || buffer[12] == 0x54)
       {
@@ -6317,13 +6291,6 @@ aic7xxx_handle_command_completion_intr(struct aic7xxx_host *p)
         aic_dev->needwdtr = aic_dev->needwdtr_copy;
       }
     }
-    cmd = scb->cmd;
-    if (scb->hscb->residual_SG_segment_count != 0)
-    {
-      aic7xxx_calculate_residual(p, scb);
-    }
-    cmd->result |= (aic7xxx_error(cmd) << 16);
-    aic7xxx_done(p, scb);
   }
 }
 
@@ -11141,6 +11108,7 @@ static struct scsi_host_template driver_template = {
 	.max_sectors		= 2048,
 	.cmd_per_lun		= 3,
 	.use_clustering		= ENABLE_CLUSTERING,
+	.sense_buffsize		= SCSI_SENSE_BUFFERSIZE,
 };
 
 #include "scsi_module.c"
-- 
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