linux/drivers/scsi/elx/efct/efct_hw.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
   4 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
   5 */
   6
   7#ifndef _EFCT_HW_H
   8#define _EFCT_HW_H
   9
  10#include "../libefc_sli/sli4.h"
  11
  12/*
  13 * EFCT PCI IDs
  14 */
  15#define EFCT_VENDOR_ID                  0x10df
  16/* LightPulse 16Gb x 4 FC (lancer-g6) */
  17#define EFCT_DEVICE_LANCER_G6           0xe307
  18/* LightPulse 32Gb x 4 FC (lancer-g7) */
  19#define EFCT_DEVICE_LANCER_G7           0xf407
  20
  21/*Default RQ entries len used by driver*/
  22#define EFCT_HW_RQ_ENTRIES_MIN          512
  23#define EFCT_HW_RQ_ENTRIES_DEF          1024
  24#define EFCT_HW_RQ_ENTRIES_MAX          4096
  25
  26/*Defines the size of the RQ buffers used for each RQ*/
  27#define EFCT_HW_RQ_SIZE_HDR             128
  28#define EFCT_HW_RQ_SIZE_PAYLOAD         1024
  29
  30/*Define the maximum number of multi-receive queues*/
  31#define EFCT_HW_MAX_MRQS                8
  32
  33/*
  34 * Define count of when to set the WQEC bit in a submitted
  35 * WQE, causing a consummed/released completion to be posted.
  36 */
  37#define EFCT_HW_WQEC_SET_COUNT          32
  38
  39/*Send frame timeout in seconds*/
  40#define EFCT_HW_SEND_FRAME_TIMEOUT      10
  41
  42/*
  43 * FDT Transfer Hint value, reads greater than this value
  44 * will be segmented to implement fairness. A value of zero disables
  45 * the feature.
  46 */
  47#define EFCT_HW_FDT_XFER_HINT           8192
  48
  49#define EFCT_HW_TIMECHECK_ITERATIONS    100
  50#define EFCT_HW_MAX_NUM_MQ              1
  51#define EFCT_HW_MAX_NUM_RQ              32
  52#define EFCT_HW_MAX_NUM_EQ              16
  53#define EFCT_HW_MAX_NUM_WQ              32
  54#define EFCT_HW_DEF_NUM_EQ              1
  55
  56#define OCE_HW_MAX_NUM_MRQ_PAIRS        16
  57
  58#define EFCT_HW_MQ_DEPTH                128
  59#define EFCT_HW_EQ_DEPTH                1024
  60
  61/*
  62 * A CQ will be assinged to each WQ
  63 * (CQ must have 2X entries of the WQ for abort
  64 * processing), plus a separate one for each RQ PAIR and one for MQ
  65 */
  66#define EFCT_HW_MAX_NUM_CQ \
  67        ((EFCT_HW_MAX_NUM_WQ * 2) + 1 + (OCE_HW_MAX_NUM_MRQ_PAIRS * 2))
  68
  69#define EFCT_HW_Q_HASH_SIZE             128
  70#define EFCT_HW_RQ_HEADER_SIZE          128
  71#define EFCT_HW_RQ_HEADER_INDEX         0
  72
  73#define EFCT_HW_REQUE_XRI_REGTAG        65534
  74
  75/* Options for efct_hw_command() */
  76enum efct_cmd_opts {
  77        /* command executes synchronously and busy-waits for completion */
  78        EFCT_CMD_POLL,
  79        /* command executes asynchronously. Uses callback */
  80        EFCT_CMD_NOWAIT,
  81};
  82
  83enum efct_hw_reset {
  84        EFCT_HW_RESET_FUNCTION,
  85        EFCT_HW_RESET_FIRMWARE,
  86        EFCT_HW_RESET_MAX
  87};
  88
  89enum efct_hw_topo {
  90        EFCT_HW_TOPOLOGY_AUTO,
  91        EFCT_HW_TOPOLOGY_NPORT,
  92        EFCT_HW_TOPOLOGY_LOOP,
  93        EFCT_HW_TOPOLOGY_NONE,
  94        EFCT_HW_TOPOLOGY_MAX
  95};
  96
  97/* pack fw revision values into a single uint64_t */
  98#define HW_FWREV(a, b, c, d) (((uint64_t)(a) << 48) | ((uint64_t)(b) << 32) \
  99                        | ((uint64_t)(c) << 16) | ((uint64_t)(d)))
 100
 101#define EFCT_FW_VER_STR(a, b, c, d) (#a "." #b "." #c "." #d)
 102
 103enum efct_hw_io_type {
 104        EFCT_HW_ELS_REQ,
 105        EFCT_HW_ELS_RSP,
 106        EFCT_HW_FC_CT,
 107        EFCT_HW_FC_CT_RSP,
 108        EFCT_HW_BLS_ACC,
 109        EFCT_HW_BLS_RJT,
 110        EFCT_HW_IO_TARGET_READ,
 111        EFCT_HW_IO_TARGET_WRITE,
 112        EFCT_HW_IO_TARGET_RSP,
 113        EFCT_HW_IO_DNRX_REQUEUE,
 114        EFCT_HW_IO_MAX,
 115};
 116
 117enum efct_hw_io_state {
 118        EFCT_HW_IO_STATE_FREE,
 119        EFCT_HW_IO_STATE_INUSE,
 120        EFCT_HW_IO_STATE_WAIT_FREE,
 121        EFCT_HW_IO_STATE_WAIT_SEC_HIO,
 122};
 123
 124#define EFCT_TARGET_WRITE_SKIPS 1
 125#define EFCT_TARGET_READ_SKIPS  2
 126
 127struct efct_hw;
 128struct efct_io;
 129
 130#define EFCT_CMD_CTX_POOL_SZ    32
 131/**
 132 * HW command context.
 133 * Stores the state for the asynchronous commands sent to the hardware.
 134 */
 135struct efct_command_ctx {
 136        struct list_head        list_entry;
 137        int (*cb)(struct efct_hw *hw, int status, u8 *mqe, void *arg);
 138        void                    *arg;   /* Argument for callback */
 139        /* buffer holding command / results */
 140        u8                      buf[SLI4_BMBX_SIZE];
 141        void                    *ctx;   /* upper layer context */
 142};
 143
 144struct efct_hw_sgl {
 145        uintptr_t               addr;
 146        size_t                  len;
 147};
 148
 149union efct_hw_io_param_u {
 150        struct sli_bls_params bls;
 151        struct sli_els_params els;
 152        struct sli_ct_params fc_ct;
 153        struct sli_fcp_tgt_params fcp_tgt;
 154};
 155
 156/* WQ steering mode */
 157enum efct_hw_wq_steering {
 158        EFCT_HW_WQ_STEERING_CLASS,
 159        EFCT_HW_WQ_STEERING_REQUEST,
 160        EFCT_HW_WQ_STEERING_CPU,
 161};
 162
 163/* HW wqe object */
 164struct efct_hw_wqe {
 165        struct list_head        list_entry;
 166        bool                    abort_wqe_submit_needed;
 167        bool                    send_abts;
 168        u32                     id;
 169        u32                     abort_reqtag;
 170        u8                      *wqebuf;
 171};
 172
 173struct efct_hw_io;
 174/* Typedef for HW "done" callback */
 175typedef int (*efct_hw_done_t)(struct efct_hw_io *, u32 len, int status,
 176                              u32 ext, void *ul_arg);
 177
 178/**
 179 * HW IO object.
 180 *
 181 * Stores the per-IO information necessary
 182 * for both SLI and efct.
 183 * @ref:                reference counter for hw io object
 184 * @state:              state of IO: free, busy, wait_free
 185 * @list_entry          used for busy, wait_free, free lists
 186 * @wqe                 Work queue object, with link for pending
 187 * @hw                  pointer back to hardware context
 188 * @xfer_rdy            transfer ready data
 189 * @type                IO type
 190 * @xbusy               Exchange is active in FW
 191 * @abort_in_progress   if TRUE, abort is in progress
 192 * @status_saved        if TRUE, latched status should be returned
 193 * @wq_class            WQ class if steering mode is Class
 194 * @reqtag              request tag for this HW IO
 195 * @wq                  WQ assigned to the exchange
 196 * @done                Function called on IO completion
 197 * @arg                 argument passed to IO done callback
 198 * @abort_done          Function called on abort completion
 199 * @abort_arg           argument passed to abort done callback
 200 * @wq_steering         WQ steering mode request
 201 * @saved_status        Saved status
 202 * @saved_len           Status length
 203 * @saved_ext           Saved extended status
 204 * @eq                  EQ on which this HIO came up
 205 * @sge_offset          SGE data offset
 206 * @def_sgl_count       Count of SGEs in default SGL
 207 * @abort_reqtag        request tag for an abort of this HW IO
 208 * @indicator           Exchange indicator
 209 * @def_sgl             default SGL
 210 * @sgl                 pointer to current active SGL
 211 * @sgl_count           count of SGEs in io->sgl
 212 * @first_data_sge      index of first data SGE
 213 * @n_sge               number of active SGEs
 214 */
 215struct efct_hw_io {
 216        struct kref             ref;
 217        enum efct_hw_io_state   state;
 218        void                    (*release)(struct kref *arg);
 219        struct list_head        list_entry;
 220        struct efct_hw_wqe      wqe;
 221
 222        struct efct_hw          *hw;
 223        struct efc_dma          xfer_rdy;
 224        u16                     type;
 225        bool                    xbusy;
 226        int                     abort_in_progress;
 227        bool                    status_saved;
 228        u8                      wq_class;
 229        u16                     reqtag;
 230
 231        struct hw_wq            *wq;
 232        efct_hw_done_t          done;
 233        void                    *arg;
 234        efct_hw_done_t          abort_done;
 235        void                    *abort_arg;
 236
 237        enum efct_hw_wq_steering wq_steering;
 238
 239        u32                     saved_status;
 240        u32                     saved_len;
 241        u32                     saved_ext;
 242
 243        struct hw_eq            *eq;
 244        u32                     sge_offset;
 245        u32                     def_sgl_count;
 246        u32                     abort_reqtag;
 247        u32                     indicator;
 248        struct efc_dma          def_sgl;
 249        struct efc_dma          *sgl;
 250        u32                     sgl_count;
 251        u32                     first_data_sge;
 252        u32                     n_sge;
 253};
 254
 255enum efct_hw_port {
 256        EFCT_HW_PORT_INIT,
 257        EFCT_HW_PORT_SHUTDOWN,
 258};
 259
 260/* Node group rpi reference */
 261struct efct_hw_rpi_ref {
 262        atomic_t rpi_count;
 263        atomic_t rpi_attached;
 264};
 265
 266enum efct_hw_link_stat {
 267        EFCT_HW_LINK_STAT_LINK_FAILURE_COUNT,
 268        EFCT_HW_LINK_STAT_LOSS_OF_SYNC_COUNT,
 269        EFCT_HW_LINK_STAT_LOSS_OF_SIGNAL_COUNT,
 270        EFCT_HW_LINK_STAT_PRIMITIVE_SEQ_COUNT,
 271        EFCT_HW_LINK_STAT_INVALID_XMIT_WORD_COUNT,
 272        EFCT_HW_LINK_STAT_CRC_COUNT,
 273        EFCT_HW_LINK_STAT_PRIMITIVE_SEQ_TIMEOUT_COUNT,
 274        EFCT_HW_LINK_STAT_ELASTIC_BUFFER_OVERRUN_COUNT,
 275        EFCT_HW_LINK_STAT_ARB_TIMEOUT_COUNT,
 276        EFCT_HW_LINK_STAT_ADVERTISED_RCV_B2B_CREDIT,
 277        EFCT_HW_LINK_STAT_CURR_RCV_B2B_CREDIT,
 278        EFCT_HW_LINK_STAT_ADVERTISED_XMIT_B2B_CREDIT,
 279        EFCT_HW_LINK_STAT_CURR_XMIT_B2B_CREDIT,
 280        EFCT_HW_LINK_STAT_RCV_EOFA_COUNT,
 281        EFCT_HW_LINK_STAT_RCV_EOFDTI_COUNT,
 282        EFCT_HW_LINK_STAT_RCV_EOFNI_COUNT,
 283        EFCT_HW_LINK_STAT_RCV_SOFF_COUNT,
 284        EFCT_HW_LINK_STAT_RCV_DROPPED_NO_AER_COUNT,
 285        EFCT_HW_LINK_STAT_RCV_DROPPED_NO_RPI_COUNT,
 286        EFCT_HW_LINK_STAT_RCV_DROPPED_NO_XRI_COUNT,
 287        EFCT_HW_LINK_STAT_MAX,
 288};
 289
 290enum efct_hw_host_stat {
 291        EFCT_HW_HOST_STAT_TX_KBYTE_COUNT,
 292        EFCT_HW_HOST_STAT_RX_KBYTE_COUNT,
 293        EFCT_HW_HOST_STAT_TX_FRAME_COUNT,
 294        EFCT_HW_HOST_STAT_RX_FRAME_COUNT,
 295        EFCT_HW_HOST_STAT_TX_SEQ_COUNT,
 296        EFCT_HW_HOST_STAT_RX_SEQ_COUNT,
 297        EFCT_HW_HOST_STAT_TOTAL_EXCH_ORIG,
 298        EFCT_HW_HOST_STAT_TOTAL_EXCH_RESP,
 299        EFCT_HW_HOSY_STAT_RX_P_BSY_COUNT,
 300        EFCT_HW_HOST_STAT_RX_F_BSY_COUNT,
 301        EFCT_HW_HOST_STAT_DROP_FRM_DUE_TO_NO_RQ_BUF_COUNT,
 302        EFCT_HW_HOST_STAT_EMPTY_RQ_TIMEOUT_COUNT,
 303        EFCT_HW_HOST_STAT_DROP_FRM_DUE_TO_NO_XRI_COUNT,
 304        EFCT_HW_HOST_STAT_EMPTY_XRI_POOL_COUNT,
 305        EFCT_HW_HOST_STAT_MAX,
 306};
 307
 308enum efct_hw_state {
 309        EFCT_HW_STATE_UNINITIALIZED,
 310        EFCT_HW_STATE_QUEUES_ALLOCATED,
 311        EFCT_HW_STATE_ACTIVE,
 312        EFCT_HW_STATE_RESET_IN_PROGRESS,
 313        EFCT_HW_STATE_TEARDOWN_IN_PROGRESS,
 314};
 315
 316struct efct_hw_link_stat_counts {
 317        u8              overflow;
 318        u32             counter;
 319};
 320
 321struct efct_hw_host_stat_counts {
 322        u32             counter;
 323};
 324
 325/* Structure used for the hash lookup of queue IDs */
 326struct efct_queue_hash {
 327        bool            in_use;
 328        u16             id;
 329        u16             index;
 330};
 331
 332/* WQ callback object */
 333struct hw_wq_callback {
 334        u16             instance_index; /* use for request tag */
 335        void (*callback)(void *arg, u8 *cqe, int status);
 336        void            *arg;
 337        struct list_head list_entry;
 338};
 339
 340struct reqtag_pool {
 341        spinlock_t lock;        /* pool lock */
 342        struct hw_wq_callback *tags[U16_MAX];
 343        struct list_head freelist;
 344};
 345
 346struct efct_hw_config {
 347        u32             n_eq;
 348        u32             n_cq;
 349        u32             n_mq;
 350        u32             n_rq;
 351        u32             n_wq;
 352        u32             n_io;
 353        u32             n_sgl;
 354        u32             speed;
 355        u32             topology;
 356        /* size of the buffers for first burst */
 357        u32             rq_default_buffer_size;
 358        u8              esoc;
 359        /* MRQ RQ selection policy */
 360        u8              rq_selection_policy;
 361        /* RQ quanta if rq_selection_policy == 2 */
 362        u8              rr_quanta;
 363        u32             filter_def[SLI4_CMD_REG_FCFI_NUM_RQ_CFG];
 364};
 365
 366struct efct_hw {
 367        struct efct             *os;
 368        struct sli4             sli;
 369        u16                     ulp_start;
 370        u16                     ulp_max;
 371        u32                     dump_size;
 372        enum efct_hw_state      state;
 373        bool                    hw_setup_called;
 374        u8                      sliport_healthcheck;
 375        u16                     fcf_indicator;
 376
 377        /* HW configuration */
 378        struct efct_hw_config   config;
 379
 380        /* calculated queue sizes for each type */
 381        u32                     num_qentries[SLI4_QTYPE_MAX];
 382
 383        /* Storage for SLI queue objects */
 384        struct sli4_queue       wq[EFCT_HW_MAX_NUM_WQ];
 385        struct sli4_queue       rq[EFCT_HW_MAX_NUM_RQ];
 386        u16                     hw_rq_lookup[EFCT_HW_MAX_NUM_RQ];
 387        struct sli4_queue       mq[EFCT_HW_MAX_NUM_MQ];
 388        struct sli4_queue       cq[EFCT_HW_MAX_NUM_CQ];
 389        struct sli4_queue       eq[EFCT_HW_MAX_NUM_EQ];
 390
 391        /* HW queue */
 392        u32                     eq_count;
 393        u32                     cq_count;
 394        u32                     mq_count;
 395        u32                     wq_count;
 396        u32                     rq_count;
 397        u32                     cmd_head_count;
 398        struct list_head        eq_list;
 399
 400        struct efct_queue_hash  cq_hash[EFCT_HW_Q_HASH_SIZE];
 401        struct efct_queue_hash  rq_hash[EFCT_HW_Q_HASH_SIZE];
 402        struct efct_queue_hash  wq_hash[EFCT_HW_Q_HASH_SIZE];
 403
 404        /* Storage for HW queue objects */
 405        struct hw_wq            *hw_wq[EFCT_HW_MAX_NUM_WQ];
 406        struct hw_rq            *hw_rq[EFCT_HW_MAX_NUM_RQ];
 407        struct hw_mq            *hw_mq[EFCT_HW_MAX_NUM_MQ];
 408        struct hw_cq            *hw_cq[EFCT_HW_MAX_NUM_CQ];
 409        struct hw_eq            *hw_eq[EFCT_HW_MAX_NUM_EQ];
 410        /* count of hw_rq[] entries */
 411        u32                     hw_rq_count;
 412        /* count of multirq RQs */
 413        u32                     hw_mrq_count;
 414
 415        struct hw_wq            **wq_cpu_array;
 416
 417        /* Sequence objects used in incoming frame processing */
 418        struct efc_hw_sequence  *seq_pool;
 419
 420        /* Maintain an ordered, linked list of outstanding HW commands. */
 421        struct mutex            bmbx_lock;
 422        spinlock_t              cmd_lock;
 423        struct list_head        cmd_head;
 424        struct list_head        cmd_pending;
 425        mempool_t               *cmd_ctx_pool;
 426        mempool_t               *mbox_rqst_pool;
 427
 428        struct sli4_link_event  link;
 429
 430        /* pointer array of IO objects */
 431        struct efct_hw_io       **io;
 432        /* array of WQE buffs mapped to IO objects */
 433        u8                      *wqe_buffs;
 434
 435        /* IO lock to synchronize list access */
 436        spinlock_t              io_lock;
 437        /* List of IO objects in use */
 438        struct list_head        io_inuse;
 439        /* List of IO objects waiting to be freed */
 440        struct list_head        io_wait_free;
 441        /* List of IO objects available for allocation */
 442        struct list_head        io_free;
 443
 444        struct efc_dma          loop_map;
 445
 446        struct efc_dma          xfer_rdy;
 447
 448        struct efc_dma          rnode_mem;
 449
 450        atomic_t                io_alloc_failed_count;
 451
 452        /* stat: wq sumbit count */
 453        u32                     tcmd_wq_submit[EFCT_HW_MAX_NUM_WQ];
 454        /* stat: wq complete count */
 455        u32                     tcmd_wq_complete[EFCT_HW_MAX_NUM_WQ];
 456
 457        atomic_t                send_frame_seq_id;
 458        struct reqtag_pool      *wq_reqtag_pool;
 459};
 460
 461enum efct_hw_io_count_type {
 462        EFCT_HW_IO_INUSE_COUNT,
 463        EFCT_HW_IO_FREE_COUNT,
 464        EFCT_HW_IO_WAIT_FREE_COUNT,
 465        EFCT_HW_IO_N_TOTAL_IO_COUNT,
 466};
 467
 468/* HW queue data structures */
 469struct hw_eq {
 470        struct list_head        list_entry;
 471        enum sli4_qtype         type;
 472        u32                     instance;
 473        u32                     entry_count;
 474        u32                     entry_size;
 475        struct efct_hw          *hw;
 476        struct sli4_queue       *queue;
 477        struct list_head        cq_list;
 478        u32                     use_count;
 479};
 480
 481struct hw_cq {
 482        struct list_head        list_entry;
 483        enum sli4_qtype         type;
 484        u32                     instance;
 485        u32                     entry_count;
 486        u32                     entry_size;
 487        struct hw_eq            *eq;
 488        struct sli4_queue       *queue;
 489        struct list_head        q_list;
 490        u32                     use_count;
 491};
 492
 493struct hw_q {
 494        struct list_head        list_entry;
 495        enum sli4_qtype         type;
 496};
 497
 498struct hw_mq {
 499        struct list_head        list_entry;
 500        enum sli4_qtype         type;
 501        u32                     instance;
 502
 503        u32                     entry_count;
 504        u32                     entry_size;
 505        struct hw_cq            *cq;
 506        struct sli4_queue       *queue;
 507
 508        u32                     use_count;
 509};
 510
 511struct hw_wq {
 512        struct list_head        list_entry;
 513        enum sli4_qtype         type;
 514        u32                     instance;
 515        struct efct_hw          *hw;
 516
 517        u32                     entry_count;
 518        u32                     entry_size;
 519        struct hw_cq            *cq;
 520        struct sli4_queue       *queue;
 521        u32                     class;
 522
 523        /* WQ consumed */
 524        u32                     wqec_set_count;
 525        u32                     wqec_count;
 526        u32                     free_count;
 527        u32                     total_submit_count;
 528        struct list_head        pending_list;
 529
 530        /* HW IO allocated for use with Send Frame */
 531        struct efct_hw_io       *send_frame_io;
 532
 533        /* Stats */
 534        u32                     use_count;
 535        u32                     wq_pending_count;
 536};
 537
 538struct hw_rq {
 539        struct list_head        list_entry;
 540        enum sli4_qtype         type;
 541        u32                     instance;
 542
 543        u32                     entry_count;
 544        u32                     use_count;
 545        u32                     hdr_entry_size;
 546        u32                     first_burst_entry_size;
 547        u32                     data_entry_size;
 548        bool                    is_mrq;
 549        u32                     base_mrq_id;
 550
 551        struct hw_cq            *cq;
 552
 553        u8                      filter_mask;
 554        struct sli4_queue       *hdr;
 555        struct sli4_queue       *first_burst;
 556        struct sli4_queue       *data;
 557
 558        struct efc_hw_rq_buffer *hdr_buf;
 559        struct efc_hw_rq_buffer *fb_buf;
 560        struct efc_hw_rq_buffer *payload_buf;
 561        /* RQ tracker for this RQ */
 562        struct efc_hw_sequence  **rq_tracker;
 563};
 564
 565struct efct_hw_send_frame_context {
 566        struct efct_hw          *hw;
 567        struct hw_wq_callback   *wqcb;
 568        struct efct_hw_wqe      wqe;
 569        void (*callback)(int status, void *arg);
 570        void                    *arg;
 571
 572        /* General purpose elements */
 573        struct efc_hw_sequence  *seq;
 574        struct efc_dma          payload;
 575};
 576
 577struct efct_hw_grp_hdr {
 578        u32                     size;
 579        __be32                  magic_number;
 580        u32                     word2;
 581        u8                      rev_name[128];
 582        u8                      date[12];
 583        u8                      revision[32];
 584};
 585
 586static inline int
 587efct_hw_get_link_speed(struct efct_hw *hw) {
 588        return hw->link.speed;
 589}
 590
 591int
 592efct_hw_setup(struct efct_hw *hw, void *os, struct pci_dev *pdev);
 593int efct_hw_init(struct efct_hw *hw);
 594int
 595efct_hw_parse_filter(struct efct_hw *hw, void *value);
 596int
 597efct_hw_init_queues(struct efct_hw *hw);
 598int
 599efct_hw_map_wq_cpu(struct efct_hw *hw);
 600uint64_t
 601efct_get_wwnn(struct efct_hw *hw);
 602uint64_t
 603efct_get_wwpn(struct efct_hw *hw);
 604
 605int efct_hw_rx_allocate(struct efct_hw *hw);
 606int efct_hw_rx_post(struct efct_hw *hw);
 607void efct_hw_rx_free(struct efct_hw *hw);
 608int
 609efct_hw_command(struct efct_hw *hw, u8 *cmd, u32 opts, void *cb,
 610                void *arg);
 611int
 612efct_issue_mbox_rqst(void *base, void *cmd, void *cb, void *arg);
 613
 614struct efct_hw_io *efct_hw_io_alloc(struct efct_hw *hw);
 615int efct_hw_io_free(struct efct_hw *hw, struct efct_hw_io *io);
 616u8 efct_hw_io_inuse(struct efct_hw *hw, struct efct_hw_io *io);
 617int
 618efct_hw_io_send(struct efct_hw *hw, enum efct_hw_io_type type,
 619                struct efct_hw_io *io, union efct_hw_io_param_u *iparam,
 620                void *cb, void *arg);
 621int
 622efct_hw_io_register_sgl(struct efct_hw *hw, struct efct_hw_io *io,
 623                        struct efc_dma *sgl,
 624                        u32 sgl_count);
 625int
 626efct_hw_io_init_sges(struct efct_hw *hw,
 627                     struct efct_hw_io *io, enum efct_hw_io_type type);
 628
 629int
 630efct_hw_io_add_sge(struct efct_hw *hw, struct efct_hw_io *io,
 631                   uintptr_t addr, u32 length);
 632int
 633efct_hw_io_abort(struct efct_hw *hw, struct efct_hw_io *io_to_abort,
 634                 bool send_abts, void *cb, void *arg);
 635u32
 636efct_hw_io_get_count(struct efct_hw *hw,
 637                     enum efct_hw_io_count_type io_count_type);
 638struct efct_hw_io
 639*efct_hw_io_lookup(struct efct_hw *hw, u32 indicator);
 640void efct_hw_io_abort_all(struct efct_hw *hw);
 641void efct_hw_io_free_internal(struct kref *arg);
 642
 643/* HW WQ request tag API */
 644struct reqtag_pool *efct_hw_reqtag_pool_alloc(struct efct_hw *hw);
 645void efct_hw_reqtag_pool_free(struct efct_hw *hw);
 646struct hw_wq_callback
 647*efct_hw_reqtag_alloc(struct efct_hw *hw,
 648                        void (*callback)(void *arg, u8 *cqe,
 649                                         int status), void *arg);
 650void
 651efct_hw_reqtag_free(struct efct_hw *hw, struct hw_wq_callback *wqcb);
 652struct hw_wq_callback
 653*efct_hw_reqtag_get_instance(struct efct_hw *hw, u32 instance_index);
 654
 655/* RQ completion handlers for RQ pair mode */
 656int
 657efct_hw_rqpair_process_rq(struct efct_hw *hw,
 658                          struct hw_cq *cq, u8 *cqe);
 659int
 660efct_hw_rqpair_sequence_free(struct efct_hw *hw, struct efc_hw_sequence *seq);
 661static inline void
 662efct_hw_sequence_copy(struct efc_hw_sequence *dst,
 663                      struct efc_hw_sequence *src)
 664{
 665        /* Copy src to dst, then zero out the linked list link */
 666        *dst = *src;
 667}
 668
 669int
 670efct_efc_hw_sequence_free(struct efc *efc, struct efc_hw_sequence *seq);
 671
 672static inline int
 673efct_hw_sequence_free(struct efct_hw *hw, struct efc_hw_sequence *seq)
 674{
 675        /* Only RQ pair mode is supported */
 676        return efct_hw_rqpair_sequence_free(hw, seq);
 677}
 678
 679int
 680efct_hw_eq_process(struct efct_hw *hw, struct hw_eq *eq,
 681                   u32 max_isr_time_msec);
 682void efct_hw_cq_process(struct efct_hw *hw, struct hw_cq *cq);
 683void
 684efct_hw_wq_process(struct efct_hw *hw, struct hw_cq *cq,
 685                   u8 *cqe, int status, u16 rid);
 686void
 687efct_hw_xabt_process(struct efct_hw *hw, struct hw_cq *cq,
 688                     u8 *cqe, u16 rid);
 689int
 690efct_hw_process(struct efct_hw *hw, u32 vector, u32 max_isr_time_msec);
 691int
 692efct_hw_queue_hash_find(struct efct_queue_hash *hash, u16 id);
 693int efct_hw_wq_write(struct hw_wq *wq, struct efct_hw_wqe *wqe);
 694int
 695efct_hw_send_frame(struct efct_hw *hw, struct fc_frame_header *hdr,
 696                   u8 sof, u8 eof, struct efc_dma *payload,
 697                struct efct_hw_send_frame_context *ctx,
 698                void (*callback)(void *arg, u8 *cqe, int status),
 699                void *arg);
 700int
 701efct_els_hw_srrs_send(struct efc *efc, struct efc_disc_io *io);
 702int
 703efct_efc_bls_send(struct efc *efc, u32 type, struct sli_bls_params *bls);
 704int
 705efct_hw_bls_send(struct efct *efct, u32 type, struct sli_bls_params *bls_params,
 706                 void *cb, void *arg);
 707
 708/* Function for retrieving link statistics */
 709int
 710efct_hw_get_link_stats(struct efct_hw *hw,
 711                       u8 req_ext_counters,
 712                       u8 clear_overflow_flags,
 713                       u8 clear_all_counters,
 714                       void (*efct_hw_link_stat_cb_t)(int status,
 715                                                      u32 num_counters,
 716                       struct efct_hw_link_stat_counts *counters, void *arg),
 717                       void *arg);
 718/* Function for retrieving host statistics */
 719int
 720efct_hw_get_host_stats(struct efct_hw *hw,
 721                       u8 cc,
 722                       void (*efct_hw_host_stat_cb_t)(int status,
 723                                                      u32 num_counters,
 724                       struct efct_hw_host_stat_counts *counters, void *arg),
 725                       void *arg);
 726int
 727efct_hw_firmware_write(struct efct_hw *hw, struct efc_dma *dma,
 728                       u32 size, u32 offset, int last,
 729                       void (*cb)(int status, u32 bytes_written,
 730                                  u32 change_status, void *arg),
 731                       void *arg);
 732typedef void (*efct_hw_async_cb_t)(struct efct_hw *hw, int status,
 733                                  u8 *mqe, void *arg);
 734int
 735efct_hw_async_call(struct efct_hw *hw, efct_hw_async_cb_t callback, void *arg);
 736
 737struct hw_eq *efct_hw_new_eq(struct efct_hw *hw, u32 entry_count);
 738struct hw_cq *efct_hw_new_cq(struct hw_eq *eq, u32 entry_count);
 739u32
 740efct_hw_new_cq_set(struct hw_eq *eqs[], struct hw_cq *cqs[],
 741                   u32 num_cqs, u32 entry_count);
 742struct hw_mq *efct_hw_new_mq(struct hw_cq *cq, u32 entry_count);
 743struct hw_wq
 744*efct_hw_new_wq(struct hw_cq *cq, u32 entry_count);
 745u32
 746efct_hw_new_rq_set(struct hw_cq *cqs[], struct hw_rq *rqs[],
 747                   u32 num_rq_pairs, u32 entry_count);
 748void efct_hw_del_eq(struct hw_eq *eq);
 749void efct_hw_del_cq(struct hw_cq *cq);
 750void efct_hw_del_mq(struct hw_mq *mq);
 751void efct_hw_del_wq(struct hw_wq *wq);
 752void efct_hw_del_rq(struct hw_rq *rq);
 753void efct_hw_queue_teardown(struct efct_hw *hw);
 754void efct_hw_teardown(struct efct_hw *hw);
 755int
 756efct_hw_reset(struct efct_hw *hw, enum efct_hw_reset reset);
 757
 758int
 759efct_hw_port_control(struct efct_hw *hw, enum efct_hw_port ctrl,
 760                     uintptr_t value,
 761                void (*cb)(int status, uintptr_t value, void *arg),
 762                void *arg);
 763
 764#endif /* __EFCT_H__ */
 765