]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ice: Refactor FW data type and fix bitmap casting issue
authorSteven Zou <steven.zou@intel.com>
Wed, 7 Feb 2024 01:49:59 +0000 (09:49 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Apr 2024 14:35:41 +0000 (16:35 +0200)
[ Upstream commit 817b18965b58a6e5fb6ce97abf01b03a205a6aea ]

According to the datasheet, the recipe association data is an 8-byte
little-endian value. It is described as 'Bitmap of the recipe indexes
associated with this profile', it is from 24 to 31 byte area in FW.
Therefore, it is defined to '__le64 recipe_assoc' in struct
ice_aqc_recipe_to_profile. And then fix the bitmap casting issue, as we
must never ever use castings for bitmap type.

Fixes: 1e0f9881ef79 ("ice: Flesh out implementation of support for SRIOV on bonded interface")
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Reviewed-by: Andrii Staikov <andrii.staikov@intel.com>
Reviewed-by: Jan Sokolowski <jan.sokolowski@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Steven Zou <steven.zou@intel.com>
Tested-by: Sujai Buvaneswaran <sujai.buvaneswaran@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
drivers/net/ethernet/intel/ice/ice_lag.c
drivers/net/ethernet/intel/ice/ice_switch.c
drivers/net/ethernet/intel/ice/ice_switch.h

index 45f3e351653dbafd8a8f80cd7e24c23488fc08f7..72ca2199c9572308b03a04d832341abf37dc189d 100644 (file)
@@ -592,8 +592,9 @@ struct ice_aqc_recipe_data_elem {
 struct ice_aqc_recipe_to_profile {
        __le16 profile_id;
        u8 rsvd[6];
-       DECLARE_BITMAP(recipe_assoc, ICE_MAX_NUM_RECIPES);
+       __le64 recipe_assoc;
 };
+static_assert(sizeof(struct ice_aqc_recipe_to_profile) == 16);
 
 /* Add/Update/Remove/Get switch rules (indirect 0x02A0, 0x02A1, 0x02A2, 0x02A3)
  */
index 23e197c3d02a7b3a11bb522fa51391d65122fb63..4e675c7c199fa1f41b339144651250ce33759e67 100644 (file)
@@ -2000,14 +2000,14 @@ int ice_init_lag(struct ice_pf *pf)
        /* associate recipes to profiles */
        for (n = 0; n < ICE_PROFID_IPV6_GTPU_IPV6_TCP_INNER; n++) {
                err = ice_aq_get_recipe_to_profile(&pf->hw, n,
-                                                  (u8 *)&recipe_bits, NULL);
+                                                  &recipe_bits, NULL);
                if (err)
                        continue;
 
                if (recipe_bits & BIT(ICE_SW_LKUP_DFLT)) {
                        recipe_bits |= BIT(lag->pf_recipe);
                        ice_aq_map_recipe_to_profile(&pf->hw, n,
-                                                    (u8 *)&recipe_bits, NULL);
+                                                    recipe_bits, NULL);
                }
        }
 
index 2f77b684ff765dfd2b422637bcb2e1beb9878553..4c6d58bb2690d5a5304a6d41c7dc4e0e82a7c83b 100644 (file)
@@ -2032,12 +2032,12 @@ error_out:
  * ice_aq_map_recipe_to_profile - Map recipe to packet profile
  * @hw: pointer to the HW struct
  * @profile_id: package profile ID to associate the recipe with
- * @r_bitmap: Recipe bitmap filled in and need to be returned as response
+ * @r_assoc: Recipe bitmap filled in and need to be returned as response
  * @cd: pointer to command details structure or NULL
  * Recipe to profile association (0x0291)
  */
 int
-ice_aq_map_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
+ice_aq_map_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u64 r_assoc,
                             struct ice_sq_cd *cd)
 {
        struct ice_aqc_recipe_to_profile *cmd;
@@ -2049,7 +2049,7 @@ ice_aq_map_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
        /* Set the recipe ID bit in the bitmask to let the device know which
         * profile we are associating the recipe to
         */
-       memcpy(cmd->recipe_assoc, r_bitmap, sizeof(cmd->recipe_assoc));
+       cmd->recipe_assoc = cpu_to_le64(r_assoc);
 
        return ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
 }
@@ -2058,12 +2058,12 @@ ice_aq_map_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
  * ice_aq_get_recipe_to_profile - Map recipe to packet profile
  * @hw: pointer to the HW struct
  * @profile_id: package profile ID to associate the recipe with
- * @r_bitmap: Recipe bitmap filled in and need to be returned as response
+ * @r_assoc: Recipe bitmap filled in and need to be returned as response
  * @cd: pointer to command details structure or NULL
  * Associate profile ID with given recipe (0x0293)
  */
 int
-ice_aq_get_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
+ice_aq_get_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u64 *r_assoc,
                             struct ice_sq_cd *cd)
 {
        struct ice_aqc_recipe_to_profile *cmd;
@@ -2076,7 +2076,7 @@ ice_aq_get_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
 
        status = ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
        if (!status)
-               memcpy(r_bitmap, cmd->recipe_assoc, sizeof(cmd->recipe_assoc));
+               *r_assoc = le64_to_cpu(cmd->recipe_assoc);
 
        return status;
 }
@@ -2121,6 +2121,7 @@ int ice_alloc_recipe(struct ice_hw *hw, u16 *rid)
 static void ice_get_recp_to_prof_map(struct ice_hw *hw)
 {
        DECLARE_BITMAP(r_bitmap, ICE_MAX_NUM_RECIPES);
+       u64 recp_assoc;
        u16 i;
 
        for (i = 0; i < hw->switch_info->max_used_prof_index + 1; i++) {
@@ -2128,8 +2129,9 @@ static void ice_get_recp_to_prof_map(struct ice_hw *hw)
 
                bitmap_zero(profile_to_recipe[i], ICE_MAX_NUM_RECIPES);
                bitmap_zero(r_bitmap, ICE_MAX_NUM_RECIPES);
-               if (ice_aq_get_recipe_to_profile(hw, i, (u8 *)r_bitmap, NULL))
+               if (ice_aq_get_recipe_to_profile(hw, i, &recp_assoc, NULL))
                        continue;
+               bitmap_from_arr64(r_bitmap, &recp_assoc, ICE_MAX_NUM_RECIPES);
                bitmap_copy(profile_to_recipe[i], r_bitmap,
                            ICE_MAX_NUM_RECIPES);
                for_each_set_bit(j, r_bitmap, ICE_MAX_NUM_RECIPES)
@@ -5431,22 +5433,24 @@ ice_add_adv_recipe(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
         */
        list_for_each_entry(fvit, &rm->fv_list, list_entry) {
                DECLARE_BITMAP(r_bitmap, ICE_MAX_NUM_RECIPES);
+               u64 recp_assoc;
                u16 j;
 
                status = ice_aq_get_recipe_to_profile(hw, fvit->profile_id,
-                                                     (u8 *)r_bitmap, NULL);
+                                                     &recp_assoc, NULL);
                if (status)
                        goto err_unroll;
 
+               bitmap_from_arr64(r_bitmap, &recp_assoc, ICE_MAX_NUM_RECIPES);
                bitmap_or(r_bitmap, r_bitmap, rm->r_bitmap,
                          ICE_MAX_NUM_RECIPES);
                status = ice_acquire_change_lock(hw, ICE_RES_WRITE);
                if (status)
                        goto err_unroll;
 
+               bitmap_to_arr64(&recp_assoc, r_bitmap, ICE_MAX_NUM_RECIPES);
                status = ice_aq_map_recipe_to_profile(hw, fvit->profile_id,
-                                                     (u8 *)r_bitmap,
-                                                     NULL);
+                                                     recp_assoc, NULL);
                ice_release_change_lock(hw);
 
                if (status)
index db7e501b7e0a486fa046fc2f1afdba2e9350c113..89ffa1b51b5ad111ae6dc73ec64c8a78c38899b1 100644 (file)
@@ -424,10 +424,10 @@ int ice_aq_add_recipe(struct ice_hw *hw,
                      struct ice_aqc_recipe_data_elem *s_recipe_list,
                      u16 num_recipes, struct ice_sq_cd *cd);
 int
-ice_aq_get_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
+ice_aq_get_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u64 *r_assoc,
                             struct ice_sq_cd *cd);
 int
-ice_aq_map_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u8 *r_bitmap,
+ice_aq_map_recipe_to_profile(struct ice_hw *hw, u32 profile_id, u64 r_assoc,
                             struct ice_sq_cd *cd);
 
 #endif /* _ICE_SWITCH_H_ */