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>
This commit is contained in:
parent
a1b322a983
commit
e66b19ce6d
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user