[LEDE-DEV] [PATCH v2] brcm63xx: fix internal net phy interrupt config

Daniel dgcbueu at gmail.com
Sun Dec 18 10:51:22 PST 2016


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.fainelli at 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 at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/lede-dev
>>
>
> --
> Florian



-- 
Daniel



More information about the Lede-dev mailing list