1 // SPDX-License-Identifier: GPL-2.0-only
3 #include "sas_internal.h"
5 #include <linux/kernel.h>
6 #include <linux/export.h>
8 #include <scsi/libsas.h>
10 /* fill task_status_struct based on SSP response frame */
11 void sas_ssp_task_response(struct device
*dev
, struct sas_task
*task
,
12 struct ssp_response_iu
*iu
)
14 struct task_status_struct
*tstat
= &task
->task_status
;
16 tstat
->resp
= SAS_TASK_COMPLETE
;
18 if (iu
->datapres
== 0)
19 tstat
->stat
= iu
->status
;
20 else if (iu
->datapres
== 1)
21 tstat
->stat
= iu
->resp_data
[3];
22 else if (iu
->datapres
== 2) {
23 tstat
->stat
= SAM_STAT_CHECK_CONDITION
;
24 tstat
->buf_valid_size
=
25 min_t(int, SAS_STATUS_BUF_SIZE
,
26 be32_to_cpu(iu
->sense_data_len
));
27 memcpy(tstat
->buf
, iu
->sense_data
, tstat
->buf_valid_size
);
29 if (iu
->status
!= SAM_STAT_CHECK_CONDITION
)
30 dev_warn(dev
, "dev %016llx sent sense data, but stat(0x%x) is not CHECK CONDITION\n",
31 SAS_ADDR(task
->dev
->sas_addr
), iu
->status
);
34 /* when datapres contains corrupt/unknown value... */
35 tstat
->stat
= SAM_STAT_CHECK_CONDITION
;
37 EXPORT_SYMBOL_GPL(sas_ssp_task_response
);