diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-31 15:22:44 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-31 15:22:44 -0700 |
commit | 1a4ceab195e66bce9c1638fdded6d92988100ba4 (patch) | |
tree | 3ec17bd66fb3ac1429131e373cc8d99550d5451a /drivers/net/ethernet/emulex/benet/be_main.c | |
parent | 83f89ca755c9f783b8229d968c4e9d2c660ca427 (diff) | |
parent | 6a32e4f9dd9219261f8856f817e6655114cfec2f (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (27 commits)
vlan: allow nested vlan_do_receive()
ipv6: fix route lookup in addrconf_prefix_rcv()
bonding: eliminate bond_close race conditions
qlcnic: fix beacon and LED test.
qlcnic: Updated License file
qlcnic: updated reset sequence
qlcnic: reset loopback mode if promiscous mode setting fails.
qlcnic: skip IDC ack check in fw reset path.
i825xx: Fix incorrect dependency for BVME6000_NET
ipv6: fix route error binding peer in func icmp6_dst_alloc
ipv6: fix error propagation in ip6_ufo_append_data()
stmmac: update normal descriptor structure (v2)
stmmac: fix NULL pointer dereference in capabilities fixup (v2)
stmmac: fix a bug while checking the HW cap reg (v2)
be2net: Changing MAC Address of a VF was broken.
be2net: Refactored be_cmds.c file.
bnx2x: update driver version to 1.70.30-0
bnx2x: use FW 7.0.29.0
bnx2x: Enable changing speed when port type is PORT_DA
bnx2x: Fix 54618se LED behavior
...
Diffstat (limited to 'drivers/net/ethernet/emulex/benet/be_main.c')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index d6a232a300ad..21804972fa2f 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c @@ -229,27 +229,29 @@ static int be_mac_addr_set(struct net_device *netdev, void *p) struct be_adapter *adapter = netdev_priv(netdev); struct sockaddr *addr = p; int status = 0; + u8 current_mac[ETH_ALEN]; + u32 pmac_id = adapter->pmac_id; if (!is_valid_ether_addr(addr->sa_data)) return -EADDRNOTAVAIL; - /* MAC addr configuration will be done in hardware for VFs - * by their corresponding PFs. Just copy to netdev addr here - */ - if (!be_physfn(adapter)) - goto netdev_addr; - - status = be_cmd_pmac_del(adapter, adapter->if_handle, - adapter->pmac_id, 0); + status = be_cmd_mac_addr_query(adapter, current_mac, + MAC_ADDRESS_TYPE_NETWORK, false, adapter->if_handle); if (status) - return status; + goto err; - status = be_cmd_pmac_add(adapter, (u8 *)addr->sa_data, + if (memcmp(addr->sa_data, current_mac, ETH_ALEN)) { + status = be_cmd_pmac_add(adapter, (u8 *)addr->sa_data, adapter->if_handle, &adapter->pmac_id, 0); -netdev_addr: - if (!status) - memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); + if (status) + goto err; + be_cmd_pmac_del(adapter, adapter->if_handle, pmac_id, 0); + } + memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); + return 0; +err: + dev_err(&adapter->pdev->dev, "MAC %pM set Failed\n", addr->sa_data); return status; } |