135b53f8cSChandrakanth patil /*- 235b53f8cSChandrakanth patil * Broadcom NetXtreme-C/E network driver. 335b53f8cSChandrakanth patil * 435b53f8cSChandrakanth patil * Copyright (c) 2016 Broadcom, All Rights Reserved. 535b53f8cSChandrakanth patil * The term Broadcom refers to Broadcom Limited and/or its subsidiaries 635b53f8cSChandrakanth patil * 735b53f8cSChandrakanth patil * Redistribution and use in source and binary forms, with or without 835b53f8cSChandrakanth patil * modification, are permitted provided that the following conditions 935b53f8cSChandrakanth patil * are met: 1035b53f8cSChandrakanth patil * 1. Redistributions of source code must retain the above copyright 1135b53f8cSChandrakanth patil * notice, this list of conditions and the following disclaimer. 1235b53f8cSChandrakanth patil * 2. Redistributions in binary form must reproduce the above copyright 1335b53f8cSChandrakanth patil * notice, this list of conditions and the following disclaimer in the 1435b53f8cSChandrakanth patil * documentation and/or other materials provided with the distribution. 1535b53f8cSChandrakanth patil * 1635b53f8cSChandrakanth patil * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS' 1735b53f8cSChandrakanth patil * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1835b53f8cSChandrakanth patil * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1935b53f8cSChandrakanth patil * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2035b53f8cSChandrakanth patil * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2135b53f8cSChandrakanth patil * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2235b53f8cSChandrakanth patil * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2335b53f8cSChandrakanth patil * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2435b53f8cSChandrakanth patil * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2535b53f8cSChandrakanth patil * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2635b53f8cSChandrakanth patil * THE POSSIBILITY OF SUCH DAMAGE. 2735b53f8cSChandrakanth patil */ 2835b53f8cSChandrakanth patil 2935b53f8cSChandrakanth patil #include <sys/cdefs.h> 3035b53f8cSChandrakanth patil #ifndef _BNXT_H 3135b53f8cSChandrakanth patil #define _BNXT_H 3235b53f8cSChandrakanth patil 3335b53f8cSChandrakanth patil #include <sys/param.h> 3435b53f8cSChandrakanth patil #include <sys/socket.h> 3535b53f8cSChandrakanth patil #include <sys/sysctl.h> 3635b53f8cSChandrakanth patil #include <sys/taskqueue.h> 3735b53f8cSChandrakanth patil #include <sys/bitstring.h> 3835b53f8cSChandrakanth patil 3935b53f8cSChandrakanth patil #include <machine/bus.h> 4035b53f8cSChandrakanth patil 4135b53f8cSChandrakanth patil #include <net/ethernet.h> 4235b53f8cSChandrakanth patil #include <net/if.h> 4335b53f8cSChandrakanth patil #include <net/if_var.h> 4435b53f8cSChandrakanth patil #include <net/iflib.h> 45050d28e1SChandrakanth patil #include <linux/types.h> 4635b53f8cSChandrakanth patil 4735b53f8cSChandrakanth patil #include "hsi_struct_def.h" 4835b53f8cSChandrakanth patil #include "bnxt_dcb.h" 49050d28e1SChandrakanth patil #include "bnxt_auxbus_compat.h" 50050d28e1SChandrakanth patil 51050d28e1SChandrakanth patil #define DFLT_HWRM_CMD_TIMEOUT 500 5235b53f8cSChandrakanth patil 5335b53f8cSChandrakanth patil /* PCI IDs */ 5435b53f8cSChandrakanth patil #define BROADCOM_VENDOR_ID 0x14E4 5535b53f8cSChandrakanth patil 5635b53f8cSChandrakanth patil #define BCM57301 0x16c8 5735b53f8cSChandrakanth patil #define BCM57302 0x16c9 5835b53f8cSChandrakanth patil #define BCM57304 0x16ca 5935b53f8cSChandrakanth patil #define BCM57311 0x16ce 6035b53f8cSChandrakanth patil #define BCM57312 0x16cf 6135b53f8cSChandrakanth patil #define BCM57314 0x16df 6235b53f8cSChandrakanth patil #define BCM57402 0x16d0 6335b53f8cSChandrakanth patil #define BCM57402_NPAR 0x16d4 6435b53f8cSChandrakanth patil #define BCM57404 0x16d1 6535b53f8cSChandrakanth patil #define BCM57404_NPAR 0x16e7 6635b53f8cSChandrakanth patil #define BCM57406 0x16d2 6735b53f8cSChandrakanth patil #define BCM57406_NPAR 0x16e8 6835b53f8cSChandrakanth patil #define BCM57407 0x16d5 6935b53f8cSChandrakanth patil #define BCM57407_NPAR 0x16ea 7035b53f8cSChandrakanth patil #define BCM57407_SFP 0x16e9 7135b53f8cSChandrakanth patil #define BCM57412 0x16d6 7235b53f8cSChandrakanth patil #define BCM57412_NPAR1 0x16de 7335b53f8cSChandrakanth patil #define BCM57412_NPAR2 0x16eb 7435b53f8cSChandrakanth patil #define BCM57414 0x16d7 7535b53f8cSChandrakanth patil #define BCM57414_NPAR1 0x16ec 7635b53f8cSChandrakanth patil #define BCM57414_NPAR2 0x16ed 7735b53f8cSChandrakanth patil #define BCM57416 0x16d8 7835b53f8cSChandrakanth patil #define BCM57416_NPAR1 0x16ee 7935b53f8cSChandrakanth patil #define BCM57416_NPAR2 0x16ef 8035b53f8cSChandrakanth patil #define BCM57416_SFP 0x16e3 8135b53f8cSChandrakanth patil #define BCM57417 0x16d9 8235b53f8cSChandrakanth patil #define BCM57417_NPAR1 0x16c0 8335b53f8cSChandrakanth patil #define BCM57417_NPAR2 0x16cc 8435b53f8cSChandrakanth patil #define BCM57417_SFP 0x16e2 8535b53f8cSChandrakanth patil #define BCM57454 0x1614 8635b53f8cSChandrakanth patil #define BCM58700 0x16cd 8735b53f8cSChandrakanth patil #define BCM57508 0x1750 8835b53f8cSChandrakanth patil #define BCM57504 0x1751 890bff7166SVinícius Ferrão #define BCM57504_NPAR 0x1801 9035b53f8cSChandrakanth patil #define BCM57502 0x1752 9135b53f8cSChandrakanth patil #define NETXTREME_C_VF1 0x16cb 9235b53f8cSChandrakanth patil #define NETXTREME_C_VF2 0x16e1 9335b53f8cSChandrakanth patil #define NETXTREME_C_VF3 0x16e5 9435b53f8cSChandrakanth patil #define NETXTREME_E_VF1 0x16c1 9535b53f8cSChandrakanth patil #define NETXTREME_E_VF2 0x16d3 9635b53f8cSChandrakanth patil #define NETXTREME_E_VF3 0x16dc 9735b53f8cSChandrakanth patil 98050d28e1SChandrakanth patil #define EVENT_DATA1_RESET_NOTIFY_FATAL(data1) \ 99050d28e1SChandrakanth patil (((data1) & \ 100050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_MASK) ==\ 101050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_EXCEPTION_FATAL) 102050d28e1SChandrakanth patil 103050d28e1SChandrakanth patil #define BNXT_EVENT_ERROR_REPORT_TYPE(data1) \ 104050d28e1SChandrakanth patil (((data1) & \ 105050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_MASK) >> \ 106050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_SFT) 107050d28e1SChandrakanth patil 108050d28e1SChandrakanth patil #define BNXT_EVENT_INVALID_SIGNAL_DATA(data2) \ 109050d28e1SChandrakanth patil (((data2) & \ 110050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_INVALID_SIGNAL_EVENT_DATA2_PIN_ID_MASK) >> \ 111050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_INVALID_SIGNAL_EVENT_DATA2_PIN_ID_SFT) 112050d28e1SChandrakanth patil 113050d28e1SChandrakanth patil #define BNXT_EVENT_DBR_EPOCH(data) \ 114050d28e1SChandrakanth patil (((data) & HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_DOORBELL_DROP_THRESHOLD_EVENT_DATA1_EPOCH_MASK) >> \ 115050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_DOORBELL_DROP_THRESHOLD_EVENT_DATA1_EPOCH_SFT) 116050d28e1SChandrakanth patil 117050d28e1SChandrakanth patil #define BNXT_EVENT_THERMAL_THRESHOLD_TEMP(data2) \ 118050d28e1SChandrakanth patil (((data2) & \ 119050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA2_THRESHOLD_TEMP_MASK) >> \ 120050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA2_THRESHOLD_TEMP_SFT) 121050d28e1SChandrakanth patil 122050d28e1SChandrakanth patil #define EVENT_DATA2_NVM_ERR_ADDR(data2) \ 123050d28e1SChandrakanth patil (((data2) & \ 124050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_NVM_EVENT_DATA2_ERR_ADDR_MASK) >> \ 125050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_NVM_EVENT_DATA2_ERR_ADDR_SFT) 126050d28e1SChandrakanth patil 127050d28e1SChandrakanth patil #define EVENT_DATA1_THERMAL_THRESHOLD_DIR_INCREASING(data1) \ 128050d28e1SChandrakanth patil (((data1) & \ 129050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_TRANSITION_DIR) == \ 130050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_TRANSITION_DIR_INCREASING) 131050d28e1SChandrakanth patil 132050d28e1SChandrakanth patil #define EVENT_DATA1_NVM_ERR_TYPE_WRITE(data1) \ 133050d28e1SChandrakanth patil (((data1) & \ 134050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_NVM_EVENT_DATA1_NVM_ERR_TYPE_MASK) == \ 135050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_NVM_EVENT_DATA1_NVM_ERR_TYPE_WRITE) 136050d28e1SChandrakanth patil 137050d28e1SChandrakanth patil #define EVENT_DATA1_NVM_ERR_TYPE_ERASE(data1) \ 138050d28e1SChandrakanth patil (((data1) & \ 139050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_NVM_EVENT_DATA1_NVM_ERR_TYPE_MASK) == \ 140050d28e1SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_NVM_EVENT_DATA1_NVM_ERR_TYPE_ERASE) 141050d28e1SChandrakanth patil 142050d28e1SChandrakanth patil #define EVENT_DATA1_THERMAL_THRESHOLD_TYPE(data1) \ 143050d28e1SChandrakanth patil ((data1) & HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_THRESHOLD_TYPE_MASK) 144050d28e1SChandrakanth patil 145050d28e1SChandrakanth patil #define BNXT_EVENT_THERMAL_CURRENT_TEMP(data2) \ 146050d28e1SChandrakanth patil ((data2) & HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA2_CURRENT_TEMP_MASK) 147050d28e1SChandrakanth patil 148c9965974SChandrakanth patil #define EVENT_DATA1_RESET_NOTIFY_FW_ACTIVATION(data1) \ 149c9965974SChandrakanth patil (((data1) & \ 150c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_MASK) ==\ 151c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_ACTIVATION) 152c9965974SChandrakanth patil 153c9965974SChandrakanth patil #define EVENT_DATA2_RESET_NOTIFY_FW_STATUS_CODE(data2) \ 154c9965974SChandrakanth patil ((data2) & \ 155c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA2_FW_STATUS_CODE_MASK) 156c9965974SChandrakanth patil 157c9965974SChandrakanth patil #define EVENT_DATA1_RECOVERY_ENABLED(data1) \ 158c9965974SChandrakanth patil !!((data1) & \ 159c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_RECOVERY_ENABLED) 160c9965974SChandrakanth patil 161c9965974SChandrakanth patil #define EVENT_DATA1_RECOVERY_MASTER_FUNC(data1) \ 162c9965974SChandrakanth patil !!((data1) & \ 163c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_MASTER_FUNC) 164c9965974SChandrakanth patil 165050d28e1SChandrakanth patil #define INVALID_STATS_CTX_ID -1 166050d28e1SChandrakanth patil 16735b53f8cSChandrakanth patil /* Maximum numbers of RX and TX descriptors. iflib requires this to be a power 16835b53f8cSChandrakanth patil * of two. The hardware has no particular limitation. */ 16935b53f8cSChandrakanth patil #define BNXT_MAX_RXD ((INT32_MAX >> 1) + 1) 17035b53f8cSChandrakanth patil #define BNXT_MAX_TXD ((INT32_MAX >> 1) + 1) 17135b53f8cSChandrakanth patil 17235b53f8cSChandrakanth patil #define CSUM_OFFLOAD (CSUM_IP_TSO|CSUM_IP6_TSO|CSUM_IP| \ 17335b53f8cSChandrakanth patil CSUM_IP_UDP|CSUM_IP_TCP|CSUM_IP_SCTP| \ 17435b53f8cSChandrakanth patil CSUM_IP6_UDP|CSUM_IP6_TCP|CSUM_IP6_SCTP) 17535b53f8cSChandrakanth patil 17635b53f8cSChandrakanth patil #define BNXT_MAX_MTU 9600 17735b53f8cSChandrakanth patil 17835b53f8cSChandrakanth patil #define BNXT_RSS_HASH_TYPE_TCPV4 0 17935b53f8cSChandrakanth patil #define BNXT_RSS_HASH_TYPE_UDPV4 1 18035b53f8cSChandrakanth patil #define BNXT_RSS_HASH_TYPE_IPV4 2 18135b53f8cSChandrakanth patil #define BNXT_RSS_HASH_TYPE_TCPV6 3 18235b53f8cSChandrakanth patil #define BNXT_RSS_HASH_TYPE_UDPV6 4 18335b53f8cSChandrakanth patil #define BNXT_RSS_HASH_TYPE_IPV6 5 18435b53f8cSChandrakanth patil #define BNXT_GET_RSS_PROFILE_ID(rss_hash_type) ((rss_hash_type >> 1) & 0x1F) 18535b53f8cSChandrakanth patil 18635b53f8cSChandrakanth patil #define BNXT_NO_MORE_WOL_FILTERS 0xFFFF 18735b53f8cSChandrakanth patil #define bnxt_wol_supported(softc) (!((softc)->flags & BNXT_FLAG_VF) && \ 18835b53f8cSChandrakanth patil ((softc)->flags & BNXT_FLAG_WOL_CAP )) 18935b53f8cSChandrakanth patil 19035b53f8cSChandrakanth patil /* 64-bit doorbell */ 19135b53f8cSChandrakanth patil #define DBR_INDEX_MASK 0x0000000000ffffffULL 19235b53f8cSChandrakanth patil #define DBR_PI_LO_MASK 0xff000000UL 19335b53f8cSChandrakanth patil #define DBR_PI_LO_SFT 24 19435b53f8cSChandrakanth patil #define DBR_XID_MASK 0x000fffff00000000ULL 19535b53f8cSChandrakanth patil #define DBR_XID_SFT 32 19635b53f8cSChandrakanth patil #define DBR_PI_HI_MASK 0xf0000000000000ULL 19735b53f8cSChandrakanth patil #define DBR_PI_HI_SFT 52 19835b53f8cSChandrakanth patil #define DBR_PATH_L2 (0x1ULL << 56) 19935b53f8cSChandrakanth patil #define DBR_VALID (0x1ULL << 58) 20035b53f8cSChandrakanth patil #define DBR_TYPE_SQ (0x0ULL << 60) 20135b53f8cSChandrakanth patil #define DBR_TYPE_RQ (0x1ULL << 60) 20235b53f8cSChandrakanth patil #define DBR_TYPE_SRQ (0x2ULL << 60) 20335b53f8cSChandrakanth patil #define DBR_TYPE_SRQ_ARM (0x3ULL << 60) 20435b53f8cSChandrakanth patil #define DBR_TYPE_CQ (0x4ULL << 60) 20535b53f8cSChandrakanth patil #define DBR_TYPE_CQ_ARMSE (0x5ULL << 60) 20635b53f8cSChandrakanth patil #define DBR_TYPE_CQ_ARMALL (0x6ULL << 60) 20735b53f8cSChandrakanth patil #define DBR_TYPE_CQ_ARMENA (0x7ULL << 60) 20835b53f8cSChandrakanth patil #define DBR_TYPE_SRQ_ARMENA (0x8ULL << 60) 20935b53f8cSChandrakanth patil #define DBR_TYPE_CQ_CUTOFF_ACK (0x9ULL << 60) 21035b53f8cSChandrakanth patil #define DBR_TYPE_NQ (0xaULL << 60) 21135b53f8cSChandrakanth patil #define DBR_TYPE_NQ_ARM (0xbULL << 60) 21235b53f8cSChandrakanth patil #define DBR_TYPE_PUSH_START (0xcULL << 60) 21335b53f8cSChandrakanth patil #define DBR_TYPE_PUSH_END (0xdULL << 60) 21435b53f8cSChandrakanth patil #define DBR_TYPE_NULL (0xfULL << 60) 21535b53f8cSChandrakanth patil 216050d28e1SChandrakanth patil #define BNXT_MAX_L2_QUEUES 128 217050d28e1SChandrakanth patil #define BNXT_ROCE_IRQ_COUNT 9 218050d28e1SChandrakanth patil 219050d28e1SChandrakanth patil #define BNXT_MAX_NUM_QUEUES (BNXT_MAX_L2_QUEUES + BNXT_ROCE_IRQ_COUNT) 22035b53f8cSChandrakanth patil 22135b53f8cSChandrakanth patil /* Completion related defines */ 22235b53f8cSChandrakanth patil #define CMP_VALID(cmp, v_bit) \ 22335b53f8cSChandrakanth patil ((!!(((struct cmpl_base *)(cmp))->info3_v & htole32(CMPL_BASE_V))) == !!(v_bit) ) 22435b53f8cSChandrakanth patil 22535b53f8cSChandrakanth patil /* Chip class phase 5 */ 226050d28e1SChandrakanth patil #define BNXT_CHIP_P5(sc) ((sc->flags & BNXT_FLAG_CHIP_P5)) 22735b53f8cSChandrakanth patil 22835b53f8cSChandrakanth patil #define DB_PF_OFFSET_P5 0x10000 229050d28e1SChandrakanth patil #define DB_VF_OFFSET_P5 0x4000 23035b53f8cSChandrakanth patil #define NQ_VALID(cmp, v_bit) \ 23135b53f8cSChandrakanth patil ((!!(((nq_cn_t *)(cmp))->v & htole32(NQ_CN_V))) == !!(v_bit) ) 23235b53f8cSChandrakanth patil 23335b53f8cSChandrakanth patil #ifndef DIV_ROUND_UP 23435b53f8cSChandrakanth patil #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) 23535b53f8cSChandrakanth patil #endif 23635b53f8cSChandrakanth patil #ifndef roundup 23735b53f8cSChandrakanth patil #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) 23835b53f8cSChandrakanth patil #endif 23935b53f8cSChandrakanth patil 24035b53f8cSChandrakanth patil #define NEXT_CP_CONS_V(ring, cons, v_bit) do { \ 24135b53f8cSChandrakanth patil if (__predict_false(++(cons) == (ring)->ring_size)) \ 24235b53f8cSChandrakanth patil ((cons) = 0, (v_bit) = !v_bit); \ 24335b53f8cSChandrakanth patil } while (0) 24435b53f8cSChandrakanth patil 24535b53f8cSChandrakanth patil #define RING_NEXT(ring, idx) (__predict_false(idx + 1 == (ring)->ring_size) ? \ 24635b53f8cSChandrakanth patil 0 : idx + 1) 24735b53f8cSChandrakanth patil 24835b53f8cSChandrakanth patil #define CMPL_PREFETCH_NEXT(cpr, idx) \ 24935b53f8cSChandrakanth patil __builtin_prefetch(&((struct cmpl_base *)(cpr)->ring.vaddr)[((idx) +\ 25035b53f8cSChandrakanth patil (CACHE_LINE_SIZE / sizeof(struct cmpl_base))) & \ 25135b53f8cSChandrakanth patil ((cpr)->ring.ring_size - 1)]) 25235b53f8cSChandrakanth patil 25335b53f8cSChandrakanth patil /* Lock macros */ 25435b53f8cSChandrakanth patil #define BNXT_HWRM_LOCK_INIT(_softc, _name) \ 25535b53f8cSChandrakanth patil mtx_init(&(_softc)->hwrm_lock, _name, "BNXT HWRM Lock", MTX_DEF) 25635b53f8cSChandrakanth patil #define BNXT_HWRM_LOCK(_softc) mtx_lock(&(_softc)->hwrm_lock) 25735b53f8cSChandrakanth patil #define BNXT_HWRM_UNLOCK(_softc) mtx_unlock(&(_softc)->hwrm_lock) 25835b53f8cSChandrakanth patil #define BNXT_HWRM_LOCK_DESTROY(_softc) mtx_destroy(&(_softc)->hwrm_lock) 25935b53f8cSChandrakanth patil #define BNXT_HWRM_LOCK_ASSERT(_softc) mtx_assert(&(_softc)->hwrm_lock, \ 26035b53f8cSChandrakanth patil MA_OWNED) 26135b53f8cSChandrakanth patil #define BNXT_IS_FLOW_CTRL_CHANGED(link_info) \ 26235b53f8cSChandrakanth patil ((link_info->last_flow_ctrl.tx != link_info->flow_ctrl.tx) || \ 26335b53f8cSChandrakanth patil (link_info->last_flow_ctrl.rx != link_info->flow_ctrl.rx) || \ 26435b53f8cSChandrakanth patil (link_info->last_flow_ctrl.autoneg != link_info->flow_ctrl.autoneg)) 26535b53f8cSChandrakanth patil 26635b53f8cSChandrakanth patil /* Chip info */ 26735b53f8cSChandrakanth patil #define BNXT_TSO_SIZE UINT16_MAX 26835b53f8cSChandrakanth patil 26935b53f8cSChandrakanth patil #define min_t(type, x, y) ({ \ 27035b53f8cSChandrakanth patil type __min1 = (x); \ 27135b53f8cSChandrakanth patil type __min2 = (y); \ 27235b53f8cSChandrakanth patil __min1 < __min2 ? __min1 : __min2; }) 27335b53f8cSChandrakanth patil 27435b53f8cSChandrakanth patil #define max_t(type, x, y) ({ \ 27535b53f8cSChandrakanth patil type __max1 = (x); \ 27635b53f8cSChandrakanth patil type __max2 = (y); \ 27735b53f8cSChandrakanth patil __max1 > __max2 ? __max1 : __max2; }) 27835b53f8cSChandrakanth patil 27935b53f8cSChandrakanth patil #define clamp_t(type, _x, min, max) min_t(type, max_t(type, _x, min), max) 28035b53f8cSChandrakanth patil 28135b53f8cSChandrakanth patil #define BNXT_IFMEDIA_ADD(supported, fw_speed, ifm_speed) do { \ 28235b53f8cSChandrakanth patil if ((supported) & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_ ## fw_speed) \ 28335b53f8cSChandrakanth patil ifmedia_add(softc->media, IFM_ETHER | (ifm_speed), 0, NULL); \ 28435b53f8cSChandrakanth patil } while(0) 28535b53f8cSChandrakanth patil 28635b53f8cSChandrakanth patil #define BNXT_MIN_FRAME_SIZE 52 /* Frames must be padded to this size for some A0 chips */ 28735b53f8cSChandrakanth patil 288032899b5SChandrakanth patil #define BNXT_RX_STATS_EXT_OFFSET(counter) \ 289032899b5SChandrakanth patil (offsetof(struct rx_port_stats_ext, counter) / 8) 290032899b5SChandrakanth patil 291032899b5SChandrakanth patil #define BNXT_RX_STATS_EXT_NUM_LEGACY \ 292032899b5SChandrakanth patil BNXT_RX_STATS_EXT_OFFSET(rx_fec_corrected_blocks) 293032899b5SChandrakanth patil 294032899b5SChandrakanth patil #define BNXT_TX_STATS_EXT_OFFSET(counter) \ 295032899b5SChandrakanth patil (offsetof(struct tx_port_stats_ext, counter) / 8) 296032899b5SChandrakanth patil 29735b53f8cSChandrakanth patil extern const char bnxt_driver_version[]; 29835b53f8cSChandrakanth patil typedef void (*bnxt_doorbell_tx)(void *, uint16_t idx); 29935b53f8cSChandrakanth patil typedef void (*bnxt_doorbell_rx)(void *, uint16_t idx); 30035b53f8cSChandrakanth patil typedef void (*bnxt_doorbell_rx_cq)(void *, bool); 30135b53f8cSChandrakanth patil typedef void (*bnxt_doorbell_tx_cq)(void *, bool); 30235b53f8cSChandrakanth patil typedef void (*bnxt_doorbell_nq)(void *, bool); 30335b53f8cSChandrakanth patil 30435b53f8cSChandrakanth patil typedef struct bnxt_doorbell_ops { 30535b53f8cSChandrakanth patil bnxt_doorbell_tx bnxt_db_tx; 30635b53f8cSChandrakanth patil bnxt_doorbell_rx bnxt_db_rx; 30735b53f8cSChandrakanth patil bnxt_doorbell_rx_cq bnxt_db_rx_cq; 30835b53f8cSChandrakanth patil bnxt_doorbell_tx_cq bnxt_db_tx_cq; 30935b53f8cSChandrakanth patil bnxt_doorbell_nq bnxt_db_nq; 31035b53f8cSChandrakanth patil } bnxt_dooorbell_ops_t; 31135b53f8cSChandrakanth patil /* NVRAM access */ 31235b53f8cSChandrakanth patil enum bnxt_nvm_directory_type { 31335b53f8cSChandrakanth patil BNX_DIR_TYPE_UNUSED = 0, 31435b53f8cSChandrakanth patil BNX_DIR_TYPE_PKG_LOG = 1, 31535b53f8cSChandrakanth patil BNX_DIR_TYPE_UPDATE = 2, 31635b53f8cSChandrakanth patil BNX_DIR_TYPE_CHIMP_PATCH = 3, 31735b53f8cSChandrakanth patil BNX_DIR_TYPE_BOOTCODE = 4, 31835b53f8cSChandrakanth patil BNX_DIR_TYPE_VPD = 5, 31935b53f8cSChandrakanth patil BNX_DIR_TYPE_EXP_ROM_MBA = 6, 32035b53f8cSChandrakanth patil BNX_DIR_TYPE_AVS = 7, 32135b53f8cSChandrakanth patil BNX_DIR_TYPE_PCIE = 8, 32235b53f8cSChandrakanth patil BNX_DIR_TYPE_PORT_MACRO = 9, 32335b53f8cSChandrakanth patil BNX_DIR_TYPE_APE_FW = 10, 32435b53f8cSChandrakanth patil BNX_DIR_TYPE_APE_PATCH = 11, 32535b53f8cSChandrakanth patil BNX_DIR_TYPE_KONG_FW = 12, 32635b53f8cSChandrakanth patil BNX_DIR_TYPE_KONG_PATCH = 13, 32735b53f8cSChandrakanth patil BNX_DIR_TYPE_BONO_FW = 14, 32835b53f8cSChandrakanth patil BNX_DIR_TYPE_BONO_PATCH = 15, 32935b53f8cSChandrakanth patil BNX_DIR_TYPE_TANG_FW = 16, 33035b53f8cSChandrakanth patil BNX_DIR_TYPE_TANG_PATCH = 17, 33135b53f8cSChandrakanth patil BNX_DIR_TYPE_BOOTCODE_2 = 18, 33235b53f8cSChandrakanth patil BNX_DIR_TYPE_CCM = 19, 33335b53f8cSChandrakanth patil BNX_DIR_TYPE_PCI_CFG = 20, 33435b53f8cSChandrakanth patil BNX_DIR_TYPE_TSCF_UCODE = 21, 33535b53f8cSChandrakanth patil BNX_DIR_TYPE_ISCSI_BOOT = 22, 33635b53f8cSChandrakanth patil BNX_DIR_TYPE_ISCSI_BOOT_IPV6 = 24, 33735b53f8cSChandrakanth patil BNX_DIR_TYPE_ISCSI_BOOT_IPV4N6 = 25, 33835b53f8cSChandrakanth patil BNX_DIR_TYPE_ISCSI_BOOT_CFG6 = 26, 33935b53f8cSChandrakanth patil BNX_DIR_TYPE_EXT_PHY = 27, 34035b53f8cSChandrakanth patil BNX_DIR_TYPE_SHARED_CFG = 40, 34135b53f8cSChandrakanth patil BNX_DIR_TYPE_PORT_CFG = 41, 34235b53f8cSChandrakanth patil BNX_DIR_TYPE_FUNC_CFG = 42, 34335b53f8cSChandrakanth patil BNX_DIR_TYPE_MGMT_CFG = 48, 34435b53f8cSChandrakanth patil BNX_DIR_TYPE_MGMT_DATA = 49, 34535b53f8cSChandrakanth patil BNX_DIR_TYPE_MGMT_WEB_DATA = 50, 34635b53f8cSChandrakanth patil BNX_DIR_TYPE_MGMT_WEB_META = 51, 34735b53f8cSChandrakanth patil BNX_DIR_TYPE_MGMT_EVENT_LOG = 52, 34835b53f8cSChandrakanth patil BNX_DIR_TYPE_MGMT_AUDIT_LOG = 53 34935b53f8cSChandrakanth patil }; 35035b53f8cSChandrakanth patil 35135b53f8cSChandrakanth patil enum bnxnvm_pkglog_field_index { 35235b53f8cSChandrakanth patil BNX_PKG_LOG_FIELD_IDX_INSTALLED_TIMESTAMP = 0, 35335b53f8cSChandrakanth patil BNX_PKG_LOG_FIELD_IDX_PKG_DESCRIPTION = 1, 35435b53f8cSChandrakanth patil BNX_PKG_LOG_FIELD_IDX_PKG_VERSION = 2, 35535b53f8cSChandrakanth patil BNX_PKG_LOG_FIELD_IDX_PKG_TIMESTAMP = 3, 35635b53f8cSChandrakanth patil BNX_PKG_LOG_FIELD_IDX_PKG_CHECKSUM = 4, 35735b53f8cSChandrakanth patil BNX_PKG_LOG_FIELD_IDX_INSTALLED_ITEMS = 5, 35835b53f8cSChandrakanth patil BNX_PKG_LOG_FIELD_IDX_INSTALLED_MASK = 6 35935b53f8cSChandrakanth patil }; 36035b53f8cSChandrakanth patil 36135b53f8cSChandrakanth patil #define BNX_DIR_ORDINAL_FIRST 0 36235b53f8cSChandrakanth patil #define BNX_DIR_EXT_NONE 0 36335b53f8cSChandrakanth patil 36435b53f8cSChandrakanth patil struct bnxt_bar_info { 36535b53f8cSChandrakanth patil struct resource *res; 36635b53f8cSChandrakanth patil bus_space_tag_t tag; 36735b53f8cSChandrakanth patil bus_space_handle_t handle; 36835b53f8cSChandrakanth patil bus_size_t size; 36935b53f8cSChandrakanth patil int rid; 37035b53f8cSChandrakanth patil }; 37135b53f8cSChandrakanth patil 37235b53f8cSChandrakanth patil struct bnxt_flow_ctrl { 37335b53f8cSChandrakanth patil bool rx; 37435b53f8cSChandrakanth patil bool tx; 37535b53f8cSChandrakanth patil bool autoneg; 37635b53f8cSChandrakanth patil }; 37735b53f8cSChandrakanth patil 37835b53f8cSChandrakanth patil struct bnxt_link_info { 37935b53f8cSChandrakanth patil uint8_t media_type; 38035b53f8cSChandrakanth patil uint8_t transceiver; 38135b53f8cSChandrakanth patil uint8_t phy_addr; 38235b53f8cSChandrakanth patil uint8_t phy_link_status; 38335b53f8cSChandrakanth patil uint8_t wire_speed; 38435b53f8cSChandrakanth patil uint8_t loop_back; 38535b53f8cSChandrakanth patil uint8_t link_up; 38635b53f8cSChandrakanth patil uint8_t last_link_up; 38735b53f8cSChandrakanth patil uint8_t duplex; 38835b53f8cSChandrakanth patil uint8_t last_duplex; 38935b53f8cSChandrakanth patil uint8_t last_phy_type; 39035b53f8cSChandrakanth patil struct bnxt_flow_ctrl flow_ctrl; 39135b53f8cSChandrakanth patil struct bnxt_flow_ctrl last_flow_ctrl; 39235b53f8cSChandrakanth patil uint8_t duplex_setting; 39335b53f8cSChandrakanth patil uint8_t auto_mode; 39435b53f8cSChandrakanth patil #define PHY_VER_LEN 3 39535b53f8cSChandrakanth patil uint8_t phy_ver[PHY_VER_LEN]; 39635b53f8cSChandrakanth patil uint8_t phy_type; 39735b53f8cSChandrakanth patil #define BNXT_PHY_STATE_ENABLED 0 39835b53f8cSChandrakanth patil #define BNXT_PHY_STATE_DISABLED 1 39935b53f8cSChandrakanth patil uint8_t phy_state; 40035b53f8cSChandrakanth patil 40135b53f8cSChandrakanth patil uint16_t link_speed; 40235b53f8cSChandrakanth patil uint16_t support_speeds; 40335b53f8cSChandrakanth patil uint16_t support_pam4_speeds; 40435b53f8cSChandrakanth patil uint16_t auto_link_speeds; 40535b53f8cSChandrakanth patil uint16_t auto_pam4_link_speeds; 40635b53f8cSChandrakanth patil uint16_t force_link_speed; 40735b53f8cSChandrakanth patil uint16_t force_pam4_link_speed; 40835b53f8cSChandrakanth patil bool force_pam4_speed_set_by_user; 40935b53f8cSChandrakanth patil 41035b53f8cSChandrakanth patil uint16_t advertising; 41135b53f8cSChandrakanth patil uint16_t advertising_pam4; 41235b53f8cSChandrakanth patil 41335b53f8cSChandrakanth patil uint32_t preemphasis; 41435b53f8cSChandrakanth patil uint16_t support_auto_speeds; 41535b53f8cSChandrakanth patil uint16_t support_force_speeds; 41635b53f8cSChandrakanth patil uint16_t support_pam4_auto_speeds; 41735b53f8cSChandrakanth patil uint16_t support_pam4_force_speeds; 41835b53f8cSChandrakanth patil #define BNXT_SIG_MODE_NRZ HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_NRZ 41935b53f8cSChandrakanth patil #define BNXT_SIG_MODE_PAM4 HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_PAM4 42035b53f8cSChandrakanth patil uint8_t req_signal_mode; 42135b53f8cSChandrakanth patil 42235b53f8cSChandrakanth patil uint8_t active_fec_sig_mode; 42335b53f8cSChandrakanth patil uint8_t sig_mode; 42435b53f8cSChandrakanth patil 42535b53f8cSChandrakanth patil /* copy of requested setting */ 42635b53f8cSChandrakanth patil uint8_t autoneg; 42735b53f8cSChandrakanth patil #define BNXT_AUTONEG_SPEED 1 42835b53f8cSChandrakanth patil #define BNXT_AUTONEG_FLOW_CTRL 2 42935b53f8cSChandrakanth patil uint8_t req_duplex; 43035b53f8cSChandrakanth patil uint16_t req_link_speed; 43135b53f8cSChandrakanth patil uint8_t module_status; 43235b53f8cSChandrakanth patil struct hwrm_port_phy_qcfg_output phy_qcfg_resp; 43335b53f8cSChandrakanth patil }; 43435b53f8cSChandrakanth patil 43535b53f8cSChandrakanth patil enum bnxt_phy_type { 43635b53f8cSChandrakanth patil BNXT_MEDIA_CR = 0, 43735b53f8cSChandrakanth patil BNXT_MEDIA_LR, 43835b53f8cSChandrakanth patil BNXT_MEDIA_SR, 43935b53f8cSChandrakanth patil BNXT_MEDIA_KR, 44035b53f8cSChandrakanth patil BNXT_MEDIA_END 44135b53f8cSChandrakanth patil }; 44235b53f8cSChandrakanth patil 44335b53f8cSChandrakanth patil enum bnxt_cp_type { 44435b53f8cSChandrakanth patil BNXT_DEFAULT, 44535b53f8cSChandrakanth patil BNXT_TX, 44635b53f8cSChandrakanth patil BNXT_RX, 44735b53f8cSChandrakanth patil BNXT_SHARED 44835b53f8cSChandrakanth patil }; 44935b53f8cSChandrakanth patil 45035b53f8cSChandrakanth patil struct bnxt_queue_info { 45135b53f8cSChandrakanth patil uint8_t queue_id; 45235b53f8cSChandrakanth patil uint8_t queue_profile; 45335b53f8cSChandrakanth patil }; 45435b53f8cSChandrakanth patil 45535b53f8cSChandrakanth patil struct bnxt_func_info { 45635b53f8cSChandrakanth patil uint32_t fw_fid; 45735b53f8cSChandrakanth patil uint8_t mac_addr[ETHER_ADDR_LEN]; 45835b53f8cSChandrakanth patil uint16_t max_rsscos_ctxs; 45935b53f8cSChandrakanth patil uint16_t max_cp_rings; 46035b53f8cSChandrakanth patil uint16_t max_tx_rings; 46135b53f8cSChandrakanth patil uint16_t max_rx_rings; 46235b53f8cSChandrakanth patil uint16_t max_hw_ring_grps; 46335b53f8cSChandrakanth patil uint16_t max_irqs; 46435b53f8cSChandrakanth patil uint16_t max_l2_ctxs; 46535b53f8cSChandrakanth patil uint16_t max_vnics; 46635b53f8cSChandrakanth patil uint16_t max_stat_ctxs; 46735b53f8cSChandrakanth patil }; 46835b53f8cSChandrakanth patil 46935b53f8cSChandrakanth patil struct bnxt_pf_info { 47035b53f8cSChandrakanth patil #define BNXT_FIRST_PF_FID 1 47135b53f8cSChandrakanth patil #define BNXT_FIRST_VF_FID 128 47235b53f8cSChandrakanth patil uint8_t port_id; 47335b53f8cSChandrakanth patil uint32_t first_vf_id; 47435b53f8cSChandrakanth patil uint16_t active_vfs; 47535b53f8cSChandrakanth patil uint16_t max_vfs; 47635b53f8cSChandrakanth patil uint32_t max_encap_records; 47735b53f8cSChandrakanth patil uint32_t max_decap_records; 47835b53f8cSChandrakanth patil uint32_t max_tx_em_flows; 47935b53f8cSChandrakanth patil uint32_t max_tx_wm_flows; 48035b53f8cSChandrakanth patil uint32_t max_rx_em_flows; 48135b53f8cSChandrakanth patil uint32_t max_rx_wm_flows; 48235b53f8cSChandrakanth patil unsigned long *vf_event_bmap; 48335b53f8cSChandrakanth patil uint16_t hwrm_cmd_req_pages; 48435b53f8cSChandrakanth patil void *hwrm_cmd_req_addr[4]; 48535b53f8cSChandrakanth patil bus_addr_t hwrm_cmd_req_dma_addr[4]; 48635b53f8cSChandrakanth patil }; 48735b53f8cSChandrakanth patil 48835b53f8cSChandrakanth patil struct bnxt_vf_info { 48935b53f8cSChandrakanth patil uint16_t fw_fid; 49035b53f8cSChandrakanth patil uint8_t mac_addr[ETHER_ADDR_LEN]; 49135b53f8cSChandrakanth patil uint16_t max_rsscos_ctxs; 49235b53f8cSChandrakanth patil uint16_t max_cp_rings; 49335b53f8cSChandrakanth patil uint16_t max_tx_rings; 49435b53f8cSChandrakanth patil uint16_t max_rx_rings; 49535b53f8cSChandrakanth patil uint16_t max_hw_ring_grps; 49635b53f8cSChandrakanth patil uint16_t max_l2_ctxs; 49735b53f8cSChandrakanth patil uint16_t max_irqs; 49835b53f8cSChandrakanth patil uint16_t max_vnics; 49935b53f8cSChandrakanth patil uint16_t max_stat_ctxs; 50035b53f8cSChandrakanth patil uint32_t vlan; 50135b53f8cSChandrakanth patil #define BNXT_VF_QOS 0x1 50235b53f8cSChandrakanth patil #define BNXT_VF_SPOOFCHK 0x2 50335b53f8cSChandrakanth patil #define BNXT_VF_LINK_FORCED 0x4 50435b53f8cSChandrakanth patil #define BNXT_VF_LINK_UP 0x8 50535b53f8cSChandrakanth patil uint32_t flags; 50635b53f8cSChandrakanth patil uint32_t func_flags; /* func cfg flags */ 50735b53f8cSChandrakanth patil uint32_t min_tx_rate; 50835b53f8cSChandrakanth patil uint32_t max_tx_rate; 50935b53f8cSChandrakanth patil void *hwrm_cmd_req_addr; 51035b53f8cSChandrakanth patil bus_addr_t hwrm_cmd_req_dma_addr; 51135b53f8cSChandrakanth patil }; 51235b53f8cSChandrakanth patil 51335b53f8cSChandrakanth patil #define BNXT_PF(softc) (!((softc)->flags & BNXT_FLAG_VF)) 51435b53f8cSChandrakanth patil #define BNXT_VF(softc) ((softc)->flags & BNXT_FLAG_VF) 51535b53f8cSChandrakanth patil 51635b53f8cSChandrakanth patil struct bnxt_vlan_tag { 51735b53f8cSChandrakanth patil SLIST_ENTRY(bnxt_vlan_tag) next; 51835b53f8cSChandrakanth patil uint64_t filter_id; 51935b53f8cSChandrakanth patil uint16_t tag; 52035b53f8cSChandrakanth patil }; 52135b53f8cSChandrakanth patil 52235b53f8cSChandrakanth patil struct bnxt_vnic_info { 52335b53f8cSChandrakanth patil uint16_t id; 52435b53f8cSChandrakanth patil uint16_t def_ring_grp; 52535b53f8cSChandrakanth patil uint16_t cos_rule; 52635b53f8cSChandrakanth patil uint16_t lb_rule; 52735b53f8cSChandrakanth patil uint16_t mru; 52835b53f8cSChandrakanth patil 52935b53f8cSChandrakanth patil uint32_t rx_mask; 53035b53f8cSChandrakanth patil struct iflib_dma_info mc_list; 53135b53f8cSChandrakanth patil int mc_list_count; 53235b53f8cSChandrakanth patil #define BNXT_MAX_MC_ADDRS 16 53335b53f8cSChandrakanth patil 53435b53f8cSChandrakanth patil uint32_t flags; 53535b53f8cSChandrakanth patil #define BNXT_VNIC_FLAG_DEFAULT 0x01 53635b53f8cSChandrakanth patil #define BNXT_VNIC_FLAG_BD_STALL 0x02 53735b53f8cSChandrakanth patil #define BNXT_VNIC_FLAG_VLAN_STRIP 0x04 53835b53f8cSChandrakanth patil 53935b53f8cSChandrakanth patil uint64_t filter_id; 54035b53f8cSChandrakanth patil 54135b53f8cSChandrakanth patil uint16_t rss_id; 54235b53f8cSChandrakanth patil uint32_t rss_hash_type; 54335b53f8cSChandrakanth patil uint8_t rss_hash_key[HW_HASH_KEY_SIZE]; 54435b53f8cSChandrakanth patil struct iflib_dma_info rss_hash_key_tbl; 54535b53f8cSChandrakanth patil struct iflib_dma_info rss_grp_tbl; 54635b53f8cSChandrakanth patil SLIST_HEAD(vlan_head, bnxt_vlan_tag) vlan_tags; 54735b53f8cSChandrakanth patil struct iflib_dma_info vlan_tag_list; 54835b53f8cSChandrakanth patil }; 54935b53f8cSChandrakanth patil 55035b53f8cSChandrakanth patil struct bnxt_grp_info { 55135b53f8cSChandrakanth patil uint16_t stats_ctx; 55235b53f8cSChandrakanth patil uint16_t grp_id; 55335b53f8cSChandrakanth patil uint16_t rx_ring_id; 55435b53f8cSChandrakanth patil uint16_t cp_ring_id; 55535b53f8cSChandrakanth patil uint16_t ag_ring_id; 55635b53f8cSChandrakanth patil }; 55735b53f8cSChandrakanth patil 55835b53f8cSChandrakanth patil struct bnxt_ring { 55935b53f8cSChandrakanth patil uint64_t paddr; 56035b53f8cSChandrakanth patil vm_offset_t doorbell; 56135b53f8cSChandrakanth patil caddr_t vaddr; 56235b53f8cSChandrakanth patil struct bnxt_softc *softc; 56335b53f8cSChandrakanth patil uint32_t ring_size; /* Must be a power of two */ 56435b53f8cSChandrakanth patil uint16_t id; /* Logical ID */ 56535b53f8cSChandrakanth patil uint16_t phys_id; 56635b53f8cSChandrakanth patil uint16_t idx; 56735b53f8cSChandrakanth patil struct bnxt_full_tpa_start *tpa_start; 56835b53f8cSChandrakanth patil }; 56935b53f8cSChandrakanth patil 57035b53f8cSChandrakanth patil struct bnxt_cp_ring { 57135b53f8cSChandrakanth patil struct bnxt_ring ring; 57235b53f8cSChandrakanth patil struct if_irq irq; 57335b53f8cSChandrakanth patil uint32_t cons; 57435b53f8cSChandrakanth patil bool v_bit; /* Value of valid bit */ 57535b53f8cSChandrakanth patil struct ctx_hw_stats *stats; 57635b53f8cSChandrakanth patil uint32_t stats_ctx_id; 57735b53f8cSChandrakanth patil uint32_t last_idx; /* Used by RX rings only 57835b53f8cSChandrakanth patil * set to the last read pidx 57935b53f8cSChandrakanth patil */ 58035b53f8cSChandrakanth patil uint64_t int_count; 58135b53f8cSChandrakanth patil }; 58235b53f8cSChandrakanth patil 58335b53f8cSChandrakanth patil struct bnxt_full_tpa_start { 58435b53f8cSChandrakanth patil struct rx_tpa_start_cmpl low; 58535b53f8cSChandrakanth patil struct rx_tpa_start_cmpl_hi high; 58635b53f8cSChandrakanth patil }; 58735b53f8cSChandrakanth patil 58835b53f8cSChandrakanth patil /* All the version information for the part */ 58935b53f8cSChandrakanth patil #define BNXT_VERSTR_SIZE (3*3+2+1) /* ie: "255.255.255\0" */ 59035b53f8cSChandrakanth patil #define BNXT_NAME_SIZE 17 59135b53f8cSChandrakanth patil #define FW_VER_STR_LEN 32 59235b53f8cSChandrakanth patil #define BC_HWRM_STR_LEN 21 59335b53f8cSChandrakanth patil struct bnxt_ver_info { 59435b53f8cSChandrakanth patil uint8_t hwrm_if_major; 59535b53f8cSChandrakanth patil uint8_t hwrm_if_minor; 59635b53f8cSChandrakanth patil uint8_t hwrm_if_update; 59735b53f8cSChandrakanth patil char hwrm_if_ver[BNXT_VERSTR_SIZE]; 59835b53f8cSChandrakanth patil char driver_hwrm_if_ver[BNXT_VERSTR_SIZE]; 599050d28e1SChandrakanth patil char mgmt_fw_ver[FW_VER_STR_LEN]; 600050d28e1SChandrakanth patil char netctrl_fw_ver[FW_VER_STR_LEN]; 601050d28e1SChandrakanth patil char roce_fw_ver[FW_VER_STR_LEN]; 60235b53f8cSChandrakanth patil char fw_ver_str[FW_VER_STR_LEN]; 60335b53f8cSChandrakanth patil char phy_ver[BNXT_VERSTR_SIZE]; 60435b53f8cSChandrakanth patil char pkg_ver[64]; 60535b53f8cSChandrakanth patil 60635b53f8cSChandrakanth patil char hwrm_fw_name[BNXT_NAME_SIZE]; 60735b53f8cSChandrakanth patil char mgmt_fw_name[BNXT_NAME_SIZE]; 60835b53f8cSChandrakanth patil char netctrl_fw_name[BNXT_NAME_SIZE]; 60935b53f8cSChandrakanth patil char roce_fw_name[BNXT_NAME_SIZE]; 61035b53f8cSChandrakanth patil char phy_vendor[BNXT_NAME_SIZE]; 61135b53f8cSChandrakanth patil char phy_partnumber[BNXT_NAME_SIZE]; 61235b53f8cSChandrakanth patil 61335b53f8cSChandrakanth patil uint16_t chip_num; 61435b53f8cSChandrakanth patil uint8_t chip_rev; 61535b53f8cSChandrakanth patil uint8_t chip_metal; 61635b53f8cSChandrakanth patil uint8_t chip_bond_id; 61735b53f8cSChandrakanth patil uint8_t chip_type; 61835b53f8cSChandrakanth patil 61935b53f8cSChandrakanth patil uint8_t hwrm_min_major; 62035b53f8cSChandrakanth patil uint8_t hwrm_min_minor; 62135b53f8cSChandrakanth patil uint8_t hwrm_min_update; 62235b53f8cSChandrakanth patil uint64_t fw_ver_code; 62335b53f8cSChandrakanth patil #define BNXT_FW_VER_CODE(maj, min, bld, rsv) \ 62435b53f8cSChandrakanth patil ((uint64_t)(maj) << 48 | (uint64_t)(min) << 32 | (uint64_t)(bld) << 16 | (rsv)) 62535b53f8cSChandrakanth patil #define BNXT_FW_MAJ(softc) ((softc)->ver_info->fw_ver_code >> 48) 62635b53f8cSChandrakanth patil #define BNXT_FW_MIN(softc) (((softc)->ver_info->fw_ver_code >> 32) & 0xffff) 62735b53f8cSChandrakanth patil #define BNXT_FW_BLD(softc) (((softc)->ver_info->fw_ver_code >> 16) & 0xffff) 62835b53f8cSChandrakanth patil #define BNXT_FW_RSV(softc) (((softc)->ver_info->fw_ver_code) & 0xffff) 62935b53f8cSChandrakanth patil 63035b53f8cSChandrakanth patil struct sysctl_ctx_list ver_ctx; 63135b53f8cSChandrakanth patil struct sysctl_oid *ver_oid; 63235b53f8cSChandrakanth patil }; 63335b53f8cSChandrakanth patil 63435b53f8cSChandrakanth patil struct bnxt_nvram_info { 63535b53f8cSChandrakanth patil uint16_t mfg_id; 63635b53f8cSChandrakanth patil uint16_t device_id; 63735b53f8cSChandrakanth patil uint32_t sector_size; 63835b53f8cSChandrakanth patil uint32_t size; 63935b53f8cSChandrakanth patil uint32_t reserved_size; 64035b53f8cSChandrakanth patil uint32_t available_size; 64135b53f8cSChandrakanth patil 64235b53f8cSChandrakanth patil struct sysctl_ctx_list nvm_ctx; 64335b53f8cSChandrakanth patil struct sysctl_oid *nvm_oid; 64435b53f8cSChandrakanth patil }; 64535b53f8cSChandrakanth patil 64635b53f8cSChandrakanth patil struct bnxt_func_qcfg { 64735b53f8cSChandrakanth patil uint16_t alloc_completion_rings; 64835b53f8cSChandrakanth patil uint16_t alloc_tx_rings; 64935b53f8cSChandrakanth patil uint16_t alloc_rx_rings; 65035b53f8cSChandrakanth patil uint16_t alloc_vnics; 65135b53f8cSChandrakanth patil }; 65235b53f8cSChandrakanth patil 65335b53f8cSChandrakanth patil struct bnxt_hw_lro { 65435b53f8cSChandrakanth patil uint16_t enable; 65535b53f8cSChandrakanth patil uint16_t is_mode_gro; 65635b53f8cSChandrakanth patil uint16_t max_agg_segs; 65735b53f8cSChandrakanth patil uint16_t max_aggs; 65835b53f8cSChandrakanth patil uint32_t min_agg_len; 65935b53f8cSChandrakanth patil }; 66035b53f8cSChandrakanth patil 66135b53f8cSChandrakanth patil /* The hardware supports certain page sizes. Use the supported page sizes 66235b53f8cSChandrakanth patil * to allocate the rings. 66335b53f8cSChandrakanth patil */ 66435b53f8cSChandrakanth patil #if (PAGE_SHIFT < 12) 66535b53f8cSChandrakanth patil #define BNXT_PAGE_SHIFT 12 66635b53f8cSChandrakanth patil #elif (PAGE_SHIFT <= 13) 66735b53f8cSChandrakanth patil #define BNXT_PAGE_SHIFT PAGE_SHIFT 66835b53f8cSChandrakanth patil #elif (PAGE_SHIFT < 16) 66935b53f8cSChandrakanth patil #define BNXT_PAGE_SHIFT 13 67035b53f8cSChandrakanth patil #else 67135b53f8cSChandrakanth patil #define BNXT_PAGE_SHIFT 16 67235b53f8cSChandrakanth patil #endif 67335b53f8cSChandrakanth patil 67435b53f8cSChandrakanth patil #define BNXT_PAGE_SIZE (1 << BNXT_PAGE_SHIFT) 67535b53f8cSChandrakanth patil 67635b53f8cSChandrakanth patil #define MAX_CTX_PAGES (BNXT_PAGE_SIZE / 8) 67735b53f8cSChandrakanth patil #define MAX_CTX_TOTAL_PAGES (MAX_CTX_PAGES * MAX_CTX_PAGES) 678050d28e1SChandrakanth patil 67935b53f8cSChandrakanth patil struct bnxt_ring_mem_info { 68035b53f8cSChandrakanth patil int nr_pages; 68135b53f8cSChandrakanth patil int page_size; 68235b53f8cSChandrakanth patil uint16_t flags; 68335b53f8cSChandrakanth patil #define BNXT_RMEM_VALID_PTE_FLAG 1 68435b53f8cSChandrakanth patil #define BNXT_RMEM_RING_PTE_FLAG 2 68535b53f8cSChandrakanth patil #define BNXT_RMEM_USE_FULL_PAGE_FLAG 4 68635b53f8cSChandrakanth patil uint16_t depth; 687050d28e1SChandrakanth patil struct bnxt_ctx_mem_type *ctx_mem; 688050d28e1SChandrakanth patil 68935b53f8cSChandrakanth patil struct iflib_dma_info *pg_arr; 69035b53f8cSChandrakanth patil struct iflib_dma_info pg_tbl; 691050d28e1SChandrakanth patil 69235b53f8cSChandrakanth patil int vmem_size; 69335b53f8cSChandrakanth patil void **vmem; 69435b53f8cSChandrakanth patil }; 69535b53f8cSChandrakanth patil 69635b53f8cSChandrakanth patil struct bnxt_ctx_pg_info { 69735b53f8cSChandrakanth patil uint32_t entries; 69835b53f8cSChandrakanth patil uint32_t nr_pages; 69935b53f8cSChandrakanth patil struct iflib_dma_info ctx_arr[MAX_CTX_PAGES]; 70035b53f8cSChandrakanth patil struct bnxt_ring_mem_info ring_mem; 70135b53f8cSChandrakanth patil struct bnxt_ctx_pg_info **ctx_pg_tbl; 70235b53f8cSChandrakanth patil }; 70335b53f8cSChandrakanth patil 704050d28e1SChandrakanth patil #define BNXT_MAX_TQM_SP_RINGS 1 705050d28e1SChandrakanth patil #define BNXT_MAX_TQM_FP_LEGACY_RINGS 8 706050d28e1SChandrakanth patil #define BNXT_MAX_TQM_FP_RINGS 9 707050d28e1SChandrakanth patil #define BNXT_MAX_TQM_LEGACY_RINGS \ 708050d28e1SChandrakanth patil (BNXT_MAX_TQM_SP_RINGS + BNXT_MAX_TQM_FP_LEGACY_RINGS) 709050d28e1SChandrakanth patil #define BNXT_MAX_TQM_RINGS \ 710050d28e1SChandrakanth patil (BNXT_MAX_TQM_SP_RINGS + BNXT_MAX_TQM_FP_RINGS) 711050d28e1SChandrakanth patil 712050d28e1SChandrakanth patil #define BNXT_BACKING_STORE_CFG_LEGACY_LEN 256 713050d28e1SChandrakanth patil #define BNXT_BACKING_STORE_CFG_LEN \ 714050d28e1SChandrakanth patil sizeof(struct hwrm_func_backing_store_cfg_input) 715050d28e1SChandrakanth patil 716050d28e1SChandrakanth patil #define BNXT_SET_CTX_PAGE_ATTR(attr) \ 717050d28e1SChandrakanth patil do { \ 718050d28e1SChandrakanth patil if (BNXT_PAGE_SIZE == 0x2000) \ 719050d28e1SChandrakanth patil attr = HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_SRQ_PG_SIZE_PG_8K; \ 720050d28e1SChandrakanth patil else if (BNXT_PAGE_SIZE == 0x10000) \ 721050d28e1SChandrakanth patil attr = HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_QPC_PG_SIZE_PG_64K; \ 722050d28e1SChandrakanth patil else \ 723050d28e1SChandrakanth patil attr = HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_QPC_PG_SIZE_PG_4K; \ 724050d28e1SChandrakanth patil } while (0) 725050d28e1SChandrakanth patil 726050d28e1SChandrakanth patil struct bnxt_ctx_mem_type { 727050d28e1SChandrakanth patil u16 type; 728050d28e1SChandrakanth patil u16 entry_size; 729050d28e1SChandrakanth patil u32 flags; 730050d28e1SChandrakanth patil #define BNXT_CTX_MEM_TYPE_VALID HWRM_FUNC_BACKING_STORE_QCAPS_V2_OUTPUT_FLAGS_TYPE_VALID 731050d28e1SChandrakanth patil u32 instance_bmap; 732050d28e1SChandrakanth patil u8 init_value; 733050d28e1SChandrakanth patil u8 entry_multiple; 734050d28e1SChandrakanth patil u16 init_offset; 735050d28e1SChandrakanth patil #define BNXT_CTX_INIT_INVALID_OFFSET 0xffff 736050d28e1SChandrakanth patil u32 max_entries; 737050d28e1SChandrakanth patil u32 min_entries; 738050d28e1SChandrakanth patil u8 split_entry_cnt; 739050d28e1SChandrakanth patil #define BNXT_MAX_SPLIT_ENTRY 4 740050d28e1SChandrakanth patil union { 741050d28e1SChandrakanth patil struct { 742050d28e1SChandrakanth patil u32 qp_l2_entries; 743050d28e1SChandrakanth patil u32 qp_qp1_entries; 744050d28e1SChandrakanth patil }; 745050d28e1SChandrakanth patil u32 srq_l2_entries; 746050d28e1SChandrakanth patil u32 cq_l2_entries; 747050d28e1SChandrakanth patil u32 vnic_entries; 748050d28e1SChandrakanth patil struct { 749050d28e1SChandrakanth patil u32 mrav_av_entries; 750050d28e1SChandrakanth patil u32 mrav_num_entries_units; 751050d28e1SChandrakanth patil }; 752050d28e1SChandrakanth patil u32 split[BNXT_MAX_SPLIT_ENTRY]; 753050d28e1SChandrakanth patil }; 754050d28e1SChandrakanth patil struct bnxt_ctx_pg_info *pg_info; 755050d28e1SChandrakanth patil }; 756050d28e1SChandrakanth patil 757050d28e1SChandrakanth patil #define BNXT_CTX_QP HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_QP 758050d28e1SChandrakanth patil #define BNXT_CTX_SRQ HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_SRQ 759050d28e1SChandrakanth patil #define BNXT_CTX_CQ HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_CQ 760050d28e1SChandrakanth patil #define BNXT_CTX_VNIC HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_VNIC 761050d28e1SChandrakanth patil #define BNXT_CTX_STAT HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_STAT 762050d28e1SChandrakanth patil #define BNXT_CTX_STQM HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_SP_TQM_RING 763050d28e1SChandrakanth patil #define BNXT_CTX_FTQM HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_FP_TQM_RING 764050d28e1SChandrakanth patil #define BNXT_CTX_MRAV HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_MRAV 765050d28e1SChandrakanth patil #define BNXT_CTX_TIM HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_TIM 766050d28e1SChandrakanth patil #define BNXT_CTX_TKC HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_TKC 767050d28e1SChandrakanth patil #define BNXT_CTX_RKC HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_RKC 768050d28e1SChandrakanth patil #define BNXT_CTX_MTQM HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_MP_TQM_RING 769050d28e1SChandrakanth patil #define BNXT_CTX_SQDBS HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_SQ_DB_SHADOW 770050d28e1SChandrakanth patil #define BNXT_CTX_RQDBS HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_RQ_DB_SHADOW 771050d28e1SChandrakanth patil #define BNXT_CTX_SRQDBS HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_SRQ_DB_SHADOW 772050d28e1SChandrakanth patil #define BNXT_CTX_CQDBS HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_CQ_DB_SHADOW 773050d28e1SChandrakanth patil #define BNXT_CTX_QTKC HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_QUIC_TKC 774050d28e1SChandrakanth patil #define BNXT_CTX_QRKC HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_QUIC_RKC 7753d8bbe00SChandrakanth patil #define BNXT_CTX_MAX (BNXT_CTX_TIM + 1) 776050d28e1SChandrakanth patil 77735b53f8cSChandrakanth patil struct bnxt_ctx_mem_info { 778050d28e1SChandrakanth patil u8 tqm_fp_rings_count; 77935b53f8cSChandrakanth patil 780050d28e1SChandrakanth patil u32 flags; 78135b53f8cSChandrakanth patil #define BNXT_CTX_FLAG_INITED 0x01 782050d28e1SChandrakanth patil struct bnxt_ctx_mem_type ctx_arr[BNXT_CTX_MAX]; 78335b53f8cSChandrakanth patil }; 78435b53f8cSChandrakanth patil 78535b53f8cSChandrakanth patil struct bnxt_hw_resc { 78635b53f8cSChandrakanth patil uint16_t min_rsscos_ctxs; 78735b53f8cSChandrakanth patil uint16_t max_rsscos_ctxs; 78835b53f8cSChandrakanth patil uint16_t min_cp_rings; 78935b53f8cSChandrakanth patil uint16_t max_cp_rings; 79035b53f8cSChandrakanth patil uint16_t resv_cp_rings; 79135b53f8cSChandrakanth patil uint16_t min_tx_rings; 79235b53f8cSChandrakanth patil uint16_t max_tx_rings; 79335b53f8cSChandrakanth patil uint16_t resv_tx_rings; 79435b53f8cSChandrakanth patil uint16_t max_tx_sch_inputs; 79535b53f8cSChandrakanth patil uint16_t min_rx_rings; 79635b53f8cSChandrakanth patil uint16_t max_rx_rings; 79735b53f8cSChandrakanth patil uint16_t resv_rx_rings; 79835b53f8cSChandrakanth patil uint16_t min_hw_ring_grps; 79935b53f8cSChandrakanth patil uint16_t max_hw_ring_grps; 80035b53f8cSChandrakanth patil uint16_t resv_hw_ring_grps; 80135b53f8cSChandrakanth patil uint16_t min_l2_ctxs; 80235b53f8cSChandrakanth patil uint16_t max_l2_ctxs; 80335b53f8cSChandrakanth patil uint16_t min_vnics; 80435b53f8cSChandrakanth patil uint16_t max_vnics; 80535b53f8cSChandrakanth patil uint16_t resv_vnics; 80635b53f8cSChandrakanth patil uint16_t min_stat_ctxs; 80735b53f8cSChandrakanth patil uint16_t max_stat_ctxs; 80835b53f8cSChandrakanth patil uint16_t resv_stat_ctxs; 80935b53f8cSChandrakanth patil uint16_t max_nqs; 81035b53f8cSChandrakanth patil uint16_t max_irqs; 81135b53f8cSChandrakanth patil uint16_t resv_irqs; 812050d28e1SChandrakanth patil }; 81335b53f8cSChandrakanth patil 81435b53f8cSChandrakanth patil enum bnxt_type_ets { 81535b53f8cSChandrakanth patil BNXT_TYPE_ETS_TSA = 0, 81635b53f8cSChandrakanth patil BNXT_TYPE_ETS_PRI2TC, 81735b53f8cSChandrakanth patil BNXT_TYPE_ETS_TCBW, 81835b53f8cSChandrakanth patil BNXT_TYPE_ETS_MAX 81935b53f8cSChandrakanth patil }; 82035b53f8cSChandrakanth patil 82135b53f8cSChandrakanth patil static const char *const BNXT_ETS_TYPE_STR[] = { 82235b53f8cSChandrakanth patil "tsa", 82335b53f8cSChandrakanth patil "pri2tc", 82435b53f8cSChandrakanth patil "tcbw", 82535b53f8cSChandrakanth patil }; 82635b53f8cSChandrakanth patil 82735b53f8cSChandrakanth patil static const char *const BNXT_ETS_HELP_STR[] = { 82835b53f8cSChandrakanth patil "X is 1 (strict), 0 (ets)", 82935b53f8cSChandrakanth patil "TC values for pri 0 to 7", 83035b53f8cSChandrakanth patil "TC BW values for pri 0 to 7, Sum should be 100", 83135b53f8cSChandrakanth patil }; 83235b53f8cSChandrakanth patil 83335b53f8cSChandrakanth patil #define BNXT_HWRM_MAX_REQ_LEN (softc->hwrm_max_req_len) 83435b53f8cSChandrakanth patil 83535b53f8cSChandrakanth patil struct bnxt_softc_list { 83635b53f8cSChandrakanth patil SLIST_ENTRY(bnxt_softc_list) next; 83735b53f8cSChandrakanth patil struct bnxt_softc *softc; 83835b53f8cSChandrakanth patil }; 83935b53f8cSChandrakanth patil 84035b53f8cSChandrakanth patil #ifndef BIT_ULL 84135b53f8cSChandrakanth patil #define BIT_ULL(nr) (1ULL << (nr)) 84235b53f8cSChandrakanth patil #endif 84335b53f8cSChandrakanth patil 844050d28e1SChandrakanth patil struct bnxt_aux_dev { 845050d28e1SChandrakanth patil struct auxiliary_device aux_dev; 846050d28e1SChandrakanth patil struct bnxt_en_dev *edev; 847050d28e1SChandrakanth patil int id; 848050d28e1SChandrakanth patil }; 849050d28e1SChandrakanth patil 850050d28e1SChandrakanth patil struct bnxt_msix_tbl { 851050d28e1SChandrakanth patil uint32_t entry; 852050d28e1SChandrakanth patil uint32_t vector; 853050d28e1SChandrakanth patil }; 854050d28e1SChandrakanth patil 855c9965974SChandrakanth patil enum bnxt_health_severity { 856c9965974SChandrakanth patil SEVERITY_NORMAL = 0, 857c9965974SChandrakanth patil SEVERITY_WARNING, 858c9965974SChandrakanth patil SEVERITY_RECOVERABLE, 859c9965974SChandrakanth patil SEVERITY_FATAL, 860c9965974SChandrakanth patil }; 861c9965974SChandrakanth patil 862c9965974SChandrakanth patil enum bnxt_health_remedy { 863c9965974SChandrakanth patil REMEDY_DEVLINK_RECOVER, 864c9965974SChandrakanth patil REMEDY_POWER_CYCLE_DEVICE, 865c9965974SChandrakanth patil REMEDY_POWER_CYCLE_HOST, 866c9965974SChandrakanth patil REMEDY_FW_UPDATE, 867c9965974SChandrakanth patil REMEDY_HW_REPLACE, 868c9965974SChandrakanth patil }; 869c9965974SChandrakanth patil 870c9965974SChandrakanth patil struct bnxt_fw_health { 871c9965974SChandrakanth patil u32 flags; 872c9965974SChandrakanth patil u32 polling_dsecs; 873c9965974SChandrakanth patil u32 master_func_wait_dsecs; 874c9965974SChandrakanth patil u32 normal_func_wait_dsecs; 875c9965974SChandrakanth patil u32 post_reset_wait_dsecs; 876c9965974SChandrakanth patil u32 post_reset_max_wait_dsecs; 877c9965974SChandrakanth patil u32 regs[4]; 878c9965974SChandrakanth patil u32 mapped_regs[4]; 879c9965974SChandrakanth patil #define BNXT_FW_HEALTH_REG 0 880c9965974SChandrakanth patil #define BNXT_FW_HEARTBEAT_REG 1 881c9965974SChandrakanth patil #define BNXT_FW_RESET_CNT_REG 2 882c9965974SChandrakanth patil #define BNXT_FW_RESET_INPROG_REG 3 883c9965974SChandrakanth patil u32 fw_reset_inprog_reg_mask; 884c9965974SChandrakanth patil u32 last_fw_heartbeat; 885c9965974SChandrakanth patil u32 last_fw_reset_cnt; 886c9965974SChandrakanth patil u8 enabled:1; 887c9965974SChandrakanth patil u8 primary:1; 888c9965974SChandrakanth patil u8 status_reliable:1; 889c9965974SChandrakanth patil u8 resets_reliable:1; 890c9965974SChandrakanth patil u8 tmr_multiplier; 891c9965974SChandrakanth patil u8 tmr_counter; 892c9965974SChandrakanth patil u8 fw_reset_seq_cnt; 893c9965974SChandrakanth patil u32 fw_reset_seq_regs[16]; 894c9965974SChandrakanth patil u32 fw_reset_seq_vals[16]; 895c9965974SChandrakanth patil u32 fw_reset_seq_delay_msec[16]; 896c9965974SChandrakanth patil u32 echo_req_data1; 897c9965974SChandrakanth patil u32 echo_req_data2; 898c9965974SChandrakanth patil struct devlink_health_reporter *fw_reporter; 899c9965974SChandrakanth patil struct mutex lock; 900c9965974SChandrakanth patil enum bnxt_health_severity severity; 901c9965974SChandrakanth patil enum bnxt_health_remedy remedy; 902c9965974SChandrakanth patil u32 arrests; 903c9965974SChandrakanth patil u32 discoveries; 904c9965974SChandrakanth patil u32 survivals; 905c9965974SChandrakanth patil u32 fatalities; 906c9965974SChandrakanth patil u32 diagnoses; 907c9965974SChandrakanth patil }; 908c9965974SChandrakanth patil 909c9965974SChandrakanth patil #define BNXT_FW_HEALTH_REG_TYPE_MASK 3 910c9965974SChandrakanth patil #define BNXT_FW_HEALTH_REG_TYPE_CFG 0 911c9965974SChandrakanth patil #define BNXT_FW_HEALTH_REG_TYPE_GRC 1 912c9965974SChandrakanth patil #define BNXT_FW_HEALTH_REG_TYPE_BAR0 2 913c9965974SChandrakanth patil #define BNXT_FW_HEALTH_REG_TYPE_BAR1 3 914c9965974SChandrakanth patil 915c9965974SChandrakanth patil #define BNXT_FW_HEALTH_REG_TYPE(reg) ((reg) & BNXT_FW_HEALTH_REG_TYPE_MASK) 916c9965974SChandrakanth patil #define BNXT_FW_HEALTH_REG_OFF(reg) ((reg) & ~BNXT_FW_HEALTH_REG_TYPE_MASK) 917c9965974SChandrakanth patil 918c9965974SChandrakanth patil #define BNXT_FW_HEALTH_WIN_BASE 0x3000 919c9965974SChandrakanth patil #define BNXT_FW_HEALTH_WIN_MAP_OFF 8 920c9965974SChandrakanth patil 921c9965974SChandrakanth patil #define BNXT_FW_HEALTH_WIN_OFF(reg) (BNXT_FW_HEALTH_WIN_BASE + \ 922c9965974SChandrakanth patil ((reg) & BNXT_GRC_OFFSET_MASK)) 923c9965974SChandrakanth patil 924c9965974SChandrakanth patil #define BNXT_FW_STATUS_HEALTH_MSK 0xffff 925c9965974SChandrakanth patil #define BNXT_FW_STATUS_HEALTHY 0x8000 926c9965974SChandrakanth patil #define BNXT_FW_STATUS_SHUTDOWN 0x100000 927c9965974SChandrakanth patil #define BNXT_FW_STATUS_RECOVERING 0x400000 928c9965974SChandrakanth patil 929c9965974SChandrakanth patil #define BNXT_FW_IS_HEALTHY(sts) (((sts) & BNXT_FW_STATUS_HEALTH_MSK) ==\ 930c9965974SChandrakanth patil BNXT_FW_STATUS_HEALTHY) 931c9965974SChandrakanth patil 932c9965974SChandrakanth patil #define BNXT_FW_IS_BOOTING(sts) (((sts) & BNXT_FW_STATUS_HEALTH_MSK) < \ 933c9965974SChandrakanth patil BNXT_FW_STATUS_HEALTHY) 934c9965974SChandrakanth patil 935c9965974SChandrakanth patil #define BNXT_FW_IS_ERR(sts) (((sts) & BNXT_FW_STATUS_HEALTH_MSK) > \ 936c9965974SChandrakanth patil BNXT_FW_STATUS_HEALTHY) 937c9965974SChandrakanth patil 938c9965974SChandrakanth patil #define BNXT_FW_IS_RECOVERING(sts) (BNXT_FW_IS_ERR(sts) && \ 939c9965974SChandrakanth patil ((sts) & BNXT_FW_STATUS_RECOVERING)) 940c9965974SChandrakanth patil 941c9965974SChandrakanth patil #define BNXT_FW_RETRY 5 942c9965974SChandrakanth patil #define BNXT_FW_IF_RETRY 10 943c9965974SChandrakanth patil #define BNXT_FW_SLOT_RESET_RETRY 4 944c9965974SChandrakanth patil 945c9965974SChandrakanth patil #define BNXT_GRCPF_REG_CHIMP_COMM 0x0 946c9965974SChandrakanth patil #define BNXT_GRCPF_REG_CHIMP_COMM_TRIGGER 0x100 947c9965974SChandrakanth patil #define BNXT_GRCPF_REG_WINDOW_BASE_OUT 0x400 948c9965974SChandrakanth patil #define BNXT_GRCPF_REG_SYNC_TIME 0x480 949c9965974SChandrakanth patil #define BNXT_GRCPF_REG_SYNC_TIME_ADJ 0x488 950c9965974SChandrakanth patil #define BNXT_GRCPF_REG_SYNC_TIME_ADJ_PER_MSK 0xffffffUL 951c9965974SChandrakanth patil #define BNXT_GRCPF_REG_SYNC_TIME_ADJ_PER_SFT 0 952c9965974SChandrakanth patil #define BNXT_GRCPF_REG_SYNC_TIME_ADJ_VAL_MSK 0x1f000000UL 953c9965974SChandrakanth patil #define BNXT_GRCPF_REG_SYNC_TIME_ADJ_VAL_SFT 24 954c9965974SChandrakanth patil #define BNXT_GRCPF_REG_SYNC_TIME_ADJ_SIGN_MSK 0x20000000UL 955c9965974SChandrakanth patil #define BNXT_GRCPF_REG_SYNC_TIME_ADJ_SIGN_SFT 29 956c9965974SChandrakanth patil 957c9965974SChandrakanth patil #define BNXT_GRC_REG_STATUS_P5 0x520 958c9965974SChandrakanth patil 959c9965974SChandrakanth patil #define BNXT_GRCPF_REG_KONG_COMM 0xA00 960c9965974SChandrakanth patil #define BNXT_GRCPF_REG_KONG_COMM_TRIGGER 0xB00 961c9965974SChandrakanth patil 962c9965974SChandrakanth patil #define BNXT_CAG_REG_LEGACY_INT_STATUS 0x4014 963c9965974SChandrakanth patil #define BNXT_CAG_REG_BASE 0x300000 964c9965974SChandrakanth patil 965c9965974SChandrakanth patil #define BNXT_GRC_REG_CHIP_NUM 0x48 966c9965974SChandrakanth patil #define BNXT_GRC_REG_BASE 0x260000 967c9965974SChandrakanth patil 968c9965974SChandrakanth patil #define BNXT_TS_REG_TIMESYNC_TS0_LOWER 0x640180c 969c9965974SChandrakanth patil #define BNXT_TS_REG_TIMESYNC_TS0_UPPER 0x6401810 970c9965974SChandrakanth patil 971c9965974SChandrakanth patil #define BNXT_GRC_BASE_MASK 0xfffff000 972c9965974SChandrakanth patil #define BNXT_GRC_OFFSET_MASK 0x00000ffc 97335b53f8cSChandrakanth patil struct bnxt_softc { 97435b53f8cSChandrakanth patil device_t dev; 97535b53f8cSChandrakanth patil if_ctx_t ctx; 97635b53f8cSChandrakanth patil if_softc_ctx_t scctx; 97735b53f8cSChandrakanth patil if_shared_ctx_t sctx; 978050d28e1SChandrakanth patil if_t ifp; 97935b53f8cSChandrakanth patil uint32_t domain; 98035b53f8cSChandrakanth patil uint32_t bus; 98135b53f8cSChandrakanth patil uint32_t slot; 98235b53f8cSChandrakanth patil uint32_t function; 98335b53f8cSChandrakanth patil uint32_t dev_fn; 98435b53f8cSChandrakanth patil struct ifmedia *media; 98535b53f8cSChandrakanth patil struct bnxt_ctx_mem_info *ctx_mem; 98635b53f8cSChandrakanth patil struct bnxt_hw_resc hw_resc; 98735b53f8cSChandrakanth patil struct bnxt_softc_list list; 98835b53f8cSChandrakanth patil 98935b53f8cSChandrakanth patil struct bnxt_bar_info hwrm_bar; 99035b53f8cSChandrakanth patil struct bnxt_bar_info doorbell_bar; 99135b53f8cSChandrakanth patil struct bnxt_link_info link_info; 99235b53f8cSChandrakanth patil #define BNXT_FLAG_VF 0x0001 99335b53f8cSChandrakanth patil #define BNXT_FLAG_NPAR 0x0002 99435b53f8cSChandrakanth patil #define BNXT_FLAG_WOL_CAP 0x0004 99535b53f8cSChandrakanth patil #define BNXT_FLAG_SHORT_CMD 0x0008 99635b53f8cSChandrakanth patil #define BNXT_FLAG_FW_CAP_NEW_RM 0x0010 99735b53f8cSChandrakanth patil #define BNXT_FLAG_CHIP_P5 0x0020 99835b53f8cSChandrakanth patil #define BNXT_FLAG_TPA 0x0040 99935b53f8cSChandrakanth patil #define BNXT_FLAG_FW_CAP_EXT_STATS 0x0080 100035b53f8cSChandrakanth patil #define BNXT_FLAG_MULTI_HOST 0x0100 100135b53f8cSChandrakanth patil #define BNXT_FLAG_MULTI_ROOT 0x0200 1002050d28e1SChandrakanth patil #define BNXT_FLAG_ROCEV1_CAP 0x0400 1003050d28e1SChandrakanth patil #define BNXT_FLAG_ROCEV2_CAP 0x0800 1004050d28e1SChandrakanth patil #define BNXT_FLAG_ROCE_CAP (BNXT_FLAG_ROCEV1_CAP | BNXT_FLAG_ROCEV2_CAP) 100535b53f8cSChandrakanth patil uint32_t flags; 100635b53f8cSChandrakanth patil #define BNXT_STATE_LINK_CHANGE (0) 100735b53f8cSChandrakanth patil #define BNXT_STATE_MAX (BNXT_STATE_LINK_CHANGE + 1) 100835b53f8cSChandrakanth patil bitstr_t *state_bv; 1009050d28e1SChandrakanth patil 1010050d28e1SChandrakanth patil uint32_t total_irqs; 1011050d28e1SChandrakanth patil struct bnxt_msix_tbl *irq_tbl; 101235b53f8cSChandrakanth patil 101335b53f8cSChandrakanth patil struct bnxt_func_info func; 101435b53f8cSChandrakanth patil struct bnxt_func_qcfg fn_qcfg; 101535b53f8cSChandrakanth patil struct bnxt_pf_info pf; 101635b53f8cSChandrakanth patil struct bnxt_vf_info vf; 101735b53f8cSChandrakanth patil 101835b53f8cSChandrakanth patil uint16_t hwrm_cmd_seq; 101935b53f8cSChandrakanth patil uint32_t hwrm_cmd_timeo; /* milliseconds */ 102035b53f8cSChandrakanth patil struct iflib_dma_info hwrm_cmd_resp; 102135b53f8cSChandrakanth patil struct iflib_dma_info hwrm_short_cmd_req_addr; 102235b53f8cSChandrakanth patil /* Interrupt info for HWRM */ 102335b53f8cSChandrakanth patil struct if_irq irq; 102435b53f8cSChandrakanth patil struct mtx hwrm_lock; 102535b53f8cSChandrakanth patil uint16_t hwrm_max_req_len; 102635b53f8cSChandrakanth patil uint16_t hwrm_max_ext_req_len; 102735b53f8cSChandrakanth patil uint32_t hwrm_spec_code; 102835b53f8cSChandrakanth patil 102935b53f8cSChandrakanth patil #define BNXT_MAX_QUEUE 8 103035b53f8cSChandrakanth patil uint8_t max_tc; 103135b53f8cSChandrakanth patil uint8_t max_lltc; 103235b53f8cSChandrakanth patil struct bnxt_queue_info tx_q_info[BNXT_MAX_QUEUE]; 103335b53f8cSChandrakanth patil struct bnxt_queue_info rx_q_info[BNXT_MAX_QUEUE]; 103435b53f8cSChandrakanth patil uint8_t tc_to_qidx[BNXT_MAX_QUEUE]; 103535b53f8cSChandrakanth patil uint8_t tx_q_ids[BNXT_MAX_QUEUE]; 103635b53f8cSChandrakanth patil uint8_t rx_q_ids[BNXT_MAX_QUEUE]; 103735b53f8cSChandrakanth patil uint8_t tx_max_q; 103835b53f8cSChandrakanth patil uint8_t rx_max_q; 103935b53f8cSChandrakanth patil uint8_t is_asym_q; 104035b53f8cSChandrakanth patil 104135b53f8cSChandrakanth patil struct bnxt_ieee_ets *ieee_ets; 104235b53f8cSChandrakanth patil struct bnxt_ieee_pfc *ieee_pfc; 104335b53f8cSChandrakanth patil uint8_t dcbx_cap; 104435b53f8cSChandrakanth patil uint8_t default_pri; 104535b53f8cSChandrakanth patil uint8_t max_dscp_value; 104635b53f8cSChandrakanth patil 104735b53f8cSChandrakanth patil uint64_t admin_ticks; 104835b53f8cSChandrakanth patil struct iflib_dma_info hw_rx_port_stats; 104935b53f8cSChandrakanth patil struct iflib_dma_info hw_tx_port_stats; 105035b53f8cSChandrakanth patil struct rx_port_stats *rx_port_stats; 105135b53f8cSChandrakanth patil struct tx_port_stats *tx_port_stats; 105235b53f8cSChandrakanth patil 105335b53f8cSChandrakanth patil struct iflib_dma_info hw_tx_port_stats_ext; 105435b53f8cSChandrakanth patil struct iflib_dma_info hw_rx_port_stats_ext; 105535b53f8cSChandrakanth patil struct tx_port_stats_ext *tx_port_stats_ext; 105635b53f8cSChandrakanth patil struct rx_port_stats_ext *rx_port_stats_ext; 105735b53f8cSChandrakanth patil 1058032899b5SChandrakanth patil uint16_t fw_rx_stats_ext_size; 1059032899b5SChandrakanth patil uint16_t fw_tx_stats_ext_size; 1060032899b5SChandrakanth patil uint16_t hw_ring_stats_size; 1061032899b5SChandrakanth patil 1062032899b5SChandrakanth patil uint8_t tx_pri2cos_idx[8]; 1063032899b5SChandrakanth patil uint8_t rx_pri2cos_idx[8]; 1064032899b5SChandrakanth patil bool pri2cos_valid; 1065032899b5SChandrakanth patil 1066032899b5SChandrakanth patil uint64_t tx_bytes_pri[8]; 1067032899b5SChandrakanth patil uint64_t tx_packets_pri[8]; 1068032899b5SChandrakanth patil uint64_t rx_bytes_pri[8]; 1069032899b5SChandrakanth patil uint64_t rx_packets_pri[8]; 1070032899b5SChandrakanth patil 1071032899b5SChandrakanth patil uint8_t port_count; 107235b53f8cSChandrakanth patil int num_cp_rings; 107335b53f8cSChandrakanth patil 107435b53f8cSChandrakanth patil struct bnxt_cp_ring *nq_rings; 107535b53f8cSChandrakanth patil 107635b53f8cSChandrakanth patil struct bnxt_ring *tx_rings; 107735b53f8cSChandrakanth patil struct bnxt_cp_ring *tx_cp_rings; 107835b53f8cSChandrakanth patil struct iflib_dma_info tx_stats[BNXT_MAX_NUM_QUEUES]; 107935b53f8cSChandrakanth patil int ntxqsets; 108035b53f8cSChandrakanth patil 108135b53f8cSChandrakanth patil struct bnxt_vnic_info vnic_info; 108235b53f8cSChandrakanth patil struct bnxt_ring *ag_rings; 108335b53f8cSChandrakanth patil struct bnxt_ring *rx_rings; 108435b53f8cSChandrakanth patil struct bnxt_cp_ring *rx_cp_rings; 108535b53f8cSChandrakanth patil struct bnxt_grp_info *grp_info; 108635b53f8cSChandrakanth patil struct iflib_dma_info rx_stats[BNXT_MAX_NUM_QUEUES]; 108735b53f8cSChandrakanth patil int nrxqsets; 108835b53f8cSChandrakanth patil uint16_t rx_buf_size; 108935b53f8cSChandrakanth patil 109035b53f8cSChandrakanth patil struct bnxt_cp_ring def_cp_ring; 109135b53f8cSChandrakanth patil struct bnxt_cp_ring def_nq_ring; 109235b53f8cSChandrakanth patil struct iflib_dma_info def_cp_ring_mem; 109335b53f8cSChandrakanth patil struct iflib_dma_info def_nq_ring_mem; 10943ad01642SKrzysztof Galazka struct task def_cp_task; 1095050d28e1SChandrakanth patil int db_size; 1096050d28e1SChandrakanth patil int legacy_db_size; 109735b53f8cSChandrakanth patil struct bnxt_doorbell_ops db_ops; 109835b53f8cSChandrakanth patil 109935b53f8cSChandrakanth patil struct sysctl_ctx_list hw_stats; 110035b53f8cSChandrakanth patil struct sysctl_oid *hw_stats_oid; 110135b53f8cSChandrakanth patil struct sysctl_ctx_list hw_lro_ctx; 110235b53f8cSChandrakanth patil struct sysctl_oid *hw_lro_oid; 110335b53f8cSChandrakanth patil struct sysctl_ctx_list flow_ctrl_ctx; 110435b53f8cSChandrakanth patil struct sysctl_oid *flow_ctrl_oid; 110535b53f8cSChandrakanth patil struct sysctl_ctx_list dcb_ctx; 110635b53f8cSChandrakanth patil struct sysctl_oid *dcb_oid; 110735b53f8cSChandrakanth patil 110835b53f8cSChandrakanth patil struct bnxt_ver_info *ver_info; 110935b53f8cSChandrakanth patil struct bnxt_nvram_info *nvm_info; 111035b53f8cSChandrakanth patil bool wol; 111135b53f8cSChandrakanth patil bool is_dev_init; 111235b53f8cSChandrakanth patil struct bnxt_hw_lro hw_lro; 111335b53f8cSChandrakanth patil uint8_t wol_filter_id; 111435b53f8cSChandrakanth patil uint16_t rx_coal_usecs; 111535b53f8cSChandrakanth patil uint16_t rx_coal_usecs_irq; 111635b53f8cSChandrakanth patil uint16_t rx_coal_frames; 111735b53f8cSChandrakanth patil uint16_t rx_coal_frames_irq; 111835b53f8cSChandrakanth patil uint16_t tx_coal_usecs; 111935b53f8cSChandrakanth patil uint16_t tx_coal_usecs_irq; 112035b53f8cSChandrakanth patil uint16_t tx_coal_frames; 112135b53f8cSChandrakanth patil uint16_t tx_coal_frames_irq; 112235b53f8cSChandrakanth patil 112335b53f8cSChandrakanth patil #define BNXT_USEC_TO_COAL_TIMER(x) ((x) * 25 / 2) 112435b53f8cSChandrakanth patil #define BNXT_DEF_STATS_COAL_TICKS 1000000 112535b53f8cSChandrakanth patil #define BNXT_MIN_STATS_COAL_TICKS 250000 112635b53f8cSChandrakanth patil #define BNXT_MAX_STATS_COAL_TICKS 1000000 112735b53f8cSChandrakanth patil 112835b53f8cSChandrakanth patil uint64_t fw_cap; 112935b53f8cSChandrakanth patil #define BNXT_FW_CAP_SHORT_CMD BIT_ULL(0) 113035b53f8cSChandrakanth patil #define BNXT_FW_CAP_LLDP_AGENT BIT_ULL(1) 113135b53f8cSChandrakanth patil #define BNXT_FW_CAP_DCBX_AGENT BIT_ULL(2) 113235b53f8cSChandrakanth patil #define BNXT_FW_CAP_NEW_RM BIT_ULL(3) 113335b53f8cSChandrakanth patil #define BNXT_FW_CAP_IF_CHANGE BIT_ULL(4) 113435b53f8cSChandrakanth patil #define BNXT_FW_CAP_LINK_ADMIN BIT_ULL(5) 113535b53f8cSChandrakanth patil #define BNXT_FW_CAP_VF_RES_MIN_GUARANTEED BIT_ULL(6) 113635b53f8cSChandrakanth patil #define BNXT_FW_CAP_KONG_MB_CHNL BIT_ULL(7) 113735b53f8cSChandrakanth patil #define BNXT_FW_CAP_ADMIN_MTU BIT_ULL(8) 113835b53f8cSChandrakanth patil #define BNXT_FW_CAP_ADMIN_PF BIT_ULL(9) 113935b53f8cSChandrakanth patil #define BNXT_FW_CAP_OVS_64BIT_HANDLE BIT_ULL(10) 114035b53f8cSChandrakanth patil #define BNXT_FW_CAP_TRUSTED_VF BIT_ULL(11) 114135b53f8cSChandrakanth patil #define BNXT_FW_CAP_VF_VNIC_NOTIFY BIT_ULL(12) 114235b53f8cSChandrakanth patil #define BNXT_FW_CAP_ERROR_RECOVERY BIT_ULL(13) 114335b53f8cSChandrakanth patil #define BNXT_FW_CAP_PKG_VER BIT_ULL(14) 114435b53f8cSChandrakanth patil #define BNXT_FW_CAP_CFA_ADV_FLOW BIT_ULL(15) 114535b53f8cSChandrakanth patil #define BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V2 BIT_ULL(16) 114635b53f8cSChandrakanth patil #define BNXT_FW_CAP_PCIE_STATS_SUPPORTED BIT_ULL(17) 114735b53f8cSChandrakanth patil #define BNXT_FW_CAP_EXT_STATS_SUPPORTED BIT_ULL(18) 114835b53f8cSChandrakanth patil #define BNXT_FW_CAP_SECURE_MODE BIT_ULL(19) 114935b53f8cSChandrakanth patil #define BNXT_FW_CAP_ERR_RECOVER_RELOAD BIT_ULL(20) 115035b53f8cSChandrakanth patil #define BNXT_FW_CAP_HOT_RESET BIT_ULL(21) 115135b53f8cSChandrakanth patil #define BNXT_FW_CAP_CRASHDUMP BIT_ULL(23) 115235b53f8cSChandrakanth patil #define BNXT_FW_CAP_VLAN_RX_STRIP BIT_ULL(24) 115335b53f8cSChandrakanth patil #define BNXT_FW_CAP_VLAN_TX_INSERT BIT_ULL(25) 115435b53f8cSChandrakanth patil #define BNXT_FW_CAP_EXT_HW_STATS_SUPPORTED BIT_ULL(26) 115535b53f8cSChandrakanth patil #define BNXT_FW_CAP_CFA_EEM BIT_ULL(27) 115635b53f8cSChandrakanth patil #define BNXT_FW_CAP_DBG_QCAPS BIT_ULL(29) 115735b53f8cSChandrakanth patil #define BNXT_FW_CAP_RING_MONITOR BIT_ULL(30) 115835b53f8cSChandrakanth patil #define BNXT_FW_CAP_ECN_STATS BIT_ULL(31) 115935b53f8cSChandrakanth patil #define BNXT_FW_CAP_TRUFLOW BIT_ULL(32) 116035b53f8cSChandrakanth patil #define BNXT_FW_CAP_VF_CFG_FOR_PF BIT_ULL(33) 116135b53f8cSChandrakanth patil #define BNXT_FW_CAP_PTP_PPS BIT_ULL(34) 116235b53f8cSChandrakanth patil #define BNXT_FW_CAP_HOT_RESET_IF BIT_ULL(35) 116335b53f8cSChandrakanth patil #define BNXT_FW_CAP_LIVEPATCH BIT_ULL(36) 116435b53f8cSChandrakanth patil #define BNXT_FW_CAP_NPAR_1_2 BIT_ULL(37) 116535b53f8cSChandrakanth patil #define BNXT_FW_CAP_RSS_HASH_TYPE_DELTA BIT_ULL(38) 116635b53f8cSChandrakanth patil #define BNXT_FW_CAP_PTP_RTC BIT_ULL(39) 116735b53f8cSChandrakanth patil #define BNXT_FW_CAP_TRUFLOW_EN BIT_ULL(40) 116835b53f8cSChandrakanth patil #define BNXT_TRUFLOW_EN(bp) ((bp)->fw_cap & BNXT_FW_CAP_TRUFLOW_EN) 116935b53f8cSChandrakanth patil #define BNXT_FW_CAP_RX_ALL_PKT_TS BIT_ULL(41) 117035b53f8cSChandrakanth patil #define BNXT_FW_CAP_BACKING_STORE_V2 BIT_ULL(42) 117135b53f8cSChandrakanth patil #define BNXT_FW_CAP_DBR_SUPPORTED BIT_ULL(43) 117235b53f8cSChandrakanth patil #define BNXT_FW_CAP_GENERIC_STATS BIT_ULL(44) 117335b53f8cSChandrakanth patil #define BNXT_FW_CAP_DBR_PACING_SUPPORTED BIT_ULL(45) 117435b53f8cSChandrakanth patil #define BNXT_FW_CAP_PTP_PTM BIT_ULL(46) 117535b53f8cSChandrakanth patil #define BNXT_FW_CAP_CFA_NTUPLE_RX_EXT_IP_PROTO BIT_ULL(47) 117635b53f8cSChandrakanth patil #define BNXT_FW_CAP_ENABLE_RDMA_SRIOV BIT_ULL(48) 117735b53f8cSChandrakanth patil #define BNXT_FW_CAP_RSS_TCAM BIT_ULL(49) 117835b53f8cSChandrakanth patil uint32_t lpi_tmr_lo; 117935b53f8cSChandrakanth patil uint32_t lpi_tmr_hi; 118035b53f8cSChandrakanth patil /* copied from flags and flags2 in hwrm_port_phy_qcaps_output */ 118135b53f8cSChandrakanth patil uint16_t phy_flags; 118235b53f8cSChandrakanth patil #define BNXT_PHY_FL_EEE_CAP HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_EEE_SUPPORTED 118335b53f8cSChandrakanth patil #define BNXT_PHY_FL_EXT_LPBK HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_EXTERNAL_LPBK_SUPPORTED 118435b53f8cSChandrakanth patil #define BNXT_PHY_FL_AN_PHY_LPBK HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_AUTONEG_LPBK_SUPPORTED 118535b53f8cSChandrakanth patil #define BNXT_PHY_FL_SHARED_PORT_CFG HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_SHARED_PHY_CFG_SUPPORTED 118635b53f8cSChandrakanth patil #define BNXT_PHY_FL_PORT_STATS_NO_RESET HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_CUMULATIVE_COUNTERS_ON_RESET 118735b53f8cSChandrakanth patil #define BNXT_PHY_FL_NO_PHY_LPBK HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_LOCAL_LPBK_NOT_SUPPORTED 118835b53f8cSChandrakanth patil #define BNXT_PHY_FL_FW_MANAGED_LKDN HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_FW_MANAGED_LINK_DOWN 118935b53f8cSChandrakanth patil #define BNXT_PHY_FL_NO_FCS HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_NO_FCS 119035b53f8cSChandrakanth patil #define BNXT_PHY_FL_NO_PAUSE (HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS2_PAUSE_UNSUPPORTED << 8) 119135b53f8cSChandrakanth patil #define BNXT_PHY_FL_NO_PFC (HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS2_PFC_UNSUPPORTED << 8) 119235b53f8cSChandrakanth patil #define BNXT_PHY_FL_BANK_SEL (HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS2_BANK_ADDR_SUPPORTED << 8) 1193050d28e1SChandrakanth patil struct bnxt_aux_dev *aux_dev; 1194050d28e1SChandrakanth patil struct net_device *net_dev; 1195050d28e1SChandrakanth patil struct mtx en_ops_lock; 1196050d28e1SChandrakanth patil uint8_t port_partition_type; 1197050d28e1SChandrakanth patil struct bnxt_en_dev *edev; 1198050d28e1SChandrakanth patil unsigned long state; 1199050d28e1SChandrakanth patil #define BNXT_STATE_OPEN 0 1200050d28e1SChandrakanth patil #define BNXT_STATE_IN_SP_TASK 1 1201050d28e1SChandrakanth patil #define BNXT_STATE_READ_STATS 2 1202050d28e1SChandrakanth patil #define BNXT_STATE_FW_RESET_DET 3 1203050d28e1SChandrakanth patil #define BNXT_STATE_IN_FW_RESET 4 1204050d28e1SChandrakanth patil #define BNXT_STATE_ABORT_ERR 5 1205050d28e1SChandrakanth patil #define BNXT_STATE_FW_FATAL_COND 6 1206050d28e1SChandrakanth patil #define BNXT_STATE_DRV_REGISTERED 7 1207050d28e1SChandrakanth patil #define BNXT_STATE_PCI_CHANNEL_IO_FROZEN 8 1208050d28e1SChandrakanth patil #define BNXT_STATE_NAPI_DISABLED 9 1209050d28e1SChandrakanth patil #define BNXT_STATE_L2_FILTER_RETRY 10 1210050d28e1SChandrakanth patil #define BNXT_STATE_FW_ACTIVATE 11 1211050d28e1SChandrakanth patil #define BNXT_STATE_RECOVER 12 1212050d28e1SChandrakanth patil #define BNXT_STATE_FW_NON_FATAL_COND 13 1213050d28e1SChandrakanth patil #define BNXT_STATE_FW_ACTIVATE_RESET 14 1214050d28e1SChandrakanth patil #define BNXT_STATE_HALF_OPEN 15 1215050d28e1SChandrakanth patil #define BNXT_NO_FW_ACCESS(bp) \ 1216050d28e1SChandrakanth patil test_bit(BNXT_STATE_FW_FATAL_COND, &(bp)->state) 1217050d28e1SChandrakanth patil struct pci_dev *pdev; 1218050d28e1SChandrakanth patil 1219c9965974SChandrakanth patil struct work_struct sp_task; 1220c9965974SChandrakanth patil unsigned long sp_event; 1221c9965974SChandrakanth patil #define BNXT_RX_MASK_SP_EVENT 0 1222c9965974SChandrakanth patil #define BNXT_RX_NTP_FLTR_SP_EVENT 1 1223c9965974SChandrakanth patil #define BNXT_LINK_CHNG_SP_EVENT 2 1224c9965974SChandrakanth patil #define BNXT_HWRM_EXEC_FWD_REQ_SP_EVENT 3 1225c9965974SChandrakanth patil #define BNXT_VXLAN_ADD_PORT_SP_EVENT 4 1226c9965974SChandrakanth patil #define BNXT_VXLAN_DEL_PORT_SP_EVENT 5 1227c9965974SChandrakanth patil #define BNXT_RESET_TASK_SP_EVENT 6 1228c9965974SChandrakanth patil #define BNXT_RST_RING_SP_EVENT 7 1229c9965974SChandrakanth patil #define BNXT_HWRM_PF_UNLOAD_SP_EVENT 8 1230c9965974SChandrakanth patil #define BNXT_PERIODIC_STATS_SP_EVENT 9 1231c9965974SChandrakanth patil #define BNXT_HWRM_PORT_MODULE_SP_EVENT 10 1232c9965974SChandrakanth patil #define BNXT_RESET_TASK_SILENT_SP_EVENT 11 1233c9965974SChandrakanth patil #define BNXT_GENEVE_ADD_PORT_SP_EVENT 12 1234c9965974SChandrakanth patil #define BNXT_GENEVE_DEL_PORT_SP_EVENT 13 1235c9965974SChandrakanth patil #define BNXT_LINK_SPEED_CHNG_SP_EVENT 14 1236c9965974SChandrakanth patil #define BNXT_FLOW_STATS_SP_EVENT 15 1237c9965974SChandrakanth patil #define BNXT_UPDATE_PHY_SP_EVENT 16 1238c9965974SChandrakanth patil #define BNXT_RING_COAL_NOW_SP_EVENT 17 1239c9965974SChandrakanth patil #define BNXT_FW_RESET_NOTIFY_SP_EVENT 18 1240c9965974SChandrakanth patil #define BNXT_FW_EXCEPTION_SP_EVENT 19 1241c9965974SChandrakanth patil #define BNXT_VF_VNIC_CHANGE_SP_EVENT 20 1242c9965974SChandrakanth patil #define BNXT_LINK_CFG_CHANGE_SP_EVENT 21 1243c9965974SChandrakanth patil #define BNXT_PTP_CURRENT_TIME_EVENT 22 1244c9965974SChandrakanth patil #define BNXT_FW_ECHO_REQUEST_SP_EVENT 23 1245c9965974SChandrakanth patil #define BNXT_VF_CFG_CHNG_SP_EVENT 24 1246c9965974SChandrakanth patil 1247c9965974SChandrakanth patil struct delayed_work fw_reset_task; 1248050d28e1SChandrakanth patil int fw_reset_state; 1249c9965974SChandrakanth patil #define BNXT_FW_RESET_STATE_POLL_VF 1 1250c9965974SChandrakanth patil #define BNXT_FW_RESET_STATE_RESET_FW 2 1251c9965974SChandrakanth patil #define BNXT_FW_RESET_STATE_ENABLE_DEV 3 1252c9965974SChandrakanth patil #define BNXT_FW_RESET_STATE_POLL_FW 4 1253c9965974SChandrakanth patil #define BNXT_FW_RESET_STATE_OPENING 5 1254c9965974SChandrakanth patil #define BNXT_FW_RESET_STATE_POLL_FW_DOWN 6 1255c9965974SChandrakanth patil u16 fw_reset_min_dsecs; 1256c9965974SChandrakanth patil #define BNXT_DFLT_FW_RST_MIN_DSECS 20 1257c9965974SChandrakanth patil u16 fw_reset_max_dsecs; 1258c9965974SChandrakanth patil #define BNXT_DFLT_FW_RST_MAX_DSECS 60 1259c9965974SChandrakanth patil unsigned long fw_reset_timestamp; 1260c9965974SChandrakanth patil 1261c9965974SChandrakanth patil struct bnxt_fw_health *fw_health; 126235b53f8cSChandrakanth patil }; 126335b53f8cSChandrakanth patil 126435b53f8cSChandrakanth patil struct bnxt_filter_info { 126535b53f8cSChandrakanth patil STAILQ_ENTRY(bnxt_filter_info) next; 126635b53f8cSChandrakanth patil uint64_t fw_l2_filter_id; 126735b53f8cSChandrakanth patil #define INVALID_MAC_INDEX ((uint16_t)-1) 126835b53f8cSChandrakanth patil uint16_t mac_index; 126935b53f8cSChandrakanth patil 127035b53f8cSChandrakanth patil /* Filter Characteristics */ 127135b53f8cSChandrakanth patil uint32_t flags; 127235b53f8cSChandrakanth patil uint32_t enables; 127335b53f8cSChandrakanth patil uint8_t l2_addr[ETHER_ADDR_LEN]; 127435b53f8cSChandrakanth patil uint8_t l2_addr_mask[ETHER_ADDR_LEN]; 127535b53f8cSChandrakanth patil uint16_t l2_ovlan; 127635b53f8cSChandrakanth patil uint16_t l2_ovlan_mask; 127735b53f8cSChandrakanth patil uint16_t l2_ivlan; 127835b53f8cSChandrakanth patil uint16_t l2_ivlan_mask; 127935b53f8cSChandrakanth patil uint8_t t_l2_addr[ETHER_ADDR_LEN]; 128035b53f8cSChandrakanth patil uint8_t t_l2_addr_mask[ETHER_ADDR_LEN]; 128135b53f8cSChandrakanth patil uint16_t t_l2_ovlan; 128235b53f8cSChandrakanth patil uint16_t t_l2_ovlan_mask; 128335b53f8cSChandrakanth patil uint16_t t_l2_ivlan; 128435b53f8cSChandrakanth patil uint16_t t_l2_ivlan_mask; 128535b53f8cSChandrakanth patil uint8_t tunnel_type; 128635b53f8cSChandrakanth patil uint16_t mirror_vnic_id; 128735b53f8cSChandrakanth patil uint32_t vni; 128835b53f8cSChandrakanth patil uint8_t pri_hint; 128935b53f8cSChandrakanth patil uint64_t l2_filter_id_hint; 129035b53f8cSChandrakanth patil }; 129135b53f8cSChandrakanth patil 129235b53f8cSChandrakanth patil #define I2C_DEV_ADDR_A0 0xa0 129335b53f8cSChandrakanth patil #define BNXT_MAX_PHY_I2C_RESP_SIZE 64 129435b53f8cSChandrakanth patil 129535b53f8cSChandrakanth patil /* Function declarations */ 129635b53f8cSChandrakanth patil void bnxt_report_link(struct bnxt_softc *softc); 129735b53f8cSChandrakanth patil bool bnxt_check_hwrm_version(struct bnxt_softc *softc); 129835b53f8cSChandrakanth patil struct bnxt_softc *bnxt_find_dev(uint32_t domain, uint32_t bus, uint32_t dev_fn, char *name); 129935b53f8cSChandrakanth patil int bnxt_read_sfp_module_eeprom_info(struct bnxt_softc *bp, uint16_t i2c_addr, 130035b53f8cSChandrakanth patil uint16_t page_number, uint8_t bank, bool bank_sel_en, uint16_t start_addr, 130135b53f8cSChandrakanth patil uint16_t data_length, uint8_t *buf); 130235b53f8cSChandrakanth patil void bnxt_dcb_init(struct bnxt_softc *softc); 130335b53f8cSChandrakanth patil void bnxt_dcb_free(struct bnxt_softc *softc); 130435b53f8cSChandrakanth patil uint8_t bnxt_dcb_setdcbx(struct bnxt_softc *softc, uint8_t mode); 130535b53f8cSChandrakanth patil uint8_t bnxt_dcb_getdcbx(struct bnxt_softc *softc); 130635b53f8cSChandrakanth patil int bnxt_dcb_ieee_getets(struct bnxt_softc *softc, struct bnxt_ieee_ets *ets); 130735b53f8cSChandrakanth patil int bnxt_dcb_ieee_setets(struct bnxt_softc *softc, struct bnxt_ieee_ets *ets); 130835b53f8cSChandrakanth patil uint8_t get_phy_type(struct bnxt_softc *softc); 130935b53f8cSChandrakanth patil int bnxt_dcb_ieee_getpfc(struct bnxt_softc *softc, struct bnxt_ieee_pfc *pfc); 131035b53f8cSChandrakanth patil int bnxt_dcb_ieee_setpfc(struct bnxt_softc *softc, struct bnxt_ieee_pfc *pfc); 131135b53f8cSChandrakanth patil int bnxt_dcb_ieee_setapp(struct bnxt_softc *softc, struct bnxt_dcb_app *app); 131235b53f8cSChandrakanth patil int bnxt_dcb_ieee_delapp(struct bnxt_softc *softc, struct bnxt_dcb_app *app); 1313*3de231b4SZhenlei Huang int bnxt_dcb_ieee_listapp(struct bnxt_softc *softc, struct bnxt_dcb_app *app, 1314*3de231b4SZhenlei Huang size_t nitems, int *num_inputs); 131535b53f8cSChandrakanth patil 131635b53f8cSChandrakanth patil #endif /* _BNXT_H */ 1317