aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Rose <gregory.v.rose@intel.com>2013-02-12 22:02:05 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2013-03-28 04:13:46 -0400
commite1941a74338d8c655c92b058e72acc141fd9e813 (patch)
tree9fb99154d87a7411e814c8ba96cab3171e21e986
parent35055928c7b1d078ddde656357db3093f383d846 (diff)
ixgbevf: Adjust to handle unassigned MAC address from PF
If the administrator has not assigned a MAC address to the VF via the PF then handle it gracefully by generating a temporary MAC address. This ensures that we always know when we have a random address and udev won't get upset about it. Signed-off-by: Greg Rose <gregory.v.rose@intel.com> CC: Andy Gospodarek <andy@greyhouse.net> CC: Stefan Assmann <sassmann@kpanic.de> Tested-by: Sibai Li <sibai.li@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c21
-rw-r--r--drivers/net/ethernet/intel/ixgbevf/vf.c7
2 files changed, 21 insertions, 7 deletions
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index 5563250883a5..eeae9349f78b 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -2052,6 +2052,7 @@ static int ixgbevf_sw_init(struct ixgbevf_adapter *adapter)
2052{ 2052{
2053 struct ixgbe_hw *hw = &adapter->hw; 2053 struct ixgbe_hw *hw = &adapter->hw;
2054 struct pci_dev *pdev = adapter->pdev; 2054 struct pci_dev *pdev = adapter->pdev;
2055 struct net_device *netdev = adapter->netdev;
2055 int err; 2056 int err;
2056 2057
2057 /* PCI config space info */ 2058 /* PCI config space info */
@@ -2071,18 +2072,26 @@ static int ixgbevf_sw_init(struct ixgbevf_adapter *adapter)
2071 err = hw->mac.ops.reset_hw(hw); 2072 err = hw->mac.ops.reset_hw(hw);
2072 if (err) { 2073 if (err) {
2073 dev_info(&pdev->dev, 2074 dev_info(&pdev->dev,
2074 "PF still in reset state, assigning new address\n"); 2075 "PF still in reset state. Is the PF interface up?\n");
2075 eth_hw_addr_random(adapter->netdev);
2076 memcpy(adapter->hw.mac.addr, adapter->netdev->dev_addr,
2077 adapter->netdev->addr_len);
2078 } else { 2076 } else {
2079 err = hw->mac.ops.init_hw(hw); 2077 err = hw->mac.ops.init_hw(hw);
2080 if (err) { 2078 if (err) {
2081 pr_err("init_shared_code failed: %d\n", err); 2079 pr_err("init_shared_code failed: %d\n", err);
2082 goto out; 2080 goto out;
2083 } 2081 }
2084 memcpy(adapter->netdev->dev_addr, adapter->hw.mac.addr, 2082 err = hw->mac.ops.get_mac_addr(hw, hw->mac.addr);
2085 adapter->netdev->addr_len); 2083 if (err)
2084 dev_info(&pdev->dev, "Error reading MAC address\n");
2085 else if (is_zero_ether_addr(adapter->hw.mac.addr))
2086 dev_info(&pdev->dev,
2087 "MAC address not assigned by administrator.\n");
2088 memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len);
2089 }
2090
2091 if (!is_valid_ether_addr(netdev->dev_addr)) {
2092 dev_info(&pdev->dev, "Assigning random MAC address\n");
2093 eth_hw_addr_random(netdev);
2094 memcpy(hw->mac.addr, netdev->dev_addr, netdev->addr_len);
2086 } 2095 }
2087 2096
2088 /* lock to protect mailbox accesses */ 2097 /* lock to protect mailbox accesses */
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.c b/drivers/net/ethernet/intel/ixgbevf/vf.c
index 0c94557b53df..387b52635bc0 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.c
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.c
@@ -109,7 +109,12 @@ static s32 ixgbevf_reset_hw_vf(struct ixgbe_hw *hw)
109 if (ret_val) 109 if (ret_val)
110 return ret_val; 110 return ret_val;
111 111
112 if (msgbuf[0] != (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_ACK)) 112 /* New versions of the PF may NACK the reset return message
113 * to indicate that no MAC address has yet been assigned for
114 * the VF.
115 */
116 if (msgbuf[0] != (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_ACK) &&
117 msgbuf[0] != (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_NACK))
113 return IXGBE_ERR_INVALID_MAC_ADDR; 118 return IXGBE_ERR_INVALID_MAC_ADDR;
114 119
115 memcpy(hw->mac.perm_addr, addr, ETH_ALEN); 120 memcpy(hw->mac.perm_addr, addr, ETH_ALEN);