| /* 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__ */ |