if_mvxpevar.h revision 1.3.16.2 1 1.3.16.2 jdolecek /* $NetBSD: if_mvxpevar.h,v 1.3.16.2 2017/12/03 11:37:05 jdolecek Exp $ */
2 1.3.16.2 jdolecek /*
3 1.3.16.2 jdolecek * Copyright (c) 2015 Internet Initiative Japan Inc.
4 1.3.16.2 jdolecek * All rights reserved.
5 1.3.16.2 jdolecek *
6 1.3.16.2 jdolecek * Redistribution and use in source and binary forms, with or without
7 1.3.16.2 jdolecek * modification, are permitted provided that the following conditions
8 1.3.16.2 jdolecek * are met:
9 1.3.16.2 jdolecek * 1. Redistributions of source code must retain the above copyright
10 1.3.16.2 jdolecek * notice, this list of conditions and the following disclaimer.
11 1.3.16.2 jdolecek * 2. Redistributions in binary form must reproduce the above copyright
12 1.3.16.2 jdolecek * notice, this list of conditions and the following disclaimer in the
13 1.3.16.2 jdolecek * documentation and/or other materials provided with the distribution.
14 1.3.16.2 jdolecek *
15 1.3.16.2 jdolecek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 1.3.16.2 jdolecek * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 1.3.16.2 jdolecek * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 1.3.16.2 jdolecek * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
19 1.3.16.2 jdolecek * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 1.3.16.2 jdolecek * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 1.3.16.2 jdolecek * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 1.3.16.2 jdolecek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23 1.3.16.2 jdolecek * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24 1.3.16.2 jdolecek * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 1.3.16.2 jdolecek * POSSIBILITY OF SUCH DAMAGE.
26 1.3.16.2 jdolecek */
27 1.3.16.2 jdolecek #ifndef _IF_MVXPEVAR_H_
28 1.3.16.2 jdolecek #define _IF_MVXPEVAR_H_
29 1.3.16.2 jdolecek #include <net/if.h>
30 1.3.16.2 jdolecek #include <dev/marvell/mvxpbmvar.h>
31 1.3.16.2 jdolecek
32 1.3.16.2 jdolecek /*
33 1.3.16.2 jdolecek * Limit of packet sizes.
34 1.3.16.2 jdolecek */
35 1.3.16.2 jdolecek #define MVXPE_HWHEADER_SIZE 2 /* Marvell Header */
36 1.3.16.2 jdolecek #define MVXPE_MRU 2000 /* Max Receive Unit */
37 1.3.16.2 jdolecek #define MVXPE_MTU MVXPE_MRU /* Max Transmit Unit */
38 1.3.16.2 jdolecek
39 1.3.16.2 jdolecek /*
40 1.3.16.2 jdolecek * Default limit of queue length
41 1.3.16.2 jdolecek *
42 1.3.16.2 jdolecek * queue 0 is lowest priority and queue 7 is highest priority.
43 1.3.16.2 jdolecek *
44 1.3.16.2 jdolecek * XXX: packet classifier is not implement yet
45 1.3.16.2 jdolecek */
46 1.3.16.2 jdolecek #define MVXPE_RX_QUEUE_LIMIT_0 IFQ_MAXLEN
47 1.3.16.2 jdolecek #define MVXPE_RX_QUEUE_LIMIT_1 8
48 1.3.16.2 jdolecek #define MVXPE_RX_QUEUE_LIMIT_2 8
49 1.3.16.2 jdolecek #define MVXPE_RX_QUEUE_LIMIT_3 8
50 1.3.16.2 jdolecek #define MVXPE_RX_QUEUE_LIMIT_4 8
51 1.3.16.2 jdolecek #define MVXPE_RX_QUEUE_LIMIT_5 8
52 1.3.16.2 jdolecek #define MVXPE_RX_QUEUE_LIMIT_6 8
53 1.3.16.2 jdolecek #define MVXPE_RX_QUEUE_LIMIT_7 8
54 1.3.16.2 jdolecek
55 1.3.16.2 jdolecek #define MVXPE_TX_QUEUE_LIMIT_0 IFQ_MAXLEN
56 1.3.16.2 jdolecek #define MVXPE_TX_QUEUE_LIMIT_1 8
57 1.3.16.2 jdolecek #define MVXPE_TX_QUEUE_LIMIT_2 8
58 1.3.16.2 jdolecek #define MVXPE_TX_QUEUE_LIMIT_3 8
59 1.3.16.2 jdolecek #define MVXPE_TX_QUEUE_LIMIT_4 8
60 1.3.16.2 jdolecek #define MVXPE_TX_QUEUE_LIMIT_5 8
61 1.3.16.2 jdolecek #define MVXPE_TX_QUEUE_LIMIT_6 8
62 1.3.16.2 jdolecek #define MVXPE_TX_QUEUE_LIMIT_7 8
63 1.3.16.2 jdolecek
64 1.3.16.2 jdolecek /* interrupt is triggered when corossing (queuelen / RATIO) */
65 1.3.16.2 jdolecek #define MVXPE_RXTH_RATIO 8
66 1.3.16.2 jdolecek #define MVXPE_RXTH_REFILL_RATIO 2
67 1.3.16.2 jdolecek #define MVXPE_TXTH_RATIO 8
68 1.3.16.2 jdolecek
69 1.3.16.2 jdolecek /*
70 1.3.16.2 jdolecek * Device Register access
71 1.3.16.2 jdolecek */
72 1.3.16.2 jdolecek #define MVXPE_READ(sc, reg) \
73 1.3.16.2 jdolecek bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, (reg))
74 1.3.16.2 jdolecek #define MVXPE_WRITE(sc, reg, val) \
75 1.3.16.2 jdolecek bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, (reg), (val))
76 1.3.16.2 jdolecek
77 1.3.16.2 jdolecek #define MVXPE_READ_REGION(sc, reg, val, c) \
78 1.3.16.2 jdolecek bus_space_read_region_4((sc)->sc_iot, (sc)->sc_ioh, (reg), (val), (c))
79 1.3.16.2 jdolecek #define MVXPE_WRITE_REGION(sc, reg, val, c) \
80 1.3.16.2 jdolecek bus_space_write_region_4((sc)->sc_iot, (sc)->sc_ioh, (reg), (val), (c))
81 1.3.16.2 jdolecek
82 1.3.16.2 jdolecek #define MVXPE_READ_MIB(sc, reg) \
83 1.3.16.2 jdolecek bus_space_read_4((sc)->sc_iot, (sc)->sc_mibh, (reg))
84 1.3.16.2 jdolecek
85 1.3.16.2 jdolecek #define MVXPE_IS_LINKUP(sc) \
86 1.3.16.2 jdolecek (MVXPE_READ((sc), MVXPE_PSR) & MVXPE_PSR_LINKUP)
87 1.3.16.2 jdolecek
88 1.3.16.2 jdolecek #define MVXPE_IS_QUEUE_BUSY(queues, q) \
89 1.3.16.2 jdolecek ((((queues) >> (q)) & 0x1))
90 1.3.16.2 jdolecek
91 1.3.16.2 jdolecek /*
92 1.3.16.2 jdolecek * EEE: Lower Power Idle config
93 1.3.16.2 jdolecek * Default timer is duration of MTU sized frame transmission.
94 1.3.16.2 jdolecek * The timer can be negotiated by LLDP protocol, but we have no
95 1.3.16.2 jdolecek * support.
96 1.3.16.2 jdolecek */
97 1.3.16.2 jdolecek #define MVXPE_LPI_TS (MVXPE_MRU * 8 / 1000) /* [us] */
98 1.3.16.2 jdolecek #define MVXPE_LPI_TW (MVXPE_MRU * 8 / 1000) /* [us] */
99 1.3.16.2 jdolecek #define MVXPE_LPI_LI (MVXPE_MRU * 8 / 1000) /* [us] */
100 1.3.16.2 jdolecek
101 1.3.16.2 jdolecek /*
102 1.3.16.2 jdolecek * DMA Descriptor
103 1.3.16.2 jdolecek *
104 1.3.16.2 jdolecek * the ethernet device has 8 rx/tx DMA queues. each of queue has its own
105 1.3.16.2 jdolecek * decriptor list. descriptors are simply index by counter inside the device.
106 1.3.16.2 jdolecek */
107 1.3.16.2 jdolecek #define MVXPE_TX_RING_CNT IFQ_MAXLEN
108 1.3.16.2 jdolecek #define MVXPE_TX_RING_MSK (MVXPE_TX_RING_CNT - 1)
109 1.3.16.2 jdolecek #define MVXPE_TX_RING_NEXT(x) (((x) + 1) & MVXPE_TX_RING_MSK)
110 1.3.16.2 jdolecek #define MVXPE_RX_RING_CNT IFQ_MAXLEN
111 1.3.16.2 jdolecek #define MVXPE_RX_RING_MSK (MVXPE_RX_RING_CNT - 1)
112 1.3.16.2 jdolecek #define MVXPE_RX_RING_NEXT(x) (((x) + 1) & MVXPE_RX_RING_MSK)
113 1.3.16.2 jdolecek #define MVXPE_TX_SEGLIMIT 32
114 1.3.16.2 jdolecek
115 1.3.16.2 jdolecek struct mvxpe_rx_ring {
116 1.3.16.2 jdolecek /* Real descriptors array. shared by RxDMA */
117 1.3.16.2 jdolecek struct mvxpe_rx_desc *rx_descriptors;
118 1.3.16.2 jdolecek bus_dmamap_t rx_descriptors_map;
119 1.3.16.2 jdolecek
120 1.3.16.2 jdolecek /* Managment entries for each of descritors */
121 1.3.16.2 jdolecek struct mvxpe_rx_handle {
122 1.3.16.2 jdolecek struct mvxpe_rx_desc *rxdesc_va;
123 1.3.16.2 jdolecek off_t rxdesc_off; /* from rx_descriptors[0] */
124 1.3.16.2 jdolecek struct mvxpbm_chunk *chunk;
125 1.3.16.2 jdolecek } rx_handle[MVXPE_RX_RING_CNT];
126 1.3.16.2 jdolecek
127 1.3.16.2 jdolecek /* locks */
128 1.3.16.2 jdolecek kmutex_t rx_ring_mtx;
129 1.3.16.2 jdolecek
130 1.3.16.2 jdolecek /* Index */
131 1.3.16.2 jdolecek int rx_dma;
132 1.3.16.2 jdolecek int rx_cpu;
133 1.3.16.2 jdolecek
134 1.3.16.2 jdolecek /* Limit */
135 1.3.16.2 jdolecek int rx_queue_len;
136 1.3.16.2 jdolecek int rx_queue_th_received;
137 1.3.16.2 jdolecek int rx_queue_th_free;
138 1.3.16.2 jdolecek int rx_queue_th_time; /* [Tclk] */
139 1.3.16.2 jdolecek };
140 1.3.16.2 jdolecek
141 1.3.16.2 jdolecek struct mvxpe_tx_ring {
142 1.3.16.2 jdolecek /* Real descriptors array. shared by TxDMA */
143 1.3.16.2 jdolecek struct mvxpe_tx_desc *tx_descriptors;
144 1.3.16.2 jdolecek bus_dmamap_t tx_descriptors_map;
145 1.3.16.2 jdolecek
146 1.3.16.2 jdolecek /* Managment entries for each of descritors */
147 1.3.16.2 jdolecek struct mvxpe_tx_handle {
148 1.3.16.2 jdolecek struct mvxpe_tx_desc *txdesc_va;
149 1.3.16.2 jdolecek off_t txdesc_off; /* from tx_descriptors[0] */
150 1.3.16.2 jdolecek struct mbuf *txdesc_mbuf;
151 1.3.16.2 jdolecek bus_dmamap_t txdesc_mbuf_map;
152 1.3.16.2 jdolecek } tx_handle[MVXPE_TX_RING_CNT];
153 1.3.16.2 jdolecek
154 1.3.16.2 jdolecek /* locks */
155 1.3.16.2 jdolecek kmutex_t tx_ring_mtx;
156 1.3.16.2 jdolecek
157 1.3.16.2 jdolecek /* Index */
158 1.3.16.2 jdolecek int tx_used;
159 1.3.16.2 jdolecek int tx_dma;
160 1.3.16.2 jdolecek int tx_cpu;
161 1.3.16.2 jdolecek
162 1.3.16.2 jdolecek /* Limit */
163 1.3.16.2 jdolecek int tx_queue_len;
164 1.3.16.2 jdolecek int tx_queue_th_free;
165 1.3.16.2 jdolecek };
166 1.3.16.2 jdolecek
167 1.3.16.2 jdolecek static inline int
168 1.3.16.2 jdolecek tx_counter_adv(int ctr, int n)
169 1.3.16.2 jdolecek {
170 1.3.16.2 jdolecek /* XXX: lock or atomic */
171 1.3.16.2 jdolecek ctr += n;
172 1.3.16.2 jdolecek while (ctr >= MVXPE_TX_RING_CNT)
173 1.3.16.2 jdolecek ctr -= MVXPE_TX_RING_CNT;
174 1.3.16.2 jdolecek
175 1.3.16.2 jdolecek return ctr;
176 1.3.16.2 jdolecek }
177 1.3.16.2 jdolecek
178 1.3.16.2 jdolecek static inline int
179 1.3.16.2 jdolecek rx_counter_adv(int ctr, int n)
180 1.3.16.2 jdolecek {
181 1.3.16.2 jdolecek /* XXX: lock or atomic */
182 1.3.16.2 jdolecek ctr += n;
183 1.3.16.2 jdolecek while (ctr >= MVXPE_TX_RING_CNT)
184 1.3.16.2 jdolecek ctr -= MVXPE_TX_RING_CNT;
185 1.3.16.2 jdolecek
186 1.3.16.2 jdolecek return ctr;
187 1.3.16.2 jdolecek }
188 1.3.16.2 jdolecek
189 1.3.16.2 jdolecek /*
190 1.3.16.2 jdolecek * Timeout control
191 1.3.16.2 jdolecek */
192 1.3.16.2 jdolecek #define MVXPE_PHY_TIMEOUT 10000 /* msec */
193 1.3.16.2 jdolecek #define RX_DISABLE_TIMEOUT 0x1000000 /* times */
194 1.3.16.2 jdolecek #define TX_DISABLE_TIMEOUT 0x1000000 /* times */
195 1.3.16.2 jdolecek #define TX_FIFO_EMPTY_TIMEOUT 0x1000000 /* times */
196 1.3.16.2 jdolecek
197 1.3.16.2 jdolecek /*
198 1.3.16.2 jdolecek * Event counter
199 1.3.16.2 jdolecek */
200 1.3.16.2 jdolecek #ifdef MVXPE_EVENT_COUNTERS
201 1.3.16.2 jdolecek #define MVXPE_EVCNT_INCR(ev) (ev)->ev_count++
202 1.3.16.2 jdolecek #define MVXPE_EVCNT_ADD(ev, val) (ev)->ev_count += (val)
203 1.3.16.2 jdolecek #else
204 1.3.16.2 jdolecek #define MVXPE_EVCNT_INCR(ev) /* nothing */
205 1.3.16.2 jdolecek #define MVXPE_EVCNT_ADD(ev, val) /* nothing */
206 1.3.16.2 jdolecek #endif
207 1.3.16.2 jdolecek struct mvxpe_evcnt {
208 1.3.16.2 jdolecek /*
209 1.3.16.2 jdolecek * Master Interrupt Handler
210 1.3.16.2 jdolecek */
211 1.3.16.2 jdolecek struct evcnt ev_i_rxtxth;
212 1.3.16.2 jdolecek struct evcnt ev_i_rxtx;
213 1.3.16.2 jdolecek struct evcnt ev_i_misc;
214 1.3.16.2 jdolecek
215 1.3.16.2 jdolecek /*
216 1.3.16.2 jdolecek * RXTXTH Interrupt
217 1.3.16.2 jdolecek */
218 1.3.16.2 jdolecek struct evcnt ev_rxtxth_txerr;
219 1.3.16.2 jdolecek
220 1.3.16.2 jdolecek /*
221 1.3.16.2 jdolecek * MISC Interrupt
222 1.3.16.2 jdolecek */
223 1.3.16.2 jdolecek struct evcnt ev_misc_phystatuschng;
224 1.3.16.2 jdolecek struct evcnt ev_misc_linkchange;
225 1.3.16.2 jdolecek struct evcnt ev_misc_iae;
226 1.3.16.2 jdolecek struct evcnt ev_misc_rxoverrun;
227 1.3.16.2 jdolecek struct evcnt ev_misc_rxcrc;
228 1.3.16.2 jdolecek struct evcnt ev_misc_rxlargepacket;
229 1.3.16.2 jdolecek struct evcnt ev_misc_txunderrun;
230 1.3.16.2 jdolecek struct evcnt ev_misc_prbserr;
231 1.3.16.2 jdolecek struct evcnt ev_misc_srse;
232 1.3.16.2 jdolecek struct evcnt ev_misc_txreq;
233 1.3.16.2 jdolecek
234 1.3.16.2 jdolecek /*
235 1.3.16.2 jdolecek * RxTx Interrupt
236 1.3.16.2 jdolecek */
237 1.3.16.2 jdolecek struct evcnt ev_rxtx_rreq;
238 1.3.16.2 jdolecek struct evcnt ev_rxtx_rpq;
239 1.3.16.2 jdolecek struct evcnt ev_rxtx_tbrq;
240 1.3.16.2 jdolecek struct evcnt ev_rxtx_rxtxth;
241 1.3.16.2 jdolecek struct evcnt ev_rxtx_txerr;
242 1.3.16.2 jdolecek struct evcnt ev_rxtx_misc;
243 1.3.16.2 jdolecek
244 1.3.16.2 jdolecek /*
245 1.3.16.2 jdolecek * Link
246 1.3.16.2 jdolecek */
247 1.3.16.2 jdolecek struct evcnt ev_link_up;
248 1.3.16.2 jdolecek struct evcnt ev_link_down;
249 1.3.16.2 jdolecek
250 1.3.16.2 jdolecek /*
251 1.3.16.2 jdolecek * Rx Descriptor
252 1.3.16.2 jdolecek */
253 1.3.16.2 jdolecek struct evcnt ev_rxd_ce;
254 1.3.16.2 jdolecek struct evcnt ev_rxd_or;
255 1.3.16.2 jdolecek struct evcnt ev_rxd_mf;
256 1.3.16.2 jdolecek struct evcnt ev_rxd_re;
257 1.3.16.2 jdolecek struct evcnt ev_rxd_scat;
258 1.3.16.2 jdolecek
259 1.3.16.2 jdolecek /*
260 1.3.16.2 jdolecek * Tx Descriptor
261 1.3.16.2 jdolecek */
262 1.3.16.2 jdolecek struct evcnt ev_txd_lc;
263 1.3.16.2 jdolecek struct evcnt ev_txd_ur;
264 1.3.16.2 jdolecek struct evcnt ev_txd_rl;
265 1.3.16.2 jdolecek struct evcnt ev_txd_oth;
266 1.3.16.2 jdolecek
267 1.3.16.2 jdolecek /*
268 1.3.16.2 jdolecek * Status Registers
269 1.3.16.2 jdolecek */
270 1.3.16.2 jdolecek struct evcnt ev_reg_pdfc; /* Rx Port Discard Frame Counter */
271 1.3.16.2 jdolecek struct evcnt ev_reg_pofc; /* Rx Port Overrun Frame Counter */
272 1.3.16.2 jdolecek struct evcnt ev_reg_txbadfcs; /* Tx BAD FCS Counter */
273 1.3.16.2 jdolecek struct evcnt ev_reg_txdropped; /* Tx Dropped Counter */
274 1.3.16.2 jdolecek struct evcnt ev_reg_lpic;
275 1.3.16.2 jdolecek
276 1.3.16.2 jdolecek
277 1.3.16.2 jdolecek /* Device Driver Errors */
278 1.3.16.2 jdolecek struct evcnt ev_drv_wdogsoft;
279 1.3.16.2 jdolecek struct evcnt ev_drv_txerr;
280 1.3.16.2 jdolecek struct evcnt ev_drv_rxq[MVXPE_QUEUE_SIZE];
281 1.3.16.2 jdolecek struct evcnt ev_drv_rxqe[MVXPE_QUEUE_SIZE];
282 1.3.16.2 jdolecek struct evcnt ev_drv_txq[MVXPE_QUEUE_SIZE];
283 1.3.16.2 jdolecek struct evcnt ev_drv_txqe[MVXPE_QUEUE_SIZE];
284 1.3.16.2 jdolecek };
285 1.3.16.2 jdolecek
286 1.3.16.2 jdolecek /*
287 1.3.16.2 jdolecek * Debug
288 1.3.16.2 jdolecek */
289 1.3.16.2 jdolecek #ifdef MVXPE_DEBUG
290 1.3.16.2 jdolecek #define DPRINTF(fmt, ...) \
291 1.3.16.2 jdolecek do { \
292 1.3.16.2 jdolecek if (mvxpe_debug >= 1) { \
293 1.3.16.2 jdolecek printf("%s: ", __func__); \
294 1.3.16.2 jdolecek printf((fmt), ##__VA_ARGS__); \
295 1.3.16.2 jdolecek } \
296 1.3.16.2 jdolecek } while (/*CONSTCOND*/0)
297 1.3.16.2 jdolecek #define DPRINTFN(level , fmt, ...) \
298 1.3.16.2 jdolecek do { \
299 1.3.16.2 jdolecek if (mvxpe_debug >= (level)) { \
300 1.3.16.2 jdolecek printf("%s: ", __func__); \
301 1.3.16.2 jdolecek printf((fmt), ##__VA_ARGS__); \
302 1.3.16.2 jdolecek } \
303 1.3.16.2 jdolecek } while (/*CONSTCOND*/0)
304 1.3.16.2 jdolecek #define DPRINTDEV(dev, level, fmt, ...) \
305 1.3.16.2 jdolecek do { \
306 1.3.16.2 jdolecek if (mvxpe_debug >= (level)) { \
307 1.3.16.2 jdolecek device_printf((dev), \
308 1.3.16.2 jdolecek "%s: "fmt , __func__, ##__VA_ARGS__); \
309 1.3.16.2 jdolecek } \
310 1.3.16.2 jdolecek } while (/*CONSTCOND*/0)
311 1.3.16.2 jdolecek #define DPRINTSC(sc, level, fmt, ...) \
312 1.3.16.2 jdolecek do { \
313 1.3.16.2 jdolecek device_t dev = (sc)->sc_dev; \
314 1.3.16.2 jdolecek if (mvxpe_debug >= (level)) { \
315 1.3.16.2 jdolecek device_printf(dev, \
316 1.3.16.2 jdolecek "%s: " fmt, __func__, ##__VA_ARGS__); \
317 1.3.16.2 jdolecek } \
318 1.3.16.2 jdolecek } while (/*CONSTCOND*/0)
319 1.3.16.2 jdolecek #define DPRINTIFNET(ifp, level, fmt, ...) \
320 1.3.16.2 jdolecek do { \
321 1.3.16.2 jdolecek const char *xname = (ifp)->if_xname; \
322 1.3.16.2 jdolecek if (mvxpe_debug >= (level)) { \
323 1.3.16.2 jdolecek printf("%s: %s: " fmt, xname, __func__, ##__VA_ARGS__);\
324 1.3.16.2 jdolecek } \
325 1.3.16.2 jdolecek } while (/*CONSTCOND*/0)
326 1.3.16.2 jdolecek #define DPRINTIFNET(ifp, level, fmt, ...) \
327 1.3.16.2 jdolecek do { \
328 1.3.16.2 jdolecek const char *xname = (ifp)->if_xname; \
329 1.3.16.2 jdolecek if (mvxpe_debug >= (level)) { \
330 1.3.16.2 jdolecek printf("%s: %s: " fmt, xname, __func__, ##__VA_ARGS__);\
331 1.3.16.2 jdolecek } \
332 1.3.16.2 jdolecek } while (/*CONSTCOND*/0)
333 1.3.16.2 jdolecek #define DPRINTPRXS(level, q) \
334 1.3.16.2 jdolecek do { \
335 1.3.16.2 jdolecek uint32_t _reg = MVXPE_READ(sc, MVXPE_PRXS(q)); \
336 1.3.16.2 jdolecek if (mvxpe_debug >= (level)) { \
337 1.3.16.2 jdolecek printf("PRXS(queue %d) %#x: Occupied %d, NoOccupied %d.\n", \
338 1.3.16.2 jdolecek q, _reg, MVXPE_PRXS_GET_ODC(_reg), \
339 1.3.16.2 jdolecek MVXPE_PRXS_GET_NODC(_reg)); \
340 1.3.16.2 jdolecek } \
341 1.3.16.2 jdolecek } while (/*CONSTCOND*/0)
342 1.3.16.2 jdolecek #else
343 1.3.16.2 jdolecek #define DPRINTF(fmt, ...)
344 1.3.16.2 jdolecek #define DPRINTFN(level, fmt, ...)
345 1.3.16.2 jdolecek #define DPRINTDEV(dev, level, fmt, ...)
346 1.3.16.2 jdolecek #define DPRINTSC(sc, level, fmt, ...)
347 1.3.16.2 jdolecek #define DPRINTIFNET(ifp, level, fmt, ...)
348 1.3.16.2 jdolecek #define DPRINTPRXS(level, reg)
349 1.3.16.2 jdolecek #endif
350 1.3.16.2 jdolecek
351 1.3.16.2 jdolecek #define KASSERT_SC_MTX(sc) \
352 1.3.16.2 jdolecek KASSERT(mutex_owned(&(sc)->sc_mtx))
353 1.3.16.2 jdolecek #define KASSERT_BM_MTX(sc) \
354 1.3.16.2 jdolecek KASSERT(mutex_owned(&(sc)->sc_bm.bm_mtx))
355 1.3.16.2 jdolecek #define KASSERT_RX_MTX(sc, q) \
356 1.3.16.2 jdolecek KASSERT(mutex_owned(&(sc)->sc_rx_ring[(q)].rx_ring_mtx))
357 1.3.16.2 jdolecek #define KASSERT_TX_MTX(sc, q) \
358 1.3.16.2 jdolecek KASSERT(mutex_owned(&(sc)->sc_tx_ring[(q)].tx_ring_mtx))
359 1.3.16.2 jdolecek
360 1.3.16.2 jdolecek /*
361 1.3.16.2 jdolecek * Configuration parameters
362 1.3.16.2 jdolecek */
363 1.3.16.2 jdolecek struct mvxpe_conf {
364 1.3.16.2 jdolecek int cf_lpi; /* EEE Low Power IDLE enable */
365 1.3.16.2 jdolecek int cf_fc; /* Flow Control enable */
366 1.3.16.2 jdolecek };
367 1.3.16.2 jdolecek
368 1.3.16.2 jdolecek /*
369 1.3.16.2 jdolecek * sysctl(9) parameters
370 1.3.16.2 jdolecek */
371 1.3.16.2 jdolecek struct mvxpe_softc;
372 1.3.16.2 jdolecek struct mvxpe_sysctl_queue {
373 1.3.16.2 jdolecek struct mvxpe_softc *sc;
374 1.3.16.2 jdolecek int rxtx;
375 1.3.16.2 jdolecek int queue;
376 1.3.16.2 jdolecek };
377 1.3.16.2 jdolecek #define MVXPE_SYSCTL_RX 0
378 1.3.16.2 jdolecek #define MVXPE_SYSCTL_TX 1
379 1.3.16.2 jdolecek
380 1.3.16.2 jdolecek struct mvxpe_sysctl_mib {
381 1.3.16.2 jdolecek struct mvxpe_softc *sc;
382 1.3.16.2 jdolecek int index;
383 1.3.16.2 jdolecek uint64_t counter;
384 1.3.16.2 jdolecek };
385 1.3.16.2 jdolecek
386 1.3.16.2 jdolecek /*
387 1.3.16.2 jdolecek * Ethernet Device main context
388 1.3.16.2 jdolecek */
389 1.3.16.2 jdolecek struct mvxpe_softc {
390 1.3.16.2 jdolecek device_t sc_dev;
391 1.3.16.2 jdolecek int sc_port;
392 1.3.16.2 jdolecek uint32_t sc_version;
393 1.3.16.2 jdolecek
394 1.3.16.2 jdolecek /*
395 1.3.16.2 jdolecek * sc_mtx must be held by interface functions to/from
396 1.3.16.2 jdolecek * other frameworks. interrupt hander, sysctl hander,
397 1.3.16.2 jdolecek * ioctl hander, and so on.
398 1.3.16.2 jdolecek */
399 1.3.16.2 jdolecek kmutex_t sc_mtx;
400 1.3.16.2 jdolecek
401 1.3.16.2 jdolecek /*
402 1.3.16.2 jdolecek * Ethernet facilities
403 1.3.16.2 jdolecek */
404 1.3.16.2 jdolecek struct ethercom sc_ethercom;
405 1.3.16.2 jdolecek struct mii_data sc_mii;
406 1.3.16.2 jdolecek u_int8_t sc_enaddr[ETHER_ADDR_LEN]; /* station addr */
407 1.3.16.2 jdolecek int sc_if_flags;
408 1.3.16.2 jdolecek int sc_wdogsoft;
409 1.3.16.2 jdolecek
410 1.3.16.2 jdolecek /*
411 1.3.16.2 jdolecek * Configuration Parameters
412 1.3.16.2 jdolecek */
413 1.3.16.2 jdolecek struct mvxpe_conf sc_cf;
414 1.3.16.2 jdolecek
415 1.3.16.2 jdolecek /*
416 1.3.16.2 jdolecek * I/O Spaces
417 1.3.16.2 jdolecek */
418 1.3.16.2 jdolecek bus_space_tag_t sc_iot;
419 1.3.16.2 jdolecek bus_space_handle_t sc_ioh; /* all registers handle */
420 1.3.16.2 jdolecek bus_space_handle_t sc_mibh; /* mib counter handle */
421 1.3.16.2 jdolecek
422 1.3.16.2 jdolecek /*
423 1.3.16.2 jdolecek * DMA Spaces
424 1.3.16.2 jdolecek */
425 1.3.16.2 jdolecek bus_dma_tag_t sc_dmat;
426 1.3.16.2 jdolecek struct mvxpe_rx_ring sc_rx_ring[MVXPE_QUEUE_SIZE];
427 1.3.16.2 jdolecek struct mvxpe_tx_ring sc_tx_ring[MVXPE_QUEUE_SIZE];
428 1.3.16.2 jdolecek int sc_tx_pending; /* total number of tx pkt */
429 1.3.16.2 jdolecek
430 1.3.16.2 jdolecek /*
431 1.3.16.2 jdolecek * Software Buffer Manager
432 1.3.16.2 jdolecek */
433 1.3.16.2 jdolecek struct mvxpbm_softc *sc_bm;
434 1.3.16.2 jdolecek
435 1.3.16.2 jdolecek /*
436 1.3.16.2 jdolecek * Maintance clock
437 1.3.16.2 jdolecek */
438 1.3.16.2 jdolecek callout_t sc_tick_ch; /* tick callout */
439 1.3.16.2 jdolecek
440 1.3.16.2 jdolecek /*
441 1.3.16.2 jdolecek * Link State control
442 1.3.16.2 jdolecek */
443 1.3.16.2 jdolecek uint32_t sc_linkstate;
444 1.3.16.2 jdolecek
445 1.3.16.2 jdolecek /*
446 1.3.16.2 jdolecek * Act as Rndom source
447 1.3.16.2 jdolecek */
448 1.3.16.2 jdolecek krndsource_t sc_rnd_source;
449 1.3.16.2 jdolecek
450 1.3.16.2 jdolecek /*
451 1.3.16.2 jdolecek * Sysctl interfaces
452 1.3.16.2 jdolecek */
453 1.3.16.2 jdolecek struct sysctllog *sc_mvxpe_clog;
454 1.3.16.2 jdolecek struct mvxpe_sysctl_queue sc_sysctl_rx_queue[MVXPE_QUEUE_SIZE];
455 1.3.16.2 jdolecek struct mvxpe_sysctl_queue sc_sysctl_tx_queue[MVXPE_QUEUE_SIZE];
456 1.3.16.2 jdolecek
457 1.3.16.2 jdolecek /*
458 1.3.16.2 jdolecek * MIB counter
459 1.3.16.2 jdolecek */
460 1.3.16.2 jdolecek size_t sc_sysctl_mib_size;
461 1.3.16.2 jdolecek struct mvxpe_sysctl_mib *sc_sysctl_mib;
462 1.3.16.2 jdolecek
463 1.3.16.2 jdolecek #ifdef MVXPE_EVENT_COUNTERS
464 1.3.16.2 jdolecek /*
465 1.3.16.2 jdolecek * Event counter
466 1.3.16.2 jdolecek */
467 1.3.16.2 jdolecek struct mvxpe_evcnt sc_ev;
468 1.3.16.2 jdolecek #endif
469 1.3.16.2 jdolecek };
470 1.3.16.2 jdolecek #define MVXPE_RX_RING_MEM_VA(sc, q) \
471 1.3.16.2 jdolecek ((sc)->sc_rx_ring[(q)].rx_descriptors)
472 1.3.16.2 jdolecek #define MVXPE_RX_RING_MEM_PA(sc, q) \
473 1.3.16.2 jdolecek ((sc)->sc_rx_ring[(q)].rx_descriptors_map->dm_segs[0].ds_addr)
474 1.3.16.2 jdolecek #define MVXPE_RX_RING_MEM_MAP(sc, q) \
475 1.3.16.2 jdolecek ((sc)->sc_rx_ring[(q)].rx_descriptors_map)
476 1.3.16.2 jdolecek #define MVXPE_RX_RING(sc, q) \
477 1.3.16.2 jdolecek (&(sc)->sc_rx_ring[(q)])
478 1.3.16.2 jdolecek #define MVXPE_RX_HANDLE(sc, q, i) \
479 1.3.16.2 jdolecek (&(sc)->sc_rx_ring[(q)].rx_handle[(i)])
480 1.3.16.2 jdolecek #define MVXPE_RX_DESC(sc, q, i) \
481 1.3.16.2 jdolecek ((sc)->sc_rx_ring[(q)].rx_handle[(i)].rxdesc_va)
482 1.3.16.2 jdolecek #define MVXPE_RX_DESC_OFF(sc, q, i) \
483 1.3.16.2 jdolecek ((sc)->sc_rx_ring[(q)].rx_handle[(i)].rxdesc_off)
484 1.3.16.2 jdolecek #define MVXPE_RX_PKTBUF(sc, q, i) \
485 1.3.16.2 jdolecek ((sc)->sc_rx_ring[(q)].rx_handle[(i)].chunk)
486 1.3.16.2 jdolecek
487 1.3.16.2 jdolecek #define MVXPE_TX_RING_MEM_VA(sc, q) \
488 1.3.16.2 jdolecek ((sc)->sc_tx_ring[(q)].tx_descriptors)
489 1.3.16.2 jdolecek #define MVXPE_TX_RING_MEM_PA(sc, q) \
490 1.3.16.2 jdolecek ((sc)->sc_tx_ring[(q)].tx_descriptors_map->dm_segs[0].ds_addr)
491 1.3.16.2 jdolecek #define MVXPE_TX_RING_MEM_MAP(sc, q) \
492 1.3.16.2 jdolecek ((sc)->sc_tx_ring[(q)].tx_descriptors_map)
493 1.3.16.2 jdolecek #define MVXPE_TX_RING(sc, q) \
494 1.3.16.2 jdolecek (&(sc)->sc_tx_ring[(q)])
495 1.3.16.2 jdolecek #define MVXPE_TX_HANDLE(sc, q, i) \
496 1.3.16.2 jdolecek (&(sc)->sc_tx_ring[(q)].tx_handle[(i)])
497 1.3.16.2 jdolecek #define MVXPE_TX_DESC(sc, q, i) \
498 1.3.16.2 jdolecek ((sc)->sc_tx_ring[(q)].tx_handle[(i)].txdesc_va)
499 1.3.16.2 jdolecek #define MVXPE_TX_DESC_OFF(sc, q, i) \
500 1.3.16.2 jdolecek ((sc)->sc_tx_ring[(q)].tx_handle[(i)].txdesc_off)
501 1.3.16.2 jdolecek #define MVXPE_TX_MBUF(sc, q, i) \
502 1.3.16.2 jdolecek ((sc)->sc_tx_ring[(q)].tx_handle[(i)].txdesc_mbuf)
503 1.3.16.2 jdolecek #define MVXPE_TX_MAP(sc, q, i) \
504 1.3.16.2 jdolecek ((sc)->sc_tx_ring[(q)].tx_handle[(i)].txdesc_mbuf_map)
505 1.3.16.2 jdolecek
506 1.3.16.2 jdolecek #endif /* _IF_MVXPEVAR_H_ */
507