[PATCH linux 2/2] phy/broadcom: Add support for BCM54612E

Xo Wang xow at google.com
Fri Oct 21 07:28:00 AEDT 2016


Hi Joel,

On Tue, Oct 18, 2016 at 8:49 PM, Joel Stanley <joel at jms.id.au> wrote:
> Hello Xo,
>
> On Wed, Oct 19, 2016 at 12:28 PM, Xo Wang <xow at google.com> wrote:
>> This PHY has internal delays enabled after reset. This clears the
>> internal delay enables unless the interface specifically requests them.
>
> This looks fine to me. We have a similar patch for adding the Broadcom
> phy on some of our machines. I just noticed that isn't present in
> dev-4.7, as we were sorting out an issue that required us to force the
> PHY into 100MBit mode. Would the aneg change be related to that?

Exactly, this is just for a different PHY. I'm not sure about the
BCM54210E part that Firestone uses. The Broadcom docs for our part's
internal delay says that it increases with decreasing link speed (1.9
ns, 4 ns, 50
ns for 1000 M, 100 M, 10 M, respectively) so it broke for me at all speeds.

>
> I suggest you submit these two one upstream. Use
> scripts/get_maintainer.pl to work out what mailing list to send it to.
> CC me so I can provide my ack.
>

Will do, thanks.

cheers
xo

> If you need any help then please ping me on IRC.
>
> Cheers,
>
> Joel
>
>>
>> Signed-off-by: Xo Wang <xow at google.com>
>> ---
>>  drivers/net/phy/broadcom.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++
>>  include/linux/brcmphy.h    |  1 +
>>  2 files changed, 49 insertions(+)
>>
>> diff --git a/drivers/net/phy/broadcom.c b/drivers/net/phy/broadcom.c
>> index 870327e..583ef8a 100644
>> --- a/drivers/net/phy/broadcom.c
>> +++ b/drivers/net/phy/broadcom.c
>> @@ -337,6 +337,41 @@ static int bcm5481_config_aneg(struct phy_device *phydev)
>>         return ret;
>>  }
>>
>> +static int bcm54612e_config_aneg(struct phy_device *phydev)
>> +{
>> +       int ret;
>> +
>> +       /* First, auto-negotiate. */
>> +       ret = genphy_config_aneg(phydev);
>> +
>> +       /* Clear TX internal delay unless requested. */
>> +       if ((phydev->interface != PHY_INTERFACE_MODE_RGMII_ID) &&
>> +           (phydev->interface != PHY_INTERFACE_MODE_RGMII_TXID)) {
>> +               /* Disable TXD to GTXCLK clock delay (default set) */
>> +               /* Bit 9 is the only field in shadow register 00011 */
>> +               bcm_phy_write_shadow(phydev, 0x03, 0);
>> +       }
>> +
>> +       /* Clear RX internal delay unless requested. */
>> +       if ((phydev->interface != PHY_INTERFACE_MODE_RGMII_ID) &&
>> +           (phydev->interface != PHY_INTERFACE_MODE_RGMII_RXID)) {
>> +               u16 reg;
>> +
>> +               /* Errata: reads require filling in the write selector field */
>> +               bcm54xx_auxctl_write(phydev, MII_BCM54XX_AUXCTL_SHDWSEL_MISC,
>> +                                    MII_BCM54XX_AUXCTL_MISC_RDSEL_MISC);
>> +               reg = phy_read(phydev, MII_BCM54XX_AUX_CTL);
>> +               /* Disable RXD to RXC delay (default set) */
>> +               reg &= ~MII_BCM54XX_AUXCTL_MISC_RXD_RXC_SKEW;
>> +               /* Clear shadow selector field */
>> +               reg &= ~MII_BCM54XX_AUXCTL_SHDWSEL_MASK;
>> +               bcm54xx_auxctl_write(phydev, MII_BCM54XX_AUXCTL_SHDWSEL_MISC,
>> +                                    MII_BCM54XX_AUXCTL_MISC_WREN | reg);
>> +       }
>> +
>> +       return ret;
>> +}
>> +
>>  static int brcm_phy_setbits(struct phy_device *phydev, int reg, int set)
>>  {
>>         int val;
>> @@ -485,6 +520,18 @@ static struct phy_driver broadcom_drivers[] = {
>>         .ack_interrupt  = bcm_phy_ack_intr,
>>         .config_intr    = bcm_phy_config_intr,
>>  }, {
>> +       .phy_id         = PHY_ID_BCM54612E,
>> +       .phy_id_mask    = 0xfffffff0,
>> +       .name           = "Broadcom BCM54612E",
>> +       .features       = PHY_GBIT_FEATURES |
>> +                         SUPPORTED_Pause | SUPPORTED_Asym_Pause,
>> +       .flags          = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT,
>> +       .config_init    = bcm54xx_config_init,
>> +       .config_aneg    = bcm54612e_config_aneg,
>> +       .read_status    = genphy_read_status,
>> +       .ack_interrupt  = bcm_phy_ack_intr,
>> +       .config_intr    = bcm_phy_config_intr,
>> +}, {
>>         .phy_id         = PHY_ID_BCM54616S,
>>         .phy_id_mask    = 0xfffffff0,
>>         .name           = "Broadcom BCM54616S",
>> @@ -600,6 +647,7 @@ static struct mdio_device_id __maybe_unused broadcom_tbl[] = {
>>         { PHY_ID_BCM5411, 0xfffffff0 },
>>         { PHY_ID_BCM5421, 0xfffffff0 },
>>         { PHY_ID_BCM5461, 0xfffffff0 },
>> +       { PHY_ID_BCM54612E, 0xfffffff0 },
>>         { PHY_ID_BCM54616S, 0xfffffff0 },
>>         { PHY_ID_BCM5464, 0xfffffff0 },
>>         { PHY_ID_BCM5481, 0xfffffff0 },
>> diff --git a/include/linux/brcmphy.h b/include/linux/brcmphy.h
>> index 22c4421..60def78 100644
>> --- a/include/linux/brcmphy.h
>> +++ b/include/linux/brcmphy.h
>> @@ -18,6 +18,7 @@
>>  #define PHY_ID_BCM5421                 0x002060e0
>>  #define PHY_ID_BCM5464                 0x002060b0
>>  #define PHY_ID_BCM5461                 0x002060c0
>> +#define PHY_ID_BCM54612E               0x03625e60
>>  #define PHY_ID_BCM54616S               0x03625d10
>>  #define PHY_ID_BCM57780                        0x03625d90
>>
>> --
>> 2.8.0.rc3.226.g39d4020
>>
>> _______________________________________________
>> openbmc mailing list
>> openbmc at lists.ozlabs.org
>> https://lists.ozlabs.org/listinfo/openbmc


More information about the openbmc mailing list