diff options
Diffstat (limited to 'drivers/net')
34 files changed, 242 insertions, 171 deletions
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index e2ed24918a58..6e863aa9894c 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
| @@ -486,7 +486,7 @@ config SGI_IOC3_ETH_HW_TX_CSUM | |||
| 486 | 486 | ||
| 487 | config MIPS_SIM_NET | 487 | config MIPS_SIM_NET |
| 488 | tristate "MIPS simulator Network device (EXPERIMENTAL)" | 488 | tristate "MIPS simulator Network device (EXPERIMENTAL)" |
| 489 | depends on NETDEVICES && MIPS_SIM && EXPERIMENTAL | 489 | depends on MIPS_SIM && EXPERIMENTAL |
| 490 | help | 490 | help |
| 491 | The MIPSNET device is a simple Ethernet network device which is | 491 | The MIPSNET device is a simple Ethernet network device which is |
| 492 | emulated by the MIPS Simulator. | 492 | emulated by the MIPS Simulator. |
| @@ -2112,7 +2112,7 @@ config SKGE | |||
| 2112 | 2112 | ||
| 2113 | config SKY2 | 2113 | config SKY2 |
| 2114 | tristate "SysKonnect Yukon2 support (EXPERIMENTAL)" | 2114 | tristate "SysKonnect Yukon2 support (EXPERIMENTAL)" |
| 2115 | depends on PCI && EXPERIMENTAL | 2115 | depends on PCI |
| 2116 | select CRC32 | 2116 | select CRC32 |
| 2117 | ---help--- | 2117 | ---help--- |
| 2118 | This driver supports Gigabit Ethernet adapters based on the | 2118 | This driver supports Gigabit Ethernet adapters based on the |
| @@ -2120,8 +2120,8 @@ config SKY2 | |||
| 2120 | Marvell 88E8021/88E8022/88E8035/88E8036/88E8038/88E8050/88E8052/ | 2120 | Marvell 88E8021/88E8022/88E8035/88E8036/88E8038/88E8050/88E8052/ |
| 2121 | 88E8053/88E8055/88E8061/88E8062, SysKonnect SK-9E21D/SK-9S21 | 2121 | 88E8053/88E8055/88E8061/88E8062, SysKonnect SK-9E21D/SK-9S21 |
| 2122 | 2122 | ||
| 2123 | This driver does not support the original Yukon chipset: a seperate | 2123 | There is companion driver for the older Marvell Yukon and |
| 2124 | driver, skge, is provided for Yukon-based adapters. | 2124 | Genesis based adapters: skge. |
| 2125 | 2125 | ||
| 2126 | To compile this driver as a module, choose M here: the module | 2126 | To compile this driver as a module, choose M here: the module |
| 2127 | will be called sky2. This is recommended. | 2127 | will be called sky2. This is recommended. |
| @@ -2467,7 +2467,7 @@ config ISERIES_VETH | |||
| 2467 | 2467 | ||
| 2468 | config RIONET | 2468 | config RIONET |
| 2469 | tristate "RapidIO Ethernet over messaging driver support" | 2469 | tristate "RapidIO Ethernet over messaging driver support" |
| 2470 | depends on NETDEVICES && RAPIDIO | 2470 | depends on RAPIDIO |
| 2471 | 2471 | ||
| 2472 | config RIONET_TX_SIZE | 2472 | config RIONET_TX_SIZE |
| 2473 | int "Number of outbound queue entries" | 2473 | int "Number of outbound queue entries" |
| @@ -2717,6 +2717,7 @@ config PPP_MPPE | |||
| 2717 | select CRYPTO | 2717 | select CRYPTO |
| 2718 | select CRYPTO_SHA1 | 2718 | select CRYPTO_SHA1 |
| 2719 | select CRYPTO_ARC4 | 2719 | select CRYPTO_ARC4 |
| 2720 | select CRYPTO_ECB | ||
| 2720 | ---help--- | 2721 | ---help--- |
| 2721 | Support for the MPPE Encryption protocol, as employed by the | 2722 | Support for the MPPE Encryption protocol, as employed by the |
| 2722 | Microsoft Point-to-Point Tunneling Protocol. | 2723 | Microsoft Point-to-Point Tunneling Protocol. |
| @@ -2832,7 +2833,7 @@ config NET_FC | |||
| 2832 | "SCSI generic support". | 2833 | "SCSI generic support". |
| 2833 | 2834 | ||
| 2834 | config SHAPER | 2835 | config SHAPER |
| 2835 | tristate "Traffic Shaper (EXPERIMENTAL)" | 2836 | tristate "Traffic Shaper (OBSOLETE)" |
| 2836 | depends on EXPERIMENTAL | 2837 | depends on EXPERIMENTAL |
| 2837 | ---help--- | 2838 | ---help--- |
| 2838 | The traffic shaper is a virtual network device that allows you to | 2839 | The traffic shaper is a virtual network device that allows you to |
| @@ -2841,9 +2842,9 @@ config SHAPER | |||
| 2841 | these virtual devices. See | 2842 | these virtual devices. See |
| 2842 | <file:Documentation/networking/shaper.txt> for more information. | 2843 | <file:Documentation/networking/shaper.txt> for more information. |
| 2843 | 2844 | ||
| 2844 | An alternative to this traffic shaper is the experimental | 2845 | An alternative to this traffic shaper are traffic schedulers which |
| 2845 | Class-Based Queuing (CBQ) scheduling support which you get if you | 2846 | you'll get if you say Y to "QoS and/or fair queuing" in |
| 2846 | say Y to "QoS and/or fair queuing" above. | 2847 | "Networking options". |
| 2847 | 2848 | ||
| 2848 | To compile this driver as a module, choose M here: the module | 2849 | To compile this driver as a module, choose M here: the module |
| 2849 | will be called shaper. If unsure, say N. | 2850 | will be called shaper. If unsure, say N. |
diff --git a/drivers/net/arcnet/com20020.c b/drivers/net/arcnet/com20020.c index 0dc70c7b7940..aa9dd8f11269 100644 --- a/drivers/net/arcnet/com20020.c +++ b/drivers/net/arcnet/com20020.c | |||
| @@ -337,13 +337,16 @@ static void com20020_set_mc_list(struct net_device *dev) | |||
| 337 | } | 337 | } |
| 338 | } | 338 | } |
| 339 | 339 | ||
| 340 | #ifdef MODULE | 340 | #if defined(CONFIG_ARCNET_COM20020_PCI_MODULE) || \ |
| 341 | 341 | defined(CONFIG_ARCNET_COM20020_ISA_MODULE) | |
| 342 | EXPORT_SYMBOL(com20020_check); | 342 | EXPORT_SYMBOL(com20020_check); |
| 343 | EXPORT_SYMBOL(com20020_found); | 343 | EXPORT_SYMBOL(com20020_found); |
| 344 | #endif | ||
| 344 | 345 | ||
| 345 | MODULE_LICENSE("GPL"); | 346 | MODULE_LICENSE("GPL"); |
| 346 | 347 | ||
| 348 | #ifdef MODULE | ||
| 349 | |||
| 347 | int init_module(void) | 350 | int init_module(void) |
| 348 | { | 351 | { |
| 349 | BUGLVL(D_NORMAL) printk(VERSION); | 352 | BUGLVL(D_NORMAL) printk(VERSION); |
diff --git a/drivers/net/arm/ep93xx_eth.c b/drivers/net/arm/ep93xx_eth.c index 127561c782fd..8ebd68e2af98 100644 --- a/drivers/net/arm/ep93xx_eth.c +++ b/drivers/net/arm/ep93xx_eth.c | |||
| @@ -193,12 +193,9 @@ static struct net_device_stats *ep93xx_get_stats(struct net_device *dev) | |||
| 193 | static int ep93xx_rx(struct net_device *dev, int *budget) | 193 | static int ep93xx_rx(struct net_device *dev, int *budget) |
| 194 | { | 194 | { |
| 195 | struct ep93xx_priv *ep = netdev_priv(dev); | 195 | struct ep93xx_priv *ep = netdev_priv(dev); |
| 196 | int tail_offset; | ||
| 197 | int rx_done; | 196 | int rx_done; |
| 198 | int processed; | 197 | int processed; |
| 199 | 198 | ||
| 200 | tail_offset = rdl(ep, REG_RXSTSQCURADD) - ep->descs_dma_addr; | ||
| 201 | |||
| 202 | rx_done = 0; | 199 | rx_done = 0; |
| 203 | processed = 0; | 200 | processed = 0; |
| 204 | while (*budget > 0) { | 201 | while (*budget > 0) { |
| @@ -211,36 +208,28 @@ static int ep93xx_rx(struct net_device *dev, int *budget) | |||
| 211 | 208 | ||
| 212 | entry = ep->rx_pointer; | 209 | entry = ep->rx_pointer; |
| 213 | rstat = ep->descs->rstat + entry; | 210 | rstat = ep->descs->rstat + entry; |
| 214 | if ((void *)rstat - (void *)ep->descs == tail_offset) { | 211 | |
| 212 | rstat0 = rstat->rstat0; | ||
| 213 | rstat1 = rstat->rstat1; | ||
| 214 | if (!(rstat0 & RSTAT0_RFP) || !(rstat1 & RSTAT1_RFP)) { | ||
| 215 | rx_done = 1; | 215 | rx_done = 1; |
| 216 | break; | 216 | break; |
| 217 | } | 217 | } |
| 218 | 218 | ||
| 219 | rstat0 = rstat->rstat0; | ||
| 220 | rstat1 = rstat->rstat1; | ||
| 221 | rstat->rstat0 = 0; | 219 | rstat->rstat0 = 0; |
| 222 | rstat->rstat1 = 0; | 220 | rstat->rstat1 = 0; |
| 223 | 221 | ||
| 224 | if (!(rstat0 & RSTAT0_RFP)) | ||
| 225 | printk(KERN_CRIT "ep93xx_rx: buffer not done " | ||
| 226 | " %.8x %.8x\n", rstat0, rstat1); | ||
| 227 | if (!(rstat0 & RSTAT0_EOF)) | 222 | if (!(rstat0 & RSTAT0_EOF)) |
| 228 | printk(KERN_CRIT "ep93xx_rx: not end-of-frame " | 223 | printk(KERN_CRIT "ep93xx_rx: not end-of-frame " |
| 229 | " %.8x %.8x\n", rstat0, rstat1); | 224 | " %.8x %.8x\n", rstat0, rstat1); |
| 230 | if (!(rstat0 & RSTAT0_EOB)) | 225 | if (!(rstat0 & RSTAT0_EOB)) |
| 231 | printk(KERN_CRIT "ep93xx_rx: not end-of-buffer " | 226 | printk(KERN_CRIT "ep93xx_rx: not end-of-buffer " |
| 232 | " %.8x %.8x\n", rstat0, rstat1); | 227 | " %.8x %.8x\n", rstat0, rstat1); |
| 233 | if (!(rstat1 & RSTAT1_RFP)) | ||
| 234 | printk(KERN_CRIT "ep93xx_rx: buffer1 not done " | ||
| 235 | " %.8x %.8x\n", rstat0, rstat1); | ||
| 236 | if ((rstat1 & RSTAT1_BUFFER_INDEX) >> 16 != entry) | 228 | if ((rstat1 & RSTAT1_BUFFER_INDEX) >> 16 != entry) |
| 237 | printk(KERN_CRIT "ep93xx_rx: entry mismatch " | 229 | printk(KERN_CRIT "ep93xx_rx: entry mismatch " |
| 238 | " %.8x %.8x\n", rstat0, rstat1); | 230 | " %.8x %.8x\n", rstat0, rstat1); |
| 239 | 231 | ||
| 240 | if (!(rstat0 & RSTAT0_RWE)) { | 232 | if (!(rstat0 & RSTAT0_RWE)) { |
| 241 | printk(KERN_NOTICE "ep93xx_rx: receive error " | ||
| 242 | " %.8x %.8x\n", rstat0, rstat1); | ||
| 243 | |||
| 244 | ep->stats.rx_errors++; | 233 | ep->stats.rx_errors++; |
| 245 | if (rstat0 & RSTAT0_OE) | 234 | if (rstat0 & RSTAT0_OE) |
| 246 | ep->stats.rx_fifo_errors++; | 235 | ep->stats.rx_fifo_errors++; |
| @@ -301,13 +290,8 @@ err: | |||
| 301 | 290 | ||
| 302 | static int ep93xx_have_more_rx(struct ep93xx_priv *ep) | 291 | static int ep93xx_have_more_rx(struct ep93xx_priv *ep) |
| 303 | { | 292 | { |
| 304 | struct ep93xx_rstat *rstat; | 293 | struct ep93xx_rstat *rstat = ep->descs->rstat + ep->rx_pointer; |
| 305 | int tail_offset; | 294 | return !!((rstat->rstat0 & RSTAT0_RFP) && (rstat->rstat1 & RSTAT1_RFP)); |
| 306 | |||
| 307 | rstat = ep->descs->rstat + ep->rx_pointer; | ||
| 308 | tail_offset = rdl(ep, REG_RXSTSQCURADD) - ep->descs_dma_addr; | ||
| 309 | |||
| 310 | return !((void *)rstat - (void *)ep->descs == tail_offset); | ||
| 311 | } | 295 | } |
| 312 | 296 | ||
| 313 | static int ep93xx_poll(struct net_device *dev, int *budget) | 297 | static int ep93xx_poll(struct net_device *dev, int *budget) |
| @@ -347,7 +331,7 @@ static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 347 | struct ep93xx_priv *ep = netdev_priv(dev); | 331 | struct ep93xx_priv *ep = netdev_priv(dev); |
| 348 | int entry; | 332 | int entry; |
| 349 | 333 | ||
| 350 | if (unlikely(skb->len) > MAX_PKT_SIZE) { | 334 | if (unlikely(skb->len > MAX_PKT_SIZE)) { |
| 351 | ep->stats.tx_dropped++; | 335 | ep->stats.tx_dropped++; |
| 352 | dev_kfree_skb(skb); | 336 | dev_kfree_skb(skb); |
| 353 | return NETDEV_TX_OK; | 337 | return NETDEV_TX_OK; |
| @@ -379,10 +363,8 @@ static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 379 | static void ep93xx_tx_complete(struct net_device *dev) | 363 | static void ep93xx_tx_complete(struct net_device *dev) |
| 380 | { | 364 | { |
| 381 | struct ep93xx_priv *ep = netdev_priv(dev); | 365 | struct ep93xx_priv *ep = netdev_priv(dev); |
| 382 | int tail_offset; | ||
| 383 | int wake; | 366 | int wake; |
| 384 | 367 | ||
| 385 | tail_offset = rdl(ep, REG_TXSTSQCURADD) - ep->descs_dma_addr; | ||
| 386 | wake = 0; | 368 | wake = 0; |
| 387 | 369 | ||
| 388 | spin_lock(&ep->tx_pending_lock); | 370 | spin_lock(&ep->tx_pending_lock); |
| @@ -393,15 +375,13 @@ static void ep93xx_tx_complete(struct net_device *dev) | |||
| 393 | 375 | ||
| 394 | entry = ep->tx_clean_pointer; | 376 | entry = ep->tx_clean_pointer; |
| 395 | tstat = ep->descs->tstat + entry; | 377 | tstat = ep->descs->tstat + entry; |
| 396 | if ((void *)tstat - (void *)ep->descs == tail_offset) | ||
| 397 | break; | ||
| 398 | 378 | ||
| 399 | tstat0 = tstat->tstat0; | 379 | tstat0 = tstat->tstat0; |
| 380 | if (!(tstat0 & TSTAT0_TXFP)) | ||
| 381 | break; | ||
| 382 | |||
| 400 | tstat->tstat0 = 0; | 383 | tstat->tstat0 = 0; |
| 401 | 384 | ||
| 402 | if (!(tstat0 & TSTAT0_TXFP)) | ||
| 403 | printk(KERN_CRIT "ep93xx_tx_complete: buffer not done " | ||
| 404 | " %.8x\n", tstat0); | ||
| 405 | if (tstat0 & TSTAT0_FA) | 385 | if (tstat0 & TSTAT0_FA) |
| 406 | printk(KERN_CRIT "ep93xx_tx_complete: frame aborted " | 386 | printk(KERN_CRIT "ep93xx_tx_complete: frame aborted " |
| 407 | " %.8x\n", tstat0); | 387 | " %.8x\n", tstat0); |
diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c index 4873dc610d22..7db3c8af0894 100644 --- a/drivers/net/au1000_eth.c +++ b/drivers/net/au1000_eth.c | |||
| @@ -102,7 +102,7 @@ static void enable_mac(struct net_device *, int); | |||
| 102 | // externs | 102 | // externs |
| 103 | extern int get_ethernet_addr(char *ethernet_addr); | 103 | extern int get_ethernet_addr(char *ethernet_addr); |
| 104 | extern void str2eaddr(unsigned char *ea, unsigned char *str); | 104 | extern void str2eaddr(unsigned char *ea, unsigned char *str); |
| 105 | extern char * __init prom_getcmdline(void); | 105 | extern char * prom_getcmdline(void); |
| 106 | 106 | ||
| 107 | /* | 107 | /* |
| 108 | * Theory of operation | 108 | * Theory of operation |
diff --git a/drivers/net/b44.c b/drivers/net/b44.c index 1ec217433b4c..474a4e3438db 100644 --- a/drivers/net/b44.c +++ b/drivers/net/b44.c | |||
| @@ -908,8 +908,9 @@ static irqreturn_t b44_interrupt(int irq, void *dev_id) | |||
| 908 | istat = br32(bp, B44_ISTAT); | 908 | istat = br32(bp, B44_ISTAT); |
| 909 | imask = br32(bp, B44_IMASK); | 909 | imask = br32(bp, B44_IMASK); |
| 910 | 910 | ||
| 911 | /* ??? What the fuck is the purpose of the interrupt mask | 911 | /* The interrupt mask register controls which interrupt bits |
| 912 | * ??? register if we have to mask it out by hand anyways? | 912 | * will actually raise an interrupt to the CPU when set by hw/firmware, |
| 913 | * but doesn't mask off the bits. | ||
| 913 | */ | 914 | */ |
| 914 | istat &= imask; | 915 | istat &= imask; |
| 915 | if (istat) { | 916 | if (istat) { |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index c0bbddae4ec4..17a461152d39 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -4692,6 +4692,8 @@ static int bond_check_params(struct bond_params *params) | |||
| 4692 | return 0; | 4692 | return 0; |
| 4693 | } | 4693 | } |
| 4694 | 4694 | ||
| 4695 | static struct lock_class_key bonding_netdev_xmit_lock_key; | ||
| 4696 | |||
| 4695 | /* Create a new bond based on the specified name and bonding parameters. | 4697 | /* Create a new bond based on the specified name and bonding parameters. |
| 4696 | * Caller must NOT hold rtnl_lock; we need to release it here before we | 4698 | * Caller must NOT hold rtnl_lock; we need to release it here before we |
| 4697 | * set up our sysfs entries. | 4699 | * set up our sysfs entries. |
| @@ -4727,6 +4729,9 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond | |||
| 4727 | if (res < 0) { | 4729 | if (res < 0) { |
| 4728 | goto out_bond; | 4730 | goto out_bond; |
| 4729 | } | 4731 | } |
| 4732 | |||
| 4733 | lockdep_set_class(&bond_dev->_xmit_lock, &bonding_netdev_xmit_lock_key); | ||
| 4734 | |||
| 4730 | if (newbond) | 4735 | if (newbond) |
| 4731 | *newbond = bond_dev->priv; | 4736 | *newbond = bond_dev->priv; |
| 4732 | 4737 | ||
diff --git a/drivers/net/cris/eth_v10.c b/drivers/net/cris/eth_v10.c index 966b563e42bb..a03d781f6d0a 100644 --- a/drivers/net/cris/eth_v10.c +++ b/drivers/net/cris/eth_v10.c | |||
| @@ -509,6 +509,8 @@ etrax_ethernet_init(void) | |||
| 509 | * does not share cacheline with any other data (to avoid cache bug) | 509 | * does not share cacheline with any other data (to avoid cache bug) |
| 510 | */ | 510 | */ |
| 511 | RxDescList[i].skb = dev_alloc_skb(MAX_MEDIA_DATA_SIZE + 2 * L1_CACHE_BYTES); | 511 | RxDescList[i].skb = dev_alloc_skb(MAX_MEDIA_DATA_SIZE + 2 * L1_CACHE_BYTES); |
| 512 | if (!RxDescList[i].skb) | ||
| 513 | return -ENOMEM; | ||
| 512 | RxDescList[i].descr.ctrl = 0; | 514 | RxDescList[i].descr.ctrl = 0; |
| 513 | RxDescList[i].descr.sw_len = MAX_MEDIA_DATA_SIZE; | 515 | RxDescList[i].descr.sw_len = MAX_MEDIA_DATA_SIZE; |
| 514 | RxDescList[i].descr.next = virt_to_phys(&RxDescList[i + 1]); | 516 | RxDescList[i].descr.next = virt_to_phys(&RxDescList[i + 1]); |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index a3a08a5dd185..19ab3441269c 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
| @@ -2719,7 +2719,10 @@ static int e100_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 2719 | struct net_device *netdev = pci_get_drvdata(pdev); | 2719 | struct net_device *netdev = pci_get_drvdata(pdev); |
| 2720 | struct nic *nic = netdev_priv(netdev); | 2720 | struct nic *nic = netdev_priv(netdev); |
| 2721 | 2721 | ||
| 2722 | netif_poll_disable(nic->netdev); | 2722 | #ifdef CONFIG_E100_NAPI |
| 2723 | if (netif_running(netdev)) | ||
| 2724 | netif_poll_disable(nic->netdev); | ||
| 2725 | #endif | ||
| 2723 | del_timer_sync(&nic->watchdog); | 2726 | del_timer_sync(&nic->watchdog); |
| 2724 | netif_carrier_off(nic->netdev); | 2727 | netif_carrier_off(nic->netdev); |
| 2725 | 2728 | ||
| @@ -2763,7 +2766,10 @@ static void e100_shutdown(struct pci_dev *pdev) | |||
| 2763 | struct net_device *netdev = pci_get_drvdata(pdev); | 2766 | struct net_device *netdev = pci_get_drvdata(pdev); |
| 2764 | struct nic *nic = netdev_priv(netdev); | 2767 | struct nic *nic = netdev_priv(netdev); |
| 2765 | 2768 | ||
| 2766 | netif_poll_disable(nic->netdev); | 2769 | #ifdef CONFIG_E100_NAPI |
| 2770 | if (netif_running(netdev)) | ||
| 2771 | netif_poll_disable(nic->netdev); | ||
| 2772 | #endif | ||
| 2767 | del_timer_sync(&nic->watchdog); | 2773 | del_timer_sync(&nic->watchdog); |
| 2768 | netif_carrier_off(nic->netdev); | 2774 | netif_carrier_off(nic->netdev); |
| 2769 | 2775 | ||
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index 773821e4cf57..c564adbd669b 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
| @@ -461,7 +461,8 @@ e1000_get_regs(struct net_device *netdev, | |||
| 461 | regs_buff[24] = (uint32_t)phy_data; /* phy local receiver status */ | 461 | regs_buff[24] = (uint32_t)phy_data; /* phy local receiver status */ |
| 462 | regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ | 462 | regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ |
| 463 | if (hw->mac_type >= e1000_82540 && | 463 | if (hw->mac_type >= e1000_82540 && |
| 464 | hw->media_type == e1000_media_type_copper) { | 464 | hw->mac_type < e1000_82571 && |
| 465 | hw->media_type == e1000_media_type_copper) { | ||
| 465 | regs_buff[26] = E1000_READ_REG(hw, MANC); | 466 | regs_buff[26] = E1000_READ_REG(hw, MANC); |
| 466 | } | 467 | } |
| 467 | } | 468 | } |
| @@ -1690,6 +1691,7 @@ static int e1000_wol_exclusion(struct e1000_adapter *adapter, struct ethtool_wol | |||
| 1690 | int retval = 1; /* fail by default */ | 1691 | int retval = 1; /* fail by default */ |
| 1691 | 1692 | ||
| 1692 | switch (hw->device_id) { | 1693 | switch (hw->device_id) { |
| 1694 | case E1000_DEV_ID_82542: | ||
| 1693 | case E1000_DEV_ID_82543GC_FIBER: | 1695 | case E1000_DEV_ID_82543GC_FIBER: |
| 1694 | case E1000_DEV_ID_82543GC_COPPER: | 1696 | case E1000_DEV_ID_82543GC_COPPER: |
| 1695 | case E1000_DEV_ID_82544EI_FIBER: | 1697 | case E1000_DEV_ID_82544EI_FIBER: |
diff --git a/drivers/net/e1000/e1000_hw.h b/drivers/net/e1000/e1000_hw.h index 112447fd8bf2..449a60303e07 100644 --- a/drivers/net/e1000/e1000_hw.h +++ b/drivers/net/e1000/e1000_hw.h | |||
| @@ -1961,9 +1961,9 @@ struct e1000_hw { | |||
| 1961 | #define E1000_RXDCTL_GRAN 0x01000000 /* RXDCTL Granularity */ | 1961 | #define E1000_RXDCTL_GRAN 0x01000000 /* RXDCTL Granularity */ |
| 1962 | 1962 | ||
| 1963 | /* Transmit Descriptor Control */ | 1963 | /* Transmit Descriptor Control */ |
| 1964 | #define E1000_TXDCTL_PTHRESH 0x000000FF /* TXDCTL Prefetch Threshold */ | 1964 | #define E1000_TXDCTL_PTHRESH 0x0000003F /* TXDCTL Prefetch Threshold */ |
| 1965 | #define E1000_TXDCTL_HTHRESH 0x0000FF00 /* TXDCTL Host Threshold */ | 1965 | #define E1000_TXDCTL_HTHRESH 0x00003F00 /* TXDCTL Host Threshold */ |
| 1966 | #define E1000_TXDCTL_WTHRESH 0x00FF0000 /* TXDCTL Writeback Threshold */ | 1966 | #define E1000_TXDCTL_WTHRESH 0x003F0000 /* TXDCTL Writeback Threshold */ |
| 1967 | #define E1000_TXDCTL_GRAN 0x01000000 /* TXDCTL Granularity */ | 1967 | #define E1000_TXDCTL_GRAN 0x01000000 /* TXDCTL Granularity */ |
| 1968 | #define E1000_TXDCTL_LWTHRESH 0xFE000000 /* TXDCTL Low Threshold */ | 1968 | #define E1000_TXDCTL_LWTHRESH 0xFE000000 /* TXDCTL Low Threshold */ |
| 1969 | #define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000 /* GRAN=1, WTHRESH=1 */ | 1969 | #define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000 /* GRAN=1, WTHRESH=1 */ |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index fa849831d099..726ec5e88ab2 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
| @@ -35,7 +35,7 @@ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; | |||
| 35 | #else | 35 | #else |
| 36 | #define DRIVERNAPI "-NAPI" | 36 | #define DRIVERNAPI "-NAPI" |
| 37 | #endif | 37 | #endif |
| 38 | #define DRV_VERSION "7.2.9-k2"DRIVERNAPI | 38 | #define DRV_VERSION "7.2.9-k4"DRIVERNAPI |
| 39 | char e1000_driver_version[] = DRV_VERSION; | 39 | char e1000_driver_version[] = DRV_VERSION; |
| 40 | static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; | 40 | static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; |
| 41 | 41 | ||
| @@ -699,7 +699,10 @@ e1000_reset(struct e1000_adapter *adapter) | |||
| 699 | phy_data); | 699 | phy_data); |
| 700 | } | 700 | } |
| 701 | 701 | ||
| 702 | if ((adapter->en_mng_pt) && (adapter->hw.mac_type < e1000_82571)) { | 702 | if ((adapter->en_mng_pt) && |
| 703 | (adapter->hw.mac_type >= e1000_82540) && | ||
| 704 | (adapter->hw.mac_type < e1000_82571) && | ||
| 705 | (adapter->hw.media_type == e1000_media_type_copper)) { | ||
| 703 | manc = E1000_READ_REG(&adapter->hw, MANC); | 706 | manc = E1000_READ_REG(&adapter->hw, MANC); |
| 704 | manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST); | 707 | manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST); |
| 705 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | 708 | E1000_WRITE_REG(&adapter->hw, MANC, manc); |
| @@ -1076,8 +1079,9 @@ e1000_remove(struct pci_dev *pdev) | |||
| 1076 | 1079 | ||
| 1077 | flush_scheduled_work(); | 1080 | flush_scheduled_work(); |
| 1078 | 1081 | ||
| 1079 | if (adapter->hw.mac_type < e1000_82571 && | 1082 | if (adapter->hw.mac_type >= e1000_82540 && |
| 1080 | adapter->hw.media_type == e1000_media_type_copper) { | 1083 | adapter->hw.mac_type < e1000_82571 && |
| 1084 | adapter->hw.media_type == e1000_media_type_copper) { | ||
| 1081 | manc = E1000_READ_REG(&adapter->hw, MANC); | 1085 | manc = E1000_READ_REG(&adapter->hw, MANC); |
| 1082 | if (manc & E1000_MANC_SMBUS_EN) { | 1086 | if (manc & E1000_MANC_SMBUS_EN) { |
| 1083 | manc |= E1000_MANC_ARP_EN; | 1087 | manc |= E1000_MANC_ARP_EN; |
| @@ -1804,9 +1808,11 @@ e1000_setup_rctl(struct e1000_adapter *adapter) | |||
| 1804 | * followed by the page buffers. Therefore, skb->data is | 1808 | * followed by the page buffers. Therefore, skb->data is |
| 1805 | * sized to hold the largest protocol header. | 1809 | * sized to hold the largest protocol header. |
| 1806 | */ | 1810 | */ |
| 1811 | /* allocations using alloc_page take too long for regular MTU | ||
| 1812 | * so only enable packet split for jumbo frames */ | ||
| 1807 | pages = PAGE_USE_COUNT(adapter->netdev->mtu); | 1813 | pages = PAGE_USE_COUNT(adapter->netdev->mtu); |
| 1808 | if ((adapter->hw.mac_type > e1000_82547_rev_2) && (pages <= 3) && | 1814 | if ((adapter->hw.mac_type >= e1000_82571) && (pages <= 3) && |
| 1809 | PAGE_SIZE <= 16384) | 1815 | PAGE_SIZE <= 16384 && (rctl & E1000_RCTL_LPE)) |
| 1810 | adapter->rx_ps_pages = pages; | 1816 | adapter->rx_ps_pages = pages; |
| 1811 | else | 1817 | else |
| 1812 | adapter->rx_ps_pages = 0; | 1818 | adapter->rx_ps_pages = 0; |
| @@ -2986,6 +2992,11 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
| 2986 | return NETDEV_TX_OK; | 2992 | return NETDEV_TX_OK; |
| 2987 | } | 2993 | } |
| 2988 | 2994 | ||
| 2995 | /* 82571 and newer doesn't need the workaround that limited descriptor | ||
| 2996 | * length to 4kB */ | ||
| 2997 | if (adapter->hw.mac_type >= e1000_82571) | ||
| 2998 | max_per_txd = 8192; | ||
| 2999 | |||
| 2989 | #ifdef NETIF_F_TSO | 3000 | #ifdef NETIF_F_TSO |
| 2990 | mss = skb_shinfo(skb)->gso_size; | 3001 | mss = skb_shinfo(skb)->gso_size; |
| 2991 | /* The controller does a simple calculation to | 3002 | /* The controller does a simple calculation to |
| @@ -3775,9 +3786,6 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
| 3775 | 3786 | ||
| 3776 | length = le16_to_cpu(rx_desc->length); | 3787 | length = le16_to_cpu(rx_desc->length); |
| 3777 | 3788 | ||
| 3778 | /* adjust length to remove Ethernet CRC */ | ||
| 3779 | length -= 4; | ||
| 3780 | |||
| 3781 | if (unlikely(!(status & E1000_RXD_STAT_EOP))) { | 3789 | if (unlikely(!(status & E1000_RXD_STAT_EOP))) { |
| 3782 | /* All receives must fit into a single buffer */ | 3790 | /* All receives must fit into a single buffer */ |
| 3783 | E1000_DBG("%s: Receive packet consumed multiple" | 3791 | E1000_DBG("%s: Receive packet consumed multiple" |
| @@ -3805,6 +3813,10 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
| 3805 | } | 3813 | } |
| 3806 | } | 3814 | } |
| 3807 | 3815 | ||
| 3816 | /* adjust length to remove Ethernet CRC, this must be | ||
| 3817 | * done after the TBI_ACCEPT workaround above */ | ||
| 3818 | length -= 4; | ||
| 3819 | |||
| 3808 | /* code added for copybreak, this should improve | 3820 | /* code added for copybreak, this should improve |
| 3809 | * performance for small packets with large amounts | 3821 | * performance for small packets with large amounts |
| 3810 | * of reassembly being done in the stack */ | 3822 | * of reassembly being done in the stack */ |
| @@ -4773,8 +4785,9 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 4773 | pci_enable_wake(pdev, PCI_D3cold, 0); | 4785 | pci_enable_wake(pdev, PCI_D3cold, 0); |
| 4774 | } | 4786 | } |
| 4775 | 4787 | ||
| 4776 | if (adapter->hw.mac_type < e1000_82571 && | 4788 | if (adapter->hw.mac_type >= e1000_82540 && |
| 4777 | adapter->hw.media_type == e1000_media_type_copper) { | 4789 | adapter->hw.mac_type < e1000_82571 && |
| 4790 | adapter->hw.media_type == e1000_media_type_copper) { | ||
| 4778 | manc = E1000_READ_REG(&adapter->hw, MANC); | 4791 | manc = E1000_READ_REG(&adapter->hw, MANC); |
| 4779 | if (manc & E1000_MANC_SMBUS_EN) { | 4792 | if (manc & E1000_MANC_SMBUS_EN) { |
| 4780 | manc |= E1000_MANC_ARP_EN; | 4793 | manc |= E1000_MANC_ARP_EN; |
| @@ -4787,6 +4800,9 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 4787 | if (adapter->hw.phy_type == e1000_phy_igp_3) | 4800 | if (adapter->hw.phy_type == e1000_phy_igp_3) |
| 4788 | e1000_phy_powerdown_workaround(&adapter->hw); | 4801 | e1000_phy_powerdown_workaround(&adapter->hw); |
| 4789 | 4802 | ||
| 4803 | if (netif_running(netdev)) | ||
| 4804 | e1000_free_irq(adapter); | ||
| 4805 | |||
| 4790 | /* Release control of h/w to f/w. If f/w is AMT enabled, this | 4806 | /* Release control of h/w to f/w. If f/w is AMT enabled, this |
| 4791 | * would have already happened in close and is redundant. */ | 4807 | * would have already happened in close and is redundant. */ |
| 4792 | e1000_release_hw_control(adapter); | 4808 | e1000_release_hw_control(adapter); |
| @@ -4817,6 +4833,10 @@ e1000_resume(struct pci_dev *pdev) | |||
| 4817 | pci_enable_wake(pdev, PCI_D3hot, 0); | 4833 | pci_enable_wake(pdev, PCI_D3hot, 0); |
| 4818 | pci_enable_wake(pdev, PCI_D3cold, 0); | 4834 | pci_enable_wake(pdev, PCI_D3cold, 0); |
| 4819 | 4835 | ||
| 4836 | if (netif_running(netdev) && (err = e1000_request_irq(adapter))) | ||
| 4837 | return err; | ||
| 4838 | |||
| 4839 | e1000_power_up_phy(adapter); | ||
| 4820 | e1000_reset(adapter); | 4840 | e1000_reset(adapter); |
| 4821 | E1000_WRITE_REG(&adapter->hw, WUS, ~0); | 4841 | E1000_WRITE_REG(&adapter->hw, WUS, ~0); |
| 4822 | 4842 | ||
| @@ -4825,8 +4845,9 @@ e1000_resume(struct pci_dev *pdev) | |||
| 4825 | 4845 | ||
| 4826 | netif_device_attach(netdev); | 4846 | netif_device_attach(netdev); |
| 4827 | 4847 | ||
| 4828 | if (adapter->hw.mac_type < e1000_82571 && | 4848 | if (adapter->hw.mac_type >= e1000_82540 && |
| 4829 | adapter->hw.media_type == e1000_media_type_copper) { | 4849 | adapter->hw.mac_type < e1000_82571 && |
| 4850 | adapter->hw.media_type == e1000_media_type_copper) { | ||
| 4830 | manc = E1000_READ_REG(&adapter->hw, MANC); | 4851 | manc = E1000_READ_REG(&adapter->hw, MANC); |
| 4831 | manc &= ~(E1000_MANC_ARP_EN); | 4852 | manc &= ~(E1000_MANC_ARP_EN); |
| 4832 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | 4853 | E1000_WRITE_REG(&adapter->hw, MANC, manc); |
| @@ -4944,6 +4965,7 @@ static void e1000_io_resume(struct pci_dev *pdev) | |||
| 4944 | netif_device_attach(netdev); | 4965 | netif_device_attach(netdev); |
| 4945 | 4966 | ||
| 4946 | if (adapter->hw.mac_type >= e1000_82540 && | 4967 | if (adapter->hw.mac_type >= e1000_82540 && |
| 4968 | adapter->hw.mac_type < e1000_82571 && | ||
| 4947 | adapter->hw.media_type == e1000_media_type_copper) { | 4969 | adapter->hw.media_type == e1000_media_type_copper) { |
| 4948 | manc = E1000_READ_REG(&adapter->hw, MANC); | 4970 | manc = E1000_READ_REG(&adapter->hw, MANC); |
| 4949 | manc &= ~(E1000_MANC_ARP_EN); | 4971 | manc &= ~(E1000_MANC_ARP_EN); |
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index b40724fc6b74..39ad9f73d1ec 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
| @@ -39,7 +39,7 @@ | |||
| 39 | #include <asm/io.h> | 39 | #include <asm/io.h> |
| 40 | 40 | ||
| 41 | #define DRV_NAME "ehea" | 41 | #define DRV_NAME "ehea" |
| 42 | #define DRV_VERSION "EHEA_0034" | 42 | #define DRV_VERSION "EHEA_0043" |
| 43 | 43 | ||
| 44 | #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ | 44 | #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ |
| 45 | | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) | 45 | | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) |
| @@ -105,9 +105,6 @@ | |||
| 105 | #define EHEA_BCMC_VLANID_ALL 0x01 | 105 | #define EHEA_BCMC_VLANID_ALL 0x01 |
| 106 | #define EHEA_BCMC_VLANID_SINGLE 0x00 | 106 | #define EHEA_BCMC_VLANID_SINGLE 0x00 |
| 107 | 107 | ||
| 108 | /* Use this define to kmallocate pHYP control blocks */ | ||
| 109 | #define H_CB_ALIGNMENT 4096 | ||
| 110 | |||
| 111 | #define EHEA_CACHE_LINE 128 | 108 | #define EHEA_CACHE_LINE 128 |
| 112 | 109 | ||
| 113 | /* Memory Regions */ | 110 | /* Memory Regions */ |
diff --git a/drivers/net/ehea/ehea_ethtool.c b/drivers/net/ehea/ehea_ethtool.c index 82eb2fb8c75e..9f57c2e78ced 100644 --- a/drivers/net/ehea/ehea_ethtool.c +++ b/drivers/net/ehea/ehea_ethtool.c | |||
| @@ -238,7 +238,7 @@ static void ehea_get_ethtool_stats(struct net_device *dev, | |||
| 238 | data[i++] = port->port_res[0].swqe_refill_th; | 238 | data[i++] = port->port_res[0].swqe_refill_th; |
| 239 | data[i++] = port->resets; | 239 | data[i++] = port->resets; |
| 240 | 240 | ||
| 241 | cb6 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 241 | cb6 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
| 242 | if (!cb6) { | 242 | if (!cb6) { |
| 243 | ehea_error("no mem for cb6"); | 243 | ehea_error("no mem for cb6"); |
| 244 | return; | 244 | return; |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index eb7d44de59ff..6ad696101418 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
| @@ -92,7 +92,7 @@ static struct net_device_stats *ehea_get_stats(struct net_device *dev) | |||
| 92 | 92 | ||
| 93 | memset(stats, 0, sizeof(*stats)); | 93 | memset(stats, 0, sizeof(*stats)); |
| 94 | 94 | ||
| 95 | cb2 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 95 | cb2 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
| 96 | if (!cb2) { | 96 | if (!cb2) { |
| 97 | ehea_error("no mem for cb2"); | 97 | ehea_error("no mem for cb2"); |
| 98 | goto out; | 98 | goto out; |
| @@ -586,8 +586,8 @@ int ehea_sense_port_attr(struct ehea_port *port) | |||
| 586 | u64 hret; | 586 | u64 hret; |
| 587 | struct hcp_ehea_port_cb0 *cb0; | 587 | struct hcp_ehea_port_cb0 *cb0; |
| 588 | 588 | ||
| 589 | cb0 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 589 | cb0 = kzalloc(PAGE_SIZE, GFP_ATOMIC); /* May be called via */ |
| 590 | if (!cb0) { | 590 | if (!cb0) { /* ehea_neq_tasklet() */ |
| 591 | ehea_error("no mem for cb0"); | 591 | ehea_error("no mem for cb0"); |
| 592 | ret = -ENOMEM; | 592 | ret = -ENOMEM; |
| 593 | goto out; | 593 | goto out; |
| @@ -670,7 +670,7 @@ int ehea_set_portspeed(struct ehea_port *port, u32 port_speed) | |||
| 670 | u64 hret; | 670 | u64 hret; |
| 671 | int ret = 0; | 671 | int ret = 0; |
| 672 | 672 | ||
| 673 | cb4 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 673 | cb4 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
| 674 | if (!cb4) { | 674 | if (!cb4) { |
| 675 | ehea_error("no mem for cb4"); | 675 | ehea_error("no mem for cb4"); |
| 676 | ret = -ENOMEM; | 676 | ret = -ENOMEM; |
| @@ -765,8 +765,7 @@ static void ehea_parse_eqe(struct ehea_adapter *adapter, u64 eqe) | |||
| 765 | 765 | ||
| 766 | if (EHEA_BMASK_GET(NEQE_PORT_UP, eqe)) { | 766 | if (EHEA_BMASK_GET(NEQE_PORT_UP, eqe)) { |
| 767 | if (!netif_carrier_ok(port->netdev)) { | 767 | if (!netif_carrier_ok(port->netdev)) { |
| 768 | ret = ehea_sense_port_attr( | 768 | ret = ehea_sense_port_attr(port); |
| 769 | port); | ||
| 770 | if (ret) { | 769 | if (ret) { |
| 771 | ehea_error("failed resensing port " | 770 | ehea_error("failed resensing port " |
| 772 | "attributes"); | 771 | "attributes"); |
| @@ -986,7 +985,7 @@ static int ehea_configure_port(struct ehea_port *port) | |||
| 986 | struct hcp_ehea_port_cb0 *cb0; | 985 | struct hcp_ehea_port_cb0 *cb0; |
| 987 | 986 | ||
| 988 | ret = -ENOMEM; | 987 | ret = -ENOMEM; |
| 989 | cb0 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 988 | cb0 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
| 990 | if (!cb0) | 989 | if (!cb0) |
| 991 | goto out; | 990 | goto out; |
| 992 | 991 | ||
| @@ -1444,7 +1443,7 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa) | |||
| 1444 | goto out; | 1443 | goto out; |
| 1445 | } | 1444 | } |
| 1446 | 1445 | ||
| 1447 | cb0 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1446 | cb0 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
| 1448 | if (!cb0) { | 1447 | if (!cb0) { |
| 1449 | ehea_error("no mem for cb0"); | 1448 | ehea_error("no mem for cb0"); |
| 1450 | ret = -ENOMEM; | 1449 | ret = -ENOMEM; |
| @@ -1502,7 +1501,7 @@ static void ehea_promiscuous(struct net_device *dev, int enable) | |||
| 1502 | if ((enable && port->promisc) || (!enable && !port->promisc)) | 1501 | if ((enable && port->promisc) || (!enable && !port->promisc)) |
| 1503 | return; | 1502 | return; |
| 1504 | 1503 | ||
| 1505 | cb7 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1504 | cb7 = kzalloc(PAGE_SIZE, GFP_ATOMIC); |
| 1506 | if (!cb7) { | 1505 | if (!cb7) { |
| 1507 | ehea_error("no mem for cb7"); | 1506 | ehea_error("no mem for cb7"); |
| 1508 | goto out; | 1507 | goto out; |
| @@ -1606,7 +1605,7 @@ static void ehea_add_multicast_entry(struct ehea_port* port, u8* mc_mac_addr) | |||
| 1606 | struct ehea_mc_list *ehea_mcl_entry; | 1605 | struct ehea_mc_list *ehea_mcl_entry; |
| 1607 | u64 hret; | 1606 | u64 hret; |
| 1608 | 1607 | ||
| 1609 | ehea_mcl_entry = kzalloc(sizeof(*ehea_mcl_entry), GFP_KERNEL); | 1608 | ehea_mcl_entry = kzalloc(sizeof(*ehea_mcl_entry), GFP_ATOMIC); |
| 1610 | if (!ehea_mcl_entry) { | 1609 | if (!ehea_mcl_entry) { |
| 1611 | ehea_error("no mem for mcl_entry"); | 1610 | ehea_error("no mem for mcl_entry"); |
| 1612 | return; | 1611 | return; |
| @@ -1871,7 +1870,7 @@ static void ehea_vlan_rx_register(struct net_device *dev, | |||
| 1871 | 1870 | ||
| 1872 | port->vgrp = grp; | 1871 | port->vgrp = grp; |
| 1873 | 1872 | ||
| 1874 | cb1 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1873 | cb1 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
| 1875 | if (!cb1) { | 1874 | if (!cb1) { |
| 1876 | ehea_error("no mem for cb1"); | 1875 | ehea_error("no mem for cb1"); |
| 1877 | goto out; | 1876 | goto out; |
| @@ -1900,7 +1899,7 @@ static void ehea_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) | |||
| 1900 | int index; | 1899 | int index; |
| 1901 | u64 hret; | 1900 | u64 hret; |
| 1902 | 1901 | ||
| 1903 | cb1 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1902 | cb1 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
| 1904 | if (!cb1) { | 1903 | if (!cb1) { |
| 1905 | ehea_error("no mem for cb1"); | 1904 | ehea_error("no mem for cb1"); |
| 1906 | goto out; | 1905 | goto out; |
| @@ -1936,7 +1935,7 @@ static void ehea_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
| 1936 | if (port->vgrp) | 1935 | if (port->vgrp) |
| 1937 | port->vgrp->vlan_devices[vid] = NULL; | 1936 | port->vgrp->vlan_devices[vid] = NULL; |
| 1938 | 1937 | ||
| 1939 | cb1 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1938 | cb1 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
| 1940 | if (!cb1) { | 1939 | if (!cb1) { |
| 1941 | ehea_error("no mem for cb1"); | 1940 | ehea_error("no mem for cb1"); |
| 1942 | goto out; | 1941 | goto out; |
| @@ -1969,7 +1968,7 @@ int ehea_activate_qp(struct ehea_adapter *adapter, struct ehea_qp *qp) | |||
| 1969 | u64 dummy64 = 0; | 1968 | u64 dummy64 = 0; |
| 1970 | struct hcp_modify_qp_cb0* cb0; | 1969 | struct hcp_modify_qp_cb0* cb0; |
| 1971 | 1970 | ||
| 1972 | cb0 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 1971 | cb0 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
| 1973 | if (!cb0) { | 1972 | if (!cb0) { |
| 1974 | ret = -ENOMEM; | 1973 | ret = -ENOMEM; |
| 1975 | goto out; | 1974 | goto out; |
| @@ -2270,7 +2269,7 @@ int ehea_sense_adapter_attr(struct ehea_adapter *adapter) | |||
| 2270 | u64 hret; | 2269 | u64 hret; |
| 2271 | int ret; | 2270 | int ret; |
| 2272 | 2271 | ||
| 2273 | cb = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 2272 | cb = kzalloc(PAGE_SIZE, GFP_KERNEL); |
| 2274 | if (!cb) { | 2273 | if (!cb) { |
| 2275 | ret = -ENOMEM; | 2274 | ret = -ENOMEM; |
| 2276 | goto out; | 2275 | goto out; |
| @@ -2341,7 +2340,7 @@ static int ehea_setup_single_port(struct ehea_port *port, | |||
| 2341 | goto out; | 2340 | goto out; |
| 2342 | 2341 | ||
| 2343 | /* Enable Jumbo frames */ | 2342 | /* Enable Jumbo frames */ |
| 2344 | cb4 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL); | 2343 | cb4 = kzalloc(PAGE_SIZE, GFP_KERNEL); |
| 2345 | if (!cb4) { | 2344 | if (!cb4) { |
| 2346 | ehea_error("no mem for cb4"); | 2345 | ehea_error("no mem for cb4"); |
| 2347 | } else { | 2346 | } else { |
diff --git a/drivers/net/ehea/ehea_phyp.c b/drivers/net/ehea/ehea_phyp.c index 0b51a8cea077..0cfc2bc1a27b 100644 --- a/drivers/net/ehea/ehea_phyp.c +++ b/drivers/net/ehea/ehea_phyp.c | |||
| @@ -506,7 +506,7 @@ u64 ehea_h_register_rpage_mr(const u64 adapter_handle, const u64 mr_handle, | |||
| 506 | const u8 pagesize, const u8 queue_type, | 506 | const u8 pagesize, const u8 queue_type, |
| 507 | const u64 log_pageaddr, const u64 count) | 507 | const u64 log_pageaddr, const u64 count) |
| 508 | { | 508 | { |
| 509 | if ((count > 1) && (log_pageaddr & 0xfff)) { | 509 | if ((count > 1) && (log_pageaddr & ~PAGE_MASK)) { |
| 510 | ehea_error("not on pageboundary"); | 510 | ehea_error("not on pageboundary"); |
| 511 | return H_PARAMETER; | 511 | return H_PARAMETER; |
| 512 | } | 512 | } |
diff --git a/drivers/net/ehea/ehea_phyp.h b/drivers/net/ehea/ehea_phyp.h index fa51e3b5bb05..919f94b75933 100644 --- a/drivers/net/ehea/ehea_phyp.h +++ b/drivers/net/ehea/ehea_phyp.h | |||
| @@ -81,14 +81,16 @@ static inline u32 get_longbusy_msecs(int long_busy_ret_code) | |||
| 81 | static inline void hcp_epas_ctor(struct h_epas *epas, u64 paddr_kernel, | 81 | static inline void hcp_epas_ctor(struct h_epas *epas, u64 paddr_kernel, |
| 82 | u64 paddr_user) | 82 | u64 paddr_user) |
| 83 | { | 83 | { |
| 84 | epas->kernel.addr = ioremap(paddr_kernel, PAGE_SIZE); | 84 | /* To support 64k pages we must round to 64k page boundary */ |
| 85 | epas->kernel.addr = ioremap((paddr_kernel & PAGE_MASK), PAGE_SIZE) + | ||
| 86 | (paddr_kernel & ~PAGE_MASK); | ||
| 85 | epas->user.addr = paddr_user; | 87 | epas->user.addr = paddr_user; |
| 86 | } | 88 | } |
| 87 | 89 | ||
| 88 | static inline void hcp_epas_dtor(struct h_epas *epas) | 90 | static inline void hcp_epas_dtor(struct h_epas *epas) |
| 89 | { | 91 | { |
| 90 | if (epas->kernel.addr) | 92 | if (epas->kernel.addr) |
| 91 | iounmap(epas->kernel.addr); | 93 | iounmap((void __iomem*)((u64)epas->kernel.addr & PAGE_MASK)); |
| 92 | 94 | ||
| 93 | epas->user.addr = 0; | 95 | epas->user.addr = 0; |
| 94 | epas->kernel.addr = 0; | 96 | epas->kernel.addr = 0; |
diff --git a/drivers/net/ehea/ehea_qmr.c b/drivers/net/ehea/ehea_qmr.c index 3e1862326c88..72ef7bde3346 100644 --- a/drivers/net/ehea/ehea_qmr.c +++ b/drivers/net/ehea/ehea_qmr.c | |||
| @@ -209,11 +209,11 @@ int ehea_destroy_cq(struct ehea_cq *cq) | |||
| 209 | { | 209 | { |
| 210 | u64 adapter_handle, hret; | 210 | u64 adapter_handle, hret; |
| 211 | 211 | ||
| 212 | adapter_handle = cq->adapter->handle; | ||
| 213 | |||
| 214 | if (!cq) | 212 | if (!cq) |
| 215 | return 0; | 213 | return 0; |
| 216 | 214 | ||
| 215 | adapter_handle = cq->adapter->handle; | ||
| 216 | |||
| 217 | /* deregister all previous registered pages */ | 217 | /* deregister all previous registered pages */ |
| 218 | hret = ehea_h_free_resource(adapter_handle, cq->fw_handle); | 218 | hret = ehea_h_free_resource(adapter_handle, cq->fw_handle); |
| 219 | if (hret != H_SUCCESS) { | 219 | if (hret != H_SUCCESS) { |
| @@ -512,7 +512,7 @@ int ehea_reg_mr_adapter(struct ehea_adapter *adapter) | |||
| 512 | 512 | ||
| 513 | start = KERNELBASE; | 513 | start = KERNELBASE; |
| 514 | end = (u64)high_memory; | 514 | end = (u64)high_memory; |
| 515 | nr_pages = (end - start) / PAGE_SIZE; | 515 | nr_pages = (end - start) / EHEA_PAGESIZE; |
| 516 | 516 | ||
| 517 | pt = kzalloc(PAGE_SIZE, GFP_KERNEL); | 517 | pt = kzalloc(PAGE_SIZE, GFP_KERNEL); |
| 518 | if (!pt) { | 518 | if (!pt) { |
| @@ -538,9 +538,9 @@ int ehea_reg_mr_adapter(struct ehea_adapter *adapter) | |||
| 538 | if (nr_pages > 1) { | 538 | if (nr_pages > 1) { |
| 539 | u64 num_pages = min(nr_pages, (u64)512); | 539 | u64 num_pages = min(nr_pages, (u64)512); |
| 540 | for (i = 0; i < num_pages; i++) | 540 | for (i = 0; i < num_pages; i++) |
| 541 | pt[i] = virt_to_abs((void*)(((u64)start) | 541 | pt[i] = virt_to_abs((void*)(((u64)start) + |
| 542 | + ((k++) * | 542 | ((k++) * |
| 543 | PAGE_SIZE))); | 543 | EHEA_PAGESIZE))); |
| 544 | 544 | ||
| 545 | hret = ehea_h_register_rpage_mr(adapter->handle, | 545 | hret = ehea_h_register_rpage_mr(adapter->handle, |
| 546 | adapter->mr.handle, 0, | 546 | adapter->mr.handle, 0, |
| @@ -548,8 +548,9 @@ int ehea_reg_mr_adapter(struct ehea_adapter *adapter) | |||
| 548 | num_pages); | 548 | num_pages); |
| 549 | nr_pages -= num_pages; | 549 | nr_pages -= num_pages; |
| 550 | } else { | 550 | } else { |
| 551 | u64 abs_adr = virt_to_abs((void*)(((u64)start) | 551 | u64 abs_adr = virt_to_abs((void*)(((u64)start) + |
| 552 | + (k * PAGE_SIZE))); | 552 | (k * EHEA_PAGESIZE))); |
| 553 | |||
| 553 | hret = ehea_h_register_rpage_mr(adapter->handle, | 554 | hret = ehea_h_register_rpage_mr(adapter->handle, |
| 554 | adapter->mr.handle, 0, | 555 | adapter->mr.handle, 0, |
| 555 | 0, abs_adr,1); | 556 | 0, abs_adr,1); |
diff --git a/drivers/net/irda/stir4200.c b/drivers/net/irda/stir4200.c index be8a66e702b0..3b4c47875935 100644 --- a/drivers/net/irda/stir4200.c +++ b/drivers/net/irda/stir4200.c | |||
| @@ -15,8 +15,7 @@ | |||
| 15 | * | 15 | * |
| 16 | * This program is free software; you can redistribute it and/or modify | 16 | * This program is free software; you can redistribute it and/or modify |
| 17 | * it under the terms of the GNU General Public License as published by | 17 | * it under the terms of the GNU General Public License as published by |
| 18 | * the Free Software Foundation; either version 2 of the License, or | 18 | * the Free Software Foundation; either version 2 of the License. |
| 19 | * (at your option) any later version. | ||
| 20 | * | 19 | * |
| 21 | * This program is distributed in the hope that it will be useful, | 20 | * This program is distributed in the hope that it will be useful, |
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index fdbb0d7213b0..806081b59733 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
| @@ -2416,7 +2416,6 @@ static void myri10ge_enable_ecrc(struct myri10ge_priv *mgp) | |||
| 2416 | * firmware image, and set tx.boundary to 4KB. | 2416 | * firmware image, and set tx.boundary to 4KB. |
| 2417 | */ | 2417 | */ |
| 2418 | 2418 | ||
| 2419 | #define PCI_DEVICE_ID_SERVERWORKS_HT2000_PCIE 0x0132 | ||
| 2420 | #define PCI_DEVICE_ID_INTEL_E5000_PCIE23 0x25f7 | 2419 | #define PCI_DEVICE_ID_INTEL_E5000_PCIE23 0x25f7 |
| 2421 | #define PCI_DEVICE_ID_INTEL_E5000_PCIE47 0x25fa | 2420 | #define PCI_DEVICE_ID_INTEL_E5000_PCIE47 0x25fa |
| 2422 | 2421 | ||
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index d132fe7d475e..27f90b2139c0 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -1397,41 +1397,6 @@ static void rtl8169_netpoll(struct net_device *dev) | |||
| 1397 | } | 1397 | } |
| 1398 | #endif | 1398 | #endif |
| 1399 | 1399 | ||
| 1400 | static void __rtl8169_set_mac_addr(struct net_device *dev, void __iomem *ioaddr) | ||
| 1401 | { | ||
| 1402 | unsigned int i, j; | ||
| 1403 | |||
| 1404 | RTL_W8(Cfg9346, Cfg9346_Unlock); | ||
| 1405 | for (i = 0; i < 2; i++) { | ||
| 1406 | __le32 l = 0; | ||
| 1407 | |||
| 1408 | for (j = 0; j < 4; j++) { | ||
| 1409 | l <<= 8; | ||
| 1410 | l |= dev->dev_addr[4*i + j]; | ||
| 1411 | } | ||
| 1412 | RTL_W32(MAC0 + 4*i, cpu_to_be32(l)); | ||
| 1413 | } | ||
| 1414 | RTL_W8(Cfg9346, Cfg9346_Lock); | ||
| 1415 | } | ||
| 1416 | |||
| 1417 | static int rtl8169_set_mac_addr(struct net_device *dev, void *p) | ||
| 1418 | { | ||
| 1419 | struct rtl8169_private *tp = netdev_priv(dev); | ||
| 1420 | struct sockaddr *addr = p; | ||
| 1421 | |||
| 1422 | if (!is_valid_ether_addr(addr->sa_data)) | ||
| 1423 | return -EINVAL; | ||
| 1424 | |||
| 1425 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | ||
| 1426 | |||
| 1427 | if (netif_running(dev)) { | ||
| 1428 | spin_lock_irq(&tp->lock); | ||
| 1429 | __rtl8169_set_mac_addr(dev, tp->mmio_addr); | ||
| 1430 | spin_unlock_irq(&tp->lock); | ||
| 1431 | } | ||
| 1432 | return 0; | ||
| 1433 | } | ||
| 1434 | |||
| 1435 | static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev, | 1400 | static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev, |
| 1436 | void __iomem *ioaddr) | 1401 | void __iomem *ioaddr) |
| 1437 | { | 1402 | { |
| @@ -1681,7 +1646,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1681 | dev->stop = rtl8169_close; | 1646 | dev->stop = rtl8169_close; |
| 1682 | dev->tx_timeout = rtl8169_tx_timeout; | 1647 | dev->tx_timeout = rtl8169_tx_timeout; |
| 1683 | dev->set_multicast_list = rtl8169_set_rx_mode; | 1648 | dev->set_multicast_list = rtl8169_set_rx_mode; |
| 1684 | dev->set_mac_address = rtl8169_set_mac_addr; | ||
| 1685 | dev->watchdog_timeo = RTL8169_TX_TIMEOUT; | 1649 | dev->watchdog_timeo = RTL8169_TX_TIMEOUT; |
| 1686 | dev->irq = pdev->irq; | 1650 | dev->irq = pdev->irq; |
| 1687 | dev->base_addr = (unsigned long) ioaddr; | 1651 | dev->base_addr = (unsigned long) ioaddr; |
| @@ -1929,8 +1893,6 @@ rtl8169_hw_start(struct net_device *dev) | |||
| 1929 | /* Enable all known interrupts by setting the interrupt mask. */ | 1893 | /* Enable all known interrupts by setting the interrupt mask. */ |
| 1930 | RTL_W16(IntrMask, rtl8169_intr_mask); | 1894 | RTL_W16(IntrMask, rtl8169_intr_mask); |
| 1931 | 1895 | ||
| 1932 | __rtl8169_set_mac_addr(dev, ioaddr); | ||
| 1933 | |||
| 1934 | netif_start_queue(dev); | 1896 | netif_start_queue(dev); |
| 1935 | } | 1897 | } |
| 1936 | 1898 | ||
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index a231ab7d28dd..33569ec9dbfc 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
| @@ -5985,6 +5985,11 @@ static int set_rxd_buffer_pointer(nic_t *sp, RxD_t *rxdp, buffAdd_t *ba, | |||
| 5985 | ((RxD3_t*)rxdp)->Buffer1_ptr = *temp1; | 5985 | ((RxD3_t*)rxdp)->Buffer1_ptr = *temp1; |
| 5986 | } else { | 5986 | } else { |
| 5987 | *skb = dev_alloc_skb(size); | 5987 | *skb = dev_alloc_skb(size); |
| 5988 | if (!(*skb)) { | ||
| 5989 | DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb failed\n", | ||
| 5990 | dev->name); | ||
| 5991 | return -ENOMEM; | ||
| 5992 | } | ||
| 5988 | ((RxD3_t*)rxdp)->Buffer2_ptr = *temp2 = | 5993 | ((RxD3_t*)rxdp)->Buffer2_ptr = *temp2 = |
| 5989 | pci_map_single(sp->pdev, (*skb)->data, | 5994 | pci_map_single(sp->pdev, (*skb)->data, |
| 5990 | dev->mtu + 4, | 5995 | dev->mtu + 4, |
| @@ -6007,7 +6012,11 @@ static int set_rxd_buffer_pointer(nic_t *sp, RxD_t *rxdp, buffAdd_t *ba, | |||
| 6007 | ((RxD3_t*)rxdp)->Buffer2_ptr = *temp2; | 6012 | ((RxD3_t*)rxdp)->Buffer2_ptr = *temp2; |
| 6008 | } else { | 6013 | } else { |
| 6009 | *skb = dev_alloc_skb(size); | 6014 | *skb = dev_alloc_skb(size); |
| 6010 | 6015 | if (!(*skb)) { | |
| 6016 | DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb failed\n", | ||
| 6017 | dev->name); | ||
| 6018 | return -ENOMEM; | ||
| 6019 | } | ||
| 6011 | ((RxD3_t*)rxdp)->Buffer0_ptr = *temp0 = | 6020 | ((RxD3_t*)rxdp)->Buffer0_ptr = *temp0 = |
| 6012 | pci_map_single(sp->pdev, ba->ba_0, BUF0_LEN, | 6021 | pci_map_single(sp->pdev, ba->ba_0, BUF0_LEN, |
| 6013 | PCI_DMA_FROMDEVICE); | 6022 | PCI_DMA_FROMDEVICE); |
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index e7e414928f89..b2949035f66a 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
| @@ -11,8 +11,7 @@ | |||
| 11 | * | 11 | * |
| 12 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
| 13 | * it under the terms of the GNU General Public License as published by | 13 | * it under the terms of the GNU General Public License as published by |
| 14 | * the Free Software Foundation; either version 2 of the License, or | 14 | * the Free Software Foundation; either version 2 of the License. |
| 15 | * (at your option) any later version. | ||
| 16 | * | 15 | * |
| 17 | * This program is distributed in the hope that it will be useful, | 16 | * This program is distributed in the hope that it will be useful, |
| 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 95efdb5bbbe1..16616f5440d0 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -10,8 +10,7 @@ | |||
| 10 | * | 10 | * |
| 11 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
| 12 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
| 13 | * the Free Software Foundation; either version 2 of the License, or | 13 | * the Free Software Foundation; either version 2 of the License. |
| 14 | * (at your option) any later version. | ||
| 15 | * | 14 | * |
| 16 | * This program is distributed in the hope that it will be useful, | 15 | * This program is distributed in the hope that it will be useful, |
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| @@ -3239,7 +3238,11 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw, | |||
| 3239 | dev->poll = sky2_poll; | 3238 | dev->poll = sky2_poll; |
| 3240 | dev->weight = NAPI_WEIGHT; | 3239 | dev->weight = NAPI_WEIGHT; |
| 3241 | #ifdef CONFIG_NET_POLL_CONTROLLER | 3240 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 3242 | dev->poll_controller = sky2_netpoll; | 3241 | /* Network console (only works on port 0) |
| 3242 | * because netpoll makes assumptions about NAPI | ||
| 3243 | */ | ||
| 3244 | if (port == 0) | ||
| 3245 | dev->poll_controller = sky2_netpoll; | ||
| 3243 | #endif | 3246 | #endif |
| 3244 | 3247 | ||
| 3245 | sky2 = netdev_priv(dev); | 3248 | sky2 = netdev_priv(dev); |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 8e398499c045..1dbdd6bb587b 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -68,8 +68,8 @@ | |||
| 68 | 68 | ||
| 69 | #define DRV_MODULE_NAME "tg3" | 69 | #define DRV_MODULE_NAME "tg3" |
| 70 | #define PFX DRV_MODULE_NAME ": " | 70 | #define PFX DRV_MODULE_NAME ": " |
| 71 | #define DRV_MODULE_VERSION "3.67" | 71 | #define DRV_MODULE_VERSION "3.69" |
| 72 | #define DRV_MODULE_RELDATE "October 18, 2006" | 72 | #define DRV_MODULE_RELDATE "November 15, 2006" |
| 73 | 73 | ||
| 74 | #define TG3_DEF_MAC_MODE 0 | 74 | #define TG3_DEF_MAC_MODE 0 |
| 75 | #define TG3_DEF_RX_MODE 0 | 75 | #define TG3_DEF_RX_MODE 0 |
| @@ -4728,10 +4728,11 @@ static int tg3_poll_fw(struct tg3 *tp) | |||
| 4728 | u32 val; | 4728 | u32 val; |
| 4729 | 4729 | ||
| 4730 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | 4730 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { |
| 4731 | for (i = 0; i < 400; i++) { | 4731 | /* Wait up to 20ms for init done. */ |
| 4732 | for (i = 0; i < 200; i++) { | ||
| 4732 | if (tr32(VCPU_STATUS) & VCPU_STATUS_INIT_DONE) | 4733 | if (tr32(VCPU_STATUS) & VCPU_STATUS_INIT_DONE) |
| 4733 | return 0; | 4734 | return 0; |
| 4734 | udelay(10); | 4735 | udelay(100); |
| 4735 | } | 4736 | } |
| 4736 | return -ENODEV; | 4737 | return -ENODEV; |
| 4737 | } | 4738 | } |
| @@ -6014,7 +6015,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
| 6014 | tg3_abort_hw(tp, 1); | 6015 | tg3_abort_hw(tp, 1); |
| 6015 | } | 6016 | } |
| 6016 | 6017 | ||
| 6017 | if ((tp->tg3_flags2 & TG3_FLG2_MII_SERDES) && reset_phy) | 6018 | if (reset_phy) |
| 6018 | tg3_phy_reset(tp); | 6019 | tg3_phy_reset(tp); |
| 6019 | 6020 | ||
| 6020 | err = tg3_chip_reset(tp); | 6021 | err = tg3_chip_reset(tp); |
| @@ -6574,7 +6575,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
| 6574 | tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl); | 6575 | tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl); |
| 6575 | } | 6576 | } |
| 6576 | 6577 | ||
| 6577 | err = tg3_setup_phy(tp, reset_phy); | 6578 | err = tg3_setup_phy(tp, 0); |
| 6578 | if (err) | 6579 | if (err) |
| 6579 | return err; | 6580 | return err; |
| 6580 | 6581 | ||
| @@ -10212,7 +10213,7 @@ skip_phy_reset: | |||
| 10212 | static void __devinit tg3_read_partno(struct tg3 *tp) | 10213 | static void __devinit tg3_read_partno(struct tg3 *tp) |
| 10213 | { | 10214 | { |
| 10214 | unsigned char vpd_data[256]; | 10215 | unsigned char vpd_data[256]; |
| 10215 | int i; | 10216 | unsigned int i; |
| 10216 | u32 magic; | 10217 | u32 magic; |
| 10217 | 10218 | ||
| 10218 | if (tg3_nvram_read_swab(tp, 0x0, &magic)) | 10219 | if (tg3_nvram_read_swab(tp, 0x0, &magic)) |
| @@ -10258,9 +10259,9 @@ static void __devinit tg3_read_partno(struct tg3 *tp) | |||
| 10258 | } | 10259 | } |
| 10259 | 10260 | ||
| 10260 | /* Now parse and find the part number. */ | 10261 | /* Now parse and find the part number. */ |
| 10261 | for (i = 0; i < 256; ) { | 10262 | for (i = 0; i < 254; ) { |
| 10262 | unsigned char val = vpd_data[i]; | 10263 | unsigned char val = vpd_data[i]; |
| 10263 | int block_end; | 10264 | unsigned int block_end; |
| 10264 | 10265 | ||
| 10265 | if (val == 0x82 || val == 0x91) { | 10266 | if (val == 0x82 || val == 0x91) { |
| 10266 | i = (i + 3 + | 10267 | i = (i + 3 + |
| @@ -10276,21 +10277,26 @@ static void __devinit tg3_read_partno(struct tg3 *tp) | |||
| 10276 | (vpd_data[i + 1] + | 10277 | (vpd_data[i + 1] + |
| 10277 | (vpd_data[i + 2] << 8))); | 10278 | (vpd_data[i + 2] << 8))); |
| 10278 | i += 3; | 10279 | i += 3; |
| 10279 | while (i < block_end) { | 10280 | |
| 10281 | if (block_end > 256) | ||
| 10282 | goto out_not_found; | ||
| 10283 | |||
| 10284 | while (i < (block_end - 2)) { | ||
| 10280 | if (vpd_data[i + 0] == 'P' && | 10285 | if (vpd_data[i + 0] == 'P' && |
| 10281 | vpd_data[i + 1] == 'N') { | 10286 | vpd_data[i + 1] == 'N') { |
| 10282 | int partno_len = vpd_data[i + 2]; | 10287 | int partno_len = vpd_data[i + 2]; |
| 10283 | 10288 | ||
| 10284 | if (partno_len > 24) | 10289 | i += 3; |
| 10290 | if (partno_len > 24 || (partno_len + i) > 256) | ||
| 10285 | goto out_not_found; | 10291 | goto out_not_found; |
| 10286 | 10292 | ||
| 10287 | memcpy(tp->board_part_number, | 10293 | memcpy(tp->board_part_number, |
| 10288 | &vpd_data[i + 3], | 10294 | &vpd_data[i], partno_len); |
| 10289 | partno_len); | ||
| 10290 | 10295 | ||
| 10291 | /* Success. */ | 10296 | /* Success. */ |
| 10292 | return; | 10297 | return; |
| 10293 | } | 10298 | } |
| 10299 | i += 3 + vpd_data[i + 2]; | ||
| 10294 | } | 10300 | } |
| 10295 | 10301 | ||
| 10296 | /* Part number not found. */ | 10302 | /* Part number not found. */ |
| @@ -10360,7 +10366,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
| 10360 | u32 pci_state_reg, grc_misc_cfg; | 10366 | u32 pci_state_reg, grc_misc_cfg; |
| 10361 | u32 val; | 10367 | u32 val; |
| 10362 | u16 pci_cmd; | 10368 | u16 pci_cmd; |
| 10363 | int err; | 10369 | int err, pcie_cap; |
| 10364 | 10370 | ||
| 10365 | /* Force memory write invalidate off. If we leave it on, | 10371 | /* Force memory write invalidate off. If we leave it on, |
| 10366 | * then on 5700_BX chips we have to enable a workaround. | 10372 | * then on 5700_BX chips we have to enable a workaround. |
| @@ -10535,8 +10541,19 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
| 10535 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) | 10541 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) |
| 10536 | tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; | 10542 | tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; |
| 10537 | 10543 | ||
| 10538 | if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0) | 10544 | pcie_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_EXP); |
| 10545 | if (pcie_cap != 0) { | ||
| 10539 | tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; | 10546 | tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; |
| 10547 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
| 10548 | u16 lnkctl; | ||
| 10549 | |||
| 10550 | pci_read_config_word(tp->pdev, | ||
| 10551 | pcie_cap + PCI_EXP_LNKCTL, | ||
| 10552 | &lnkctl); | ||
| 10553 | if (lnkctl & PCI_EXP_LNKCTL_CLKREQ_EN) | ||
| 10554 | tp->tg3_flags2 &= ~TG3_FLG2_HW_TSO_2; | ||
| 10555 | } | ||
| 10556 | } | ||
| 10540 | 10557 | ||
| 10541 | /* If we have an AMD 762 or VIA K8T800 chipset, write | 10558 | /* If we have an AMD 762 or VIA K8T800 chipset, write |
| 10542 | * reordering to the mailbox registers done by the host | 10559 | * reordering to the mailbox registers done by the host |
| @@ -11803,6 +11820,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
| 11803 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || | 11820 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || |
| 11804 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 || | 11821 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 || |
| 11805 | tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 || | 11822 | tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 || |
| 11823 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 || | ||
| 11806 | (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) { | 11824 | (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) { |
| 11807 | tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; | 11825 | tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; |
| 11808 | } else { | 11826 | } else { |
diff --git a/drivers/net/tokenring/proteon.c b/drivers/net/tokenring/proteon.c index 4f756960db2a..cb7dbb63c9d9 100644 --- a/drivers/net/tokenring/proteon.c +++ b/drivers/net/tokenring/proteon.c | |||
| @@ -370,6 +370,10 @@ static int __init proteon_init(void) | |||
| 370 | dev->dma = dma[i]; | 370 | dev->dma = dma[i]; |
| 371 | pdev = platform_device_register_simple("proteon", | 371 | pdev = platform_device_register_simple("proteon", |
| 372 | i, NULL, 0); | 372 | i, NULL, 0); |
| 373 | if (IS_ERR(pdev)) { | ||
| 374 | free_netdev(dev); | ||
| 375 | continue; | ||
| 376 | } | ||
| 373 | err = setup_card(dev, &pdev->dev); | 377 | err = setup_card(dev, &pdev->dev); |
| 374 | if (!err) { | 378 | if (!err) { |
| 375 | proteon_dev[i] = pdev; | 379 | proteon_dev[i] = pdev; |
| @@ -385,9 +389,10 @@ static int __init proteon_init(void) | |||
| 385 | /* Probe for cards. */ | 389 | /* Probe for cards. */ |
| 386 | if (num == 0) { | 390 | if (num == 0) { |
| 387 | printk(KERN_NOTICE "proteon.c: No cards found.\n"); | 391 | printk(KERN_NOTICE "proteon.c: No cards found.\n"); |
| 388 | return (-ENODEV); | 392 | platform_driver_unregister(&proteon_driver); |
| 393 | return -ENODEV; | ||
| 389 | } | 394 | } |
| 390 | return (0); | 395 | return 0; |
| 391 | } | 396 | } |
| 392 | 397 | ||
| 393 | static void __exit proteon_cleanup(void) | 398 | static void __exit proteon_cleanup(void) |
diff --git a/drivers/net/tokenring/skisa.c b/drivers/net/tokenring/skisa.c index d6ba41cf3110..33afea31d87b 100644 --- a/drivers/net/tokenring/skisa.c +++ b/drivers/net/tokenring/skisa.c | |||
| @@ -380,6 +380,10 @@ static int __init sk_isa_init(void) | |||
| 380 | dev->dma = dma[i]; | 380 | dev->dma = dma[i]; |
| 381 | pdev = platform_device_register_simple("skisa", | 381 | pdev = platform_device_register_simple("skisa", |
| 382 | i, NULL, 0); | 382 | i, NULL, 0); |
| 383 | if (IS_ERR(pdev)) { | ||
| 384 | free_netdev(dev); | ||
| 385 | continue; | ||
| 386 | } | ||
| 383 | err = setup_card(dev, &pdev->dev); | 387 | err = setup_card(dev, &pdev->dev); |
| 384 | if (!err) { | 388 | if (!err) { |
| 385 | sk_isa_dev[i] = pdev; | 389 | sk_isa_dev[i] = pdev; |
| @@ -395,9 +399,10 @@ static int __init sk_isa_init(void) | |||
| 395 | /* Probe for cards. */ | 399 | /* Probe for cards. */ |
| 396 | if (num == 0) { | 400 | if (num == 0) { |
| 397 | printk(KERN_NOTICE "skisa.c: No cards found.\n"); | 401 | printk(KERN_NOTICE "skisa.c: No cards found.\n"); |
| 398 | return (-ENODEV); | 402 | platform_driver_unregister(&sk_isa_driver); |
| 403 | return -ENODEV; | ||
| 399 | } | 404 | } |
| 400 | return (0); | 405 | return 0; |
| 401 | } | 406 | } |
| 402 | 407 | ||
| 403 | static void __exit sk_isa_cleanup(void) | 408 | static void __exit sk_isa_cleanup(void) |
diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig index 58b7efbb0750..b5d0d7fb647a 100644 --- a/drivers/net/wan/Kconfig +++ b/drivers/net/wan/Kconfig | |||
| @@ -127,7 +127,7 @@ config LANMEDIA | |||
| 127 | # There is no way to detect a Sealevel board. Force it modular | 127 | # There is no way to detect a Sealevel board. Force it modular |
| 128 | config SEALEVEL_4021 | 128 | config SEALEVEL_4021 |
| 129 | tristate "Sealevel Systems 4021 support" | 129 | tristate "Sealevel Systems 4021 support" |
| 130 | depends on WAN && ISA && m && ISA_DMA_API | 130 | depends on WAN && ISA && m && ISA_DMA_API && INET |
| 131 | help | 131 | help |
| 132 | This is a driver for the Sealevel Systems ACB 56 serial I/O adapter. | 132 | This is a driver for the Sealevel Systems ACB 56 serial I/O adapter. |
| 133 | 133 | ||
diff --git a/drivers/net/wan/n2.c b/drivers/net/wan/n2.c index dcf46add3adf..5c322dfb79f6 100644 --- a/drivers/net/wan/n2.c +++ b/drivers/net/wan/n2.c | |||
| @@ -500,7 +500,7 @@ static int __init n2_init(void) | |||
| 500 | #ifdef MODULE | 500 | #ifdef MODULE |
| 501 | printk(KERN_INFO "n2: no card initialized\n"); | 501 | printk(KERN_INFO "n2: no card initialized\n"); |
| 502 | #endif | 502 | #endif |
| 503 | return -ENOSYS; /* no parameters specified, abort */ | 503 | return -EINVAL; /* no parameters specified, abort */ |
| 504 | } | 504 | } |
| 505 | 505 | ||
| 506 | printk(KERN_INFO "%s\n", version); | 506 | printk(KERN_INFO "%s\n", version); |
| @@ -538,11 +538,11 @@ static int __init n2_init(void) | |||
| 538 | n2_run(io, irq, ram, valid[0], valid[1]); | 538 | n2_run(io, irq, ram, valid[0], valid[1]); |
| 539 | 539 | ||
| 540 | if (*hw == '\x0') | 540 | if (*hw == '\x0') |
| 541 | return first_card ? 0 : -ENOSYS; | 541 | return first_card ? 0 : -EINVAL; |
| 542 | }while(*hw++ == ':'); | 542 | }while(*hw++ == ':'); |
| 543 | 543 | ||
| 544 | printk(KERN_ERR "n2: invalid hardware parameters\n"); | 544 | printk(KERN_ERR "n2: invalid hardware parameters\n"); |
| 545 | return first_card ? 0 : -ENOSYS; | 545 | return first_card ? 0 : -EINVAL; |
| 546 | } | 546 | } |
| 547 | 547 | ||
| 548 | 548 | ||
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_dma.h b/drivers/net/wireless/bcm43xx/bcm43xx_dma.h index ea16078cfe98..d1105e569a41 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_dma.h +++ b/drivers/net/wireless/bcm43xx/bcm43xx_dma.h | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | #include <linux/list.h> | 4 | #include <linux/list.h> |
| 5 | #include <linux/spinlock.h> | 5 | #include <linux/spinlock.h> |
| 6 | #include <linux/workqueue.h> | 6 | #include <linux/workqueue.h> |
| 7 | #include <linux/dma-mapping.h> | ||
| 7 | #include <linux/linkage.h> | 8 | #include <linux/linkage.h> |
| 8 | #include <asm/atomic.h> | 9 | #include <asm/atomic.h> |
| 9 | 10 | ||
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_leds.c b/drivers/net/wireless/bcm43xx/bcm43xx_leds.c index 2ddbec6bf15b..7d383a27b927 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_leds.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_leds.c | |||
| @@ -189,20 +189,24 @@ void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity) | |||
| 189 | case BCM43xx_LED_INACTIVE: | 189 | case BCM43xx_LED_INACTIVE: |
| 190 | continue; | 190 | continue; |
| 191 | case BCM43xx_LED_OFF: | 191 | case BCM43xx_LED_OFF: |
| 192 | case BCM43xx_LED_BCM4303_3: | ||
| 192 | break; | 193 | break; |
| 193 | case BCM43xx_LED_ON: | 194 | case BCM43xx_LED_ON: |
| 194 | turn_on = 1; | 195 | turn_on = 1; |
| 195 | break; | 196 | break; |
| 196 | case BCM43xx_LED_ACTIVITY: | 197 | case BCM43xx_LED_ACTIVITY: |
| 198 | case BCM43xx_LED_BCM4303_0: | ||
| 197 | turn_on = activity; | 199 | turn_on = activity; |
| 198 | break; | 200 | break; |
| 199 | case BCM43xx_LED_RADIO_ALL: | 201 | case BCM43xx_LED_RADIO_ALL: |
| 200 | turn_on = radio->enabled; | 202 | turn_on = radio->enabled; |
| 201 | break; | 203 | break; |
| 202 | case BCM43xx_LED_RADIO_A: | 204 | case BCM43xx_LED_RADIO_A: |
| 205 | case BCM43xx_LED_BCM4303_2: | ||
| 203 | turn_on = (radio->enabled && phy->type == BCM43xx_PHYTYPE_A); | 206 | turn_on = (radio->enabled && phy->type == BCM43xx_PHYTYPE_A); |
| 204 | break; | 207 | break; |
| 205 | case BCM43xx_LED_RADIO_B: | 208 | case BCM43xx_LED_RADIO_B: |
| 209 | case BCM43xx_LED_BCM4303_1: | ||
| 206 | turn_on = (radio->enabled && | 210 | turn_on = (radio->enabled && |
| 207 | (phy->type == BCM43xx_PHYTYPE_B || | 211 | (phy->type == BCM43xx_PHYTYPE_B || |
| 208 | phy->type == BCM43xx_PHYTYPE_G)); | 212 | phy->type == BCM43xx_PHYTYPE_G)); |
| @@ -257,7 +261,8 @@ void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity) | |||
| 257 | continue; | 261 | continue; |
| 258 | #endif /* CONFIG_BCM43XX_DEBUG */ | 262 | #endif /* CONFIG_BCM43XX_DEBUG */ |
| 259 | default: | 263 | default: |
| 260 | assert(0); | 264 | dprintkl(KERN_INFO PFX "Bad value in leds_update," |
| 265 | " led->behaviour: 0x%x\n", led->behaviour); | ||
| 261 | }; | 266 | }; |
| 262 | 267 | ||
| 263 | if (led->activelow) | 268 | if (led->activelow) |
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_leds.h b/drivers/net/wireless/bcm43xx/bcm43xx_leds.h index d3716cf3aebc..811e14a81198 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_leds.h +++ b/drivers/net/wireless/bcm43xx/bcm43xx_leds.h | |||
| @@ -46,6 +46,12 @@ enum { /* LED behaviour values */ | |||
| 46 | BCM43xx_LED_TEST_BLINKSLOW, | 46 | BCM43xx_LED_TEST_BLINKSLOW, |
| 47 | BCM43xx_LED_TEST_BLINKMEDIUM, | 47 | BCM43xx_LED_TEST_BLINKMEDIUM, |
| 48 | BCM43xx_LED_TEST_BLINKFAST, | 48 | BCM43xx_LED_TEST_BLINKFAST, |
| 49 | |||
| 50 | /* Misc values for BCM4303 */ | ||
| 51 | BCM43xx_LED_BCM4303_0 = 0x2B, | ||
| 52 | BCM43xx_LED_BCM4303_1 = 0x78, | ||
| 53 | BCM43xx_LED_BCM4303_2 = 0x2E, | ||
| 54 | BCM43xx_LED_BCM4303_3 = 0x19, | ||
| 49 | }; | 55 | }; |
| 50 | 56 | ||
| 51 | int bcm43xx_leds_init(struct bcm43xx_private *bcm); | 57 | int bcm43xx_leds_init(struct bcm43xx_private *bcm); |
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.c b/drivers/net/wireless/bcm43xx/bcm43xx_main.c index a94c6d8826f8..a1b783813d8e 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_main.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.c | |||
| @@ -746,7 +746,7 @@ int bcm43xx_sprom_write(struct bcm43xx_private *bcm, const u16 *sprom) | |||
| 746 | if (err) | 746 | if (err) |
| 747 | goto err_ctlreg; | 747 | goto err_ctlreg; |
| 748 | spromctl |= 0x10; /* SPROM WRITE enable. */ | 748 | spromctl |= 0x10; /* SPROM WRITE enable. */ |
| 749 | bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_SPROMCTL, spromctl); | 749 | err = bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_SPROMCTL, spromctl); |
| 750 | if (err) | 750 | if (err) |
| 751 | goto err_ctlreg; | 751 | goto err_ctlreg; |
| 752 | /* We must burn lots of CPU cycles here, but that does not | 752 | /* We must burn lots of CPU cycles here, but that does not |
| @@ -768,7 +768,7 @@ int bcm43xx_sprom_write(struct bcm43xx_private *bcm, const u16 *sprom) | |||
| 768 | mdelay(20); | 768 | mdelay(20); |
| 769 | } | 769 | } |
| 770 | spromctl &= ~0x10; /* SPROM WRITE enable. */ | 770 | spromctl &= ~0x10; /* SPROM WRITE enable. */ |
| 771 | bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_SPROMCTL, spromctl); | 771 | err = bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_SPROMCTL, spromctl); |
| 772 | if (err) | 772 | if (err) |
| 773 | goto err_ctlreg; | 773 | goto err_ctlreg; |
| 774 | mdelay(500); | 774 | mdelay(500); |
| @@ -1463,6 +1463,23 @@ static void handle_irq_transmit_status(struct bcm43xx_private *bcm) | |||
| 1463 | } | 1463 | } |
| 1464 | } | 1464 | } |
| 1465 | 1465 | ||
| 1466 | static void drain_txstatus_queue(struct bcm43xx_private *bcm) | ||
| 1467 | { | ||
| 1468 | u32 dummy; | ||
| 1469 | |||
| 1470 | if (bcm->current_core->rev < 5) | ||
| 1471 | return; | ||
| 1472 | /* Read all entries from the microcode TXstatus FIFO | ||
| 1473 | * and throw them away. | ||
| 1474 | */ | ||
| 1475 | while (1) { | ||
| 1476 | dummy = bcm43xx_read32(bcm, BCM43xx_MMIO_XMITSTAT_0); | ||
| 1477 | if (!dummy) | ||
| 1478 | break; | ||
| 1479 | dummy = bcm43xx_read32(bcm, BCM43xx_MMIO_XMITSTAT_1); | ||
| 1480 | } | ||
| 1481 | } | ||
| 1482 | |||
| 1466 | static void bcm43xx_generate_noise_sample(struct bcm43xx_private *bcm) | 1483 | static void bcm43xx_generate_noise_sample(struct bcm43xx_private *bcm) |
| 1467 | { | 1484 | { |
| 1468 | bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x408, 0x7F7F); | 1485 | bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x408, 0x7F7F); |
| @@ -3163,9 +3180,11 @@ static int estimate_periodic_work_badness(unsigned int state) | |||
| 3163 | static void bcm43xx_periodic_work_handler(void *d) | 3180 | static void bcm43xx_periodic_work_handler(void *d) |
| 3164 | { | 3181 | { |
| 3165 | struct bcm43xx_private *bcm = d; | 3182 | struct bcm43xx_private *bcm = d; |
| 3183 | struct net_device *net_dev = bcm->net_dev; | ||
| 3166 | unsigned long flags; | 3184 | unsigned long flags; |
| 3167 | u32 savedirqs = 0; | 3185 | u32 savedirqs = 0; |
| 3168 | int badness; | 3186 | int badness; |
| 3187 | unsigned long orig_trans_start = 0; | ||
| 3169 | 3188 | ||
| 3170 | mutex_lock(&bcm->mutex); | 3189 | mutex_lock(&bcm->mutex); |
| 3171 | badness = estimate_periodic_work_badness(bcm->periodic_state); | 3190 | badness = estimate_periodic_work_badness(bcm->periodic_state); |
| @@ -3173,7 +3192,18 @@ static void bcm43xx_periodic_work_handler(void *d) | |||
| 3173 | /* Periodic work will take a long time, so we want it to | 3192 | /* Periodic work will take a long time, so we want it to |
| 3174 | * be preemtible. | 3193 | * be preemtible. |
| 3175 | */ | 3194 | */ |
| 3176 | netif_tx_disable(bcm->net_dev); | 3195 | |
| 3196 | netif_tx_lock_bh(net_dev); | ||
| 3197 | /* We must fake a started transmission here, as we are going to | ||
| 3198 | * disable TX. If we wouldn't fake a TX, it would be possible to | ||
| 3199 | * trigger the netdev watchdog, if the last real TX is already | ||
| 3200 | * some time on the past (slightly less than 5secs) | ||
| 3201 | */ | ||
| 3202 | orig_trans_start = net_dev->trans_start; | ||
| 3203 | net_dev->trans_start = jiffies; | ||
| 3204 | netif_stop_queue(net_dev); | ||
| 3205 | netif_tx_unlock_bh(net_dev); | ||
| 3206 | |||
| 3177 | spin_lock_irqsave(&bcm->irq_lock, flags); | 3207 | spin_lock_irqsave(&bcm->irq_lock, flags); |
| 3178 | bcm43xx_mac_suspend(bcm); | 3208 | bcm43xx_mac_suspend(bcm); |
| 3179 | if (bcm43xx_using_pio(bcm)) | 3209 | if (bcm43xx_using_pio(bcm)) |
| @@ -3198,6 +3228,7 @@ static void bcm43xx_periodic_work_handler(void *d) | |||
| 3198 | bcm43xx_pio_thaw_txqueues(bcm); | 3228 | bcm43xx_pio_thaw_txqueues(bcm); |
| 3199 | bcm43xx_mac_enable(bcm); | 3229 | bcm43xx_mac_enable(bcm); |
| 3200 | netif_wake_queue(bcm->net_dev); | 3230 | netif_wake_queue(bcm->net_dev); |
| 3231 | net_dev->trans_start = orig_trans_start; | ||
| 3201 | } | 3232 | } |
| 3202 | mmiowb(); | 3233 | mmiowb(); |
| 3203 | spin_unlock_irqrestore(&bcm->irq_lock, flags); | 3234 | spin_unlock_irqrestore(&bcm->irq_lock, flags); |
| @@ -3518,6 +3549,7 @@ int bcm43xx_select_wireless_core(struct bcm43xx_private *bcm, | |||
| 3518 | bcm43xx_macfilter_clear(bcm, BCM43xx_MACFILTER_ASSOC); | 3549 | bcm43xx_macfilter_clear(bcm, BCM43xx_MACFILTER_ASSOC); |
| 3519 | bcm43xx_macfilter_set(bcm, BCM43xx_MACFILTER_SELF, (u8 *)(bcm->net_dev->dev_addr)); | 3550 | bcm43xx_macfilter_set(bcm, BCM43xx_MACFILTER_SELF, (u8 *)(bcm->net_dev->dev_addr)); |
| 3520 | bcm43xx_security_init(bcm); | 3551 | bcm43xx_security_init(bcm); |
| 3552 | drain_txstatus_queue(bcm); | ||
| 3521 | ieee80211softmac_start(bcm->net_dev); | 3553 | ieee80211softmac_start(bcm->net_dev); |
| 3522 | 3554 | ||
| 3523 | /* Let's go! Be careful after enabling the IRQs. | 3555 | /* Let's go! Be careful after enabling the IRQs. |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 686d895116de..f63909e4bc32 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
| @@ -887,6 +887,13 @@ static struct pcmcia_device_id hostap_cs_ids[] = { | |||
| 887 | PCMCIA_DEVICE_PROD_ID123( | 887 | PCMCIA_DEVICE_PROD_ID123( |
| 888 | "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02", | 888 | "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02", |
| 889 | 0xc7b8df9d, 0x1700d087, 0x4b74baa0), | 889 | 0xc7b8df9d, 0x1700d087, 0x4b74baa0), |
| 890 | PCMCIA_DEVICE_PROD_ID123( | ||
| 891 | "Allied Telesyn", "AT-WCL452 Wireless PCMCIA Radio", | ||
| 892 | "Ver. 1.00", | ||
| 893 | 0x5cd01705, 0x4271660f, 0x9d08ee12), | ||
| 894 | PCMCIA_DEVICE_PROD_ID123( | ||
| 895 | "corega", "WL PCCL-11", "ISL37300P", | ||
| 896 | 0xa21501a, 0x59868926, 0xc9049a39), | ||
| 890 | PCMCIA_DEVICE_NULL | 897 | PCMCIA_DEVICE_NULL |
| 891 | }; | 898 | }; |
| 892 | MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); | 899 | MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); |
diff --git a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c index 6dfa041be66d..bc81b13a5a2a 100644 --- a/drivers/net/wireless/hostap/hostap_plx.c +++ b/drivers/net/wireless/hostap/hostap_plx.c | |||
| @@ -364,7 +364,7 @@ static int prism2_plx_check_cis(void __iomem *attr_mem, int attr_len, | |||
| 364 | 364 | ||
| 365 | pos = 0; | 365 | pos = 0; |
| 366 | while (pos < CIS_MAX_LEN - 1 && cis[pos] != CISTPL_END) { | 366 | while (pos < CIS_MAX_LEN - 1 && cis[pos] != CISTPL_END) { |
| 367 | if (pos + cis[pos + 1] >= CIS_MAX_LEN) | 367 | if (pos + 2 + cis[pos + 1] > CIS_MAX_LEN) |
| 368 | goto cis_error; | 368 | goto cis_error; |
| 369 | 369 | ||
| 370 | switch (cis[pos]) { | 370 | switch (cis[pos]) { |
| @@ -391,7 +391,7 @@ static int prism2_plx_check_cis(void __iomem *attr_mem, int attr_len, | |||
| 391 | break; | 391 | break; |
| 392 | 392 | ||
| 393 | case CISTPL_MANFID: | 393 | case CISTPL_MANFID: |
| 394 | if (cis[pos + 1] < 5) | 394 | if (cis[pos + 1] < 4) |
| 395 | goto cis_error; | 395 | goto cis_error; |
| 396 | manfid1 = cis[pos + 2] + (cis[pos + 3] << 8); | 396 | manfid1 = cis[pos + 2] + (cis[pos + 3] << 8); |
| 397 | manfid2 = cis[pos + 4] + (cis[pos + 5] << 8); | 397 | manfid2 = cis[pos + 4] + (cis[pos + 5] << 8); |
