net/bnxt: fix link status when port is stopped
[dpdk.git] / drivers / net / mlx5 / mlx5_flow.c
index 78cb38d..f5bdf66 100644 (file)
@@ -1379,8 +1379,11 @@ flow_drv_rxq_flags_set(struct rte_eth_dev *dev,
                return;
        for (i = 0; i != ind_tbl->queues_n; ++i) {
                int idx = ind_tbl->queues[i];
-               struct mlx5_rxq_ctrl *rxq_ctrl = mlx5_rxq_ctrl_get(dev, idx);
+               struct mlx5_rxq_ctrl *rxq_ctrl;
 
+               if (mlx5_is_external_rxq(dev, idx))
+                       continue;
+               rxq_ctrl = mlx5_rxq_ctrl_get(dev, idx);
                MLX5_ASSERT(rxq_ctrl != NULL);
                if (rxq_ctrl == NULL)
                        continue;
@@ -1483,8 +1486,11 @@ flow_drv_rxq_flags_trim(struct rte_eth_dev *dev,
        MLX5_ASSERT(dev->data->dev_started);
        for (i = 0; i != ind_tbl->queues_n; ++i) {
                int idx = ind_tbl->queues[i];
-               struct mlx5_rxq_ctrl *rxq_ctrl = mlx5_rxq_ctrl_get(dev, idx);
+               struct mlx5_rxq_ctrl *rxq_ctrl;
 
+               if (mlx5_is_external_rxq(dev, idx))
+                       continue;
+               rxq_ctrl = mlx5_rxq_ctrl_get(dev, idx);
                MLX5_ASSERT(rxq_ctrl != NULL);
                if (rxq_ctrl == NULL)
                        continue;
@@ -5271,6 +5277,7 @@ flow_meter_split_prep(struct rte_eth_dev *dev,
        uint32_t flow_id = 0;
        uint32_t flow_id_reversed = 0;
        uint8_t flow_id_bits = 0;
+       bool after_meter = false;
        int shift;
 
        /* Prepare the suffix subflow items. */
@@ -5337,6 +5344,7 @@ flow_meter_split_prep(struct rte_eth_dev *dev,
                                tag_action = actions_pre++;
                                action_cur = actions_pre++;
                        }
+                       after_meter = true;
                        break;
                case RTE_FLOW_ACTION_TYPE_VXLAN_DECAP:
                case RTE_FLOW_ACTION_TYPE_NVGRE_DECAP:
@@ -5365,6 +5373,11 @@ flow_meter_split_prep(struct rte_eth_dev *dev,
                                                MLX5_RTE_FLOW_ITEM_TYPE_VLAN;
                        }
                        break;
+               case RTE_FLOW_ACTION_TYPE_COUNT:
+                       if (fm->def_policy)
+                               action_cur = after_meter ?
+                                               actions_sfx++ : actions_pre++;
+                       break;
                default:
                        break;
                }
@@ -6393,8 +6406,10 @@ flow_create_split_meter(struct rte_eth_dev *dev,
                if (!fm->def_policy && !is_mtr_hierarchy &&
                    (!has_modify || !fm->drop_cnt))
                        set_mtr_reg = false;
-               /* Prefix actions: meter, decap, encap, tag, jump, end. */
-               act_size = sizeof(struct rte_flow_action) * (actions_n + 6) +
+               /* Prefix actions: meter, decap, encap, tag, jump, end, cnt. */
+#define METER_PREFIX_ACTION 7
+               act_size = (sizeof(struct rte_flow_action) *
+                           (actions_n + METER_PREFIX_ACTION)) +
                           sizeof(struct mlx5_rte_flow_action_set_tag);
                /* Suffix items: tag, vlan, port id, end. */
 #define METER_SUFFIX_ITEM 4