[U-Boot] [PATCH 03/17] net: phy: Support Marvell 88E1680
Dirk Eibach
dirk.eibach at gdsys.cc
Thu Dec 1 12:01:06 CET 2016
2016-11-30 0:00 GMT+01:00 Joe Hershberger <joe.hershberger at gmail.com>:
> On Wed, Nov 23, 2016 at 9:12 AM, Mario Six <mario.six at gdsys.cc> wrote:
>> From: Dirk Eibach <dirk.eibach at gdsys.cc>
>>
>> Add support for Marvell 88E1680 Integrated Octal
>> 10/100/1000 Mbps Energy Efficient Ethernet Transceiver.
>>
>> Signed-off-by: Dirk Eibach <dirk.eibach at gdsys.cc>
>> ---
>> drivers/net/phy/marvell.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 51 insertions(+)
>>
>> diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
>> index 4eeb0f6..72f3f92 100644
>> --- a/drivers/net/phy/marvell.c
>> +++ b/drivers/net/phy/marvell.c
>> @@ -480,6 +480,46 @@ static int m88e1310_config(struct phy_device *phydev)
>> return genphy_config_aneg(phydev);
>> }
>>
>> +static int m88e1680_config(struct phy_device *phydev)
>> +{
>> + /*
>> + * As per Marvell Release Notes - Alaska V 88E1680 Rev A2
>> + * Errata Section 4.1
>> + */
>> + u16 reg;
>> +
>> + /* Matrix LED mode (not neede if single LED mode is used */
>> + phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x0004);
>
> I realize the 88e151* driver went in without my ack (35fa0dda: "net:
> phy: marvell: add errata w/a for 88E151* chips"), and is loaded with
> magic numbers, but let's not proliferate the problem. Please define
> register offsets or use already-defined register offsets. If
> reasonable, use defined field values to build values from defines and
> something like bitfield_replace() from bitfield.h or clrsetbits_le32()
> from asm/io.h. When it is a constant that represents an encoded
> physical value that will never be used elsewhere, it's ok to just keep
> the hard-coded number in the write, but it should be preceeded with a
> comment that describes the actual meaning in engineering units and
> prefereably the equation used to come up with the constant. If you
> have the information to improve the 151* implementation as well, that
> would be very welcome.
Problem is that the initialization sequence from the Marvell Release
Notes is writing undocumented values to undocumented registers. It
should be considered a binary blob to get this chip up and running.
All the information that is available is added as comments.
>
>> + reg = phy_read(phydev, MDIO_DEVAD_NONE, 27);
>> + reg |= (1 << 5);
>> + phy_write(phydev, MDIO_DEVAD_NONE, 27, reg);
>> +
>> + /* QSGMII TX amplitude change */
>> + phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x00fd);
>> + phy_write(phydev, MDIO_DEVAD_NONE, 8, 0x0b53);
>> + phy_write(phydev, MDIO_DEVAD_NONE, 7, 0x200d);
>> + phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x0000);
>> +
>> + /* EEE initialization */
>> + phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x00ff);
>> + phy_write(phydev, MDIO_DEVAD_NONE, 17, 0xb030);
>> + phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x215c);
>> + phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x00fc);
>> + phy_write(phydev, MDIO_DEVAD_NONE, 24, 0x888c);
>> + phy_write(phydev, MDIO_DEVAD_NONE, 25, 0x888c);
>> + phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x0000);
>> + phy_write(phydev, MDIO_DEVAD_NONE, 0, 0x9140);
>> +
>> + genphy_config_aneg(phydev);
>
> This should check the return code and return it if negative.
Mario, would you take care of this in V2?
Cheers
Dirk
More information about the U-Boot
mailing list