xref: /freebsd/sys/dev/bnxt/bnxt_en/bnxt.h (revision 98b5640786f874949e441bee7c4ad5740cd6a649)
1 /*-
2  * Broadcom NetXtreme-C/E network driver.
3  *
4  * Copyright (c) 2016 Broadcom, All Rights Reserved.
5  * The term Broadcom refers to Broadcom Limited and/or its subsidiaries
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26  * THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #include <sys/cdefs.h>
30 #ifndef _BNXT_H
31 #define _BNXT_H
32 
33 #include <sys/param.h>
34 #include <sys/socket.h>
35 #include <sys/sysctl.h>
36 #include <sys/taskqueue.h>
37 #include <sys/bitstring.h>
38 
39 #include <machine/bus.h>
40 
41 #include <net/ethernet.h>
42 #include <net/if.h>
43 #include <net/if_var.h>
44 #include <net/iflib.h>
45 #include <linux/types.h>
46 
47 #include "hsi_struct_def.h"
48 #include "bnxt_dcb.h"
49 #include "bnxt_auxbus_compat.h"
50 #include "bnxt_sriov.h"
51 
52 #define DFLT_HWRM_CMD_TIMEOUT		500
53 
54 /* PCI IDs */
55 #define BROADCOM_VENDOR_ID	0x14E4
56 
57 #define BCM57301	0x16c8
58 #define BCM57302	0x16c9
59 #define BCM57304	0x16ca
60 #define BCM57311	0x16ce
61 #define BCM57312	0x16cf
62 #define BCM57314	0x16df
63 #define BCM57402	0x16d0
64 #define BCM57402_NPAR	0x16d4
65 #define BCM57404	0x16d1
66 #define BCM57404_NPAR	0x16e7
67 #define BCM57406	0x16d2
68 #define BCM57406_NPAR	0x16e8
69 #define BCM57407	0x16d5
70 #define BCM57407_NPAR	0x16ea
71 #define BCM57407_SFP	0x16e9
72 #define BCM57412	0x16d6
73 #define BCM57412_NPAR1	0x16de
74 #define BCM57412_NPAR2	0x16eb
75 #define BCM57414	0x16d7
76 #define BCM57414_NPAR1	0x16ec
77 #define BCM57414_NPAR2	0x16ed
78 #define BCM57416	0x16d8
79 #define BCM57416_NPAR1	0x16ee
80 #define BCM57416_NPAR2	0x16ef
81 #define BCM57416_SFP	0x16e3
82 #define BCM57417	0x16d9
83 #define BCM57417_NPAR1	0x16c0
84 #define BCM57417_NPAR2	0x16cc
85 #define BCM57417_SFP	0x16e2
86 #define BCM57454	0x1614
87 #define BCM58700	0x16cd
88 #define BCM57508  	0x1750
89 #define BCM57504  	0x1751
90 #define BCM57504_NPAR	0x1801
91 #define BCM57502  	0x1752
92 #define BCM57608  	0x1760
93 #define BCM57604  	0x1761
94 #define BCM57602  	0x1762
95 #define BCM57601  	0x1763
96 #define NETXTREME_C_VF1	0x16cb
97 #define NETXTREME_C_VF2	0x16e1
98 #define NETXTREME_C_VF3	0x16e5
99 
100 #define NETXTREME_E_VF1	0x1606
101 #define NETXTREME_E_VF2	0x1609
102 #define NETXTREME_E_VF3	0x16c1
103 #define NETXTREME_E_VF4	0x16d3
104 #define NETXTREME_E_VF5	0x16dc
105 
106 #define NETXTREME_E_P5_VF1	0x1806
107 #define NETXTREME_E_P5_VF2	0x1807
108 #define NETXTREME_E_P5_VF_HV1	0x1808
109 #define NETXTREME_E_P5_VF_HV2	0x1809
110 #define E_P7_VF	0x1819
111 
112 #define EVENT_DATA1_RESET_NOTIFY_FATAL(data1)				\
113 	(((data1) &							\
114 	  HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_MASK) ==\
115 	 HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_EXCEPTION_FATAL)
116 
117 #define BNXT_EVENT_ERROR_REPORT_TYPE(data1)						\
118 	(((data1) &									\
119 	  HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_MASK)  >>	\
120 	 HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_SFT)
121 
122 #define BNXT_EVENT_INVALID_SIGNAL_DATA(data2)						\
123 	(((data2) &									\
124 	  HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_INVALID_SIGNAL_EVENT_DATA2_PIN_ID_MASK) >>	\
125 	 HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_INVALID_SIGNAL_EVENT_DATA2_PIN_ID_SFT)
126 
127 #define BNXT_EVENT_DBR_EPOCH(data)										\
128 	(((data) & HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_DOORBELL_DROP_THRESHOLD_EVENT_DATA1_EPOCH_MASK) >>	\
129 	 HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_DOORBELL_DROP_THRESHOLD_EVENT_DATA1_EPOCH_SFT)
130 
131 #define BNXT_EVENT_THERMAL_THRESHOLD_TEMP(data2)						\
132 	(((data2) &										\
133 	  HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA2_THRESHOLD_TEMP_MASK) >>	\
134 	 HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA2_THRESHOLD_TEMP_SFT)
135 
136 #define EVENT_DATA2_NVM_ERR_ADDR(data2)						\
137 	(((data2) &								\
138 	  HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_NVM_EVENT_DATA2_ERR_ADDR_MASK) >>	\
139 	 HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_NVM_EVENT_DATA2_ERR_ADDR_SFT)
140 
141 #define EVENT_DATA1_THERMAL_THRESHOLD_DIR_INCREASING(data1)					\
142 	(((data1) &										\
143 	  HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_TRANSITION_DIR) ==		\
144 	 HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_TRANSITION_DIR_INCREASING)
145 
146 #define EVENT_DATA1_NVM_ERR_TYPE_WRITE(data1)						\
147 	(((data1) &									\
148 	  HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_NVM_EVENT_DATA1_NVM_ERR_TYPE_MASK) ==	\
149 	 HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_NVM_EVENT_DATA1_NVM_ERR_TYPE_WRITE)
150 
151 #define EVENT_DATA1_NVM_ERR_TYPE_ERASE(data1)						\
152 	(((data1) &									\
153 	  HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_NVM_EVENT_DATA1_NVM_ERR_TYPE_MASK) ==	\
154 	 HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_NVM_EVENT_DATA1_NVM_ERR_TYPE_ERASE)
155 
156 #define EVENT_DATA1_THERMAL_THRESHOLD_TYPE(data1)			\
157 	((data1) & HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_THRESHOLD_TYPE_MASK)
158 
159 #define BNXT_EVENT_THERMAL_CURRENT_TEMP(data2)				\
160 	((data2) & HWRM_ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA2_CURRENT_TEMP_MASK)
161 
162 #define EVENT_DATA1_RESET_NOTIFY_FW_ACTIVATION(data1)                   \
163 	(((data1) &                                                     \
164 	  HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_MASK) ==\
165 	HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_ACTIVATION)
166 
167 #define EVENT_DATA2_RESET_NOTIFY_FW_STATUS_CODE(data2)                  \
168 	((data2) &                                                      \
169 	HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA2_FW_STATUS_CODE_MASK)
170 
171 #define EVENT_DATA1_RECOVERY_ENABLED(data1)				\
172 	!!((data1) &							\
173 	   HWRM_ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_RECOVERY_ENABLED)
174 
175 #define EVENT_DATA1_RECOVERY_MASTER_FUNC(data1)				\
176 	!!((data1) &							\
177 	   HWRM_ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_MASTER_FUNC)
178 
179 #define INVALID_STATS_CTX_ID     -1
180 
181 /* Maximum numbers of RX and TX descriptors. iflib requires this to be a power
182  * of two. The hardware has no particular limitation. */
183 #define BNXT_MAX_RXD	((INT32_MAX >> 1) + 1)
184 #define BNXT_MAX_TXD	((INT32_MAX >> 1) + 1)
185 
186 #define CSUM_OFFLOAD		(CSUM_IP_TSO|CSUM_IP6_TSO|CSUM_IP| \
187 				 CSUM_IP_UDP|CSUM_IP_TCP|CSUM_IP_SCTP| \
188 				 CSUM_IP6_UDP|CSUM_IP6_TCP|CSUM_IP6_SCTP)
189 
190 #define BNXT_MAX_MTU	9600
191 
192 #define BNXT_RSS_HASH_TYPE_TCPV4	0
193 #define BNXT_RSS_HASH_TYPE_UDPV4	1
194 #define BNXT_RSS_HASH_TYPE_IPV4		2
195 #define BNXT_RSS_HASH_TYPE_TCPV6	3
196 #define BNXT_RSS_HASH_TYPE_UDPV6	4
197 #define BNXT_RSS_HASH_TYPE_IPV6		5
198 #define BNXT_GET_RSS_PROFILE_ID(rss_hash_type) ((rss_hash_type >> 1) & 0x1F)
199 
200 #define BNXT_NO_MORE_WOL_FILTERS	0xFFFF
201 #define bnxt_wol_supported(softc)	(!((softc)->flags & BNXT_FLAG_VF) && \
202 					  ((softc)->flags & BNXT_FLAG_WOL_CAP ))
203 /* 64-bit doorbell */
204 #define DBR_INDEX_MASK					0x0000000000ffffffULL
205 #define DBR_PI_LO_MASK					0xff000000UL
206 #define DBR_PI_LO_SFT					24
207 #define DBR_EPOCH_MASK					0x01000000UL
208 #define DBR_EPOCH_SFT					24
209 #define DBR_TOGGLE_MASK					0x06000000UL
210 #define DBR_TOGGLE_SFT					25
211 #define DBR_XID_MASK					0x000fffff00000000ULL
212 #define DBR_XID_SFT					32
213 #define DBR_PI_HI_MASK					0xf0000000000000ULL
214 #define DBR_PI_HI_SFT					52
215 #define DBR_PATH_L2					(0x1ULL << 56)
216 #define DBR_VALID					(0x1ULL << 58)
217 #define DBR_TYPE_SQ					(0x0ULL << 60)
218 #define DBR_TYPE_RQ					(0x1ULL << 60)
219 #define DBR_TYPE_SRQ					(0x2ULL << 60)
220 #define DBR_TYPE_SRQ_ARM				(0x3ULL << 60)
221 #define DBR_TYPE_CQ					(0x4ULL << 60)
222 #define DBR_TYPE_CQ_ARMSE				(0x5ULL << 60)
223 #define DBR_TYPE_CQ_ARMALL				(0x6ULL << 60)
224 #define DBR_TYPE_CQ_ARMENA				(0x7ULL << 60)
225 #define DBR_TYPE_SRQ_ARMENA				(0x8ULL << 60)
226 #define DBR_TYPE_CQ_CUTOFF_ACK				(0x9ULL << 60)
227 #define DBR_TYPE_NQ					(0xaULL << 60)
228 #define DBR_TYPE_NQ_ARM					(0xbULL << 60)
229 #define DBR_TYPE_PUSH_START				(0xcULL << 60)
230 #define DBR_TYPE_PUSH_END				(0xdULL << 60)
231 #define DBR_TYPE_NQ_MASK				(0xeULL << 60)
232 #define DBR_TYPE_NULL					(0xfULL << 60)
233 
234 #define BNXT_MAX_L2_QUEUES				128
235 #define BNXT_ROCE_IRQ_COUNT				9
236 
237 #define BNXT_MAX_NUM_QUEUES (BNXT_MAX_L2_QUEUES + BNXT_ROCE_IRQ_COUNT)
238 
239 /* Completion related defines */
240 #define CMP_VALID(cmp, v_bit) \
241 	((!!(((struct cmpl_base *)(cmp))->info3_v & htole32(CMPL_BASE_V))) == !!(v_bit) )
242 
243 /* Chip class phase 5 */
244 #define BNXT_CHIP_P5(sc) ((sc->flags & BNXT_FLAG_CHIP_P5))
245 
246 /* Chip class phase 7 */
247 #define BNXT_CHIP_P7(sc) ((sc->flags & BNXT_FLAG_CHIP_P7))
248 
249 /* Chip class phase 5 plus */
250 #define BNXT_CHIP_P5_PLUS(sc)                   \
251 	(BNXT_CHIP_P5(sc) || BNXT_CHIP_P7(sc))
252 
253 #define DB_PF_OFFSET_P5                                 0x10000
254 #define DB_VF_OFFSET_P5                                 0x4000
255 #define NQ_VALID(cmp, v_bit) \
256 	((!!(((nq_cn_t *)(cmp))->v & htole32(NQ_CN_V))) == !!(v_bit) )
257 
258 #ifndef DIV_ROUND_UP
259 #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
260 #endif
261 #ifndef roundup
262 #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
263 #endif
264 
265 #define NEXT_CP_CONS_V(ring, cons, v_bit) do {				    \
266 	if (__predict_false(++(cons) == (ring)->ring_size))		    \
267 		((cons) = 0, (v_bit) = !v_bit);				    \
268 } while (0)
269 
270 #define RING_NEXT(ring, idx) (__predict_false(idx + 1 == (ring)->ring_size) ? \
271 								0 : idx + 1)
272 
273 #define CMPL_PREFETCH_NEXT(cpr, idx)					    \
274 	__builtin_prefetch(&((struct cmpl_base *)(cpr)->ring.vaddr)[((idx) +\
275 	    (CACHE_LINE_SIZE / sizeof(struct cmpl_base))) &		    \
276 	    ((cpr)->ring.ring_size - 1)])
277 
278 /* Lock macros */
279 #define BNXT_HWRM_LOCK_INIT(_softc, _name) \
280     mtx_init(&(_softc)->hwrm_lock, _name, "BNXT HWRM Lock", MTX_DEF)
281 #define BNXT_HWRM_LOCK(_softc)		mtx_lock(&(_softc)->hwrm_lock)
282 #define BNXT_HWRM_UNLOCK(_softc)	mtx_unlock(&(_softc)->hwrm_lock)
283 #define BNXT_HWRM_LOCK_DESTROY(_softc)	mtx_destroy(&(_softc)->hwrm_lock)
284 #define BNXT_HWRM_LOCK_ASSERT(_softc)	mtx_assert(&(_softc)->hwrm_lock,    \
285     MA_OWNED)
286 #define BNXT_IS_FLOW_CTRL_CHANGED(link_info)				    \
287 	((link_info->last_flow_ctrl.tx != link_info->flow_ctrl.tx) ||       \
288          (link_info->last_flow_ctrl.rx != link_info->flow_ctrl.rx) ||       \
289 	 (link_info->last_flow_ctrl.autoneg != link_info->flow_ctrl.autoneg))
290 
291 /* Chip info */
292 #define BNXT_TSO_SIZE	UINT16_MAX
293 
294 #define min_t(type, x, y) ({                    \
295         type __min1 = (x);                      \
296         type __min2 = (y);                      \
297         __min1 < __min2 ? __min1 : __min2; })
298 
299 #define max_t(type, x, y) ({                    \
300         type __max1 = (x);                      \
301         type __max2 = (y);                      \
302         __max1 > __max2 ? __max1 : __max2; })
303 
304 #define clamp_t(type, _x, min, max)     min_t(type, max_t(type, _x, min), max)
305 
306 #define BNXT_IFMEDIA_ADD(supported, fw_speed, ifm_speed) do {			\
307 	if ((supported) & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_ ## fw_speed)	\
308 		ifmedia_add(softc->media, IFM_ETHER | (ifm_speed), 0, NULL);	\
309 } while(0)
310 
311 #define BNXT_MIN_FRAME_SIZE	52	/* Frames must be padded to this size for some A0 chips */
312 
313 #define BNXT_RX_STATS_EXT_OFFSET(counter)		\
314 	(offsetof(struct rx_port_stats_ext, counter) / 8)
315 
316 #define BNXT_RX_STATS_EXT_NUM_LEGACY			\
317 	BNXT_RX_STATS_EXT_OFFSET(rx_fec_corrected_blocks)
318 
319 #define BNXT_TX_STATS_EXT_OFFSET(counter)		\
320 	(offsetof(struct tx_port_stats_ext, counter) / 8)
321 
322 extern const char bnxt_driver_version[];
323 typedef void (*bnxt_doorbell_tx)(void *, uint16_t idx);
324 typedef void (*bnxt_doorbell_rx)(void *, uint16_t idx);
325 typedef void (*bnxt_doorbell_rx_cq)(void *, bool);
326 typedef void (*bnxt_doorbell_tx_cq)(void *, bool);
327 typedef void (*bnxt_doorbell_nq)(void *, bool);
328 
329 typedef struct bnxt_doorbell_ops {
330         bnxt_doorbell_tx bnxt_db_tx;
331         bnxt_doorbell_rx bnxt_db_rx;
332         bnxt_doorbell_rx_cq bnxt_db_rx_cq;
333         bnxt_doorbell_tx_cq bnxt_db_tx_cq;
334         bnxt_doorbell_nq bnxt_db_nq;
335 } bnxt_dooorbell_ops_t;
336 /* NVRAM access */
337 enum bnxt_nvm_directory_type {
338 	BNX_DIR_TYPE_UNUSED = 0,
339 	BNX_DIR_TYPE_PKG_LOG = 1,
340 	BNX_DIR_TYPE_UPDATE = 2,
341 	BNX_DIR_TYPE_CHIMP_PATCH = 3,
342 	BNX_DIR_TYPE_BOOTCODE = 4,
343 	BNX_DIR_TYPE_VPD = 5,
344 	BNX_DIR_TYPE_EXP_ROM_MBA = 6,
345 	BNX_DIR_TYPE_AVS = 7,
346 	BNX_DIR_TYPE_PCIE = 8,
347 	BNX_DIR_TYPE_PORT_MACRO = 9,
348 	BNX_DIR_TYPE_APE_FW = 10,
349 	BNX_DIR_TYPE_APE_PATCH = 11,
350 	BNX_DIR_TYPE_KONG_FW = 12,
351 	BNX_DIR_TYPE_KONG_PATCH = 13,
352 	BNX_DIR_TYPE_BONO_FW = 14,
353 	BNX_DIR_TYPE_BONO_PATCH = 15,
354 	BNX_DIR_TYPE_TANG_FW = 16,
355 	BNX_DIR_TYPE_TANG_PATCH = 17,
356 	BNX_DIR_TYPE_BOOTCODE_2 = 18,
357 	BNX_DIR_TYPE_CCM = 19,
358 	BNX_DIR_TYPE_PCI_CFG = 20,
359 	BNX_DIR_TYPE_TSCF_UCODE = 21,
360 	BNX_DIR_TYPE_ISCSI_BOOT = 22,
361 	BNX_DIR_TYPE_ISCSI_BOOT_IPV6 = 24,
362 	BNX_DIR_TYPE_ISCSI_BOOT_IPV4N6 = 25,
363 	BNX_DIR_TYPE_ISCSI_BOOT_CFG6 = 26,
364 	BNX_DIR_TYPE_EXT_PHY = 27,
365 	BNX_DIR_TYPE_SHARED_CFG = 40,
366 	BNX_DIR_TYPE_PORT_CFG = 41,
367 	BNX_DIR_TYPE_FUNC_CFG = 42,
368 	BNX_DIR_TYPE_MGMT_CFG = 48,
369 	BNX_DIR_TYPE_MGMT_DATA = 49,
370 	BNX_DIR_TYPE_MGMT_WEB_DATA = 50,
371 	BNX_DIR_TYPE_MGMT_WEB_META = 51,
372 	BNX_DIR_TYPE_MGMT_EVENT_LOG = 52,
373 	BNX_DIR_TYPE_MGMT_AUDIT_LOG = 53
374 };
375 
376 enum bnxnvm_pkglog_field_index {
377 	BNX_PKG_LOG_FIELD_IDX_INSTALLED_TIMESTAMP	= 0,
378 	BNX_PKG_LOG_FIELD_IDX_PKG_DESCRIPTION		= 1,
379 	BNX_PKG_LOG_FIELD_IDX_PKG_VERSION		= 2,
380 	BNX_PKG_LOG_FIELD_IDX_PKG_TIMESTAMP		= 3,
381 	BNX_PKG_LOG_FIELD_IDX_PKG_CHECKSUM		= 4,
382 	BNX_PKG_LOG_FIELD_IDX_INSTALLED_ITEMS		= 5,
383 	BNX_PKG_LOG_FIELD_IDX_INSTALLED_MASK		= 6
384 };
385 
386 #define BNX_DIR_ORDINAL_FIRST		0
387 #define BNX_DIR_EXT_NONE		0
388 
389 struct bnxt_bar_info {
390 	struct resource		*res;
391 	bus_space_tag_t		tag;
392 	bus_space_handle_t	handle;
393 	bus_size_t		size;
394 	int			rid;
395 };
396 
397 struct bnxt_flow_ctrl {
398 	bool rx;
399 	bool tx;
400 	bool autoneg;
401 };
402 
403 struct bnxt_link_info {
404 	uint8_t		media_type;
405 	uint8_t		transceiver;
406 	uint8_t		phy_addr;
407 	uint8_t		phy_link_status;
408 	uint8_t		wire_speed;
409 	uint8_t		loop_back;
410 	uint8_t		link_up;
411 	uint8_t		last_link_up;
412 	uint8_t		duplex;
413 	uint8_t		last_duplex;
414 	uint8_t		last_phy_type;
415 	struct bnxt_flow_ctrl   flow_ctrl;
416 	struct bnxt_flow_ctrl   last_flow_ctrl;
417 	uint8_t		duplex_setting;
418 	uint8_t		auto_mode;
419 #define PHY_VER_LEN		3
420 	uint8_t		phy_ver[PHY_VER_LEN];
421 	uint8_t		phy_type;
422 #define BNXT_PHY_STATE_ENABLED		0
423 #define BNXT_PHY_STATE_DISABLED		1
424 	uint8_t		phy_state;
425 
426 	uint16_t	link_speed;
427 	uint16_t	support_speeds;
428 	uint16_t	support_speeds2;
429 	uint16_t	support_pam4_speeds;
430 	uint16_t	auto_link_speeds;
431 	uint16_t	auto_link_speeds2;
432 	uint16_t	auto_pam4_link_speeds;
433 	uint16_t	force_link_speed;
434 	uint16_t	force_link_speeds2;
435 	uint16_t	force_pam4_link_speed;
436 
437 	bool		force_pam4_speed;
438 	bool		force_speed2_nrz;
439 	bool		force_pam4_56_speed2;
440 	bool		force_pam4_112_speed2;
441 
442 	uint16_t	advertising;
443 	uint16_t	advertising_pam4;
444 
445 	uint32_t	preemphasis;
446 	uint16_t	support_auto_speeds;
447 	uint16_t	support_force_speeds;
448 	uint16_t	support_pam4_auto_speeds;
449 	uint16_t	support_pam4_force_speeds;
450 	uint16_t	support_auto_speeds2;
451 	uint16_t	support_force_speeds2;
452 #define BNXT_SIG_MODE_NRZ	HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_NRZ
453 #define BNXT_SIG_MODE_PAM4	HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_PAM4
454 #define BNXT_SIG_MODE_PAM4_112 HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_PAM4_112
455 	uint8_t		req_signal_mode;
456 
457 	uint8_t		active_fec_sig_mode;
458 	uint8_t		sig_mode;
459 
460 	/* copy of requested setting */
461 	uint8_t		autoneg;
462 #define BNXT_AUTONEG_SPEED	1
463 #define BNXT_AUTONEG_FLOW_CTRL	2
464 	uint8_t		req_duplex;
465 	uint16_t	req_link_speed;
466 	uint8_t		module_status;
467 	struct hwrm_port_phy_qcfg_output    phy_qcfg_resp;
468 	uint8_t		active_lanes;
469 };
470 
471 #define BNXT_MAX_LED	4
472 
473 /* Layout of one LED capability record returned by HWRM_PORT_LED_QCAPS. */
474 struct bnxt_led_info {
475 	uint8_t		led_id;
476 	uint8_t		led_type;
477 	uint8_t		led_group_id;
478 	uint8_t		unused;
479 	uint16_t	led_state_caps;
480 	uint16_t	led_color_caps;
481 };
482 
483 enum bnxt_phy_type {
484 	BNXT_MEDIA_CR = 0,
485 	BNXT_MEDIA_LR,
486 	BNXT_MEDIA_SR,
487 	BNXT_MEDIA_ER,
488 	BNXT_MEDIA_KR,
489 	BNXT_MEDIA_AC,
490 	BNXT_MEDIA_BASECX,
491 	BNXT_MEDIA_BASET,
492 	BNXT_MEDIA_BASEKX,
493 	BNXT_MEDIA_BASESGMII,
494 	BNXT_MEDIA_END
495 };
496 
497 enum bnxt_cp_type {
498 	BNXT_DEFAULT,
499 	BNXT_TX,
500 	BNXT_RX,
501 	BNXT_SHARED
502 };
503 
504 struct bnxt_queue_info {
505 	uint8_t		queue_id;
506 	uint8_t		queue_profile;
507 };
508 
509 struct bnxt_func_info {
510 	uint32_t	fw_fid;
511 	uint8_t		mac_addr[ETHER_ADDR_LEN];
512 	uint16_t	max_rsscos_ctxs;
513 	uint16_t	max_cp_rings;
514 	uint16_t	max_tx_rings;
515 	uint16_t	max_rx_rings;
516 	uint16_t	max_hw_ring_grps;
517 	uint16_t	max_irqs;
518 	uint16_t	max_l2_ctxs;
519 	uint16_t	max_vnics;
520 	uint16_t	max_stat_ctxs;
521 };
522 
523 struct bnxt_pf_info {
524 #define BNXT_FIRST_PF_FID	1
525 #define BNXT_FIRST_VF_FID	128
526 	uint8_t		port_id;
527 	uint32_t	first_vf_id;
528 	uint16_t	active_vfs;
529 	uint16_t	registered_vfs;
530 	uint16_t	max_vfs;
531 	uint16_t	max_msix_vfs;
532 	uint32_t	max_encap_records;
533 	uint32_t	max_decap_records;
534 	uint32_t	max_tx_em_flows;
535 	uint32_t	max_tx_wm_flows;
536 	uint32_t	max_rx_em_flows;
537 	uint32_t	max_rx_wm_flows;
538 	unsigned long	*vf_event_bmap;
539 	uint16_t	hwrm_cmd_req_pages;
540 	void		*hwrm_cmd_req_addr[4];
541 	bus_addr_t	hwrm_cmd_req_dma_addr[4];
542 	uint16_t	fw_fid;
543 	uint8_t		mac_addr[ETHER_ADDR_LEN];
544 	uint8_t		vf_resv_strategy;
545 	uint8_t		num_vfs;
546 	struct		bnxt_vf_info *vf;
547 	uint16_t	vf_hwrm_cmd_req_page_shift;
548 	struct sysctl_ctx_list	sysctl_ctx;
549 	struct sysctl_oid	*sysctl_node;
550 };
551 
552 #define BNXT_PF(softc)		(!((softc)->flags & BNXT_FLAG_VF))
553 #define BNXT_VF(softc)		((softc)->flags & BNXT_FLAG_VF)
554 
555 struct bnxt_vlan_tag {
556 	SLIST_ENTRY(bnxt_vlan_tag) next;
557 	uint64_t	filter_id;
558 	uint16_t	tag;
559 };
560 
561 struct bnxt_vnic_info {
562 	uint16_t	id;
563 	uint16_t	def_ring_grp;
564 	uint16_t	cos_rule;
565 	uint16_t	lb_rule;
566 	uint16_t	mru;
567 
568 	uint32_t	rx_mask;
569 	struct iflib_dma_info mc_list;
570 	int		mc_list_count;
571 #define BNXT_MAX_MC_ADDRS		16
572 
573 	uint32_t	flags;
574 #define BNXT_VNIC_FLAG_DEFAULT		0x01
575 #define BNXT_VNIC_FLAG_BD_STALL		0x02
576 #define BNXT_VNIC_FLAG_VLAN_STRIP	0x04
577 
578 	uint64_t	filter_id;
579 
580 	uint16_t	rss_id;
581 	uint32_t	rss_hash_type;
582 	uint8_t		rss_hash_key[HW_HASH_KEY_SIZE];
583 	struct iflib_dma_info rss_hash_key_tbl;
584 	struct iflib_dma_info	rss_grp_tbl;
585 	SLIST_HEAD(vlan_head, bnxt_vlan_tag) vlan_tags;
586 	struct iflib_dma_info vlan_tag_list;
587 };
588 
589 struct bnxt_grp_info {
590 	uint16_t	stats_ctx;
591 	uint16_t	grp_id;
592 	uint16_t	rx_ring_id;
593 	uint16_t	cp_ring_id;
594 	uint16_t	ag_ring_id;
595 };
596 
597 #define	EPOCH_ARR_SZ	4096
598 
599 struct bnxt_ring {
600 	uint64_t		paddr;
601 	vm_offset_t		doorbell;
602 	caddr_t			vaddr;
603 	struct bnxt_softc	*softc;
604 	uint32_t		ring_size;	/* Must be a power of two */
605 	uint16_t		id;		/* Logical ID */
606 	uint16_t		phys_id;
607 	uint16_t		idx;
608 	struct bnxt_full_tpa_start *tpa_start;
609 	union {
610 		u64             db_key64;
611 		u32             db_key32;
612 	};
613 	uint32_t                db_ring_mask;
614 	uint32_t                db_epoch_mask;
615 	uint8_t                 db_epoch_shift;
616 
617 	uint64_t		epoch_arr[EPOCH_ARR_SZ];
618 	bool                    epoch_bit;
619 
620 };
621 
622 struct bnxt_cp_ring {
623 	struct bnxt_ring	ring;
624 	struct if_irq		irq;
625 	uint32_t		cons;
626 	uint32_t		raw_cons;
627 	bool			v_bit;		/* Value of valid bit */
628 	struct ctx_hw_stats	*stats;
629 	uint32_t		stats_ctx_id;
630 	uint32_t		last_idx;	/* Used by RX rings only
631 						 * set to the last read pidx
632 						 */
633 	uint64_t 		int_count;
634 	uint8_t			toggle;
635 	uint8_t			type;
636 #define Q_TYPE_TX		1
637 #define Q_TYPE_RX		2
638 };
639 
640 struct bnxt_full_tpa_start {
641 	struct rx_tpa_start_cmpl low;
642 	struct rx_tpa_start_cmpl_hi high;
643 };
644 
645 /* All the version information for the part */
646 #define BNXT_VERSTR_SIZE	(3*3+2+1)	/* ie: "255.255.255\0" */
647 #define BNXT_NAME_SIZE		17
648 #define FW_VER_STR_LEN          32
649 #define BC_HWRM_STR_LEN         21
650 struct bnxt_ver_info {
651 	uint8_t		hwrm_if_major;
652 	uint8_t		hwrm_if_minor;
653 	uint8_t		hwrm_if_update;
654 	char		hwrm_if_ver[BNXT_VERSTR_SIZE];
655 	char		driver_hwrm_if_ver[BNXT_VERSTR_SIZE];
656 	char		mgmt_fw_ver[FW_VER_STR_LEN];
657 	char		netctrl_fw_ver[FW_VER_STR_LEN];
658 	char		roce_fw_ver[FW_VER_STR_LEN];
659 	char		fw_ver_str[FW_VER_STR_LEN];
660 	char		phy_ver[BNXT_VERSTR_SIZE];
661 	char		pkg_ver[64];
662 
663 	char		hwrm_fw_name[BNXT_NAME_SIZE];
664 	char		mgmt_fw_name[BNXT_NAME_SIZE];
665 	char		netctrl_fw_name[BNXT_NAME_SIZE];
666 	char		roce_fw_name[BNXT_NAME_SIZE];
667 	char		phy_vendor[BNXT_NAME_SIZE];
668 	char		phy_partnumber[BNXT_NAME_SIZE];
669 
670 	uint16_t	chip_num;
671 	uint8_t		chip_rev;
672 	uint8_t		chip_metal;
673 	uint8_t		chip_bond_id;
674 	uint8_t		chip_type;
675 
676 	uint8_t		hwrm_min_major;
677 	uint8_t		hwrm_min_minor;
678 	uint8_t		hwrm_min_update;
679 	uint64_t	fw_ver_code;
680 #define BNXT_FW_VER_CODE(maj, min, bld, rsv)			\
681 	((uint64_t)(maj) << 48 | (uint64_t)(min) << 32 | (uint64_t)(bld) << 16 | (rsv))
682 #define BNXT_FW_MAJ(softc)	((softc)->ver_info->fw_ver_code >> 48)
683 #define BNXT_FW_MIN(softc)	(((softc)->ver_info->fw_ver_code >> 32) & 0xffff)
684 #define BNXT_FW_BLD(softc)	(((softc)->ver_info->fw_ver_code >> 16) & 0xffff)
685 #define BNXT_FW_RSV(softc)	(((softc)->ver_info->fw_ver_code) & 0xffff)
686 
687 	struct sysctl_ctx_list	ver_ctx;
688 	struct sysctl_oid	*ver_oid;
689 };
690 
691 struct bnxt_nvram_info {
692 	uint16_t	mfg_id;
693 	uint16_t	device_id;
694 	uint32_t	sector_size;
695 	uint32_t	size;
696 	uint32_t	reserved_size;
697 	uint32_t	available_size;
698 
699 	struct sysctl_ctx_list	nvm_ctx;
700 	struct sysctl_oid	*nvm_oid;
701 };
702 
703 struct bnxt_func_qcfg {
704 	uint16_t alloc_completion_rings;
705 	uint16_t alloc_tx_rings;
706 	uint16_t alloc_rx_rings;
707 	uint16_t alloc_vnics;
708 	uint16_t alloc_rss_ctx;
709 	uint16_t alloc_l2_ctx;
710 	uint16_t alloc_vfs;
711 	uint16_t alloc_hw_ring_grps;
712 	uint16_t alloc_stat_ctx;
713 	uint16_t alloc_msix;
714 };
715 
716 struct bnxt_hw_lro {
717 	uint16_t enable;
718 	uint16_t is_mode_gro;
719 	uint16_t max_agg_segs;
720 	uint16_t max_aggs;
721 	uint32_t min_agg_len;
722 };
723 
724 /* The hardware supports certain page sizes.  Use the supported page sizes
725  * to allocate the rings.
726  */
727 #if (PAGE_SHIFT < 12)
728 #define BNXT_PAGE_SHIFT 12
729 #elif (PAGE_SHIFT <= 13)
730 #define BNXT_PAGE_SHIFT PAGE_SHIFT
731 #elif (PAGE_SHIFT < 16)
732 #define BNXT_PAGE_SHIFT 13
733 #else
734 #define BNXT_PAGE_SHIFT 16
735 #endif
736 
737 #define BNXT_PAGE_SIZE  (1 << BNXT_PAGE_SHIFT)
738 
739 #define MAX_CTX_PAGES	(BNXT_PAGE_SIZE / 8)
740 #define MAX_CTX_TOTAL_PAGES	(MAX_CTX_PAGES * MAX_CTX_PAGES)
741 
742 struct bnxt_ring_mem_info {
743 	int			nr_pages;
744 	int			page_size;
745 	uint16_t		flags;
746 #define BNXT_RMEM_VALID_PTE_FLAG        1
747 #define BNXT_RMEM_RING_PTE_FLAG         2
748 #define BNXT_RMEM_USE_FULL_PAGE_FLAG    4
749 	uint16_t		depth;
750 	struct bnxt_ctx_mem_type	*ctx_mem;
751 
752 	struct iflib_dma_info	*pg_arr;
753 	struct iflib_dma_info	pg_tbl;
754 
755 	int			vmem_size;
756 	void			**vmem;
757 };
758 
759 struct bnxt_ctx_pg_info {
760 	uint32_t		entries;
761 	uint32_t		nr_pages;
762 	struct iflib_dma_info   ctx_arr[MAX_CTX_PAGES];
763 	struct bnxt_ring_mem_info ring_mem;
764 	struct bnxt_ctx_pg_info **ctx_pg_tbl;
765 };
766 
767 #define BNXT_MAX_TQM_SP_RINGS		1
768 #define BNXT_MAX_TQM_FP_LEGACY_RINGS	8
769 #define BNXT_MAX_TQM_FP_RINGS		9
770 #define BNXT_MAX_TQM_LEGACY_RINGS	\
771 	(BNXT_MAX_TQM_SP_RINGS + BNXT_MAX_TQM_FP_LEGACY_RINGS)
772 #define BNXT_MAX_TQM_RINGS		\
773 	(BNXT_MAX_TQM_SP_RINGS + BNXT_MAX_TQM_FP_RINGS)
774 
775 #define BNXT_BACKING_STORE_CFG_LEGACY_LEN	256
776 #define BNXT_BACKING_STORE_CFG_LEN		\
777 	sizeof(struct hwrm_func_backing_store_cfg_input)
778 
779 #define BNXT_SET_CTX_PAGE_ATTR(attr)					\
780 do {									\
781 	if (BNXT_PAGE_SIZE == 0x2000)					\
782 		attr = HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_PG_8K;	\
783 	else if (BNXT_PAGE_SIZE == 0x10000)				\
784 		attr = HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_PG_64K;	\
785 	else								\
786 		attr = HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_PG_4K;	\
787 } while (0)
788 
789 struct bnxt_ctx_mem_type {
790 	u16	type;
791 	u16	entry_size;
792 	u32	flags;
793 #define BNXT_CTX_MEM_TYPE_VALID HWRM_FUNC_BACKING_STORE_QCAPS_V2_OUTPUT_FLAGS_TYPE_VALID
794 	u32	instance_bmap;
795 	u8	init_value;
796 	u8	entry_multiple;
797 	u16	init_offset;
798 #define	BNXT_CTX_INIT_INVALID_OFFSET	0xffff
799 	u32	max_entries;
800 	u32	min_entries;
801 	u8	last:1;
802 	u8	mem_valid:1;
803 	u8	split_entry_cnt;
804 #define BNXT_MAX_SPLIT_ENTRY	4
805 	union {
806 		struct {
807 			u32	qp_l2_entries;
808 			u32	qp_qp1_entries;
809 		};
810 		u32	srq_l2_entries;
811 		u32	cq_l2_entries;
812 		u32	vnic_entries;
813 		struct {
814 			u32	mrav_av_entries;
815 			u32	mrav_num_entries_units;
816 		};
817 		u32	split[BNXT_MAX_SPLIT_ENTRY];
818 	};
819 	struct bnxt_ctx_pg_info	*pg_info;
820 };
821 
822 #define BNXT_CTX_QP	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_QP
823 #define BNXT_CTX_SRQ	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_SRQ
824 #define BNXT_CTX_CQ	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_CQ
825 #define BNXT_CTX_VNIC	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_VNIC
826 #define BNXT_CTX_STAT	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_STAT
827 #define BNXT_CTX_STQM	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_SP_TQM_RING
828 #define BNXT_CTX_FTQM	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_FP_TQM_RING
829 #define BNXT_CTX_MRAV	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_MRAV
830 #define BNXT_CTX_TIM	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_TIM
831 #define BNXT_CTX_TKC	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_TKC
832 #define BNXT_CTX_RKC	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_RKC
833 #define BNXT_CTX_MTQM	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_MP_TQM_RING
834 #define BNXT_CTX_SQDBS	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_SQ_DB_SHADOW
835 #define BNXT_CTX_RQDBS	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_RQ_DB_SHADOW
836 #define BNXT_CTX_SRQDBS	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_SRQ_DB_SHADOW
837 #define BNXT_CTX_CQDBS	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_CQ_DB_SHADOW
838 #define BNXT_CTX_QTKC	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_QUIC_TKC
839 #define BNXT_CTX_QRKC	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_QUIC_RKC
840 #define BNXT_CTX_MAX	(BNXT_CTX_TIM + 1)
841 #define BNXT_CTX_L2_MAX (BNXT_CTX_FTQM + 1)
842 
843 #define BNXT_CTX_V2_MAX (HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_ROCE_HWRM_TRACE + 1)
844 
845 #define BNXT_CTX_SRT_TRACE	\
846 	HWRM_FUNC_BACKING_STORE_QCFG_V2_OUTPUT_TYPE_SRT_TRACE
847 
848 #define BNXT_CTX_SRT2_TRACE	\
849 	HWRM_FUNC_BACKING_STORE_QCFG_V2_OUTPUT_TYPE_SRT2_TRACE
850 
851 #define BNXT_CTX_CRT_TRACE	\
852 	HWRM_FUNC_BACKING_STORE_QCFG_V2_OUTPUT_TYPE_CRT_TRACE
853 
854 #define BNXT_CTX_CRT2_TRACE	\
855 	HWRM_FUNC_BACKING_STORE_QCFG_V2_OUTPUT_TYPE_CRT2_TRACE
856 
857 #define BNXT_CTX_RIGP0_TRACE	\
858 	HWRM_FUNC_BACKING_STORE_QCFG_V2_OUTPUT_TYPE_RIGP0_TRACE
859 
860 #define BNXT_CTX_L2_HWRM_TRACE	\
861 	HWRM_FUNC_BACKING_STORE_QCFG_V2_OUTPUT_TYPE_L2_HWRM_TRACE
862 
863 #define BNXT_CTX_ROCE_HWRM_TRACE \
864 	HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_TYPE_ROCE_HWRM_TRACE
865 
866 #define BNXT_CTX_INV	((u16)-1)
867 
868 #define BNXT_CTX_TRACE_BUF_COUNT	\
869 	(BNXT_CTX_ROCE_HWRM_TRACE - BNXT_CTX_SRT_TRACE + 1)
870 
871 
872 struct bnxt_ctx_mem_info {
873 	u8	tqm_fp_rings_count;
874 
875 	u32	flags;
876 	#define BNXT_CTX_FLAG_INITED	0x01
877 	struct bnxt_ctx_mem_type	ctx_arr[BNXT_CTX_V2_MAX];
878 };
879 
880 struct bnxt_hw_resc {
881 	uint16_t	min_rsscos_ctxs;
882 	uint16_t	max_rsscos_ctxs;
883 	uint16_t	min_cp_rings;
884 	uint16_t	max_cp_rings;
885 	uint16_t	resv_cp_rings;
886 	uint16_t	min_tx_rings;
887 	uint16_t	max_tx_rings;
888 	uint16_t	resv_tx_rings;
889 	uint16_t	max_tx_sch_inputs;
890 	uint16_t	min_rx_rings;
891 	uint16_t	max_rx_rings;
892 	uint16_t	resv_rx_rings;
893 	uint16_t	min_hw_ring_grps;
894 	uint16_t	max_hw_ring_grps;
895 	uint16_t	resv_hw_ring_grps;
896 	uint16_t	min_l2_ctxs;
897 	uint16_t	max_l2_ctxs;
898 	uint16_t	min_vnics;
899 	uint16_t	max_vnics;
900 	uint16_t	resv_vnics;
901 	uint16_t	min_stat_ctxs;
902 	uint16_t	max_stat_ctxs;
903 	uint16_t	resv_stat_ctxs;
904 	uint16_t	max_nqs;
905 	uint16_t	max_irqs;
906 	uint16_t	resv_irqs;
907 };
908 
909 enum bnxt_type_ets {
910 	BNXT_TYPE_ETS_TSA = 0,
911 	BNXT_TYPE_ETS_PRI2TC,
912 	BNXT_TYPE_ETS_TCBW,
913 	BNXT_TYPE_ETS_MAX
914 };
915 
916 static const char *const BNXT_ETS_TYPE_STR[] = {
917 	"tsa",
918 	"pri2tc",
919 	"tcbw",
920 };
921 
922 static const char *const BNXT_ETS_HELP_STR[] = {
923 	"X is 1 (strict),  0 (ets)",
924 	"TC values for pri 0 to 7",
925 	"TC BW values for pri 0 to 7, Sum should be 100",
926 };
927 
928 #define BNXT_HWRM_MAX_REQ_LEN		(softc->hwrm_max_req_len)
929 
930 struct bnxt_softc_list {
931 	SLIST_ENTRY(bnxt_softc_list) next;
932 	struct bnxt_softc *softc;
933 };
934 
935 #ifndef BIT_ULL
936 #define BIT_ULL(nr)		(1ULL << (nr))
937 #endif
938 
939 struct bnxt_aux_dev {
940 	struct auxiliary_device aux_dev;
941 	struct bnxt_en_dev *edev;
942 	int id;
943 };
944 
945 struct bnxt_msix_tbl {
946 	uint32_t entry;
947 	uint32_t vector;
948 };
949 
950 enum bnxt_health_severity {
951 	SEVERITY_NORMAL = 0,
952 	SEVERITY_WARNING,
953 	SEVERITY_RECOVERABLE,
954 	SEVERITY_FATAL,
955 };
956 
957 enum bnxt_health_remedy {
958 	REMEDY_DEVLINK_RECOVER,
959 	REMEDY_POWER_CYCLE_DEVICE,
960 	REMEDY_POWER_CYCLE_HOST,
961 	REMEDY_FW_UPDATE,
962 	REMEDY_HW_REPLACE,
963 };
964 
965 struct bnxt_fw_health {
966 	u32 flags;
967 	u32 polling_dsecs;
968 	u32 master_func_wait_dsecs;
969 	u32 normal_func_wait_dsecs;
970 	u32 post_reset_wait_dsecs;
971 	u32 post_reset_max_wait_dsecs;
972 	u32 regs[4];
973 	u32 mapped_regs[4];
974 #define BNXT_FW_HEALTH_REG		0
975 #define BNXT_FW_HEARTBEAT_REG		1
976 #define BNXT_FW_RESET_CNT_REG		2
977 #define BNXT_FW_RESET_INPROG_REG	3
978 	u32 fw_reset_inprog_reg_mask;
979 	u32 last_fw_heartbeat;
980 	u32 last_fw_reset_cnt;
981 	u8 enabled:1;
982 	u8 primary:1;
983 	u8 status_reliable:1;
984 	u8 resets_reliable:1;
985 	u8 tmr_multiplier;
986 	u8 tmr_counter;
987 	u8 fw_reset_seq_cnt;
988 	u32 fw_reset_seq_regs[16];
989 	u32 fw_reset_seq_vals[16];
990 	u32 fw_reset_seq_delay_msec[16];
991 	u32 echo_req_data1;
992 	u32 echo_req_data2;
993 	struct devlink_health_reporter	*fw_reporter;
994 	struct mutex lock;
995 	enum bnxt_health_severity severity;
996 	enum bnxt_health_remedy remedy;
997 	u32 arrests;
998 	u32 discoveries;
999 	u32 survivals;
1000 	u32 fatalities;
1001 	u32 diagnoses;
1002 };
1003 
1004 #define BNXT_FW_HEALTH_REG_TYPE_MASK	3
1005 #define BNXT_FW_HEALTH_REG_TYPE_CFG	0
1006 #define BNXT_FW_HEALTH_REG_TYPE_GRC	1
1007 #define BNXT_FW_HEALTH_REG_TYPE_BAR0	2
1008 #define BNXT_FW_HEALTH_REG_TYPE_BAR1	3
1009 
1010 #define BNXT_FW_HEALTH_REG_TYPE(reg)	((reg) & BNXT_FW_HEALTH_REG_TYPE_MASK)
1011 #define BNXT_FW_HEALTH_REG_OFF(reg)	((reg) & ~BNXT_FW_HEALTH_REG_TYPE_MASK)
1012 
1013 #define BNXT_FW_HEALTH_WIN_BASE		0x3000
1014 #define BNXT_FW_HEALTH_WIN_MAP_OFF	8
1015 
1016 #define BNXT_FW_HEALTH_WIN_OFF(reg)	(BNXT_FW_HEALTH_WIN_BASE +	\
1017 					 ((reg) & BNXT_GRC_OFFSET_MASK))
1018 
1019 #define BNXT_FW_STATUS_HEALTH_MSK	0xffff
1020 #define BNXT_FW_STATUS_HEALTHY		0x8000
1021 #define BNXT_FW_STATUS_SHUTDOWN		0x100000
1022 #define BNXT_FW_STATUS_RECOVERING	0x400000
1023 
1024 #define BNXT_FW_IS_HEALTHY(sts)		(((sts) & BNXT_FW_STATUS_HEALTH_MSK) ==\
1025 					 BNXT_FW_STATUS_HEALTHY)
1026 
1027 #define BNXT_FW_IS_BOOTING(sts)		(((sts) & BNXT_FW_STATUS_HEALTH_MSK) < \
1028 					 BNXT_FW_STATUS_HEALTHY)
1029 
1030 #define BNXT_FW_IS_ERR(sts)		(((sts) & BNXT_FW_STATUS_HEALTH_MSK) > \
1031 					 BNXT_FW_STATUS_HEALTHY)
1032 
1033 #define BNXT_FW_IS_RECOVERING(sts)	(BNXT_FW_IS_ERR(sts) &&		       \
1034 					 ((sts) & BNXT_FW_STATUS_RECOVERING))
1035 
1036 #define BNXT_FW_RETRY			5
1037 #define BNXT_FW_IF_RETRY		10
1038 #define BNXT_FW_SLOT_RESET_RETRY	4
1039 
1040 #define BNXT_GRCPF_REG_CHIMP_COMM		0x0
1041 #define BNXT_GRCPF_REG_CHIMP_COMM_TRIGGER	0x100
1042 #define BNXT_GRCPF_REG_WINDOW_BASE_OUT		0x400
1043 #define BNXT_GRCPF_REG_SYNC_TIME		0x480
1044 #define BNXT_GRCPF_REG_SYNC_TIME_ADJ		0x488
1045 #define BNXT_GRCPF_REG_SYNC_TIME_ADJ_PER_MSK	0xffffffUL
1046 #define BNXT_GRCPF_REG_SYNC_TIME_ADJ_PER_SFT	0
1047 #define BNXT_GRCPF_REG_SYNC_TIME_ADJ_VAL_MSK	0x1f000000UL
1048 #define BNXT_GRCPF_REG_SYNC_TIME_ADJ_VAL_SFT	24
1049 #define BNXT_GRCPF_REG_SYNC_TIME_ADJ_SIGN_MSK	0x20000000UL
1050 #define BNXT_GRCPF_REG_SYNC_TIME_ADJ_SIGN_SFT	29
1051 
1052 #define BNXT_GRC_REG_STATUS_P5			0x520
1053 
1054 #define BNXT_GRCPF_REG_KONG_COMM		0xA00
1055 #define BNXT_GRCPF_REG_KONG_COMM_TRIGGER	0xB00
1056 
1057 #define BNXT_CAG_REG_LEGACY_INT_STATUS		0x4014
1058 #define BNXT_CAG_REG_BASE			0x300000
1059 
1060 #define BNXT_GRC_REG_CHIP_NUM			0x48
1061 #define BNXT_GRC_REG_BASE			0x260000
1062 
1063 #define BNXT_TS_REG_TIMESYNC_TS0_LOWER		0x640180c
1064 #define BNXT_TS_REG_TIMESYNC_TS0_UPPER		0x6401810
1065 
1066 #define BNXT_GRC_BASE_MASK			0xfffff000
1067 #define BNXT_GRC_OFFSET_MASK			0x00000ffc
1068 
1069 #define NQE_CN_TYPE(type)	((type) & NQ_CN_TYPE_MASK)
1070 #define NQE_CN_TOGGLE(type)	(((type) & NQ_CN_TOGGLE_MASK) >>        \
1071 				 NQ_CN_TOGGLE_SFT)
1072 
1073 #define DB_EPOCH(ring, idx)	(((idx) & (ring)->db_epoch_mask) <<       \
1074 				 ((ring)->db_epoch_shift))
1075 
1076 #define DB_TOGGLE(tgl)		((tgl) << DBR_TOGGLE_SFT)
1077 
1078 #define DB_RING_IDX_CMP(ring, idx)    (((idx) & (ring)->db_ring_mask) |         \
1079 				       DB_EPOCH(ring, idx))
1080 
1081 #define DB_RING_IDX(ring, idx, bit)    (((idx) & (ring)->db_ring_mask) | \
1082                                        ((bit) << (24)))
1083 
1084 struct bnxt_bs_trace_info {
1085         u8 *magic_byte;
1086 #define BNXT_TRACE_BUF_MAGIC_BYTE ((uint8_t)0xBC)
1087         u32 last_offset;
1088         u8 wrapped:1;
1089         u16 ctx_type;
1090         u16 trace_type;
1091 };
1092 
1093 struct bnxt_logger;
1094 
1095 struct bnxt_softc {
1096 	device_t	dev;
1097 	if_ctx_t	ctx;
1098 	if_softc_ctx_t	scctx;
1099 	if_shared_ctx_t	sctx;
1100 	if_t ifp;
1101 	uint32_t	domain;
1102 	uint32_t	bus;
1103 	uint32_t	slot;
1104 	uint32_t	function;
1105 	uint32_t	dev_fn;
1106 	struct ifmedia	*media;
1107 	struct bnxt_ctx_mem_info *ctx_mem;
1108 	struct bnxt_hw_resc hw_resc;
1109 	struct bnxt_softc_list list;
1110 
1111 	struct bnxt_bar_info	hwrm_bar;
1112 	struct bnxt_bar_info	doorbell_bar;
1113 	struct bnxt_link_info	link_info;
1114 	struct bnxt_led_info	leds[BNXT_MAX_LED];
1115 	uint8_t			num_leds;
1116 	bool			led_active;
1117 #define BNXT_FLAG_VF				0x0001
1118 #define BNXT_FLAG_NPAR				0x0002
1119 #define BNXT_FLAG_WOL_CAP			0x0004
1120 #define BNXT_FLAG_SHORT_CMD			0x0008
1121 #define BNXT_FLAG_FW_CAP_NEW_RM			0x0010
1122 #define BNXT_FLAG_CHIP_P5			0x0020
1123 #define BNXT_FLAG_TPA				0x0040
1124 #define BNXT_FLAG_FW_CAP_EXT_STATS		0x0080
1125 #define BNXT_FLAG_MULTI_HOST			0x0100
1126 #define BNXT_FLAG_MULTI_ROOT			0x0200
1127 #define BNXT_FLAG_ROCEV1_CAP			0x0400
1128 #define BNXT_FLAG_ROCEV2_CAP			0x0800
1129 #define BNXT_FLAG_ROCE_CAP			(BNXT_FLAG_ROCEV1_CAP | BNXT_FLAG_ROCEV2_CAP)
1130 #define BNXT_FLAG_CHIP_P7			0x1000
1131 	uint32_t		flags;
1132 #define BNXT_STATE_LINK_CHANGE  (0)
1133 #define BNXT_STATE_MAX		(BNXT_STATE_LINK_CHANGE + 1)
1134 	bitstr_t 		*state_bv;
1135 
1136 	uint32_t		total_irqs;
1137 	struct bnxt_msix_tbl	*irq_tbl;
1138 
1139 	struct bnxt_func_info	func;
1140 	struct bnxt_func_qcfg	fn_qcfg;
1141 	struct bnxt_pf_info	pf;
1142 	struct bnxt_vf_info	vf;
1143 	struct hwrm_func_vf_resource_cfg_input vf_resc_cfg_input;
1144 
1145 	uint16_t		hwrm_cmd_seq;
1146 	uint32_t		hwrm_cmd_timeo;	/* milliseconds */
1147 
1148 	/* DDR Crash Dump Support */
1149 	struct bnxt_ctx_pg_info *fw_crash_mem;
1150 	uint32_t fw_crash_len;
1151 	uint32_t fw_dbg_cap;
1152 	#define BNXT_FW_DBG_CAP_CRASHDUMP_SOC		0x00000001
1153 	#define BNXT_FW_DBG_CAP_CRASHDUMP_HOST		0x00000002
1154 	uint16_t dump_flag;
1155 	#define BNXT_DUMP_LIVE                    0
1156 	#define BNXT_DUMP_CRASH                   1
1157 	#define BNXT_DUMP_DRIVER                  2
1158 	#define BNXT_DUMP_LIVE_WITH_CTX_L1_CACHE  3
1159 	struct iflib_dma_info	hwrm_cmd_resp;
1160 	struct iflib_dma_info	hwrm_short_cmd_req_addr;
1161 	/* Interrupt info for HWRM */
1162 	struct if_irq		irq;
1163 	struct mtx		hwrm_lock;
1164 	struct mtx		sriov_lock;
1165 	uint16_t		hwrm_max_req_len;
1166 	uint16_t		hwrm_max_ext_req_len;
1167 	uint32_t		hwrm_spec_code;
1168 
1169 #define BNXT_MAX_QUEUE	8
1170 	uint8_t			max_tc;
1171 	uint8_t			max_lltc;
1172 	struct bnxt_queue_info  tx_q_info[BNXT_MAX_QUEUE];
1173 	struct bnxt_queue_info  rx_q_info[BNXT_MAX_QUEUE];
1174 	uint8_t			tc_to_qidx[BNXT_MAX_QUEUE];
1175 	uint8_t			tx_q_ids[BNXT_MAX_QUEUE];
1176 	uint8_t			rx_q_ids[BNXT_MAX_QUEUE];
1177 	uint8_t			tx_max_q;
1178 	uint8_t			rx_max_q;
1179 	uint8_t			is_asym_q;
1180 
1181 	struct bnxt_ieee_ets	*ieee_ets;
1182 	struct bnxt_ieee_pfc    *ieee_pfc;
1183 	uint8_t			dcbx_cap;
1184 	uint8_t			default_pri;
1185 	uint8_t			max_dscp_value;
1186 
1187 	uint64_t		admin_ticks;
1188 	struct iflib_dma_info	hw_rx_port_stats;
1189 	struct iflib_dma_info	hw_tx_port_stats;
1190 	struct rx_port_stats	*rx_port_stats;
1191 	struct tx_port_stats	*tx_port_stats;
1192 
1193 	struct iflib_dma_info	hw_tx_port_stats_ext;
1194 	struct iflib_dma_info	hw_rx_port_stats_ext;
1195 	struct tx_port_stats_ext *tx_port_stats_ext;
1196 	struct rx_port_stats_ext *rx_port_stats_ext;
1197 
1198 	uint16_t		fw_rx_stats_ext_size;
1199 	uint16_t		fw_tx_stats_ext_size;
1200 	uint16_t		hw_ring_stats_size;
1201 
1202 	uint8_t			tx_pri2cos_idx[8];
1203 	uint8_t			rx_pri2cos_idx[8];
1204 	bool			pri2cos_valid;
1205 
1206 	uint64_t		tx_bytes_pri[8];
1207 	uint64_t		tx_packets_pri[8];
1208 	uint64_t		rx_bytes_pri[8];
1209 	uint64_t		rx_packets_pri[8];
1210 
1211 	uint8_t			port_count;
1212 	int			num_cp_rings;
1213 
1214 	struct bnxt_cp_ring	*nq_rings;
1215 
1216 	struct bnxt_ring	*tx_rings;
1217 	struct bnxt_cp_ring	*tx_cp_rings;
1218 	struct iflib_dma_info	tx_stats[BNXT_MAX_NUM_QUEUES];
1219 	int			ntxqsets;
1220 
1221 	struct bnxt_vnic_info	vnic_info;
1222 	struct bnxt_ring	*ag_rings;
1223 	struct bnxt_ring	*rx_rings;
1224 	struct bnxt_cp_ring	*rx_cp_rings;
1225 	struct bnxt_grp_info	*grp_info;
1226 	struct iflib_dma_info	rx_stats[BNXT_MAX_NUM_QUEUES];
1227 	int			nrxqsets;
1228 	uint16_t		rx_buf_size;
1229 
1230 	struct bnxt_cp_ring	def_cp_ring;
1231 	struct bnxt_cp_ring	def_nq_ring;
1232 	struct iflib_dma_info	def_cp_ring_mem;
1233 	struct iflib_dma_info	def_nq_ring_mem;
1234 	struct task		def_cp_task;
1235 	int			db_size;
1236 	int			db_offset;
1237 	int			legacy_db_size;
1238 	struct bnxt_doorbell_ops db_ops;
1239 
1240 	struct sysctl_ctx_list	hw_stats;
1241 	struct sysctl_oid	*hw_stats_oid;
1242 	struct sysctl_ctx_list	hw_lro_ctx;
1243 	struct sysctl_oid	*hw_lro_oid;
1244 	struct sysctl_ctx_list	flow_ctrl_ctx;
1245 	struct sysctl_oid	*flow_ctrl_oid;
1246 	struct sysctl_ctx_list	dcb_ctx;
1247 	struct sysctl_oid	*dcb_oid;
1248 
1249 	struct bnxt_ver_info	*ver_info;
1250 	struct hwrm_ver_get_output      ver_resp;
1251 	struct bnxt_nvram_info	*nvm_info;
1252 	bool wol;
1253 	bool is_dev_init;
1254 	struct bnxt_hw_lro	hw_lro;
1255 	uint8_t wol_filter_id;
1256 	uint16_t		rx_coal_usecs;
1257 	uint16_t		rx_coal_usecs_irq;
1258 	uint16_t               	rx_coal_frames;
1259 	uint16_t               	rx_coal_frames_irq;
1260 	uint16_t               	tx_coal_usecs;
1261 	uint16_t               	tx_coal_usecs_irq;
1262 	uint16_t               	tx_coal_frames;
1263 	uint16_t		tx_coal_frames_irq;
1264 
1265 #define BNXT_USEC_TO_COAL_TIMER(x)      ((x) * 25 / 2)
1266 #define BNXT_DEF_STATS_COAL_TICKS        1000000
1267 #define BNXT_MIN_STATS_COAL_TICKS         250000
1268 #define BNXT_MAX_STATS_COAL_TICKS        1000000
1269 
1270 	uint64_t		fw_cap;
1271 	#define BNXT_FW_CAP_SHORT_CMD			BIT_ULL(0)
1272 	#define BNXT_FW_CAP_LLDP_AGENT			BIT_ULL(1)
1273 	#define BNXT_FW_CAP_DCBX_AGENT			BIT_ULL(2)
1274 	#define BNXT_FW_CAP_NEW_RM			BIT_ULL(3)
1275 	#define BNXT_FW_CAP_IF_CHANGE			BIT_ULL(4)
1276 	#define BNXT_FW_CAP_LINK_ADMIN			BIT_ULL(5)
1277 	#define BNXT_FW_CAP_VF_RES_MIN_GUARANTEED	BIT_ULL(6)
1278 	#define BNXT_FW_CAP_KONG_MB_CHNL		BIT_ULL(7)
1279 	#define BNXT_FW_CAP_ADMIN_MTU			BIT_ULL(8)
1280 	#define BNXT_FW_CAP_ADMIN_PF			BIT_ULL(9)
1281 	#define BNXT_FW_CAP_OVS_64BIT_HANDLE		BIT_ULL(10)
1282 	#define BNXT_FW_CAP_TRUSTED_VF			BIT_ULL(11)
1283 	#define BNXT_FW_CAP_VF_VNIC_NOTIFY		BIT_ULL(12)
1284 	#define BNXT_FW_CAP_ERROR_RECOVERY		BIT_ULL(13)
1285 	#define BNXT_FW_CAP_PKG_VER			BIT_ULL(14)
1286 	#define BNXT_FW_CAP_CFA_ADV_FLOW		BIT_ULL(15)
1287 	#define BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V2	BIT_ULL(16)
1288 	#define BNXT_FW_CAP_PCIE_STATS_SUPPORTED	BIT_ULL(17)
1289 	#define BNXT_FW_CAP_EXT_STATS_SUPPORTED		BIT_ULL(18)
1290 	#define BNXT_FW_CAP_SECURE_MODE			BIT_ULL(19)
1291 	#define BNXT_FW_CAP_ERR_RECOVER_RELOAD		BIT_ULL(20)
1292 	#define BNXT_FW_CAP_HOT_RESET			BIT_ULL(21)
1293 	#define BNXT_FW_CAP_CRASHDUMP			BIT_ULL(23)
1294 	#define BNXT_FW_CAP_VLAN_RX_STRIP		BIT_ULL(24)
1295 	#define BNXT_FW_CAP_VLAN_TX_INSERT		BIT_ULL(25)
1296 	#define BNXT_FW_CAP_EXT_HW_STATS_SUPPORTED	BIT_ULL(26)
1297 	#define BNXT_FW_CAP_CFA_EEM			BIT_ULL(27)
1298 	#define BNXT_FW_CAP_DBG_QCAPS			BIT_ULL(29)
1299 	#define BNXT_FW_CAP_RING_MONITOR		BIT_ULL(30)
1300 	#define BNXT_FW_CAP_ECN_STATS			BIT_ULL(31)
1301 	#define BNXT_FW_CAP_TRUFLOW			BIT_ULL(32)
1302 	#define BNXT_FW_CAP_VF_CFG_FOR_PF		BIT_ULL(33)
1303 	#define BNXT_FW_CAP_PTP_PPS			BIT_ULL(34)
1304 	#define BNXT_FW_CAP_HOT_RESET_IF		BIT_ULL(35)
1305 	#define BNXT_FW_CAP_LIVEPATCH			BIT_ULL(36)
1306 	#define BNXT_FW_CAP_NPAR_1_2			BIT_ULL(37)
1307 	#define BNXT_FW_CAP_RSS_HASH_TYPE_DELTA		BIT_ULL(38)
1308 	#define BNXT_FW_CAP_PTP_RTC			BIT_ULL(39)
1309 	#define	BNXT_FW_CAP_TRUFLOW_EN			BIT_ULL(40)
1310 	#define BNXT_TRUFLOW_EN(bp)	((bp)->fw_cap & BNXT_FW_CAP_TRUFLOW_EN)
1311 	#define BNXT_FW_CAP_RX_ALL_PKT_TS		BIT_ULL(41)
1312 	#define BNXT_FW_CAP_BACKING_STORE_V2		BIT_ULL(42)
1313 	#define BNXT_FW_CAP_DBR_SUPPORTED		BIT_ULL(43)
1314 	#define BNXT_FW_CAP_GENERIC_STATS		BIT_ULL(44)
1315 	#define BNXT_FW_CAP_DBR_PACING_SUPPORTED	BIT_ULL(45)
1316 	#define BNXT_FW_CAP_PTP_PTM			BIT_ULL(46)
1317 	#define BNXT_FW_CAP_CFA_NTUPLE_RX_EXT_IP_PROTO	BIT_ULL(47)
1318 	#define BNXT_FW_CAP_ENABLE_RDMA_SRIOV		BIT_ULL(48)
1319 	#define BNXT_FW_CAP_RSS_TCAM			BIT_ULL(49)
1320 
1321 	#define BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS      BIT_ULL(61)
1322 	#define BNXT_SW_RES_LMT(bp) ((bp)->fw_cap & BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS)
1323 
1324 	uint32_t		lpi_tmr_lo;
1325 	uint32_t		lpi_tmr_hi;
1326 	/* copied from flags and flags2 in hwrm_port_phy_qcaps_output */
1327 	uint16_t		phy_flags;
1328 #define BNXT_PHY_FL_EEE_CAP             HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_EEE_SUPPORTED
1329 #define BNXT_PHY_FL_EXT_LPBK            HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_EXTERNAL_LPBK_SUPPORTED
1330 #define BNXT_PHY_FL_AN_PHY_LPBK         HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_AUTONEG_LPBK_SUPPORTED
1331 #define BNXT_PHY_FL_SHARED_PORT_CFG     HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_SHARED_PHY_CFG_SUPPORTED
1332 #define BNXT_PHY_FL_PORT_STATS_NO_RESET HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_CUMULATIVE_COUNTERS_ON_RESET
1333 #define BNXT_PHY_FL_NO_PHY_LPBK         HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_LOCAL_LPBK_NOT_SUPPORTED
1334 #define BNXT_PHY_FL_FW_MANAGED_LKDN     HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_FW_MANAGED_LINK_DOWN
1335 #define BNXT_PHY_FL_NO_FCS              HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_NO_FCS
1336 #define BNXT_PHY_FL_NO_PAUSE            (HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS2_PAUSE_UNSUPPORTED << 8)
1337 #define BNXT_PHY_FL_NO_PFC              (HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS2_PFC_UNSUPPORTED << 8)
1338 #define BNXT_PHY_FL_BANK_SEL            (HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS2_BANK_ADDR_SUPPORTED << 8)
1339 #define BNXT_PHY_FL_SPEEDS2		(HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS2_SPEEDS2_SUPPORTED << 8)
1340 	struct bnxt_aux_dev     *aux_dev;
1341 	struct net_device	*net_dev;
1342 	struct mtx		en_ops_lock;
1343 	uint8_t			port_partition_type;
1344 	struct bnxt_en_dev	*edev;
1345 	unsigned long		state;
1346 #define BNXT_STATE_OPEN			0
1347 #define BNXT_STATE_IN_SP_TASK		1
1348 #define BNXT_STATE_READ_STATS		2
1349 #define BNXT_STATE_FW_RESET_DET 	3
1350 #define BNXT_STATE_IN_FW_RESET		4
1351 #define BNXT_STATE_ABORT_ERR		5
1352 #define BNXT_STATE_FW_FATAL_COND	6
1353 #define BNXT_STATE_DRV_REGISTERED	7
1354 #define BNXT_STATE_PCI_CHANNEL_IO_FROZEN	8
1355 #define BNXT_STATE_NAPI_DISABLED	9
1356 #define BNXT_STATE_L2_FILTER_RETRY	10
1357 #define BNXT_STATE_FW_ACTIVATE		11
1358 #define BNXT_STATE_RECOVER		12
1359 #define BNXT_STATE_FW_NON_FATAL_COND	13
1360 #define BNXT_STATE_FW_ACTIVATE_RESET	14
1361 #define BNXT_STATE_HALF_OPEN		15
1362 #define BNXT_NO_FW_ACCESS(bp)		\
1363 	test_bit(BNXT_STATE_FW_FATAL_COND, &(bp)->state)
1364 	struct pci_dev			*pdev;
1365 
1366 	struct work_struct	sp_task;
1367 	unsigned long		sp_event;
1368 #define BNXT_RX_MASK_SP_EVENT		0
1369 #define BNXT_RX_NTP_FLTR_SP_EVENT	1
1370 #define BNXT_LINK_CHNG_SP_EVENT		2
1371 #define BNXT_HWRM_EXEC_FWD_REQ_SP_EVENT	3
1372 #define BNXT_VXLAN_ADD_PORT_SP_EVENT	4
1373 #define BNXT_VXLAN_DEL_PORT_SP_EVENT	5
1374 #define BNXT_RESET_TASK_SP_EVENT	6
1375 #define BNXT_RST_RING_SP_EVENT		7
1376 #define BNXT_HWRM_PF_UNLOAD_SP_EVENT	8
1377 #define BNXT_PERIODIC_STATS_SP_EVENT	9
1378 #define BNXT_HWRM_PORT_MODULE_SP_EVENT	10
1379 #define BNXT_RESET_TASK_SILENT_SP_EVENT	11
1380 #define BNXT_GENEVE_ADD_PORT_SP_EVENT	12
1381 #define BNXT_GENEVE_DEL_PORT_SP_EVENT	13
1382 #define BNXT_LINK_SPEED_CHNG_SP_EVENT	14
1383 #define BNXT_FLOW_STATS_SP_EVENT	15
1384 #define BNXT_UPDATE_PHY_SP_EVENT	16
1385 #define BNXT_RING_COAL_NOW_SP_EVENT	17
1386 #define BNXT_FW_RESET_NOTIFY_SP_EVENT	18
1387 #define BNXT_FW_EXCEPTION_SP_EVENT	19
1388 #define BNXT_VF_VNIC_CHANGE_SP_EVENT	20
1389 #define BNXT_LINK_CFG_CHANGE_SP_EVENT	21
1390 #define BNXT_PTP_CURRENT_TIME_EVENT	22
1391 #define BNXT_FW_ECHO_REQUEST_SP_EVENT	23
1392 #define BNXT_VF_CFG_CHNG_SP_EVENT	24
1393 
1394 	struct delayed_work	fw_reset_task;
1395 	int			fw_reset_state;
1396 #define BNXT_FW_RESET_STATE_POLL_VF	1
1397 #define BNXT_FW_RESET_STATE_RESET_FW	2
1398 #define BNXT_FW_RESET_STATE_ENABLE_DEV	3
1399 #define BNXT_FW_RESET_STATE_POLL_FW	4
1400 #define BNXT_FW_RESET_STATE_OPENING	5
1401 #define BNXT_FW_RESET_STATE_POLL_FW_DOWN	6
1402 	u16			fw_reset_min_dsecs;
1403 #define BNXT_DFLT_FW_RST_MIN_DSECS	20
1404 	u16			fw_reset_max_dsecs;
1405 #define BNXT_DFLT_FW_RST_MAX_DSECS	60
1406 	unsigned long		fw_reset_timestamp;
1407 
1408 	struct bnxt_fw_health	*fw_health;
1409 	char			board_partno[64];
1410 	TAILQ_HEAD(, bnxt_logger) loggers_list;
1411 	void                    *debug_buf;
1412 	struct mtx              log_lock; /* logging ops lock */
1413 	struct callout		time_sync_callout;
1414 	struct bnxt_bs_trace_info bs_trace[BNXT_CTX_TRACE_BUF_COUNT];
1415 
1416 #define MAX_NUM_DMA_INDICATIONS 10
1417 	struct iflib_dma_info	mgmt_dma_data[MAX_NUM_DMA_INDICATIONS];
1418 };
1419 
1420 struct bnxt_filter_info {
1421 	STAILQ_ENTRY(bnxt_filter_info) next;
1422 	uint64_t	fw_l2_filter_id;
1423 #define INVALID_MAC_INDEX ((uint16_t)-1)
1424 	uint16_t	mac_index;
1425 
1426 	/* Filter Characteristics */
1427 	uint32_t	flags;
1428 	uint32_t	enables;
1429 	uint8_t		l2_addr[ETHER_ADDR_LEN];
1430 	uint8_t		l2_addr_mask[ETHER_ADDR_LEN];
1431 	uint16_t	l2_ovlan;
1432 	uint16_t	l2_ovlan_mask;
1433 	uint16_t	l2_ivlan;
1434 	uint16_t	l2_ivlan_mask;
1435 	uint8_t		t_l2_addr[ETHER_ADDR_LEN];
1436 	uint8_t		t_l2_addr_mask[ETHER_ADDR_LEN];
1437 	uint16_t	t_l2_ovlan;
1438 	uint16_t	t_l2_ovlan_mask;
1439 	uint16_t	t_l2_ivlan;
1440 	uint16_t	t_l2_ivlan_mask;
1441 	uint8_t		tunnel_type;
1442 	uint16_t	mirror_vnic_id;
1443 	uint32_t	vni;
1444 	uint8_t		pri_hint;
1445 	uint64_t	l2_filter_id_hint;
1446 };
1447 
1448 #define I2C_DEV_ADDR_A0                 0xa0
1449 #define BNXT_MAX_PHY_I2C_RESP_SIZE      64
1450 
1451 /* Function declarations */
1452 void bnxt_report_link(struct bnxt_softc *softc);
1453 bool bnxt_check_hwrm_version(struct bnxt_softc *softc);
1454 struct bnxt_softc *bnxt_find_dev(uint32_t domain, uint32_t bus, uint32_t dev_fn, char *name);
1455 int bnxt_read_sfp_module_eeprom_info(struct bnxt_softc *bp, uint16_t i2c_addr,
1456     uint16_t page_number, uint8_t bank, bool bank_sel_en, uint16_t start_addr,
1457     uint16_t data_length, uint8_t *buf);
1458 void bnxt_dcb_init(struct bnxt_softc *softc);
1459 void bnxt_dcb_free(struct bnxt_softc *softc);
1460 uint8_t bnxt_dcb_setdcbx(struct bnxt_softc *softc, uint8_t mode);
1461 uint8_t bnxt_dcb_getdcbx(struct bnxt_softc *softc);
1462 int bnxt_dcb_ieee_getets(struct bnxt_softc *softc, struct bnxt_ieee_ets *ets);
1463 int bnxt_dcb_ieee_setets(struct bnxt_softc *softc, struct bnxt_ieee_ets *ets);
1464 uint8_t get_phy_type(struct bnxt_softc *softc);
1465 int bnxt_dcb_ieee_getpfc(struct bnxt_softc *softc, struct bnxt_ieee_pfc *pfc);
1466 int bnxt_dcb_ieee_setpfc(struct bnxt_softc *softc, struct bnxt_ieee_pfc *pfc);
1467 int bnxt_dcb_ieee_setapp(struct bnxt_softc *softc, struct bnxt_dcb_app *app);
1468 int bnxt_dcb_ieee_delapp(struct bnxt_softc *softc, struct bnxt_dcb_app *app);
1469 int bnxt_dcb_ieee_listapp(struct bnxt_softc *softc, struct bnxt_dcb_app *app,
1470     size_t nitems, int *num_inputs);
1471 void bnxt_set_flags_by_devid(struct bnxt_softc *softc);
1472 int bnxt_hwrm_reserve_rings(struct bnxt_softc *softc);
1473 void bnxt_free_ctx_pg_tbls(struct bnxt_softc *softc,
1474 				struct bnxt_ctx_pg_info *ctx_pg);
1475 int bnxt_alloc_ctx_pg_tbls(struct bnxt_softc *softc,
1476 			    struct bnxt_ctx_pg_info *ctx_pg,
1477 			    uint32_t mem_size, uint8_t depth,
1478 			    struct bnxt_ctx_mem_type *ctxm);
1479 #endif /* _BNXT_H */
1480