diff mbox

[U-Boot] sun8i_emac: Fix mdio read sequence

Message ID 1479260427-17394-1-git-send-email-andre.przywara@arm.com
State Accepted
Commit 1deeecb6e41a42d0e24fec30d2bb74c56d7a0d9b
Delegated to: Jagannadha Sutradharudu Teki
Headers show

Commit Message

Andre Przywara Nov. 16, 2016, 1:40 a.m. UTC
From: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>

To send a parametrized command to the PHY over MDIO, we should write
the data first, the trigger the execution by the command register
write. Fix the access pattern in our MDIO write routine.
Apparently this doesn't really matter with the Realtek PHY on the
Pine64, but other PHYs (which require more setup) will choke on
the wrong order.
[Andre: add commit message]

Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
---
 drivers/net/sun8i_emac.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Jagan Teki Nov. 25, 2016, 4:18 p.m. UTC | #1
On Wed, Nov 16, 2016 at 7:10 AM, Andre Przywara <andre.przywara@arm.com> wrote:
> From: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
>
> To send a parametrized command to the PHY over MDIO, we should write
> the data first, the trigger the execution by the command register
> write. Fix the access pattern in our MDIO write routine.
> Apparently this doesn't really matter with the Realtek PHY on the
> Pine64, but other PHYs (which require more setup) will choke on
> the wrong order.

Any tested-by this on non-realtek, because I always remember to have
CMD with DATA sequence for mdio write for most of the PHY's and ie
default sequence though.

thanks!
Philipp Tomsich Nov. 25, 2016, 4:20 p.m. UTC | #2
Jagan,

> On 25 Nov 2016, at 17:18, Jagan Teki <jagan@openedev.com> wrote:
> 
> On Wed, Nov 16, 2016 at 7:10 AM, Andre Przywara <andre.przywara@arm.com> wrote:
>> From: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
>> 
>> To send a parametrized command to the PHY over MDIO, we should write
>> the data first, the trigger the execution by the command register
>> write. Fix the access pattern in our MDIO write routine.
>> Apparently this doesn't really matter with the Realtek PHY on the
>> Pine64, but other PHYs (which require more setup) will choke on
>> the wrong order.
> 
> Any tested-by this on non-realtek, because I always remember to have
> CMD with DATA sequence for mdio write for most of the PHY's and ie
> default sequence though.

We have a KSZ9031 on all our boards… so it was tested against the KSZ9031.

Cheers,
Philipp.
Jagan Teki Nov. 28, 2016, 8:01 a.m. UTC | #3
On Fri, Nov 25, 2016 at 9:50 PM, Dr. Philipp Tomsich
<philipp.tomsich@theobroma-systems.com> wrote:
> Jagan,
>
>> On 25 Nov 2016, at 17:18, Jagan Teki <jagan@openedev.com> wrote:
>>
>> On Wed, Nov 16, 2016 at 7:10 AM, Andre Przywara <andre.przywara@arm.com> wrote:
>>> From: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
>>>
>>> To send a parametrized command to the PHY over MDIO, we should write
>>> the data first, the trigger the execution by the command register
>>> write. Fix the access pattern in our MDIO write routine.
>>> Apparently this doesn't really matter with the Realtek PHY on the
>>> Pine64, but other PHYs (which require more setup) will choke on
>>> the wrong order.
>>
>> Any tested-by this on non-realtek, because I always remember to have
>> CMD with DATA sequence for mdio write for most of the PHY's and ie
>> default sequence though.
>
> We have a KSZ9031 on all our boards… so it was tested against the KSZ9031.

Applied to u-boot-spi/sunxi

thanks!
diff mbox

Patch

diff --git a/drivers/net/sun8i_emac.c b/drivers/net/sun8i_emac.c
index 6ac8ba3..abd9cc8 100644
--- a/drivers/net/sun8i_emac.c
+++ b/drivers/net/sun8i_emac.c
@@ -180,8 +180,8 @@  static int sun8i_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
 	miiaddr |= MDIO_CMD_MII_WRITE;
 	miiaddr |= MDIO_CMD_MII_BUSY;
 
-	writel(miiaddr, priv->mac_reg + EMAC_MII_CMD);
 	writel(val, priv->mac_reg + EMAC_MII_DATA);
+	writel(miiaddr, priv->mac_reg + EMAC_MII_CMD);
 
 	start = get_timer(0);
 	while (get_timer(start) < timeout) {