mlx4_en: reconfiguring mac address.
authorYevgeny Petrilin <yevgenyp@mellanox.co.il>
Tue, 24 Aug 2010 03:46:38 +0000 (03:46 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 24 Aug 2010 21:54:53 +0000 (14:54 -0700)
When Mac address is removed from one port of the CX2 device, the other device
should reconfigure its Mac.
This fixes an issue with failover, when both ports have the same Mac address,
and one of the ports, is closed, the second one stops receiving traffic.
(bugzilla #1965 at bugs.openfabrics.org)

Signed-off-by: Yevgeny Petrilin <yevgenyp@mellanox.co.il>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/mlx4/en_netdev.c
drivers/net/mlx4/mlx4_en.h

index 968e75b7acf4e7684ad7ef512bcb667c89fee50f..242366ca0793caeb7e21266a0098c89bb9482582 100644 (file)
@@ -513,6 +513,10 @@ static void mlx4_en_do_get_stats(struct work_struct *work)
 
                queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY);
        }
+       if (mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port]) {
+               queue_work(mdev->workqueue, &priv->mac_task);
+               mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port] = 0;
+       }
        mutex_unlock(&mdev->state_lock);
 }
 
@@ -653,6 +657,7 @@ int mlx4_en_start_port(struct net_device *dev)
                en_err(priv, "Failed setting port mac\n");
                goto tx_err;
        }
+       mdev->mac_removed[priv->port] = 0;
 
        /* Init port */
        en_dbg(HW, priv, "Initializing port\n");
@@ -709,6 +714,7 @@ void mlx4_en_stop_port(struct net_device *dev)
 
        /* Unregister Mac address for the port */
        mlx4_unregister_mac(mdev->dev, priv->port, priv->mac_index);
+       mdev->mac_removed[priv->port] = 1;
 
        /* Free TX Rings */
        for (i = 0; i < priv->tx_ring_num; i++) {
index a09598b2b12e8b6eb14f3c0820cc7a9425613a81..5d8f097d7e0639c6a7a2b466d95f6d5aa7ab42f5 100644 (file)
@@ -341,6 +341,7 @@ struct mlx4_en_dev {
        struct mlx4_mr          mr;
        u32                     priv_pdn;
        spinlock_t              uar_lock;
+       u8                      mac_removed[MLX4_MAX_PORTS + 1];
 };