]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
atl1: do not process interrupts in cycle in handler
authorTony Zelenoff <antonz@parallels.com>
Fri, 13 Apr 2012 06:09:53 +0000 (06:09 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 15 Apr 2012 17:00:12 +0000 (13:00 -0400)
As the rx/tx handled inside napi handler, the cycle is
not needed now, because only the rx/tx need such kind of
processing.

Signed-off-by: Tony Zelenoff <antonz@parallels.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/atheros/atlx/atl1.c
scripts/mod/file2alias.c

index f17cecae59e57987360fa66f76c7d210c4c4e0c1..066b980cc2f07a30f5b10721db61e3f51789a561 100644 (file)
@@ -2499,77 +2499,68 @@ static irqreturn_t atl1_intr(int irq, void *data)
 {
        struct atl1_adapter *adapter = netdev_priv(data);
        u32 status;
-       int max_ints = 10;
 
        status = adapter->cmb.cmb->int_stats;
        if (!status)
                return IRQ_NONE;
 
-       do {
-               /* clear CMB interrupt status at once */
-               adapter->cmb.cmb->int_stats = 0;
-
-               if (status & ISR_GPHY)  /* clear phy status */
-                       atlx_clear_phy_int(adapter);
+       /* clear CMB interrupt status at once */
+       adapter->cmb.cmb->int_stats = 0;
 
-               /* clear ISR status, and Enable CMB DMA/Disable Interrupt */
-               iowrite32(status | ISR_DIS_INT, adapter->hw.hw_addr + REG_ISR);
+       if (status & ISR_GPHY)  /* clear phy status */
+               atlx_clear_phy_int(adapter);
 
-               /* check if SMB intr */
-               if (status & ISR_SMB)
-                       atl1_inc_smb(adapter);
+       /* clear ISR status, and Enable CMB DMA/Disable Interrupt */
+       iowrite32(status | ISR_DIS_INT, adapter->hw.hw_addr + REG_ISR);
 
-               /* check if PCIE PHY Link down */
-               if (status & ISR_PHY_LINKDOWN) {
-                       if (netif_msg_intr(adapter))
-                               dev_printk(KERN_DEBUG, &adapter->pdev->dev,
-                                       "pcie phy link down %x\n", status);
-                       if (netif_running(adapter->netdev)) {   /* reset MAC */
-                               atlx_irq_disable(adapter);
-                               schedule_work(&adapter->pcie_dma_to_rst_task);
-                               return IRQ_HANDLED;
-                       }
-               }
+       /* check if SMB intr */
+       if (status & ISR_SMB)
+               atl1_inc_smb(adapter);
 
-               /* check if DMA read/write error ? */
-               if (status & (ISR_DMAR_TO_RST | ISR_DMAW_TO_RST)) {
-                       if (netif_msg_intr(adapter))
-                               dev_printk(KERN_DEBUG, &adapter->pdev->dev,
-                                       "pcie DMA r/w error (status = 0x%x)\n",
-                                       status);
+       /* check if PCIE PHY Link down */
+       if (status & ISR_PHY_LINKDOWN) {
+               if (netif_msg_intr(adapter))
+                       dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+                               "pcie phy link down %x\n", status);
+               if (netif_running(adapter->netdev)) {   /* reset MAC */
                        atlx_irq_disable(adapter);
                        schedule_work(&adapter->pcie_dma_to_rst_task);
                        return IRQ_HANDLED;
                }
+       }
 
-               /* link event */
-               if (status & ISR_GPHY) {
-                       adapter->soft_stats.tx_carrier_errors++;
-                       atl1_check_for_link(adapter);
-               }
-
-               /* transmit or receive event */
-               if (status & (ISR_CMB_TX | ISR_CMB_RX) &&
-                   atl1_sched_rings_clean(adapter))
-                       break;
-
-               /* rx exception */
-               if (unlikely(status & (ISR_RXF_OV | ISR_RFD_UNRUN |
-                       ISR_RRD_OV | ISR_HOST_RFD_UNRUN |
-                       ISR_HOST_RRD_OV))) {
-                       if (netif_msg_intr(adapter))
-                               dev_printk(KERN_DEBUG,
-                                       &adapter->pdev->dev,
-                                       "rx exception, ISR = 0x%x\n",
-                                       status);
-                       if (atl1_sched_rings_clean(adapter))
-                               break;
-               }
-
-               if (--max_ints < 0)
-                       break;
-
-       } while ((status = adapter->cmb.cmb->int_stats));
+       /* check if DMA read/write error ? */
+       if (status & (ISR_DMAR_TO_RST | ISR_DMAW_TO_RST)) {
+               if (netif_msg_intr(adapter))
+                       dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+                               "pcie DMA r/w error (status = 0x%x)\n",
+                               status);
+               atlx_irq_disable(adapter);
+               schedule_work(&adapter->pcie_dma_to_rst_task);
+               return IRQ_HANDLED;
+       }
+
+       /* link event */
+       if (status & ISR_GPHY) {
+               adapter->soft_stats.tx_carrier_errors++;
+               atl1_check_for_link(adapter);
+       }
+
+       /* transmit or receive event */
+       if (status & (ISR_CMB_TX | ISR_CMB_RX))
+           atl1_sched_rings_clean(adapter);
+
+       /* rx exception */
+       if (unlikely(status & (ISR_RXF_OV | ISR_RFD_UNRUN |
+               ISR_RRD_OV | ISR_HOST_RFD_UNRUN |
+               ISR_HOST_RRD_OV))) {
+               if (netif_msg_intr(adapter))
+                       dev_printk(KERN_DEBUG,
+                               &adapter->pdev->dev,
+                               "rx exception, ISR = 0x%x\n",
+                               status);
+               atl1_sched_rings_clean(adapter);
+       }
 
        /* re-enable Interrupt */
        iowrite32(ISR_DIS_SMB | ISR_DIS_DMA, adapter->hw.hw_addr + REG_ISR);
index 8e730ccc3f2b22d55e7b716cf20298da4e9b7475..44ddaa542db6fbb6612560ac312b65ffca330b4c 100644 (file)
@@ -1100,6 +1100,10 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
        if (!sym->st_shndx || get_secindex(info, sym) >= info->num_sections)
                return;
 
+       /* We're looking for an object */
+       if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT)
+               return;
+
        /* All our symbols are of form <prefix>__mod_XXX_device_table. */
        name = strstr(symname, "__mod_");
        if (!name)