diff mbox series

[2/3] net: mana: Implement set_link_ksettings in ethtool for speed

Message ID 1742473341-15262-3-git-send-email-ernis@linux.microsoft.com (mailing list archive)
State New
Headers show
Series Add support for speed in MANA ethtool | expand

Commit Message

Erni Sri Satya Vennela March 20, 2025, 12:22 p.m. UTC
Add support for ethtool_set_link_ksettings for mana.
Set speed information of the port using ethtool. This
feature is not supported by all hardware.

Before the change:
$ethtool -s enP30832s1 speed 100
>netlink error: Operation not supported
$ethtool enP30832s1
>Settings for enP30832s1:
        Supported ports: [  ]
        Supported link modes:   Not reported
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: Unknown!
        Duplex: Full
        Auto-negotiation: off
        Port: Other
        PHYAD: 0
        Transceiver: internal
        Link detected: yes

After the change:
$ethtool -s enP30832s1 speed 100
$ethtool enP30832s1
>Settings for enP30832s1:
        Supported ports: [  ]
        Supported link modes:   Not reported
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: 100Mb/s
        Duplex: Full
        Auto-negotiation: off
        Port: Other
        PHYAD: 0
        Transceiver: internal
        Link detected: yes

Signed-off-by: Erni Sri Satya Vennela <ernis@linux.microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: Shradha Gupta <shradhagupta@linux.microsoft.com>
---
 drivers/net/ethernet/microsoft/mana/mana_en.c | 39 +++++++++++++++++++
 .../ethernet/microsoft/mana/mana_ethtool.c    | 13 +++++++
 include/net/mana/mana.h                       | 16 ++++++++
 3 files changed, 68 insertions(+)

Comments

Andrew Lunn March 20, 2025, 1:43 p.m. UTC | #1
On Thu, Mar 20, 2025 at 05:22:20AM -0700, Erni Sri Satya Vennela wrote:
> Add support for ethtool_set_link_ksettings for mana.
> Set speed information of the port using ethtool. This
> feature is not supported by all hardware.
> 
> Before the change:
> $ethtool -s enP30832s1 speed 100
> >netlink error: Operation not supported
> $ethtool enP30832s1
> >Settings for enP30832s1:
>         Supported ports: [  ]
>         Supported link modes:   Not reported

Since there are no link modes, what does this speed actually mean?

> After the change:
> $ethtool -s enP30832s1 speed 100

Is 

$ethtool -s enP30832s1 speed 42

permitted? 

or

$ethtool -s enP30832s1 speed -1

	Andrew
Erni Sri Satya Vennela March 25, 2025, 5:09 p.m. UTC | #2
On Thu, Mar 20, 2025 at 02:43:34PM +0100, Andrew Lunn wrote:
> On Thu, Mar 20, 2025 at 05:22:20AM -0700, Erni Sri Satya Vennela wrote:
> > Add support for ethtool_set_link_ksettings for mana.
> > Set speed information of the port using ethtool. This
> > feature is not supported by all hardware.
> > 
> > Before the change:
> > $ethtool -s enP30832s1 speed 100
> > >netlink error: Operation not supported
> > $ethtool enP30832s1
> > >Settings for enP30832s1:
> >         Supported ports: [  ]
> >         Supported link modes:   Not reported
> 
> Since there are no link modes, what does this speed actually mean?
> 
Initially we planned to support for speed incrementally by 1Mbps, but
after internal discussion with the host team, we will be supporting 
only speed which is multiples of 100. The HWC commands 
MANA_QUERY_LINK_CONFIG and MANA_SET_BW_CLAMP help us to get and
set the speed in the hardware respectively.
> > After the change:
> > $ethtool -s enP30832s1 speed 100
> 
> Is 
> 
> $ethtool -s enP30832s1 speed 42
> 
> permitted? 
> 
The user will be allowed to set the speed which are multiples 
of 100. And the minimum allowed bandwidth is 100Mbps. I will be making
this change in the next version of this patch.
> or
> 
> $ethtool -s enP30832s1 speed -1
> 
This case is handled by the firmware, which throws an error:
ethtool (-s): invalid value '-1' for parameter 'speed'
> 	Andrew
Andrew Lunn March 25, 2025, 5:52 p.m. UTC | #3
> > $ethtool -s enP30832s1 speed -1
> > 
> This case is handled by the firmware, which throws an error:
> ethtool (-s): invalid value '-1' for parameter 'speed'

So how do i remove the speed limitation i previously installed? -1 is
SPEED_UNKNOWN which is what you default to.

Using TC would be more natural in this case. The user action is to
remove the TC filter and that should set it back to unlimited.

	Andrew
Jakub Kicinski March 25, 2025, 7:21 p.m. UTC | #4
On Tue, 25 Mar 2025 18:52:40 +0100 Andrew Lunn wrote:
> Using TC would be more natural in this case. The user action is to
> remove the TC filter and that should set it back to unlimited.

better still - net shapers
Haiyang Zhang March 25, 2025, 7:53 p.m. UTC | #5
> -----Original Message-----
> From: Jakub Kicinski <kuba@kernel.org>
> Sent: Tuesday, March 25, 2025 3:22 PM
> To: Andrew Lunn <andrew@lunn.ch>
> Cc: Erni Sri Satya Vennela <ernis@linux.microsoft.com>; KY Srinivasan
> <kys@microsoft.com>; Haiyang Zhang <haiyangz@microsoft.com>;
> wei.liu@kernel.org; Dexuan Cui <decui@microsoft.com>;
> andrew+netdev@lunn.ch; davem@davemloft.net; edumazet@google.com;
> pabeni@redhat.com; Long Li <longli@microsoft.com>; Konstantin Taranov
> <kotaranov@microsoft.com>; horms@kernel.org; brett.creeley@amd.com;
> surenb@google.com; schakrabarti@linux.microsoft.com;
> kent.overstreet@linux.dev; shradhagupta@linux.microsoft.com;
> erick.archer@outlook.com; rosenp@gmail.com; linux-hyperv@vger.kernel.org;
> netdev@vger.kernel.org; linux-kernel@vger.kernel.org; linux-
> rdma@vger.kernel.org
> Subject: [EXTERNAL] Re: [PATCH 2/3] net: mana: Implement
> set_link_ksettings in ethtool for speed
> 
> On Tue, 25 Mar 2025 18:52:40 +0100 Andrew Lunn wrote:
> > Using TC would be more natural in this case. The user action is to
> > remove the TC filter and that should set it back to unlimited.
> 
> better still - net shapers

Thank you, Andrew & Jakub:
Sure, there are many (better) ways to control/shape the traffic.

This patch is just to support the ethtool option for the speed.
And seems there is no option on ethtool to reset NIC to the default
speed?

- Haiyang
Andrew Lunn March 25, 2025, 7:58 p.m. UTC | #6
> This patch is just to support the ethtool option for the speed.
> And seems there is no option on ethtool to reset NIC to the default
> speed?

There is no such thing as default speed. Speed is either:

1) Negotiated with the link partner, picking the highest speed link
modes both partners support

2) Forced to a specific speed, based on one of the link modes the
interfaces supports.

Since you don't have link modes, you are abusing the API. You should
choose a different API which actually fits what you are doing,
configuring a leaky bucket shaper.

	Andrew
Haiyang Zhang March 25, 2025, 8:28 p.m. UTC | #7
> -----Original Message-----
> From: Andrew Lunn <andrew@lunn.ch>
> Sent: Tuesday, March 25, 2025 3:59 PM
> To: Haiyang Zhang <haiyangz@microsoft.com>
> Cc: Jakub Kicinski <kuba@kernel.org>; Erni Sri Satya Vennela
> <ernis@linux.microsoft.com>; KY Srinivasan <kys@microsoft.com>;
> wei.liu@kernel.org; Dexuan Cui <decui@microsoft.com>;
> andrew+netdev@lunn.ch; davem@davemloft.net; edumazet@google.com;
> pabeni@redhat.com; Long Li <longli@microsoft.com>; Konstantin Taranov
> <kotaranov@microsoft.com>; horms@kernel.org; brett.creeley@amd.com;
> surenb@google.com; schakrabarti@linux.microsoft.com;
> kent.overstreet@linux.dev; shradhagupta@linux.microsoft.com;
> erick.archer@outlook.com; rosenp@gmail.com; linux-hyperv@vger.kernel.org;
> netdev@vger.kernel.org; linux-kernel@vger.kernel.org; linux-
> rdma@vger.kernel.org; Paul Rosswurm <paulros@microsoft.com>
> Subject: Re: [EXTERNAL] Re: [PATCH 2/3] net: mana: Implement
> set_link_ksettings in ethtool for speed
> 
> > This patch is just to support the ethtool option for the speed.
> > And seems there is no option on ethtool to reset NIC to the default
> > speed?
> 
> There is no such thing as default speed. Speed is either:
> 
> 1) Negotiated with the link partner, picking the highest speed link
> modes both partners support
> 
> 2) Forced to a specific speed, based on one of the link modes the
> interfaces supports.
> 
> Since you don't have link modes, you are abusing the API. You should
> choose a different API which actually fits what you are doing,
> configuring a leaky bucket shaper.
> 

Could you please point us to the interface struct, callback function
names, and/or docs you are suggesting us to use?

Thanks,
- Haiyang
Andrew Lunn March 25, 2025, 8:38 p.m. UTC | #8
> Could you please point us to the interface struct, callback function
> names, and/or docs you are suggesting us to use?

If you cannot search the sources for tc htb, or net shaper, google the
same, etc, you probably cannot write the code either.

http://www.catb.org/esr/faqs/smart-questions.html

	Andrew
diff mbox series

Patch

diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c
index 5fa8e1e2ff9a..bcc273427423 100644
--- a/drivers/net/ethernet/microsoft/mana/mana_en.c
+++ b/drivers/net/ethernet/microsoft/mana/mana_en.c
@@ -1203,6 +1203,45 @@  int mana_query_link_cfg(struct mana_port_context *apc)
 	return err;
 }
 
+int mana_set_bw_clamp(struct mana_port_context *apc, u32 speed)
+{
+	struct mana_set_bw_clamp_req req = {};
+	struct mana_set_bw_clamp_resp resp = {};
+	struct net_device *ndev = apc->ndev;
+	int err;
+
+	mana_gd_init_req_hdr(&req.hdr, MANA_SET_BW_CLAMP,
+			     sizeof(req), sizeof(resp));
+	req.vport = apc->port_handle;
+	req.link_speed = speed;
+	req.enable_clamping = TRI_STATE_TRUE;
+
+	err = mana_send_request(apc->ac, &req, sizeof(req), &resp,
+				sizeof(resp));
+
+	if (err) {
+		netdev_err(ndev, "Failed to set bandwidth clamp for speed %u, err = %d",
+			   speed, err);
+		return err;
+	}
+
+	err = mana_verify_resp_hdr(&resp.hdr, MANA_SET_BW_CLAMP,
+				   sizeof(resp));
+
+	if (err || resp.hdr.status) {
+		netdev_err(ndev, "Failed to set bandwidth clamp: %d, 0x%x\n", err,
+			   resp.hdr.status);
+		if (!err)
+			err = -EPROTO;
+		return err;
+	}
+
+	if (resp.qos_unconfigured)
+		netdev_info(ndev, "QoS is unconfigured\n");
+
+	return 0;
+}
+
 int mana_create_wq_obj(struct mana_port_context *apc,
 		       mana_handle_t vport,
 		       u32 wq_type, struct mana_obj_spec *wq_spec,
diff --git a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c b/drivers/net/ethernet/microsoft/mana/mana_ethtool.c
index 48234a738d26..b29d0fe0a201 100644
--- a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c
+++ b/drivers/net/ethernet/microsoft/mana/mana_ethtool.c
@@ -439,6 +439,18 @@  static int mana_get_link_ksettings(struct net_device *ndev,
 	return 0;
 }
 
+static int mana_set_link_ksettings(struct net_device *ndev,
+				   const struct ethtool_link_ksettings *cmd)
+{
+	struct mana_port_context *apc = netdev_priv(ndev);
+	int err;
+
+	err = mana_set_bw_clamp(apc, cmd->base.speed);
+
+	apc->speed = (err) ? apc->speed : cmd->base.speed;
+	return 0;
+}
+
 const struct ethtool_ops mana_ethtool_ops = {
 	.get_ethtool_stats	= mana_get_ethtool_stats,
 	.get_sset_count		= mana_get_sset_count,
@@ -453,5 +465,6 @@  const struct ethtool_ops mana_ethtool_ops = {
 	.get_ringparam          = mana_get_ringparam,
 	.set_ringparam          = mana_set_ringparam,
 	.get_link_ksettings	= mana_get_link_ksettings,
+	.set_link_ksettings	= mana_set_link_ksettings,
 	.get_link		= ethtool_op_get_link,
 };
diff --git a/include/net/mana/mana.h b/include/net/mana/mana.h
index 5f039ce99ade..b4c66ce9ee3a 100644
--- a/include/net/mana/mana.h
+++ b/include/net/mana/mana.h
@@ -500,6 +500,7 @@  void mana_chn_setxdp(struct mana_port_context *apc, struct bpf_prog *prog);
 int mana_bpf(struct net_device *ndev, struct netdev_bpf *bpf);
 void mana_query_gf_stats(struct mana_port_context *apc);
 int mana_query_link_cfg(struct mana_port_context *apc);
+int mana_set_bw_clamp(struct mana_port_context *apc, u32 speed);
 int mana_pre_alloc_rxbufs(struct mana_port_context *apc, int mtu, int num_queues);
 void mana_pre_dealloc_rxbufs(struct mana_port_context *apc);
 
@@ -527,6 +528,7 @@  enum mana_command_code {
 	MANA_CONFIG_VPORT_RX	= 0x20007,
 	MANA_QUERY_VPORT_CONFIG	= 0x20008,
 	MANA_QUERY_LINK_CONFIG	= 0x2000A,
+	MANA_SET_BW_CLAMP	= 0x2000B,
 
 	/* Privileged commands for the PF mode */
 	MANA_REGISTER_FILTER	= 0x28000,
@@ -548,6 +550,20 @@  struct mana_query_link_config_resp {
 	u8 reserved[3];
 }; /* HW DATA */
 
+/* Set Bandwidth Clamp*/
+struct mana_set_bw_clamp_req {
+	struct gdma_req_hdr hdr;
+	mana_handle_t vport;
+	enum TRI_STATE enable_clamping;
+	u32 link_speed;
+}; /* HW DATA */
+
+struct mana_set_bw_clamp_resp {
+	struct gdma_resp_hdr hdr;
+	bool qos_unconfigured;
+	u8 reserved[7];
+}; /* HW DATA */
+
 /* Query Device Configuration */
 struct mana_query_device_cfg_req {
 	struct gdma_req_hdr hdr;