1 #include <linux/kernel.h>
3 #include <scsi/libsas.h>
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
)
9 struct task_status_struct
*tstat
= &task
->task_status
;
11 tstat
->resp
= SAS_TASK_COMPLETE
;
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_STAT_CHECK_CONDITION
;
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
);
24 if (iu
->status
!= SAM_STAT_CHECK_CONDITION
)
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
),
32 /* when datapres contains corrupt/unknown value... */
33 tstat
->stat
= SAM_STAT_CHECK_CONDITION
;
35 EXPORT_SYMBOL_GPL(sas_ssp_task_response
);