net/mlx4_en: Don't reassign port mac address on firmware that supports it
authorMatan Barak <matanb@mellanox.com>
Wed, 30 Jan 2013 23:07:10 +0000 (23:07 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 31 Jan 2013 17:48:47 +0000 (12:48 -0500)
Mac reassignments should only be done when not supported by the firmware. To
accomplish that, checking firmware capability bit to know whether we should
reassign macs in the driver.

Signed-off-by: Matan Barak <matanb@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/en_netdev.c
drivers/net/ethernet/mellanox/mlx4/fw.c
include/linux/mlx4/device.h

index 333a7a0..7b513e9 100644 (file)
@@ -1285,7 +1285,8 @@ void mlx4_en_stop_port(struct net_device *dev)
 
        /* Unregister Mac address for the port */
        mlx4_put_eth_qp(mdev->dev, priv->port, priv->mac, priv->base_qpn);
-       mdev->mac_removed[priv->port] = 1;
+       if (!(mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN))
+               mdev->mac_removed[priv->port] = 1;
 
        /* Remove flow steering rules for the port*/
        if (mdev->dev->caps.steering_mode ==
index 91acf71..38b62c7 100644 (file)
@@ -127,7 +127,8 @@ static void dump_dev_cap_flags2(struct mlx4_dev *dev, u64 flags)
                [0] = "RSS support",
                [1] = "RSS Toeplitz Hash Function support",
                [2] = "RSS XOR Hash Function support",
-               [3] = "Device manage flow steering support"
+               [3] = "Device manage flow steering support",
+               [4] = "Automatic mac reassignment support"
        };
        int i;
 
@@ -478,6 +479,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 #define QUERY_DEV_CAP_BMME_FLAGS_OFFSET                0x94
 #define QUERY_DEV_CAP_RSVD_LKEY_OFFSET         0x98
 #define QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET                0xa0
+#define QUERY_DEV_CAP_FW_REASSIGN_MAC          0x9d
 
        dev_cap->flags2 = 0;
        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)
                 QUERY_DEV_CAP_BMME_FLAGS_OFFSET);
        MLX4_GET(dev_cap->reserved_lkey, outbox,
                 QUERY_DEV_CAP_RSVD_LKEY_OFFSET);
+       MLX4_GET(field, outbox, QUERY_DEV_CAP_FW_REASSIGN_MAC);
+       if (field & 1<<6)
+               dev_cap->flags2 |= MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN;
        MLX4_GET(dev_cap->max_icm_sz, outbox,
                 QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET);
        if (dev_cap->flags & MLX4_DEV_CAP_FLAG_COUNTERS)
index 20ea939..1883e8e 100644 (file)
@@ -150,7 +150,8 @@ enum {
        MLX4_DEV_CAP_FLAG2_RSS                  = 1LL <<  0,
        MLX4_DEV_CAP_FLAG2_RSS_TOP              = 1LL <<  1,
        MLX4_DEV_CAP_FLAG2_RSS_XOR              = 1LL <<  2,
-       MLX4_DEV_CAP_FLAG2_FS_EN                = 1LL <<  3
+       MLX4_DEV_CAP_FLAG2_FS_EN                = 1LL <<  3,
+       MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN     = 1LL <<  4
 };
 
 enum {