net/enic: fix L4 Rx ptype comparison
[dpdk.git] / drivers / net / i40e / i40e_fdir.c
index e471b5a..906c204 100644 (file)
@@ -505,7 +505,7 @@ i40e_set_flx_pld_cfg(struct i40e_pf *pf,
 {
        struct i40e_hw *hw = I40E_PF_TO_HW(pf);
        struct i40e_fdir_flex_pit flex_pit[I40E_MAX_FLXPLD_FIED];
-       uint32_t flx_pit;
+       uint32_t flx_pit, flx_ort;
        uint16_t num, min_next_off;  /* in words */
        uint8_t field_idx = 0;
        uint8_t layer_idx = 0;
@@ -519,9 +519,17 @@ i40e_set_flx_pld_cfg(struct i40e_pf *pf,
                layer_idx = I40E_FLXPLD_L4_IDX;
 
        memset(flex_pit, 0, sizeof(flex_pit));
-       num = i40e_srcoff_to_flx_pit(cfg->src_offset, flex_pit);
+       num = RTE_MIN(i40e_srcoff_to_flx_pit(cfg->src_offset, flex_pit),
+                     RTE_DIM(flex_pit));
 
-       for (i = 0; i < RTE_MIN(num, RTE_DIM(flex_pit)); i++) {
+       if (num) {
+               flx_ort = (1 << I40E_GLQF_ORT_FLX_PAYLOAD_SHIFT) |
+                         (num << I40E_GLQF_ORT_FIELD_CNT_SHIFT) |
+                         (layer_idx * I40E_MAX_FLXPLD_FIED);
+               I40E_WRITE_REG(hw, I40E_GLQF_ORT(33 + layer_idx), flx_ort);
+       }
+
+       for (i = 0; i < num; i++) {
                field_idx = layer_idx * I40E_MAX_FLXPLD_FIED + i;
                /* record the info in fdir structure */
                pf->fdir.flex_set[field_idx].src_offset =