mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 08:31:55 +00:00
ice: Refactor FW data type and fix bitmap casting issue
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: 1e0f9881ef
("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>
This commit is contained in:
parent
c2deb2e971
commit
817b18965b
@ -593,8 +593,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)
|
||||
*/
|
||||
|
@ -2041,7 +2041,7 @@ 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;
|
||||
|
||||
@ -2049,7 +2049,7 @@ int ice_init_lag(struct ice_pf *pf)
|
||||
recipe_bits |= BIT(lag->pf_recipe) |
|
||||
BIT(lag->lport_recipe);
|
||||
ice_aq_map_recipe_to_profile(&pf->hw, n,
|
||||
(u8 *)&recipe_bits, NULL);
|
||||
recipe_bits, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2025,12 +2025,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;
|
||||
@ -2042,7 +2042,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);
|
||||
}
|
||||
@ -2051,12 +2051,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;
|
||||
@ -2069,7 +2069,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;
|
||||
}
|
||||
@ -2108,6 +2108,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++) {
|
||||
@ -2115,8 +2116,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)
|
||||
@ -5390,22 +5392,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)
|
||||
|
@ -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_ */
|
||||
|
Loading…
Reference in New Issue
Block a user