diff options
| -rw-r--r-- | drivers/scsi/aic94xx/aic94xx_task.c | 20 | ||||
| -rw-r--r-- | drivers/scsi/libsas/Makefile | 3 | ||||
| -rw-r--r-- | drivers/scsi/libsas/sas_task.c | 36 | ||||
| -rw-r--r-- | include/scsi/libsas.h | 4 |
4 files changed, 44 insertions, 19 deletions
diff --git a/drivers/scsi/aic94xx/aic94xx_task.c b/drivers/scsi/aic94xx/aic94xx_task.c index 663fdef38c52..965d4bb999d9 100644 --- a/drivers/scsi/aic94xx/aic94xx_task.c +++ b/drivers/scsi/aic94xx/aic94xx_task.c | |||
| @@ -192,24 +192,8 @@ static void asd_get_response_tasklet(struct asd_ascb *ascb, | |||
| 192 | r + 16 + sizeof(struct ssp_frame_hdr); | 192 | r + 16 + sizeof(struct ssp_frame_hdr); |
| 193 | 193 | ||
| 194 | ts->residual = le32_to_cpu(*(__le32 *)r); | 194 | ts->residual = le32_to_cpu(*(__le32 *)r); |
| 195 | ts->resp = SAS_TASK_COMPLETE; | 195 | |
| 196 | if (iu->datapres == 0) | 196 | sas_ssp_task_response(&asd_ha->pcidev->dev, task, iu); |
| 197 | ts->stat = iu->status; | ||
| 198 | else if (iu->datapres == 1) | ||
| 199 | ts->stat = iu->resp_data[3]; | ||
| 200 | else if (iu->datapres == 2) { | ||
| 201 | ts->stat = SAM_CHECK_COND; | ||
| 202 | ts->buf_valid_size = min((u32) SAS_STATUS_BUF_SIZE, | ||
| 203 | be32_to_cpu(iu->sense_data_len)); | ||
| 204 | memcpy(ts->buf, iu->sense_data, ts->buf_valid_size); | ||
| 205 | if (iu->status != SAM_CHECK_COND) { | ||
| 206 | ASD_DPRINTK("device %llx sent sense data, but " | ||
| 207 | "stat(0x%x) is not CHECK_CONDITION" | ||
| 208 | "\n", | ||
| 209 | SAS_ADDR(task->dev->sas_addr), | ||
| 210 | iu->status); | ||
| 211 | } | ||
| 212 | } | ||
| 213 | } else { | 197 | } else { |
| 214 | struct ata_task_resp *resp = (void *) &ts->buf[0]; | 198 | struct ata_task_resp *resp = (void *) &ts->buf[0]; |
| 215 | 199 | ||
diff --git a/drivers/scsi/libsas/Makefile b/drivers/scsi/libsas/Makefile index 60d6e93dd949..1ad1323c60fa 100644 --- a/drivers/scsi/libsas/Makefile +++ b/drivers/scsi/libsas/Makefile | |||
| @@ -33,6 +33,7 @@ libsas-y += sas_init.o \ | |||
| 33 | sas_dump.o \ | 33 | sas_dump.o \ |
| 34 | sas_discover.o \ | 34 | sas_discover.o \ |
| 35 | sas_expander.o \ | 35 | sas_expander.o \ |
| 36 | sas_scsi_host.o | 36 | sas_scsi_host.o \ |
| 37 | sas_task.o | ||
| 37 | libsas-$(CONFIG_SCSI_SAS_ATA) += sas_ata.o | 38 | libsas-$(CONFIG_SCSI_SAS_ATA) += sas_ata.o |
| 38 | libsas-$(CONFIG_SCSI_SAS_HOST_SMP) += sas_host_smp.o \ No newline at end of file | 39 | libsas-$(CONFIG_SCSI_SAS_HOST_SMP) += sas_host_smp.o \ No newline at end of file |
diff --git a/drivers/scsi/libsas/sas_task.c b/drivers/scsi/libsas/sas_task.c new file mode 100644 index 000000000000..594524d5bfa1 --- /dev/null +++ b/drivers/scsi/libsas/sas_task.c | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | #include <linux/kernel.h> | ||
| 2 | #include <scsi/sas.h> | ||
| 3 | #include <scsi/libsas.h> | ||
| 4 | |||
| 5 | /* fill task_status_struct based on SSP response frame */ | ||
| 6 | void sas_ssp_task_response(struct device *dev, struct sas_task *task, | ||
| 7 | struct ssp_response_iu *iu) | ||
| 8 | { | ||
| 9 | struct task_status_struct *tstat = &task->task_status; | ||
| 10 | |||
| 11 | tstat->resp = SAS_TASK_COMPLETE; | ||
| 12 | |||
| 13 | if (iu->datapres == 0) | ||
| 14 | tstat->stat = iu->status; | ||
| 15 | else if (iu->datapres == 1) | ||
| 16 | tstat->stat = iu->resp_data[3]; | ||
| 17 | else if (iu->datapres == 2) { | ||
| 18 | tstat->stat = SAM_CHECK_COND; | ||
| 19 | tstat->buf_valid_size = | ||
| 20 | min_t(int, SAS_STATUS_BUF_SIZE, | ||
| 21 | be32_to_cpu(iu->sense_data_len)); | ||
| 22 | memcpy(tstat->buf, iu->sense_data, tstat->buf_valid_size); | ||
| 23 | |||
| 24 | if (iu->status != SAM_CHECK_COND) | ||
| 25 | dev_printk(KERN_WARNING, dev, | ||
| 26 | "dev %llx sent sense data, but " | ||
| 27 | "stat(%x) is not CHECK CONDITION\n", | ||
| 28 | SAS_ADDR(task->dev->sas_addr), | ||
| 29 | iu->status); | ||
| 30 | } | ||
| 31 | else | ||
| 32 | /* when datapres contains corrupt/unknown value... */ | ||
| 33 | tstat->stat = SAM_CHECK_COND; | ||
| 34 | } | ||
| 35 | EXPORT_SYMBOL_GPL(sas_ssp_task_response); | ||
| 36 | |||
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index a075f130303c..3ffd6b582a97 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h | |||
| @@ -672,4 +672,8 @@ extern int sas_ioctl(struct scsi_device *sdev, int cmd, void __user *arg); | |||
| 672 | 672 | ||
| 673 | extern int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, | 673 | extern int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, |
| 674 | struct request *req); | 674 | struct request *req); |
| 675 | |||
| 676 | extern void sas_ssp_task_response(struct device *dev, struct sas_task *task, | ||
| 677 | struct ssp_response_iu *iu); | ||
| 678 | |||
| 675 | #endif /* _SASLIB_H_ */ | 679 | #endif /* _SASLIB_H_ */ |
