Merge branch 'for-2637/i2c/samsung' into next-i2c
[pandora-kernel.git] / drivers / net / bna / bnad.c
index e380c0e..7e839b9 100644 (file)
@@ -28,7 +28,7 @@
 #include "bna.h"
 #include "cna.h"
 
-DEFINE_MUTEX(bnad_fwimg_mutex);
+static DEFINE_MUTEX(bnad_fwimg_mutex);
 
 /*
  * Module params
@@ -46,7 +46,7 @@ MODULE_PARM_DESC(bnad_ioc_auto_recover, "Enable / Disable auto recovery");
  */
 u32 bnad_rxqs_per_cq = 2;
 
-const u8 bnad_bcast_addr[] =  {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+static const u8 bnad_bcast_addr[] =  {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
 
 /*
  * Local MACROS
@@ -564,9 +564,11 @@ bnad_disable_rx_irq(struct bnad *bnad, struct bna_ccb *ccb)
 static void
 bnad_enable_rx_irq(struct bnad *bnad, struct bna_ccb *ccb)
 {
-       spin_lock_irq(&bnad->bna_lock); /* Because of polling context */
+       unsigned long flags;
+
+       spin_lock_irqsave(&bnad->bna_lock, flags); /* Because of polling context */
        bnad_enable_rx_irq_unsafe(ccb);
-       spin_unlock_irq(&bnad->bna_lock);
+       spin_unlock_irqrestore(&bnad->bna_lock, flags);
 }
 
 static void
@@ -599,7 +601,7 @@ static irqreturn_t
 bnad_msix_mbox_handler(int irq, void *data)
 {
        u32 intr_status;
-       unsigned long  flags;
+       unsigned long flags;
        struct net_device *netdev = data;
        struct bnad *bnad;
 
@@ -630,13 +632,15 @@ bnad_isr(int irq, void *data)
        struct bnad_rx_info *rx_info;
        struct bnad_rx_ctrl *rx_ctrl;
 
-       spin_lock_irqsave(&bnad->bna_lock, flags);
+       if (unlikely(test_bit(BNAD_RF_MBOX_IRQ_DISABLED, &bnad->run_flags)))
+               return IRQ_NONE;
 
        bna_intr_status_get(&bnad->bna, intr_status);
-       if (!intr_status) {
-               spin_unlock_irqrestore(&bnad->bna_lock, flags);
+
+       if (unlikely(!intr_status))
                return IRQ_NONE;
-       }
+
+       spin_lock_irqsave(&bnad->bna_lock, flags);
 
        if (BNA_IS_MBOX_ERR_INTR(intr_status)) {
                bna_mbox_handler(&bnad->bna, intr_status);
@@ -672,11 +676,10 @@ bnad_enable_mbox_irq(struct bnad *bnad)
 {
        int irq = BNAD_GET_MBOX_IRQ(bnad);
 
-       if (!(bnad->cfg_flags & BNAD_CF_MSIX))
-               return;
-
        if (test_and_clear_bit(BNAD_RF_MBOX_IRQ_DISABLED, &bnad->run_flags))
-               enable_irq(irq);
+               if (bnad->cfg_flags & BNAD_CF_MSIX)
+                       enable_irq(irq);
+
        BNAD_UPDATE_CTR(bnad, mbox_intr_enabled);
 }
 
@@ -684,16 +687,16 @@ bnad_enable_mbox_irq(struct bnad *bnad)
  * Called with bnad->bna_lock held b'cos of
  * bnad->cfg_flags access.
  */
-void
+static void
 bnad_disable_mbox_irq(struct bnad *bnad)
 {
        int irq = BNAD_GET_MBOX_IRQ(bnad);
 
-       if (!(bnad->cfg_flags & BNAD_CF_MSIX))
-               return;
 
        if (!test_and_set_bit(BNAD_RF_MBOX_IRQ_DISABLED, &bnad->run_flags))
-               disable_irq_nosync(irq);
+               if (bnad->cfg_flags & BNAD_CF_MSIX)
+                       disable_irq_nosync(irq);
+
        BNAD_UPDATE_CTR(bnad, mbox_intr_disabled);
 }
 
@@ -953,11 +956,6 @@ bnad_cb_stats_get(struct bnad *bnad, enum bna_cb_status status,
                  jiffies + msecs_to_jiffies(BNAD_STATS_TIMER_FREQ));
 }
 
-void
-bnad_cb_stats_clr(struct bnad *bnad)
-{
-}
-
 /* Resource allocation, free functions */
 
 static void
@@ -1045,14 +1043,12 @@ bnad_mbox_irq_free(struct bnad *bnad,
                return;
 
        spin_lock_irqsave(&bnad->bna_lock, flags);
-
        bnad_disable_mbox_irq(bnad);
+       spin_unlock_irqrestore(&bnad->bna_lock, flags);
 
        irq = BNAD_GET_MBOX_IRQ(bnad);
        free_irq(irq, bnad->netdev);
 
-       spin_unlock_irqrestore(&bnad->bna_lock, flags);
-
        kfree(intr_info->idl);
 }
 
@@ -1094,8 +1090,15 @@ bnad_mbox_irq_alloc(struct bnad *bnad,
 
        sprintf(bnad->mbox_irq_name, "%s", BNAD_NAME);
 
+       /*
+        * Set the Mbox IRQ disable flag, so that the IRQ handler
+        * called from request_irq() for SHARED IRQs do not execute
+        */
+       set_bit(BNAD_RF_MBOX_IRQ_DISABLED, &bnad->run_flags);
+
        err = request_irq(irq, irq_handler, flags,
                          bnad->mbox_irq_name, bnad->netdev);
+
        if (err) {
                kfree(intr_info->idl);
                intr_info->idl = NULL;
@@ -1103,7 +1106,10 @@ bnad_mbox_irq_alloc(struct bnad *bnad,
        }
 
        spin_lock_irqsave(&bnad->bna_lock, flags);
-       bnad_disable_mbox_irq(bnad);
+
+       if (bnad->cfg_flags & BNAD_CF_MSIX)
+               disable_irq_nosync(irq);
+
        spin_unlock_irqrestore(&bnad->bna_lock, flags);
        return 0;
 }
@@ -1485,7 +1491,6 @@ bnad_stats_timer_start(struct bnad *bnad)
                          jiffies + msecs_to_jiffies(BNAD_STATS_TIMER_FREQ));
        }
        spin_unlock_irqrestore(&bnad->bna_lock, flags);
-
 }
 
 /*
@@ -2170,7 +2175,6 @@ bnad_device_disable(struct bnad *bnad)
        spin_unlock_irqrestore(&bnad->bna_lock, flags);
 
        wait_for_completion(&bnad->bnad_completions.ioc_comp);
-
 }
 
 static int
@@ -2236,7 +2240,6 @@ static void
 bnad_enable_msix(struct bnad *bnad)
 {
        int i, ret;
-       u32 tot_msix_num;
        unsigned long flags;
 
        spin_lock_irqsave(&bnad->bna_lock, flags);
@@ -2249,18 +2252,16 @@ bnad_enable_msix(struct bnad *bnad)
        if (bnad->msix_table)
                return;
 
-       tot_msix_num = bnad->msix_num + bnad->msix_diag_num;
-
        bnad->msix_table =
-               kcalloc(tot_msix_num, sizeof(struct msix_entry), GFP_KERNEL);
+               kcalloc(bnad->msix_num, sizeof(struct msix_entry), GFP_KERNEL);
 
        if (!bnad->msix_table)
                goto intx_mode;
 
-       for (i = 0; i < tot_msix_num; i++)
+       for (i = 0; i < bnad->msix_num; i++)
                bnad->msix_table[i].entry = i;
 
-       ret = pci_enable_msix(bnad->pcidev, bnad->msix_table, tot_msix_num);
+       ret = pci_enable_msix(bnad->pcidev, bnad->msix_table, bnad->msix_num);
        if (ret > 0) {
                /* Not enough MSI-X vectors. */
 
@@ -2273,12 +2274,11 @@ bnad_enable_msix(struct bnad *bnad)
                        + (bnad->num_rx
                        * bnad->num_rxp_per_rx) +
                         BNAD_MAILBOX_MSIX_VECTORS;
-               tot_msix_num = bnad->msix_num + bnad->msix_diag_num;
 
                /* Try once more with adjusted numbers */
                /* If this fails, fall back to INTx */
                ret = pci_enable_msix(bnad->pcidev, bnad->msix_table,
-                                     tot_msix_num);
+                                     bnad->msix_num);
                if (ret)
                        goto intx_mode;
 
@@ -2291,7 +2291,6 @@ intx_mode:
        kfree(bnad->msix_table);
        bnad->msix_table = NULL;
        bnad->msix_num = 0;
-       bnad->msix_diag_num = 0;
        spin_lock_irqsave(&bnad->bna_lock, flags);
        bnad->cfg_flags &= ~BNAD_CF_MSIX;
        bnad_q_num_init(bnad);
@@ -2502,7 +2501,7 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
                htons((skb_is_gso(skb) ? BNA_TXQ_WI_SEND_LSO :
                       BNA_TXQ_WI_SEND));
 
-       if (bnad->vlan_grp && vlan_tx_tag_present(skb)) {
+       if (vlan_tx_tag_present(skb)) {
                vlan_tag = (u16) vlan_tx_tag_get(skb);
                flags |= (BNA_TXQ_WI_CF_INS_PRIO | BNA_TXQ_WI_CF_INS_VLAN);
        }
@@ -2939,7 +2938,6 @@ bnad_init(struct bnad *bnad,
        bnad->msix_num = (bnad->num_tx * bnad->num_txq_per_tx) +
                (bnad->num_rx * bnad->num_rxp_per_rx) +
                         BNAD_MAILBOX_MSIX_VECTORS;
-       bnad->msix_diag_num = 2;        /* 1 for Tx, 1 for Rx */
 
        bnad->txq_depth = BNAD_TXQ_DEPTH;
        bnad->rxq_depth = BNAD_RXQ_DEPTH;
@@ -3108,7 +3106,6 @@ bnad_pci_probe(struct pci_dev *pdev,
 
        spin_lock_irqsave(&bnad->bna_lock, flags);
        bna_init(bna, bnad, &pcidev_info, &bnad->res_info[0]);
-
        spin_unlock_irqrestore(&bnad->bna_lock, flags);
 
        bnad->stats.bna_stats = &bna->stats;
@@ -3211,7 +3208,7 @@ bnad_pci_remove(struct pci_dev *pdev)
        free_netdev(netdev);
 }
 
-const struct pci_device_id bnad_pci_id_table[] = {
+static const struct pci_device_id bnad_pci_id_table[] = {
        {
                PCI_DEVICE(PCI_VENDOR_ID_BROCADE,
                        PCI_DEVICE_ID_BROCADE_CT),