This incorporates the new napi_struct changes into ixgbe. Signed-off-by: Auke Kok <[EMAIL PROTECTED]> ---
drivers/net/ixgbe/ixgbe.h | 1 + drivers/net/ixgbe/ixgbe_main.c | 62 +++++++++++++++++----------------------- 2 files changed, 27 insertions(+), 36 deletions(-) diff --git a/drivers/net/ixgbe/ixgbe.h b/drivers/net/ixgbe/ixgbe.h index b24803f..c160a7d 100644 --- a/drivers/net/ixgbe/ixgbe.h +++ b/drivers/net/ixgbe/ixgbe.h @@ -179,6 +179,7 @@ struct ixgbe_adapter { /* TX */ struct ixgbe_ring *tx_ring; /* One per active queue */ + struct napi_struct napi; u64 restart_queue; u64 lsc_int; u64 hw_tso_ctxt; diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 23fb1ed..a08a462 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c @@ -557,14 +557,15 @@ static irqreturn_t ixgbe_msix_clean_rx(int irq, void *data) struct ixgbe_adapter *adapter = rxr->adapter; IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, rxr->eims_value); - netif_rx_schedule(adapter->netdev); + netif_rx_schedule(adapter->netdev, &adapter->napi); return IRQ_HANDLED; } -static int ixgbe_clean_rxonly(struct net_device *netdev, int *budget) +static int ixgbe_clean_rxonly(struct napi_struct *napi, int budget) { - struct ixgbe_adapter *adapter = netdev_priv(netdev); - int work_to_do = min(*budget, netdev->quota); + struct ixgbe_adapter *adapter = container_of(napi, + struct ixgbe_adapter, napi); + struct net_device *netdev = adapter->netdev; int work_done = 0; struct ixgbe_ring *rxr = adapter->rx_ring; @@ -572,22 +573,18 @@ static int ixgbe_clean_rxonly(struct net_device *netdev, int *budget) if (!netif_carrier_ok(netdev)) goto quit_polling; - ixgbe_clean_rx_irq(adapter, rxr, &work_done, work_to_do); - - *budget -= work_done; - netdev->quota -= work_done; + ixgbe_clean_rx_irq(adapter, rxr, &work_done, budget); /* If no Tx and not enough Rx work done, exit the polling mode */ - if ((work_done == 0) || !netif_running(netdev)) { + if ((work_done < budget) || !netif_running(netdev)) { quit_polling: - netif_rx_complete(netdev); + netif_rx_complete(netdev, napi); if (!test_bit(__IXGBE_DOWN, &adapter->state)) IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, rxr->eims_value); - return 0; } - return 1; + return work_done; } /** @@ -669,7 +666,8 @@ static int ixgbe_setup_msix(struct ixgbe_adapter *adapter) goto release_irqs; } - adapter->netdev->poll = ixgbe_clean_rxonly; + /* FIXME: implement netif_napi_remove() instead */ + adapter->napi.poll = ixgbe_clean_rxonly; adapter->flags |= IXGBE_FLAG_MSIX_ENABLED; return 0; @@ -713,12 +711,12 @@ static irqreturn_t ixgbe_intr(int irq, void *data) if (!test_bit(__IXGBE_DOWN, &adapter->state)) mod_timer(&adapter->watchdog_timer, jiffies); } - if (netif_rx_schedule_prep(netdev)) { + if (netif_rx_schedule_prep(netdev, &adapter->napi)) { /* Disable interrupts and register for poll. The flush of the * posted write is intentionally left out. */ atomic_inc(&adapter->irq_sem); IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); - __netif_rx_schedule(netdev); + __netif_rx_schedule(netdev, &adapter->napi); } return IRQ_HANDLED; @@ -1218,7 +1216,7 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter) ixgbe_configure_msi_and_legacy(adapter); clear_bit(__IXGBE_DOWN, &adapter->state); - netif_poll_enable(netdev); + napi_enable(&adapter->napi); ixgbe_irq_enable(adapter); /* bring the link up in the watchdog, this could race with our first @@ -1412,7 +1410,7 @@ void ixgbe_down(struct ixgbe_adapter *adapter) ixgbe_irq_disable(adapter); - netif_poll_disable(netdev); + napi_disable(&adapter->napi); del_timer_sync(&adapter->watchdog_timer); netif_carrier_off(netdev); @@ -1464,11 +1462,12 @@ static void ixgbe_shutdown(struct pci_dev *pdev) * ixgbe_clean - NAPI Rx polling callback * @adapter: board private structure **/ -static int ixgbe_clean(struct net_device *netdev, int *budget) +static int ixgbe_clean(struct napi_struct *napi, int budget) { - struct ixgbe_adapter *adapter = netdev_priv(netdev); - int work_to_do = min(*budget, netdev->quota); - int tx_cleaned, work_done = 0; + struct ixgbe_adapter *adapter = container_of(napi, + struct ixgbe_adapter, napi); + struct net_device *netdev = adapter->netdev; + int tx_cleaned = 0, work_done = 0; /* Keep link state information with original netdev */ if (!netif_carrier_ok(adapter->netdev)) @@ -1477,24 +1476,17 @@ static int ixgbe_clean(struct net_device *netdev, int *budget) /* In non-MSIX case, there is no multi-Tx/Rx queue */ tx_cleaned = ixgbe_clean_tx_irq(adapter, adapter->tx_ring); ixgbe_clean_rx_irq(adapter, &adapter->rx_ring[0], &work_done, - work_to_do); - - *budget -= work_done; - netdev->quota -= work_done; + budget); /* If no Tx and not enough Rx work done, exit the polling mode */ - if ((!tx_cleaned && (work_done == 0)) || + if ((!tx_cleaned && (work_done < budget)) || !netif_running(adapter->netdev)) { quit_polling: - netif_rx_complete(netdev); - if (test_bit(__IXGBE_DOWN, &adapter->state)) - atomic_dec(&adapter->irq_sem); - else - ixgbe_irq_enable(adapter); - return 0; + netif_rx_complete(netdev, napi); + ixgbe_irq_enable(adapter); } - return 1; + return work_done; } /** @@ -2592,8 +2584,7 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, ixgbe_set_ethtool_ops(netdev); netdev->tx_timeout = &ixgbe_tx_timeout; netdev->watchdog_timeo = 5 * HZ; - netdev->poll = &ixgbe_clean; - netdev->weight = 64; + netif_napi_add(netdev, &adapter->napi, ixgbe_clean, 64); netdev->vlan_rx_register = ixgbe_vlan_rx_register; netdev->vlan_rx_add_vid = ixgbe_vlan_rx_add_vid; netdev->vlan_rx_kill_vid = ixgbe_vlan_rx_kill_vid; @@ -2698,7 +2689,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, netif_carrier_off(netdev); netif_stop_queue(netdev); - netif_poll_disable(netdev); strcpy(netdev->name, "eth%d"); err = register_netdev(netdev); - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html