X-Git-Url: http://pilppa.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fnet%2Fsmc911x.c;h=c95614131980e1b1363005a718270d53fedad2de;hb=e12651539808437a97f3e33c659c3d7b4000e41e;hp=0b15290df278c5a0eb859a7a49fe370415e3dd75;hpb=a4b47ab9464a8200528fad3101668abdd7379cf9;p=linux-2.6-omap-h63xx.git diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c index 0b15290df27..c9561413198 100644 --- a/drivers/net/smc911x.c +++ b/drivers/net/smc911x.c @@ -55,8 +55,6 @@ static const char version[] = ) #endif - -#include #include #include #include @@ -150,6 +148,8 @@ struct smc911x_local { int tx_throttle; spinlock_t lock; + struct net_device *netdev; + #ifdef SMC_USE_DMA /* DMA needs the physical address of the chip */ u_long physaddr; @@ -950,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 * 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 = netdev_priv(dev); + struct smc911x_local *lp = container_of(work, struct smc911x_local, + phy_configure); + struct net_device *dev = lp->netdev; unsigned long ioaddr = dev->base_addr; int phyaddr = lp->mii.phy_id; int my_phy_caps; /* My PHY capabilities */ @@ -967,11 +968,11 @@ static void smc911x_phy_configure(void *data) * We should not be called if phy_type is zero. */ if (lp->phy_type == 0) - goto smc911x_phy_configure_exit; + goto smc911x_phy_configure_exit_nolock; if (smc911x_phy_reset(dev, phyaddr)) { printk("%s: PHY reset timed out\n", dev->name); - goto smc911x_phy_configure_exit; + goto smc911x_phy_configure_exit_nolock; } spin_lock_irqsave(&lp->lock, flags); @@ -1040,6 +1041,7 @@ static void smc911x_phy_configure(void *data) smc911x_phy_configure_exit: spin_unlock_irqrestore(&lp->lock, flags); +smc911x_phy_configure_exit_nolock: lp->work_pending = 0; } @@ -1076,7 +1078,7 @@ static void smc911x_phy_interrupt(struct net_device *dev) * This is the main routine of the driver, to handle the device when * it needs some attention. */ -static irqreturn_t smc911x_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t smc911x_interrupt(int irq, void *dev_id) { struct net_device *dev = dev_id; unsigned long ioaddr = dev->base_addr; @@ -1253,7 +1255,7 @@ static irqreturn_t smc911x_interrupt(int irq, void *dev_id, struct pt_regs *regs #ifdef SMC_USE_DMA static void -smc911x_tx_dma_irq(int dma, void *data, struct pt_regs *regs) +smc911x_tx_dma_irq(int dma, void *data) { struct net_device *dev = (struct net_device *)data; struct smc911x_local *lp = netdev_priv(dev); @@ -1287,7 +1289,7 @@ smc911x_tx_dma_irq(int dma, void *data, struct pt_regs *regs) "%s: TX DMA irq completed\n", dev->name); } static void -smc911x_rx_dma_irq(int dma, void *data, struct pt_regs *regs) +smc911x_rx_dma_irq(int dma, void *data) { struct net_device *dev = (struct net_device *)data; unsigned long ioaddr = dev->base_addr; @@ -1333,7 +1335,7 @@ smc911x_rx_dma_irq(int dma, void *data, struct pt_regs *regs) static void smc911x_poll_controller(struct net_device *dev) { disable_irq(dev->irq); - smc911x_interrupt(dev->irq, dev, NULL); + smc911x_interrupt(dev->irq, dev); enable_irq(dev->irq); } #endif @@ -1497,6 +1499,8 @@ static void smc911x_set_multicast_list(struct net_device *dev) static int smc911x_open(struct net_device *dev) { + struct smc911x_local *lp = netdev_priv(dev); + DBG(SMC_DEBUG_FUNC, "%s: --> %s\n", dev->name, __FUNCTION__); /* @@ -1513,7 +1517,7 @@ smc911x_open(struct net_device *dev) smc911x_reset(dev); /* Configure the PHY, initialize the link state */ - smc911x_phy_configure(dev); + smc911x_phy_configure(&lp->phy_configure); /* Turn on Tx + Rx */ smc911x_enable(dev); @@ -1655,7 +1659,7 @@ smc911x_ethtool_getdrvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { strncpy(info->driver, CARDNAME, sizeof(info->driver)); strncpy(info->version, version, sizeof(info->version)); - strncpy(info->bus_info, dev->class_dev.dev->bus_id, sizeof(info->bus_info)); + strncpy(info->bus_info, dev->dev.parent->bus_id, sizeof(info->bus_info)); } static int smc911x_ethtool_nwayreset(struct net_device *dev) @@ -1823,7 +1827,7 @@ static int smc911x_ethtool_geteeprom_len(struct net_device *dev) return SMC911X_EEPROM_LEN; } -static struct ethtool_ops smc911x_ethtool_ops = { +static const struct ethtool_ops smc911x_ethtool_ops = { .get_settings = smc911x_ethtool_getsettings, .set_settings = smc911x_ethtool_setsettings, .get_drvinfo = smc911x_ethtool_getdrvinfo, @@ -2062,7 +2066,7 @@ static int __init smc911x_probe(struct net_device *dev, unsigned long ioaddr) dev->poll_controller = smc911x_poll_controller; #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.reg_num_mask = 0x1f; lp->mii.force_media = 0; @@ -2156,6 +2160,7 @@ static int smc911x_drv_probe(struct platform_device *pdev) { struct net_device *ndev; struct resource *res; + struct smc911x_local *lp; unsigned int *addr; int ret; @@ -2185,6 +2190,8 @@ static int smc911x_drv_probe(struct platform_device *pdev) ndev->dma = (unsigned char)-1; ndev->irq = platform_get_irq(pdev, 0); + lp = netdev_priv(ndev); + lp->netdev = ndev; addr = ioremap(res->start, SMC911X_IO_EXTENT); if (!addr) { @@ -2206,7 +2213,6 @@ out: } #ifdef SMC_USE_DMA else { - struct smc911x_local *lp = netdev_priv(ndev); lp->physaddr = res->start; lp->dev = &pdev->dev; } @@ -2277,7 +2283,7 @@ static int smc911x_drv_resume(struct platform_device *dev) smc911x_reset(ndev); smc911x_enable(ndev); if (lp->phy_type != 0) - smc911x_phy_configure(ndev); + smc911x_phy_configure(&lp->phy_configure); netif_device_attach(ndev); } }