- Using scsi_eh_{prep,restore}_cmnd() for synchronous
REQUEST_SENSE invocation. simplifies code alot, because
it can now use the regular command invocation code path.
- Use new sense accessors where needed.
- use scsi_print_sense() (that is there for ages) in place
of a driver's made one. (Is that needed still)
Signed-off-by: Boaz Harrosh <[EMAIL PROTECTED]>
---
drivers/scsi/dc395x.c | 140 ++++++++----------------------------------------
1 files changed, 24 insertions(+), 116 deletions(-)
diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c
index 22ef371..5e92fcc 100644
--- a/drivers/scsi/dc395x.c
+++ b/drivers/scsi/dc395x.c
@@ -64,6 +64,8 @@
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>
+#include <scsi/scsi_eh.h>
+#include <scsi/scsi_dbg.h>
#include "dc395x.h"
@@ -236,16 +238,8 @@ struct ScsiReqBlk {
u8 sg_index; /* Index of HW sg entry for this
request */
size_t total_xfer_length; /* Total number of bytes remaining to
be transfered */
size_t request_length; /* Total number of bytes in this
request */
- /*
- * The sense buffer handling function, request_sense, uses
- * the first hw sg entry (segment_x[0]) and the transfer
- * length (total_xfer_length). While doing this it stores the
- * original values into the last sg hw list
- * (srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1] and the
- * total_xfer_length in xferred. These values are restored in
- * pci_unmap_srb_sense. This is the only place xferred is used.
- */
- size_t xferred; /* Saved copy of total_xfer_length */
+
+ struct scsi_eh_save ses;
u16 state;
@@ -1624,18 +1618,11 @@ static u8 start_scsi(struct AdapterCtlBlk* acb, struct
DeviceCtlBlk* dcb,
dprintkdbg(DBG_KG, "start_scsi: (pid#%li) <%02i-%i> cmnd=0x%02x
tag=%i\n",
srb->cmd->serial_number, srb->cmd->device->id,
srb->cmd->device->lun,
srb->cmd->cmnd[0], srb->tag_number);
- if (srb->flag & AUTO_REQSENSE) {
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, REQUEST_SENSE);
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5));
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, SCSI_SENSE_BUFFERSIZE);
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
- } else {
- ptr = (u8 *)srb->cmd->cmnd;
- for (i = 0; i < srb->cmd->cmd_len; i++)
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr++);
- }
+ ptr = (u8 *)srb->cmd->cmnd;
+
+ for (i = 0; i < srb->cmd->cmd_len; i++)
+ DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr++);
+
no_cmd:
DC395x_write16(acb, TRM_S1040_SCSI_CONTROL,
DO_HWRESELECT | DO_DATALATCH);
@@ -1894,29 +1881,19 @@ static void command_phase0(struct AdapterCtlBlk *acb,
struct ScsiReqBlk *srb,
static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
u16 *pscsi_status)
{
- struct DeviceCtlBlk *dcb;
u8 *ptr;
u16 i;
dprintkdbg(DBG_0, "command_phase1: (pid#%li)\n",
srb->cmd->serial_number);
clear_fifo(acb, "command_phase1");
DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_CLRATN);
- if (!(srb->flag & AUTO_REQSENSE)) {
- ptr = (u8 *)srb->cmd->cmnd;
- for (i = 0; i < srb->cmd->cmd_len; i++) {
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr);
- ptr++;
- }
- } else {
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, REQUEST_SENSE);
- dcb = acb->active_dcb;
- /* target id */
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5));
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, SCSI_SENSE_BUFFERSIZE);
- DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0);
+
+ ptr = (u8 *)srb->cmd->cmnd;
+ for (i = 0; i < srb->cmd->cmd_len; i++) {
+ DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr);
+ ptr++;
}
+
srb->state |= SRB_COMMAND;
/* it's important for atn stop */
DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);
@@ -3290,17 +3267,9 @@ static void pci_unmap_srb_sense(struct AdapterCtlBlk
*acb,
{
if (!(srb->flag & AUTO_REQSENSE))
return;
- /* Unmap sense buffer */
- dprintkdbg(DBG_SG, "pci_unmap_srb_sense: buffer=%08x\n",
- srb->segment_x[0].address);
- pci_unmap_single(acb->dev, srb->segment_x[0].address,
- srb->segment_x[0].length, PCI_DMA_FROMDEVICE);
- /* Restore SG stuff */
- srb->total_xfer_length = srb->xferred;
- srb->segment_x[0].address =
- srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address;
- srb->segment_x[0].length =
- srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length;
+
+ pci_unmap_srb(acb, srb);
+ scsi_eh_restore_cmnd(srb->cmd, &srb->ses);
}
@@ -3331,51 +3300,8 @@ static void srb_done(struct AdapterCtlBlk *acb, struct
DeviceCtlBlk *dcb,
srb->flag &= ~AUTO_REQSENSE;
srb->adapter_status = 0;
srb->target_status = CHECK_CONDITION << 1;
- if (debug_enabled(DBG_1)) {
- switch (cmd->sense_buffer[2] & 0x0f) {
- case NOT_READY:
- dprintkl(KERN_DEBUG,
- "ReqSense: NOT_READY cmnd=0x%02x <%02i-%i>
stat=%i scan=%i ",
- cmd->cmnd[0], dcb->target_id,
- dcb->target_lun, status,
acb->scan_devices);
- break;
- case UNIT_ATTENTION:
- dprintkl(KERN_DEBUG,
- "ReqSense: UNIT_ATTENTION cmnd=0x%02x
<%02i-%i> stat=%i scan=%i ",
- cmd->cmnd[0], dcb->target_id,
- dcb->target_lun, status,
acb->scan_devices);
- break;
- case ILLEGAL_REQUEST:
- dprintkl(KERN_DEBUG,
- "ReqSense: ILLEGAL_REQUEST cmnd=0x%02x
<%02i-%i> stat=%i scan=%i ",
- cmd->cmnd[0], dcb->target_id,
- dcb->target_lun, status,
acb->scan_devices);
- break;
- case MEDIUM_ERROR:
- dprintkl(KERN_DEBUG,
- "ReqSense: MEDIUM_ERROR cmnd=0x%02x
<%02i-%i> stat=%i scan=%i ",
- cmd->cmnd[0], dcb->target_id,
- dcb->target_lun, status,
acb->scan_devices);
- break;
- case HARDWARE_ERROR:
- dprintkl(KERN_DEBUG,
- "ReqSense: HARDWARE_ERROR cmnd=0x%02x
<%02i-%i> stat=%i scan=%i ",
- cmd->cmnd[0], dcb->target_id,
- dcb->target_lun, status,
acb->scan_devices);
- break;
- }
- if (cmd->sense_buffer[7] >= 6)
- printk("sense=0x%02x ASC=0x%02x ASCQ=0x%02x "
- "(0x%08x 0x%08x)\n",
- cmd->sense_buffer[2],
cmd->sense_buffer[12],
- cmd->sense_buffer[13],
- *((unsigned int *)(cmd->sense_buffer +
3)),
- *((unsigned int *)(cmd->sense_buffer +
8)));
- else
- printk("sense=0x%02x No ASC/ASCQ (0x%08x)\n",
- cmd->sense_buffer[2],
- *((unsigned int *)(cmd->sense_buffer +
3)));
- }
+ if (debug_enabled(DBG_1))
+ scsi_print_sense("dc395x", cmd);
if (status == (CHECK_CONDITION << 1)) {
cmd->result = DID_BAD_TARGET << 16;
@@ -3678,32 +3604,13 @@ static void request_sense(struct AdapterCtlBlk *acb,
struct DeviceCtlBlk *dcb,
dprintkdbg(DBG_1, "request_sense: (pid#%li) <%02i-%i>\n",
cmd->serial_number, cmd->device->id, cmd->device->lun);
+ scsi_eh_prep_cmnd(cmd, &srb->ses, NULL, 0, ~0);
+ build_srb(cmd, dcb, srb);
+
srb->flag |= AUTO_REQSENSE;
srb->adapter_status = 0;
srb->target_status = 0;
- /* KG: Can this prevent crap sense data ? */
- memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
-
- /* Save some data */
- srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address =
- srb->segment_x[0].address;
- srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length =
- srb->segment_x[0].length;
- srb->xferred = srb->total_xfer_length;
- /* srb->segment_x : a one entry of S/G list table */
- srb->total_xfer_length = SCSI_SENSE_BUFFERSIZE;
- srb->segment_x[0].length = SCSI_SENSE_BUFFERSIZE;
- /* Map sense buffer */
- srb->segment_x[0].address =
- pci_map_single(acb->dev, cmd->sense_buffer,
- SCSI_SENSE_BUFFERSIZE, PCI_DMA_FROMDEVICE);
- dprintkdbg(DBG_SG, "request_sense: map buffer %p->%08x(%05x)\n",
- cmd->sense_buffer, srb->segment_x[0].address,
- SCSI_SENSE_BUFFERSIZE);
- srb->sg_count = 1;
- srb->sg_index = 0;
-
if (start_scsi(acb, dcb, srb)) { /* Should only happen, if sb.
else grabs the bus */
dprintkl(KERN_DEBUG,
"request_sense: (pid#%li) failed <%02i-%i>\n",
@@ -4763,6 +4670,7 @@ static struct scsi_host_template dc395x_driver_template =
{
.eh_bus_reset_handler = dc395x_eh_bus_reset,
.unchecked_isa_dma = 0,
.use_clustering = DISABLE_CLUSTERING,
+ .sense_buffsize = SCSI_SENSE_BUFFERSIZE,
};
--
1.5.3.3
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html