| From ef2cdd94f0f3c4299fa45e39fa765ce573ce0fa7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 15 Feb 2020 17:54:19 +0100 |
| Subject: net: ks8851-ml: Fix 16-bit IO operation |
| |
| From: Marek Vasut <marex@denx.de> |
| |
| [ Upstream commit 58292104832fef6cb4a89f736012c0e0724c3442 ] |
| |
| The Micrel KSZ8851-16MLLI datasheet DS00002357B page 12 states that |
| BE[3:0] signals are active high. This contradicts the measurements |
| of the behavior of the actual chip, where these signals behave as |
| active low. For example, to read the CIDER register, the bus must |
| expose 0xc0c0 during the address phase, which means BE[3:0]=4'b1100. |
| |
| Signed-off-by: Marek Vasut <marex@denx.de> |
| Cc: David S. Miller <davem@davemloft.net> |
| Cc: Lukas Wunner <lukas@wunner.de> |
| Cc: Petr Stetiar <ynezz@true.cz> |
| Cc: YueHaibing <yuehaibing@huawei.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/micrel/ks8851_mll.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c |
| index 5ae206ae5d2b3..1c9e70c8cc30f 100644 |
| --- a/drivers/net/ethernet/micrel/ks8851_mll.c |
| +++ b/drivers/net/ethernet/micrel/ks8851_mll.c |
| @@ -166,7 +166,7 @@ static int msg_enable; |
| |
| static u16 ks_rdreg16(struct ks_net *ks, int offset) |
| { |
| - ks->cmd_reg_cache = (u16)offset | ((BE1 | BE0) << (offset & 0x02)); |
| + ks->cmd_reg_cache = (u16)offset | ((BE3 | BE2) >> (offset & 0x02)); |
| iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); |
| return ioread16(ks->hw_addr); |
| } |
| @@ -181,7 +181,7 @@ static u16 ks_rdreg16(struct ks_net *ks, int offset) |
| |
| static void ks_wrreg16(struct ks_net *ks, int offset, u16 value) |
| { |
| - ks->cmd_reg_cache = (u16)offset | ((BE1 | BE0) << (offset & 0x02)); |
| + ks->cmd_reg_cache = (u16)offset | ((BE3 | BE2) >> (offset & 0x02)); |
| iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); |
| iowrite16(value, ks->hw_addr); |
| } |
| -- |
| 2.20.1 |
| |