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 1713 /* Enable interrupts by setting the interrupt mask. */ 1714 writel(DEFAULT_INTR, ioaddr + IntrMask); 1715 - writel(1, ioaddr + IntrEnable); 1716 1717 writel(RxOn | TxOn, ioaddr + ChipCmd); 1718 writel(StatsClear, ioaddr + StatsCtrl); /* Clear Stats */ ··· 2119 struct netdev_private *np = netdev_priv(dev); 2120 void __iomem * ioaddr = ns_ioaddr(dev); 2121 2122 - if (np->hands_off) 2123 return IRQ_NONE; 2124 2125 - /* Reading automatically acknowledges. */ 2126 np->intr_status = readl(ioaddr + IntrStatus); 2127 2128 if (netif_msg_intr(np)) 2129 printk(KERN_DEBUG ··· 2136 dev->name, np->intr_status, 2137 readl(ioaddr + IntrMask)); 2138 2139 - if (!np->intr_status) 2140 - return IRQ_NONE; 2141 - 2142 prefetch(&np->rx_skbuff[np->cur_rx % RX_RING_SIZE]); 2143 2144 if (netif_rx_schedule_prep(dev)) { 2145 /* Disable interrupts and register for poll */ 2146 natsemi_irq_disable(dev); 2147 __netif_rx_schedule(dev); 2148 - } 2149 return IRQ_HANDLED; 2150 } 2151 ··· 2163 int work_done = 0; 2164 2165 do { 2166 if (np->intr_status & 2167 (IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) { 2168 spin_lock(&np->lock); ··· 2187 /* Abnormal error summary/uncommon events handlers. */ 2188 if (np->intr_status & IntrAbnormalSummary) 2189 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 2197 *budget -= work_done; 2198 dev->quota -= work_done; ··· 2414 #ifdef CONFIG_NET_POLL_CONTROLLER 2415 static void natsemi_poll_controller(struct net_device *dev) 2416 { 2417 - struct netdev_private *np = netdev_priv(dev); 2418 - 2419 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 - 2430 enable_irq(dev->irq); 2431 } 2432 #endif ··· 3075 * Could be used to send a netlink message. 3076 */ 3077 writel(WOLPkt | LinkChange, ioaddr + IntrMask); 3078 - writel(1, ioaddr + IntrEnable); 3079 } 3080 } 3081 ··· 3206 disable_irq(dev->irq); 3207 spin_lock_irq(&np->lock); 3208 3209 - writel(0, ioaddr + IntrEnable); 3210 np->hands_off = 1; 3211 natsemi_stop_rxtx(dev); 3212 netif_stop_queue(dev);
··· 1712 1713 /* Enable interrupts by setting the interrupt mask. */ 1714 writel(DEFAULT_INTR, ioaddr + IntrMask); 1715 + natsemi_irq_enable(dev); 1716 1717 writel(RxOn | TxOn, ioaddr + ChipCmd); 1718 writel(StatsClear, ioaddr + StatsCtrl); /* Clear Stats */ ··· 2119 struct netdev_private *np = netdev_priv(dev); 2120 void __iomem * ioaddr = ns_ioaddr(dev); 2121 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)) 2126 return IRQ_NONE; 2127 2128 np->intr_status = readl(ioaddr + IntrStatus); 2129 + 2130 + if (!np->intr_status) 2131 + return IRQ_NONE; 2132 2133 if (netif_msg_intr(np)) 2134 printk(KERN_DEBUG ··· 2131 dev->name, np->intr_status, 2132 readl(ioaddr + IntrMask)); 2133 2134 prefetch(&np->rx_skbuff[np->cur_rx % RX_RING_SIZE]); 2135 2136 if (netif_rx_schedule_prep(dev)) { 2137 /* Disable interrupts and register for poll */ 2138 natsemi_irq_disable(dev); 2139 __netif_rx_schedule(dev); 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 + 2146 return IRQ_HANDLED; 2147 } 2148 ··· 2156 int work_done = 0; 2157 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 + 2173 if (np->intr_status & 2174 (IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) { 2175 spin_lock(&np->lock); ··· 2166 /* Abnormal error summary/uncommon events handlers. */ 2167 if (np->intr_status & IntrAbnormalSummary) 2168 netdev_error(dev, np->intr_status); 2169 2170 *budget -= work_done; 2171 dev->quota -= work_done; ··· 2399 #ifdef CONFIG_NET_POLL_CONTROLLER 2400 static void natsemi_poll_controller(struct net_device *dev) 2401 { 2402 disable_irq(dev->irq); 2403 + intr_handler(dev->irq, dev); 2404 enable_irq(dev->irq); 2405 } 2406 #endif ··· 3071 * Could be used to send a netlink message. 3072 */ 3073 writel(WOLPkt | LinkChange, ioaddr + IntrMask); 3074 + natsemi_irq_enable(dev); 3075 } 3076 } 3077 ··· 3202 disable_irq(dev->irq); 3203 spin_lock_irq(&np->lock); 3204 3205 + natsemi_irq_disable(dev); 3206 np->hands_off = 1; 3207 natsemi_stop_rxtx(dev); 3208 netif_stop_queue(dev);
+1
drivers/net/netxen/netxen_nic.h
··· 232 #define MPORT_SINGLE_FUNCTION_MODE 0x1111 233 234 extern unsigned long long netxen_dma_mask; 235 236 /* 237 * NetXen host-peg signal message structure
··· 232 #define MPORT_SINGLE_FUNCTION_MODE 0x1111 233 234 extern unsigned long long netxen_dma_mask; 235 + extern unsigned long last_schedule_time; 236 237 /* 238 * NetXen host-peg signal message structure
+1
drivers/net/netxen/netxen_nic_ethtool.c
··· 462 } 463 printk(KERN_INFO "%s: flash unlocked. \n", 464 netxen_nic_driver_name); 465 ret = netxen_flash_erase_secondary(adapter); 466 if (ret != FLASH_SUCCESS) { 467 printk(KERN_ERR "%s: Flash erase failed.\n",
··· 462 } 463 printk(KERN_INFO "%s: flash unlocked. \n", 464 netxen_nic_driver_name); 465 + last_schedule_time = jiffies; 466 ret = netxen_flash_erase_secondary(adapter); 467 if (ret != FLASH_SUCCESS) { 468 printk(KERN_ERR "%s: Flash erase failed.\n",
+4 -1
drivers/net/netxen/netxen_nic_hw.c
··· 822 { 823 struct netxen_adapter *adapter = port->adapter; 824 new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; 825 - netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, new_mtu); 826 return 0; 827 } 828
··· 822 { 823 struct netxen_adapter *adapter = port->adapter; 824 new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; 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); 829 return 0; 830 } 831
+9 -2
drivers/net/netxen/netxen_nic_init.c
··· 42 u32 data; 43 }; 44 45 #define NETXEN_MAX_CRB_XFORM 60 46 static unsigned int crb_addr_xform[NETXEN_MAX_CRB_XFORM]; 47 #define NETXEN_ADDR_ERROR (0xffffffff) ··· 406 static inline int 407 do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) 408 { 409 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); 410 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); 411 - udelay(70); /* prevent bursting on CRB */ 412 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 413 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb); 414 if (netxen_wait_rom_done(adapter)) { ··· 422 } 423 /* reset abyte_cnt and dummy_byte_cnt */ 424 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); 425 - udelay(70); /* prevent bursting on CRB */ 426 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 427 428 *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA);
··· 42 u32 data; 43 }; 44 45 + unsigned long last_schedule_time; 46 + 47 #define NETXEN_MAX_CRB_XFORM 60 48 static unsigned int crb_addr_xform[NETXEN_MAX_CRB_XFORM]; 49 #define NETXEN_ADDR_ERROR (0xffffffff) ··· 404 static inline int 405 do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) 406 { 407 + if (jiffies > (last_schedule_time + (8 * HZ))) { 408 + last_schedule_time = jiffies; 409 + schedule(); 410 + } 411 + 412 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); 413 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); 414 + udelay(100); /* prevent bursting on CRB */ 415 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 416 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb); 417 if (netxen_wait_rom_done(adapter)) { ··· 415 } 416 /* reset abyte_cnt and dummy_byte_cnt */ 417 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); 418 + udelay(100); /* prevent bursting on CRB */ 419 netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 420 421 *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA);
+17 -11
drivers/net/skge.c
··· 3275 struct skge_hw *hw = skge->hw; 3276 unsigned port = skge->port; 3277 const struct sockaddr *addr = p; 3278 3279 if (!is_valid_ether_addr(addr->sa_data)) 3280 return -EADDRNOTAVAIL; 3281 3282 - mutex_lock(&hw->phy_mutex); 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 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); 3294 } 3295 - mutex_unlock(&hw->phy_mutex); 3296 3297 return 0; 3298 }
··· 3275 struct skge_hw *hw = skge->hw; 3276 unsigned port = skge->port; 3277 const struct sockaddr *addr = p; 3278 + u16 ctrl; 3279 3280 if (!is_valid_ether_addr(addr->sa_data)) 3281 return -EADDRNOTAVAIL; 3282 3283 memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); 3284 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 + } 3299 } 3300 + 3301 + gma_write16(hw, port, GM_GP_CTRL, ctrl); 3302 3303 return 0; 3304 }