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 switch (iu
->datapres
) {
19 case SAS_DATAPRES_NO_DATA
:
20 tstat
->stat
= iu
->status
;
22 case SAS_DATAPRES_RESPONSE_DATA
:
23 tstat
->stat
= iu
->resp_data
[3];
25 case SAS_DATAPRES_SENSE_DATA
:
26 tstat
->stat
= SAS_SAM_STAT_CHECK_CONDITION
;
27 tstat
->buf_valid_size
=
28 min_t(int, SAS_STATUS_BUF_SIZE
,
29 be32_to_cpu(iu
->sense_data_len
));
30 memcpy(tstat
->buf
, iu
->sense_data
, tstat
->buf_valid_size
);
32 if (iu
->status
!= SAM_STAT_CHECK_CONDITION
)
33 dev_warn(dev
, "dev %016llx sent sense data, but stat(0x%x) is not CHECK CONDITION\n",
34 SAS_ADDR(task
->dev
->sas_addr
), iu
->status
);
37 /* when datapres contains corrupt/unknown value... */
38 tstat
->stat
= SAS_SAM_STAT_CHECK_CONDITION
;
41 EXPORT_SYMBOL_GPL(sas_ssp_task_response
);