diff options
author | Siddarth Gore <gores@marvell.com> | 2010-01-19 05:39:07 (GMT) |
---|---|---|
committer | Ben Warren <biggerbadderben@gmail.com> | 2010-02-07 06:52:14 (GMT) |
commit | e66b19ce6dbe6f91b18ba47273cbe89eb5a80e78 (patch) | |
tree | 9450084a596f4b71a956c22c0c04f84fc9e35079 | |
parent | a1b322a98319de568b3bc38029ef7e123643c1e8 (diff) | |
download | u-boot-e66b19ce6dbe6f91b18ba47273cbe89eb5a80e78.tar.xz |
NET: kirkwood-egiga smi access fix
Although the datasheet mentions seperate smi registers for each
port, using Port 1 smi register to access ethernet phys does not
work. Hence only Port 0 smi register should be used to access all
devices connected to the smi bus. This behavior is consistant with
the mv643xx driver in the linux kernel.
Signed-off-by: Siddarth Gore <gores@marvell.com>
Acked-by: Prafulla Wadaskar <prafulla@marvell.com>
Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
-rw-r--r-- | drivers/net/kirkwood_egiga.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/net/kirkwood_egiga.c b/drivers/net/kirkwood_egiga.c index 07a86cd..2ad7fea 100644 --- a/drivers/net/kirkwood_egiga.c +++ b/drivers/net/kirkwood_egiga.c @@ -39,6 +39,7 @@ #include "kirkwood_egiga.h" #define KIRKWOOD_PHY_ADR_REQUEST 0xee +#define KWGBE_SMI_REG (((struct kwgbe_registers *)KW_EGIGA0_BASE)->smi) /* * smi_reg_read - miiphy_read callback function. @@ -76,7 +77,7 @@ static int smi_reg_read(char *devname, u8 phy_adr, u8 reg_ofs, u16 * data) /* wait till the SMI is not busy */ do { /* read smi register */ - smi_reg = KWGBEREG_RD(regs->smi); + smi_reg = KWGBEREG_RD(KWGBE_SMI_REG); if (timeout-- == 0) { printf("Err..(%s) SMI busy timeout\n", __FUNCTION__); return -EFAULT; @@ -89,14 +90,14 @@ static int smi_reg_read(char *devname, u8 phy_adr, u8 reg_ofs, u16 * data) | KWGBE_PHY_SMI_OPCODE_READ; /* write the smi register */ - KWGBEREG_WR(regs->smi, smi_reg); + KWGBEREG_WR(KWGBE_SMI_REG, smi_reg); /*wait till read value is ready */ timeout = KWGBE_PHY_SMI_TIMEOUT; do { /* read smi register */ - smi_reg = KWGBEREG_RD(regs->smi); + smi_reg = KWGBEREG_RD(KWGBE_SMI_REG); if (timeout-- == 0) { printf("Err..(%s) SMI read ready timeout\n", __FUNCTION__); @@ -107,7 +108,7 @@ static int smi_reg_read(char *devname, u8 phy_adr, u8 reg_ofs, u16 * data) /* Wait for the data to update in the SMI register */ for (timeout = 0; timeout < KWGBE_PHY_SMI_TIMEOUT; timeout++) ; - *data = (u16) (KWGBEREG_RD(regs->smi) & KWGBE_PHY_SMI_DATA_MASK); + *data = (u16) (KWGBEREG_RD(KWGBE_SMI_REG) & KWGBE_PHY_SMI_DATA_MASK); debug("%s:(adr %d, off %d) value= %04x\n", __FUNCTION__, phy_adr, reg_ofs, *data); @@ -150,7 +151,7 @@ static int smi_reg_write(char *devname, u8 phy_adr, u8 reg_ofs, u16 data) timeout = KWGBE_PHY_SMI_TIMEOUT; do { /* read smi register */ - smi_reg = KWGBEREG_RD(regs->smi); + smi_reg = KWGBEREG_RD(KWGBE_SMI_REG); if (timeout-- == 0) { printf("Err..(%s) SMI busy timeout\n", __FUNCTION__); return -ETIME; @@ -164,7 +165,7 @@ static int smi_reg_write(char *devname, u8 phy_adr, u8 reg_ofs, u16 data) smi_reg &= ~KWGBE_PHY_SMI_OPCODE_READ; /* write the smi register */ - KWGBEREG_WR(regs->smi, smi_reg); + KWGBEREG_WR(KWGBE_SMI_REG, smi_reg); return 0; } |