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
This commit is contained in:
+14
-1
@@ -633,7 +633,8 @@ struct vortex_private {
|
||||
open:1,
|
||||
medialock:1,
|
||||
must_free_region:1, /* Flag: if zero, Cardbus owns the I/O region */
|
||||
large_frames:1; /* accept large frames */
|
||||
large_frames:1, /* accept large frames */
|
||||
handling_irq:1; /* private in_irq indicator */
|
||||
int drv_flags;
|
||||
u16 status_enable;
|
||||
u16 intr_enable;
|
||||
@@ -2133,6 +2134,15 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
dev->name, vp->cur_tx);
|
||||
}
|
||||
|
||||
/*
|
||||
* We can't allow a recursion from our interrupt handler back into the
|
||||
* tx routine, as they take the same spin lock, and that causes
|
||||
* deadlock. Just return NETDEV_TX_BUSY and let the stack try again in
|
||||
* a bit
|
||||
*/
|
||||
if (vp->handling_irq)
|
||||
return NETDEV_TX_BUSY;
|
||||
|
||||
if (vp->cur_tx - vp->dirty_tx >= TX_RING_SIZE) {
|
||||
if (vortex_debug > 0)
|
||||
pr_warning("%s: BUG! Tx Ring full, refusing to send buffer.\n",
|
||||
@@ -2335,11 +2345,13 @@ boomerang_interrupt(int irq, void *dev_id)
|
||||
|
||||
ioaddr = vp->ioaddr;
|
||||
|
||||
|
||||
/*
|
||||
* It seems dopey to put the spinlock this early, but we could race against vortex_tx_timeout
|
||||
* and boomerang_start_xmit
|
||||
*/
|
||||
spin_lock(&vp->lock);
|
||||
vp->handling_irq = 1;
|
||||
|
||||
status = ioread16(ioaddr + EL3_STATUS);
|
||||
|
||||
@@ -2447,6 +2459,7 @@ boomerang_interrupt(int irq, void *dev_id)
|
||||
pr_debug("%s: exiting interrupt, status %4.4x.\n",
|
||||
dev->name, status);
|
||||
handler_exit:
|
||||
vp->handling_irq = 0;
|
||||
spin_unlock(&vp->lock);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ config CAIF_TTY
|
||||
|
||||
config CAIF_SPI_SLAVE
|
||||
tristate "CAIF SPI transport driver for slave interface"
|
||||
depends on CAIF
|
||||
depends on CAIF && HAS_DMA
|
||||
default n
|
||||
---help---
|
||||
The CAIF Link layer SPI Protocol driver for Slave SPI interface.
|
||||
|
||||
@@ -2131,9 +2131,16 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget)
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
static void netxen_nic_poll_controller(struct net_device *netdev)
|
||||
{
|
||||
int ring;
|
||||
struct nx_host_sds_ring *sds_ring;
|
||||
struct netxen_adapter *adapter = netdev_priv(netdev);
|
||||
struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
|
||||
|
||||
disable_irq(adapter->irq);
|
||||
netxen_intr(adapter->irq, adapter);
|
||||
for (ring = 0; ring < adapter->max_sds_rings; ring++) {
|
||||
sds_ring = &recv_ctx->sds_rings[ring];
|
||||
netxen_intr(adapter->irq, sds_ring);
|
||||
}
|
||||
enable_irq(adapter->irq);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -466,6 +466,8 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
|
||||
|
||||
phydev->interface = interface;
|
||||
|
||||
phydev->state = PHY_READY;
|
||||
|
||||
/* Do initial configuration here, now that
|
||||
* we have certain key parameters
|
||||
* (dev_flags and interface) */
|
||||
|
||||
+28
-30
@@ -654,15 +654,15 @@ static void eth_port_start(struct net_device *dev)
|
||||
/* Assignment of Tx CTRP of given queue */
|
||||
tx_curr_desc = pep->tx_curr_desc_q;
|
||||
wrl(pep, ETH_C_TX_DESC_1,
|
||||
(u32) ((struct tx_desc *)pep->tx_desc_dma + tx_curr_desc));
|
||||
(u32) (pep->tx_desc_dma + tx_curr_desc * sizeof(struct tx_desc)));
|
||||
|
||||
/* Assignment of Rx CRDP of given queue */
|
||||
rx_curr_desc = pep->rx_curr_desc_q;
|
||||
wrl(pep, ETH_C_RX_DESC_0,
|
||||
(u32) ((struct rx_desc *)pep->rx_desc_dma + rx_curr_desc));
|
||||
(u32) (pep->rx_desc_dma + rx_curr_desc * sizeof(struct rx_desc)));
|
||||
|
||||
wrl(pep, ETH_F_RX_DESC_0,
|
||||
(u32) ((struct rx_desc *)pep->rx_desc_dma + rx_curr_desc));
|
||||
(u32) (pep->rx_desc_dma + rx_curr_desc * sizeof(struct rx_desc)));
|
||||
|
||||
/* Clear all interrupts */
|
||||
wrl(pep, INT_CAUSE, 0);
|
||||
@@ -1350,7 +1350,7 @@ static int pxa168_eth_do_ioctl(struct net_device *dev, struct ifreq *ifr,
|
||||
{
|
||||
struct pxa168_eth_private *pep = netdev_priv(dev);
|
||||
if (pep->phy != NULL)
|
||||
return phy_mii_ioctl(pep->phy, if_mii(ifr), cmd);
|
||||
return phy_mii_ioctl(pep->phy, ifr, cmd);
|
||||
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
@@ -1414,10 +1414,8 @@ static int ethernet_phy_setup(struct net_device *dev)
|
||||
{
|
||||
struct pxa168_eth_private *pep = netdev_priv(dev);
|
||||
|
||||
if (pep->pd != NULL) {
|
||||
if (pep->pd->init)
|
||||
pep->pd->init();
|
||||
}
|
||||
if (pep->pd->init)
|
||||
pep->pd->init();
|
||||
pep->phy = phy_scan(pep, pep->pd->phy_addr & 0x1f);
|
||||
if (pep->phy != NULL)
|
||||
phy_init(pep, pep->pd->speed, pep->pd->duplex);
|
||||
@@ -1499,7 +1497,7 @@ static int pxa168_eth_probe(struct platform_device *pdev)
|
||||
dev = alloc_etherdev(sizeof(struct pxa168_eth_private));
|
||||
if (!dev) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
goto err_clk;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
@@ -1509,12 +1507,12 @@ static int pxa168_eth_probe(struct platform_device *pdev)
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (res == NULL) {
|
||||
err = -ENODEV;
|
||||
goto out;
|
||||
goto err_netdev;
|
||||
}
|
||||
pep->base = ioremap(res->start, res->end - res->start + 1);
|
||||
if (pep->base == NULL) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
goto err_netdev;
|
||||
}
|
||||
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
BUG_ON(!res);
|
||||
@@ -1551,7 +1549,7 @@ static int pxa168_eth_probe(struct platform_device *pdev)
|
||||
pep->smi_bus = mdiobus_alloc();
|
||||
if (pep->smi_bus == NULL) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
goto err_base;
|
||||
}
|
||||
pep->smi_bus->priv = pep;
|
||||
pep->smi_bus->name = "pxa168_eth smi";
|
||||
@@ -1560,31 +1558,31 @@ static int pxa168_eth_probe(struct platform_device *pdev)
|
||||
snprintf(pep->smi_bus->id, MII_BUS_ID_SIZE, "%d", pdev->id);
|
||||
pep->smi_bus->parent = &pdev->dev;
|
||||
pep->smi_bus->phy_mask = 0xffffffff;
|
||||
if (mdiobus_register(pep->smi_bus) < 0) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
err = mdiobus_register(pep->smi_bus);
|
||||
if (err)
|
||||
goto err_free_mdio;
|
||||
|
||||
pxa168_init_hw(pep);
|
||||
err = ethernet_phy_setup(dev);
|
||||
if (err)
|
||||
goto out;
|
||||
goto err_mdiobus;
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
err = register_netdev(dev);
|
||||
if (err)
|
||||
goto out;
|
||||
goto err_mdiobus;
|
||||
return 0;
|
||||
out:
|
||||
if (pep->clk) {
|
||||
clk_disable(pep->clk);
|
||||
clk_put(pep->clk);
|
||||
pep->clk = NULL;
|
||||
}
|
||||
if (pep->base) {
|
||||
iounmap(pep->base);
|
||||
pep->base = NULL;
|
||||
}
|
||||
if (dev)
|
||||
free_netdev(dev);
|
||||
|
||||
err_mdiobus:
|
||||
mdiobus_unregister(pep->smi_bus);
|
||||
err_free_mdio:
|
||||
mdiobus_free(pep->smi_bus);
|
||||
err_base:
|
||||
iounmap(pep->base);
|
||||
err_netdev:
|
||||
free_netdev(dev);
|
||||
err_clk:
|
||||
clk_disable(clk);
|
||||
clk_put(clk);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -2188,9 +2188,16 @@ static int qlcnic_rx_poll(struct napi_struct *napi, int budget)
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
static void qlcnic_poll_controller(struct net_device *netdev)
|
||||
{
|
||||
int ring;
|
||||
struct qlcnic_host_sds_ring *sds_ring;
|
||||
struct qlcnic_adapter *adapter = netdev_priv(netdev);
|
||||
struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx;
|
||||
|
||||
disable_irq(adapter->irq);
|
||||
qlcnic_intr(adapter->irq, adapter);
|
||||
for (ring = 0; ring < adapter->max_sds_rings; ring++) {
|
||||
sds_ring = &recv_ctx->sds_rings[ring];
|
||||
qlcnic_intr(adapter->irq, sds_ring);
|
||||
}
|
||||
enable_irq(adapter->irq);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -3919,12 +3919,12 @@ static int ql_adapter_down(struct ql_adapter *qdev)
|
||||
for (i = 0; i < qdev->rss_ring_count; i++)
|
||||
netif_napi_del(&qdev->rx_ring[i].napi);
|
||||
|
||||
ql_free_rx_buffers(qdev);
|
||||
|
||||
status = ql_adapter_reset(qdev);
|
||||
if (status)
|
||||
netif_err(qdev, ifdown, qdev->ndev, "reset(func #%d) FAILED!\n",
|
||||
qdev->func);
|
||||
ql_free_rx_buffers(qdev);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user