Commit 11351bf7 authored by David S. Miller's avatar David S. Miller

Merge branch 'mlx4-fixes'

Or Gerlitz says:

====================
Mellanox 10/40G mlx4 driver fixes for 4.5-rc6

This series contains two fixes for the SRIOV HW LAG that was
introduced in 4.5-rc1 and one fix that allows to revoke the
administrative MAC that was assigned to VF through the PF.

The VF mac fix needs to go for stable too.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents ebc363f5 6e522422
...@@ -2245,7 +2245,7 @@ static int mlx4_en_set_vf_mac(struct net_device *dev, int queue, u8 *mac) ...@@ -2245,7 +2245,7 @@ static int mlx4_en_set_vf_mac(struct net_device *dev, int queue, u8 *mac)
struct mlx4_en_dev *mdev = en_priv->mdev; struct mlx4_en_dev *mdev = en_priv->mdev;
u64 mac_u64 = mlx4_mac_to_u64(mac); u64 mac_u64 = mlx4_mac_to_u64(mac);
if (!is_valid_ether_addr(mac)) if (is_multicast_ether_addr(mac))
return -EINVAL; return -EINVAL;
return mlx4_set_vf_mac(mdev->dev, en_priv->port, queue, mac_u64); return mlx4_set_vf_mac(mdev->dev, en_priv->port, queue, mac_u64);
......
...@@ -1256,6 +1256,7 @@ static ssize_t set_port_ib_mtu(struct device *dev, ...@@ -1256,6 +1256,7 @@ static ssize_t set_port_ib_mtu(struct device *dev,
static int mlx4_mf_bond(struct mlx4_dev *dev) static int mlx4_mf_bond(struct mlx4_dev *dev)
{ {
int err = 0; int err = 0;
int nvfs;
struct mlx4_slaves_pport slaves_port1; struct mlx4_slaves_pport slaves_port1;
struct mlx4_slaves_pport slaves_port2; struct mlx4_slaves_pport slaves_port2;
DECLARE_BITMAP(slaves_port_1_2, MLX4_MFUNC_MAX); DECLARE_BITMAP(slaves_port_1_2, MLX4_MFUNC_MAX);
...@@ -1272,11 +1273,18 @@ static int mlx4_mf_bond(struct mlx4_dev *dev) ...@@ -1272,11 +1273,18 @@ static int mlx4_mf_bond(struct mlx4_dev *dev)
return -EINVAL; return -EINVAL;
} }
/* number of virtual functions is number of total functions minus one
* physical function for each port.
*/
nvfs = bitmap_weight(slaves_port1.slaves, dev->persist->num_vfs + 1) +
bitmap_weight(slaves_port2.slaves, dev->persist->num_vfs + 1) - 2;
/* limit on maximum allowed VFs */ /* limit on maximum allowed VFs */
if ((bitmap_weight(slaves_port1.slaves, dev->persist->num_vfs + 1) + if (nvfs > MAX_MF_BOND_ALLOWED_SLAVES) {
bitmap_weight(slaves_port2.slaves, dev->persist->num_vfs + 1)) > mlx4_warn(dev, "HA mode is not supported for %d VFs (max %d are allowed)\n",
MAX_MF_BOND_ALLOWED_SLAVES) nvfs, MAX_MF_BOND_ALLOWED_SLAVES);
return -EINVAL; return -EINVAL;
}
if (dev->caps.steering_mode != MLX4_STEERING_MODE_DEVICE_MANAGED) { if (dev->caps.steering_mode != MLX4_STEERING_MODE_DEVICE_MANAGED) {
mlx4_warn(dev, "HA mode unsupported for NON DMFS steering\n"); mlx4_warn(dev, "HA mode unsupported for NON DMFS steering\n");
......
...@@ -193,10 +193,10 @@ int __mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac) ...@@ -193,10 +193,10 @@ int __mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac)
if (need_mf_bond) { if (need_mf_bond) {
if (port == 1) { if (port == 1) {
mutex_lock(&table->mutex); mutex_lock(&table->mutex);
mutex_lock(&dup_table->mutex); mutex_lock_nested(&dup_table->mutex, SINGLE_DEPTH_NESTING);
} else { } else {
mutex_lock(&dup_table->mutex); mutex_lock(&dup_table->mutex);
mutex_lock(&table->mutex); mutex_lock_nested(&table->mutex, SINGLE_DEPTH_NESTING);
} }
} else { } else {
mutex_lock(&table->mutex); mutex_lock(&table->mutex);
...@@ -389,10 +389,10 @@ void __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac) ...@@ -389,10 +389,10 @@ void __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac)
if (dup) { if (dup) {
if (port == 1) { if (port == 1) {
mutex_lock(&table->mutex); mutex_lock(&table->mutex);
mutex_lock(&dup_table->mutex); mutex_lock_nested(&dup_table->mutex, SINGLE_DEPTH_NESTING);
} else { } else {
mutex_lock(&dup_table->mutex); mutex_lock(&dup_table->mutex);
mutex_lock(&table->mutex); mutex_lock_nested(&table->mutex, SINGLE_DEPTH_NESTING);
} }
} else { } else {
mutex_lock(&table->mutex); mutex_lock(&table->mutex);
...@@ -479,10 +479,10 @@ int __mlx4_replace_mac(struct mlx4_dev *dev, u8 port, int qpn, u64 new_mac) ...@@ -479,10 +479,10 @@ int __mlx4_replace_mac(struct mlx4_dev *dev, u8 port, int qpn, u64 new_mac)
if (dup) { if (dup) {
if (port == 1) { if (port == 1) {
mutex_lock(&table->mutex); mutex_lock(&table->mutex);
mutex_lock(&dup_table->mutex); mutex_lock_nested(&dup_table->mutex, SINGLE_DEPTH_NESTING);
} else { } else {
mutex_lock(&dup_table->mutex); mutex_lock(&dup_table->mutex);
mutex_lock(&table->mutex); mutex_lock_nested(&table->mutex, SINGLE_DEPTH_NESTING);
} }
} else { } else {
mutex_lock(&table->mutex); mutex_lock(&table->mutex);
...@@ -588,10 +588,10 @@ int __mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, ...@@ -588,10 +588,10 @@ int __mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan,
if (need_mf_bond) { if (need_mf_bond) {
if (port == 1) { if (port == 1) {
mutex_lock(&table->mutex); mutex_lock(&table->mutex);
mutex_lock(&dup_table->mutex); mutex_lock_nested(&dup_table->mutex, SINGLE_DEPTH_NESTING);
} else { } else {
mutex_lock(&dup_table->mutex); mutex_lock(&dup_table->mutex);
mutex_lock(&table->mutex); mutex_lock_nested(&table->mutex, SINGLE_DEPTH_NESTING);
} }
} else { } else {
mutex_lock(&table->mutex); mutex_lock(&table->mutex);
...@@ -764,10 +764,10 @@ void __mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, u16 vlan) ...@@ -764,10 +764,10 @@ void __mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, u16 vlan)
if (dup) { if (dup) {
if (port == 1) { if (port == 1) {
mutex_lock(&table->mutex); mutex_lock(&table->mutex);
mutex_lock(&dup_table->mutex); mutex_lock_nested(&dup_table->mutex, SINGLE_DEPTH_NESTING);
} else { } else {
mutex_lock(&dup_table->mutex); mutex_lock(&dup_table->mutex);
mutex_lock(&table->mutex); mutex_lock_nested(&table->mutex, SINGLE_DEPTH_NESTING);
} }
} else { } else {
mutex_lock(&table->mutex); mutex_lock(&table->mutex);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment