diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-28 18:42:44 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-28 18:42:44 -0400 |
commit | 29cfcddc0e745b515ec360ffe2ee4e7a4015efd8 (patch) | |
tree | 1682b6caaf84d4863e65b2e4e387afa6a972146f /drivers | |
parent | 303fd2c2ce5addef1aacac962a5b099cc0af71ea (diff) | |
parent | c34186ed008229e7f7e3f1de8e6acf6374995358 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
net/ipv4: Eliminate kstrdup memory leak
net/caif/cfrfml.c: use asm/unaligned.h
ax25: missplaced sock_put(sk)
qlge: reset the chip before freeing the buffers
l2tp: test for ethernet header in l2tp_eth_dev_recv()
tcp: select(writefds) don't hang up when a peer close connection
tcp: fix three tcp sysctls tuning
tcp: Combat per-cpu skew in orphan tests.
pxa168_eth: silence gcc warnings
pxa168_eth: update call to phy_mii_ioctl()
pxa168_eth: fix error handling in prope
pxa168_eth: remove unneeded null check
phylib: Fix race between returning phydev and calling adjust_link
caif-driver: add HAS_DMA dependency
3c59x: Fix deadlock between boomerang_interrupt and boomerang_start_tx
qlcnic: fix poll implementation
netxen: fix poll implementation
bridge: netfilter: fix a memory leak
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/3c59x.c | 15 | ||||
-rw-r--r-- | drivers/net/caif/Kconfig | 2 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 9 | ||||
-rw-r--r-- | drivers/net/phy/phy_device.c | 2 | ||||
-rw-r--r-- | drivers/net/pxa168_eth.c | 58 | ||||
-rw-r--r-- | drivers/net/qlcnic/qlcnic_main.c | 9 | ||||
-rw-r--r-- | drivers/net/qlge/qlge_main.c | 4 |
7 files changed, 63 insertions, 36 deletions
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index c754d88e5ec9..c685a55fc2f4 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c | |||
@@ -633,7 +633,8 @@ struct vortex_private { | |||
633 | open:1, | 633 | open:1, |
634 | medialock:1, | 634 | medialock:1, |
635 | must_free_region:1, /* Flag: if zero, Cardbus owns the I/O region */ | 635 | must_free_region:1, /* Flag: if zero, Cardbus owns the I/O region */ |
636 | large_frames:1; /* accept large frames */ | 636 | large_frames:1, /* accept large frames */ |
637 | handling_irq:1; /* private in_irq indicator */ | ||
637 | int drv_flags; | 638 | int drv_flags; |
638 | u16 status_enable; | 639 | u16 status_enable; |
639 | u16 intr_enable; | 640 | u16 intr_enable; |
@@ -2133,6 +2134,15 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2133 | dev->name, vp->cur_tx); | 2134 | dev->name, vp->cur_tx); |
2134 | } | 2135 | } |
2135 | 2136 | ||
2137 | /* | ||
2138 | * We can't allow a recursion from our interrupt handler back into the | ||
2139 | * tx routine, as they take the same spin lock, and that causes | ||
2140 | * deadlock. Just return NETDEV_TX_BUSY and let the stack try again in | ||
2141 | * a bit | ||
2142 | */ | ||
2143 | if (vp->handling_irq) | ||
2144 | return NETDEV_TX_BUSY; | ||
2145 | |||
2136 | if (vp->cur_tx - vp->dirty_tx >= TX_RING_SIZE) { | 2146 | if (vp->cur_tx - vp->dirty_tx >= TX_RING_SIZE) { |
2137 | if (vortex_debug > 0) | 2147 | if (vortex_debug > 0) |
2138 | pr_warning("%s: BUG! Tx Ring full, refusing to send buffer.\n", | 2148 | pr_warning("%s: BUG! Tx Ring full, refusing to send buffer.\n", |
@@ -2335,11 +2345,13 @@ boomerang_interrupt(int irq, void *dev_id) | |||
2335 | 2345 | ||
2336 | ioaddr = vp->ioaddr; | 2346 | ioaddr = vp->ioaddr; |
2337 | 2347 | ||
2348 | |||
2338 | /* | 2349 | /* |
2339 | * It seems dopey to put the spinlock this early, but we could race against vortex_tx_timeout | 2350 | * It seems dopey to put the spinlock this early, but we could race against vortex_tx_timeout |
2340 | * and boomerang_start_xmit | 2351 | * and boomerang_start_xmit |
2341 | */ | 2352 | */ |
2342 | spin_lock(&vp->lock); | 2353 | spin_lock(&vp->lock); |
2354 | vp->handling_irq = 1; | ||
2343 | 2355 | ||
2344 | status = ioread16(ioaddr + EL3_STATUS); | 2356 | status = ioread16(ioaddr + EL3_STATUS); |
2345 | 2357 | ||
@@ -2447,6 +2459,7 @@ boomerang_interrupt(int irq, void *dev_id) | |||
2447 | pr_debug("%s: exiting interrupt, status %4.4x.\n", | 2459 | pr_debug("%s: exiting interrupt, status %4.4x.\n", |
2448 | dev->name, status); | 2460 | dev->name, status); |
2449 | handler_exit: | 2461 | handler_exit: |
2462 | vp->handling_irq = 0; | ||
2450 | spin_unlock(&vp->lock); | 2463 | spin_unlock(&vp->lock); |
2451 | return IRQ_HANDLED; | 2464 | return IRQ_HANDLED; |
2452 | } | 2465 | } |
diff --git a/drivers/net/caif/Kconfig b/drivers/net/caif/Kconfig index 631a6242b011..75bfc3a9d95f 100644 --- a/drivers/net/caif/Kconfig +++ b/drivers/net/caif/Kconfig | |||
@@ -15,7 +15,7 @@ config CAIF_TTY | |||
15 | 15 | ||
16 | config CAIF_SPI_SLAVE | 16 | config CAIF_SPI_SLAVE |
17 | tristate "CAIF SPI transport driver for slave interface" | 17 | tristate "CAIF SPI transport driver for slave interface" |
18 | depends on CAIF | 18 | depends on CAIF && HAS_DMA |
19 | default n | 19 | default n |
20 | ---help--- | 20 | ---help--- |
21 | The CAIF Link layer SPI Protocol driver for Slave SPI interface. | 21 | The CAIF Link layer SPI Protocol driver for Slave SPI interface. |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index cb30df106a2c..73d314592230 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -2131,9 +2131,16 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget) | |||
2131 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2131 | #ifdef CONFIG_NET_POLL_CONTROLLER |
2132 | static void netxen_nic_poll_controller(struct net_device *netdev) | 2132 | static void netxen_nic_poll_controller(struct net_device *netdev) |
2133 | { | 2133 | { |
2134 | int ring; | ||
2135 | struct nx_host_sds_ring *sds_ring; | ||
2134 | struct netxen_adapter *adapter = netdev_priv(netdev); | 2136 | struct netxen_adapter *adapter = netdev_priv(netdev); |
2137 | struct netxen_recv_context *recv_ctx = &adapter->recv_ctx; | ||
2138 | |||
2135 | disable_irq(adapter->irq); | 2139 | disable_irq(adapter->irq); |
2136 | netxen_intr(adapter->irq, adapter); | 2140 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { |
2141 | sds_ring = &recv_ctx->sds_rings[ring]; | ||
2142 | netxen_intr(adapter->irq, sds_ring); | ||
2143 | } | ||
2137 | enable_irq(adapter->irq); | 2144 | enable_irq(adapter->irq); |
2138 | } | 2145 | } |
2139 | #endif | 2146 | #endif |
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index c0761197c07e..16ddc77313cb 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
@@ -466,6 +466,8 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, | |||
466 | 466 | ||
467 | phydev->interface = interface; | 467 | phydev->interface = interface; |
468 | 468 | ||
469 | phydev->state = PHY_READY; | ||
470 | |||
469 | /* Do initial configuration here, now that | 471 | /* Do initial configuration here, now that |
470 | * we have certain key parameters | 472 | * we have certain key parameters |
471 | * (dev_flags and interface) */ | 473 | * (dev_flags and interface) */ |
diff --git a/drivers/net/pxa168_eth.c b/drivers/net/pxa168_eth.c index ecc64d750cce..410ea0a61371 100644 --- a/drivers/net/pxa168_eth.c +++ b/drivers/net/pxa168_eth.c | |||
@@ -654,15 +654,15 @@ static void eth_port_start(struct net_device *dev) | |||
654 | /* Assignment of Tx CTRP of given queue */ | 654 | /* Assignment of Tx CTRP of given queue */ |
655 | tx_curr_desc = pep->tx_curr_desc_q; | 655 | tx_curr_desc = pep->tx_curr_desc_q; |
656 | wrl(pep, ETH_C_TX_DESC_1, | 656 | wrl(pep, ETH_C_TX_DESC_1, |
657 | (u32) ((struct tx_desc *)pep->tx_desc_dma + tx_curr_desc)); | 657 | (u32) (pep->tx_desc_dma + tx_curr_desc * sizeof(struct tx_desc))); |
658 | 658 | ||
659 | /* Assignment of Rx CRDP of given queue */ | 659 | /* Assignment of Rx CRDP of given queue */ |
660 | rx_curr_desc = pep->rx_curr_desc_q; | 660 | rx_curr_desc = pep->rx_curr_desc_q; |
661 | wrl(pep, ETH_C_RX_DESC_0, | 661 | wrl(pep, ETH_C_RX_DESC_0, |
662 | (u32) ((struct rx_desc *)pep->rx_desc_dma + rx_curr_desc)); | 662 | (u32) (pep->rx_desc_dma + rx_curr_desc * sizeof(struct rx_desc))); |
663 | 663 | ||
664 | wrl(pep, ETH_F_RX_DESC_0, | 664 | wrl(pep, ETH_F_RX_DESC_0, |
665 | (u32) ((struct rx_desc *)pep->rx_desc_dma + rx_curr_desc)); | 665 | (u32) (pep->rx_desc_dma + rx_curr_desc * sizeof(struct rx_desc))); |
666 | 666 | ||
667 | /* Clear all interrupts */ | 667 | /* Clear all interrupts */ |
668 | wrl(pep, INT_CAUSE, 0); | 668 | wrl(pep, INT_CAUSE, 0); |
@@ -1350,7 +1350,7 @@ static int pxa168_eth_do_ioctl(struct net_device *dev, struct ifreq *ifr, | |||
1350 | { | 1350 | { |
1351 | struct pxa168_eth_private *pep = netdev_priv(dev); | 1351 | struct pxa168_eth_private *pep = netdev_priv(dev); |
1352 | if (pep->phy != NULL) | 1352 | if (pep->phy != NULL) |
1353 | return phy_mii_ioctl(pep->phy, if_mii(ifr), cmd); | 1353 | return phy_mii_ioctl(pep->phy, ifr, cmd); |
1354 | 1354 | ||
1355 | return -EOPNOTSUPP; | 1355 | return -EOPNOTSUPP; |
1356 | } | 1356 | } |
@@ -1414,10 +1414,8 @@ static int ethernet_phy_setup(struct net_device *dev) | |||
1414 | { | 1414 | { |
1415 | struct pxa168_eth_private *pep = netdev_priv(dev); | 1415 | struct pxa168_eth_private *pep = netdev_priv(dev); |
1416 | 1416 | ||
1417 | if (pep->pd != NULL) { | 1417 | if (pep->pd->init) |
1418 | if (pep->pd->init) | 1418 | pep->pd->init(); |
1419 | pep->pd->init(); | ||
1420 | } | ||
1421 | pep->phy = phy_scan(pep, pep->pd->phy_addr & 0x1f); | 1419 | pep->phy = phy_scan(pep, pep->pd->phy_addr & 0x1f); |
1422 | if (pep->phy != NULL) | 1420 | if (pep->phy != NULL) |
1423 | phy_init(pep, pep->pd->speed, pep->pd->duplex); | 1421 | phy_init(pep, pep->pd->speed, pep->pd->duplex); |
@@ -1499,7 +1497,7 @@ static int pxa168_eth_probe(struct platform_device *pdev) | |||
1499 | dev = alloc_etherdev(sizeof(struct pxa168_eth_private)); | 1497 | dev = alloc_etherdev(sizeof(struct pxa168_eth_private)); |
1500 | if (!dev) { | 1498 | if (!dev) { |
1501 | err = -ENOMEM; | 1499 | err = -ENOMEM; |
1502 | goto out; | 1500 | goto err_clk; |
1503 | } | 1501 | } |
1504 | 1502 | ||
1505 | platform_set_drvdata(pdev, dev); | 1503 | platform_set_drvdata(pdev, dev); |
@@ -1509,12 +1507,12 @@ static int pxa168_eth_probe(struct platform_device *pdev) | |||
1509 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1507 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1510 | if (res == NULL) { | 1508 | if (res == NULL) { |
1511 | err = -ENODEV; | 1509 | err = -ENODEV; |
1512 | goto out; | 1510 | goto err_netdev; |
1513 | } | 1511 | } |
1514 | pep->base = ioremap(res->start, res->end - res->start + 1); | 1512 | pep->base = ioremap(res->start, res->end - res->start + 1); |
1515 | if (pep->base == NULL) { | 1513 | if (pep->base == NULL) { |
1516 | err = -ENOMEM; | 1514 | err = -ENOMEM; |
1517 | goto out; | 1515 | goto err_netdev; |
1518 | } | 1516 | } |
1519 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 1517 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
1520 | BUG_ON(!res); | 1518 | BUG_ON(!res); |
@@ -1551,7 +1549,7 @@ static int pxa168_eth_probe(struct platform_device *pdev) | |||
1551 | pep->smi_bus = mdiobus_alloc(); | 1549 | pep->smi_bus = mdiobus_alloc(); |
1552 | if (pep->smi_bus == NULL) { | 1550 | if (pep->smi_bus == NULL) { |
1553 | err = -ENOMEM; | 1551 | err = -ENOMEM; |
1554 | goto out; | 1552 | goto err_base; |
1555 | } | 1553 | } |
1556 | pep->smi_bus->priv = pep; | 1554 | pep->smi_bus->priv = pep; |
1557 | pep->smi_bus->name = "pxa168_eth smi"; | 1555 | pep->smi_bus->name = "pxa168_eth smi"; |
@@ -1560,31 +1558,31 @@ static int pxa168_eth_probe(struct platform_device *pdev) | |||
1560 | snprintf(pep->smi_bus->id, MII_BUS_ID_SIZE, "%d", pdev->id); | 1558 | snprintf(pep->smi_bus->id, MII_BUS_ID_SIZE, "%d", pdev->id); |
1561 | pep->smi_bus->parent = &pdev->dev; | 1559 | pep->smi_bus->parent = &pdev->dev; |
1562 | pep->smi_bus->phy_mask = 0xffffffff; | 1560 | pep->smi_bus->phy_mask = 0xffffffff; |
1563 | if (mdiobus_register(pep->smi_bus) < 0) { | 1561 | err = mdiobus_register(pep->smi_bus); |
1564 | err = -ENOMEM; | 1562 | if (err) |
1565 | goto out; | 1563 | goto err_free_mdio; |
1566 | } | 1564 | |
1567 | pxa168_init_hw(pep); | 1565 | pxa168_init_hw(pep); |
1568 | err = ethernet_phy_setup(dev); | 1566 | err = ethernet_phy_setup(dev); |
1569 | if (err) | 1567 | if (err) |
1570 | goto out; | 1568 | goto err_mdiobus; |
1571 | SET_NETDEV_DEV(dev, &pdev->dev); | 1569 | SET_NETDEV_DEV(dev, &pdev->dev); |
1572 | err = register_netdev(dev); | 1570 | err = register_netdev(dev); |
1573 | if (err) | 1571 | if (err) |
1574 | goto out; | 1572 | goto err_mdiobus; |
1575 | return 0; | 1573 | return 0; |
1576 | out: | 1574 | |
1577 | if (pep->clk) { | 1575 | err_mdiobus: |
1578 | clk_disable(pep->clk); | 1576 | mdiobus_unregister(pep->smi_bus); |
1579 | clk_put(pep->clk); | 1577 | err_free_mdio: |
1580 | pep->clk = NULL; | 1578 | mdiobus_free(pep->smi_bus); |
1581 | } | 1579 | err_base: |
1582 | if (pep->base) { | 1580 | iounmap(pep->base); |
1583 | iounmap(pep->base); | 1581 | err_netdev: |
1584 | pep->base = NULL; | 1582 | free_netdev(dev); |
1585 | } | 1583 | err_clk: |
1586 | if (dev) | 1584 | clk_disable(clk); |
1587 | free_netdev(dev); | 1585 | clk_put(clk); |
1588 | return err; | 1586 | return err; |
1589 | } | 1587 | } |
1590 | 1588 | ||
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index 213e3656d953..66eea5972020 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c | |||
@@ -2188,9 +2188,16 @@ static int qlcnic_rx_poll(struct napi_struct *napi, int budget) | |||
2188 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2188 | #ifdef CONFIG_NET_POLL_CONTROLLER |
2189 | static void qlcnic_poll_controller(struct net_device *netdev) | 2189 | static void qlcnic_poll_controller(struct net_device *netdev) |
2190 | { | 2190 | { |
2191 | int ring; | ||
2192 | struct qlcnic_host_sds_ring *sds_ring; | ||
2191 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 2193 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
2194 | struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx; | ||
2195 | |||
2192 | disable_irq(adapter->irq); | 2196 | disable_irq(adapter->irq); |
2193 | qlcnic_intr(adapter->irq, adapter); | 2197 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { |
2198 | sds_ring = &recv_ctx->sds_rings[ring]; | ||
2199 | qlcnic_intr(adapter->irq, sds_ring); | ||
2200 | } | ||
2194 | enable_irq(adapter->irq); | 2201 | enable_irq(adapter->irq); |
2195 | } | 2202 | } |
2196 | #endif | 2203 | #endif |
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index 8d63f69b27d9..5f89e83501f4 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c | |||
@@ -3919,12 +3919,12 @@ static int ql_adapter_down(struct ql_adapter *qdev) | |||
3919 | for (i = 0; i < qdev->rss_ring_count; i++) | 3919 | for (i = 0; i < qdev->rss_ring_count; i++) |
3920 | netif_napi_del(&qdev->rx_ring[i].napi); | 3920 | netif_napi_del(&qdev->rx_ring[i].napi); |
3921 | 3921 | ||
3922 | ql_free_rx_buffers(qdev); | ||
3923 | |||
3924 | status = ql_adapter_reset(qdev); | 3922 | status = ql_adapter_reset(qdev); |
3925 | if (status) | 3923 | if (status) |
3926 | netif_err(qdev, ifdown, qdev->ndev, "reset(func #%d) FAILED!\n", | 3924 | netif_err(qdev, ifdown, qdev->ndev, "reset(func #%d) FAILED!\n", |
3927 | qdev->func); | 3925 | qdev->func); |
3926 | ql_free_rx_buffers(qdev); | ||
3927 | |||
3928 | return status; | 3928 | return status; |
3929 | } | 3929 | } |
3930 | 3930 | ||