aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2011-07-29 20:16:40 -0400
committerJames Bottomley <JBottomley@Parallels.com>2011-08-23 22:45:45 -0400
commit1a878284473284f9577d44babf16d87152a05c33 (patch)
treef42d2433f56f10ad1a9b12b4f1479db2be7ef579 /drivers
parentba8f318471f66d5d5b79da68112525cf432b2b18 (diff)
[SCSI] isci: fix sata response handling
A bug (likely copy/paste) that has been carried from the original implementation. The unsolicited frame handling structure returns the d2h fis in the isci_request.stp.rsp buffer. Cc: <stable@kernel.org> Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/isci/request.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c
index a46e07ac789f..b4cf998385b3 100644
--- a/drivers/scsi/isci/request.c
+++ b/drivers/scsi/isci/request.c
@@ -2399,22 +2399,19 @@ static void isci_task_save_for_upper_layer_completion(
2399 } 2399 }
2400} 2400}
2401 2401
2402static void isci_request_process_stp_response(struct sas_task *task, 2402static void isci_process_stp_response(struct sas_task *task, struct dev_to_host_fis *fis)
2403 void *response_buffer)
2404{ 2403{
2405 struct dev_to_host_fis *d2h_reg_fis = response_buffer;
2406 struct task_status_struct *ts = &task->task_status; 2404 struct task_status_struct *ts = &task->task_status;
2407 struct ata_task_resp *resp = (void *)&ts->buf[0]; 2405 struct ata_task_resp *resp = (void *)&ts->buf[0];
2408 2406
2409 resp->frame_len = le16_to_cpu(*(__le16 *)(response_buffer + 6)); 2407 resp->frame_len = sizeof(*fis);
2410 memcpy(&resp->ending_fis[0], response_buffer + 16, 24); 2408 memcpy(resp->ending_fis, fis, sizeof(*fis));
2411 ts->buf_valid_size = sizeof(*resp); 2409 ts->buf_valid_size = sizeof(*resp);
2412 2410
2413 /** 2411 /* If the device fault bit is set in the status register, then
2414 * If the device fault bit is set in the status register, then
2415 * set the sense data and return. 2412 * set the sense data and return.
2416 */ 2413 */
2417 if (d2h_reg_fis->status & ATA_DF) 2414 if (fis->status & ATA_DF)
2418 ts->stat = SAS_PROTO_RESPONSE; 2415 ts->stat = SAS_PROTO_RESPONSE;
2419 else 2416 else
2420 ts->stat = SAM_STAT_GOOD; 2417 ts->stat = SAM_STAT_GOOD;
@@ -2428,7 +2425,6 @@ static void isci_request_io_request_complete(struct isci_host *ihost,
2428{ 2425{
2429 struct sas_task *task = isci_request_access_task(request); 2426 struct sas_task *task = isci_request_access_task(request);
2430 struct ssp_response_iu *resp_iu; 2427 struct ssp_response_iu *resp_iu;
2431 void *resp_buf;
2432 unsigned long task_flags; 2428 unsigned long task_flags;
2433 struct isci_remote_device *idev = isci_lookup_device(task->dev); 2429 struct isci_remote_device *idev = isci_lookup_device(task->dev);
2434 enum service_response response = SAS_TASK_UNDELIVERED; 2430 enum service_response response = SAS_TASK_UNDELIVERED;
@@ -2565,9 +2561,7 @@ static void isci_request_io_request_complete(struct isci_host *ihost,
2565 task); 2561 task);
2566 2562
2567 if (sas_protocol_ata(task->task_proto)) { 2563 if (sas_protocol_ata(task->task_proto)) {
2568 resp_buf = &request->stp.rsp; 2564 isci_process_stp_response(task, &request->stp.rsp);
2569 isci_request_process_stp_response(task,
2570 resp_buf);
2571 } else if (SAS_PROTOCOL_SSP == task->task_proto) { 2565 } else if (SAS_PROTOCOL_SSP == task->task_proto) {
2572 2566
2573 /* crack the iu response buffer. */ 2567 /* crack the iu response buffer. */