Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef96f7d4 authored by Or Gerlitz's avatar Or Gerlitz Committed by David S. Miller
Browse files

net/mlx4_en: Handle unassigned VF MAC address correctly



When a VF sense they didn't get MAC address, use random one. This will
address the case of administrator not assigning MAC to the VF through
the PF OS APIs and keep udev happy.

Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5efe5355
Loading
Loading
Loading
Loading
+12 −4
Original line number Original line Diff line number Diff line
@@ -2119,6 +2119,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
	struct mlx4_en_priv *priv;
	struct mlx4_en_priv *priv;
	int i;
	int i;
	int err;
	int err;
	u64 mac_u64;


	dev = alloc_etherdev_mqs(sizeof(struct mlx4_en_priv),
	dev = alloc_etherdev_mqs(sizeof(struct mlx4_en_priv),
				 MAX_TX_RINGS, MAX_RX_RINGS);
				 MAX_TX_RINGS, MAX_RX_RINGS);
@@ -2192,11 +2193,18 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
	dev->addr_len = ETH_ALEN;
	dev->addr_len = ETH_ALEN;
	mlx4_en_u64_to_mac(dev->dev_addr, mdev->dev->caps.def_mac[priv->port]);
	mlx4_en_u64_to_mac(dev->dev_addr, mdev->dev->caps.def_mac[priv->port]);
	if (!is_valid_ether_addr(dev->dev_addr)) {
	if (!is_valid_ether_addr(dev->dev_addr)) {
		if (mlx4_is_slave(priv->mdev->dev)) {
			eth_hw_addr_random(dev);
			en_warn(priv, "Assigned random MAC address %pM\n", dev->dev_addr);
			mac_u64 = mlx4_en_mac_to_u64(dev->dev_addr);
			mdev->dev->caps.def_mac[priv->port] = mac_u64;
		} else {
			en_err(priv, "Port: %d, invalid mac burned: %pM, quiting\n",
			en_err(priv, "Port: %d, invalid mac burned: %pM, quiting\n",
			       priv->port, dev->dev_addr);
			       priv->port, dev->dev_addr);
			err = -EINVAL;
			err = -EINVAL;
			goto out;
			goto out;
		}
		}
	}


	memcpy(priv->prev_mac, dev->dev_addr, sizeof(priv->prev_mac));
	memcpy(priv->prev_mac, dev->dev_addr, sizeof(priv->prev_mac));