net/mlx5: support Tx hairpin queues
[dpdk.git] / drivers / net / mlx5 / mlx5_trigger.c
index 69681e2..3ec86c4 100644 (file)
@@ -51,9 +51,15 @@ mlx5_txq_start(struct rte_eth_dev *dev)
 
                if (!txq_ctrl)
                        continue;
-               txq_alloc_elts(txq_ctrl);
-               txq_ctrl->ibv = mlx5_txq_ibv_new(dev, i);
-               if (!txq_ctrl->ibv) {
+               if (txq_ctrl->type == MLX5_TXQ_TYPE_HAIRPIN) {
+                       txq_ctrl->obj = mlx5_txq_obj_new
+                               (dev, i, MLX5_TXQ_OBJ_TYPE_DEVX_HAIRPIN);
+               } else {
+                       txq_alloc_elts(txq_ctrl);
+                       txq_ctrl->obj = mlx5_txq_obj_new
+                               (dev, i, MLX5_TXQ_OBJ_TYPE_IBV);
+               }
+               if (!txq_ctrl->obj) {
                        rte_errno = ENOMEM;
                        goto error;
                }
@@ -99,7 +105,14 @@ mlx5_rxq_start(struct rte_eth_dev *dev)
        struct mlx5_priv *priv = dev->data->dev_private;
        unsigned int i;
        int ret = 0;
+       enum mlx5_rxq_obj_type obj_type = MLX5_RXQ_OBJ_TYPE_IBV;
 
+       for (i = 0; i < priv->rxqs_n; ++i) {
+               if ((*priv->rxqs)[i]->lro) {
+                       obj_type =  MLX5_RXQ_OBJ_TYPE_DEVX_RQ;
+                       break;
+               }
+       }
        /* Allocate/reuse/resize mempool for Multi-Packet RQ. */
        if (mlx5_mprq_alloc_mp(dev)) {
                /* Should not release Rx queues but return immediately. */
@@ -111,6 +124,13 @@ mlx5_rxq_start(struct rte_eth_dev *dev)
 
                if (!rxq_ctrl)
                        continue;
+               if (rxq_ctrl->type == MLX5_RXQ_TYPE_HAIRPIN) {
+                       rxq_ctrl->obj = mlx5_rxq_obj_new
+                               (dev, i, MLX5_RXQ_OBJ_TYPE_DEVX_HAIRPIN);
+                       if (!rxq_ctrl->obj)
+                               goto error;
+                       continue;
+               }
                /* Pre-register Rx mempool. */
                mp = mlx5_rxq_mprq_enabled(&rxq_ctrl->rxq) ?
                     rxq_ctrl->rxq.mprq_mp : rxq_ctrl->rxq.mp;
@@ -123,9 +143,13 @@ mlx5_rxq_start(struct rte_eth_dev *dev)
                ret = rxq_alloc_elts(rxq_ctrl);
                if (ret)
                        goto error;
-               rxq_ctrl->ibv = mlx5_rxq_ibv_new(dev, i);
-               if (!rxq_ctrl->ibv)
+               rxq_ctrl->obj = mlx5_rxq_obj_new(dev, i, obj_type);
+               if (!rxq_ctrl->obj)
                        goto error;
+               if (obj_type == MLX5_RXQ_OBJ_TYPE_IBV)
+                       rxq_ctrl->wqn = rxq_ctrl->obj->wq->wq_num;
+               else if (obj_type == MLX5_RXQ_OBJ_TYPE_DEVX_RQ)
+                       rxq_ctrl->wqn = rxq_ctrl->obj->rq->id;
        }
        return 0;
 error:
@@ -275,6 +299,9 @@ mlx5_traffic_enable(struct rte_eth_dev *dev)
        unsigned int j;
        int ret;
 
+       if (priv->config.dv_esw_en && !priv->config.vf)
+               if (!mlx5_flow_create_esw_table_zero_flow(dev))
+                       goto error;
        if (priv->isolated)
                return 0;
        if (dev->data->promiscuous) {
@@ -337,7 +364,7 @@ mlx5_traffic_enable(struct rte_eth_dev *dev)
                        continue;
                memcpy(&unicast.dst.addr_bytes,
                       mac->addr_bytes,
-                      ETHER_ADDR_LEN);
+                      RTE_ETHER_ADDR_LEN);
                for (j = 0; j != vlan_filter_n; ++j) {
                        uint16_t vlan = priv->vlan_filter[j];