Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/vge/if_vge.c
Show First 20 Lines • Show All 1,701 Lines • ▼ Show 20 Lines | vge_link_statchg(void *xsc) | ||||
*/ | */ | ||||
vge_miipoll_start(sc); | vge_miipoll_start(sc); | ||||
} | } | ||||
#ifdef DEVICE_POLLING | #ifdef DEVICE_POLLING | ||||
static int | static int | ||||
vge_poll (struct ifnet *ifp, enum poll_cmd cmd, int count) | vge_poll (struct ifnet *ifp, enum poll_cmd cmd, int count) | ||||
{ | { | ||||
struct epoch_tracker et; | |||||
struct vge_softc *sc = ifp->if_softc; | struct vge_softc *sc = ifp->if_softc; | ||||
int rx_npkts = 0; | int rx_npkts = 0; | ||||
VGE_LOCK(sc); | VGE_LOCK(sc); | ||||
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) | if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) | ||||
goto done; | goto done; | ||||
NET_EPOCH_ENTER(et); | |||||
rx_npkts = vge_rxeof(sc, count); | rx_npkts = vge_rxeof(sc, count); | ||||
NET_EPOCH_EXIT(et); | |||||
vge_txeof(sc); | vge_txeof(sc); | ||||
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) | if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) | ||||
vge_start_locked(ifp); | vge_start_locked(ifp); | ||||
if (cmd == POLL_AND_CHECK_STATUS) { /* also check status register */ | if (cmd == POLL_AND_CHECK_STATUS) { /* also check status register */ | ||||
uint32_t status; | uint32_t status; | ||||
status = CSR_READ_4(sc, VGE_ISR); | status = CSR_READ_4(sc, VGE_ISR); | ||||
if (status == 0xFFFFFFFF) | if (status == 0xFFFFFFFF) | ||||
goto done; | goto done; | ||||
if (status) | if (status) | ||||
CSR_WRITE_4(sc, VGE_ISR, status); | CSR_WRITE_4(sc, VGE_ISR, status); | ||||
/* | /* | ||||
* XXX check behaviour on receiver stalls. | * XXX check behaviour on receiver stalls. | ||||
*/ | */ | ||||
if (status & VGE_ISR_TXDMA_STALL || | if (status & VGE_ISR_TXDMA_STALL || | ||||
status & VGE_ISR_RXDMA_STALL) { | status & VGE_ISR_RXDMA_STALL) { | ||||
ifp->if_drv_flags &= ~IFF_DRV_RUNNING; | ifp->if_drv_flags &= ~IFF_DRV_RUNNING; | ||||
vge_init_locked(sc); | vge_init_locked(sc); | ||||
} | } | ||||
if (status & (VGE_ISR_RXOFLOW|VGE_ISR_RXNODESC)) { | if (status & (VGE_ISR_RXOFLOW|VGE_ISR_RXNODESC)) { | ||||
struct epoch_tracker et; | |||||
NET_EPOCH_ENTER(et); | |||||
vge_rxeof(sc, count); | vge_rxeof(sc, count); | ||||
NET_EPOCH_EXIT(et); | |||||
CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_RUN); | CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_RUN); | ||||
CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_WAK); | CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_WAK); | ||||
} | } | ||||
} | } | ||||
done: | done: | ||||
VGE_UNLOCK(sc); | VGE_UNLOCK(sc); | ||||
return (rx_npkts); | return (rx_npkts); | ||||
} | } | ||||
#endif /* DEVICE_POLLING */ | #endif /* DEVICE_POLLING */ | ||||
static void | static void | ||||
vge_intr(void *arg) | vge_intr(void *arg) | ||||
{ | { | ||||
struct epoch_tracker et; | |||||
struct vge_softc *sc; | struct vge_softc *sc; | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
uint32_t status; | uint32_t status; | ||||
sc = arg; | sc = arg; | ||||
VGE_LOCK(sc); | VGE_LOCK(sc); | ||||
ifp = sc->vge_ifp; | ifp = sc->vge_ifp; | ||||
Show All 17 Lines | #endif | ||||
/* Disable interrupts */ | /* Disable interrupts */ | ||||
CSR_WRITE_1(sc, VGE_CRC3, VGE_CR3_INT_GMSK); | CSR_WRITE_1(sc, VGE_CRC3, VGE_CR3_INT_GMSK); | ||||
status = CSR_READ_4(sc, VGE_ISR); | status = CSR_READ_4(sc, VGE_ISR); | ||||
CSR_WRITE_4(sc, VGE_ISR, status | VGE_ISR_HOLDOFF_RELOAD); | CSR_WRITE_4(sc, VGE_ISR, status | VGE_ISR_HOLDOFF_RELOAD); | ||||
/* If the card has gone away the read returns 0xffff. */ | /* If the card has gone away the read returns 0xffff. */ | ||||
if (status == 0xFFFFFFFF || (status & VGE_INTRS) == 0) | if (status == 0xFFFFFFFF || (status & VGE_INTRS) == 0) | ||||
goto done; | goto done; | ||||
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { | if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { | ||||
if (status & (VGE_ISR_RXOK|VGE_ISR_RXOK_HIPRIO)) | if (status & (VGE_ISR_RXOK|VGE_ISR_RXOK_HIPRIO)) { | ||||
NET_EPOCH_ENTER(et); | |||||
vge_rxeof(sc, VGE_RX_DESC_CNT); | vge_rxeof(sc, VGE_RX_DESC_CNT); | ||||
NET_EPOCH_EXIT(et); | |||||
} | |||||
if (status & (VGE_ISR_RXOFLOW|VGE_ISR_RXNODESC)) { | if (status & (VGE_ISR_RXOFLOW|VGE_ISR_RXNODESC)) { | ||||
NET_EPOCH_ENTER(et); | |||||
vge_rxeof(sc, VGE_RX_DESC_CNT); | vge_rxeof(sc, VGE_RX_DESC_CNT); | ||||
NET_EPOCH_EXIT(et); | |||||
CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_RUN); | CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_RUN); | ||||
CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_WAK); | CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_WAK); | ||||
} | } | ||||
if (status & (VGE_ISR_TXOK0|VGE_ISR_TXOK_HIPRIO)) | if (status & (VGE_ISR_TXOK0|VGE_ISR_TXOK_HIPRIO)) | ||||
vge_txeof(sc); | vge_txeof(sc); | ||||
if (status & (VGE_ISR_TXDMA_STALL|VGE_ISR_RXDMA_STALL)) { | if (status & (VGE_ISR_TXDMA_STALL|VGE_ISR_RXDMA_STALL)) { | ||||
▲ Show 20 Lines • Show All 572 Lines • ▼ Show 20 Lines | #endif /* DEVICE_POLLING */ | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
static void | static void | ||||
vge_watchdog(void *arg) | vge_watchdog(void *arg) | ||||
{ | { | ||||
struct epoch_tracker et; | |||||
struct vge_softc *sc; | struct vge_softc *sc; | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
sc = arg; | sc = arg; | ||||
VGE_LOCK_ASSERT(sc); | VGE_LOCK_ASSERT(sc); | ||||
vge_stats_update(sc); | vge_stats_update(sc); | ||||
callout_reset(&sc->vge_watchdog, hz, vge_watchdog, sc); | callout_reset(&sc->vge_watchdog, hz, vge_watchdog, sc); | ||||
if (sc->vge_timer == 0 || --sc->vge_timer > 0) | if (sc->vge_timer == 0 || --sc->vge_timer > 0) | ||||
return; | return; | ||||
ifp = sc->vge_ifp; | ifp = sc->vge_ifp; | ||||
if_printf(ifp, "watchdog timeout\n"); | if_printf(ifp, "watchdog timeout\n"); | ||||
if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); | if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); | ||||
vge_txeof(sc); | vge_txeof(sc); | ||||
NET_EPOCH_ENTER(et); | |||||
vge_rxeof(sc, VGE_RX_DESC_CNT); | vge_rxeof(sc, VGE_RX_DESC_CNT); | ||||
NET_EPOCH_EXIT(et); | |||||
ifp->if_drv_flags &= ~IFF_DRV_RUNNING; | ifp->if_drv_flags &= ~IFF_DRV_RUNNING; | ||||
vge_init_locked(sc); | vge_init_locked(sc); | ||||
} | } | ||||
/* | /* | ||||
* Stop the adapter and free any mbufs allocated to the | * Stop the adapter and free any mbufs allocated to the | ||||
* RX and TX lists. | * RX and TX lists. | ||||
▲ Show 20 Lines • Show All 536 Lines • Show Last 20 Lines |