aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Falcon <tlfalcon@linux.vnet.ibm.com>2018-01-10 20:39:52 -0500
committerDavid S. Miller <davem@davemloft.net>2018-01-16 11:26:16 -0500
commit3d1661304f0b2b51a8a43785b764822611dbdd53 (patch)
tree7c54b481c0039bc6be804bdda6b5ee349272dc5f
parent6311b7ce42e0c1d6d944bc099dc47e936c20cf11 (diff)
ibmvnic: Fix pending MAC address changes
Due to architecture limitations, the IBM VNIC client driver is unable to perform MAC address changes unless the device has "logged in" to its backing device. Currently, pending MAC changes are handled before login, resulting in an error and failure to change the MAC address. Moving that chunk to the end of the ibmvnic_login function, when we are sure that it was successful, fixes that. The MAC address can be changed when the device is up or down, so only check if the device is in a "PROBED" state before setting the MAC address. Fixes: c26eba03e407 ("ibmvnic: Update reset infrastructure to support tunable parameters") Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com> Reviewed-by: John Allen <jallen@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/ibm/ibmvnic.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 1dc4aef37d3a..4b3df17c7a45 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -756,6 +756,12 @@ static int ibmvnic_login(struct net_device *netdev)
756 } 756 }
757 } while (adapter->renegotiate); 757 } while (adapter->renegotiate);
758 758
759 /* handle pending MAC address changes after successful login */
760 if (adapter->mac_change_pending) {
761 __ibmvnic_set_mac(netdev, &adapter->desired.mac);
762 adapter->mac_change_pending = false;
763 }
764
759 return 0; 765 return 0;
760} 766}
761 767
@@ -993,11 +999,6 @@ static int ibmvnic_open(struct net_device *netdev)
993 999
994 mutex_lock(&adapter->reset_lock); 1000 mutex_lock(&adapter->reset_lock);
995 1001
996 if (adapter->mac_change_pending) {
997 __ibmvnic_set_mac(netdev, &adapter->desired.mac);
998 adapter->mac_change_pending = false;
999 }
1000
1001 if (adapter->state != VNIC_CLOSED) { 1002 if (adapter->state != VNIC_CLOSED) {
1002 rc = ibmvnic_login(netdev); 1003 rc = ibmvnic_login(netdev);
1003 if (rc) { 1004 if (rc) {
@@ -1527,7 +1528,7 @@ static int ibmvnic_set_mac(struct net_device *netdev, void *p)
1527 struct ibmvnic_adapter *adapter = netdev_priv(netdev); 1528 struct ibmvnic_adapter *adapter = netdev_priv(netdev);
1528 struct sockaddr *addr = p; 1529 struct sockaddr *addr = p;
1529 1530
1530 if (adapter->state != VNIC_OPEN) { 1531 if (adapter->state == VNIC_PROBED) {
1531 memcpy(&adapter->desired.mac, addr, sizeof(struct sockaddr)); 1532 memcpy(&adapter->desired.mac, addr, sizeof(struct sockaddr));
1532 adapter->mac_change_pending = true; 1533 adapter->mac_change_pending = true;
1533 return 0; 1534 return 0;