Lines Matching +full:fman +full:- +full:dtsec

1 /*-
2 * Copyright (c) 2011-2012 Semihalf.
63 #include "fman.h"
75 * @group dTSEC private defines.
79 * dTSEC FMan MAC exceptions info struct.
89 * @group FMan MAC routines.
92 #define DTSEC_MAC_EXCEPTIONS_END (-1)
95 * FMan MAC exceptions.
125 { e_FM_MAC_EX_1G_MAG_PCKT, "Magic Packet detected when dTSEC is in "
133 { e_FM_MAC_EX_1G_1588_TS_RX_ERR, "Time-Stamp Receive Error" },
160 device_printf(sc->sc_dev, "MDIO event %i: %s.\n", exception, in dtsec_fm_mac_mdio_event_callback()
170 device_printf(sc->sc_dev, "MAC exception %i: %s.\n", exception, in dtsec_fm_mac_exception_callback()
177 if (sc->sc_mach == NULL) in dtsec_fm_mac_free()
180 FM_MAC_Disable(sc->sc_mach, e_COMM_MODE_RX_AND_TX); in dtsec_fm_mac_free()
181 FM_MAC_Free(sc->sc_mach); in dtsec_fm_mac_free()
182 sc->sc_mach = NULL; in dtsec_fm_mac_free()
194 params.baseAddr = rman_get_bushandle(sc->sc_mem); in dtsec_fm_mac_init()
195 params.enetMode = sc->sc_mac_enet_mode; in dtsec_fm_mac_init()
196 params.macId = sc->sc_eth_id; in dtsec_fm_mac_init()
197 params.mdioIrq = sc->sc_mac_mdio_irq; in dtsec_fm_mac_init()
201 params.h_Fm = sc->sc_fmh; in dtsec_fm_mac_init()
203 sc->sc_mach = FM_MAC_Config(&params); in dtsec_fm_mac_init()
204 if (sc->sc_mach == NULL) { in dtsec_fm_mac_init()
205 device_printf(sc->sc_dev, "couldn't configure FM_MAC module.\n" in dtsec_fm_mac_init()
210 error = FM_MAC_ConfigResetOnInit(sc->sc_mach, TRUE); in dtsec_fm_mac_init()
212 device_printf(sc->sc_dev, "couldn't enable reset on init " in dtsec_fm_mac_init()
219 error = FM_MAC_ConfigException(sc->sc_mach, e_FM_MAC_EX_1G_RX_CTL, in dtsec_fm_mac_init()
222 device_printf(sc->sc_dev, "couldn't disable pause frames " in dtsec_fm_mac_init()
228 error = FM_MAC_Init(sc->sc_mach); in dtsec_fm_mac_init()
230 device_printf(sc->sc_dev, "couldn't initialize FM_MAC module." in dtsec_fm_mac_init()
242 * @group FMan PORT routines.
264 device_printf(sc->sc_dev, "RX exception: %i: %s.\n", exception, in dtsec_fm_port_rx_exception_callback()
275 device_printf(sc->sc_dev, "TX exception: %i: %s.\n", exception, in dtsec_fm_port_tx_exception_callback()
309 if (sc->sc_rxph) { in dtsec_fm_port_free_both()
310 FM_PORT_Free(sc->sc_rxph); in dtsec_fm_port_free_both()
311 sc->sc_rxph = NULL; in dtsec_fm_port_free_both()
314 if (sc->sc_txph) { in dtsec_fm_port_free_both()
315 FM_PORT_Free(sc->sc_txph); in dtsec_fm_port_free_both()
316 sc->sc_txph = NULL; in dtsec_fm_port_free_both()
335 bus_write_4(sc->sc_mem, DTSEC_REG_MAXFRM, mtu); in dtsec_set_mtu()
347 FM_MAC_AddHashMacAddr(sc->sc_mach, (t_EnetAddr *)LLADDR(sdl)); in dtsec_hash_maddr()
357 if (if_getflags(sc->sc_ifnet) & IFF_ALLMULTI) { in dtsec_setup_multicast()
359 bus_write_4(sc->sc_mem, DTSEC_REG_GADDR(i), 0xFFFFFFFF); in dtsec_setup_multicast()
364 fman_dtsec_reset_filter_table(rman_get_virtual(sc->sc_mem), in dtsec_setup_multicast()
366 if_foreach_llmaddr(sc->sc_ifnet, dtsec_hash_maddr, sc); in dtsec_setup_multicast()
376 error = FM_MAC_Enable(sc->sc_mach, e_COMM_MODE_RX_AND_TX); in dtsec_if_enable_locked()
380 error = FM_PORT_Enable(sc->sc_rxph); in dtsec_if_enable_locked()
384 error = FM_PORT_Enable(sc->sc_txph); in dtsec_if_enable_locked()
390 if_setdrvflagbits(sc->sc_ifnet, IFF_DRV_RUNNING, 0); in dtsec_if_enable_locked()
393 dtsec_miibus_statchg(sc->sc_dev); in dtsec_if_enable_locked()
405 error = FM_MAC_Disable(sc->sc_mach, e_COMM_MODE_RX_AND_TX); in dtsec_if_disable_locked()
409 error = FM_PORT_Disable(sc->sc_rxph); in dtsec_if_disable_locked()
413 error = FM_PORT_Disable(sc->sc_txph); in dtsec_if_disable_locked()
417 if_setdrvflagbits(sc->sc_ifnet, 0, IFF_DRV_RUNNING); in dtsec_if_disable_locked()
437 if (dtsec_set_mtu(sc, ifr->ifr_mtu)) in dtsec_if_ioctl()
438 if_setmtu(ifp, ifr->ifr_mtu); in dtsec_if_ioctl()
446 if (if_getflags(sc->sc_ifnet) & IFF_UP) in dtsec_if_ioctl()
456 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii->mii_media, in dtsec_if_ioctl()
477 mii_tick(sc->sc_mii); in dtsec_if_tick()
478 callout_reset(&sc->sc_tick_callout, hz, dtsec_if_tick, sc); in dtsec_if_tick()
490 callout_drain(&sc->sc_tick_callout); in dtsec_if_deinit_locked()
502 error = FM_MAC_ModifyMacAddr(sc->sc_mach, in dtsec_if_init_locked()
503 (t_EnetAddr *)if_getlladdr(sc->sc_ifnet)); in dtsec_if_init_locked()
505 device_printf(sc->sc_dev, "couldn't set MAC address.\n"); in dtsec_if_init_locked()
510 if (sc->sc_mii) in dtsec_if_init_locked()
511 callout_reset(&sc->sc_tick_callout, hz, dtsec_if_tick, sc); in dtsec_if_init_locked()
513 if (if_getflags(sc->sc_ifnet) & IFF_UP) { in dtsec_if_init_locked()
527 device_printf(sc->sc_dev, "initialization error.\n"); in dtsec_if_init_locked()
550 sc->sc_start_locked(sc); in dtsec_if_start()
572 mii_mediachg(sc->sc_mii); in dtsec_ifmedia_upd()
585 mii_pollstat(sc->sc_mii); in dtsec_ifmedia_sts()
587 ifmr->ifm_active = sc->sc_mii->mii_media_active; in dtsec_ifmedia_sts()
588 ifmr->ifm_status = sc->sc_mii->mii_media_status; in dtsec_ifmedia_sts()
596 * @group dTSEC bus interface.
605 device_get_nameunit(sc->sc_dev)); in dtsec_configure_mode()
607 sc->sc_mode = DTSEC_MODE_REGULAR; in dtsec_configure_mode()
608 TUNABLE_INT_FETCH(tunable, &sc->sc_mode); in dtsec_configure_mode()
610 if (sc->sc_mode == DTSEC_MODE_REGULAR) { in dtsec_configure_mode()
611 sc->sc_port_rx_init = dtsec_rm_fm_port_rx_init; in dtsec_configure_mode()
612 sc->sc_port_tx_init = dtsec_rm_fm_port_tx_init; in dtsec_configure_mode()
613 sc->sc_start_locked = dtsec_rm_if_start_locked; in dtsec_configure_mode()
615 sc->sc_port_rx_init = dtsec_im_fm_port_rx_init; in dtsec_configure_mode()
616 sc->sc_port_tx_init = dtsec_im_fm_port_tx_init; in dtsec_configure_mode()
617 sc->sc_start_locked = dtsec_im_if_start_locked; in dtsec_configure_mode()
620 device_printf(sc->sc_dev, "Configured for %s mode.\n", in dtsec_configure_mode()
621 (sc->sc_mode == DTSEC_MODE_REGULAR) ? "regular" : "independent"); in dtsec_configure_mode()
635 sc->sc_dev = dev; in dtsec_attach()
636 sc->sc_mac_mdio_irq = NO_IRQ; in dtsec_attach()
643 mtx_init(&sc->sc_lock, device_get_nameunit(dev), in dtsec_attach()
644 "DTSEC Global Lock", MTX_DEF); in dtsec_attach()
646 mtx_init(&sc->sc_mii_lock, device_get_nameunit(dev), in dtsec_attach()
647 "DTSEC MII Lock", MTX_DEF); in dtsec_attach()
650 callout_init(&sc->sc_tick_callout, CALLOUT_MPSAFE); in dtsec_attach()
653 if ((error = fman_get_handle(parent, &sc->sc_fmh)) != 0) in dtsec_attach()
656 if ((error = fman_get_muram_handle(parent, &sc->sc_muramh)) != 0) in dtsec_attach()
659 if ((error = fman_get_bushandle(parent, &sc->sc_fm_base)) != 0) in dtsec_attach()
666 if (sc->sc_mode == DTSEC_MODE_REGULAR) { in dtsec_attach()
688 /* Init FMan MAC module. */ in dtsec_attach()
689 error = dtsec_fm_mac_init(sc, sc->sc_mac_addr); in dtsec_attach()
695 /* Init FMan TX port */ in dtsec_attach()
696 error = sc->sc_port_tx_init(sc, device_get_unit(sc->sc_dev)); in dtsec_attach()
702 /* Init FMan RX port */ in dtsec_attach()
703 error = sc->sc_port_rx_init(sc, device_get_unit(sc->sc_dev)); in dtsec_attach()
710 ifp = sc->sc_ifnet = if_alloc(IFT_ETHER); in dtsec_attach()
719 if (sc->sc_phy_addr >= 0) in dtsec_attach()
720 if_initname(ifp, device_get_name(sc->sc_dev), in dtsec_attach()
721 device_get_unit(sc->sc_dev)); in dtsec_attach()
723 if_initname(ifp, "dtsec_phy", device_get_unit(sc->sc_dev)); in dtsec_attach()
727 if_setsendqlen(ifp, TSEC_TX_NUM_DESC - 1); in dtsec_attach()
735 error = mii_attach(sc->sc_dev, &sc->sc_mii_dev, ifp, dtsec_ifmedia_upd, in dtsec_attach()
736 dtsec_ifmedia_sts, BMSR_DEFCAPMASK, sc->sc_phy_addr, in dtsec_attach()
739 device_printf(sc->sc_dev, "attaching PHYs failed: %d\n", error); in dtsec_attach()
740 dtsec_detach(sc->sc_dev); in dtsec_attach()
743 sc->sc_mii = device_get_softc(sc->sc_mii_dev); in dtsec_attach()
746 ether_ifattach(ifp, sc->sc_mac_addr); in dtsec_attach()
758 ifp = sc->sc_ifnet; in dtsec_detach()
768 if (sc->sc_ifnet) { in dtsec_detach()
769 if_free(sc->sc_ifnet); in dtsec_detach()
770 sc->sc_ifnet = NULL; in dtsec_detach()
773 if (sc->sc_mode == DTSEC_MODE_REGULAR) { in dtsec_detach()
789 mtx_destroy(&sc->sc_lock); in dtsec_detach()
828 return (MIIBUS_READREG(sc->sc_mdio, phy, reg)); in dtsec_miibus_readreg()
839 return (MIIBUS_WRITEREG(sc->sc_mdio, phy, reg, value)); in dtsec_miibus_writereg()
854 duplex = ((sc->sc_mii->mii_media_active & IFM_GMASK) == IFM_FDX); in dtsec_miibus_statchg()
856 switch (IFM_SUBTYPE(sc->sc_mii->mii_media_active)) { in dtsec_miibus_statchg()
874 error = FM_MAC_AdjustLink(sc->sc_mach, speed, duplex); in dtsec_miibus_statchg()
876 device_printf(sc->sc_dev, "error while adjusting MAC speed.\n"); in dtsec_miibus_statchg()