Skip to content

Commit

Permalink
jme: Refill receive unicase MAC addr after resume
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Guo-Fu Tseng authored and David S. Miller committed Feb 14, 2011
1 parent 854a2e7 commit 8b53aba
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 10 deletions.
28 changes: 18 additions & 10 deletions drivers/net/jme.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

/*
Expand Down Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions drivers/net/jme.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 8b53aba

Please sign in to comment.