linux/drivers/scsi/elx/efct/efct_io.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_IO_H__)
   8#define __EFCT_IO_H__
   9
  10#include "efct_lio.h"
  11
  12#define EFCT_LOG_ENABLE_IO_ERRORS(efct)         \
  13                (((efct) != NULL) ? (((efct)->logmask & (1U << 6)) != 0) : 0)
  14
  15#define io_error_log(io, fmt, ...)  \
  16        do { \
  17                if (EFCT_LOG_ENABLE_IO_ERRORS(io->efct)) \
  18                        efc_log_warn(io->efct, fmt, ##__VA_ARGS__); \
  19        } while (0)
  20
  21#define SCSI_CMD_BUF_LENGTH     48
  22#define SCSI_RSP_BUF_LENGTH     (FCP_RESP_WITH_EXT + SCSI_SENSE_BUFFERSIZE)
  23#define EFCT_NUM_SCSI_IOS       8192
  24
  25enum efct_io_type {
  26        EFCT_IO_TYPE_IO = 0,
  27        EFCT_IO_TYPE_ELS,
  28        EFCT_IO_TYPE_CT,
  29        EFCT_IO_TYPE_CT_RESP,
  30        EFCT_IO_TYPE_BLS_RESP,
  31        EFCT_IO_TYPE_ABORT,
  32
  33        EFCT_IO_TYPE_MAX,
  34};
  35
  36enum efct_els_state {
  37        EFCT_ELS_REQUEST = 0,
  38        EFCT_ELS_REQUEST_DELAYED,
  39        EFCT_ELS_REQUEST_DELAY_ABORT,
  40        EFCT_ELS_REQ_ABORT,
  41        EFCT_ELS_REQ_ABORTED,
  42        EFCT_ELS_ABORT_IO_COMPL,
  43};
  44
  45/**
  46 * Scsi target IO object
  47 * @efct:               pointer back to efct
  48 * @instance_index:     unique instance index value
  49 * @io:                 IO display name
  50 * @node:               pointer to node
  51 * @list_entry:         io list entry
  52 * @io_pending_link:    io pending list entry
  53 * @ref:                reference counter
  54 * @release:            release callback function
  55 * @init_task_tag:      initiator task tag (OX_ID) for back-end and SCSI logging
  56 * @tgt_task_tag:       target task tag (RX_ID) for back-end and SCSI logging
  57 * @hw_tag:             HW layer unique IO id
  58 * @tag:                unique IO identifier
  59 * @sgl:                SGL
  60 * @sgl_allocated:      Number of allocated SGEs
  61 * @sgl_count:          Number of SGEs in this SGL
  62 * @tgt_io:             backend target private IO data
  63 * @exp_xfer_len:       expected data transfer length, based on FC header
  64 * @hw_priv:            Declarations private to HW/SLI
  65 * @io_type:            indicates what this struct efct_io structure is used for
  66 * @hio:                hw io object
  67 * @transferred:        Number of bytes transferred
  68 * @auto_resp:          set if auto_trsp was set
  69 * @low_latency:        set if low latency request
  70 * @wq_steering:        selected WQ steering request
  71 * @wq_class:           selected WQ class if steering is class
  72 * @xfer_req:           transfer size for current request
  73 * @scsi_tgt_cb:        target callback function
  74 * @scsi_tgt_cb_arg:    target callback function argument
  75 * @abort_cb:           abort callback function
  76 * @abort_cb_arg:       abort callback function argument
  77 * @bls_cb:             BLS callback function
  78 * @bls_cb_arg:         BLS callback function argument
  79 * @tmf_cmd:            TMF command being processed
  80 * @abort_rx_id:        rx_id from the ABTS that initiated the command abort
  81 * @cmd_tgt:            True if this is a Target command
  82 * @send_abts:          when aborting, indicates ABTS is to be sent
  83 * @cmd_ini:            True if this is an Initiator command
  84 * @seq_init:           True if local node has sequence initiative
  85 * @iparam:             iparams for hw io send call
  86 * @hio_type:           HW IO type
  87 * @wire_len:           wire length
  88 * @hw_cb:              saved HW callback
  89 * @io_to_abort:        for abort handling, pointer to IO to abort
  90 * @rspbuf:             SCSI Response buffer
  91 * @timeout:            Timeout value in seconds for this IO
  92 * @cs_ctl:             CS_CTL priority for this IO
  93 * @io_free:            Is io object in freelist
  94 * @app_id:             application id
  95 */
  96struct efct_io {
  97        struct efct             *efct;
  98        u32                     instance_index;
  99        const char              *display_name;
 100        struct efct_node        *node;
 101
 102        struct list_head        list_entry;
 103        struct list_head        io_pending_link;
 104        struct kref             ref;
 105        void (*release)(struct kref *arg);
 106        u32                     init_task_tag;
 107        u32                     tgt_task_tag;
 108        u32                     hw_tag;
 109        u32                     tag;
 110        struct efct_scsi_sgl    *sgl;
 111        u32                     sgl_allocated;
 112        u32                     sgl_count;
 113        struct efct_scsi_tgt_io tgt_io;
 114        u32                     exp_xfer_len;
 115
 116        void                    *hw_priv;
 117
 118        enum efct_io_type       io_type;
 119        struct efct_hw_io       *hio;
 120        size_t                  transferred;
 121
 122        bool                    auto_resp;
 123        bool                    low_latency;
 124        u8                      wq_steering;
 125        u8                      wq_class;
 126        u64                     xfer_req;
 127        efct_scsi_io_cb_t       scsi_tgt_cb;
 128        void                    *scsi_tgt_cb_arg;
 129        efct_scsi_io_cb_t       abort_cb;
 130        void                    *abort_cb_arg;
 131        efct_scsi_io_cb_t       bls_cb;
 132        void                    *bls_cb_arg;
 133        enum efct_scsi_tmf_cmd  tmf_cmd;
 134        u16                     abort_rx_id;
 135
 136        bool                    cmd_tgt;
 137        bool                    send_abts;
 138        bool                    cmd_ini;
 139        bool                    seq_init;
 140        union efct_hw_io_param_u iparam;
 141        enum efct_hw_io_type    hio_type;
 142        u64                     wire_len;
 143        void                    *hw_cb;
 144
 145        struct efct_io          *io_to_abort;
 146
 147        struct efc_dma          rspbuf;
 148        u32                     timeout;
 149        u8                      cs_ctl;
 150        u8                      io_free;
 151        u32                     app_id;
 152};
 153
 154struct efct_io_cb_arg {
 155        int status;
 156        int ext_status;
 157        void *app;
 158};
 159
 160struct efct_io_pool *
 161efct_io_pool_create(struct efct *efct, u32 num_sgl);
 162int
 163efct_io_pool_free(struct efct_io_pool *io_pool);
 164u32
 165efct_io_pool_allocated(struct efct_io_pool *io_pool);
 166
 167struct efct_io *
 168efct_io_pool_io_alloc(struct efct_io_pool *io_pool);
 169void
 170efct_io_pool_io_free(struct efct_io_pool *io_pool, struct efct_io *io);
 171struct efct_io *
 172efct_io_find_tgt_io(struct efct *efct, struct efct_node *node,
 173                    u16 ox_id, u16 rx_id);
 174#endif /* __EFCT_IO_H__ */
 175