diff options
author | Somnath Kotur <somnath.kotur@emulex.com> | 2011-10-27 03:14:05 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-10-27 23:16:20 -0400 |
commit | e3a7ae2c1819aa210a38f80f6bf13322652c8211 (patch) | |
tree | 75cbeb4866aee1e1d8c75148200795a17c1f657a /drivers/net | |
parent | 106df1e3594c710c74348883a4942f65651781ff (diff) |
be2net: Changing MAC Address of a VF was broken.
Allow for MAC Address change of VF(SR-IOV case) on the fly- First add and then
delete MAC Address to allow for 'out of pool' errors.
When MAC Addr configured from a VM, the MAC on the NIC will aleady have
the supplied MAC,so just copy the supplied MAC to the netdev structure
before returning success to the stack
Signed-off-by: Somnath Kotur <somnath.kotur@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 28 |
2 files changed, 19 insertions, 13 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index 83b8a46cdf41..824b8e6021f6 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
@@ -688,6 +688,10 @@ int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, | |||
688 | 688 | ||
689 | err: | 689 | err: |
690 | spin_unlock_bh(&adapter->mcc_lock); | 690 | spin_unlock_bh(&adapter->mcc_lock); |
691 | |||
692 | if (status == MCC_STATUS_UNAUTHORIZED_REQUEST) | ||
693 | status = -EPERM; | ||
694 | |||
691 | return status; | 695 | return status; |
692 | } | 696 | } |
693 | 697 | ||
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) | |||
229 | struct be_adapter *adapter = netdev_priv(netdev); | 229 | struct be_adapter *adapter = netdev_priv(netdev); |
230 | struct sockaddr *addr = p; | 230 | struct sockaddr *addr = p; |
231 | int status = 0; | 231 | int status = 0; |
232 | u8 current_mac[ETH_ALEN]; | ||
233 | u32 pmac_id = adapter->pmac_id; | ||
232 | 234 | ||
233 | if (!is_valid_ether_addr(addr->sa_data)) | 235 | if (!is_valid_ether_addr(addr->sa_data)) |
234 | return -EADDRNOTAVAIL; | 236 | return -EADDRNOTAVAIL; |
235 | 237 | ||
236 | /* MAC addr configuration will be done in hardware for VFs | 238 | status = be_cmd_mac_addr_query(adapter, current_mac, |
237 | * by their corresponding PFs. Just copy to netdev addr here | 239 | MAC_ADDRESS_TYPE_NETWORK, false, adapter->if_handle); |
238 | */ | ||
239 | if (!be_physfn(adapter)) | ||
240 | goto netdev_addr; | ||
241 | |||
242 | status = be_cmd_pmac_del(adapter, adapter->if_handle, | ||
243 | adapter->pmac_id, 0); | ||
244 | if (status) | 240 | if (status) |
245 | return status; | 241 | goto err; |
246 | 242 | ||
247 | status = be_cmd_pmac_add(adapter, (u8 *)addr->sa_data, | 243 | if (memcmp(addr->sa_data, current_mac, ETH_ALEN)) { |
244 | status = be_cmd_pmac_add(adapter, (u8 *)addr->sa_data, | ||
248 | adapter->if_handle, &adapter->pmac_id, 0); | 245 | adapter->if_handle, &adapter->pmac_id, 0); |
249 | netdev_addr: | 246 | if (status) |
250 | if (!status) | 247 | goto err; |
251 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); | ||
252 | 248 | ||
249 | be_cmd_pmac_del(adapter, adapter->if_handle, pmac_id, 0); | ||
250 | } | ||
251 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); | ||
252 | return 0; | ||
253 | err: | ||
254 | dev_err(&adapter->pdev->dev, "MAC %pM set Failed\n", addr->sa_data); | ||
253 | return status; | 255 | return status; |
254 | } | 256 | } |
255 | 257 | ||