[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: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
9b6d2efed2
commit
ef8142a525
|
@ -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)
|
||||||
* 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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
|
|
||||||
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:
|
||||||
}
|
}
|
||||||
#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)
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue