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