Message ID | 20240318143058.287014-7-ivecera@redhat.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | i40e: cleanups & refactors | expand |
> -----Original Message----- > From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On > Behalf Of Ivan Vecera > Sent: Monday, March 18, 2024 3:31 PM > To: intel-wired-lan@lists.osuosl.org > Cc: open list:NETWORKING DRIVERS <netdev@vger.kernel.org>; open > list <linux-kernel@vger.kernel.org>; Eric Dumazet > <edumazet@google.com>; Nguyen, Anthony L > <anthony.l.nguyen@intel.com>; Jakub Kicinski <kuba@kernel.org>; > Paolo Abeni <pabeni@redhat.com>; David S. Miller > <davem@davemloft.net> > Subject: [Intel-wired-lan] [PATCH iwl-next 6/7] i40e: Add helper to > access main VEB > > Add a helper to access main VEB: > > i40e_pf_get_main_veb(pf) replaces 'pf->veb[pf->lan_veb]' > > Signed-off-by: Ivan Vecera <ivecera@redhat.com> Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> > --- > drivers/net/ethernet/intel/i40e/i40e.h | 11 ++++++++ > .../net/ethernet/intel/i40e/i40e_ethtool.c | 9 +++---- > drivers/net/ethernet/intel/i40e/i40e_main.c | 27 ++++++++++++--- > ---- > 3 files changed, 31 insertions(+), 16 deletions(-) > > diff --git a/drivers/net/ethernet/intel/i40e/i40e.h > b/drivers/net/ethernet/intel/i40e/i40e.h > index fb0b913692e1..2f135db416cf 100644 > --- a/drivers/net/ethernet/intel/i40e/i40e.h > +++ b/drivers/net/ethernet/intel/i40e/i40e.h > @@ -1401,4 +1401,15 @@ i40e_pf_get_veb_by_seid(struct i40e_pf *pf, > u16 seid) > return NULL; > } > > +/** > + * i40e_pf_get_main_veb - get pointer to main VEB > + * @pf: pointer to a PF > + * > + * Return pointer to main VEB or NULL if it does not exist **/ > static > +inline struct i40e_veb *i40e_pf_get_main_veb(struct i40e_pf *pf) { > + return (pf->lan_veb != I40E_NO_VEB) ? pf->veb[pf->lan_veb] : > NULL; } > + > #endif /* _I40E_H_ */ > diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c > b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c > index 5cd0d1b45f01..4e28785c9fb2 100644 > --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c > +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c > @@ -2425,14 +2425,11 @@ static void i40e_get_ethtool_stats(struct > net_device *netdev, > if (vsi->type != I40E_VSI_MAIN || pf->hw.partition_id != 1) > goto check_data_pointer; > > - veb_stats = ((pf->lan_veb != I40E_NO_VEB) && > - (pf->lan_veb < I40E_MAX_VEB) && > - test_bit(I40E_FLAG_VEB_STATS_ENA, pf->flags)); > + veb = i40e_pf_get_main_veb(pf); > + veb_stats = veb && test_bit(I40E_FLAG_VEB_STATS_ENA, pf- > >flags); > > - if (veb_stats) { > - veb = pf->veb[pf->lan_veb]; > + if (veb_stats) > i40e_update_veb_stats(veb); > - } > > /* If veb stats aren't enabled, pass NULL instead of the veb > so that > * we initialize stats to zero and update the data pointer > diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c > b/drivers/net/ethernet/intel/i40e/i40e_main.c > index d6dbd0fd79eb..2e1955064abb 100644 > --- a/drivers/net/ethernet/intel/i40e/i40e_main.c > +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c > @@ -2480,7 +2480,7 @@ static int i40e_set_promiscuous(struct > i40e_pf *pf, bool promisc) > int aq_ret; > > if (vsi->type == I40E_VSI_MAIN && > - pf->lan_veb != I40E_NO_VEB && > + i40e_pf_get_main_veb(pf) && > !test_bit(I40E_FLAG_MFP_ENA, pf->flags)) { > /* set defport ON for Main VSI instead of true promisc > * this way we will get all unicast/multicast and VLAN > @@ -9916,6 +9916,7 @@ static void i40e_veb_link_event(struct > i40e_veb *veb, bool link_up) static void i40e_link_event(struct > i40e_pf *pf) { > struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf); > + struct i40e_veb *veb = i40e_pf_get_main_veb(pf); > u8 new_link_speed, old_link_speed; > bool new_link, old_link; > int status; > @@ -9955,8 +9956,8 @@ static void i40e_link_event(struct i40e_pf > *pf) > /* Notify the base of the switch tree connected to > * the link. Floating VEBs are not notified. > */ > - if (pf->lan_veb < I40E_MAX_VEB && pf->veb[pf->lan_veb]) > - i40e_veb_link_event(pf->veb[pf->lan_veb], new_link); > + if (veb) > + i40e_veb_link_event(veb, new_link); > else > i40e_vsi_link_event(vsi, new_link); > > @@ -14892,7 +14893,8 @@ static void > i40e_setup_pf_switch_element(struct i40e_pf *pf, > /* Main VEB? */ > if (uplink_seid != pf->mac_seid) > break; > - if (pf->lan_veb >= I40E_MAX_VEB) { > + veb = i40e_pf_get_main_veb(pf); > + if (!veb) { > int v; > > /* find existing or else empty VEB */ @@ - > 14906,12 +14908,15 @@ static void > i40e_setup_pf_switch_element(struct i40e_pf *pf, > pf->lan_veb = v; > } > } > - if (pf->lan_veb >= I40E_MAX_VEB) > + > + /* Try to get again main VEB as pf->lan_veb may have > changed */ > + veb = i40e_pf_get_main_veb(pf); > + if (!veb) > break; > > - pf->veb[pf->lan_veb]->seid = seid; > - pf->veb[pf->lan_veb]->uplink_seid = pf->mac_seid; > - pf->veb[pf->lan_veb]->pf = pf; > + veb->seid = seid; > + veb->uplink_seid = pf->mac_seid; > + veb->pf = pf; > break; > case I40E_SWITCH_ELEMENT_TYPE_VSI: > if (num_reported != 1) > @@ -15056,13 +15061,15 @@ static int i40e_setup_pf_switch(struct > i40e_pf *pf, bool reinit, bool lock_acqui > /* first time setup */ > main_vsi = i40e_pf_get_main_vsi(pf); > if (!main_vsi || reinit) { > + struct i40e_veb *veb; > u16 uplink_seid; > > /* Set up the PF VSI associated with the PF's main VSI > * that is already in the HW switch > */ > - if (pf->lan_veb < I40E_MAX_VEB && pf->veb[pf->lan_veb]) > - uplink_seid = pf->veb[pf->lan_veb]->seid; > + veb = i40e_pf_get_main_veb(pf); > + if (veb) > + uplink_seid = veb->seid; > else > uplink_seid = pf->mac_seid; > if (!main_vsi) > -- > 2.43.0
diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h index fb0b913692e1..2f135db416cf 100644 --- a/drivers/net/ethernet/intel/i40e/i40e.h +++ b/drivers/net/ethernet/intel/i40e/i40e.h @@ -1401,4 +1401,15 @@ i40e_pf_get_veb_by_seid(struct i40e_pf *pf, u16 seid) return NULL; } +/** + * i40e_pf_get_main_veb - get pointer to main VEB + * @pf: pointer to a PF + * + * Return pointer to main VEB or NULL if it does not exist + **/ +static inline struct i40e_veb *i40e_pf_get_main_veb(struct i40e_pf *pf) +{ + return (pf->lan_veb != I40E_NO_VEB) ? pf->veb[pf->lan_veb] : NULL; +} + #endif /* _I40E_H_ */ diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c index 5cd0d1b45f01..4e28785c9fb2 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c @@ -2425,14 +2425,11 @@ static void i40e_get_ethtool_stats(struct net_device *netdev, if (vsi->type != I40E_VSI_MAIN || pf->hw.partition_id != 1) goto check_data_pointer; - veb_stats = ((pf->lan_veb != I40E_NO_VEB) && - (pf->lan_veb < I40E_MAX_VEB) && - test_bit(I40E_FLAG_VEB_STATS_ENA, pf->flags)); + veb = i40e_pf_get_main_veb(pf); + veb_stats = veb && test_bit(I40E_FLAG_VEB_STATS_ENA, pf->flags); - if (veb_stats) { - veb = pf->veb[pf->lan_veb]; + if (veb_stats) i40e_update_veb_stats(veb); - } /* If veb stats aren't enabled, pass NULL instead of the veb so that * we initialize stats to zero and update the data pointer diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index d6dbd0fd79eb..2e1955064abb 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -2480,7 +2480,7 @@ static int i40e_set_promiscuous(struct i40e_pf *pf, bool promisc) int aq_ret; if (vsi->type == I40E_VSI_MAIN && - pf->lan_veb != I40E_NO_VEB && + i40e_pf_get_main_veb(pf) && !test_bit(I40E_FLAG_MFP_ENA, pf->flags)) { /* set defport ON for Main VSI instead of true promisc * this way we will get all unicast/multicast and VLAN @@ -9916,6 +9916,7 @@ static void i40e_veb_link_event(struct i40e_veb *veb, bool link_up) static void i40e_link_event(struct i40e_pf *pf) { struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf); + struct i40e_veb *veb = i40e_pf_get_main_veb(pf); u8 new_link_speed, old_link_speed; bool new_link, old_link; int status; @@ -9955,8 +9956,8 @@ static void i40e_link_event(struct i40e_pf *pf) /* Notify the base of the switch tree connected to * the link. Floating VEBs are not notified. */ - if (pf->lan_veb < I40E_MAX_VEB && pf->veb[pf->lan_veb]) - i40e_veb_link_event(pf->veb[pf->lan_veb], new_link); + if (veb) + i40e_veb_link_event(veb, new_link); else i40e_vsi_link_event(vsi, new_link); @@ -14892,7 +14893,8 @@ static void i40e_setup_pf_switch_element(struct i40e_pf *pf, /* Main VEB? */ if (uplink_seid != pf->mac_seid) break; - if (pf->lan_veb >= I40E_MAX_VEB) { + veb = i40e_pf_get_main_veb(pf); + if (!veb) { int v; /* find existing or else empty VEB */ @@ -14906,12 +14908,15 @@ static void i40e_setup_pf_switch_element(struct i40e_pf *pf, pf->lan_veb = v; } } - if (pf->lan_veb >= I40E_MAX_VEB) + + /* Try to get again main VEB as pf->lan_veb may have changed */ + veb = i40e_pf_get_main_veb(pf); + if (!veb) break; - pf->veb[pf->lan_veb]->seid = seid; - pf->veb[pf->lan_veb]->uplink_seid = pf->mac_seid; - pf->veb[pf->lan_veb]->pf = pf; + veb->seid = seid; + veb->uplink_seid = pf->mac_seid; + veb->pf = pf; break; case I40E_SWITCH_ELEMENT_TYPE_VSI: if (num_reported != 1) @@ -15056,13 +15061,15 @@ static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit, bool lock_acqui /* first time setup */ main_vsi = i40e_pf_get_main_vsi(pf); if (!main_vsi || reinit) { + struct i40e_veb *veb; u16 uplink_seid; /* Set up the PF VSI associated with the PF's main VSI * that is already in the HW switch */ - if (pf->lan_veb < I40E_MAX_VEB && pf->veb[pf->lan_veb]) - uplink_seid = pf->veb[pf->lan_veb]->seid; + veb = i40e_pf_get_main_veb(pf); + if (veb) + uplink_seid = veb->seid; else uplink_seid = pf->mac_seid; if (!main_vsi)
Add a helper to access main VEB: i40e_pf_get_main_veb(pf) replaces 'pf->veb[pf->lan_veb]' Signed-off-by: Ivan Vecera <ivecera@redhat.com> --- drivers/net/ethernet/intel/i40e/i40e.h | 11 ++++++++ .../net/ethernet/intel/i40e/i40e_ethtool.c | 9 +++---- drivers/net/ethernet/intel/i40e/i40e_main.c | 27 ++++++++++++------- 3 files changed, 31 insertions(+), 16 deletions(-)