aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/fw.c7
-rw-r--r--include/linux/mlx4/device.h3
3 files changed, 10 insertions, 3 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 333a7a0b833c..7b513e9aea85 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -1285,7 +1285,8 @@ void mlx4_en_stop_port(struct net_device *dev)
1285 1285
1286 /* Unregister Mac address for the port */ 1286 /* Unregister Mac address for the port */
1287 mlx4_put_eth_qp(mdev->dev, priv->port, priv->mac, priv->base_qpn); 1287 mlx4_put_eth_qp(mdev->dev, priv->port, priv->mac, priv->base_qpn);
1288 mdev->mac_removed[priv->port] = 1; 1288 if (!(mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN))
1289 mdev->mac_removed[priv->port] = 1;
1289 1290
1290 /* Remove flow steering rules for the port*/ 1291 /* Remove flow steering rules for the port*/
1291 if (mdev->dev->caps.steering_mode == 1292 if (mdev->dev->caps.steering_mode ==
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index 91acf71aca97..38b62c78d5da 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -127,7 +127,8 @@ static void dump_dev_cap_flags2(struct mlx4_dev *dev, u64 flags)
127 [0] = "RSS support", 127 [0] = "RSS support",
128 [1] = "RSS Toeplitz Hash Function support", 128 [1] = "RSS Toeplitz Hash Function support",
129 [2] = "RSS XOR Hash Function support", 129 [2] = "RSS XOR Hash Function support",
130 [3] = "Device manage flow steering support" 130 [3] = "Device manage flow steering support",
131 [4] = "Automatic mac reassignment support"
131 }; 132 };
132 int i; 133 int i;
133 134
@@ -478,6 +479,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
478#define QUERY_DEV_CAP_BMME_FLAGS_OFFSET 0x94 479#define QUERY_DEV_CAP_BMME_FLAGS_OFFSET 0x94
479#define QUERY_DEV_CAP_RSVD_LKEY_OFFSET 0x98 480#define QUERY_DEV_CAP_RSVD_LKEY_OFFSET 0x98
480#define QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET 0xa0 481#define QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET 0xa0
482#define QUERY_DEV_CAP_FW_REASSIGN_MAC 0x9d
481 483
482 dev_cap->flags2 = 0; 484 dev_cap->flags2 = 0;
483 mailbox = mlx4_alloc_cmd_mailbox(dev); 485 mailbox = mlx4_alloc_cmd_mailbox(dev);
@@ -637,6 +639,9 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
637 QUERY_DEV_CAP_BMME_FLAGS_OFFSET); 639 QUERY_DEV_CAP_BMME_FLAGS_OFFSET);
638 MLX4_GET(dev_cap->reserved_lkey, outbox, 640 MLX4_GET(dev_cap->reserved_lkey, outbox,
639 QUERY_DEV_CAP_RSVD_LKEY_OFFSET); 641 QUERY_DEV_CAP_RSVD_LKEY_OFFSET);
642 MLX4_GET(field, outbox, QUERY_DEV_CAP_FW_REASSIGN_MAC);
643 if (field & 1<<6)
644 dev_cap->flags2 |= MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN;
640 MLX4_GET(dev_cap->max_icm_sz, outbox, 645 MLX4_GET(dev_cap->max_icm_sz, outbox,
641 QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET); 646 QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET);
642 if (dev_cap->flags & MLX4_DEV_CAP_FLAG_COUNTERS) 647 if (dev_cap->flags & MLX4_DEV_CAP_FLAG_COUNTERS)
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index 20ea939c22a6..1883e8e84718 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -150,7 +150,8 @@ enum {
150 MLX4_DEV_CAP_FLAG2_RSS = 1LL << 0, 150 MLX4_DEV_CAP_FLAG2_RSS = 1LL << 0,
151 MLX4_DEV_CAP_FLAG2_RSS_TOP = 1LL << 1, 151 MLX4_DEV_CAP_FLAG2_RSS_TOP = 1LL << 1,
152 MLX4_DEV_CAP_FLAG2_RSS_XOR = 1LL << 2, 152 MLX4_DEV_CAP_FLAG2_RSS_XOR = 1LL << 2,
153 MLX4_DEV_CAP_FLAG2_FS_EN = 1LL << 3 153 MLX4_DEV_CAP_FLAG2_FS_EN = 1LL << 3,
154 MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN = 1LL << 4
154}; 155};
155 156
156enum { 157enum {