Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/smc/if_smc.c
Show First 20 Lines • Show All 554 Lines • ▼ Show 20 Lines | smc_start_locked(struct ifnet *ifp) | ||||
*/ | */ | ||||
if (spin_count == 0) { | if (spin_count == 0) { | ||||
sc->smc_mask |= ALLOC_INT; | sc->smc_mask |= ALLOC_INT; | ||||
if ((ifp->if_capenable & IFCAP_POLLING) == 0) | if ((ifp->if_capenable & IFCAP_POLLING) == 0) | ||||
smc_write_1(sc, MSK, sc->smc_mask); | smc_write_1(sc, MSK, sc->smc_mask); | ||||
return; | return; | ||||
} | } | ||||
taskqueue_enqueue_fast(sc->smc_tq, &sc->smc_tx); | taskqueue_enqueue(sc->smc_tq, &sc->smc_tx); | ||||
} | } | ||||
static void | static void | ||||
smc_task_tx(void *context, int pending) | smc_task_tx(void *context, int pending) | ||||
{ | { | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
struct smc_softc *sc; | struct smc_softc *sc; | ||||
struct mbuf *m, *m0; | struct mbuf *m, *m0; | ||||
▲ Show 20 Lines • Show All 220 Lines • ▼ Show 20 Lines | smc_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) | ||||
SMC_LOCK(sc); | SMC_LOCK(sc); | ||||
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { | if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { | ||||
SMC_UNLOCK(sc); | SMC_UNLOCK(sc); | ||||
return; | return; | ||||
} | } | ||||
SMC_UNLOCK(sc); | SMC_UNLOCK(sc); | ||||
if (cmd == POLL_AND_CHECK_STATUS) | if (cmd == POLL_AND_CHECK_STATUS) | ||||
taskqueue_enqueue_fast(sc->smc_tq, &sc->smc_intr); | taskqueue_enqueue(sc->smc_tq, &sc->smc_intr); | ||||
} | } | ||||
#endif | #endif | ||||
static int | static int | ||||
smc_intr(void *context) | smc_intr(void *context) | ||||
{ | { | ||||
struct smc_softc *sc; | struct smc_softc *sc; | ||||
uint32_t curbank; | uint32_t curbank; | ||||
Show All 9 Lines | smc_intr(void *context) | ||||
* Block interrupts in order to let smc_task_intr to kick in | * Block interrupts in order to let smc_task_intr to kick in | ||||
*/ | */ | ||||
smc_select_bank(sc, 2); | smc_select_bank(sc, 2); | ||||
smc_write_1(sc, MSK, 0); | smc_write_1(sc, MSK, 0); | ||||
/* Restore bank */ | /* Restore bank */ | ||||
smc_select_bank(sc, curbank); | smc_select_bank(sc, curbank); | ||||
taskqueue_enqueue_fast(sc->smc_tq, &sc->smc_intr); | taskqueue_enqueue(sc->smc_tq, &sc->smc_intr); | ||||
return (FILTER_HANDLED); | return (FILTER_HANDLED); | ||||
} | } | ||||
static void | static void | ||||
smc_task_intr(void *context, int pending) | smc_task_intr(void *context, int pending) | ||||
{ | { | ||||
struct smc_softc *sc; | struct smc_softc *sc; | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
Show All 37 Lines | #endif | ||||
smc_mmu_wait(sc); | smc_mmu_wait(sc); | ||||
smc_write_2(sc, MMUCR, MMUCR_CMD_RELEASE_PKT); | smc_write_2(sc, MMUCR, MMUCR_CMD_RELEASE_PKT); | ||||
smc_select_bank(sc, 0); | smc_select_bank(sc, 0); | ||||
tcr = smc_read_2(sc, TCR); | tcr = smc_read_2(sc, TCR); | ||||
tcr |= TCR_TXENA | TCR_PAD_EN; | tcr |= TCR_TXENA | TCR_PAD_EN; | ||||
smc_write_2(sc, TCR, tcr); | smc_write_2(sc, TCR, tcr); | ||||
smc_select_bank(sc, 2); | smc_select_bank(sc, 2); | ||||
taskqueue_enqueue_fast(sc->smc_tq, &sc->smc_tx); | taskqueue_enqueue(sc->smc_tq, &sc->smc_tx); | ||||
} | } | ||||
/* | /* | ||||
* Ack the interrupt. | * Ack the interrupt. | ||||
*/ | */ | ||||
smc_write_1(sc, ACK, TX_INT); | smc_write_1(sc, ACK, TX_INT); | ||||
} | } | ||||
/* | /* | ||||
* Receive | * Receive | ||||
*/ | */ | ||||
if (status & RCV_INT) { | if (status & RCV_INT) { | ||||
smc_write_1(sc, ACK, RCV_INT); | smc_write_1(sc, ACK, RCV_INT); | ||||
sc->smc_mask &= ~RCV_INT; | sc->smc_mask &= ~RCV_INT; | ||||
taskqueue_enqueue_fast(sc->smc_tq, &sc->smc_rx); | taskqueue_enqueue(sc->smc_tq, &sc->smc_rx); | ||||
} | } | ||||
/* | /* | ||||
* Allocation | * Allocation | ||||
*/ | */ | ||||
if (status & ALLOC_INT) { | if (status & ALLOC_INT) { | ||||
smc_write_1(sc, ACK, ALLOC_INT); | smc_write_1(sc, ACK, ALLOC_INT); | ||||
sc->smc_mask &= ~ALLOC_INT; | sc->smc_mask &= ~ALLOC_INT; | ||||
taskqueue_enqueue_fast(sc->smc_tq, &sc->smc_tx); | taskqueue_enqueue(sc->smc_tq, &sc->smc_tx); | ||||
} | } | ||||
/* | /* | ||||
* Receive overrun | * Receive overrun | ||||
*/ | */ | ||||
if (status & RX_OVRN_INT) { | if (status & RX_OVRN_INT) { | ||||
smc_write_1(sc, ACK, RX_OVRN_INT); | smc_write_1(sc, ACK, RX_OVRN_INT); | ||||
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); | if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); | ||||
Show All 15 Lines | if (status & TX_EMPTY_INT) { | ||||
smc_select_bank(sc, 2); | smc_select_bank(sc, 2); | ||||
if_inc_counter(ifp, IFCOUNTER_COLLISIONS, | if_inc_counter(ifp, IFCOUNTER_COLLISIONS, | ||||
((counter & ECR_SNGLCOL_MASK) >> ECR_SNGLCOL_SHIFT) + | ((counter & ECR_SNGLCOL_MASK) >> ECR_SNGLCOL_SHIFT) + | ||||
((counter & ECR_MULCOL_MASK) >> ECR_MULCOL_SHIFT)); | ((counter & ECR_MULCOL_MASK) >> ECR_MULCOL_SHIFT)); | ||||
/* | /* | ||||
* See if there are any packets to transmit. | * See if there are any packets to transmit. | ||||
*/ | */ | ||||
taskqueue_enqueue_fast(sc->smc_tq, &sc->smc_tx); | taskqueue_enqueue(sc->smc_tq, &sc->smc_tx); | ||||
} | } | ||||
/* | /* | ||||
* Update the interrupt mask. | * Update the interrupt mask. | ||||
*/ | */ | ||||
smc_select_bank(sc, 2); | smc_select_bank(sc, 2); | ||||
if ((ifp->if_capenable & IFCAP_POLLING) == 0) | if ((ifp->if_capenable & IFCAP_POLLING) == 0) | ||||
smc_write_1(sc, MSK, sc->smc_mask); | smc_write_1(sc, MSK, sc->smc_mask); | ||||
▲ Show 20 Lines • Show All 283 Lines • ▼ Show 20 Lines | |||||
static void | static void | ||||
smc_watchdog(void *arg) | smc_watchdog(void *arg) | ||||
{ | { | ||||
struct smc_softc *sc; | struct smc_softc *sc; | ||||
sc = (struct smc_softc *)arg; | sc = (struct smc_softc *)arg; | ||||
device_printf(sc->smc_dev, "watchdog timeout\n"); | device_printf(sc->smc_dev, "watchdog timeout\n"); | ||||
taskqueue_enqueue_fast(sc->smc_tq, &sc->smc_intr); | taskqueue_enqueue(sc->smc_tq, &sc->smc_intr); | ||||
} | } | ||||
static void | static void | ||||
smc_init(void *context) | smc_init(void *context) | ||||
{ | { | ||||
struct smc_softc *sc; | struct smc_softc *sc; | ||||
sc = (struct smc_softc *)context; | sc = (struct smc_softc *)context; | ||||
▲ Show 20 Lines • Show All 84 Lines • Show Last 20 Lines |