1e27a8b6c0c3c9918505822a9d0b1b57e1751fc6
[dragonfly.git] / sys / dev / netif / nfe / if_nfevar.h
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         bus_dma_tag_t           sc_dtag;
111         struct nfe_tx_ring      txq;
112         struct nfe_rx_ring      rxq;
113
114         uint32_t                sc_irq_enable;
115         int                     sc_tx_spare;
116         int                     sc_imtime;
117         int                     sc_rx_ring_count;
118         int                     sc_tx_ring_count;
119         int                     sc_debug;
120         struct sysctl_ctx_list  sc_sysctl_ctx;
121         struct sysctl_oid       *sc_sysctl_tree;
122
123         struct lwkt_serialize   sc_jbuf_serializer;
124 };
125
126 #define NFE_IRQ_ENABLE(sc)      \
127         ((sc)->sc_imtime == 0 ? NFE_IRQ_NOIMTIMER : \
128          (((sc)->sc_flags & NFE_F_DYN_IM) ? NFE_IRQ_NOIMTIMER: NFE_IRQ_IMTIMER))
129
130 #define NFE_ADDR_HI(addr)       ((uint64_t) (addr) >> 32)
131 #define NFE_ADDR_LO(addr)       ((uint64_t) (addr) & 0xffffffff)