Message ID | 20230208142519.31192-9-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, 54 lines checked |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/source_inline | success | Was 0 now: 0 |
Wed, Feb 08, 2023 at 03:25:19PM CET, alejandro.lucero-palau@amd.com wrote: >From: Alejandro Lucero <alejandro.lucero-palau@amd.com> > >Using the builtin client handle id infrastructure, add support for >setting the mac address linked to mports in ef100. This implies to >execute an MCDI command for giving the address to the firmware for >the specific devlink port. > >Signed-off-by: Alejandro Lucero <alejandro.lucero-palau@amd.com> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
On Wed, Feb 08, 2023 at 02:25:19PM +0000, alejandro.lucero-palau@amd.com wrote: > From: Alejandro Lucero <alejandro.lucero-palau@amd.com> > > Using the builtin client handle id infrastructure, add support for > setting the mac address linked to mports in ef100. This implies to > execute an MCDI command for giving the address to the firmware for > the specific devlink port. > > Signed-off-by: Alejandro Lucero <alejandro.lucero-palau@amd.com> Acked-by: Martin Habets <habetsm.xilinx@gmail.com> > --- > drivers/net/ethernet/sfc/efx_devlink.c | 42 ++++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) > > diff --git a/drivers/net/ethernet/sfc/efx_devlink.c b/drivers/net/ethernet/sfc/efx_devlink.c > index 68d04c2176d3..9fc2fe862303 100644 > --- a/drivers/net/ethernet/sfc/efx_devlink.c > +++ b/drivers/net/ethernet/sfc/efx_devlink.c > @@ -103,6 +103,47 @@ static int efx_devlink_port_addr_get(struct devlink_port *port, u8 *hw_addr, > return rc; > } > > +static int efx_devlink_port_addr_set(struct devlink_port *port, > + const u8 *hw_addr, int hw_addr_len, > + struct netlink_ext_ack *extack) > +{ > + MCDI_DECLARE_BUF(inbuf, MC_CMD_SET_CLIENT_MAC_ADDRESSES_IN_LEN(1)); > + struct efx_devlink *devlink = devlink_priv(port->devlink); > + struct mae_mport_desc *mport_desc; > + efx_qword_t pciefn; > + u32 client_id; > + int rc; > + > + mport_desc = container_of(port, struct mae_mport_desc, dl_port); > + > + if (!ef100_mport_is_vf(mport_desc)) { > + NL_SET_ERR_MSG_MOD(extack, "Port MAC change not allowed"); > + return -EPERM; > + } > + > + EFX_POPULATE_QWORD_3(pciefn, > + PCIE_FUNCTION_PF, PCIE_FUNCTION_PF_NULL, > + PCIE_FUNCTION_VF, mport_desc->vf_idx, > + PCIE_FUNCTION_INTF, PCIE_INTERFACE_CALLER); > + > + rc = efx_ef100_lookup_client_id(devlink->efx, pciefn, &client_id); > + if (rc) { > + NL_SET_ERR_MSG_MOD(extack, "No internal client_ID"); > + return rc; > + } > + > + MCDI_SET_DWORD(inbuf, SET_CLIENT_MAC_ADDRESSES_IN_CLIENT_HANDLE, > + client_id); > + > + ether_addr_copy(MCDI_PTR(inbuf, SET_CLIENT_MAC_ADDRESSES_IN_MAC_ADDRS), > + hw_addr); > + > + rc = efx_mcdi_rpc(devlink->efx, MC_CMD_SET_CLIENT_MAC_ADDRESSES, inbuf, > + sizeof(inbuf), NULL, 0, NULL); > + > + return rc; > +} > + > static int efx_devlink_info_nvram_partition(struct efx_nic *efx, > struct devlink_info_req *req, > unsigned int partition_type, > @@ -557,6 +598,7 @@ static const struct devlink_ops sfc_devlink_ops = { > #ifdef CONFIG_SFC_SRIOV > .info_get = efx_devlink_info_get, > .port_function_hw_addr_get = efx_devlink_port_addr_get, > + .port_function_hw_addr_set = efx_devlink_port_addr_set, > #endif > }; > > -- > 2.17.1
diff --git a/drivers/net/ethernet/sfc/efx_devlink.c b/drivers/net/ethernet/sfc/efx_devlink.c index 68d04c2176d3..9fc2fe862303 100644 --- a/drivers/net/ethernet/sfc/efx_devlink.c +++ b/drivers/net/ethernet/sfc/efx_devlink.c @@ -103,6 +103,47 @@ static int efx_devlink_port_addr_get(struct devlink_port *port, u8 *hw_addr, return rc; } +static int efx_devlink_port_addr_set(struct devlink_port *port, + const u8 *hw_addr, int hw_addr_len, + struct netlink_ext_ack *extack) +{ + MCDI_DECLARE_BUF(inbuf, MC_CMD_SET_CLIENT_MAC_ADDRESSES_IN_LEN(1)); + struct efx_devlink *devlink = devlink_priv(port->devlink); + struct mae_mport_desc *mport_desc; + efx_qword_t pciefn; + u32 client_id; + int rc; + + mport_desc = container_of(port, struct mae_mport_desc, dl_port); + + if (!ef100_mport_is_vf(mport_desc)) { + NL_SET_ERR_MSG_MOD(extack, "Port MAC change not allowed"); + return -EPERM; + } + + EFX_POPULATE_QWORD_3(pciefn, + PCIE_FUNCTION_PF, PCIE_FUNCTION_PF_NULL, + PCIE_FUNCTION_VF, mport_desc->vf_idx, + PCIE_FUNCTION_INTF, PCIE_INTERFACE_CALLER); + + rc = efx_ef100_lookup_client_id(devlink->efx, pciefn, &client_id); + if (rc) { + NL_SET_ERR_MSG_MOD(extack, "No internal client_ID"); + return rc; + } + + MCDI_SET_DWORD(inbuf, SET_CLIENT_MAC_ADDRESSES_IN_CLIENT_HANDLE, + client_id); + + ether_addr_copy(MCDI_PTR(inbuf, SET_CLIENT_MAC_ADDRESSES_IN_MAC_ADDRS), + hw_addr); + + rc = efx_mcdi_rpc(devlink->efx, MC_CMD_SET_CLIENT_MAC_ADDRESSES, inbuf, + sizeof(inbuf), NULL, 0, NULL); + + return rc; +} + static int efx_devlink_info_nvram_partition(struct efx_nic *efx, struct devlink_info_req *req, unsigned int partition_type, @@ -557,6 +598,7 @@ static const struct devlink_ops sfc_devlink_ops = { #ifdef CONFIG_SFC_SRIOV .info_get = efx_devlink_info_get, .port_function_hw_addr_get = efx_devlink_port_addr_get, + .port_function_hw_addr_set = efx_devlink_port_addr_set, #endif };