via-rhine: experimental patches
Subsystems (2)
cover via-rhine: experimental patches
The following batch needs testing. I don't expect any notable regressions, but I could do with some reports on WOL (already in -mm) and suspend/resume.
Roger
PATCH 1/3 via-rhine: suspend/resume support
From: Arkadiusz Miskiewicz
drivers/net/via-rhine.c +65 -0
@@ -485,6 +485,9 @@dma_addr_t tx_bufs_dma;struct pci_dev *pdev; +#ifdef CONFIG_PM +long pioaddr; +#endif struct net_device_stats stats;spinlock_t lock;
@@ -825,6 +828,9 @@ dev->base_addr = ioaddr; rp =netdev_priv (dev); rp->quirks = quirks; +#ifdef CONFIG_PM + rp->pioaddr = pioaddr; +#endif /* Get chip registers into a sane state */ rhine_power_init (dev);
@@ -1951,11 +1957,70 @@ } +#ifdef CONFIG_PM +static int rhine_suspend (struct pci_dev *pdev,u32 state) +{ +struct net_device *dev =pci_get_drvdata (pdev); +struct rhine_private *rp =netdev_priv (dev); +unsigned long flags; + +if (!netif_running (dev)) +return 0 ; + +netif_device_detach (dev); +pci_save_state (pdev, pdev->saved_config_space); + +spin_lock_irqsave (&rp->lock, flags); +rhine_shutdown (&pdev->dev); +spin_unlock_irqrestore (&rp->lock, flags); + +return 0 ; +} + +static int rhine_resume (struct pci_dev *pdev) +{ +struct net_device *dev =pci_get_drvdata (pdev); +struct rhine_private *rp =netdev_priv (dev); +unsigned long flags; +int ret; + +if (!netif_running (dev)) +return 0 ; + + ret =pci_set_power_state (pdev,0 ); +if (debug >1 ) +printk (KERN_INFO "%s: Entering power state D0 %s (%d).\n" , + dev->name, ret ?"failed" :"succeeded" , ret); + +pci_restore_state (pdev, pdev->saved_config_space); + +spin_lock_irqsave (&rp->lock, flags); +#ifdef USE_MMIO +enable_mmio (rp->pioaddr, rp->quirks); +#endif +rhine_power_init (dev); +free_tbufs (dev); +free_rbufs (dev); +alloc_tbufs (dev); +alloc_rbufs (dev); +init_registers (dev); +spin_unlock_irqrestore (&rp->lock, flags); + +netif_device_attach (dev); + +return 0 ; +} +#endif /* CONFIG_PM */ +static struct pci_driver rhine_driver = { .name =DRV_NAME , .id_table = rhine_pci_tbl, .probe = rhine_init_one, .remove =__devexit_p (rhine_remove_one), +#ifdef CONFIG_PM + .suspend = rhine_suspend, + .resume = rhine_resume, +#endif /* CONFIG_PM */ .driver = { .shutdown = rhine_shutdown, }
PATCH 2/3 via-rhine: de-isolate PHY
In reply to Roger LuethiPHYs may come up isolated. Make sure we can send data to them. This code section needs a clean-up, but I prefer to merge this fix in isolation.
Report and suggested fix by Tam, Ming Dat (Tommy).
drivers/net/via-rhine.c renamed from drivers/net/via-rhine.c.01 +3 -0
@@ -896,7 +896,10 @@ static int __devinit rhine_init_one(strupci_set_drvdata (pdev, dev); { +u16 mii_cmd;int mii_status =mdio_read (dev, phy_id,1 ); + mii_cmd =mdio_read (dev, phy_id,MII_BMCR ) & ~BMCR_ISOLATE ; +mdio_write (dev, phy_id,MII_BMCR , mii_cmd);if (mii_status !=0xffff && mii_status !=0x0000 ) { rp->mii_if.advertising =mdio_read (dev, phy_id,4 ); printk(KERN_INFO "%s: MII PHY found at address "
PATCH 3/3 via-rhine: small fixes
In reply to Roger Luethi- remove Rhine model names (per Jeff's request)
- remove redundant calls to clear MII cmd
- fill some rhine_private fields earlier
drivers/net/via-rhine.c renamed from drivers/net/via-rhine.c.02 +16 -36
@@ -346,7 +346,7 @@ enum rhine_revs {VT6105L =0x8A ,VT6107 =0x8C , VTunknown2 =0x8E , - VT6105M = 0x90, + VT6105M = 0x90, /* Management adapter */ }; enum rhine_quirks {
@@ -485,9 +485,7 @@ struct rhine_private {dma_addr_t tx_bufs_dma;struct pci_dev *pdev; -#ifdef CONFIG_PM long pioaddr; -#endif struct net_device_stats stats;spinlock_t lock;
@@ -596,7 +594,7 @@ static void rhine_power_init(struct net_default : reason ="Unknown" ; } -printk ("%s: Woke system up. Reason: %s.\n" , +printk (KERN_INFO "%s: Woke system up. Reason: %s.\n" ,DRV_NAME , reason); } }
@@ -706,7 +704,7 @@ static int __devinit rhine_init_one(strulong memaddr;long ioaddr;int io_size, phy_id; -const char *name, *mname; +const char *name;/* when built into the kernel, we only print version if device is found */ #ifndef MODULE
@@ -721,41 +719,24 @@ static int __devinit rhine_init_one(stru phy_id =0 ; quirks =0 ; name ="Rhine" ; - mname ="unknown" ;if (pci_rev < VTunknown0) { quirks = rqRhineI; io_size =128 ; - mname ="VT86C100A" ; }else if (pci_rev >=VT6102 ) { quirks = rqWOL | rqForceReset;if (pci_rev <VT6105 ) { name ="Rhine II" ; quirks |= rqStatusWBRace;/* Rhine-II exclusive */ -if (pci_rev <VT8231 ) - mname ="VT6102" ; -else if (pci_rev <VT8233 ) - mname ="VT8231" ; -else if (pci_rev <VT8235 ) - mname ="VT8233" ; -else if (pci_rev <VT8237 ) - mname ="VT8235" ; -else if (pci_rev < VTunknown1) - mname ="VT8237" ; }else { - name ="Rhine III" ; phy_id =1 ;/* Integrated PHY, phy_id fixed to 1 */ if (pci_rev >=VT6105_B0 ) quirks |= rq6patterns; -if (pci_rev <VT6105L ) - mname ="VT6105" ; -else if (pci_rev <VT6107 ) - mname ="VT6105L" ; -else if (pci_rev <VT6105M ) - mname ="VT6107" ; -else if (pci_rev >=VT6105M ) - mname ="Management Adapter VT6105M" ; +if (pci_rev <VT6105M ) + name ="Rhine III" ; +else + name ="Rhine III (Management Adapter)" ; } }
@@ -793,6 +774,11 @@ static int __devinit rhine_init_one(struSET_MODULE_OWNER (dev);SET_NETDEV_DEV (dev, &pdev->dev); + rp =netdev_priv (dev); + rp->quirks = quirks; + rp->pioaddr = pioaddr; + rp->pdev = pdev; + rc =pci_request_regions (pdev,DRV_NAME );if (rc) goto err_out_free_netdev;
@@ -826,11 +812,6 @@ static int __devinit rhine_init_one(stru#endif /* USE_MMIO */ dev->base_addr = ioaddr; - rp =netdev_priv (dev); - rp->quirks = quirks; -#ifdef CONFIG_PM - rp->pioaddr = pioaddr; -#endif /* Get chip registers into a sane state */ rhine_power_init (dev);
@@ -852,7 +833,6 @@ static int __devinit rhine_init_one(stru dev->irq = pdev->irq;spin_lock_init (&rp->lock); - rp->pdev = pdev; rp->mii_if.dev = dev; rp->mii_if.mdio_read = mdio_read; rp->mii_if.mdio_write = mdio_write;
@@ -880,8 +860,8 @@ static int __devinit rhine_init_one(struif (rc) goto err_out_unmap; - printk(KERN_INFO "%s: VIA %s (%s) at 0x%lx, ", - dev->name, name, mname, + printk(KERN_INFO "%s: VIA %s at 0x%lx, ", + dev->name, name, #ifdef USE_MMIO memaddr #else
@@ -1181,7 +1161,7 @@ static int mdio_read(struct net_device *rhine_disable_linkmon (ioaddr, rp->quirks); -writeb (0 , ioaddr + MIICmd); +/* rhine_disable_linkmon already cleared MIICmd */ writeb (phy_id, ioaddr + MIIPhyAddr);writeb (regnum, ioaddr + MIIRegAddr);writeb (0x40 , ioaddr + MIICmd);/* Trigger read */
@@ -1199,7 +1179,7 @@ static void mdio_write(struct net_devicerhine_disable_linkmon (ioaddr, rp->quirks); -writeb (0 , ioaddr + MIICmd); +/* rhine_disable_linkmon already cleared MIICmd */ writeb (phy_id, ioaddr + MIIPhyAddr);writeb (regnum, ioaddr + MIIRegAddr);writew (value, ioaddr + MIIData);
Quoted 4 lines · Roger Luethi
The following batch needs testing. I don't expect any notable regressions, but I could do with some reports on WOL (already in -mm) and suspend/resume.
Maybe this is a known issue by now, but the via-rhine bug is still not fixed in 2.6.8-rc3. I had to replace it with the via-rhine.c from -mm2 to get online.
Lee
Quoted 8 lines · Lee Revell
Quoted 3 lines · Roger Luethi
The following batch needs testing. I don't expect any notable regressions, but I could do with some reports on WOL (already in -mm) and suspend/resume.
Maybe this is a known issue by now, but the via-rhine bug is still not fixed in 2.6.8-rc3. I had to replace it with the
via-rhine.cfrom -mm2 to get online.
It is known. The fix for that bug is simmering in the pipeline somewhere. The experimental patches OTOH were for -mm and unrelated.
Roger
Quoted 6 lines · Roger Luethi
Quoted 5 lines · Lee Revell
Quoted 3 lines · Roger Luethi
The following batch needs testing. I don't expect any notable regressions, but I could do with some reports on WOL (already in -mm) and suspend/resume.
Quoted 7 lines
Quoted 3 lines
Maybe this is a known issue by now, but the via-rhine bug is still not fixed in 2.6.8-rc3. I had to replace it with the
via-rhine.cfrom -mm2 to get online.It is known. The fix for that bug is simmering in the pipeline somewhere. The experimental patches OTOH were for -mm and unrelated.
OK, just wanted to make sure the fix gets into 2.6.8, because it can be a showstopper.
Lee