⬢ DragonFlyBSD Kernel Audit
sys/dev/netif/bnx/if_bnxvar.h
← back
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
/*
 * Copyright (c) 2001 Wind River Systems
 * Copyright (c) 1997, 1998, 1999, 2001
 *	Bill Paul <wpaul@windriver.com>.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by Bill Paul.
 * 4. Neither the name of the author nor the names of any co-contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $FreeBSD: src/sys/dev/bge/if_bgereg.h,v 1.1.2.16 2004/09/23 20:11:18 ps Exp $
 */

#ifndef _IF_BNXVAR_H_
#define _IF_BNXVAR_H_

/*
 * Tigon general information block. This resides in host memory
 * and contains the status counters, ring control blocks and
 * producer pointers.
 */

struct bnx_gib {
	struct bge_stats	bnx_stats;
	struct bge_rcb		bnx_tx_rcb[16];
	struct bge_rcb		bnx_std_rx_rcb;
	struct bge_rcb		bnx_jumbo_rx_rcb;
	struct bge_rcb		bnx_mini_rx_rcb;
	struct bge_rcb		bnx_return_rcb;
};

#define BNX_MIN_FRAMELEN	60
#define BNX_MAX_FRAMELEN	1536
#define BNX_JUMBO_FRAMELEN	9018
#define BNX_JUMBO_MTU		(BNX_JUMBO_FRAMELEN-ETHER_HDR_LEN-ETHER_CRC_LEN)

#define BNX_TIMEOUT		5000
#define BNX_FIRMWARE_TIMEOUT	100000
#define BNX_TXCONS_UNSET	0xFFFF	/* impossible value */

/*
 * Other utility macros.
 */
#define BNX_INC(x, y)		(x) = ((x) + 1) % (y)

/*
 * BAR0 MAC register access macros. The Tigon always uses memory mapped
 * register accesses and all registers must be accessed with 32 bit
 * operations.
 */

#define CSR_WRITE_4(sc, reg, val)	\
	bus_space_write_4(sc->bnx_btag, sc->bnx_bhandle, reg, val)

#define CSR_READ_4(sc, reg)		\
	bus_space_read_4(sc->bnx_btag, sc->bnx_bhandle, reg)

#define BNX_SETBIT(sc, reg, x)	\
	CSR_WRITE_4(sc, reg, (CSR_READ_4(sc, reg) | x))

#define BNX_CLRBIT(sc, reg, x)	\
	CSR_WRITE_4(sc, reg, (CSR_READ_4(sc, reg) & ~x))

/* BAR2 APE register access macros. */
#define	APE_WRITE_4(sc, reg, val)	\
	bus_write_4(sc->bnx_res2, reg, val)

#define	APE_READ_4(sc, reg)		\
	bus_read_4(sc->bnx_res2, reg)

#define	APE_SETBIT(sc, reg, x)	\
	APE_WRITE_4(sc, reg, (APE_READ_4(sc, reg) | (x)))
#define	APE_CLRBIT(sc, reg, x)	\
	APE_WRITE_4(sc, reg, (APE_READ_4(sc, reg) & ~(x)))

#define BNX_MEMWIN_READ(sc, x, val)				\
do {								\
	pci_write_config(sc->bnx_dev, BGE_PCI_MEMWIN_BASEADDR,	\
	    (0xFFFF0000 & x), 4);				\
	val = CSR_READ_4(sc, BGE_MEMWIN_START + (x & 0xFFFF));	\
} while(0)

#define BNX_MEMWIN_WRITE(sc, x, val)				\
do {								\
	pci_write_config(sc->bnx_dev, BGE_PCI_MEMWIN_BASEADDR,	\
	    (0xFFFF0000 & x), 4);				\
	CSR_WRITE_4(sc, BGE_MEMWIN_START + (x & 0xFFFF), val);	\
} while(0)

#define RCB_WRITE_4(sc, rcb, offset, val)			\
	bus_space_write_4(sc->bnx_btag, sc->bnx_bhandle,	\
			  rcb + offsetof(struct bge_rcb, offset), val)

/*
 * Memory management stuff. Note: the SSLOTS, MSLOTS and JSLOTS
 * values are tuneable. They control the actual amount of buffers
 * allocated for the standard, mini and jumbo receive rings.
 */

#define BNX_SSLOTS	256
#define BNX_MSLOTS	256
#define BNX_JSLOTS	384

#define BNX_JRAWLEN (BNX_JUMBO_FRAMELEN + ETHER_ALIGN)
#define BNX_JLEN (BNX_JRAWLEN + \
	(sizeof(uint64_t) - BNX_JRAWLEN % sizeof(uint64_t)))
#define BNX_JPAGESZ PAGE_SIZE
#define BNX_RESID (BNX_JPAGESZ - (BNX_JLEN * BNX_JSLOTS) % BNX_JPAGESZ)
#define BNX_JMEM ((BNX_JLEN * BNX_JSLOTS) + BNX_RESID)

struct bnx_softc;
struct bnx_tx_ring;

struct bnx_jslot {
	struct bnx_softc	*bnx_sc;
	void			*bnx_buf;
	bus_addr_t		bnx_paddr;
	int			bnx_inuse;
	int			bnx_slot;
	SLIST_ENTRY(bnx_jslot)	jslot_link;
};

/*
 * Ring structures. Most of these reside in host memory and we tell
 * the NIC where they are via the ring control blocks. The exceptions
 * are the tx and command rings, which live in NIC memory and which
 * we access via the shared memory window.
 */
struct bnx_ring_data {
	struct bge_rx_bd	*bnx_rx_jumbo_ring;
	bus_addr_t		bnx_rx_jumbo_ring_paddr;
	void			*bnx_jumbo_buf;
	struct bnx_gib		bnx_info;
};

struct bnx_rx_buf {
	bus_dmamap_t		bnx_rx_dmamap;
	struct mbuf		*bnx_rx_mbuf;
	bus_addr_t		bnx_rx_paddr;
	int			bnx_rx_len;
	int			bnx_rx_refilled;
} __cachealign;

struct bnx_rx_std_ring {
	struct lwkt_serialize	bnx_rx_std_serialize;
	struct bnx_softc	*bnx_sc;

	uint16_t		bnx_rx_std_stop;
	uint16_t		bnx_rx_std;	/* current prod ring head */
	struct bge_rx_bd	*bnx_rx_std_ring;

	int			bnx_rx_std_refill __cachealign;
	int			bnx_rx_std_used;
	u_int			bnx_rx_std_running;
	struct thread		*bnx_rx_std_ithread;

	struct bnx_rx_buf	bnx_rx_std_buf[BGE_STD_RX_RING_CNT];

	bus_dma_tag_t		bnx_rx_mtag;	/* RX mbuf DMA tag */

	bus_dma_tag_t		bnx_rx_std_ring_tag;
	bus_dmamap_t		bnx_rx_std_ring_map;
	bus_addr_t		bnx_rx_std_ring_paddr;
} __cachealign;

struct bnx_rx_ret_ring {
	struct lwkt_serialize	bnx_rx_ret_serialize;
	int			bnx_rx_mbx;
	uint32_t		bnx_saved_status_tag;
	volatile uint32_t	*bnx_hw_status_tag;
	int			bnx_msix_mbx;
	struct bnx_softc	*bnx_sc;
	struct bnx_rx_std_ring	*bnx_std;
	struct bnx_tx_ring	*bnx_txr;

	/* Shadow of bnx_rx_std_ring's bnx_rx_mtag */
	bus_dma_tag_t		bnx_rx_mtag;

	volatile uint16_t	*bnx_rx_considx;
	uint16_t		bnx_rx_saved_considx;
	uint16_t		bnx_rx_cnt;
	uint16_t		bnx_rx_cntmax;
	uint16_t		bnx_rx_mask;
	struct bge_rx_bd	*bnx_rx_ret_ring;
	bus_dmamap_t		bnx_rx_tmpmap;

	bus_dma_tag_t		bnx_rx_ret_ring_tag;
	bus_dmamap_t		bnx_rx_ret_ring_map;
	bus_addr_t		bnx_rx_ret_ring_paddr;

	u_long			bnx_rx_pkt;
	u_long			bnx_rx_force_sched;
} __cachealign;

/*
 * Mbuf pointers. We need these to keep track of the virtual addresses
 * of our mbuf chains since we can only convert from physical to virtual,
 * not the other way around.
 */
struct bnx_chain_data {
	bus_dma_tag_t		bnx_parent_tag;
	bus_dma_tag_t		bnx_rx_jumbo_ring_tag;
	bus_dma_tag_t		bnx_jumbo_tag;
	bus_dmamap_t		bnx_rx_jumbo_ring_map;
	bus_dmamap_t		bnx_jumbo_map;
	struct bnx_rx_buf	bnx_rx_jumbo_chain[BGE_JUMBO_RX_RING_CNT];
	/* Stick the jumbo mem management stuff here too. */
	struct bnx_jslot	bnx_jslots[BNX_JSLOTS];
};

struct bnx_tx_buf {
	bus_dmamap_t		bnx_tx_dmamap;
	struct mbuf		*bnx_tx_mbuf;
};

struct bnx_tx_ring {
	struct lwkt_serialize	bnx_tx_serialize;
	volatile uint32_t	*bnx_hw_status_tag;
	uint32_t		bnx_saved_status_tag;
	struct bnx_softc	*bnx_sc;
	struct ifaltq_subque	*bnx_ifsq;
	volatile uint16_t	*bnx_tx_considx;
	uint16_t		bnx_tx_flags;
#define BNX_TX_FLAG_SHORTDMA		0x0001
#define BNX_TX_FLAG_FORCE_DEFRAG	0x0002
	uint16_t		bnx_tx_saved_considx;
	int			bnx_tx_cnt;
	uint32_t		bnx_tx_prodidx;
	int			bnx_tx_wreg;
	int			bnx_tx_mbx;
	struct ifsubq_watchdog	bnx_tx_watchdog;

	struct bge_tx_bd	*bnx_tx_ring;

	bus_dma_tag_t		bnx_tx_mtag;	/* TX mbuf DMA tag */
	struct bnx_tx_buf	bnx_tx_buf[BGE_TX_RING_CNT];

	bus_dma_tag_t		bnx_tx_ring_tag;
	bus_dmamap_t		bnx_tx_ring_map;
	bus_addr_t		bnx_tx_ring_paddr;
	int			bnx_tx_cpuid;

	u_long			bnx_tx_pkt;
} __cachealign;

struct bnx_intr_data {
	struct bnx_softc	*bnx_sc;
	struct bnx_rx_ret_ring	*bnx_ret;
	struct bnx_tx_ring	*bnx_txr;

	int			bnx_intr_cpuid;
	struct lwkt_serialize	*bnx_intr_serialize;
	struct callout		bnx_intr_timer;
	void			(*bnx_intr_check)(void *);
	uint16_t		bnx_rx_check_considx;
	uint16_t		bnx_tx_check_considx;
	boolean_t		bnx_intr_maylose;

	void			*bnx_intr_arg;
	driver_intr_t		*bnx_intr_func;
	void			*bnx_intr_hand;
	struct resource		*bnx_intr_res;
	int			bnx_intr_rid;
	int			bnx_intr_mbx;
	const uint32_t		*bnx_saved_status_tag;

	const char		*bnx_intr_desc;
	char			bnx_intr_desc0[64];

	bus_dma_tag_t		bnx_status_tag;
	bus_dmamap_t		bnx_status_map;
	struct bge_status_block	*bnx_status_block;
	bus_addr_t		bnx_status_block_paddr;
} __cachealign;

#define BNX_RX_RING_MAX		4
#define BNX_TX_RING_MAX		4
#define BNX_INTR_MAX		5

#define BNX_RDRTABLE_SIZE	(BGE_RSS_INDIR_TBLENT_CNT * \
				 BGE_RSS_INDIR_TBL_CNT)

struct bnx_softc {
	struct arpcom		arpcom;		/* interface info */
	device_t		bnx_dev;
	device_t		bnx_miibus;
	bus_space_handle_t	bnx_bhandle;
	bus_space_tag_t		bnx_btag;
	struct resource		*bnx_res;	/* MAC mapped I/O */
	struct resource		*bnx_res2;	/* APE mapped I/O */
	struct ifmedia		bnx_ifmedia;	/* TBI media info */
	int			bnx_pciecap;
	uint32_t		bnx_flags;	/* BNX_FLAG_ */
#define BNX_FLAG_TBI		0x00000001
#define BNX_FLAG_JUMBO		0x00000002
#define BNX_FLAG_APE		0x00000004
#define BNX_FLAG_5717_PLUS	0x00000008
#define BNX_FLAG_MII_SERDES	0x00000010
#define BNX_FLAG_CPMU		0x00000020
#define BNX_FLAG_57765_PLUS	0x00000040
#define BNX_FLAG_57765_FAMILY	0x00000080
#define BNX_FLAG_STATUSTAG_BUG	0x00000100
#define BNX_FLAG_TSO		0x00000200
#define BNX_FLAG_NO_EEPROM	0x10000000
#define BNX_FLAG_RXTX_BUNDLE	0x20000000
#define BNX_FLAG_STATUS_HASTAG	0x80000000

	uint32_t		bnx_mfw_flags;	/* Management F/W flags */
#define	BNX_MFW_ON_RXCPU	0x00000001
#define	BNX_MFW_ON_APE		0x00000002
#define	BNX_MFW_TYPE_NCSI	0x00000004
#define	BNX_MFW_TYPE_DASH	0x00000008
	int			bnx_phy_ape_lock;
	int			bnx_func_addr;

	uint32_t		bnx_chipid;
	uint32_t		bnx_asicrev;
	uint32_t		bnx_chiprev;
	struct bnx_ring_data	bnx_ldata;	/* rings */
	struct bnx_chain_data	bnx_cdata;	/* mbufs */

	struct lwkt_serialize	bnx_main_serialize;
	volatile uint32_t	*bnx_hw_status;
	volatile uint32_t	*bnx_hw_status_tag;
	uint32_t		bnx_saved_status_tag;
	int			bnx_link_evt;
	u_long			bnx_errors;
	u_long			bnx_norxbds;

	int			bnx_serialize_cnt;
	struct lwkt_serialize	**bnx_serialize;

	int			bnx_tx_ringcnt;
	struct bnx_tx_ring	*bnx_tx_ring;
	int			bnx_rx_retcnt;
	struct bnx_rx_ret_ring	*bnx_rx_ret_ring;
	struct bnx_rx_std_ring	bnx_rx_std_ring;

	uint16_t		bnx_jumbo;	/* current jumo ring head */
	SLIST_HEAD(__bnx_jfreehead, bnx_jslot)	bnx_jfree_listhead;
	struct lwkt_serialize	bnx_jslot_serializer;
	uint32_t		bnx_rx_coal_ticks;
	uint32_t		bnx_tx_coal_ticks;
	uint32_t		bnx_rx_coal_bds;
	uint32_t		bnx_rx_coal_bds_poll;
	uint32_t		bnx_tx_coal_bds;
	uint32_t		bnx_tx_coal_bds_poll;
	uint32_t		bnx_rx_coal_bds_int;
	uint32_t		bnx_tx_coal_bds_int;
	uint32_t		bnx_mi_mode;
	int			bnx_if_flags;
	int			bnx_link;
	uint32_t		bnx_rdma_wa;
	int			bnx_tick_cpuid;
	struct callout		bnx_tick_timer;

	struct if_ringmap	*bnx_tx_rmap;
	struct if_ringmap	*bnx_rx_rmap;

	int			bnx_msix_mem_rid;
	struct resource		*bnx_msix_mem_res;
	int			bnx_intr_type;
	int			bnx_intr_cnt;
	struct bnx_intr_data	bnx_intr_data[BNX_INTR_MAX];

	int			bnx_rdr_table[BNX_RDRTABLE_SIZE];

	int			bnx_phyno;
	uint32_t		bnx_coal_chg;
#define BNX_RX_COAL_TICKS_CHG		0x01
#define BNX_TX_COAL_TICKS_CHG		0x02
#define BNX_RX_COAL_BDS_CHG		0x04
#define BNX_TX_COAL_BDS_CHG		0x08
#define BNX_RX_COAL_BDS_INT_CHG		0x40
#define BNX_TX_COAL_BDS_INT_CHG		0x80

	void			(*bnx_link_upd)(struct bnx_softc *, uint32_t);
	uint32_t		bnx_link_chg;

	int			bnx_rss_debug;
#define BNX_TSO_NSTATS		45
	u_long			bnx_tsosegs[BNX_TSO_NSTATS];
};

#define BNX_NSEG_NEW		40
#define BNX_NSEG_SPARE		33	/* enough for 64K TSO segment */
#define BNX_NSEG_RSVD		4

/* RX coalesce ticks, unit: us */
#define BNX_RX_COAL_TICKS_MIN	0
#define BNX_RX_COAL_TICKS_DEF	160
#define BNX_RX_COAL_TICKS_MAX	1023

/* TX coalesce ticks, unit: us */
#define BNX_TX_COAL_TICKS_MIN	0
#define BNX_TX_COAL_TICKS_DEF	1023
#define BNX_TX_COAL_TICKS_MAX	1023

/* RX coalesce BDs */
#define BNX_RX_COAL_BDS_MIN	0
#define BNX_RX_COAL_BDS_DEF	0
#define BNX_RX_COAL_BDS_INT_DEF	80
#define BNX_RX_COAL_BDS_MAX	255

/* TX coalesce BDs */
#define BNX_TX_COAL_BDS_MIN	0
#define BNX_TX_COAL_BDS_DEF	128
#define BNX_TX_COAL_BDS_POLL_DEF 64
#define BNX_TX_COAL_BDS_INT_DEF	64
#define BNX_TX_COAL_BDS_MAX	255

/* Number of segments sent before writing to TX related registers */
#define BNX_TX_WREG_NSEGS	8

/* Return ring descriptor count */
#define BNX_RETURN_RING_CNT	512

#define BNX_TX_RING_MAX		4

#define BNX_RSS_ENABLED(sc)	((sc)->bnx_rx_retcnt > 1)

#endif	/* !_IF_BNXVAR_H_ */