Message ID | 20241112185432.1152541-1-srasheed@marvell.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next,v2] octeon_ep: add ndo ops for VFs in PF driver | expand |
On Wed, Nov 13, 2024 at 3:44 AM Shinas Rasheed <srasheed@marvell.com> wrote: > > These APIs are needed to support applications that use netlink to get VF > information from a PF driver. > > Signed-off-by: Shinas Rasheed <srasheed@marvell.com> LGTM, thanks for making suggested changes. Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
On Tue, Nov 12, 2024 at 10:54:31AM -0800, Shinas Rasheed wrote: > These APIs are needed to support applications that use netlink to get VF > information from a PF driver. > > Signed-off-by: Shinas Rasheed <srasheed@marvell.com> > --- > V2: > - Corrected typos, and removed not supported ndo_set_vf* hooks > > V1: https://lore.kernel.org/all/20241107121637.1117089-1-srasheed@marvell.com/ Thanks for the updates. Reviewed-by: Simon Horman <horms@kernel.org> ...
On Tue, 12 Nov 2024 10:54:31 -0800 Shinas Rasheed wrote: > These APIs are needed to support applications that use netlink to get VF > information from a PF driver. > > Signed-off-by: Shinas Rasheed <srasheed@marvell.com> > +static int octep_get_vf_config(struct net_device *dev, int vf, struct ifla_vf_info *ivi) Please don't go over 80 chars for no good reason. use checkpatch with --strict --max-line-length=80 > +{ > + struct octep_device *oct = netdev_priv(dev); > + > + ivi->vf = vf; > + ether_addr_copy(ivi->mac, oct->vf_info[vf].mac_addr); > + ivi->vlan = 0; > + ivi->qos = 0; no need to clear these fields > + ivi->spoofchk = 0; > + ivi->linkstate = IFLA_VF_LINK_STATE_ENABLE; > + ivi->trusted = true; so you set spoofchk to 0 and trusted to true, indicating no enforcement [1] > + ivi->max_tx_rate = 10000; > + ivi->min_tx_rate = 0; Why are you setting max rate to a fixed value? > + > + return 0; > +} > + > +static int octep_set_vf_mac(struct net_device *dev, int vf, u8 *mac) > +{ > + struct octep_device *oct = netdev_priv(dev); > + int err; > + > + if (!is_valid_ether_addr(mac)) { > + dev_err(&oct->pdev->dev, "Invalid MAC Address %pM\n", mac); > + return -EADDRNOTAVAIL; > + } > + > + dev_dbg(&oct->pdev->dev, "set vf-%d mac to %pM\n", vf, mac); > + ether_addr_copy(oct->vf_info[vf].mac_addr, mac); > + oct->vf_info[vf].flags |= OCTEON_PFVF_FLAG_MAC_SET_BY_PF; double space > + > + err = octep_ctrl_net_set_mac_addr(oct, vf, mac, true); > + if (err) > + dev_err(&oct->pdev->dev, "Set VF%d MAC address failed via host control Mbox\n", vf); > + > + return err; > +} > + > static const struct net_device_ops octep_netdev_ops = { > .ndo_open = octep_open, > .ndo_stop = octep_stop, > @@ -1146,6 +1184,9 @@ static const struct net_device_ops octep_netdev_ops = { > .ndo_set_mac_address = octep_set_mac, > .ndo_change_mtu = octep_change_mtu, > .ndo_set_features = octep_set_features, > + /* for VFs */ what does this comment achieve? > + .ndo_get_vf_config = octep_get_vf_config, > + .ndo_set_vf_mac = octep_set_vf_mac > }; > > /** > diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_main.h b/drivers/net/ethernet/marvell/octeon_ep/octep_main.h > index fee59e0e0138..3b56916af468 100644 > --- a/drivers/net/ethernet/marvell/octeon_ep/octep_main.h > +++ b/drivers/net/ethernet/marvell/octeon_ep/octep_main.h > @@ -220,6 +220,7 @@ struct octep_iface_link_info { > /* The Octeon VF device specific info data structure.*/ > struct octep_pfvf_info { > u8 mac_addr[ETH_ALEN]; > + u32 flags; the flags are u32 [2] > u32 mbox_version; > }; > > diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c b/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c > index e6eb98d70f3c..26db2d34d1c0 100644 > --- a/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c > +++ b/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c > @@ -156,12 +156,23 @@ static void octep_pfvf_set_mac_addr(struct octep_device *oct, u32 vf_id, > { > int err; > > + if (oct->vf_info[vf_id].flags & OCTEON_PFVF_FLAG_MAC_SET_BY_PF) { > + dev_err(&oct->pdev->dev, > + "VF%d attempted to override administrative set MAC address\n", > + vf_id); > + rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_NACK; > + return; > + } [1] and yet you reject VF side changes. So is there enforcement or not? :S > err = octep_ctrl_net_set_mac_addr(oct, vf_id, cmd.s_set_mac.mac_addr, true); > if (err) { > rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_NACK; > - dev_err(&oct->pdev->dev, "Set VF MAC address failed via host control Mbox\n"); > + dev_err(&oct->pdev->dev, "Set VF%d MAC address failed via host control Mbox\n", > + vf_id); > return; > } > + > + ether_addr_copy(oct->vf_info[vf_id].mac_addr, cmd.s_set_mac.mac_addr); > rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_ACK; > } > > @@ -171,10 +182,17 @@ static void octep_pfvf_get_mac_addr(struct octep_device *oct, u32 vf_id, > { > int err; > > + if (oct->vf_info[vf_id].flags & OCTEON_PFVF_FLAG_MAC_SET_BY_PF) { > + dev_dbg(&oct->pdev->dev, "VF%d MAC address set by PF\n", vf_id); > + ether_addr_copy(rsp->s_set_mac.mac_addr, oct->vf_info[vf_id].mac_addr); > + rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_ACK; > + return; > + } > err = octep_ctrl_net_get_mac_addr(oct, vf_id, rsp->s_set_mac.mac_addr); > if (err) { > rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_NACK; > - dev_err(&oct->pdev->dev, "Get VF MAC address failed via host control Mbox\n"); > + dev_err(&oct->pdev->dev, "Get VF%d MAC address failed via host control Mbox\n", > + vf_id); > return; > } > rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_ACK; > diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h b/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h > index 0dc6eead292a..339977c7131a 100644 > --- a/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h > +++ b/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h > @@ -23,6 +23,9 @@ enum octep_pfvf_mbox_version { > > #define OCTEP_PFVF_MBOX_VERSION_CURRENT OCTEP_PFVF_MBOX_VERSION_V2 > > +/* VF flags */ > +#define OCTEON_PFVF_FLAG_MAC_SET_BY_PF BIT_ULL(0) /* PF has set VF MAC address */ [2] but the bit definition uses ULL ? > enum octep_pfvf_mbox_opcode { > OCTEP_PFVF_MBOX_CMD_VERSION, > OCTEP_PFVF_MBOX_CMD_SET_MTU,
Hi Jakub, > On Tue, 12 Nov 2024 10:54:31 -0800 Shinas Rasheed wrote: > > These APIs are needed to support applications that use netlink to get VF > > information from a PF driver. > > > > Signed-off-by: Shinas Rasheed <srasheed@marvell.com> > > > +static int octep_get_vf_config(struct net_device *dev, int vf, struct > ifla_vf_info *ivi) > > Please don't go over 80 chars for no good reason. > use checkpatch with --strict --max-line-length=80 > ACK > > +{ > > + struct octep_device *oct = netdev_priv(dev); > > + > > + ivi->vf = vf; > > + ether_addr_copy(ivi->mac, oct->vf_info[vf].mac_addr); > > + ivi->vlan = 0; > > + ivi->qos = 0; > > no need to clear these fields > ACK > > + ivi->spoofchk = 0; > > + ivi->linkstate = IFLA_VF_LINK_STATE_ENABLE; > > + ivi->trusted = true; > > so you set spoofchk to 0 and trusted to true, indicating no > enforcement [1] > Will fix this in next patch > > + ivi->max_tx_rate = 10000; > > + ivi->min_tx_rate = 0; > > Why are you setting max rate to a fixed value? > This is the max tx rate we offer for VFs > > + > > + return 0; > > +} > > + > > +static int octep_set_vf_mac(struct net_device *dev, int vf, u8 *mac) > > +{ > > + struct octep_device *oct = netdev_priv(dev); > > + int err; > > + > > + if (!is_valid_ether_addr(mac)) { > > + dev_err(&oct->pdev->dev, "Invalid MAC Address %pM\n", > mac); > > + return -EADDRNOTAVAIL; > > + } > > + > > + dev_dbg(&oct->pdev->dev, "set vf-%d mac to %pM\n", vf, mac); > > + ether_addr_copy(oct->vf_info[vf].mac_addr, mac); > > + oct->vf_info[vf].flags |= OCTEON_PFVF_FLAG_MAC_SET_BY_PF; > > double space > ACK > > + > > + err = octep_ctrl_net_set_mac_addr(oct, vf, mac, true); > > + if (err) > > + dev_err(&oct->pdev->dev, "Set VF%d MAC address failed via > host control Mbox\n", vf); > > + > > + return err; > > +} > > + > > static const struct net_device_ops octep_netdev_ops = { > > .ndo_open = octep_open, > > .ndo_stop = octep_stop, > > @@ -1146,6 +1184,9 @@ static const struct net_device_ops > octep_netdev_ops = { > > .ndo_set_mac_address = octep_set_mac, > > .ndo_change_mtu = octep_change_mtu, > > .ndo_set_features = octep_set_features, > > + /* for VFs */ > > what does this comment achieve? > Will remove > > diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h > b/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h > > index 0dc6eead292a..339977c7131a 100644 > > --- a/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h > > +++ b/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h > > @@ -23,6 +23,9 @@ enum octep_pfvf_mbox_version { > > > > #define OCTEP_PFVF_MBOX_VERSION_CURRENT > OCTEP_PFVF_MBOX_VERSION_V2 > > > > +/* VF flags */ > > +#define OCTEON_PFVF_FLAG_MAC_SET_BY_PF BIT_ULL(0) /* PF has set VF > MAC address */ > > [2] but the bit definition uses ULL ? > Will fix in next patch Thanks for the comments
diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_main.c b/drivers/net/ethernet/marvell/octeon_ep/octep_main.c index 549436efc204..6c1689a98f20 100644 --- a/drivers/net/ethernet/marvell/octeon_ep/octep_main.c +++ b/drivers/net/ethernet/marvell/octeon_ep/octep_main.c @@ -1137,6 +1137,44 @@ static int octep_set_features(struct net_device *dev, netdev_features_t features return err; } +static int octep_get_vf_config(struct net_device *dev, int vf, struct ifla_vf_info *ivi) +{ + struct octep_device *oct = netdev_priv(dev); + + ivi->vf = vf; + ether_addr_copy(ivi->mac, oct->vf_info[vf].mac_addr); + ivi->vlan = 0; + ivi->qos = 0; + ivi->spoofchk = 0; + ivi->linkstate = IFLA_VF_LINK_STATE_ENABLE; + ivi->trusted = true; + ivi->max_tx_rate = 10000; + ivi->min_tx_rate = 0; + + return 0; +} + +static int octep_set_vf_mac(struct net_device *dev, int vf, u8 *mac) +{ + struct octep_device *oct = netdev_priv(dev); + int err; + + if (!is_valid_ether_addr(mac)) { + dev_err(&oct->pdev->dev, "Invalid MAC Address %pM\n", mac); + return -EADDRNOTAVAIL; + } + + dev_dbg(&oct->pdev->dev, "set vf-%d mac to %pM\n", vf, mac); + ether_addr_copy(oct->vf_info[vf].mac_addr, mac); + oct->vf_info[vf].flags |= OCTEON_PFVF_FLAG_MAC_SET_BY_PF; + + err = octep_ctrl_net_set_mac_addr(oct, vf, mac, true); + if (err) + dev_err(&oct->pdev->dev, "Set VF%d MAC address failed via host control Mbox\n", vf); + + return err; +} + static const struct net_device_ops octep_netdev_ops = { .ndo_open = octep_open, .ndo_stop = octep_stop, @@ -1146,6 +1184,9 @@ static const struct net_device_ops octep_netdev_ops = { .ndo_set_mac_address = octep_set_mac, .ndo_change_mtu = octep_change_mtu, .ndo_set_features = octep_set_features, + /* for VFs */ + .ndo_get_vf_config = octep_get_vf_config, + .ndo_set_vf_mac = octep_set_vf_mac }; /** diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_main.h b/drivers/net/ethernet/marvell/octeon_ep/octep_main.h index fee59e0e0138..3b56916af468 100644 --- a/drivers/net/ethernet/marvell/octeon_ep/octep_main.h +++ b/drivers/net/ethernet/marvell/octeon_ep/octep_main.h @@ -220,6 +220,7 @@ struct octep_iface_link_info { /* The Octeon VF device specific info data structure.*/ struct octep_pfvf_info { u8 mac_addr[ETH_ALEN]; + u32 flags; u32 mbox_version; }; diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c b/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c index e6eb98d70f3c..26db2d34d1c0 100644 --- a/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c +++ b/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c @@ -156,12 +156,23 @@ static void octep_pfvf_set_mac_addr(struct octep_device *oct, u32 vf_id, { int err; + if (oct->vf_info[vf_id].flags & OCTEON_PFVF_FLAG_MAC_SET_BY_PF) { + dev_err(&oct->pdev->dev, + "VF%d attempted to override administrative set MAC address\n", + vf_id); + rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_NACK; + return; + } + err = octep_ctrl_net_set_mac_addr(oct, vf_id, cmd.s_set_mac.mac_addr, true); if (err) { rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_NACK; - dev_err(&oct->pdev->dev, "Set VF MAC address failed via host control Mbox\n"); + dev_err(&oct->pdev->dev, "Set VF%d MAC address failed via host control Mbox\n", + vf_id); return; } + + ether_addr_copy(oct->vf_info[vf_id].mac_addr, cmd.s_set_mac.mac_addr); rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_ACK; } @@ -171,10 +182,17 @@ static void octep_pfvf_get_mac_addr(struct octep_device *oct, u32 vf_id, { int err; + if (oct->vf_info[vf_id].flags & OCTEON_PFVF_FLAG_MAC_SET_BY_PF) { + dev_dbg(&oct->pdev->dev, "VF%d MAC address set by PF\n", vf_id); + ether_addr_copy(rsp->s_set_mac.mac_addr, oct->vf_info[vf_id].mac_addr); + rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_ACK; + return; + } err = octep_ctrl_net_get_mac_addr(oct, vf_id, rsp->s_set_mac.mac_addr); if (err) { rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_NACK; - dev_err(&oct->pdev->dev, "Get VF MAC address failed via host control Mbox\n"); + dev_err(&oct->pdev->dev, "Get VF%d MAC address failed via host control Mbox\n", + vf_id); return; } rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_ACK; diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h b/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h index 0dc6eead292a..339977c7131a 100644 --- a/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h +++ b/drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h @@ -23,6 +23,9 @@ enum octep_pfvf_mbox_version { #define OCTEP_PFVF_MBOX_VERSION_CURRENT OCTEP_PFVF_MBOX_VERSION_V2 +/* VF flags */ +#define OCTEON_PFVF_FLAG_MAC_SET_BY_PF BIT_ULL(0) /* PF has set VF MAC address */ + enum octep_pfvf_mbox_opcode { OCTEP_PFVF_MBOX_CMD_VERSION, OCTEP_PFVF_MBOX_CMD_SET_MTU,
These APIs are needed to support applications that use netlink to get VF information from a PF driver. Signed-off-by: Shinas Rasheed <srasheed@marvell.com> --- V2: - Corrected typos, and removed not supported ndo_set_vf* hooks V1: https://lore.kernel.org/all/20241107121637.1117089-1-srasheed@marvell.com/ .../ethernet/marvell/octeon_ep/octep_main.c | 41 +++++++++++++++++++ .../ethernet/marvell/octeon_ep/octep_main.h | 1 + .../marvell/octeon_ep/octep_pfvf_mbox.c | 22 +++++++++- .../marvell/octeon_ep/octep_pfvf_mbox.h | 3 ++ 4 files changed, 65 insertions(+), 2 deletions(-)