From: Hannes Reinecke <hare@suse.de>
To: James Smart <jsmart2021@gmail.com>, linux-scsi@vger.kernel.org
Cc: dwagner@suse.de, maier@linux.ibm.com, bvanassche@acm.org,
herbszt@gmx.de, natechancellor@gmail.com, rdunlap@infradead.org,
Ram Vegesna <ram.vegesna@broadcom.com>
Subject: Re: [PATCH v3 15/31] elx: efct: Data structures and defines for hw operations
Date: Thu, 16 Apr 2020 08:51:53 +0200 [thread overview]
Message-ID: <d1b6cda5-6f58-a906-7b93-c0bb1c42a6a9@suse.de> (raw)
In-Reply-To: <20200412033303.29574-16-jsmart2021@gmail.com>
On 4/12/20 5:32 AM, James Smart wrote:
> This patch starts the population of the efct target mode
> driver. The driver is contained in the drivers/scsi/elx/efct
> subdirectory.
>
> This patch creates the efct directory and starts population of
> the driver by adding SLI-4 configuration parameters, data structures
> for configuring SLI-4 queues, converting from os to SLI-4 IO requests,
> and handling async events.
>
> Signed-off-by: Ram Vegesna <ram.vegesna@broadcom.com>
> Signed-off-by: James Smart <jsmart2021@gmail.com>
>
> ---
> v3:
> Changed anonymous enums to named.
> Removed some structures and defines which are not used.
> Reworked on efct_hw_io_param struct which can be used for holding
> params in WQE submission.
> ---
> drivers/scsi/elx/efct/efct_hw.h | 617 ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 617 insertions(+)
> create mode 100644 drivers/scsi/elx/efct/efct_hw.h
>
> diff --git a/drivers/scsi/elx/efct/efct_hw.h b/drivers/scsi/elx/efct/efct_hw.h
> new file mode 100644
> index 000000000000..b3d4d4bc8d8c
> --- /dev/null
> +++ b/drivers/scsi/elx/efct/efct_hw.h
> @@ -0,0 +1,617 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright (C) 2019 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_rtn {
> + EFCT_HW_RTN_SUCCESS = 0,
> + EFCT_HW_RTN_SUCCESS_SYNC = 1,
> + EFCT_HW_RTN_ERROR = -1,
> + EFCT_HW_RTN_NO_RESOURCES = -2,
> + EFCT_HW_RTN_NO_MEMORY = -3,
> + EFCT_HW_RTN_IO_NOT_ACTIVE = -4,
> + EFCT_HW_RTN_IO_ABORT_IN_PROGRESS = -5,
> + EFCT_HW_RTN_IO_PORT_OWNED_ALREADY_ABORTED = -6,
> + EFCT_HW_RTN_INVALID_ARG = -7,
> +};
> +
> +#define EFCT_HW_RTN_IS_ERROR(e) ((e) < 0)
> +
> +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_ELS_RSP_SID,
> + EFCT_HW_FC_CT,
> + EFCT_HW_FC_CT_RSP,
> + EFCT_HW_BLS_ACC,
> + EFCT_HW_BLS_ACC_SID,
> + 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,
> +};
> +
> +struct efct_hw;
> +
> +/**
> + * 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 */
> + u8 *buf; /* buffer holding command / results */
> + 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;
> +};
> +
> +/**
> + * HW IO object.
> + *
> + * Stores the per-IO information necessary
> + * for both the lower (SLI) and upper
> + * layers (efct).
> + */
> +struct efct_hw_io {
> + /* Owned by HW */
> +
> + /* reference counter and callback function */
> + struct kref ref;
> + void (*release)(struct kref *arg);
> + /* used for busy, wait_free, free lists */
> + struct list_head list_entry;
> + /* used for timed_wqe list */
> + struct list_head wqe_link;
> + /* used for io posted dnrx list */
> + struct list_head dnrx_link;
> + /* state of IO: free, busy, wait_free */
> + enum efct_hw_io_state state;
> + /* Work queue object, with link for pending */
> + struct efct_hw_wqe wqe;
> + /* pointer back to hardware context */
> + struct efct_hw *hw;
> + struct efc_remote_node *rnode;
> + struct efc_dma xfer_rdy;
> + u16 type;
> + /* WQ assigned to the exchange */
> + struct hw_wq *wq;
> + /* Exchange is active in FW */
> + bool xbusy;
> + /* Function called on IO completion */
> + int
> + (*done)(struct efct_hw_io *hio,
> + struct efc_remote_node *rnode,
> + u32 len, int status,
> + u32 ext, void *ul_arg);
> + /* argument passed to "IO done" callback */
> + void *arg;
> + /* Function called on abort completion */
> + int
> + (*abort_done)(struct efct_hw_io *hio,
> + struct efc_remote_node *rnode,
> + u32 len, int status,
> + u32 ext, void *ul_arg);
> + /* argument passed to "abort done" callback */
> + void *abort_arg;
> + /* needed for bug O127585: length of IO */
> + size_t length;
> + /* timeout value for target WQEs */
> + u8 tgt_wqe_timeout;
> + /* timestamp when current WQE was submitted */
> + u64 submit_ticks;
> +
> + /* if TRUE, latched status shld be returned */
> + bool status_saved;
> + /* if TRUE, abort is in progress */
> + bool abort_in_progress;
> + u32 saved_status;
> + u32 saved_len;
> + u32 saved_ext;
> +
> + /* EQ that this HIO came up on */
> + struct hw_eq *eq;
> + /* WQ steering mode request */
> + enum efct_hw_wq_steering wq_steering;
> + /* WQ class if steering mode is Class */
> + u8 wq_class;
> +
> + /* request tag for this HW IO */
> + u16 reqtag;
> + /* request tag for an abort of this HW IO
> + * (note: this is a 32 bit value
> + * to allow us to use UINT32_MAX as an uninitialized value)
> + */
> + u32 abort_reqtag;
> + u32 indicator; /* XRI */
> + struct efc_dma def_sgl; /* default SGL*/
> + /* Count of SGEs in default SGL */
> + u32 def_sgl_count;
> + /* pointer to current active SGL */
> + struct efc_dma *sgl;
> + u32 sgl_count; /* count of SGEs in io->sgl */
> + u32 first_data_sge; /* index of first data SGE */
> + struct efc_dma *ovfl_sgl; /* overflow SGL */
> + u32 ovfl_sgl_count;
> + /* pointer to overflow segment len */
> + struct sli4_lsp_sge *ovfl_lsp;
> + u32 n_sge; /* number of active SGEs */
> + u32 sge_offset;
> +
> + /* where upper layer can store ref to its IO */
> + void *ul_io;
> +};
> +
Please consider running 'pahole' on this structure and rearrange it.
Looks like it'll required quite some padding which could be avoided.
> +/* Typedef for HW "done" callback */
> +typedef int (*efct_hw_done_t)(struct efct_hw_io *, struct efc_remote_node *,
> + u32 len, int status, u32 ext, void *ul_arg);
> +
> +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;
> +
> + /* HW configuration */
> + struct efct_hw_config config;
> +
> + /* calculated queue sizes for each type */
> + u32 num_qentries[SLI_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;
> + 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;
> +
> + /* Sequence objects used in incoming frame processing */
> + void *seq_pool;
> +
> + /* Maintain an ordered, linked list of outstanding HW commands. */
> + spinlock_t cmd_lock;
> + struct list_head cmd_head;
> + struct list_head cmd_pending;
> + u32 cmd_head_count;
> +
> + struct sli4_link_event link;
> + struct efc_domain *domain;
> +
> + u16 fcf_indicator;
> +
> + /* 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;
> + /* IO lock to synchronize IO aborting */
> + spinlock_t io_abort_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 dump_sges;
> +
> + struct efc_dma rnode_mem;
> +
> + struct efct_hw_rpi_ref *rpi_ref;
> +
> + 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];
> +
> + struct reqtag_pool *wq_reqtag_pool;
> + atomic_t send_frame_seq_id;
> +};
> +
> +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];
> +};
> +
> +#endif /* __EFCT_H__ */
>
Other than that:
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer
next prev parent reply other threads:[~2020-04-16 6:52 UTC|newest]
Thread overview: 124+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-12 3:32 [PATCH v3 00/31] [NEW] efct: Broadcom (Emulex) FC Target driver James Smart
2020-04-12 3:32 ` [PATCH v3 01/31] elx: libefc_sli: SLI-4 register offsets and field definitions James Smart
2020-04-14 15:23 ` Daniel Wagner
2020-04-22 4:28 ` James Smart
2020-04-15 12:06 ` Hannes Reinecke
2020-04-23 1:52 ` Roman Bolshakov
2020-04-12 3:32 ` [PATCH v3 02/31] elx: libefc_sli: SLI Descriptors and Queue entries James Smart
2020-04-14 18:02 ` Daniel Wagner
2020-04-22 4:41 ` James Smart
2020-04-15 12:14 ` Hannes Reinecke
2020-04-15 17:43 ` James Bottomley
2020-04-22 4:44 ` James Smart
2020-04-12 3:32 ` [PATCH v3 03/31] elx: libefc_sli: Data structures and defines for mbox commands James Smart
2020-04-14 19:01 ` Daniel Wagner
2020-04-15 12:22 ` Hannes Reinecke
2020-04-12 3:32 ` [PATCH v3 04/31] elx: libefc_sli: queue create/destroy/parse routines James Smart
2020-04-15 10:04 ` Daniel Wagner
2020-04-22 5:05 ` James Smart
2020-04-24 7:29 ` Daniel Wagner
2020-04-24 15:21 ` James Smart
2020-04-15 12:27 ` Hannes Reinecke
2020-04-12 3:32 ` [PATCH v3 05/31] elx: libefc_sli: Populate and post different WQEs James Smart
2020-04-15 14:34 ` Daniel Wagner
2020-04-22 5:08 ` James Smart
2020-04-12 3:32 ` [PATCH v3 06/31] elx: libefc_sli: bmbx routines and SLI config commands James Smart
2020-04-15 16:10 ` Daniel Wagner
2020-04-22 5:12 ` James Smart
2020-04-12 3:32 ` [PATCH v3 07/31] elx: libefc_sli: APIs to setup SLI library James Smart
2020-04-15 12:49 ` Hannes Reinecke
2020-04-15 17:06 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 08/31] elx: libefc: Generic state machine framework James Smart
2020-04-15 12:37 ` Hannes Reinecke
2020-04-15 17:20 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 09/31] elx: libefc: Emulex FC discovery library APIs and definitions James Smart
2020-04-15 12:41 ` Hannes Reinecke
2020-04-15 17:32 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 10/31] elx: libefc: FC Domain state machine interfaces James Smart
2020-04-15 12:50 ` Hannes Reinecke
2020-04-15 17:50 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 11/31] elx: libefc: SLI and FC PORT " James Smart
2020-04-15 15:38 ` Hannes Reinecke
2020-04-22 23:12 ` James Smart
2020-04-15 18:04 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 12/31] elx: libefc: Remote node " James Smart
2020-04-15 15:51 ` Hannes Reinecke
2020-04-23 1:35 ` James Smart
2020-04-23 8:02 ` Daniel Wagner
2020-04-23 18:24 ` James Smart
2020-04-15 18:19 ` Daniel Wagner
2020-04-23 1:32 ` James Smart
2020-04-23 7:49 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 13/31] elx: libefc: Fabric " James Smart
2020-04-15 18:51 ` Daniel Wagner
2020-04-16 6:37 ` Hannes Reinecke
2020-04-23 1:38 ` James Smart
2020-04-12 3:32 ` [PATCH v3 14/31] elx: libefc: FC node ELS and state handling James Smart
2020-04-15 18:56 ` Daniel Wagner
2020-04-23 2:50 ` James Smart
2020-04-23 8:05 ` Daniel Wagner
2020-04-23 8:12 ` Nathan Chancellor
2020-04-16 6:47 ` Hannes Reinecke
2020-04-23 2:55 ` James Smart
2020-04-12 3:32 ` [PATCH v3 15/31] elx: efct: Data structures and defines for hw operations James Smart
2020-04-16 6:51 ` Hannes Reinecke [this message]
2020-04-23 2:57 ` James Smart
2020-04-16 7:22 ` Daniel Wagner
2020-04-23 2:59 ` James Smart
2020-04-12 3:32 ` [PATCH v3 16/31] elx: efct: Driver initialization routines James Smart
2020-04-16 7:11 ` Hannes Reinecke
2020-04-23 3:09 ` James Smart
2020-04-16 8:03 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 17/31] elx: efct: Hardware queues creation and deletion James Smart
2020-04-16 7:14 ` Hannes Reinecke
2020-04-16 8:24 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 18/31] elx: efct: RQ buffer, memory pool allocation and deallocation APIs James Smart
2020-04-16 7:24 ` Hannes Reinecke
2020-04-23 3:16 ` James Smart
2020-04-16 8:41 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 19/31] elx: efct: Hardware IO and SGL initialization James Smart
2020-04-16 7:32 ` Hannes Reinecke
2020-04-16 8:47 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 20/31] elx: efct: Hardware queues processing James Smart
2020-04-16 7:37 ` Hannes Reinecke
2020-04-16 9:17 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 21/31] elx: efct: Unsolicited FC frame processing routines James Smart
2020-04-16 9:36 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 22/31] elx: efct: Extended link Service IO handling James Smart
2020-04-16 7:58 ` Hannes Reinecke
2020-04-23 3:30 ` James Smart
2020-04-16 9:49 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 23/31] elx: efct: SCSI IO handling routines James Smart
2020-04-16 11:40 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 24/31] elx: efct: LIO backend interface routines James Smart
2020-04-12 4:57 ` Bart Van Assche
2020-04-16 11:48 ` Daniel Wagner
2020-04-22 4:20 ` James Smart
2020-04-22 5:09 ` Bart Van Assche
2020-04-23 1:39 ` James Smart
2020-04-16 8:02 ` Hannes Reinecke
2020-04-16 12:34 ` Daniel Wagner
2020-04-22 4:20 ` James Smart
2020-04-12 3:32 ` [PATCH v3 25/31] elx: efct: Hardware IO submission routines James Smart
2020-04-16 8:10 ` Hannes Reinecke
2020-04-16 12:45 ` Daniel Wagner
2020-04-23 3:37 ` James Smart
2020-04-16 12:44 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 26/31] elx: efct: link statistics and SFP data James Smart
2020-04-16 12:55 ` Daniel Wagner
2020-04-12 3:32 ` [PATCH v3 27/31] elx: efct: xport and hardware teardown routines James Smart
2020-04-16 9:45 ` Hannes Reinecke
2020-04-16 13:01 ` Daniel Wagner
2020-04-12 3:33 ` [PATCH v3 28/31] elx: efct: Firmware update, async link processing James Smart
2020-04-16 10:01 ` Hannes Reinecke
2020-04-16 13:10 ` Daniel Wagner
2020-04-12 3:33 ` [PATCH v3 29/31] elx: efct: scsi_transport_fc host interface support James Smart
2020-04-12 3:33 ` [PATCH v3 30/31] elx: efct: Add Makefile and Kconfig for efct driver James Smart
2020-04-16 10:02 ` Hannes Reinecke
2020-04-16 13:15 ` Daniel Wagner
2020-04-12 3:33 ` [PATCH v3 31/31] elx: efct: Tie into kernel Kconfig and build process James Smart
2020-04-12 6:16 ` kbuild test robot
2020-04-12 6:16 ` kbuild test robot
2020-04-12 7:56 ` kbuild test robot
2020-04-12 7:56 ` kbuild test robot
2020-04-16 13:15 ` Daniel Wagner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d1b6cda5-6f58-a906-7b93-c0bb1c42a6a9@suse.de \
--to=hare@suse.de \
--cc=bvanassche@acm.org \
--cc=dwagner@suse.de \
--cc=herbszt@gmx.de \
--cc=jsmart2021@gmail.com \
--cc=linux-scsi@vger.kernel.org \
--cc=maier@linux.ibm.com \
--cc=natechancellor@gmail.com \
--cc=ram.vegesna@broadcom.com \
--cc=rdunlap@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.