> -----Original Message----- > From: Intel-wired-lan <[email protected]> On Behalf Of > Karthik Sundaravel > Sent: Tuesday, May 28, 2024 5:02 PM > To: Brandeburg, Jesse <[email protected]>; Drewek, Wojciech > <[email protected]>; [email protected]; Keller, Jacob E > <[email protected]>; Nguyen, Anthony L <[email protected]>; > [email protected]; [email protected]; [email protected]; > [email protected]; [email protected]; [email protected]; > [email protected]; [email protected] > Cc: [email protected]; [email protected]; [email protected]; > [email protected]; [email protected]; [email protected]; > [email protected]; [email protected]; [email protected] > Subject: [Intel-wired-lan] [PATCH iwl-next v12] ice: Add get/set hw address > for > VFs using devlink commands > > Changing the MAC address of the VFs is currently unsupported via devlink. > Add the function handlers to set and get the HW address for the VFs. > > Signed-off-by: Karthik Sundaravel <[email protected]> > --- > .../ethernet/intel/ice/devlink/devlink_port.c | 59 ++++++++++++++++++- > drivers/net/ethernet/intel/ice/ice_sriov.c | 34 ++++++++--- > drivers/net/ethernet/intel/ice/ice_sriov.h | 8 +++ > 3 files changed, 91 insertions(+), 10 deletions(-) > > diff --git a/drivers/net/ethernet/intel/ice/devlink/devlink_port.c > b/drivers/net/ethernet/intel/ice/devlink/devlink_port.c > index c9fbeebf7fb9..00fed5a61d62 100644 > --- a/drivers/net/ethernet/intel/ice/devlink/devlink_port.c > +++ b/drivers/net/ethernet/intel/ice/devlink/devlink_port.c > @@ -372,6 +372,62 @@ void ice_devlink_destroy_pf_port(struct ice_pf *pf) > devl_port_unregister(&pf->devlink_port); > } > > +/** > + * ice_devlink_port_get_vf_fn_mac - .port_fn_hw_addr_get devlink > +handler > + * @port: devlink port structure > + * @hw_addr: MAC address of the port > + * @hw_addr_len: length of MAC address > + * @extack: extended netdev ack structure > + * > + * Callback for the devlink .port_fn_hw_addr_get operation > + * Return: zero on success or an error code on failure. > + */ > +static int ice_devlink_port_get_vf_fn_mac(struct devlink_port *port, > + u8 *hw_addr, int *hw_addr_len, > + struct netlink_ext_ack *extack) > +{ > + struct ice_vf *vf = container_of(port, struct ice_vf, devlink_port); > + > + ether_addr_copy(hw_addr, vf->dev_lan_addr); > + *hw_addr_len = ETH_ALEN; > + > + return 0; > +} > + > +/** > + * ice_devlink_port_set_vf_fn_mac - .port_fn_hw_addr_set devlink > +handler > + * @port: devlink port structure > + * @hw_addr: MAC address of the port > + * @hw_addr_len: length of MAC address > + * @extack: extended netdev ack structure > + * > + * Callback for the devlink .port_fn_hw_addr_set operation > + * Return: zero on success or an error code on failure. > + */ > +static int ice_devlink_port_set_vf_fn_mac(struct devlink_port *port, > + const u8 *hw_addr, > + int hw_addr_len, > + struct netlink_ext_ack *extack) > + > +{ > + struct devlink_port_attrs *attrs = &port->attrs; > + struct devlink_port_pci_vf_attrs *pci_vf; > + struct devlink *devlink = port->devlink; > + struct ice_pf *pf; > + u16 vf_id; > + > + pf = devlink_priv(devlink); > + pci_vf = &attrs->pci_vf; > + vf_id = pci_vf->vf; > + > + return __ice_set_vf_mac(pf, vf_id, hw_addr); } > + > +static const struct devlink_port_ops ice_devlink_vf_port_ops = { > + .port_fn_hw_addr_get = ice_devlink_port_get_vf_fn_mac, > + .port_fn_hw_addr_set = ice_devlink_port_set_vf_fn_mac, }; > + > /** > * ice_devlink_create_vf_port - Create a devlink port for this VF > * @vf: the VF to create a port for > @@ -407,7 +463,8 @@ int ice_devlink_create_vf_port(struct ice_vf *vf) > devlink_port_attrs_set(devlink_port, &attrs); > devlink = priv_to_devlink(pf); > > - err = devl_port_register(devlink, devlink_port, vsi->idx); > + err = devl_port_register_with_ops(devlink, devlink_port, vsi->idx, > + &ice_devlink_vf_port_ops); > if (err) { > dev_err(dev, "Failed to create devlink port for VF %d, error > %d\n", > vf->vf_id, err); > diff --git a/drivers/net/ethernet/intel/ice/ice_sriov.c > b/drivers/net/ethernet/intel/ice/ice_sriov.c > index 067712f4923f..55ef33208456 100644 > --- a/drivers/net/ethernet/intel/ice/ice_sriov.c > +++ b/drivers/net/ethernet/intel/ice/ice_sriov.c > @@ -1416,21 +1416,23 @@ ice_get_vf_cfg(struct net_device *netdev, int vf_id, > struct ifla_vf_info *ivi) } > > /** > - * ice_set_vf_mac > - * @netdev: network interface device structure > + * __ice_set_vf_mac - program VF MAC address > + * @pf: PF to be configure > * @vf_id: VF identifier > * @mac: MAC address > * > * program VF MAC address > + * Return: zero on success or an error code on failure > */ > -int ice_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac) > +int __ice_set_vf_mac(struct ice_pf *pf, u16 vf_id, const u8 *mac) > { > - struct ice_pf *pf = ice_netdev_to_pf(netdev); > + struct device *dev; > struct ice_vf *vf; > int ret; > > + dev = ice_pf_to_dev(pf); > if (is_multicast_ether_addr(mac)) { > - netdev_err(netdev, "%pM not a valid unicast address\n", mac); > + dev_err(dev, "%pM not a valid unicast address\n", mac); > return -EINVAL; > } > > @@ -1459,13 +1461,13 @@ int ice_set_vf_mac(struct net_device *netdev, int > vf_id, u8 *mac) > if (is_zero_ether_addr(mac)) { > /* VF will send VIRTCHNL_OP_ADD_ETH_ADDR message with its > MAC */ > vf->pf_set_mac = false; > - netdev_info(netdev, "Removing MAC on VF %d. VF driver will be > reinitialized\n", > - vf->vf_id); > + dev_info(dev, "Removing MAC on VF %d. VF driver will be > reinitialized\n", > + vf->vf_id); > } else { > /* PF will add MAC rule for the VF */ > vf->pf_set_mac = true; > - netdev_info(netdev, "Setting MAC %pM on VF %d. VF driver will > be reinitialized\n", > - mac, vf_id); > + dev_info(dev, "Setting MAC %pM on VF %d. VF driver will be > reinitialized\n", > + mac, vf_id); > } > > ice_reset_vf(vf, ICE_VF_RESET_NOTIFY); @@ -1476,6 +1478,20 @@ int > ice_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac) > return ret; > } > > +/** > + * ice_set_vf_mac - .ndo_set_vf_mac handler > + * @netdev: network interface device structure > + * @vf_id: VF identifier > + * @mac: MAC address > + * > + * program VF MAC address > + * Return: zero on success or an error code on failure */ int > +ice_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac) { > + return __ice_set_vf_mac(ice_netdev_to_pf(netdev), vf_id, mac); } > + > /** > * ice_set_vf_trust > * @netdev: network interface device structure diff --git > a/drivers/net/ethernet/intel/ice/ice_sriov.h > b/drivers/net/ethernet/intel/ice/ice_sriov.h > index 8f22313474d6..96549ca5c52c 100644 > --- a/drivers/net/ethernet/intel/ice/ice_sriov.h > +++ b/drivers/net/ethernet/intel/ice/ice_sriov.h > @@ -28,6 +28,7 @@ > #ifdef CONFIG_PCI_IOV > void ice_process_vflr_event(struct ice_pf *pf); int > ice_sriov_configure(struct > pci_dev *pdev, int num_vfs); > +int __ice_set_vf_mac(struct ice_pf *pf, u16 vf_id, const u8 *mac); > int ice_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac); int > ice_get_vf_cfg(struct net_device *netdev, int vf_id, struct ifla_vf_info > *ivi); @@ - > 80,6 +81,13 @@ ice_sriov_configure(struct pci_dev __always_unused *pdev, > return -EOPNOTSUPP; > } > > +static inline int > +__ice_set_vf_mac(struct ice_pf __always_unused *pf, > + u16 __always_unused vf_id, const u8 __always_unused *mac) { > + return -EOPNOTSUPP; > +} > + > static inline int > ice_set_vf_mac(struct net_device __always_unused *netdev, > int __always_unused vf_id, u8 __always_unused *mac) > -- > 2.39.3 (Apple Git-146)
Tested-by: Rafal Romanowski <[email protected]>
