Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
0004  * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
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 /* efct_scsi_rcv_cmd() efct_scsi_rcv_tmf() flags */
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 /* efct_scsi_send_rd_data/recv_wr_data/send_resp flags */
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 /* Status values returned by IO callbacks */
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 /* Callback used by send_rd_data(), recv_wr_data(), send_resp() */
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 /* Callback used by send_rd_io(), send_wr_io() */
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 /* efct_scsi_cb_t flags */
0101 #define EFCT_SCSI_IO_CMPL       (1 << 0)
0102 /* IO completed, response sent */
0103 #define EFCT_SCSI_IO_CMPL_RSP_SENT  (1 << 1)
0104 #define EFCT_SCSI_IO_ABORTED        (1 << 2)
0105 
0106 /* efct_scsi_recv_tmf() request values */
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 /* efct_scsi_send_tmf_resp() response values */
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 /* __EFCT_SCSI_H__ */