2019-05-19 15:08:55 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2018-11-15 13:20:29 +03:00
# include "sas_internal.h"
2008-01-18 19:47:01 +03:00
# include <linux/kernel.h>
2011-05-27 17:37:25 +04:00
# include <linux/export.h>
2008-01-18 19:47:01 +03:00
# include <scsi/sas.h>
# include <scsi/libsas.h>
/* fill task_status_struct based on SSP response frame */
void sas_ssp_task_response ( struct device * dev , struct sas_task * task ,
struct ssp_response_iu * iu )
{
struct task_status_struct * tstat = & task - > task_status ;
tstat - > resp = SAS_TASK_COMPLETE ;
2022-02-17 18:42:30 +03:00
switch ( iu - > datapres ) {
case SAS_DATAPRES_NO_DATA :
2008-01-18 19:47:01 +03:00
tstat - > stat = iu - > status ;
2022-02-17 18:42:30 +03:00
break ;
case SAS_DATAPRES_RESPONSE_DATA :
2008-01-18 19:47:01 +03:00
tstat - > stat = iu - > resp_data [ 3 ] ;
2022-02-17 18:42:30 +03:00
break ;
case SAS_DATAPRES_SENSE_DATA :
2021-05-24 05:54:55 +03:00
tstat - > stat = SAS_SAM_STAT_CHECK_CONDITION ;
2008-01-18 19:47:01 +03:00
tstat - > buf_valid_size =
min_t ( int , SAS_STATUS_BUF_SIZE ,
be32_to_cpu ( iu - > sense_data_len ) ) ;
memcpy ( tstat - > buf , iu - > sense_data , tstat - > buf_valid_size ) ;
2010-07-28 00:51:13 +04:00
if ( iu - > status ! = SAM_STAT_CHECK_CONDITION )
2019-12-19 15:35:57 +03:00
dev_warn ( dev , " dev %016llx sent sense data, but stat(0x%x) is not CHECK CONDITION \n " ,
2018-11-15 13:20:31 +03:00
SAS_ADDR ( task - > dev - > sas_addr ) , iu - > status ) ;
2022-02-17 18:42:30 +03:00
break ;
default :
2008-01-18 19:47:01 +03:00
/* when datapres contains corrupt/unknown value... */
2021-05-24 05:54:55 +03:00
tstat - > stat = SAS_SAM_STAT_CHECK_CONDITION ;
2022-02-17 18:42:30 +03:00
}
2008-01-18 19:47:01 +03:00
}
EXPORT_SYMBOL_GPL ( sas_ssp_task_response ) ;