]> git.proxmox.com Git - pve-kernel-jessie.git/blob - 0005-aacraid-tune-response-path.patch
bump version to 4.2.6-31
[pve-kernel-jessie.git] / 0005-aacraid-tune-response-path.patch
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