Lines Matching +full:axistream +full:- +full:connected
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2019-2025 Ruslan Bukin <br@bsdpad.com>
8 * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
72 bus_read_4((_sc)->res[0], _reg)
74 bus_write_4((_sc)->res[0], _reg, _val)
77 bus_read_8((_sc)->res[0], _reg)
79 bus_write_8((_sc)->res[0], _reg, _val)
81 #define XAE_LOCK(sc) mtx_lock(&(sc)->mtx)
82 #define XAE_UNLOCK(sc) mtx_unlock(&(sc)->mtx)
83 #define XAE_ASSERT_LOCKED(sc) mtx_assert(&(sc)->mtx, MA_OWNED)
84 #define XAE_ASSERT_UNLOCKED(sc) mtx_assert(&(sc)->mtx, MA_NOTOWNED)
103 xae_miibus_read_reg(sc->dev, 1, _r)
105 xae_miibus_write_reg(sc->dev, 1, _r, _v)
108 xae_miibus_read_reg(sc->dev, sc->phy_addr, _r)
110 xae_miibus_write_reg(sc->dev, sc->phy_addr, _r, _v)
128 { -1, 0 }
143 device_printf(sc->dev, in xae_rx_enqueue()
145 return (-1); in xae_rx_enqueue()
148 m->m_pkthdr.len = m->m_len = m->m_ext.ext_size; in xae_rx_enqueue()
149 xdma_enqueue_mbuf(sc->xchan_rx, &m, 0, 4, 4, XDMA_DEV_TO_MEM); in xae_rx_enqueue()
161 if (OF_getencprop(node, "phy-handle", (void *)&phy_handle, in xae_get_phyaddr()
189 ifp = sc->ifp; in xae_xdma_tx_intr()
192 err = xdma_dequeue_mbuf(sc->xchan_tx, &m, &st); in xae_xdma_tx_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()
243 m->m_pkthdr.len = m->m_len = st.transferred; in xae_xdma_rx_intr()
244 m->m_pkthdr.rcvif = ifp; in xae_xdma_rx_intr()
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()
313 error = drbr_enqueue(ifp, sc->br, m); in xae_transmit()
325 if (!sc->link_is_up) { in xae_transmit()
345 ifp = sc->ifp; in xae_stop_locked()
348 callout_stop(&sc->xae_callout); in xae_stop_locked()
371 old = sc->counters[counter_id]; in xae_stat()
374 delta = new - old; in xae_stat()
376 delta = UINT64_MAX - old + new; in xae_stat()
377 sc->counters[counter_id] = new; in xae_stat()
387 ifp = sc->ifp; in xae_harvest_stats()
420 ifp = sc->ifp; 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()
445 ifp = sc->ifp; 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()
486 mii = sc->mii_softc; in xae_media_status()
490 ifmr->ifm_active = mii->mii_media_active; in xae_media_status()
491 ifmr->ifm_status = mii->mii_media_status; in xae_media_status()
499 return (mii_mediachg(sc->mii_softc)); in xae_media_change_locked()
554 ifp = sc->ifp; 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()
580 reg = sc->macaddr[4]; in xae_setup_rxfilter()
581 reg |= (sc->macaddr[5] << 8); in xae_setup_rxfilter()
602 if ((if_getflags(ifp) ^ sc->if_flags) & in xae_ioctl()
606 if (!sc->is_detaching) in xae_ioctl()
613 sc->if_flags = if_getflags(ifp); in xae_ioctl()
626 mii = sc->mii_softc; in xae_ioctl()
627 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd); in xae_ioctl()
630 mask = if_getcapenable(ifp) ^ ifr->ifr_reqcap; in xae_ioctl()
657 node = ofw_bus_get_node(sc->dev); in xae_get_hwaddr()
660 if ((len = OF_getproplen(node, "local-mac-address")) <= 0) in xae_get_hwaddr()
666 OF_getprop(node, "local-mac-address", hwaddr, in xae_get_hwaddr()
685 } while (timeout--); in mdio_wait()
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()
800 node = ofw_bus_get_node(sc->dev); in get_xdma_axistream()
801 len = OF_getencprop(node, "axistream-connected", &prop, sizeof(prop)); in get_xdma_axistream()
803 device_printf(sc->dev, in get_xdma_axistream()
804 "%s: Couldn't get axistream-connected prop.\n", __func__); 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()
820 data->id = AXIDMA_TX_CHAN; 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()
830 data->id = AXIDMA_RX_CHAN; in get_xdma_axistream()
831 sc->xdma_rx->data = data; in get_xdma_axistream()
845 dev = sc->dev; in setup_xdma()
851 device_printf(sc->dev, in setup_xdma()
852 "Fallback to axistream-connected property\n"); 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()
936 if (!ofw_bus_is_compatible(dev, "xlnx,axi-ethernet-1.00.a")) in xae_probe()
954 sc->dev = dev; 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()
983 if (xae_get_hwaddr(sc, sc->macaddr)) { in xae_attach()
984 device_printf(sc->dev, "can't get mac\n"); 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()
1016 if_setsendqlen(ifp, TX_DESC_COUNT - 1); 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()
1038 ether_ifattach(ifp, sc->macaddr); in xae_attach()
1039 sc->is_attached = true; in xae_attach()
1042 xdma_queue_submit(sc->xchan_rx); in xae_attach()
1055 KASSERT(mtx_initialized(&sc->mtx), ("%s: mutex not initialized", in xae_detach()
1058 ifp = sc->ifp; 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()
1104 mii = sc->mii_softc; in xae_miibus_statchg()
1106 if (mii->mii_media_status & IFM_ACTIVE) in xae_miibus_statchg()
1107 sc->link_is_up = true; in xae_miibus_statchg()
1109 sc->link_is_up = false; in xae_miibus_statchg()
1111 switch (IFM_SUBTYPE(mii->mii_media_active)) { in xae_miibus_statchg()
1123 sc->link_is_up = false; in xae_miibus_statchg()
1126 sc->link_is_up = false; in xae_miibus_statchg()
1128 IFM_SUBTYPE(mii->mii_media_active)); in xae_miibus_statchg()