xref: /illumos-gate/usr/src/uts/common/io/bnx/bnx.h (revision ec71f88e)
1*eef4f27bSRobert Mustacchi /*
2*eef4f27bSRobert Mustacchi  * Copyright 2014-2017 Cavium, Inc.
3*eef4f27bSRobert Mustacchi  * The contents of this file are subject to the terms of the Common Development
4*eef4f27bSRobert Mustacchi  * and Distribution License, v.1,  (the "License").
5*eef4f27bSRobert Mustacchi  *
6*eef4f27bSRobert Mustacchi  * You may not use this file except in compliance with the License.
7*eef4f27bSRobert Mustacchi  *
8*eef4f27bSRobert Mustacchi  * You can obtain a copy of the License at available
9*eef4f27bSRobert Mustacchi  * at http://opensource.org/licenses/CDDL-1.0
10*eef4f27bSRobert Mustacchi  *
11*eef4f27bSRobert Mustacchi  * See the License for the specific language governing permissions and
12*eef4f27bSRobert Mustacchi  * limitations under the License.
13*eef4f27bSRobert Mustacchi  */
14*eef4f27bSRobert Mustacchi 
15*eef4f27bSRobert Mustacchi /*
16*eef4f27bSRobert Mustacchi  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
17*eef4f27bSRobert Mustacchi  * Copyright (c) 2019, Joyent, Inc.
18*eef4f27bSRobert Mustacchi  */
19*eef4f27bSRobert Mustacchi 
20*eef4f27bSRobert Mustacchi #ifndef _BNX_H
21*eef4f27bSRobert Mustacchi #define	_BNX_H
22*eef4f27bSRobert Mustacchi 
23*eef4f27bSRobert Mustacchi #ifdef __cplusplus
24*eef4f27bSRobert Mustacchi extern "C" {
25*eef4f27bSRobert Mustacchi #endif
26*eef4f27bSRobert Mustacchi 
27*eef4f27bSRobert Mustacchi #include <sys/types.h>
28*eef4f27bSRobert Mustacchi #include <sys/stream.h>
29*eef4f27bSRobert Mustacchi #include <sys/stropts.h>
30*eef4f27bSRobert Mustacchi #include <sys/errno.h>
31*eef4f27bSRobert Mustacchi #include <sys/cred.h>
32*eef4f27bSRobert Mustacchi #include <sys/poll.h>
33*eef4f27bSRobert Mustacchi #include <sys/modctl.h>
34*eef4f27bSRobert Mustacchi #ifdef __10u7
35*eef4f27bSRobert Mustacchi #include <sys/mac.h>
36*eef4f27bSRobert Mustacchi #else
37*eef4f27bSRobert Mustacchi #include <sys/mac_provider.h>
38*eef4f27bSRobert Mustacchi #endif
39*eef4f27bSRobert Mustacchi #include <sys/stat.h>
40*eef4f27bSRobert Mustacchi #include <sys/ddi.h>
41*eef4f27bSRobert Mustacchi #include <sys/sunddi.h>
42*eef4f27bSRobert Mustacchi #include <sys/pattr.h>
43*eef4f27bSRobert Mustacchi #include <sys/sysmacros.h>
44*eef4f27bSRobert Mustacchi #include <sys/ethernet.h>
45*eef4f27bSRobert Mustacchi #include <sys/strsun.h>
46*eef4f27bSRobert Mustacchi #include <netinet/in.h>
47*eef4f27bSRobert Mustacchi #include <netinet/ip.h>
48*eef4f27bSRobert Mustacchi #include <netinet/udp.h>
49*eef4f27bSRobert Mustacchi #include <inet/common.h>
50*eef4f27bSRobert Mustacchi #include <inet/ip.h>
51*eef4f27bSRobert Mustacchi #include <inet/ip_if.h>
52*eef4f27bSRobert Mustacchi #include <sys/strsubr.h>
53*eef4f27bSRobert Mustacchi #include <sys/pci.h>
54*eef4f27bSRobert Mustacchi #include <sys/kstat.h>
55*eef4f27bSRobert Mustacchi 
56*eef4f27bSRobert Mustacchi 
57*eef4f27bSRobert Mustacchi 
58*eef4f27bSRobert Mustacchi #include "listq.h"
59*eef4f27bSRobert Mustacchi #include "lm5706.h"
60*eef4f27bSRobert Mustacchi #include "54xx_reg.h"
61*eef4f27bSRobert Mustacchi 
62*eef4f27bSRobert Mustacchi #define	BNX_MAGIC	0x0feedead
63*eef4f27bSRobert Mustacchi #define	BNX_STR_SIZE	32
64*eef4f27bSRobert Mustacchi 
65*eef4f27bSRobert Mustacchi #ifdef __sparc
66*eef4f27bSRobert Mustacchi #define	BNX_DMA_ALIGNMENT	0x2000UL
67*eef4f27bSRobert Mustacchi #else
68*eef4f27bSRobert Mustacchi #define	BNX_DMA_ALIGNMENT	0x1000UL
69*eef4f27bSRobert Mustacchi #endif
70*eef4f27bSRobert Mustacchi 
71*eef4f27bSRobert Mustacchi #define	BNX_MAX_SGL_ENTRIES		16
72*eef4f27bSRobert Mustacchi #define	BNX_MIN_BYTES_PER_FRAGMENT	32
73*eef4f27bSRobert Mustacchi 
74*eef4f27bSRobert Mustacchi #define	FW_VER_WITH_UNLOAD_POWER_DOWN	0x01090003
75*eef4f27bSRobert Mustacchi 
76*eef4f27bSRobert Mustacchi 
77*eef4f27bSRobert Mustacchi extern ddi_device_acc_attr_t bnxAccessAttribBAR;
78*eef4f27bSRobert Mustacchi extern ddi_device_acc_attr_t bnxAccessAttribBUF;
79*eef4f27bSRobert Mustacchi extern ddi_dma_attr_t bnx_std_dma_attrib;
80*eef4f27bSRobert Mustacchi 
81*eef4f27bSRobert Mustacchi 
82*eef4f27bSRobert Mustacchi typedef struct _bnx_memreq_t {
83*eef4f27bSRobert Mustacchi 	void   * addr;
84*eef4f27bSRobert Mustacchi 	size_t   size;
85*eef4f27bSRobert Mustacchi } bnx_memreq_t;
86*eef4f27bSRobert Mustacchi 
87*eef4f27bSRobert Mustacchi 
88*eef4f27bSRobert Mustacchi 
89*eef4f27bSRobert Mustacchi /*
90*eef4f27bSRobert Mustacchi  * Transmit queue info structure holds information regarding transmit resources.
91*eef4f27bSRobert Mustacchi  * This consists of two list, one is a free list of transmit packets and another
92*eef4f27bSRobert Mustacchi  * a list of pending packets (packets posted to ASIC for transmit). Upon
93*eef4f27bSRobert Mustacchi  * receiving transmit complete notification from the asic, the message blocks
94*eef4f27bSRobert Mustacchi  * are freed and and packet structure is moved to the free list.
95*eef4f27bSRobert Mustacchi  */
96*eef4f27bSRobert Mustacchi 
97*eef4f27bSRobert Mustacchi typedef	struct _um_xmit_qinfo {
98*eef4f27bSRobert Mustacchi 	ddi_dma_handle_t	dcpyhndl;
99*eef4f27bSRobert Mustacchi 	ddi_acc_handle_t	dcpyahdl;
100*eef4f27bSRobert Mustacchi 	caddr_t			dcpyvirt;
101*eef4f27bSRobert Mustacchi 	lm_u64_t		dcpyphys;
102*eef4f27bSRobert Mustacchi 	size_t			dcpyhard;
103*eef4f27bSRobert Mustacchi 
104*eef4f27bSRobert Mustacchi 	/* Packet descriptor memory. */
105*eef4f27bSRobert Mustacchi 	u32_t			desc_cnt;
106*eef4f27bSRobert Mustacchi 	bnx_memreq_t		desc_mem;
107*eef4f27bSRobert Mustacchi 
108*eef4f27bSRobert Mustacchi 	/* Low resource water marks. */
109*eef4f27bSRobert Mustacchi 	u32_t			thresh_pdwm;
110*eef4f27bSRobert Mustacchi 
111*eef4f27bSRobert Mustacchi 	/* Free queue mutex */
112*eef4f27bSRobert Mustacchi 	kmutex_t		free_mutex;
113*eef4f27bSRobert Mustacchi 
114*eef4f27bSRobert Mustacchi 	/* Packet descriptors that are free for use. */
115*eef4f27bSRobert Mustacchi 	s_list_t		free_tx_desc;
116*eef4f27bSRobert Mustacchi 
117*eef4f27bSRobert Mustacchi 	/* Packet descriptors that have been setup and are awaiting xmit. */
118*eef4f27bSRobert Mustacchi 	s_list_t		tx_resc_que;
119*eef4f27bSRobert Mustacchi } um_xmit_qinfo;
120*eef4f27bSRobert Mustacchi 
121*eef4f27bSRobert Mustacchi 
122*eef4f27bSRobert Mustacchi 
123*eef4f27bSRobert Mustacchi /*
124*eef4f27bSRobert Mustacchi  * Receive queue is mostly managed by the LM (lm_dev->rx_info.chain[]).
125*eef4f27bSRobert Mustacchi  * During initialization, UM allocates receive buffers and prepares the
126*eef4f27bSRobert Mustacchi  * rx descriptions to posts the receive buffers.
127*eef4f27bSRobert Mustacchi  */
128*eef4f27bSRobert Mustacchi typedef	struct _um_recv_qinfo {
129*eef4f27bSRobert Mustacchi 	volatile boolean_t processing;
130*eef4f27bSRobert Mustacchi 
131*eef4f27bSRobert Mustacchi 	/* For packet descriptors that do not have rx buffers assigned. */
132*eef4f27bSRobert Mustacchi 	s_list_t buffq;
133*eef4f27bSRobert Mustacchi 
134*eef4f27bSRobert Mustacchi 	/* For packet descriptors waiting to be sent up. */
135*eef4f27bSRobert Mustacchi 	s_list_t waitq;
136*eef4f27bSRobert Mustacchi } um_recv_qinfo;
137*eef4f27bSRobert Mustacchi 
138*eef4f27bSRobert Mustacchi 
139*eef4f27bSRobert Mustacchi typedef	struct _os_param {
140*eef4f27bSRobert Mustacchi 	u32_t active_resc_flag;
141*eef4f27bSRobert Mustacchi #define	DRV_RESOURCE_PCICFG_MAPPED	0x0001
142*eef4f27bSRobert Mustacchi #define	DRV_RESOURCE_MAP_REGS		0x0002
143*eef4f27bSRobert Mustacchi #define	DRV_RESOURCE_INTR_1		0x0004
144*eef4f27bSRobert Mustacchi #define	DRV_RESOURCE_MUTEX		0x0008
145*eef4f27bSRobert Mustacchi #define	DRV_RESOURCE_HDWR_REGISTER	0x0020
146*eef4f27bSRobert Mustacchi #define	DRV_RESOURCE_GLD_REGISTER	0x0040
147*eef4f27bSRobert Mustacchi #define	DRV_RESOURCE_KSTAT		0x0080
148*eef4f27bSRobert Mustacchi #define	DRV_RESOURCE_TIMER		0x0100
149*eef4f27bSRobert Mustacchi #define	DRV_RESOURCE_MINOR_NODE		0x0200
150*eef4f27bSRobert Mustacchi #define	DRV_LINK_TIMEOUT_CB		0x0400
151*eef4f27bSRobert Mustacchi 
152*eef4f27bSRobert Mustacchi 	dev_info_t *dip;
153*eef4f27bSRobert Mustacchi 
154*eef4f27bSRobert Mustacchi 	ddi_acc_handle_t pci_cfg_handle;
155*eef4f27bSRobert Mustacchi 	ddi_acc_handle_t reg_acc_handle;
156*eef4f27bSRobert Mustacchi 
157*eef4f27bSRobert Mustacchi 	mac_handle_t macp;
158*eef4f27bSRobert Mustacchi 	mac_resource_handle_t rx_resc_handle[NUM_RX_CHAIN];
159*eef4f27bSRobert Mustacchi 	caddr_t regs_addr;
160*eef4f27bSRobert Mustacchi 
161*eef4f27bSRobert Mustacchi 	kmutex_t  gld_mutex;
162*eef4f27bSRobert Mustacchi 	krwlock_t gld_snd_mutex;
163*eef4f27bSRobert Mustacchi 	kmutex_t  xmit_mutex;
164*eef4f27bSRobert Mustacchi 	kmutex_t  rcv_mutex;
165*eef4f27bSRobert Mustacchi 	kmutex_t  phy_mutex;
166*eef4f27bSRobert Mustacchi 	kmutex_t  ind_mutex;
167*eef4f27bSRobert Mustacchi 
168*eef4f27bSRobert Mustacchi 	/*
169*eef4f27bSRobert Mustacchi 	 * Following are generic DMA handles used for the following -
170*eef4f27bSRobert Mustacchi 	 * 1. Status _ Statistic DMA memory
171*eef4f27bSRobert Mustacchi 	 * 2. TXBD queue
172*eef4f27bSRobert Mustacchi 	 * 3. RXBD queue
173*eef4f27bSRobert Mustacchi 	 */
174*eef4f27bSRobert Mustacchi #define	BNX_MAX_PHYS_MEMREQS   32
175*eef4f27bSRobert Mustacchi 	u32_t dma_handles_used;
176*eef4f27bSRobert Mustacchi 	void *dma_virt[BNX_MAX_PHYS_MEMREQS];
177*eef4f27bSRobert Mustacchi 	ddi_dma_handle_t dma_handle[BNX_MAX_PHYS_MEMREQS];
178*eef4f27bSRobert Mustacchi 	ddi_acc_handle_t dma_acc_handle[BNX_MAX_PHYS_MEMREQS];
179*eef4f27bSRobert Mustacchi 
180*eef4f27bSRobert Mustacchi 	ddi_dma_handle_t *status_block_dma_hdl;
181*eef4f27bSRobert Mustacchi 
182*eef4f27bSRobert Mustacchi } os_param_t;
183*eef4f27bSRobert Mustacchi 
184*eef4f27bSRobert Mustacchi 
185*eef4f27bSRobert Mustacchi 
186*eef4f27bSRobert Mustacchi 
187*eef4f27bSRobert Mustacchi /*
188*eef4f27bSRobert Mustacchi  * Following structure hosts attributes related to the device, like media type,
189*eef4f27bSRobert Mustacchi  * transmit/receive descriptor queue information, last status index
190*eef4f27bSRobert Mustacchi  * processed/acknowledged, etc'
191*eef4f27bSRobert Mustacchi  */
192*eef4f27bSRobert Mustacchi 
193*eef4f27bSRobert Mustacchi typedef struct _dev_param {
194*eef4f27bSRobert Mustacchi 
195*eef4f27bSRobert Mustacchi 	u32_t mtu;
196*eef4f27bSRobert Mustacchi 
197*eef4f27bSRobert Mustacchi 	lm_rx_mask_t rx_filter_mask;
198*eef4f27bSRobert Mustacchi 	lm_offload_t enabled_oflds;
199*eef4f27bSRobert Mustacchi 
200*eef4f27bSRobert Mustacchi 	/*
201*eef4f27bSRobert Mustacchi 	 * This is the last value of 'status_idx' processed and acknowledged
202*eef4f27bSRobert Mustacchi 	 * by the driver. This value is compared with current value in the
203*eef4f27bSRobert Mustacchi 	 * status block to determine if new status block was generated by
204*eef4f27bSRobert Mustacchi 	 * host coalesce block.
205*eef4f27bSRobert Mustacchi 	 */
206*eef4f27bSRobert Mustacchi 	u32_t processed_status_idx;
207*eef4f27bSRobert Mustacchi 
208*eef4f27bSRobert Mustacchi 	u32_t fw_ver;
209*eef4f27bSRobert Mustacchi 
210*eef4f27bSRobert Mustacchi 	boolean_t isfiber;
211*eef4f27bSRobert Mustacchi 
212*eef4f27bSRobert Mustacchi     boolean_t disableMsix;
213*eef4f27bSRobert Mustacchi 
214*eef4f27bSRobert Mustacchi     lm_status_t indLink;
215*eef4f27bSRobert Mustacchi     lm_medium_t indMedium;
216*eef4f27bSRobert Mustacchi } device_param_t;
217*eef4f27bSRobert Mustacchi 
218*eef4f27bSRobert Mustacchi 
219*eef4f27bSRobert Mustacchi typedef struct _bnx_ndd_lnk_tbl_t {
220*eef4f27bSRobert Mustacchi 	const char **label;
221*eef4f27bSRobert Mustacchi 	const boolean_t *value;
222*eef4f27bSRobert Mustacchi } bnx_ndd_lnk_tbl_t;
223*eef4f27bSRobert Mustacchi 
224*eef4f27bSRobert Mustacchi 
225*eef4f27bSRobert Mustacchi /* NDD parameters related structure members. */
226*eef4f27bSRobert Mustacchi typedef struct _bnx_ndd_t {
227*eef4f27bSRobert Mustacchi 	caddr_t ndd_data;
228*eef4f27bSRobert Mustacchi 
229*eef4f27bSRobert Mustacchi 	bnx_ndd_lnk_tbl_t lnktbl[3];
230*eef4f27bSRobert Mustacchi 
231*eef4f27bSRobert Mustacchi 	int link_speed;
232*eef4f27bSRobert Mustacchi 	boolean_t link_duplex;
233*eef4f27bSRobert Mustacchi 	boolean_t link_tx_pause;
234*eef4f27bSRobert Mustacchi 	boolean_t link_rx_pause;
235*eef4f27bSRobert Mustacchi } bnx_ndd_t;
236*eef4f27bSRobert Mustacchi 
237*eef4f27bSRobert Mustacchi 
238*eef4f27bSRobert Mustacchi typedef struct _bnx_lnk_cfg_t {
239*eef4f27bSRobert Mustacchi 	boolean_t link_autoneg;
240*eef4f27bSRobert Mustacchi 	boolean_t param_2500fdx;
241*eef4f27bSRobert Mustacchi 	boolean_t param_1000fdx;
242*eef4f27bSRobert Mustacchi 	boolean_t param_1000hdx;
243*eef4f27bSRobert Mustacchi 	boolean_t param_100fdx;
244*eef4f27bSRobert Mustacchi 	boolean_t param_100hdx;
245*eef4f27bSRobert Mustacchi 	boolean_t param_10fdx;
246*eef4f27bSRobert Mustacchi 	boolean_t param_10hdx;
247*eef4f27bSRobert Mustacchi 	boolean_t param_tx_pause;
248*eef4f27bSRobert Mustacchi 	boolean_t param_rx_pause;
249*eef4f27bSRobert Mustacchi } bnx_lnk_cfg_t;
250*eef4f27bSRobert Mustacchi 
251*eef4f27bSRobert Mustacchi 
252*eef4f27bSRobert Mustacchi 
253*eef4f27bSRobert Mustacchi typedef struct _bnx_phy_cfg_t {
254*eef4f27bSRobert Mustacchi 	bnx_lnk_cfg_t lnkcfg;
255*eef4f27bSRobert Mustacchi 
256*eef4f27bSRobert Mustacchi 	boolean_t flow_autoneg;
257*eef4f27bSRobert Mustacchi 	boolean_t wirespeed;
258*eef4f27bSRobert Mustacchi } bnx_phy_cfg_t;
259*eef4f27bSRobert Mustacchi 
260*eef4f27bSRobert Mustacchi 
261*eef4f27bSRobert Mustacchi 
262*eef4f27bSRobert Mustacchi typedef	struct _um_device {
263*eef4f27bSRobert Mustacchi 	/* Lower Module device structure should be the first element */
264*eef4f27bSRobert Mustacchi 	struct _lm_device_t lm_dev;
265*eef4f27bSRobert Mustacchi 
266*eef4f27bSRobert Mustacchi 	u32_t magic;
267*eef4f27bSRobert Mustacchi 
268*eef4f27bSRobert Mustacchi 	ddi_intr_handle_t *pIntrBlock;
269*eef4f27bSRobert Mustacchi 	u32_t intrPriority;
270*eef4f27bSRobert Mustacchi 	int intrType;
271*eef4f27bSRobert Mustacchi 
272*eef4f27bSRobert Mustacchi 	volatile boolean_t intr_enabled;
273*eef4f27bSRobert Mustacchi 	kmutex_t intr_mutex;
274*eef4f27bSRobert Mustacchi 	uint32_t intr_count;
275*eef4f27bSRobert Mustacchi 	uint32_t intr_no_change;
276*eef4f27bSRobert Mustacchi 	uint32_t intr_in_disabled;
277*eef4f27bSRobert Mustacchi 
278*eef4f27bSRobert Mustacchi 	volatile boolean_t timer_enabled;
279*eef4f27bSRobert Mustacchi 	kmutex_t tmr_mutex;
280*eef4f27bSRobert Mustacchi 	timeout_id_t tmrtid;
281*eef4f27bSRobert Mustacchi 	unsigned int timer_link_check_interval;
282*eef4f27bSRobert Mustacchi 	unsigned int timer_link_check_counter;
283*eef4f27bSRobert Mustacchi 	unsigned int timer_link_check_interval2;
284*eef4f27bSRobert Mustacchi 	unsigned int timer_link_check_counter2;
285*eef4f27bSRobert Mustacchi 
286*eef4f27bSRobert Mustacchi 	volatile boolean_t dev_start;
287*eef4f27bSRobert Mustacchi 	volatile boolean_t link_updates_ok;
288*eef4f27bSRobert Mustacchi 
289*eef4f27bSRobert Mustacchi 	os_param_t os_param;
290*eef4f27bSRobert Mustacchi 	device_param_t dev_var;
291*eef4f27bSRobert Mustacchi 
292*eef4f27bSRobert Mustacchi 	u32_t tx_copy_threshold;
293*eef4f27bSRobert Mustacchi 
294*eef4f27bSRobert Mustacchi 	u32_t no_tx_credits;
295*eef4f27bSRobert Mustacchi #define	BNX_TX_RESOURCES_NO_CREDIT	0x01
296*eef4f27bSRobert Mustacchi #define	BNX_TX_RESOURCES_NO_DESC	0x02
297*eef4f27bSRobert Mustacchi /* Unable to allocate DMA resources. (e.g. bind error) */
298*eef4f27bSRobert Mustacchi #define	BNX_TX_RESOURCES_NO_OS_DMA_RES	0x08
299*eef4f27bSRobert Mustacchi #define	BNX_TX_RESOURCES_TOO_MANY_FRAGS	0x10
300*eef4f27bSRobert Mustacchi 
301*eef4f27bSRobert Mustacchi 	um_xmit_qinfo txq[NUM_TX_CHAIN];
302*eef4f27bSRobert Mustacchi #define	_TX_QINFO(pdev, chain)	(pdev->txq[chain])
303*eef4f27bSRobert Mustacchi #define	_TXQ_FREE_DESC(pdev, chain) (pdev->txq[chain].free_tx_desc)
304*eef4f27bSRobert Mustacchi #define	_TXQ_RESC_DESC(pdev, chain) (pdev->txq[chain].tx_resc_que)
305*eef4f27bSRobert Mustacchi 
306*eef4f27bSRobert Mustacchi 	u32_t rx_copy_threshold;
307*eef4f27bSRobert Mustacchi 	uint32_t recv_discards;
308*eef4f27bSRobert Mustacchi 
309*eef4f27bSRobert Mustacchi 	um_recv_qinfo rxq[NUM_RX_CHAIN];
310*eef4f27bSRobert Mustacchi #define	_RX_QINFO(pdev, chain)	(pdev->rxq[chain])
311*eef4f27bSRobert Mustacchi 
312*eef4f27bSRobert Mustacchi 	bnx_ndd_t nddcfg;
313*eef4f27bSRobert Mustacchi 
314*eef4f27bSRobert Mustacchi 	bnx_phy_cfg_t hwinit;
315*eef4f27bSRobert Mustacchi 	bnx_phy_cfg_t curcfg;
316*eef4f27bSRobert Mustacchi 	bnx_lnk_cfg_t remote;
317*eef4f27bSRobert Mustacchi 
318*eef4f27bSRobert Mustacchi 	char dev_name[BNX_STR_SIZE];
319*eef4f27bSRobert Mustacchi 	int instance;
320*eef4f27bSRobert Mustacchi 	char version[BNX_STR_SIZE];
321*eef4f27bSRobert Mustacchi 	char versionFW[BNX_STR_SIZE];
322*eef4f27bSRobert Mustacchi 	char chipName[BNX_STR_SIZE];
323*eef4f27bSRobert Mustacchi 	char intrAlloc[BNX_STR_SIZE];
324*eef4f27bSRobert Mustacchi 	u64_t intrFired;
325*eef4f27bSRobert Mustacchi 
326*eef4f27bSRobert Mustacchi 	kstat_t *kstats;
327*eef4f27bSRobert Mustacchi 	kmutex_t kstatMutex;
328*eef4f27bSRobert Mustacchi 
329*eef4f27bSRobert Mustacchi #define	BNX_MAX_MEMREQS	2
330*eef4f27bSRobert Mustacchi 	unsigned int memcnt;
331*eef4f27bSRobert Mustacchi 	bnx_memreq_t memreq[BNX_MAX_MEMREQS];
332*eef4f27bSRobert Mustacchi } um_device_t;
333*eef4f27bSRobert Mustacchi 
334*eef4f27bSRobert Mustacchi 
335*eef4f27bSRobert Mustacchi 
336*eef4f27bSRobert Mustacchi /*
337*eef4f27bSRobert Mustacchi  * Following structure defines the packet descriptor as seen by the UM module.
338*eef4f27bSRobert Mustacchi  * This is used to map  buffers to lm_packet on xmit path and receive path.
339*eef4f27bSRobert Mustacchi  */
340*eef4f27bSRobert Mustacchi 
341*eef4f27bSRobert Mustacchi typedef	struct _um_txpacket_t {
342*eef4f27bSRobert Mustacchi 	/* Must be the first entry in this structure. */
343*eef4f27bSRobert Mustacchi 	struct _lm_packet_t lm_pkt;
344*eef4f27bSRobert Mustacchi 
345*eef4f27bSRobert Mustacchi 	mblk_t			*mp;
346*eef4f27bSRobert Mustacchi 
347*eef4f27bSRobert Mustacchi 	ddi_dma_handle_t	*cpyhdl;
348*eef4f27bSRobert Mustacchi 	caddr_t			cpymem;
349*eef4f27bSRobert Mustacchi 	lm_u64_t		cpyphy;
350*eef4f27bSRobert Mustacchi 	off_t			cpyoff;
351*eef4f27bSRobert Mustacchi 
352*eef4f27bSRobert Mustacchi 	u32_t			num_handles;
353*eef4f27bSRobert Mustacchi 	ddi_dma_handle_t	dma_handle[BNX_MAX_SGL_ENTRIES];
354*eef4f27bSRobert Mustacchi 
355*eef4f27bSRobert Mustacchi 	lm_frag_list_t		frag_list;
356*eef4f27bSRobert Mustacchi 	lm_frag_t		frag_list_buffer[BNX_MAX_SGL_ENTRIES];
357*eef4f27bSRobert Mustacchi } um_txpacket_t;
358*eef4f27bSRobert Mustacchi 
359*eef4f27bSRobert Mustacchi 
360*eef4f27bSRobert Mustacchi 
361*eef4f27bSRobert Mustacchi #define	BNX_RECV_MAX_FRAGS 1
362*eef4f27bSRobert Mustacchi typedef struct _um_rxpacket_t {
363*eef4f27bSRobert Mustacchi 	/* Must be the first entry in this structure. */
364*eef4f27bSRobert Mustacchi 	struct _lm_packet_t lmpacket;
365*eef4f27bSRobert Mustacchi 
366*eef4f27bSRobert Mustacchi 	ddi_dma_handle_t    dma_handle;
367*eef4f27bSRobert Mustacchi 	ddi_acc_handle_t    dma_acc_handle;
368*eef4f27bSRobert Mustacchi } um_rxpacket_t;
369*eef4f27bSRobert Mustacchi 
370*eef4f27bSRobert Mustacchi 
371*eef4f27bSRobert Mustacchi #define	VLAN_TPID		0x8100u
372*eef4f27bSRobert Mustacchi #define	VLAN_TAGSZ		4
373*eef4f27bSRobert Mustacchi #define	VLAN_TAG_SIZE		4
374*eef4f27bSRobert Mustacchi #define	VLAN_VID_MAX    4094    /* 4095 is reserved */
375*eef4f27bSRobert Mustacchi 
376*eef4f27bSRobert Mustacchi 
377*eef4f27bSRobert Mustacchi typedef struct ether_vlan_header vlan_hdr_t;
378*eef4f27bSRobert Mustacchi #define	DRV_EXTRACT_VLAN_TPID(vhdrp)	htons(vhdrp->ether_tpid)
379*eef4f27bSRobert Mustacchi #define	DRV_EXTRACT_VLAN_TCI(vhdrp)	htons(vhdrp->ether_tci)
380*eef4f27bSRobert Mustacchi #define	DRV_SET_VLAN_TPID(vhdrp, tpid)	vhdrp->ether_tpid = htons(tpid)
381*eef4f27bSRobert Mustacchi #define	DRV_SET_VLAN_TCI(vhdrp, vtag)	vhdrp->ether_tci = htons(vtag)
382*eef4f27bSRobert Mustacchi 
383*eef4f27bSRobert Mustacchi 
384*eef4f27bSRobert Mustacchi 
385*eef4f27bSRobert Mustacchi 
386*eef4f27bSRobert Mustacchi 
387*eef4f27bSRobert Mustacchi /*
388*eef4f27bSRobert Mustacchi  *
389*eef4f27bSRobert Mustacchi  *                      'ndd' Get/Set IOCTL Definition
390*eef4f27bSRobert Mustacchi  *
391*eef4f27bSRobert Mustacchi  */
392*eef4f27bSRobert Mustacchi 
393*eef4f27bSRobert Mustacchi 
394*eef4f27bSRobert Mustacchi /*
395*eef4f27bSRobert Mustacchi  * (Internal) return values from ioctl subroutines
396*eef4f27bSRobert Mustacchi  */
397*eef4f27bSRobert Mustacchi enum ioc_reply {
398*eef4f27bSRobert Mustacchi 	IOC_INVAL = -1,			/* bad, NAK with EINVAL */
399*eef4f27bSRobert Mustacchi 	IOC_DONE,			/* OK, reply sent */
400*eef4f27bSRobert Mustacchi 	IOC_ACK,			/* OK, just send ACK */
401*eef4f27bSRobert Mustacchi 	IOC_REPLY,			/* OK, just send reply */
402*eef4f27bSRobert Mustacchi 	IOC_RESTART_ACK,		/* OK, restart & ACK */
403*eef4f27bSRobert Mustacchi 	IOC_RESTART_REPLY		/* OK, restart & reply */
404*eef4f27bSRobert Mustacchi };
405*eef4f27bSRobert Mustacchi 
406*eef4f27bSRobert Mustacchi /*
407*eef4f27bSRobert Mustacchi  *			Function Prototypes
408*eef4f27bSRobert Mustacchi  *
409*eef4f27bSRobert Mustacchi  */
410*eef4f27bSRobert Mustacchi 
411*eef4f27bSRobert Mustacchi ddi_dma_handle_t *bnx_find_dma_hdl(um_device_t * const umdevice,
412*eef4f27bSRobert Mustacchi     const void * const virtaddr);
413*eef4f27bSRobert Mustacchi 
414*eef4f27bSRobert Mustacchi void um_send_driver_pulse(um_device_t *udevp);
415*eef4f27bSRobert Mustacchi 
416*eef4f27bSRobert Mustacchi int bnx_find_mchash_collision(lm_mc_table_t *mc_table,
417*eef4f27bSRobert Mustacchi     const u8_t *const mc_addr);
418*eef4f27bSRobert Mustacchi 
419*eef4f27bSRobert Mustacchi void bnx_update_phy(um_device_t *pdev);
420*eef4f27bSRobert Mustacchi 
421*eef4f27bSRobert Mustacchi 
422*eef4f27bSRobert Mustacchi boolean_t bnx_kstat_init(um_device_t *pUM);
423*eef4f27bSRobert Mustacchi void bnx_kstat_fini(um_device_t *pUM);
424*eef4f27bSRobert Mustacchi 
425*eef4f27bSRobert Mustacchi #ifdef __cplusplus
426*eef4f27bSRobert Mustacchi }
427*eef4f27bSRobert Mustacchi #endif
428*eef4f27bSRobert Mustacchi 
429*eef4f27bSRobert Mustacchi #endif /* _BNX_H */
430