]>
Commit | Line | Data |
---|---|---|
1a119d1d DM |
1 | From 55b8760847a6e593ab67448ca79f83c4b1a9f012 Mon Sep 17 00:00:00 2001 |
2 | From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com> | |
3 | Date: Fri, 28 Aug 2015 06:38:37 -0400 | |
4 | Subject: aacraid: Tune response path if IsFastPath bit set | |
5 | ||
6 | If 'IsFastPath' bit is set, then response path assumes no error and skips | |
7 | error check. | |
8 | ||
9 | Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com> | |
10 | Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com> | |
11 | Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com> | |
12 | Signed-off-by: James Bottomley <JBottomley@Odin.com> | |
13 | --- | |
14 | drivers/scsi/aacraid/aachba.c | 259 ++++++++++++++++++++++-------------------- | |
15 | 1 file changed, 137 insertions(+), 122 deletions(-) | |
16 | ||
17 | diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c | |
18 | index 05f2a02..e4c2437 100644 | |
19 | --- a/drivers/scsi/aacraid/aachba.c | |
20 | +++ b/drivers/scsi/aacraid/aachba.c | |
21 | @@ -2977,11 +2977,16 @@ static void aac_srb_callback(void *context, struct fib * fibptr) | |
22 | return; | |
23 | ||
24 | BUG_ON(fibptr == NULL); | |
25 | - | |
26 | dev = fibptr->dev; | |
27 | ||
28 | - srbreply = (struct aac_srb_reply *) fib_data(fibptr); | |
29 | + scsi_dma_unmap(scsicmd); | |
30 | ||
31 | + /* expose physical device if expose_physicald flag is on */ | |
32 | + if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01) | |
33 | + && expose_physicals > 0) | |
34 | + aac_expose_phy_device(scsicmd); | |
35 | + | |
36 | + srbreply = (struct aac_srb_reply *) fib_data(fibptr); | |
37 | scsicmd->sense_buffer[0] = '\0'; /* Initialize sense valid flag to false */ | |
38 | ||
39 | if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) { | |
40 | @@ -2994,147 +2999,157 @@ static void aac_srb_callback(void *context, struct fib * fibptr) | |
41 | */ | |
42 | scsi_set_resid(scsicmd, scsi_bufflen(scsicmd) | |
43 | - le32_to_cpu(srbreply->data_xfer_length)); | |
44 | - } | |
45 | - | |
46 | - scsi_dma_unmap(scsicmd); | |
47 | - | |
48 | - /* expose physical device if expose_physicald flag is on */ | |
49 | - if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01) | |
50 | - && expose_physicals > 0) | |
51 | - aac_expose_phy_device(scsicmd); | |
52 | + /* | |
53 | + * First check the fib status | |
54 | + */ | |
55 | ||
56 | - /* | |
57 | - * First check the fib status | |
58 | - */ | |
59 | + if (le32_to_cpu(srbreply->status) != ST_OK) { | |
60 | + int len; | |
61 | ||
62 | - if (le32_to_cpu(srbreply->status) != ST_OK){ | |
63 | - int len; | |
64 | - printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status)); | |
65 | - len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), | |
66 | - SCSI_SENSE_BUFFERSIZE); | |
67 | - scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION; | |
68 | - memcpy(scsicmd->sense_buffer, srbreply->sense_data, len); | |
69 | - } | |
70 | + printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status)); | |
71 | + len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), | |
72 | + SCSI_SENSE_BUFFERSIZE); | |
73 | + scsicmd->result = DID_ERROR << 16 | |
74 | + | COMMAND_COMPLETE << 8 | |
75 | + | SAM_STAT_CHECK_CONDITION; | |
76 | + memcpy(scsicmd->sense_buffer, | |
77 | + srbreply->sense_data, len); | |
78 | + } | |
79 | ||
80 | - /* | |
81 | - * Next check the srb status | |
82 | - */ | |
83 | - switch( (le32_to_cpu(srbreply->srb_status))&0x3f){ | |
84 | - case SRB_STATUS_ERROR_RECOVERY: | |
85 | - case SRB_STATUS_PENDING: | |
86 | - case SRB_STATUS_SUCCESS: | |
87 | - scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; | |
88 | - break; | |
89 | - case SRB_STATUS_DATA_OVERRUN: | |
90 | - switch(scsicmd->cmnd[0]){ | |
91 | - case READ_6: | |
92 | - case WRITE_6: | |
93 | - case READ_10: | |
94 | - case WRITE_10: | |
95 | - case READ_12: | |
96 | - case WRITE_12: | |
97 | - case READ_16: | |
98 | - case WRITE_16: | |
99 | - if (le32_to_cpu(srbreply->data_xfer_length) < scsicmd->underflow) { | |
100 | - printk(KERN_WARNING"aacraid: SCSI CMD underflow\n"); | |
101 | - } else { | |
102 | - printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n"); | |
103 | + /* | |
104 | + * Next check the srb status | |
105 | + */ | |
106 | + switch ((le32_to_cpu(srbreply->srb_status))&0x3f) { | |
107 | + case SRB_STATUS_ERROR_RECOVERY: | |
108 | + case SRB_STATUS_PENDING: | |
109 | + case SRB_STATUS_SUCCESS: | |
110 | + scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; | |
111 | + break; | |
112 | + case SRB_STATUS_DATA_OVERRUN: | |
113 | + switch (scsicmd->cmnd[0]) { | |
114 | + case READ_6: | |
115 | + case WRITE_6: | |
116 | + case READ_10: | |
117 | + case WRITE_10: | |
118 | + case READ_12: | |
119 | + case WRITE_12: | |
120 | + case READ_16: | |
121 | + case WRITE_16: | |
122 | + if (le32_to_cpu(srbreply->data_xfer_length) | |
123 | + < scsicmd->underflow) | |
124 | + printk(KERN_WARNING"aacraid: SCSI CMD underflow\n"); | |
125 | + else | |
126 | + printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n"); | |
127 | + scsicmd->result = DID_ERROR << 16 | |
128 | + | COMMAND_COMPLETE << 8; | |
129 | + break; | |
130 | + case INQUIRY: { | |
131 | + scsicmd->result = DID_OK << 16 | |
132 | + | COMMAND_COMPLETE << 8; | |
133 | + break; | |
134 | + } | |
135 | + default: | |
136 | + scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; | |
137 | + break; | |
138 | } | |
139 | - scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8; | |
140 | break; | |
141 | - case INQUIRY: { | |
142 | - scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; | |
143 | + case SRB_STATUS_ABORTED: | |
144 | + scsicmd->result = DID_ABORT << 16 | ABORT << 8; | |
145 | break; | |
146 | - } | |
147 | - default: | |
148 | - scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; | |
149 | + case SRB_STATUS_ABORT_FAILED: | |
150 | + /* | |
151 | + * Not sure about this one - but assuming the | |
152 | + * hba was trying to abort for some reason | |
153 | + */ | |
154 | + scsicmd->result = DID_ERROR << 16 | ABORT << 8; | |
155 | + break; | |
156 | + case SRB_STATUS_PARITY_ERROR: | |
157 | + scsicmd->result = DID_PARITY << 16 | |
158 | + | MSG_PARITY_ERROR << 8; | |
159 | + break; | |
160 | + case SRB_STATUS_NO_DEVICE: | |
161 | + case SRB_STATUS_INVALID_PATH_ID: | |
162 | + case SRB_STATUS_INVALID_TARGET_ID: | |
163 | + case SRB_STATUS_INVALID_LUN: | |
164 | + case SRB_STATUS_SELECTION_TIMEOUT: | |
165 | + scsicmd->result = DID_NO_CONNECT << 16 | |
166 | + | COMMAND_COMPLETE << 8; | |
167 | break; | |
168 | - } | |
169 | - break; | |
170 | - case SRB_STATUS_ABORTED: | |
171 | - scsicmd->result = DID_ABORT << 16 | ABORT << 8; | |
172 | - break; | |
173 | - case SRB_STATUS_ABORT_FAILED: | |
174 | - // Not sure about this one - but assuming the hba was trying to abort for some reason | |
175 | - scsicmd->result = DID_ERROR << 16 | ABORT << 8; | |
176 | - break; | |
177 | - case SRB_STATUS_PARITY_ERROR: | |
178 | - scsicmd->result = DID_PARITY << 16 | MSG_PARITY_ERROR << 8; | |
179 | - break; | |
180 | - case SRB_STATUS_NO_DEVICE: | |
181 | - case SRB_STATUS_INVALID_PATH_ID: | |
182 | - case SRB_STATUS_INVALID_TARGET_ID: | |
183 | - case SRB_STATUS_INVALID_LUN: | |
184 | - case SRB_STATUS_SELECTION_TIMEOUT: | |
185 | - scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8; | |
186 | - break; | |
187 | ||
188 | - case SRB_STATUS_COMMAND_TIMEOUT: | |
189 | - case SRB_STATUS_TIMEOUT: | |
190 | - scsicmd->result = DID_TIME_OUT << 16 | COMMAND_COMPLETE << 8; | |
191 | - break; | |
192 | + case SRB_STATUS_COMMAND_TIMEOUT: | |
193 | + case SRB_STATUS_TIMEOUT: | |
194 | + scsicmd->result = DID_TIME_OUT << 16 | |
195 | + | COMMAND_COMPLETE << 8; | |
196 | + break; | |
197 | ||
198 | - case SRB_STATUS_BUSY: | |
199 | - scsicmd->result = DID_BUS_BUSY << 16 | COMMAND_COMPLETE << 8; | |
200 | - break; | |
201 | + case SRB_STATUS_BUSY: | |
202 | + scsicmd->result = DID_BUS_BUSY << 16 | |
203 | + | COMMAND_COMPLETE << 8; | |
204 | + break; | |
205 | ||
206 | - case SRB_STATUS_BUS_RESET: | |
207 | - scsicmd->result = DID_RESET << 16 | COMMAND_COMPLETE << 8; | |
208 | - break; | |
209 | + case SRB_STATUS_BUS_RESET: | |
210 | + scsicmd->result = DID_RESET << 16 | |
211 | + | COMMAND_COMPLETE << 8; | |
212 | + break; | |
213 | ||
214 | - case SRB_STATUS_MESSAGE_REJECTED: | |
215 | - scsicmd->result = DID_ERROR << 16 | MESSAGE_REJECT << 8; | |
216 | - break; | |
217 | - case SRB_STATUS_REQUEST_FLUSHED: | |
218 | - case SRB_STATUS_ERROR: | |
219 | - case SRB_STATUS_INVALID_REQUEST: | |
220 | - case SRB_STATUS_REQUEST_SENSE_FAILED: | |
221 | - case SRB_STATUS_NO_HBA: | |
222 | - case SRB_STATUS_UNEXPECTED_BUS_FREE: | |
223 | - case SRB_STATUS_PHASE_SEQUENCE_FAILURE: | |
224 | - case SRB_STATUS_BAD_SRB_BLOCK_LENGTH: | |
225 | - case SRB_STATUS_DELAYED_RETRY: | |
226 | - case SRB_STATUS_BAD_FUNCTION: | |
227 | - case SRB_STATUS_NOT_STARTED: | |
228 | - case SRB_STATUS_NOT_IN_USE: | |
229 | - case SRB_STATUS_FORCE_ABORT: | |
230 | - case SRB_STATUS_DOMAIN_VALIDATION_FAIL: | |
231 | - default: | |
232 | + case SRB_STATUS_MESSAGE_REJECTED: | |
233 | + scsicmd->result = DID_ERROR << 16 | |
234 | + | MESSAGE_REJECT << 8; | |
235 | + break; | |
236 | + case SRB_STATUS_REQUEST_FLUSHED: | |
237 | + case SRB_STATUS_ERROR: | |
238 | + case SRB_STATUS_INVALID_REQUEST: | |
239 | + case SRB_STATUS_REQUEST_SENSE_FAILED: | |
240 | + case SRB_STATUS_NO_HBA: | |
241 | + case SRB_STATUS_UNEXPECTED_BUS_FREE: | |
242 | + case SRB_STATUS_PHASE_SEQUENCE_FAILURE: | |
243 | + case SRB_STATUS_BAD_SRB_BLOCK_LENGTH: | |
244 | + case SRB_STATUS_DELAYED_RETRY: | |
245 | + case SRB_STATUS_BAD_FUNCTION: | |
246 | + case SRB_STATUS_NOT_STARTED: | |
247 | + case SRB_STATUS_NOT_IN_USE: | |
248 | + case SRB_STATUS_FORCE_ABORT: | |
249 | + case SRB_STATUS_DOMAIN_VALIDATION_FAIL: | |
250 | + default: | |
251 | #ifdef AAC_DETAILED_STATUS_INFO | |
252 | - printk("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n", | |
253 | - le32_to_cpu(srbreply->srb_status) & 0x3F, | |
254 | - aac_get_status_string( | |
255 | - le32_to_cpu(srbreply->srb_status) & 0x3F), | |
256 | - scsicmd->cmnd[0], | |
257 | - le32_to_cpu(srbreply->scsi_status)); | |
258 | + printk(KERN_INFO "aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n", | |
259 | + le32_to_cpu(srbreply->srb_status) & 0x3F, | |
260 | + aac_get_status_string( | |
261 | + le32_to_cpu(srbreply->srb_status) & 0x3F), | |
262 | + scsicmd->cmnd[0], | |
263 | + le32_to_cpu(srbreply->scsi_status)); | |
264 | #endif | |
265 | - if ((scsicmd->cmnd[0] == ATA_12) | |
266 | - || (scsicmd->cmnd[0] == ATA_16)) { | |
267 | - if (scsicmd->cmnd[2] & (0x01 << 5)) { | |
268 | - scsicmd->result = DID_OK << 16 | |
269 | - | COMMAND_COMPLETE << 8; | |
270 | + if ((scsicmd->cmnd[0] == ATA_12) | |
271 | + || (scsicmd->cmnd[0] == ATA_16)) { | |
272 | + if (scsicmd->cmnd[2] & (0x01 << 5)) { | |
273 | + scsicmd->result = DID_OK << 16 | |
274 | + | COMMAND_COMPLETE << 8; | |
275 | break; | |
276 | + } else { | |
277 | + scsicmd->result = DID_ERROR << 16 | |
278 | + | COMMAND_COMPLETE << 8; | |
279 | + break; | |
280 | + } | |
281 | } else { | |
282 | scsicmd->result = DID_ERROR << 16 | |
283 | - | COMMAND_COMPLETE << 8; | |
284 | + | COMMAND_COMPLETE << 8; | |
285 | break; | |
286 | } | |
287 | - } else { | |
288 | - scsicmd->result = DID_ERROR << 16 | |
289 | - | COMMAND_COMPLETE << 8; | |
290 | - break; | |
291 | } | |
292 | - } | |
293 | - if (le32_to_cpu(srbreply->scsi_status) == SAM_STAT_CHECK_CONDITION) { | |
294 | - int len; | |
295 | - scsicmd->result |= SAM_STAT_CHECK_CONDITION; | |
296 | - len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), | |
297 | - SCSI_SENSE_BUFFERSIZE); | |
298 | + if (le32_to_cpu(srbreply->scsi_status) | |
299 | + == SAM_STAT_CHECK_CONDITION) { | |
300 | + int len; | |
301 | + | |
302 | + scsicmd->result |= SAM_STAT_CHECK_CONDITION; | |
303 | + len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), | |
304 | + SCSI_SENSE_BUFFERSIZE); | |
305 | #ifdef AAC_DETAILED_STATUS_INFO | |
306 | - printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n", | |
307 | - le32_to_cpu(srbreply->status), len); | |
308 | + printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n", | |
309 | + le32_to_cpu(srbreply->status), len); | |
310 | #endif | |
311 | - memcpy(scsicmd->sense_buffer, srbreply->sense_data, len); | |
312 | + memcpy(scsicmd->sense_buffer, | |
313 | + srbreply->sense_data, len); | |
314 | + } | |
315 | } | |
316 | /* | |
317 | * OR in the scsi status (already shifted up a bit) | |
318 | -- | |
319 | cgit v0.11.2 | |
320 |