net: forcedeth call restore mac addr in nv_shutdown path -v2
Subsystems (2)
PATCH 1/1 net: forcedeth call restore mac addr in nv_shutdown path -v2
after
| commit f735a2a1a4f2a0f5cd823ce323e82675990469e2 | Author: Tobias Diedrich <[email protected]> | Date: Sun May 18 15:02:37 2008 +0200 | | [netdrvr] forcedeth: setup wake-on-lan before shutting down | | When hibernating in 'shutdown' mode, after saving the image the suspend hook | is not called again. | However, if the device is in promiscous mode, wake-on-lan will not work. | This adds a shutdown hook to setup wake-on-lan before the final shutdown. | | Signed-off-by: Tobias Diedrich <[email protected]> | Signed-off-by: Jeff Garzik <[email protected]>
my servers with nvidia ck804 and mcp55 will reverse mac address with kexec.
it turns out need to restore mac addr in nv_shutdown.
Signed-off-by Yinghai Lu <[email protected]>
--- drivers/net/forcedeth.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
drivers/net/forcedeth.c +13 -3
@@ -5643,6 +5643,7 @@ static int __devinit nv_probe(struct pci dev->dev_addr[4 ] = (np->orig_mac[0 ] >>8 ) &0xff ; dev->dev_addr[5 ] = (np->orig_mac[0 ] >>0 ) &0xff ;writel (txreg|NVREG_TRANSMITPOLL_MAC_ADDR_REV , base + NvRegTransmitPoll); +printk (KERN_DEBUG "nv_probe: set workarund bit for reversed mac addr\n" ); }memcpy (dev->perm_addr, dev->dev_addr, dev->addr_len);
@@ -5890,14 +5891,12 @@ static void nv_restore_phy(struct net_de } } -static void __devexit nv_remove(struct pci_dev *pci_dev) +static void nv_restore_mac_addr (struct pci_dev *pci_dev) {struct net_device *dev =pci_get_drvdata (pci_dev);struct fe_priv *np =netdev_priv (dev);u8 __iomem *base =get_hwbase (dev); -unregister_netdev (dev); -/* special op: write back the misordered MAC address - otherwise * the next nv_probe would see a wrong address. */
@@ -5905,6 +5904,15 @@ static void __devexit nv_remove(struct pwritel (np->orig_mac[1 ], base + NvRegMacAddrB);writel (readl (base + NvRegTransmitPoll) & ~NVREG_TRANSMITPOLL_MAC_ADDR_REV , base + NvRegTransmitPoll); +} + +static void __devexit nv_remove(struct pci_dev *pci_dev) +{ +struct net_device *dev =pci_get_drvdata (pci_dev); + +unregister_netdev (dev); + +nv_restore_mac_addr (pci_dev);/* restore any phy related changes */ nv_restore_phy (dev);
@@ -5975,6 +5983,8 @@ static void nv_shutdown(struct pci_dev *if (netif_running (dev))nv_close (dev); +nv_restore_mac_addr (pdev); +pci_enable_wake (pdev, PCI_D3hot, np->wolenabled);pci_enable_wake (pdev, PCI_D3cold, np->wolenabled);pci_disable_device (pdev);