J'ai enfin reussi à faire marcher la macchiatobin, et je confirme que ca passe a 2.5, avec une version de openwrt compilée et patchée pour ameliorer le support des sfp G-010S-P.
[ 19.852001] IPv6: ADDRCONF(NETDEV_CHANGE): br-tv: link becomes ready
[ 60.556204] sfp sfp-eth3: module ALCATELLUCENT G010SP rev 10 sn ALCLFAB587B3 dc 170420
[ 120.828696] sfp sfp-eth3: hwmon probe failed: -6
[ 125.461690] sfp sfp-eth3: module transmit fault indicated
[ 140.831395] mvpp2 f4000000.ethernet eth3: Link is Up - 2.5Gbps/Full - flow control off
[ 140.839360] br-lan: port 3(eth3) entered blocking state
[ 140.844613] br-lan: port 3(eth3) entered forwarding state
[ 140.850107] IPv6: ADDRCONF(NETDEV_CHANGE): eth3.832: link becomes ready
[ 140.856813] br-tv: port 2(eth3.840) entered blocking state
[ 140.862334] br-tv: port 2(eth3.840) entered listening state
[ 142.877294] br-tv: port 2(eth3.840) entered learning state
[ 144.954602] br-tv: port 2(eth3.840) entered forwarding state
[ 144.960286] br-tv: topology change detected, propagating
Ci joint le patch pour les transmit faults, ce qui permet de passer le timeout de txfaut a 60 sec, ce qui laisse le temps pour que le module gpon s'initialise.
J'ai ajouté la ref du G-010S-P dans ce patch qui se trouve dans les snapshots de openwrt.
J'ai mis un screen du speed test et une photo de la macchiatobin que j'ai mis dans la plus petite boite mini itx que j'ai trouvé sur aliexpress
739-net-avoid-tx-fault-with-Nokia-GPON-module.patch
From 283b211aa01bdae94dffb3121655dbb20bf237f4 Mon Sep 17 00:00:00 2001
From: Russell King <rmk+kernel@armlinux.org.uk>
Date: Tue, 3 Dec 2019 15:22:05 +0000
Subject: net: sfp: avoid tx-fault with Nokia GPON module
The Nokia GPON module can hold tx-fault active while it is initialising
which can take up to 60s. Avoid this causing the module to be declared
faulty after the SFP MSA defined non-cooled module timeout.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
---
drivers/net/phy/sfp.c | 42 ++++++++++++++++++++++++++++++------------
1 file changed, 30 insertions(+), 12 deletions(-)
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -155,10 +155,20 @@ static const enum gpiod_flags gpio_flags
GPIOD_ASIS,
};
-#define T_WAIT msecs_to_jiffies(50)
-#define T_INIT_JIFFIES msecs_to_jiffies(300)
-#define T_RESET_US 10
-#define T_FAULT_RECOVER msecs_to_jiffies(1000)
+/* t_start_up (SFF-8431) or t_init (SFF-8472) is the time required for a
+ * non-cooled module to initialise its laser safety circuitry. We wait
+ * an initial T_WAIT period before we check the tx fault to give any PHY
+ * on board (for a copper SFP) time to initialise.
+ */
+#define T_WAIT msecs_to_jiffies(50)
+#define T_START_UP msecs_to_jiffies(300)
+#define T_START_UP_BAD_GPON msecs_to_jiffies(60000)
+
+/* t_reset is the time required to assert the TX_DISABLE signal to reset
+ * an indicated TX_FAULT.
+ */
+#define T_RESET_US 10
+#define T_FAULT_RECOVER msecs_to_jiffies(1000)
/* SFP module presence detection is poor: the three MOD DEF signals are
* the same length on the PCB, which means it's possible for MOD DEF 0 to
@@ -218,6 +228,7 @@ struct sfp {
struct sfp_eeprom_id id;
unsigned int module_power_mW;
+ unsigned int module_t_start_up;
#if IS_ENABLED(CONFIG_HWMON)
struct sfp_diag diag;
@@ -1655,6 +1666,14 @@ static int sfp_sm_mod_probe(struct sfp *
if (ret < 0)
return ret;
+ if (!memcmp(id.base.vendor_name, "ALCATELLUCENT ", 16) &&
+ (!memcmp(id.base.vendor_pn, "G010SP ", 16) ||
+ !memcmp(id.base.vendor_pn, "3FE46541AA ", 16))
+ )
+ sfp->module_t_start_up = T_START_UP_BAD_GPON;
+ else
+ sfp->module_t_start_up = T_START_UP;
+
return 0;
}
@@ -1860,11 +1879,12 @@ static void sfp_sm_main(struct sfp *sfp,
break;
if (sfp->state & SFP_F_TX_FAULT) {
- /* Wait t_init before indicating that the link is up,
- * provided the current state indicates no TX_FAULT. If
- * TX_FAULT clears before this time, that's fine too.
+ /* Wait up to t_init (SFF-8472) or t_start_up (SFF-8431)
+ * from the TX_DISABLE deassertion for the module to
+ * initialise, which is indicated by TX_FAULT
+ * deasserting.
*/
- timeout = T_INIT_JIFFIES;
+ timeout = sfp->module_t_start_up;
if (timeout > T_WAIT)
timeout -= T_WAIT;
else
@@ -1881,8 +1901,8 @@ static void sfp_sm_main(struct sfp *sfp,
case SFP_S_INIT:
if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) {
- /* TX_FAULT is still asserted after t_init, so assume
- * there is a fault.
+ /* TX_FAULT is still asserted after t_init or
+ * or t_start_up, so assume there is a fault.
*/
sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT,
sfp->sm_retries == 5);
@@ -1901,7 +1921,7 @@ static void sfp_sm_main(struct sfp *sfp,
case SFP_S_INIT_TX_FAULT:
if (event == SFP_E_TIMEOUT) {
sfp_module_tx_fault_reset(sfp);
- sfp_sm_next(sfp, SFP_S_INIT, T_INIT_JIFFIES);
+ sfp_sm_next(sfp, SFP_S_INIT, sfp->module_t_start_up);
}
break;
@@ -1925,7 +1945,7 @@ static void sfp_sm_main(struct sfp *sfp,
case SFP_S_TX_FAULT:
if (event == SFP_E_TIMEOUT) {
sfp_module_tx_fault_reset(sfp);
- sfp_sm_next(sfp, SFP_S_REINIT, T_INIT_JIFFIES);
+ sfp_sm_next(sfp, SFP_S_REINIT, sfp->module_t_start_up);
}
break;