]>
Commit | Line | Data |
---|---|---|
82094b55 AF |
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 |