]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.39/patches.drivers/qla4xxx-correct-extended-sense-data-errors-update
Fix oinkmaster patch.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.drivers / qla4xxx-correct-extended-sense-data-errors-update
1 From: David Wagner <david.wagner@qlogic.com>
2 Date: Mon, 7 Sep 2009 14:17:49 +0200
3 Subject: qla4xxx: Correct Extended Sense Data Errors - UPDATE
4 References: bnc#483706
5
6 Updated algorithm to use srb data variables instead of scsi command scratchpad
7 data area, as scratchpad area is already used.
8
9 Signed-off-by: David Wagner <david.wagner@qlogic.com>
10 Signed-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
16 diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h
17 index 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 /*
32 diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c
33 index 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 --
119 1.5.3.2
120