xref: /freebsd/sys/dev/altera/atse/if_atse.c (revision 7431dfd4580e850375fe5478d92ec770344db098)
1 /*-
2  * Copyright (c) 2012,2013 Bjoern A. Zeeb
3  * Copyright (c) 2014 Robert N. M. Watson
4  * All rights reserved.
5  *
6  * This software was developed by SRI International and the University of
7  * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-11-C-0249)
8  * ("MRC2"), as part of the DARPA MRC research programme.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 /*
32  * Altera Triple-Speed Ethernet MegaCore, Function User Guide
33  * UG-01008-3.0, Software Version: 12.0, June 2012.
34  * Available at the time of writing at:
35  * http://www.altera.com/literature/ug/ug_ethernet.pdf
36  *
37  * We are using an Marvell E1111 (Alaska) PHY on the DE4.  See mii/e1000phy.c.
38  */
39 /*
40  * XXX-BZ NOTES:
41  * - ifOutBroadcastPkts are only counted if both ether dst and src are all-1s;
42  *   seems an IP core bug, they count ether broadcasts as multicast.  Is this
43  *   still the case?
44  * - figure out why the TX FIFO fill status and intr did not work as expected.
45  * - test 100Mbit/s and 10Mbit/s
46  * - blacklist the one special factory programmed ethernet address (for now
47  *   hardcoded, later from loader?)
48  * - resolve all XXX, left as reminders to shake out details later
49  * - Jumbo frame support
50  */
51 
52 #include <sys/cdefs.h>
53 __FBSDID("$FreeBSD$");
54 
55 #include "opt_device_polling.h"
56 
57 #include <sys/param.h>
58 #include <sys/systm.h>
59 #include <sys/kernel.h>
60 #include <sys/bus.h>
61 #include <sys/endian.h>
62 #include <sys/jail.h>
63 #include <sys/lock.h>
64 #include <sys/module.h>
65 #include <sys/mutex.h>
66 #include <sys/proc.h>
67 #include <sys/socket.h>
68 #include <sys/sockio.h>
69 #include <sys/types.h>
70 
71 #include <net/ethernet.h>
72 #include <net/if.h>
73 #include <net/if_var.h>
74 #include <net/if_dl.h>
75 #include <net/if_media.h>
76 #include <net/if_types.h>
77 #include <net/if_vlan_var.h>
78 
79 #include <net/bpf.h>
80 
81 #include <machine/bus.h>
82 #include <machine/resource.h>
83 #include <sys/rman.h>
84 
85 #include <dev/mii/mii.h>
86 #include <dev/mii/miivar.h>
87 
88 #include <dev/altera/atse/if_atsereg.h>
89 #include <dev/altera/atse/a_api.h>
90 
91 MODULE_DEPEND(atse, ether, 1, 1, 1);
92 MODULE_DEPEND(atse, miibus, 1, 1, 1);
93 
94 
95 #define	ATSE_WATCHDOG_TIME	5
96 
97 #ifdef DEVICE_POLLING
98 static poll_handler_t atse_poll;
99 #endif
100 
101 /* XXX once we'd do parallel attach, we need a global lock for this. */
102 #define	ATSE_ETHERNET_OPTION_BITS_UNDEF	0
103 #define	ATSE_ETHERNET_OPTION_BITS_READ	1
104 static int atse_ethernet_option_bits_flag = ATSE_ETHERNET_OPTION_BITS_UNDEF;
105 static uint8_t atse_ethernet_option_bits[ALTERA_ETHERNET_OPTION_BITS_LEN];
106 
107 static int	atse_intr_debug_enable = 0;
108 SYSCTL_INT(_debug, OID_AUTO, atse_intr_debug_enable, CTLFLAG_RW,
109     &atse_intr_debug_enable, 0,
110    "Extra debugging output for atse interrupts");
111 
112 /*
113  * Softc and critical resource locking.
114  */
115 #define	ATSE_LOCK(_sc)		mtx_lock(&(_sc)->atse_mtx)
116 #define	ATSE_UNLOCK(_sc)	mtx_unlock(&(_sc)->atse_mtx)
117 #define	ATSE_LOCK_ASSERT(_sc)	mtx_assert(&(_sc)->atse_mtx, MA_OWNED)
118 
119 #define	ATSE_TX_PENDING(sc)	(sc->atse_tx_m != NULL ||		\
120 				    !IFQ_DRV_IS_EMPTY(&ifp->if_snd))
121 
122 #ifdef DEBUG
123 #define	DPRINTF(format, ...)	printf(format, __VA_ARGS__)
124 #else
125 #define	DPRINTF(format, ...)
126 #endif
127 
128 /* a_api.c functions; factor out? */
129 static inline void
130 a_onchip_fifo_mem_core_write(struct resource *res, uint32_t off,
131     uint32_t val4, const char *desc, const char *f, const int l)
132 {
133 
134 	val4 = htole32(val4);
135 	DPRINTF("[%s:%d] FIFOW %s 0x%08x = 0x%08x\n", f, l, desc, off, val4);
136 	bus_write_4(res, off, val4);
137 }
138 static inline uint32_t
139 a_onchip_fifo_mem_core_read(struct resource *res, uint32_t off,
140     const char *desc, const char *f, const int l)
141 {
142 	uint32_t val4;
143 
144 	val4 = le32toh(bus_read_4(res, off));
145 	DPRINTF("[%s:%d] FIFOR %s 0x%08x = 0x%08x\n", f, l, desc, off, val4);
146 	return (val4);
147 }
148 
149 /* The FIFO does an endian convertion, so we must not do it as well. */
150 /* XXX-BZ in fact we should do a htobe32 so le would be fine as well? */
151 #define	ATSE_TX_DATA_WRITE(sc, val4)					\
152 	bus_write_4((sc)->atse_tx_mem_res, A_ONCHIP_FIFO_MEM_CORE_DATA, val4)
153 
154 #define	ATSE_TX_META_WRITE(sc, val4)					\
155 	a_onchip_fifo_mem_core_write((sc)->atse_tx_mem_res,		\
156 	    A_ONCHIP_FIFO_MEM_CORE_METADATA,				\
157 	    (val4), "TXM", __func__, __LINE__)
158 #define	ATSE_TX_META_READ(sc)						\
159 	a_onchip_fifo_mem_core_read((sc)->atse_tx_mem_res,		\
160 	    A_ONCHIP_FIFO_MEM_CORE_METADATA,				\
161 	    "TXM", __func__, __LINE__)
162 
163 #define	ATSE_TX_READ_FILL_LEVEL(sc)					\
164 	a_onchip_fifo_mem_core_read((sc)->atse_txc_mem_res,		\
165 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_FILL_LEVEL,		\
166 	    "TX_FILL", __func__, __LINE__)
167 #define	ATSE_RX_READ_FILL_LEVEL(sc)					\
168 	a_onchip_fifo_mem_core_read((sc)->atse_rxc_mem_res,		\
169 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_FILL_LEVEL,		\
170 	    "RX_FILL", __func__, __LINE__)
171 
172 /* The FIFO does an endian convertion, so we must not do it as well. */
173 /* XXX-BZ in fact we shoudl do a htobe32 so le would be fine as well? */
174 #define	ATSE_RX_DATA_READ(sc)						\
175 	bus_read_4((sc)->atse_rx_mem_res, A_ONCHIP_FIFO_MEM_CORE_DATA)
176 #define	ATSE_RX_META_READ(sc)						\
177 	a_onchip_fifo_mem_core_read((sc)->atse_rx_mem_res,		\
178 	    A_ONCHIP_FIFO_MEM_CORE_METADATA,				\
179 	    "RXM", __func__, __LINE__)
180 
181 #define	ATSE_RX_STATUS_READ(sc)						\
182 	a_onchip_fifo_mem_core_read((sc)->atse_rxc_mem_res,		\
183 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_I_STATUS,			\
184 	    "RX_EVENT", __func__, __LINE__)
185 
186 #define	ATSE_TX_STATUS_READ(sc)						\
187 	a_onchip_fifo_mem_core_read((sc)->atse_txc_mem_res,		\
188 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_I_STATUS,			\
189 	    "TX_EVENT", __func__, __LINE__)
190 
191 #define	ATSE_RX_EVENT_READ(sc)						\
192 	a_onchip_fifo_mem_core_read((sc)->atse_rxc_mem_res,		\
193 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_EVENT,			\
194 	    "RX_EVENT", __func__, __LINE__)
195 
196 #define	ATSE_TX_EVENT_READ(sc)						\
197 	a_onchip_fifo_mem_core_read((sc)->atse_txc_mem_res,		\
198 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_EVENT,			\
199 	    "TX_EVENT", __func__, __LINE__)
200 
201 #define	ATSE_RX_EVENT_CLEAR(sc)						\
202 	do {								\
203 		uint32_t val4;						\
204 									\
205 		val4 = a_onchip_fifo_mem_core_read(			\
206 		    (sc)->atse_rxc_mem_res,				\
207 		    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_EVENT,		\
208 		    "RX_EVENT", __func__, __LINE__);			\
209 		if (val4 != 0x00)					\
210 			a_onchip_fifo_mem_core_write(			\
211 			    (sc)->atse_rxc_mem_res,			\
212 			    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_EVENT,	\
213 			    val4, "RX_EVENT", __func__, __LINE__);	\
214 	} while(0)
215 #define	ATSE_TX_EVENT_CLEAR(sc)						\
216 	do {								\
217 		uint32_t val4;						\
218 									\
219 		val4 = a_onchip_fifo_mem_core_read(			\
220 		    (sc)->atse_txc_mem_res,				\
221 		    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_EVENT,		\
222 		    "TX_EVENT", __func__, __LINE__);			\
223 		if (val4 != 0x00)					\
224 			a_onchip_fifo_mem_core_write(			\
225 			    (sc)->atse_txc_mem_res,			\
226 			    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_EVENT,	\
227 			    val4, "TX_EVENT", __func__, __LINE__);	\
228 	} while(0)
229 
230 #define	ATSE_RX_EVENTS	(A_ONCHIP_FIFO_MEM_CORE_INTR_FULL |	\
231 			    A_ONCHIP_FIFO_MEM_CORE_INTR_OVERFLOW |	\
232 			    A_ONCHIP_FIFO_MEM_CORE_INTR_UNDERFLOW)
233 #define	ATSE_RX_INTR_ENABLE(sc)						\
234 	a_onchip_fifo_mem_core_write((sc)->atse_rxc_mem_res,		\
235 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_INT_ENABLE,		\
236 	    ATSE_RX_EVENTS,						\
237 	    "RX_INTR", __func__, __LINE__)	/* XXX-BZ review later. */
238 #define	ATSE_RX_INTR_DISABLE(sc)					\
239 	a_onchip_fifo_mem_core_write((sc)->atse_rxc_mem_res,		\
240 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_INT_ENABLE, 0,		\
241 	    "RX_INTR", __func__, __LINE__)
242 #define	ATSE_RX_INTR_READ(sc)						\
243 	a_onchip_fifo_mem_core_read((sc)->atse_rxc_mem_res,		\
244 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_INT_ENABLE,		\
245 	    "RX_INTR", __func__, __LINE__)
246 
247 #define	ATSE_TX_EVENTS	(A_ONCHIP_FIFO_MEM_CORE_INTR_EMPTY |		\
248 			    A_ONCHIP_FIFO_MEM_CORE_INTR_OVERFLOW |	\
249 			    A_ONCHIP_FIFO_MEM_CORE_INTR_UNDERFLOW)
250 #define	ATSE_TX_INTR_ENABLE(sc)						\
251 	a_onchip_fifo_mem_core_write((sc)->atse_txc_mem_res,		\
252 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_INT_ENABLE,		\
253 	    ATSE_TX_EVENTS,						\
254 	    "TX_INTR", __func__, __LINE__)	/* XXX-BZ review later. */
255 #define	ATSE_TX_INTR_DISABLE(sc)					\
256 	a_onchip_fifo_mem_core_write((sc)->atse_txc_mem_res,		\
257 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_INT_ENABLE, 0,		\
258 	    "TX_INTR", __func__, __LINE__)
259 #define	ATSE_TX_INTR_READ(sc)						\
260 	a_onchip_fifo_mem_core_read((sc)->atse_txc_mem_res,		\
261 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_REG_INT_ENABLE,		\
262 	    "TX_INTR", __func__, __LINE__)
263 
264 static int	atse_rx_locked(struct atse_softc *sc);
265 
266 /*
267  * Register space access macros.
268  */
269 static inline void
270 csr_write_4(struct atse_softc *sc, uint32_t reg, uint32_t val4,
271     const char *f, const int l)
272 {
273 
274 	val4 = htole32(val4);
275 	DPRINTF("[%s:%d] CSR W %s 0x%08x (0x%08x) = 0x%08x\n", f, l,
276 	    "atse_mem_res", reg, reg * 4, val4);
277 	bus_write_4(sc->atse_mem_res, reg * 4, val4);
278 }
279 
280 static inline uint32_t
281 csr_read_4(struct atse_softc *sc, uint32_t reg, const char *f, const int l)
282 {
283 	uint32_t val4;
284 
285 	val4 = le32toh(bus_read_4(sc->atse_mem_res, reg * 4));
286 	DPRINTF("[%s:%d] CSR R %s 0x%08x (0x%08x) = 0x%08x\n", f, l,
287 	    "atse_mem_res", reg, reg * 4, val4);
288 	return (val4);
289 }
290 
291 /*
292  * See page 5-2 that it's all dword offsets and the MS 16 bits need to be zero
293  * on write and ignored on read.
294  */
295 static inline void
296 pxx_write_2(struct atse_softc *sc, bus_addr_t bmcr, uint32_t reg, uint16_t val,
297     const char *f, const int l, const char *s)
298 {
299 	uint32_t val4;
300 
301 	val4 = htole32(val & 0x0000ffff);
302 	DPRINTF("[%s:%d] %s W %s 0x%08x (0x%08jx) = 0x%08x\n", f, l, s,
303 	    "atse_mem_res", reg, (bmcr + reg) * 4, val4);
304 	bus_write_4(sc->atse_mem_res, (bmcr + reg) * 4, val4);
305 }
306 
307 static inline uint16_t
308 pxx_read_2(struct atse_softc *sc, bus_addr_t bmcr, uint32_t reg, const char *f,
309     const int l, const char *s)
310 {
311 	uint32_t val4;
312 	uint16_t val;
313 
314 	val4 = bus_read_4(sc->atse_mem_res, (bmcr + reg) * 4);
315 	val = le32toh(val4) & 0x0000ffff;
316 	DPRINTF("[%s:%d] %s R %s 0x%08x (0x%08jx) = 0x%04x\n", f, l, s,
317 	    "atse_mem_res", reg, (bmcr + reg) * 4, val);
318 	return (val);
319 }
320 
321 #define	CSR_WRITE_4(sc, reg, val)	\
322 	csr_write_4((sc), (reg), (val), __func__, __LINE__)
323 #define	CSR_READ_4(sc, reg)		\
324 	csr_read_4((sc), (reg), __func__, __LINE__)
325 #define	PCS_WRITE_2(sc, reg, val)	\
326 	pxx_write_2((sc), sc->atse_bmcr0, (reg), (val), __func__, __LINE__, \
327 	    "PCS")
328 #define	PCS_READ_2(sc, reg)		\
329 	pxx_read_2((sc), sc->atse_bmcr0, (reg), __func__, __LINE__, "PCS")
330 #define	PHY_WRITE_2(sc, reg, val)	\
331 	pxx_write_2((sc), sc->atse_bmcr1, (reg), (val), __func__, __LINE__, \
332 	    "PHY")
333 #define	PHY_READ_2(sc, reg)		\
334 	pxx_read_2((sc), sc->atse_bmcr1, (reg), __func__, __LINE__, "PHY")
335 
336 static void atse_tick(void *);
337 static int atse_detach(device_t);
338 
339 devclass_t atse_devclass;
340 
341 static int
342 atse_tx_locked(struct atse_softc *sc, int *sent)
343 {
344 	struct mbuf *m;
345 	uint32_t val4, fill_level;
346 	int c;
347 
348 	ATSE_LOCK_ASSERT(sc);
349 
350 	m = sc->atse_tx_m;
351 	KASSERT(m != NULL, ("%s: m is null: sc=%p", __func__, sc));
352 	KASSERT(m->m_flags & M_PKTHDR, ("%s: not a pkthdr: m=%p", __func__, m));
353 
354 	/*
355 	 * Copy to buffer to minimize our pain as we can only store
356 	 * double words which, after the first mbuf gets out of alignment
357 	 * quite quickly.
358 	 */
359 	if (sc->atse_tx_m_offset == 0) {
360 		m_copydata(m, 0, m->m_pkthdr.len, sc->atse_tx_buf);
361 		sc->atse_tx_buf_len = m->m_pkthdr.len;
362 	}
363 
364 	fill_level = ATSE_TX_READ_FILL_LEVEL(sc);
365 #if 0	/* Returns 0xdeadc0de. */
366 	val4 = ATSE_TX_META_READ(sc);
367 #endif
368 	if (sc->atse_tx_m_offset == 0) {
369 		/* Write start of packet. */
370 		val4 = A_ONCHIP_FIFO_MEM_CORE_SOP;
371 		val4 &= ~A_ONCHIP_FIFO_MEM_CORE_EOP;
372 		ATSE_TX_META_WRITE(sc, val4);
373 	}
374 
375 	/* TX FIFO is single clock mode, so we have the full FIFO. */
376 	c = 0;
377 	while ((sc->atse_tx_buf_len - sc->atse_tx_m_offset) > 4 &&
378 	     fill_level < AVALON_FIFO_TX_BASIC_OPTS_DEPTH) {
379 
380 		bcopy(&sc->atse_tx_buf[sc->atse_tx_m_offset], &val4,
381 		    sizeof(val4));
382 		ATSE_TX_DATA_WRITE(sc, val4);
383 		sc->atse_tx_m_offset += sizeof(val4);
384 		c += sizeof(val4);
385 
386 		fill_level++;
387 		if (fill_level == AVALON_FIFO_TX_BASIC_OPTS_DEPTH)
388 			fill_level = ATSE_TX_READ_FILL_LEVEL(sc);
389 	}
390 	if (sent != NULL)
391 		*sent += c;
392 
393 	/* Set EOP *before* writing the last symbol. */
394 	if (sc->atse_tx_m_offset >= (sc->atse_tx_buf_len - 4) &&
395 	    fill_level < AVALON_FIFO_TX_BASIC_OPTS_DEPTH) {
396 		int leftm;
397 		uint32_t x;
398 
399 		/* Set EndOfPacket. */
400 		val4 = A_ONCHIP_FIFO_MEM_CORE_EOP;
401 		/* Set EMPTY. */
402 		leftm = sc->atse_tx_buf_len - sc->atse_tx_m_offset;
403 		val4 |= ((4 - leftm) << A_ONCHIP_FIFO_MEM_CORE_EMPTY_SHIFT);
404 		x = val4;
405 		ATSE_TX_META_WRITE(sc, val4);
406 
407 		/* Write last symbol. */
408 		val4 = 0;
409 		bcopy(sc->atse_tx_buf + sc->atse_tx_m_offset, &val4, leftm);
410 		ATSE_TX_DATA_WRITE(sc, val4);
411 
412 		if (sent != NULL)
413 			*sent += leftm;
414 
415 		/* OK, the packet is gone. */
416 		sc->atse_tx_m = NULL;
417 		sc->atse_tx_m_offset = 0;
418 
419 		/* If anyone is interested give them a copy. */
420 		BPF_MTAP(sc->atse_ifp, m);
421 
422 		m_freem(m);
423 		return (0);
424 	}
425 
426 	return (EBUSY);
427 }
428 
429 static void
430 atse_start_locked(struct ifnet *ifp)
431 {
432 	struct atse_softc *sc;
433 	int error, sent;
434 
435 	sc = ifp->if_softc;
436 	ATSE_LOCK_ASSERT(sc);
437 
438 	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
439 	    IFF_DRV_RUNNING || (sc->atse_flags & ATSE_FLAGS_LINK) == 0)
440 		return;
441 
442 #if 1
443 	/*
444 	 * Disable the watchdog while sending, we are batching packets.
445 	 * Though we should never reach 5 seconds, and are holding the lock,
446 	 * but who knows.
447 	 */
448 	sc->atse_watchdog_timer = 0;
449 #endif
450 
451 	if (sc->atse_tx_m != NULL) {
452 		error = atse_tx_locked(sc, &sent);
453 		if (error != 0)
454 			goto done;
455 	}
456 	/* We have more space to send so continue ... */
457 	for (; !IFQ_DRV_IS_EMPTY(&ifp->if_snd); ) {
458 
459 		IFQ_DRV_DEQUEUE(&ifp->if_snd, sc->atse_tx_m);
460 		sc->atse_tx_m_offset = 0;
461 		if (sc->atse_tx_m == NULL)
462 			break;
463 		error = atse_tx_locked(sc, &sent);
464 		if (error != 0)
465 			goto done;
466 	}
467 
468 done:
469 	/* If the IP core walks into Nekromanteion try to bail out. */
470 	if (sent > 0)
471 		sc->atse_watchdog_timer = ATSE_WATCHDOG_TIME;
472 }
473 
474 static void
475 atse_start(struct ifnet *ifp)
476 {
477 	struct atse_softc *sc;
478 
479 	sc = ifp->if_softc;
480 	ATSE_LOCK(sc);
481 	atse_start_locked(ifp);
482 	ATSE_UNLOCK(sc);
483 }
484 
485 static int
486 atse_stop_locked(struct atse_softc *sc)
487 {
488 	struct ifnet *ifp;
489 	uint32_t mask, val4;
490 	int i;
491 
492 	ATSE_LOCK_ASSERT(sc);
493 
494 	sc->atse_watchdog_timer = 0;
495 	callout_stop(&sc->atse_tick);
496 
497 	ifp = sc->atse_ifp;
498 	ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
499 	ATSE_RX_INTR_DISABLE(sc);
500 	ATSE_TX_INTR_DISABLE(sc);
501 	ATSE_RX_EVENT_CLEAR(sc);
502 	ATSE_TX_EVENT_CLEAR(sc);
503 
504 	/* Disable MAC transmit and receive datapath. */
505 	mask = BASE_CFG_COMMAND_CONFIG_TX_ENA|BASE_CFG_COMMAND_CONFIG_RX_ENA;
506 	val4 = CSR_READ_4(sc, BASE_CFG_COMMAND_CONFIG);
507 	val4 &= ~mask;
508 	CSR_WRITE_4(sc, BASE_CFG_COMMAND_CONFIG, val4);
509 	/* Wait for bits to be cleared; i=100 is excessive. */
510 	for (i = 0; i < 100; i++) {
511 		val4 = CSR_READ_4(sc, BASE_CFG_COMMAND_CONFIG);
512 		if ((val4 & mask) == 0)
513 			break;
514 		DELAY(10);
515 	}
516 	if ((val4 & mask) != 0)
517 		device_printf(sc->atse_dev, "Disabling MAC TX/RX timed out.\n");
518 		/* Punt. */
519 
520 	sc->atse_flags &= ~ATSE_FLAGS_LINK;
521 
522 	/* XXX-BZ free the RX/TX rings. */
523 
524 	return (0);
525 }
526 
527 static uint8_t
528 atse_mchash(struct atse_softc *sc __unused, const uint8_t *addr)
529 {
530 	int i, j;
531 	uint8_t x, y;
532 
533 	x = 0;
534 	for (i = 0; i < ETHER_ADDR_LEN; i++) {
535 		y = addr[i] & 0x01;
536 		for (j = 1; j < 8; j++)
537 			y ^= (addr[i] >> j) & 0x01;
538 		x |= (y << i);
539 	}
540 	return (x);
541 }
542 
543 static int
544 atse_rxfilter_locked(struct atse_softc *sc)
545 {
546 	struct ifnet *ifp;
547 	struct ifmultiaddr *ifma;
548 	uint32_t val4;
549 	int i;
550 
551 	/* XXX-BZ can we find out if we have the MHASH synthesized? */
552 	val4 = CSR_READ_4(sc, BASE_CFG_COMMAND_CONFIG);
553 	/* For simplicity always hash full 48 bits of addresses. */
554 	if ((val4 & BASE_CFG_COMMAND_CONFIG_MHASH_SEL) != 0)
555 		val4 &= ~BASE_CFG_COMMAND_CONFIG_MHASH_SEL;
556 
557 	ifp = sc->atse_ifp;
558 	if (ifp->if_flags & IFF_PROMISC)
559 		val4 |= BASE_CFG_COMMAND_CONFIG_PROMIS_EN;
560 	else
561 		val4 &= ~BASE_CFG_COMMAND_CONFIG_PROMIS_EN;
562 
563 	CSR_WRITE_4(sc, BASE_CFG_COMMAND_CONFIG, val4);
564 
565 	if (ifp->if_flags & IFF_ALLMULTI) {
566 		/* Accept all multicast addresses. */
567 		for (i = 0; i <= MHASH_LEN; i++)
568 			CSR_WRITE_4(sc, MHASH_START + i, 0x1);
569 	} else {
570 		/*
571 		 * Can hold MHASH_LEN entries.
572 		 * XXX-BZ bitstring.h would be more general.
573 		 */
574 		uint64_t h;
575 
576 		h = 0;
577 		/*
578 		 * Re-build and re-program hash table.  First build the
579 		 * bit-field "yes" or "no" for each slot per address, then
580 		 * do all the programming afterwards.
581 		 */
582 		if_maddr_rlock(ifp);
583 		TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
584 			if (ifma->ifma_addr->sa_family != AF_LINK)
585 				continue;
586 
587 			h |= (1 << atse_mchash(sc,
588 			    LLADDR((struct sockaddr_dl *)ifma->ifma_addr)));
589 		}
590 		if_maddr_runlock(ifp);
591 		for (i = 0; i <= MHASH_LEN; i++)
592 			CSR_WRITE_4(sc, MHASH_START + i,
593 			    (h & (1 << i)) ? 0x01 : 0x00);
594 	}
595 
596 	return (0);
597 }
598 
599 static int
600 atse_ethernet_option_bits_read_fdt(device_t dev)
601 {
602 	struct resource *res;
603 	device_t fdev;
604 	int i, rid;
605 
606 	if (atse_ethernet_option_bits_flag & ATSE_ETHERNET_OPTION_BITS_READ)
607 		return (0);
608 
609 	fdev = device_find_child(device_get_parent(dev), "cfi", 0);
610 	if (fdev == NULL)
611 		return (ENOENT);
612 
613 	rid = 0;
614 	res = bus_alloc_resource_any(fdev, SYS_RES_MEMORY, &rid,
615 	    RF_ACTIVE | RF_SHAREABLE);
616 	if (res == NULL)
617 		return (ENXIO);
618 
619 	for (i = 0; i < ALTERA_ETHERNET_OPTION_BITS_LEN; i++)
620 		atse_ethernet_option_bits[i] = bus_read_1(res,
621 		    ALTERA_ETHERNET_OPTION_BITS_OFF + i);
622 
623 	bus_release_resource(fdev, SYS_RES_MEMORY, rid, res);
624 	atse_ethernet_option_bits_flag |= ATSE_ETHERNET_OPTION_BITS_READ;
625 
626 	return (0);
627 }
628 
629 static int
630 atse_ethernet_option_bits_read(device_t dev)
631 {
632 	int error;
633 
634 	error = atse_ethernet_option_bits_read_fdt(dev);
635 	if (error == 0)
636 		return (0);
637 
638 	device_printf(dev, "Cannot read Ethernet addresses from flash.\n");
639 	return (error);
640 }
641 
642 static int
643 atse_get_eth_address(struct atse_softc *sc)
644 {
645 	unsigned long hostid;
646 	uint32_t val4;
647 	int unit;
648 
649 	/*
650 	 * Make sure to only ever do this once.  Otherwise a reset would
651 	 * possibly change our ethernet address, which is not good at all.
652 	 */
653 	if (sc->atse_eth_addr[0] != 0x00 || sc->atse_eth_addr[1] != 0x00 ||
654 	    sc->atse_eth_addr[2] != 0x00)
655 		return (0);
656 
657 	if ((atse_ethernet_option_bits_flag &
658 	    ATSE_ETHERNET_OPTION_BITS_READ) == 0)
659 		goto get_random;
660 
661 	val4 = atse_ethernet_option_bits[0] << 24;
662 	val4 |= atse_ethernet_option_bits[1] << 16;
663 	val4 |= atse_ethernet_option_bits[2] << 8;
664 	val4 |= atse_ethernet_option_bits[3];
665 	/* They chose "safe". */
666 	if (val4 != le32toh(0x00005afe)) {
667 		device_printf(sc->atse_dev, "Magic '5afe' is not safe: 0x%08x. "
668 		    "Falling back to random numbers for hardware address.\n",
669 		     val4);
670 		goto get_random;
671 	}
672 
673 	sc->atse_eth_addr[0] = atse_ethernet_option_bits[4];
674 	sc->atse_eth_addr[1] = atse_ethernet_option_bits[5];
675 	sc->atse_eth_addr[2] = atse_ethernet_option_bits[6];
676 	sc->atse_eth_addr[3] = atse_ethernet_option_bits[7];
677 	sc->atse_eth_addr[4] = atse_ethernet_option_bits[8];
678 	sc->atse_eth_addr[5] = atse_ethernet_option_bits[9];
679 
680 	/* Handle factory default ethernet addresss: 00:07:ed:ff:ed:15 */
681 	if (sc->atse_eth_addr[0] == 0x00 && sc->atse_eth_addr[1] == 0x07 &&
682 	    sc->atse_eth_addr[2] == 0xed && sc->atse_eth_addr[3] == 0xff &&
683 	    sc->atse_eth_addr[4] == 0xed && sc->atse_eth_addr[5] == 0x15) {
684 
685 		device_printf(sc->atse_dev, "Factory programmed Ethernet "
686 		    "hardware address blacklisted.  Falling back to random "
687 		    "address to avoid collisions.\n");
688 		device_printf(sc->atse_dev, "Please re-program your flash.\n");
689 		goto get_random;
690 	}
691 
692 	if (sc->atse_eth_addr[0] == 0x00 && sc->atse_eth_addr[1] == 0x00 &&
693 	    sc->atse_eth_addr[2] == 0x00 && sc->atse_eth_addr[3] == 0x00 &&
694 	    sc->atse_eth_addr[4] == 0x00 && sc->atse_eth_addr[5] == 0x00) {
695 		device_printf(sc->atse_dev, "All zero's Ethernet hardware "
696 		    "address blacklisted.  Falling back to random address.\n");
697 		device_printf(sc->atse_dev, "Please re-program your flash.\n");
698 		goto get_random;
699 	}
700 
701 	if (ETHER_IS_MULTICAST(sc->atse_eth_addr)) {
702 		device_printf(sc->atse_dev, "Multicast Ethernet hardware "
703 		    "address blacklisted.  Falling back to random address.\n");
704 		device_printf(sc->atse_dev, "Please re-program your flash.\n");
705 		goto get_random;
706 	}
707 
708 	/*
709 	 * If we find an Altera prefixed address with a 0x0 ending
710 	 * adjust by device unit.  If not and this is not the first
711 	 * Ethernet, go to random.
712 	 */
713 	unit = device_get_unit(sc->atse_dev);
714 	if (unit == 0x00)
715 		return (0);
716 
717 	if (unit > 0x0f) {
718 		device_printf(sc->atse_dev, "We do not support Ethernet "
719 		    "addresses for more than 16 MACs. Falling back to "
720 		    "random hadware address.\n");
721 		goto get_random;
722 	}
723 	if ((sc->atse_eth_addr[0] & ~0x2) != 0 ||
724 	    sc->atse_eth_addr[1] != 0x07 || sc->atse_eth_addr[2] != 0xed ||
725 	    (sc->atse_eth_addr[5] & 0x0f) != 0x0) {
726 		device_printf(sc->atse_dev, "Ethernet address not meeting our "
727 		    "multi-MAC standards. Falling back to random hadware "
728 		    "address.\n");
729 		goto get_random;
730 	}
731 	sc->atse_eth_addr[5] |= (unit & 0x0f);
732 
733 	return (0);
734 
735 get_random:
736 	/*
737 	 * Fall back to random code we also use on bridge(4).
738 	 */
739 	getcredhostid(curthread->td_ucred, &hostid);
740 	if (hostid == 0) {
741 		arc4rand(sc->atse_eth_addr, ETHER_ADDR_LEN, 1);
742 		sc->atse_eth_addr[0] &= ~1;/* clear multicast bit */
743 		sc->atse_eth_addr[0] |= 2; /* set the LAA bit */
744 	} else {
745 		sc->atse_eth_addr[0] = 0x2;
746 		sc->atse_eth_addr[1] = (hostid >> 24)	& 0xff;
747 		sc->atse_eth_addr[2] = (hostid >> 16)	& 0xff;
748 		sc->atse_eth_addr[3] = (hostid >> 8 )	& 0xff;
749 		sc->atse_eth_addr[4] = hostid		& 0xff;
750 		sc->atse_eth_addr[5] = sc->atse_unit	& 0xff;
751 	}
752 
753 	return (0);
754 }
755 
756 static int
757 atse_set_eth_address(struct atse_softc *sc, int n)
758 {
759 	uint32_t v0, v1;
760 
761 	v0 = (sc->atse_eth_addr[3] << 24) | (sc->atse_eth_addr[2] << 16) |
762 	    (sc->atse_eth_addr[1] << 8) | sc->atse_eth_addr[0];
763 	v1 = (sc->atse_eth_addr[5] << 8) | sc->atse_eth_addr[4];
764 
765 	if (n & ATSE_ETH_ADDR_DEF) {
766 		CSR_WRITE_4(sc, BASE_CFG_MAC_0, v0);
767 		CSR_WRITE_4(sc, BASE_CFG_MAC_1, v1);
768 	}
769 	if (n & ATSE_ETH_ADDR_SUPP1) {
770 		CSR_WRITE_4(sc, SUPPL_ADDR_SMAC_0_0, v0);
771 		CSR_WRITE_4(sc, SUPPL_ADDR_SMAC_0_1, v1);
772 	}
773 	if (n & ATSE_ETH_ADDR_SUPP2) {
774 		CSR_WRITE_4(sc, SUPPL_ADDR_SMAC_1_0, v0);
775 		CSR_WRITE_4(sc, SUPPL_ADDR_SMAC_1_1, v1);
776 	}
777 	if (n & ATSE_ETH_ADDR_SUPP3) {
778 		CSR_WRITE_4(sc, SUPPL_ADDR_SMAC_2_0, v0);
779 		CSR_WRITE_4(sc, SUPPL_ADDR_SMAC_2_1, v1);
780 	}
781 	if (n & ATSE_ETH_ADDR_SUPP4) {
782 		CSR_WRITE_4(sc, SUPPL_ADDR_SMAC_3_0, v0);
783 		CSR_WRITE_4(sc, SUPPL_ADDR_SMAC_3_1, v1);
784 	}
785 
786 	return (0);
787 }
788 
789 static int
790 atse_reset(struct atse_softc *sc)
791 {
792 	int i;
793 	uint32_t val4, mask;
794 	uint16_t val;
795 
796 	/* 1. External PHY Initialization using MDIO. */
797 	/*
798 	 * We select the right MDIO space in atse_attach() and let MII do
799 	 * anything else.
800 	 */
801 
802 	/* 2. PCS Configuration Register Initialization. */
803 	/* a. Set auto negotiation link timer to 1.6ms for SGMII. */
804 	PCS_WRITE_2(sc, PCS_EXT_LINK_TIMER_0, 0x0D40);
805 	PCS_WRITE_2(sc, PCS_EXT_LINK_TIMER_1, 0x0003);
806 
807 	/* b. Configure SGMII. */
808 	val = PCS_EXT_IF_MODE_SGMII_ENA|PCS_EXT_IF_MODE_USE_SGMII_AN;
809 	PCS_WRITE_2(sc, PCS_EXT_IF_MODE, val);
810 
811 	/* c. Enable auto negotiation. */
812 	/* Ignore Bits 6,8,13; should be set,set,unset. */
813 	val = PCS_READ_2(sc, PCS_CONTROL);
814 	val &= ~(PCS_CONTROL_ISOLATE|PCS_CONTROL_POWERDOWN);
815 	val &= ~PCS_CONTROL_LOOPBACK;		/* Make this a -link1 option? */
816 	val |= PCS_CONTROL_AUTO_NEGOTIATION_ENABLE;
817 	PCS_WRITE_2(sc, PCS_CONTROL, val);
818 
819 	/* d. PCS reset. */
820 	val = PCS_READ_2(sc, PCS_CONTROL);
821 	val |= PCS_CONTROL_RESET;
822 	PCS_WRITE_2(sc, PCS_CONTROL, val);
823 	/* Wait for reset bit to clear; i=100 is excessive. */
824 	for (i = 0; i < 100; i++) {
825 		val = PCS_READ_2(sc, PCS_CONTROL);
826 		if ((val & PCS_CONTROL_RESET) == 0)
827 			break;
828 		DELAY(10);
829 	}
830 	if ((val & PCS_CONTROL_RESET) != 0) {
831 		device_printf(sc->atse_dev, "PCS reset timed out.\n");
832 		return (ENXIO);
833 	}
834 
835 	/* 3. MAC Configuration Register Initialization. */
836 	/* a. Disable MAC transmit and receive datapath. */
837 	mask = BASE_CFG_COMMAND_CONFIG_TX_ENA|BASE_CFG_COMMAND_CONFIG_RX_ENA;
838 	val4 = CSR_READ_4(sc, BASE_CFG_COMMAND_CONFIG);
839 	val4 &= ~mask;
840 	/* Samples in the manual do have the SW_RESET bit set here, why? */
841 	CSR_WRITE_4(sc, BASE_CFG_COMMAND_CONFIG, val4);
842 	/* Wait for bits to be cleared; i=100 is excessive. */
843 	for (i = 0; i < 100; i++) {
844 		val4 = CSR_READ_4(sc, BASE_CFG_COMMAND_CONFIG);
845 		if ((val4 & mask) == 0)
846 			break;
847 		DELAY(10);
848 	}
849 	if ((val4 & mask) != 0) {
850 		device_printf(sc->atse_dev, "Disabling MAC TX/RX timed out.\n");
851 		return (ENXIO);
852 	}
853 	/* b. MAC FIFO configuration. */
854 	CSR_WRITE_4(sc, BASE_CFG_TX_SECTION_EMPTY, FIFO_DEPTH_TX - 16);
855 	CSR_WRITE_4(sc, BASE_CFG_TX_ALMOST_FULL, 3);
856 	CSR_WRITE_4(sc, BASE_CFG_TX_ALMOST_EMPTY, 8);
857 	CSR_WRITE_4(sc, BASE_CFG_RX_SECTION_EMPTY, FIFO_DEPTH_RX - 16);
858 	CSR_WRITE_4(sc, BASE_CFG_RX_ALMOST_FULL, 8);
859 	CSR_WRITE_4(sc, BASE_CFG_RX_ALMOST_EMPTY, 8);
860 #if 0
861 	CSR_WRITE_4(sc, BASE_CFG_TX_SECTION_FULL, 16);
862 	CSR_WRITE_4(sc, BASE_CFG_RX_SECTION_FULL, 16);
863 #else
864 	/* For store-and-forward mode, set this threshold to 0. */
865 	CSR_WRITE_4(sc, BASE_CFG_TX_SECTION_FULL, 0);
866 	CSR_WRITE_4(sc, BASE_CFG_RX_SECTION_FULL, 0);
867 #endif
868 	/* c. MAC address configuration. */
869 	/* Also intialize supplementary addresses to our primary one. */
870 	/* XXX-BZ FreeBSD really needs to grow and API for using these. */
871 	atse_get_eth_address(sc);
872 	atse_set_eth_address(sc, ATSE_ETH_ADDR_ALL);
873 
874 	/* d. MAC function configuration. */
875 	CSR_WRITE_4(sc, BASE_CFG_FRM_LENGTH, 1518);	/* Default. */
876 	CSR_WRITE_4(sc, BASE_CFG_TX_IPG_LENGTH, 12);
877 	CSR_WRITE_4(sc, BASE_CFG_PAUSE_QUANT, 0xFFFF);
878 
879 	val4 = CSR_READ_4(sc, BASE_CFG_COMMAND_CONFIG);
880 	/*
881 	 * If 1000BASE-X/SGMII PCS is initialized, set the ETH_SPEED (bit 3)
882 	 * and ENA_10 (bit 25) in command_config register to 0.  If half duplex
883 	 * is reported in the PHY/PCS status register, set the HD_ENA (bit 10)
884 	 * to 1 in command_config register.
885 	 * BZ: We shoot for 1000 instead.
886 	 */
887 #if 0
888 	val4 |= BASE_CFG_COMMAND_CONFIG_ETH_SPEED;
889 #else
890 	val4 &= ~BASE_CFG_COMMAND_CONFIG_ETH_SPEED;
891 #endif
892 	val4 &= ~BASE_CFG_COMMAND_CONFIG_ENA_10;
893 #if 0
894 	/*
895 	 * We do not want to set this, otherwise, we could not even send
896 	 * random raw ethernet frames for various other research.  By default
897 	 * FreeBSD will use the right ether source address.
898 	 */
899 	val4 |= BASE_CFG_COMMAND_CONFIG_TX_ADDR_INS;
900 #endif
901 	val4 |= BASE_CFG_COMMAND_CONFIG_PAD_EN;
902 	val4 &= ~BASE_CFG_COMMAND_CONFIG_CRC_FWD;
903 #if 0
904 	val4 |= BASE_CFG_COMMAND_CONFIG_CNTL_FRM_ENA;
905 #endif
906 #if 1
907 	val4 |= BASE_CFG_COMMAND_CONFIG_RX_ERR_DISC;
908 #endif
909 	val &= ~BASE_CFG_COMMAND_CONFIG_LOOP_ENA;		/* link0? */
910 	CSR_WRITE_4(sc, BASE_CFG_COMMAND_CONFIG, val4);
911 
912 	/*
913 	 * Make sure we do not enable 32bit alignment;  FreeBSD cannot
914 	 * cope with the additional padding (though we should!?).
915 	 * Also make sure we get the CRC appended.
916 	 */
917 	val4 = CSR_READ_4(sc, TX_CMD_STAT);
918 	val4 &= ~(TX_CMD_STAT_OMIT_CRC|TX_CMD_STAT_TX_SHIFT16);
919 	CSR_WRITE_4(sc, TX_CMD_STAT, val4);
920 	val4 = CSR_READ_4(sc, RX_CMD_STAT);
921 	val4 &= ~RX_CMD_STAT_RX_SHIFT16;
922 	CSR_WRITE_4(sc, RX_CMD_STAT, val4);
923 
924 	/* e. Reset MAC. */
925 	val4 = CSR_READ_4(sc, BASE_CFG_COMMAND_CONFIG);
926 	val4 |= BASE_CFG_COMMAND_CONFIG_SW_RESET;
927 	CSR_WRITE_4(sc, BASE_CFG_COMMAND_CONFIG, val4);
928 	/* Wait for bits to be cleared; i=100 is excessive. */
929 	for (i = 0; i < 100; i++) {
930 		val4 = CSR_READ_4(sc, BASE_CFG_COMMAND_CONFIG);
931 		if ((val4 & BASE_CFG_COMMAND_CONFIG_SW_RESET) == 0)
932 			break;
933 		DELAY(10);
934 	}
935 	if ((val4 & BASE_CFG_COMMAND_CONFIG_SW_RESET) != 0) {
936 		device_printf(sc->atse_dev, "MAC reset timed out.\n");
937 		return (ENXIO);
938 	}
939 
940 	/* f. Enable MAC transmit and receive datapath. */
941 	mask = BASE_CFG_COMMAND_CONFIG_TX_ENA|BASE_CFG_COMMAND_CONFIG_RX_ENA;
942 	val4 = CSR_READ_4(sc, BASE_CFG_COMMAND_CONFIG);
943 	val4 |= mask;
944 	CSR_WRITE_4(sc, BASE_CFG_COMMAND_CONFIG, val4);
945 	/* Wait for bits to be cleared; i=100 is excessive. */
946 	for (i = 0; i < 100; i++) {
947 		val4 = CSR_READ_4(sc, BASE_CFG_COMMAND_CONFIG);
948 		if ((val4 & mask) == mask)
949 			break;
950 		DELAY(10);
951 	}
952 	if ((val4 & mask) != mask) {
953 		device_printf(sc->atse_dev, "Enabling MAC TX/RX timed out.\n");
954 		return (ENXIO);
955 	}
956 
957 	return (0);
958 }
959 
960 static void
961 atse_init_locked(struct atse_softc *sc)
962 {
963 	struct ifnet *ifp;
964 	struct mii_data *mii;
965 	uint8_t *eaddr;
966 
967 	ATSE_LOCK_ASSERT(sc);
968 	ifp = sc->atse_ifp;
969 
970 	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
971 		return;
972 
973 	/*
974 	 * Must update the ether address if changed.  Given we do not handle
975 	 * in atse_ioctl() but it's in the general framework, just always
976 	 * do it here before atse_reset().
977 	 */
978 	eaddr = IF_LLADDR(sc->atse_ifp);
979 	bcopy(eaddr, &sc->atse_eth_addr, ETHER_ADDR_LEN);
980 
981 	/* Make things frind to halt, cleanup, ... */
982 	atse_stop_locked(sc);
983 	/* ... reset, ... */
984 	atse_reset(sc);
985 
986 	/* ... and fire up the engine again. */
987 	atse_rxfilter_locked(sc);
988 
989 	/* Memory rings?  DMA engine? */
990 
991 	sc->atse_rx_buf_len = 0;
992 	sc->atse_flags &= ATSE_FLAGS_LINK;	/* Preserve. */
993 
994 #ifdef DEVICE_POLLING
995         /* Only enable interrupts if we are not polling. */
996 	if (ifp->if_capenable & IFCAP_POLLING) {
997 		ATSE_RX_INTR_DISABLE(sc);
998 		ATSE_TX_INTR_DISABLE(sc);
999 		ATSE_RX_EVENT_CLEAR(sc);
1000 		ATSE_TX_EVENT_CLEAR(sc);
1001 	} else
1002 #endif
1003 	{
1004 		ATSE_RX_INTR_ENABLE(sc);
1005 		ATSE_TX_INTR_ENABLE(sc);
1006 	}
1007 
1008 	mii = device_get_softc(sc->atse_miibus);
1009 
1010 	sc->atse_flags &= ~ATSE_FLAGS_LINK;
1011 	mii_mediachg(mii);
1012 
1013 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
1014 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1015 
1016 	callout_reset(&sc->atse_tick, hz, atse_tick, sc);
1017 }
1018 
1019 static void
1020 atse_init(void *xsc)
1021 {
1022 	struct atse_softc *sc;
1023 
1024 	/*
1025 	 * XXXRW: There is some argument that we should immediately do RX
1026 	 * processing after enabling interrupts, or one may not fire if there
1027 	 * are buffered packets.
1028 	 */
1029 	sc = (struct atse_softc *)xsc;
1030 	ATSE_LOCK(sc);
1031 	atse_init_locked(sc);
1032 	ATSE_UNLOCK(sc);
1033 }
1034 
1035 static int
1036 atse_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
1037 {
1038 	struct atse_softc *sc;
1039 	struct ifreq *ifr;
1040 	int error, mask;
1041 
1042 
1043 	error = 0;
1044 	sc = ifp->if_softc;
1045 	ifr = (struct ifreq *)data;
1046 
1047 	switch (command) {
1048 	case SIOCSIFFLAGS:
1049 		ATSE_LOCK(sc);
1050 		if (ifp->if_flags & IFF_UP) {
1051 			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
1052 			    ((ifp->if_flags ^ sc->atse_if_flags) &
1053 			    (IFF_PROMISC | IFF_ALLMULTI)) != 0)
1054 				atse_rxfilter_locked(sc);
1055 			else
1056 				atse_init_locked(sc);
1057 		} else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1058 			atse_stop_locked(sc);
1059                 sc->atse_if_flags = ifp->if_flags;
1060 		ATSE_UNLOCK(sc);
1061 		break;
1062 	case SIOCSIFCAP:
1063 		ATSE_LOCK(sc);
1064 		mask = ifr->ifr_reqcap ^ ifp->if_capenable;
1065 #ifdef DEVICE_POLLING
1066 		if ((mask & IFCAP_POLLING) != 0 &&
1067 		    (IFCAP_POLLING & ifp->if_capabilities) != 0) {
1068 			ifp->if_capenable ^= IFCAP_POLLING;
1069 			if ((IFCAP_POLLING & ifp->if_capenable) != 0) {
1070 
1071 				error = ether_poll_register(atse_poll, ifp);
1072 				if (error != 0) {
1073 					ATSE_UNLOCK(sc);
1074 					break;
1075 				}
1076 				/* Disable interrupts. */
1077 				ATSE_RX_INTR_DISABLE(sc);
1078 				ATSE_TX_INTR_DISABLE(sc);
1079 				ATSE_RX_EVENT_CLEAR(sc);
1080 				ATSE_TX_EVENT_CLEAR(sc);
1081 
1082 			/*
1083 			 * Do not allow disabling of polling if we do
1084 			 * not have interrupts.
1085 			 */
1086 			} else if (sc->atse_rx_irq_res != NULL ||
1087 			    sc->atse_tx_irq_res != NULL) {
1088 				error = ether_poll_deregister(ifp);
1089 				/* Enable interrupts. */
1090 				ATSE_RX_INTR_ENABLE(sc);
1091 				ATSE_TX_INTR_ENABLE(sc);
1092 			} else {
1093 				ifp->if_capenable ^= IFCAP_POLLING;
1094 				error = EINVAL;
1095 			}
1096 		}
1097 #endif /* DEVICE_POLLING */
1098 		ATSE_UNLOCK(sc);
1099 		break;
1100 	case SIOCADDMULTI:
1101 	case SIOCDELMULTI:
1102 		ATSE_LOCK(sc);
1103 		atse_rxfilter_locked(sc);
1104 		ATSE_UNLOCK(sc);
1105 		break;
1106 	case SIOCGIFMEDIA:
1107 	case SIOCSIFMEDIA:
1108 	{
1109 		struct mii_data *mii;
1110 		struct ifreq *ifr;
1111 
1112 		mii = device_get_softc(sc->atse_miibus);
1113 		ifr = (struct ifreq *)data;
1114 		error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
1115 		break;
1116 	}
1117 	default:
1118 		error = ether_ioctl(ifp, command, data);
1119 		break;
1120 	}
1121 
1122 	return (error);
1123 }
1124 
1125 static void
1126 atse_intr_debug(struct atse_softc *sc, const char *intrname)
1127 {
1128 	uint32_t rxs, rxe, rxi, rxf, txs, txe, txi, txf;
1129 
1130 	if (!atse_intr_debug_enable)
1131 		return;
1132 
1133 	rxs = ATSE_RX_STATUS_READ(sc);
1134 	rxe = ATSE_RX_EVENT_READ(sc);
1135 	rxi = ATSE_RX_INTR_READ(sc);
1136 	rxf = ATSE_RX_READ_FILL_LEVEL(sc);
1137 
1138 	txs = ATSE_TX_STATUS_READ(sc);
1139 	txe = ATSE_TX_EVENT_READ(sc);
1140 	txi = ATSE_TX_INTR_READ(sc);
1141 	txf = ATSE_TX_READ_FILL_LEVEL(sc);
1142 
1143 	printf(
1144 	    "%s - %s: "
1145 	    "rxs 0x%x rxe 0x%x rxi 0x%x rxf 0x%x "
1146 	    "txs 0x%x txe 0x%x txi 0x%x txf 0x%x\n",
1147 	    __func__, intrname,
1148 	    rxs, rxe, rxi, rxf,
1149 	    txs, txe, txi, txf);
1150 }
1151 
1152 static void
1153 atse_watchdog(struct atse_softc *sc)
1154 {
1155 
1156 	ATSE_LOCK_ASSERT(sc);
1157 
1158 	if (sc->atse_watchdog_timer == 0 || --sc->atse_watchdog_timer > 0)
1159 		return;
1160 
1161 	device_printf(sc->atse_dev, "watchdog timeout\n");
1162 	if_inc_counter(sc->atse_ifp, IFCOUNTER_OERRORS, 1);
1163 
1164 	atse_intr_debug(sc, "poll");
1165 
1166 	sc->atse_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1167 	atse_init_locked(sc);
1168 
1169 	atse_rx_locked(sc);
1170 	if (!IFQ_DRV_IS_EMPTY(&sc->atse_ifp->if_snd))
1171 		atse_start_locked(sc->atse_ifp);
1172 }
1173 
1174 static void
1175 atse_tick(void *xsc)
1176 {
1177 	struct atse_softc *sc;
1178 	struct mii_data *mii;
1179 	struct ifnet *ifp;
1180 
1181 	sc = (struct atse_softc *)xsc;
1182 	ATSE_LOCK_ASSERT(sc);
1183 	ifp = sc->atse_ifp;
1184 
1185 	mii = device_get_softc(sc->atse_miibus);
1186 	mii_tick(mii);
1187 	atse_watchdog(sc);
1188 	if ((sc->atse_flags & ATSE_FLAGS_LINK) == 0)
1189 		atse_miibus_statchg(sc->atse_dev);
1190 	callout_reset(&sc->atse_tick, hz, atse_tick, sc);
1191 }
1192 
1193 /*
1194  * Set media options.
1195  */
1196 static int
1197 atse_ifmedia_upd(struct ifnet *ifp)
1198 {
1199 	struct atse_softc *sc;
1200 	struct mii_data *mii;
1201 	struct mii_softc *miisc;
1202 	int error;
1203 
1204 	sc = ifp->if_softc;
1205 
1206 	ATSE_LOCK(sc);
1207 	mii = device_get_softc(sc->atse_miibus);
1208 	LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
1209 		PHY_RESET(miisc);
1210 	error = mii_mediachg(mii);
1211 	ATSE_UNLOCK(sc);
1212 
1213 	return (error);
1214 }
1215 
1216 static void
1217 atse_update_rx_err(struct atse_softc *sc, uint32_t mask)
1218 {
1219 	int i;
1220 
1221 	/* RX error are 6 bits, we only know 4 of them. */
1222 	for (i = 0; i < ATSE_RX_ERR_MAX; i++)
1223 		if ((mask & (1 << i)) != 0)
1224 			sc->atse_rx_err[i]++;
1225 }
1226 
1227 static int
1228 atse_rx_locked(struct atse_softc *sc)
1229 {
1230 	struct ifnet *ifp;
1231 	struct mbuf *m;
1232 	uint32_t fill, i, j;
1233 	uint32_t data, meta;
1234 	int rx_npkts = 0;
1235 
1236 	ATSE_LOCK_ASSERT(sc);
1237 
1238 	ifp = sc->atse_ifp;
1239 	j = 0;
1240 	meta = 0;
1241 	do {
1242 outer:
1243 		if (sc->atse_rx_m == NULL) {
1244 			m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
1245 			if (m == NULL)
1246 				return (rx_npkts);
1247 			m->m_len = m->m_pkthdr.len = MCLBYTES;
1248 			/* Make sure upper layers will be aligned. */
1249 			m_adj(m, ETHER_ALIGN);
1250 			sc->atse_rx_m = m;
1251 		}
1252 
1253 		fill = ATSE_RX_READ_FILL_LEVEL(sc);
1254 		for (i = 0; i < fill; i++) {
1255 			/*
1256 			 * XXX-BZ for whatever reason the FIFO requires the
1257 			 * the data read before we can access the meta data.
1258 			 */
1259 			data = ATSE_RX_DATA_READ(sc);
1260 			meta = ATSE_RX_META_READ(sc);
1261 			if (meta & A_ONCHIP_FIFO_MEM_CORE_ERROR_MASK) {
1262 				/* XXX-BZ evaluate error. */
1263 				atse_update_rx_err(sc, ((meta &
1264 				    A_ONCHIP_FIFO_MEM_CORE_ERROR_MASK) >>
1265 				    A_ONCHIP_FIFO_MEM_CORE_ERROR_SHIFT) & 0xff);
1266 				if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1267 				sc->atse_rx_buf_len = 0;
1268 				/*
1269 				 * Should still read till EOP or next SOP.
1270 				 *
1271 				 * XXX-BZ might also depend on
1272 				 * BASE_CFG_COMMAND_CONFIG_RX_ERR_DISC
1273 				 */
1274 				sc->atse_flags |= ATSE_FLAGS_ERROR;
1275 				return (rx_npkts);
1276 			}
1277 			if ((meta & A_ONCHIP_FIFO_MEM_CORE_CHANNEL_MASK) != 0)
1278 				device_printf(sc->atse_dev, "%s: unexpected "
1279 				    "channel %u\n", __func__, (meta &
1280 				    A_ONCHIP_FIFO_MEM_CORE_CHANNEL_MASK) >>
1281 				    A_ONCHIP_FIFO_MEM_CORE_CHANNEL_SHIFT);
1282 
1283 			if (meta & A_ONCHIP_FIFO_MEM_CORE_SOP) {
1284 				/*
1285 				 * There is no need to clear SOP between 1st
1286 				 * and subsequent packet data junks.
1287 				 */
1288 				if (sc->atse_rx_buf_len != 0 &&
1289 				    (sc->atse_flags & ATSE_FLAGS_SOP_SEEN) == 0)
1290 				{
1291 					device_printf(sc->atse_dev, "%s: SOP "
1292 					    "without empty buffer: %u\n",
1293 					    __func__, sc->atse_rx_buf_len);
1294 					/* XXX-BZ any better counter? */
1295 					if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1296 				}
1297 
1298 				if ((sc->atse_flags & ATSE_FLAGS_SOP_SEEN) == 0)
1299 				{
1300 					sc->atse_flags |= ATSE_FLAGS_SOP_SEEN;
1301 					sc->atse_rx_buf_len = 0;
1302 				}
1303 			}
1304 #if 0 /* We had to read the data before we could access meta data. See above. */
1305 			data = ATSE_RX_DATA_READ(sc);
1306 #endif
1307 			/* Make sure to not overflow the mbuf data size. */
1308 			if (sc->atse_rx_buf_len >= sc->atse_rx_m->m_len -
1309 			    sizeof(data)) {
1310 				/*
1311 				 * XXX-BZ Error.  We need more mbufs and are
1312 				 * not setup for this yet.
1313 				 */
1314 				if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1315 				sc->atse_flags |= ATSE_FLAGS_ERROR;
1316 			}
1317 			if ((sc->atse_flags & ATSE_FLAGS_ERROR) == 0)
1318 				/*
1319 				 * MUST keep this bcopy as m_data after m_adj
1320 				 * for IP header aligment is on half-word
1321 				 * and not word alignment.
1322 				 */
1323 				bcopy(&data, (uint8_t *)(sc->atse_rx_m->m_data +
1324 				    sc->atse_rx_buf_len), sizeof(data));
1325 			if (meta & A_ONCHIP_FIFO_MEM_CORE_EOP) {
1326 				uint8_t empty;
1327 
1328 				empty = (meta &
1329 				    A_ONCHIP_FIFO_MEM_CORE_EMPTY_MASK) >>
1330 				    A_ONCHIP_FIFO_MEM_CORE_EMPTY_SHIFT;
1331 				sc->atse_rx_buf_len += (4 - empty);
1332 
1333 				if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
1334 				rx_npkts++;
1335 
1336 				m = sc->atse_rx_m;
1337 				m->m_pkthdr.len = m->m_len =
1338 				    sc->atse_rx_buf_len;
1339 				sc->atse_rx_m = NULL;
1340 
1341 				sc->atse_rx_buf_len = 0;
1342 				sc->atse_flags &= ~ATSE_FLAGS_SOP_SEEN;
1343 				if (sc->atse_flags & ATSE_FLAGS_ERROR) {
1344 					sc->atse_flags &= ~ATSE_FLAGS_ERROR;
1345 					m_freem(m);
1346 				} else {
1347 					m->m_pkthdr.rcvif = ifp;
1348 					ATSE_UNLOCK(sc);
1349 					(*ifp->if_input)(ifp, m);
1350 					ATSE_LOCK(sc);
1351 				}
1352 #ifdef DEVICE_POLLING
1353 				if (ifp->if_capenable & IFCAP_POLLING) {
1354 					if (sc->atse_rx_cycles <= 0)
1355 						return (rx_npkts);
1356 					sc->atse_rx_cycles--;
1357 				}
1358 #endif
1359 				goto outer;	/* Need a new mbuf. */
1360 			} else {
1361 				sc->atse_rx_buf_len += sizeof(data);
1362 			}
1363 		} /* for */
1364 
1365 	/* XXX-BZ could optimize in case of another packet waiting. */
1366 	} while (fill > 0);
1367 
1368 	return (rx_npkts);
1369 }
1370 
1371 
1372 /*
1373  * Report current media status.
1374  */
1375 static void
1376 atse_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
1377 {
1378 	struct atse_softc *sc;
1379 	struct mii_data *mii;
1380 
1381 	sc = ifp->if_softc;
1382 
1383 	ATSE_LOCK(sc);
1384 	mii = device_get_softc(sc->atse_miibus);
1385 	mii_pollstat(mii);
1386 	ifmr->ifm_active = mii->mii_media_active;
1387 	ifmr->ifm_status = mii->mii_media_status;
1388 	ATSE_UNLOCK(sc);
1389 }
1390 
1391 static void
1392 atse_rx_intr(void *arg)
1393 {
1394 	struct atse_softc *sc;
1395 	struct ifnet *ifp;
1396 	uint32_t rxe;
1397 
1398 	sc = (struct atse_softc *)arg;
1399 	ifp = sc->atse_ifp;
1400 
1401 	ATSE_LOCK(sc);
1402 #ifdef DEVICE_POLLING
1403 	if (ifp->if_capenable & IFCAP_POLLING) {
1404 		ATSE_UNLOCK(sc);
1405 		return;
1406 	}
1407 #endif
1408 
1409 	atse_intr_debug(sc, "rx");
1410 	rxe = ATSE_RX_EVENT_READ(sc);
1411 	if (rxe & (A_ONCHIP_FIFO_MEM_CORE_EVENT_OVERFLOW|
1412 	    A_ONCHIP_FIFO_MEM_CORE_EVENT_UNDERFLOW)) {
1413 		/* XXX-BZ ERROR HANDLING. */
1414 		atse_update_rx_err(sc, ((rxe &
1415 		    A_ONCHIP_FIFO_MEM_CORE_ERROR_MASK) >>
1416 		    A_ONCHIP_FIFO_MEM_CORE_ERROR_SHIFT) & 0xff);
1417 		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1418 	}
1419 
1420 	/*
1421 	 * There is considerable subtlety in the race-free handling of rx
1422 	 * interrupts: we must disable interrupts whenever we manipulate the
1423 	 * FIFO to prevent further interrupts from firing before we are done;
1424 	 * we must clear the event after processing to prevent the event from
1425 	 * being immediately reposted due to data remaining; we must clear the
1426 	 * event mask before reenabling interrupts or risk missing a positive
1427 	 * edge; and we must recheck everything after completing in case the
1428 	 * event posted between clearing events and reenabling interrupts.  If
1429 	 * a race is experienced, we must restart the whole mechanism.
1430 	 */
1431 	do {
1432 		ATSE_RX_INTR_DISABLE(sc);
1433 #if 0
1434 		sc->atse_rx_cycles = RX_CYCLES_IN_INTR;
1435 #endif
1436 		atse_rx_locked(sc);
1437 		ATSE_RX_EVENT_CLEAR(sc);
1438 
1439 		/* Disable interrupts if interface is down. */
1440 		if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1441 			ATSE_RX_INTR_ENABLE(sc);
1442 	} while (!(ATSE_RX_STATUS_READ(sc) &
1443 	    A_ONCHIP_FIFO_MEM_CORE_STATUS_EMPTY));
1444 	ATSE_UNLOCK(sc);
1445 
1446 }
1447 
1448 static void
1449 atse_tx_intr(void *arg)
1450 {
1451 	struct atse_softc *sc;
1452 	struct ifnet *ifp;
1453 	uint32_t txe;
1454 
1455 	sc = (struct atse_softc *)arg;
1456 	ifp = sc->atse_ifp;
1457 
1458 	ATSE_LOCK(sc);
1459 #ifdef DEVICE_POLLING
1460 	if (ifp->if_capenable & IFCAP_POLLING) {
1461 		ATSE_UNLOCK(sc);
1462 		return;
1463 	}
1464 #endif
1465 
1466 	/* XXX-BZ build histogram. */
1467 	atse_intr_debug(sc, "tx");
1468 	txe = ATSE_TX_EVENT_READ(sc);
1469 	if (txe & (A_ONCHIP_FIFO_MEM_CORE_EVENT_OVERFLOW|
1470 	    A_ONCHIP_FIFO_MEM_CORE_EVENT_UNDERFLOW)) {
1471 		/* XXX-BZ ERROR HANDLING. */
1472 		if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
1473 	}
1474 
1475 	/*
1476 	 * There is also considerable subtlety in the race-free handling of
1477 	 * tx interrupts: all processing occurs with interrupts disabled to
1478 	 * prevent spurious refiring while transmit is in progress (which
1479 	 * could occur if the FIFO drains while sending -- quite likely); we
1480 	 * must not clear the event mask until after we've sent, also to
1481 	 * prevent spurious refiring; once we've cleared the event mask we can
1482 	 * reenable interrupts, but there is a possible race between clear and
1483 	 * enable, so we must recheck and potentially repeat the whole process
1484 	 * if it is detected.
1485 	 */
1486 	do {
1487 		ATSE_TX_INTR_DISABLE(sc);
1488 		sc->atse_watchdog_timer = 0;
1489 		atse_start_locked(ifp);
1490 		ATSE_TX_EVENT_CLEAR(sc);
1491 
1492 		/* Disable interrupts if interface is down. */
1493 		if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1494 			ATSE_TX_INTR_ENABLE(sc);
1495 	} while (ATSE_TX_PENDING(sc) &&
1496 	    !(ATSE_TX_STATUS_READ(sc) & A_ONCHIP_FIFO_MEM_CORE_STATUS_FULL));
1497 	ATSE_UNLOCK(sc);
1498 }
1499 
1500 #ifdef DEVICE_POLLING
1501 static int
1502 atse_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
1503 {
1504 	struct atse_softc *sc;
1505 	int rx_npkts = 0;
1506 
1507 	sc = ifp->if_softc;
1508 	ATSE_LOCK(sc);
1509 	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
1510 		ATSE_UNLOCK(sc);
1511 		return (rx_npkts);
1512 	}
1513 
1514 	sc->atse_rx_cycles = count;
1515 	rx_npkts = atse_rx_locked(sc);
1516 	atse_start_locked(ifp);
1517 
1518 	if (sc->atse_rx_cycles > 0 || cmd == POLL_AND_CHECK_STATUS) {
1519 		uint32_t rx, tx;
1520 
1521 		rx = ATSE_RX_EVENT_READ(sc);
1522 		tx = ATSE_TX_EVENT_READ(sc);
1523 
1524 		if (rx & (A_ONCHIP_FIFO_MEM_CORE_EVENT_OVERFLOW|
1525 		    A_ONCHIP_FIFO_MEM_CORE_EVENT_UNDERFLOW)) {
1526 			/* XXX-BZ ERROR HANDLING. */
1527 			atse_update_rx_err(sc, ((rx &
1528 			    A_ONCHIP_FIFO_MEM_CORE_ERROR_MASK) >>
1529 			    A_ONCHIP_FIFO_MEM_CORE_ERROR_SHIFT) & 0xff);
1530 			if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1531 		}
1532 		if (tx & (A_ONCHIP_FIFO_MEM_CORE_EVENT_OVERFLOW|
1533 		    A_ONCHIP_FIFO_MEM_CORE_EVENT_UNDERFLOW)) {
1534 			/* XXX-BZ ERROR HANDLING. */
1535 			if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
1536 		}
1537 		if (ATSE_TX_READ_FILL_LEVEL(sc) == 0)
1538 			sc->atse_watchdog_timer = 0;
1539 
1540 #if 0
1541 		if (/* Severe error; if only we could find out. */) {
1542 			ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1543 			atse_init_locked(sc);
1544 		}
1545 #endif
1546 	}
1547 
1548 	ATSE_UNLOCK(sc);
1549 	return (rx_npkts);
1550 }
1551 #endif /* DEVICE_POLLING */
1552 
1553 static struct atse_mac_stats_regs {
1554 	const char *name;
1555 	const char *descr;	/* Mostly copied from Altera datasheet. */
1556 } atse_mac_stats_regs[] = {
1557 	[0x1a] =
1558 	{ "aFramesTransmittedOK",
1559 	    "The number of frames that are successfully transmitted including "
1560 	    "the pause frames." },
1561 	{ "aFramesReceivedOK",
1562 	    "The number of frames that are successfully received including the "
1563 	    "pause frames." },
1564 	{ "aFrameCheckSequenceErrors",
1565 	    "The number of receive frames with CRC error." },
1566 	{ "aAlignmentErrors",
1567 	    "The number of receive frames with alignment error." },
1568 	{ "aOctetsTransmittedOK",
1569 	    "The lower 32 bits of the number of data and padding octets that "
1570 	    "are successfully transmitted." },
1571 	{ "aOctetsReceivedOK",
1572 	    "The lower 32 bits of the number of data and padding octets that "
1573 	    " are successfully received." },
1574 	{ "aTxPAUSEMACCtrlFrames",
1575 	    "The number of pause frames transmitted." },
1576 	{ "aRxPAUSEMACCtrlFrames",
1577 	    "The number received pause frames received." },
1578 	{ "ifInErrors",
1579 	    "The number of errored frames received." },
1580 	{ "ifOutErrors",
1581 	    "The number of transmit frames with either a FIFO overflow error, "
1582 	    "a FIFO underflow error, or a error defined by the user "
1583 	    "application." },
1584 	{ "ifInUcastPkts",
1585 	    "The number of valid unicast frames received." },
1586 	{ "ifInMulticastPkts",
1587 	    "The number of valid multicast frames received. The count does "
1588 	    "not include pause frames." },
1589 	{ "ifInBroadcastPkts",
1590 	    "The number of valid broadcast frames received." },
1591 	{ "ifOutDiscards",
1592 	    "This statistics counter is not in use.  The MAC function does not "
1593 	    "discard frames that are written to the FIFO buffer by the user "
1594 	    "application." },
1595 	{ "ifOutUcastPkts",
1596 	    "The number of valid unicast frames transmitted." },
1597 	{ "ifOutMulticastPkts",
1598 	    "The number of valid multicast frames transmitted, excluding pause "
1599 	    "frames." },
1600 	{ "ifOutBroadcastPkts",
1601 	    "The number of valid broadcast frames transmitted." },
1602 	{ "etherStatsDropEvents",
1603 	    "The number of frames that are dropped due to MAC internal errors "
1604 	    "when FIFO buffer overflow persists." },
1605 	{ "etherStatsOctets",
1606 	    "The lower 32 bits of the total number of octets received. This "
1607 	    "count includes both good and errored frames." },
1608 	{ "etherStatsPkts",
1609 	    "The total number of good and errored frames received." },
1610 	{ "etherStatsUndersizePkts",
1611 	    "The number of frames received with length less than 64 bytes. "
1612 	    "This count does not include errored frames." },
1613 	{ "etherStatsOversizePkts",
1614 	    "The number of frames received that are longer than the value "
1615 	    "configured in the frm_length register. This count does not "
1616 	    "include errored frames." },
1617 	{ "etherStatsPkts64Octets",
1618 	    "The number of 64-byte frames received. This count includes good "
1619 	    "and errored frames." },
1620 	{ "etherStatsPkts65to127Octets",
1621 	    "The number of received good and errored frames between the length "
1622 	    "of 65 and 127 bytes." },
1623 	{ "etherStatsPkts128to255Octets",
1624 	    "The number of received good and errored frames between the length "
1625 	    "of 128 and 255 bytes." },
1626 	{ "etherStatsPkts256to511Octets",
1627 	    "The number of received good and errored frames between the length "
1628 	    "of 256 and 511 bytes." },
1629 	{ "etherStatsPkts512to1023Octets",
1630 	    "The number of received good and errored frames between the length "
1631 	    "of 512 and 1023 bytes." },
1632 	{ "etherStatsPkts1024to1518Octets",
1633 	    "The number of received good and errored frames between the length "
1634 	    "of 1024 and 1518 bytes." },
1635 	{ "etherStatsPkts1519toXOctets",
1636 	    "The number of received good and errored frames between the length "
1637 	    "of 1519 and the maximum frame length configured in the frm_length "
1638 	    "register." },
1639 	{ "etherStatsJabbers",
1640 	    "Too long frames with CRC error." },
1641 	{ "etherStatsFragments",
1642 	    "Too short frames with CRC error." },
1643 	/* 0x39 unused, 0x3a/b non-stats. */
1644 	[0x3c] =
1645 	/* Extended Statistics Counters */
1646 	{ "msb_aOctetsTransmittedOK",
1647 	    "Upper 32 bits of the number of data and padding octets that are "
1648 	    "successfully transmitted." },
1649 	{ "msb_aOctetsReceivedOK",
1650 	    "Upper 32 bits of the number of data and padding octets that are "
1651 	    "successfully received." },
1652 	{ "msb_etherStatsOctets",
1653 	    "Upper 32 bits of the total number of octets received. This count "
1654 	    "includes both good and errored frames." }
1655 };
1656 
1657 static int
1658 sysctl_atse_mac_stats_proc(SYSCTL_HANDLER_ARGS)
1659 {
1660 	struct atse_softc *sc;
1661         int error, offset, s;
1662 
1663         sc = arg1;
1664 	offset = arg2;
1665 
1666 	s = CSR_READ_4(sc, offset);
1667 	error = sysctl_handle_int(oidp, &s, 0, req);
1668 	if (error || !req->newptr)
1669 		return (error);
1670 
1671         return (0);
1672 }
1673 
1674 static struct atse_rx_err_stats_regs {
1675 	const char *name;
1676 	const char *descr;
1677 } atse_rx_err_stats_regs[] = {
1678 
1679 #define ATSE_RX_ERR_FIFO_THRES_EOP      0 /* FIFO threshold reached, on EOP. */
1680 #define ATSE_RX_ERR_ELEN                1 /* Frame/payload length not valid. */
1681 #define ATSE_RX_ERR_CRC32               2 /* CRC-32 error. */
1682 #define ATSE_RX_ERR_FIFO_THRES_TRUNC    3 /* FIFO thresh., truncated frame. */
1683 #define ATSE_RX_ERR_4                   4 /* ? */
1684 #define ATSE_RX_ERR_5                   5 /* / */
1685 
1686 	{ "rx_err_fifo_thres_eop",
1687 	    "FIFO threshold reached, reported on EOP." },
1688 	{ "rx_err_fifo_elen",
1689 	    "Frame or payload length not valid." },
1690 	{ "rx_err_fifo_crc32",
1691 	    "CRC-32 error." },
1692 	{ "rx_err_fifo_thres_trunc",
1693 	    "FIFO threshold reached, truncated frame" },
1694 	{ "rx_err_4",
1695 	    "?" },
1696 	{ "rx_err_5",
1697 	    "?" },
1698 };
1699 
1700 static int
1701 sysctl_atse_rx_err_stats_proc(SYSCTL_HANDLER_ARGS)
1702 {
1703 	struct atse_softc *sc;
1704         int error, offset, s;
1705 
1706         sc = arg1;
1707 	offset = arg2;
1708 
1709 	s = sc->atse_rx_err[offset];
1710 	error = sysctl_handle_int(oidp, &s, 0, req);
1711 	if (error || !req->newptr)
1712 		return (error);
1713 
1714         return (0);
1715 }
1716 
1717 static void
1718 atse_sysctl_stats_attach(device_t dev)
1719 {
1720 	struct sysctl_ctx_list *sctx;
1721 	struct sysctl_oid *soid;
1722 	struct atse_softc *sc;
1723 	int i;
1724 
1725 	sc = device_get_softc(dev);
1726         sctx = device_get_sysctl_ctx(dev);
1727         soid = device_get_sysctl_tree(dev);
1728 
1729 	/* MAC statistics. */
1730 	for (i = 0; i < sizeof(atse_mac_stats_regs) /
1731 	    sizeof(*atse_mac_stats_regs); i++) {
1732 		if (atse_mac_stats_regs[i].name == NULL ||
1733 		    atse_mac_stats_regs[i].descr == NULL)
1734 			continue;
1735 
1736 		SYSCTL_ADD_PROC(sctx, SYSCTL_CHILDREN(soid), OID_AUTO,
1737 		    atse_mac_stats_regs[i].name, CTLTYPE_UINT|CTLFLAG_RD,
1738 		    sc, i, sysctl_atse_mac_stats_proc, "IU",
1739 		    atse_mac_stats_regs[i].descr);
1740 	}
1741 
1742 	/* rx_err[]. */
1743 	for (i = 0; i < ATSE_RX_ERR_MAX; i++) {
1744 		if (atse_rx_err_stats_regs[i].name == NULL ||
1745 		    atse_rx_err_stats_regs[i].descr == NULL)
1746 			continue;
1747 
1748 		SYSCTL_ADD_PROC(sctx, SYSCTL_CHILDREN(soid), OID_AUTO,
1749 		    atse_rx_err_stats_regs[i].name, CTLTYPE_UINT|CTLFLAG_RD,
1750 		    sc, i, sysctl_atse_rx_err_stats_proc, "IU",
1751 		    atse_rx_err_stats_regs[i].descr);
1752 	}
1753 }
1754 
1755 /*
1756  * Generic device handling routines.
1757  */
1758 int
1759 atse_attach(device_t dev)
1760 {
1761 	struct atse_softc *sc;
1762 	struct ifnet *ifp;
1763 	int error;
1764 
1765 	sc = device_get_softc(dev);
1766 
1767 	atse_ethernet_option_bits_read(dev);
1768 
1769 	mtx_init(&sc->atse_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
1770 	    MTX_DEF);
1771 
1772 	callout_init_mtx(&sc->atse_tick, &sc->atse_mtx, 0);
1773 
1774 	sc->atse_tx_buf = malloc(ETHER_MAX_LEN_JUMBO, M_DEVBUF, M_WAITOK);
1775 
1776 	/*
1777 	 * We are only doing single-PHY with this driver currently.  The
1778 	 * defaults would be right so that BASE_CFG_MDIO_ADDR0 points to the
1779 	 * 1st PHY address (0) apart from the fact that BMCR0 is always
1780 	 * the PCS mapping, so we always use BMCR1. See Table 5-1 0xA0-0xBF.
1781 	 */
1782 #if 0	/* Always PCS. */
1783 	sc->atse_bmcr0 = MDIO_0_START;
1784 	CSR_WRITE_4(sc, BASE_CFG_MDIO_ADDR0, 0x00);
1785 #endif
1786 	/* Always use matching PHY for atse[0..]. */
1787 	sc->atse_phy_addr = device_get_unit(dev);
1788 	sc->atse_bmcr1 = MDIO_1_START;
1789 	CSR_WRITE_4(sc, BASE_CFG_MDIO_ADDR1, sc->atse_phy_addr);
1790 
1791 	/* Reset the adapter. */
1792 	atse_reset(sc);
1793 
1794 	/* Setup interface. */
1795 	ifp = sc->atse_ifp = if_alloc(IFT_ETHER);
1796 	if (ifp == NULL) {
1797 		device_printf(dev, "if_alloc() failed\n");
1798 		error = ENOSPC;
1799 		goto err;
1800 	}
1801 	ifp->if_softc = sc;
1802 	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1803 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1804 	ifp->if_ioctl = atse_ioctl;
1805 	ifp->if_start = atse_start;
1806 	ifp->if_init = atse_init;
1807 	IFQ_SET_MAXLEN(&ifp->if_snd, ATSE_TX_LIST_CNT - 1);
1808 	ifp->if_snd.ifq_drv_maxlen = ATSE_TX_LIST_CNT - 1;
1809 	IFQ_SET_READY(&ifp->if_snd);
1810 
1811 	/* MII setup. */
1812 	error = mii_attach(dev, &sc->atse_miibus, ifp, atse_ifmedia_upd,
1813 	    atse_ifmedia_sts, BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY, 0);
1814 	if (error != 0) {
1815 		device_printf(dev, "attaching PHY failed: %d\n", error);
1816 		goto err;
1817 	}
1818 
1819 	/* Call media-indepedent attach routine. */
1820 	ether_ifattach(ifp, sc->atse_eth_addr);
1821 
1822 	/* Tell the upper layer(s) about vlan mtu support. */
1823 	ifp->if_hdrlen = sizeof(struct ether_vlan_header);
1824 	ifp->if_capabilities |= IFCAP_VLAN_MTU;
1825 	ifp->if_capenable = ifp->if_capabilities;
1826 #ifdef DEVICE_POLLING
1827 	/* We will enable polling by default if no irqs available. See below. */
1828 	ifp->if_capabilities |= IFCAP_POLLING;
1829 #endif
1830 
1831 	/* Hook up interrupts. */
1832 	if (sc->atse_rx_irq_res != NULL) {
1833 		error = bus_setup_intr(dev, sc->atse_rx_irq_res, INTR_TYPE_NET |
1834 		    INTR_MPSAFE, NULL, atse_rx_intr, sc, &sc->atse_rx_intrhand);
1835 		if (error != 0) {
1836 			device_printf(dev, "enabling RX IRQ failed\n");
1837 			ether_ifdetach(ifp);
1838 			goto err;
1839 		}
1840 	}
1841 
1842 	if (sc->atse_tx_irq_res != NULL) {
1843 		error = bus_setup_intr(dev, sc->atse_tx_irq_res, INTR_TYPE_NET |
1844 		    INTR_MPSAFE, NULL, atse_tx_intr, sc, &sc->atse_tx_intrhand);
1845 		if (error != 0) {
1846 			bus_teardown_intr(dev, sc->atse_rx_irq_res,
1847 			    sc->atse_rx_intrhand);
1848 			device_printf(dev, "enabling TX IRQ failed\n");
1849 			ether_ifdetach(ifp);
1850 			goto err;
1851 		}
1852 	}
1853 
1854 	if ((ifp->if_capenable & IFCAP_POLLING) != 0 ||
1855 	   (sc->atse_rx_irq_res == NULL && sc->atse_tx_irq_res == NULL)) {
1856 #ifdef DEVICE_POLLING
1857 		/* If not on and no IRQs force it on. */
1858 		if (sc->atse_rx_irq_res == NULL && sc->atse_tx_irq_res == NULL){
1859 			ifp->if_capenable |= IFCAP_POLLING;
1860 			device_printf(dev, "forcing to polling due to no "
1861 			    "interrupts\n");
1862 		}
1863 		error = ether_poll_register(atse_poll, ifp);
1864 		if (error != 0)
1865 			goto err;
1866 #else
1867 		device_printf(dev, "no DEVICE_POLLING in kernel and no IRQs\n");
1868 		error = ENXIO;
1869 #endif
1870 	} else {
1871 		ATSE_RX_INTR_ENABLE(sc);
1872 		ATSE_TX_INTR_ENABLE(sc);
1873 	}
1874 
1875 err:
1876 	if (error != 0)
1877 		atse_detach(dev);
1878 
1879 	if (error == 0)
1880 		atse_sysctl_stats_attach(dev);
1881 
1882 	return (error);
1883 }
1884 
1885 static int
1886 atse_detach(device_t dev)
1887 {
1888 	struct atse_softc *sc;
1889 	struct ifnet *ifp;
1890 
1891 	sc = device_get_softc(dev);
1892 	KASSERT(mtx_initialized(&sc->atse_mtx), ("%s: mutex not initialized",
1893 	    device_get_nameunit(dev)));
1894 	ifp = sc->atse_ifp;
1895 
1896 #ifdef DEVICE_POLLING
1897 	if (ifp->if_capenable & IFCAP_POLLING)
1898 		ether_poll_deregister(ifp);
1899 #endif
1900 
1901 	/* Only cleanup if attach succeeded. */
1902 	if (device_is_attached(dev)) {
1903 		ATSE_LOCK(sc);
1904 		atse_stop_locked(sc);
1905 		ATSE_UNLOCK(sc);
1906 		callout_drain(&sc->atse_tick);
1907 		ether_ifdetach(ifp);
1908 	}
1909 	if (sc->atse_miibus != NULL)
1910 		device_delete_child(dev, sc->atse_miibus);
1911 
1912 	if (sc->atse_tx_intrhand)
1913 		bus_teardown_intr(dev, sc->atse_tx_irq_res,
1914 		    sc->atse_tx_intrhand);
1915 	if (sc->atse_rx_intrhand)
1916 		bus_teardown_intr(dev, sc->atse_rx_irq_res,
1917 		    sc->atse_rx_intrhand);
1918 
1919 	if (ifp != NULL)
1920 		if_free(ifp);
1921 
1922 	if (sc->atse_tx_buf != NULL)
1923 		free(sc->atse_tx_buf, M_DEVBUF);
1924 
1925 	mtx_destroy(&sc->atse_mtx);
1926 
1927 	return (0);
1928 }
1929 
1930 /* Shared between nexus and fdt implementation. */
1931 void
1932 atse_detach_resources(device_t dev)
1933 {
1934 	struct atse_softc *sc;
1935 
1936 	sc = device_get_softc(dev);
1937 
1938 	if (sc->atse_txc_mem_res != NULL) {
1939 		bus_release_resource(dev, SYS_RES_MEMORY, sc->atse_txc_mem_rid,
1940 		    sc->atse_txc_mem_res);
1941 		sc->atse_txc_mem_res = NULL;
1942 	}
1943 	if (sc->atse_tx_mem_res != NULL) {
1944 		bus_release_resource(dev, SYS_RES_MEMORY, sc->atse_tx_mem_rid,
1945 		    sc->atse_tx_mem_res);
1946 		sc->atse_tx_mem_res = NULL;
1947 	}
1948 	if (sc->atse_tx_irq_res != NULL) {
1949 		bus_release_resource(dev, SYS_RES_IRQ, sc->atse_tx_irq_rid,
1950 		    sc->atse_tx_irq_res);
1951 		sc->atse_tx_irq_res = NULL;
1952 	}
1953 	if (sc->atse_rxc_mem_res != NULL) {
1954 		bus_release_resource(dev, SYS_RES_MEMORY, sc->atse_rxc_mem_rid,
1955 		    sc->atse_rxc_mem_res);
1956 		sc->atse_rxc_mem_res = NULL;
1957 	}
1958 	if (sc->atse_rx_mem_res != NULL) {
1959 		bus_release_resource(dev, SYS_RES_MEMORY, sc->atse_rx_mem_rid,
1960 		    sc->atse_rx_mem_res);
1961 		sc->atse_rx_mem_res = NULL;
1962 	}
1963 	if (sc->atse_rx_irq_res != NULL) {
1964 		bus_release_resource(dev, SYS_RES_IRQ, sc->atse_rx_irq_rid,
1965 		    sc->atse_rx_irq_res);
1966 		sc->atse_rx_irq_res = NULL;
1967 	}
1968 	if (sc->atse_mem_res != NULL) {
1969 		bus_release_resource(dev, SYS_RES_MEMORY, sc->atse_mem_rid,
1970 		    sc->atse_mem_res);
1971 		sc->atse_mem_res = NULL;
1972 	}
1973 }
1974 
1975 int
1976 atse_detach_dev(device_t dev)
1977 {
1978 	int error;
1979 
1980 	error = atse_detach(dev);
1981 	if (error) {
1982 		/* We are basically in undefined state now. */
1983 		device_printf(dev, "atse_detach() failed: %d\n", error);
1984 		return (error);
1985 	}
1986 
1987 	atse_detach_resources(dev);
1988 
1989 	return (0);
1990 }
1991 
1992 int
1993 atse_miibus_readreg(device_t dev, int phy, int reg)
1994 {
1995 	struct atse_softc *sc;
1996 
1997 	sc = device_get_softc(dev);
1998 
1999 	/*
2000 	 * We currently do not support re-mapping of MDIO space on-the-fly
2001 	 * but de-facto hard-code the phy#.
2002 	 */
2003 	if (phy != sc->atse_phy_addr)
2004 		return (0);
2005 
2006 	return (PHY_READ_2(sc, reg));
2007 }
2008 
2009 int
2010 atse_miibus_writereg(device_t dev, int phy, int reg, int data)
2011 {
2012 	struct atse_softc *sc;
2013 
2014 	sc = device_get_softc(dev);
2015 
2016 	/*
2017 	 * We currently do not support re-mapping of MDIO space on-the-fly
2018 	 * but de-facto hard-code the phy#.
2019 	 */
2020 	if (phy != sc->atse_phy_addr)
2021 		return (0);
2022 
2023 	PHY_WRITE_2(sc, reg, data);
2024 	return (0);
2025 }
2026 
2027 void
2028 atse_miibus_statchg(device_t dev)
2029 {
2030 	struct atse_softc *sc;
2031 	struct mii_data *mii;
2032 	struct ifnet *ifp;
2033 	uint32_t val4;
2034 
2035 	sc = device_get_softc(dev);
2036 	ATSE_LOCK_ASSERT(sc);
2037 
2038         mii = device_get_softc(sc->atse_miibus);
2039         ifp = sc->atse_ifp;
2040         if (mii == NULL || ifp == NULL ||
2041             (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
2042                 return;
2043 
2044 	val4 = CSR_READ_4(sc, BASE_CFG_COMMAND_CONFIG);
2045 
2046 	/* Assume no link. */
2047 	sc->atse_flags &= ~ATSE_FLAGS_LINK;
2048 
2049 	if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) ==
2050 	    (IFM_ACTIVE | IFM_AVALID)) {
2051 
2052 		switch (IFM_SUBTYPE(mii->mii_media_active)) {
2053 		case IFM_10_T:
2054 			val4 |= BASE_CFG_COMMAND_CONFIG_ENA_10;
2055 			val4 &= ~BASE_CFG_COMMAND_CONFIG_ETH_SPEED;
2056 			sc->atse_flags |= ATSE_FLAGS_LINK;
2057 			break;
2058 		case IFM_100_TX:
2059 			val4 &= ~BASE_CFG_COMMAND_CONFIG_ENA_10;
2060 			val4 &= ~BASE_CFG_COMMAND_CONFIG_ETH_SPEED;
2061 			sc->atse_flags |= ATSE_FLAGS_LINK;
2062 			break;
2063 		case IFM_1000_T:
2064 			val4 &= ~BASE_CFG_COMMAND_CONFIG_ENA_10;
2065 			val4 |= BASE_CFG_COMMAND_CONFIG_ETH_SPEED;
2066 			sc->atse_flags |= ATSE_FLAGS_LINK;
2067 			break;
2068 		default:
2069 			break;
2070 		}
2071 	}
2072 
2073         if ((sc->atse_flags & ATSE_FLAGS_LINK) == 0) {
2074 		/* XXX-BZ need to stop the MAC? */
2075                 return;
2076         }
2077 
2078 	if (IFM_OPTIONS(mii->mii_media_active & IFM_FDX) != 0)
2079 		val4 &= ~BASE_CFG_COMMAND_CONFIG_HD_ENA;
2080         else
2081 		val4 |= BASE_CFG_COMMAND_CONFIG_HD_ENA;
2082 	/* XXX-BZ flow control? */
2083 
2084 	/* Make sure the MAC is activated. */
2085 	val4 |= BASE_CFG_COMMAND_CONFIG_TX_ENA;
2086 	val4 |= BASE_CFG_COMMAND_CONFIG_RX_ENA;
2087 
2088 	CSR_WRITE_4(sc, BASE_CFG_COMMAND_CONFIG, val4);
2089 }
2090 
2091 /* end */
2092