Yes, better if I included that info. I was lazy to look for the specific commit which caused the breakage. If Jonas makes the upstream, it can be made there. Anyway I can resend again the patch if needed.
Regards 2016-12-18 19:28 GMT+01:00 Florian Fainelli <f.faine...@gmail.com>: > > > On 12/18/2016 05:11 AM, Daniel Gonzalez Cabanelas wrote: >> The internal phy is using wrong registers for the config interrupt function, >> causing incorrect behavior when detecting the link activity. Fix it. >> >> We cannot use the bcm_phy_config_intr function from the bcm-phy-lib.c >> because it uses different registers from brcm63xx. The old function was >> right, so go back to it. >> >> It's worth mentioning that this function matches with the one used >> by the Broadcom BCM5241 fast ethernet phy driver (brcm_fet_config_intr >> at broadcom.c). This one uses exactly the same registers as BCM63xx. > > Would have been a good idea to mention that you are essentially > reverting upstream commit a1cba5613edf ("net: phy: Add Broadcom phy > library for common interfaces") for bcm63xx.c and this is what caused > the breakage in the first place. > > Thanks > >> >> --- >> change in v2: >> use the original defines for focusing only on the bug >> modify the commit log accordingly with the new approach >> --- >> diff --git >> a/target/linux/brcm63xx/patches-4.4/409-bcm63xx_net_phy-fix-config_intr.patch >> >> b/target/linux/brcm63xx/patches-4.4/409-bcm63xx_net_phy-fix-config_intr.patch >> new file mode 100644 >> index 0000000..9e5a5d1 >> --- /dev/null >> +++ >> b/target/linux/brcm63xx/patches-4.4/409-bcm63xx_net_phy-fix-config_intr.patch >> @@ -0,0 +1,59 @@ >> +--- a/drivers/net/phy/bcm63xx.c >> ++++ b/drivers/net/phy/bcm63xx.c >> +@@ -40,38 +40,54 @@ >> + MII_BCM63XX_IR_SPEED | >> + MII_BCM63XX_IR_LINK) | >> + MII_BCM63XX_IR_EN; >> + return phy_write(phydev, MII_BCM63XX_IR, reg); >> + } >> + >> ++static int bcm63xx_config_intr(struct phy_device *phydev) >> ++{ >> ++ int reg, err; >> ++ >> ++ reg = phy_read(phydev, MII_BCM63XX_IR); >> ++ if (reg < 0) >> ++ return reg; >> ++ >> ++ if (phydev->interrupts == PHY_INTERRUPT_ENABLED) >> ++ reg &= ~MII_BCM63XX_IR_GMASK; >> ++ else >> ++ reg |= MII_BCM63XX_IR_GMASK; >> ++ >> ++ return phy_write(phydev, MII_BCM63XX_IR, reg); >> ++} >> ++ >> + static struct phy_driver bcm63xx_driver[] = { >> + { >> + .phy_id = 0x00406000, >> + .phy_id_mask = 0xfffffc00, >> + .name = "Broadcom BCM63XX (1)", >> + /* ASYM_PAUSE bit is marked RO in datasheet, so don't cheat */ >> + .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause), >> + .flags = PHY_HAS_INTERRUPT | PHY_IS_INTERNAL, >> + .config_init = bcm63xx_config_init, >> + .config_aneg = genphy_config_aneg, >> + .read_status = genphy_read_status, >> + .ack_interrupt = bcm_phy_ack_intr, >> +- .config_intr = bcm_phy_config_intr, >> ++ .config_intr = bcm63xx_config_intr, >> + .driver = { .owner = THIS_MODULE }, >> + }, { >> + /* same phy as above, with just a different OUI */ >> + .phy_id = 0x002bdc00, >> + .phy_id_mask = 0xfffffc00, >> + .name = "Broadcom BCM63XX (2)", >> + .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause), >> + .flags = PHY_HAS_INTERRUPT | PHY_IS_INTERNAL, >> + .config_init = bcm63xx_config_init, >> + .config_aneg = genphy_config_aneg, >> + .read_status = genphy_read_status, >> + .ack_interrupt = bcm_phy_ack_intr, >> +- .config_intr = bcm_phy_config_intr, >> ++ .config_intr = bcm63xx_config_intr, >> + .driver = { .owner = THIS_MODULE }, >> + } }; >> + >> + module_phy_driver(bcm63xx_driver); >> + >> + static struct mdio_device_id __maybe_unused bcm63xx_tbl[] = { >> >> >> _______________________________________________ >> Lede-dev mailing list >> Lede-dev@lists.infradead.org >> http://lists.infradead.org/mailman/listinfo/lede-dev >> > > -- > Florian -- Daniel _______________________________________________ Lede-dev mailing list Lede-dev@lists.infradead.org http://lists.infradead.org/mailman/listinfo/lede-dev