Commit ef8142a5 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] smc911 workqueue fixes

Teach this driver about the workqueue changes.

Cc: Vitaly Wool <vitalywool@gmail.com>
Cc: Jeff Garzik <jeff@garzik.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 9b6d2efe
...@@ -148,6 +148,8 @@ struct smc911x_local { ...@@ -148,6 +148,8 @@ struct smc911x_local {
int tx_throttle; int tx_throttle;
spinlock_t lock; spinlock_t lock;
struct net_device *netdev;
#ifdef SMC_USE_DMA #ifdef SMC_USE_DMA
/* DMA needs the physical address of the chip */ /* DMA needs the physical address of the chip */
u_long physaddr; u_long physaddr;
...@@ -948,10 +950,11 @@ static void smc911x_phy_check_media(struct net_device *dev, int init) ...@@ -948,10 +950,11 @@ static void smc911x_phy_check_media(struct net_device *dev, int init)
* of autonegotiation.) If the RPC ANEG bit is cleared, the selection * of autonegotiation.) If the RPC ANEG bit is cleared, the selection
* is controlled by the RPC SPEED and RPC DPLX bits. * is controlled by the RPC SPEED and RPC DPLX bits.
*/ */
static void smc911x_phy_configure(void *data) static void smc911x_phy_configure(struct work_struct *work)
{ {
struct net_device *dev = data; struct smc911x_local *lp = container_of(work, struct smc911x_local,
struct smc911x_local *lp = netdev_priv(dev); phy_configure);
struct net_device *dev = lp->netdev;
unsigned long ioaddr = dev->base_addr; unsigned long ioaddr = dev->base_addr;
int phyaddr = lp->mii.phy_id; int phyaddr = lp->mii.phy_id;
int my_phy_caps; /* My PHY capabilities */ int my_phy_caps; /* My PHY capabilities */
...@@ -1495,6 +1498,8 @@ static void smc911x_set_multicast_list(struct net_device *dev) ...@@ -1495,6 +1498,8 @@ static void smc911x_set_multicast_list(struct net_device *dev)
static int static int
smc911x_open(struct net_device *dev) smc911x_open(struct net_device *dev)
{ {
struct smc911x_local *lp = netdev_priv(dev);
DBG(SMC_DEBUG_FUNC, "%s: --> %s\n", dev->name, __FUNCTION__); DBG(SMC_DEBUG_FUNC, "%s: --> %s\n", dev->name, __FUNCTION__);
/* /*
...@@ -1511,7 +1516,7 @@ smc911x_open(struct net_device *dev) ...@@ -1511,7 +1516,7 @@ smc911x_open(struct net_device *dev)
smc911x_reset(dev); smc911x_reset(dev);
/* Configure the PHY, initialize the link state */ /* Configure the PHY, initialize the link state */
smc911x_phy_configure(dev); smc911x_phy_configure(&lp->phy_configure);
/* Turn on Tx + Rx */ /* Turn on Tx + Rx */
smc911x_enable(dev); smc911x_enable(dev);
...@@ -2060,7 +2065,7 @@ static int __init smc911x_probe(struct net_device *dev, unsigned long ioaddr) ...@@ -2060,7 +2065,7 @@ static int __init smc911x_probe(struct net_device *dev, unsigned long ioaddr)
dev->poll_controller = smc911x_poll_controller; dev->poll_controller = smc911x_poll_controller;
#endif #endif
INIT_WORK(&lp->phy_configure, smc911x_phy_configure, dev); INIT_WORK(&lp->phy_configure, smc911x_phy_configure);
lp->mii.phy_id_mask = 0x1f; lp->mii.phy_id_mask = 0x1f;
lp->mii.reg_num_mask = 0x1f; lp->mii.reg_num_mask = 0x1f;
lp->mii.force_media = 0; lp->mii.force_media = 0;
...@@ -2154,6 +2159,7 @@ static int smc911x_drv_probe(struct platform_device *pdev) ...@@ -2154,6 +2159,7 @@ static int smc911x_drv_probe(struct platform_device *pdev)
{ {
struct net_device *ndev; struct net_device *ndev;
struct resource *res; struct resource *res;
struct smc911x_local *lp;
unsigned int *addr; unsigned int *addr;
int ret; int ret;
...@@ -2183,6 +2189,8 @@ static int smc911x_drv_probe(struct platform_device *pdev) ...@@ -2183,6 +2189,8 @@ static int smc911x_drv_probe(struct platform_device *pdev)
ndev->dma = (unsigned char)-1; ndev->dma = (unsigned char)-1;
ndev->irq = platform_get_irq(pdev, 0); ndev->irq = platform_get_irq(pdev, 0);
lp = netdev_priv(ndev);
lp->netdev = ndev;
addr = ioremap(res->start, SMC911X_IO_EXTENT); addr = ioremap(res->start, SMC911X_IO_EXTENT);
if (!addr) { if (!addr) {
...@@ -2204,7 +2212,6 @@ out: ...@@ -2204,7 +2212,6 @@ out:
} }
#ifdef SMC_USE_DMA #ifdef SMC_USE_DMA
else { else {
struct smc911x_local *lp = netdev_priv(ndev);
lp->physaddr = res->start; lp->physaddr = res->start;
lp->dev = &pdev->dev; lp->dev = &pdev->dev;
} }
...@@ -2275,7 +2282,7 @@ static int smc911x_drv_resume(struct platform_device *dev) ...@@ -2275,7 +2282,7 @@ static int smc911x_drv_resume(struct platform_device *dev)
smc911x_reset(ndev); smc911x_reset(ndev);
smc911x_enable(ndev); smc911x_enable(ndev);
if (lp->phy_type != 0) if (lp->phy_type != 0)
smc911x_phy_configure(ndev); smc911x_phy_configure(&lp->phy_configure);
netif_device_attach(ndev); netif_device_attach(ndev);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment