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