diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c index 20ef22f..35feec5 100644 --- a/sys/dev/e1000/if_em.c +++ b/sys/dev/e1000/if_em.c @@ -1632,18 +1632,12 @@ em_msix_rx(void *arg) { struct rx_ring *rxr = arg; struct adapter *adapter = rxr->adapter; - bool more; ++rxr->rx_irq; if (!(adapter->ifp->if_drv_flags & IFF_DRV_RUNNING)) return; - more = em_rxeof(rxr, adapter->rx_process_limit, NULL); - if (more) - taskqueue_enqueue(rxr->tq, &rxr->rx_task); - else { - /* Reenable this interrupt */ - E1000_WRITE_REG(&adapter->hw, E1000_IMS, rxr->ims); - } + + taskqueue_enqueue(rxr->tq, &rxr->rx_task); return; } @@ -1677,8 +1671,13 @@ em_msix_link(void *arg) ** for all these vectors. */ if (reg_icr) { - E1000_WRITE_REG(&adapter->hw, - E1000_ICS, adapter->ims); + for (int i = 0; i < adapter->num_queues; i++) { + struct rx_ring *rxr = &adapter->rx_rings[i]; + struct tx_ring *txr = &adapter->tx_rings[i]; + + taskqueue_enqueue(rxr->tq, &rxr->rx_task); + taskqueue_enqueue(txr->tq, &txr->tx_task); + } } return; } @@ -2323,7 +2322,6 @@ em_local_timer(void *arg) struct ifnet *ifp = adapter->ifp; struct tx_ring *txr = adapter->tx_rings; struct rx_ring *rxr = adapter->rx_rings; - u32 trigger = 0; EM_CORE_LOCK_ASSERT(adapter); @@ -2335,20 +2333,12 @@ em_local_timer(void *arg) e1000_get_laa_state_82571(&adapter->hw)) e1000_rar_set(&adapter->hw, adapter->hw.mac.addr, 0); - /* Mask to use in the irq trigger */ - if (adapter->msix_mem) { - for (int i = 0; i < adapter->num_queues; i++, rxr++) - trigger |= rxr->ims; - rxr = adapter->rx_rings; - } else - trigger = E1000_ICS_RXDMT0; - /* ** Check on the state of the TX queue(s), this ** can be done without the lock because its RO ** and the HUNG state will be static if set. */ - for (int i = 0; i < adapter->num_queues; i++, txr++) { + for (int i = 0; i < adapter->num_queues; i++, txr++, rxr++) { if (txr->busy == EM_TX_HUNG) goto hung; if (txr->busy >= EM_TX_MAXTRIES) @@ -2356,13 +2346,11 @@ em_local_timer(void *arg) /* Schedule a TX tasklet if needed */ if (txr->tx_avail <= EM_MAX_SCATTER) taskqueue_enqueue(txr->tq, &txr->tx_task); + /* Schedule an RX task to ensure that an mbuf refresh */ + taskqueue_enqueue(rxr->tq, &rxr->rx_task); } callout_reset(&adapter->timer, hz, em_local_timer, adapter); -#ifndef DEVICE_POLLING - /* Trigger an RX interrupt to guarantee mbuf refresh */ - E1000_WRITE_REG(&adapter->hw, E1000_ICS, trigger); -#endif return; hung: /* Looks like we're hung */