xref: /dragonfly/sys/dev/netif/bnx/if_bnxvar.h (revision ae24b5e0)
1 /*
2  * Copyright (c) 2001 Wind River Systems
3  * Copyright (c) 1997, 1998, 1999, 2001
4  *	Bill Paul <wpaul@windriver.com>.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *	This product includes software developed by Bill Paul.
17  * 4. Neither the name of the author nor the names of any co-contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31  * THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  * $FreeBSD: src/sys/dev/bge/if_bgereg.h,v 1.1.2.16 2004/09/23 20:11:18 ps Exp $
34  */
35 
36 #ifndef _IF_BNXVAR_H_
37 #define _IF_BNXVAR_H_
38 
39 /*
40  * Tigon general information block. This resides in host memory
41  * and contains the status counters, ring control blocks and
42  * producer pointers.
43  */
44 
45 struct bnx_gib {
46 	struct bge_stats	bnx_stats;
47 	struct bge_rcb		bnx_tx_rcb[16];
48 	struct bge_rcb		bnx_std_rx_rcb;
49 	struct bge_rcb		bnx_jumbo_rx_rcb;
50 	struct bge_rcb		bnx_mini_rx_rcb;
51 	struct bge_rcb		bnx_return_rcb;
52 };
53 
54 #define BNX_MIN_FRAMELEN	60
55 #define BNX_MAX_FRAMELEN	1536
56 #define BNX_JUMBO_FRAMELEN	9018
57 #define BNX_JUMBO_MTU		(BNX_JUMBO_FRAMELEN-ETHER_HDR_LEN-ETHER_CRC_LEN)
58 
59 #define BNX_TIMEOUT		5000
60 #define BNX_FIRMWARE_TIMEOUT	100000
61 #define BNX_TXCONS_UNSET	0xFFFF	/* impossible value */
62 
63 /*
64  * Other utility macros.
65  */
66 #define BNX_INC(x, y)		(x) = ((x) + 1) % (y)
67 
68 /*
69  * BAR0 MAC register access macros. The Tigon always uses memory mapped
70  * register accesses and all registers must be accessed with 32 bit
71  * operations.
72  */
73 
74 #define CSR_WRITE_4(sc, reg, val)	\
75 	bus_space_write_4(sc->bnx_btag, sc->bnx_bhandle, reg, val)
76 
77 #define CSR_READ_4(sc, reg)		\
78 	bus_space_read_4(sc->bnx_btag, sc->bnx_bhandle, reg)
79 
80 #define BNX_SETBIT(sc, reg, x)	\
81 	CSR_WRITE_4(sc, reg, (CSR_READ_4(sc, reg) | x))
82 
83 #define BNX_CLRBIT(sc, reg, x)	\
84 	CSR_WRITE_4(sc, reg, (CSR_READ_4(sc, reg) & ~x))
85 
86 /* BAR2 APE register access macros. */
87 #define	APE_WRITE_4(sc, reg, val)	\
88 	bus_write_4(sc->bnx_res2, reg, val)
89 
90 #define	APE_READ_4(sc, reg)		\
91 	bus_read_4(sc->bnx_res2, reg)
92 
93 #define	APE_SETBIT(sc, reg, x)	\
94 	APE_WRITE_4(sc, reg, (APE_READ_4(sc, reg) | (x)))
95 #define	APE_CLRBIT(sc, reg, x)	\
96 	APE_WRITE_4(sc, reg, (APE_READ_4(sc, reg) & ~(x)))
97 
98 #define BNX_MEMWIN_READ(sc, x, val)				\
99 do {								\
100 	pci_write_config(sc->bnx_dev, BGE_PCI_MEMWIN_BASEADDR,	\
101 	    (0xFFFF0000 & x), 4);				\
102 	val = CSR_READ_4(sc, BGE_MEMWIN_START + (x & 0xFFFF));	\
103 } while(0)
104 
105 #define BNX_MEMWIN_WRITE(sc, x, val)				\
106 do {								\
107 	pci_write_config(sc->bnx_dev, BGE_PCI_MEMWIN_BASEADDR,	\
108 	    (0xFFFF0000 & x), 4);				\
109 	CSR_WRITE_4(sc, BGE_MEMWIN_START + (x & 0xFFFF), val);	\
110 } while(0)
111 
112 #define RCB_WRITE_4(sc, rcb, offset, val)			\
113 	bus_space_write_4(sc->bnx_btag, sc->bnx_bhandle,	\
114 			  rcb + offsetof(struct bge_rcb, offset), val)
115 
116 /*
117  * Memory management stuff. Note: the SSLOTS, MSLOTS and JSLOTS
118  * values are tuneable. They control the actual amount of buffers
119  * allocated for the standard, mini and jumbo receive rings.
120  */
121 
122 #define BNX_SSLOTS	256
123 #define BNX_MSLOTS	256
124 #define BNX_JSLOTS	384
125 
126 #define BNX_JRAWLEN (BNX_JUMBO_FRAMELEN + ETHER_ALIGN)
127 #define BNX_JLEN (BNX_JRAWLEN + \
128 	(sizeof(uint64_t) - BNX_JRAWLEN % sizeof(uint64_t)))
129 #define BNX_JPAGESZ PAGE_SIZE
130 #define BNX_RESID (BNX_JPAGESZ - (BNX_JLEN * BNX_JSLOTS) % BNX_JPAGESZ)
131 #define BNX_JMEM ((BNX_JLEN * BNX_JSLOTS) + BNX_RESID)
132 
133 struct bnx_softc;
134 struct bnx_tx_ring;
135 
136 struct bnx_jslot {
137 	struct bnx_softc	*bnx_sc;
138 	void			*bnx_buf;
139 	bus_addr_t		bnx_paddr;
140 	int			bnx_inuse;
141 	int			bnx_slot;
142 	SLIST_ENTRY(bnx_jslot)	jslot_link;
143 };
144 
145 /*
146  * Ring structures. Most of these reside in host memory and we tell
147  * the NIC where they are via the ring control blocks. The exceptions
148  * are the tx and command rings, which live in NIC memory and which
149  * we access via the shared memory window.
150  */
151 struct bnx_ring_data {
152 	struct bge_rx_bd	*bnx_rx_jumbo_ring;
153 	bus_addr_t		bnx_rx_jumbo_ring_paddr;
154 	void			*bnx_jumbo_buf;
155 	struct bnx_gib		bnx_info;
156 };
157 
158 struct bnx_rx_buf {
159 	bus_dmamap_t		bnx_rx_dmamap;
160 	struct mbuf		*bnx_rx_mbuf;
161 	bus_addr_t		bnx_rx_paddr;
162 	int			bnx_rx_len;
163 	int			bnx_rx_refilled;
164 } __cachealign;
165 
166 struct bnx_rx_std_ring {
167 	struct lwkt_serialize	bnx_rx_std_serialize;
168 	struct bnx_softc	*bnx_sc;
169 
170 	uint16_t		bnx_rx_std_stop;
171 	uint16_t		bnx_rx_std;	/* current prod ring head */
172 	struct bge_rx_bd	*bnx_rx_std_ring;
173 
174 	int			bnx_rx_std_refill __cachealign;
175 	int			bnx_rx_std_used;
176 	u_int			bnx_rx_std_running;
177 	struct thread		*bnx_rx_std_ithread;
178 
179 	struct bnx_rx_buf	bnx_rx_std_buf[BGE_STD_RX_RING_CNT];
180 
181 	bus_dma_tag_t		bnx_rx_mtag;	/* RX mbuf DMA tag */
182 
183 	bus_dma_tag_t		bnx_rx_std_ring_tag;
184 	bus_dmamap_t		bnx_rx_std_ring_map;
185 	bus_addr_t		bnx_rx_std_ring_paddr;
186 } __cachealign;
187 
188 struct bnx_rx_ret_ring {
189 	struct lwkt_serialize	bnx_rx_ret_serialize;
190 	int			bnx_rx_mbx;
191 	uint32_t		bnx_saved_status_tag;
192 	volatile uint32_t	*bnx_hw_status_tag;
193 	int			bnx_msix_mbx;
194 	struct bnx_softc	*bnx_sc;
195 	struct bnx_rx_std_ring	*bnx_std;
196 	struct bnx_tx_ring	*bnx_txr;
197 
198 	/* Shadow of bnx_rx_std_ring's bnx_rx_mtag */
199 	bus_dma_tag_t		bnx_rx_mtag;
200 
201 	volatile uint16_t	*bnx_rx_considx;
202 	uint16_t		bnx_rx_saved_considx;
203 	uint16_t		bnx_rx_cnt;
204 	uint16_t		bnx_rx_cntmax;
205 	uint16_t		bnx_rx_mask;
206 	struct bge_rx_bd	*bnx_rx_ret_ring;
207 	bus_dmamap_t		bnx_rx_tmpmap;
208 
209 	bus_dma_tag_t		bnx_rx_ret_ring_tag;
210 	bus_dmamap_t		bnx_rx_ret_ring_map;
211 	bus_addr_t		bnx_rx_ret_ring_paddr;
212 
213 	u_long			bnx_rx_pkt;
214 	u_long			bnx_rx_force_sched;
215 } __cachealign;
216 
217 /*
218  * Mbuf pointers. We need these to keep track of the virtual addresses
219  * of our mbuf chains since we can only convert from physical to virtual,
220  * not the other way around.
221  */
222 struct bnx_chain_data {
223 	bus_dma_tag_t		bnx_parent_tag;
224 	bus_dma_tag_t		bnx_rx_jumbo_ring_tag;
225 	bus_dma_tag_t		bnx_jumbo_tag;
226 	bus_dmamap_t		bnx_rx_jumbo_ring_map;
227 	bus_dmamap_t		bnx_jumbo_map;
228 	struct bnx_rx_buf	bnx_rx_jumbo_chain[BGE_JUMBO_RX_RING_CNT];
229 	/* Stick the jumbo mem management stuff here too. */
230 	struct bnx_jslot	bnx_jslots[BNX_JSLOTS];
231 };
232 
233 struct bnx_tx_buf {
234 	bus_dmamap_t		bnx_tx_dmamap;
235 	struct mbuf		*bnx_tx_mbuf;
236 };
237 
238 struct bnx_tx_ring {
239 	struct lwkt_serialize	bnx_tx_serialize;
240 	volatile uint32_t	*bnx_hw_status_tag;
241 	uint32_t		bnx_saved_status_tag;
242 	struct bnx_softc	*bnx_sc;
243 	struct ifaltq_subque	*bnx_ifsq;
244 	volatile uint16_t	*bnx_tx_considx;
245 	uint16_t		bnx_tx_flags;
246 #define BNX_TX_FLAG_SHORTDMA		0x0001
247 #define BNX_TX_FLAG_FORCE_DEFRAG	0x0002
248 	uint16_t		bnx_tx_saved_considx;
249 	int			bnx_tx_cnt;
250 	uint32_t		bnx_tx_prodidx;
251 	int			bnx_tx_wreg;
252 	int			bnx_tx_mbx;
253 	struct ifsubq_watchdog	bnx_tx_watchdog;
254 
255 	struct bge_tx_bd	*bnx_tx_ring;
256 
257 	bus_dma_tag_t		bnx_tx_mtag;	/* TX mbuf DMA tag */
258 	struct bnx_tx_buf	bnx_tx_buf[BGE_TX_RING_CNT];
259 
260 	bus_dma_tag_t		bnx_tx_ring_tag;
261 	bus_dmamap_t		bnx_tx_ring_map;
262 	bus_addr_t		bnx_tx_ring_paddr;
263 	int			bnx_tx_cpuid;
264 
265 	u_long			bnx_tx_pkt;
266 } __cachealign;
267 
268 struct bnx_intr_data {
269 	struct bnx_softc	*bnx_sc;
270 	struct bnx_rx_ret_ring	*bnx_ret;
271 	struct bnx_tx_ring	*bnx_txr;
272 
273 	int			bnx_intr_cpuid;
274 	struct lwkt_serialize	*bnx_intr_serialize;
275 	struct callout		bnx_intr_timer;
276 	void			(*bnx_intr_check)(void *);
277 	uint16_t		bnx_rx_check_considx;
278 	uint16_t		bnx_tx_check_considx;
279 	boolean_t		bnx_intr_maylose;
280 
281 	void			*bnx_intr_arg;
282 	driver_intr_t		*bnx_intr_func;
283 	void			*bnx_intr_hand;
284 	struct resource		*bnx_intr_res;
285 	int			bnx_intr_rid;
286 	int			bnx_intr_mbx;
287 	const uint32_t		*bnx_saved_status_tag;
288 
289 	const char		*bnx_intr_desc;
290 	char			bnx_intr_desc0[64];
291 
292 	bus_dma_tag_t		bnx_status_tag;
293 	bus_dmamap_t		bnx_status_map;
294 	struct bge_status_block	*bnx_status_block;
295 	bus_addr_t		bnx_status_block_paddr;
296 } __cachealign;
297 
298 #define BNX_RX_RING_MAX		4
299 #define BNX_TX_RING_MAX		4
300 #define BNX_INTR_MAX		5
301 
302 struct bnx_softc {
303 	struct arpcom		arpcom;		/* interface info */
304 	device_t		bnx_dev;
305 	device_t		bnx_miibus;
306 	bus_space_handle_t	bnx_bhandle;
307 	bus_space_tag_t		bnx_btag;
308 	struct resource		*bnx_res;	/* MAC mapped I/O */
309 	struct resource		*bnx_res2;	/* APE mapped I/O */
310 	struct ifmedia		bnx_ifmedia;	/* TBI media info */
311 	int			bnx_pciecap;
312 	uint32_t		bnx_flags;	/* BNX_FLAG_ */
313 #define BNX_FLAG_TBI		0x00000001
314 #define BNX_FLAG_JUMBO		0x00000002
315 #define BNX_FLAG_APE		0x00000004
316 #define BNX_FLAG_5717_PLUS	0x00000008
317 #define BNX_FLAG_MII_SERDES	0x00000010
318 #define BNX_FLAG_CPMU		0x00000020
319 #define BNX_FLAG_57765_PLUS	0x00000040
320 #define BNX_FLAG_57765_FAMILY	0x00000080
321 #define BNX_FLAG_STATUSTAG_BUG	0x00000100
322 #define BNX_FLAG_TSO		0x00000200
323 #define BNX_FLAG_NO_EEPROM	0x10000000
324 #define BNX_FLAG_RXTX_BUNDLE	0x20000000
325 #define BNX_FLAG_STATUS_HASTAG	0x80000000
326 
327 	uint32_t		bnx_mfw_flags;	/* Management F/W flags */
328 #define	BNX_MFW_ON_RXCPU	0x00000001
329 #define	BNX_MFW_ON_APE		0x00000002
330 #define	BNX_MFW_TYPE_NCSI	0x00000004
331 #define	BNX_MFW_TYPE_DASH	0x00000008
332 	int			bnx_phy_ape_lock;
333 	int			bnx_func_addr;
334 
335 	uint32_t		bnx_chipid;
336 	uint32_t		bnx_asicrev;
337 	uint32_t		bnx_chiprev;
338 	struct bnx_ring_data	bnx_ldata;	/* rings */
339 	struct bnx_chain_data	bnx_cdata;	/* mbufs */
340 
341 	struct lwkt_serialize	bnx_main_serialize;
342 	volatile uint32_t	*bnx_hw_status;
343 	volatile uint32_t	*bnx_hw_status_tag;
344 	uint32_t		bnx_saved_status_tag;
345 	int			bnx_link_evt;
346 	u_long			bnx_errors;
347 	u_long			bnx_norxbds;
348 
349 	int			bnx_serialize_cnt;
350 	struct lwkt_serialize	**bnx_serialize;
351 
352 	int			bnx_tx_ringcnt;
353 	struct bnx_tx_ring	*bnx_tx_ring;
354 	int			bnx_rx_retcnt;
355 	struct bnx_rx_ret_ring	*bnx_rx_ret_ring;
356 	struct bnx_rx_std_ring	bnx_rx_std_ring;
357 
358 	uint16_t		bnx_jumbo;	/* current jumo ring head */
359 	SLIST_HEAD(__bnx_jfreehead, bnx_jslot)	bnx_jfree_listhead;
360 	struct lwkt_serialize	bnx_jslot_serializer;
361 	uint32_t		bnx_rx_coal_ticks;
362 	uint32_t		bnx_tx_coal_ticks;
363 	uint32_t		bnx_rx_coal_bds;
364 	uint32_t		bnx_rx_coal_bds_poll;
365 	uint32_t		bnx_tx_coal_bds;
366 	uint32_t		bnx_tx_coal_bds_poll;
367 	uint32_t		bnx_rx_coal_bds_int;
368 	uint32_t		bnx_tx_coal_bds_int;
369 	uint32_t		bnx_mi_mode;
370 	int			bnx_if_flags;
371 	int			bnx_link;
372 	int			bnx_tick_cpuid;
373 	struct callout		bnx_tick_timer;
374 
375 	int			bnx_npoll_rxoff;
376 	int			bnx_npoll_txoff;
377 
378 	int			bnx_msix_mem_rid;
379 	struct resource		*bnx_msix_mem_res;
380 	int			bnx_intr_type;
381 	int			bnx_intr_cnt;
382 	struct bnx_intr_data	bnx_intr_data[BNX_INTR_MAX];
383 
384 	int			bnx_phyno;
385 	uint32_t		bnx_coal_chg;
386 #define BNX_RX_COAL_TICKS_CHG		0x01
387 #define BNX_TX_COAL_TICKS_CHG		0x02
388 #define BNX_RX_COAL_BDS_CHG		0x04
389 #define BNX_TX_COAL_BDS_CHG		0x08
390 #define BNX_RX_COAL_BDS_INT_CHG		0x40
391 #define BNX_TX_COAL_BDS_INT_CHG		0x80
392 
393 	void			(*bnx_link_upd)(struct bnx_softc *, uint32_t);
394 	uint32_t		bnx_link_chg;
395 
396 	int			bnx_rss_debug;
397 #define BNX_TSO_NSTATS		45
398 	u_long			bnx_tsosegs[BNX_TSO_NSTATS];
399 };
400 
401 #define BNX_NSEG_NEW		40
402 #define BNX_NSEG_SPARE		33	/* enough for 64K TSO segment */
403 #define BNX_NSEG_RSVD		4
404 
405 /* RX coalesce ticks, unit: us */
406 #define BNX_RX_COAL_TICKS_MIN	0
407 #define BNX_RX_COAL_TICKS_DEF	160
408 #define BNX_RX_COAL_TICKS_MAX	1023
409 
410 /* TX coalesce ticks, unit: us */
411 #define BNX_TX_COAL_TICKS_MIN	0
412 #define BNX_TX_COAL_TICKS_DEF	1023
413 #define BNX_TX_COAL_TICKS_MAX	1023
414 
415 /* RX coalesce BDs */
416 #define BNX_RX_COAL_BDS_MIN	0
417 #define BNX_RX_COAL_BDS_DEF	0
418 #define BNX_RX_COAL_BDS_INT_DEF	80
419 #define BNX_RX_COAL_BDS_MAX	255
420 
421 /* TX coalesce BDs */
422 #define BNX_TX_COAL_BDS_MIN	0
423 #define BNX_TX_COAL_BDS_DEF	128
424 #define BNX_TX_COAL_BDS_POLL_DEF 64
425 #define BNX_TX_COAL_BDS_INT_DEF	64
426 #define BNX_TX_COAL_BDS_MAX	255
427 
428 /* Number of segments sent before writing to TX related registers */
429 #define BNX_TX_WREG_NSEGS	8
430 
431 /* Return ring descriptor count */
432 #define BNX_RETURN_RING_CNT	512
433 
434 #define BNX_TX_RING_MAX		4
435 
436 #define BNX_RSS_ENABLED(sc)	((sc)->bnx_rx_retcnt > 1)
437 
438 #endif	/* !_IF_BNXVAR_H_ */
439