Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6:
natsemi: Avoid IntrStatus lossage if RX state machine resets.
natsemi: Fix NAPI for interrupt sharing
natsemi: Consistently use interrupt enable/disable functions
NetXen: Fix softlockup seen during hardware access
NetXen: Bug fix for Jumbo frames on XG card
skge: set mac address bonding fix

+63 -41
+31 -27
drivers/net/natsemi.c
··· 1712 1712 1713 1713 /* Enable interrupts by setting the interrupt mask. */ 1714 1714 writel(DEFAULT_INTR, ioaddr + IntrMask); 1715 - writel(1, ioaddr + IntrEnable); 1715 + natsemi_irq_enable(dev); 1716 1716 1717 1717 writel(RxOn | TxOn, ioaddr + ChipCmd); 1718 1718 writel(StatsClear, ioaddr + StatsCtrl); /* Clear Stats */ ··· 2119 2119 struct netdev_private *np = netdev_priv(dev); 2120 2120 void __iomem * ioaddr = ns_ioaddr(dev); 2121 2121 2122 - if (np->hands_off) 2122 + /* Reading IntrStatus automatically acknowledges so don't do 2123 + * that while interrupts are disabled, (for example, while a 2124 + * poll is scheduled). */ 2125 + if (np->hands_off || !readl(ioaddr + IntrEnable)) 2123 2126 return IRQ_NONE; 2124 2127 2125 - /* Reading automatically acknowledges. */ 2126 2128 np->intr_status = readl(ioaddr + IntrStatus); 2129 + 2130 + if (!np->intr_status) 2131 + return IRQ_NONE; 2127 2132 2128 2133 if (netif_msg_intr(np)) 2129 2134 printk(KERN_DEBUG ··· 2136 2131 dev->name, np->intr_status, 2137 2132 readl(ioaddr + IntrMask)); 2138 2133 2139 - if (!np->intr_status) 2140 - return IRQ_NONE; 2141 - 2142 2134 prefetch(&np->rx_skbuff[np->cur_rx % RX_RING_SIZE]); 2143 2135 2144 2136 if (netif_rx_schedule_prep(dev)) { 2145 2137 /* Disable interrupts and register for poll */ 2146 2138 natsemi_irq_disable(dev); 2147 2139 __netif_rx_schedule(dev); 2148 - } 2140 + } else 2141 + printk(KERN_WARNING 2142 + "%s: Ignoring interrupt, status %#08x, mask %#08x.\n", 2143 + dev->name, np->intr_status, 2144 + readl(ioaddr + IntrMask)); 2145 + 2149 2146 return IRQ_HANDLED; 2150 2147 } 2151 2148 ··· 2163 2156 int work_done = 0; 2164 2157 2165 2158 do { 2159 + if (netif_msg_intr(np)) 2160 + printk(KERN_DEBUG 2161 + "%s: Poll, status %#08x, mask %#08x.\n", 2162 + dev->name, np->intr_status, 2163 + readl(ioaddr + IntrMask)); 2164 + 2165 + /* netdev_rx() may read IntrStatus again if the RX state 2166 + * machine falls over so do it first. */ 2167 + if (np->intr_status & 2168 + (IntrRxDone | IntrRxIntr | RxStatusFIFOOver | 2169 + IntrRxErr | IntrRxOverrun)) { 2170 + netdev_rx(dev, &work_done, work_to_do); 2171 + } 2172 + 2166 2173 if (np->intr_status & 2167 2174 (IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) { 2168 2175 spin_lock(&np->lock); ··· 2187 2166 /* Abnormal error summary/uncommon events handlers. */ 2188 2167 if (np->intr_status & IntrAbnormalSummary) 2189 2168 netdev_error(dev, np->intr_status); 2190 - 2191 - if (np->intr_status & 2192 - (IntrRxDone | IntrRxIntr | RxStatusFIFOOver | 2193 - IntrRxErr | IntrRxOverrun)) { 2194 - netdev_rx(dev, &work_done, work_to_do); 2195 - } 2196 2169 2197 2170 *budget -= work_done; 2198 2171 dev->quota -= work_done; ··· 2414 2399 #ifdef CONFIG_NET_POLL_CONTROLLER 2415 2400 static void natsemi_poll_controller(struct net_device *dev) 2416 2401 { 2417 - struct netdev_private *np = netdev_priv(dev); 2418 - 2419 2402 disable_irq(dev->irq); 2420 - 2421 - /* 2422 - * A real interrupt might have already reached us at this point 2423 - * but NAPI might still haven't called us back. As the interrupt 2424 - * status register is cleared by reading, we should prevent an 2425 - * interrupt loss in this case... 2426 - */ 2427 - if (!np->intr_status) 2428 - intr_handler(dev->irq, dev); 2429 - 2403 + intr_handler(dev->irq, dev); 2430 2404 enable_irq(dev->irq); 2431 2405 } 2432 2406 #endif ··· 3075 3071 * Could be used to send a netlink message. 3076 3072 */ 3077 3073 writel(WOLPkt | LinkChange, ioaddr + IntrMask); 3078 - writel(1, ioaddr + IntrEnable); 3074 + natsemi_irq_enable(dev); 3079 3075 } 3080 3076 } 3081 3077 ··· 3206 3202 disable_irq(dev->irq); 3207 3203 spin_lock_irq(&np->lock); 3208 3204 3209 - writel(0, ioaddr + IntrEnable); 3205 + natsemi_irq_disable(dev); 3210 3206 np->hands_off = 1; 3211 3207 natsemi_stop_rxtx(dev); 3212 3208 netif_stop_queue(dev);
+1
drivers/net/netxen/netxen_nic.h
··· 232 232 #define MPORT_SINGLE_FUNCTION_MODE 0x1111 233 233 234 234 extern unsigned long long netxen_dma_mask; 235 + extern unsigned long last_schedule_time; 235 236 236 237 /* 237 238 * NetXen host-peg signal message structure
+1
drivers/net/netxen/netxen_nic_ethtool.c
··· 462 462 } 463 463 printk(KERN_INFO "%s: flash unlocked. \n", 464 464 netxen_nic_driver_name); 465 + last_schedule_time = jiffies; 465 466 ret = netxen_flash_erase_secondary(adapter); 466 467 if (ret != FLASH_SUCCESS) { 467 468 printk(KERN_ERR "%s: Flash erase failed.\n",
+4 -1
drivers/net/netxen/netxen_nic_hw.c
··· 822 822 { 823 823 struct netxen_adapter *adapter = port->adapter; 824 824 new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; 825 - netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, new_mtu); 825 + if (port->portnum == 0) 826 + netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, new_mtu); 827 + else if (port->portnum == 1) 828 + netxen_nic_write_w0(adapter, NETXEN_NIU_XG1_MAX_FRAME_SIZE, new_mtu); 826 829 return 0; 827 830 } 828 831
+9 -2
drivers/net/netxen/netxen_nic_init.c
··· 42 42 u32 data; 43 43 }; 44 44 45 + unsigned long last_schedule_time; 46 + 45 47 #define NETXEN_MAX_CRB_XFORM 60 46 48 static unsigned int crb_addr_xform[NETXEN_MAX_CRB_XFORM]; 47 49 #define NETXEN_ADDR_ERROR (0xffffffff) ··· 406 404 static inline int 407 405 do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) 408 406 { 407 + if (jiffies > (last_schedule_time + (8 * HZ))) { 408 + last_schedule_time = jiffies; 409 + schedule(); 410 + } 411 + 409 412 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); 410 413 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); 411 - udelay(70); /* prevent bursting on CRB */ 414 + udelay(100); /* prevent bursting on CRB */ 412 415 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 413 416 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb); 414 417 if (netxen_wait_rom_done(adapter)) { ··· 422 415 } 423 416 /* reset abyte_cnt and dummy_byte_cnt */ 424 417 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); 425 - udelay(70); /* prevent bursting on CRB */ 418 + udelay(100); /* prevent bursting on CRB */ 426 419 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 427 420 428 421 *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA);
+17 -11
drivers/net/skge.c
··· 3275 3275 struct skge_hw *hw = skge->hw; 3276 3276 unsigned port = skge->port; 3277 3277 const struct sockaddr *addr = p; 3278 + u16 ctrl; 3278 3279 3279 3280 if (!is_valid_ether_addr(addr->sa_data)) 3280 3281 return -EADDRNOTAVAIL; 3281 3282 3282 - mutex_lock(&hw->phy_mutex); 3283 3283 memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); 3284 - memcpy_toio(hw->regs + B2_MAC_1 + port*8, 3285 - dev->dev_addr, ETH_ALEN); 3286 - memcpy_toio(hw->regs + B2_MAC_2 + port*8, 3287 - dev->dev_addr, ETH_ALEN); 3288 3284 3289 - if (hw->chip_id == CHIP_ID_GENESIS) 3290 - xm_outaddr(hw, port, XM_SA, dev->dev_addr); 3291 - else { 3292 - gma_set_addr(hw, port, GM_SRC_ADDR_1L, dev->dev_addr); 3293 - gma_set_addr(hw, port, GM_SRC_ADDR_2L, dev->dev_addr); 3285 + /* disable Rx */ 3286 + ctrl = gma_read16(hw, port, GM_GP_CTRL); 3287 + gma_write16(hw, port, GM_GP_CTRL, ctrl & ~GM_GPCR_RX_ENA); 3288 + 3289 + memcpy_toio(hw->regs + B2_MAC_1 + port*8, dev->dev_addr, ETH_ALEN); 3290 + memcpy_toio(hw->regs + B2_MAC_2 + port*8, dev->dev_addr, ETH_ALEN); 3291 + 3292 + if (netif_running(dev)) { 3293 + if (hw->chip_id == CHIP_ID_GENESIS) 3294 + xm_outaddr(hw, port, XM_SA, dev->dev_addr); 3295 + else { 3296 + gma_set_addr(hw, port, GM_SRC_ADDR_1L, dev->dev_addr); 3297 + gma_set_addr(hw, port, GM_SRC_ADDR_2L, dev->dev_addr); 3298 + } 3294 3299 } 3295 - mutex_unlock(&hw->phy_mutex); 3300 + 3301 + gma_write16(hw, port, GM_GP_CTRL, ctrl); 3296 3302 3297 3303 return 0; 3298 3304 }