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