net: sfp: move Alcatel Lucent 3FE46541AA fixup
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Tue, 13 Sep 2022 19:06:37 +0000 (20:06 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 20 Sep 2022 14:54:13 +0000 (07:54 -0700)
Add a new fixup mechanism to the SFP quirks, and use it for this
module.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/sfp.c
drivers/net/phy/sfp.h

index 3901919..2ef7bb4 100644 (file)
@@ -311,6 +311,11 @@ static const struct of_device_id sfp_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, sfp_of_match);
 
 };
 MODULE_DEVICE_TABLE(of, sfp_of_match);
 
+static void sfp_fixup_long_startup(struct sfp *sfp)
+{
+       sfp->module_t_start_up = T_START_UP_BAD_GPON;
+}
+
 static void sfp_quirk_2500basex(const struct sfp_eeprom_id *id,
                                unsigned long *modes)
 {
 static void sfp_quirk_2500basex(const struct sfp_eeprom_id *id,
                                unsigned long *modes)
 {
@@ -341,6 +346,7 @@ static const struct sfp_quirk sfp_quirks[] = {
                .vendor = "ALCATELLUCENT",
                .part = "3FE46541AA",
                .modes = sfp_quirk_2500basex,
                .vendor = "ALCATELLUCENT",
                .part = "3FE46541AA",
                .modes = sfp_quirk_2500basex,
+               .fixup = sfp_fixup_long_startup,
        }, {
                // Huawei MA5671A can operate at 2500base-X, but report 1.2GBd
                // NRZ in their EEPROM
        }, {
                // Huawei MA5671A can operate at 2500base-X, but report 1.2GBd
                // NRZ in their EEPROM
@@ -2003,11 +2009,7 @@ static int sfp_sm_mod_probe(struct sfp *sfp, bool report)
        if (sfp->gpio[GPIO_LOS])
                sfp->state_hw_mask |= SFP_F_LOS;
 
        if (sfp->gpio[GPIO_LOS])
                sfp->state_hw_mask |= SFP_F_LOS;
 
-       if (!memcmp(id.base.vendor_name, "ALCATELLUCENT   ", 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;
+       sfp->module_t_start_up = T_START_UP;
 
        if (!memcmp(id.base.vendor_name, "HUAWEI          ", 16) &&
            !memcmp(id.base.vendor_pn, "MA5671A         ", 16))
 
        if (!memcmp(id.base.vendor_name, "HUAWEI          ", 16) &&
            !memcmp(id.base.vendor_pn, "MA5671A         ", 16))
@@ -2016,6 +2018,8 @@ static int sfp_sm_mod_probe(struct sfp *sfp, bool report)
                sfp->tx_fault_ignore = false;
 
        sfp->quirk = sfp_lookup_quirk(&id);
                sfp->tx_fault_ignore = false;
 
        sfp->quirk = sfp_lookup_quirk(&id);
+       if (sfp->quirk && sfp->quirk->fixup)
+               sfp->quirk->fixup(sfp);
 
        return 0;
 }
 
        return 0;
 }
index 03f1d47..7ad06de 100644 (file)
@@ -10,6 +10,7 @@ struct sfp_quirk {
        const char *vendor;
        const char *part;
        void (*modes)(const struct sfp_eeprom_id *id, unsigned long *modes);
        const char *vendor;
        const char *part;
        void (*modes)(const struct sfp_eeprom_id *id, unsigned long *modes);
+       void (*fixup)(struct sfp *sfp);
 };
 
 struct sfp_socket_ops {
 };
 
 struct sfp_socket_ops {