Message ID | 20230208142519.31192-7-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 | warning | WARNING: line length of 90 exceeds 80 columns |
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:17PM +0000, alejandro.lucero-palau@amd.com wrote: > From: Alejandro Lucero <alejandro.lucero-palau@amd.com> > > Getting device mac address is currently based on a specific MCDI command > only available for the PF. This patch changes the MCDI command to a > generic one for PFs and VFs based on a client handle. This allows both > PFs and VFs to ask for their mac address during initialization using the > CLIENT_HANDLE_SELF. > > Moreover, the patch allows other client handles which will be used by > the PF to ask for mac addresses linked to VFs. This is necessary for > suporting the port_function_hw_addr_get devlink function in further > patches. > > Signed-off-by: Alejandro Lucero <alejandro.lucero-palau@amd.com> Acked-by: Martin Habets <habetsm.xilinx@gmail.com> > --- > drivers/net/ethernet/sfc/ef100_netdev.c | 10 +++++++ > drivers/net/ethernet/sfc/ef100_nic.c | 37 +++++++++++++------------ > drivers/net/ethernet/sfc/ef100_nic.h | 2 ++ > 3 files changed, 31 insertions(+), 18 deletions(-) > > diff --git a/drivers/net/ethernet/sfc/ef100_netdev.c b/drivers/net/ethernet/sfc/ef100_netdev.c > index 368147359299..d916877b5a9a 100644 > --- a/drivers/net/ethernet/sfc/ef100_netdev.c > +++ b/drivers/net/ethernet/sfc/ef100_netdev.c > @@ -359,6 +359,7 @@ int ef100_probe_netdev(struct efx_probe_data *probe_data) > { > struct efx_nic *efx = &probe_data->efx; > struct efx_probe_data **probe_ptr; > + struct ef100_nic_data *nic_data; > struct net_device *net_dev; > int rc; > > @@ -410,6 +411,15 @@ int ef100_probe_netdev(struct efx_probe_data *probe_data) > /* Don't fail init if RSS setup doesn't work. */ > efx_mcdi_push_default_indir_table(efx, efx->n_rx_channels); > > + nic_data = efx->nic_data; > + rc = ef100_get_mac_address(efx, net_dev->perm_addr, CLIENT_HANDLE_SELF, > + efx->type->is_vf); > + if (rc) > + return rc; > + /* Assign MAC address */ > + eth_hw_addr_set(net_dev, net_dev->perm_addr); > + ether_addr_copy(nic_data->port_id, net_dev->perm_addr); > + > /* devlink creation, registration and lock */ > rc = efx_probe_devlink_and_lock(efx); > if (rc) > diff --git a/drivers/net/ethernet/sfc/ef100_nic.c b/drivers/net/ethernet/sfc/ef100_nic.c > index aa11f0925e27..aa48c79a2149 100644 > --- a/drivers/net/ethernet/sfc/ef100_nic.c > +++ b/drivers/net/ethernet/sfc/ef100_nic.c > @@ -130,23 +130,34 @@ static void ef100_mcdi_reboot_detected(struct efx_nic *efx) > > /* MCDI calls > */ > -static int ef100_get_mac_address(struct efx_nic *efx, u8 *mac_address) > +int ef100_get_mac_address(struct efx_nic *efx, u8 *mac_address, > + int client_handle, bool empty_ok) > { > - MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_MAC_ADDRESSES_OUT_LEN); > + MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_CLIENT_MAC_ADDRESSES_OUT_LEN(1)); > + MCDI_DECLARE_BUF(inbuf, MC_CMD_GET_CLIENT_MAC_ADDRESSES_IN_LEN); > size_t outlen; > int rc; > > BUILD_BUG_ON(MC_CMD_GET_MAC_ADDRESSES_IN_LEN != 0); > + MCDI_SET_DWORD(inbuf, GET_CLIENT_MAC_ADDRESSES_IN_CLIENT_HANDLE, > + client_handle); > > - rc = efx_mcdi_rpc(efx, MC_CMD_GET_MAC_ADDRESSES, NULL, 0, > - outbuf, sizeof(outbuf), &outlen); > + rc = efx_mcdi_rpc(efx, MC_CMD_GET_CLIENT_MAC_ADDRESSES, inbuf, > + sizeof(inbuf), outbuf, sizeof(outbuf), &outlen); > if (rc) > return rc; > - if (outlen < MC_CMD_GET_MAC_ADDRESSES_OUT_LEN) > - return -EIO; > > - ether_addr_copy(mac_address, > - MCDI_PTR(outbuf, GET_MAC_ADDRESSES_OUT_MAC_ADDR_BASE)); > + if (outlen >= MC_CMD_GET_CLIENT_MAC_ADDRESSES_OUT_LEN(1)) { > + ether_addr_copy(mac_address, > + MCDI_PTR(outbuf, GET_CLIENT_MAC_ADDRESSES_OUT_MAC_ADDRS)); > + } else if (empty_ok) { > + pci_warn(efx->pci_dev, > + "No MAC address provisioned for client ID %#x.\n", > + client_handle); > + eth_zero_addr(mac_address); > + } else { > + return -ENOENT; > + } > return 0; > } > > @@ -1117,13 +1128,6 @@ int ef100_probe_netdev_pf(struct efx_nic *efx) > struct net_device *net_dev = efx->net_dev; > int rc; > > - rc = ef100_get_mac_address(efx, net_dev->perm_addr); > - if (rc) > - goto fail; > - /* Assign MAC address */ > - eth_hw_addr_set(net_dev, net_dev->perm_addr); > - memcpy(nic_data->port_id, net_dev->perm_addr, ETH_ALEN); > - > if (!nic_data->grp_mae) > return 0; > > @@ -1163,9 +1167,6 @@ int ef100_probe_netdev_pf(struct efx_nic *efx) > efx->fixed_features |= NETIF_F_HW_TC; > } > #endif > - return 0; > - > -fail: > return rc; > } > > diff --git a/drivers/net/ethernet/sfc/ef100_nic.h b/drivers/net/ethernet/sfc/ef100_nic.h > index 496aea43c60f..e59044072333 100644 > --- a/drivers/net/ethernet/sfc/ef100_nic.h > +++ b/drivers/net/ethernet/sfc/ef100_nic.h > @@ -92,4 +92,6 @@ int efx_ef100_init_datapath_caps(struct efx_nic *efx); > int ef100_phy_probe(struct efx_nic *efx); > int ef100_filter_table_probe(struct efx_nic *efx); > > +int ef100_get_mac_address(struct efx_nic *efx, u8 *mac_address, > + int client_handle, bool empty_ok); > #endif /* EFX_EF100_NIC_H */ > -- > 2.17.1
diff --git a/drivers/net/ethernet/sfc/ef100_netdev.c b/drivers/net/ethernet/sfc/ef100_netdev.c index 368147359299..d916877b5a9a 100644 --- a/drivers/net/ethernet/sfc/ef100_netdev.c +++ b/drivers/net/ethernet/sfc/ef100_netdev.c @@ -359,6 +359,7 @@ int ef100_probe_netdev(struct efx_probe_data *probe_data) { struct efx_nic *efx = &probe_data->efx; struct efx_probe_data **probe_ptr; + struct ef100_nic_data *nic_data; struct net_device *net_dev; int rc; @@ -410,6 +411,15 @@ int ef100_probe_netdev(struct efx_probe_data *probe_data) /* Don't fail init if RSS setup doesn't work. */ efx_mcdi_push_default_indir_table(efx, efx->n_rx_channels); + nic_data = efx->nic_data; + rc = ef100_get_mac_address(efx, net_dev->perm_addr, CLIENT_HANDLE_SELF, + efx->type->is_vf); + if (rc) + return rc; + /* Assign MAC address */ + eth_hw_addr_set(net_dev, net_dev->perm_addr); + ether_addr_copy(nic_data->port_id, net_dev->perm_addr); + /* devlink creation, registration and lock */ rc = efx_probe_devlink_and_lock(efx); if (rc) diff --git a/drivers/net/ethernet/sfc/ef100_nic.c b/drivers/net/ethernet/sfc/ef100_nic.c index aa11f0925e27..aa48c79a2149 100644 --- a/drivers/net/ethernet/sfc/ef100_nic.c +++ b/drivers/net/ethernet/sfc/ef100_nic.c @@ -130,23 +130,34 @@ static void ef100_mcdi_reboot_detected(struct efx_nic *efx) /* MCDI calls */ -static int ef100_get_mac_address(struct efx_nic *efx, u8 *mac_address) +int ef100_get_mac_address(struct efx_nic *efx, u8 *mac_address, + int client_handle, bool empty_ok) { - MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_MAC_ADDRESSES_OUT_LEN); + MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_CLIENT_MAC_ADDRESSES_OUT_LEN(1)); + MCDI_DECLARE_BUF(inbuf, MC_CMD_GET_CLIENT_MAC_ADDRESSES_IN_LEN); size_t outlen; int rc; BUILD_BUG_ON(MC_CMD_GET_MAC_ADDRESSES_IN_LEN != 0); + MCDI_SET_DWORD(inbuf, GET_CLIENT_MAC_ADDRESSES_IN_CLIENT_HANDLE, + client_handle); - rc = efx_mcdi_rpc(efx, MC_CMD_GET_MAC_ADDRESSES, NULL, 0, - outbuf, sizeof(outbuf), &outlen); + rc = efx_mcdi_rpc(efx, MC_CMD_GET_CLIENT_MAC_ADDRESSES, inbuf, + sizeof(inbuf), outbuf, sizeof(outbuf), &outlen); if (rc) return rc; - if (outlen < MC_CMD_GET_MAC_ADDRESSES_OUT_LEN) - return -EIO; - ether_addr_copy(mac_address, - MCDI_PTR(outbuf, GET_MAC_ADDRESSES_OUT_MAC_ADDR_BASE)); + if (outlen >= MC_CMD_GET_CLIENT_MAC_ADDRESSES_OUT_LEN(1)) { + ether_addr_copy(mac_address, + MCDI_PTR(outbuf, GET_CLIENT_MAC_ADDRESSES_OUT_MAC_ADDRS)); + } else if (empty_ok) { + pci_warn(efx->pci_dev, + "No MAC address provisioned for client ID %#x.\n", + client_handle); + eth_zero_addr(mac_address); + } else { + return -ENOENT; + } return 0; } @@ -1117,13 +1128,6 @@ int ef100_probe_netdev_pf(struct efx_nic *efx) struct net_device *net_dev = efx->net_dev; int rc; - rc = ef100_get_mac_address(efx, net_dev->perm_addr); - if (rc) - goto fail; - /* Assign MAC address */ - eth_hw_addr_set(net_dev, net_dev->perm_addr); - memcpy(nic_data->port_id, net_dev->perm_addr, ETH_ALEN); - if (!nic_data->grp_mae) return 0; @@ -1163,9 +1167,6 @@ int ef100_probe_netdev_pf(struct efx_nic *efx) efx->fixed_features |= NETIF_F_HW_TC; } #endif - return 0; - -fail: return rc; } diff --git a/drivers/net/ethernet/sfc/ef100_nic.h b/drivers/net/ethernet/sfc/ef100_nic.h index 496aea43c60f..e59044072333 100644 --- a/drivers/net/ethernet/sfc/ef100_nic.h +++ b/drivers/net/ethernet/sfc/ef100_nic.h @@ -92,4 +92,6 @@ int efx_ef100_init_datapath_caps(struct efx_nic *efx); int ef100_phy_probe(struct efx_nic *efx); int ef100_filter_table_probe(struct efx_nic *efx); +int ef100_get_mac_address(struct efx_nic *efx, u8 *mac_address, + int client_handle, bool empty_ok); #endif /* EFX_EF100_NIC_H */