aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey Huang <huangjw@broadcom.com>2015-12-02 01:54:06 -0500
committerDavid S. Miller <davem@davemloft.net>2015-12-03 15:07:13 -0500
commit1fc2cfd03bbf8f1f8b6b90f0858faba8bd6631c4 (patch)
tree1743456df131a8705c0aff86c6abbd9495032964
parent39198ec98751477313f30569b935503b216f85d0 (diff)
bnxt_en: Fixed incorrect implementation of ndo_set_mac_address
The existing ndo_set_mac_address only copies the new MAC addr and didn't set the new MAC addr to the HW. The correct way is to delete the existing default MAC filter from HW and add the new one. Because of RFS filters are also dependent on the default mac filter l2 context, the driver must go thru close_nic() to delete the default MAC and RFS filters, then open_nic() to set the default MAC address to HW. Signed-off-by: Jeffrey Huang <huangjw@broadcom.com> Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index db15c5ee09c5..651b5878eba1 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -5212,13 +5212,22 @@ init_err:
5212static int bnxt_change_mac_addr(struct net_device *dev, void *p) 5212static int bnxt_change_mac_addr(struct net_device *dev, void *p)
5213{ 5213{
5214 struct sockaddr *addr = p; 5214 struct sockaddr *addr = p;
5215 struct bnxt *bp = netdev_priv(dev);
5216 int rc = 0;
5215 5217
5216 if (!is_valid_ether_addr(addr->sa_data)) 5218 if (!is_valid_ether_addr(addr->sa_data))
5217 return -EADDRNOTAVAIL; 5219 return -EADDRNOTAVAIL;
5218 5220
5221 if (ether_addr_equal(addr->sa_data, dev->dev_addr))
5222 return 0;
5223
5219 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); 5224 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
5225 if (netif_running(dev)) {
5226 bnxt_close_nic(bp, false, false);
5227 rc = bnxt_open_nic(bp, false, false);
5228 }
5220 5229
5221 return 0; 5230 return rc;
5222} 5231}
5223 5232
5224/* rtnl_lock held */ 5233/* rtnl_lock held */