xref: /freebsd/sys/dev/bnxt/bnxt.h (revision 770e7ba3)
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 
46 #include "hsi_struct_def.h"
47 
48 /* PCI IDs */
49 #define BROADCOM_VENDOR_ID	0x14E4
50 
51 #define BCM57301	0x16c8
52 #define BCM57302	0x16c9
53 #define BCM57304	0x16ca
54 #define BCM57311	0x16ce
55 #define BCM57312	0x16cf
56 #define BCM57314	0x16df
57 #define BCM57402	0x16d0
58 #define BCM57402_NPAR	0x16d4
59 #define BCM57404	0x16d1
60 #define BCM57404_NPAR	0x16e7
61 #define BCM57406	0x16d2
62 #define BCM57406_NPAR	0x16e8
63 #define BCM57407	0x16d5
64 #define BCM57407_NPAR	0x16ea
65 #define BCM57407_SFP	0x16e9
66 #define BCM57412	0x16d6
67 #define BCM57412_NPAR1	0x16de
68 #define BCM57412_NPAR2	0x16eb
69 #define BCM57414	0x16d7
70 #define BCM57414_NPAR1	0x16ec
71 #define BCM57414_NPAR2	0x16ed
72 #define BCM57416	0x16d8
73 #define BCM57416_NPAR1	0x16ee
74 #define BCM57416_NPAR2	0x16ef
75 #define BCM57416_SFP	0x16e3
76 #define BCM57417	0x16d9
77 #define BCM57417_NPAR1	0x16c0
78 #define BCM57417_NPAR2	0x16cc
79 #define BCM57417_SFP	0x16e2
80 #define BCM57454	0x1614
81 #define BCM58700	0x16cd
82 #define BCM57508  	0x1750
83 #define BCM57504  	0x1751
84 #define BCM57502  	0x1752
85 #define NETXTREME_C_VF1	0x16cb
86 #define NETXTREME_C_VF2	0x16e1
87 #define NETXTREME_C_VF3	0x16e5
88 #define NETXTREME_E_VF1	0x16c1
89 #define NETXTREME_E_VF2	0x16d3
90 #define NETXTREME_E_VF3	0x16dc
91 
92 /* Maximum numbers of RX and TX descriptors. iflib requires this to be a power
93  * of two. The hardware has no particular limitation. */
94 #define BNXT_MAX_RXD	((INT32_MAX >> 1) + 1)
95 #define BNXT_MAX_TXD	((INT32_MAX >> 1) + 1)
96 
97 #define CSUM_OFFLOAD		(CSUM_IP_TSO|CSUM_IP6_TSO|CSUM_IP| \
98 				 CSUM_IP_UDP|CSUM_IP_TCP|CSUM_IP_SCTP| \
99 				 CSUM_IP6_UDP|CSUM_IP6_TCP|CSUM_IP6_SCTP)
100 
101 #define BNXT_MAX_MTU	9600
102 
103 #define BNXT_RSS_HASH_TYPE_TCPV4	0
104 #define BNXT_RSS_HASH_TYPE_UDPV4	1
105 #define BNXT_RSS_HASH_TYPE_IPV4		2
106 #define BNXT_RSS_HASH_TYPE_TCPV6	3
107 #define BNXT_RSS_HASH_TYPE_UDPV6	4
108 #define BNXT_RSS_HASH_TYPE_IPV6		5
109 #define BNXT_GET_RSS_PROFILE_ID(rss_hash_type) ((rss_hash_type >> 1) & 0x1F)
110 
111 #define BNXT_NO_MORE_WOL_FILTERS	0xFFFF
112 #define bnxt_wol_supported(softc)	(!((softc)->flags & BNXT_FLAG_VF) && \
113 					  ((softc)->flags & BNXT_FLAG_WOL_CAP ))
114 
115 /* 64-bit doorbell */
116 #define DBR_INDEX_MASK                                  0x0000000000ffffffULL
117 #define DBR_PI_LO_MASK                                  0xff000000UL
118 #define DBR_PI_LO_SFT                                   24
119 #define DBR_XID_MASK                                    0x000fffff00000000ULL
120 #define DBR_XID_SFT                                     32
121 #define DBR_PI_HI_MASK                                  0xf0000000000000ULL
122 #define DBR_PI_HI_SFT                                   52
123 #define DBR_PATH_L2                                     (0x1ULL << 56)
124 #define DBR_VALID                                       (0x1ULL << 58)
125 #define DBR_TYPE_SQ                                     (0x0ULL << 60)
126 #define DBR_TYPE_RQ                                     (0x1ULL << 60)
127 #define DBR_TYPE_SRQ                                    (0x2ULL << 60)
128 #define DBR_TYPE_SRQ_ARM                                (0x3ULL << 60)
129 #define DBR_TYPE_CQ                                     (0x4ULL << 60)
130 #define DBR_TYPE_CQ_ARMSE                               (0x5ULL << 60)
131 #define DBR_TYPE_CQ_ARMALL                              (0x6ULL << 60)
132 #define DBR_TYPE_CQ_ARMENA                              (0x7ULL << 60)
133 #define DBR_TYPE_SRQ_ARMENA                             (0x8ULL << 60)
134 #define DBR_TYPE_CQ_CUTOFF_ACK                          (0x9ULL << 60)
135 #define DBR_TYPE_NQ                                     (0xaULL << 60)
136 #define DBR_TYPE_NQ_ARM                                 (0xbULL << 60)
137 #define DBR_TYPE_PUSH_START                             (0xcULL << 60)
138 #define DBR_TYPE_PUSH_END                               (0xdULL << 60)
139 #define DBR_TYPE_NULL                                   (0xfULL << 60)
140 
141 #define BNXT_MAX_NUM_QUEUES 32
142 
143 /* Completion related defines */
144 #define CMP_VALID(cmp, v_bit) \
145 	((!!(((struct cmpl_base *)(cmp))->info3_v & htole32(CMPL_BASE_V))) == !!(v_bit) )
146 
147 /* Chip class phase 5 */
148 #define BNXT_CHIP_P5(sc) ((softc->flags & BNXT_FLAG_CHIP_P5))
149 
150 #define DB_PF_OFFSET_P5                                 0x10000
151 #define NQ_VALID(cmp, v_bit) \
152 	((!!(((nq_cn_t *)(cmp))->v & htole32(NQ_CN_V))) == !!(v_bit) )
153 
154 #ifndef DIV_ROUND_UP
155 #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
156 #endif
157 #ifndef roundup
158 #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
159 #endif
160 
161 #define NEXT_CP_CONS_V(ring, cons, v_bit) do {				    \
162 	if (__predict_false(++(cons) == (ring)->ring_size))		    \
163 		((cons) = 0, (v_bit) = !v_bit);				    \
164 } while (0)
165 
166 #define RING_NEXT(ring, idx) (__predict_false(idx + 1 == (ring)->ring_size) ? \
167 								0 : idx + 1)
168 
169 #define CMPL_PREFETCH_NEXT(cpr, idx)					    \
170 	__builtin_prefetch(&((struct cmpl_base *)(cpr)->ring.vaddr)[((idx) +\
171 	    (CACHE_LINE_SIZE / sizeof(struct cmpl_base))) &		    \
172 	    ((cpr)->ring.ring_size - 1)])
173 
174 /* Lock macros */
175 #define BNXT_HWRM_LOCK_INIT(_softc, _name) \
176     mtx_init(&(_softc)->hwrm_lock, _name, "BNXT HWRM Lock", MTX_DEF)
177 #define BNXT_HWRM_LOCK(_softc)		mtx_lock(&(_softc)->hwrm_lock)
178 #define BNXT_HWRM_UNLOCK(_softc)	mtx_unlock(&(_softc)->hwrm_lock)
179 #define BNXT_HWRM_LOCK_DESTROY(_softc)	mtx_destroy(&(_softc)->hwrm_lock)
180 #define BNXT_HWRM_LOCK_ASSERT(_softc)	mtx_assert(&(_softc)->hwrm_lock,    \
181     MA_OWNED)
182 #define BNXT_IS_FLOW_CTRL_CHANGED(link_info)				    \
183 	((link_info->last_flow_ctrl.tx != link_info->flow_ctrl.tx) ||       \
184          (link_info->last_flow_ctrl.rx != link_info->flow_ctrl.rx) ||       \
185 	 (link_info->last_flow_ctrl.autoneg != link_info->flow_ctrl.autoneg))
186 
187 /* Chip info */
188 #define BNXT_TSO_SIZE	UINT16_MAX
189 
190 #define min_t(type, x, y) ({                    \
191         type __min1 = (x);                      \
192         type __min2 = (y);                      \
193         __min1 < __min2 ? __min1 : __min2; })
194 
195 #define max_t(type, x, y) ({                    \
196         type __max1 = (x);                      \
197         type __max2 = (y);                      \
198         __max1 > __max2 ? __max1 : __max2; })
199 
200 #define clamp_t(type, _x, min, max)     min_t(type, max_t(type, _x, min), max)
201 
202 #define BNXT_IFMEDIA_ADD(supported, fw_speed, ifm_speed) do {			\
203 	if ((supported) & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_ ## fw_speed)	\
204 		ifmedia_add(softc->media, IFM_ETHER | (ifm_speed), 0, NULL);	\
205 } while(0)
206 
207 #define BNXT_MIN_FRAME_SIZE	52	/* Frames must be padded to this size for some A0 chips */
208 
209 extern const char bnxt_driver_version[];
210 typedef void (*bnxt_doorbell_tx)(void *, uint16_t idx);
211 typedef void (*bnxt_doorbell_rx)(void *, uint16_t idx);
212 typedef void (*bnxt_doorbell_rx_cq)(void *, bool);
213 typedef void (*bnxt_doorbell_tx_cq)(void *, bool);
214 typedef void (*bnxt_doorbell_nq)(void *, bool);
215 
216 typedef struct bnxt_doorbell_ops {
217         bnxt_doorbell_tx bnxt_db_tx;
218         bnxt_doorbell_rx bnxt_db_rx;
219         bnxt_doorbell_rx_cq bnxt_db_rx_cq;
220         bnxt_doorbell_tx_cq bnxt_db_tx_cq;
221         bnxt_doorbell_nq bnxt_db_nq;
222 } bnxt_dooorbell_ops_t;
223 /* NVRAM access */
224 enum bnxt_nvm_directory_type {
225 	BNX_DIR_TYPE_UNUSED = 0,
226 	BNX_DIR_TYPE_PKG_LOG = 1,
227 	BNX_DIR_TYPE_UPDATE = 2,
228 	BNX_DIR_TYPE_CHIMP_PATCH = 3,
229 	BNX_DIR_TYPE_BOOTCODE = 4,
230 	BNX_DIR_TYPE_VPD = 5,
231 	BNX_DIR_TYPE_EXP_ROM_MBA = 6,
232 	BNX_DIR_TYPE_AVS = 7,
233 	BNX_DIR_TYPE_PCIE = 8,
234 	BNX_DIR_TYPE_PORT_MACRO = 9,
235 	BNX_DIR_TYPE_APE_FW = 10,
236 	BNX_DIR_TYPE_APE_PATCH = 11,
237 	BNX_DIR_TYPE_KONG_FW = 12,
238 	BNX_DIR_TYPE_KONG_PATCH = 13,
239 	BNX_DIR_TYPE_BONO_FW = 14,
240 	BNX_DIR_TYPE_BONO_PATCH = 15,
241 	BNX_DIR_TYPE_TANG_FW = 16,
242 	BNX_DIR_TYPE_TANG_PATCH = 17,
243 	BNX_DIR_TYPE_BOOTCODE_2 = 18,
244 	BNX_DIR_TYPE_CCM = 19,
245 	BNX_DIR_TYPE_PCI_CFG = 20,
246 	BNX_DIR_TYPE_TSCF_UCODE = 21,
247 	BNX_DIR_TYPE_ISCSI_BOOT = 22,
248 	BNX_DIR_TYPE_ISCSI_BOOT_IPV6 = 24,
249 	BNX_DIR_TYPE_ISCSI_BOOT_IPV4N6 = 25,
250 	BNX_DIR_TYPE_ISCSI_BOOT_CFG6 = 26,
251 	BNX_DIR_TYPE_EXT_PHY = 27,
252 	BNX_DIR_TYPE_SHARED_CFG = 40,
253 	BNX_DIR_TYPE_PORT_CFG = 41,
254 	BNX_DIR_TYPE_FUNC_CFG = 42,
255 	BNX_DIR_TYPE_MGMT_CFG = 48,
256 	BNX_DIR_TYPE_MGMT_DATA = 49,
257 	BNX_DIR_TYPE_MGMT_WEB_DATA = 50,
258 	BNX_DIR_TYPE_MGMT_WEB_META = 51,
259 	BNX_DIR_TYPE_MGMT_EVENT_LOG = 52,
260 	BNX_DIR_TYPE_MGMT_AUDIT_LOG = 53
261 };
262 
263 enum bnxnvm_pkglog_field_index {
264 	BNX_PKG_LOG_FIELD_IDX_INSTALLED_TIMESTAMP	= 0,
265 	BNX_PKG_LOG_FIELD_IDX_PKG_DESCRIPTION		= 1,
266 	BNX_PKG_LOG_FIELD_IDX_PKG_VERSION		= 2,
267 	BNX_PKG_LOG_FIELD_IDX_PKG_TIMESTAMP		= 3,
268 	BNX_PKG_LOG_FIELD_IDX_PKG_CHECKSUM		= 4,
269 	BNX_PKG_LOG_FIELD_IDX_INSTALLED_ITEMS		= 5,
270 	BNX_PKG_LOG_FIELD_IDX_INSTALLED_MASK		= 6
271 };
272 
273 #define BNX_DIR_ORDINAL_FIRST		0
274 #define BNX_DIR_EXT_NONE		0
275 
276 struct bnxt_bar_info {
277 	struct resource		*res;
278 	bus_space_tag_t		tag;
279 	bus_space_handle_t	handle;
280 	bus_size_t		size;
281 	int			rid;
282 };
283 
284 struct bnxt_flow_ctrl {
285 	bool rx;
286 	bool tx;
287 	bool autoneg;
288 };
289 
290 struct bnxt_link_info {
291 	uint8_t		media_type;
292 	uint8_t		transceiver;
293 	uint8_t		phy_addr;
294 	uint8_t		phy_link_status;
295 	uint8_t		wire_speed;
296 	uint8_t		loop_back;
297 	uint8_t		link_up;
298 	uint8_t		last_link_up;
299 	uint8_t		duplex;
300 	uint8_t		last_duplex;
301 	uint8_t		last_phy_type;
302 	struct bnxt_flow_ctrl   flow_ctrl;
303 	struct bnxt_flow_ctrl   last_flow_ctrl;
304 	uint8_t		duplex_setting;
305 	uint8_t		auto_mode;
306 #define PHY_VER_LEN		3
307 	uint8_t		phy_ver[PHY_VER_LEN];
308 	uint8_t		phy_type;
309 #define BNXT_PHY_STATE_ENABLED		0
310 #define BNXT_PHY_STATE_DISABLED		1
311 	uint8_t		phy_state;
312 
313 	uint16_t	link_speed;
314 	uint16_t	support_speeds;
315 	uint16_t	support_pam4_speeds;
316 	uint16_t	auto_link_speeds;
317 	uint16_t	auto_pam4_link_speeds;
318 	uint16_t	force_link_speed;
319 	uint16_t	force_pam4_link_speed;
320 	bool		force_pam4_speed_set_by_user;
321 
322 	uint16_t	advertising;
323 	uint16_t	advertising_pam4;
324 
325 	uint32_t	preemphasis;
326 	uint16_t	support_auto_speeds;
327 	uint16_t	support_force_speeds;
328 	uint16_t	support_pam4_auto_speeds;
329 	uint16_t	support_pam4_force_speeds;
330 #define BNXT_SIG_MODE_NRZ	HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_NRZ
331 #define BNXT_SIG_MODE_PAM4	HWRM_PORT_PHY_QCFG_OUTPUT_SIGNAL_MODE_PAM4
332 	uint8_t		req_signal_mode;
333 
334 	uint8_t		active_fec_sig_mode;
335 	uint8_t		sig_mode;
336 
337 	/* copy of requested setting */
338 	uint8_t		autoneg;
339 #define BNXT_AUTONEG_SPEED	1
340 #define BNXT_AUTONEG_FLOW_CTRL	2
341 	uint8_t		req_duplex;
342 	uint16_t	req_link_speed;
343 	uint8_t		module_status;
344 	struct hwrm_port_phy_qcfg_output    phy_qcfg_resp;
345 };
346 
347 enum bnxt_phy_type {
348 	BNXT_MEDIA_CR = 0,
349 	BNXT_MEDIA_LR,
350 	BNXT_MEDIA_SR,
351 	BNXT_MEDIA_KR,
352 	BNXT_MEDIA_END
353 };
354 
355 enum bnxt_cp_type {
356 	BNXT_DEFAULT,
357 	BNXT_TX,
358 	BNXT_RX,
359 	BNXT_SHARED
360 };
361 
362 struct bnxt_cos_queue {
363 	uint8_t	id;
364 	uint8_t	profile;
365 };
366 
367 struct bnxt_func_info {
368 	uint32_t	fw_fid;
369 	uint8_t		mac_addr[ETHER_ADDR_LEN];
370 	uint16_t	max_rsscos_ctxs;
371 	uint16_t	max_cp_rings;
372 	uint16_t	max_tx_rings;
373 	uint16_t	max_rx_rings;
374 	uint16_t	max_hw_ring_grps;
375 	uint16_t	max_irqs;
376 	uint16_t	max_l2_ctxs;
377 	uint16_t	max_vnics;
378 	uint16_t	max_stat_ctxs;
379 };
380 
381 struct bnxt_pf_info {
382 #define BNXT_FIRST_PF_FID	1
383 #define BNXT_FIRST_VF_FID	128
384 	uint8_t		port_id;
385 	uint32_t	first_vf_id;
386 	uint16_t	active_vfs;
387 	uint16_t	max_vfs;
388 	uint32_t	max_encap_records;
389 	uint32_t	max_decap_records;
390 	uint32_t	max_tx_em_flows;
391 	uint32_t	max_tx_wm_flows;
392 	uint32_t	max_rx_em_flows;
393 	uint32_t	max_rx_wm_flows;
394 	unsigned long	*vf_event_bmap;
395 	uint16_t	hwrm_cmd_req_pages;
396 	void		*hwrm_cmd_req_addr[4];
397 	bus_addr_t	hwrm_cmd_req_dma_addr[4];
398 };
399 
400 struct bnxt_vf_info {
401 	uint16_t	fw_fid;
402 	uint8_t		mac_addr[ETHER_ADDR_LEN];
403 	uint16_t	max_rsscos_ctxs;
404 	uint16_t	max_cp_rings;
405 	uint16_t	max_tx_rings;
406 	uint16_t	max_rx_rings;
407 	uint16_t	max_hw_ring_grps;
408 	uint16_t	max_l2_ctxs;
409 	uint16_t	max_irqs;
410 	uint16_t	max_vnics;
411 	uint16_t	max_stat_ctxs;
412 	uint32_t	vlan;
413 #define BNXT_VF_QOS		0x1
414 #define BNXT_VF_SPOOFCHK	0x2
415 #define BNXT_VF_LINK_FORCED	0x4
416 #define BNXT_VF_LINK_UP		0x8
417 	uint32_t	flags;
418 	uint32_t	func_flags; /* func cfg flags */
419 	uint32_t	min_tx_rate;
420 	uint32_t	max_tx_rate;
421 	void		*hwrm_cmd_req_addr;
422 	bus_addr_t	hwrm_cmd_req_dma_addr;
423 };
424 
425 #define BNXT_PF(softc)		(!((softc)->flags & BNXT_FLAG_VF))
426 #define BNXT_VF(softc)		((softc)->flags & BNXT_FLAG_VF)
427 
428 struct bnxt_vlan_tag {
429 	SLIST_ENTRY(bnxt_vlan_tag) next;
430 	uint64_t	filter_id;
431 	uint16_t	tag;
432 };
433 
434 struct bnxt_vnic_info {
435 	uint16_t	id;
436 	uint16_t	def_ring_grp;
437 	uint16_t	cos_rule;
438 	uint16_t	lb_rule;
439 	uint16_t	mru;
440 
441 	uint32_t	rx_mask;
442 	struct iflib_dma_info mc_list;
443 	int		mc_list_count;
444 #define BNXT_MAX_MC_ADDRS		16
445 
446 	uint32_t	flags;
447 #define BNXT_VNIC_FLAG_DEFAULT		0x01
448 #define BNXT_VNIC_FLAG_BD_STALL		0x02
449 #define BNXT_VNIC_FLAG_VLAN_STRIP	0x04
450 
451 	uint64_t	filter_id;
452 
453 	uint16_t	rss_id;
454 	uint32_t	rss_hash_type;
455 	uint8_t		rss_hash_key[HW_HASH_KEY_SIZE];
456 	struct iflib_dma_info rss_hash_key_tbl;
457 	struct iflib_dma_info	rss_grp_tbl;
458 	SLIST_HEAD(vlan_head, bnxt_vlan_tag) vlan_tags;
459 	struct iflib_dma_info vlan_tag_list;
460 };
461 
462 struct bnxt_grp_info {
463 	uint16_t	stats_ctx;
464 	uint16_t	grp_id;
465 	uint16_t	rx_ring_id;
466 	uint16_t	cp_ring_id;
467 	uint16_t	ag_ring_id;
468 };
469 
470 struct bnxt_ring {
471 	uint64_t		paddr;
472 	vm_offset_t		doorbell;
473 	caddr_t			vaddr;
474 	struct bnxt_softc	*softc;
475 	uint32_t		ring_size;	/* Must be a power of two */
476 	uint16_t		id;		/* Logical ID */
477 	uint16_t		phys_id;
478 	uint16_t		idx;
479 	struct bnxt_full_tpa_start *tpa_start;
480 };
481 
482 struct bnxt_cp_ring {
483 	struct bnxt_ring	ring;
484 	struct if_irq		irq;
485 	uint32_t		cons;
486 	bool			v_bit;		/* Value of valid bit */
487 	struct ctx_hw_stats	*stats;
488 	uint32_t		stats_ctx_id;
489 	uint32_t		last_idx;	/* Used by RX rings only
490 						 * set to the last read pidx
491 						 */
492 	uint64_t 		int_count;
493 };
494 
495 struct bnxt_full_tpa_start {
496 	struct rx_tpa_start_cmpl low;
497 	struct rx_tpa_start_cmpl_hi high;
498 };
499 
500 /* All the version information for the part */
501 #define BNXT_VERSTR_SIZE	(3*3+2+1)	/* ie: "255.255.255\0" */
502 #define BNXT_NAME_SIZE		17
503 #define FW_VER_STR_LEN          32
504 #define BC_HWRM_STR_LEN         21
505 struct bnxt_ver_info {
506 	uint8_t		hwrm_if_major;
507 	uint8_t		hwrm_if_minor;
508 	uint8_t		hwrm_if_update;
509 	char		hwrm_if_ver[BNXT_VERSTR_SIZE];
510 	char		driver_hwrm_if_ver[BNXT_VERSTR_SIZE];
511 	char		hwrm_fw_ver[BNXT_VERSTR_SIZE];
512 	char		mgmt_fw_ver[BNXT_VERSTR_SIZE];
513 	char		netctrl_fw_ver[BNXT_VERSTR_SIZE];
514 	char		roce_fw_ver[BNXT_VERSTR_SIZE];
515 	char		fw_ver_str[FW_VER_STR_LEN];
516 	char		phy_ver[BNXT_VERSTR_SIZE];
517 	char		pkg_ver[64];
518 
519 	char		hwrm_fw_name[BNXT_NAME_SIZE];
520 	char		mgmt_fw_name[BNXT_NAME_SIZE];
521 	char		netctrl_fw_name[BNXT_NAME_SIZE];
522 	char		roce_fw_name[BNXT_NAME_SIZE];
523 	char		phy_vendor[BNXT_NAME_SIZE];
524 	char		phy_partnumber[BNXT_NAME_SIZE];
525 
526 	uint16_t	chip_num;
527 	uint8_t		chip_rev;
528 	uint8_t		chip_metal;
529 	uint8_t		chip_bond_id;
530 	uint8_t		chip_type;
531 
532 	uint8_t		hwrm_min_major;
533 	uint8_t		hwrm_min_minor;
534 	uint8_t		hwrm_min_update;
535 
536 	struct sysctl_ctx_list	ver_ctx;
537 	struct sysctl_oid	*ver_oid;
538 };
539 
540 struct bnxt_nvram_info {
541 	uint16_t	mfg_id;
542 	uint16_t	device_id;
543 	uint32_t	sector_size;
544 	uint32_t	size;
545 	uint32_t	reserved_size;
546 	uint32_t	available_size;
547 
548 	struct sysctl_ctx_list	nvm_ctx;
549 	struct sysctl_oid	*nvm_oid;
550 };
551 
552 struct bnxt_func_qcfg {
553 	uint16_t alloc_completion_rings;
554 	uint16_t alloc_tx_rings;
555 	uint16_t alloc_rx_rings;
556 	uint16_t alloc_vnics;
557 };
558 
559 struct bnxt_hw_lro {
560 	uint16_t enable;
561 	uint16_t is_mode_gro;
562 	uint16_t max_agg_segs;
563 	uint16_t max_aggs;
564 	uint32_t min_agg_len;
565 };
566 
567 /* The hardware supports certain page sizes.  Use the supported page sizes
568  * to allocate the rings.
569  */
570 #if (PAGE_SHIFT < 12)
571 #define BNXT_PAGE_SHIFT 12
572 #elif (PAGE_SHIFT <= 13)
573 #define BNXT_PAGE_SHIFT PAGE_SHIFT
574 #elif (PAGE_SHIFT < 16)
575 #define BNXT_PAGE_SHIFT 13
576 #else
577 #define BNXT_PAGE_SHIFT 16
578 #endif
579 
580 #define BNXT_PAGE_SIZE  (1 << BNXT_PAGE_SHIFT)
581 
582 #define MAX_CTX_PAGES	(BNXT_PAGE_SIZE / 8)
583 #define MAX_CTX_TOTAL_PAGES	(MAX_CTX_PAGES * MAX_CTX_PAGES)
584 struct bnxt_ring_mem_info {
585         int                     nr_pages;
586         int                     page_size;
587         uint16_t                     flags;
588 #define BNXT_RMEM_VALID_PTE_FLAG        1
589 #define BNXT_RMEM_RING_PTE_FLAG         2
590 #define BNXT_RMEM_USE_FULL_PAGE_FLAG    4
591         uint16_t		depth;
592 	uint8_t			init_val;
593         struct iflib_dma_info	*pg_arr;
594         struct iflib_dma_info	pg_tbl;
595         int                     vmem_size;
596         void                    **vmem;
597 };
598 
599 struct bnxt_ctx_pg_info {
600 	uint32_t		entries;
601 	uint32_t		nr_pages;
602 	struct iflib_dma_info   ctx_arr[MAX_CTX_PAGES];
603 	struct bnxt_ring_mem_info ring_mem;
604 	struct bnxt_ctx_pg_info **ctx_pg_tbl;
605 };
606 
607 struct bnxt_ctx_mem_info {
608 	uint32_t	qp_max_entries;
609 	uint16_t	qp_min_qp1_entries;
610 	uint16_t	qp_max_l2_entries;
611 	uint16_t	qp_entry_size;
612 	uint16_t	srq_max_l2_entries;
613 	uint32_t	srq_max_entries;
614 	uint16_t	srq_entry_size;
615 	uint16_t	cq_max_l2_entries;
616 	uint32_t	cq_max_entries;
617 	uint16_t	cq_entry_size;
618 	uint16_t	vnic_max_vnic_entries;
619 	uint16_t	vnic_max_ring_table_entries;
620 	uint16_t	vnic_entry_size;
621 	uint32_t	stat_max_entries;
622 	uint16_t	stat_entry_size;
623 	uint16_t	tqm_entry_size;
624 	uint32_t	tqm_min_entries_per_ring;
625 	uint32_t	tqm_max_entries_per_ring;
626 	uint32_t	mrav_max_entries;
627 	uint16_t	mrav_entry_size;
628 	uint16_t	tim_entry_size;
629 	uint32_t	tim_max_entries;
630 	uint8_t		tqm_entries_multiple;
631 	uint8_t		ctx_kind_initializer;
632 
633 	uint32_t	flags;
634 	#define BNXT_CTX_FLAG_INITED	0x01
635 
636 	struct bnxt_ctx_pg_info qp_mem;
637 	struct bnxt_ctx_pg_info srq_mem;
638 	struct bnxt_ctx_pg_info cq_mem;
639 	struct bnxt_ctx_pg_info vnic_mem;
640 	struct bnxt_ctx_pg_info stat_mem;
641 	struct bnxt_ctx_pg_info mrav_mem;
642 	struct bnxt_ctx_pg_info tim_mem;
643 	struct bnxt_ctx_pg_info *tqm_mem[9];
644 };
645 
646 struct bnxt_hw_resc {
647         uint16_t     min_rsscos_ctxs;
648         uint16_t     max_rsscos_ctxs;
649         uint16_t     min_cp_rings;
650         uint16_t     max_cp_rings;
651         uint16_t     resv_cp_rings;
652         uint16_t     min_tx_rings;
653         uint16_t     max_tx_rings;
654         uint16_t     resv_tx_rings;
655         uint16_t     max_tx_sch_inputs;
656         uint16_t     min_rx_rings;
657         uint16_t     max_rx_rings;
658         uint16_t     resv_rx_rings;
659         uint16_t     min_hw_ring_grps;
660         uint16_t     max_hw_ring_grps;
661         uint16_t     resv_hw_ring_grps;
662         uint16_t     min_l2_ctxs;
663         uint16_t     max_l2_ctxs;
664         uint16_t     min_vnics;
665         uint16_t     max_vnics;
666         uint16_t     resv_vnics;
667         uint16_t     min_stat_ctxs;
668         uint16_t     max_stat_ctxs;
669         uint16_t     resv_stat_ctxs;
670         uint16_t     max_nqs;
671         uint16_t     max_irqs;
672         uint16_t     resv_irqs;
673 };
674 
675 #define BNXT_LLQ(q_profile)     \
676         ((q_profile) == HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_LOSSLESS_ROCE)
677 #define BNXT_CNPQ(q_profile)    \
678         ((q_profile) == HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_LOSSY_ROCE_CNP)
679 
680 #define BNXT_HWRM_MAX_REQ_LEN		(softc->hwrm_max_req_len)
681 
682 struct bnxt_softc_list {
683 	SLIST_ENTRY(bnxt_softc_list) next;
684 	struct bnxt_softc *softc;
685 };
686 
687 struct bnxt_softc {
688 	device_t	dev;
689 	if_ctx_t	ctx;
690 	if_softc_ctx_t	scctx;
691 	if_shared_ctx_t	sctx;
692 	uint32_t	domain;
693 	uint32_t	bus;
694 	uint32_t	slot;
695 	uint32_t	function;
696 	uint32_t	dev_fn;
697 	struct ifmedia	*media;
698 	struct bnxt_ctx_mem_info *ctx_mem;
699 	struct bnxt_hw_resc hw_resc;
700 	struct bnxt_softc_list list;
701 
702 	struct bnxt_bar_info	hwrm_bar;
703 	struct bnxt_bar_info	doorbell_bar;
704 	struct bnxt_link_info	link_info;
705 #define BNXT_FLAG_VF				0x0001
706 #define BNXT_FLAG_NPAR				0x0002
707 #define BNXT_FLAG_WOL_CAP			0x0004
708 #define BNXT_FLAG_SHORT_CMD			0x0008
709 #define BNXT_FLAG_FW_CAP_NEW_RM			0x0010
710 #define BNXT_FLAG_CHIP_P5			0x0020
711 #define BNXT_FLAG_TPA				0x0040
712 #define BNXT_FLAG_FW_CAP_EXT_STATS		0x0080
713 	uint32_t		flags;
714 #define BNXT_STATE_LINK_CHANGE  (0)
715 #define BNXT_STATE_MAX		(BNXT_STATE_LINK_CHANGE + 1)
716 	bitstr_t 		*state_bv;
717 	uint32_t		total_msix;
718 
719 	struct bnxt_func_info	func;
720 	struct bnxt_func_qcfg	fn_qcfg;
721 	struct bnxt_pf_info	pf;
722 	struct bnxt_vf_info	vf;
723 
724 	uint16_t		hwrm_cmd_seq;
725 	uint32_t		hwrm_cmd_timeo;	/* milliseconds */
726 	struct iflib_dma_info	hwrm_cmd_resp;
727 	struct iflib_dma_info	hwrm_short_cmd_req_addr;
728 	/* Interrupt info for HWRM */
729 	struct if_irq		irq;
730 	struct mtx		hwrm_lock;
731 	uint16_t		hwrm_max_req_len;
732 	uint16_t		hwrm_max_ext_req_len;
733 	uint32_t		hwrm_spec_code;
734 
735 #define BNXT_MAX_COS_QUEUE	8
736 	uint8_t			max_tc;
737         uint8_t			max_lltc;       /* lossless TCs */
738 	struct bnxt_cos_queue	q_info[BNXT_MAX_COS_QUEUE];
739         uint8_t			tc_to_qidx[BNXT_MAX_COS_QUEUE];
740         uint8_t			q_ids[BNXT_MAX_COS_QUEUE];
741         uint8_t			max_q;
742 
743 	uint64_t		admin_ticks;
744 	struct iflib_dma_info	hw_rx_port_stats;
745 	struct iflib_dma_info	hw_tx_port_stats;
746 	struct rx_port_stats	*rx_port_stats;
747 	struct tx_port_stats	*tx_port_stats;
748 
749 	struct iflib_dma_info	hw_tx_port_stats_ext;
750 	struct iflib_dma_info	hw_rx_port_stats_ext;
751 	struct tx_port_stats_ext *tx_port_stats_ext;
752 	struct rx_port_stats_ext *rx_port_stats_ext;
753 
754 	int			num_cp_rings;
755 
756 	struct bnxt_cp_ring	*nq_rings;
757 
758 	struct bnxt_ring	*tx_rings;
759 	struct bnxt_cp_ring	*tx_cp_rings;
760 	struct iflib_dma_info	tx_stats[BNXT_MAX_NUM_QUEUES];
761 	int			ntxqsets;
762 
763 	struct bnxt_vnic_info	vnic_info;
764 	struct bnxt_ring	*ag_rings;
765 	struct bnxt_ring	*rx_rings;
766 	struct bnxt_cp_ring	*rx_cp_rings;
767 	struct bnxt_grp_info	*grp_info;
768 	struct iflib_dma_info	rx_stats[BNXT_MAX_NUM_QUEUES];
769 	int			nrxqsets;
770 	uint16_t		rx_buf_size;
771 
772 	struct bnxt_cp_ring	def_cp_ring;
773 	struct bnxt_cp_ring	def_nq_ring;
774 	struct iflib_dma_info	def_cp_ring_mem;
775 	struct iflib_dma_info	def_nq_ring_mem;
776 	struct grouptask	def_cp_task;
777 	struct bnxt_doorbell_ops db_ops;
778 
779 	struct sysctl_ctx_list	hw_stats;
780 	struct sysctl_oid	*hw_stats_oid;
781 	struct sysctl_ctx_list	hw_lro_ctx;
782 	struct sysctl_oid	*hw_lro_oid;
783 	struct sysctl_ctx_list	flow_ctrl_ctx;
784 	struct sysctl_oid	*flow_ctrl_oid;
785 
786 	struct bnxt_ver_info	*ver_info;
787 	struct bnxt_nvram_info	*nvm_info;
788 	bool wol;
789 	bool is_dev_init;
790 	struct bnxt_hw_lro	hw_lro;
791 	uint8_t wol_filter_id;
792 	uint16_t		rx_coal_usecs;
793 	uint16_t		rx_coal_usecs_irq;
794 	uint16_t               	rx_coal_frames;
795 	uint16_t               	rx_coal_frames_irq;
796 	uint16_t               	tx_coal_usecs;
797 	uint16_t               	tx_coal_usecs_irq;
798 	uint16_t               	tx_coal_frames;
799 	uint16_t               	tx_coal_frames_irq;
800 
801 #define BNXT_USEC_TO_COAL_TIMER(x)      ((x) * 25 / 2)
802 #define BNXT_DEF_STATS_COAL_TICKS        1000000
803 #define BNXT_MIN_STATS_COAL_TICKS         250000
804 #define BNXT_MAX_STATS_COAL_TICKS        1000000
805 
806 };
807 
808 struct bnxt_filter_info {
809 	STAILQ_ENTRY(bnxt_filter_info) next;
810 	uint64_t	fw_l2_filter_id;
811 #define INVALID_MAC_INDEX ((uint16_t)-1)
812 	uint16_t	mac_index;
813 
814 	/* Filter Characteristics */
815 	uint32_t	flags;
816 	uint32_t	enables;
817 	uint8_t		l2_addr[ETHER_ADDR_LEN];
818 	uint8_t		l2_addr_mask[ETHER_ADDR_LEN];
819 	uint16_t	l2_ovlan;
820 	uint16_t	l2_ovlan_mask;
821 	uint16_t	l2_ivlan;
822 	uint16_t	l2_ivlan_mask;
823 	uint8_t		t_l2_addr[ETHER_ADDR_LEN];
824 	uint8_t		t_l2_addr_mask[ETHER_ADDR_LEN];
825 	uint16_t	t_l2_ovlan;
826 	uint16_t	t_l2_ovlan_mask;
827 	uint16_t	t_l2_ivlan;
828 	uint16_t	t_l2_ivlan_mask;
829 	uint8_t		tunnel_type;
830 	uint16_t	mirror_vnic_id;
831 	uint32_t	vni;
832 	uint8_t		pri_hint;
833 	uint64_t	l2_filter_id_hint;
834 };
835 
836 #define I2C_DEV_ADDR_A0                 0xa0
837 #define BNXT_MAX_PHY_I2C_RESP_SIZE      64
838 
839 /* Function declarations */
840 void bnxt_report_link(struct bnxt_softc *softc);
841 bool bnxt_check_hwrm_version(struct bnxt_softc *softc);
842 struct bnxt_softc *bnxt_find_dev(uint32_t domain, uint32_t bus, uint32_t dev_fn, char *name);
843 int bnxt_read_sfp_module_eeprom_info(struct bnxt_softc *bp, uint16_t i2c_addr,
844     uint16_t page_number, uint8_t bank, bool bank_sel_en, uint16_t start_addr,
845     uint16_t data_length, uint8_t *buf);
846 uint8_t get_phy_type(struct bnxt_softc *softc);
847 
848 #endif /* _BNXT_H */
849