diff options
author | Guo-Fu Tseng <cooldavid@cooldavid.org> | 2011-02-13 18:27:40 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-02-13 20:43:23 -0800 |
commit | 8b53abae582cee9a17320460e0f05474097192b6 (patch) | |
tree | cf8f25a7853ddcde2ca67c35db7e5e9e6b1a9218 | |
parent | 854a2e7c331a36244169626ba8e11e15d134cb5f (diff) | |
download | linux-3.10-8b53abae582cee9a17320460e0f05474097192b6.tar.gz linux-3.10-8b53abae582cee9a17320460e0f05474097192b6.tar.bz2 linux-3.10-8b53abae582cee9a17320460e0f05474097192b6.zip |
jme: Refill receive unicase MAC addr after resume
The value of the register which holds receive Unicast MAC Address
sometimes get messed-up after resume.
This patch refill it before enabling the hardware filter.
Signed-off-by: Guo-Fu Tseng <cooldavid@cooldavid.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/jme.c | 28 | ||||
-rw-r--r-- | drivers/net/jme.h | 1 |
2 files changed, 19 insertions, 10 deletions
diff --git a/drivers/net/jme.c b/drivers/net/jme.c index dd4132443b7..ed35e17f43d 100644 --- a/drivers/net/jme.c +++ b/drivers/net/jme.c @@ -898,6 +898,7 @@ jme_enable_rx_engine(struct jme_adapter *jme) /* * Setup Unicast Filter */ + jme_set_unicastaddr(jme->dev); jme_set_multi(jme->dev); /* @@ -2114,27 +2115,34 @@ jme_start_xmit(struct sk_buff *skb, struct net_device *netdev) return NETDEV_TX_OK; } +static void +jme_set_unicastaddr(struct net_device *netdev) +{ + struct jme_adapter *jme = netdev_priv(netdev); + u32 val; + + val = (netdev->dev_addr[3] & 0xff) << 24 | + (netdev->dev_addr[2] & 0xff) << 16 | + (netdev->dev_addr[1] & 0xff) << 8 | + (netdev->dev_addr[0] & 0xff); + jwrite32(jme, JME_RXUMA_LO, val); + val = (netdev->dev_addr[5] & 0xff) << 8 | + (netdev->dev_addr[4] & 0xff); + jwrite32(jme, JME_RXUMA_HI, val); +} + static int jme_set_macaddr(struct net_device *netdev, void *p) { struct jme_adapter *jme = netdev_priv(netdev); struct sockaddr *addr = p; - u32 val; if (netif_running(netdev)) return -EBUSY; spin_lock_bh(&jme->macaddr_lock); memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); - - val = (addr->sa_data[3] & 0xff) << 24 | - (addr->sa_data[2] & 0xff) << 16 | - (addr->sa_data[1] & 0xff) << 8 | - (addr->sa_data[0] & 0xff); - jwrite32(jme, JME_RXUMA_LO, val); - val = (addr->sa_data[5] & 0xff) << 8 | - (addr->sa_data[4] & 0xff); - jwrite32(jme, JME_RXUMA_HI, val); + jme_set_unicastaddr(netdev); spin_unlock_bh(&jme->macaddr_lock); return 0; diff --git a/drivers/net/jme.h b/drivers/net/jme.h index 668958c68f6..b7ae0c7a775 100644 --- a/drivers/net/jme.h +++ b/drivers/net/jme.h @@ -1258,6 +1258,7 @@ static inline int new_phy_power_ctrl(u8 chip_main_rev) */ static int jme_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd); +static void jme_set_unicastaddr(struct net_device *netdev); static void jme_set_multi(struct net_device *netdev); #endif |