Skip to content

Commit 0653cb2

Browse files
committed
Merge branch 'realtek-phy-improvements'
Martin Blumenstingl says: ==================== Realtek Ethernet PHY driver improvements This series provides some small improvements and cleanups for the Realtek Ethernet PHY driver. None of the patches in this series should change any functionality. The goal is to make the code a bit easier to read by: - re-using the BIT and GENMASK macros (which makes it easier to compare the #defines in the kernel with the values from the datasheets) - rename a #define from a generic name to a PHY-specific name since it's only used for one specific PHY - logically group the register #defines and their register bit #defines together - indentation cleanups - removed some code duplicating for reading/writing registers on a Realtek specific "page" ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 75d0de8 + 136819a commit 0653cb2

File tree

1 file changed

+72
-44
lines changed

1 file changed

+72
-44
lines changed

drivers/net/phy/realtek.c

Lines changed: 72 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,67 @@
1313
* option) any later version.
1414
*
1515
*/
16+
#include <linux/bitops.h>
1617
#include <linux/phy.h>
1718
#include <linux/module.h>
1819

19-
#define RTL821x_PHYSR 0x11
20-
#define RTL821x_PHYSR_DUPLEX 0x2000
21-
#define RTL821x_PHYSR_SPEED 0xc000
22-
#define RTL821x_INER 0x12
23-
#define RTL821x_INER_INIT 0x6400
24-
#define RTL821x_INSR 0x13
25-
#define RTL821x_PAGE_SELECT 0x1f
26-
#define RTL8211E_INER_LINK_STATUS 0x400
20+
#define RTL821x_PHYSR 0x11
21+
#define RTL821x_PHYSR_DUPLEX BIT(13)
22+
#define RTL821x_PHYSR_SPEED GENMASK(15, 14)
2723

28-
#define RTL8211F_INER_LINK_STATUS 0x0010
29-
#define RTL8211F_INSR 0x1d
30-
#define RTL8211F_TX_DELAY 0x100
24+
#define RTL821x_INER 0x12
25+
#define RTL8211B_INER_INIT 0x6400
26+
#define RTL8211E_INER_LINK_STATUS BIT(10)
27+
#define RTL8211F_INER_LINK_STATUS BIT(4)
3128

32-
#define RTL8201F_ISR 0x1e
33-
#define RTL8201F_IER 0x13
29+
#define RTL821x_INSR 0x13
30+
31+
#define RTL821x_PAGE_SELECT 0x1f
32+
33+
#define RTL8211F_INSR 0x1d
34+
35+
#define RTL8211F_TX_DELAY BIT(8)
36+
37+
#define RTL8201F_ISR 0x1e
38+
#define RTL8201F_IER 0x13
3439

3540
MODULE_DESCRIPTION("Realtek PHY driver");
3641
MODULE_AUTHOR("Johnson Leung");
3742
MODULE_LICENSE("GPL");
3843

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+
3977
static int rtl8201_ack_interrupt(struct phy_device *phydev)
4078
{
4179
int err;
@@ -58,31 +96,21 @@ static int rtl8211f_ack_interrupt(struct phy_device *phydev)
5896
{
5997
int err;
6098

61-
phy_write(phydev, RTL821x_PAGE_SELECT, 0xa43);
62-
err = phy_read(phydev, RTL8211F_INSR);
63-
/* restore to default page 0 */
64-
phy_write(phydev, RTL821x_PAGE_SELECT, 0x0);
99+
err = rtl8211x_page_read(phydev, 0xa43, RTL8211F_INSR);
65100

66101
return (err < 0) ? err : 0;
67102
}
68103

69104
static int rtl8201_config_intr(struct phy_device *phydev)
70105
{
71-
int err;
72-
73-
/* switch to page 7 */
74-
phy_write(phydev, RTL821x_PAGE_SELECT, 0x7);
106+
u16 val;
75107

76108
if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
77-
err = phy_write(phydev, RTL8201F_IER,
78-
BIT(13) | BIT(12) | BIT(11));
109+
val = BIT(13) | BIT(12) | BIT(11);
79110
else
80-
err = phy_write(phydev, RTL8201F_IER, 0);
81-
82-
/* restore to default page 0 */
83-
phy_write(phydev, RTL821x_PAGE_SELECT, 0x0);
111+
val = 0;
84112

85-
return err;
113+
return rtl8211x_page_write(phydev, 0x7, RTL8201F_IER, val);
86114
}
87115

88116
static int rtl8211b_config_intr(struct phy_device *phydev)
@@ -91,7 +119,7 @@ static int rtl8211b_config_intr(struct phy_device *phydev)
91119

92120
if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
93121
err = phy_write(phydev, RTL821x_INER,
94-
RTL821x_INER_INIT);
122+
RTL8211B_INER_INIT);
95123
else
96124
err = phy_write(phydev, RTL821x_INER, 0);
97125

@@ -113,41 +141,41 @@ static int rtl8211e_config_intr(struct phy_device *phydev)
113141

114142
static int rtl8211f_config_intr(struct phy_device *phydev)
115143
{
116-
int err;
144+
u16 val;
117145

118-
phy_write(phydev, RTL821x_PAGE_SELECT, 0xa42);
119146
if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
120-
err = phy_write(phydev, RTL821x_INER,
121-
RTL8211F_INER_LINK_STATUS);
147+
val = RTL8211F_INER_LINK_STATUS;
122148
else
123-
err = phy_write(phydev, RTL821x_INER, 0);
124-
phy_write(phydev, RTL821x_PAGE_SELECT, 0);
149+
val = 0;
125150

126-
return err;
151+
return rtl8211x_page_write(phydev, 0xa42, RTL821x_INER, val);
127152
}
128153

129154
static int rtl8211f_config_init(struct phy_device *phydev)
130155
{
131156
int ret;
132-
u16 reg;
157+
u16 val;
133158

134159
ret = genphy_config_init(phydev);
135160
if (ret < 0)
136161
return ret;
137162

138-
phy_write(phydev, RTL821x_PAGE_SELECT, 0xd08);
139-
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;
140168

141169
/* enable TX-delay for rgmii-id and rgmii-txid, otherwise disable it */
142170
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
143171
phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
144-
reg |= RTL8211F_TX_DELAY;
172+
val |= RTL8211F_TX_DELAY;
145173
else
146-
reg &= ~RTL8211F_TX_DELAY;
174+
val &= ~RTL8211F_TX_DELAY;
147175

148-
phy_write(phydev, 0x11, reg);
149-
/* restore to default page 0 */
150-
phy_write(phydev, RTL821x_PAGE_SELECT, 0x0);
176+
ret = rtl8211x_page_write(phydev, 0xd08, 0x11, val);
177+
if (ret)
178+
return ret;
151179

152180
return 0;
153181
}

0 commit comments

Comments
 (0)