kernel: Use the new auto-created sysctl ctx/tree in various drivers.
[dragonfly.git] / sys / dev / netif / stge / if_stgevar.h
1 /*      $NetBSD: if_stgereg.h,v 1.3 2003/02/10 21:10:07 christos Exp $  */
2 /*      $FreeBSD: src/sys/dev/stge/if_stgereg.h,v 1.1 2006/07/25 00:37:09 yongari Exp $ */
3
4 /*-
5  * Copyright (c) 2001 The NetBSD Foundation, Inc.
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to The NetBSD Foundation
9  * by Jason R. Thorpe.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. All advertising materials mentioning features or use of this software
20  *    must display the following acknowledgement:
21  *      This product includes software developed by the NetBSD
22  *      Foundation, Inc. and its contributors.
23  * 4. Neither the name of The NetBSD Foundation nor the names of its
24  *    contributors may be used to endorse or promote products derived
25  *    from this software without specific prior written permission.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37  * POSSIBILITY OF SUCH DAMAGE.
38  */
39
40 /*
41  * Transmit descriptor list size.
42  */
43 #define STGE_TX_RING_CNT        256
44 #define STGE_TX_LOWAT           (STGE_TX_RING_CNT/32)
45 #define STGE_TX_HIWAT           (STGE_TX_RING_CNT - STGE_TX_LOWAT)
46
47 /*
48  * Receive descriptor list size.
49  */
50 #define STGE_RX_RING_CNT        256
51
52 #define STGE_MAXTXSEGS          STGE_NTXFRAGS
53 #define STGE_MAXSGSIZE          PAGE_SIZE
54
55 #define STGE_JUMBO_FRAMELEN     9022
56 #define STGE_JUMBO_MTU  \
57         (STGE_JUMBO_FRAMELEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
58
59 struct stge_txdesc {
60         struct mbuf *tx_m;              /* head of our mbuf chain */
61         bus_dmamap_t tx_dmamap;         /* our DMA map */
62         STAILQ_ENTRY(stge_txdesc) tx_q;
63 };
64
65 STAILQ_HEAD(stge_txdq, stge_txdesc);
66
67 struct stge_rxdesc {
68         struct mbuf *rx_m;
69         bus_dmamap_t rx_dmamap;
70 };
71
72 #define STGE_ADDR_LO(x)         ((u_int64_t) (x) & 0xffffffff)
73 #define STGE_ADDR_HI(x)         ((u_int64_t) (x) >> 32)
74
75 #define STGE_RING_ALIGN         8
76
77 struct stge_chain_data{
78         bus_dma_tag_t           stge_parent_tag;
79         bus_dma_tag_t           stge_tx_tag;
80         struct stge_txdesc      stge_txdesc[STGE_TX_RING_CNT];
81         struct stge_txdq        stge_txfreeq;
82         struct stge_txdq        stge_txbusyq;
83         bus_dma_tag_t           stge_rx_tag;
84         struct stge_rxdesc      stge_rxdesc[STGE_RX_RING_CNT];
85         bus_dma_tag_t           stge_tx_ring_tag;
86         bus_dmamap_t            stge_tx_ring_map;
87         bus_dma_tag_t           stge_rx_ring_tag;
88         bus_dmamap_t            stge_rx_ring_map;
89         bus_dmamap_t            stge_rx_sparemap;
90
91         int                     stge_tx_prod;
92         int                     stge_tx_cons;
93         int                     stge_tx_cnt;
94         int                     stge_rx_cons;
95         int                     stge_rxlen;
96         struct mbuf             *stge_rxhead;
97         struct mbuf             *stge_rxtail;
98 };
99
100 struct stge_ring_data {
101         struct stge_tfd         *stge_tx_ring;
102         bus_addr_t              stge_tx_ring_paddr;
103         struct stge_rfd         *stge_rx_ring;
104         bus_addr_t              stge_rx_ring_paddr;
105 };
106
107 #define STGE_TX_RING_ADDR(sc, i)        \
108     ((sc)->sc_rdata.stge_tx_ring_paddr + sizeof(struct stge_tfd) * (i))
109 #define STGE_RX_RING_ADDR(sc, i)        \
110     ((sc)->sc_rdata.stge_rx_ring_paddr + sizeof(struct stge_rfd) * (i))
111
112 #define STGE_TX_RING_SZ         \
113     (sizeof(struct stge_tfd) * STGE_TX_RING_CNT)
114 #define STGE_RX_RING_SZ         \
115     (sizeof(struct stge_rfd) * STGE_RX_RING_CNT)
116
117 /*
118  * Software state per device.
119  */
120 struct stge_softc {
121         struct arpcom           arpcom;
122         device_t                sc_dev;
123         device_t                sc_miibus;
124
125         bus_space_handle_t      sc_bhandle;     /* bus space handle */
126         bus_space_tag_t         sc_btag;        /* bus space tag */
127         int                     sc_res_rid;
128         int                     sc_res_type;
129         struct resource         *sc_res;
130
131         int                     sc_irq_rid;
132         struct resource         *sc_irq;
133         void                    *sc_ih;         /* interrupt cookie */
134
135         int                     sc_rev;         /* silicon revision */
136
137         struct callout          sc_tick_ch;     /* tick callout */
138
139         struct ifpoll_compat    sc_npoll;
140         struct stge_chain_data  sc_cdata;
141         struct stge_ring_data   sc_rdata;
142         int                     sc_if_flags;
143         int                     sc_if_framesize;
144         int                     sc_txthresh;    /* Tx threshold */
145         uint32_t                sc_usefiber:1;  /* if we're fiber */
146         uint32_t                sc_stge1023:1;  /* are we a 1023 */
147         uint32_t                sc_DMACtrl;     /* prototype DMACtrl reg. */
148         uint32_t                sc_MACCtrl;     /* prototype MacCtrl reg. */
149         uint16_t                sc_IntEnable;   /* prototype IntEnable reg. */
150         uint16_t                sc_led;         /* LED conf. from EEPROM */
151         uint8_t                 sc_PhyCtrl;     /* prototype PhyCtrl reg. */
152         int                     sc_suspended;
153         int                     sc_detach;
154
155         int                     sc_rxint_nframe;
156         int                     sc_rxint_dmawait;
157         int                     sc_nerr;
158 };
159
160 #define STGE_MAXERR     5
161
162 #define STGE_RXCHAIN_RESET(_sc)                                         \
163 do {                                                                    \
164         (_sc)->sc_cdata.stge_rxhead = NULL;                             \
165         (_sc)->sc_cdata.stge_rxtail = NULL;                             \
166         (_sc)->sc_cdata.stge_rxlen = 0;                                 \
167 } while (/*CONSTCOND*/0)
168
169 #define STGE_TIMEOUT 1000
170
171 struct stge_mii_frame {
172         uint8_t mii_stdelim;
173         uint8_t mii_opcode;
174         uint8_t mii_phyaddr;
175         uint8_t mii_regaddr;
176         uint8_t mii_turnaround;
177         uint16_t mii_data;
178 };