1 #include <linux/kernel.h>
2 #include <linux/export.h>
4 #include <scsi/libsas.h>
6 /* fill task_status_struct based on SSP response frame */
7 void sas_ssp_task_response(struct device
*dev
, struct sas_task
*task
,
8 struct ssp_response_iu
*iu
)
10 struct task_status_struct
*tstat
= &task
->task_status
;
12 tstat
->resp
= SAS_TASK_COMPLETE
;
14 if (iu
->datapres
== 0)
15 tstat
->stat
= iu
->status
;
16 else if (iu
->datapres
== 1)
17 tstat
->stat
= iu
->resp_data
[3];
18 else if (iu
->datapres
== 2) {
19 tstat
->stat
= SAM_STAT_CHECK_CONDITION
;
20 tstat
->buf_valid_size
=
21 min_t(int, SAS_STATUS_BUF_SIZE
,
22 be32_to_cpu(iu
->sense_data_len
));
23 memcpy(tstat
->buf
, iu
->sense_data
, tstat
->buf_valid_size
);
25 if (iu
->status
!= SAM_STAT_CHECK_CONDITION
)
26 dev_printk(KERN_WARNING
, dev
,
27 "dev %llx sent sense data, but "
28 "stat(%x) is not CHECK CONDITION\n",
29 SAS_ADDR(task
->dev
->sas_addr
),
33 /* when datapres contains corrupt/unknown value... */
34 tstat
->stat
= SAM_STAT_CHECK_CONDITION
;
36 EXPORT_SYMBOL_GPL(sas_ssp_task_response
);