forcedeth: move mac address setup/teardown
Subsystems (2)
PATCH 1/2 forcedeth: move mac address setup/teardown
This patch moves the mac address setup/teardown to the nv_probe/nv_remove functions. This fixes WOL wakeup since on nv_close we would reverse the mac address. Also, bonding driver will reset address after nv_close is called.
Signed-off-by Ayaz Abdulla <[email protected]>
drivers/net/forcedeth.c +14 -15
@@ -3895,10 +3895,9 @@dprintk (KERN_DEBUG "nv_open: begin\n" ); -/* 1) erase previous misconfiguration */ +/* erase previous misconfiguration */ if (np->driver_data &DEV_HAS_POWER_CNTRL )nv_mac_reset (dev); -/* 4.1-1: stop adapter: ignored, 4.3 seems to be overkill */ writel (NVREG_MCASTADDRA_FORCE , base + NvRegMulticastAddrA);writel (0 , base + NvRegMulticastAddrB);writel (0 , base + NvRegMulticastMaskA);
@@ -3913,7 +3912,7 @@if (np->pause_flags &NV_PAUSEFRAME_TX_CAPABLE )writel (NVREG_TX_PAUSEFRAME_DISABLE , base + NvRegTxPauseFrame); -/* 2) initialize descriptor rings */ +/* initialize descriptor rings */ set_bufsize (dev); oom =nv_init_ring (dev);
@@ -3924,15 +3923,11 @@ np->in_shutdown =0 ; -/* 3) set mac address */ -nv_copy_mac_to_hw (dev); - -/* 4) give hw rings */ +/* give hw rings */ setup_hw_rings (dev,NV_SETUP_RX_RING |NV_SETUP_TX_RING );writel ( ((np->rx_ring_size-1 ) <<NVREG_RINGSZ_RXSHIFT ) + ((np->tx_ring_size-1 ) <<NVREG_RINGSZ_TXSHIFT ), base + NvRegRingSizes); -/* 5) continue setup */ writel (np->linkspeed, base + NvRegLinkSpeed);if (np->desc_ver ==DESC_VER_1 )writel (NVREG_TX_WM_DESC1_DEFAULT , base + NvRegTxWatermark);
@@ -3950,7 +3945,6 @@writel (NVREG_IRQSTAT_MASK , base + NvRegIrqStatus);writel (NVREG_MIISTAT_MASK2 , base + NvRegMIIStatus); -/* 6) continue setup */ writel (NVREG_MISC1_FORCE |NVREG_MISC1_HD , base + NvRegMisc1);writel (readl (base + NvRegTransmitterStatus), base + NvRegTransmitterStatus);writel (NVREG_PFF_ALWAYS , base + NvRegPacketFilterFlags);
@@ -4076,12 +4070,6 @@if (np->wolenabled)nv_start_rx (dev); -/* special op: write back the misordered MAC address - otherwise -* the next nv_probe would see a wrong address. -*/ -writel (np->orig_mac[0 ], base + NvRegMacAddrA); -writel (np->orig_mac[1 ], base + NvRegMacAddrB); -/* FIXME: power down nic */ return 0 ;
@@ -4309,6 +4297,9 @@ dev->dev_addr[0 ], dev->dev_addr[1 ], dev->dev_addr[2 ], dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); +/* set mac address */ +nv_copy_mac_to_hw (dev); +/* disable WOL */ writel (0 , base + NvRegWakeUpFlags); np->wolenabled =0 ;
@@ -4421,9 +4412,17 @@ static void __devexit nv_remove(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. +*/ +writel (np->orig_mac[0 ], base + NvRegMacAddrA); +writel (np->orig_mac[1 ], base + NvRegMacAddrB); +/* free all structures */ free_rings (dev);iounmap (get_hwbase (dev));
applied 1-2