Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/drivers/scsi/elx/efct/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 19 kB image not shown  

Quelle  efct_hw.h   Sprache: C

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

Messung V0.5
C=92 H=100 G=95

¤ Dauer der Verarbeitung: 0.2 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.