Back to home page

OSCL-LXR

 
 

    


0001 /*******************************************************************
0002  * This file is part of the Emulex Linux Device Driver for         *
0003  * Fibre Channel Host Bus Adapters.                                *
0004  * Copyright (C) 2017-2022 Broadcom. All Rights Reserved. The term *
0005  * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.     *
0006  * Copyright (C) 2009-2016 Emulex.  All rights reserved.           *
0007  * EMULEX and SLI are trademarks of Emulex.                        *
0008  * www.broadcom.com                                                *
0009  *                                                                 *
0010  * This program is free software; you can redistribute it and/or   *
0011  * modify it under the terms of version 2 of the GNU General       *
0012  * Public License as published by the Free Software Foundation.    *
0013  * This program is distributed in the hope that it will be useful. *
0014  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
0015  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
0016  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
0017  * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
0018  * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
0019  * more details, a copy of which can be found in the file COPYING  *
0020  * included with this package.                                     *
0021  *******************************************************************/
0022 
0023 #include <linux/irq_poll.h>
0024 #include <linux/cpufreq.h>
0025 
0026 #if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_SCSI_LPFC_DEBUG_FS)
0027 #define CONFIG_SCSI_LPFC_DEBUG_FS
0028 #endif
0029 
0030 #define LPFC_ACTIVE_MBOX_WAIT_CNT               100
0031 #define LPFC_XRI_EXCH_BUSY_WAIT_TMO     10000
0032 #define LPFC_XRI_EXCH_BUSY_WAIT_T1          10
0033 #define LPFC_XRI_EXCH_BUSY_WAIT_T2              30000
0034 #define LPFC_RPI_LOW_WATER_MARK         10
0035 
0036 #define LPFC_UNREG_FCF                          1
0037 #define LPFC_SKIP_UNREG_FCF                     0
0038 
0039 /* Amount of time in seconds for waiting FCF rediscovery to complete */
0040 #define LPFC_FCF_REDISCOVER_WAIT_TMO        2000 /* msec */
0041 
0042 /* Number of SGL entries can be posted in a 4KB nonembedded mbox command */
0043 #define LPFC_NEMBED_MBOX_SGL_CNT        254
0044 
0045 /* Multi-queue arrangement for FCP EQ/CQ/WQ tuples */
0046 #define LPFC_HBA_HDWQ_MIN   0
0047 #define LPFC_HBA_HDWQ_MAX   256
0048 #define LPFC_HBA_HDWQ_DEF   LPFC_HBA_HDWQ_MIN
0049 
0050 /* irq_chann range, values */
0051 #define LPFC_IRQ_CHANN_MIN  0
0052 #define LPFC_IRQ_CHANN_MAX  256
0053 #define LPFC_IRQ_CHANN_DEF  LPFC_IRQ_CHANN_MIN
0054 
0055 /* FCP MQ queue count limiting */
0056 #define LPFC_FCP_MQ_THRESHOLD_MIN   0
0057 #define LPFC_FCP_MQ_THRESHOLD_MAX   256
0058 #define LPFC_FCP_MQ_THRESHOLD_DEF   8
0059 
0060 /*
0061  * Provide the default FCF Record attributes used by the driver
0062  * when nonFIP mode is configured and there is no other default
0063  * FCF Record attributes.
0064  */
0065 #define LPFC_FCOE_FCF_DEF_INDEX 0
0066 #define LPFC_FCOE_FCF_GET_FIRST 0xFFFF
0067 #define LPFC_FCOE_FCF_NEXT_NONE 0xFFFF
0068 
0069 #define LPFC_FCOE_NULL_VID  0xFFF
0070 #define LPFC_FCOE_IGNORE_VID    0xFFFF
0071 
0072 /* First 3 bytes of default FCF MAC is specified by FC_MAP */
0073 #define LPFC_FCOE_FCF_MAC3  0xFF
0074 #define LPFC_FCOE_FCF_MAC4  0xFF
0075 #define LPFC_FCOE_FCF_MAC5  0xFE
0076 #define LPFC_FCOE_FCF_MAP0  0x0E
0077 #define LPFC_FCOE_FCF_MAP1  0xFC
0078 #define LPFC_FCOE_FCF_MAP2  0x00
0079 #define LPFC_FCOE_MAX_RCV_SIZE  0x800
0080 #define LPFC_FCOE_FKA_ADV_PER   0
0081 #define LPFC_FCOE_FIP_PRIORITY  0x80
0082 
0083 #define sli4_sid_from_fc_hdr(fc_hdr)  \
0084     ((fc_hdr)->fh_s_id[0] << 16 | \
0085      (fc_hdr)->fh_s_id[1] <<  8 | \
0086      (fc_hdr)->fh_s_id[2])
0087 
0088 #define sli4_did_from_fc_hdr(fc_hdr)  \
0089     ((fc_hdr)->fh_d_id[0] << 16 | \
0090      (fc_hdr)->fh_d_id[1] <<  8 | \
0091      (fc_hdr)->fh_d_id[2])
0092 
0093 #define sli4_fctl_from_fc_hdr(fc_hdr)  \
0094     ((fc_hdr)->fh_f_ctl[0] << 16 | \
0095      (fc_hdr)->fh_f_ctl[1] <<  8 | \
0096      (fc_hdr)->fh_f_ctl[2])
0097 
0098 #define sli4_type_from_fc_hdr(fc_hdr)  \
0099     ((fc_hdr)->fh_type)
0100 
0101 #define LPFC_FW_RESET_MAXIMUM_WAIT_10MS_CNT 12000
0102 
0103 #define INT_FW_UPGRADE  0
0104 #define RUN_FW_UPGRADE  1
0105 
0106 enum lpfc_sli4_queue_type {
0107     LPFC_EQ,
0108     LPFC_GCQ,
0109     LPFC_MCQ,
0110     LPFC_WCQ,
0111     LPFC_RCQ,
0112     LPFC_MQ,
0113     LPFC_WQ,
0114     LPFC_HRQ,
0115     LPFC_DRQ
0116 };
0117 
0118 /* The queue sub-type defines the functional purpose of the queue */
0119 enum lpfc_sli4_queue_subtype {
0120     LPFC_NONE,
0121     LPFC_MBOX,
0122     LPFC_IO,
0123     LPFC_ELS,
0124     LPFC_NVMET,
0125     LPFC_NVME_LS,
0126     LPFC_USOL
0127 };
0128 
0129 /* RQ buffer list */
0130 struct lpfc_rqb {
0131     uint16_t entry_count;     /* Current number of RQ slots */
0132     uint16_t buffer_count;    /* Current number of buffers posted */
0133     struct list_head rqb_buffer_list;  /* buffers assigned to this HBQ */
0134                   /* Callback for HBQ buffer allocation */
0135     struct rqb_dmabuf *(*rqb_alloc_buffer)(struct lpfc_hba *);
0136                   /* Callback for HBQ buffer free */
0137     void               (*rqb_free_buffer)(struct lpfc_hba *,
0138                            struct rqb_dmabuf *);
0139 };
0140 
0141 enum lpfc_poll_mode {
0142     LPFC_QUEUE_WORK,
0143     LPFC_IRQ_POLL
0144 };
0145 
0146 struct lpfc_idle_stat {
0147     u64 prev_idle;
0148     u64 prev_wall;
0149 };
0150 
0151 struct lpfc_queue {
0152     struct list_head list;
0153     struct list_head wq_list;
0154 
0155     /*
0156      * If interrupts are in effect on _all_ the eq's the footprint
0157      * of polling code is zero (except mode). This memory is chec-
0158      * ked for every io to see if the io needs to be polled and
0159      * while completion to check if the eq's needs to be rearmed.
0160      * Keep in same cacheline as the queue ptr to avoid cpu fetch
0161      * stalls. Using 1B memory will leave us with 7B hole. Fill
0162      * it with other frequently used members.
0163      */
0164     uint16_t last_cpu;  /* most recent cpu */
0165     uint16_t hdwq;
0166     uint8_t  qe_valid;
0167     uint8_t  mode;  /* interrupt or polling */
0168 #define LPFC_EQ_INTERRUPT   0
0169 #define LPFC_EQ_POLL        1
0170 
0171     struct list_head wqfull_list;
0172     enum lpfc_sli4_queue_type type;
0173     enum lpfc_sli4_queue_subtype subtype;
0174     struct lpfc_hba *phba;
0175     struct list_head child_list;
0176     struct list_head page_list;
0177     struct list_head sgl_list;
0178     struct list_head cpu_list;
0179     uint32_t entry_count;   /* Number of entries to support on the queue */
0180     uint32_t entry_size;    /* Size of each queue entry. */
0181     uint32_t entry_cnt_per_pg;
0182     uint32_t notify_interval; /* Queue Notification Interval
0183                    * For chip->host queues (EQ, CQ, RQ):
0184                    *  specifies the interval (number of
0185                    *  entries) where the doorbell is rung to
0186                    *  notify the chip of entry consumption.
0187                    * For host->chip queues (WQ):
0188                    *  specifies the interval (number of
0189                    *  entries) where consumption CQE is
0190                    *  requested to indicate WQ entries
0191                    *  consumed by the chip.
0192                    * Not used on an MQ.
0193                    */
0194 #define LPFC_EQ_NOTIFY_INTRVL   16
0195 #define LPFC_CQ_NOTIFY_INTRVL   16
0196 #define LPFC_WQ_NOTIFY_INTRVL   16
0197 #define LPFC_RQ_NOTIFY_INTRVL   16
0198     uint32_t max_proc_limit; /* Queue Processing Limit
0199                   * For chip->host queues (EQ, CQ):
0200                   *  specifies the maximum number of
0201                   *  entries to be consumed in one
0202                   *  processing iteration sequence. Queue
0203                   *  will be rearmed after each iteration.
0204                   * Not used on an MQ, RQ or WQ.
0205                   */
0206 #define LPFC_EQ_MAX_PROC_LIMIT      256
0207 #define LPFC_CQ_MIN_PROC_LIMIT      64
0208 #define LPFC_CQ_MAX_PROC_LIMIT      LPFC_CQE_EXP_COUNT  // 4096
0209 #define LPFC_CQ_DEF_MAX_PROC_LIMIT  LPFC_CQE_DEF_COUNT  // 1024
0210 #define LPFC_CQ_MIN_THRESHOLD_TO_POLL   64
0211 #define LPFC_CQ_MAX_THRESHOLD_TO_POLL   LPFC_CQ_DEF_MAX_PROC_LIMIT
0212 #define LPFC_CQ_DEF_THRESHOLD_TO_POLL   LPFC_CQ_DEF_MAX_PROC_LIMIT
0213     uint32_t queue_claimed; /* indicates queue is being processed */
0214     uint32_t queue_id;  /* Queue ID assigned by the hardware */
0215     uint32_t assoc_qid;     /* Queue ID associated with, for CQ/WQ/MQ */
0216     uint32_t host_index;    /* The host's index for putting or getting */
0217     uint32_t hba_index; /* The last known hba index for get or put */
0218     uint32_t q_mode;
0219 
0220     struct lpfc_sli_ring *pring; /* ptr to io ring associated with q */
0221     struct lpfc_rqb *rqbp;  /* ptr to RQ buffers */
0222 
0223     uint16_t page_count;    /* Number of pages allocated for this queue */
0224     uint16_t page_size; /* size of page allocated for this queue */
0225 #define LPFC_EXPANDED_PAGE_SIZE 16384
0226 #define LPFC_DEFAULT_PAGE_SIZE  4096
0227     uint16_t chann;     /* Hardware Queue association WQ/CQ */
0228                 /* CPU affinity for EQ */
0229 #define LPFC_FIND_BY_EQ     0
0230 #define LPFC_FIND_BY_HDWQ   1
0231     uint8_t db_format;
0232 #define LPFC_DB_RING_FORMAT 0x01
0233 #define LPFC_DB_LIST_FORMAT 0x02
0234     uint8_t q_flag;
0235 #define HBA_NVMET_WQFULL    0x1 /* We hit WQ Full condition for NVMET */
0236 #define HBA_NVMET_CQ_NOTIFY 0x1 /* LPFC_NVMET_CQ_NOTIFY CQEs this EQE */
0237 #define HBA_EQ_DELAY_CHK    0x2 /* EQ is a candidate for coalescing */
0238 #define LPFC_NVMET_CQ_NOTIFY    4
0239     void __iomem *db_regaddr;
0240     uint16_t dpp_enable;
0241     uint16_t dpp_id;
0242     void __iomem *dpp_regaddr;
0243 
0244     /* For q stats */
0245     uint32_t q_cnt_1;
0246     uint32_t q_cnt_2;
0247     uint32_t q_cnt_3;
0248     uint64_t q_cnt_4;
0249 /* defines for EQ stats */
0250 #define EQ_max_eqe      q_cnt_1
0251 #define EQ_no_entry     q_cnt_2
0252 #define EQ_cqe_cnt      q_cnt_3
0253 #define EQ_processed        q_cnt_4
0254 
0255 /* defines for CQ stats */
0256 #define CQ_mbox         q_cnt_1
0257 #define CQ_max_cqe      q_cnt_1
0258 #define CQ_release_wqe      q_cnt_2
0259 #define CQ_xri_aborted      q_cnt_3
0260 #define CQ_wq           q_cnt_4
0261 
0262 /* defines for WQ stats */
0263 #define WQ_overflow     q_cnt_1
0264 #define WQ_posted       q_cnt_4
0265 
0266 /* defines for RQ stats */
0267 #define RQ_no_posted_buf    q_cnt_1
0268 #define RQ_no_buf_found     q_cnt_2
0269 #define RQ_buf_posted       q_cnt_3
0270 #define RQ_rcv_buf      q_cnt_4
0271 
0272     struct work_struct  irqwork;
0273     struct work_struct  spwork;
0274     struct delayed_work sched_irqwork;
0275     struct delayed_work sched_spwork;
0276 
0277     uint64_t isr_timestamp;
0278     struct lpfc_queue *assoc_qp;
0279     struct list_head _poll_list;
0280     void **q_pgs;   /* array to index entries per page */
0281 
0282 #define LPFC_IRQ_POLL_WEIGHT 256
0283     struct irq_poll iop;
0284     enum lpfc_poll_mode poll_mode;
0285 };
0286 
0287 struct lpfc_sli4_link {
0288     uint32_t speed;
0289     uint8_t duplex;
0290     uint8_t status;
0291     uint8_t type;
0292     uint8_t number;
0293     uint8_t fault;
0294     uint32_t logical_speed;
0295     uint16_t topology;
0296 };
0297 
0298 struct lpfc_fcf_rec {
0299     uint8_t  fabric_name[8];
0300     uint8_t  switch_name[8];
0301     uint8_t  mac_addr[6];
0302     uint16_t fcf_indx;
0303     uint32_t priority;
0304     uint16_t vlan_id;
0305     uint32_t addr_mode;
0306     uint32_t flag;
0307 #define BOOT_ENABLE 0x01
0308 #define RECORD_VALID    0x02
0309 };
0310 
0311 struct lpfc_fcf_pri_rec {
0312     uint16_t fcf_index;
0313 #define LPFC_FCF_ON_PRI_LIST 0x0001
0314 #define LPFC_FCF_FLOGI_FAILED 0x0002
0315     uint16_t flag;
0316     uint32_t priority;
0317 };
0318 
0319 struct lpfc_fcf_pri {
0320     struct list_head list;
0321     struct lpfc_fcf_pri_rec fcf_rec;
0322 };
0323 
0324 /*
0325  * Maximum FCF table index, it is for driver internal book keeping, it
0326  * just needs to be no less than the supported HBA's FCF table size.
0327  */
0328 #define LPFC_SLI4_FCF_TBL_INDX_MAX  32
0329 
0330 struct lpfc_fcf {
0331     uint16_t fcfi;
0332     uint32_t fcf_flag;
0333 #define FCF_AVAILABLE   0x01 /* FCF available for discovery */
0334 #define FCF_REGISTERED  0x02 /* FCF registered with FW */
0335 #define FCF_SCAN_DONE   0x04 /* FCF table scan done */
0336 #define FCF_IN_USE  0x08 /* Atleast one discovery completed */
0337 #define FCF_INIT_DISC   0x10 /* Initial FCF discovery */
0338 #define FCF_DEAD_DISC   0x20 /* FCF DEAD fast FCF failover discovery */
0339 #define FCF_ACVL_DISC   0x40 /* All CVL fast FCF failover discovery */
0340 #define FCF_DISCOVERY   (FCF_INIT_DISC | FCF_DEAD_DISC | FCF_ACVL_DISC)
0341 #define FCF_REDISC_PEND 0x80 /* FCF rediscovery pending */
0342 #define FCF_REDISC_EVT  0x100 /* FCF rediscovery event to worker thread */
0343 #define FCF_REDISC_FOV  0x200 /* Post FCF rediscovery fast failover */
0344 #define FCF_REDISC_PROG (FCF_REDISC_PEND | FCF_REDISC_EVT)
0345     uint16_t fcf_redisc_attempted;
0346     uint32_t addr_mode;
0347     uint32_t eligible_fcf_cnt;
0348     struct lpfc_fcf_rec current_rec;
0349     struct lpfc_fcf_rec failover_rec;
0350     struct list_head fcf_pri_list;
0351     struct lpfc_fcf_pri fcf_pri[LPFC_SLI4_FCF_TBL_INDX_MAX];
0352     uint32_t current_fcf_scan_pri;
0353     struct timer_list redisc_wait;
0354     unsigned long *fcf_rr_bmask; /* Eligible FCF indexes for RR failover */
0355 };
0356 
0357 
0358 #define LPFC_REGION23_SIGNATURE "RG23"
0359 #define LPFC_REGION23_VERSION   1
0360 #define LPFC_REGION23_LAST_REC  0xff
0361 #define DRIVER_SPECIFIC_TYPE    0xA2
0362 #define LINUX_DRIVER_ID     0x20
0363 #define PORT_STE_TYPE       0x1
0364 
0365 struct lpfc_fip_param_hdr {
0366     uint8_t type;
0367 #define FCOE_PARAM_TYPE     0xA0
0368     uint8_t length;
0369 #define FCOE_PARAM_LENGTH   2
0370     uint8_t parm_version;
0371 #define FIPP_VERSION        0x01
0372     uint8_t parm_flags;
0373 #define lpfc_fip_param_hdr_fipp_mode_SHIFT  6
0374 #define lpfc_fip_param_hdr_fipp_mode_MASK   0x3
0375 #define lpfc_fip_param_hdr_fipp_mode_WORD   parm_flags
0376 #define FIPP_MODE_ON                0x1
0377 #define FIPP_MODE_OFF               0x0
0378 #define FIPP_VLAN_VALID             0x1
0379 };
0380 
0381 struct lpfc_fcoe_params {
0382     uint8_t fc_map[3];
0383     uint8_t reserved1;
0384     uint16_t vlan_tag;
0385     uint8_t reserved[2];
0386 };
0387 
0388 struct lpfc_fcf_conn_hdr {
0389     uint8_t type;
0390 #define FCOE_CONN_TBL_TYPE      0xA1
0391     uint8_t length;   /* words */
0392     uint8_t reserved[2];
0393 };
0394 
0395 struct lpfc_fcf_conn_rec {
0396     uint16_t flags;
0397 #define FCFCNCT_VALID       0x0001
0398 #define FCFCNCT_BOOT        0x0002
0399 #define FCFCNCT_PRIMARY     0x0004   /* if not set, Secondary */
0400 #define FCFCNCT_FBNM_VALID  0x0008
0401 #define FCFCNCT_SWNM_VALID  0x0010
0402 #define FCFCNCT_VLAN_VALID  0x0020
0403 #define FCFCNCT_AM_VALID    0x0040
0404 #define FCFCNCT_AM_PREFERRED    0x0080   /* if not set, AM Required */
0405 #define FCFCNCT_AM_SPMA     0x0100   /* if not set, FPMA */
0406 
0407     uint16_t vlan_tag;
0408     uint8_t fabric_name[8];
0409     uint8_t switch_name[8];
0410 };
0411 
0412 struct lpfc_fcf_conn_entry {
0413     struct list_head list;
0414     struct lpfc_fcf_conn_rec conn_rec;
0415 };
0416 
0417 /*
0418  * Define the host's bootstrap mailbox.  This structure contains
0419  * the member attributes needed to create, use, and destroy the
0420  * bootstrap mailbox region.
0421  *
0422  * The macro definitions for the bmbx data structure are defined
0423  * in lpfc_hw4.h with the register definition.
0424  */
0425 struct lpfc_bmbx {
0426     struct lpfc_dmabuf *dmabuf;
0427     struct dma_address dma_address;
0428     void *avirt;
0429     dma_addr_t aphys;
0430     uint32_t bmbx_size;
0431 };
0432 
0433 #define LPFC_EQE_SIZE LPFC_EQE_SIZE_4
0434 
0435 #define LPFC_EQE_SIZE_4B    4
0436 #define LPFC_EQE_SIZE_16B   16
0437 #define LPFC_CQE_SIZE       16
0438 #define LPFC_WQE_SIZE       64
0439 #define LPFC_WQE128_SIZE    128
0440 #define LPFC_MQE_SIZE       256
0441 #define LPFC_RQE_SIZE       8
0442 
0443 #define LPFC_EQE_DEF_COUNT  1024
0444 #define LPFC_CQE_DEF_COUNT      1024
0445 #define LPFC_CQE_EXP_COUNT      4096
0446 #define LPFC_WQE_DEF_COUNT      256
0447 #define LPFC_WQE_EXP_COUNT      1024
0448 #define LPFC_MQE_DEF_COUNT      16
0449 #define LPFC_RQE_DEF_COUNT  512
0450 
0451 #define LPFC_QUEUE_NOARM    false
0452 #define LPFC_QUEUE_REARM    true
0453 
0454 
0455 /*
0456  * SLI4 CT field defines
0457  */
0458 #define SLI4_CT_RPI 0
0459 #define SLI4_CT_VPI 1
0460 #define SLI4_CT_VFI 2
0461 #define SLI4_CT_FCFI 3
0462 
0463 /*
0464  * SLI4 specific data structures
0465  */
0466 struct lpfc_max_cfg_param {
0467     uint16_t max_xri;
0468     uint16_t xri_base;
0469     uint16_t xri_used;
0470     uint16_t max_rpi;
0471     uint16_t rpi_base;
0472     uint16_t rpi_used;
0473     uint16_t max_vpi;
0474     uint16_t vpi_base;
0475     uint16_t vpi_used;
0476     uint16_t max_vfi;
0477     uint16_t vfi_base;
0478     uint16_t vfi_used;
0479     uint16_t max_fcfi;
0480     uint16_t fcfi_used;
0481     uint16_t max_eq;
0482     uint16_t max_rq;
0483     uint16_t max_cq;
0484     uint16_t max_wq;
0485 };
0486 
0487 struct lpfc_hba;
0488 /* SLI4 HBA multi-fcp queue handler struct */
0489 #define LPFC_SLI4_HANDLER_NAME_SZ   16
0490 struct lpfc_hba_eq_hdl {
0491     uint32_t idx;
0492     uint16_t irq;
0493     char handler_name[LPFC_SLI4_HANDLER_NAME_SZ];
0494     struct lpfc_hba *phba;
0495     struct lpfc_queue *eq;
0496     struct cpumask aff_mask;
0497 };
0498 
0499 #define lpfc_get_eq_hdl(eqidx) (&phba->sli4_hba.hba_eq_hdl[eqidx])
0500 #define lpfc_get_aff_mask(eqidx) (&phba->sli4_hba.hba_eq_hdl[eqidx].aff_mask)
0501 #define lpfc_get_irq(eqidx) (phba->sli4_hba.hba_eq_hdl[eqidx].irq)
0502 
0503 /*BB Credit recovery value*/
0504 struct lpfc_bbscn_params {
0505     uint32_t word0;
0506 #define lpfc_bbscn_min_SHIFT        0
0507 #define lpfc_bbscn_min_MASK     0x0000000F
0508 #define lpfc_bbscn_min_WORD     word0
0509 #define lpfc_bbscn_max_SHIFT        4
0510 #define lpfc_bbscn_max_MASK     0x0000000F
0511 #define lpfc_bbscn_max_WORD     word0
0512 #define lpfc_bbscn_def_SHIFT        8
0513 #define lpfc_bbscn_def_MASK     0x0000000F
0514 #define lpfc_bbscn_def_WORD     word0
0515 };
0516 
0517 /* Port Capabilities for SLI4 Parameters */
0518 struct lpfc_pc_sli4_params {
0519     uint32_t supported;
0520     uint32_t if_type;
0521     uint32_t sli_rev;
0522     uint32_t sli_family;
0523     uint32_t featurelevel_1;
0524     uint32_t featurelevel_2;
0525     uint32_t proto_types;
0526 #define LPFC_SLI4_PROTO_FCOE    0x0000001
0527 #define LPFC_SLI4_PROTO_FC  0x0000002
0528 #define LPFC_SLI4_PROTO_NIC 0x0000004
0529 #define LPFC_SLI4_PROTO_ISCSI   0x0000008
0530 #define LPFC_SLI4_PROTO_RDMA    0x0000010
0531     uint32_t sge_supp_len;
0532     uint32_t if_page_sz;
0533     uint32_t rq_db_window;
0534     uint32_t loopbk_scope;
0535     uint32_t oas_supported;
0536     uint32_t eq_pages_max;
0537     uint32_t eqe_size;
0538     uint32_t cq_pages_max;
0539     uint32_t cqe_size;
0540     uint32_t mq_pages_max;
0541     uint32_t mqe_size;
0542     uint32_t mq_elem_cnt;
0543     uint32_t wq_pages_max;
0544     uint32_t wqe_size;
0545     uint32_t rq_pages_max;
0546     uint32_t rqe_size;
0547     uint32_t hdr_pages_max;
0548     uint32_t hdr_size;
0549     uint32_t hdr_pp_align;
0550     uint32_t sgl_pages_max;
0551     uint32_t sgl_pp_align;
0552     uint32_t mib_size;
0553     uint16_t mi_ver;
0554 #define LPFC_MIB1_SUPPORT   1
0555 #define LPFC_MIB2_SUPPORT   2
0556 #define LPFC_MIB3_SUPPORT   3
0557     uint16_t mi_value;
0558 #define LPFC_DFLT_MIB_VAL   2
0559     uint8_t mib_bde_cnt;
0560     uint8_t cmf;
0561     uint8_t cqv;
0562     uint8_t mqv;
0563     uint8_t wqv;
0564     uint8_t rqv;
0565     uint8_t eqav;
0566     uint8_t cqav;
0567     uint8_t wqsize;
0568     uint8_t bv1s;
0569     uint8_t pls;
0570 #define LPFC_WQ_SZ64_SUPPORT    1
0571 #define LPFC_WQ_SZ128_SUPPORT   2
0572     uint8_t wqpcnt;
0573     uint8_t nvme;
0574 };
0575 
0576 #define LPFC_CQ_4K_PAGE_SZ  0x1
0577 #define LPFC_CQ_16K_PAGE_SZ 0x4
0578 #define LPFC_WQ_4K_PAGE_SZ  0x1
0579 #define LPFC_WQ_16K_PAGE_SZ 0x4
0580 
0581 struct lpfc_iov {
0582     uint32_t pf_number;
0583     uint32_t vf_number;
0584 };
0585 
0586 struct lpfc_sli4_lnk_info {
0587     uint8_t lnk_dv;
0588 #define LPFC_LNK_DAT_INVAL  0
0589 #define LPFC_LNK_DAT_VAL    1
0590     uint8_t lnk_tp;
0591 #define LPFC_LNK_GE     0x0 /* FCoE */
0592 #define LPFC_LNK_FC     0x1 /* FC */
0593 #define LPFC_LNK_FC_TRUNKED 0x2 /* FC_Trunked */
0594     uint8_t lnk_no;
0595     uint8_t optic_state;
0596 };
0597 
0598 #define LPFC_SLI4_HANDLER_CNT       (LPFC_HBA_IO_CHAN_MAX+ \
0599                      LPFC_FOF_IO_CHAN_NUM)
0600 
0601 /* Used for tracking CPU mapping attributes */
0602 struct lpfc_vector_map_info {
0603     uint16_t    phys_id;
0604     uint16_t    core_id;
0605     uint16_t    eq;
0606     uint16_t    hdwq;
0607     uint16_t    flag;
0608 #define LPFC_CPU_MAP_HYPER  0x1
0609 #define LPFC_CPU_MAP_UNASSIGN   0x2
0610 #define LPFC_CPU_FIRST_IRQ  0x4
0611 };
0612 #define LPFC_VECTOR_MAP_EMPTY   0xffff
0613 
0614 /* Multi-XRI pool */
0615 #define XRI_BATCH               8
0616 
0617 struct lpfc_pbl_pool {
0618     struct list_head list;
0619     u32 count;
0620     spinlock_t lock;    /* lock for pbl_pool*/
0621 };
0622 
0623 struct lpfc_pvt_pool {
0624     u32 low_watermark;
0625     u32 high_watermark;
0626 
0627     struct list_head list;
0628     u32 count;
0629     spinlock_t lock;    /* lock for pvt_pool */
0630 };
0631 
0632 struct lpfc_multixri_pool {
0633     u32 xri_limit;
0634 
0635     /* Starting point when searching a pbl_pool with round-robin method */
0636     u32 rrb_next_hwqid;
0637 
0638     /* Used by lpfc_adjust_pvt_pool_count.
0639      * io_req_count is incremented by 1 during IO submission. The heartbeat
0640      * handler uses these two variables to determine if pvt_pool is idle or
0641      * busy.
0642      */
0643     u32 prev_io_req_count;
0644     u32 io_req_count;
0645 
0646     /* statistics */
0647     u32 pbl_empty_count;
0648 #ifdef LPFC_MXP_STAT
0649     u32 above_limit_count;
0650     u32 below_limit_count;
0651     u32 local_pbl_hit_count;
0652     u32 other_pbl_hit_count;
0653     u32 stat_max_hwm;
0654 
0655 #define LPFC_MXP_SNAPSHOT_TAKEN 3 /* snapshot is taken at 3rd heartbeats */
0656     u32 stat_pbl_count;
0657     u32 stat_pvt_count;
0658     u32 stat_busy_count;
0659     u32 stat_snapshot_taken;
0660 #endif
0661 
0662     /* TODO: Separate pvt_pool into get and put list */
0663     struct lpfc_pbl_pool pbl_pool;   /* Public free XRI pool */
0664     struct lpfc_pvt_pool pvt_pool;   /* Private free XRI pool */
0665 };
0666 
0667 struct lpfc_fc4_ctrl_stat {
0668     u32 input_requests;
0669     u32 output_requests;
0670     u32 control_requests;
0671     u32 io_cmpls;
0672 };
0673 
0674 #ifdef LPFC_HDWQ_LOCK_STAT
0675 struct lpfc_lock_stat {
0676     uint32_t alloc_xri_get;
0677     uint32_t alloc_xri_put;
0678     uint32_t free_xri;
0679     uint32_t wq_access;
0680     uint32_t alloc_pvt_pool;
0681     uint32_t mv_from_pvt_pool;
0682     uint32_t mv_to_pub_pool;
0683     uint32_t mv_to_pvt_pool;
0684     uint32_t free_pub_pool;
0685     uint32_t free_pvt_pool;
0686 };
0687 #endif
0688 
0689 struct lpfc_eq_intr_info {
0690     struct list_head list;
0691     uint32_t icnt;
0692 };
0693 
0694 /* SLI4 HBA data structure entries */
0695 struct lpfc_sli4_hdw_queue {
0696     /* Pointers to the constructed SLI4 queues */
0697     struct lpfc_queue *hba_eq;  /* Event queues for HBA */
0698     struct lpfc_queue *io_cq;   /* Fast-path FCP & NVME compl queue */
0699     struct lpfc_queue *io_wq;   /* Fast-path FCP & NVME work queue */
0700     uint16_t io_cq_map;
0701 
0702     /* Keep track of IO buffers for this hardware queue */
0703     spinlock_t io_buf_list_get_lock;  /* Common buf alloc list lock */
0704     struct list_head lpfc_io_buf_list_get;
0705     spinlock_t io_buf_list_put_lock;  /* Common buf free list lock */
0706     struct list_head lpfc_io_buf_list_put;
0707     spinlock_t abts_io_buf_list_lock; /* list of aborted IOs */
0708     struct list_head lpfc_abts_io_buf_list;
0709     uint32_t total_io_bufs;
0710     uint32_t get_io_bufs;
0711     uint32_t put_io_bufs;
0712     uint32_t empty_io_bufs;
0713     uint32_t abts_scsi_io_bufs;
0714     uint32_t abts_nvme_io_bufs;
0715 
0716     /* Multi-XRI pool per HWQ */
0717     struct lpfc_multixri_pool *p_multixri_pool;
0718 
0719     /* FC-4 Stats counters */
0720     struct lpfc_fc4_ctrl_stat nvme_cstat;
0721     struct lpfc_fc4_ctrl_stat scsi_cstat;
0722 #ifdef LPFC_HDWQ_LOCK_STAT
0723     struct lpfc_lock_stat lock_conflict;
0724 #endif
0725 
0726     /* Per HDWQ pool resources */
0727     struct list_head sgl_list;
0728     struct list_head cmd_rsp_buf_list;
0729 
0730     /* Lock for syncing Per HDWQ pool resources */
0731     spinlock_t hdwq_lock;
0732 };
0733 
0734 #ifdef LPFC_HDWQ_LOCK_STAT
0735 /* compile time trylock stats */
0736 #define lpfc_qp_spin_lock_irqsave(lock, flag, qp, lstat) \
0737     { \
0738     int only_once = 1; \
0739     while (spin_trylock_irqsave(lock, flag) == 0) { \
0740         if (only_once) { \
0741             only_once = 0; \
0742             qp->lock_conflict.lstat++; \
0743         } \
0744     } \
0745     }
0746 #define lpfc_qp_spin_lock(lock, qp, lstat) \
0747     { \
0748     int only_once = 1; \
0749     while (spin_trylock(lock) == 0) { \
0750         if (only_once) { \
0751             only_once = 0; \
0752             qp->lock_conflict.lstat++; \
0753         } \
0754     } \
0755     }
0756 #else
0757 #define lpfc_qp_spin_lock_irqsave(lock, flag, qp, lstat) \
0758     spin_lock_irqsave(lock, flag)
0759 #define lpfc_qp_spin_lock(lock, qp, lstat) spin_lock(lock)
0760 #endif
0761 
0762 #ifdef CONFIG_SCSI_LPFC_DEBUG_FS
0763 struct lpfc_hdwq_stat {
0764     u32 hdwq_no;
0765     u32 rcv_io;
0766     u32 xmt_io;
0767     u32 cmpl_io;
0768 };
0769 #endif
0770 
0771 struct lpfc_sli4_hba {
0772     void __iomem *conf_regs_memmap_p; /* Kernel memory mapped address for
0773                        * config space registers
0774                        */
0775     void __iomem *ctrl_regs_memmap_p; /* Kernel memory mapped address for
0776                        * control registers
0777                        */
0778     void __iomem *drbl_regs_memmap_p; /* Kernel memory mapped address for
0779                        * doorbell registers
0780                        */
0781     void __iomem *dpp_regs_memmap_p;  /* Kernel memory mapped address for
0782                        * dpp registers
0783                        */
0784     union {
0785         struct {
0786             /* IF Type 0, BAR 0 PCI cfg space reg mem map */
0787             void __iomem *UERRLOregaddr;
0788             void __iomem *UERRHIregaddr;
0789             void __iomem *UEMASKLOregaddr;
0790             void __iomem *UEMASKHIregaddr;
0791         } if_type0;
0792         struct {
0793             /* IF Type 2, BAR 0 PCI cfg space reg mem map. */
0794             void __iomem *STATUSregaddr;
0795             void __iomem *CTRLregaddr;
0796             void __iomem *ERR1regaddr;
0797 #define SLIPORT_ERR1_REG_ERR_CODE_1     0x1
0798 #define SLIPORT_ERR1_REG_ERR_CODE_2     0x2
0799             void __iomem *ERR2regaddr;
0800 #define SLIPORT_ERR2_REG_FW_RESTART     0x0
0801 #define SLIPORT_ERR2_REG_FUNC_PROVISON      0x1
0802 #define SLIPORT_ERR2_REG_FORCED_DUMP        0x2
0803 #define SLIPORT_ERR2_REG_FAILURE_EQ     0x3
0804 #define SLIPORT_ERR2_REG_FAILURE_CQ     0x4
0805 #define SLIPORT_ERR2_REG_FAILURE_BUS        0x5
0806 #define SLIPORT_ERR2_REG_FAILURE_RQ     0x6
0807             void __iomem *EQDregaddr;
0808         } if_type2;
0809     } u;
0810 
0811     /* IF type 0, BAR1 and if type 2, Bar 0 CSR register memory map */
0812     void __iomem *PSMPHRregaddr;
0813 
0814     /* Well-known SLI INTF register memory map. */
0815     void __iomem *SLIINTFregaddr;
0816 
0817     /* IF type 0, BAR 1 function CSR register memory map */
0818     void __iomem *ISRregaddr;   /* HST_ISR register */
0819     void __iomem *IMRregaddr;   /* HST_IMR register */
0820     void __iomem *ISCRregaddr;  /* HST_ISCR register */
0821     /* IF type 0, BAR 0 and if type 2, BAR 0 doorbell register memory map */
0822     void __iomem *RQDBregaddr;  /* RQ_DOORBELL register */
0823     void __iomem *WQDBregaddr;  /* WQ_DOORBELL register */
0824     void __iomem *CQDBregaddr;  /* CQ_DOORBELL register */
0825     void __iomem *EQDBregaddr;  /* EQ_DOORBELL register */
0826     void __iomem *MQDBregaddr;  /* MQ_DOORBELL register */
0827     void __iomem *BMBXregaddr;  /* BootStrap MBX register */
0828 
0829     uint32_t ue_mask_lo;
0830     uint32_t ue_mask_hi;
0831     uint32_t ue_to_sr;
0832     uint32_t ue_to_rp;
0833     struct lpfc_register sli_intf;
0834     struct lpfc_pc_sli4_params pc_sli4_params;
0835     struct lpfc_bbscn_params bbscn_params;
0836     struct lpfc_hba_eq_hdl *hba_eq_hdl; /* HBA per-WQ handle */
0837 
0838     void (*sli4_eq_clr_intr)(struct lpfc_queue *q);
0839     void (*sli4_write_eq_db)(struct lpfc_hba *phba, struct lpfc_queue *eq,
0840                 uint32_t count, bool arm);
0841     void (*sli4_write_cq_db)(struct lpfc_hba *phba, struct lpfc_queue *cq,
0842                 uint32_t count, bool arm);
0843 
0844     /* Pointers to the constructed SLI4 queues */
0845     struct lpfc_sli4_hdw_queue *hdwq;
0846     struct list_head lpfc_wq_list;
0847 
0848     /* Pointers to the constructed SLI4 queues for NVMET */
0849     struct lpfc_queue **nvmet_cqset; /* Fast-path NVMET CQ Set queues */
0850     struct lpfc_queue **nvmet_mrq_hdr; /* Fast-path NVMET hdr MRQs */
0851     struct lpfc_queue **nvmet_mrq_data; /* Fast-path NVMET data MRQs */
0852 
0853     struct lpfc_queue *mbx_cq; /* Slow-path mailbox complete queue */
0854     struct lpfc_queue *els_cq; /* Slow-path ELS response complete queue */
0855     struct lpfc_queue *nvmels_cq; /* NVME LS complete queue */
0856     struct lpfc_queue *mbx_wq; /* Slow-path MBOX work queue */
0857     struct lpfc_queue *els_wq; /* Slow-path ELS work queue */
0858     struct lpfc_queue *nvmels_wq; /* NVME LS work queue */
0859     struct lpfc_queue *hdr_rq; /* Slow-path Header Receive queue */
0860     struct lpfc_queue *dat_rq; /* Slow-path Data Receive queue */
0861 
0862     struct lpfc_name wwnn;
0863     struct lpfc_name wwpn;
0864 
0865     uint32_t fw_func_mode;  /* FW function protocol mode */
0866     uint32_t ulp0_mode; /* ULP0 protocol mode */
0867     uint32_t ulp1_mode; /* ULP1 protocol mode */
0868 
0869     /* Optimized Access Storage specific queues/structures */
0870     uint64_t oas_next_lun;
0871     uint8_t oas_next_tgt_wwpn[8];
0872     uint8_t oas_next_vpt_wwpn[8];
0873 
0874     /* Setup information for various queue parameters */
0875     int eq_esize;
0876     int eq_ecount;
0877     int cq_esize;
0878     int cq_ecount;
0879     int wq_esize;
0880     int wq_ecount;
0881     int mq_esize;
0882     int mq_ecount;
0883     int rq_esize;
0884     int rq_ecount;
0885 #define LPFC_SP_EQ_MAX_INTR_SEC         10000
0886 #define LPFC_FP_EQ_MAX_INTR_SEC         10000
0887 
0888     uint32_t intr_enable;
0889     struct lpfc_bmbx bmbx;
0890     struct lpfc_max_cfg_param max_cfg_param;
0891     uint16_t extents_in_use; /* must allocate resource extents. */
0892     uint16_t rpi_hdrs_in_use; /* must post rpi hdrs if set. */
0893     uint16_t next_xri; /* last_xri - max_cfg_param.xri_base = used */
0894     uint16_t next_rpi;
0895     uint16_t io_xri_max;
0896     uint16_t io_xri_cnt;
0897     uint16_t io_xri_start;
0898     uint16_t els_xri_cnt;
0899     uint16_t nvmet_xri_cnt;
0900     uint16_t nvmet_io_wait_cnt;
0901     uint16_t nvmet_io_wait_total;
0902     uint16_t cq_max;
0903     struct lpfc_queue **cq_lookup;
0904     struct list_head lpfc_els_sgl_list;
0905     struct list_head lpfc_abts_els_sgl_list;
0906     spinlock_t abts_io_buf_list_lock; /* list of aborted SCSI IOs */
0907     struct list_head lpfc_abts_io_buf_list;
0908     struct list_head lpfc_nvmet_sgl_list;
0909     spinlock_t abts_nvmet_buf_list_lock; /* list of aborted NVMET IOs */
0910     struct list_head lpfc_abts_nvmet_ctx_list;
0911     spinlock_t t_active_list_lock; /* list of active NVMET IOs */
0912     struct list_head t_active_ctx_list;
0913     struct list_head lpfc_nvmet_io_wait_list;
0914     struct lpfc_nvmet_ctx_info *nvmet_ctx_info;
0915     struct lpfc_sglq **lpfc_sglq_active_list;
0916     struct list_head lpfc_rpi_hdr_list;
0917     unsigned long *rpi_bmask;
0918     uint16_t *rpi_ids;
0919     uint16_t rpi_count;
0920     struct list_head lpfc_rpi_blk_list;
0921     unsigned long *xri_bmask;
0922     uint16_t *xri_ids;
0923     struct list_head lpfc_xri_blk_list;
0924     unsigned long *vfi_bmask;
0925     uint16_t *vfi_ids;
0926     uint16_t vfi_count;
0927     struct list_head lpfc_vfi_blk_list;
0928     struct lpfc_sli4_flags sli4_flags;
0929     struct list_head sp_queue_event;
0930     struct list_head sp_cqe_event_pool;
0931     struct list_head sp_asynce_work_queue;
0932     spinlock_t asynce_list_lock; /* protect sp_asynce_work_queue list */
0933     struct list_head sp_els_xri_aborted_work_queue;
0934     spinlock_t els_xri_abrt_list_lock; /* protect els_xri_aborted list */
0935     struct list_head sp_unsol_work_queue;
0936     struct lpfc_sli4_link link_state;
0937     struct lpfc_sli4_lnk_info lnk_info;
0938     uint32_t pport_name_sta;
0939 #define LPFC_SLI4_PPNAME_NON    0
0940 #define LPFC_SLI4_PPNAME_GET    1
0941     struct lpfc_iov iov;
0942     spinlock_t sgl_list_lock; /* list of aborted els IOs */
0943     spinlock_t nvmet_io_wait_lock; /* IOs waiting for ctx resources */
0944     uint32_t physical_port;
0945 
0946     /* CPU to vector mapping information */
0947     struct lpfc_vector_map_info *cpu_map;
0948     uint16_t num_possible_cpu;
0949     uint16_t num_present_cpu;
0950     struct cpumask irq_aff_mask;
0951     uint16_t curr_disp_cpu;
0952     struct lpfc_eq_intr_info __percpu *eq_info;
0953 #ifdef CONFIG_SCSI_LPFC_DEBUG_FS
0954     struct lpfc_hdwq_stat __percpu *c_stat;
0955 #endif
0956     struct lpfc_idle_stat *idle_stat;
0957     uint32_t conf_trunk;
0958 #define lpfc_conf_trunk_port0_WORD  conf_trunk
0959 #define lpfc_conf_trunk_port0_SHIFT 0
0960 #define lpfc_conf_trunk_port0_MASK  0x1
0961 #define lpfc_conf_trunk_port1_WORD  conf_trunk
0962 #define lpfc_conf_trunk_port1_SHIFT 1
0963 #define lpfc_conf_trunk_port1_MASK  0x1
0964 #define lpfc_conf_trunk_port2_WORD  conf_trunk
0965 #define lpfc_conf_trunk_port2_SHIFT 2
0966 #define lpfc_conf_trunk_port2_MASK  0x1
0967 #define lpfc_conf_trunk_port3_WORD  conf_trunk
0968 #define lpfc_conf_trunk_port3_SHIFT 3
0969 #define lpfc_conf_trunk_port3_MASK  0x1
0970 #define lpfc_conf_trunk_port0_nd_WORD   conf_trunk
0971 #define lpfc_conf_trunk_port0_nd_SHIFT  4
0972 #define lpfc_conf_trunk_port0_nd_MASK   0x1
0973 #define lpfc_conf_trunk_port1_nd_WORD   conf_trunk
0974 #define lpfc_conf_trunk_port1_nd_SHIFT  5
0975 #define lpfc_conf_trunk_port1_nd_MASK   0x1
0976 #define lpfc_conf_trunk_port2_nd_WORD   conf_trunk
0977 #define lpfc_conf_trunk_port2_nd_SHIFT  6
0978 #define lpfc_conf_trunk_port2_nd_MASK   0x1
0979 #define lpfc_conf_trunk_port3_nd_WORD   conf_trunk
0980 #define lpfc_conf_trunk_port3_nd_SHIFT  7
0981 #define lpfc_conf_trunk_port3_nd_MASK   0x1
0982     uint8_t flash_id;
0983     uint8_t asic_rev;
0984     uint16_t fawwpn_flag;   /* FA-WWPN support state */
0985 #define LPFC_FAWWPN_CONFIG  0x1 /* FA-PWWN is configured */
0986 #define LPFC_FAWWPN_FABRIC  0x2 /* FA-PWWN success with Fabric */
0987 };
0988 
0989 enum lpfc_sge_type {
0990     GEN_BUFF_TYPE,
0991     SCSI_BUFF_TYPE,
0992     NVMET_BUFF_TYPE
0993 };
0994 
0995 enum lpfc_sgl_state {
0996     SGL_FREED,
0997     SGL_ALLOCATED,
0998     SGL_XRI_ABORTED
0999 };
1000 
1001 struct lpfc_sglq {
1002     /* lpfc_sglqs are used in double linked lists */
1003     struct list_head list;
1004     struct list_head clist;
1005     enum lpfc_sge_type buff_type; /* is this a scsi sgl */
1006     enum lpfc_sgl_state state;
1007     struct lpfc_nodelist *ndlp; /* ndlp associated with IO */
1008     uint16_t iotag;         /* pre-assigned IO tag */
1009     uint16_t sli4_lxritag;  /* logical pre-assigned xri. */
1010     uint16_t sli4_xritag;   /* pre-assigned XRI, (OXID) tag. */
1011     struct sli4_sge *sgl;   /* pre-assigned SGL */
1012     void *virt;     /* virtual address. */
1013     dma_addr_t phys;    /* physical address */
1014 };
1015 
1016 struct lpfc_rpi_hdr {
1017     struct list_head list;
1018     uint32_t len;
1019     struct lpfc_dmabuf *dmabuf;
1020     uint32_t page_count;
1021     uint32_t start_rpi;
1022     uint16_t next_rpi;
1023 };
1024 
1025 struct lpfc_rsrc_blks {
1026     struct list_head list;
1027     uint16_t rsrc_start;
1028     uint16_t rsrc_size;
1029     uint16_t rsrc_used;
1030 };
1031 
1032 struct lpfc_rdp_context {
1033     struct lpfc_nodelist *ndlp;
1034     uint16_t ox_id;
1035     uint16_t rx_id;
1036     READ_LNK_VAR link_stat;
1037     uint8_t page_a0[DMP_SFF_PAGE_A0_SIZE];
1038     uint8_t page_a2[DMP_SFF_PAGE_A2_SIZE];
1039     void (*cmpl)(struct lpfc_hba *, struct lpfc_rdp_context*, int);
1040 };
1041 
1042 struct lpfc_lcb_context {
1043     uint8_t  sub_command;
1044     uint8_t  type;
1045     uint8_t  capability;
1046     uint8_t  frequency;
1047     uint16_t  duration;
1048     uint16_t ox_id;
1049     uint16_t rx_id;
1050     struct lpfc_nodelist *ndlp;
1051 };
1052 
1053 
1054 /*
1055  * SLI4 specific function prototypes
1056  */
1057 int lpfc_pci_function_reset(struct lpfc_hba *);
1058 int lpfc_sli4_pdev_status_reg_wait(struct lpfc_hba *);
1059 int lpfc_sli4_hba_setup(struct lpfc_hba *);
1060 int lpfc_sli4_config(struct lpfc_hba *, struct lpfcMboxq *, uint8_t,
1061              uint8_t, uint32_t, bool);
1062 void lpfc_sli4_mbox_cmd_free(struct lpfc_hba *, struct lpfcMboxq *);
1063 void lpfc_sli4_mbx_sge_set(struct lpfcMboxq *, uint32_t, dma_addr_t, uint32_t);
1064 void lpfc_sli4_mbx_sge_get(struct lpfcMboxq *, uint32_t,
1065                struct lpfc_mbx_sge *);
1066 int lpfc_sli4_mbx_read_fcf_rec(struct lpfc_hba *, struct lpfcMboxq *,
1067                    uint16_t);
1068 
1069 void lpfc_sli4_hba_reset(struct lpfc_hba *);
1070 struct lpfc_queue *lpfc_sli4_queue_alloc(struct lpfc_hba *phba,
1071                      uint32_t page_size,
1072                      uint32_t entry_size,
1073                      uint32_t entry_count, int cpu);
1074 void lpfc_sli4_queue_free(struct lpfc_queue *);
1075 int lpfc_eq_create(struct lpfc_hba *, struct lpfc_queue *, uint32_t);
1076 void lpfc_modify_hba_eq_delay(struct lpfc_hba *phba, uint32_t startq,
1077                  uint32_t numq, uint32_t usdelay);
1078 int lpfc_cq_create(struct lpfc_hba *, struct lpfc_queue *,
1079             struct lpfc_queue *, uint32_t, uint32_t);
1080 int lpfc_cq_create_set(struct lpfc_hba *phba, struct lpfc_queue **cqp,
1081             struct lpfc_sli4_hdw_queue *hdwq, uint32_t type,
1082             uint32_t subtype);
1083 int32_t lpfc_mq_create(struct lpfc_hba *, struct lpfc_queue *,
1084                struct lpfc_queue *, uint32_t);
1085 int lpfc_wq_create(struct lpfc_hba *, struct lpfc_queue *,
1086             struct lpfc_queue *, uint32_t);
1087 int lpfc_rq_create(struct lpfc_hba *, struct lpfc_queue *,
1088             struct lpfc_queue *, struct lpfc_queue *, uint32_t);
1089 int lpfc_mrq_create(struct lpfc_hba *phba, struct lpfc_queue **hrqp,
1090             struct lpfc_queue **drqp, struct lpfc_queue **cqp,
1091             uint32_t subtype);
1092 int lpfc_eq_destroy(struct lpfc_hba *, struct lpfc_queue *);
1093 int lpfc_cq_destroy(struct lpfc_hba *, struct lpfc_queue *);
1094 int lpfc_mq_destroy(struct lpfc_hba *, struct lpfc_queue *);
1095 int lpfc_wq_destroy(struct lpfc_hba *, struct lpfc_queue *);
1096 int lpfc_rq_destroy(struct lpfc_hba *, struct lpfc_queue *,
1097              struct lpfc_queue *);
1098 int lpfc_sli4_queue_setup(struct lpfc_hba *);
1099 void lpfc_sli4_queue_unset(struct lpfc_hba *);
1100 int lpfc_sli4_post_sgl(struct lpfc_hba *, dma_addr_t, dma_addr_t, uint16_t);
1101 int lpfc_repost_io_sgl_list(struct lpfc_hba *phba);
1102 uint16_t lpfc_sli4_next_xritag(struct lpfc_hba *);
1103 void lpfc_sli4_free_xri(struct lpfc_hba *, int);
1104 int lpfc_sli4_post_async_mbox(struct lpfc_hba *);
1105 struct lpfc_cq_event *__lpfc_sli4_cq_event_alloc(struct lpfc_hba *);
1106 struct lpfc_cq_event *lpfc_sli4_cq_event_alloc(struct lpfc_hba *);
1107 void __lpfc_sli4_cq_event_release(struct lpfc_hba *, struct lpfc_cq_event *);
1108 void lpfc_sli4_cq_event_release(struct lpfc_hba *, struct lpfc_cq_event *);
1109 int lpfc_sli4_init_rpi_hdrs(struct lpfc_hba *);
1110 int lpfc_sli4_post_rpi_hdr(struct lpfc_hba *, struct lpfc_rpi_hdr *);
1111 int lpfc_sli4_post_all_rpi_hdrs(struct lpfc_hba *);
1112 struct lpfc_rpi_hdr *lpfc_sli4_create_rpi_hdr(struct lpfc_hba *);
1113 void lpfc_sli4_remove_rpi_hdrs(struct lpfc_hba *);
1114 int lpfc_sli4_alloc_rpi(struct lpfc_hba *);
1115 void lpfc_sli4_free_rpi(struct lpfc_hba *, int);
1116 void lpfc_sli4_remove_rpis(struct lpfc_hba *);
1117 void lpfc_sli4_async_event_proc(struct lpfc_hba *);
1118 void lpfc_sli4_fcf_redisc_event_proc(struct lpfc_hba *);
1119 int lpfc_sli4_resume_rpi(struct lpfc_nodelist *,
1120             void (*)(struct lpfc_hba *, LPFC_MBOXQ_t *), void *);
1121 void lpfc_sli4_els_xri_abort_event_proc(struct lpfc_hba *phba);
1122 void lpfc_sli4_nvme_pci_offline_aborted(struct lpfc_hba *phba,
1123                     struct lpfc_io_buf *lpfc_ncmd);
1124 void lpfc_sli4_nvme_xri_aborted(struct lpfc_hba *phba,
1125                 struct sli4_wcqe_xri_aborted *axri,
1126                 struct lpfc_io_buf *lpfc_ncmd);
1127 void lpfc_sli4_io_xri_aborted(struct lpfc_hba *phba,
1128                   struct sli4_wcqe_xri_aborted *axri, int idx);
1129 void lpfc_sli4_nvmet_xri_aborted(struct lpfc_hba *phba,
1130                  struct sli4_wcqe_xri_aborted *axri);
1131 void lpfc_sli4_els_xri_aborted(struct lpfc_hba *,
1132                    struct sli4_wcqe_xri_aborted *);
1133 void lpfc_sli4_vport_delete_els_xri_aborted(struct lpfc_vport *);
1134 void lpfc_sli4_vport_delete_fcp_xri_aborted(struct lpfc_vport *);
1135 int lpfc_sli4_brdreset(struct lpfc_hba *);
1136 int lpfc_sli4_add_fcf_record(struct lpfc_hba *, struct fcf_record *);
1137 void lpfc_sli_remove_dflt_fcf(struct lpfc_hba *);
1138 int lpfc_sli4_get_els_iocb_cnt(struct lpfc_hba *);
1139 int lpfc_sli4_get_iocb_cnt(struct lpfc_hba *phba);
1140 int lpfc_sli4_init_vpi(struct lpfc_vport *);
1141 void lpfc_sli4_eq_clr_intr(struct lpfc_queue *);
1142 void lpfc_sli4_write_cq_db(struct lpfc_hba *phba, struct lpfc_queue *q,
1143                uint32_t count, bool arm);
1144 void lpfc_sli4_write_eq_db(struct lpfc_hba *phba, struct lpfc_queue *q,
1145                uint32_t count, bool arm);
1146 void lpfc_sli4_if6_eq_clr_intr(struct lpfc_queue *q);
1147 void lpfc_sli4_if6_write_cq_db(struct lpfc_hba *phba, struct lpfc_queue *q,
1148                    uint32_t count, bool arm);
1149 void lpfc_sli4_if6_write_eq_db(struct lpfc_hba *phba, struct lpfc_queue *q,
1150                    uint32_t count, bool arm);
1151 void lpfc_sli4_fcfi_unreg(struct lpfc_hba *, uint16_t);
1152 int lpfc_sli4_fcf_scan_read_fcf_rec(struct lpfc_hba *, uint16_t);
1153 int lpfc_sli4_fcf_rr_read_fcf_rec(struct lpfc_hba *, uint16_t);
1154 int lpfc_sli4_read_fcf_rec(struct lpfc_hba *, uint16_t);
1155 void lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *, LPFC_MBOXQ_t *);
1156 void lpfc_mbx_cmpl_fcf_rr_read_fcf_rec(struct lpfc_hba *, LPFC_MBOXQ_t *);
1157 void lpfc_mbx_cmpl_read_fcf_rec(struct lpfc_hba *, LPFC_MBOXQ_t *);
1158 int lpfc_sli4_unregister_fcf(struct lpfc_hba *);
1159 int lpfc_sli4_post_status_check(struct lpfc_hba *);
1160 uint8_t lpfc_sli_config_mbox_subsys_get(struct lpfc_hba *, LPFC_MBOXQ_t *);
1161 uint8_t lpfc_sli_config_mbox_opcode_get(struct lpfc_hba *, LPFC_MBOXQ_t *);
1162 void lpfc_sli4_ras_dma_free(struct lpfc_hba *phba);
1163 struct sli4_hybrid_sgl *lpfc_get_sgl_per_hdwq(struct lpfc_hba *phba,
1164                           struct lpfc_io_buf *buf);
1165 struct fcp_cmd_rsp_buf *lpfc_get_cmd_rsp_buf_per_hdwq(struct lpfc_hba *phba,
1166                               struct lpfc_io_buf *buf);
1167 int lpfc_put_sgl_per_hdwq(struct lpfc_hba *phba, struct lpfc_io_buf *buf);
1168 int lpfc_put_cmd_rsp_buf_per_hdwq(struct lpfc_hba *phba,
1169                   struct lpfc_io_buf *buf);
1170 void lpfc_free_sgl_per_hdwq(struct lpfc_hba *phba,
1171                 struct lpfc_sli4_hdw_queue *hdwq);
1172 void lpfc_free_cmd_rsp_buf_per_hdwq(struct lpfc_hba *phba,
1173                     struct lpfc_sli4_hdw_queue *hdwq);
1174 static inline void *lpfc_sli4_qe(struct lpfc_queue *q, uint16_t idx)
1175 {
1176     return q->q_pgs[idx / q->entry_cnt_per_pg] +
1177         (q->entry_size * (idx % q->entry_cnt_per_pg));
1178 }