0001
0002
0003
0004
0005
0006
0007 #if !defined(__EFCT_SCSI_H__)
0008 #define __EFCT_SCSI_H__
0009 #include <scsi/scsi_host.h>
0010 #include <scsi/scsi_transport_fc.h>
0011
0012
0013 #define EFCT_SCSI_CMD_DIR_IN (1 << 0)
0014 #define EFCT_SCSI_CMD_DIR_OUT (1 << 1)
0015 #define EFCT_SCSI_CMD_SIMPLE (1 << 2)
0016 #define EFCT_SCSI_CMD_HEAD_OF_QUEUE (1 << 3)
0017 #define EFCT_SCSI_CMD_ORDERED (1 << 4)
0018 #define EFCT_SCSI_CMD_UNTAGGED (1 << 5)
0019 #define EFCT_SCSI_CMD_ACA (1 << 6)
0020 #define EFCT_SCSI_FIRST_BURST_ERR (1 << 7)
0021 #define EFCT_SCSI_FIRST_BURST_ABORTED (1 << 8)
0022
0023
0024 #define EFCT_SCSI_LAST_DATAPHASE (1 << 0)
0025 #define EFCT_SCSI_NO_AUTO_RESPONSE (1 << 1)
0026 #define EFCT_SCSI_LOW_LATENCY (1 << 2)
0027
0028 #define EFCT_SCSI_SNS_BUF_VALID(sense) ((sense) && \
0029 (0x70 == (((const u8 *)(sense))[0] & 0x70)))
0030
0031 #define EFCT_SCSI_WQ_STEERING_SHIFT 16
0032 #define EFCT_SCSI_WQ_STEERING_MASK (0xf << EFCT_SCSI_WQ_STEERING_SHIFT)
0033 #define EFCT_SCSI_WQ_STEERING_CLASS (0 << EFCT_SCSI_WQ_STEERING_SHIFT)
0034 #define EFCT_SCSI_WQ_STEERING_REQUEST (1 << EFCT_SCSI_WQ_STEERING_SHIFT)
0035 #define EFCT_SCSI_WQ_STEERING_CPU (2 << EFCT_SCSI_WQ_STEERING_SHIFT)
0036
0037 #define EFCT_SCSI_WQ_CLASS_SHIFT (20)
0038 #define EFCT_SCSI_WQ_CLASS_MASK (0xf << EFCT_SCSI_WQ_CLASS_SHIFT)
0039 #define EFCT_SCSI_WQ_CLASS(x) ((x & EFCT_SCSI_WQ_CLASS_MASK) << \
0040 EFCT_SCSI_WQ_CLASS_SHIFT)
0041
0042 #define EFCT_SCSI_WQ_CLASS_LOW_LATENCY 1
0043
0044 struct efct_scsi_cmd_resp {
0045 u8 scsi_status;
0046 u16 scsi_status_qualifier;
0047 u8 *response_data;
0048 u32 response_data_length;
0049 u8 *sense_data;
0050 u32 sense_data_length;
0051 int residual;
0052 u32 response_wire_length;
0053 };
0054
0055 struct efct_vport {
0056 struct efct *efct;
0057 bool is_vport;
0058 struct fc_host_statistics fc_host_stats;
0059 struct Scsi_Host *shost;
0060 struct fc_vport *fc_vport;
0061 u64 npiv_wwpn;
0062 u64 npiv_wwnn;
0063 };
0064
0065
0066 enum efct_scsi_io_status {
0067 EFCT_SCSI_STATUS_GOOD = 0,
0068 EFCT_SCSI_STATUS_ABORTED,
0069 EFCT_SCSI_STATUS_ERROR,
0070 EFCT_SCSI_STATUS_DIF_GUARD_ERR,
0071 EFCT_SCSI_STATUS_DIF_REF_TAG_ERROR,
0072 EFCT_SCSI_STATUS_DIF_APP_TAG_ERROR,
0073 EFCT_SCSI_STATUS_DIF_UNKNOWN_ERROR,
0074 EFCT_SCSI_STATUS_PROTOCOL_CRC_ERROR,
0075 EFCT_SCSI_STATUS_NO_IO,
0076 EFCT_SCSI_STATUS_ABORT_IN_PROGRESS,
0077 EFCT_SCSI_STATUS_CHECK_RESPONSE,
0078 EFCT_SCSI_STATUS_COMMAND_TIMEOUT,
0079 EFCT_SCSI_STATUS_TIMEDOUT_AND_ABORTED,
0080 EFCT_SCSI_STATUS_SHUTDOWN,
0081 EFCT_SCSI_STATUS_NEXUS_LOST,
0082 };
0083
0084 struct efct_node;
0085 struct efct_io;
0086 struct efc_node;
0087 struct efc_nport;
0088
0089
0090 typedef int (*efct_scsi_io_cb_t)(struct efct_io *io,
0091 enum efct_scsi_io_status status,
0092 u32 flags, void *arg);
0093
0094
0095 typedef int (*efct_scsi_rsp_io_cb_t)(struct efct_io *io,
0096 enum efct_scsi_io_status status,
0097 struct efct_scsi_cmd_resp *rsp,
0098 u32 flags, void *arg);
0099
0100
0101 #define EFCT_SCSI_IO_CMPL (1 << 0)
0102
0103 #define EFCT_SCSI_IO_CMPL_RSP_SENT (1 << 1)
0104 #define EFCT_SCSI_IO_ABORTED (1 << 2)
0105
0106
0107 enum efct_scsi_tmf_cmd {
0108 EFCT_SCSI_TMF_ABORT_TASK = 1,
0109 EFCT_SCSI_TMF_QUERY_TASK_SET,
0110 EFCT_SCSI_TMF_ABORT_TASK_SET,
0111 EFCT_SCSI_TMF_CLEAR_TASK_SET,
0112 EFCT_SCSI_TMF_QUERY_ASYNCHRONOUS_EVENT,
0113 EFCT_SCSI_TMF_LOGICAL_UNIT_RESET,
0114 EFCT_SCSI_TMF_CLEAR_ACA,
0115 EFCT_SCSI_TMF_TARGET_RESET,
0116 };
0117
0118
0119 enum efct_scsi_tmf_resp {
0120 EFCT_SCSI_TMF_FUNCTION_COMPLETE = 1,
0121 EFCT_SCSI_TMF_FUNCTION_SUCCEEDED,
0122 EFCT_SCSI_TMF_FUNCTION_IO_NOT_FOUND,
0123 EFCT_SCSI_TMF_FUNCTION_REJECTED,
0124 EFCT_SCSI_TMF_INCORRECT_LOGICAL_UNIT_NUMBER,
0125 EFCT_SCSI_TMF_SERVICE_DELIVERY,
0126 };
0127
0128 struct efct_scsi_sgl {
0129 uintptr_t addr;
0130 uintptr_t dif_addr;
0131 size_t len;
0132 };
0133
0134 enum efct_scsi_io_role {
0135 EFCT_SCSI_IO_ROLE_ORIGINATOR,
0136 EFCT_SCSI_IO_ROLE_RESPONDER,
0137 };
0138
0139 struct efct_io *
0140 efct_scsi_io_alloc(struct efct_node *node);
0141 void efct_scsi_io_free(struct efct_io *io);
0142 struct efct_io *efct_io_get_instance(struct efct *efct, u32 index);
0143
0144 int efct_scsi_tgt_driver_init(void);
0145 int efct_scsi_tgt_driver_exit(void);
0146 int efct_scsi_tgt_new_device(struct efct *efct);
0147 int efct_scsi_tgt_del_device(struct efct *efct);
0148 int
0149 efct_scsi_tgt_new_nport(struct efc *efc, struct efc_nport *nport);
0150 void
0151 efct_scsi_tgt_del_nport(struct efc *efc, struct efc_nport *nport);
0152
0153 int
0154 efct_scsi_new_initiator(struct efc *efc, struct efc_node *node);
0155
0156 enum efct_scsi_del_initiator_reason {
0157 EFCT_SCSI_INITIATOR_DELETED,
0158 EFCT_SCSI_INITIATOR_MISSING,
0159 };
0160
0161 int
0162 efct_scsi_del_initiator(struct efc *efc, struct efc_node *node, int reason);
0163 void
0164 efct_scsi_recv_cmd(struct efct_io *io, uint64_t lun, u8 *cdb, u32 cdb_len,
0165 u32 flags);
0166 int
0167 efct_scsi_recv_tmf(struct efct_io *tmfio, u32 lun, enum efct_scsi_tmf_cmd cmd,
0168 struct efct_io *abortio, u32 flags);
0169 int
0170 efct_scsi_send_rd_data(struct efct_io *io, u32 flags, struct efct_scsi_sgl *sgl,
0171 u32 sgl_count, u64 wire_len, efct_scsi_io_cb_t cb, void *arg);
0172 int
0173 efct_scsi_recv_wr_data(struct efct_io *io, u32 flags, struct efct_scsi_sgl *sgl,
0174 u32 sgl_count, u64 wire_len, efct_scsi_io_cb_t cb, void *arg);
0175 int
0176 efct_scsi_send_resp(struct efct_io *io, u32 flags,
0177 struct efct_scsi_cmd_resp *rsp, efct_scsi_io_cb_t cb, void *arg);
0178 int
0179 efct_scsi_send_tmf_resp(struct efct_io *io, enum efct_scsi_tmf_resp rspcode,
0180 u8 addl_rsp_info[3], efct_scsi_io_cb_t cb, void *arg);
0181 int
0182 efct_scsi_tgt_abort_io(struct efct_io *io, efct_scsi_io_cb_t cb, void *arg);
0183
0184 void efct_scsi_io_complete(struct efct_io *io);
0185
0186 int efct_scsi_reg_fc_transport(void);
0187 void efct_scsi_release_fc_transport(void);
0188 int efct_scsi_new_device(struct efct *efct);
0189 void efct_scsi_del_device(struct efct *efct);
0190 void _efct_scsi_io_free(struct kref *arg);
0191
0192 int
0193 efct_scsi_del_vport(struct efct *efct, struct Scsi_Host *shost);
0194 struct efct_vport *
0195 efct_scsi_new_vport(struct efct *efct, struct device *dev);
0196
0197 int efct_scsi_io_dispatch(struct efct_io *io, void *cb);
0198 int efct_scsi_io_dispatch_abort(struct efct_io *io, void *cb);
0199 void efct_scsi_check_pending(struct efct *efct);
0200 struct efct_io *
0201 efct_bls_send_rjt(struct efct_io *io, struct fc_frame_header *hdr);
0202
0203 #endif