diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_lib.c')
-rw-r--r-- | drivers/net/ethernet/intel/ice/ice_lib.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c index 7a88bf639376..fbf1eba0cc2a 100644 --- a/drivers/net/ethernet/intel/ice/ice_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_lib.c | |||
@@ -2251,6 +2251,46 @@ clear_reg_idx: | |||
2251 | } | 2251 | } |
2252 | 2252 | ||
2253 | /** | 2253 | /** |
2254 | * ice_vsi_add_rem_eth_mac - Program VSI ethertype based filter with rule | ||
2255 | * @vsi: the VSI being configured | ||
2256 | * @add_rule: boolean value to add or remove ethertype filter rule | ||
2257 | */ | ||
2258 | static void | ||
2259 | ice_vsi_add_rem_eth_mac(struct ice_vsi *vsi, bool add_rule) | ||
2260 | { | ||
2261 | struct ice_fltr_list_entry *list; | ||
2262 | struct ice_pf *pf = vsi->back; | ||
2263 | LIST_HEAD(tmp_add_list); | ||
2264 | enum ice_status status; | ||
2265 | |||
2266 | list = devm_kzalloc(&pf->pdev->dev, sizeof(*list), GFP_KERNEL); | ||
2267 | if (!list) | ||
2268 | return; | ||
2269 | |||
2270 | list->fltr_info.lkup_type = ICE_SW_LKUP_ETHERTYPE; | ||
2271 | list->fltr_info.fltr_act = ICE_DROP_PACKET; | ||
2272 | list->fltr_info.flag = ICE_FLTR_TX; | ||
2273 | list->fltr_info.src_id = ICE_SRC_ID_VSI; | ||
2274 | list->fltr_info.vsi_handle = vsi->idx; | ||
2275 | list->fltr_info.l_data.ethertype_mac.ethertype = vsi->ethtype; | ||
2276 | |||
2277 | INIT_LIST_HEAD(&list->list_entry); | ||
2278 | list_add(&list->list_entry, &tmp_add_list); | ||
2279 | |||
2280 | if (add_rule) | ||
2281 | status = ice_add_eth_mac(&pf->hw, &tmp_add_list); | ||
2282 | else | ||
2283 | status = ice_remove_eth_mac(&pf->hw, &tmp_add_list); | ||
2284 | |||
2285 | if (status) | ||
2286 | dev_err(&pf->pdev->dev, | ||
2287 | "Failure Adding or Removing Ethertype on VSI %i error: %d\n", | ||
2288 | vsi->vsi_num, status); | ||
2289 | |||
2290 | ice_free_fltr_list(&pf->pdev->dev, &tmp_add_list); | ||
2291 | } | ||
2292 | |||
2293 | /** | ||
2254 | * ice_vsi_setup - Set up a VSI by a given type | 2294 | * ice_vsi_setup - Set up a VSI by a given type |
2255 | * @pf: board private structure | 2295 | * @pf: board private structure |
2256 | * @pi: pointer to the port_info instance | 2296 | * @pi: pointer to the port_info instance |
@@ -2285,6 +2325,9 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi, | |||
2285 | 2325 | ||
2286 | vsi->port_info = pi; | 2326 | vsi->port_info = pi; |
2287 | vsi->vsw = pf->first_sw; | 2327 | vsi->vsw = pf->first_sw; |
2328 | if (vsi->type == ICE_VSI_PF) | ||
2329 | vsi->ethtype = ETH_P_PAUSE; | ||
2330 | |||
2288 | if (vsi->type == ICE_VSI_VF) | 2331 | if (vsi->type == ICE_VSI_VF) |
2289 | vsi->vf_id = vf_id; | 2332 | vsi->vf_id = vf_id; |
2290 | 2333 | ||
@@ -2382,6 +2425,15 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi, | |||
2382 | goto unroll_vector_base; | 2425 | goto unroll_vector_base; |
2383 | } | 2426 | } |
2384 | 2427 | ||
2428 | /* Add switch rule to drop all Tx Flow Control Frames, of look up | ||
2429 | * type ETHERTYPE from VSIs, and restrict malicious VF from sending | ||
2430 | * out PAUSE or PFC frames. If enabled, FW can still send FC frames. | ||
2431 | * The rule is added once for PF VSI in order to create appropriate | ||
2432 | * recipe, since VSI/VSI list is ignored with drop action... | ||
2433 | */ | ||
2434 | if (vsi->type == ICE_VSI_PF) | ||
2435 | ice_vsi_add_rem_eth_mac(vsi, true); | ||
2436 | |||
2385 | return vsi; | 2437 | return vsi; |
2386 | 2438 | ||
2387 | unroll_vector_base: | 2439 | unroll_vector_base: |
@@ -2740,6 +2792,9 @@ int ice_vsi_release(struct ice_vsi *vsi) | |||
2740 | pf->num_avail_hw_msix += pf->num_vf_msix; | 2792 | pf->num_avail_hw_msix += pf->num_vf_msix; |
2741 | } | 2793 | } |
2742 | 2794 | ||
2795 | if (vsi->type == ICE_VSI_PF) | ||
2796 | ice_vsi_add_rem_eth_mac(vsi, false); | ||
2797 | |||
2743 | ice_remove_vsi_fltr(&pf->hw, vsi->idx); | 2798 | ice_remove_vsi_fltr(&pf->hw, vsi->idx); |
2744 | ice_rm_vsi_lan_cfg(vsi->port_info, vsi->idx); | 2799 | ice_rm_vsi_lan_cfg(vsi->port_info, vsi->idx); |
2745 | ice_vsi_delete(vsi); | 2800 | ice_vsi_delete(vsi); |