netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next] octeon_ep: add ndo ops for VFs in PF driver
@ 2024-11-07 12:16 Shinas Rasheed
  2024-11-10 13:18 ` Simon Horman
  2024-11-11  6:08 ` Kalesh Anakkur Purayil
  0 siblings, 2 replies; 6+ messages in thread
From: Shinas Rasheed @ 2024-11-07 12:16 UTC (permalink / raw)
  To: netdev, linux-kernel
  Cc: hgani, sedara, vimleshk, thaller, wizhao, kheib, egallen,
	konguyen, horms, frank.feng, Shinas Rasheed, Veerasenareddy Burru,
	Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni

These APIs are needed to support applicaitons that use netlink to get VF
information from a PF driver.

Signed-off-by: Shinas Rasheed <srasheed@marvell.com>
---
 .../ethernet/marvell/octeon_ep/octep_main.c   | 98 +++++++++++++++++++
 .../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, 122 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_main.c b/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
index 549436efc204..129c68f5a4ba 100644
--- a/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
+++ b/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
@@ -1137,6 +1137,95 @@ 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 i, 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);
+	for (i = 0; i < ETH_ALEN; i++)
+		oct->vf_info[vf].mac_addr[i] = mac[i];
+	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;
+	}
+
+	return 0;
+}
+
+static int octep_set_vf_vlan(struct net_device *dev, int vf, u16 vlan, u8 qos, __be16 vlan_proto)
+{
+	struct octep_device *oct = netdev_priv(dev);
+
+	dev_err(&oct->pdev->dev, "Setting VF VLAN not supported\n");
+	return 0;
+}
+
+static int octep_set_vf_spoofchk(struct net_device *dev, int vf, bool setting)
+{
+	struct octep_device *oct = netdev_priv(dev);
+
+	dev_err(&oct->pdev->dev, "Setting VF spoof check not supported\n");
+	return 0;
+}
+
+static int octep_set_vf_trust(struct net_device *dev, int vf, bool setting)
+{
+	struct octep_device *oct = netdev_priv(dev);
+
+	dev_err(&oct->pdev->dev, "Setting VF trust not supported\n");
+	return 0;
+}
+
+static int octep_set_vf_rate(struct net_device *dev, int vf, int min_tx_rate, int max_tx_rate)
+{
+	struct octep_device *oct = netdev_priv(dev);
+
+	dev_err(&oct->pdev->dev, "Setting VF rate not supported\n");
+	return 0;
+}
+
+static int octep_set_vf_link_state(struct net_device *dev, int vf, int link_state)
+{
+	struct octep_device *oct = netdev_priv(dev);
+
+	dev_err(&oct->pdev->dev, "Setting VF link state not supported\n");
+	return 0;
+}
+
+static int octep_get_vf_stats(struct net_device *dev, int vf, struct ifla_vf_stats *vf_stats)
+{
+	struct octep_device *oct = netdev_priv(dev);
+
+	dev_err(&oct->pdev->dev, "Getting VF stats not supported\n");
+	return 0;
+}
+
 static const struct net_device_ops octep_netdev_ops = {
 	.ndo_open                = octep_open,
 	.ndo_stop                = octep_stop,
@@ -1146,6 +1235,15 @@ 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,
+	.ndo_set_vf_vlan         = octep_set_vf_vlan,
+	.ndo_set_vf_spoofchk     = octep_set_vf_spoofchk,
+	.ndo_set_vf_trust        = octep_set_vf_trust,
+	.ndo_set_vf_rate         = octep_set_vf_rate,
+	.ndo_set_vf_link_state   = octep_set_vf_link_state,
+	.ndo_get_vf_stats        = octep_get_vf_stats,
 };
 
 /**
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..be21ad5ec75e 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 attampted 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,
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next] octeon_ep: add ndo ops for VFs in PF driver
  2024-11-07 12:16 [PATCH net-next] octeon_ep: add ndo ops for VFs in PF driver Shinas Rasheed
@ 2024-11-10 13:18 ` Simon Horman
  2024-11-11  5:29   ` [EXTERNAL] " Shinas Rasheed
  2024-11-11  6:08 ` Kalesh Anakkur Purayil
  1 sibling, 1 reply; 6+ messages in thread
From: Simon Horman @ 2024-11-10 13:18 UTC (permalink / raw)
  To: Shinas Rasheed
  Cc: netdev, linux-kernel, hgani, sedara, vimleshk, thaller, wizhao,
	kheib, egallen, konguyen, frank.feng, Veerasenareddy Burru,
	Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni

On Thu, Nov 07, 2024 at 04:16:37AM -0800, Shinas Rasheed wrote:
> These APIs are needed to support applicaitons that use netlink to get VF
> information from a PF driver.
> 
> Signed-off-by: Shinas Rasheed <srasheed@marvell.com>

...

> +static int octep_set_vf_vlan(struct net_device *dev, int vf, u16 vlan, u8 qos, __be16 vlan_proto)
> +{
> +	struct octep_device *oct = netdev_priv(dev);
> +
> +	dev_err(&oct->pdev->dev, "Setting VF VLAN not supported\n");
> +	return 0;
> +}

Hi Shinas,

Given that the operation is not supported I think it would
be more appropriate to return -EOPNOTSUPP. And moreover, given
that this is a noop, I think it would be yet more appropriate
not to implement it at all and let the core treat it as not supported.

Likewise for other NDOs implemented as noops in this patch.

...

^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: [EXTERNAL] Re: [PATCH net-next] octeon_ep: add ndo ops for VFs in PF driver
  2024-11-10 13:18 ` Simon Horman
@ 2024-11-11  5:29   ` Shinas Rasheed
  2024-11-12 14:12     ` Simon Horman
  0 siblings, 1 reply; 6+ messages in thread
From: Shinas Rasheed @ 2024-11-11  5:29 UTC (permalink / raw)
  To: Simon Horman
  Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Haseeb Gani,
	Sathesh B Edara, Vimlesh Kumar, thaller@redhat.com,
	wizhao@redhat.com, kheib@redhat.com, egallen@redhat.com,
	konguyen@redhat.com, frank.feng@synaxg.com, Veerasenareddy Burru,
	Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni

Hi Simon,

On Thu, Nov 07, 2024 at 04:16:37AM -0800, Shinas Rasheed wrote:
>> These APIs are needed to support applicaitons that use netlink to get VF
>> information from a PF driver.
>> 
>> Signed-off-by: Shinas Rasheed <mailto:srasheed@marvell.com>
>
>...
>
>> +static int octep_set_vf_vlan(struct net_device *dev, int vf, u16 vlan, u8 qos, __be16 vlan_proto)
>> +{
>> +	struct octep_device *oct = netdev_priv(dev);
>> +
>> +	dev_err(&oct->pdev->dev, "Setting VF VLAN not supported\n");>
>> +	return 0;
>> +}
>
>Hi Shinas,
>
>Given that the operation is not supported I think it would
>be more appropriate to return -EOPNOTSUPP. And moreover, given
>that this is a noop, I think it would be yet more appropriate
>not to implement it at all and let the core treat it as not supported.
>
>Likewise for other NDOs implemented as noops in this patch.
>
>...

I think the problem was for some userspace programs and operators, sometimes returning -EOPNOTSUPP is a no-go. I think the idea was at least if the user saw these messages, they would know to
set it in some other way, and also not have the operator stop just because setting these values failed. Though I understand that’s counter-intuitive, but sometimes it lets operators work and go ahead. What do you think so?

Thanks for the comments!

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next] octeon_ep: add ndo ops for VFs in PF driver
  2024-11-07 12:16 [PATCH net-next] octeon_ep: add ndo ops for VFs in PF driver Shinas Rasheed
  2024-11-10 13:18 ` Simon Horman
@ 2024-11-11  6:08 ` Kalesh Anakkur Purayil
  2024-11-12 18:30   ` [EXTERNAL] " Shinas Rasheed
  1 sibling, 1 reply; 6+ messages in thread
From: Kalesh Anakkur Purayil @ 2024-11-11  6:08 UTC (permalink / raw)
  To: Shinas Rasheed
  Cc: netdev, linux-kernel, hgani, sedara, vimleshk, thaller, wizhao,
	kheib, egallen, konguyen, horms, frank.feng, Veerasenareddy Burru,
	Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni

[-- Attachment #1: Type: text/plain, Size: 8945 bytes --]

Hi Shinas,

On Thu, Nov 7, 2024 at 5:47 PM Shinas Rasheed <srasheed@marvell.com> wrote:
>
> These APIs are needed to support applicaitons that use netlink to get VF
[d] typo in applications
> information from a PF driver.
>
> Signed-off-by: Shinas Rasheed <srasheed@marvell.com>
> ---
>  .../ethernet/marvell/octeon_ep/octep_main.c   | 98 +++++++++++++++++++
>  .../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, 122 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_main.c b/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
> index 549436efc204..129c68f5a4ba 100644
> --- a/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
> +++ b/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
> @@ -1137,6 +1137,95 @@ 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 i, 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);
> +       for (i = 0; i < ETH_ALEN; i++)
> +               oct->vf_info[vf].mac_addr[i] = mac[i];
[Kalesh] Is there any reason to no do a memcpy here or a ether_addr_copy()?
> +       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);
[d] looks like this return is unnecessary. You can "return rc" at the
end of the function.
> +               return err;
> +       }
> +
> +       return 0;
> +}
> +
> +static int octep_set_vf_vlan(struct net_device *dev, int vf, u16 vlan, u8 qos, __be16 vlan_proto)
> +{
> +       struct octep_device *oct = netdev_priv(dev);
> +
> +       dev_err(&oct->pdev->dev, "Setting VF VLAN not supported\n");
> +       return 0;
> +}
> +
> +static int octep_set_vf_spoofchk(struct net_device *dev, int vf, bool setting)
> +{
> +       struct octep_device *oct = netdev_priv(dev);
> +
> +       dev_err(&oct->pdev->dev, "Setting VF spoof check not supported\n");
> +       return 0;
> +}
> +
> +static int octep_set_vf_trust(struct net_device *dev, int vf, bool setting)
> +{
> +       struct octep_device *oct = netdev_priv(dev);
> +
> +       dev_err(&oct->pdev->dev, "Setting VF trust not supported\n");
> +       return 0;
> +}
> +
> +static int octep_set_vf_rate(struct net_device *dev, int vf, int min_tx_rate, int max_tx_rate)
> +{
> +       struct octep_device *oct = netdev_priv(dev);
> +
> +       dev_err(&oct->pdev->dev, "Setting VF rate not supported\n");
> +       return 0;
> +}
> +
> +static int octep_set_vf_link_state(struct net_device *dev, int vf, int link_state)
> +{
> +       struct octep_device *oct = netdev_priv(dev);
> +
> +       dev_err(&oct->pdev->dev, "Setting VF link state not supported\n");
> +       return 0;
> +}
> +
> +static int octep_get_vf_stats(struct net_device *dev, int vf, struct ifla_vf_stats *vf_stats)
> +{
> +       struct octep_device *oct = netdev_priv(dev);
> +
> +       dev_err(&oct->pdev->dev, "Getting VF stats not supported\n");
> +       return 0;
> +}
[Kalesh] Do not expose the support for these unsupported hooks in
struct net_device_ops. Stack has a check for the support before
invoking the callback.
> +
>  static const struct net_device_ops octep_netdev_ops = {
>         .ndo_open                = octep_open,
>         .ndo_stop                = octep_stop,
> @@ -1146,6 +1235,15 @@ 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,
> +       .ndo_set_vf_vlan         = octep_set_vf_vlan,
> +       .ndo_set_vf_spoofchk     = octep_set_vf_spoofchk,
> +       .ndo_set_vf_trust        = octep_set_vf_trust,
> +       .ndo_set_vf_rate         = octep_set_vf_rate,
> +       .ndo_set_vf_link_state   = octep_set_vf_link_state,
> +       .ndo_get_vf_stats        = octep_get_vf_stats,
>  };
>
>  /**
> 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..be21ad5ec75e 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 attampted to override administrative set MAC address\n",
[d] typo in "attempted"
> +                       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,
> --
> 2.25.1
>
>


-- 
Regards,
Kalesh A P

[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4239 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [EXTERNAL] Re: [PATCH net-next] octeon_ep: add ndo ops for VFs in PF driver
  2024-11-11  5:29   ` [EXTERNAL] " Shinas Rasheed
@ 2024-11-12 14:12     ` Simon Horman
  0 siblings, 0 replies; 6+ messages in thread
From: Simon Horman @ 2024-11-12 14:12 UTC (permalink / raw)
  To: Shinas Rasheed
  Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Haseeb Gani,
	Sathesh B Edara, Vimlesh Kumar, thaller@redhat.com,
	wizhao@redhat.com, kheib@redhat.com, egallen@redhat.com,
	konguyen@redhat.com, frank.feng@synaxg.com, Veerasenareddy Burru,
	Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni

On Mon, Nov 11, 2024 at 05:29:53AM +0000, Shinas Rasheed wrote:
> Hi Simon,
> 
> On Thu, Nov 07, 2024 at 04:16:37AM -0800, Shinas Rasheed wrote:
> >> These APIs are needed to support applicaitons that use netlink to get VF
> >> information from a PF driver.
> >> 
> >> Signed-off-by: Shinas Rasheed <mailto:srasheed@marvell.com>
> >
> >...
> >
> >> +static int octep_set_vf_vlan(struct net_device *dev, int vf, u16 vlan, u8 qos, __be16 vlan_proto)
> >> +{
> >> +	struct octep_device *oct = netdev_priv(dev);
> >> +
> >> +	dev_err(&oct->pdev->dev, "Setting VF VLAN not supported\n");>
> >> +	return 0;
> >> +}
> >
> >Hi Shinas,
> >
> >Given that the operation is not supported I think it would
> >be more appropriate to return -EOPNOTSUPP. And moreover, given
> >that this is a noop, I think it would be yet more appropriate
> >not to implement it at all and let the core treat it as not supported.
> >
> >Likewise for other NDOs implemented as noops in this patch.
> >
> >...
> 
> I think the problem was for some userspace programs and operators, sometimes returning -EOPNOTSUPP is a no-go. I think the idea was at least if the user saw these messages, they would know to
> set it in some other way, and also not have the operator stop just because setting these values failed. Though I understand that’s counter-intuitive, but sometimes it lets operators work and go ahead. What do you think so?

Hi Shinas,

I think it would be good to provide more detail of such use-cases:
my understanding is that not implementing the operations would
be the go-to solution if they are not supported by the driver.

> 
> Thanks for the comments!

^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: [EXTERNAL] Re: [PATCH net-next] octeon_ep: add ndo ops for VFs in PF driver
  2024-11-11  6:08 ` Kalesh Anakkur Purayil
@ 2024-11-12 18:30   ` Shinas Rasheed
  0 siblings, 0 replies; 6+ messages in thread
From: Shinas Rasheed @ 2024-11-12 18:30 UTC (permalink / raw)
  To: Kalesh Anakkur Purayil
  Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Haseeb Gani,
	Sathesh B Edara, Vimlesh Kumar, thaller@redhat.com,
	wizhao@redhat.com, kheib@redhat.com, egallen@redhat.com,
	konguyen@redhat.com, horms@kernel.org, frank.feng@synaxg.com,
	Veerasenareddy Burru, Andrew Lunn, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni

Hi Kalesh,

> -----Original Message-----
> From: Kalesh Anakkur Purayil <kalesh-anakkur.purayil@broadcom.com>
> Sent: Monday, November 11, 2024 11:39 AM
> To: Shinas Rasheed <srasheed@marvell.com>
> Cc: netdev@vger.kernel.org; linux-kernel@vger.kernel.org; Haseeb Gani
> <hgani@marvell.com>; Sathesh B Edara <sedara@marvell.com>; Vimlesh
> Kumar <vimleshk@marvell.com>; thaller@redhat.com; wizhao@redhat.com;
> kheib@redhat.com; egallen@redhat.com; konguyen@redhat.com;
> horms@kernel.org; frank.feng@synaxg.com; Veerasenareddy Burru
> <vburru@marvell.com>; Andrew Lunn <andrew+netdev@lunn.ch>; David S.
> Miller <davem@davemloft.net>; Eric Dumazet <edumazet@google.com>;
> Jakub Kicinski <kuba@kernel.org>; Paolo Abeni <pabeni@redhat.com>
> Subject: [EXTERNAL] Re: [PATCH net-next] octeon_ep: add ndo ops for VFs in
> PF driver
> 
> Hi Shinas,
> 
> On Thu, Nov 7, 2024 at 5:47 PM Shinas Rasheed <srasheed@marvell.com>
> wrote:
> >
> > These APIs are needed to support applicaitons that use netlink to get VF
> [d] typo in applications
> > information from a PF driver.
> >
> > Signed-off-by: Shinas Rasheed <srasheed@marvell.com>
> > ---
> >  .../ethernet/marvell/octeon_ep/octep_main.c   | 98 +++++++++++++++++++
> >  .../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, 122 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
> b/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
> > index 549436efc204..129c68f5a4ba 100644
> > --- a/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
> > +++ b/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
> > @@ -1137,6 +1137,95 @@ 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 i, 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);
> > +       for (i = 0; i < ETH_ALEN; i++)
> > +               oct->vf_info[vf].mac_addr[i] = mac[i];
> [Kalesh] Is there any reason to no do a memcpy here or a ether_addr_copy()?

ACK

> > +       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);
> [d] looks like this return is unnecessary. You can "return rc" at the
> end of the function.

ACK

> > +static int octep_get_vf_stats(struct net_device *dev, int vf, struct
> ifla_vf_stats *vf_stats)
> > +{
> > +       struct octep_device *oct = netdev_priv(dev);
> > +
> > +       dev_err(&oct->pdev->dev, "Getting VF stats not supported\n");
> > +       return 0;
> > +}
> [Kalesh] Do not expose the support for these unsupported hooks in
> struct net_device_ops. Stack has a check for the support before
> invoking the callback.

ACK

> > +
> >  static const struct net_device_ops octep_netdev_ops = {
> >         .ndo_open                = octep_open,
> >         .ndo_stop                = octep_stop,
> > @@ -1146,6 +1235,15 @@ 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,
> > +       .ndo_set_vf_vlan         = octep_set_vf_vlan,
> > +       .ndo_set_vf_spoofchk     = octep_set_vf_spoofchk,
> > +       .ndo_set_vf_trust        = octep_set_vf_trust,
> > +       .ndo_set_vf_rate         = octep_set_vf_rate,
> > +       .ndo_set_vf_link_state   = octep_set_vf_link_state,
> > +       .ndo_get_vf_stats        = octep_get_vf_stats,
> >  };
> >
> >  /**
> > 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..be21ad5ec75e 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 attampted to override administrative set MAC
> address\n",
> [d] typo in "attempted"

ACK

Shall post next patch

Thanks,
Shinas

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-11-12 18:30 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-07 12:16 [PATCH net-next] octeon_ep: add ndo ops for VFs in PF driver Shinas Rasheed
2024-11-10 13:18 ` Simon Horman
2024-11-11  5:29   ` [EXTERNAL] " Shinas Rasheed
2024-11-12 14:12     ` Simon Horman
2024-11-11  6:08 ` Kalesh Anakkur Purayil
2024-11-12 18:30   ` [EXTERNAL] " Shinas Rasheed

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).