]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/ixgb/ixgb_main.c
cxgb3: trivial endianness annotations
[linux-2.6-omap-h63xx.git] / drivers / net / ixgb / ixgb_main.c
index 6d2b059371f10bcf46fe20d6b343a4d4ee193ec3..d444de58ba341455b40cf823e31736f270c01836 100644 (file)
@@ -97,7 +97,7 @@ static irqreturn_t ixgb_intr(int irq, void *data);
 static boolean_t ixgb_clean_tx_irq(struct ixgb_adapter *adapter);
 
 #ifdef CONFIG_IXGB_NAPI
-static int ixgb_clean(struct net_device *netdev, int *budget);
+static int ixgb_clean(struct napi_struct *napi, int budget);
 static boolean_t ixgb_clean_rx_irq(struct ixgb_adapter *adapter,
                                   int *work_done, int work_to_do);
 #else
@@ -227,7 +227,7 @@ int
 ixgb_up(struct ixgb_adapter *adapter)
 {
        struct net_device *netdev = adapter->netdev;
-       int err;
+       int err, irq_flags = IRQF_SHARED;
        int max_frame = netdev->mtu + ENET_HEADER_SIZE + ENET_FCS_LENGTH;
        struct ixgb_hw *hw = &adapter->hw;
 
@@ -246,26 +246,21 @@ ixgb_up(struct ixgb_adapter *adapter)
        /* disable interrupts and get the hardware into a known state */
        IXGB_WRITE_REG(&adapter->hw, IMC, 0xffffffff);
 
-#ifdef CONFIG_PCI_MSI
-       {
-       boolean_t pcix = (IXGB_READ_REG(&adapter->hw, STATUS) & 
-                                                 IXGB_STATUS_PCIX_MODE) ? TRUE : FALSE;
-       adapter->have_msi = TRUE;
-
-       if (!pcix)
-          adapter->have_msi = FALSE;
-       else if((err = pci_enable_msi(adapter->pdev))) {
-               DPRINTK(PROBE, ERR,
-                "Unable to allocate MSI interrupt Error: %d\n", err);
-               adapter->have_msi = FALSE;
+       /* only enable MSI if bus is in PCI-X mode */
+       if (IXGB_READ_REG(&adapter->hw, STATUS) & IXGB_STATUS_PCIX_MODE) {
+               err = pci_enable_msi(adapter->pdev);
+               if (!err) {
+                       adapter->have_msi = 1;
+                       irq_flags = 0;
+               }
                /* proceed to try to request regular interrupt */
        }
-       }
 
-#endif
-       if((err = request_irq(adapter->pdev->irq, &ixgb_intr,
-                                 IRQF_SHARED | IRQF_SAMPLE_RANDOM,
-                                 netdev->name, netdev))) {
+       err = request_irq(adapter->pdev->irq, &ixgb_intr, irq_flags,
+                         netdev->name, netdev);
+       if (err) {
+               if (adapter->have_msi)
+                       pci_disable_msi(adapter->pdev);
                DPRINTK(PROBE, ERR,
                 "Unable to allocate interrupt Error: %d\n", err);
                return err;
@@ -293,7 +288,7 @@ ixgb_up(struct ixgb_adapter *adapter)
        mod_timer(&adapter->watchdog_timer, jiffies);
 
 #ifdef CONFIG_IXGB_NAPI
-       netif_poll_enable(netdev);
+       napi_enable(&adapter->napi);
 #endif
        ixgb_irq_enable(adapter);
 
@@ -307,15 +302,14 @@ ixgb_down(struct ixgb_adapter *adapter, boolean_t kill_watchdog)
 
        ixgb_irq_disable(adapter);
        free_irq(adapter->pdev->irq, netdev);
-#ifdef CONFIG_PCI_MSI
-       if(adapter->have_msi == TRUE)
+
+       if (adapter->have_msi)
                pci_disable_msi(adapter->pdev);
 
-#endif
        if(kill_watchdog)
                del_timer_sync(&adapter->watchdog_timer);
 #ifdef CONFIG_IXGB_NAPI
-       netif_poll_disable(netdev);
+       napi_disable(&adapter->napi);
 #endif
        adapter->link_speed = 0;
        adapter->link_duplex = 0;
@@ -388,7 +382,6 @@ ixgb_probe(struct pci_dev *pdev,
                goto err_alloc_etherdev;
        }
 
-       SET_MODULE_OWNER(netdev);
        SET_NETDEV_DEV(netdev, &pdev->dev);
 
        pci_set_drvdata(pdev, netdev);
@@ -427,8 +420,7 @@ ixgb_probe(struct pci_dev *pdev,
        netdev->tx_timeout = &ixgb_tx_timeout;
        netdev->watchdog_timeo = 5 * HZ;
 #ifdef CONFIG_IXGB_NAPI
-       netdev->poll = &ixgb_clean;
-       netdev->weight = 64;
+       netif_napi_add(netdev, &adapter->napi, ixgb_clean, 64);
 #endif
        netdev->vlan_rx_register = ixgb_vlan_rx_register;
        netdev->vlan_rx_add_vid = ixgb_vlan_rx_add_vid;
@@ -1752,7 +1744,7 @@ ixgb_intr(int irq, void *data)
        }
 
 #ifdef CONFIG_IXGB_NAPI
-       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.
@@ -1760,7 +1752,7 @@ ixgb_intr(int irq, void *data)
 
                atomic_inc(&adapter->irq_sem);
                IXGB_WRITE_REG(&adapter->hw, IMC, ~0);
-               __netif_rx_schedule(netdev);
+               __netif_rx_schedule(netdev, &adapter->napi);
        }
 #else
        /* yes, that is actually a & and it is meant to make sure that
@@ -1782,27 +1774,23 @@ ixgb_intr(int irq, void *data)
  **/
 
 static int
-ixgb_clean(struct net_device *netdev, int *budget)
+ixgb_clean(struct napi_struct *napi, int budget)
 {
-       struct ixgb_adapter *adapter = netdev_priv(netdev);
-       int work_to_do = min(*budget, netdev->quota);
+       struct ixgb_adapter *adapter = container_of(napi, struct ixgb_adapter, napi);
+       struct net_device *netdev = adapter->netdev;
        int tx_cleaned;
        int work_done = 0;
 
        tx_cleaned = ixgb_clean_tx_irq(adapter);
-       ixgb_clean_rx_irq(adapter, &work_done, work_to_do);
-
-       *budget -= work_done;
-       netdev->quota -= work_done;
+       ixgb_clean_rx_irq(adapter, &work_done, budget);
 
        /* if no Tx and not enough Rx work done, exit the polling mode */
        if((!tx_cleaned && (work_done == 0)) || !netif_running(netdev)) {
-               netif_rx_complete(netdev);
+               netif_rx_complete(netdev, napi);
                ixgb_irq_enable(adapter);
-               return 0;
        }
 
-       return 1;
+       return work_done;
 }
 #endif