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