* [PATCH net-next v2 0/4] mv88e6xxx: Cache scratch config3 of 6352
@ 2026-05-21 20:29 Fidan Aliyeva
2026-05-21 20:29 ` [PATCH net-next v2 1/4] mv88e6xxx: Add mv88e6352_reset for 6352 family Fidan Aliyeva
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Fidan Aliyeva @ 2026-05-21 20:29 UTC (permalink / raw)
To: andrew, olteanv, davem, edumazet, kuba, pabeni, marek.behun
Cc: netdev, linux-kernel, fidan.aliyeva.ext
In mv88e6352 scratch register in Global Control 2 set of registers
returns which port is attached to SERDES. This value is a pin
strapping value and is set after the switch is released from reset.
Thus, it can be cached during chip setup instead of reading the
register everytime when SERDES check is needed.
The series consist of 4 parts:
1. Add new mv88e6352_reset function as ops->reset
2. Cache the register value in this reset function
3. Refactor mv88e6352_g2_scratch_port_has_serdes to use the cached
value.
4. Remove the locks surrounding mv88e6352_g2_scratch_port_has_serdes.
---
v2 changes:
- Fix the documentation of the return value for the new function
mv88e6352_g2_cache_global_scratch_config3
as addressed by Jakub Kicinski
v1 link:
https://lore.kernel.org/netdev/20260515223707.1026325-1-fidan.aliyeva.ext@ericsson.com/
Changes after RFC:
- Separate the patch into 4 different patches
- Move caching step into chip->info->ops->reset function
as suggested by Andrew.
RFC link:
https://lore.kernel.org/netdev/20260510213429.2044612-1-fidan.aliyeva.ext@ericsson.com/
---
Fidan Aliyeva (4):
mv88e6xxx: Add mv88e6352_reset for 6352 family
mv88e6xxx: Cache scratch config3 of 6352
mv88e6xxx: Use cached config3 in 6352 has_serdes
mv88e6xxx: Remove locks for 6352's has_serdes
drivers/net/dsa/mv88e6xxx/chip.c | 25 ++++++++++----
drivers/net/dsa/mv88e6xxx/chip.h | 3 ++
drivers/net/dsa/mv88e6xxx/global2.h | 1 +
drivers/net/dsa/mv88e6xxx/global2_scratch.c | 38 ++++++++++++++++-----
drivers/net/dsa/mv88e6xxx/pcs-6352.c | 2 --
drivers/net/dsa/mv88e6xxx/serdes.c | 2 --
6 files changed, 51 insertions(+), 20 deletions(-)
--
2.36.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net-next v2 1/4] mv88e6xxx: Add mv88e6352_reset for 6352 family
2026-05-21 20:29 [PATCH net-next v2 0/4] mv88e6xxx: Cache scratch config3 of 6352 Fidan Aliyeva
@ 2026-05-21 20:29 ` Fidan Aliyeva
2026-05-21 20:29 ` [PATCH net-next v2 2/4] mv88e6xxx: Cache scratch config3 of 6352 Fidan Aliyeva
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Fidan Aliyeva @ 2026-05-21 20:29 UTC (permalink / raw)
To: andrew, olteanv, davem, edumazet, kuba, pabeni, marek.behun
Cc: netdev, linux-kernel, fidan.aliyeva.ext, Thomas Eckerman
1. Add mv88e6352_reset which calls the previous ops->reset function
- mv88e6352_g1_reset.
2. Make all 6352 family use this new function as ops->reset
Co-developed-by: Thomas Eckerman <thomas.eckerman.ext@ericsson.com>
Signed-off-by: Thomas Eckerman <thomas.eckerman.ext@ericsson.com>
Signed-off-by: Fidan Aliyeva <fidan.aliyeva.ext@ericsson.com>
---
drivers/net/dsa/mv88e6xxx/chip.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 8ca5fd40df92..6102b7fd8d44 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -3736,6 +3736,15 @@ static int mv88e6390_setup_errata(struct mv88e6xxx_chip *chip)
return mv88e6xxx_software_reset(chip);
}
+static int mv88e6352_reset(struct mv88e6xxx_chip *chip)
+{
+ int err;
+
+ err = mv88e6352_g1_reset(chip);
+
+ return err;
+}
+
/* prod_id for switch families which do not have a PHY model number */
static const u16 family_prod_id_table[] = {
[MV88E6XXX_FAMILY_6341] = MV88E6XXX_PORT_SWITCH_ID_PROD_6341,
@@ -4654,7 +4663,7 @@ static const struct mv88e6xxx_ops mv88e6172_ops = {
.pot_clear = mv88e6xxx_g2_pot_clear,
.hardware_reset_pre = mv88e6xxx_g2_eeprom_wait,
.hardware_reset_post = mv88e6xxx_g2_eeprom_wait,
- .reset = mv88e6352_g1_reset,
+ .reset = mv88e6352_reset,
.rmu_disable = mv88e6352_g1_rmu_disable,
.atu_get_hash = mv88e6165_g1_atu_get_hash,
.atu_set_hash = mv88e6165_g1_atu_set_hash,
@@ -4757,7 +4766,7 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
.pot_clear = mv88e6xxx_g2_pot_clear,
.hardware_reset_pre = mv88e6xxx_g2_eeprom_wait,
.hardware_reset_post = mv88e6xxx_g2_eeprom_wait,
- .reset = mv88e6352_g1_reset,
+ .reset = mv88e6352_reset,
.rmu_disable = mv88e6352_g1_rmu_disable,
.atu_get_hash = mv88e6165_g1_atu_get_hash,
.atu_set_hash = mv88e6165_g1_atu_set_hash,
@@ -5032,7 +5041,7 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
.pot_clear = mv88e6xxx_g2_pot_clear,
.hardware_reset_pre = mv88e6xxx_g2_eeprom_wait,
.hardware_reset_post = mv88e6xxx_g2_eeprom_wait,
- .reset = mv88e6352_g1_reset,
+ .reset = mv88e6352_reset,
.rmu_disable = mv88e6352_g1_rmu_disable,
.atu_get_hash = mv88e6165_g1_atu_get_hash,
.atu_set_hash = mv88e6165_g1_atu_set_hash,
@@ -5463,7 +5472,7 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
.pot_clear = mv88e6xxx_g2_pot_clear,
.hardware_reset_pre = mv88e6xxx_g2_eeprom_wait,
.hardware_reset_post = mv88e6xxx_g2_eeprom_wait,
- .reset = mv88e6352_g1_reset,
+ .reset = mv88e6352_reset,
.rmu_disable = mv88e6352_g1_rmu_disable,
.atu_get_hash = mv88e6165_g1_atu_get_hash,
.atu_set_hash = mv88e6165_g1_atu_set_hash,
--
2.36.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net-next v2 2/4] mv88e6xxx: Cache scratch config3 of 6352
2026-05-21 20:29 [PATCH net-next v2 0/4] mv88e6xxx: Cache scratch config3 of 6352 Fidan Aliyeva
2026-05-21 20:29 ` [PATCH net-next v2 1/4] mv88e6xxx: Add mv88e6352_reset for 6352 family Fidan Aliyeva
@ 2026-05-21 20:29 ` Fidan Aliyeva
2026-05-21 20:29 ` [PATCH net-next v2 3/4] mv88e6xxx: Use cached config3 in 6352 has_serdes Fidan Aliyeva
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Fidan Aliyeva @ 2026-05-21 20:29 UTC (permalink / raw)
To: andrew, olteanv, davem, edumazet, kuba, pabeni, marek.behun
Cc: netdev, linux-kernel, fidan.aliyeva.ext, Thomas Eckerman
Changes:
1. Add g2_scratch_config3 member to mv88e6xxx_chip.
2. Add mv88e6352_g2_cache_global_scratch_config3 which reads the
CONFIG3 value from the scratch register and caches it.
3. Call this function in mv88e6352_reset.
Co-developed-by: Thomas Eckerman <thomas.eckerman.ext@ericsson.com>
Signed-off-by: Thomas Eckerman <thomas.eckerman.ext@ericsson.com>
Signed-off-by: Fidan Aliyeva <fidan.aliyeva.ext@ericsson.com>
---
drivers/net/dsa/mv88e6xxx/chip.c | 7 +++++-
drivers/net/dsa/mv88e6xxx/chip.h | 3 +++
drivers/net/dsa/mv88e6xxx/global2.h | 1 +
drivers/net/dsa/mv88e6xxx/global2_scratch.c | 26 +++++++++++++++++++++
4 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 6102b7fd8d44..4ed6f880e02c 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -3736,13 +3736,18 @@ static int mv88e6390_setup_errata(struct mv88e6xxx_chip *chip)
return mv88e6xxx_software_reset(chip);
}
+/* For MV88E6XXX_FAMILY_6352, perform reset on G1 control.
+ * Also, read and cache G2 scratch register.
+ */
static int mv88e6352_reset(struct mv88e6xxx_chip *chip)
{
int err;
err = mv88e6352_g1_reset(chip);
+ if (err)
+ return err;
- return err;
+ return mv88e6352_g2_cache_global_scratch_config3(chip);
}
/* prod_id for switch families which do not have a PHY model number */
diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/chip.h
index 2b235ac2c5df..d911f60aca10 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.h
+++ b/drivers/net/dsa/mv88e6xxx/chip.h
@@ -454,6 +454,9 @@ struct mv88e6xxx_chip {
/* TCAM entries */
struct mv88e6xxx_tcam tcam;
+
+ /* Global2 scratch register config data3 */
+ u8 g2_scratch_config3;
};
#define TCAM_MATCH_SIZE 96
diff --git a/drivers/net/dsa/mv88e6xxx/global2.h b/drivers/net/dsa/mv88e6xxx/global2.h
index 82f9b410de0b..ff5adf7c9bc3 100644
--- a/drivers/net/dsa/mv88e6xxx/global2.h
+++ b/drivers/net/dsa/mv88e6xxx/global2.h
@@ -382,6 +382,7 @@ int mv88e6390_g2_scratch_gpio_set_smi(struct mv88e6xxx_chip *chip,
bool external);
int mv88e6393x_g2_scratch_gpio_set_smi(struct mv88e6xxx_chip *chip,
bool external);
+int mv88e6352_g2_cache_global_scratch_config3(struct mv88e6xxx_chip *chip);
int mv88e6352_g2_scratch_port_has_serdes(struct mv88e6xxx_chip *chip, int port);
int mv88e6xxx_g2_atu_stats_set(struct mv88e6xxx_chip *chip, u16 kind, u16 bin);
int mv88e6xxx_g2_atu_stats_get(struct mv88e6xxx_chip *chip, u16 *stats);
diff --git a/drivers/net/dsa/mv88e6xxx/global2_scratch.c b/drivers/net/dsa/mv88e6xxx/global2_scratch.c
index 53a6d3ed63b3..f2f9e7dce1aa 100644
--- a/drivers/net/dsa/mv88e6xxx/global2_scratch.c
+++ b/drivers/net/dsa/mv88e6xxx/global2_scratch.c
@@ -321,6 +321,32 @@ int mv88e6393x_g2_scratch_gpio_set_smi(struct mv88e6xxx_chip *chip,
return mv88e6xxx_g2_scratch_write(chip, misc_cfg, val);
}
+/**
+ * mv88e6352_g2_cache_global_scratch_config3 - caches G2 CONFIG3 value
+ * @chip: chip private data
+ *
+ * Reads and stores config3 value of global2 scratch registers, which
+ * can be used to determine if the port is attached to a serdes. The
+ * value does not change once the switch is released from reset and
+ * represents the value of the pin strapping.
+ *
+ * Return: negative error number if the register read fails; otherwise, 0
+ */
+int mv88e6352_g2_cache_global_scratch_config3(struct mv88e6xxx_chip *chip)
+{
+ u8 config3;
+ int err;
+
+ err = mv88e6xxx_g2_scratch_read(chip, MV88E6352_G2_SCRATCH_CONFIG_DATA3,
+ &config3);
+ if (err)
+ return err;
+
+ chip->g2_scratch_config3 = config3;
+
+ return 0;
+}
+
/**
* mv88e6352_g2_scratch_port_has_serdes - indicate if a port can have a serdes
* @chip: chip private data
--
2.36.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net-next v2 3/4] mv88e6xxx: Use cached config3 in 6352 has_serdes
2026-05-21 20:29 [PATCH net-next v2 0/4] mv88e6xxx: Cache scratch config3 of 6352 Fidan Aliyeva
2026-05-21 20:29 ` [PATCH net-next v2 1/4] mv88e6xxx: Add mv88e6352_reset for 6352 family Fidan Aliyeva
2026-05-21 20:29 ` [PATCH net-next v2 2/4] mv88e6xxx: Cache scratch config3 of 6352 Fidan Aliyeva
@ 2026-05-21 20:29 ` Fidan Aliyeva
2026-05-21 20:29 ` [PATCH net-next v2 4/4] mv88e6xxx: Remove locks for 6352's has_serdes Fidan Aliyeva
2026-05-26 10:20 ` [PATCH net-next v2 0/4] mv88e6xxx: Cache scratch config3 of 6352 patchwork-bot+netdevbpf
4 siblings, 0 replies; 6+ messages in thread
From: Fidan Aliyeva @ 2026-05-21 20:29 UTC (permalink / raw)
To: andrew, olteanv, davem, edumazet, kuba, pabeni, marek.behun
Cc: netdev, linux-kernel, fidan.aliyeva.ext, Thomas Eckerman
1. Refactor mv88e6352_g2_scratch_port_has_serdes to use the cached
scratch config3 value instead of reading it everytime.
2. Remove err<0 check from mv88e6352_phylink_get_caps as it is never
true anymore
Co-developed-by: Thomas Eckerman <thomas.eckerman.ext@ericsson.com>
Signed-off-by: Thomas Eckerman <thomas.eckerman.ext@ericsson.com>
Signed-off-by: Fidan Aliyeva <fidan.aliyeva.ext@ericsson.com>
---
drivers/net/dsa/mv88e6xxx/chip.c | 3 ---
drivers/net/dsa/mv88e6xxx/global2_scratch.c | 18 ++++++------------
2 files changed, 6 insertions(+), 15 deletions(-)
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 4ed6f880e02c..63cdcce3d8c7 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -685,9 +685,6 @@ static void mv88e6352_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
/* Port 4 supports automedia if the serdes is associated with it. */
if (port == 4) {
err = mv88e6352_g2_scratch_port_has_serdes(chip, port);
- if (err < 0)
- dev_err(chip->dev, "p%d: failed to read scratch\n",
- port);
if (err <= 0)
return;
diff --git a/drivers/net/dsa/mv88e6xxx/global2_scratch.c b/drivers/net/dsa/mv88e6xxx/global2_scratch.c
index f2f9e7dce1aa..f292ee4db113 100644
--- a/drivers/net/dsa/mv88e6xxx/global2_scratch.c
+++ b/drivers/net/dsa/mv88e6xxx/global2_scratch.c
@@ -348,26 +348,20 @@ int mv88e6352_g2_cache_global_scratch_config3(struct mv88e6xxx_chip *chip)
}
/**
- * mv88e6352_g2_scratch_port_has_serdes - indicate if a port can have a serdes
+ * mv88e6352_g2_scratch_port_has_serdes - indicate if a port has serdes
* @chip: chip private data
* @port: port number to check for serdes
*
* Indicates whether the port may have a serdes attached according to the
- * pin strapping. Returns negative error number, 0 if the port is not
- * configured to have a serdes, and 1 if the port is configured to have a
- * serdes attached.
+ * pin strapping, which is cached at reset (scratch config3). Returns 0 if
+ * the port is not configured to have a serdes, and 1 if the port is
+ * configured to have a serdes attached.
*/
int mv88e6352_g2_scratch_port_has_serdes(struct mv88e6xxx_chip *chip, int port)
{
- u8 config3, p;
- int err;
-
- err = mv88e6xxx_g2_scratch_read(chip, MV88E6352_G2_SCRATCH_CONFIG_DATA3,
- &config3);
- if (err)
- return err;
+ u8 p;
- if (config3 & MV88E6352_G2_SCRATCH_CONFIG_DATA3_S_SEL)
+ if (chip->g2_scratch_config3 & MV88E6352_G2_SCRATCH_CONFIG_DATA3_S_SEL)
p = 5;
else
p = 4;
--
2.36.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net-next v2 4/4] mv88e6xxx: Remove locks for 6352's has_serdes
2026-05-21 20:29 [PATCH net-next v2 0/4] mv88e6xxx: Cache scratch config3 of 6352 Fidan Aliyeva
` (2 preceding siblings ...)
2026-05-21 20:29 ` [PATCH net-next v2 3/4] mv88e6xxx: Use cached config3 in 6352 has_serdes Fidan Aliyeva
@ 2026-05-21 20:29 ` Fidan Aliyeva
2026-05-26 10:20 ` [PATCH net-next v2 0/4] mv88e6xxx: Cache scratch config3 of 6352 patchwork-bot+netdevbpf
4 siblings, 0 replies; 6+ messages in thread
From: Fidan Aliyeva @ 2026-05-21 20:29 UTC (permalink / raw)
To: andrew, olteanv, davem, edumazet, kuba, pabeni, marek.behun
Cc: netdev, linux-kernel, fidan.aliyeva.ext, Thomas Eckerman
There is no register access anymore in
mv88e6352_g2_scratch_port_has_serdes. So, remove the locks
surrounding the function.
Co-developed-by: Thomas Eckerman <thomas.eckerman.ext@ericsson.com>
Signed-off-by: Thomas Eckerman <thomas.eckerman.ext@ericsson.com>
Signed-off-by: Fidan Aliyeva <fidan.aliyeva.ext@ericsson.com>
---
drivers/net/dsa/mv88e6xxx/pcs-6352.c | 2 --
drivers/net/dsa/mv88e6xxx/serdes.c | 2 --
2 files changed, 4 deletions(-)
diff --git a/drivers/net/dsa/mv88e6xxx/pcs-6352.c b/drivers/net/dsa/mv88e6xxx/pcs-6352.c
index 9ebf0f89f817..308655d72d52 100644
--- a/drivers/net/dsa/mv88e6xxx/pcs-6352.c
+++ b/drivers/net/dsa/mv88e6xxx/pcs-6352.c
@@ -326,9 +326,7 @@ static int mv88e6352_pcs_init(struct mv88e6xxx_chip *chip, int port)
unsigned int irq;
int err;
- mv88e6xxx_reg_lock(chip);
err = mv88e6352_g2_scratch_port_has_serdes(chip, port);
- mv88e6xxx_reg_unlock(chip);
if (err <= 0)
return err;
diff --git a/drivers/net/dsa/mv88e6xxx/serdes.c b/drivers/net/dsa/mv88e6xxx/serdes.c
index a936ee80ce00..d3d3c121a32d 100644
--- a/drivers/net/dsa/mv88e6xxx/serdes.c
+++ b/drivers/net/dsa/mv88e6xxx/serdes.c
@@ -202,9 +202,7 @@ int mv88e6352_serdes_get_regs_len(struct mv88e6xxx_chip *chip, int port)
{
int err;
- mv88e6xxx_reg_lock(chip);
err = mv88e6352_g2_scratch_port_has_serdes(chip, port);
- mv88e6xxx_reg_unlock(chip);
if (err <= 0)
return err;
--
2.36.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net-next v2 0/4] mv88e6xxx: Cache scratch config3 of 6352
2026-05-21 20:29 [PATCH net-next v2 0/4] mv88e6xxx: Cache scratch config3 of 6352 Fidan Aliyeva
` (3 preceding siblings ...)
2026-05-21 20:29 ` [PATCH net-next v2 4/4] mv88e6xxx: Remove locks for 6352's has_serdes Fidan Aliyeva
@ 2026-05-26 10:20 ` patchwork-bot+netdevbpf
4 siblings, 0 replies; 6+ messages in thread
From: patchwork-bot+netdevbpf @ 2026-05-26 10:20 UTC (permalink / raw)
To: Fidan Aliyeva
Cc: andrew, olteanv, davem, edumazet, kuba, pabeni, marek.behun,
netdev, linux-kernel
Hello:
This series was applied to netdev/net-next.git (main)
by Paolo Abeni <pabeni@redhat.com>:
On Thu, 21 May 2026 22:29:20 +0200 you wrote:
> In mv88e6352 scratch register in Global Control 2 set of registers
> returns which port is attached to SERDES. This value is a pin
> strapping value and is set after the switch is released from reset.
> Thus, it can be cached during chip setup instead of reading the
> register everytime when SERDES check is needed.
>
> The series consist of 4 parts:
> 1. Add new mv88e6352_reset function as ops->reset
> 2. Cache the register value in this reset function
> 3. Refactor mv88e6352_g2_scratch_port_has_serdes to use the cached
> value.
> 4. Remove the locks surrounding mv88e6352_g2_scratch_port_has_serdes.
>
> [...]
Here is the summary with links:
- [net-next,v2,1/4] mv88e6xxx: Add mv88e6352_reset for 6352 family
https://git.kernel.org/netdev/net-next/c/f21395a783ff
- [net-next,v2,2/4] mv88e6xxx: Cache scratch config3 of 6352
https://git.kernel.org/netdev/net-next/c/948330d99feb
- [net-next,v2,3/4] mv88e6xxx: Use cached config3 in 6352 has_serdes
https://git.kernel.org/netdev/net-next/c/da054522e881
- [net-next,v2,4/4] mv88e6xxx: Remove locks for 6352's has_serdes
https://git.kernel.org/netdev/net-next/c/e4a9173e38ee
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-05-26 10:20 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-05-21 20:29 [PATCH net-next v2 0/4] mv88e6xxx: Cache scratch config3 of 6352 Fidan Aliyeva
2026-05-21 20:29 ` [PATCH net-next v2 1/4] mv88e6xxx: Add mv88e6352_reset for 6352 family Fidan Aliyeva
2026-05-21 20:29 ` [PATCH net-next v2 2/4] mv88e6xxx: Cache scratch config3 of 6352 Fidan Aliyeva
2026-05-21 20:29 ` [PATCH net-next v2 3/4] mv88e6xxx: Use cached config3 in 6352 has_serdes Fidan Aliyeva
2026-05-21 20:29 ` [PATCH net-next v2 4/4] mv88e6xxx: Remove locks for 6352's has_serdes Fidan Aliyeva
2026-05-26 10:20 ` [PATCH net-next v2 0/4] mv88e6xxx: Cache scratch config3 of 6352 patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®