net/ice/base: fix minor issues
[dpdk.git] / drivers / net / ice / base / ice_flow.c
index 574c927..98727cf 100644 (file)
@@ -910,8 +910,11 @@ ice_flow_rem_entry_sync(struct ice_hw *hw, struct ice_flow_entry *entry)
        if (entry->entry)
                ice_free(hw, entry->entry);
 
-       if (entry->acts)
+       if (entry->acts) {
                ice_free(hw, entry->acts);
+               entry->acts = NULL;
+               entry->acts_cnt = 0;
+       }
 
        ice_free(hw, entry);
 
@@ -1306,6 +1309,7 @@ ice_flow_add_entry(struct ice_hw *hw, enum ice_block blk, u64 prof_id,
        e->id = entry_id;
        e->vsi_handle = vsi_handle;
        e->prof = prof;
+       e->priority = prio;
 
        switch (blk) {
        case ICE_BLK_RSS:
@@ -1554,142 +1558,6 @@ ice_flow_set_rss_seg_info(struct ice_flow_seg_info *segs, u64 hash_fields,
        return ICE_SUCCESS;
 }
 
-/* Mapping of AVF hash bit fields to an L3-L4 hash combination.
- * As the ice_flow_avf_hdr_field represent individual bit shifts in a hash,
- * convert its values to their appropriate flow L3, L4 values.
- */
-#define ICE_FLOW_AVF_RSS_IPV4_MASKS \
-       (BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_OTHER) | \
-        BIT_ULL(ICE_AVF_FLOW_FIELD_FRAG_IPV4))
-#define ICE_FLOW_AVF_RSS_TCP_IPV4_MASKS \
-       (BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_TCP_SYN_NO_ACK) | \
-        BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_TCP))
-#define ICE_FLOW_AVF_RSS_UDP_IPV4_MASKS \
-       (BIT_ULL(ICE_AVF_FLOW_FIELD_UNICAST_IPV4_UDP) | \
-        BIT_ULL(ICE_AVF_FLOW_FIELD_MULTICAST_IPV4_UDP) | \
-        BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_UDP))
-#define ICE_FLOW_AVF_RSS_ALL_IPV4_MASKS \
-       (ICE_FLOW_AVF_RSS_TCP_IPV4_MASKS | ICE_FLOW_AVF_RSS_UDP_IPV4_MASKS | \
-        ICE_FLOW_AVF_RSS_IPV4_MASKS | BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_SCTP))
-
-#define ICE_FLOW_AVF_RSS_IPV6_MASKS \
-       (BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_OTHER) | \
-        BIT_ULL(ICE_AVF_FLOW_FIELD_FRAG_IPV6))
-#define ICE_FLOW_AVF_RSS_UDP_IPV6_MASKS \
-       (BIT_ULL(ICE_AVF_FLOW_FIELD_UNICAST_IPV6_UDP) | \
-        BIT_ULL(ICE_AVF_FLOW_FIELD_MULTICAST_IPV6_UDP) | \
-        BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_UDP))
-#define ICE_FLOW_AVF_RSS_TCP_IPV6_MASKS \
-       (BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_TCP_SYN_NO_ACK) | \
-        BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_TCP))
-#define ICE_FLOW_AVF_RSS_ALL_IPV6_MASKS \
-       (ICE_FLOW_AVF_RSS_TCP_IPV6_MASKS | ICE_FLOW_AVF_RSS_UDP_IPV6_MASKS | \
-        ICE_FLOW_AVF_RSS_IPV6_MASKS | BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_SCTP))
-
-#define ICE_FLOW_MAX_CFG       10
-
-/**
- * ice_add_avf_rss_cfg - add an RSS configuration for AVF driver
- * @hw: pointer to the hardware structure
- * @vsi_handle: software VSI handle
- * @avf_hash: hash bit fields (ICE_AVF_FLOW_FIELD_*) to configure
- *
- * This function will take the hash bitmap provided by the AVF driver via a
- * message, convert it to ICE-compatible values, and configure RSS flow
- * profiles.
- */
-enum ice_status
-ice_add_avf_rss_cfg(struct ice_hw *hw, u16 vsi_handle, u64 avf_hash)
-{
-       u64 added_cfg[ICE_FLOW_MAX_CFG], hash_flds;
-       enum ice_status status = ICE_SUCCESS;
-       u8 i, idx = 0;
-
-       if (avf_hash == ICE_AVF_FLOW_FIELD_INVALID ||
-           !ice_is_vsi_valid(hw, vsi_handle))
-               return ICE_ERR_PARAM;
-
-       /* Make sure no unsupported bits are specified */
-       if (avf_hash & ~(ICE_FLOW_AVF_RSS_ALL_IPV4_MASKS |
-                        ICE_FLOW_AVF_RSS_ALL_IPV6_MASKS))
-               return ICE_ERR_CFG;
-
-       hash_flds = avf_hash;
-
-       /* Always create an L3 RSS configuration for any L4 RSS configuration */
-       if (hash_flds & ICE_FLOW_AVF_RSS_ALL_IPV4_MASKS)
-               hash_flds |= ICE_FLOW_AVF_RSS_IPV4_MASKS;
-
-       if (hash_flds & ICE_FLOW_AVF_RSS_ALL_IPV6_MASKS)
-               hash_flds |= ICE_FLOW_AVF_RSS_IPV6_MASKS;
-
-       /* Create the corresponding RSS configuration for each valid hash bit */
-       while (hash_flds) {
-               u64 rss_hash = ICE_HASH_INVALID;
-
-               if (hash_flds & ICE_FLOW_AVF_RSS_ALL_IPV4_MASKS) {
-                       if (hash_flds & ICE_FLOW_AVF_RSS_TCP_IPV4_MASKS) {
-                               rss_hash = ICE_FLOW_HASH_IPV4 |
-                                       ICE_FLOW_HASH_TCP_PORT;
-                               hash_flds &= ~ICE_FLOW_AVF_RSS_TCP_IPV4_MASKS;
-                       } else if (hash_flds &
-                                  ICE_FLOW_AVF_RSS_UDP_IPV4_MASKS) {
-                               rss_hash = ICE_FLOW_HASH_IPV4 |
-                                       ICE_FLOW_HASH_UDP_PORT;
-                               hash_flds &= ~ICE_FLOW_AVF_RSS_UDP_IPV4_MASKS;
-                       } else if (hash_flds &
-                                  BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_SCTP)) {
-                               rss_hash = ICE_FLOW_HASH_IPV4 |
-                                       ICE_FLOW_HASH_SCTP_PORT;
-                               hash_flds &=
-                                       ~BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_SCTP);
-                       } else if (hash_flds & ICE_FLOW_AVF_RSS_IPV4_MASKS) {
-                               rss_hash = ICE_FLOW_HASH_IPV4;
-                               hash_flds &= ~ICE_FLOW_AVF_RSS_IPV4_MASKS;
-                       }
-               } else if (hash_flds & ICE_FLOW_AVF_RSS_ALL_IPV6_MASKS) {
-                       if (hash_flds & ICE_FLOW_AVF_RSS_TCP_IPV6_MASKS) {
-                               rss_hash = ICE_FLOW_HASH_IPV6 |
-                                       ICE_FLOW_HASH_TCP_PORT;
-                               hash_flds &= ~ICE_FLOW_AVF_RSS_TCP_IPV6_MASKS;
-                       } else if (hash_flds &
-                                  ICE_FLOW_AVF_RSS_UDP_IPV6_MASKS) {
-                               rss_hash = ICE_FLOW_HASH_IPV6 |
-                                       ICE_FLOW_HASH_UDP_PORT;
-                               hash_flds &= ~ICE_FLOW_AVF_RSS_UDP_IPV6_MASKS;
-                       } else if (hash_flds &
-                                  BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_SCTP)) {
-                               rss_hash = ICE_FLOW_HASH_IPV6 |
-                                       ICE_FLOW_HASH_SCTP_PORT;
-                               hash_flds &=
-                                       ~BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_SCTP);
-                       } else if (hash_flds & ICE_FLOW_AVF_RSS_IPV6_MASKS) {
-                               rss_hash = ICE_FLOW_HASH_IPV6;
-                               hash_flds &= ~ICE_FLOW_AVF_RSS_IPV6_MASKS;
-                       }
-               }
-
-               if (rss_hash == ICE_HASH_INVALID)
-                       return ICE_ERR_OUT_OF_RANGE;
-
-               status = ice_add_rss_cfg(hw, vsi_handle, rss_hash,
-                                        ICE_FLOW_SEG_HDR_NONE);
-               if (status)
-                       break;
-               added_cfg[idx++] = rss_hash;
-       }
-
-       /* If status is not success, we must remove all hash configurations
-        * that were successfully added previously in this call for the vsi
-        */
-       if (status)
-               for (i = 0; i < idx; i++)
-                       ice_rem_rss_cfg(hw, vsi_handle, added_cfg[i],
-                                       ICE_FLOW_SEG_HDR_NONE);
-
-       return status;
-}
-
 /**
  * ice_rem_all_rss_vsi_ctx - remove all RSS configurations from VSI context
  * @hw: pointer to the hardware structure
@@ -1808,7 +1676,8 @@ ice_add_rss_vsi_ctx(struct ice_hw *hw, u16 vsi_handle,
 
        rss_cfg->hashed_flds = prof->segs[prof->segs_cnt - 1].match;
        rss_cfg->packet_hdr = prof->segs[prof->segs_cnt - 1].hdrs;
-       LIST_ADD(&rss_cfg->l_entry, &hw->vsi_ctx[vsi_handle]->rss_list_head);
+       LIST_ADD_TAIL(&rss_cfg->l_entry,
+                     &hw->vsi_ctx[vsi_handle]->rss_list_head);
 
        return ICE_SUCCESS;
 }
@@ -1987,11 +1856,14 @@ ice_rem_rss_cfg_sync(struct ice_hw *hw, u16 vsi_handle, u64 hashed_flds,
        if (status)
                goto out;
 
+       /* Remove RSS configuration from VSI context before deleting
+        * the flow profile.
+        */
+       ice_rem_rss_cfg_vsi_ctx(hw, vsi_handle, prof);
+
        if (!ice_is_any_bit_set(prof->vsis, ICE_MAX_VSI))
                status = ice_flow_rem_prof_sync(hw, blk, prof);
 
-       ice_rem_rss_cfg_vsi_ctx(hw, vsi_handle, prof);
-
 out:
        ice_free(hw, segs);
        return status;