diff options
author | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-18 11:47:01 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-25 12:47:23 -0500 |
commit | 366ca51f30de1cbb5b356c70b7bb22051c558e41 (patch) | |
tree | c28a9d3b64a5b3e3c8bd29c57003ee524e9e1e63 | |
parent | 1292500b159c00a8fece072b004f154e6fda9f48 (diff) |
[SCSI] libsas: abstract STP task status into a function
Break out the frame processor for STP tasks from aic94xx so they can
be shared by other SAS HBA's
Original patch from Jeff Garzik <jeff@garzik.org>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
-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_ */ |