0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055 #ifndef _ISCI_TASK_H_
0056 #define _ISCI_TASK_H_
0057
0058 #include <scsi/sas_ata.h>
0059 #include "host.h"
0060
0061 #define ISCI_TERMINATION_TIMEOUT_MSEC 500
0062
0063 struct isci_request;
0064
0065
0066
0067
0068
0069
0070
0071 enum isci_tmf_function_codes {
0072
0073 isci_tmf_func_none = 0,
0074 isci_tmf_ssp_task_abort = TMF_ABORT_TASK,
0075 isci_tmf_ssp_lun_reset = TMF_LU_RESET,
0076 };
0077
0078
0079
0080
0081
0082
0083
0084 struct isci_tmf {
0085
0086 struct completion *complete;
0087 enum sas_protocol proto;
0088 union {
0089 struct ssp_response_iu resp_iu;
0090 struct dev_to_host_fis d2h_fis;
0091 u8 rsp_buf[SSP_RESP_IU_MAX_SIZE];
0092 } resp;
0093 unsigned char lun[8];
0094 u16 io_tag;
0095 enum isci_tmf_function_codes tmf_code;
0096 int status;
0097 };
0098
0099 static inline void isci_print_tmf(struct isci_host *ihost, struct isci_tmf *tmf)
0100 {
0101 if (SAS_PROTOCOL_SATA == tmf->proto)
0102 dev_dbg(&ihost->pdev->dev,
0103 "%s: status = %x\n"
0104 "tmf->resp.d2h_fis.status = %x\n"
0105 "tmf->resp.d2h_fis.error = %x\n",
0106 __func__,
0107 tmf->status,
0108 tmf->resp.d2h_fis.status,
0109 tmf->resp.d2h_fis.error);
0110 else
0111 dev_dbg(&ihost->pdev->dev,
0112 "%s: status = %x\n"
0113 "tmf->resp.resp_iu.data_present = %x\n"
0114 "tmf->resp.resp_iu.status = %x\n"
0115 "tmf->resp.resp_iu.data_length = %x\n"
0116 "tmf->resp.resp_iu.data[0] = %x\n"
0117 "tmf->resp.resp_iu.data[1] = %x\n"
0118 "tmf->resp.resp_iu.data[2] = %x\n"
0119 "tmf->resp.resp_iu.data[3] = %x\n",
0120 __func__,
0121 tmf->status,
0122 tmf->resp.resp_iu.datapres,
0123 tmf->resp.resp_iu.status,
0124 be32_to_cpu(tmf->resp.resp_iu.response_data_len),
0125 tmf->resp.resp_iu.resp_data[0],
0126 tmf->resp.resp_iu.resp_data[1],
0127 tmf->resp.resp_iu.resp_data[2],
0128 tmf->resp.resp_iu.resp_data[3]);
0129 }
0130
0131
0132 int isci_task_execute_task(
0133 struct sas_task *task,
0134 gfp_t gfp_flags);
0135
0136 int isci_task_abort_task(
0137 struct sas_task *task);
0138
0139 int isci_task_abort_task_set(
0140 struct domain_device *d_device,
0141 u8 *lun);
0142
0143 int isci_task_clear_task_set(
0144 struct domain_device *d_device,
0145 u8 *lun);
0146
0147 int isci_task_query_task(
0148 struct sas_task *task);
0149
0150 int isci_task_lu_reset(
0151 struct domain_device *d_device,
0152 u8 *lun);
0153
0154 int isci_task_clear_nexus_port(
0155 struct asd_sas_port *port);
0156
0157 int isci_task_clear_nexus_ha(
0158 struct sas_ha_struct *ha);
0159
0160 int isci_task_I_T_nexus_reset(
0161 struct domain_device *d_device);
0162
0163 void isci_task_request_complete(
0164 struct isci_host *isci_host,
0165 struct isci_request *request,
0166 enum sci_task_status completion_status);
0167
0168 u16 isci_task_ssp_request_get_io_tag_to_manage(
0169 struct isci_request *request);
0170
0171 u8 isci_task_ssp_request_get_function(
0172 struct isci_request *request);
0173
0174
0175 void *isci_task_ssp_request_get_response_data_address(
0176 struct isci_request *request);
0177
0178 u32 isci_task_ssp_request_get_response_data_length(
0179 struct isci_request *request);
0180
0181 #endif