xref: /dragonfly/sys/dev/netif/nfe/if_nfevar.h (revision 19fe1c42)
1 /*	$OpenBSD: if_nfevar.h,v 1.11 2006/02/19 13:57:02 damien Exp $	*/
2 /*	$DragonFly: src/sys/dev/netif/nfe/if_nfevar.h,v 1.13 2008/07/12 11:44:17 sephe Exp $	*/
3 
4 /*
5  * Copyright (c) 2005 Jonathan Gray <jsg@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 struct nfe_tx_data {
21 	bus_dmamap_t	map;
22 	struct mbuf	*m;
23 };
24 
25 struct nfe_tx_ring {
26 	bus_dma_tag_t		tag;
27 	bus_dmamap_t		map;
28 	bus_addr_t		physaddr;
29 	struct nfe_desc32	*desc32;
30 	struct nfe_desc64	*desc64;
31 
32 	bus_dma_tag_t		data_tag;
33 	struct nfe_tx_data	*data;
34 	int			queued;
35 	int			cur;
36 	int			next;
37 };
38 
39 struct nfe_softc;
40 
41 struct nfe_jbuf {
42 	struct nfe_softc	*sc;
43 	struct nfe_rx_ring	*ring;
44 	int			inuse;
45 	int			slot;
46 	caddr_t			buf;
47 	bus_addr_t		physaddr;
48 	SLIST_ENTRY(nfe_jbuf)	jnext;
49 };
50 
51 struct nfe_rx_data {
52 	bus_dmamap_t	map;
53 	struct mbuf	*m;
54 };
55 
56 struct nfe_rx_ring {
57 	bus_dma_tag_t		tag;
58 	bus_dmamap_t		map;
59 	bus_addr_t		physaddr;
60 	struct nfe_desc32	*desc32;
61 	struct nfe_desc64	*desc64;
62 
63 	bus_dma_tag_t		jtag;
64 	bus_dmamap_t		jmap;
65 	caddr_t			jpool;
66 	struct nfe_jbuf		*jbuf;
67 	SLIST_HEAD(, nfe_jbuf)	jfreelist;
68 
69 	bus_dma_tag_t		data_tag;
70 	bus_dmamap_t		data_tmpmap;
71 	struct nfe_rx_data	*data;
72 	int			bufsz;
73 	int			cur;
74 	int			next;
75 };
76 
77 struct nfe_softc {
78 	struct arpcom		arpcom;
79 
80 	int			sc_mem_rid;
81 	struct resource		*sc_mem_res;
82 	bus_space_handle_t	sc_memh;
83 	bus_space_tag_t		sc_memt;
84 
85 	int			sc_irq_rid;
86 	struct resource		*sc_irq_res;
87 	void			*sc_ih;
88 
89 	device_t		sc_miibus;
90 	struct callout		sc_tick_ch;
91 
92 	int			sc_if_flags;
93 	uint32_t		sc_caps;	/* hardware capabilities */
94 #define NFE_JUMBO_SUP	0x01
95 #define NFE_40BIT_ADDR	0x02
96 #define NFE_HW_CSUM	0x04
97 #define NFE_HW_VLAN	0x08
98 #define NFE_FIX_EADDR	0x10
99 #define NFE_NO_PWRCTL	0x20
100 
101 	uint32_t		sc_flags;
102 #define NFE_F_USE_JUMBO	0x01	/* use jumbo frame */
103 #define NFE_F_DYN_IM	0x02	/* enable dynamic interrupt moderation */
104 #define NFE_F_IRQ_TIMER	0x04	/* hardware timer irq is used */
105 
106 	uint32_t		rxtxctl_desc;
107 	uint32_t		rxtxctl;
108 	uint8_t			mii_phyaddr;
109 
110 	struct nfe_tx_ring	txq;
111 	struct nfe_rx_ring	rxq;
112 
113 	uint32_t		sc_irq_enable;
114 	int			sc_tx_spare;
115 	int			sc_imtime;
116 	int			sc_rx_ring_count;
117 	int			sc_tx_ring_count;
118 	int			sc_debug;
119 	struct sysctl_ctx_list	sc_sysctl_ctx;
120 	struct sysctl_oid	*sc_sysctl_tree;
121 
122 	struct lwkt_serialize	sc_jbuf_serializer;
123 };
124 
125 #define NFE_IRQ_ENABLE(sc)	\
126 	((sc)->sc_imtime == 0 ? NFE_IRQ_NOIMTIMER : \
127 	 (((sc)->sc_flags & NFE_F_DYN_IM) ? NFE_IRQ_NOIMTIMER: NFE_IRQ_IMTIMER))
128