From: Or Ami <o...@mellanox.com>

Burst functions are updated to make sure applications cannot attempt to
send/receive after link is brought down.

Signed-off-by: Or Ami <ora at mellanox.com>
---
 doc/guides/rel_notes/release_16_04.rst |  4 ++
 drivers/net/mlx5/mlx5.c                |  2 +
 drivers/net/mlx5/mlx5.h                |  2 +
 drivers/net/mlx5/mlx5_ethdev.c         | 85 ++++++++++++++++++++++++++++++++++
 4 files changed, 93 insertions(+)

diff --git a/doc/guides/rel_notes/release_16_04.rst 
b/doc/guides/rel_notes/release_16_04.rst
index 4750205..cbb736f 100644
--- a/doc/guides/rel_notes/release_16_04.rst
+++ b/doc/guides/rel_notes/release_16_04.rst
@@ -79,6 +79,10 @@ This section should contain new features added in this 
release. Sample format:

   Only available with Mellanox OFED >= 3.2.

+* **mlx5: Added link up/down callbacks.**
+
+  Implemented callbacks to bring link up and down.
+

 Resolved Issues
 ---------------
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index ad69ec2..14ac4ba 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -148,6 +148,8 @@ static const struct eth_dev_ops mlx5_dev_ops = {
        .dev_configure = mlx5_dev_configure,
        .dev_start = mlx5_dev_start,
        .dev_stop = mlx5_dev_stop,
+       .dev_set_link_down = mlx5_set_link_down,
+       .dev_set_link_up = mlx5_set_link_up,
        .dev_close = mlx5_dev_close,
        .promiscuous_enable = mlx5_promiscuous_enable,
        .promiscuous_disable = mlx5_promiscuous_disable,
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 43b24fb..9a3f240 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -168,6 +168,8 @@ void mlx5_dev_link_status_handler(void *);
 void mlx5_dev_interrupt_handler(struct rte_intr_handle *, void *);
 void priv_dev_interrupt_handler_uninstall(struct priv *, struct rte_eth_dev *);
 void priv_dev_interrupt_handler_install(struct priv *, struct rte_eth_dev *);
+int mlx5_set_link_down(struct rte_eth_dev *dev);
+int mlx5_set_link_up(struct rte_eth_dev *dev);

 /* mlx5_mac.c */

diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index 6704382..f609e0f 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -968,3 +968,88 @@ priv_dev_interrupt_handler_install(struct priv *priv, 
struct rte_eth_dev *dev)
                                           dev);
        }
 }
+
+/**
+ * Change the link state (UP / DOWN).
+ *
+ * @param dev
+ *   Pointer to Ethernet device structure.
+ * @param up
+ *   Nonzero for link up, otherwise link down.
+ *
+ * @return
+ *   0 on success, errno value on failure.
+ */
+static int
+priv_set_link(struct priv *priv, int up)
+{
+       struct rte_eth_dev *dev = priv->dev;
+       int err;
+       unsigned int i;
+
+       if (up) {
+               err = priv_set_flags(priv, ~IFF_UP, IFF_UP);
+               if (err)
+                       return err;
+               for (i = 0; i < priv->rxqs_n; i++)
+                       if ((*priv->rxqs)[i]->sp)
+                               break;
+               /* Check if an sp queue exists.
+                * Note: Some old frames might be received.
+                */
+               if (i == priv->rxqs_n)
+                       dev->rx_pkt_burst = mlx5_rx_burst;
+               else
+                       dev->rx_pkt_burst = mlx5_rx_burst_sp;
+               dev->tx_pkt_burst = mlx5_tx_burst;
+       } else {
+               err = priv_set_flags(priv, ~IFF_UP, ~IFF_UP);
+               if (err)
+                       return err;
+               dev->rx_pkt_burst = removed_rx_burst;
+               dev->tx_pkt_burst = removed_tx_burst;
+       }
+       return 0;
+}
+
+/**
+ * DPDK callback to bring the link DOWN.
+ *
+ * @param dev
+ *   Pointer to Ethernet device structure.
+ *
+ * @return
+ *   0 on success, errno value on failure.
+ */
+int
+mlx5_set_link_down(struct rte_eth_dev *dev)
+{
+       struct priv *priv = dev->data->dev_private;
+       int err;
+
+       priv_lock(priv);
+       err = priv_set_link(priv, 0);
+       priv_unlock(priv);
+       return err;
+}
+
+/**
+ * DPDK callback to bring the link UP.
+ *
+ * @param dev
+ *   Pointer to Ethernet device structure.
+ *
+ * @return
+ *   0 on success, errno value on failure.
+ */
+int
+mlx5_set_link_up(struct rte_eth_dev *dev)
+{
+       struct priv *priv = dev->data->dev_private;
+       int err;
+
+       priv_lock(priv);
+       err = priv_set_link(priv, 1);
+       priv_unlock(priv);
+       return err;
+}
-- 
2.1.4

Reply via email to