]> git.ipfire.org Git - ipfire-2.x.git/blame - src/patches/suse-2.6.27.39/patches.drivers/qla4xxx-correct-extended-sense-data-errors-update
Fix oinkmaster patch.
[ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.drivers / qla4xxx-correct-extended-sense-data-errors-update
CommitLineData
82094b55
AF
1From: David Wagner <david.wagner@qlogic.com>
2Date: Mon, 7 Sep 2009 14:17:49 +0200
3Subject: qla4xxx: Correct Extended Sense Data Errors - UPDATE
4References: bnc#483706
5
6Updated algorithm to use srb data variables instead of scsi command scratchpad
7data area, as scratchpad area is already used.
8
9Signed-off-by: David Wagner <david.wagner@qlogic.com>
10Signed-off-by: Hannes Reinecke <hare@suse.de>
11---
12 drivers/scsi/qla4xxx/ql4_def.h | 5 +++++
13 drivers/scsi/qla4xxx/ql4_isr.c | 34 +++++++++++++++-------------------
14 2 files changed, 20 insertions(+), 19 deletions(-)
15
16diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h
17index f8ea527..7c6b22c 100644
18--- a/drivers/scsi/qla4xxx/ql4_def.h
19+++ b/drivers/scsi/qla4xxx/ql4_def.h
20@@ -183,6 +183,11 @@ struct srb {
21 uint16_t iocb_cnt; /* Number of used iocbs */
22 uint16_t cc_stat;
23 uint32_t dma_len;
24+
25+ /* Used for extended sense / status continuation */
26+ uint8_t *req_sense_ptr;
27+ uint16_t req_sense_len;
28+ uint16_t reserved2;
29 };
30
31 /*
32diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c
33index c3354b8..31df8c8 100644
34--- a/drivers/scsi/qla4xxx/ql4_isr.c
35+++ b/drivers/scsi/qla4xxx/ql4_isr.c
36@@ -25,7 +25,7 @@ static void qla4xxx_copy_sense(struct scsi_qla_host *ha,
37 struct scsi_cmnd *cmd = srb->cmd;
38 uint16_t sense_len;
39
40- memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
41+ memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
42 sense_len = le16_to_cpu(sts_entry->senseDataByteCnt);
43 if (sense_len == 0)
44 return;
45@@ -33,16 +33,15 @@ static void qla4xxx_copy_sense(struct scsi_qla_host *ha,
46 /* Save total available sense length,
47 * not to exceed cmd's sense buffer size */
48 sense_len = min_t(uint16_t, sense_len, SCSI_SENSE_BUFFERSIZE);
49- cmd->SCp.ptr = cmd->sense_buffer;
50- cmd->SCp.this_residual = sense_len;
51+ srb->req_sense_ptr = cmd->sense_buffer;
52+ srb->req_sense_len = sense_len;
53
54 /* Copy sense from sts_entry pkt */
55 sense_len = min_t(uint16_t, sense_len, IOCB_MAX_SENSEDATA_LEN);
56 memcpy(cmd->sense_buffer, sts_entry->senseData, sense_len);
57
58 DEBUG2(printk("scsi%ld:%d:%d:%d: %s: sense key = %x, "
59- "Addl.SenseLen - %02x, "
60- "ASC/ASCQ = %02x/%02x\n", ha->host_no,
61+ "ASL= %02x, ASC/ASCQ = %02x/%02x\n", ha->host_no,
62 cmd->device->channel, cmd->device->id,
63 cmd->device->lun, __func__,
64 sts_entry->senseData[2] & 0x0f,
65@@ -50,13 +49,13 @@ static void qla4xxx_copy_sense(struct scsi_qla_host *ha,
66 sts_entry->senseData[12],
67 sts_entry->senseData[13]));
68
69- DEBUG5(qla4xxx_dump_buffer(cmd->SCp.ptr, sense_len));
70+ DEBUG5(qla4xxx_dump_buffer(cmd->sense_buffer, sense_len));
71 srb->flags |= SRB_GOT_SENSE;
72
73 /* Update srb, in case a sts_cont pkt follows */
74- cmd->SCp.ptr += sense_len;
75- cmd->SCp.this_residual -= sense_len;
76- if (cmd->SCp.this_residual != 0)
77+ srb->req_sense_ptr += sense_len;
78+ srb->req_sense_len -= sense_len;
79+ if (srb->req_sense_len != 0)
80 ha->status_srb = srb;
81 else
82 ha->status_srb = NULL;
83@@ -77,11 +76,8 @@ qla4xxx_status_cont_entry(struct scsi_qla_host *ha,
84 struct scsi_cmnd *cmd;
85 uint8_t sense_len;
86
87- if (srb == NULL) {
88- DEBUG2(printk("scsi%ld: %s: Throw away extra STATUS CONTINUATION\n",
89- ha->host_no, __func__));
90+ if (srb == NULL)
91 return;
92- }
93
94 cmd = srb->cmd;
95 if (cmd == NULL) {
96@@ -92,15 +88,15 @@ qla4xxx_status_cont_entry(struct scsi_qla_host *ha,
97 }
98
99 /* Copy sense data. */
100- sense_len = min(cmd->SCp.this_residual, IOCB_MAX_EXT_SENSEDATA_LEN);
101- memcpy(cmd->SCp.ptr, sts_cont->extSenseData, sense_len);
102- DEBUG5(qla4xxx_dump_buffer(cmd->SCp.ptr, sense_len));
103+ sense_len = min(srb->req_sense_len, (uint16_t) IOCB_MAX_EXT_SENSEDATA_LEN);
104+ memcpy(srb->req_sense_ptr, sts_cont->extSenseData, sense_len);
105+ DEBUG5(qla4xxx_dump_buffer(srb->req_sense_ptr, sense_len));
106
107- cmd->SCp.ptr += sense_len;
108- cmd->SCp.this_residual -= sense_len;
109+ srb->req_sense_ptr += sense_len;
110+ srb->req_sense_len -= sense_len;
111
112 /* Place command on done queue. */
113- if (cmd->SCp.this_residual == 0) {
114+ if (srb->req_sense_len == 0) {
115 qla4xxx_srb_compl(ha, srb);
116 ha->status_srb = NULL;
117 }
118--
1191.5.3.2
120