diff options
43 files changed, 544 insertions, 437 deletions
diff --git a/drivers/atm/he.c b/drivers/atm/he.c index ffc4a5a41946..ea495b21f916 100644 --- a/drivers/atm/he.c +++ b/drivers/atm/he.c | |||
| @@ -1542,7 +1542,8 @@ he_start(struct atm_dev *dev) | |||
| 1542 | /* initialize framer */ | 1542 | /* initialize framer */ |
| 1543 | 1543 | ||
| 1544 | #ifdef CONFIG_ATM_HE_USE_SUNI | 1544 | #ifdef CONFIG_ATM_HE_USE_SUNI |
| 1545 | suni_init(he_dev->atm_dev); | 1545 | if (he_isMM(he_dev)) |
| 1546 | suni_init(he_dev->atm_dev); | ||
| 1546 | if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->start) | 1547 | if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->start) |
| 1547 | he_dev->atm_dev->phy->start(he_dev->atm_dev); | 1548 | he_dev->atm_dev->phy->start(he_dev->atm_dev); |
| 1548 | #endif /* CONFIG_ATM_HE_USE_SUNI */ | 1549 | #endif /* CONFIG_ATM_HE_USE_SUNI */ |
| @@ -1554,6 +1555,7 @@ he_start(struct atm_dev *dev) | |||
| 1554 | val = he_phy_get(he_dev->atm_dev, SUNI_TPOP_APM); | 1555 | val = he_phy_get(he_dev->atm_dev, SUNI_TPOP_APM); |
| 1555 | val = (val & ~SUNI_TPOP_APM_S) | (SUNI_TPOP_S_SDH << SUNI_TPOP_APM_S_SHIFT); | 1556 | val = (val & ~SUNI_TPOP_APM_S) | (SUNI_TPOP_S_SDH << SUNI_TPOP_APM_S_SHIFT); |
| 1556 | he_phy_put(he_dev->atm_dev, val, SUNI_TPOP_APM); | 1557 | he_phy_put(he_dev->atm_dev, val, SUNI_TPOP_APM); |
| 1558 | he_phy_put(he_dev->atm_dev, SUNI_TACP_IUCHP_CLP, SUNI_TACP_IUCHP); | ||
| 1557 | } | 1559 | } |
| 1558 | 1560 | ||
| 1559 | /* 5.1.12 enable transmit and receive */ | 1561 | /* 5.1.12 enable transmit and receive */ |
| @@ -2844,10 +2846,15 @@ he_ioctl(struct atm_dev *atm_dev, unsigned int cmd, void __user *arg) | |||
| 2844 | if (copy_from_user(®, arg, | 2846 | if (copy_from_user(®, arg, |
| 2845 | sizeof(struct he_ioctl_reg))) | 2847 | sizeof(struct he_ioctl_reg))) |
| 2846 | return -EFAULT; | 2848 | return -EFAULT; |
| 2847 | 2849 | ||
| 2848 | spin_lock_irqsave(&he_dev->global_lock, flags); | 2850 | spin_lock_irqsave(&he_dev->global_lock, flags); |
| 2849 | switch (reg.type) { | 2851 | switch (reg.type) { |
| 2850 | case HE_REGTYPE_PCI: | 2852 | case HE_REGTYPE_PCI: |
| 2853 | if (reg.addr < 0 || reg.addr >= HE_REGMAP_SIZE) { | ||
| 2854 | err = -EINVAL; | ||
| 2855 | break; | ||
| 2856 | } | ||
| 2857 | |||
| 2851 | reg.val = he_readl(he_dev, reg.addr); | 2858 | reg.val = he_readl(he_dev, reg.addr); |
| 2852 | break; | 2859 | break; |
| 2853 | case HE_REGTYPE_RCM: | 2860 | case HE_REGTYPE_RCM: |
diff --git a/drivers/atm/he.h b/drivers/atm/he.h index fe6cd15a78a4..b87d6ccabac1 100644 --- a/drivers/atm/he.h +++ b/drivers/atm/he.h | |||
| @@ -267,13 +267,7 @@ struct he_dev { | |||
| 267 | 267 | ||
| 268 | char prod_id[30]; | 268 | char prod_id[30]; |
| 269 | char mac_addr[6]; | 269 | char mac_addr[6]; |
| 270 | int media; /* | 270 | int media; |
| 271 | * 0x26 = HE155 MM | ||
| 272 | * 0x27 = HE622 MM | ||
| 273 | * 0x46 = HE155 SM | ||
| 274 | * 0x47 = HE622 SM | ||
| 275 | */ | ||
| 276 | |||
| 277 | 271 | ||
| 278 | unsigned int vcibits, vpibits; | 272 | unsigned int vcibits, vpibits; |
| 279 | unsigned int cells_per_row; | 273 | unsigned int cells_per_row; |
| @@ -392,6 +386,7 @@ struct he_vcc | |||
| 392 | #define HE_DEV(dev) ((struct he_dev *) (dev)->dev_data) | 386 | #define HE_DEV(dev) ((struct he_dev *) (dev)->dev_data) |
| 393 | 387 | ||
| 394 | #define he_is622(dev) ((dev)->media & 0x1) | 388 | #define he_is622(dev) ((dev)->media & 0x1) |
| 389 | #define he_isMM(dev) ((dev)->media & 0x20) | ||
| 395 | 390 | ||
| 396 | #define HE_REGMAP_SIZE 0x100000 | 391 | #define HE_REGMAP_SIZE 0x100000 |
| 397 | 392 | ||
| @@ -876,8 +871,8 @@ struct he_vcc | |||
| 876 | #define M_SN 0x3a /* integer */ | 871 | #define M_SN 0x3a /* integer */ |
| 877 | #define MEDIA 0x3e /* integer */ | 872 | #define MEDIA 0x3e /* integer */ |
| 878 | #define HE155MM 0x26 | 873 | #define HE155MM 0x26 |
| 879 | #define HE155SM 0x27 | 874 | #define HE622MM 0x27 |
| 880 | #define HE622MM 0x46 | 875 | #define HE155SM 0x46 |
| 881 | #define HE622SM 0x47 | 876 | #define HE622SM 0x47 |
| 882 | #define MAC_ADDR 0x42 /* char[] */ | 877 | #define MAC_ADDR 0x42 /* char[] */ |
| 883 | 878 | ||
diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c index 5c28ca7380ff..139fce6968a6 100644 --- a/drivers/atm/iphase.c +++ b/drivers/atm/iphase.c | |||
| @@ -2562,17 +2562,11 @@ static int __devinit ia_start(struct atm_dev *dev) | |||
| 2562 | error = suni_init(dev); | 2562 | error = suni_init(dev); |
| 2563 | if (error) | 2563 | if (error) |
| 2564 | goto err_free_rx; | 2564 | goto err_free_rx; |
| 2565 | /* | 2565 | if (dev->phy->start) { |
| 2566 | * Enable interrupt on loss of signal | 2566 | error = dev->phy->start(dev); |
| 2567 | * SUNI_RSOP_CIE - 0x10 | 2567 | if (error) |
| 2568 | * SUNI_RSOP_CIE_LOSE - 0x04 | 2568 | goto err_free_rx; |
| 2569 | */ | 2569 | } |
| 2570 | ia_phy_put(dev, ia_phy_get(dev, 0x10) | 0x04, 0x10); | ||
| 2571 | #ifndef MODULE | ||
| 2572 | error = dev->phy->start(dev); | ||
| 2573 | if (error) | ||
| 2574 | goto err_free_rx; | ||
| 2575 | #endif | ||
| 2576 | /* Get iadev->carrier_detect status */ | 2570 | /* Get iadev->carrier_detect status */ |
| 2577 | IaFrontEndIntr(iadev); | 2571 | IaFrontEndIntr(iadev); |
| 2578 | } | 2572 | } |
| @@ -3198,6 +3192,8 @@ static int __devinit ia_init_one(struct pci_dev *pdev, | |||
| 3198 | IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", (u32)dev, | 3192 | IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", (u32)dev, |
| 3199 | iadev->LineRate);) | 3193 | iadev->LineRate);) |
| 3200 | 3194 | ||
| 3195 | pci_set_drvdata(pdev, dev); | ||
| 3196 | |||
| 3201 | ia_dev[iadev_count] = iadev; | 3197 | ia_dev[iadev_count] = iadev; |
| 3202 | _ia_dev[iadev_count] = dev; | 3198 | _ia_dev[iadev_count] = dev; |
| 3203 | iadev_count++; | 3199 | iadev_count++; |
| @@ -3219,8 +3215,6 @@ static int __devinit ia_init_one(struct pci_dev *pdev, | |||
| 3219 | iadev->next_board = ia_boards; | 3215 | iadev->next_board = ia_boards; |
| 3220 | ia_boards = dev; | 3216 | ia_boards = dev; |
| 3221 | 3217 | ||
| 3222 | pci_set_drvdata(pdev, dev); | ||
| 3223 | |||
| 3224 | return 0; | 3218 | return 0; |
| 3225 | 3219 | ||
| 3226 | err_out_deregister_dev: | 3220 | err_out_deregister_dev: |
| @@ -3238,9 +3232,14 @@ static void __devexit ia_remove_one(struct pci_dev *pdev) | |||
| 3238 | struct atm_dev *dev = pci_get_drvdata(pdev); | 3232 | struct atm_dev *dev = pci_get_drvdata(pdev); |
| 3239 | IADEV *iadev = INPH_IA_DEV(dev); | 3233 | IADEV *iadev = INPH_IA_DEV(dev); |
| 3240 | 3234 | ||
| 3241 | ia_phy_put(dev, ia_phy_get(dev,0x10) & ~(0x4), 0x10); | 3235 | /* Disable phy interrupts */ |
| 3236 | ia_phy_put(dev, ia_phy_get(dev, SUNI_RSOP_CIE) & ~(SUNI_RSOP_CIE_LOSE), | ||
| 3237 | SUNI_RSOP_CIE); | ||
| 3242 | udelay(1); | 3238 | udelay(1); |
| 3243 | 3239 | ||
| 3240 | if (dev->phy && dev->phy->stop) | ||
| 3241 | dev->phy->stop(dev); | ||
| 3242 | |||
| 3244 | /* De-register device */ | 3243 | /* De-register device */ |
| 3245 | free_irq(iadev->irq, dev); | 3244 | free_irq(iadev->irq, dev); |
| 3246 | iadev_count--; | 3245 | iadev_count--; |
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c index 99e0b4cdc56f..3c798ae5c343 100644 --- a/drivers/net/atlx/atl1.c +++ b/drivers/net/atlx/atl1.c | |||
| @@ -471,7 +471,6 @@ static int atl1_get_permanent_address(struct atl1_hw *hw) | |||
| 471 | memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN); | 471 | memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN); |
| 472 | return 0; | 472 | return 0; |
| 473 | } | 473 | } |
| 474 | return 1; | ||
| 475 | } | 474 | } |
| 476 | 475 | ||
| 477 | /* see if SPI FLAGS exist ? */ | 476 | /* see if SPI FLAGS exist ? */ |
diff --git a/drivers/net/enc28j60.c b/drivers/net/enc28j60.c index 46a90e9ec563..c05cb159c772 100644 --- a/drivers/net/enc28j60.c +++ b/drivers/net/enc28j60.c | |||
| @@ -400,26 +400,31 @@ enc28j60_packet_write(struct enc28j60_net *priv, int len, const u8 *data) | |||
| 400 | mutex_unlock(&priv->lock); | 400 | mutex_unlock(&priv->lock); |
| 401 | } | 401 | } |
| 402 | 402 | ||
| 403 | /* | 403 | static unsigned long msec20_to_jiffies; |
| 404 | * Wait until the PHY operation is complete. | 404 | |
| 405 | */ | 405 | static int poll_ready(struct enc28j60_net *priv, u8 reg, u8 mask, u8 val) |
| 406 | static int wait_phy_ready(struct enc28j60_net *priv) | ||
| 407 | { | 406 | { |
| 408 | unsigned long timeout = jiffies + 20 * HZ / 1000; | 407 | unsigned long timeout = jiffies + msec20_to_jiffies; |
| 409 | int ret = 1; | ||
| 410 | 408 | ||
| 411 | /* 20 msec timeout read */ | 409 | /* 20 msec timeout read */ |
| 412 | while (nolock_regb_read(priv, MISTAT) & MISTAT_BUSY) { | 410 | while ((nolock_regb_read(priv, reg) & mask) != val) { |
| 413 | if (time_after(jiffies, timeout)) { | 411 | if (time_after(jiffies, timeout)) { |
| 414 | if (netif_msg_drv(priv)) | 412 | if (netif_msg_drv(priv)) |
| 415 | printk(KERN_DEBUG DRV_NAME | 413 | dev_dbg(&priv->spi->dev, |
| 416 | ": PHY ready timeout!\n"); | 414 | "reg %02x ready timeout!\n", reg); |
| 417 | ret = 0; | 415 | return -ETIMEDOUT; |
| 418 | break; | ||
| 419 | } | 416 | } |
| 420 | cpu_relax(); | 417 | cpu_relax(); |
| 421 | } | 418 | } |
| 422 | return ret; | 419 | return 0; |
| 420 | } | ||
| 421 | |||
| 422 | /* | ||
| 423 | * Wait until the PHY operation is complete. | ||
| 424 | */ | ||
| 425 | static int wait_phy_ready(struct enc28j60_net *priv) | ||
| 426 | { | ||
| 427 | return poll_ready(priv, MISTAT, MISTAT_BUSY, 0) ? 0 : 1; | ||
| 423 | } | 428 | } |
| 424 | 429 | ||
| 425 | /* | 430 | /* |
| @@ -594,6 +599,32 @@ static void nolock_txfifo_init(struct enc28j60_net *priv, u16 start, u16 end) | |||
| 594 | nolock_regw_write(priv, ETXNDL, end); | 599 | nolock_regw_write(priv, ETXNDL, end); |
| 595 | } | 600 | } |
| 596 | 601 | ||
| 602 | /* | ||
| 603 | * Low power mode shrinks power consumption about 100x, so we'd like | ||
| 604 | * the chip to be in that mode whenever it's inactive. (However, we | ||
| 605 | * can't stay in lowpower mode during suspend with WOL active.) | ||
| 606 | */ | ||
| 607 | static void enc28j60_lowpower(struct enc28j60_net *priv, bool is_low) | ||
| 608 | { | ||
| 609 | if (netif_msg_drv(priv)) | ||
| 610 | dev_dbg(&priv->spi->dev, "%s power...\n", | ||
| 611 | is_low ? "low" : "high"); | ||
| 612 | |||
| 613 | mutex_lock(&priv->lock); | ||
| 614 | if (is_low) { | ||
| 615 | nolock_reg_bfclr(priv, ECON1, ECON1_RXEN); | ||
| 616 | poll_ready(priv, ESTAT, ESTAT_RXBUSY, 0); | ||
| 617 | poll_ready(priv, ECON1, ECON1_TXRTS, 0); | ||
| 618 | /* ECON2_VRPS was set during initialization */ | ||
| 619 | nolock_reg_bfset(priv, ECON2, ECON2_PWRSV); | ||
| 620 | } else { | ||
| 621 | nolock_reg_bfclr(priv, ECON2, ECON2_PWRSV); | ||
| 622 | poll_ready(priv, ESTAT, ESTAT_CLKRDY, ESTAT_CLKRDY); | ||
| 623 | /* caller sets ECON1_RXEN */ | ||
| 624 | } | ||
| 625 | mutex_unlock(&priv->lock); | ||
| 626 | } | ||
| 627 | |||
| 597 | static int enc28j60_hw_init(struct enc28j60_net *priv) | 628 | static int enc28j60_hw_init(struct enc28j60_net *priv) |
| 598 | { | 629 | { |
| 599 | u8 reg; | 630 | u8 reg; |
| @@ -612,8 +643,8 @@ static int enc28j60_hw_init(struct enc28j60_net *priv) | |||
| 612 | priv->tx_retry_count = 0; | 643 | priv->tx_retry_count = 0; |
| 613 | priv->max_pk_counter = 0; | 644 | priv->max_pk_counter = 0; |
| 614 | priv->rxfilter = RXFILTER_NORMAL; | 645 | priv->rxfilter = RXFILTER_NORMAL; |
| 615 | /* enable address auto increment */ | 646 | /* enable address auto increment and voltage regulator powersave */ |
| 616 | nolock_regb_write(priv, ECON2, ECON2_AUTOINC); | 647 | nolock_regb_write(priv, ECON2, ECON2_AUTOINC | ECON2_VRPS); |
| 617 | 648 | ||
| 618 | nolock_rxfifo_init(priv, RXSTART_INIT, RXEND_INIT); | 649 | nolock_rxfifo_init(priv, RXSTART_INIT, RXEND_INIT); |
| 619 | nolock_txfifo_init(priv, TXSTART_INIT, TXEND_INIT); | 650 | nolock_txfifo_init(priv, TXSTART_INIT, TXEND_INIT); |
| @@ -690,7 +721,7 @@ static int enc28j60_hw_init(struct enc28j60_net *priv) | |||
| 690 | 721 | ||
| 691 | static void enc28j60_hw_enable(struct enc28j60_net *priv) | 722 | static void enc28j60_hw_enable(struct enc28j60_net *priv) |
| 692 | { | 723 | { |
| 693 | /* enable interrutps */ | 724 | /* enable interrupts */ |
| 694 | if (netif_msg_hw(priv)) | 725 | if (netif_msg_hw(priv)) |
| 695 | printk(KERN_DEBUG DRV_NAME ": %s() enabling interrupts.\n", | 726 | printk(KERN_DEBUG DRV_NAME ": %s() enabling interrupts.\n", |
| 696 | __FUNCTION__); | 727 | __FUNCTION__); |
| @@ -726,15 +757,12 @@ enc28j60_setlink(struct net_device *ndev, u8 autoneg, u16 speed, u8 duplex) | |||
| 726 | int ret = 0; | 757 | int ret = 0; |
| 727 | 758 | ||
| 728 | if (!priv->hw_enable) { | 759 | if (!priv->hw_enable) { |
| 729 | if (autoneg == AUTONEG_DISABLE && speed == SPEED_10) { | 760 | /* link is in low power mode now; duplex setting |
| 761 | * will take effect on next enc28j60_hw_init(). | ||
| 762 | */ | ||
| 763 | if (autoneg == AUTONEG_DISABLE && speed == SPEED_10) | ||
| 730 | priv->full_duplex = (duplex == DUPLEX_FULL); | 764 | priv->full_duplex = (duplex == DUPLEX_FULL); |
| 731 | if (!enc28j60_hw_init(priv)) { | 765 | else { |
| 732 | if (netif_msg_drv(priv)) | ||
| 733 | dev_err(&ndev->dev, | ||
| 734 | "hw_reset() failed\n"); | ||
| 735 | ret = -EINVAL; | ||
| 736 | } | ||
| 737 | } else { | ||
| 738 | if (netif_msg_link(priv)) | 766 | if (netif_msg_link(priv)) |
| 739 | dev_warn(&ndev->dev, | 767 | dev_warn(&ndev->dev, |
| 740 | "unsupported link setting\n"); | 768 | "unsupported link setting\n"); |
| @@ -1307,7 +1335,8 @@ static int enc28j60_net_open(struct net_device *dev) | |||
| 1307 | } | 1335 | } |
| 1308 | return -EADDRNOTAVAIL; | 1336 | return -EADDRNOTAVAIL; |
| 1309 | } | 1337 | } |
| 1310 | /* Reset the hardware here */ | 1338 | /* Reset the hardware here (and take it out of low power mode) */ |
| 1339 | enc28j60_lowpower(priv, false); | ||
| 1311 | enc28j60_hw_disable(priv); | 1340 | enc28j60_hw_disable(priv); |
| 1312 | if (!enc28j60_hw_init(priv)) { | 1341 | if (!enc28j60_hw_init(priv)) { |
| 1313 | if (netif_msg_ifup(priv)) | 1342 | if (netif_msg_ifup(priv)) |
| @@ -1337,6 +1366,7 @@ static int enc28j60_net_close(struct net_device *dev) | |||
| 1337 | printk(KERN_DEBUG DRV_NAME ": %s() enter\n", __FUNCTION__); | 1366 | printk(KERN_DEBUG DRV_NAME ": %s() enter\n", __FUNCTION__); |
| 1338 | 1367 | ||
| 1339 | enc28j60_hw_disable(priv); | 1368 | enc28j60_hw_disable(priv); |
| 1369 | enc28j60_lowpower(priv, true); | ||
| 1340 | netif_stop_queue(dev); | 1370 | netif_stop_queue(dev); |
| 1341 | 1371 | ||
| 1342 | return 0; | 1372 | return 0; |
| @@ -1537,6 +1567,8 @@ static int __devinit enc28j60_probe(struct spi_device *spi) | |||
| 1537 | dev->watchdog_timeo = TX_TIMEOUT; | 1567 | dev->watchdog_timeo = TX_TIMEOUT; |
| 1538 | SET_ETHTOOL_OPS(dev, &enc28j60_ethtool_ops); | 1568 | SET_ETHTOOL_OPS(dev, &enc28j60_ethtool_ops); |
| 1539 | 1569 | ||
| 1570 | enc28j60_lowpower(priv, true); | ||
| 1571 | |||
| 1540 | ret = register_netdev(dev); | 1572 | ret = register_netdev(dev); |
| 1541 | if (ret) { | 1573 | if (ret) { |
| 1542 | if (netif_msg_probe(priv)) | 1574 | if (netif_msg_probe(priv)) |
| @@ -1556,7 +1588,7 @@ error_alloc: | |||
| 1556 | return ret; | 1588 | return ret; |
| 1557 | } | 1589 | } |
| 1558 | 1590 | ||
| 1559 | static int enc28j60_remove(struct spi_device *spi) | 1591 | static int __devexit enc28j60_remove(struct spi_device *spi) |
| 1560 | { | 1592 | { |
| 1561 | struct enc28j60_net *priv = dev_get_drvdata(&spi->dev); | 1593 | struct enc28j60_net *priv = dev_get_drvdata(&spi->dev); |
| 1562 | 1594 | ||
| @@ -1573,15 +1605,16 @@ static int enc28j60_remove(struct spi_device *spi) | |||
| 1573 | static struct spi_driver enc28j60_driver = { | 1605 | static struct spi_driver enc28j60_driver = { |
| 1574 | .driver = { | 1606 | .driver = { |
| 1575 | .name = DRV_NAME, | 1607 | .name = DRV_NAME, |
| 1576 | .bus = &spi_bus_type, | ||
| 1577 | .owner = THIS_MODULE, | 1608 | .owner = THIS_MODULE, |
| 1578 | }, | 1609 | }, |
| 1579 | .probe = enc28j60_probe, | 1610 | .probe = enc28j60_probe, |
| 1580 | .remove = __devexit_p(enc28j60_remove), | 1611 | .remove = __devexit_p(enc28j60_remove), |
| 1581 | }; | 1612 | }; |
| 1582 | 1613 | ||
| 1583 | static int __init enc28j60_init(void) | 1614 | static int __init enc28j60_init(void) |
| 1584 | { | 1615 | { |
| 1616 | msec20_to_jiffies = msecs_to_jiffies(20); | ||
| 1617 | |||
| 1585 | return spi_register_driver(&enc28j60_driver); | 1618 | return spi_register_driver(&enc28j60_driver); |
| 1586 | } | 1619 | } |
| 1587 | 1620 | ||
diff --git a/drivers/net/ibm_newemac/Kconfig b/drivers/net/ibm_newemac/Kconfig index 0d3e7380bad0..70a3272ee998 100644 --- a/drivers/net/ibm_newemac/Kconfig +++ b/drivers/net/ibm_newemac/Kconfig | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | config IBM_NEW_EMAC | 1 | config IBM_NEW_EMAC |
| 2 | tristate "IBM EMAC Ethernet support" | 2 | tristate "IBM EMAC Ethernet support" |
| 3 | depends on PPC_DCR && PPC_MERGE | 3 | depends on PPC_DCR && PPC_MERGE |
| 4 | select CRC32 | ||
| 4 | help | 5 | help |
| 5 | This driver supports the IBM EMAC family of Ethernet controllers | 6 | This driver supports the IBM EMAC family of Ethernet controllers |
| 6 | typically found on 4xx embedded PowerPC chips, but also on the | 7 | typically found on 4xx embedded PowerPC chips, but also on the |
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index 8cb29f5b1038..da4c4fb97064 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
| @@ -776,7 +776,6 @@ struct netxen_hardware_context { | |||
| 776 | 776 | ||
| 777 | u8 revision_id; | 777 | u8 revision_id; |
| 778 | u16 board_type; | 778 | u16 board_type; |
| 779 | u16 max_ports; | ||
| 780 | struct netxen_board_info boardcfg; | 779 | struct netxen_board_info boardcfg; |
| 781 | u32 xg_linkup; | 780 | u32 xg_linkup; |
| 782 | u32 qg_linksup; | 781 | u32 qg_linksup; |
| @@ -863,6 +862,7 @@ struct netxen_adapter { | |||
| 863 | unsigned char mac_addr[ETH_ALEN]; | 862 | unsigned char mac_addr[ETH_ALEN]; |
| 864 | int mtu; | 863 | int mtu; |
| 865 | int portnum; | 864 | int portnum; |
| 865 | u8 physical_port; | ||
| 866 | 866 | ||
| 867 | struct work_struct watchdog_task; | 867 | struct work_struct watchdog_task; |
| 868 | struct timer_list watchdog_timer; | 868 | struct timer_list watchdog_timer; |
| @@ -1034,7 +1034,6 @@ int netxen_rom_se(struct netxen_adapter *adapter, int addr); | |||
| 1034 | 1034 | ||
| 1035 | /* Functions from netxen_nic_isr.c */ | 1035 | /* Functions from netxen_nic_isr.c */ |
| 1036 | void netxen_initialize_adapter_sw(struct netxen_adapter *adapter); | 1036 | void netxen_initialize_adapter_sw(struct netxen_adapter *adapter); |
| 1037 | void netxen_initialize_adapter_hw(struct netxen_adapter *adapter); | ||
| 1038 | void *netxen_alloc(struct pci_dev *pdev, size_t sz, dma_addr_t * ptr, | 1037 | void *netxen_alloc(struct pci_dev *pdev, size_t sz, dma_addr_t * ptr, |
| 1039 | struct pci_dev **used_dev); | 1038 | struct pci_dev **used_dev); |
| 1040 | void netxen_initialize_adapter_ops(struct netxen_adapter *adapter); | 1039 | void netxen_initialize_adapter_ops(struct netxen_adapter *adapter); |
| @@ -1077,20 +1076,6 @@ static const struct netxen_brdinfo netxen_boards[] = { | |||
| 1077 | 1076 | ||
| 1078 | #define NUM_SUPPORTED_BOARDS ARRAY_SIZE(netxen_boards) | 1077 | #define NUM_SUPPORTED_BOARDS ARRAY_SIZE(netxen_boards) |
| 1079 | 1078 | ||
| 1080 | static inline void get_brd_port_by_type(u32 type, int *ports) | ||
| 1081 | { | ||
| 1082 | int i, found = 0; | ||
| 1083 | for (i = 0; i < NUM_SUPPORTED_BOARDS; ++i) { | ||
| 1084 | if (netxen_boards[i].brdtype == type) { | ||
| 1085 | *ports = netxen_boards[i].ports; | ||
| 1086 | found = 1; | ||
| 1087 | break; | ||
| 1088 | } | ||
| 1089 | } | ||
| 1090 | if (!found) | ||
| 1091 | *ports = 0; | ||
| 1092 | } | ||
| 1093 | |||
| 1094 | static inline void get_brd_name_by_type(u32 type, char *name) | 1079 | static inline void get_brd_name_by_type(u32 type, char *name) |
| 1095 | { | 1080 | { |
| 1096 | int i, found = 0; | 1081 | int i, found = 0; |
| @@ -1169,5 +1154,4 @@ extern int netxen_rom_fast_read(struct netxen_adapter *adapter, int addr, | |||
| 1169 | 1154 | ||
| 1170 | extern struct ethtool_ops netxen_nic_ethtool_ops; | 1155 | extern struct ethtool_ops netxen_nic_ethtool_ops; |
| 1171 | 1156 | ||
| 1172 | extern int physical_port[]; /* physical port # from virtual port.*/ | ||
| 1173 | #endif /* __NETXEN_NIC_H_ */ | 1157 | #endif /* __NETXEN_NIC_H_ */ |
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c index 6e98d830eefb..723487bf200c 100644 --- a/drivers/net/netxen/netxen_nic_ethtool.c +++ b/drivers/net/netxen/netxen_nic_ethtool.c | |||
| @@ -369,7 +369,7 @@ netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) | |||
| 369 | for (i = 3; niu_registers[mode].reg[i - 3] != -1; i++) { | 369 | for (i = 3; niu_registers[mode].reg[i - 3] != -1; i++) { |
| 370 | /* GB: port specific registers */ | 370 | /* GB: port specific registers */ |
| 371 | if (mode == 0 && i >= 19) | 371 | if (mode == 0 && i >= 19) |
| 372 | window = physical_port[adapter->portnum] * | 372 | window = adapter->physical_port * |
| 373 | NETXEN_NIC_PORT_WINDOW; | 373 | NETXEN_NIC_PORT_WINDOW; |
| 374 | 374 | ||
| 375 | NETXEN_NIC_LOCKED_READ_REG(niu_registers[mode]. | 375 | NETXEN_NIC_LOCKED_READ_REG(niu_registers[mode]. |
| @@ -527,7 +527,7 @@ netxen_nic_get_pauseparam(struct net_device *dev, | |||
| 527 | { | 527 | { |
| 528 | struct netxen_adapter *adapter = netdev_priv(dev); | 528 | struct netxen_adapter *adapter = netdev_priv(dev); |
| 529 | __u32 val; | 529 | __u32 val; |
| 530 | int port = physical_port[adapter->portnum]; | 530 | int port = adapter->physical_port; |
| 531 | 531 | ||
| 532 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { | 532 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { |
| 533 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) | 533 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) |
| @@ -573,7 +573,7 @@ netxen_nic_set_pauseparam(struct net_device *dev, | |||
| 573 | { | 573 | { |
| 574 | struct netxen_adapter *adapter = netdev_priv(dev); | 574 | struct netxen_adapter *adapter = netdev_priv(dev); |
| 575 | __u32 val; | 575 | __u32 val; |
| 576 | int port = physical_port[adapter->portnum]; | 576 | int port = adapter->physical_port; |
| 577 | /* read mode */ | 577 | /* read mode */ |
| 578 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { | 578 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { |
| 579 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) | 579 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index af7356468251..c43d06b8de9b 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
| @@ -396,11 +396,8 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter) | |||
| 396 | } | 396 | } |
| 397 | adapter->intr_scheme = readl( | 397 | adapter->intr_scheme = readl( |
| 398 | NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_FW)); | 398 | NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_FW)); |
| 399 | printk(KERN_NOTICE "%s: FW capabilities:0x%x\n", netxen_nic_driver_name, | ||
| 400 | adapter->intr_scheme); | ||
| 401 | adapter->msi_mode = readl( | 399 | adapter->msi_mode = readl( |
| 402 | NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_MSI_MODE_FW)); | 400 | NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_MSI_MODE_FW)); |
| 403 | DPRINTK(INFO, "Receive Peg ready too. starting stuff\n"); | ||
| 404 | 401 | ||
| 405 | addr = netxen_alloc(adapter->ahw.pdev, | 402 | addr = netxen_alloc(adapter->ahw.pdev, |
| 406 | sizeof(struct netxen_ring_ctx) + | 403 | sizeof(struct netxen_ring_ctx) + |
| @@ -408,8 +405,6 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter) | |||
| 408 | (dma_addr_t *) & adapter->ctx_desc_phys_addr, | 405 | (dma_addr_t *) & adapter->ctx_desc_phys_addr, |
| 409 | &adapter->ctx_desc_pdev); | 406 | &adapter->ctx_desc_pdev); |
| 410 | 407 | ||
| 411 | printk(KERN_INFO "ctx_desc_phys_addr: 0x%llx\n", | ||
| 412 | (unsigned long long) adapter->ctx_desc_phys_addr); | ||
| 413 | if (addr == NULL) { | 408 | if (addr == NULL) { |
| 414 | DPRINTK(ERR, "bad return from pci_alloc_consistent\n"); | 409 | DPRINTK(ERR, "bad return from pci_alloc_consistent\n"); |
| 415 | err = -ENOMEM; | 410 | err = -ENOMEM; |
| @@ -429,8 +424,6 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter) | |||
| 429 | adapter->max_tx_desc_count, | 424 | adapter->max_tx_desc_count, |
| 430 | (dma_addr_t *) & hw->cmd_desc_phys_addr, | 425 | (dma_addr_t *) & hw->cmd_desc_phys_addr, |
| 431 | &adapter->ahw.cmd_desc_pdev); | 426 | &adapter->ahw.cmd_desc_pdev); |
| 432 | printk(KERN_INFO "cmd_desc_phys_addr: 0x%llx\n", | ||
| 433 | (unsigned long long) hw->cmd_desc_phys_addr); | ||
| 434 | 427 | ||
| 435 | if (addr == NULL) { | 428 | if (addr == NULL) { |
| 436 | DPRINTK(ERR, "bad return from pci_alloc_consistent\n"); | 429 | DPRINTK(ERR, "bad return from pci_alloc_consistent\n"); |
| @@ -1032,15 +1025,15 @@ int netxen_nic_get_board_info(struct netxen_adapter *adapter) | |||
| 1032 | int netxen_nic_set_mtu_gb(struct netxen_adapter *adapter, int new_mtu) | 1025 | int netxen_nic_set_mtu_gb(struct netxen_adapter *adapter, int new_mtu) |
| 1033 | { | 1026 | { |
| 1034 | netxen_nic_write_w0(adapter, | 1027 | netxen_nic_write_w0(adapter, |
| 1035 | NETXEN_NIU_GB_MAX_FRAME_SIZE( | 1028 | NETXEN_NIU_GB_MAX_FRAME_SIZE(adapter->physical_port), |
| 1036 | physical_port[adapter->portnum]), new_mtu); | 1029 | new_mtu); |
| 1037 | return 0; | 1030 | return 0; |
| 1038 | } | 1031 | } |
| 1039 | 1032 | ||
| 1040 | int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu) | 1033 | int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu) |
| 1041 | { | 1034 | { |
| 1042 | new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; | 1035 | new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; |
| 1043 | if (physical_port[adapter->portnum] == 0) | 1036 | if (adapter->physical_port == 0) |
| 1044 | netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, | 1037 | netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, |
| 1045 | new_mtu); | 1038 | new_mtu); |
| 1046 | else | 1039 | else |
| @@ -1051,7 +1044,7 @@ int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu) | |||
| 1051 | 1044 | ||
| 1052 | void netxen_nic_init_niu_gb(struct netxen_adapter *adapter) | 1045 | void netxen_nic_init_niu_gb(struct netxen_adapter *adapter) |
| 1053 | { | 1046 | { |
| 1054 | netxen_niu_gbe_init_port(adapter, physical_port[adapter->portnum]); | 1047 | netxen_niu_gbe_init_port(adapter, adapter->physical_port); |
| 1055 | } | 1048 | } |
| 1056 | 1049 | ||
| 1057 | void | 1050 | void |
| @@ -1127,7 +1120,6 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter) | |||
| 1127 | 1120 | ||
| 1128 | void netxen_nic_flash_print(struct netxen_adapter *adapter) | 1121 | void netxen_nic_flash_print(struct netxen_adapter *adapter) |
| 1129 | { | 1122 | { |
| 1130 | int valid = 1; | ||
| 1131 | u32 fw_major = 0; | 1123 | u32 fw_major = 0; |
| 1132 | u32 fw_minor = 0; | 1124 | u32 fw_minor = 0; |
| 1133 | u32 fw_build = 0; | 1125 | u32 fw_build = 0; |
| @@ -1137,70 +1129,62 @@ void netxen_nic_flash_print(struct netxen_adapter *adapter) | |||
| 1137 | __le32 *ptr32; | 1129 | __le32 *ptr32; |
| 1138 | 1130 | ||
| 1139 | struct netxen_board_info *board_info = &(adapter->ahw.boardcfg); | 1131 | struct netxen_board_info *board_info = &(adapter->ahw.boardcfg); |
| 1140 | if (board_info->magic != NETXEN_BDINFO_MAGIC) { | 1132 | |
| 1141 | printk | 1133 | adapter->driver_mismatch = 0; |
| 1142 | ("NetXen Unknown board config, Read 0x%x expected as 0x%x\n", | 1134 | |
| 1143 | board_info->magic, NETXEN_BDINFO_MAGIC); | 1135 | ptr32 = (u32 *)&serial_num; |
| 1144 | valid = 0; | 1136 | addr = NETXEN_USER_START + |
| 1145 | } | 1137 | offsetof(struct netxen_new_user_info, serial_num); |
| 1146 | if (board_info->header_version != NETXEN_BDINFO_VERSION) { | 1138 | for (i = 0; i < 8; i++) { |
| 1147 | printk("NetXen Unknown board config version." | 1139 | if (netxen_rom_fast_read(adapter, addr, ptr32) == -1) { |
| 1148 | " Read %x, expected %x\n", | 1140 | printk("%s: ERROR reading %s board userarea.\n", |
| 1149 | board_info->header_version, NETXEN_BDINFO_VERSION); | 1141 | netxen_nic_driver_name, |
| 1150 | valid = 0; | 1142 | netxen_nic_driver_name); |
| 1151 | } | 1143 | adapter->driver_mismatch = 1; |
| 1152 | if (valid) { | 1144 | return; |
| 1153 | ptr32 = (u32 *)&serial_num; | ||
| 1154 | addr = NETXEN_USER_START + | ||
| 1155 | offsetof(struct netxen_new_user_info, serial_num); | ||
| 1156 | for (i = 0; i < 8; i++) { | ||
| 1157 | if (netxen_rom_fast_read(adapter, addr, ptr32) == -1) { | ||
| 1158 | printk("%s: ERROR reading %s board userarea.\n", | ||
| 1159 | netxen_nic_driver_name, | ||
| 1160 | netxen_nic_driver_name); | ||
| 1161 | return; | ||
| 1162 | } | ||
| 1163 | ptr32++; | ||
| 1164 | addr += sizeof(u32); | ||
| 1165 | } | 1145 | } |
| 1146 | ptr32++; | ||
| 1147 | addr += sizeof(u32); | ||
| 1148 | } | ||
| 1149 | |||
| 1150 | fw_major = readl(NETXEN_CRB_NORMALIZE(adapter, | ||
| 1151 | NETXEN_FW_VERSION_MAJOR)); | ||
| 1152 | fw_minor = readl(NETXEN_CRB_NORMALIZE(adapter, | ||
| 1153 | NETXEN_FW_VERSION_MINOR)); | ||
| 1154 | fw_build = | ||
| 1155 | readl(NETXEN_CRB_NORMALIZE(adapter, NETXEN_FW_VERSION_SUB)); | ||
| 1166 | 1156 | ||
| 1157 | if (adapter->portnum == 0) { | ||
| 1167 | get_brd_name_by_type(board_info->board_type, brd_name); | 1158 | get_brd_name_by_type(board_info->board_type, brd_name); |
| 1168 | 1159 | ||
| 1169 | printk("NetXen %s Board S/N %s Chip id 0x%x\n", | 1160 | printk("NetXen %s Board S/N %s Chip id 0x%x\n", |
| 1170 | brd_name, serial_num, board_info->chip_id); | 1161 | brd_name, serial_num, board_info->chip_id); |
| 1171 | 1162 | printk("NetXen Firmware version %d.%d.%d\n", fw_major, | |
| 1172 | printk("NetXen %s Board #%d, Chip id 0x%x\n", | 1163 | fw_minor, fw_build); |
| 1173 | board_info->board_type == 0x0b ? "XGB" : "GBE", | ||
| 1174 | board_info->board_num, board_info->chip_id); | ||
| 1175 | fw_major = readl(NETXEN_CRB_NORMALIZE(adapter, | ||
| 1176 | NETXEN_FW_VERSION_MAJOR)); | ||
| 1177 | fw_minor = readl(NETXEN_CRB_NORMALIZE(adapter, | ||
| 1178 | NETXEN_FW_VERSION_MINOR)); | ||
| 1179 | fw_build = | ||
| 1180 | readl(NETXEN_CRB_NORMALIZE(adapter, NETXEN_FW_VERSION_SUB)); | ||
| 1181 | |||
| 1182 | printk("NetXen Firmware version %d.%d.%d\n", fw_major, fw_minor, | ||
| 1183 | fw_build); | ||
| 1184 | } | 1164 | } |
| 1165 | |||
| 1185 | if (fw_major != _NETXEN_NIC_LINUX_MAJOR) { | 1166 | if (fw_major != _NETXEN_NIC_LINUX_MAJOR) { |
| 1186 | printk(KERN_ERR "The mismatch in driver version and firmware " | ||
| 1187 | "version major number\n" | ||
| 1188 | "Driver version major number = %d \t" | ||
| 1189 | "Firmware version major number = %d \n", | ||
| 1190 | _NETXEN_NIC_LINUX_MAJOR, fw_major); | ||
| 1191 | adapter->driver_mismatch = 1; | 1167 | adapter->driver_mismatch = 1; |
| 1192 | } | 1168 | } |
| 1193 | if (fw_minor != _NETXEN_NIC_LINUX_MINOR && | 1169 | if (fw_minor != _NETXEN_NIC_LINUX_MINOR && |
| 1194 | fw_minor != (_NETXEN_NIC_LINUX_MINOR + 1)) { | 1170 | fw_minor != (_NETXEN_NIC_LINUX_MINOR + 1)) { |
| 1195 | printk(KERN_ERR "The mismatch in driver version and firmware " | ||
| 1196 | "version minor number\n" | ||
| 1197 | "Driver version minor number = %d \t" | ||
| 1198 | "Firmware version minor number = %d \n", | ||
| 1199 | _NETXEN_NIC_LINUX_MINOR, fw_minor); | ||
| 1200 | adapter->driver_mismatch = 1; | 1171 | adapter->driver_mismatch = 1; |
| 1201 | } | 1172 | } |
| 1202 | if (adapter->driver_mismatch) | 1173 | if (adapter->driver_mismatch) { |
| 1203 | printk(KERN_INFO "Use the driver with version no %d.%d.xxx\n", | 1174 | printk(KERN_ERR "%s: driver and firmware version mismatch\n", |
| 1204 | fw_major, fw_minor); | 1175 | adapter->netdev->name); |
| 1176 | return; | ||
| 1177 | } | ||
| 1178 | |||
| 1179 | switch (adapter->ahw.board_type) { | ||
| 1180 | case NETXEN_NIC_GBE: | ||
| 1181 | dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n", | ||
| 1182 | adapter->netdev->name); | ||
| 1183 | break; | ||
| 1184 | case NETXEN_NIC_XGBE: | ||
| 1185 | dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n", | ||
| 1186 | adapter->netdev->name); | ||
| 1187 | break; | ||
| 1188 | } | ||
| 1205 | } | 1189 | } |
| 1206 | 1190 | ||
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 45fa33e0cb90..70d1b22ced22 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
| @@ -203,21 +203,6 @@ void netxen_initialize_adapter_sw(struct netxen_adapter *adapter) | |||
| 203 | } | 203 | } |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | void netxen_initialize_adapter_hw(struct netxen_adapter *adapter) | ||
| 207 | { | ||
| 208 | int ports = 0; | ||
| 209 | struct netxen_board_info *board_info = &(adapter->ahw.boardcfg); | ||
| 210 | |||
| 211 | if (netxen_nic_get_board_info(adapter) != 0) | ||
| 212 | printk("%s: Error getting board config info.\n", | ||
| 213 | netxen_nic_driver_name); | ||
| 214 | get_brd_port_by_type(board_info->board_type, &ports); | ||
| 215 | if (ports == 0) | ||
| 216 | printk(KERN_ERR "%s: Unknown board type\n", | ||
| 217 | netxen_nic_driver_name); | ||
| 218 | adapter->ahw.max_ports = ports; | ||
| 219 | } | ||
| 220 | |||
| 221 | void netxen_initialize_adapter_ops(struct netxen_adapter *adapter) | 206 | void netxen_initialize_adapter_ops(struct netxen_adapter *adapter) |
| 222 | { | 207 | { |
| 223 | switch (adapter->ahw.board_type) { | 208 | switch (adapter->ahw.board_type) { |
| @@ -765,18 +750,13 @@ int netxen_flash_unlock(struct netxen_adapter *adapter) | |||
| 765 | 750 | ||
| 766 | int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) | 751 | int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) |
| 767 | { | 752 | { |
| 768 | int addr, val, status; | 753 | int addr, val; |
| 769 | int n, i; | 754 | int n, i; |
| 770 | int init_delay = 0; | 755 | int init_delay = 0; |
| 771 | struct crb_addr_pair *buf; | 756 | struct crb_addr_pair *buf; |
| 772 | u32 off; | 757 | u32 off; |
| 773 | 758 | ||
| 774 | /* resetall */ | 759 | /* resetall */ |
| 775 | status = netxen_nic_get_board_info(adapter); | ||
| 776 | if (status) | ||
| 777 | printk("%s: netxen_pinit_from_rom: Error getting board info\n", | ||
| 778 | netxen_nic_driver_name); | ||
| 779 | |||
| 780 | netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET, | 760 | netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET, |
| 781 | NETXEN_ROMBUS_RESET); | 761 | NETXEN_ROMBUS_RESET); |
| 782 | 762 | ||
| @@ -860,10 +840,10 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) | |||
| 860 | netxen_nic_pci_change_crbwindow(adapter, 1); | 840 | netxen_nic_pci_change_crbwindow(adapter, 1); |
| 861 | } | 841 | } |
| 862 | if (init_delay == 1) { | 842 | if (init_delay == 1) { |
| 863 | msleep(2000); | 843 | msleep(1000); |
| 864 | init_delay = 0; | 844 | init_delay = 0; |
| 865 | } | 845 | } |
| 866 | msleep(20); | 846 | msleep(1); |
| 867 | } | 847 | } |
| 868 | kfree(buf); | 848 | kfree(buf); |
| 869 | 849 | ||
| @@ -938,12 +918,28 @@ int netxen_initialize_adapter_offload(struct netxen_adapter *adapter) | |||
| 938 | 918 | ||
| 939 | void netxen_free_adapter_offload(struct netxen_adapter *adapter) | 919 | void netxen_free_adapter_offload(struct netxen_adapter *adapter) |
| 940 | { | 920 | { |
| 921 | int i; | ||
| 922 | |||
| 941 | if (adapter->dummy_dma.addr) { | 923 | if (adapter->dummy_dma.addr) { |
| 942 | pci_free_consistent(adapter->ahw.pdev, | 924 | i = 100; |
| 925 | do { | ||
| 926 | if (dma_watchdog_shutdown_request(adapter) == 1) | ||
| 927 | break; | ||
| 928 | msleep(50); | ||
| 929 | if (dma_watchdog_shutdown_poll_result(adapter) == 1) | ||
| 930 | break; | ||
| 931 | } while (--i); | ||
| 932 | |||
| 933 | if (i) { | ||
| 934 | pci_free_consistent(adapter->ahw.pdev, | ||
| 943 | NETXEN_HOST_DUMMY_DMA_SIZE, | 935 | NETXEN_HOST_DUMMY_DMA_SIZE, |
| 944 | adapter->dummy_dma.addr, | 936 | adapter->dummy_dma.addr, |
| 945 | adapter->dummy_dma.phys_addr); | 937 | adapter->dummy_dma.phys_addr); |
| 946 | adapter->dummy_dma.addr = NULL; | 938 | adapter->dummy_dma.addr = NULL; |
| 939 | } else { | ||
| 940 | printk(KERN_ERR "%s: dma_watchdog_shutdown failed\n", | ||
| 941 | adapter->netdev->name); | ||
| 942 | } | ||
| 947 | } | 943 | } |
| 948 | } | 944 | } |
| 949 | 945 | ||
diff --git a/drivers/net/netxen/netxen_nic_isr.c b/drivers/net/netxen/netxen_nic_isr.c index f487615f4063..96cec41f9019 100644 --- a/drivers/net/netxen/netxen_nic_isr.c +++ b/drivers/net/netxen/netxen_nic_isr.c | |||
| @@ -145,7 +145,7 @@ static void netxen_nic_isr_other(struct netxen_adapter *adapter) | |||
| 145 | 145 | ||
| 146 | /* verify the offset */ | 146 | /* verify the offset */ |
| 147 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); | 147 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); |
| 148 | val = val >> physical_port[adapter->portnum]; | 148 | val = val >> adapter->physical_port; |
| 149 | if (val == adapter->ahw.qg_linksup) | 149 | if (val == adapter->ahw.qg_linksup) |
| 150 | return; | 150 | return; |
| 151 | 151 | ||
| @@ -199,7 +199,7 @@ void netxen_nic_xgbe_handle_phy_intr(struct netxen_adapter *adapter) | |||
| 199 | 199 | ||
| 200 | /* WINDOW = 1 */ | 200 | /* WINDOW = 1 */ |
| 201 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); | 201 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); |
| 202 | val >>= (physical_port[adapter->portnum] * 8); | 202 | val >>= (adapter->physical_port * 8); |
| 203 | val &= 0xff; | 203 | val &= 0xff; |
| 204 | 204 | ||
| 205 | if (adapter->ahw.xg_linkup == 1 && val != XG_LINK_UP) { | 205 | if (adapter->ahw.xg_linkup == 1 && val != XG_LINK_UP) { |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 7144c255ce54..6797ed069f1f 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
| @@ -70,17 +70,15 @@ static void netxen_nic_poll_controller(struct net_device *netdev); | |||
| 70 | static irqreturn_t netxen_intr(int irq, void *data); | 70 | static irqreturn_t netxen_intr(int irq, void *data); |
| 71 | static irqreturn_t netxen_msi_intr(int irq, void *data); | 71 | static irqreturn_t netxen_msi_intr(int irq, void *data); |
| 72 | 72 | ||
| 73 | int physical_port[] = {0, 1, 2, 3}; | ||
| 74 | |||
| 75 | /* PCI Device ID Table */ | 73 | /* PCI Device ID Table */ |
| 76 | static struct pci_device_id netxen_pci_tbl[] __devinitdata = { | 74 | static struct pci_device_id netxen_pci_tbl[] __devinitdata = { |
| 77 | {PCI_DEVICE(0x4040, 0x0001)}, | 75 | {PCI_DEVICE(0x4040, 0x0001), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 78 | {PCI_DEVICE(0x4040, 0x0002)}, | 76 | {PCI_DEVICE(0x4040, 0x0002), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 79 | {PCI_DEVICE(0x4040, 0x0003)}, | 77 | {PCI_DEVICE(0x4040, 0x0003), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 80 | {PCI_DEVICE(0x4040, 0x0004)}, | 78 | {PCI_DEVICE(0x4040, 0x0004), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 81 | {PCI_DEVICE(0x4040, 0x0005)}, | 79 | {PCI_DEVICE(0x4040, 0x0005), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 82 | {PCI_DEVICE(0x4040, 0x0024)}, | 80 | {PCI_DEVICE(0x4040, 0x0024), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 83 | {PCI_DEVICE(0x4040, 0x0025)}, | 81 | {PCI_DEVICE(0x4040, 0x0025), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 84 | {0,} | 82 | {0,} |
| 85 | }; | 83 | }; |
| 86 | 84 | ||
| @@ -288,10 +286,11 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 288 | int pci_func_id = PCI_FUNC(pdev->devfn); | 286 | int pci_func_id = PCI_FUNC(pdev->devfn); |
| 289 | DECLARE_MAC_BUF(mac); | 287 | DECLARE_MAC_BUF(mac); |
| 290 | 288 | ||
| 291 | printk(KERN_INFO "%s \n", netxen_nic_driver_string); | 289 | if (pci_func_id == 0) |
| 290 | printk(KERN_INFO "%s \n", netxen_nic_driver_string); | ||
| 292 | 291 | ||
| 293 | if (pdev->class != 0x020000) { | 292 | if (pdev->class != 0x020000) { |
| 294 | printk(KERN_ERR"NetXen function %d, class %x will not " | 293 | printk(KERN_DEBUG "NetXen function %d, class %x will not " |
| 295 | "be enabled.\n",pci_func_id, pdev->class); | 294 | "be enabled.\n",pci_func_id, pdev->class); |
| 296 | return -ENODEV; | 295 | return -ENODEV; |
| 297 | } | 296 | } |
| @@ -450,8 +449,12 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 450 | */ | 449 | */ |
| 451 | adapter->curr_window = 255; | 450 | adapter->curr_window = 255; |
| 452 | 451 | ||
| 453 | /* initialize the adapter */ | 452 | if (netxen_nic_get_board_info(adapter) != 0) { |
| 454 | netxen_initialize_adapter_hw(adapter); | 453 | printk("%s: Error getting board config info.\n", |
| 454 | netxen_nic_driver_name); | ||
| 455 | err = -EIO; | ||
| 456 | goto err_out_iounmap; | ||
| 457 | } | ||
| 455 | 458 | ||
| 456 | /* | 459 | /* |
| 457 | * Adapter in our case is quad port so initialize it before | 460 | * Adapter in our case is quad port so initialize it before |
| @@ -530,17 +533,15 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 530 | netxen_initialize_adapter_sw(adapter); /* initialize the buffers in adapter */ | 533 | netxen_initialize_adapter_sw(adapter); /* initialize the buffers in adapter */ |
| 531 | 534 | ||
| 532 | /* Mezz cards have PCI function 0,2,3 enabled */ | 535 | /* Mezz cards have PCI function 0,2,3 enabled */ |
| 533 | if ((adapter->ahw.boardcfg.board_type == NETXEN_BRDTYPE_P2_SB31_10G_IMEZ) | 536 | switch (adapter->ahw.boardcfg.board_type) { |
| 534 | && (pci_func_id >= 2)) | 537 | case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ: |
| 538 | case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ: | ||
| 539 | if (pci_func_id >= 2) | ||
| 535 | adapter->portnum = pci_func_id - 2; | 540 | adapter->portnum = pci_func_id - 2; |
| 536 | 541 | break; | |
| 537 | #ifdef CONFIG_IA64 | 542 | default: |
| 538 | if(adapter->portnum == 0) { | 543 | break; |
| 539 | netxen_pinit_from_rom(adapter, 0); | ||
| 540 | udelay(500); | ||
| 541 | netxen_load_firmware(adapter); | ||
| 542 | } | 544 | } |
| 543 | #endif | ||
| 544 | 545 | ||
| 545 | init_timer(&adapter->watchdog_timer); | 546 | init_timer(&adapter->watchdog_timer); |
| 546 | adapter->ahw.xg_linkup = 0; | 547 | adapter->ahw.xg_linkup = 0; |
| @@ -613,11 +614,18 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 613 | err = -ENODEV; | 614 | err = -ENODEV; |
| 614 | goto err_out_free_dev; | 615 | goto err_out_free_dev; |
| 615 | } | 616 | } |
| 617 | } else { | ||
| 618 | writel(0, NETXEN_CRB_NORMALIZE(adapter, | ||
| 619 | CRB_CMDPEG_STATE)); | ||
| 620 | netxen_pinit_from_rom(adapter, 0); | ||
| 621 | msleep(1); | ||
| 622 | netxen_load_firmware(adapter); | ||
| 623 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); | ||
| 616 | } | 624 | } |
| 617 | 625 | ||
| 618 | /* clear the register for future unloads/loads */ | 626 | /* clear the register for future unloads/loads */ |
| 619 | writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc))); | 627 | writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc))); |
| 620 | printk(KERN_INFO "State: 0x%0x\n", | 628 | dev_info(&pdev->dev, "cmdpeg state: 0x%0x\n", |
| 621 | readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE))); | 629 | readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE))); |
| 622 | 630 | ||
| 623 | /* | 631 | /* |
| @@ -639,9 +647,10 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 639 | /* | 647 | /* |
| 640 | * See if the firmware gave us a virtual-physical port mapping. | 648 | * See if the firmware gave us a virtual-physical port mapping. |
| 641 | */ | 649 | */ |
| 650 | adapter->physical_port = adapter->portnum; | ||
| 642 | i = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_V2P(adapter->portnum))); | 651 | i = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_V2P(adapter->portnum))); |
| 643 | if (i != 0x55555555) | 652 | if (i != 0x55555555) |
| 644 | physical_port[adapter->portnum] = i; | 653 | adapter->physical_port = i; |
| 645 | 654 | ||
| 646 | netif_carrier_off(netdev); | 655 | netif_carrier_off(netdev); |
| 647 | netif_stop_queue(netdev); | 656 | netif_stop_queue(netdev); |
| @@ -654,22 +663,9 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 654 | goto err_out_free_dev; | 663 | goto err_out_free_dev; |
| 655 | } | 664 | } |
| 656 | 665 | ||
| 666 | netxen_nic_flash_print(adapter); | ||
| 657 | pci_set_drvdata(pdev, adapter); | 667 | pci_set_drvdata(pdev, adapter); |
| 658 | 668 | ||
| 659 | switch (adapter->ahw.board_type) { | ||
| 660 | case NETXEN_NIC_GBE: | ||
| 661 | printk(KERN_INFO "%s: QUAD GbE board initialized\n", | ||
| 662 | netxen_nic_driver_name); | ||
| 663 | break; | ||
| 664 | |||
| 665 | case NETXEN_NIC_XGBE: | ||
| 666 | printk(KERN_INFO "%s: XGbE board initialized\n", | ||
| 667 | netxen_nic_driver_name); | ||
| 668 | break; | ||
| 669 | } | ||
| 670 | |||
| 671 | adapter->driver_mismatch = 0; | ||
| 672 | |||
| 673 | return 0; | 669 | return 0; |
| 674 | 670 | ||
| 675 | err_out_free_dev: | 671 | err_out_free_dev: |
| @@ -760,55 +756,8 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
| 760 | 756 | ||
| 761 | vfree(adapter->cmd_buf_arr); | 757 | vfree(adapter->cmd_buf_arr); |
| 762 | 758 | ||
| 763 | if (adapter->portnum == 0) { | 759 | if (adapter->portnum == 0) |
| 764 | if (init_firmware_done) { | 760 | netxen_free_adapter_offload(adapter); |
| 765 | i = 100; | ||
| 766 | do { | ||
| 767 | if (dma_watchdog_shutdown_request(adapter) == 1) | ||
| 768 | break; | ||
| 769 | msleep(100); | ||
| 770 | if (dma_watchdog_shutdown_poll_result(adapter) == 1) | ||
| 771 | break; | ||
| 772 | } while (--i); | ||
| 773 | |||
| 774 | if (i == 0) | ||
| 775 | printk(KERN_ERR "%s: dma_watchdog_shutdown failed\n", | ||
| 776 | netdev->name); | ||
| 777 | |||
| 778 | /* clear the register for future unloads/loads */ | ||
| 779 | writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc))); | ||
| 780 | printk(KERN_INFO "State: 0x%0x\n", | ||
| 781 | readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE))); | ||
| 782 | |||
| 783 | /* leave the hw in the same state as reboot */ | ||
| 784 | writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); | ||
| 785 | netxen_pinit_from_rom(adapter, 0); | ||
| 786 | msleep(1); | ||
| 787 | netxen_load_firmware(adapter); | ||
| 788 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); | ||
| 789 | } | ||
| 790 | |||
| 791 | /* clear the register for future unloads/loads */ | ||
| 792 | writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc))); | ||
| 793 | printk(KERN_INFO "State: 0x%0x\n", | ||
| 794 | readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE))); | ||
| 795 | |||
| 796 | i = 100; | ||
| 797 | do { | ||
| 798 | if (dma_watchdog_shutdown_request(adapter) == 1) | ||
| 799 | break; | ||
| 800 | msleep(100); | ||
| 801 | if (dma_watchdog_shutdown_poll_result(adapter) == 1) | ||
| 802 | break; | ||
| 803 | } while (--i); | ||
| 804 | |||
| 805 | if (i) { | ||
| 806 | netxen_free_adapter_offload(adapter); | ||
| 807 | } else { | ||
| 808 | printk(KERN_ERR "%s: dma_watchdog_shutdown failed\n", | ||
| 809 | netdev->name); | ||
| 810 | } | ||
| 811 | } | ||
| 812 | 761 | ||
| 813 | if (adapter->irq) | 762 | if (adapter->irq) |
| 814 | free_irq(adapter->irq, adapter); | 763 | free_irq(adapter->irq, adapter); |
| @@ -840,13 +789,15 @@ static int netxen_nic_open(struct net_device *netdev) | |||
| 840 | irq_handler_t handler; | 789 | irq_handler_t handler; |
| 841 | unsigned long flags = IRQF_SAMPLE_RANDOM; | 790 | unsigned long flags = IRQF_SAMPLE_RANDOM; |
| 842 | 791 | ||
| 792 | if (adapter->driver_mismatch) | ||
| 793 | return -EIO; | ||
| 794 | |||
| 843 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) { | 795 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) { |
| 844 | err = netxen_init_firmware(adapter); | 796 | err = netxen_init_firmware(adapter); |
| 845 | if (err != 0) { | 797 | if (err != 0) { |
| 846 | printk(KERN_ERR "Failed to init firmware\n"); | 798 | printk(KERN_ERR "Failed to init firmware\n"); |
| 847 | return -EIO; | 799 | return -EIO; |
| 848 | } | 800 | } |
| 849 | netxen_nic_flash_print(adapter); | ||
| 850 | 801 | ||
| 851 | /* setup all the resources for the Phantom... */ | 802 | /* setup all the resources for the Phantom... */ |
| 852 | /* this include the descriptors for rcv, tx, and status */ | 803 | /* this include the descriptors for rcv, tx, and status */ |
| @@ -895,14 +846,12 @@ static int netxen_nic_open(struct net_device *netdev) | |||
| 895 | if (adapter->set_mtu) | 846 | if (adapter->set_mtu) |
| 896 | adapter->set_mtu(adapter, netdev->mtu); | 847 | adapter->set_mtu(adapter, netdev->mtu); |
| 897 | 848 | ||
| 898 | if (!adapter->driver_mismatch) | 849 | mod_timer(&adapter->watchdog_timer, jiffies); |
| 899 | mod_timer(&adapter->watchdog_timer, jiffies); | ||
| 900 | 850 | ||
| 901 | napi_enable(&adapter->napi); | 851 | napi_enable(&adapter->napi); |
| 902 | netxen_nic_enable_int(adapter); | 852 | netxen_nic_enable_int(adapter); |
| 903 | 853 | ||
| 904 | if (!adapter->driver_mismatch) | 854 | netif_start_queue(netdev); |
| 905 | netif_start_queue(netdev); | ||
| 906 | 855 | ||
| 907 | return 0; | 856 | return 0; |
| 908 | } | 857 | } |
diff --git a/drivers/net/netxen/netxen_nic_niu.c b/drivers/net/netxen/netxen_nic_niu.c index 1c852a76c80d..a3bc7cc67a6f 100644 --- a/drivers/net/netxen/netxen_nic_niu.c +++ b/drivers/net/netxen/netxen_nic_niu.c | |||
| @@ -94,7 +94,7 @@ int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long reg, | |||
| 94 | long timeout = 0; | 94 | long timeout = 0; |
| 95 | long result = 0; | 95 | long result = 0; |
| 96 | long restore = 0; | 96 | long restore = 0; |
| 97 | long phy = physical_port[adapter->portnum]; | 97 | long phy = adapter->physical_port; |
| 98 | __u32 address; | 98 | __u32 address; |
| 99 | __u32 command; | 99 | __u32 command; |
| 100 | __u32 status; | 100 | __u32 status; |
| @@ -190,7 +190,7 @@ int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, long reg, | |||
| 190 | long timeout = 0; | 190 | long timeout = 0; |
| 191 | long result = 0; | 191 | long result = 0; |
| 192 | long restore = 0; | 192 | long restore = 0; |
| 193 | long phy = physical_port[adapter->portnum]; | 193 | long phy = adapter->physical_port; |
| 194 | __u32 address; | 194 | __u32 address; |
| 195 | __u32 command; | 195 | __u32 command; |
| 196 | __u32 status; | 196 | __u32 status; |
| @@ -456,7 +456,7 @@ int netxen_niu_gbe_init_port(struct netxen_adapter *adapter, int port) | |||
| 456 | 456 | ||
| 457 | int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port) | 457 | int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port) |
| 458 | { | 458 | { |
| 459 | u32 portnum = physical_port[adapter->portnum]; | 459 | u32 portnum = adapter->physical_port; |
| 460 | 460 | ||
| 461 | netxen_crb_writelit_adapter(adapter, | 461 | netxen_crb_writelit_adapter(adapter, |
| 462 | NETXEN_NIU_XGE_CONFIG_1+(0x10000*portnum), 0x1447); | 462 | NETXEN_NIU_XGE_CONFIG_1+(0x10000*portnum), 0x1447); |
| @@ -573,7 +573,7 @@ static int netxen_niu_macaddr_get(struct netxen_adapter *adapter, | |||
| 573 | { | 573 | { |
| 574 | u32 stationhigh; | 574 | u32 stationhigh; |
| 575 | u32 stationlow; | 575 | u32 stationlow; |
| 576 | int phy = physical_port[adapter->portnum]; | 576 | int phy = adapter->physical_port; |
| 577 | u8 val[8]; | 577 | u8 val[8]; |
| 578 | 578 | ||
| 579 | if (addr == NULL) | 579 | if (addr == NULL) |
| @@ -604,7 +604,7 @@ int netxen_niu_macaddr_set(struct netxen_adapter *adapter, | |||
| 604 | { | 604 | { |
| 605 | u8 temp[4]; | 605 | u8 temp[4]; |
| 606 | u32 val; | 606 | u32 val; |
| 607 | int phy = physical_port[adapter->portnum]; | 607 | int phy = adapter->physical_port; |
| 608 | unsigned char mac_addr[6]; | 608 | unsigned char mac_addr[6]; |
| 609 | int i; | 609 | int i; |
| 610 | DECLARE_MAC_BUF(mac); | 610 | DECLARE_MAC_BUF(mac); |
| @@ -724,7 +724,7 @@ int netxen_niu_enable_gbe_port(struct netxen_adapter *adapter, | |||
| 724 | int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter) | 724 | int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter) |
| 725 | { | 725 | { |
| 726 | __u32 mac_cfg0; | 726 | __u32 mac_cfg0; |
| 727 | u32 port = physical_port[adapter->portnum]; | 727 | u32 port = adapter->physical_port; |
| 728 | 728 | ||
| 729 | if (port > NETXEN_NIU_MAX_GBE_PORTS) | 729 | if (port > NETXEN_NIU_MAX_GBE_PORTS) |
| 730 | return -EINVAL; | 730 | return -EINVAL; |
| @@ -740,7 +740,7 @@ int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter) | |||
| 740 | int netxen_niu_disable_xg_port(struct netxen_adapter *adapter) | 740 | int netxen_niu_disable_xg_port(struct netxen_adapter *adapter) |
| 741 | { | 741 | { |
| 742 | __u32 mac_cfg; | 742 | __u32 mac_cfg; |
| 743 | u32 port = physical_port[adapter->portnum]; | 743 | u32 port = adapter->physical_port; |
| 744 | 744 | ||
| 745 | if (port > NETXEN_NIU_MAX_XG_PORTS) | 745 | if (port > NETXEN_NIU_MAX_XG_PORTS) |
| 746 | return -EINVAL; | 746 | return -EINVAL; |
| @@ -757,7 +757,7 @@ int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, | |||
| 757 | netxen_niu_prom_mode_t mode) | 757 | netxen_niu_prom_mode_t mode) |
| 758 | { | 758 | { |
| 759 | __u32 reg; | 759 | __u32 reg; |
| 760 | u32 port = physical_port[adapter->portnum]; | 760 | u32 port = adapter->physical_port; |
| 761 | 761 | ||
| 762 | if (port > NETXEN_NIU_MAX_GBE_PORTS) | 762 | if (port > NETXEN_NIU_MAX_GBE_PORTS) |
| 763 | return -EINVAL; | 763 | return -EINVAL; |
| @@ -814,7 +814,7 @@ int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, | |||
| 814 | int netxen_niu_xg_macaddr_set(struct netxen_adapter *adapter, | 814 | int netxen_niu_xg_macaddr_set(struct netxen_adapter *adapter, |
| 815 | netxen_ethernet_macaddr_t addr) | 815 | netxen_ethernet_macaddr_t addr) |
| 816 | { | 816 | { |
| 817 | int phy = physical_port[adapter->portnum]; | 817 | int phy = adapter->physical_port; |
| 818 | u8 temp[4]; | 818 | u8 temp[4]; |
| 819 | u32 val; | 819 | u32 val; |
| 820 | 820 | ||
| @@ -867,7 +867,7 @@ int netxen_niu_xg_macaddr_set(struct netxen_adapter *adapter, | |||
| 867 | int netxen_niu_xg_macaddr_get(struct netxen_adapter *adapter, | 867 | int netxen_niu_xg_macaddr_get(struct netxen_adapter *adapter, |
| 868 | netxen_ethernet_macaddr_t * addr) | 868 | netxen_ethernet_macaddr_t * addr) |
| 869 | { | 869 | { |
| 870 | int phy = physical_port[adapter->portnum]; | 870 | int phy = adapter->physical_port; |
| 871 | u32 stationhigh; | 871 | u32 stationhigh; |
| 872 | u32 stationlow; | 872 | u32 stationlow; |
| 873 | u8 val[8]; | 873 | u8 val[8]; |
| @@ -896,7 +896,7 @@ int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter, | |||
| 896 | netxen_niu_prom_mode_t mode) | 896 | netxen_niu_prom_mode_t mode) |
| 897 | { | 897 | { |
| 898 | __u32 reg; | 898 | __u32 reg; |
| 899 | u32 port = physical_port[adapter->portnum]; | 899 | u32 port = adapter->physical_port; |
| 900 | 900 | ||
| 901 | if (port > NETXEN_NIU_MAX_XG_PORTS) | 901 | if (port > NETXEN_NIU_MAX_XG_PORTS) |
| 902 | return -EINVAL; | 902 | return -EINVAL; |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 62436b3a18c6..c8a5ef2d75f4 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -118,6 +118,7 @@ static const struct pci_device_id sky2_id_table[] = { | |||
| 118 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4352) }, /* 88E8038 */ | 118 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4352) }, /* 88E8038 */ |
| 119 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4353) }, /* 88E8039 */ | 119 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4353) }, /* 88E8039 */ |
| 120 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4354) }, /* 88E8040 */ | 120 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4354) }, /* 88E8040 */ |
| 121 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4355) }, /* 88E8040T */ | ||
| 121 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4356) }, /* 88EC033 */ | 122 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4356) }, /* 88EC033 */ |
| 122 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4357) }, /* 88E8042 */ | 123 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4357) }, /* 88E8042 */ |
| 123 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x435A) }, /* 88E8048 */ | 124 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x435A) }, /* 88E8048 */ |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 0ce07a339c7e..7ab94c825b57 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -313,6 +313,21 @@ static __inline__ ssize_t tun_get_user(struct tun_struct *tun, struct iovec *iv, | |||
| 313 | 313 | ||
| 314 | switch (tun->flags & TUN_TYPE_MASK) { | 314 | switch (tun->flags & TUN_TYPE_MASK) { |
| 315 | case TUN_TUN_DEV: | 315 | case TUN_TUN_DEV: |
| 316 | if (tun->flags & TUN_NO_PI) { | ||
| 317 | switch (skb->data[0] & 0xf0) { | ||
| 318 | case 0x40: | ||
| 319 | pi.proto = htons(ETH_P_IP); | ||
| 320 | break; | ||
| 321 | case 0x60: | ||
| 322 | pi.proto = htons(ETH_P_IPV6); | ||
| 323 | break; | ||
| 324 | default: | ||
| 325 | tun->dev->stats.rx_dropped++; | ||
| 326 | kfree_skb(skb); | ||
| 327 | return -EINVAL; | ||
| 328 | } | ||
| 329 | } | ||
| 330 | |||
| 316 | skb_reset_mac_header(skb); | 331 | skb_reset_mac_header(skb); |
| 317 | skb->protocol = pi.proto; | 332 | skb->protocol = pi.proto; |
| 318 | skb->dev = tun->dev; | 333 | skb->dev = tun->dev; |
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index dfa4bdd5597c..d3db298c05fc 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h | |||
| @@ -630,7 +630,6 @@ struct b43_pio { | |||
| 630 | 630 | ||
| 631 | /* Context information for a noise calculation (Link Quality). */ | 631 | /* Context information for a noise calculation (Link Quality). */ |
| 632 | struct b43_noise_calculation { | 632 | struct b43_noise_calculation { |
| 633 | u8 channel_at_start; | ||
| 634 | bool calculation_running; | 633 | bool calculation_running; |
| 635 | u8 nr_samples; | 634 | u8 nr_samples; |
| 636 | s8 samples[8][4]; | 635 | s8 samples[8][4]; |
diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c index 6dcbb3c87e72..e23f2f172bd7 100644 --- a/drivers/net/wireless/b43/dma.c +++ b/drivers/net/wireless/b43/dma.c | |||
| @@ -795,24 +795,49 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, | |||
| 795 | { | 795 | { |
| 796 | struct b43_dmaring *ring; | 796 | struct b43_dmaring *ring; |
| 797 | int err; | 797 | int err; |
| 798 | int nr_slots; | ||
| 799 | dma_addr_t dma_test; | 798 | dma_addr_t dma_test; |
| 800 | 799 | ||
| 801 | ring = kzalloc(sizeof(*ring), GFP_KERNEL); | 800 | ring = kzalloc(sizeof(*ring), GFP_KERNEL); |
| 802 | if (!ring) | 801 | if (!ring) |
| 803 | goto out; | 802 | goto out; |
| 804 | ring->type = type; | ||
| 805 | 803 | ||
| 806 | nr_slots = B43_RXRING_SLOTS; | 804 | ring->nr_slots = B43_RXRING_SLOTS; |
| 807 | if (for_tx) | 805 | if (for_tx) |
| 808 | nr_slots = B43_TXRING_SLOTS; | 806 | ring->nr_slots = B43_TXRING_SLOTS; |
| 809 | 807 | ||
| 810 | ring->meta = kcalloc(nr_slots, sizeof(struct b43_dmadesc_meta), | 808 | ring->meta = kcalloc(ring->nr_slots, sizeof(struct b43_dmadesc_meta), |
| 811 | GFP_KERNEL); | 809 | GFP_KERNEL); |
| 812 | if (!ring->meta) | 810 | if (!ring->meta) |
| 813 | goto err_kfree_ring; | 811 | goto err_kfree_ring; |
| 812 | |||
| 813 | ring->type = type; | ||
| 814 | ring->dev = dev; | ||
| 815 | ring->mmio_base = b43_dmacontroller_base(type, controller_index); | ||
| 816 | ring->index = controller_index; | ||
| 817 | if (type == B43_DMA_64BIT) | ||
| 818 | ring->ops = &dma64_ops; | ||
| 819 | else | ||
| 820 | ring->ops = &dma32_ops; | ||
| 814 | if (for_tx) { | 821 | if (for_tx) { |
| 815 | ring->txhdr_cache = kcalloc(nr_slots, | 822 | ring->tx = 1; |
| 823 | ring->current_slot = -1; | ||
| 824 | } else { | ||
| 825 | if (ring->index == 0) { | ||
| 826 | ring->rx_buffersize = B43_DMA0_RX_BUFFERSIZE; | ||
| 827 | ring->frameoffset = B43_DMA0_RX_FRAMEOFFSET; | ||
| 828 | } else if (ring->index == 3) { | ||
| 829 | ring->rx_buffersize = B43_DMA3_RX_BUFFERSIZE; | ||
| 830 | ring->frameoffset = B43_DMA3_RX_FRAMEOFFSET; | ||
| 831 | } else | ||
| 832 | B43_WARN_ON(1); | ||
| 833 | } | ||
| 834 | spin_lock_init(&ring->lock); | ||
| 835 | #ifdef CONFIG_B43_DEBUG | ||
| 836 | ring->last_injected_overflow = jiffies; | ||
| 837 | #endif | ||
| 838 | |||
| 839 | if (for_tx) { | ||
| 840 | ring->txhdr_cache = kcalloc(ring->nr_slots, | ||
| 816 | b43_txhdr_size(dev), | 841 | b43_txhdr_size(dev), |
| 817 | GFP_KERNEL); | 842 | GFP_KERNEL); |
| 818 | if (!ring->txhdr_cache) | 843 | if (!ring->txhdr_cache) |
| @@ -828,7 +853,7 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, | |||
| 828 | b43_txhdr_size(dev), 1)) { | 853 | b43_txhdr_size(dev), 1)) { |
| 829 | /* ugh realloc */ | 854 | /* ugh realloc */ |
| 830 | kfree(ring->txhdr_cache); | 855 | kfree(ring->txhdr_cache); |
| 831 | ring->txhdr_cache = kcalloc(nr_slots, | 856 | ring->txhdr_cache = kcalloc(ring->nr_slots, |
| 832 | b43_txhdr_size(dev), | 857 | b43_txhdr_size(dev), |
| 833 | GFP_KERNEL | GFP_DMA); | 858 | GFP_KERNEL | GFP_DMA); |
| 834 | if (!ring->txhdr_cache) | 859 | if (!ring->txhdr_cache) |
| @@ -853,32 +878,6 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, | |||
| 853 | DMA_TO_DEVICE); | 878 | DMA_TO_DEVICE); |
| 854 | } | 879 | } |
| 855 | 880 | ||
| 856 | ring->dev = dev; | ||
| 857 | ring->nr_slots = nr_slots; | ||
| 858 | ring->mmio_base = b43_dmacontroller_base(type, controller_index); | ||
| 859 | ring->index = controller_index; | ||
| 860 | if (type == B43_DMA_64BIT) | ||
| 861 | ring->ops = &dma64_ops; | ||
| 862 | else | ||
| 863 | ring->ops = &dma32_ops; | ||
| 864 | if (for_tx) { | ||
| 865 | ring->tx = 1; | ||
| 866 | ring->current_slot = -1; | ||
| 867 | } else { | ||
| 868 | if (ring->index == 0) { | ||
| 869 | ring->rx_buffersize = B43_DMA0_RX_BUFFERSIZE; | ||
| 870 | ring->frameoffset = B43_DMA0_RX_FRAMEOFFSET; | ||
| 871 | } else if (ring->index == 3) { | ||
| 872 | ring->rx_buffersize = B43_DMA3_RX_BUFFERSIZE; | ||
| 873 | ring->frameoffset = B43_DMA3_RX_FRAMEOFFSET; | ||
| 874 | } else | ||
| 875 | B43_WARN_ON(1); | ||
| 876 | } | ||
| 877 | spin_lock_init(&ring->lock); | ||
| 878 | #ifdef CONFIG_B43_DEBUG | ||
| 879 | ring->last_injected_overflow = jiffies; | ||
| 880 | #endif | ||
| 881 | |||
| 882 | err = alloc_ringmemory(ring); | 881 | err = alloc_ringmemory(ring); |
| 883 | if (err) | 882 | if (err) |
| 884 | goto err_kfree_txhdr_cache; | 883 | goto err_kfree_txhdr_cache; |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 6c3d9ea0a9f8..fa4b0d8b74a2 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
| @@ -1145,7 +1145,6 @@ static void b43_generate_noise_sample(struct b43_wldev *dev) | |||
| 1145 | b43_jssi_write(dev, 0x7F7F7F7F); | 1145 | b43_jssi_write(dev, 0x7F7F7F7F); |
| 1146 | b43_write32(dev, B43_MMIO_MACCMD, | 1146 | b43_write32(dev, B43_MMIO_MACCMD, |
| 1147 | b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE); | 1147 | b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE); |
| 1148 | B43_WARN_ON(dev->noisecalc.channel_at_start != dev->phy.channel); | ||
| 1149 | } | 1148 | } |
| 1150 | 1149 | ||
| 1151 | static void b43_calculate_link_quality(struct b43_wldev *dev) | 1150 | static void b43_calculate_link_quality(struct b43_wldev *dev) |
| @@ -1154,7 +1153,6 @@ static void b43_calculate_link_quality(struct b43_wldev *dev) | |||
| 1154 | 1153 | ||
| 1155 | if (dev->noisecalc.calculation_running) | 1154 | if (dev->noisecalc.calculation_running) |
| 1156 | return; | 1155 | return; |
| 1157 | dev->noisecalc.channel_at_start = dev->phy.channel; | ||
| 1158 | dev->noisecalc.calculation_running = 1; | 1156 | dev->noisecalc.calculation_running = 1; |
| 1159 | dev->noisecalc.nr_samples = 0; | 1157 | dev->noisecalc.nr_samples = 0; |
| 1160 | 1158 | ||
| @@ -1171,9 +1169,16 @@ static void handle_irq_noise(struct b43_wldev *dev) | |||
| 1171 | 1169 | ||
| 1172 | /* Bottom half of Link Quality calculation. */ | 1170 | /* Bottom half of Link Quality calculation. */ |
| 1173 | 1171 | ||
| 1172 | /* Possible race condition: It might be possible that the user | ||
| 1173 | * changed to a different channel in the meantime since we | ||
| 1174 | * started the calculation. We ignore that fact, since it's | ||
| 1175 | * not really that much of a problem. The background noise is | ||
| 1176 | * an estimation only anyway. Slightly wrong results will get damped | ||
| 1177 | * by the averaging of the 8 sample rounds. Additionally the | ||
| 1178 | * value is shortlived. So it will be replaced by the next noise | ||
| 1179 | * calculation round soon. */ | ||
| 1180 | |||
| 1174 | B43_WARN_ON(!dev->noisecalc.calculation_running); | 1181 | B43_WARN_ON(!dev->noisecalc.calculation_running); |
| 1175 | if (dev->noisecalc.channel_at_start != phy->channel) | ||
| 1176 | goto drop_calculation; | ||
| 1177 | *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev)); | 1182 | *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev)); |
| 1178 | if (noise[0] == 0x7F || noise[1] == 0x7F || | 1183 | if (noise[0] == 0x7F || noise[1] == 0x7F || |
| 1179 | noise[2] == 0x7F || noise[3] == 0x7F) | 1184 | noise[2] == 0x7F || noise[3] == 0x7F) |
| @@ -1214,11 +1219,10 @@ static void handle_irq_noise(struct b43_wldev *dev) | |||
| 1214 | average -= 48; | 1219 | average -= 48; |
| 1215 | 1220 | ||
| 1216 | dev->stats.link_noise = average; | 1221 | dev->stats.link_noise = average; |
| 1217 | drop_calculation: | ||
| 1218 | dev->noisecalc.calculation_running = 0; | 1222 | dev->noisecalc.calculation_running = 0; |
| 1219 | return; | 1223 | return; |
| 1220 | } | 1224 | } |
| 1221 | generate_new: | 1225 | generate_new: |
| 1222 | b43_generate_noise_sample(dev); | 1226 | b43_generate_noise_sample(dev); |
| 1223 | } | 1227 | } |
| 1224 | 1228 | ||
diff --git a/drivers/net/wireless/rt2x00/Kconfig b/drivers/net/wireless/rt2x00/Kconfig index ab1029e79884..2d611876bbe0 100644 --- a/drivers/net/wireless/rt2x00/Kconfig +++ b/drivers/net/wireless/rt2x00/Kconfig | |||
| @@ -32,12 +32,13 @@ config RT2X00_LIB_FIRMWARE | |||
| 32 | config RT2X00_LIB_RFKILL | 32 | config RT2X00_LIB_RFKILL |
| 33 | boolean | 33 | boolean |
| 34 | depends on RT2X00_LIB | 34 | depends on RT2X00_LIB |
| 35 | depends on INPUT | ||
| 35 | select RFKILL | 36 | select RFKILL |
| 36 | select INPUT_POLLDEV | 37 | select INPUT_POLLDEV |
| 37 | 38 | ||
| 38 | config RT2X00_LIB_LEDS | 39 | config RT2X00_LIB_LEDS |
| 39 | boolean | 40 | boolean |
| 40 | depends on RT2X00_LIB | 41 | depends on RT2X00_LIB && NEW_LEDS |
| 41 | 42 | ||
| 42 | config RT2400PCI | 43 | config RT2400PCI |
| 43 | tristate "Ralink rt2400 pci/pcmcia support" | 44 | tristate "Ralink rt2400 pci/pcmcia support" |
| @@ -51,7 +52,7 @@ config RT2400PCI | |||
| 51 | 52 | ||
| 52 | config RT2400PCI_RFKILL | 53 | config RT2400PCI_RFKILL |
| 53 | bool "RT2400 rfkill support" | 54 | bool "RT2400 rfkill support" |
| 54 | depends on RT2400PCI | 55 | depends on RT2400PCI && INPUT |
| 55 | select RT2X00_LIB_RFKILL | 56 | select RT2X00_LIB_RFKILL |
| 56 | ---help--- | 57 | ---help--- |
| 57 | This adds support for integrated rt2400 devices that feature a | 58 | This adds support for integrated rt2400 devices that feature a |
| @@ -60,7 +61,7 @@ config RT2400PCI_RFKILL | |||
| 60 | 61 | ||
| 61 | config RT2400PCI_LEDS | 62 | config RT2400PCI_LEDS |
| 62 | bool "RT2400 leds support" | 63 | bool "RT2400 leds support" |
| 63 | depends on RT2400PCI | 64 | depends on RT2400PCI && NEW_LEDS |
| 64 | select LEDS_CLASS | 65 | select LEDS_CLASS |
| 65 | select RT2X00_LIB_LEDS | 66 | select RT2X00_LIB_LEDS |
| 66 | ---help--- | 67 | ---help--- |
| @@ -78,7 +79,7 @@ config RT2500PCI | |||
| 78 | 79 | ||
| 79 | config RT2500PCI_RFKILL | 80 | config RT2500PCI_RFKILL |
| 80 | bool "RT2500 rfkill support" | 81 | bool "RT2500 rfkill support" |
| 81 | depends on RT2500PCI | 82 | depends on RT2500PCI && INPUT |
| 82 | select RT2X00_LIB_RFKILL | 83 | select RT2X00_LIB_RFKILL |
| 83 | ---help--- | 84 | ---help--- |
| 84 | This adds support for integrated rt2500 devices that feature a | 85 | This adds support for integrated rt2500 devices that feature a |
| @@ -87,7 +88,7 @@ config RT2500PCI_RFKILL | |||
| 87 | 88 | ||
| 88 | config RT2500PCI_LEDS | 89 | config RT2500PCI_LEDS |
| 89 | bool "RT2500 leds support" | 90 | bool "RT2500 leds support" |
| 90 | depends on RT2500PCI | 91 | depends on RT2500PCI && NEW_LEDS |
| 91 | select LEDS_CLASS | 92 | select LEDS_CLASS |
| 92 | select RT2X00_LIB_LEDS | 93 | select RT2X00_LIB_LEDS |
| 93 | ---help--- | 94 | ---help--- |
| @@ -107,7 +108,7 @@ config RT61PCI | |||
| 107 | 108 | ||
| 108 | config RT61PCI_RFKILL | 109 | config RT61PCI_RFKILL |
| 109 | bool "RT61 rfkill support" | 110 | bool "RT61 rfkill support" |
| 110 | depends on RT61PCI | 111 | depends on RT61PCI && INPUT |
| 111 | select RT2X00_LIB_RFKILL | 112 | select RT2X00_LIB_RFKILL |
| 112 | ---help--- | 113 | ---help--- |
| 113 | This adds support for integrated rt61 devices that feature a | 114 | This adds support for integrated rt61 devices that feature a |
| @@ -116,7 +117,7 @@ config RT61PCI_RFKILL | |||
| 116 | 117 | ||
| 117 | config RT61PCI_LEDS | 118 | config RT61PCI_LEDS |
| 118 | bool "RT61 leds support" | 119 | bool "RT61 leds support" |
| 119 | depends on RT61PCI | 120 | depends on RT61PCI && NEW_LEDS |
| 120 | select LEDS_CLASS | 121 | select LEDS_CLASS |
| 121 | select RT2X00_LIB_LEDS | 122 | select RT2X00_LIB_LEDS |
| 122 | ---help--- | 123 | ---help--- |
| @@ -133,7 +134,7 @@ config RT2500USB | |||
| 133 | 134 | ||
| 134 | config RT2500USB_LEDS | 135 | config RT2500USB_LEDS |
| 135 | bool "RT2500 leds support" | 136 | bool "RT2500 leds support" |
| 136 | depends on RT2500USB | 137 | depends on RT2500USB && NEW_LEDS |
| 137 | select LEDS_CLASS | 138 | select LEDS_CLASS |
| 138 | select RT2X00_LIB_LEDS | 139 | select RT2X00_LIB_LEDS |
| 139 | ---help--- | 140 | ---help--- |
| @@ -152,7 +153,7 @@ config RT73USB | |||
| 152 | 153 | ||
| 153 | config RT73USB_LEDS | 154 | config RT73USB_LEDS |
| 154 | bool "RT73 leds support" | 155 | bool "RT73 leds support" |
| 155 | depends on RT73USB | 156 | depends on RT73USB && NEW_LEDS |
| 156 | select LEDS_CLASS | 157 | select LEDS_CLASS |
| 157 | select RT2X00_LIB_LEDS | 158 | select RT2X00_LIB_LEDS |
| 158 | ---help--- | 159 | ---help--- |
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index 971af2546b59..60893de3bf8f 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c | |||
| @@ -412,8 +412,7 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct pci_device_id *id) | |||
| 412 | if (pci_set_mwi(pci_dev)) | 412 | if (pci_set_mwi(pci_dev)) |
| 413 | ERROR_PROBE("MWI not available.\n"); | 413 | ERROR_PROBE("MWI not available.\n"); |
| 414 | 414 | ||
| 415 | if (pci_set_dma_mask(pci_dev, DMA_64BIT_MASK) && | 415 | if (pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) { |
| 416 | pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) { | ||
| 417 | ERROR_PROBE("PCI DMA not supported.\n"); | 416 | ERROR_PROBE("PCI DMA not supported.\n"); |
| 418 | retval = -EIO; | 417 | retval = -EIO; |
| 419 | goto exit_disable_device; | 418 | goto exit_disable_device; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index 5a331674dcb2..e5ceae805b57 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
| @@ -362,6 +362,12 @@ void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev) | |||
| 362 | } | 362 | } |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | /* | ||
| 366 | * Kill guardian urb (if required by driver). | ||
| 367 | */ | ||
| 368 | if (!test_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags)) | ||
| 369 | return; | ||
| 370 | |||
| 365 | for (i = 0; i < rt2x00dev->bcn->limit; i++) { | 371 | for (i = 0; i < rt2x00dev->bcn->limit; i++) { |
| 366 | priv_bcn = rt2x00dev->bcn->entries[i].priv_data; | 372 | priv_bcn = rt2x00dev->bcn->entries[i].priv_data; |
| 367 | usb_kill_urb(priv_bcn->urb); | 373 | usb_kill_urb(priv_bcn->urb); |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index da19a3a91f4d..fff8386e816b 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
| @@ -2131,6 +2131,7 @@ static struct usb_device_id rt73usb_device_table[] = { | |||
| 2131 | /* D-Link */ | 2131 | /* D-Link */ |
| 2132 | { USB_DEVICE(0x07d1, 0x3c03), USB_DEVICE_DATA(&rt73usb_ops) }, | 2132 | { USB_DEVICE(0x07d1, 0x3c03), USB_DEVICE_DATA(&rt73usb_ops) }, |
| 2133 | { USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) }, | 2133 | { USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) }, |
| 2134 | { USB_DEVICE(0x07d1, 0x3c06), USB_DEVICE_DATA(&rt73usb_ops) }, | ||
| 2134 | { USB_DEVICE(0x07d1, 0x3c07), USB_DEVICE_DATA(&rt73usb_ops) }, | 2135 | { USB_DEVICE(0x07d1, 0x3c07), USB_DEVICE_DATA(&rt73usb_ops) }, |
| 2135 | /* Gemtek */ | 2136 | /* Gemtek */ |
| 2136 | { USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) }, | 2137 | { USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) }, |
diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c index 7cf8851286b5..d184f2aea78d 100644 --- a/drivers/ssb/main.c +++ b/drivers/ssb/main.c | |||
| @@ -1168,15 +1168,21 @@ EXPORT_SYMBOL(ssb_dma_translation); | |||
| 1168 | int ssb_dma_set_mask(struct ssb_device *ssb_dev, u64 mask) | 1168 | int ssb_dma_set_mask(struct ssb_device *ssb_dev, u64 mask) |
| 1169 | { | 1169 | { |
| 1170 | struct device *dma_dev = ssb_dev->dma_dev; | 1170 | struct device *dma_dev = ssb_dev->dma_dev; |
| 1171 | int err = 0; | ||
| 1171 | 1172 | ||
| 1172 | #ifdef CONFIG_SSB_PCIHOST | 1173 | #ifdef CONFIG_SSB_PCIHOST |
| 1173 | if (ssb_dev->bus->bustype == SSB_BUSTYPE_PCI) | 1174 | if (ssb_dev->bus->bustype == SSB_BUSTYPE_PCI) { |
| 1174 | return dma_set_mask(dma_dev, mask); | 1175 | err = pci_set_dma_mask(ssb_dev->bus->host_pci, mask); |
| 1176 | if (err) | ||
| 1177 | return err; | ||
| 1178 | err = pci_set_consistent_dma_mask(ssb_dev->bus->host_pci, mask); | ||
| 1179 | return err; | ||
| 1180 | } | ||
| 1175 | #endif | 1181 | #endif |
| 1176 | dma_dev->coherent_dma_mask = mask; | 1182 | dma_dev->coherent_dma_mask = mask; |
| 1177 | dma_dev->dma_mask = &dma_dev->coherent_dma_mask; | 1183 | dma_dev->dma_mask = &dma_dev->coherent_dma_mask; |
| 1178 | 1184 | ||
| 1179 | return 0; | 1185 | return err; |
| 1180 | } | 1186 | } |
| 1181 | EXPORT_SYMBOL(ssb_dma_set_mask); | 1187 | EXPORT_SYMBOL(ssb_dma_set_mask); |
| 1182 | 1188 | ||
diff --git a/include/linux/if_tunnel.h b/include/linux/if_tunnel.h index f1fbe9c930d7..d4efe4014705 100644 --- a/include/linux/if_tunnel.h +++ b/include/linux/if_tunnel.h | |||
| @@ -41,7 +41,7 @@ struct ip_tunnel_prl { | |||
| 41 | __u16 __reserved; | 41 | __u16 __reserved; |
| 42 | __u32 datalen; | 42 | __u32 datalen; |
| 43 | __u32 __reserved2; | 43 | __u32 __reserved2; |
| 44 | void __user *data; | 44 | /* data follows */ |
| 45 | }; | 45 | }; |
| 46 | 46 | ||
| 47 | /* PRL flags */ | 47 | /* PRL flags */ |
diff --git a/include/net/netfilter/nf_conntrack_extend.h b/include/net/netfilter/nf_conntrack_extend.h index f736e842977f..f80c0ed6d870 100644 --- a/include/net/netfilter/nf_conntrack_extend.h +++ b/include/net/netfilter/nf_conntrack_extend.h | |||
| @@ -15,6 +15,7 @@ enum nf_ct_ext_id | |||
| 15 | 15 | ||
| 16 | /* Extensions: optional stuff which isn't permanently in struct. */ | 16 | /* Extensions: optional stuff which isn't permanently in struct. */ |
| 17 | struct nf_ct_ext { | 17 | struct nf_ct_ext { |
| 18 | struct rcu_head rcu; | ||
| 18 | u8 offset[NF_CT_EXT_NUM]; | 19 | u8 offset[NF_CT_EXT_NUM]; |
| 19 | u8 len; | 20 | u8 len; |
| 20 | char data[0]; | 21 | char data[0]; |
diff --git a/net/atm/br2684.c b/net/atm/br2684.c index 9d52ebfc1962..05fafdc2eea3 100644 --- a/net/atm/br2684.c +++ b/net/atm/br2684.c | |||
| @@ -188,10 +188,13 @@ static int br2684_xmit_vcc(struct sk_buff *skb, struct br2684_dev *brdev, | |||
| 188 | return 0; | 188 | return 0; |
| 189 | } | 189 | } |
| 190 | } | 190 | } |
| 191 | } else { | 191 | } else { /* e_vc */ |
| 192 | skb_push(skb, 2); | 192 | if (brdev->payload == p_bridged) { |
| 193 | if (brdev->payload == p_bridged) | 193 | skb_push(skb, 2); |
| 194 | memset(skb->data, 0, 2); | 194 | memset(skb->data, 0, 2); |
| 195 | } else { /* p_routed */ | ||
| 196 | skb_pull(skb, ETH_HLEN); | ||
| 197 | } | ||
| 195 | } | 198 | } |
| 196 | skb_debug(skb); | 199 | skb_debug(skb); |
| 197 | 200 | ||
| @@ -377,11 +380,8 @@ static void br2684_push(struct atm_vcc *atmvcc, struct sk_buff *skb) | |||
| 377 | (skb->data + 6, ethertype_ipv4, | 380 | (skb->data + 6, ethertype_ipv4, |
| 378 | sizeof(ethertype_ipv4)) == 0) | 381 | sizeof(ethertype_ipv4)) == 0) |
| 379 | skb->protocol = __constant_htons(ETH_P_IP); | 382 | skb->protocol = __constant_htons(ETH_P_IP); |
| 380 | else { | 383 | else |
| 381 | brdev->stats.rx_errors++; | 384 | goto error; |
| 382 | dev_kfree_skb(skb); | ||
| 383 | return; | ||
| 384 | } | ||
| 385 | skb_pull(skb, sizeof(llc_oui_ipv4)); | 385 | skb_pull(skb, sizeof(llc_oui_ipv4)); |
| 386 | skb_reset_network_header(skb); | 386 | skb_reset_network_header(skb); |
| 387 | skb->pkt_type = PACKET_HOST; | 387 | skb->pkt_type = PACKET_HOST; |
| @@ -394,44 +394,56 @@ static void br2684_push(struct atm_vcc *atmvcc, struct sk_buff *skb) | |||
| 394 | (memcmp(skb->data, llc_oui_pid_pad, 7) == 0)) { | 394 | (memcmp(skb->data, llc_oui_pid_pad, 7) == 0)) { |
| 395 | skb_pull(skb, sizeof(llc_oui_pid_pad)); | 395 | skb_pull(skb, sizeof(llc_oui_pid_pad)); |
| 396 | skb->protocol = eth_type_trans(skb, net_dev); | 396 | skb->protocol = eth_type_trans(skb, net_dev); |
| 397 | } else { | 397 | } else |
| 398 | brdev->stats.rx_errors++; | 398 | goto error; |
| 399 | dev_kfree_skb(skb); | ||
| 400 | return; | ||
| 401 | } | ||
| 402 | 399 | ||
| 403 | } else { | 400 | } else { /* e_vc */ |
| 404 | /* first 2 chars should be 0 */ | 401 | if (brdev->payload == p_routed) { |
| 405 | if (*((u16 *) (skb->data)) != 0) { | 402 | struct iphdr *iph; |
| 406 | brdev->stats.rx_errors++; | 403 | |
| 407 | dev_kfree_skb(skb); | 404 | skb_reset_network_header(skb); |
| 408 | return; | 405 | iph = ip_hdr(skb); |
| 406 | if (iph->version == 4) | ||
| 407 | skb->protocol = __constant_htons(ETH_P_IP); | ||
| 408 | else if (iph->version == 6) | ||
| 409 | skb->protocol = __constant_htons(ETH_P_IPV6); | ||
| 410 | else | ||
| 411 | goto error; | ||
| 412 | skb->pkt_type = PACKET_HOST; | ||
| 413 | } else { /* p_bridged */ | ||
| 414 | /* first 2 chars should be 0 */ | ||
| 415 | if (*((u16 *) (skb->data)) != 0) | ||
| 416 | goto error; | ||
| 417 | skb_pull(skb, BR2684_PAD_LEN); | ||
| 418 | skb->protocol = eth_type_trans(skb, net_dev); | ||
| 409 | } | 419 | } |
| 410 | skb_pull(skb, BR2684_PAD_LEN + ETH_HLEN); /* pad, dstmac, srcmac, ethtype */ | ||
| 411 | skb->protocol = eth_type_trans(skb, net_dev); | ||
| 412 | } | 420 | } |
| 413 | 421 | ||
| 414 | #ifdef CONFIG_ATM_BR2684_IPFILTER | 422 | #ifdef CONFIG_ATM_BR2684_IPFILTER |
| 415 | if (unlikely(packet_fails_filter(skb->protocol, brvcc, skb))) { | 423 | if (unlikely(packet_fails_filter(skb->protocol, brvcc, skb))) |
| 416 | brdev->stats.rx_dropped++; | 424 | goto dropped; |
| 417 | dev_kfree_skb(skb); | ||
| 418 | return; | ||
| 419 | } | ||
| 420 | #endif /* CONFIG_ATM_BR2684_IPFILTER */ | 425 | #endif /* CONFIG_ATM_BR2684_IPFILTER */ |
| 421 | skb->dev = net_dev; | 426 | skb->dev = net_dev; |
| 422 | ATM_SKB(skb)->vcc = atmvcc; /* needed ? */ | 427 | ATM_SKB(skb)->vcc = atmvcc; /* needed ? */ |
| 423 | pr_debug("received packet's protocol: %x\n", ntohs(skb->protocol)); | 428 | pr_debug("received packet's protocol: %x\n", ntohs(skb->protocol)); |
| 424 | skb_debug(skb); | 429 | skb_debug(skb); |
| 425 | if (unlikely(!(net_dev->flags & IFF_UP))) { | 430 | /* sigh, interface is down? */ |
| 426 | /* sigh, interface is down */ | 431 | if (unlikely(!(net_dev->flags & IFF_UP))) |
| 427 | brdev->stats.rx_dropped++; | 432 | goto dropped; |
| 428 | dev_kfree_skb(skb); | ||
| 429 | return; | ||
| 430 | } | ||
| 431 | brdev->stats.rx_packets++; | 433 | brdev->stats.rx_packets++; |
| 432 | brdev->stats.rx_bytes += skb->len; | 434 | brdev->stats.rx_bytes += skb->len; |
| 433 | memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data)); | 435 | memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data)); |
| 434 | netif_rx(skb); | 436 | netif_rx(skb); |
| 437 | return; | ||
| 438 | |||
| 439 | dropped: | ||
| 440 | brdev->stats.rx_dropped++; | ||
| 441 | goto free_skb; | ||
| 442 | error: | ||
| 443 | brdev->stats.rx_errors++; | ||
| 444 | free_skb: | ||
| 445 | dev_kfree_skb(skb); | ||
| 446 | return; | ||
| 435 | } | 447 | } |
| 436 | 448 | ||
| 437 | /* | 449 | /* |
| @@ -518,9 +530,9 @@ static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg) | |||
| 518 | struct sk_buff *next = skb->next; | 530 | struct sk_buff *next = skb->next; |
| 519 | 531 | ||
| 520 | skb->next = skb->prev = NULL; | 532 | skb->next = skb->prev = NULL; |
| 533 | br2684_push(atmvcc, skb); | ||
| 521 | BRPRIV(skb->dev)->stats.rx_bytes -= skb->len; | 534 | BRPRIV(skb->dev)->stats.rx_bytes -= skb->len; |
| 522 | BRPRIV(skb->dev)->stats.rx_packets--; | 535 | BRPRIV(skb->dev)->stats.rx_packets--; |
| 523 | br2684_push(atmvcc, skb); | ||
| 524 | 536 | ||
| 525 | skb = next; | 537 | skb = next; |
| 526 | } | 538 | } |
diff --git a/net/core/dev.c b/net/core/dev.c index 582963077877..68d8df0992ab 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -119,6 +119,7 @@ | |||
| 119 | #include <linux/err.h> | 119 | #include <linux/err.h> |
| 120 | #include <linux/ctype.h> | 120 | #include <linux/ctype.h> |
| 121 | #include <linux/if_arp.h> | 121 | #include <linux/if_arp.h> |
| 122 | #include <linux/if_vlan.h> | ||
| 122 | 123 | ||
| 123 | #include "net-sysfs.h" | 124 | #include "net-sysfs.h" |
| 124 | 125 | ||
| @@ -1362,6 +1363,29 @@ void netif_device_attach(struct net_device *dev) | |||
| 1362 | } | 1363 | } |
| 1363 | EXPORT_SYMBOL(netif_device_attach); | 1364 | EXPORT_SYMBOL(netif_device_attach); |
| 1364 | 1365 | ||
| 1366 | static bool can_checksum_protocol(unsigned long features, __be16 protocol) | ||
| 1367 | { | ||
| 1368 | return ((features & NETIF_F_GEN_CSUM) || | ||
| 1369 | ((features & NETIF_F_IP_CSUM) && | ||
| 1370 | protocol == htons(ETH_P_IP)) || | ||
| 1371 | ((features & NETIF_F_IPV6_CSUM) && | ||
| 1372 | protocol == htons(ETH_P_IPV6))); | ||
| 1373 | } | ||
| 1374 | |||
| 1375 | static bool dev_can_checksum(struct net_device *dev, struct sk_buff *skb) | ||
| 1376 | { | ||
| 1377 | if (can_checksum_protocol(dev->features, skb->protocol)) | ||
| 1378 | return true; | ||
| 1379 | |||
| 1380 | if (skb->protocol == htons(ETH_P_8021Q)) { | ||
| 1381 | struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; | ||
| 1382 | if (can_checksum_protocol(dev->features & dev->vlan_features, | ||
| 1383 | veh->h_vlan_encapsulated_proto)) | ||
| 1384 | return true; | ||
| 1385 | } | ||
| 1386 | |||
| 1387 | return false; | ||
| 1388 | } | ||
| 1365 | 1389 | ||
| 1366 | /* | 1390 | /* |
| 1367 | * Invalidate hardware checksum when packet is to be mangled, and | 1391 | * Invalidate hardware checksum when packet is to be mangled, and |
| @@ -1640,14 +1664,8 @@ int dev_queue_xmit(struct sk_buff *skb) | |||
| 1640 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 1664 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 1641 | skb_set_transport_header(skb, skb->csum_start - | 1665 | skb_set_transport_header(skb, skb->csum_start - |
| 1642 | skb_headroom(skb)); | 1666 | skb_headroom(skb)); |
| 1643 | 1667 | if (!dev_can_checksum(dev, skb) && skb_checksum_help(skb)) | |
| 1644 | if (!(dev->features & NETIF_F_GEN_CSUM) && | 1668 | goto out_kfree_skb; |
| 1645 | !((dev->features & NETIF_F_IP_CSUM) && | ||
| 1646 | skb->protocol == htons(ETH_P_IP)) && | ||
| 1647 | !((dev->features & NETIF_F_IPV6_CSUM) && | ||
| 1648 | skb->protocol == htons(ETH_P_IPV6))) | ||
| 1649 | if (skb_checksum_help(skb)) | ||
| 1650 | goto out_kfree_skb; | ||
| 1651 | } | 1669 | } |
| 1652 | 1670 | ||
| 1653 | gso: | 1671 | gso: |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 045e799d3e1d..ec834480abe7 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
| @@ -466,9 +466,9 @@ void inet_csk_reqsk_queue_prune(struct sock *parent, | |||
| 466 | reqp=&lopt->syn_table[i]; | 466 | reqp=&lopt->syn_table[i]; |
| 467 | while ((req = *reqp) != NULL) { | 467 | while ((req = *reqp) != NULL) { |
| 468 | if (time_after_eq(now, req->expires)) { | 468 | if (time_after_eq(now, req->expires)) { |
| 469 | if ((req->retrans < (inet_rsk(req)->acked ? max_retries : thresh)) && | 469 | if ((req->retrans < thresh || |
| 470 | (inet_rsk(req)->acked || | 470 | (inet_rsk(req)->acked && req->retrans < max_retries)) |
| 471 | !req->rsk_ops->rtx_syn_ack(parent, req))) { | 471 | && !req->rsk_ops->rtx_syn_ack(parent, req)) { |
| 472 | unsigned long timeo; | 472 | unsigned long timeo; |
| 473 | 473 | ||
| 474 | if (req->retrans++ == 0) | 474 | if (req->retrans++ == 0) |
diff --git a/net/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c index 04578593e100..d2a887fc8d9b 100644 --- a/net/ipv4/netfilter/nf_nat_core.c +++ b/net/ipv4/netfilter/nf_nat_core.c | |||
| @@ -556,7 +556,6 @@ static void nf_nat_cleanup_conntrack(struct nf_conn *ct) | |||
| 556 | 556 | ||
| 557 | spin_lock_bh(&nf_nat_lock); | 557 | spin_lock_bh(&nf_nat_lock); |
| 558 | hlist_del_rcu(&nat->bysource); | 558 | hlist_del_rcu(&nat->bysource); |
| 559 | nat->ct = NULL; | ||
| 560 | spin_unlock_bh(&nf_nat_lock); | 559 | spin_unlock_bh(&nf_nat_lock); |
| 561 | } | 560 | } |
| 562 | 561 | ||
| @@ -570,8 +569,8 @@ static void nf_nat_move_storage(void *new, void *old) | |||
| 570 | return; | 569 | return; |
| 571 | 570 | ||
| 572 | spin_lock_bh(&nf_nat_lock); | 571 | spin_lock_bh(&nf_nat_lock); |
| 573 | hlist_replace_rcu(&old_nat->bysource, &new_nat->bysource); | ||
| 574 | new_nat->ct = ct; | 572 | new_nat->ct = ct; |
| 573 | hlist_replace_rcu(&old_nat->bysource, &new_nat->bysource); | ||
| 575 | spin_unlock_bh(&nf_nat_lock); | 574 | spin_unlock_bh(&nf_nat_lock); |
| 576 | } | 575 | } |
| 577 | 576 | ||
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index e7e091d365ff..37a1ecd9d600 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
| @@ -934,7 +934,7 @@ static void raw_sock_seq_show(struct seq_file *seq, struct sock *sp, int i) | |||
| 934 | srcp = inet->num; | 934 | srcp = inet->num; |
| 935 | 935 | ||
| 936 | seq_printf(seq, "%4d: %08X:%04X %08X:%04X" | 936 | seq_printf(seq, "%4d: %08X:%04X %08X:%04X" |
| 937 | " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d", | 937 | " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d\n", |
| 938 | i, src, srcp, dest, destp, sp->sk_state, | 938 | i, src, srcp, dest, destp, sp->sk_state, |
| 939 | atomic_read(&sp->sk_wmem_alloc), | 939 | atomic_read(&sp->sk_wmem_alloc), |
| 940 | atomic_read(&sp->sk_rmem_alloc), | 940 | atomic_read(&sp->sk_rmem_alloc), |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 97a230026e13..12695be2c255 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -85,10 +85,6 @@ | |||
| 85 | int sysctl_tcp_tw_reuse __read_mostly; | 85 | int sysctl_tcp_tw_reuse __read_mostly; |
| 86 | int sysctl_tcp_low_latency __read_mostly; | 86 | int sysctl_tcp_low_latency __read_mostly; |
| 87 | 87 | ||
| 88 | /* Check TCP sequence numbers in ICMP packets. */ | ||
| 89 | #define ICMP_MIN_LENGTH 8 | ||
| 90 | |||
| 91 | void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb); | ||
| 92 | 88 | ||
| 93 | #ifdef CONFIG_TCP_MD5SIG | 89 | #ifdef CONFIG_TCP_MD5SIG |
| 94 | static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk, | 90 | static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk, |
diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c index 584e6d74e3a9..7135279f3f84 100644 --- a/net/ipv4/xfrm4_mode_tunnel.c +++ b/net/ipv4/xfrm4_mode_tunnel.c | |||
| @@ -52,7 +52,7 @@ static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | |||
| 52 | IP_ECN_clear(top_iph); | 52 | IP_ECN_clear(top_iph); |
| 53 | 53 | ||
| 54 | top_iph->frag_off = (flags & XFRM_STATE_NOPMTUDISC) ? | 54 | top_iph->frag_off = (flags & XFRM_STATE_NOPMTUDISC) ? |
| 55 | 0 : XFRM_MODE_SKB_CB(skb)->frag_off; | 55 | 0 : (XFRM_MODE_SKB_CB(skb)->frag_off & htons(IP_DF)); |
| 56 | ip_select_ident(top_iph, dst->child, NULL); | 56 | ip_select_ident(top_iph, dst->child, NULL); |
| 57 | 57 | ||
| 58 | top_iph->ttl = dst_metric(dst->child, RTAX_HOPLIMIT); | 58 | top_iph->ttl = dst_metric(dst->child, RTAX_HOPLIMIT); |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 3de6ffdaedf2..32e871a6c25a 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
| @@ -222,15 +222,18 @@ __ipip6_tunnel_locate_prl(struct ip_tunnel *t, __be32 addr) | |||
| 222 | 222 | ||
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | static int ipip6_tunnel_get_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a) | 225 | static int ipip6_tunnel_get_prl(struct ip_tunnel *t, |
| 226 | struct ip_tunnel_prl __user *a) | ||
| 226 | { | 227 | { |
| 227 | struct ip_tunnel_prl *kp; | 228 | struct ip_tunnel_prl kprl, *kp; |
| 228 | struct ip_tunnel_prl_entry *prl; | 229 | struct ip_tunnel_prl_entry *prl; |
| 229 | unsigned int cmax, c = 0, ca, len; | 230 | unsigned int cmax, c = 0, ca, len; |
| 230 | int ret = 0; | 231 | int ret = 0; |
| 231 | 232 | ||
| 232 | cmax = a->datalen / sizeof(*a); | 233 | if (copy_from_user(&kprl, a, sizeof(kprl))) |
| 233 | if (cmax > 1 && a->addr != htonl(INADDR_ANY)) | 234 | return -EFAULT; |
| 235 | cmax = kprl.datalen / sizeof(kprl); | ||
| 236 | if (cmax > 1 && kprl.addr != htonl(INADDR_ANY)) | ||
| 234 | cmax = 1; | 237 | cmax = 1; |
| 235 | 238 | ||
| 236 | /* For simple GET or for root users, | 239 | /* For simple GET or for root users, |
| @@ -261,26 +264,25 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a) | |||
| 261 | for (prl = t->prl; prl; prl = prl->next) { | 264 | for (prl = t->prl; prl; prl = prl->next) { |
| 262 | if (c > cmax) | 265 | if (c > cmax) |
| 263 | break; | 266 | break; |
| 264 | if (a->addr != htonl(INADDR_ANY) && prl->addr != a->addr) | 267 | if (kprl.addr != htonl(INADDR_ANY) && prl->addr != kprl.addr) |
| 265 | continue; | 268 | continue; |
| 266 | kp[c].addr = prl->addr; | 269 | kp[c].addr = prl->addr; |
| 267 | kp[c].flags = prl->flags; | 270 | kp[c].flags = prl->flags; |
| 268 | c++; | 271 | c++; |
| 269 | if (a->addr != htonl(INADDR_ANY)) | 272 | if (kprl.addr != htonl(INADDR_ANY)) |
| 270 | break; | 273 | break; |
| 271 | } | 274 | } |
| 272 | out: | 275 | out: |
| 273 | read_unlock(&ipip6_lock); | 276 | read_unlock(&ipip6_lock); |
| 274 | 277 | ||
| 275 | len = sizeof(*kp) * c; | 278 | len = sizeof(*kp) * c; |
| 276 | ret = len ? copy_to_user(a->data, kp, len) : 0; | 279 | ret = 0; |
| 280 | if ((len && copy_to_user(a + 1, kp, len)) || put_user(len, &a->datalen)) | ||
| 281 | ret = -EFAULT; | ||
| 277 | 282 | ||
| 278 | kfree(kp); | 283 | kfree(kp); |
| 279 | if (ret) | ||
| 280 | return -EFAULT; | ||
| 281 | 284 | ||
| 282 | a->datalen = len; | 285 | return ret; |
| 283 | return 0; | ||
| 284 | } | 286 | } |
| 285 | 287 | ||
| 286 | static int | 288 | static int |
| @@ -873,11 +875,20 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) | |||
| 873 | break; | 875 | break; |
| 874 | 876 | ||
| 875 | case SIOCGETPRL: | 877 | case SIOCGETPRL: |
| 878 | err = -EINVAL; | ||
| 879 | if (dev == sitn->fb_tunnel_dev) | ||
| 880 | goto done; | ||
| 881 | err = -ENOENT; | ||
| 882 | if (!(t = netdev_priv(dev))) | ||
| 883 | goto done; | ||
| 884 | err = ipip6_tunnel_get_prl(t, ifr->ifr_ifru.ifru_data); | ||
| 885 | break; | ||
| 886 | |||
| 876 | case SIOCADDPRL: | 887 | case SIOCADDPRL: |
| 877 | case SIOCDELPRL: | 888 | case SIOCDELPRL: |
| 878 | case SIOCCHGPRL: | 889 | case SIOCCHGPRL: |
| 879 | err = -EPERM; | 890 | err = -EPERM; |
| 880 | if (cmd != SIOCGETPRL && !capable(CAP_NET_ADMIN)) | 891 | if (!capable(CAP_NET_ADMIN)) |
| 881 | goto done; | 892 | goto done; |
| 882 | err = -EINVAL; | 893 | err = -EINVAL; |
| 883 | if (dev == sitn->fb_tunnel_dev) | 894 | if (dev == sitn->fb_tunnel_dev) |
| @@ -890,12 +901,6 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) | |||
| 890 | goto done; | 901 | goto done; |
| 891 | 902 | ||
| 892 | switch (cmd) { | 903 | switch (cmd) { |
| 893 | case SIOCGETPRL: | ||
| 894 | err = ipip6_tunnel_get_prl(t, &prl); | ||
| 895 | if (!err && copy_to_user(ifr->ifr_ifru.ifru_data, | ||
| 896 | &prl, sizeof(prl))) | ||
| 897 | err = -EFAULT; | ||
| 898 | break; | ||
| 899 | case SIOCDELPRL: | 904 | case SIOCDELPRL: |
| 900 | err = ipip6_tunnel_del_prl(t, &prl); | 905 | err = ipip6_tunnel_del_prl(t, &prl); |
| 901 | break; | 906 | break; |
| @@ -904,8 +909,7 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) | |||
| 904 | err = ipip6_tunnel_add_prl(t, &prl, cmd == SIOCCHGPRL); | 909 | err = ipip6_tunnel_add_prl(t, &prl, cmd == SIOCCHGPRL); |
| 905 | break; | 910 | break; |
| 906 | } | 911 | } |
| 907 | if (cmd != SIOCGETPRL) | 912 | netdev_state_change(dev); |
| 908 | netdev_state_change(dev); | ||
| 909 | break; | 913 | break; |
| 910 | 914 | ||
| 911 | default: | 915 | default: |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 1d7dd54aacef..28d8bd53bd3a 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
| @@ -1562,13 +1562,13 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
| 1562 | * be cloned. This could happen, e.g., with Linux bridge code passing | 1562 | * be cloned. This could happen, e.g., with Linux bridge code passing |
| 1563 | * us broadcast frames. */ | 1563 | * us broadcast frames. */ |
| 1564 | 1564 | ||
| 1565 | if (head_need > 0 || skb_header_cloned(skb)) { | 1565 | if (head_need > 0 || skb_cloned(skb)) { |
| 1566 | #if 0 | 1566 | #if 0 |
| 1567 | printk(KERN_DEBUG "%s: need to reallocate buffer for %d bytes " | 1567 | printk(KERN_DEBUG "%s: need to reallocate buffer for %d bytes " |
| 1568 | "of headroom\n", dev->name, head_need); | 1568 | "of headroom\n", dev->name, head_need); |
| 1569 | #endif | 1569 | #endif |
| 1570 | 1570 | ||
| 1571 | if (skb_header_cloned(skb)) | 1571 | if (skb_cloned(skb)) |
| 1572 | I802_DEBUG_INC(local->tx_expand_skb_head_cloned); | 1572 | I802_DEBUG_INC(local->tx_expand_skb_head_cloned); |
| 1573 | else | 1573 | else |
| 1574 | I802_DEBUG_INC(local->tx_expand_skb_head); | 1574 | I802_DEBUG_INC(local->tx_expand_skb_head); |
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c index a8bb8e31b1ec..6106cb79060c 100644 --- a/net/mac80211/wext.c +++ b/net/mac80211/wext.c | |||
| @@ -496,7 +496,8 @@ static int ieee80211_ioctl_giwap(struct net_device *dev, | |||
| 496 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 496 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
| 497 | if (sdata->vif.type == IEEE80211_IF_TYPE_STA || | 497 | if (sdata->vif.type == IEEE80211_IF_TYPE_STA || |
| 498 | sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { | 498 | sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { |
| 499 | if (sdata->u.sta.state == IEEE80211_ASSOCIATED) { | 499 | if (sdata->u.sta.state == IEEE80211_ASSOCIATED || |
| 500 | sdata->u.sta.state == IEEE80211_IBSS_JOINED) { | ||
| 500 | ap_addr->sa_family = ARPHRD_ETHER; | 501 | ap_addr->sa_family = ARPHRD_ETHER; |
| 501 | memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN); | 502 | memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN); |
| 502 | return 0; | 503 | return 0; |
diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c index dc1598b86004..635b996c8c35 100644 --- a/net/mac80211/wme.c +++ b/net/mac80211/wme.c | |||
| @@ -673,7 +673,7 @@ int ieee80211_ht_agg_queue_add(struct ieee80211_local *local, | |||
| 673 | #ifdef CONFIG_MAC80211_HT_DEBUG | 673 | #ifdef CONFIG_MAC80211_HT_DEBUG |
| 674 | if (net_ratelimit()) | 674 | if (net_ratelimit()) |
| 675 | printk(KERN_DEBUG "allocated aggregation queue" | 675 | printk(KERN_DEBUG "allocated aggregation queue" |
| 676 | " %d tid %d addr %s pool=0x%lX", | 676 | " %d tid %d addr %s pool=0x%lX\n", |
| 677 | i, tid, print_mac(mac, sta->addr), | 677 | i, tid, print_mac(mac, sta->addr), |
| 678 | q->qdisc_pool[0]); | 678 | q->qdisc_pool[0]); |
| 679 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | 679 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
diff --git a/net/netfilter/nf_conntrack_extend.c b/net/netfilter/nf_conntrack_extend.c index bcc19fa4ed1e..8a3f8b34e466 100644 --- a/net/netfilter/nf_conntrack_extend.c +++ b/net/netfilter/nf_conntrack_extend.c | |||
| @@ -59,12 +59,19 @@ nf_ct_ext_create(struct nf_ct_ext **ext, enum nf_ct_ext_id id, gfp_t gfp) | |||
| 59 | if (!*ext) | 59 | if (!*ext) |
| 60 | return NULL; | 60 | return NULL; |
| 61 | 61 | ||
| 62 | INIT_RCU_HEAD(&(*ext)->rcu); | ||
| 62 | (*ext)->offset[id] = off; | 63 | (*ext)->offset[id] = off; |
| 63 | (*ext)->len = len; | 64 | (*ext)->len = len; |
| 64 | 65 | ||
| 65 | return (void *)(*ext) + off; | 66 | return (void *)(*ext) + off; |
| 66 | } | 67 | } |
| 67 | 68 | ||
| 69 | static void __nf_ct_ext_free_rcu(struct rcu_head *head) | ||
| 70 | { | ||
| 71 | struct nf_ct_ext *ext = container_of(head, struct nf_ct_ext, rcu); | ||
| 72 | kfree(ext); | ||
| 73 | } | ||
| 74 | |||
| 68 | void *__nf_ct_ext_add(struct nf_conn *ct, enum nf_ct_ext_id id, gfp_t gfp) | 75 | void *__nf_ct_ext_add(struct nf_conn *ct, enum nf_ct_ext_id id, gfp_t gfp) |
| 69 | { | 76 | { |
| 70 | struct nf_ct_ext *new; | 77 | struct nf_ct_ext *new; |
| @@ -106,7 +113,7 @@ void *__nf_ct_ext_add(struct nf_conn *ct, enum nf_ct_ext_id id, gfp_t gfp) | |||
| 106 | (void *)ct->ext + ct->ext->offset[i]); | 113 | (void *)ct->ext + ct->ext->offset[i]); |
| 107 | rcu_read_unlock(); | 114 | rcu_read_unlock(); |
| 108 | } | 115 | } |
| 109 | kfree(ct->ext); | 116 | call_rcu(&ct->ext->rcu, __nf_ct_ext_free_rcu); |
| 110 | ct->ext = new; | 117 | ct->ext = new; |
| 111 | } | 118 | } |
| 112 | 119 | ||
diff --git a/net/netfilter/nf_conntrack_h323_main.c b/net/netfilter/nf_conntrack_h323_main.c index 95da1a24aab7..2f83c158934d 100644 --- a/net/netfilter/nf_conntrack_h323_main.c +++ b/net/netfilter/nf_conntrack_h323_main.c | |||
| @@ -619,6 +619,7 @@ static const struct nf_conntrack_expect_policy h245_exp_policy = { | |||
| 619 | static struct nf_conntrack_helper nf_conntrack_helper_h245 __read_mostly = { | 619 | static struct nf_conntrack_helper nf_conntrack_helper_h245 __read_mostly = { |
| 620 | .name = "H.245", | 620 | .name = "H.245", |
| 621 | .me = THIS_MODULE, | 621 | .me = THIS_MODULE, |
| 622 | .tuple.src.l3num = AF_UNSPEC, | ||
| 622 | .tuple.dst.protonum = IPPROTO_UDP, | 623 | .tuple.dst.protonum = IPPROTO_UDP, |
| 623 | .help = h245_help, | 624 | .help = h245_help, |
| 624 | .expect_policy = &h245_exp_policy, | 625 | .expect_policy = &h245_exp_policy, |
| @@ -1765,6 +1766,7 @@ static void __exit nf_conntrack_h323_fini(void) | |||
| 1765 | nf_conntrack_helper_unregister(&nf_conntrack_helper_ras[0]); | 1766 | nf_conntrack_helper_unregister(&nf_conntrack_helper_ras[0]); |
| 1766 | nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[1]); | 1767 | nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[1]); |
| 1767 | nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[0]); | 1768 | nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[0]); |
| 1769 | nf_conntrack_helper_unregister(&nf_conntrack_helper_h245); | ||
| 1768 | kfree(h323_buffer); | 1770 | kfree(h323_buffer); |
| 1769 | pr_debug("nf_ct_h323: fini\n"); | 1771 | pr_debug("nf_ct_h323: fini\n"); |
| 1770 | } | 1772 | } |
| @@ -1777,28 +1779,34 @@ static int __init nf_conntrack_h323_init(void) | |||
| 1777 | h323_buffer = kmalloc(65536, GFP_KERNEL); | 1779 | h323_buffer = kmalloc(65536, GFP_KERNEL); |
| 1778 | if (!h323_buffer) | 1780 | if (!h323_buffer) |
| 1779 | return -ENOMEM; | 1781 | return -ENOMEM; |
| 1780 | ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[0]); | 1782 | ret = nf_conntrack_helper_register(&nf_conntrack_helper_h245); |
| 1781 | if (ret < 0) | 1783 | if (ret < 0) |
| 1782 | goto err1; | 1784 | goto err1; |
| 1783 | ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[1]); | 1785 | ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[0]); |
| 1784 | if (ret < 0) | 1786 | if (ret < 0) |
| 1785 | goto err2; | 1787 | goto err2; |
| 1786 | ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[0]); | 1788 | ret = nf_conntrack_helper_register(&nf_conntrack_helper_q931[1]); |
| 1787 | if (ret < 0) | 1789 | if (ret < 0) |
| 1788 | goto err3; | 1790 | goto err3; |
| 1789 | ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[1]); | 1791 | ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[0]); |
| 1790 | if (ret < 0) | 1792 | if (ret < 0) |
| 1791 | goto err4; | 1793 | goto err4; |
| 1794 | ret = nf_conntrack_helper_register(&nf_conntrack_helper_ras[1]); | ||
| 1795 | if (ret < 0) | ||
| 1796 | goto err5; | ||
| 1792 | pr_debug("nf_ct_h323: init success\n"); | 1797 | pr_debug("nf_ct_h323: init success\n"); |
| 1793 | return 0; | 1798 | return 0; |
| 1794 | 1799 | ||
| 1795 | err4: | 1800 | err5: |
| 1796 | nf_conntrack_helper_unregister(&nf_conntrack_helper_ras[0]); | 1801 | nf_conntrack_helper_unregister(&nf_conntrack_helper_ras[0]); |
| 1797 | err3: | 1802 | err4: |
| 1798 | nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[1]); | 1803 | nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[1]); |
| 1799 | err2: | 1804 | err3: |
| 1800 | nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[0]); | 1805 | nf_conntrack_helper_unregister(&nf_conntrack_helper_q931[0]); |
| 1806 | err2: | ||
| 1807 | nf_conntrack_helper_unregister(&nf_conntrack_helper_h245); | ||
| 1801 | err1: | 1808 | err1: |
| 1809 | kfree(h323_buffer); | ||
| 1802 | return ret; | 1810 | return ret; |
| 1803 | } | 1811 | } |
| 1804 | 1812 | ||
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index f5aa23c3e886..3e1191cecaf0 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c | |||
| @@ -444,8 +444,11 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 444 | if (ops->dumpit == NULL) | 444 | if (ops->dumpit == NULL) |
| 445 | return -EOPNOTSUPP; | 445 | return -EOPNOTSUPP; |
| 446 | 446 | ||
| 447 | return netlink_dump_start(genl_sock, skb, nlh, | 447 | genl_unlock(); |
| 448 | ops->dumpit, ops->done); | 448 | err = netlink_dump_start(genl_sock, skb, nlh, |
| 449 | ops->dumpit, ops->done); | ||
| 450 | genl_lock(); | ||
| 451 | return err; | ||
| 449 | } | 452 | } |
| 450 | 453 | ||
| 451 | if (ops->doit == NULL) | 454 | if (ops->doit == NULL) |
| @@ -603,9 +606,6 @@ static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 603 | int chains_to_skip = cb->args[0]; | 606 | int chains_to_skip = cb->args[0]; |
| 604 | int fams_to_skip = cb->args[1]; | 607 | int fams_to_skip = cb->args[1]; |
| 605 | 608 | ||
| 606 | if (chains_to_skip != 0) | ||
| 607 | genl_lock(); | ||
| 608 | |||
| 609 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) { | 609 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) { |
| 610 | if (i < chains_to_skip) | 610 | if (i < chains_to_skip) |
| 611 | continue; | 611 | continue; |
| @@ -623,9 +623,6 @@ static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 623 | } | 623 | } |
| 624 | 624 | ||
| 625 | errout: | 625 | errout: |
| 626 | if (chains_to_skip != 0) | ||
| 627 | genl_unlock(); | ||
| 628 | |||
| 629 | cb->args[0] = i; | 626 | cb->args[0] = i; |
| 630 | cb->args[1] = n; | 627 | cb->args[1] = n; |
| 631 | 628 | ||
| @@ -770,7 +767,7 @@ static int __init genl_init(void) | |||
| 770 | 767 | ||
| 771 | /* we'll bump the group number right afterwards */ | 768 | /* we'll bump the group number right afterwards */ |
| 772 | genl_sock = netlink_kernel_create(&init_net, NETLINK_GENERIC, 0, | 769 | genl_sock = netlink_kernel_create(&init_net, NETLINK_GENERIC, 0, |
| 773 | genl_rcv, NULL, THIS_MODULE); | 770 | genl_rcv, &genl_mutex, THIS_MODULE); |
| 774 | if (genl_sock == NULL) | 771 | if (genl_sock == NULL) |
| 775 | panic("GENL: Cannot initialize generic netlink\n"); | 772 | panic("GENL: Cannot initialize generic netlink\n"); |
| 776 | 773 | ||
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 5bc1ed490180..6807c97985a5 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | * $Id: sch_htb.c,v 1.25 2003/12/07 11:08:25 devik Exp devik $ | 28 | * $Id: sch_htb.c,v 1.25 2003/12/07 11:08:25 devik Exp devik $ |
| 29 | */ | 29 | */ |
| 30 | #include <linux/module.h> | 30 | #include <linux/module.h> |
| 31 | #include <linux/moduleparam.h> | ||
| 31 | #include <linux/types.h> | 32 | #include <linux/types.h> |
| 32 | #include <linux/kernel.h> | 33 | #include <linux/kernel.h> |
| 33 | #include <linux/string.h> | 34 | #include <linux/string.h> |
| @@ -53,13 +54,17 @@ | |||
| 53 | */ | 54 | */ |
| 54 | 55 | ||
| 55 | #define HTB_HSIZE 16 /* classid hash size */ | 56 | #define HTB_HSIZE 16 /* classid hash size */ |
| 56 | #define HTB_HYSTERESIS 1 /* whether to use mode hysteresis for speedup */ | 57 | static int htb_hysteresis __read_mostly = 0; /* whether to use mode hysteresis for speedup */ |
| 57 | #define HTB_VER 0x30011 /* major must be matched with number suplied by TC as version */ | 58 | #define HTB_VER 0x30011 /* major must be matched with number suplied by TC as version */ |
| 58 | 59 | ||
| 59 | #if HTB_VER >> 16 != TC_HTB_PROTOVER | 60 | #if HTB_VER >> 16 != TC_HTB_PROTOVER |
| 60 | #error "Mismatched sch_htb.c and pkt_sch.h" | 61 | #error "Mismatched sch_htb.c and pkt_sch.h" |
| 61 | #endif | 62 | #endif |
| 62 | 63 | ||
| 64 | /* Module parameter and sysfs export */ | ||
| 65 | module_param (htb_hysteresis, int, 0640); | ||
| 66 | MODULE_PARM_DESC(htb_hysteresis, "Hysteresis mode, less CPU load, less accurate"); | ||
| 67 | |||
| 63 | /* used internaly to keep status of single class */ | 68 | /* used internaly to keep status of single class */ |
| 64 | enum htb_cmode { | 69 | enum htb_cmode { |
| 65 | HTB_CANT_SEND, /* class can't send and can't borrow */ | 70 | HTB_CANT_SEND, /* class can't send and can't borrow */ |
| @@ -462,19 +467,21 @@ static void htb_deactivate_prios(struct htb_sched *q, struct htb_class *cl) | |||
| 462 | htb_remove_class_from_row(q, cl, mask); | 467 | htb_remove_class_from_row(q, cl, mask); |
| 463 | } | 468 | } |
| 464 | 469 | ||
| 465 | #if HTB_HYSTERESIS | ||
| 466 | static inline long htb_lowater(const struct htb_class *cl) | 470 | static inline long htb_lowater(const struct htb_class *cl) |
| 467 | { | 471 | { |
| 468 | return cl->cmode != HTB_CANT_SEND ? -cl->cbuffer : 0; | 472 | if (htb_hysteresis) |
| 473 | return cl->cmode != HTB_CANT_SEND ? -cl->cbuffer : 0; | ||
| 474 | else | ||
| 475 | return 0; | ||
| 469 | } | 476 | } |
| 470 | static inline long htb_hiwater(const struct htb_class *cl) | 477 | static inline long htb_hiwater(const struct htb_class *cl) |
| 471 | { | 478 | { |
| 472 | return cl->cmode == HTB_CAN_SEND ? -cl->buffer : 0; | 479 | if (htb_hysteresis) |
| 480 | return cl->cmode == HTB_CAN_SEND ? -cl->buffer : 0; | ||
| 481 | else | ||
| 482 | return 0; | ||
| 473 | } | 483 | } |
| 474 | #else | 484 | |
| 475 | #define htb_lowater(cl) (0) | ||
| 476 | #define htb_hiwater(cl) (0) | ||
| 477 | #endif | ||
| 478 | 485 | ||
| 479 | /** | 486 | /** |
| 480 | * htb_class_mode - computes and returns current class mode | 487 | * htb_class_mode - computes and returns current class mode |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 532634861db1..024c3ebd9661 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
| @@ -474,6 +474,15 @@ static void sctp_association_destroy(struct sctp_association *asoc) | |||
| 474 | void sctp_assoc_set_primary(struct sctp_association *asoc, | 474 | void sctp_assoc_set_primary(struct sctp_association *asoc, |
| 475 | struct sctp_transport *transport) | 475 | struct sctp_transport *transport) |
| 476 | { | 476 | { |
| 477 | int changeover = 0; | ||
| 478 | |||
| 479 | /* it's a changeover only if we already have a primary path | ||
| 480 | * that we are changing | ||
| 481 | */ | ||
| 482 | if (asoc->peer.primary_path != NULL && | ||
| 483 | asoc->peer.primary_path != transport) | ||
| 484 | changeover = 1 ; | ||
| 485 | |||
| 477 | asoc->peer.primary_path = transport; | 486 | asoc->peer.primary_path = transport; |
| 478 | 487 | ||
| 479 | /* Set a default msg_name for events. */ | 488 | /* Set a default msg_name for events. */ |
| @@ -499,12 +508,12 @@ void sctp_assoc_set_primary(struct sctp_association *asoc, | |||
| 499 | * double switch to the same destination address. | 508 | * double switch to the same destination address. |
| 500 | */ | 509 | */ |
| 501 | if (transport->cacc.changeover_active) | 510 | if (transport->cacc.changeover_active) |
| 502 | transport->cacc.cycling_changeover = 1; | 511 | transport->cacc.cycling_changeover = changeover; |
| 503 | 512 | ||
| 504 | /* 2) The sender MUST set CHANGEOVER_ACTIVE to indicate that | 513 | /* 2) The sender MUST set CHANGEOVER_ACTIVE to indicate that |
| 505 | * a changeover has occurred. | 514 | * a changeover has occurred. |
| 506 | */ | 515 | */ |
| 507 | transport->cacc.changeover_active = 1; | 516 | transport->cacc.changeover_active = changeover; |
| 508 | 517 | ||
| 509 | /* 3) The sender MUST store the next TSN to be sent in | 518 | /* 3) The sender MUST store the next TSN to be sent in |
| 510 | * next_tsn_at_change. | 519 | * next_tsn_at_change. |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index b435a193c5df..9258dfe784ae 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
| @@ -108,14 +108,23 @@ static __init int sctp_proc_init(void) | |||
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | if (sctp_snmp_proc_init()) | 110 | if (sctp_snmp_proc_init()) |
| 111 | goto out_nomem; | 111 | goto out_snmp_proc_init; |
| 112 | if (sctp_eps_proc_init()) | 112 | if (sctp_eps_proc_init()) |
| 113 | goto out_nomem; | 113 | goto out_eps_proc_init; |
| 114 | if (sctp_assocs_proc_init()) | 114 | if (sctp_assocs_proc_init()) |
| 115 | goto out_nomem; | 115 | goto out_assocs_proc_init; |
| 116 | 116 | ||
| 117 | return 0; | 117 | return 0; |
| 118 | 118 | ||
| 119 | out_assocs_proc_init: | ||
| 120 | sctp_eps_proc_exit(); | ||
| 121 | out_eps_proc_init: | ||
| 122 | sctp_snmp_proc_exit(); | ||
| 123 | out_snmp_proc_init: | ||
| 124 | if (proc_net_sctp) { | ||
| 125 | proc_net_sctp = NULL; | ||
| 126 | remove_proc_entry("sctp", init_net.proc_net); | ||
| 127 | } | ||
| 119 | out_nomem: | 128 | out_nomem: |
| 120 | return -ENOMEM; | 129 | return -ENOMEM; |
| 121 | } | 130 | } |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index e18cd3628db4..657835f227d3 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -169,6 +169,11 @@ static inline int unix_may_send(struct sock *sk, struct sock *osk) | |||
| 169 | return (unix_peer(osk) == NULL || unix_our_peer(sk, osk)); | 169 | return (unix_peer(osk) == NULL || unix_our_peer(sk, osk)); |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | static inline int unix_recvq_full(struct sock const *sk) | ||
| 173 | { | ||
| 174 | return skb_queue_len(&sk->sk_receive_queue) > sk->sk_max_ack_backlog; | ||
| 175 | } | ||
| 176 | |||
| 172 | static struct sock *unix_peer_get(struct sock *s) | 177 | static struct sock *unix_peer_get(struct sock *s) |
| 173 | { | 178 | { |
| 174 | struct sock *peer; | 179 | struct sock *peer; |
| @@ -482,6 +487,8 @@ static int unix_socketpair(struct socket *, struct socket *); | |||
| 482 | static int unix_accept(struct socket *, struct socket *, int); | 487 | static int unix_accept(struct socket *, struct socket *, int); |
| 483 | static int unix_getname(struct socket *, struct sockaddr *, int *, int); | 488 | static int unix_getname(struct socket *, struct sockaddr *, int *, int); |
| 484 | static unsigned int unix_poll(struct file *, struct socket *, poll_table *); | 489 | static unsigned int unix_poll(struct file *, struct socket *, poll_table *); |
| 490 | static unsigned int unix_datagram_poll(struct file *, struct socket *, | ||
| 491 | poll_table *); | ||
| 485 | static int unix_ioctl(struct socket *, unsigned int, unsigned long); | 492 | static int unix_ioctl(struct socket *, unsigned int, unsigned long); |
| 486 | static int unix_shutdown(struct socket *, int); | 493 | static int unix_shutdown(struct socket *, int); |
| 487 | static int unix_stream_sendmsg(struct kiocb *, struct socket *, | 494 | static int unix_stream_sendmsg(struct kiocb *, struct socket *, |
| @@ -527,7 +534,7 @@ static const struct proto_ops unix_dgram_ops = { | |||
| 527 | .socketpair = unix_socketpair, | 534 | .socketpair = unix_socketpair, |
| 528 | .accept = sock_no_accept, | 535 | .accept = sock_no_accept, |
| 529 | .getname = unix_getname, | 536 | .getname = unix_getname, |
| 530 | .poll = datagram_poll, | 537 | .poll = unix_datagram_poll, |
| 531 | .ioctl = unix_ioctl, | 538 | .ioctl = unix_ioctl, |
| 532 | .listen = sock_no_listen, | 539 | .listen = sock_no_listen, |
| 533 | .shutdown = unix_shutdown, | 540 | .shutdown = unix_shutdown, |
| @@ -548,7 +555,7 @@ static const struct proto_ops unix_seqpacket_ops = { | |||
| 548 | .socketpair = unix_socketpair, | 555 | .socketpair = unix_socketpair, |
| 549 | .accept = unix_accept, | 556 | .accept = unix_accept, |
| 550 | .getname = unix_getname, | 557 | .getname = unix_getname, |
| 551 | .poll = datagram_poll, | 558 | .poll = unix_datagram_poll, |
| 552 | .ioctl = unix_ioctl, | 559 | .ioctl = unix_ioctl, |
| 553 | .listen = unix_listen, | 560 | .listen = unix_listen, |
| 554 | .shutdown = unix_shutdown, | 561 | .shutdown = unix_shutdown, |
| @@ -983,8 +990,7 @@ static long unix_wait_for_peer(struct sock *other, long timeo) | |||
| 983 | 990 | ||
| 984 | sched = !sock_flag(other, SOCK_DEAD) && | 991 | sched = !sock_flag(other, SOCK_DEAD) && |
| 985 | !(other->sk_shutdown & RCV_SHUTDOWN) && | 992 | !(other->sk_shutdown & RCV_SHUTDOWN) && |
| 986 | (skb_queue_len(&other->sk_receive_queue) > | 993 | unix_recvq_full(other); |
| 987 | other->sk_max_ack_backlog); | ||
| 988 | 994 | ||
| 989 | unix_state_unlock(other); | 995 | unix_state_unlock(other); |
| 990 | 996 | ||
| @@ -1058,8 +1064,7 @@ restart: | |||
| 1058 | if (other->sk_state != TCP_LISTEN) | 1064 | if (other->sk_state != TCP_LISTEN) |
| 1059 | goto out_unlock; | 1065 | goto out_unlock; |
| 1060 | 1066 | ||
| 1061 | if (skb_queue_len(&other->sk_receive_queue) > | 1067 | if (unix_recvq_full(other)) { |
| 1062 | other->sk_max_ack_backlog) { | ||
| 1063 | err = -EAGAIN; | 1068 | err = -EAGAIN; |
| 1064 | if (!timeo) | 1069 | if (!timeo) |
| 1065 | goto out_unlock; | 1070 | goto out_unlock; |
| @@ -1428,9 +1433,7 @@ restart: | |||
| 1428 | goto out_unlock; | 1433 | goto out_unlock; |
| 1429 | } | 1434 | } |
| 1430 | 1435 | ||
| 1431 | if (unix_peer(other) != sk && | 1436 | if (unix_peer(other) != sk && unix_recvq_full(other)) { |
| 1432 | (skb_queue_len(&other->sk_receive_queue) > | ||
| 1433 | other->sk_max_ack_backlog)) { | ||
| 1434 | if (!timeo) { | 1437 | if (!timeo) { |
| 1435 | err = -EAGAIN; | 1438 | err = -EAGAIN; |
| 1436 | goto out_unlock; | 1439 | goto out_unlock; |
| @@ -1991,6 +1994,64 @@ static unsigned int unix_poll(struct file * file, struct socket *sock, poll_tabl | |||
| 1991 | return mask; | 1994 | return mask; |
| 1992 | } | 1995 | } |
| 1993 | 1996 | ||
| 1997 | static unsigned int unix_datagram_poll(struct file *file, struct socket *sock, | ||
| 1998 | poll_table *wait) | ||
| 1999 | { | ||
| 2000 | struct sock *sk = sock->sk, *peer; | ||
| 2001 | unsigned int mask; | ||
| 2002 | |||
| 2003 | poll_wait(file, sk->sk_sleep, wait); | ||
| 2004 | |||
| 2005 | peer = unix_peer_get(sk); | ||
| 2006 | if (peer) { | ||
| 2007 | if (peer != sk) { | ||
| 2008 | /* | ||
| 2009 | * Writability of a connected socket additionally | ||
| 2010 | * depends on the state of the receive queue of the | ||
| 2011 | * peer. | ||
| 2012 | */ | ||
| 2013 | poll_wait(file, &unix_sk(peer)->peer_wait, wait); | ||
| 2014 | } else { | ||
| 2015 | sock_put(peer); | ||
| 2016 | peer = NULL; | ||
| 2017 | } | ||
| 2018 | } | ||
| 2019 | |||
| 2020 | mask = 0; | ||
| 2021 | |||
| 2022 | /* exceptional events? */ | ||
| 2023 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) | ||
| 2024 | mask |= POLLERR; | ||
| 2025 | if (sk->sk_shutdown & RCV_SHUTDOWN) | ||
| 2026 | mask |= POLLRDHUP; | ||
| 2027 | if (sk->sk_shutdown == SHUTDOWN_MASK) | ||
| 2028 | mask |= POLLHUP; | ||
| 2029 | |||
| 2030 | /* readable? */ | ||
| 2031 | if (!skb_queue_empty(&sk->sk_receive_queue) || | ||
| 2032 | (sk->sk_shutdown & RCV_SHUTDOWN)) | ||
| 2033 | mask |= POLLIN | POLLRDNORM; | ||
| 2034 | |||
| 2035 | /* Connection-based need to check for termination and startup */ | ||
| 2036 | if (sk->sk_type == SOCK_SEQPACKET) { | ||
| 2037 | if (sk->sk_state == TCP_CLOSE) | ||
| 2038 | mask |= POLLHUP; | ||
| 2039 | /* connection hasn't started yet? */ | ||
| 2040 | if (sk->sk_state == TCP_SYN_SENT) | ||
| 2041 | return mask; | ||
| 2042 | } | ||
| 2043 | |||
| 2044 | /* writable? */ | ||
| 2045 | if (unix_writable(sk) && !(peer && unix_recvq_full(peer))) | ||
| 2046 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; | ||
| 2047 | else | ||
| 2048 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | ||
| 2049 | |||
| 2050 | if (peer) | ||
| 2051 | sock_put(peer); | ||
| 2052 | |||
| 2053 | return mask; | ||
| 2054 | } | ||
| 1994 | 2055 | ||
| 1995 | #ifdef CONFIG_PROC_FS | 2056 | #ifdef CONFIG_PROC_FS |
| 1996 | static struct sock *first_unix_socket(int *i) | 2057 | static struct sock *first_unix_socket(int *i) |
