Commit ac244d3e authored by hayeswang's avatar hayeswang Committed by David S. Miller

r8152: modify the method of accessing PHY

The old method to access PHY is through mdio channel. Replace it
with the OCP channel.
Signed-off-by: default avatarHayes Wang <hayeswang@realtek.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e3fe0b1a
...@@ -98,6 +98,7 @@ ...@@ -98,6 +98,7 @@
#define OCP_EEE_CONFIG1 0x2080 #define OCP_EEE_CONFIG1 0x2080
#define OCP_EEE_CONFIG2 0x2092 #define OCP_EEE_CONFIG2 0x2092
#define OCP_EEE_CONFIG3 0x2094 #define OCP_EEE_CONFIG3 0x2094
#define OCP_BASE_MII 0xa400
#define OCP_EEE_AR 0xa41a #define OCP_EEE_AR 0xa41a
#define OCP_EEE_DATA 0xa41c #define OCP_EEE_DATA 0xa41c
...@@ -653,7 +654,7 @@ static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data) ...@@ -653,7 +654,7 @@ static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data)
generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type);
} }
static void ocp_reg_write(struct r8152 *tp, u16 addr, u16 data) static u16 ocp_reg_read(struct r8152 *tp, u16 addr)
{ {
u16 ocp_base, ocp_index; u16 ocp_base, ocp_index;
...@@ -664,48 +665,31 @@ static void ocp_reg_write(struct r8152 *tp, u16 addr, u16 data) ...@@ -664,48 +665,31 @@ static void ocp_reg_write(struct r8152 *tp, u16 addr, u16 data)
} }
ocp_index = (addr & 0x0fff) | 0xb000; ocp_index = (addr & 0x0fff) | 0xb000;
ocp_write_word(tp, MCU_TYPE_PLA, ocp_index, data); return ocp_read_word(tp, MCU_TYPE_PLA, ocp_index);
} }
static void r8152_mdio_write(struct r8152 *tp, u32 reg_addr, u32 value) static void ocp_reg_write(struct r8152 *tp, u16 addr, u16 data)
{ {
u32 ocp_data; u16 ocp_base, ocp_index;
int i;
ocp_data = PHYAR_FLAG | ((reg_addr & 0x1f) << 16) |
(value & 0xffff);
ocp_write_dword(tp, MCU_TYPE_PLA, PLA_PHYAR, ocp_data);
for (i = 20; i > 0; i--) { ocp_base = addr & 0xf000;
udelay(25); if (ocp_base != tp->ocp_base) {
ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_PHYAR); ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, ocp_base);
if (!(ocp_data & PHYAR_FLAG)) tp->ocp_base = ocp_base;
break;
} }
udelay(20);
ocp_index = (addr & 0x0fff) | 0xb000;
ocp_write_word(tp, MCU_TYPE_PLA, ocp_index, data);
} }
static int r8152_mdio_read(struct r8152 *tp, u32 reg_addr) static inline void r8152_mdio_write(struct r8152 *tp, u32 reg_addr, u32 value)
{ {
u32 ocp_data; ocp_reg_write(tp, OCP_BASE_MII + reg_addr * 2, value);
int i; }
ocp_data = (reg_addr & 0x1f) << 16;
ocp_write_dword(tp, MCU_TYPE_PLA, PLA_PHYAR, ocp_data);
for (i = 20; i > 0; i--) {
udelay(25);
ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_PHYAR);
if (ocp_data & PHYAR_FLAG)
break;
}
udelay(20);
if (!(ocp_data & PHYAR_FLAG))
return -EAGAIN;
return (u16)(ocp_data & 0xffff); static inline int r8152_mdio_read(struct r8152 *tp, u32 reg_addr)
{
return ocp_reg_read(tp, OCP_BASE_MII + reg_addr * 2);
} }
static int read_mii_word(struct net_device *netdev, int phy_id, int reg) static int read_mii_word(struct net_device *netdev, int phy_id, int reg)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment