Message ID | 20230208142519.31192-5-alejandro.lucero-palau@amd.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | sfc: devlink support for ef100 | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Clearly marked for net-next |
netdev/fixes_present | success | Fixes tag not required for -next series |
netdev/subject_prefix | success | Link |
netdev/cover_letter | success | Series has a cover letter |
netdev/patch_count | success | Link |
netdev/header_inline | success | No static functions without inline keyword in header files |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/cc_maintainers | success | CCed 7 of 7 maintainers |
netdev/build_clang | success | Errors and warnings before: 0 this patch: 0 |
netdev/module_param | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Signed-off-by tag matches author and committer |
netdev/check_selftest | success | No net selftest shell script |
netdev/verify_fixes | success | No Fixes tag |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 76 lines checked |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/source_inline | success | Was 0 now: 0 |
On Wed, Feb 08, 2023 at 02:25:15PM +0000, alejandro.lucero-palau@amd.com wrote: > From: Alejandro Lucero <alejandro.lucero-palau@amd.com> > > Obtaining mport id is based on asking the firmware about it. This is > still needed for mport initialization itself, but once the mport data is > now kept by the driver, further mport id request can be satisfied > internally without firmware interaction. > > Previous function is just modified in name making clear the firmware > interaction. The new function uses the old name and looks for the data > in the mport data structure. > > Signed-off-by: Alejandro Lucero <alejandro.lucero-palau@amd.com> Acked-by: Martin Habets <habetsm.xilinx@gmail.com> > --- > drivers/net/ethernet/sfc/ef100_nic.c | 4 ++-- > drivers/net/ethernet/sfc/ef100_rep.c | 5 +---- > drivers/net/ethernet/sfc/mae.c | 27 ++++++++++++++++++++++++++- > drivers/net/ethernet/sfc/mae.h | 2 ++ > 4 files changed, 31 insertions(+), 7 deletions(-) > > diff --git a/drivers/net/ethernet/sfc/ef100_nic.c b/drivers/net/ethernet/sfc/ef100_nic.c > index 07e7dca0e4f2..aa11f0925e27 100644 > --- a/drivers/net/ethernet/sfc/ef100_nic.c > +++ b/drivers/net/ethernet/sfc/ef100_nic.c > @@ -736,7 +736,7 @@ static int efx_ef100_get_base_mport(struct efx_nic *efx) > /* Construct mport selector for "physical network port" */ > efx_mae_mport_wire(efx, &selector); > /* Look up actual mport ID */ > - rc = efx_mae_lookup_mport(efx, selector, &id); > + rc = efx_mae_fw_lookup_mport(efx, selector, &id); > if (rc) > return rc; > /* The ID should always fit in 16 bits, because that's how wide the > @@ -751,7 +751,7 @@ static int efx_ef100_get_base_mport(struct efx_nic *efx) > /* Construct mport selector for "calling PF" */ > efx_mae_mport_uplink(efx, &selector); > /* Look up actual mport ID */ > - rc = efx_mae_lookup_mport(efx, selector, &id); > + rc = efx_mae_fw_lookup_mport(efx, selector, &id); > if (rc) > return rc; > if (id >> 16) > diff --git a/drivers/net/ethernet/sfc/ef100_rep.c b/drivers/net/ethernet/sfc/ef100_rep.c > index ebe7b1275713..9cd1a3ac67e0 100644 > --- a/drivers/net/ethernet/sfc/ef100_rep.c > +++ b/drivers/net/ethernet/sfc/ef100_rep.c > @@ -243,14 +243,11 @@ static struct efx_rep *efx_ef100_rep_create_netdev(struct efx_nic *efx, > static int efx_ef100_configure_rep(struct efx_rep *efv) > { > struct efx_nic *efx = efv->parent; > - u32 selector; > int rc; > > efv->rx_pring_size = EFX_REP_DEFAULT_PSEUDO_RING_SIZE; > - /* Construct mport selector for corresponding VF */ > - efx_mae_mport_vf(efx, efv->idx, &selector); > /* Look up actual mport ID */ > - rc = efx_mae_lookup_mport(efx, selector, &efv->mport); > + rc = efx_mae_lookup_mport(efx, efv->idx, &efv->mport); > if (rc) > return rc; > pci_dbg(efx->pci_dev, "VF %u has mport ID %#x\n", efv->idx, efv->mport); > diff --git a/drivers/net/ethernet/sfc/mae.c b/drivers/net/ethernet/sfc/mae.c > index 725a3ab31087..6321fd393fc3 100644 > --- a/drivers/net/ethernet/sfc/mae.c > +++ b/drivers/net/ethernet/sfc/mae.c > @@ -97,7 +97,7 @@ void efx_mae_mport_mport(struct efx_nic *efx __always_unused, u32 mport_id, u32 > } > > /* id is really only 24 bits wide */ > -int efx_mae_lookup_mport(struct efx_nic *efx, u32 selector, u32 *id) > +int efx_mae_fw_lookup_mport(struct efx_nic *efx, u32 selector, u32 *id) > { > MCDI_DECLARE_BUF(outbuf, MC_CMD_MAE_MPORT_LOOKUP_OUT_LEN); > MCDI_DECLARE_BUF(inbuf, MC_CMD_MAE_MPORT_LOOKUP_IN_LEN); > @@ -488,6 +488,31 @@ int efx_mae_free_counter(struct efx_nic *efx, struct efx_tc_counter *cnt) > return 0; > } > > +int efx_mae_lookup_mport(struct efx_nic *efx, u32 vf_idx, u32 *id) > +{ > + struct ef100_nic_data *nic_data = efx->nic_data; > + struct efx_mae *mae = efx->mae; > + struct rhashtable_iter walk; > + struct mae_mport_desc *m; > + int rc = -ENOENT; > + > + rhashtable_walk_enter(&mae->mports_ht, &walk); > + rhashtable_walk_start(&walk); > + while ((m = rhashtable_walk_next(&walk)) != NULL) { > + if (m->mport_type == MAE_MPORT_DESC_MPORT_TYPE_VNIC && > + m->interface_idx == nic_data->local_mae_intf && > + m->pf_idx == 0 && > + m->vf_idx == vf_idx) { > + *id = m->mport_id; > + rc = 0; > + break; > + } > + } > + rhashtable_walk_stop(&walk); > + rhashtable_walk_exit(&walk); > + return rc; > +} > + > static bool efx_mae_asl_id(u32 id) > { > return !!(id & BIT(31)); > diff --git a/drivers/net/ethernet/sfc/mae.h b/drivers/net/ethernet/sfc/mae.h > index daa29d2cde96..b9bf86c47cda 100644 > --- a/drivers/net/ethernet/sfc/mae.h > +++ b/drivers/net/ethernet/sfc/mae.h > @@ -96,4 +96,6 @@ int efx_mae_delete_rule(struct efx_nic *efx, u32 id); > int efx_init_mae(struct efx_nic *efx); > void efx_fini_mae(struct efx_nic *efx); > void efx_mae_remove_mport(void *desc, void *arg); > +int efx_mae_fw_lookup_mport(struct efx_nic *efx, u32 selector, u32 *id); > +int efx_mae_lookup_mport(struct efx_nic *efx, u32 vf, u32 *id); > #endif /* EF100_MAE_H */ > -- > 2.17.1
diff --git a/drivers/net/ethernet/sfc/ef100_nic.c b/drivers/net/ethernet/sfc/ef100_nic.c index 07e7dca0e4f2..aa11f0925e27 100644 --- a/drivers/net/ethernet/sfc/ef100_nic.c +++ b/drivers/net/ethernet/sfc/ef100_nic.c @@ -736,7 +736,7 @@ static int efx_ef100_get_base_mport(struct efx_nic *efx) /* Construct mport selector for "physical network port" */ efx_mae_mport_wire(efx, &selector); /* Look up actual mport ID */ - rc = efx_mae_lookup_mport(efx, selector, &id); + rc = efx_mae_fw_lookup_mport(efx, selector, &id); if (rc) return rc; /* The ID should always fit in 16 bits, because that's how wide the @@ -751,7 +751,7 @@ static int efx_ef100_get_base_mport(struct efx_nic *efx) /* Construct mport selector for "calling PF" */ efx_mae_mport_uplink(efx, &selector); /* Look up actual mport ID */ - rc = efx_mae_lookup_mport(efx, selector, &id); + rc = efx_mae_fw_lookup_mport(efx, selector, &id); if (rc) return rc; if (id >> 16) diff --git a/drivers/net/ethernet/sfc/ef100_rep.c b/drivers/net/ethernet/sfc/ef100_rep.c index ebe7b1275713..9cd1a3ac67e0 100644 --- a/drivers/net/ethernet/sfc/ef100_rep.c +++ b/drivers/net/ethernet/sfc/ef100_rep.c @@ -243,14 +243,11 @@ static struct efx_rep *efx_ef100_rep_create_netdev(struct efx_nic *efx, static int efx_ef100_configure_rep(struct efx_rep *efv) { struct efx_nic *efx = efv->parent; - u32 selector; int rc; efv->rx_pring_size = EFX_REP_DEFAULT_PSEUDO_RING_SIZE; - /* Construct mport selector for corresponding VF */ - efx_mae_mport_vf(efx, efv->idx, &selector); /* Look up actual mport ID */ - rc = efx_mae_lookup_mport(efx, selector, &efv->mport); + rc = efx_mae_lookup_mport(efx, efv->idx, &efv->mport); if (rc) return rc; pci_dbg(efx->pci_dev, "VF %u has mport ID %#x\n", efv->idx, efv->mport); diff --git a/drivers/net/ethernet/sfc/mae.c b/drivers/net/ethernet/sfc/mae.c index 725a3ab31087..6321fd393fc3 100644 --- a/drivers/net/ethernet/sfc/mae.c +++ b/drivers/net/ethernet/sfc/mae.c @@ -97,7 +97,7 @@ void efx_mae_mport_mport(struct efx_nic *efx __always_unused, u32 mport_id, u32 } /* id is really only 24 bits wide */ -int efx_mae_lookup_mport(struct efx_nic *efx, u32 selector, u32 *id) +int efx_mae_fw_lookup_mport(struct efx_nic *efx, u32 selector, u32 *id) { MCDI_DECLARE_BUF(outbuf, MC_CMD_MAE_MPORT_LOOKUP_OUT_LEN); MCDI_DECLARE_BUF(inbuf, MC_CMD_MAE_MPORT_LOOKUP_IN_LEN); @@ -488,6 +488,31 @@ int efx_mae_free_counter(struct efx_nic *efx, struct efx_tc_counter *cnt) return 0; } +int efx_mae_lookup_mport(struct efx_nic *efx, u32 vf_idx, u32 *id) +{ + struct ef100_nic_data *nic_data = efx->nic_data; + struct efx_mae *mae = efx->mae; + struct rhashtable_iter walk; + struct mae_mport_desc *m; + int rc = -ENOENT; + + rhashtable_walk_enter(&mae->mports_ht, &walk); + rhashtable_walk_start(&walk); + while ((m = rhashtable_walk_next(&walk)) != NULL) { + if (m->mport_type == MAE_MPORT_DESC_MPORT_TYPE_VNIC && + m->interface_idx == nic_data->local_mae_intf && + m->pf_idx == 0 && + m->vf_idx == vf_idx) { + *id = m->mport_id; + rc = 0; + break; + } + } + rhashtable_walk_stop(&walk); + rhashtable_walk_exit(&walk); + return rc; +} + static bool efx_mae_asl_id(u32 id) { return !!(id & BIT(31)); diff --git a/drivers/net/ethernet/sfc/mae.h b/drivers/net/ethernet/sfc/mae.h index daa29d2cde96..b9bf86c47cda 100644 --- a/drivers/net/ethernet/sfc/mae.h +++ b/drivers/net/ethernet/sfc/mae.h @@ -96,4 +96,6 @@ int efx_mae_delete_rule(struct efx_nic *efx, u32 id); int efx_init_mae(struct efx_nic *efx); void efx_fini_mae(struct efx_nic *efx); void efx_mae_remove_mport(void *desc, void *arg); +int efx_mae_fw_lookup_mport(struct efx_nic *efx, u32 selector, u32 *id); +int efx_mae_lookup_mport(struct efx_nic *efx, u32 vf, u32 *id); #endif /* EF100_MAE_H */