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