net/ice/base: fix flow raw field vector extraction
authorQi Zhang <qi.z.zhang@intel.com>
Tue, 8 Oct 2019 01:50:15 +0000 (09:50 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 23 Oct 2019 14:43:09 +0000 (16:43 +0200)
Correct the ordering of raw field extraction in the field vector
by taking into account the ordering setting for requesting block.

Fixes: aa1cd410fa64 ("net/ice/base: add flow module")
Cc: stable@dpdk.org
Signed-off-by: Dan Nowlin <dan.nowlin@intel.com>
Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Qiming Yang <qiming.yang@intel.com>
drivers/net/ice/base/ice_flow.c

index 370ad9b..38c7c42 100644 (file)
@@ -806,6 +806,7 @@ static enum ice_status
 ice_flow_xtract_raws(struct ice_hw *hw, struct ice_flow_prof_params *params,
                     u8 seg)
 {
+       u16 fv_words;
        u16 hdrs_sz;
        u8 i;
 
@@ -821,6 +822,8 @@ ice_flow_xtract_raws(struct ice_hw *hw, struct ice_flow_prof_params *params,
        if (!hdrs_sz)
                return ICE_ERR_PARAM;
 
+       fv_words = hw->blk[params->blk].es.fvw;
+
        for (i = 0; i < params->prof->segs[seg].raws_cnt; i++) {
                struct ice_flow_seg_fld_raw *raw;
                u16 off, cnt, j;
@@ -853,6 +856,8 @@ ice_flow_xtract_raws(struct ice_hw *hw, struct ice_flow_prof_params *params,
                                           BITS_PER_BYTE));
                off = raw->info.xtrct.off;
                for (j = 0; j < cnt; j++) {
+                       u16 idx;
+
                        /* Make sure the number of extraction sequence required
                         * does not exceed the block's capability
                         */
@@ -860,8 +865,14 @@ ice_flow_xtract_raws(struct ice_hw *hw, struct ice_flow_prof_params *params,
                            params->es_cnt >= ICE_MAX_FV_WORDS)
                                return ICE_ERR_MAX_LIMIT;
 
-                       params->es[params->es_cnt].prot_id = ICE_PROT_PAY;
-                       params->es[params->es_cnt].off = off;
+                       /* some blocks require a reversed field vector layout */
+                       if (hw->blk[params->blk].es.reverse)
+                               idx = fv_words - params->es_cnt - 1;
+                       else
+                               idx = params->es_cnt;
+
+                       params->es[idx].prot_id = ICE_PROT_PAY;
+                       params->es[idx].off = off;
                        params->es_cnt++;
                        off += ICE_FLOW_FV_EXTRACT_SZ;
                }