kernel: bump 6.1 to 6.1.80
[openwrt/staging/stintel.git] / target / linux / generic / pending-6.1 / 741-net-phy-realtek-support-interrupt-of-RTL8221B.patch
1 --- a/drivers/net/phy/realtek.c
2 +++ b/drivers/net/phy/realtek.c
3 @@ -981,6 +981,51 @@ static int rtl8221b_config_init(struct p
4 return 0;
5 }
6
7 +static int rtl8221b_ack_interrupt(struct phy_device *phydev)
8 +{
9 + int err;
10 +
11 + err = phy_read_mmd(phydev, RTL8221B_MMD_PHY_CTRL, 0xa4d4);
12 +
13 + return (err < 0) ? err : 0;
14 +}
15 +
16 +static int rtl8221b_config_intr(struct phy_device *phydev)
17 +{
18 + int err;
19 +
20 + if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
21 + err = rtl8221b_ack_interrupt(phydev);
22 + if (err)
23 + return err;
24 +
25 + err = phy_write_mmd(phydev, RTL8221B_MMD_PHY_CTRL, 0xa4d2, 0x7ff);
26 + } else {
27 + err = phy_write_mmd(phydev, RTL8221B_MMD_PHY_CTRL, 0xa4d2, 0x0);
28 + if (err)
29 + return err;
30 +
31 + err = rtl8221b_ack_interrupt(phydev);
32 + }
33 +
34 + return err;
35 +}
36 +
37 +static irqreturn_t rtl8221b_handle_interrupt(struct phy_device *phydev)
38 +{
39 + int err;
40 +
41 + err = rtl8221b_ack_interrupt(phydev);
42 + if (err) {
43 + phy_error(phydev);
44 + return IRQ_NONE;
45 + }
46 +
47 + phy_trigger_machine(phydev);
48 +
49 + return IRQ_HANDLED;
50 +}
51 +
52 static struct phy_driver realtek_drvs[] = {
53 {
54 PHY_ID_MATCH_EXACT(0x00008201),
55 @@ -1141,6 +1186,8 @@ static struct phy_driver realtek_drvs[]
56 .get_features = rtl822x_get_features,
57 .config_init = rtl8221b_config_init,
58 .config_aneg = rtl822x_config_aneg,
59 + .config_intr = rtl8221b_config_intr,
60 + .handle_interrupt = rtl8221b_handle_interrupt,
61 .probe = rtl822x_probe,
62 .read_status = rtl822x_read_status,
63 .suspend = genphy_suspend,