netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next] net: mana: Support HW link state events
@ 2025-10-13 19:33 Haiyang Zhang
  2025-10-13 21:13 ` Andrew Lunn
  0 siblings, 1 reply; 5+ messages in thread
From: Haiyang Zhang @ 2025-10-13 19:33 UTC (permalink / raw)
  To: linux-hyperv, netdev
  Cc: haiyangz, paulros, decui, kys, wei.liu, edumazet, davem, kuba,
	pabeni, longli, ssengar, ernis, dipayanroy, kotaranov, horms,
	shradhagupta, leon, mlevitsk, yury.norov, shirazsaleem,
	andrew+netdev, linux-rdma, linux-kernel

From: Haiyang Zhang <haiyangz@microsoft.com>

Handle the HW link state events received from HW channel, and
set the proper link state, also stop/wake queues accordingly.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
---
 .../net/ethernet/microsoft/mana/gdma_main.c   |  1 +
 .../net/ethernet/microsoft/mana/hw_channel.c  | 12 ++++
 drivers/net/ethernet/microsoft/mana/mana_en.c | 64 +++++++++++++++++--
 include/net/mana/gdma.h                       |  4 +-
 include/net/mana/hw_channel.h                 |  2 +
 include/net/mana/mana.h                       |  4 ++
 6 files changed, 79 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/ethernet/microsoft/mana/gdma_main.c
index 43f034e180c4..effe0a2f207a 100644
--- a/drivers/net/ethernet/microsoft/mana/gdma_main.c
+++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c
@@ -528,6 +528,7 @@ static void mana_gd_process_eqe(struct gdma_queue *eq)
 	case GDMA_EQE_HWC_INIT_DONE:
 	case GDMA_EQE_HWC_SOC_SERVICE:
 	case GDMA_EQE_RNIC_QP_FATAL:
+	case GDMA_EQE_HWC_SOC_RECONFIG_DATA:
 		if (!eq->eq.callback)
 			break;
 
diff --git a/drivers/net/ethernet/microsoft/mana/hw_channel.c b/drivers/net/ethernet/microsoft/mana/hw_channel.c
index ada6c78a2bef..4d4113628027 100644
--- a/drivers/net/ethernet/microsoft/mana/hw_channel.c
+++ b/drivers/net/ethernet/microsoft/mana/hw_channel.c
@@ -118,6 +118,7 @@ static void mana_hwc_init_event_handler(void *ctx, struct gdma_queue *q_self,
 	struct gdma_dev *gd = hwc->gdma_dev;
 	union hwc_init_type_data type_data;
 	union hwc_init_eq_id_db eq_db;
+	struct mana_context *ac;
 	u32 type, val;
 	int ret;
 
@@ -196,6 +197,17 @@ static void mana_hwc_init_event_handler(void *ctx, struct gdma_queue *q_self,
 			hwc->hwc_timeout = val;
 			break;
 
+		case HWC_DATA_HW_LINK_CONNECT:
+		case HWC_DATA_HW_LINK_DISCONNECT:
+			ac = gd->gdma_context->mana.driver_data;
+			if (!ac)
+				break;
+
+			ac->link_event = type;
+			schedule_delayed_work(&ac->link_change_work, 0);
+
+			break;
+
 		default:
 			dev_warn(hwc->dev, "Received unknown reconfig type %u\n", type);
 			break;
diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c
index 0142fd98392c..1cf784740037 100644
--- a/drivers/net/ethernet/microsoft/mana/mana_en.c
+++ b/drivers/net/ethernet/microsoft/mana/mana_en.c
@@ -20,6 +20,7 @@
 
 #include <net/mana/mana.h>
 #include <net/mana/mana_auxiliary.h>
+#include <net/mana/hw_channel.h>
 
 static DEFINE_IDA(mana_adev_ida);
 
@@ -84,8 +85,9 @@ static int mana_open(struct net_device *ndev)
 	/* Ensure port state updated before txq state */
 	smp_wmb();
 
-	netif_carrier_on(ndev);
-	netif_tx_wake_all_queues(ndev);
+	if (netif_carrier_ok(ndev))
+		netif_tx_wake_all_queues(ndev);
+
 	netdev_dbg(ndev, "%s successful\n", __func__);
 	return 0;
 }
@@ -100,6 +102,54 @@ static int mana_close(struct net_device *ndev)
 	return mana_detach(ndev, true);
 }
 
+static void mana_link_state_handle(struct work_struct *w)
+{
+	struct mana_context *ac =
+		container_of(w, struct mana_context, link_change_work.work);
+	struct mana_port_context *apc;
+	struct net_device *ndev;
+	bool link_up;
+	int i;
+
+	if (!rtnl_trylock()) {
+		schedule_delayed_work(&ac->link_change_work, 1);
+		return;
+	}
+
+	if (ac->link_event == HWC_DATA_HW_LINK_CONNECT)
+		link_up = true;
+	else if (ac->link_event == HWC_DATA_HW_LINK_DISCONNECT)
+		link_up = false;
+	else
+		goto out;
+
+	/* Process all ports */
+	for (i = 0; i < ac->num_ports; i++) {
+		ndev = ac->ports[i];
+		if (!ndev)
+			continue;
+
+		apc = netdev_priv(ndev);
+
+		if (link_up) {
+			netif_carrier_on(ndev);
+
+			if (apc->port_is_up)
+				netif_tx_wake_all_queues(ndev);
+
+			__netdev_notify_peers(ndev);
+		} else {
+			if (netif_carrier_ok(ndev)) {
+				netif_tx_disable(ndev);
+				netif_carrier_off(ndev);
+			}
+		}
+	}
+
+out:
+	rtnl_unlock();
+}
+
 static bool mana_can_tx(struct gdma_queue *wq)
 {
 	return mana_gd_wq_avail_space(wq) >= MAX_TX_WQE_SIZE;
@@ -3059,9 +3109,6 @@ int mana_attach(struct net_device *ndev)
 	/* Ensure port state updated before txq state */
 	smp_wmb();
 
-	if (apc->port_is_up)
-		netif_carrier_on(ndev);
-
 	netif_device_attach(ndev);
 
 	return 0;
@@ -3154,7 +3201,6 @@ int mana_detach(struct net_device *ndev, bool from_close)
 	smp_wmb();
 
 	netif_tx_disable(ndev);
-	netif_carrier_off(ndev);
 
 	if (apc->port_st_save) {
 		err = mana_dealloc_queues(ndev);
@@ -3212,7 +3258,7 @@ static int mana_probe_port(struct mana_context *ac, int port_idx,
 
 	netif_set_tso_max_size(ndev, GSO_MAX_SIZE);
 
-	netif_carrier_off(ndev);
+	netif_carrier_on(ndev);
 
 	netdev_rss_key_fill(apc->hashkey, MANA_HASH_KEY_SIZE);
 
@@ -3431,6 +3477,8 @@ int mana_probe(struct gdma_dev *gd, bool resuming)
 
 	if (!resuming) {
 		ac->num_ports = num_ports;
+
+		INIT_DELAYED_WORK(&ac->link_change_work, mana_link_state_handle);
 	} else {
 		if (ac->num_ports != num_ports) {
 			dev_err(dev, "The number of vPorts changed: %d->%d\n",
@@ -3500,6 +3548,8 @@ void mana_remove(struct gdma_dev *gd, bool suspending)
 	int err;
 	int i;
 
+	cancel_delayed_work_sync(&ac->link_change_work);
+
 	/* adev currently doesn't support suspending, always remove it */
 	if (gd->adev)
 		remove_adev(gd);
diff --git a/include/net/mana/gdma.h b/include/net/mana/gdma.h
index 57df78cfbf82..637f42485dba 100644
--- a/include/net/mana/gdma.h
+++ b/include/net/mana/gdma.h
@@ -590,6 +590,7 @@ enum {
 
 /* Driver can self reset on FPGA Reconfig EQE notification */
 #define GDMA_DRV_CAP_FLAG_1_HANDLE_RECONFIG_EQE BIT(17)
+#define GDMA_DRV_CAP_FLAG_1_HW_VPORT_LINK_AWARE BIT(6)
 
 #define GDMA_DRV_CAP_FLAGS1 \
 	(GDMA_DRV_CAP_FLAG_1_EQ_SHARING_MULTI_VPORT | \
@@ -599,7 +600,8 @@ enum {
 	 GDMA_DRV_CAP_FLAG_1_DEV_LIST_HOLES_SUP | \
 	 GDMA_DRV_CAP_FLAG_1_DYNAMIC_IRQ_ALLOC_SUPPORT | \
 	 GDMA_DRV_CAP_FLAG_1_SELF_RESET_ON_EQE | \
-	 GDMA_DRV_CAP_FLAG_1_HANDLE_RECONFIG_EQE)
+	 GDMA_DRV_CAP_FLAG_1_HANDLE_RECONFIG_EQE | \
+	 GDMA_DRV_CAP_FLAG_1_HW_VPORT_LINK_AWARE)
 
 #define GDMA_DRV_CAP_FLAGS2 0
 
diff --git a/include/net/mana/hw_channel.h b/include/net/mana/hw_channel.h
index 83cf93338eb3..16feb39616c1 100644
--- a/include/net/mana/hw_channel.h
+++ b/include/net/mana/hw_channel.h
@@ -24,6 +24,8 @@
 #define HWC_INIT_DATA_PF_DEST_CQ_ID	11
 
 #define HWC_DATA_CFG_HWC_TIMEOUT 1
+#define HWC_DATA_HW_LINK_CONNECT 2
+#define HWC_DATA_HW_LINK_DISCONNECT 3
 
 #define HW_CHANNEL_WAIT_RESOURCE_TIMEOUT_MS 30000
 
diff --git a/include/net/mana/mana.h b/include/net/mana/mana.h
index 0921485565c0..eee90bb9da1e 100644
--- a/include/net/mana/mana.h
+++ b/include/net/mana/mana.h
@@ -477,6 +477,10 @@ struct mana_context {
 	struct dentry *mana_eqs_debugfs;
 
 	struct net_device *ports[MAX_PORTS_IN_MANA_DEV];
+
+	/* Link state change work */
+	struct delayed_work link_change_work;
+	u32 link_event;
 };
 
 struct mana_port_context {
-- 
2.34.1


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

* Re: [PATCH net-next] net: mana: Support HW link state events
  2025-10-13 19:33 [PATCH net-next] net: mana: Support HW link state events Haiyang Zhang
@ 2025-10-13 21:13 ` Andrew Lunn
  2025-10-13 21:47   ` [EXTERNAL] " Haiyang Zhang
  0 siblings, 1 reply; 5+ messages in thread
From: Andrew Lunn @ 2025-10-13 21:13 UTC (permalink / raw)
  To: Haiyang Zhang
  Cc: linux-hyperv, netdev, haiyangz, paulros, decui, kys, wei.liu,
	edumazet, davem, kuba, pabeni, longli, ssengar, ernis, dipayanroy,
	kotaranov, horms, shradhagupta, leon, mlevitsk, yury.norov,
	shirazsaleem, andrew+netdev, linux-rdma, linux-kernel

> +static void mana_link_state_handle(struct work_struct *w)
> +{
> +	struct mana_context *ac =
> +		container_of(w, struct mana_context, link_change_work.work);
> +	struct mana_port_context *apc;
> +	struct net_device *ndev;
> +	bool link_up;
> +	int i;

Since you don't need ac here, i would postpone the assignment into the
body of the function, so keeping with reverse christmass tree.

> +
> +	if (!rtnl_trylock()) {
> +		schedule_delayed_work(&ac->link_change_work, 1);
> +		return;
> +	}

Is there a deadlock you are trying to avoid here? Why not wait for the
lock?

> +
> +	if (ac->link_event == HWC_DATA_HW_LINK_CONNECT)
> +		link_up = true;
> +	else if (ac->link_event == HWC_DATA_HW_LINK_DISCONNECT)
> +		link_up = false;
> +	else
> +		goto out;
> +
> +	/* Process all ports */
> +	for (i = 0; i < ac->num_ports; i++) {
> +		ndev = ac->ports[i];
> +		if (!ndev)
> +			continue;
> +
> +		apc = netdev_priv(ndev);
> +
> +		if (link_up) {
> +			netif_carrier_on(ndev);
> +
> +			if (apc->port_is_up)
> +				netif_tx_wake_all_queues(ndev);
> +
> +			__netdev_notify_peers(ndev);
> +		} else {
> +			if (netif_carrier_ok(ndev)) {
> +				netif_tx_disable(ndev);
> +				netif_carrier_off(ndev);
> +			}
> +		}

It is odd this is asymmetric. Up and down should really be opposites.

> @@ -3500,6 +3548,8 @@ void mana_remove(struct gdma_dev *gd, bool suspending)
>  	int err;
>  	int i;
>  
> +	cancel_delayed_work_sync(&ac->link_change_work);

I don't know delayed work too well. Is this sufficient when the work
requeues itself because it cannot get RTNL?

	Andrew

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

* RE: [EXTERNAL] Re: [PATCH net-next] net: mana: Support HW link state events
  2025-10-13 21:13 ` Andrew Lunn
@ 2025-10-13 21:47   ` Haiyang Zhang
  2025-10-13 23:21     ` Andrew Lunn
  0 siblings, 1 reply; 5+ messages in thread
From: Haiyang Zhang @ 2025-10-13 21:47 UTC (permalink / raw)
  To: Andrew Lunn, Haiyang Zhang
  Cc: linux-hyperv@vger.kernel.org, netdev@vger.kernel.org,
	Paul Rosswurm, Dexuan Cui, KY Srinivasan, wei.liu@kernel.org,
	edumazet@google.com, davem@davemloft.net, kuba@kernel.org,
	pabeni@redhat.com, Long Li, ssengar@linux.microsoft.com,
	ernis@linux.microsoft.com, dipayanroy@linux.microsoft.com,
	Konstantin Taranov, horms@kernel.org,
	shradhagupta@linux.microsoft.com, leon@kernel.org,
	mlevitsk@redhat.com, yury.norov@gmail.com, Shiraz Saleem,
	andrew+netdev@lunn.ch, linux-rdma@vger.kernel.org,
	linux-kernel@vger.kernel.org



> -----Original Message-----
> From: Andrew Lunn <andrew@lunn.ch>
> Sent: Monday, October 13, 2025 5:13 PM
> To: Haiyang Zhang <haiyangz@linux.microsoft.com>
> Cc: linux-hyperv@vger.kernel.org; netdev@vger.kernel.org; Haiyang Zhang
> <haiyangz@microsoft.com>; Paul Rosswurm <paulros@microsoft.com>; Dexuan
> Cui <decui@microsoft.com>; KY Srinivasan <kys@microsoft.com>;
> wei.liu@kernel.org; edumazet@google.com; davem@davemloft.net;
> kuba@kernel.org; pabeni@redhat.com; Long Li <longli@microsoft.com>;
> ssengar@linux.microsoft.com; ernis@linux.microsoft.com;
> dipayanroy@linux.microsoft.com; Konstantin Taranov
> <kotaranov@microsoft.com>; horms@kernel.org;
> shradhagupta@linux.microsoft.com; leon@kernel.org; mlevitsk@redhat.com;
> yury.norov@gmail.com; Shiraz Saleem <shirazsaleem@microsoft.com>;
> andrew+netdev@lunn.ch; linux-rdma@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: [EXTERNAL] Re: [PATCH net-next] net: mana: Support HW link state
> events
> 
> > +static void mana_link_state_handle(struct work_struct *w)
> > +{
> > +	struct mana_context *ac =
> > +		container_of(w, struct mana_context, link_change_work.work);
> > +	struct mana_port_context *apc;
> > +	struct net_device *ndev;
> > +	bool link_up;
> > +	int i;
> 
> Since you don't need ac here, i would postpone the assignment into the
> body of the function, so keeping with reverse christmass tree.
Will do.

> 
> > +
> > +	if (!rtnl_trylock()) {
> > +		schedule_delayed_work(&ac->link_change_work, 1);
> > +		return;
> > +	}
> 
> Is there a deadlock you are trying to avoid here? Why not wait for the
> lock?
I think it's probably not needed, will double check...

> 
> > +
> > +	if (ac->link_event == HWC_DATA_HW_LINK_CONNECT)
> > +		link_up = true;
> > +	else if (ac->link_event == HWC_DATA_HW_LINK_DISCONNECT)
> > +		link_up = false;
> > +	else
> > +		goto out;
> > +
> > +	/* Process all ports */
> > +	for (i = 0; i < ac->num_ports; i++) {
> > +		ndev = ac->ports[i];
> > +		if (!ndev)
> > +			continue;
> > +
> > +		apc = netdev_priv(ndev);
> > +
> > +		if (link_up) {
> > +			netif_carrier_on(ndev);
> > +
> > +			if (apc->port_is_up)
> > +				netif_tx_wake_all_queues(ndev);
> > +
> > +			__netdev_notify_peers(ndev);
> > +		} else {
> > +			if (netif_carrier_ok(ndev)) {
> > +				netif_tx_disable(ndev);
> > +				netif_carrier_off(ndev);
> > +			}
> > +		}
> 
> It is odd this is asymmetric. Up and down should really be opposites.
For the up event, we need to delay the wake up queues if the 
mana_close() is called, or mana_open() isn't called yet.

Also, we notify peers only when link up.

> 
> > @@ -3500,6 +3548,8 @@ void mana_remove(struct gdma_dev *gd, bool
> suspending)
> >  	int err;
> >  	int i;
> >
> > +	cancel_delayed_work_sync(&ac->link_change_work);
> 
> I don't know delayed work too well. Is this sufficient when the work
> requeues itself because it cannot get RTNL?

cancel_work_sync()'s doc says "This function can be used
even if the work re-queues itself".
cancel_delayed_work_sync() calls the same underlying function but 
with WORK_CANCEL_DELAYED flag. So it should be OK.

Thanks,
- Haiyang


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

* Re: [EXTERNAL] Re: [PATCH net-next] net: mana: Support HW link state events
  2025-10-13 21:47   ` [EXTERNAL] " Haiyang Zhang
@ 2025-10-13 23:21     ` Andrew Lunn
  2025-10-14 14:11       ` Haiyang Zhang
  0 siblings, 1 reply; 5+ messages in thread
From: Andrew Lunn @ 2025-10-13 23:21 UTC (permalink / raw)
  To: Haiyang Zhang
  Cc: Haiyang Zhang, linux-hyperv@vger.kernel.org,
	netdev@vger.kernel.org, Paul Rosswurm, Dexuan Cui, KY Srinivasan,
	wei.liu@kernel.org, edumazet@google.com, davem@davemloft.net,
	kuba@kernel.org, pabeni@redhat.com, Long Li,
	ssengar@linux.microsoft.com, ernis@linux.microsoft.com,
	dipayanroy@linux.microsoft.com, Konstantin Taranov,
	horms@kernel.org, shradhagupta@linux.microsoft.com,
	leon@kernel.org, mlevitsk@redhat.com, yury.norov@gmail.com,
	Shiraz Saleem, andrew+netdev@lunn.ch, linux-rdma@vger.kernel.org,
	linux-kernel@vger.kernel.org

> > > +		if (link_up) {
> > > +			netif_carrier_on(ndev);
> > > +
> > > +			if (apc->port_is_up)
> > > +				netif_tx_wake_all_queues(ndev);
> > > +
> > > +			__netdev_notify_peers(ndev);
> > > +		} else {
> > > +			if (netif_carrier_ok(ndev)) {
> > > +				netif_tx_disable(ndev);
> > > +				netif_carrier_off(ndev);
> > > +			}
> > > +		}
> > 
> > It is odd this is asymmetric. Up and down should really be opposites.
> For the up event, we need to delay the wake up queues if the 
> mana_close() is called, or mana_open() isn't called yet.
> 
> Also, we notify peers only when link up.

But why is this not symmetric?

On down, if port_is_up is not true, there is no need to disable tx and
set the carrier off. There are also counters associated with
netif_carrier_off() and netif_carrier_on(), and if you don't call them
in symmetric pairs, the counters are going to look odd.

> cancel_work_sync()'s doc says "This function can be used
> even if the work re-queues itself".
> cancel_delayed_work_sync() calls the same underlying function but 
> with WORK_CANCEL_DELAYED flag. So it should be OK.

O.K, thanks

	Andrew

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

* RE: [EXTERNAL] Re: [PATCH net-next] net: mana: Support HW link state events
  2025-10-13 23:21     ` Andrew Lunn
@ 2025-10-14 14:11       ` Haiyang Zhang
  0 siblings, 0 replies; 5+ messages in thread
From: Haiyang Zhang @ 2025-10-14 14:11 UTC (permalink / raw)
  To: Andrew Lunn
  Cc: Haiyang Zhang, linux-hyperv@vger.kernel.org,
	netdev@vger.kernel.org, Paul Rosswurm, Dexuan Cui, KY Srinivasan,
	wei.liu@kernel.org, edumazet@google.com, davem@davemloft.net,
	kuba@kernel.org, pabeni@redhat.com, Long Li,
	ssengar@linux.microsoft.com, ernis@linux.microsoft.com,
	dipayanroy@linux.microsoft.com, Konstantin Taranov,
	horms@kernel.org, shradhagupta@linux.microsoft.com,
	leon@kernel.org, mlevitsk@redhat.com, yury.norov@gmail.com,
	Shiraz Saleem, andrew+netdev@lunn.ch, linux-rdma@vger.kernel.org,
	linux-kernel@vger.kernel.org



> -----Original Message-----
> From: Andrew Lunn <andrew@lunn.ch>
> Sent: Monday, October 13, 2025 7:22 PM
> To: Haiyang Zhang <haiyangz@microsoft.com>
> Cc: Haiyang Zhang <haiyangz@linux.microsoft.com>; linux-
> hyperv@vger.kernel.org; netdev@vger.kernel.org; Paul Rosswurm
> <paulros@microsoft.com>; Dexuan Cui <decui@microsoft.com>; KY Srinivasan
> <kys@microsoft.com>; wei.liu@kernel.org; edumazet@google.com;
> davem@davemloft.net; kuba@kernel.org; pabeni@redhat.com; Long Li
> <longli@microsoft.com>; ssengar@linux.microsoft.com;
> ernis@linux.microsoft.com; dipayanroy@linux.microsoft.com; Konstantin
> Taranov <kotaranov@microsoft.com>; horms@kernel.org;
> shradhagupta@linux.microsoft.com; leon@kernel.org; mlevitsk@redhat.com;
> yury.norov@gmail.com; Shiraz Saleem <shirazsaleem@microsoft.com>;
> andrew+netdev@lunn.ch; linux-rdma@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: Re: [EXTERNAL] Re: [PATCH net-next] net: mana: Support HW link
> state events
> 
> > > > +		if (link_up) {
> > > > +			netif_carrier_on(ndev);
> > > > +
> > > > +			if (apc->port_is_up)
> > > > +				netif_tx_wake_all_queues(ndev);
> > > > +
> > > > +			__netdev_notify_peers(ndev);
> > > > +		} else {
> > > > +			if (netif_carrier_ok(ndev)) {
> > > > +				netif_tx_disable(ndev);
> > > > +				netif_carrier_off(ndev);
> > > > +			}
> > > > +		}
> > >
> > > It is odd this is asymmetric. Up and down should really be opposites.
> > For the up event, we need to delay the wake up queues if the
> > mana_close() is called, or mana_open() isn't called yet.
> >
> > Also, we notify peers only when link up.
> 
> But why is this not symmetric?
> 
> On down, if port_is_up is not true, there is no need to disable tx and
> set the carrier off. There are also counters associated with
> netif_carrier_off() and netif_carrier_on(), and if you don't call them
> in symmetric pairs, the counters are going to look odd.

I see. Will update the patch.

Thanks,
- Haiyang

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

end of thread, other threads:[~2025-10-14 14:11 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-13 19:33 [PATCH net-next] net: mana: Support HW link state events Haiyang Zhang
2025-10-13 21:13 ` Andrew Lunn
2025-10-13 21:47   ` [EXTERNAL] " Haiyang Zhang
2025-10-13 23:21     ` Andrew Lunn
2025-10-14 14:11       ` Haiyang Zhang

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).