linux/drivers/scsi/elx/efct/efct_scsi.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
   4 * “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     16
  32#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  1
  43
  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);
 148int
 149efct_scsi_tgt_new_nport(struct efc *efc, struct efc_nport *nport);
 150void
 151efct_scsi_tgt_del_nport(struct efc *efc, struct efc_nport *nport);
 152
 153int
 154efct_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
 161int
 162efct_scsi_del_initiator(struct efc *efc, struct efc_node *node, int reason);
 163void
 164efct_scsi_recv_cmd(struct efct_io *io, uint64_t lun, u8 *cdb, u32 cdb_len,
 165                   u32 flags);
 166int
 167efct_scsi_recv_tmf(struct efct_io *tmfio, u32 lun, enum efct_scsi_tmf_cmd cmd,
 168                   struct efct_io *abortio, u32 flags);
 169int
 170efct_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);
 172int
 173efct_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);
 175int
 176efct_scsi_send_resp(struct efct_io *io, u32 flags,
 177                struct efct_scsi_cmd_resp *rsp, efct_scsi_io_cb_t cb, void *arg);
 178int
 179efct_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);
 181int
 182efct_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
 192int
 193efct_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