diff options
-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); |