netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next] eth: fbnic: Add support to dump registers
@ 2024-11-08  1:32 Mohsin Bashir
  2024-11-11 13:58 ` Simon Horman
  2024-11-12 12:17 ` Paolo Abeni
  0 siblings, 2 replies; 4+ messages in thread
From: Mohsin Bashir @ 2024-11-08  1:32 UTC (permalink / raw)
  To: netdev
  Cc: alexanderduyck, kuba, andrew, andrew+netdev, davem, edumazet,
	pabeni, kernel-team, sanmanpradhan, vadim.fedorenko, horms,
	mohsin.bashr

Add support for the 'ethtool -d <dev>' command to retrieve and print
a register dump for fbnic. The dump defaults to version 1 and consists
of two parts: all the register sections that can be dumped linearly, and
an RPC RAM section that is structured in an interleaved fashion and
requires special handling. For each register section, the dump also
contains the start and end boundary information which can simplify parsing.

Signed-off-by: Mohsin Bashir <mohsin.bashr@gmail.com>
---
 drivers/net/ethernet/meta/fbnic/Makefile      |   3 +-
 drivers/net/ethernet/meta/fbnic/fbnic.h       |   3 +
 drivers/net/ethernet/meta/fbnic/fbnic_csr.c   | 145 ++++++++++++++++++
 drivers/net/ethernet/meta/fbnic/fbnic_csr.h   |  16 ++
 .../net/ethernet/meta/fbnic/fbnic_ethtool.c   |  17 ++
 5 files changed, 183 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/ethernet/meta/fbnic/fbnic_csr.c

diff --git a/drivers/net/ethernet/meta/fbnic/Makefile b/drivers/net/ethernet/meta/fbnic/Makefile
index cadd4dac6620..425e8b801265 100644
--- a/drivers/net/ethernet/meta/fbnic/Makefile
+++ b/drivers/net/ethernet/meta/fbnic/Makefile
@@ -7,7 +7,8 @@
 
 obj-$(CONFIG_FBNIC) += fbnic.o
 
-fbnic-y := fbnic_devlink.o \
+fbnic-y := fbnic_csr.o \
+	   fbnic_devlink.o \
 	   fbnic_ethtool.o \
 	   fbnic_fw.o \
 	   fbnic_hw_stats.o \
diff --git a/drivers/net/ethernet/meta/fbnic/fbnic.h b/drivers/net/ethernet/meta/fbnic/fbnic.h
index 9f9cb9b3e74e..98870cb2b689 100644
--- a/drivers/net/ethernet/meta/fbnic/fbnic.h
+++ b/drivers/net/ethernet/meta/fbnic/fbnic.h
@@ -156,6 +156,9 @@ int fbnic_alloc_irqs(struct fbnic_dev *fbd);
 void fbnic_get_fw_ver_commit_str(struct fbnic_dev *fbd, char *fw_version,
 				 const size_t str_sz);
 
+void fbnic_csr_get_regs(struct fbnic_dev *fbd, u32 *data, u32 *regs_version);
+int fbnic_csr_regs_len(struct fbnic_dev *fbd);
+
 enum fbnic_boards {
 	fbnic_board_asic
 };
diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_csr.c b/drivers/net/ethernet/meta/fbnic/fbnic_csr.c
new file mode 100644
index 000000000000..e6018e54bc68
--- /dev/null
+++ b/drivers/net/ethernet/meta/fbnic/fbnic_csr.c
@@ -0,0 +1,145 @@
+#include "fbnic.h"
+
+#define FBNIC_BOUNDS(section) { \
+	.start = FBNIC_CSR_START_##section, \
+	.end = FBNIC_CSR_END_##section + 1, \
+}
+
+struct fbnic_csr_bounds {
+	u32	start;
+	u32	end;
+};
+
+static const struct fbnic_csr_bounds fbnic_csr_sects[] = {
+	FBNIC_BOUNDS(INTR),
+	FBNIC_BOUNDS(INTR_CQ),
+	FBNIC_BOUNDS(QM_TX),
+	FBNIC_BOUNDS(QM_RX),
+	FBNIC_BOUNDS(TCE),
+	FBNIC_BOUNDS(TCE_RAM),
+	FBNIC_BOUNDS(TMI),
+	FBNIC_BOUNDS(PTP),
+	FBNIC_BOUNDS(RXB),
+	FBNIC_BOUNDS(RPC),
+	FBNIC_BOUNDS(FAB),
+	FBNIC_BOUNDS(MASTER),
+	FBNIC_BOUNDS(PCS),
+	FBNIC_BOUNDS(RSFEC),
+	FBNIC_BOUNDS(MAC_MAC),
+	FBNIC_BOUNDS(SIG),
+	FBNIC_BOUNDS(PUL_USER),
+	FBNIC_BOUNDS(QUEUE),
+	FBNIC_BOUNDS(RPC_RAM),
+};
+
+#define FBNIC_RPC_TCAM_ACT_DW_PER_ENTRY			14
+#define FBNIC_RPC_TCAM_ACT_NUM_ENTRIES			64
+
+#define FBNIC_RPC_TCAM_MACDA_DW_PER_ENTRY		4
+#define FBNIC_RPC_TCAM_MACDA_NUM_ENTRIES		32
+
+#define FBNIC_RPC_TCAM_OUTER_IPSRC_DW_PER_ENTRY		9
+#define FBNIC_RPC_TCAM_OUTER_IPSRC_NUM_ENTRIES		8
+
+#define FBNIC_RPC_TCAM_OUTER_IPDST_DW_PER_ENTRY		9
+#define FBNIC_RPC_TCAM_OUTER_IPDST_NUM_ENTRIES		8
+
+#define FBNIC_RPC_TCAM_IPSRC_DW_PER_ENTRY		9
+#define FBNIC_RPC_TCAM_IPSRC_NUM_ENTRIES		8
+
+#define FBNIC_RPC_TCAM_IPDST_DW_PER_ENTRY		9
+#define FBNIC_RPC_TCAM_IPDST_NUM_ENTRIES		8
+
+#define FBNIC_RPC_RSS_TBL_DW_PER_ENTRY			2
+#define FBNIC_RPC_RSS_TBL_NUM_ENTRIES			256
+
+static void fbnic_csr_get_regs_rpc_ram(struct fbnic_dev *fbd, u32 **data_p)
+{
+	u32 start = FBNIC_CSR_START_RPC_RAM;
+	u32 end = FBNIC_CSR_END_RPC_RAM;
+	u32 *data = *data_p;
+	u32 i, j;
+
+	*(data++) = start;
+	*(data++) = end - 1;
+
+	/* FBNIC_RPC_TCAM_ACT */
+	for (i = 0; i < FBNIC_RPC_TCAM_ACT_NUM_ENTRIES; i++) {
+		for (j = 0; j < FBNIC_RPC_TCAM_ACT_DW_PER_ENTRY; j++)
+			*(data++) = rd32(fbd, FBNIC_RPC_TCAM_ACT(i, j));
+	}
+
+	/* FBNIC_RPC_TCAM_MACDA */
+	for (i = 0; i < FBNIC_RPC_TCAM_MACDA_NUM_ENTRIES; i++) {
+		for (j = 0; j < FBNIC_RPC_TCAM_MACDA_DW_PER_ENTRY; j++)
+			*(data++) = rd32(fbd, FBNIC_RPC_TCAM_MACDA(i, j));
+	}
+
+	/* FBNIC_RPC_TCAM_OUTER_IPSRC */
+	for (i = 0; i < FBNIC_RPC_TCAM_OUTER_IPSRC_NUM_ENTRIES; i++) {
+		for (j = 0; j < FBNIC_RPC_TCAM_OUTER_IPSRC_DW_PER_ENTRY; j++)
+			*(data++) = rd32(fbd, FBNIC_RPC_TCAM_OUTER_IPSRC(i, j));
+	}
+
+	/* FBNIC_RPC_TCAM_OUTER_IPDST */
+	for (i = 0; i < FBNIC_RPC_TCAM_OUTER_IPDST_NUM_ENTRIES; i++) {
+		for (j = 0; j < FBNIC_RPC_TCAM_OUTER_IPDST_DW_PER_ENTRY; j++)
+			*(data++) = rd32(fbd, FBNIC_RPC_TCAM_OUTER_IPDST(i, j));
+	}
+
+	/* FBNIC_RPC_TCAM_IPSRC */
+	for (i = 0; i < FBNIC_RPC_TCAM_IPSRC_NUM_ENTRIES; i++) {
+		for (j = 0; j < FBNIC_RPC_TCAM_IPSRC_DW_PER_ENTRY; j++)
+			*(data++) = rd32(fbd, FBNIC_RPC_TCAM_IPSRC(i, j));
+	}
+
+	/* FBNIC_RPC_TCAM_IPDST */
+	for (i = 0; i < FBNIC_RPC_TCAM_IPDST_NUM_ENTRIES; i++) {
+		for (j = 0; j < FBNIC_RPC_TCAM_IPDST_DW_PER_ENTRY; j++)
+			*(data++) = rd32(fbd, FBNIC_RPC_TCAM_IPDST(i, j));
+	}
+
+	/* FBNIC_RPC_RSS_TBL */
+	for (i = 0; i < FBNIC_RPC_RSS_TBL_NUM_ENTRIES; i++) {
+		for (j = 0; j < FBNIC_RPC_RSS_TBL_DW_PER_ENTRY; j++)
+			*(data++) = rd32(fbd, FBNIC_RPC_RSS_TBL(i, j));
+	}
+
+	*data_p = data;
+}
+
+void fbnic_csr_get_regs(struct fbnic_dev *fbd, u32 *data, u32 *regs_version)
+{
+	const struct fbnic_csr_bounds *bound;
+	u32 *start = data;
+	int i, j;
+
+	*regs_version = 1u;
+
+	/* Skip RPC_RAM section which cannot be dumped linearly */
+	for (i = 0, bound = fbnic_csr_sects;
+	     i < ARRAY_SIZE(fbnic_csr_sects) - 1; i++, ++bound) {
+		*(data++) = bound->start;
+		*(data++) = bound->end - 1;
+		for (j = bound->start; j < bound->end; j++)
+			*(data++) = rd32(fbd, j);
+	}
+
+	/* Dump the RPC_RAM as special case registers */
+	fbnic_csr_get_regs_rpc_ram(fbd, &data);
+
+	WARN_ON(data - start != fbnic_csr_regs_len(fbd));
+}
+
+int fbnic_csr_regs_len(struct fbnic_dev *fbd)
+{
+	int i, len = 0;
+
+	/* Dump includes start and end information of each section
+	 * which results in an offset of 2
+	 */
+	for (i = 0; i < ARRAY_SIZE(fbnic_csr_sects); i++)
+		len += fbnic_csr_sects[i].end - fbnic_csr_sects[i].start + 2;
+
+	return len;
+}
diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_csr.h b/drivers/net/ethernet/meta/fbnic/fbnic_csr.h
index dd407089ca47..f9a531ce9e17 100644
--- a/drivers/net/ethernet/meta/fbnic/fbnic_csr.h
+++ b/drivers/net/ethernet/meta/fbnic/fbnic_csr.h
@@ -665,6 +665,15 @@ enum {
 #define FBNIC_RPC_TCAM_MACDA_VALUE		CSR_GENMASK(15, 0)
 #define FBNIC_RPC_TCAM_MACDA_MASK		CSR_GENMASK(31, 16)
 
+#define FBNIC_RPC_TCAM_OUTER_IPSRC(m, n)\
+	(0x08c00 + 0x08 * (n) + (m))		/* 0x023000 + 32*n + 4*m */
+#define FBNIC_RPC_TCAM_OUTER_IPDST(m, n)\
+	(0x08c48 + 0x08 * (n) + (m))		/* 0x023120 + 32*n + 4*m */
+#define FBNIC_RPC_TCAM_IPSRC(m, n)\
+	(0x08c90 + 0x08 * (n) + (m))		/* 0x023240 + 32*n + 4*m */
+#define FBNIC_RPC_TCAM_IPDST(m, n)\
+	(0x08cd8 + 0x08 * (n) + (m))		/* 0x023360 + 32*n + 4*m */
+
 #define FBNIC_RPC_RSS_TBL(n, m) \
 	(0x08d20 + 0x100 * (n) + (m))		/* 0x023480 + 1024*n + 4*m */
 #define FBNIC_RPC_RSS_TBL_COUNT			2
@@ -683,6 +692,13 @@ enum {
 #define FBNIC_MASTER_SPARE_0		0x0C41B		/* 0x3106c */
 #define FBNIC_CSR_END_MASTER		0x0C452	/* CSR section delimiter */
 
+/* MAC PCS registers */
+#define FBNIC_CSR_START_PCS		0x10000 /* CSR section delimiter */
+#define FBNIC_CSR_END_PCS		0x10668 /* CSR section delimiter */
+
+#define FBNIC_CSR_START_RSFEC		0x10800 /* CSR section delimiter */
+#define FBNIC_CSR_END_RSFEC		0x108c8 /* CSR section delimiter */
+
 /* MAC MAC registers (ASIC only) */
 #define FBNIC_CSR_START_MAC_MAC		0x11000 /* CSR section delimiter */
 #define FBNIC_MAC_COMMAND_CONFIG	0x11002		/* 0x44008 */
diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c b/drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c
index 1117d5a32867..354b5397815f 100644
--- a/drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c
+++ b/drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c
@@ -116,8 +116,25 @@ static void fbnic_get_ts_stats(struct net_device *netdev,
 	}
 }
 
+static void fbnic_get_regs(struct net_device *netdev,
+			   struct ethtool_regs *regs, void *data)
+{
+	struct fbnic_net *fbn = netdev_priv(netdev);
+
+	fbnic_csr_get_regs(fbn->fbd, data, &regs->version);
+}
+
+static int fbnic_get_regs_len(struct net_device *netdev)
+{
+	struct fbnic_net *fbn = netdev_priv(netdev);
+
+	return fbnic_csr_regs_len(fbn->fbd) * sizeof(u32);
+}
+
 static const struct ethtool_ops fbnic_ethtool_ops = {
 	.get_drvinfo		= fbnic_get_drvinfo,
+	.get_regs_len		= fbnic_get_regs_len,
+	.get_regs		= fbnic_get_regs,
 	.get_ts_info		= fbnic_get_ts_info,
 	.get_ts_stats		= fbnic_get_ts_stats,
 	.get_eth_mac_stats	= fbnic_get_eth_mac_stats,
-- 
2.43.5


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

* Re: [PATCH net-next] eth: fbnic: Add support to dump registers
  2024-11-08  1:32 [PATCH net-next] eth: fbnic: Add support to dump registers Mohsin Bashir
@ 2024-11-11 13:58 ` Simon Horman
  2024-11-12 12:17 ` Paolo Abeni
  1 sibling, 0 replies; 4+ messages in thread
From: Simon Horman @ 2024-11-11 13:58 UTC (permalink / raw)
  To: Mohsin Bashir
  Cc: netdev, alexanderduyck, kuba, andrew, andrew+netdev, davem,
	edumazet, pabeni, kernel-team, sanmanpradhan, vadim.fedorenko

On Thu, Nov 07, 2024 at 05:32:53PM -0800, Mohsin Bashir wrote:
> Add support for the 'ethtool -d <dev>' command to retrieve and print
> a register dump for fbnic. The dump defaults to version 1 and consists
> of two parts: all the register sections that can be dumped linearly, and
> an RPC RAM section that is structured in an interleaved fashion and
> requires special handling. For each register section, the dump also
> contains the start and end boundary information which can simplify parsing.
> 
> Signed-off-by: Mohsin Bashir <mohsin.bashr@gmail.com>

Reviewed-by: Simon Horman <horms@kernel.org>


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

* Re: [PATCH net-next] eth: fbnic: Add support to dump registers
  2024-11-08  1:32 [PATCH net-next] eth: fbnic: Add support to dump registers Mohsin Bashir
  2024-11-11 13:58 ` Simon Horman
@ 2024-11-12 12:17 ` Paolo Abeni
  2024-11-12 18:09   ` Mohsin Bashir
  1 sibling, 1 reply; 4+ messages in thread
From: Paolo Abeni @ 2024-11-12 12:17 UTC (permalink / raw)
  To: Mohsin Bashir, netdev
  Cc: alexanderduyck, kuba, andrew, andrew+netdev, davem, edumazet,
	kernel-team, sanmanpradhan, vadim.fedorenko, horms

On 11/8/24 02:32, Mohsin Bashir wrote:
> Add support for the 'ethtool -d <dev>' command to retrieve and print
> a register dump for fbnic. The dump defaults to version 1 and consists
> of two parts: all the register sections that can be dumped linearly, and
> an RPC RAM section that is structured in an interleaved fashion and
> requires special handling. For each register section, the dump also
> contains the start and end boundary information which can simplify parsing.
> 
> Signed-off-by: Mohsin Bashir <mohsin.bashr@gmail.com>
> ---
>  drivers/net/ethernet/meta/fbnic/Makefile      |   3 +-
>  drivers/net/ethernet/meta/fbnic/fbnic.h       |   3 +
>  drivers/net/ethernet/meta/fbnic/fbnic_csr.c   | 145 ++++++++++++++++++
>  drivers/net/ethernet/meta/fbnic/fbnic_csr.h   |  16 ++
>  .../net/ethernet/meta/fbnic/fbnic_ethtool.c   |  17 ++
>  5 files changed, 183 insertions(+), 1 deletion(-)
>  create mode 100644 drivers/net/ethernet/meta/fbnic/fbnic_csr.c
> 
> diff --git a/drivers/net/ethernet/meta/fbnic/Makefile b/drivers/net/ethernet/meta/fbnic/Makefile
> index cadd4dac6620..425e8b801265 100644
> --- a/drivers/net/ethernet/meta/fbnic/Makefile
> +++ b/drivers/net/ethernet/meta/fbnic/Makefile
> @@ -7,7 +7,8 @@
>  
>  obj-$(CONFIG_FBNIC) += fbnic.o
>  
> -fbnic-y := fbnic_devlink.o \
> +fbnic-y := fbnic_csr.o \
> +	   fbnic_devlink.o \
>  	   fbnic_ethtool.o \
>  	   fbnic_fw.o \
>  	   fbnic_hw_stats.o \
> diff --git a/drivers/net/ethernet/meta/fbnic/fbnic.h b/drivers/net/ethernet/meta/fbnic/fbnic.h
> index 9f9cb9b3e74e..98870cb2b689 100644
> --- a/drivers/net/ethernet/meta/fbnic/fbnic.h
> +++ b/drivers/net/ethernet/meta/fbnic/fbnic.h
> @@ -156,6 +156,9 @@ int fbnic_alloc_irqs(struct fbnic_dev *fbd);
>  void fbnic_get_fw_ver_commit_str(struct fbnic_dev *fbd, char *fw_version,
>  				 const size_t str_sz);
>  
> +void fbnic_csr_get_regs(struct fbnic_dev *fbd, u32 *data, u32 *regs_version);
> +int fbnic_csr_regs_len(struct fbnic_dev *fbd);
> +
>  enum fbnic_boards {
>  	fbnic_board_asic
>  };
> diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_csr.c b/drivers/net/ethernet/meta/fbnic/fbnic_csr.c
> new file mode 100644
> index 000000000000..e6018e54bc68
> --- /dev/null
> +++ b/drivers/net/ethernet/meta/fbnic/fbnic_csr.c

The code LGTM, but this newly created file lacks the SPDX licence
identifier.

Please add it.

/P

Side note: a few other files are missing such info, it would be good if
you could send patches to fix them, too.


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

* Re: [PATCH net-next] eth: fbnic: Add support to dump registers
  2024-11-12 12:17 ` Paolo Abeni
@ 2024-11-12 18:09   ` Mohsin Bashir
  0 siblings, 0 replies; 4+ messages in thread
From: Mohsin Bashir @ 2024-11-12 18:09 UTC (permalink / raw)
  To: Paolo Abeni, netdev
  Cc: alexanderduyck, kuba, andrew, andrew+netdev, davem, edumazet,
	kernel-team, sanmanpradhan, vadim.fedorenko, horms



On 11/12/24 4:17 AM, Paolo Abeni wrote:
> On 11/8/24 02:32, Mohsin Bashir wrote:
>> Add support for the 'ethtool -d <dev>' command to retrieve and print
>> a register dump for fbnic. The dump defaults to version 1 and consists
>> of two parts: all the register sections that can be dumped linearly, and
>> an RPC RAM section that is structured in an interleaved fashion and
>> requires special handling. For each register section, the dump also
>> contains the start and end boundary information which can simplify parsing.
>>
>> Signed-off-by: Mohsin Bashir <mohsin.bashr@gmail.com>
>> ---
>>   drivers/net/ethernet/meta/fbnic/Makefile      |   3 +-
>>   drivers/net/ethernet/meta/fbnic/fbnic.h       |   3 +
>>   drivers/net/ethernet/meta/fbnic/fbnic_csr.c   | 145 ++++++++++++++++++
>>   drivers/net/ethernet/meta/fbnic/fbnic_csr.h   |  16 ++
>>   .../net/ethernet/meta/fbnic/fbnic_ethtool.c   |  17 ++
>>   5 files changed, 183 insertions(+), 1 deletion(-)
>>   create mode 100644 drivers/net/ethernet/meta/fbnic/fbnic_csr.c
>>
>> diff --git a/drivers/net/ethernet/meta/fbnic/Makefile b/drivers/net/ethernet/meta/fbnic/Makefile
>> index cadd4dac6620..425e8b801265 100644
>> --- a/drivers/net/ethernet/meta/fbnic/Makefile
>> +++ b/drivers/net/ethernet/meta/fbnic/Makefile
>> @@ -7,7 +7,8 @@
>>   
>>   obj-$(CONFIG_FBNIC) += fbnic.o
>>   
>> -fbnic-y := fbnic_devlink.o \
>> +fbnic-y := fbnic_csr.o \
>> +	   fbnic_devlink.o \
>>   	   fbnic_ethtool.o \
>>   	   fbnic_fw.o \
>>   	   fbnic_hw_stats.o \
>> diff --git a/drivers/net/ethernet/meta/fbnic/fbnic.h b/drivers/net/ethernet/meta/fbnic/fbnic.h
>> index 9f9cb9b3e74e..98870cb2b689 100644
>> --- a/drivers/net/ethernet/meta/fbnic/fbnic.h
>> +++ b/drivers/net/ethernet/meta/fbnic/fbnic.h
>> @@ -156,6 +156,9 @@ int fbnic_alloc_irqs(struct fbnic_dev *fbd);
>>   void fbnic_get_fw_ver_commit_str(struct fbnic_dev *fbd, char *fw_version,
>>   				 const size_t str_sz);
>>   
>> +void fbnic_csr_get_regs(struct fbnic_dev *fbd, u32 *data, u32 *regs_version);
>> +int fbnic_csr_regs_len(struct fbnic_dev *fbd);
>> +
>>   enum fbnic_boards {
>>   	fbnic_board_asic
>>   };
>> diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_csr.c b/drivers/net/ethernet/meta/fbnic/fbnic_csr.c
>> new file mode 100644
>> index 000000000000..e6018e54bc68
>> --- /dev/null
>> +++ b/drivers/net/ethernet/meta/fbnic/fbnic_csr.c
> 
> The code LGTM, but this newly created file lacks the SPDX licence
> identifier.
> 
> Please add it.
> 
> /P
> 
> Side note: a few other files are missing such info, it would be good if
> you could send patches to fix them, too.
> 
Hi Paolo,

Thank you for your response. I'll update this patch with SPDX license 
information in the newly added file. I will also send a separate patch 
to add the same in files which are currently missing this.

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

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

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-08  1:32 [PATCH net-next] eth: fbnic: Add support to dump registers Mohsin Bashir
2024-11-11 13:58 ` Simon Horman
2024-11-12 12:17 ` Paolo Abeni
2024-11-12 18:09   ` Mohsin Bashir

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