diff options
author | Greg Rose <gregory.v.rose@intel.com> | 2013-02-12 22:02:05 -0500 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2013-03-28 04:13:46 -0400 |
commit | e1941a74338d8c655c92b058e72acc141fd9e813 (patch) | |
tree | 9fb99154d87a7411e814c8ba96cab3171e21e986 | |
parent | 35055928c7b1d078ddde656357db3093f383d846 (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.c | 21 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/vf.c | 7 |
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); |