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