]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/mge/if_mge.c
Fix a common typo in man pages and src comments
[FreeBSD/FreeBSD.git] / sys / dev / mge / if_mge.c
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (C) 2008 MARVELL INTERNATIONAL LTD.
5  * Copyright (C) 2009-2015 Semihalf
6  * Copyright (C) 2015 Stormshield
7  * All rights reserved.
8  *
9  * Developed by Semihalf.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. Neither the name of MARVELL nor the names of contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35
36 #ifdef HAVE_KERNEL_OPTION_HEADERS
37 #include "opt_device_polling.h"
38 #endif
39
40 #include <sys/cdefs.h>
41 __FBSDID("$FreeBSD$");
42
43 #include <sys/param.h>
44 #include <sys/systm.h>
45 #include <sys/endian.h>
46 #include <sys/mbuf.h>
47 #include <sys/lock.h>
48 #include <sys/mutex.h>
49 #include <sys/kernel.h>
50 #include <sys/module.h>
51 #include <sys/socket.h>
52 #include <sys/sysctl.h>
53
54 #include <net/ethernet.h>
55 #include <net/bpf.h>
56 #include <net/if.h>
57 #include <net/if_arp.h>
58 #include <net/if_dl.h>
59 #include <net/if_media.h>
60 #include <net/if_types.h>
61 #include <net/if_vlan_var.h>
62
63 #include <netinet/in_systm.h>
64 #include <netinet/in.h>
65 #include <netinet/ip.h>
66
67 #include <sys/sockio.h>
68 #include <sys/bus.h>
69 #include <machine/bus.h>
70 #include <sys/rman.h>
71 #include <machine/resource.h>
72
73 #include <dev/mii/mii.h>
74 #include <dev/mii/miivar.h>
75
76 #include <dev/fdt/fdt_common.h>
77 #include <dev/ofw/ofw_bus.h>
78 #include <dev/ofw/ofw_bus_subr.h>
79 #include <dev/mdio/mdio.h>
80
81 #include <dev/mge/if_mgevar.h>
82 #include <arm/mv/mvreg.h>
83 #include <arm/mv/mvvar.h>
84
85 #include "miibus_if.h"
86 #include "mdio_if.h"
87
88 #define MGE_DELAY(x)    pause("SMI access sleep", (x) / tick_sbt)
89
90 static int mge_probe(device_t dev);
91 static int mge_attach(device_t dev);
92 static int mge_detach(device_t dev);
93 static int mge_shutdown(device_t dev);
94 static int mge_suspend(device_t dev);
95 static int mge_resume(device_t dev);
96
97 static int mge_miibus_readreg(device_t dev, int phy, int reg);
98 static int mge_miibus_writereg(device_t dev, int phy, int reg, int value);
99
100 static int mge_mdio_readreg(device_t dev, int phy, int reg);
101 static int mge_mdio_writereg(device_t dev, int phy, int reg, int value);
102
103 static int mge_ifmedia_upd(struct ifnet *ifp);
104 static void mge_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr);
105
106 static void mge_init(void *arg);
107 static void mge_init_locked(void *arg);
108 static void mge_start(struct ifnet *ifp);
109 static void mge_start_locked(struct ifnet *ifp);
110 static void mge_watchdog(struct mge_softc *sc);
111 static int mge_ioctl(struct ifnet *ifp, u_long command, caddr_t data);
112
113 static uint32_t mge_tfut_ipg(uint32_t val, int ver);
114 static uint32_t mge_rx_ipg(uint32_t val, int ver);
115 static void mge_ver_params(struct mge_softc *sc);
116
117 static void mge_intrs_ctrl(struct mge_softc *sc, int enable);
118 static void mge_intr_rxtx(void *arg);
119 static void mge_intr_rx(void *arg);
120 static void mge_intr_rx_check(struct mge_softc *sc, uint32_t int_cause,
121     uint32_t int_cause_ext);
122 static int mge_intr_rx_locked(struct mge_softc *sc, int count);
123 static void mge_intr_tx(void *arg);
124 static void mge_intr_tx_locked(struct mge_softc *sc);
125 static void mge_intr_misc(void *arg);
126 static void mge_intr_sum(void *arg);
127 static void mge_intr_err(void *arg);
128 static void mge_stop(struct mge_softc *sc);
129 static void mge_tick(void *msc);
130 static uint32_t mge_set_port_serial_control(uint32_t media);
131 static void mge_get_mac_address(struct mge_softc *sc, uint8_t *addr);
132 static void mge_set_mac_address(struct mge_softc *sc);
133 static void mge_set_ucast_address(struct mge_softc *sc, uint8_t last_byte,
134     uint8_t queue);
135 static void mge_set_prom_mode(struct mge_softc *sc, uint8_t queue);
136 static int mge_allocate_dma(struct mge_softc *sc);
137 static int mge_alloc_desc_dma(struct mge_softc *sc,
138     struct mge_desc_wrapper* desc_tab, uint32_t size,
139     bus_dma_tag_t *buffer_tag);
140 static int mge_new_rxbuf(bus_dma_tag_t tag, bus_dmamap_t map,
141     struct mbuf **mbufp, bus_addr_t *paddr);
142 static void mge_get_dma_addr(void *arg, bus_dma_segment_t *segs, int nseg,
143     int error);
144 static void mge_free_dma(struct mge_softc *sc);
145 static void mge_free_desc(struct mge_softc *sc, struct mge_desc_wrapper* tab,
146     uint32_t size, bus_dma_tag_t buffer_tag, uint8_t free_mbufs);
147 static void mge_offload_process_frame(struct ifnet *ifp, struct mbuf *frame,
148     uint32_t status, uint16_t bufsize);
149 static void mge_offload_setup_descriptor(struct mge_softc *sc,
150     struct mge_desc_wrapper *dw);
151 static uint8_t mge_crc8(uint8_t *data, int size);
152 static void mge_setup_multicast(struct mge_softc *sc);
153 static void mge_set_rxic(struct mge_softc *sc);
154 static void mge_set_txic(struct mge_softc *sc);
155 static void mge_add_sysctls(struct mge_softc *sc);
156 static int mge_sysctl_ic(SYSCTL_HANDLER_ARGS);
157
158 static device_method_t mge_methods[] = {
159         /* Device interface */
160         DEVMETHOD(device_probe,         mge_probe),
161         DEVMETHOD(device_attach,        mge_attach),
162         DEVMETHOD(device_detach,        mge_detach),
163         DEVMETHOD(device_shutdown,      mge_shutdown),
164         DEVMETHOD(device_suspend,       mge_suspend),
165         DEVMETHOD(device_resume,        mge_resume),
166         /* MII interface */
167         DEVMETHOD(miibus_readreg,       mge_miibus_readreg),
168         DEVMETHOD(miibus_writereg,      mge_miibus_writereg),
169         /* MDIO interface */
170         DEVMETHOD(mdio_readreg,         mge_mdio_readreg),
171         DEVMETHOD(mdio_writereg,        mge_mdio_writereg),
172         { 0, 0 }
173 };
174
175 DEFINE_CLASS_0(mge, mge_driver, mge_methods, sizeof(struct mge_softc));
176
177 static devclass_t mge_devclass;
178 static int switch_attached = 0;
179
180 DRIVER_MODULE(mge, simplebus, mge_driver, mge_devclass, 0, 0);
181 DRIVER_MODULE(miibus, mge, miibus_driver, miibus_devclass, 0, 0);
182 DRIVER_MODULE(mdio, mge, mdio_driver, mdio_devclass, 0, 0);
183 MODULE_DEPEND(mge, ether, 1, 1, 1);
184 MODULE_DEPEND(mge, miibus, 1, 1, 1);
185 MODULE_DEPEND(mge, mdio, 1, 1, 1);
186
187 static struct resource_spec res_spec[] = {
188         { SYS_RES_MEMORY, 0, RF_ACTIVE },
189         { SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE },
190         { SYS_RES_IRQ, 1, RF_ACTIVE | RF_SHAREABLE },
191         { SYS_RES_IRQ, 2, RF_ACTIVE | RF_SHAREABLE },
192         { -1, 0 }
193 };
194
195 static struct {
196         driver_intr_t *handler;
197         char * description;
198 } mge_intrs[MGE_INTR_COUNT + 1] = {
199         { mge_intr_rxtx,"GbE aggregated interrupt" },
200         { mge_intr_rx,  "GbE receive interrupt" },
201         { mge_intr_tx,  "GbE transmit interrupt" },
202         { mge_intr_misc,"GbE misc interrupt" },
203         { mge_intr_sum, "GbE summary interrupt" },
204         { mge_intr_err, "GbE error interrupt" },
205 };
206
207 /* SMI access interlock */
208 static struct sx sx_smi;
209
210 static uint32_t
211 mv_read_ge_smi(device_t dev, int phy, int reg)
212 {
213         uint32_t timeout;
214         uint32_t ret;
215         struct mge_softc *sc;
216
217         sc = device_get_softc(dev);
218         KASSERT(sc != NULL, ("NULL softc ptr!"));
219         timeout = MGE_SMI_WRITE_RETRIES;
220
221         MGE_SMI_LOCK();
222         while (--timeout &&
223             (MGE_READ(sc, MGE_REG_SMI) & MGE_SMI_BUSY))
224                 MGE_DELAY(MGE_SMI_WRITE_DELAY);
225
226         if (timeout == 0) {
227                 device_printf(dev, "SMI write timeout.\n");
228                 ret = ~0U;
229                 goto out;
230         }
231
232         MGE_WRITE(sc, MGE_REG_SMI, MGE_SMI_MASK &
233             (MGE_SMI_READ | (reg << 21) | (phy << 16)));
234
235         /* Wait till finished. */
236         timeout = MGE_SMI_WRITE_RETRIES;
237         while (--timeout &&
238             !((MGE_READ(sc, MGE_REG_SMI) & MGE_SMI_READVALID)))
239                 MGE_DELAY(MGE_SMI_WRITE_DELAY);
240
241         if (timeout == 0) {
242                 device_printf(dev, "SMI write validation timeout.\n");
243                 ret = ~0U;
244                 goto out;
245         }
246
247         /* Wait for the data to update in the SMI register */
248         MGE_DELAY(MGE_SMI_DELAY);
249         ret = MGE_READ(sc, MGE_REG_SMI) & MGE_SMI_DATA_MASK;
250
251 out:
252         MGE_SMI_UNLOCK();
253         return (ret);
254
255 }
256
257 static void
258 mv_write_ge_smi(device_t dev, int phy, int reg, uint32_t value)
259 {
260         uint32_t timeout;
261         struct mge_softc *sc;
262
263         sc = device_get_softc(dev);
264         KASSERT(sc != NULL, ("NULL softc ptr!"));
265
266         MGE_SMI_LOCK();
267         timeout = MGE_SMI_READ_RETRIES;
268         while (--timeout &&
269             (MGE_READ(sc, MGE_REG_SMI) & MGE_SMI_BUSY))
270                 MGE_DELAY(MGE_SMI_READ_DELAY);
271
272         if (timeout == 0) {
273                 device_printf(dev, "SMI read timeout.\n");
274                 goto out;
275         }
276
277         MGE_WRITE(sc, MGE_REG_SMI, MGE_SMI_MASK &
278             (MGE_SMI_WRITE | (reg << 21) | (phy << 16) |
279             (value & MGE_SMI_DATA_MASK)));
280
281 out:
282         MGE_SMI_UNLOCK();
283 }
284
285 static int
286 mv_read_ext_phy(device_t dev, int phy, int reg)
287 {
288         uint32_t retries;
289         struct mge_softc *sc;
290         uint32_t ret;
291
292         sc = device_get_softc(dev);
293
294         MGE_SMI_LOCK();
295         MGE_WRITE(sc->phy_sc, MGE_REG_SMI, MGE_SMI_MASK &
296             (MGE_SMI_READ | (reg << 21) | (phy << 16)));
297
298         retries = MGE_SMI_READ_RETRIES;
299         while (--retries &&
300             !(MGE_READ(sc->phy_sc, MGE_REG_SMI) & MGE_SMI_READVALID))
301                 DELAY(MGE_SMI_READ_DELAY);
302
303         if (retries == 0)
304                 device_printf(dev, "Timeout while reading from PHY\n");
305
306         ret = MGE_READ(sc->phy_sc, MGE_REG_SMI) & MGE_SMI_DATA_MASK;
307         MGE_SMI_UNLOCK();
308
309         return (ret);
310 }
311
312 static void
313 mv_write_ext_phy(device_t dev, int phy, int reg, int value)
314 {
315         uint32_t retries;
316         struct mge_softc *sc;
317
318         sc = device_get_softc(dev);
319
320         MGE_SMI_LOCK();
321         MGE_WRITE(sc->phy_sc, MGE_REG_SMI, MGE_SMI_MASK &
322             (MGE_SMI_WRITE | (reg << 21) | (phy << 16) |
323             (value & MGE_SMI_DATA_MASK)));
324
325         retries = MGE_SMI_WRITE_RETRIES;
326         while (--retries && MGE_READ(sc->phy_sc, MGE_REG_SMI) & MGE_SMI_BUSY)
327                 DELAY(MGE_SMI_WRITE_DELAY);
328
329         if (retries == 0)
330                 device_printf(dev, "Timeout while writing to PHY\n");
331         MGE_SMI_UNLOCK();
332 }
333
334 static void
335 mge_get_mac_address(struct mge_softc *sc, uint8_t *addr)
336 {
337         uint32_t mac_l, mac_h;
338         uint8_t lmac[6];
339         int i, valid;
340
341         /*
342          * Retrieve hw address from the device tree.
343          */
344         i = OF_getprop(sc->node, "local-mac-address", (void *)lmac, 6);
345         if (i == 6) {
346                 valid = 0;
347                 for (i = 0; i < 6; i++)
348                         if (lmac[i] != 0) {
349                                 valid = 1;
350                                 break;
351                         }
352
353                 if (valid) {
354                         bcopy(lmac, addr, 6);
355                         return;
356                 }
357         }
358
359         /*
360          * Fall back -- use the currently programmed address.
361          */
362         mac_l = MGE_READ(sc, MGE_MAC_ADDR_L);
363         mac_h = MGE_READ(sc, MGE_MAC_ADDR_H);
364
365         addr[0] = (mac_h & 0xff000000) >> 24;
366         addr[1] = (mac_h & 0x00ff0000) >> 16;
367         addr[2] = (mac_h & 0x0000ff00) >> 8;
368         addr[3] = (mac_h & 0x000000ff);
369         addr[4] = (mac_l & 0x0000ff00) >> 8;
370         addr[5] = (mac_l & 0x000000ff);
371 }
372
373 static uint32_t
374 mge_tfut_ipg(uint32_t val, int ver)
375 {
376
377         switch (ver) {
378         case 1:
379                 return ((val & 0x3fff) << 4);
380         case 2:
381         default:
382                 return ((val & 0xffff) << 4);
383         }
384 }
385
386 static uint32_t
387 mge_rx_ipg(uint32_t val, int ver)
388 {
389
390         switch (ver) {
391         case 1:
392                 return ((val & 0x3fff) << 8);
393         case 2:
394         default:
395                 return (((val & 0x8000) << 10) | ((val & 0x7fff) << 7));
396         }
397 }
398
399 static void
400 mge_ver_params(struct mge_softc *sc)
401 {
402         uint32_t d, r;
403
404         soc_id(&d, &r);
405         if (d == MV_DEV_88F6281 || d == MV_DEV_88F6781 ||
406             d == MV_DEV_88F6282 ||
407             d == MV_DEV_MV78100 ||
408             d == MV_DEV_MV78100_Z0 ||
409             (d & MV_DEV_FAMILY_MASK) == MV_DEV_DISCOVERY) {
410                 sc->mge_ver = 2;
411                 sc->mge_mtu = 0x4e8;
412                 sc->mge_tfut_ipg_max = 0xFFFF;
413                 sc->mge_rx_ipg_max = 0xFFFF;
414                 sc->mge_tx_arb_cfg = 0xFC0000FF;
415                 sc->mge_tx_tok_cfg = 0xFFFF7FFF;
416                 sc->mge_tx_tok_cnt = 0x3FFFFFFF;
417         } else {
418                 sc->mge_ver = 1;
419                 sc->mge_mtu = 0x458;
420                 sc->mge_tfut_ipg_max = 0x3FFF;
421                 sc->mge_rx_ipg_max = 0x3FFF;
422                 sc->mge_tx_arb_cfg = 0x000000FF;
423                 sc->mge_tx_tok_cfg = 0x3FFFFFFF;
424                 sc->mge_tx_tok_cnt = 0x3FFFFFFF;
425         }
426         if (d == MV_DEV_88RC8180)
427                 sc->mge_intr_cnt = 1;
428         else
429                 sc->mge_intr_cnt = 2;
430
431         if (d == MV_DEV_MV78160 || d == MV_DEV_MV78260 || d == MV_DEV_MV78460)
432                 sc->mge_hw_csum = 0;
433         else
434                 sc->mge_hw_csum = 1;
435 }
436
437 static void
438 mge_set_mac_address(struct mge_softc *sc)
439 {
440         char *if_mac;
441         uint32_t mac_l, mac_h;
442
443         MGE_GLOBAL_LOCK_ASSERT(sc);
444
445         if_mac = (char *)IF_LLADDR(sc->ifp);
446
447         mac_l = (if_mac[4] << 8) | (if_mac[5]);
448         mac_h = (if_mac[0] << 24)| (if_mac[1] << 16) |
449             (if_mac[2] << 8) | (if_mac[3] << 0);
450
451         MGE_WRITE(sc, MGE_MAC_ADDR_L, mac_l);
452         MGE_WRITE(sc, MGE_MAC_ADDR_H, mac_h);
453
454         mge_set_ucast_address(sc, if_mac[5], MGE_RX_DEFAULT_QUEUE);
455 }
456
457 static void
458 mge_set_ucast_address(struct mge_softc *sc, uint8_t last_byte, uint8_t queue)
459 {
460         uint32_t reg_idx, reg_off, reg_val, i;
461
462         last_byte &= 0xf;
463         reg_idx = last_byte / MGE_UCAST_REG_NUMBER;
464         reg_off = (last_byte % MGE_UCAST_REG_NUMBER) * 8;
465         reg_val = (1 | (queue << 1)) << reg_off;
466
467         for (i = 0; i < MGE_UCAST_REG_NUMBER; i++) {
468                 if ( i == reg_idx)
469                         MGE_WRITE(sc, MGE_DA_FILTER_UCAST(i), reg_val);
470                 else
471                         MGE_WRITE(sc, MGE_DA_FILTER_UCAST(i), 0);
472         }
473 }
474
475 static void
476 mge_set_prom_mode(struct mge_softc *sc, uint8_t queue)
477 {
478         uint32_t port_config;
479         uint32_t reg_val, i;
480
481         /* Enable or disable promiscuous mode as needed */
482         if (sc->ifp->if_flags & IFF_PROMISC) {
483                 port_config = MGE_READ(sc, MGE_PORT_CONFIG);
484                 port_config |= PORT_CONFIG_UPM;
485                 MGE_WRITE(sc, MGE_PORT_CONFIG, port_config);
486
487                 reg_val = ((1 | (queue << 1)) | (1 | (queue << 1)) << 8 |
488                    (1 | (queue << 1)) << 16 | (1 | (queue << 1)) << 24);
489
490                 for (i = 0; i < MGE_MCAST_REG_NUMBER; i++) {
491                         MGE_WRITE(sc, MGE_DA_FILTER_SPEC_MCAST(i), reg_val);
492                         MGE_WRITE(sc, MGE_DA_FILTER_OTH_MCAST(i), reg_val);
493                 }
494
495                 for (i = 0; i < MGE_UCAST_REG_NUMBER; i++)
496                         MGE_WRITE(sc, MGE_DA_FILTER_UCAST(i), reg_val);
497
498         } else {
499                 port_config = MGE_READ(sc, MGE_PORT_CONFIG);
500                 port_config &= ~PORT_CONFIG_UPM;
501                 MGE_WRITE(sc, MGE_PORT_CONFIG, port_config);
502
503                 for (i = 0; i < MGE_MCAST_REG_NUMBER; i++) {
504                         MGE_WRITE(sc, MGE_DA_FILTER_SPEC_MCAST(i), 0);
505                         MGE_WRITE(sc, MGE_DA_FILTER_OTH_MCAST(i), 0);
506                 }
507
508                 mge_set_mac_address(sc);
509         }
510 }
511
512 static void
513 mge_get_dma_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error)
514 {
515         u_int32_t *paddr;
516
517         KASSERT(nseg == 1, ("wrong number of segments, should be 1"));
518         paddr = arg;
519
520         *paddr = segs->ds_addr;
521 }
522
523 static int
524 mge_new_rxbuf(bus_dma_tag_t tag, bus_dmamap_t map, struct mbuf **mbufp,
525     bus_addr_t *paddr)
526 {
527         struct mbuf *new_mbuf;
528         bus_dma_segment_t seg[1];
529         int error;
530         int nsegs;
531
532         KASSERT(mbufp != NULL, ("NULL mbuf pointer!"));
533
534         new_mbuf = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
535         if (new_mbuf == NULL)
536                 return (ENOBUFS);
537         new_mbuf->m_len = new_mbuf->m_pkthdr.len = new_mbuf->m_ext.ext_size;
538
539         if (*mbufp) {
540                 bus_dmamap_sync(tag, map, BUS_DMASYNC_POSTREAD);
541                 bus_dmamap_unload(tag, map);
542         }
543
544         error = bus_dmamap_load_mbuf_sg(tag, map, new_mbuf, seg, &nsegs,
545             BUS_DMA_NOWAIT);
546         KASSERT(nsegs == 1, ("Too many segments returned!"));
547         if (nsegs != 1 || error)
548                 panic("mge_new_rxbuf(): nsegs(%d), error(%d)", nsegs, error);
549
550         bus_dmamap_sync(tag, map, BUS_DMASYNC_PREREAD);
551
552         (*mbufp) = new_mbuf;
553         (*paddr) = seg->ds_addr;
554         return (0);
555 }
556
557 static int
558 mge_alloc_desc_dma(struct mge_softc *sc, struct mge_desc_wrapper* tab,
559     uint32_t size, bus_dma_tag_t *buffer_tag)
560 {
561         struct mge_desc_wrapper *dw;
562         bus_addr_t desc_paddr;
563         int i, error;
564
565         desc_paddr = 0;
566         for (i = size - 1; i >= 0; i--) {
567                 dw = &(tab[i]);
568                 error = bus_dmamem_alloc(sc->mge_desc_dtag,
569                     (void**)&(dw->mge_desc),
570                     BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT,
571                     &(dw->desc_dmap));
572
573                 if (error) {
574                         if_printf(sc->ifp, "failed to allocate DMA memory\n");
575                         dw->mge_desc = NULL;
576                         return (ENXIO);
577                 }
578
579                 error = bus_dmamap_load(sc->mge_desc_dtag, dw->desc_dmap,
580                     dw->mge_desc, sizeof(struct mge_desc), mge_get_dma_addr,
581                     &(dw->mge_desc_paddr), BUS_DMA_NOWAIT);
582
583                 if (error) {
584                         if_printf(sc->ifp, "can't load descriptor\n");
585                         bus_dmamem_free(sc->mge_desc_dtag, dw->mge_desc,
586                             dw->desc_dmap);
587                         dw->mge_desc = NULL;
588                         return (ENXIO);
589                 }
590
591                 /* Chain descriptors */
592                 dw->mge_desc->next_desc = desc_paddr;
593                 desc_paddr = dw->mge_desc_paddr;
594         }
595         tab[size - 1].mge_desc->next_desc = desc_paddr;
596
597         /* Allocate a busdma tag for mbufs. */
598         error = bus_dma_tag_create(bus_get_dma_tag(sc->dev),    /* parent */
599             1, 0,                               /* alignment, boundary */
600             BUS_SPACE_MAXADDR_32BIT,            /* lowaddr */
601             BUS_SPACE_MAXADDR,                  /* highaddr */
602             NULL, NULL,                         /* filtfunc, filtfuncarg */
603             MCLBYTES, 1,                        /* maxsize, nsegments */
604             MCLBYTES, 0,                        /* maxsegsz, flags */
605             NULL, NULL,                         /* lockfunc, lockfuncarg */
606             buffer_tag);                        /* dmat */
607         if (error) {
608                 if_printf(sc->ifp, "failed to create busdma tag for mbufs\n");
609                 return (ENXIO);
610         }
611
612         /* Create TX busdma maps */
613         for (i = 0; i < size; i++) {
614                 dw = &(tab[i]);
615                 error = bus_dmamap_create(*buffer_tag, 0, &dw->buffer_dmap);
616                 if (error) {
617                         if_printf(sc->ifp, "failed to create map for mbuf\n");
618                         return (ENXIO);
619                 }
620
621                 dw->buffer = (struct mbuf*)NULL;
622                 dw->mge_desc->buffer = (bus_addr_t)NULL;
623         }
624
625         return (0);
626 }
627
628 static int
629 mge_allocate_dma(struct mge_softc *sc)
630 {
631         int error;
632         struct mge_desc_wrapper *dw;
633         int i;
634
635         /* Allocate a busdma tag and DMA safe memory for TX/RX descriptors. */
636         error = bus_dma_tag_create(bus_get_dma_tag(sc->dev),    /* parent */
637             16, 0,                              /* alignment, boundary */
638             BUS_SPACE_MAXADDR_32BIT,            /* lowaddr */
639             BUS_SPACE_MAXADDR,                  /* highaddr */
640             NULL, NULL,                         /* filtfunc, filtfuncarg */
641             sizeof(struct mge_desc), 1,         /* maxsize, nsegments */
642             sizeof(struct mge_desc), 0,         /* maxsegsz, flags */
643             NULL, NULL,                         /* lockfunc, lockfuncarg */
644             &sc->mge_desc_dtag);                /* dmat */
645
646
647         mge_alloc_desc_dma(sc, sc->mge_tx_desc, MGE_TX_DESC_NUM,
648             &sc->mge_tx_dtag);
649         mge_alloc_desc_dma(sc, sc->mge_rx_desc, MGE_RX_DESC_NUM,
650             &sc->mge_rx_dtag);
651
652         for (i = 0; i < MGE_RX_DESC_NUM; i++) {
653                 dw = &(sc->mge_rx_desc[i]);
654                 mge_new_rxbuf(sc->mge_rx_dtag, dw->buffer_dmap, &dw->buffer,
655                     &dw->mge_desc->buffer);
656         }
657
658         sc->tx_desc_start = sc->mge_tx_desc[0].mge_desc_paddr;
659         sc->rx_desc_start = sc->mge_rx_desc[0].mge_desc_paddr;
660
661         return (0);
662 }
663
664 static void
665 mge_free_desc(struct mge_softc *sc, struct mge_desc_wrapper* tab,
666     uint32_t size, bus_dma_tag_t buffer_tag, uint8_t free_mbufs)
667 {
668         struct mge_desc_wrapper *dw;
669         int i;
670
671         for (i = 0; i < size; i++) {
672                 /* Free RX mbuf */
673                 dw = &(tab[i]);
674
675                 if (dw->buffer_dmap) {
676                         if (free_mbufs) {
677                                 bus_dmamap_sync(buffer_tag, dw->buffer_dmap,
678                                     BUS_DMASYNC_POSTREAD);
679                                 bus_dmamap_unload(buffer_tag, dw->buffer_dmap);
680                         }
681                         bus_dmamap_destroy(buffer_tag, dw->buffer_dmap);
682                         if (free_mbufs)
683                                 m_freem(dw->buffer);
684                 }
685                 /* Free RX descriptors */
686                 if (dw->desc_dmap) {
687                         bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap,
688                             BUS_DMASYNC_POSTREAD);
689                         bus_dmamap_unload(sc->mge_desc_dtag, dw->desc_dmap);
690                         bus_dmamem_free(sc->mge_desc_dtag, dw->mge_desc,
691                             dw->desc_dmap);
692                 }
693         }
694 }
695
696 static void
697 mge_free_dma(struct mge_softc *sc)
698 {
699
700         /* Free descriptors and mbufs */
701         mge_free_desc(sc, sc->mge_rx_desc, MGE_RX_DESC_NUM, sc->mge_rx_dtag, 1);
702         mge_free_desc(sc, sc->mge_tx_desc, MGE_TX_DESC_NUM, sc->mge_tx_dtag, 0);
703
704         /* Destroy mbuf dma tag */
705         bus_dma_tag_destroy(sc->mge_tx_dtag);
706         bus_dma_tag_destroy(sc->mge_rx_dtag);
707         /* Destroy descriptors tag */
708         bus_dma_tag_destroy(sc->mge_desc_dtag);
709 }
710
711 static void
712 mge_reinit_rx(struct mge_softc *sc)
713 {
714         struct mge_desc_wrapper *dw;
715         int i;
716
717         MGE_RECEIVE_LOCK_ASSERT(sc);
718
719         mge_free_desc(sc, sc->mge_rx_desc, MGE_RX_DESC_NUM, sc->mge_rx_dtag, 1);
720
721         mge_alloc_desc_dma(sc, sc->mge_rx_desc, MGE_RX_DESC_NUM,
722             &sc->mge_rx_dtag);
723
724         for (i = 0; i < MGE_RX_DESC_NUM; i++) {
725                 dw = &(sc->mge_rx_desc[i]);
726                 mge_new_rxbuf(sc->mge_rx_dtag, dw->buffer_dmap, &dw->buffer,
727                 &dw->mge_desc->buffer);
728         }
729
730         sc->rx_desc_start = sc->mge_rx_desc[0].mge_desc_paddr;
731         sc->rx_desc_curr = 0;
732
733         MGE_WRITE(sc, MGE_RX_CUR_DESC_PTR(MGE_RX_DEFAULT_QUEUE),
734             sc->rx_desc_start);
735
736         /* Enable RX queue */
737         MGE_WRITE(sc, MGE_RX_QUEUE_CMD, MGE_ENABLE_RXQ(MGE_RX_DEFAULT_QUEUE));
738 }
739
740 #ifdef DEVICE_POLLING
741 static poll_handler_t mge_poll;
742
743 static int
744 mge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
745 {
746         struct mge_softc *sc = ifp->if_softc;
747         uint32_t int_cause, int_cause_ext;
748         int rx_npkts = 0;
749
750         MGE_RECEIVE_LOCK(sc);
751
752         if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
753                 MGE_RECEIVE_UNLOCK(sc);
754                 return (rx_npkts);
755         }
756
757         if (cmd == POLL_AND_CHECK_STATUS) {
758                 int_cause = MGE_READ(sc, MGE_PORT_INT_CAUSE);
759                 int_cause_ext = MGE_READ(sc, MGE_PORT_INT_CAUSE_EXT);
760
761                 /* Check for resource error */
762                 if (int_cause & MGE_PORT_INT_RXERRQ0)
763                         mge_reinit_rx(sc);
764
765                 if (int_cause || int_cause_ext) {
766                         MGE_WRITE(sc, MGE_PORT_INT_CAUSE, ~int_cause);
767                         MGE_WRITE(sc, MGE_PORT_INT_CAUSE_EXT, ~int_cause_ext);
768                 }
769         }
770
771
772         rx_npkts = mge_intr_rx_locked(sc, count);
773
774         MGE_RECEIVE_UNLOCK(sc);
775         MGE_TRANSMIT_LOCK(sc);
776         mge_intr_tx_locked(sc);
777         MGE_TRANSMIT_UNLOCK(sc);
778         return (rx_npkts);
779 }
780 #endif /* DEVICE_POLLING */
781
782 static int
783 mge_attach(device_t dev)
784 {
785         struct mge_softc *sc;
786         struct mii_softc *miisc;
787         struct ifnet *ifp;
788         uint8_t hwaddr[ETHER_ADDR_LEN];
789         int i, error, phy;
790
791         sc = device_get_softc(dev);
792         sc->dev = dev;
793         sc->node = ofw_bus_get_node(dev);
794         phy = 0;
795
796         if (fdt_get_phyaddr(sc->node, sc->dev, &phy, (void **)&sc->phy_sc) == 0) {
797                 device_printf(dev, "PHY%i attached, phy_sc points to %s\n", phy,
798                     device_get_nameunit(sc->phy_sc->dev));
799                 sc->phy_attached = 1;
800         } else {
801                 device_printf(dev, "PHY not attached.\n");
802                 sc->phy_attached = 0;
803                 sc->phy_sc = sc;
804         }
805
806         if (fdt_find_compatible(sc->node, "mrvl,sw", 1) != 0) {
807                 device_printf(dev, "Switch attached.\n");
808                 sc->switch_attached = 1;
809                 /* additional variable available across instances */
810                 switch_attached = 1;
811         } else {
812                 sc->switch_attached = 0;
813         }
814
815         if (device_get_unit(dev) == 0) {
816                 sx_init(&sx_smi, "mge_tick() SMI access threads interlock");
817         }
818
819         /* Set chip version-dependent parameters */
820         mge_ver_params(sc);
821
822         /* Initialize mutexes */
823         mtx_init(&sc->transmit_lock, device_get_nameunit(dev), "mge TX lock",
824             MTX_DEF);
825         mtx_init(&sc->receive_lock, device_get_nameunit(dev), "mge RX lock",
826             MTX_DEF);
827
828         /* Allocate IO and IRQ resources */
829         error = bus_alloc_resources(dev, res_spec, sc->res);
830         if (error) {
831                 device_printf(dev, "could not allocate resources\n");
832                 mge_detach(dev);
833                 return (ENXIO);
834         }
835
836         /* Allocate DMA, buffers, buffer descriptors */
837         error = mge_allocate_dma(sc);
838         if (error) {
839                 mge_detach(dev);
840                 return (ENXIO);
841         }
842
843         sc->tx_desc_curr = 0;
844         sc->rx_desc_curr = 0;
845         sc->tx_desc_used_idx = 0;
846         sc->tx_desc_used_count = 0;
847
848         /* Configure defaults for interrupts coalescing */
849         sc->rx_ic_time = 768;
850         sc->tx_ic_time = 768;
851         mge_add_sysctls(sc);
852
853         /* Allocate network interface */
854         ifp = sc->ifp = if_alloc(IFT_ETHER);
855         if (ifp == NULL) {
856                 device_printf(dev, "if_alloc() failed\n");
857                 mge_detach(dev);
858                 return (ENOMEM);
859         }
860
861         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
862         ifp->if_softc = sc;
863         ifp->if_flags = IFF_SIMPLEX | IFF_MULTICAST | IFF_BROADCAST;
864         ifp->if_capabilities = IFCAP_VLAN_MTU;
865         if (sc->mge_hw_csum) {
866                 ifp->if_capabilities |= IFCAP_HWCSUM;
867                 ifp->if_hwassist = MGE_CHECKSUM_FEATURES;
868         }
869         ifp->if_capenable = ifp->if_capabilities;
870
871 #ifdef DEVICE_POLLING
872         /* Advertise that polling is supported */
873         ifp->if_capabilities |= IFCAP_POLLING;
874 #endif
875
876         ifp->if_init = mge_init;
877         ifp->if_start = mge_start;
878         ifp->if_ioctl = mge_ioctl;
879
880         ifp->if_snd.ifq_drv_maxlen = MGE_TX_DESC_NUM - 1;
881         IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen);
882         IFQ_SET_READY(&ifp->if_snd);
883
884         mge_get_mac_address(sc, hwaddr);
885         ether_ifattach(ifp, hwaddr);
886         callout_init(&sc->wd_callout, 0);
887
888         /* Attach PHY(s) */
889         if (sc->phy_attached) {
890                 error = mii_attach(dev, &sc->miibus, ifp, mge_ifmedia_upd,
891                     mge_ifmedia_sts, BMSR_DEFCAPMASK, phy, MII_OFFSET_ANY, 0);
892                 if (error) {
893                         device_printf(dev, "MII failed to find PHY\n");
894                         if_free(ifp);
895                         sc->ifp = NULL;
896                         mge_detach(dev);
897                         return (error);
898                 }
899                 sc->mii = device_get_softc(sc->miibus);
900
901                 /* Tell the MAC where to find the PHY so autoneg works */
902                 miisc = LIST_FIRST(&sc->mii->mii_phys);
903                 MGE_WRITE(sc, MGE_REG_PHYDEV, miisc->mii_phy);
904         } else {
905                 /* no PHY, so use hard-coded values */
906                 ifmedia_init(&sc->mge_ifmedia, 0,
907                     mge_ifmedia_upd,
908                     mge_ifmedia_sts);
909                 ifmedia_add(&sc->mge_ifmedia,
910                     IFM_ETHER | IFM_1000_T | IFM_FDX,
911                     0, NULL);
912                 ifmedia_set(&sc->mge_ifmedia,
913                     IFM_ETHER | IFM_1000_T | IFM_FDX);
914         }
915
916         /* Attach interrupt handlers */
917         /* TODO: review flags, in part. mark RX as INTR_ENTROPY ? */
918         for (i = 1; i <= sc->mge_intr_cnt; ++i) {
919                 error = bus_setup_intr(dev, sc->res[i],
920                     INTR_TYPE_NET | INTR_MPSAFE,
921                     NULL, *mge_intrs[(sc->mge_intr_cnt == 1 ? 0 : i)].handler,
922                     sc, &sc->ih_cookie[i - 1]);
923                 if (error) {
924                         device_printf(dev, "could not setup %s\n",
925                             mge_intrs[(sc->mge_intr_cnt == 1 ? 0 : i)].description);
926                         mge_detach(dev);
927                         return (error);
928                 }
929         }
930
931         if (sc->switch_attached) {
932                 device_t child;
933                 MGE_WRITE(sc, MGE_REG_PHYDEV, MGE_SWITCH_PHYDEV);
934                 child = device_add_child(dev, "mdio", -1);
935                 bus_generic_attach(dev);
936         }
937
938         return (0);
939 }
940
941 static int
942 mge_detach(device_t dev)
943 {
944         struct mge_softc *sc;
945         int error,i;
946
947         sc = device_get_softc(dev);
948
949         /* Stop controller and free TX queue */
950         if (sc->ifp)
951                 mge_shutdown(dev);
952
953         /* Wait for stopping ticks */
954         callout_drain(&sc->wd_callout);
955
956         /* Stop and release all interrupts */
957         for (i = 0; i < sc->mge_intr_cnt; ++i) {
958                 if (!sc->ih_cookie[i])
959                         continue;
960
961                 error = bus_teardown_intr(dev, sc->res[1 + i],
962                     sc->ih_cookie[i]);
963                 if (error)
964                         device_printf(dev, "could not release %s\n",
965                             mge_intrs[(sc->mge_intr_cnt == 1 ? 0 : i + 1)].description);
966         }
967
968         /* Detach network interface */
969         if (sc->ifp) {
970                 ether_ifdetach(sc->ifp);
971                 if_free(sc->ifp);
972         }
973
974         /* Free DMA resources */
975         mge_free_dma(sc);
976
977         /* Free IO memory handler */
978         bus_release_resources(dev, res_spec, sc->res);
979
980         /* Destroy mutexes */
981         mtx_destroy(&sc->receive_lock);
982         mtx_destroy(&sc->transmit_lock);
983
984         if (device_get_unit(dev) == 0)
985                 sx_destroy(&sx_smi);
986
987         return (0);
988 }
989
990 static void
991 mge_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
992 {
993         struct mge_softc *sc;
994         struct mii_data *mii;
995
996         sc = ifp->if_softc;
997         MGE_GLOBAL_LOCK(sc);
998
999         if (!sc->phy_attached) {
1000                 ifmr->ifm_active = IFM_1000_T | IFM_FDX | IFM_ETHER;
1001                 ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE;
1002                 goto out_unlock;
1003         }
1004
1005         mii = sc->mii;
1006         mii_pollstat(mii);
1007
1008         ifmr->ifm_active = mii->mii_media_active;
1009         ifmr->ifm_status = mii->mii_media_status;
1010
1011 out_unlock:
1012         MGE_GLOBAL_UNLOCK(sc);
1013 }
1014
1015 static uint32_t
1016 mge_set_port_serial_control(uint32_t media)
1017 {
1018         uint32_t port_config;
1019
1020         port_config = PORT_SERIAL_RES_BIT9 | PORT_SERIAL_FORCE_LINK_FAIL |
1021             PORT_SERIAL_MRU(PORT_SERIAL_MRU_1552);
1022
1023         if (IFM_TYPE(media) == IFM_ETHER) {
1024                 switch(IFM_SUBTYPE(media)) {
1025                         case IFM_AUTO:
1026                                 break;
1027                         case IFM_1000_T:
1028                                 port_config  |= (PORT_SERIAL_GMII_SPEED_1000 |
1029                                     PORT_SERIAL_AUTONEG | PORT_SERIAL_AUTONEG_FC
1030                                     | PORT_SERIAL_SPEED_AUTONEG);
1031                                 break;
1032                         case IFM_100_TX:
1033                                 port_config  |= (PORT_SERIAL_MII_SPEED_100 |
1034                                     PORT_SERIAL_AUTONEG | PORT_SERIAL_AUTONEG_FC
1035                                     | PORT_SERIAL_SPEED_AUTONEG);
1036                                 break;
1037                         case IFM_10_T:
1038                                 port_config  |= (PORT_SERIAL_AUTONEG |
1039                                     PORT_SERIAL_AUTONEG_FC |
1040                                     PORT_SERIAL_SPEED_AUTONEG);
1041                                 break;
1042                 }
1043                 if (media & IFM_FDX)
1044                         port_config |= PORT_SERIAL_FULL_DUPLEX;
1045         }
1046         return (port_config);
1047 }
1048
1049 static int
1050 mge_ifmedia_upd(struct ifnet *ifp)
1051 {
1052         struct mge_softc *sc = ifp->if_softc;
1053
1054         /*
1055          * Do not do anything for switch here, as updating media between
1056          * MGE MAC and switch MAC is hardcoded in PCB. Changing it here would
1057          * break the link.
1058          */
1059         if (sc->phy_attached) {
1060                 MGE_GLOBAL_LOCK(sc);
1061                 if (ifp->if_flags & IFF_UP) {
1062                         sc->mge_media_status = sc->mii->mii_media.ifm_media;
1063                         mii_mediachg(sc->mii);
1064
1065                         /* MGE MAC needs to be reinitialized. */
1066                         mge_init_locked(sc);
1067
1068                 }
1069                 MGE_GLOBAL_UNLOCK(sc);
1070         }
1071
1072         return (0);
1073 }
1074
1075 static void
1076 mge_init(void *arg)
1077 {
1078         struct mge_softc *sc;
1079
1080         sc = arg;
1081         MGE_GLOBAL_LOCK(sc);
1082
1083         mge_init_locked(arg);
1084
1085         MGE_GLOBAL_UNLOCK(sc);
1086 }
1087
1088 static void
1089 mge_init_locked(void *arg)
1090 {
1091         struct mge_softc *sc = arg;
1092         struct mge_desc_wrapper *dw;
1093         volatile uint32_t reg_val;
1094         int i, count;
1095         uint32_t media_status;
1096
1097
1098         MGE_GLOBAL_LOCK_ASSERT(sc);
1099
1100         /* Stop interface */
1101         mge_stop(sc);
1102
1103         /* Disable interrupts */
1104         mge_intrs_ctrl(sc, 0);
1105
1106         /* Set MAC address */
1107         mge_set_mac_address(sc);
1108
1109         /* Setup multicast filters */
1110         mge_setup_multicast(sc);
1111
1112         if (sc->mge_ver == 2) {
1113                 MGE_WRITE(sc, MGE_PORT_SERIAL_CTRL1, MGE_RGMII_EN);
1114                 MGE_WRITE(sc, MGE_FIXED_PRIO_CONF, MGE_FIXED_PRIO_EN(0));
1115         }
1116
1117         /* Initialize TX queue configuration registers */
1118         MGE_WRITE(sc, MGE_TX_TOKEN_COUNT(0), sc->mge_tx_tok_cnt);
1119         MGE_WRITE(sc, MGE_TX_TOKEN_CONF(0), sc->mge_tx_tok_cfg);
1120         MGE_WRITE(sc, MGE_TX_ARBITER_CONF(0), sc->mge_tx_arb_cfg);
1121
1122         /* Clear TX queue configuration registers for unused queues */
1123         for (i = 1; i < 7; i++) {
1124                 MGE_WRITE(sc, MGE_TX_TOKEN_COUNT(i), 0);
1125                 MGE_WRITE(sc, MGE_TX_TOKEN_CONF(i), 0);
1126                 MGE_WRITE(sc, MGE_TX_ARBITER_CONF(i), 0);
1127         }
1128
1129         /* Set default MTU */
1130         MGE_WRITE(sc, sc->mge_mtu, 0);
1131
1132         /* Port configuration */
1133         MGE_WRITE(sc, MGE_PORT_CONFIG,
1134             PORT_CONFIG_RXCS | PORT_CONFIG_DFLT_RXQ(0) |
1135             PORT_CONFIG_ARO_RXQ(0));
1136         MGE_WRITE(sc, MGE_PORT_EXT_CONFIG , 0x0);
1137
1138         /* Configure promisc mode */
1139         mge_set_prom_mode(sc, MGE_RX_DEFAULT_QUEUE);
1140
1141         media_status = sc->mge_media_status;
1142         if (sc->switch_attached) {
1143                 media_status &= ~IFM_TMASK;
1144                 media_status |= IFM_1000_T;
1145         }
1146
1147         /* Setup port configuration */
1148         reg_val = mge_set_port_serial_control(media_status);
1149         MGE_WRITE(sc, MGE_PORT_SERIAL_CTRL, reg_val);
1150
1151         /* Setup SDMA configuration */
1152         MGE_WRITE(sc, MGE_SDMA_CONFIG , MGE_SDMA_RX_BYTE_SWAP |
1153             MGE_SDMA_TX_BYTE_SWAP |
1154             MGE_SDMA_RX_BURST_SIZE(MGE_SDMA_BURST_16_WORD) |
1155             MGE_SDMA_TX_BURST_SIZE(MGE_SDMA_BURST_16_WORD));
1156
1157         MGE_WRITE(sc, MGE_TX_FIFO_URGENT_TRSH, 0x0);
1158
1159         MGE_WRITE(sc, MGE_TX_CUR_DESC_PTR, sc->tx_desc_start);
1160         MGE_WRITE(sc, MGE_RX_CUR_DESC_PTR(MGE_RX_DEFAULT_QUEUE),
1161             sc->rx_desc_start);
1162
1163         /* Reset descriptor indexes */
1164         sc->tx_desc_curr = 0;
1165         sc->rx_desc_curr = 0;
1166         sc->tx_desc_used_idx = 0;
1167         sc->tx_desc_used_count = 0;
1168
1169         /* Enable RX descriptors */
1170         for (i = 0; i < MGE_RX_DESC_NUM; i++) {
1171                 dw = &sc->mge_rx_desc[i];
1172                 dw->mge_desc->cmd_status = MGE_RX_ENABLE_INT | MGE_DMA_OWNED;
1173                 dw->mge_desc->buff_size = MCLBYTES;
1174                 bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap,
1175                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1176         }
1177
1178         /* Enable RX queue */
1179         MGE_WRITE(sc, MGE_RX_QUEUE_CMD, MGE_ENABLE_RXQ(MGE_RX_DEFAULT_QUEUE));
1180
1181         /* Enable port */
1182         reg_val = MGE_READ(sc, MGE_PORT_SERIAL_CTRL);
1183         reg_val |= PORT_SERIAL_ENABLE;
1184         MGE_WRITE(sc, MGE_PORT_SERIAL_CTRL, reg_val);
1185         count = 0x100000;
1186         for (;;) {
1187                 reg_val = MGE_READ(sc, MGE_PORT_STATUS);
1188                 if (reg_val & MGE_STATUS_LINKUP)
1189                         break;
1190                 DELAY(100);
1191                 if (--count == 0) {
1192                         if_printf(sc->ifp, "Timeout on link-up\n");
1193                         break;
1194                 }
1195         }
1196
1197         /* Setup interrupts coalescing */
1198         mge_set_rxic(sc);
1199         mge_set_txic(sc);
1200
1201         /* Enable interrupts */
1202 #ifdef DEVICE_POLLING
1203         /*
1204          * * ...only if polling is not turned on. Disable interrupts explicitly
1205          * if polling is enabled.
1206          */
1207         if (sc->ifp->if_capenable & IFCAP_POLLING)
1208                 mge_intrs_ctrl(sc, 0);
1209         else
1210 #endif /* DEVICE_POLLING */
1211         mge_intrs_ctrl(sc, 1);
1212
1213         /* Activate network interface */
1214         sc->ifp->if_drv_flags |= IFF_DRV_RUNNING;
1215         sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1216         sc->wd_timer = 0;
1217
1218         /* Schedule watchdog timeout */
1219         if (sc->phy_attached)
1220                 callout_reset(&sc->wd_callout, hz, mge_tick, sc);
1221 }
1222
1223 static void
1224 mge_intr_rxtx(void *arg)
1225 {
1226         struct mge_softc *sc;
1227         uint32_t int_cause, int_cause_ext;
1228
1229         sc = arg;
1230         MGE_GLOBAL_LOCK(sc);
1231
1232 #ifdef DEVICE_POLLING
1233         if (sc->ifp->if_capenable & IFCAP_POLLING) {
1234                 MGE_GLOBAL_UNLOCK(sc);
1235                 return;
1236         }
1237 #endif
1238
1239         /* Get interrupt cause */
1240         int_cause = MGE_READ(sc, MGE_PORT_INT_CAUSE);
1241         int_cause_ext = MGE_READ(sc, MGE_PORT_INT_CAUSE_EXT);
1242
1243         /* Check for Transmit interrupt */
1244         if (int_cause_ext & (MGE_PORT_INT_EXT_TXBUF0 |
1245             MGE_PORT_INT_EXT_TXUR)) {
1246                 MGE_WRITE(sc, MGE_PORT_INT_CAUSE_EXT, ~(int_cause_ext &
1247                     (MGE_PORT_INT_EXT_TXBUF0 | MGE_PORT_INT_EXT_TXUR)));
1248                 mge_intr_tx_locked(sc);
1249         }
1250
1251         MGE_TRANSMIT_UNLOCK(sc);
1252
1253         /* Check for Receive interrupt */
1254         mge_intr_rx_check(sc, int_cause, int_cause_ext);
1255
1256         MGE_RECEIVE_UNLOCK(sc);
1257 }
1258
1259 static void
1260 mge_intr_err(void *arg)
1261 {
1262         struct mge_softc *sc;
1263         struct ifnet *ifp;
1264
1265         sc = arg;
1266         ifp = sc->ifp;
1267         if_printf(ifp, "%s\n", __FUNCTION__);
1268 }
1269
1270 static void
1271 mge_intr_misc(void *arg)
1272 {
1273         struct mge_softc *sc;
1274         struct ifnet *ifp;
1275
1276         sc = arg;
1277         ifp = sc->ifp;
1278         if_printf(ifp, "%s\n", __FUNCTION__);
1279 }
1280
1281 static void
1282 mge_intr_rx(void *arg) {
1283         struct mge_softc *sc;
1284         uint32_t int_cause, int_cause_ext;
1285
1286         sc = arg;
1287         MGE_RECEIVE_LOCK(sc);
1288
1289 #ifdef DEVICE_POLLING
1290         if (sc->ifp->if_capenable & IFCAP_POLLING) {
1291                 MGE_RECEIVE_UNLOCK(sc);
1292                 return;
1293         }
1294 #endif
1295
1296         /* Get interrupt cause */
1297         int_cause = MGE_READ(sc, MGE_PORT_INT_CAUSE);
1298         int_cause_ext = MGE_READ(sc, MGE_PORT_INT_CAUSE_EXT);
1299
1300         mge_intr_rx_check(sc, int_cause, int_cause_ext);
1301
1302         MGE_RECEIVE_UNLOCK(sc);
1303 }
1304
1305 static void
1306 mge_intr_rx_check(struct mge_softc *sc, uint32_t int_cause,
1307     uint32_t int_cause_ext)
1308 {
1309         /* Check for resource error */
1310         if (int_cause & MGE_PORT_INT_RXERRQ0) {
1311                 mge_reinit_rx(sc);
1312                 MGE_WRITE(sc, MGE_PORT_INT_CAUSE,
1313                     ~(int_cause & MGE_PORT_INT_RXERRQ0));
1314         }
1315
1316         int_cause &= MGE_PORT_INT_RXQ0;
1317         int_cause_ext &= MGE_PORT_INT_EXT_RXOR;
1318
1319         if (int_cause || int_cause_ext) {
1320                 MGE_WRITE(sc, MGE_PORT_INT_CAUSE, ~int_cause);
1321                 MGE_WRITE(sc, MGE_PORT_INT_CAUSE_EXT, ~int_cause_ext);
1322                 mge_intr_rx_locked(sc, -1);
1323         }
1324 }
1325
1326 static int
1327 mge_intr_rx_locked(struct mge_softc *sc, int count)
1328 {
1329         struct ifnet *ifp = sc->ifp;
1330         uint32_t status;
1331         uint16_t bufsize;
1332         struct mge_desc_wrapper* dw;
1333         struct mbuf *mb;
1334         int rx_npkts = 0;
1335
1336         MGE_RECEIVE_LOCK_ASSERT(sc);
1337
1338         while (count != 0) {
1339                 dw = &sc->mge_rx_desc[sc->rx_desc_curr];
1340                 bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap,
1341                     BUS_DMASYNC_POSTREAD);
1342
1343                 /* Get status */
1344                 status = dw->mge_desc->cmd_status;
1345                 bufsize = dw->mge_desc->buff_size;
1346                 if ((status & MGE_DMA_OWNED) != 0)
1347                         break;
1348
1349                 if (dw->mge_desc->byte_count &&
1350                     ~(status & MGE_ERR_SUMMARY)) {
1351
1352                         bus_dmamap_sync(sc->mge_rx_dtag, dw->buffer_dmap,
1353                             BUS_DMASYNC_POSTREAD);
1354
1355                         mb = m_devget(dw->buffer->m_data,
1356                             dw->mge_desc->byte_count - ETHER_CRC_LEN,
1357                             0, ifp, NULL);
1358
1359                         if (mb == NULL)
1360                                 /* Give up if no mbufs */
1361                                 break;
1362
1363                         mb->m_len -= 2;
1364                         mb->m_pkthdr.len -= 2;
1365                         mb->m_data += 2;
1366
1367                         mb->m_pkthdr.rcvif = ifp;
1368
1369                         mge_offload_process_frame(ifp, mb, status,
1370                             bufsize);
1371
1372                         MGE_RECEIVE_UNLOCK(sc);
1373                         (*ifp->if_input)(ifp, mb);
1374                         MGE_RECEIVE_LOCK(sc);
1375                         rx_npkts++;
1376                 }
1377
1378                 dw->mge_desc->byte_count = 0;
1379                 dw->mge_desc->cmd_status = MGE_RX_ENABLE_INT | MGE_DMA_OWNED;
1380                 sc->rx_desc_curr = (++sc->rx_desc_curr % MGE_RX_DESC_NUM);
1381                 bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap,
1382                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1383
1384                 if (count > 0)
1385                         count -= 1;
1386         }
1387
1388         if_inc_counter(ifp, IFCOUNTER_IPACKETS, rx_npkts);
1389
1390         return (rx_npkts);
1391 }
1392
1393 static void
1394 mge_intr_sum(void *arg)
1395 {
1396         struct mge_softc *sc = arg;
1397         struct ifnet *ifp;
1398
1399         ifp = sc->ifp;
1400         if_printf(ifp, "%s\n", __FUNCTION__);
1401 }
1402
1403 static void
1404 mge_intr_tx(void *arg)
1405 {
1406         struct mge_softc *sc = arg;
1407         uint32_t int_cause_ext;
1408
1409         MGE_TRANSMIT_LOCK(sc);
1410
1411 #ifdef DEVICE_POLLING
1412         if (sc->ifp->if_capenable & IFCAP_POLLING) {
1413                 MGE_TRANSMIT_UNLOCK(sc);
1414                 return;
1415         }
1416 #endif
1417
1418         /* Ack the interrupt */
1419         int_cause_ext = MGE_READ(sc, MGE_PORT_INT_CAUSE_EXT);
1420         MGE_WRITE(sc, MGE_PORT_INT_CAUSE_EXT, ~(int_cause_ext &
1421             (MGE_PORT_INT_EXT_TXBUF0 | MGE_PORT_INT_EXT_TXUR)));
1422
1423         mge_intr_tx_locked(sc);
1424
1425         MGE_TRANSMIT_UNLOCK(sc);
1426 }
1427
1428 static void
1429 mge_intr_tx_locked(struct mge_softc *sc)
1430 {
1431         struct ifnet *ifp = sc->ifp;
1432         struct mge_desc_wrapper *dw;
1433         struct mge_desc *desc;
1434         uint32_t status;
1435         int send = 0;
1436
1437         MGE_TRANSMIT_LOCK_ASSERT(sc);
1438
1439         /* Disable watchdog */
1440         sc->wd_timer = 0;
1441
1442         while (sc->tx_desc_used_count) {
1443                 /* Get the descriptor */
1444                 dw = &sc->mge_tx_desc[sc->tx_desc_used_idx];
1445                 desc = dw->mge_desc;
1446                 bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap,
1447                     BUS_DMASYNC_POSTREAD);
1448
1449                 /* Get descriptor status */
1450                 status = desc->cmd_status;
1451
1452                 if (status & MGE_DMA_OWNED)
1453                         break;
1454
1455                 sc->tx_desc_used_idx =
1456                         (++sc->tx_desc_used_idx) % MGE_TX_DESC_NUM;
1457                 sc->tx_desc_used_count--;
1458
1459                 /* Update collision statistics */
1460                 if (status & MGE_ERR_SUMMARY) {
1461                         if ((status & MGE_ERR_MASK) == MGE_TX_ERROR_LC)
1462                                 if_inc_counter(ifp, IFCOUNTER_COLLISIONS, 1);
1463                         if ((status & MGE_ERR_MASK) == MGE_TX_ERROR_RL)
1464                                 if_inc_counter(ifp, IFCOUNTER_COLLISIONS, 16);
1465                 }
1466
1467                 bus_dmamap_sync(sc->mge_tx_dtag, dw->buffer_dmap,
1468                     BUS_DMASYNC_POSTWRITE);
1469                 bus_dmamap_unload(sc->mge_tx_dtag, dw->buffer_dmap);
1470                 m_freem(dw->buffer);
1471                 dw->buffer = (struct mbuf*)NULL;
1472                 send++;
1473
1474                 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
1475         }
1476
1477         if (send) {
1478                 /* Now send anything that was pending */
1479                 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1480                 mge_start_locked(ifp);
1481         }
1482 }
1483 static int
1484 mge_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
1485 {
1486         struct mge_softc *sc = ifp->if_softc;
1487         struct ifreq *ifr = (struct ifreq *)data;
1488         int mask, error;
1489         uint32_t flags;
1490
1491         error = 0;
1492
1493         switch (command) {
1494         case SIOCSIFFLAGS:
1495                 MGE_GLOBAL_LOCK(sc);
1496
1497                 if (ifp->if_flags & IFF_UP) {
1498                         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1499                                 flags = ifp->if_flags ^ sc->mge_if_flags;
1500                                 if (flags & IFF_PROMISC)
1501                                         mge_set_prom_mode(sc,
1502                                             MGE_RX_DEFAULT_QUEUE);
1503
1504                                 if (flags & IFF_ALLMULTI)
1505                                         mge_setup_multicast(sc);
1506                         } else
1507                                 mge_init_locked(sc);
1508                 }
1509                 else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1510                         mge_stop(sc);
1511
1512                 sc->mge_if_flags = ifp->if_flags;
1513                 MGE_GLOBAL_UNLOCK(sc);
1514                 break;
1515         case SIOCADDMULTI:
1516         case SIOCDELMULTI:
1517                 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1518                         MGE_GLOBAL_LOCK(sc);
1519                         mge_setup_multicast(sc);
1520                         MGE_GLOBAL_UNLOCK(sc);
1521                 }
1522                 break;
1523         case SIOCSIFCAP:
1524                 mask = ifp->if_capenable ^ ifr->ifr_reqcap;
1525                 if (mask & IFCAP_HWCSUM) {
1526                         ifp->if_capenable &= ~IFCAP_HWCSUM;
1527                         ifp->if_capenable |= IFCAP_HWCSUM & ifr->ifr_reqcap;
1528                         if (ifp->if_capenable & IFCAP_TXCSUM)
1529                                 ifp->if_hwassist = MGE_CHECKSUM_FEATURES;
1530                         else
1531                                 ifp->if_hwassist = 0;
1532                 }
1533 #ifdef DEVICE_POLLING
1534                 if (mask & IFCAP_POLLING) {
1535                         if (ifr->ifr_reqcap & IFCAP_POLLING) {
1536                                 error = ether_poll_register(mge_poll, ifp);
1537                                 if (error)
1538                                         return(error);
1539
1540                                 MGE_GLOBAL_LOCK(sc);
1541                                 mge_intrs_ctrl(sc, 0);
1542                                 ifp->if_capenable |= IFCAP_POLLING;
1543                                 MGE_GLOBAL_UNLOCK(sc);
1544                         } else {
1545                                 error = ether_poll_deregister(ifp);
1546                                 MGE_GLOBAL_LOCK(sc);
1547                                 mge_intrs_ctrl(sc, 1);
1548                                 ifp->if_capenable &= ~IFCAP_POLLING;
1549                                 MGE_GLOBAL_UNLOCK(sc);
1550                         }
1551                 }
1552 #endif
1553                 break;
1554         case SIOCGIFMEDIA: /* fall through */
1555         case SIOCSIFMEDIA:
1556                 /*
1557                  * Setting up media type via ioctls is *not* supported for MAC
1558                  * which is connected to switch. Use etherswitchcfg.
1559                  */
1560                 if (!sc->phy_attached && (command == SIOCSIFMEDIA))
1561                         return (0);
1562                 else if (!sc->phy_attached) {
1563                         error = ifmedia_ioctl(ifp, ifr, &sc->mge_ifmedia,
1564                             command);
1565                         break;
1566                 }
1567
1568                 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_1000_T
1569                     && !(ifr->ifr_media & IFM_FDX)) {
1570                         device_printf(sc->dev,
1571                             "1000baseTX half-duplex unsupported\n");
1572                         return 0;
1573                 }
1574                 error = ifmedia_ioctl(ifp, ifr, &sc->mii->mii_media, command);
1575                 break;
1576         default:
1577                 error = ether_ioctl(ifp, command, data);
1578         }
1579         return (error);
1580 }
1581
1582 static int
1583 mge_miibus_readreg(device_t dev, int phy, int reg)
1584 {
1585         struct mge_softc *sc;
1586         sc = device_get_softc(dev);
1587
1588         KASSERT(!switch_attached, ("miibus used with switch attached"));
1589
1590         return (mv_read_ext_phy(dev, phy, reg));
1591 }
1592
1593 static int
1594 mge_miibus_writereg(device_t dev, int phy, int reg, int value)
1595 {
1596         struct mge_softc *sc;
1597         sc = device_get_softc(dev);
1598
1599         KASSERT(!switch_attached, ("miibus used with switch attached"));
1600
1601         mv_write_ext_phy(dev, phy, reg, value);
1602
1603         return (0);
1604 }
1605
1606 static int
1607 mge_probe(device_t dev)
1608 {
1609
1610         if (!ofw_bus_status_okay(dev))
1611                 return (ENXIO);
1612
1613         if (!ofw_bus_is_compatible(dev, "mrvl,ge"))
1614                 return (ENXIO);
1615
1616         device_set_desc(dev, "Marvell Gigabit Ethernet controller");
1617         return (BUS_PROBE_DEFAULT);
1618 }
1619
1620 static int
1621 mge_resume(device_t dev)
1622 {
1623
1624         device_printf(dev, "%s\n", __FUNCTION__);
1625         return (0);
1626 }
1627
1628 static int
1629 mge_shutdown(device_t dev)
1630 {
1631         struct mge_softc *sc = device_get_softc(dev);
1632
1633         MGE_GLOBAL_LOCK(sc);
1634
1635 #ifdef DEVICE_POLLING
1636         if (sc->ifp->if_capenable & IFCAP_POLLING)
1637                 ether_poll_deregister(sc->ifp);
1638 #endif
1639
1640         mge_stop(sc);
1641
1642         MGE_GLOBAL_UNLOCK(sc);
1643
1644         return (0);
1645 }
1646
1647 static int
1648 mge_encap(struct mge_softc *sc, struct mbuf *m0)
1649 {
1650         struct mge_desc_wrapper *dw = NULL;
1651         struct ifnet *ifp;
1652         bus_dma_segment_t segs[MGE_TX_DESC_NUM];
1653         bus_dmamap_t mapp;
1654         int error;
1655         int seg, nsegs;
1656         int desc_no;
1657
1658         ifp = sc->ifp;
1659
1660         /* Fetch unused map */
1661         desc_no = sc->tx_desc_curr;
1662         dw = &sc->mge_tx_desc[desc_no];
1663         mapp = dw->buffer_dmap;
1664
1665         /* Create mapping in DMA memory */
1666         error = bus_dmamap_load_mbuf_sg(sc->mge_tx_dtag, mapp, m0, segs, &nsegs,
1667             BUS_DMA_NOWAIT);
1668         if (error != 0) {
1669                 m_freem(m0);
1670                 return (error);
1671         }
1672
1673         /* Only one segment is supported. */
1674         if (nsegs != 1) {
1675                 bus_dmamap_unload(sc->mge_tx_dtag, mapp);
1676                 m_freem(m0);
1677                 return (-1);
1678         }
1679
1680         bus_dmamap_sync(sc->mge_tx_dtag, mapp, BUS_DMASYNC_PREWRITE);
1681
1682         /* Everything is ok, now we can send buffers */
1683         for (seg = 0; seg < nsegs; seg++) {
1684                 dw->mge_desc->byte_count = segs[seg].ds_len;
1685                 dw->mge_desc->buffer = segs[seg].ds_addr;
1686                 dw->buffer = m0;
1687                 dw->mge_desc->cmd_status = 0;
1688                 if (seg == 0)
1689                         mge_offload_setup_descriptor(sc, dw);
1690                 dw->mge_desc->cmd_status |= MGE_TX_LAST | MGE_TX_FIRST |
1691                     MGE_TX_ETH_CRC | MGE_TX_EN_INT | MGE_TX_PADDING |
1692                     MGE_DMA_OWNED;
1693         }
1694
1695         bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap,
1696             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1697
1698         sc->tx_desc_curr = (++sc->tx_desc_curr) % MGE_TX_DESC_NUM;
1699         sc->tx_desc_used_count++;
1700         return (0);
1701 }
1702
1703 static void
1704 mge_tick(void *msc)
1705 {
1706         struct mge_softc *sc = msc;
1707
1708         KASSERT(sc->phy_attached == 1, ("mge_tick while PHY not attached"));
1709
1710         MGE_GLOBAL_LOCK(sc);
1711
1712         /* Check for TX timeout */
1713         mge_watchdog(sc);
1714
1715         mii_tick(sc->mii);
1716
1717         /* Check for media type change */
1718         if(sc->mge_media_status != sc->mii->mii_media.ifm_media)
1719                 mge_ifmedia_upd(sc->ifp);
1720
1721         MGE_GLOBAL_UNLOCK(sc);
1722
1723         /* Schedule another timeout one second from now */
1724         callout_reset(&sc->wd_callout, hz, mge_tick, sc);
1725
1726         return;
1727 }
1728
1729 static void
1730 mge_watchdog(struct mge_softc *sc)
1731 {
1732         struct ifnet *ifp;
1733
1734         ifp = sc->ifp;
1735
1736         if (sc->wd_timer == 0 || --sc->wd_timer) {
1737                 return;
1738         }
1739
1740         if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
1741         if_printf(ifp, "watchdog timeout\n");
1742
1743         mge_stop(sc);
1744         mge_init_locked(sc);
1745 }
1746
1747 static void
1748 mge_start(struct ifnet *ifp)
1749 {
1750         struct mge_softc *sc = ifp->if_softc;
1751
1752         MGE_TRANSMIT_LOCK(sc);
1753
1754         mge_start_locked(ifp);
1755
1756         MGE_TRANSMIT_UNLOCK(sc);
1757 }
1758
1759 static void
1760 mge_start_locked(struct ifnet *ifp)
1761 {
1762         struct mge_softc *sc;
1763         struct mbuf *m0, *mtmp;
1764         uint32_t reg_val, queued = 0;
1765
1766         sc = ifp->if_softc;
1767
1768         MGE_TRANSMIT_LOCK_ASSERT(sc);
1769
1770         if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
1771             IFF_DRV_RUNNING)
1772                 return;
1773
1774         for (;;) {
1775                 /* Get packet from the queue */
1776                 IF_DEQUEUE(&ifp->if_snd, m0);
1777                 if (m0 == NULL)
1778                         break;
1779
1780                 if (m0->m_pkthdr.csum_flags & (CSUM_IP|CSUM_TCP|CSUM_UDP) ||
1781                     m0->m_flags & M_VLANTAG) {
1782                         if (M_WRITABLE(m0) == 0) {
1783                                 mtmp = m_dup(m0, M_NOWAIT);
1784                                 m_freem(m0);
1785                                 if (mtmp == NULL)
1786                                         continue;
1787                                 m0 = mtmp;
1788                         }
1789                 }
1790                 /* The driver support only one DMA fragment. */
1791                 if (m0->m_next != NULL) {
1792                         mtmp = m_defrag(m0, M_NOWAIT);
1793                         if (mtmp != NULL)
1794                                 m0 = mtmp;
1795                 }
1796
1797                 /* Check for free descriptors */
1798                 if (sc->tx_desc_used_count + 1 >= MGE_TX_DESC_NUM) {
1799                         IF_PREPEND(&ifp->if_snd, m0);
1800                         ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1801                         break;
1802                 }
1803
1804                 if (mge_encap(sc, m0) != 0)
1805                         break;
1806
1807                 queued++;
1808                 BPF_MTAP(ifp, m0);
1809         }
1810
1811         if (queued) {
1812                 /* Enable transmitter and watchdog timer */
1813                 reg_val = MGE_READ(sc, MGE_TX_QUEUE_CMD);
1814                 MGE_WRITE(sc, MGE_TX_QUEUE_CMD, reg_val | MGE_ENABLE_TXQ);
1815                 sc->wd_timer = 5;
1816         }
1817 }
1818
1819 static void
1820 mge_stop(struct mge_softc *sc)
1821 {
1822         struct ifnet *ifp;
1823         volatile uint32_t reg_val, status;
1824         struct mge_desc_wrapper *dw;
1825         struct mge_desc *desc;
1826         int count;
1827
1828         ifp = sc->ifp;
1829
1830         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
1831                 return;
1832
1833         /* Stop tick engine */
1834         callout_stop(&sc->wd_callout);
1835
1836         /* Disable interface */
1837         ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
1838         sc->wd_timer = 0;
1839
1840         /* Disable interrupts */
1841         mge_intrs_ctrl(sc, 0);
1842
1843         /* Disable Rx and Tx */
1844         reg_val = MGE_READ(sc, MGE_TX_QUEUE_CMD);
1845         MGE_WRITE(sc, MGE_TX_QUEUE_CMD, reg_val | MGE_DISABLE_TXQ);
1846         MGE_WRITE(sc, MGE_RX_QUEUE_CMD, MGE_DISABLE_RXQ_ALL);
1847
1848         /* Remove pending data from TX queue */
1849         while (sc->tx_desc_used_idx != sc->tx_desc_curr &&
1850             sc->tx_desc_used_count) {
1851                 /* Get the descriptor */
1852                 dw = &sc->mge_tx_desc[sc->tx_desc_used_idx];
1853                 desc = dw->mge_desc;
1854                 bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap,
1855                     BUS_DMASYNC_POSTREAD);
1856
1857                 /* Get descriptor status */
1858                 status = desc->cmd_status;
1859
1860                 if (status & MGE_DMA_OWNED)
1861                         break;
1862
1863                 sc->tx_desc_used_idx = (++sc->tx_desc_used_idx) %
1864                     MGE_TX_DESC_NUM;
1865                 sc->tx_desc_used_count--;
1866
1867                 bus_dmamap_sync(sc->mge_tx_dtag, dw->buffer_dmap,
1868                     BUS_DMASYNC_POSTWRITE);
1869                 bus_dmamap_unload(sc->mge_tx_dtag, dw->buffer_dmap);
1870
1871                 m_freem(dw->buffer);
1872                 dw->buffer = (struct mbuf*)NULL;
1873         }
1874
1875         /* Wait for end of transmission */
1876         count = 0x100000;
1877         while (count--) {
1878                 reg_val = MGE_READ(sc, MGE_PORT_STATUS);
1879                 if ( !(reg_val & MGE_STATUS_TX_IN_PROG) &&
1880                     (reg_val & MGE_STATUS_TX_FIFO_EMPTY))
1881                         break;
1882                 DELAY(100);
1883         }
1884
1885         if (count == 0)
1886                 if_printf(ifp,
1887                     "%s: timeout while waiting for end of transmission\n",
1888                     __FUNCTION__);
1889
1890         reg_val = MGE_READ(sc, MGE_PORT_SERIAL_CTRL);
1891         reg_val &= ~(PORT_SERIAL_ENABLE);
1892         MGE_WRITE(sc, MGE_PORT_SERIAL_CTRL ,reg_val);
1893 }
1894
1895 static int
1896 mge_suspend(device_t dev)
1897 {
1898
1899         device_printf(dev, "%s\n", __FUNCTION__);
1900         return (0);
1901 }
1902
1903 static void
1904 mge_offload_process_frame(struct ifnet *ifp, struct mbuf *frame,
1905     uint32_t status, uint16_t bufsize)
1906 {
1907         int csum_flags = 0;
1908
1909         if (ifp->if_capenable & IFCAP_RXCSUM) {
1910                 if ((status & MGE_RX_L3_IS_IP) && (status & MGE_RX_IP_OK))
1911                         csum_flags |= CSUM_IP_CHECKED | CSUM_IP_VALID;
1912
1913                 if ((bufsize & MGE_RX_IP_FRAGMENT) == 0 &&
1914                     (MGE_RX_L4_IS_TCP(status) || MGE_RX_L4_IS_UDP(status)) &&
1915                     (status & MGE_RX_L4_CSUM_OK)) {
1916                         csum_flags |= CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
1917                         frame->m_pkthdr.csum_data = 0xFFFF;
1918                 }
1919
1920                 frame->m_pkthdr.csum_flags = csum_flags;
1921         }
1922 }
1923
1924 static void
1925 mge_offload_setup_descriptor(struct mge_softc *sc, struct mge_desc_wrapper *dw)
1926 {
1927         struct mbuf *m0 = dw->buffer;
1928         struct ether_vlan_header *eh = mtod(m0, struct ether_vlan_header *);
1929         int csum_flags = m0->m_pkthdr.csum_flags;
1930         int cmd_status = 0;
1931         struct ip *ip;
1932         int ehlen, etype;
1933
1934         if (csum_flags != 0) {
1935                 if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
1936                         etype = ntohs(eh->evl_proto);
1937                         ehlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
1938                         csum_flags |= MGE_TX_VLAN_TAGGED;
1939                 } else {
1940                         etype = ntohs(eh->evl_encap_proto);
1941                         ehlen = ETHER_HDR_LEN;
1942                 }
1943
1944                 if (etype != ETHERTYPE_IP) {
1945                         if_printf(sc->ifp,
1946                             "TCP/IP Offload enabled for unsupported "
1947                             "protocol!\n");
1948                         return;
1949                 }
1950
1951                 ip = (struct ip *)(m0->m_data + ehlen);
1952                 cmd_status |= MGE_TX_IP_HDR_SIZE(ip->ip_hl);
1953                 cmd_status |= MGE_TX_NOT_FRAGMENT;
1954         }
1955
1956         if (csum_flags & CSUM_IP)
1957                 cmd_status |= MGE_TX_GEN_IP_CSUM;
1958
1959         if (csum_flags & CSUM_TCP)
1960                 cmd_status |= MGE_TX_GEN_L4_CSUM;
1961
1962         if (csum_flags & CSUM_UDP)
1963                 cmd_status |= MGE_TX_GEN_L4_CSUM | MGE_TX_UDP;
1964
1965         dw->mge_desc->cmd_status |= cmd_status;
1966 }
1967
1968 static void
1969 mge_intrs_ctrl(struct mge_softc *sc, int enable)
1970 {
1971
1972         if (enable) {
1973                 MGE_WRITE(sc, MGE_PORT_INT_MASK , MGE_PORT_INT_RXQ0 |
1974                     MGE_PORT_INT_EXTEND | MGE_PORT_INT_RXERRQ0);
1975                 MGE_WRITE(sc, MGE_PORT_INT_MASK_EXT , MGE_PORT_INT_EXT_TXERR0 |
1976                     MGE_PORT_INT_EXT_RXOR | MGE_PORT_INT_EXT_TXUR |
1977                     MGE_PORT_INT_EXT_TXBUF0);
1978         } else {
1979                 MGE_WRITE(sc, MGE_INT_CAUSE, 0x0);
1980                 MGE_WRITE(sc, MGE_INT_MASK, 0x0);
1981
1982                 MGE_WRITE(sc, MGE_PORT_INT_CAUSE, 0x0);
1983                 MGE_WRITE(sc, MGE_PORT_INT_CAUSE_EXT, 0x0);
1984
1985                 MGE_WRITE(sc, MGE_PORT_INT_MASK, 0x0);
1986                 MGE_WRITE(sc, MGE_PORT_INT_MASK_EXT, 0x0);
1987         }
1988 }
1989
1990 static uint8_t
1991 mge_crc8(uint8_t *data, int size)
1992 {
1993         uint8_t crc = 0;
1994         static const uint8_t ct[256] = {
1995                 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
1996                 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
1997                 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
1998                 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
1999                 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
2000                 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
2001                 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
2002                 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
2003                 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
2004                 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
2005                 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
2006                 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
2007                 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
2008                 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
2009                 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
2010                 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
2011                 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
2012                 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
2013                 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
2014                 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
2015                 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
2016                 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
2017                 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
2018                 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
2019                 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
2020                 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
2021                 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
2022                 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
2023                 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
2024                 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
2025                 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
2026                 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
2027         };
2028
2029         while(size--)
2030                 crc = ct[crc ^ *(data++)];
2031
2032         return(crc);
2033 }
2034
2035 static void
2036 mge_setup_multicast(struct mge_softc *sc)
2037 {
2038         uint8_t special[5] = { 0x01, 0x00, 0x5E, 0x00, 0x00 };
2039         uint8_t v = (MGE_RX_DEFAULT_QUEUE << 1) | 1;
2040         uint32_t smt[MGE_MCAST_REG_NUMBER];
2041         uint32_t omt[MGE_MCAST_REG_NUMBER];
2042         struct ifnet *ifp = sc->ifp;
2043         struct ifmultiaddr *ifma;
2044         uint8_t *mac;
2045         int i;
2046
2047         if (ifp->if_flags & IFF_ALLMULTI) {
2048                 for (i = 0; i < MGE_MCAST_REG_NUMBER; i++)
2049                         smt[i] = omt[i] = (v << 24) | (v << 16) | (v << 8) | v;
2050         } else {
2051                 memset(smt, 0, sizeof(smt));
2052                 memset(omt, 0, sizeof(omt));
2053
2054                 if_maddr_rlock(ifp);
2055                 CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
2056                         if (ifma->ifma_addr->sa_family != AF_LINK)
2057                                 continue;
2058
2059                         mac = LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
2060                         if (memcmp(mac, special, sizeof(special)) == 0) {
2061                                 i = mac[5];
2062                                 smt[i >> 2] |= v << ((i & 0x03) << 3);
2063                         } else {
2064                                 i = mge_crc8(mac, ETHER_ADDR_LEN);
2065                                 omt[i >> 2] |= v << ((i & 0x03) << 3);
2066                         }
2067                 }
2068                 if_maddr_runlock(ifp);
2069         }
2070
2071         for (i = 0; i < MGE_MCAST_REG_NUMBER; i++) {
2072                 MGE_WRITE(sc, MGE_DA_FILTER_SPEC_MCAST(i), smt[i]);
2073                 MGE_WRITE(sc, MGE_DA_FILTER_OTH_MCAST(i), omt[i]);
2074         }
2075 }
2076
2077 static void
2078 mge_set_rxic(struct mge_softc *sc)
2079 {
2080         uint32_t reg;
2081
2082         if (sc->rx_ic_time > sc->mge_rx_ipg_max)
2083                 sc->rx_ic_time = sc->mge_rx_ipg_max;
2084
2085         reg = MGE_READ(sc, MGE_SDMA_CONFIG);
2086         reg &= ~mge_rx_ipg(sc->mge_rx_ipg_max, sc->mge_ver);
2087         reg |= mge_rx_ipg(sc->rx_ic_time, sc->mge_ver);
2088         MGE_WRITE(sc, MGE_SDMA_CONFIG, reg);
2089 }
2090
2091 static void
2092 mge_set_txic(struct mge_softc *sc)
2093 {
2094         uint32_t reg;
2095
2096         if (sc->tx_ic_time > sc->mge_tfut_ipg_max)
2097                 sc->tx_ic_time = sc->mge_tfut_ipg_max;
2098
2099         reg = MGE_READ(sc, MGE_TX_FIFO_URGENT_TRSH);
2100         reg &= ~mge_tfut_ipg(sc->mge_tfut_ipg_max, sc->mge_ver);
2101         reg |= mge_tfut_ipg(sc->tx_ic_time, sc->mge_ver);
2102         MGE_WRITE(sc, MGE_TX_FIFO_URGENT_TRSH, reg);
2103 }
2104
2105 static int
2106 mge_sysctl_ic(SYSCTL_HANDLER_ARGS)
2107 {
2108         struct mge_softc *sc = (struct mge_softc *)arg1;
2109         uint32_t time;
2110         int error;
2111
2112         time = (arg2 == MGE_IC_RX) ? sc->rx_ic_time : sc->tx_ic_time; 
2113         error = sysctl_handle_int(oidp, &time, 0, req);
2114         if (error != 0)
2115                 return(error);
2116
2117         MGE_GLOBAL_LOCK(sc);
2118         if (arg2 == MGE_IC_RX) {
2119                 sc->rx_ic_time = time;
2120                 mge_set_rxic(sc);
2121         } else {
2122                 sc->tx_ic_time = time;
2123                 mge_set_txic(sc);
2124         }
2125         MGE_GLOBAL_UNLOCK(sc);
2126
2127         return(0);
2128 }
2129
2130 static void
2131 mge_add_sysctls(struct mge_softc *sc)
2132 {
2133         struct sysctl_ctx_list *ctx;
2134         struct sysctl_oid_list *children;
2135         struct sysctl_oid *tree;
2136
2137         ctx = device_get_sysctl_ctx(sc->dev);
2138         children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev));
2139         tree = SYSCTL_ADD_NODE(ctx, children, OID_AUTO, "int_coal",
2140             CTLFLAG_RD, 0, "MGE Interrupts coalescing");
2141         children = SYSCTL_CHILDREN(tree);
2142
2143         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rx_time",
2144             CTLTYPE_UINT | CTLFLAG_RW, sc, MGE_IC_RX, mge_sysctl_ic,
2145             "I", "IC RX time threshold");
2146         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tx_time",
2147             CTLTYPE_UINT | CTLFLAG_RW, sc, MGE_IC_TX, mge_sysctl_ic,
2148             "I", "IC TX time threshold");
2149 }
2150
2151 static int
2152 mge_mdio_writereg(device_t dev, int phy, int reg, int value)
2153 {
2154
2155         mv_write_ge_smi(dev, phy, reg, value);
2156
2157         return (0);
2158 }
2159
2160
2161 static int
2162 mge_mdio_readreg(device_t dev, int phy, int reg)
2163 {
2164         int ret;
2165
2166         ret = mv_read_ge_smi(dev, phy, reg);
2167
2168         return (ret);
2169 }