aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/intel/igbvf/netdev.c11
-rw-r--r--drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c28
-rw-r--r--include/linux/etherdevice.h13
3 files changed, 31 insertions, 21 deletions
diff --git a/drivers/net/ethernet/intel/igbvf/netdev.c b/drivers/net/ethernet/intel/igbvf/netdev.c
index 446297ff0104..92956e80fd1b 100644
--- a/drivers/net/ethernet/intel/igbvf/netdev.c
+++ b/drivers/net/ethernet/intel/igbvf/netdev.c
@@ -2712,18 +2712,19 @@ static int __devinit igbvf_probe(struct pci_dev *pdev,
2712 dev_info(&pdev->dev, 2712 dev_info(&pdev->dev,
2713 "PF still in reset state, assigning new address." 2713 "PF still in reset state, assigning new address."
2714 " Is the PF interface up?\n"); 2714 " Is the PF interface up?\n");
2715 dev_hw_addr_random(adapter->netdev, hw->mac.addr); 2715 eth_hw_addr_random(netdev);
2716 memcpy(adapter->hw.mac.addr, netdev->dev_addr,
2717 netdev->addr_len);
2716 } else { 2718 } else {
2717 err = hw->mac.ops.read_mac_addr(hw); 2719 err = hw->mac.ops.read_mac_addr(hw);
2718 if (err) { 2720 if (err) {
2719 dev_err(&pdev->dev, "Error reading MAC address\n"); 2721 dev_err(&pdev->dev, "Error reading MAC address\n");
2720 goto err_hw_init; 2722 goto err_hw_init;
2721 } 2723 }
2724 memcpy(netdev->dev_addr, adapter->hw.mac.addr,
2725 netdev->addr_len);
2722 } 2726 }
2723 2727
2724 memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len);
2725 memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
2726
2727 if (!is_valid_ether_addr(netdev->perm_addr)) { 2728 if (!is_valid_ether_addr(netdev->perm_addr)) {
2728 dev_err(&pdev->dev, "Invalid MAC Address: %pM\n", 2729 dev_err(&pdev->dev, "Invalid MAC Address: %pM\n",
2729 netdev->dev_addr); 2730 netdev->dev_addr);
@@ -2731,6 +2732,8 @@ static int __devinit igbvf_probe(struct pci_dev *pdev,
2731 goto err_hw_init; 2732 goto err_hw_init;
2732 } 2733 }
2733 2734
2735 memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
2736
2734 setup_timer(&adapter->watchdog_timer, &igbvf_watchdog, 2737 setup_timer(&adapter->watchdog_timer, &igbvf_watchdog,
2735 (unsigned long) adapter); 2738 (unsigned long) adapter);
2736 2739
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index 58c04b69ce70..e10221dcebb1 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -2199,13 +2199,17 @@ static int __devinit ixgbevf_sw_init(struct ixgbevf_adapter *adapter)
2199 if (err) { 2199 if (err) {
2200 dev_info(&pdev->dev, 2200 dev_info(&pdev->dev,
2201 "PF still in reset state, assigning new address\n"); 2201 "PF still in reset state, assigning new address\n");
2202 dev_hw_addr_random(adapter->netdev, hw->mac.addr); 2202 eth_hw_addr_random(adapter->netdev);
2203 memcpy(adapter->hw.mac.addr, adapter->netdev->dev_addr,
2204 adapter->netdev->addr_len);
2203 } else { 2205 } else {
2204 err = hw->mac.ops.init_hw(hw); 2206 err = hw->mac.ops.init_hw(hw);
2205 if (err) { 2207 if (err) {
2206 pr_err("init_shared_code failed: %d\n", err); 2208 pr_err("init_shared_code failed: %d\n", err);
2207 goto out; 2209 goto out;
2208 } 2210 }
2211 memcpy(adapter->netdev->dev_addr, adapter->hw.mac.addr,
2212 adapter->netdev->addr_len);
2209 } 2213 }
2210 2214
2211 /* Enable dynamic interrupt throttling rates */ 2215 /* Enable dynamic interrupt throttling rates */
@@ -2224,6 +2228,7 @@ static int __devinit ixgbevf_sw_init(struct ixgbevf_adapter *adapter)
2224 adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED; 2228 adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED;
2225 2229
2226 set_bit(__IXGBEVF_DOWN, &adapter->state); 2230 set_bit(__IXGBEVF_DOWN, &adapter->state);
2231 return 0;
2227 2232
2228out: 2233out:
2229 return err; 2234 return err;
@@ -3394,6 +3399,17 @@ static int __devinit ixgbevf_probe(struct pci_dev *pdev,
3394 3399
3395 /* setup the private structure */ 3400 /* setup the private structure */
3396 err = ixgbevf_sw_init(adapter); 3401 err = ixgbevf_sw_init(adapter);
3402 if (err)
3403 goto err_sw_init;
3404
3405 /* The HW MAC address was set and/or determined in sw_init */
3406 memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
3407
3408 if (!is_valid_ether_addr(netdev->dev_addr)) {
3409 pr_err("invalid MAC address\n");
3410 err = -EIO;
3411 goto err_sw_init;
3412 }
3397 3413
3398 netdev->hw_features = NETIF_F_SG | 3414 netdev->hw_features = NETIF_F_SG |
3399 NETIF_F_IP_CSUM | 3415 NETIF_F_IP_CSUM |
@@ -3418,16 +3434,6 @@ static int __devinit ixgbevf_probe(struct pci_dev *pdev,
3418 3434
3419 netdev->priv_flags |= IFF_UNICAST_FLT; 3435 netdev->priv_flags |= IFF_UNICAST_FLT;
3420 3436
3421 /* The HW MAC address was set and/or determined in sw_init */
3422 memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len);
3423 memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
3424
3425 if (!is_valid_ether_addr(netdev->dev_addr)) {
3426 pr_err("invalid MAC address\n");
3427 err = -EIO;
3428 goto err_sw_init;
3429 }
3430
3431 init_timer(&adapter->watchdog_timer); 3437 init_timer(&adapter->watchdog_timer);
3432 adapter->watchdog_timer.function = ixgbevf_watchdog; 3438 adapter->watchdog_timer.function = ixgbevf_watchdog;
3433 adapter->watchdog_timer.data = (unsigned long)adapter; 3439 adapter->watchdog_timer.data = (unsigned long)adapter;
diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h
index 05955cf09937..8a1835855faa 100644
--- a/include/linux/etherdevice.h
+++ b/include/linux/etherdevice.h
@@ -140,17 +140,18 @@ static inline void random_ether_addr(u8 *addr)
140} 140}
141 141
142/** 142/**
143 * dev_hw_addr_random - Create random MAC and set device flag 143 * eth_hw_addr_random - Generate software assigned random Ethernet and
144 * set device flag
144 * @dev: pointer to net_device structure 145 * @dev: pointer to net_device structure
145 * @hwaddr: Pointer to a six-byte array containing the Ethernet address
146 * 146 *
147 * Generate random MAC to be used by a device and set addr_assign_type 147 * Generate a random Ethernet address (MAC) to be used by a net device
148 * so the state can be read by sysfs and be used by udev. 148 * and set addr_assign_type so the state can be read by sysfs and be
149 * used by userspace.
149 */ 150 */
150static inline void dev_hw_addr_random(struct net_device *dev, u8 *hwaddr) 151static inline void eth_hw_addr_random(struct net_device *dev)
151{ 152{
152 dev->addr_assign_type |= NET_ADDR_RANDOM; 153 dev->addr_assign_type |= NET_ADDR_RANDOM;
153 random_ether_addr(hwaddr); 154 random_ether_addr(dev->dev_addr);
154} 155}
155 156
156/** 157/**