Lines Matching full:sc

81 #define	XAE_LOCK(sc)			mtx_lock(&(sc)->mtx)  argument
82 #define XAE_UNLOCK(sc) mtx_unlock(&(sc)->mtx) argument
83 #define XAE_ASSERT_LOCKED(sc) mtx_assert(&(sc)->mtx, MA_OWNED) argument
84 #define XAE_ASSERT_UNLOCKED(sc) mtx_assert(&(sc)->mtx, MA_NOTOWNED) argument
102 #define PHY1_RD(sc, _r) \ argument
103 xae_miibus_read_reg(sc->dev, 1, _r)
104 #define PHY1_WR(sc, _r, _v) \ argument
105 xae_miibus_write_reg(sc->dev, 1, _r, _v)
107 #define PHY_RD(sc, _r) \ argument
108 xae_miibus_read_reg(sc->dev, sc->phy_addr, _r)
109 #define PHY_WR(sc, _r, _v) \ argument
110 xae_miibus_write_reg(sc->dev, sc->phy_addr, _r, _v)
113 #define WRITE_TI_EREG(sc, reg, data) { \ argument
114 PHY_WR(sc, MII_MMDACR, MMDACR_DADDRMASK); \
115 PHY_WR(sc, MII_MMDAADR, reg); \
116 PHY_WR(sc, MII_MMDACR, MMDACR_DADDRMASK | MMDACR_FN_DATANPI); \
117 PHY_WR(sc, MII_MMDAADR, data); \
131 static void xae_stop_locked(struct xae_softc *sc);
132 static void xae_setup_rxfilter(struct xae_softc *sc);
135 xae_rx_enqueue(struct xae_softc *sc, uint32_t n) in xae_rx_enqueue() argument
143 device_printf(sc->dev, in xae_rx_enqueue()
149 xdma_enqueue_mbuf(sc->xchan_rx, &m, 0, 4, 4, XDMA_DEV_TO_MEM); in xae_rx_enqueue()
180 struct xae_softc *sc; in xae_xdma_tx_intr() local
185 sc = arg; in xae_xdma_tx_intr()
187 XAE_LOCK(sc); in xae_xdma_tx_intr()
189 ifp = sc->ifp; in xae_xdma_tx_intr()
192 err = xdma_dequeue_mbuf(sc->xchan_tx, &m, &st); in xae_xdma_tx_intr()
206 XAE_UNLOCK(sc); in xae_xdma_tx_intr()
215 struct xae_softc *sc; in xae_xdma_rx_intr() local
221 sc = arg; in xae_xdma_rx_intr()
225 XAE_LOCK(sc); in xae_xdma_rx_intr()
227 ifp = sc->ifp; in xae_xdma_rx_intr()
231 err = xdma_dequeue_mbuf(sc->xchan_rx, &m, &st); in xae_xdma_rx_intr()
245 XAE_UNLOCK(sc); in xae_xdma_rx_intr()
247 XAE_LOCK(sc); in xae_xdma_rx_intr()
250 xae_rx_enqueue(sc, cnt_processed); in xae_xdma_rx_intr()
252 XAE_UNLOCK(sc); in xae_xdma_rx_intr()
265 struct xae_softc *sc; in xae_transmit_locked() local
273 sc = if_getsoftc(ifp); in xae_transmit_locked()
274 br = sc->br; in xae_transmit_locked()
279 error = xdma_enqueue_mbuf(sc->xchan_tx, in xae_transmit_locked()
296 xdma_queue_submit(sc->xchan_tx); in xae_transmit_locked()
304 struct xae_softc *sc; in xae_transmit() local
309 sc = if_getsoftc(ifp); in xae_transmit()
311 XAE_LOCK(sc); in xae_transmit()
313 error = drbr_enqueue(ifp, sc->br, m); in xae_transmit()
315 XAE_UNLOCK(sc); in xae_transmit()
321 XAE_UNLOCK(sc); in xae_transmit()
325 if (!sc->link_is_up) { in xae_transmit()
326 XAE_UNLOCK(sc); in xae_transmit()
332 XAE_UNLOCK(sc); in xae_transmit()
338 xae_stop_locked(struct xae_softc *sc) in xae_stop_locked() argument
343 XAE_ASSERT_LOCKED(sc); in xae_stop_locked()
345 ifp = sc->ifp; in xae_stop_locked()
348 callout_stop(&sc->xae_callout); in xae_stop_locked()
351 reg = READ4(sc, XAE_TC); in xae_stop_locked()
353 WRITE4(sc, XAE_TC, reg); in xae_stop_locked()
356 reg = READ4(sc, XAE_RCW1); in xae_stop_locked()
358 WRITE4(sc, XAE_RCW1, reg); in xae_stop_locked()
362 xae_stat(struct xae_softc *sc, int counter_id) in xae_stat() argument
370 new = READ8(sc, XAE_STATCNT(counter_id)); in xae_stat()
371 old = sc->counters[counter_id]; in xae_stat()
377 sc->counters[counter_id] = new; in xae_stat()
383 xae_harvest_stats(struct xae_softc *sc) in xae_harvest_stats() argument
387 ifp = sc->ifp; in xae_harvest_stats()
389 if_inc_counter(ifp, IFCOUNTER_IPACKETS, xae_stat(sc, RX_GOOD_FRAMES)); in xae_harvest_stats()
390 if_inc_counter(ifp, IFCOUNTER_IMCASTS, xae_stat(sc, RX_GOOD_MCASTS)); in xae_harvest_stats()
392 xae_stat(sc, RX_FRAME_CHECK_SEQ_ERROR) + in xae_harvest_stats()
393 xae_stat(sc, RX_LEN_OUT_OF_RANGE) + in xae_harvest_stats()
394 xae_stat(sc, RX_ALIGNMENT_ERRORS)); in xae_harvest_stats()
396 if_inc_counter(ifp, IFCOUNTER_OBYTES, xae_stat(sc, TX_BYTES)); in xae_harvest_stats()
397 if_inc_counter(ifp, IFCOUNTER_OPACKETS, xae_stat(sc, TX_GOOD_FRAMES)); in xae_harvest_stats()
398 if_inc_counter(ifp, IFCOUNTER_OMCASTS, xae_stat(sc, TX_GOOD_MCASTS)); in xae_harvest_stats()
400 xae_stat(sc, TX_GOOD_UNDERRUN_ERRORS)); in xae_harvest_stats()
403 xae_stat(sc, TX_SINGLE_COLLISION_FRAMES) + in xae_harvest_stats()
404 xae_stat(sc, TX_MULTI_COLLISION_FRAMES) + in xae_harvest_stats()
405 xae_stat(sc, TX_LATE_COLLISIONS) + in xae_harvest_stats()
406 xae_stat(sc, TX_EXCESS_COLLISIONS)); in xae_harvest_stats()
412 struct xae_softc *sc; in xae_tick() local
416 sc = arg; in xae_tick()
418 XAE_ASSERT_LOCKED(sc); in xae_tick()
420 ifp = sc->ifp; in xae_tick()
426 xae_harvest_stats(sc); in xae_tick()
429 link_was_up = sc->link_is_up; in xae_tick()
430 mii_tick(sc->mii_softc); in xae_tick()
431 if (sc->link_is_up && !link_was_up) in xae_tick()
432 xae_transmit_locked(sc->ifp); in xae_tick()
435 callout_reset(&sc->xae_callout, hz, xae_tick, sc); in xae_tick()
439 xae_init_locked(struct xae_softc *sc) in xae_init_locked() argument
443 XAE_ASSERT_LOCKED(sc); in xae_init_locked()
445 ifp = sc->ifp; in xae_init_locked()
451 xae_setup_rxfilter(sc); in xae_init_locked()
454 WRITE4(sc, XAE_TC, TC_TX); in xae_init_locked()
457 WRITE4(sc, XAE_RCW1, RCW1_RX); in xae_init_locked()
463 mii_mediachg(sc->mii_softc); in xae_init_locked()
464 callout_reset(&sc->xae_callout, hz, xae_tick, sc); in xae_init_locked()
470 struct xae_softc *sc; in xae_init() local
472 sc = arg; in xae_init()
474 XAE_LOCK(sc); in xae_init()
475 xae_init_locked(sc); in xae_init()
476 XAE_UNLOCK(sc); in xae_init()
482 struct xae_softc *sc; in xae_media_status() local
485 sc = if_getsoftc(ifp); in xae_media_status()
486 mii = sc->mii_softc; in xae_media_status()
488 XAE_LOCK(sc); in xae_media_status()
492 XAE_UNLOCK(sc); in xae_media_status()
496 xae_media_change_locked(struct xae_softc *sc) in xae_media_change_locked() argument
499 return (mii_mediachg(sc->mii_softc)); in xae_media_change_locked()
505 struct xae_softc *sc; in xae_media_change() local
508 sc = if_getsoftc(ifp); in xae_media_change()
510 XAE_LOCK(sc); in xae_media_change()
511 error = xae_media_change_locked(sc); in xae_media_change()
512 XAE_UNLOCK(sc); in xae_media_change()
520 struct xae_softc *sc = arg; in xae_write_maddr() local
529 reg = READ4(sc, XAE_FFC) & 0xffffff00; in xae_write_maddr()
531 WRITE4(sc, XAE_FFC, reg); in xae_write_maddr()
537 WRITE4(sc, XAE_FFV(0), reg); in xae_write_maddr()
541 WRITE4(sc, XAE_FFV(1), reg); in xae_write_maddr()
547 xae_setup_rxfilter(struct xae_softc *sc) in xae_setup_rxfilter() argument
552 XAE_ASSERT_LOCKED(sc); in xae_setup_rxfilter()
554 ifp = sc->ifp; in xae_setup_rxfilter()
560 reg = READ4(sc, XAE_FFC); in xae_setup_rxfilter()
562 WRITE4(sc, XAE_FFC, reg); in xae_setup_rxfilter()
564 reg = READ4(sc, XAE_FFC); in xae_setup_rxfilter()
566 WRITE4(sc, XAE_FFC, reg); in xae_setup_rxfilter()
568 if_foreach_llmaddr(ifp, xae_write_maddr, sc); in xae_setup_rxfilter()
574 reg = sc->macaddr[0]; in xae_setup_rxfilter()
575 reg |= (sc->macaddr[1] << 8); in xae_setup_rxfilter()
576 reg |= (sc->macaddr[2] << 16); in xae_setup_rxfilter()
577 reg |= (sc->macaddr[3] << 24); in xae_setup_rxfilter()
578 WRITE4(sc, XAE_UAW0, reg); in xae_setup_rxfilter()
580 reg = sc->macaddr[4]; in xae_setup_rxfilter()
581 reg |= (sc->macaddr[5] << 8); in xae_setup_rxfilter()
582 WRITE4(sc, XAE_UAW1, reg); in xae_setup_rxfilter()
588 struct xae_softc *sc; in xae_ioctl() local
593 sc = if_getsoftc(ifp); in xae_ioctl()
599 XAE_LOCK(sc); in xae_ioctl()
602 if ((if_getflags(ifp) ^ sc->if_flags) & in xae_ioctl()
604 xae_setup_rxfilter(sc); in xae_ioctl()
606 if (!sc->is_detaching) in xae_ioctl()
607 xae_init_locked(sc); in xae_ioctl()
611 xae_stop_locked(sc); in xae_ioctl()
613 sc->if_flags = if_getflags(ifp); in xae_ioctl()
614 XAE_UNLOCK(sc); in xae_ioctl()
619 XAE_LOCK(sc); in xae_ioctl()
620 xae_setup_rxfilter(sc); in xae_ioctl()
621 XAE_UNLOCK(sc); in xae_ioctl()
626 mii = sc->mii_softc; in xae_ioctl()
652 xae_get_hwaddr(struct xae_softc *sc, uint8_t *hwaddr) in xae_get_hwaddr() argument
657 node = ofw_bus_get_node(sc->dev); in xae_get_hwaddr()
673 mdio_wait(struct xae_softc *sc) in mdio_wait() argument
681 reg = READ4(sc, XAE_MDIO_CTRL); in mdio_wait()
698 struct xae_softc *sc; in xae_miibus_read_reg() local
702 sc = device_get_softc(dev); in xae_miibus_read_reg()
704 if (mdio_wait(sc)) in xae_miibus_read_reg()
711 WRITE4(sc, XAE_MDIO_CTRL, mii); in xae_miibus_read_reg()
713 if (mdio_wait(sc)) in xae_miibus_read_reg()
716 rv = READ4(sc, XAE_MDIO_READ); in xae_miibus_read_reg()
724 struct xae_softc *sc; in xae_miibus_write_reg() local
727 sc = device_get_softc(dev); in xae_miibus_write_reg()
729 if (mdio_wait(sc)) in xae_miibus_write_reg()
736 WRITE4(sc, XAE_MDIO_WRITE, val); in xae_miibus_write_reg()
737 WRITE4(sc, XAE_MDIO_CTRL, mii); in xae_miibus_write_reg()
739 if (mdio_wait(sc)) in xae_miibus_write_reg()
746 xae_phy_fixup(struct xae_softc *sc) in xae_phy_fixup() argument
751 WRITE_TI_EREG(sc, DP83867_SGMIICTL1, SGMIICTL1_SGMII_6W); in xae_phy_fixup()
752 PHY_WR(sc, DP83867_PHYCR, PHYCR_SGMII_EN); in xae_phy_fixup()
754 reg = PHY_RD(sc, DP83867_CFG2); in xae_phy_fixup()
760 PHY_WR(sc, DP83867_CFG2, reg); in xae_phy_fixup()
762 WRITE_TI_EREG(sc, DP83867_CFG4, CFG4_SGMII_TMR); in xae_phy_fixup()
763 PHY_WR(sc, MII_BMCR, in xae_phy_fixup()
765 } while (PHY1_RD(sc, MII_BMCR) == 0x0ffff); in xae_phy_fixup()
768 PHY1_WR(sc, MII_BMCR, in xae_phy_fixup()
771 } while ((PHY1_RD(sc, MII_BMSR) & BMSR_ACOMP) == 0); in xae_phy_fixup()
775 get_xdma_std(struct xae_softc *sc) in get_xdma_std() argument
778 sc->xdma_tx = xdma_ofw_get(sc->dev, "tx"); in get_xdma_std()
779 if (sc->xdma_tx == NULL) in get_xdma_std()
782 sc->xdma_rx = xdma_ofw_get(sc->dev, "rx"); in get_xdma_std()
783 if (sc->xdma_rx == NULL) { in get_xdma_std()
784 xdma_put(sc->xdma_tx); in get_xdma_std()
792 get_xdma_axistream(struct xae_softc *sc) in get_xdma_axistream() argument
800 node = ofw_bus_get_node(sc->dev); in get_xdma_axistream()
803 device_printf(sc->dev, in get_xdma_axistream()
809 device_printf(sc->dev, "Could not get DMA device by xref.\n"); in get_xdma_axistream()
813 sc->xdma_tx = xdma_get(sc->dev, dma_dev); in get_xdma_axistream()
814 if (sc->xdma_tx == NULL) { in get_xdma_axistream()
815 device_printf(sc->dev, "Could not find DMA controller.\n"); in get_xdma_axistream()
821 sc->xdma_tx->data = data; in get_xdma_axistream()
823 sc->xdma_rx = xdma_get(sc->dev, dma_dev); in get_xdma_axistream()
824 if (sc->xdma_rx == NULL) { in get_xdma_axistream()
825 device_printf(sc->dev, "Could not find DMA controller.\n"); in get_xdma_axistream()
831 sc->xdma_rx->data = data; in get_xdma_axistream()
837 setup_xdma(struct xae_softc *sc) in setup_xdma() argument
845 dev = sc->dev; in setup_xdma()
848 error = get_xdma_std(sc); in setup_xdma()
851 device_printf(sc->dev, in setup_xdma()
853 error = get_xdma_axistream(sc); in setup_xdma()
862 sc->xchan_tx = xdma_channel_alloc(sc->xdma_tx, 0); in setup_xdma()
863 if (sc->xchan_tx == NULL) { in setup_xdma()
869 error = xdma_setup_intr(sc->xchan_tx, 0, in setup_xdma()
870 xae_xdma_tx_intr, sc, &sc->ih_tx); in setup_xdma()
872 device_printf(sc->dev, in setup_xdma()
878 sc->xchan_rx = xdma_channel_alloc(sc->xdma_rx, 0); in setup_xdma()
879 if (sc->xchan_rx == NULL) { in setup_xdma()
885 error = xdma_setup_intr(sc->xchan_rx, XDMA_INTR_NET, in setup_xdma()
886 xae_xdma_rx_intr, sc, &sc->ih_rx); in setup_xdma()
888 device_printf(sc->dev, in setup_xdma()
905 xchan_set_memory(sc->xchan_tx, vmem); in setup_xdma()
906 xchan_set_memory(sc->xchan_rx, vmem); in setup_xdma()
908 xdma_prep_sg(sc->xchan_tx, in setup_xdma()
917 xdma_prep_sg(sc->xchan_rx, in setup_xdma()
947 struct xae_softc *sc; in xae_attach() local
953 sc = device_get_softc(dev); in xae_attach()
954 sc->dev = dev; in xae_attach()
957 if (setup_xdma(sc) != 0) { in xae_attach()
962 mtx_init(&sc->mtx, device_get_nameunit(sc->dev), in xae_attach()
965 sc->br = buf_ring_alloc(BUFRING_SIZE, M_DEVBUF, in xae_attach()
966 M_NOWAIT, &sc->mtx); in xae_attach()
967 if (sc->br == NULL) in xae_attach()
970 if (bus_alloc_resources(dev, xae_spec, sc->res)) { in xae_attach()
976 sc->bst = rman_get_bustag(sc->res[0]); in xae_attach()
977 sc->bsh = rman_get_bushandle(sc->res[0]); in xae_attach()
979 device_printf(sc->dev, "Identification: %x\n", in xae_attach()
980 READ4(sc, XAE_IDENT)); in xae_attach()
983 if (xae_get_hwaddr(sc, sc->macaddr)) { in xae_attach()
984 device_printf(sc->dev, "can't get mac\n"); in xae_attach()
991 WRITE4(sc, XAE_MDIO_SETUP, reg); in xae_attach()
992 if (mdio_wait(sc)) in xae_attach()
995 callout_init_mtx(&sc->xae_callout, &sc->mtx, 0); in xae_attach()
998 error = bus_setup_intr(dev, sc->res[1], INTR_TYPE_NET | INTR_MPSAFE, in xae_attach()
999 NULL, xae_intr, sc, &sc->intr_cookie); in xae_attach()
1006 sc->ifp = ifp = if_alloc(IFT_ETHER); in xae_attach()
1007 if_setsoftc(ifp, sc); in xae_attach()
1019 if (xae_get_phyaddr(node, &sc->phy_addr) != 0) in xae_attach()
1023 error = mii_attach(dev, &sc->miibus, ifp, xae_media_change, in xae_attach()
1024 xae_media_status, BMSR_DEFCAPMASK, sc->phy_addr, in xae_attach()
1031 sc->mii_softc = device_get_softc(sc->miibus); in xae_attach()
1035 xae_phy_fixup(sc); in xae_attach()
1038 ether_ifattach(ifp, sc->macaddr); in xae_attach()
1039 sc->is_attached = true; in xae_attach()
1041 xae_rx_enqueue(sc, NUM_RX_MBUF); in xae_attach()
1042 xdma_queue_submit(sc->xchan_rx); in xae_attach()
1050 struct xae_softc *sc; in xae_detach() local
1053 sc = device_get_softc(dev); in xae_detach()
1055 KASSERT(mtx_initialized(&sc->mtx), ("%s: mutex not initialized", in xae_detach()
1058 ifp = sc->ifp; in xae_detach()
1062 XAE_LOCK(sc); in xae_detach()
1063 xae_stop_locked(sc); in xae_detach()
1064 XAE_UNLOCK(sc); in xae_detach()
1065 callout_drain(&sc->xae_callout); in xae_detach()
1074 mtx_destroy(&sc->mtx); in xae_detach()
1076 bus_teardown_intr(dev, sc->res[1], sc->intr_cookie); in xae_detach()
1078 bus_release_resources(dev, xae_spec, sc->res); in xae_detach()
1080 xdma_channel_free(sc->xchan_tx); in xae_detach()
1081 xdma_channel_free(sc->xchan_rx); in xae_detach()
1082 xdma_put(sc->xdma_tx); in xae_detach()
1083 xdma_put(sc->xdma_rx); in xae_detach()
1091 struct xae_softc *sc; in xae_miibus_statchg() local
1100 sc = device_get_softc(dev); in xae_miibus_statchg()
1102 XAE_ASSERT_LOCKED(sc); in xae_miibus_statchg()
1104 mii = sc->mii_softc; in xae_miibus_statchg()
1107 sc->link_is_up = true; in xae_miibus_statchg()
1109 sc->link_is_up = false; in xae_miibus_statchg()
1123 sc->link_is_up = false; in xae_miibus_statchg()
1126 sc->link_is_up = false; in xae_miibus_statchg()
1132 WRITE4(sc, XAE_SPEED, reg); in xae_miibus_statchg()