123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
- * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
- */
- #ifndef _EFCT_HW_H
- #define _EFCT_HW_H
- #include "../libefc_sli/sli4.h"
- /*
- * EFCT PCI IDs
- */
- #define EFCT_VENDOR_ID 0x10df
- /* LightPulse 16Gb x 4 FC (lancer-g6) */
- #define EFCT_DEVICE_LANCER_G6 0xe307
- /* LightPulse 32Gb x 4 FC (lancer-g7) */
- #define EFCT_DEVICE_LANCER_G7 0xf407
- /*Default RQ entries len used by driver*/
- #define EFCT_HW_RQ_ENTRIES_MIN 512
- #define EFCT_HW_RQ_ENTRIES_DEF 1024
- #define EFCT_HW_RQ_ENTRIES_MAX 4096
- /*Defines the size of the RQ buffers used for each RQ*/
- #define EFCT_HW_RQ_SIZE_HDR 128
- #define EFCT_HW_RQ_SIZE_PAYLOAD 1024
- /*Define the maximum number of multi-receive queues*/
- #define EFCT_HW_MAX_MRQS 8
- /*
- * Define count of when to set the WQEC bit in a submitted
- * WQE, causing a consummed/released completion to be posted.
- */
- #define EFCT_HW_WQEC_SET_COUNT 32
- /*Send frame timeout in seconds*/
- #define EFCT_HW_SEND_FRAME_TIMEOUT 10
- /*
- * FDT Transfer Hint value, reads greater than this value
- * will be segmented to implement fairness. A value of zero disables
- * the feature.
- */
- #define EFCT_HW_FDT_XFER_HINT 8192
- #define EFCT_HW_TIMECHECK_ITERATIONS 100
- #define EFCT_HW_MAX_NUM_MQ 1
- #define EFCT_HW_MAX_NUM_RQ 32
- #define EFCT_HW_MAX_NUM_EQ 16
- #define EFCT_HW_MAX_NUM_WQ 32
- #define EFCT_HW_DEF_NUM_EQ 1
- #define OCE_HW_MAX_NUM_MRQ_PAIRS 16
- #define EFCT_HW_MQ_DEPTH 128
- #define EFCT_HW_EQ_DEPTH 1024
- /*
- * A CQ will be assinged to each WQ
- * (CQ must have 2X entries of the WQ for abort
- * processing), plus a separate one for each RQ PAIR and one for MQ
- */
- #define EFCT_HW_MAX_NUM_CQ \
- ((EFCT_HW_MAX_NUM_WQ * 2) + 1 + (OCE_HW_MAX_NUM_MRQ_PAIRS * 2))
- #define EFCT_HW_Q_HASH_SIZE 128
- #define EFCT_HW_RQ_HEADER_SIZE 128
- #define EFCT_HW_RQ_HEADER_INDEX 0
- #define EFCT_HW_REQUE_XRI_REGTAG 65534
- /* Options for efct_hw_command() */
- enum efct_cmd_opts {
- /* command executes synchronously and busy-waits for completion */
- EFCT_CMD_POLL,
- /* command executes asynchronously. Uses callback */
- EFCT_CMD_NOWAIT,
- };
- enum efct_hw_reset {
- EFCT_HW_RESET_FUNCTION,
- EFCT_HW_RESET_FIRMWARE,
- EFCT_HW_RESET_MAX
- };
- enum efct_hw_topo {
- EFCT_HW_TOPOLOGY_AUTO,
- EFCT_HW_TOPOLOGY_NPORT,
- EFCT_HW_TOPOLOGY_LOOP,
- EFCT_HW_TOPOLOGY_NONE,
- EFCT_HW_TOPOLOGY_MAX
- };
- /* pack fw revision values into a single uint64_t */
- #define HW_FWREV(a, b, c, d) (((uint64_t)(a) << 48) | ((uint64_t)(b) << 32) \
- | ((uint64_t)(c) << 16) | ((uint64_t)(d)))
- #define EFCT_FW_VER_STR(a, b, c, d) (#a "." #b "." #c "." #d)
- enum efct_hw_io_type {
- EFCT_HW_ELS_REQ,
- EFCT_HW_ELS_RSP,
- EFCT_HW_FC_CT,
- EFCT_HW_FC_CT_RSP,
- EFCT_HW_BLS_ACC,
- EFCT_HW_BLS_RJT,
- EFCT_HW_IO_TARGET_READ,
- EFCT_HW_IO_TARGET_WRITE,
- EFCT_HW_IO_TARGET_RSP,
- EFCT_HW_IO_DNRX_REQUEUE,
- EFCT_HW_IO_MAX,
- };
- enum efct_hw_io_state {
- EFCT_HW_IO_STATE_FREE,
- EFCT_HW_IO_STATE_INUSE,
- EFCT_HW_IO_STATE_WAIT_FREE,
- EFCT_HW_IO_STATE_WAIT_SEC_HIO,
- };
- #define EFCT_TARGET_WRITE_SKIPS 1
- #define EFCT_TARGET_READ_SKIPS 2
- struct efct_hw;
- struct efct_io;
- #define EFCT_CMD_CTX_POOL_SZ 32
- /**
- * HW command context.
- * Stores the state for the asynchronous commands sent to the hardware.
- */
- struct efct_command_ctx {
- struct list_head list_entry;
- int (*cb)(struct efct_hw *hw, int status, u8 *mqe, void *arg);
- void *arg; /* Argument for callback */
- /* buffer holding command / results */
- u8 buf[SLI4_BMBX_SIZE];
- void *ctx; /* upper layer context */
- };
- struct efct_hw_sgl {
- uintptr_t addr;
- size_t len;
- };
- union efct_hw_io_param_u {
- struct sli_bls_params bls;
- struct sli_els_params els;
- struct sli_ct_params fc_ct;
- struct sli_fcp_tgt_params fcp_tgt;
- };
- /* WQ steering mode */
- enum efct_hw_wq_steering {
- EFCT_HW_WQ_STEERING_CLASS,
- EFCT_HW_WQ_STEERING_REQUEST,
- EFCT_HW_WQ_STEERING_CPU,
- };
- /* HW wqe object */
- struct efct_hw_wqe {
- struct list_head list_entry;
- bool abort_wqe_submit_needed;
- bool send_abts;
- u32 id;
- u32 abort_reqtag;
- u8 *wqebuf;
- };
- struct efct_hw_io;
- /* Typedef for HW "done" callback */
- typedef int (*efct_hw_done_t)(struct efct_hw_io *, u32 len, int status,
- u32 ext, void *ul_arg);
- /**
- * HW IO object.
- *
- * Stores the per-IO information necessary
- * for both SLI and efct.
- * @ref: reference counter for hw io object
- * @state: state of IO: free, busy, wait_free
- * @list_entry used for busy, wait_free, free lists
- * @wqe Work queue object, with link for pending
- * @hw pointer back to hardware context
- * @xfer_rdy transfer ready data
- * @type IO type
- * @xbusy Exchange is active in FW
- * @abort_in_progress if TRUE, abort is in progress
- * @status_saved if TRUE, latched status should be returned
- * @wq_class WQ class if steering mode is Class
- * @reqtag request tag for this HW IO
- * @wq WQ assigned to the exchange
- * @done Function called on IO completion
- * @arg argument passed to IO done callback
- * @abort_done Function called on abort completion
- * @abort_arg argument passed to abort done callback
- * @wq_steering WQ steering mode request
- * @saved_status Saved status
- * @saved_len Status length
- * @saved_ext Saved extended status
- * @eq EQ on which this HIO came up
- * @sge_offset SGE data offset
- * @def_sgl_count Count of SGEs in default SGL
- * @abort_reqtag request tag for an abort of this HW IO
- * @indicator Exchange indicator
- * @def_sgl default SGL
- * @sgl pointer to current active SGL
- * @sgl_count count of SGEs in io->sgl
- * @first_data_sge index of first data SGE
- * @n_sge number of active SGEs
- */
- struct efct_hw_io {
- struct kref ref;
- enum efct_hw_io_state state;
- void (*release)(struct kref *arg);
- struct list_head list_entry;
- struct efct_hw_wqe wqe;
- struct efct_hw *hw;
- struct efc_dma xfer_rdy;
- u16 type;
- bool xbusy;
- int abort_in_progress;
- bool status_saved;
- u8 wq_class;
- u16 reqtag;
- struct hw_wq *wq;
- efct_hw_done_t done;
- void *arg;
- efct_hw_done_t abort_done;
- void *abort_arg;
- enum efct_hw_wq_steering wq_steering;
- u32 saved_status;
- u32 saved_len;
- u32 saved_ext;
- struct hw_eq *eq;
- u32 sge_offset;
- u32 def_sgl_count;
- u32 abort_reqtag;
- u32 indicator;
- struct efc_dma def_sgl;
- struct efc_dma *sgl;
- u32 sgl_count;
- u32 first_data_sge;
- u32 n_sge;
- };
- enum efct_hw_port {
- EFCT_HW_PORT_INIT,
- EFCT_HW_PORT_SHUTDOWN,
- };
- /* Node group rpi reference */
- struct efct_hw_rpi_ref {
- atomic_t rpi_count;
- atomic_t rpi_attached;
- };
- enum efct_hw_link_stat {
- EFCT_HW_LINK_STAT_LINK_FAILURE_COUNT,
- EFCT_HW_LINK_STAT_LOSS_OF_SYNC_COUNT,
- EFCT_HW_LINK_STAT_LOSS_OF_SIGNAL_COUNT,
- EFCT_HW_LINK_STAT_PRIMITIVE_SEQ_COUNT,
- EFCT_HW_LINK_STAT_INVALID_XMIT_WORD_COUNT,
- EFCT_HW_LINK_STAT_CRC_COUNT,
- EFCT_HW_LINK_STAT_PRIMITIVE_SEQ_TIMEOUT_COUNT,
- EFCT_HW_LINK_STAT_ELASTIC_BUFFER_OVERRUN_COUNT,
- EFCT_HW_LINK_STAT_ARB_TIMEOUT_COUNT,
- EFCT_HW_LINK_STAT_ADVERTISED_RCV_B2B_CREDIT,
- EFCT_HW_LINK_STAT_CURR_RCV_B2B_CREDIT,
- EFCT_HW_LINK_STAT_ADVERTISED_XMIT_B2B_CREDIT,
- EFCT_HW_LINK_STAT_CURR_XMIT_B2B_CREDIT,
- EFCT_HW_LINK_STAT_RCV_EOFA_COUNT,
- EFCT_HW_LINK_STAT_RCV_EOFDTI_COUNT,
- EFCT_HW_LINK_STAT_RCV_EOFNI_COUNT,
- EFCT_HW_LINK_STAT_RCV_SOFF_COUNT,
- EFCT_HW_LINK_STAT_RCV_DROPPED_NO_AER_COUNT,
- EFCT_HW_LINK_STAT_RCV_DROPPED_NO_RPI_COUNT,
- EFCT_HW_LINK_STAT_RCV_DROPPED_NO_XRI_COUNT,
- EFCT_HW_LINK_STAT_MAX,
- };
- enum efct_hw_host_stat {
- EFCT_HW_HOST_STAT_TX_KBYTE_COUNT,
- EFCT_HW_HOST_STAT_RX_KBYTE_COUNT,
- EFCT_HW_HOST_STAT_TX_FRAME_COUNT,
- EFCT_HW_HOST_STAT_RX_FRAME_COUNT,
- EFCT_HW_HOST_STAT_TX_SEQ_COUNT,
- EFCT_HW_HOST_STAT_RX_SEQ_COUNT,
- EFCT_HW_HOST_STAT_TOTAL_EXCH_ORIG,
- EFCT_HW_HOST_STAT_TOTAL_EXCH_RESP,
- EFCT_HW_HOSY_STAT_RX_P_BSY_COUNT,
- EFCT_HW_HOST_STAT_RX_F_BSY_COUNT,
- EFCT_HW_HOST_STAT_DROP_FRM_DUE_TO_NO_RQ_BUF_COUNT,
- EFCT_HW_HOST_STAT_EMPTY_RQ_TIMEOUT_COUNT,
- EFCT_HW_HOST_STAT_DROP_FRM_DUE_TO_NO_XRI_COUNT,
- EFCT_HW_HOST_STAT_EMPTY_XRI_POOL_COUNT,
- EFCT_HW_HOST_STAT_MAX,
- };
- enum efct_hw_state {
- EFCT_HW_STATE_UNINITIALIZED,
- EFCT_HW_STATE_QUEUES_ALLOCATED,
- EFCT_HW_STATE_ACTIVE,
- EFCT_HW_STATE_RESET_IN_PROGRESS,
- EFCT_HW_STATE_TEARDOWN_IN_PROGRESS,
- };
- struct efct_hw_link_stat_counts {
- u8 overflow;
- u32 counter;
- };
- struct efct_hw_host_stat_counts {
- u32 counter;
- };
- /* Structure used for the hash lookup of queue IDs */
- struct efct_queue_hash {
- bool in_use;
- u16 id;
- u16 index;
- };
- /* WQ callback object */
- struct hw_wq_callback {
- u16 instance_index; /* use for request tag */
- void (*callback)(void *arg, u8 *cqe, int status);
- void *arg;
- struct list_head list_entry;
- };
- struct reqtag_pool {
- spinlock_t lock; /* pool lock */
- struct hw_wq_callback *tags[U16_MAX];
- struct list_head freelist;
- };
- struct efct_hw_config {
- u32 n_eq;
- u32 n_cq;
- u32 n_mq;
- u32 n_rq;
- u32 n_wq;
- u32 n_io;
- u32 n_sgl;
- u32 speed;
- u32 topology;
- /* size of the buffers for first burst */
- u32 rq_default_buffer_size;
- u8 esoc;
- /* MRQ RQ selection policy */
- u8 rq_selection_policy;
- /* RQ quanta if rq_selection_policy == 2 */
- u8 rr_quanta;
- u32 filter_def[SLI4_CMD_REG_FCFI_NUM_RQ_CFG];
- };
- struct efct_hw {
- struct efct *os;
- struct sli4 sli;
- u16 ulp_start;
- u16 ulp_max;
- u32 dump_size;
- enum efct_hw_state state;
- bool hw_setup_called;
- u8 sliport_healthcheck;
- u16 fcf_indicator;
- /* HW configuration */
- struct efct_hw_config config;
- /* calculated queue sizes for each type */
- u32 num_qentries[SLI4_QTYPE_MAX];
- /* Storage for SLI queue objects */
- struct sli4_queue wq[EFCT_HW_MAX_NUM_WQ];
- struct sli4_queue rq[EFCT_HW_MAX_NUM_RQ];
- u16 hw_rq_lookup[EFCT_HW_MAX_NUM_RQ];
- struct sli4_queue mq[EFCT_HW_MAX_NUM_MQ];
- struct sli4_queue cq[EFCT_HW_MAX_NUM_CQ];
- struct sli4_queue eq[EFCT_HW_MAX_NUM_EQ];
- /* HW queue */
- u32 eq_count;
- u32 cq_count;
- u32 mq_count;
- u32 wq_count;
- u32 rq_count;
- u32 cmd_head_count;
- struct list_head eq_list;
- struct efct_queue_hash cq_hash[EFCT_HW_Q_HASH_SIZE];
- struct efct_queue_hash rq_hash[EFCT_HW_Q_HASH_SIZE];
- struct efct_queue_hash wq_hash[EFCT_HW_Q_HASH_SIZE];
- /* Storage for HW queue objects */
- struct hw_wq *hw_wq[EFCT_HW_MAX_NUM_WQ];
- struct hw_rq *hw_rq[EFCT_HW_MAX_NUM_RQ];
- struct hw_mq *hw_mq[EFCT_HW_MAX_NUM_MQ];
- struct hw_cq *hw_cq[EFCT_HW_MAX_NUM_CQ];
- struct hw_eq *hw_eq[EFCT_HW_MAX_NUM_EQ];
- /* count of hw_rq[] entries */
- u32 hw_rq_count;
- /* count of multirq RQs */
- u32 hw_mrq_count;
- struct hw_wq **wq_cpu_array;
- /* Sequence objects used in incoming frame processing */
- struct efc_hw_sequence *seq_pool;
- /* Maintain an ordered, linked list of outstanding HW commands. */
- struct mutex bmbx_lock;
- spinlock_t cmd_lock;
- struct list_head cmd_head;
- struct list_head cmd_pending;
- mempool_t *cmd_ctx_pool;
- mempool_t *mbox_rqst_pool;
- struct sli4_link_event link;
- /* pointer array of IO objects */
- struct efct_hw_io **io;
- /* array of WQE buffs mapped to IO objects */
- u8 *wqe_buffs;
- /* IO lock to synchronize list access */
- spinlock_t io_lock;
- /* List of IO objects in use */
- struct list_head io_inuse;
- /* List of IO objects waiting to be freed */
- struct list_head io_wait_free;
- /* List of IO objects available for allocation */
- struct list_head io_free;
- struct efc_dma loop_map;
- struct efc_dma xfer_rdy;
- struct efc_dma rnode_mem;
- atomic_t io_alloc_failed_count;
- /* stat: wq sumbit count */
- u32 tcmd_wq_submit[EFCT_HW_MAX_NUM_WQ];
- /* stat: wq complete count */
- u32 tcmd_wq_complete[EFCT_HW_MAX_NUM_WQ];
- atomic_t send_frame_seq_id;
- struct reqtag_pool *wq_reqtag_pool;
- };
- enum efct_hw_io_count_type {
- EFCT_HW_IO_INUSE_COUNT,
- EFCT_HW_IO_FREE_COUNT,
- EFCT_HW_IO_WAIT_FREE_COUNT,
- EFCT_HW_IO_N_TOTAL_IO_COUNT,
- };
- /* HW queue data structures */
- struct hw_eq {
- struct list_head list_entry;
- enum sli4_qtype type;
- u32 instance;
- u32 entry_count;
- u32 entry_size;
- struct efct_hw *hw;
- struct sli4_queue *queue;
- struct list_head cq_list;
- u32 use_count;
- };
- struct hw_cq {
- struct list_head list_entry;
- enum sli4_qtype type;
- u32 instance;
- u32 entry_count;
- u32 entry_size;
- struct hw_eq *eq;
- struct sli4_queue *queue;
- struct list_head q_list;
- u32 use_count;
- };
- struct hw_q {
- struct list_head list_entry;
- enum sli4_qtype type;
- };
- struct hw_mq {
- struct list_head list_entry;
- enum sli4_qtype type;
- u32 instance;
- u32 entry_count;
- u32 entry_size;
- struct hw_cq *cq;
- struct sli4_queue *queue;
- u32 use_count;
- };
- struct hw_wq {
- struct list_head list_entry;
- enum sli4_qtype type;
- u32 instance;
- struct efct_hw *hw;
- u32 entry_count;
- u32 entry_size;
- struct hw_cq *cq;
- struct sli4_queue *queue;
- u32 class;
- /* WQ consumed */
- u32 wqec_set_count;
- u32 wqec_count;
- u32 free_count;
- u32 total_submit_count;
- struct list_head pending_list;
- /* HW IO allocated for use with Send Frame */
- struct efct_hw_io *send_frame_io;
- /* Stats */
- u32 use_count;
- u32 wq_pending_count;
- };
- struct hw_rq {
- struct list_head list_entry;
- enum sli4_qtype type;
- u32 instance;
- u32 entry_count;
- u32 use_count;
- u32 hdr_entry_size;
- u32 first_burst_entry_size;
- u32 data_entry_size;
- bool is_mrq;
- u32 base_mrq_id;
- struct hw_cq *cq;
- u8 filter_mask;
- struct sli4_queue *hdr;
- struct sli4_queue *first_burst;
- struct sli4_queue *data;
- struct efc_hw_rq_buffer *hdr_buf;
- struct efc_hw_rq_buffer *fb_buf;
- struct efc_hw_rq_buffer *payload_buf;
- /* RQ tracker for this RQ */
- struct efc_hw_sequence **rq_tracker;
- };
- struct efct_hw_send_frame_context {
- struct efct_hw *hw;
- struct hw_wq_callback *wqcb;
- struct efct_hw_wqe wqe;
- void (*callback)(int status, void *arg);
- void *arg;
- /* General purpose elements */
- struct efc_hw_sequence *seq;
- struct efc_dma payload;
- };
- struct efct_hw_grp_hdr {
- u32 size;
- __be32 magic_number;
- u32 word2;
- u8 rev_name[128];
- u8 date[12];
- u8 revision[32];
- };
- static inline int
- efct_hw_get_link_speed(struct efct_hw *hw) {
- return hw->link.speed;
- }
- int
- efct_hw_setup(struct efct_hw *hw, void *os, struct pci_dev *pdev);
- int efct_hw_init(struct efct_hw *hw);
- int
- efct_hw_parse_filter(struct efct_hw *hw, void *value);
- int
- efct_hw_init_queues(struct efct_hw *hw);
- int
- efct_hw_map_wq_cpu(struct efct_hw *hw);
- uint64_t
- efct_get_wwnn(struct efct_hw *hw);
- uint64_t
- efct_get_wwpn(struct efct_hw *hw);
- int efct_hw_rx_allocate(struct efct_hw *hw);
- int efct_hw_rx_post(struct efct_hw *hw);
- void efct_hw_rx_free(struct efct_hw *hw);
- int
- efct_hw_command(struct efct_hw *hw, u8 *cmd, u32 opts, void *cb,
- void *arg);
- int
- efct_issue_mbox_rqst(void *base, void *cmd, void *cb, void *arg);
- struct efct_hw_io *efct_hw_io_alloc(struct efct_hw *hw);
- int efct_hw_io_free(struct efct_hw *hw, struct efct_hw_io *io);
- u8 efct_hw_io_inuse(struct efct_hw *hw, struct efct_hw_io *io);
- int
- efct_hw_io_send(struct efct_hw *hw, enum efct_hw_io_type type,
- struct efct_hw_io *io, union efct_hw_io_param_u *iparam,
- void *cb, void *arg);
- int
- efct_hw_io_register_sgl(struct efct_hw *hw, struct efct_hw_io *io,
- struct efc_dma *sgl,
- u32 sgl_count);
- int
- efct_hw_io_init_sges(struct efct_hw *hw,
- struct efct_hw_io *io, enum efct_hw_io_type type);
- int
- efct_hw_io_add_sge(struct efct_hw *hw, struct efct_hw_io *io,
- uintptr_t addr, u32 length);
- int
- efct_hw_io_abort(struct efct_hw *hw, struct efct_hw_io *io_to_abort,
- bool send_abts, void *cb, void *arg);
- u32
- efct_hw_io_get_count(struct efct_hw *hw,
- enum efct_hw_io_count_type io_count_type);
- struct efct_hw_io
- *efct_hw_io_lookup(struct efct_hw *hw, u32 indicator);
- void efct_hw_io_abort_all(struct efct_hw *hw);
- void efct_hw_io_free_internal(struct kref *arg);
- /* HW WQ request tag API */
- struct reqtag_pool *efct_hw_reqtag_pool_alloc(struct efct_hw *hw);
- void efct_hw_reqtag_pool_free(struct efct_hw *hw);
- struct hw_wq_callback
- *efct_hw_reqtag_alloc(struct efct_hw *hw,
- void (*callback)(void *arg, u8 *cqe,
- int status), void *arg);
- void
- efct_hw_reqtag_free(struct efct_hw *hw, struct hw_wq_callback *wqcb);
- struct hw_wq_callback
- *efct_hw_reqtag_get_instance(struct efct_hw *hw, u32 instance_index);
- /* RQ completion handlers for RQ pair mode */
- int
- efct_hw_rqpair_process_rq(struct efct_hw *hw,
- struct hw_cq *cq, u8 *cqe);
- int
- efct_hw_rqpair_sequence_free(struct efct_hw *hw, struct efc_hw_sequence *seq);
- static inline void
- efct_hw_sequence_copy(struct efc_hw_sequence *dst,
- struct efc_hw_sequence *src)
- {
- /* Copy src to dst, then zero out the linked list link */
- *dst = *src;
- }
- int
- efct_efc_hw_sequence_free(struct efc *efc, struct efc_hw_sequence *seq);
- static inline int
- efct_hw_sequence_free(struct efct_hw *hw, struct efc_hw_sequence *seq)
- {
- /* Only RQ pair mode is supported */
- return efct_hw_rqpair_sequence_free(hw, seq);
- }
- int
- efct_hw_eq_process(struct efct_hw *hw, struct hw_eq *eq,
- u32 max_isr_time_msec);
- void efct_hw_cq_process(struct efct_hw *hw, struct hw_cq *cq);
- void
- efct_hw_wq_process(struct efct_hw *hw, struct hw_cq *cq,
- u8 *cqe, int status, u16 rid);
- void
- efct_hw_xabt_process(struct efct_hw *hw, struct hw_cq *cq,
- u8 *cqe, u16 rid);
- int
- efct_hw_process(struct efct_hw *hw, u32 vector, u32 max_isr_time_msec);
- int
- efct_hw_queue_hash_find(struct efct_queue_hash *hash, u16 id);
- int efct_hw_wq_write(struct hw_wq *wq, struct efct_hw_wqe *wqe);
- int
- efct_hw_send_frame(struct efct_hw *hw, struct fc_frame_header *hdr,
- u8 sof, u8 eof, struct efc_dma *payload,
- struct efct_hw_send_frame_context *ctx,
- void (*callback)(void *arg, u8 *cqe, int status),
- void *arg);
- int
- efct_els_hw_srrs_send(struct efc *efc, struct efc_disc_io *io);
- int
- efct_efc_bls_send(struct efc *efc, u32 type, struct sli_bls_params *bls);
- int
- efct_hw_bls_send(struct efct *efct, u32 type, struct sli_bls_params *bls_params,
- void *cb, void *arg);
- /* Function for retrieving link statistics */
- int
- efct_hw_get_link_stats(struct efct_hw *hw,
- u8 req_ext_counters,
- u8 clear_overflow_flags,
- u8 clear_all_counters,
- void (*efct_hw_link_stat_cb_t)(int status,
- u32 num_counters,
- struct efct_hw_link_stat_counts *counters, void *arg),
- void *arg);
- /* Function for retrieving host statistics */
- int
- efct_hw_get_host_stats(struct efct_hw *hw,
- u8 cc,
- void (*efct_hw_host_stat_cb_t)(int status,
- u32 num_counters,
- struct efct_hw_host_stat_counts *counters, void *arg),
- void *arg);
- int
- efct_hw_firmware_write(struct efct_hw *hw, struct efc_dma *dma,
- u32 size, u32 offset, int last,
- void (*cb)(int status, u32 bytes_written,
- u32 change_status, void *arg),
- void *arg);
- typedef void (*efct_hw_async_cb_t)(struct efct_hw *hw, int status,
- u8 *mqe, void *arg);
- int
- efct_hw_async_call(struct efct_hw *hw, efct_hw_async_cb_t callback, void *arg);
- struct hw_eq *efct_hw_new_eq(struct efct_hw *hw, u32 entry_count);
- struct hw_cq *efct_hw_new_cq(struct hw_eq *eq, u32 entry_count);
- u32
- efct_hw_new_cq_set(struct hw_eq *eqs[], struct hw_cq *cqs[],
- u32 num_cqs, u32 entry_count);
- struct hw_mq *efct_hw_new_mq(struct hw_cq *cq, u32 entry_count);
- struct hw_wq
- *efct_hw_new_wq(struct hw_cq *cq, u32 entry_count);
- u32
- efct_hw_new_rq_set(struct hw_cq *cqs[], struct hw_rq *rqs[],
- u32 num_rq_pairs, u32 entry_count);
- void efct_hw_del_eq(struct hw_eq *eq);
- void efct_hw_del_cq(struct hw_cq *cq);
- void efct_hw_del_mq(struct hw_mq *mq);
- void efct_hw_del_wq(struct hw_wq *wq);
- void efct_hw_del_rq(struct hw_rq *rq);
- void efct_hw_queue_teardown(struct efct_hw *hw);
- void efct_hw_teardown(struct efct_hw *hw);
- int
- efct_hw_reset(struct efct_hw *hw, enum efct_hw_reset reset);
- int
- efct_hw_port_control(struct efct_hw *hw, enum efct_hw_port ctrl,
- uintptr_t value,
- void (*cb)(int status, uintptr_t value, void *arg),
- void *arg);
- #endif /* __EFCT_H__ */
|