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