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

Florian Fainelli f.fainelli at gmail.com
Sun Dec 18 10:28:09 PST 2016



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



More information about the Lede-dev mailing list