net/mlx5: fix handling link status event
[dpdk.git] / drivers / net / mlx5 / mlx5_trigger.c
index ed80a6b..6f5c799 100644 (file)
@@ -64,8 +64,11 @@ priv_txq_start(struct priv *priv)
 
                if (!txq_ctrl)
                        continue;
-               LIST_FOREACH(mr, &priv->mr, next)
+               LIST_FOREACH(mr, &priv->mr, next) {
                        priv_txq_mp2mr_reg(priv, &txq_ctrl->txq, mr->mp, idx++);
+                       if (idx == MLX5_PMD_TX_MP_CACHE)
+                               break;
+               }
                txq_alloc_elts(txq_ctrl);
                txq_ctrl->ibv = mlx5_priv_txq_ibv_new(priv, i);
                if (!txq_ctrl->ibv) {
@@ -148,38 +151,23 @@ mlx5_dev_start(struct rte_eth_dev *dev)
                      (void *)dev, strerror(err));
                goto error;
        }
-       /* Update send callback. */
-       priv_dev_select_tx_function(priv, dev);
        err = priv_rxq_start(priv);
        if (err) {
                ERROR("%p: RXQ allocation failed: %s",
                      (void *)dev, strerror(err));
                goto error;
        }
-       /* Update receive callback. */
-       priv_dev_select_rx_function(priv, dev);
-       err = priv_dev_traffic_enable(priv, dev);
-       if (err) {
-               ERROR("%p: an error occurred while configuring control flows:"
-                     " %s",
-                     (void *)priv, strerror(err));
-               goto error;
-       }
-       err = priv_flow_start(priv, &priv->flows);
-       if (err) {
-               ERROR("%p: an error occurred while configuring flows:"
-                     " %s",
-                     (void *)priv, strerror(err));
-               goto error;
-       }
        err = priv_rx_intr_vec_enable(priv);
        if (err) {
                ERROR("%p: RX interrupt vector creation failed",
                      (void *)priv);
                goto error;
        }
-       priv_dev_interrupt_handler_install(priv, dev);
        priv_xstats_init(priv);
+       /* Update link status and Tx/Rx callbacks for the first time. */
+       memset(&dev->data->dev_link, 0, sizeof(struct rte_eth_link));
+       priv_link_update(priv, 1);
+       priv_dev_interrupt_handler_install(priv, dev);
        priv_unlock(priv);
        return 0;
 error: