204 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term4 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.5 */6 7#if !defined(__EFCT_SCSI_H__)8#define __EFCT_SCSI_H__9#include <scsi/scsi_host.h>10#include <scsi/scsi_transport_fc.h>11 12/* efct_scsi_rcv_cmd() efct_scsi_rcv_tmf() flags */13#define EFCT_SCSI_CMD_DIR_IN (1 << 0)14#define EFCT_SCSI_CMD_DIR_OUT (1 << 1)15#define EFCT_SCSI_CMD_SIMPLE (1 << 2)16#define EFCT_SCSI_CMD_HEAD_OF_QUEUE (1 << 3)17#define EFCT_SCSI_CMD_ORDERED (1 << 4)18#define EFCT_SCSI_CMD_UNTAGGED (1 << 5)19#define EFCT_SCSI_CMD_ACA (1 << 6)20#define EFCT_SCSI_FIRST_BURST_ERR (1 << 7)21#define EFCT_SCSI_FIRST_BURST_ABORTED (1 << 8)22 23/* efct_scsi_send_rd_data/recv_wr_data/send_resp flags */24#define EFCT_SCSI_LAST_DATAPHASE (1 << 0)25#define EFCT_SCSI_NO_AUTO_RESPONSE (1 << 1)26#define EFCT_SCSI_LOW_LATENCY (1 << 2)27 28#define EFCT_SCSI_SNS_BUF_VALID(sense) ((sense) && \29 (0x70 == (((const u8 *)(sense))[0] & 0x70)))30 31#define EFCT_SCSI_WQ_STEERING_SHIFT 1632#define EFCT_SCSI_WQ_STEERING_MASK (0xf << EFCT_SCSI_WQ_STEERING_SHIFT)33#define EFCT_SCSI_WQ_STEERING_CLASS (0 << EFCT_SCSI_WQ_STEERING_SHIFT)34#define EFCT_SCSI_WQ_STEERING_REQUEST (1 << EFCT_SCSI_WQ_STEERING_SHIFT)35#define EFCT_SCSI_WQ_STEERING_CPU (2 << EFCT_SCSI_WQ_STEERING_SHIFT)36 37#define EFCT_SCSI_WQ_CLASS_SHIFT (20)38#define EFCT_SCSI_WQ_CLASS_MASK (0xf << EFCT_SCSI_WQ_CLASS_SHIFT)39#define EFCT_SCSI_WQ_CLASS(x) ((x & EFCT_SCSI_WQ_CLASS_MASK) << \40 EFCT_SCSI_WQ_CLASS_SHIFT)41 42#define EFCT_SCSI_WQ_CLASS_LOW_LATENCY 143 44struct efct_scsi_cmd_resp {45 u8 scsi_status;46 u16 scsi_status_qualifier;47 u8 *response_data;48 u32 response_data_length;49 u8 *sense_data;50 u32 sense_data_length;51 int residual;52 u32 response_wire_length;53};54 55struct efct_vport {56 struct efct *efct;57 bool is_vport;58 struct fc_host_statistics fc_host_stats;59 struct Scsi_Host *shost;60 struct fc_vport *fc_vport;61 u64 npiv_wwpn;62 u64 npiv_wwnn;63};64 65/* Status values returned by IO callbacks */66enum efct_scsi_io_status {67 EFCT_SCSI_STATUS_GOOD = 0,68 EFCT_SCSI_STATUS_ABORTED,69 EFCT_SCSI_STATUS_ERROR,70 EFCT_SCSI_STATUS_DIF_GUARD_ERR,71 EFCT_SCSI_STATUS_DIF_REF_TAG_ERROR,72 EFCT_SCSI_STATUS_DIF_APP_TAG_ERROR,73 EFCT_SCSI_STATUS_DIF_UNKNOWN_ERROR,74 EFCT_SCSI_STATUS_PROTOCOL_CRC_ERROR,75 EFCT_SCSI_STATUS_NO_IO,76 EFCT_SCSI_STATUS_ABORT_IN_PROGRESS,77 EFCT_SCSI_STATUS_CHECK_RESPONSE,78 EFCT_SCSI_STATUS_COMMAND_TIMEOUT,79 EFCT_SCSI_STATUS_TIMEDOUT_AND_ABORTED,80 EFCT_SCSI_STATUS_SHUTDOWN,81 EFCT_SCSI_STATUS_NEXUS_LOST,82};83 84struct efct_node;85struct efct_io;86struct efc_node;87struct efc_nport;88 89/* Callback used by send_rd_data(), recv_wr_data(), send_resp() */90typedef int (*efct_scsi_io_cb_t)(struct efct_io *io,91 enum efct_scsi_io_status status,92 u32 flags, void *arg);93 94/* Callback used by send_rd_io(), send_wr_io() */95typedef int (*efct_scsi_rsp_io_cb_t)(struct efct_io *io,96 enum efct_scsi_io_status status,97 struct efct_scsi_cmd_resp *rsp,98 u32 flags, void *arg);99 100/* efct_scsi_cb_t flags */101#define EFCT_SCSI_IO_CMPL (1 << 0)102/* IO completed, response sent */103#define EFCT_SCSI_IO_CMPL_RSP_SENT (1 << 1)104#define EFCT_SCSI_IO_ABORTED (1 << 2)105 106/* efct_scsi_recv_tmf() request values */107enum efct_scsi_tmf_cmd {108 EFCT_SCSI_TMF_ABORT_TASK = 1,109 EFCT_SCSI_TMF_QUERY_TASK_SET,110 EFCT_SCSI_TMF_ABORT_TASK_SET,111 EFCT_SCSI_TMF_CLEAR_TASK_SET,112 EFCT_SCSI_TMF_QUERY_ASYNCHRONOUS_EVENT,113 EFCT_SCSI_TMF_LOGICAL_UNIT_RESET,114 EFCT_SCSI_TMF_CLEAR_ACA,115 EFCT_SCSI_TMF_TARGET_RESET,116};117 118/* efct_scsi_send_tmf_resp() response values */119enum efct_scsi_tmf_resp {120 EFCT_SCSI_TMF_FUNCTION_COMPLETE = 1,121 EFCT_SCSI_TMF_FUNCTION_SUCCEEDED,122 EFCT_SCSI_TMF_FUNCTION_IO_NOT_FOUND,123 EFCT_SCSI_TMF_FUNCTION_REJECTED,124 EFCT_SCSI_TMF_INCORRECT_LOGICAL_UNIT_NUMBER,125 EFCT_SCSI_TMF_SERVICE_DELIVERY,126};127 128struct efct_scsi_sgl {129 uintptr_t addr;130 uintptr_t dif_addr;131 size_t len;132};133 134enum efct_scsi_io_role {135 EFCT_SCSI_IO_ROLE_ORIGINATOR,136 EFCT_SCSI_IO_ROLE_RESPONDER,137};138 139struct efct_io *140efct_scsi_io_alloc(struct efct_node *node);141void efct_scsi_io_free(struct efct_io *io);142struct efct_io *efct_io_get_instance(struct efct *efct, u32 index);143 144int efct_scsi_tgt_driver_init(void);145int efct_scsi_tgt_driver_exit(void);146int efct_scsi_tgt_new_device(struct efct *efct);147int efct_scsi_tgt_del_device(struct efct *efct);148int149efct_scsi_tgt_new_nport(struct efc *efc, struct efc_nport *nport);150void151efct_scsi_tgt_del_nport(struct efc *efc, struct efc_nport *nport);152 153int154efct_scsi_new_initiator(struct efc *efc, struct efc_node *node);155 156enum efct_scsi_del_initiator_reason {157 EFCT_SCSI_INITIATOR_DELETED,158 EFCT_SCSI_INITIATOR_MISSING,159};160 161int162efct_scsi_del_initiator(struct efc *efc, struct efc_node *node, int reason);163void164efct_scsi_recv_cmd(struct efct_io *io, uint64_t lun, u8 *cdb, u32 cdb_len,165 u32 flags);166int167efct_scsi_recv_tmf(struct efct_io *tmfio, u32 lun, enum efct_scsi_tmf_cmd cmd,168 struct efct_io *abortio, u32 flags);169int170efct_scsi_send_rd_data(struct efct_io *io, u32 flags, struct efct_scsi_sgl *sgl,171 u32 sgl_count, u64 wire_len, efct_scsi_io_cb_t cb, void *arg);172int173efct_scsi_recv_wr_data(struct efct_io *io, u32 flags, struct efct_scsi_sgl *sgl,174 u32 sgl_count, u64 wire_len, efct_scsi_io_cb_t cb, void *arg);175int176efct_scsi_send_resp(struct efct_io *io, u32 flags,177 struct efct_scsi_cmd_resp *rsp, efct_scsi_io_cb_t cb, void *arg);178int179efct_scsi_send_tmf_resp(struct efct_io *io, enum efct_scsi_tmf_resp rspcode,180 u8 addl_rsp_info[3], efct_scsi_io_cb_t cb, void *arg);181int182efct_scsi_tgt_abort_io(struct efct_io *io, efct_scsi_io_cb_t cb, void *arg);183 184void efct_scsi_io_complete(struct efct_io *io);185 186int efct_scsi_reg_fc_transport(void);187void efct_scsi_release_fc_transport(void);188int efct_scsi_new_device(struct efct *efct);189void efct_scsi_del_device(struct efct *efct);190void _efct_scsi_io_free(struct kref *arg);191 192int193efct_scsi_del_vport(struct efct *efct, struct Scsi_Host *shost);194struct efct_vport *195efct_scsi_new_vport(struct efct *efct, struct device *dev);196 197int efct_scsi_io_dispatch(struct efct_io *io, void *cb);198int efct_scsi_io_dispatch_abort(struct efct_io *io, void *cb);199void efct_scsi_check_pending(struct efct *efct);200struct efct_io *201efct_bls_send_rjt(struct efct_io *io, struct fc_frame_header *hdr);202 203#endif /* __EFCT_SCSI_H__ */204