From 7cc39a6bedbd85f3ff7e16845f310e4ce8d9833f Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Tue, 6 Sep 2022 00:31:19 +0100 Subject: [PATCH] net: sfp: add quirk for ATS SFP-GE-T 1000Base-TX module To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Russell King , Andrew Lunn , Heiner Kallweit Cc: David S. Miller , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Josef Schlehofer This copper module comes with broken TX_FAULT indicator which must be ignored for it to work. Implement ignoring TX_FAULT state bit also during reset/insertion and mute the warning telling the user that the module indicates TX_FAULT. Co-authored-by: Josef Schlehofer Signed-off-by: Daniel Golle --- drivers/net/phy/sfp.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) --- a/drivers/net/phy/sfp.c +++ b/drivers/net/phy/sfp.c @@ -393,6 +393,9 @@ static const struct sfp_quirk sfp_quirks // their EEPROM SFP_QUIRK("HUAWEI", "MA5671A", sfp_quirk_2500basex, sfp_fixup_ignore_tx_fault), + + // OEM SFP-GE-T is 1000Base-T module + SFP_QUIRK_F("OEM", "SFP-GE-T", sfp_fixup_ignore_tx_fault), // Lantech 8330-262D-E can operate at 2500base-X, but incorrectly report // 2500MBd NRZ in their EEPROM @@ -2303,7 +2308,8 @@ static void sfp_sm_main(struct sfp *sfp, * or t_start_up, so assume there is a fault. */ sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT, - sfp->sm_fault_retries == N_FAULT_INIT); + !sfp->tx_fault_ignore && + (sfp->sm_fault_retries == N_FAULT_INIT)); } else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) { init_done: sfp->sm_phy_retries = R_PHY_RETRY; @@ -2535,10 +2541,12 @@ static void sfp_check_state(struct sfp * mutex_lock(&sfp->st_mutex); state = sfp_get_state(sfp); changed = state ^ sfp->state; - if (sfp->tx_fault_ignore) + if (sfp->tx_fault_ignore) { changed &= SFP_F_PRESENT | SFP_F_LOS; - else + state &= ~SFP_F_TX_FAULT; + } else { changed &= SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT; + } for (i = 0; i < GPIO_MAX; i++) if (changed & BIT(i))