Skip to content

Commit 136819a

Browse files
xdarklightdavem330
authored andcommitted
net: phy: realtek: add utility functions to read/write page addresses
Realtek PHYs implement the concept of so-called "extension pages". The reason for this is probably because these PHYs expose more registers than available in the standard address range. After all read/write operations on such a page are done the driver should switch back to page 0 where the standard MII registers (such as MII_BMCR) are available. When referring to such a register the datasheets of RTL8211E and RTL8211F always specify: - the page / "ext. page" which has to be written to RTL821x_PAGE_SELECT - an address (sometimes also called reg) These new utility functions make the existing code easier to read since it removes some duplication (switching back to page 0 is done within the new helpers for example). No functional changes are intended. Signed-off-by: Martin Blumenstingl <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent f609ab0 commit 136819a

File tree

1 file changed

+53
-30
lines changed

1 file changed

+53
-30
lines changed

drivers/net/phy/realtek.c

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,39 @@ MODULE_DESCRIPTION("Realtek PHY driver");
4141
MODULE_AUTHOR("Johnson Leung");
4242
MODULE_LICENSE("GPL");
4343

44+
static int rtl8211x_page_read(struct phy_device *phydev, u16 page, u16 address)
45+
{
46+
int ret;
47+
48+
ret = phy_write(phydev, RTL821x_PAGE_SELECT, page);
49+
if (ret)
50+
return ret;
51+
52+
ret = phy_read(phydev, address);
53+
54+
/* restore to default page 0 */
55+
phy_write(phydev, RTL821x_PAGE_SELECT, 0x0);
56+
57+
return ret;
58+
}
59+
60+
static int rtl8211x_page_write(struct phy_device *phydev, u16 page,
61+
u16 address, u16 val)
62+
{
63+
int ret;
64+
65+
ret = phy_write(phydev, RTL821x_PAGE_SELECT, page);
66+
if (ret)
67+
return ret;
68+
69+
ret = phy_write(phydev, address, val);
70+
71+
/* restore to default page 0 */
72+
phy_write(phydev, RTL821x_PAGE_SELECT, 0x0);
73+
74+
return ret;
75+
}
76+
4477
static int rtl8201_ack_interrupt(struct phy_device *phydev)
4578
{
4679
int err;
@@ -63,31 +96,21 @@ static int rtl8211f_ack_interrupt(struct phy_device *phydev)
6396
{
6497
int err;
6598

66-
phy_write(phydev, RTL821x_PAGE_SELECT, 0xa43);
67-
err = phy_read(phydev, RTL8211F_INSR);
68-
/* restore to default page 0 */
69-
phy_write(phydev, RTL821x_PAGE_SELECT, 0x0);
99+
err = rtl8211x_page_read(phydev, 0xa43, RTL8211F_INSR);
70100

71101
return (err < 0) ? err : 0;
72102
}
73103

74104
static int rtl8201_config_intr(struct phy_device *phydev)
75105
{
76-
int err;
77-
78-
/* switch to page 7 */
79-
phy_write(phydev, RTL821x_PAGE_SELECT, 0x7);
106+
u16 val;
80107

81108
if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
82-
err = phy_write(phydev, RTL8201F_IER,
83-
BIT(13) | BIT(12) | BIT(11));
109+
val = BIT(13) | BIT(12) | BIT(11);
84110
else
85-
err = phy_write(phydev, RTL8201F_IER, 0);
111+
val = 0;
86112

87-
/* restore to default page 0 */
88-
phy_write(phydev, RTL821x_PAGE_SELECT, 0x0);
89-
90-
return err;
113+
return rtl8211x_page_write(phydev, 0x7, RTL8201F_IER, val);
91114
}
92115

93116
static int rtl8211b_config_intr(struct phy_device *phydev)
@@ -118,41 +141,41 @@ static int rtl8211e_config_intr(struct phy_device *phydev)
118141

119142
static int rtl8211f_config_intr(struct phy_device *phydev)
120143
{
121-
int err;
144+
u16 val;
122145

123-
phy_write(phydev, RTL821x_PAGE_SELECT, 0xa42);
124146
if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
125-
err = phy_write(phydev, RTL821x_INER,
126-
RTL8211F_INER_LINK_STATUS);
147+
val = RTL8211F_INER_LINK_STATUS;
127148
else
128-
err = phy_write(phydev, RTL821x_INER, 0);
129-
phy_write(phydev, RTL821x_PAGE_SELECT, 0);
149+
val = 0;
130150

131-
return err;
151+
return rtl8211x_page_write(phydev, 0xa42, RTL821x_INER, val);
132152
}
133153

134154
static int rtl8211f_config_init(struct phy_device *phydev)
135155
{
136156
int ret;
137-
u16 reg;
157+
u16 val;
138158

139159
ret = genphy_config_init(phydev);
140160
if (ret < 0)
141161
return ret;
142162

143-
phy_write(phydev, RTL821x_PAGE_SELECT, 0xd08);
144-
reg = phy_read(phydev, 0x11);
163+
ret = rtl8211x_page_read(phydev, 0xd08, 0x11);
164+
if (ret < 0)
165+
return ret;
166+
167+
val = ret & 0xffff;
145168

146169
/* enable TX-delay for rgmii-id and rgmii-txid, otherwise disable it */
147170
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
148171
phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
149-
reg |= RTL8211F_TX_DELAY;
172+
val |= RTL8211F_TX_DELAY;
150173
else
151-
reg &= ~RTL8211F_TX_DELAY;
174+
val &= ~RTL8211F_TX_DELAY;
152175

153-
phy_write(phydev, 0x11, reg);
154-
/* restore to default page 0 */
155-
phy_write(phydev, RTL821x_PAGE_SELECT, 0x0);
176+
ret = rtl8211x_page_write(phydev, 0xd08, 0x11, val);
177+
if (ret)
178+
return ret;
156179

157180
return 0;
158181
}

0 commit comments

Comments
 (0)