]> git.proxmox.com Git - pve-kernel-jessie.git/blame - 0005-aacraid-tune-response-path.patch
bump version to 4.2.6-31
[pve-kernel-jessie.git] / 0005-aacraid-tune-response-path.patch
CommitLineData
1a119d1d
DM
1From 55b8760847a6e593ab67448ca79f83c4b1a9f012 Mon Sep 17 00:00:00 2001
2From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
3Date: Fri, 28 Aug 2015 06:38:37 -0400
4Subject: aacraid: Tune response path if IsFastPath bit set
5
6If 'IsFastPath' bit is set, then response path assumes no error and skips
7error check.
8
9Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
10Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
11Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
12Signed-off-by: James Bottomley <JBottomley@Odin.com>
13---
14 drivers/scsi/aacraid/aachba.c | 259 ++++++++++++++++++++++--------------------
15 1 file changed, 137 insertions(+), 122 deletions(-)
16
17diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
18index 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--
319cgit v0.11.2
320