731-net-phy-realtek-support-interrupt-of-RTL8221B.patch 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. From d7943c31d57c11e1a517aa3ce2006fca44866870 Mon Sep 17 00:00:00 2001
  2. From: Jianhui Zhao <[email protected]>
  3. Date: Sun, 24 Sep 2023 22:15:00 +0800
  4. Subject: [PATCH] net: phy: realtek: add interrupt support for RTL8221B
  5. This commit introduces interrupt support for RTL8221B.
  6. Signed-off-by: Jianhui Zhao <[email protected]>
  7. ---
  8. drivers/net/phy/realtek.c | 47 +++++++++++++++++++++++++++++++++++++++
  9. 1 file changed, 47 insertions(+)
  10. --- a/drivers/net/phy/realtek.c
  11. +++ b/drivers/net/phy/realtek.c
  12. @@ -971,6 +971,51 @@ static int rtl8221b_config_init(struct p
  13. return 0;
  14. }
  15. +static int rtl8221b_ack_interrupt(struct phy_device *phydev)
  16. +{
  17. + int err;
  18. +
  19. + err = phy_read_mmd(phydev, RTL8221B_MMD_PHY_CTRL, 0xa4d4);
  20. +
  21. + return (err < 0) ? err : 0;
  22. +}
  23. +
  24. +static int rtl8221b_config_intr(struct phy_device *phydev)
  25. +{
  26. + int err;
  27. +
  28. + if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
  29. + err = rtl8221b_ack_interrupt(phydev);
  30. + if (err)
  31. + return err;
  32. +
  33. + err = phy_write_mmd(phydev, RTL8221B_MMD_PHY_CTRL, 0xa4d2, 0x7ff);
  34. + } else {
  35. + err = phy_write_mmd(phydev, RTL8221B_MMD_PHY_CTRL, 0xa4d2, 0x0);
  36. + if (err)
  37. + return err;
  38. +
  39. + err = rtl8221b_ack_interrupt(phydev);
  40. + }
  41. +
  42. + return err;
  43. +}
  44. +
  45. +static irqreturn_t rtl8221b_handle_interrupt(struct phy_device *phydev)
  46. +{
  47. + int err;
  48. +
  49. + err = rtl8221b_ack_interrupt(phydev);
  50. + if (err) {
  51. + phy_error(phydev);
  52. + return IRQ_NONE;
  53. + }
  54. +
  55. + phy_trigger_machine(phydev);
  56. +
  57. + return IRQ_HANDLED;
  58. +}
  59. +
  60. static struct phy_driver realtek_drvs[] = {
  61. {
  62. PHY_ID_MATCH_EXACT(0x00008201),
  63. @@ -1119,6 +1164,8 @@ static struct phy_driver realtek_drvs[]
  64. .get_features = rtl822x_get_features,
  65. .config_init = rtl8221b_config_init,
  66. .config_aneg = rtl822x_config_aneg,
  67. + .config_intr = rtl8221b_config_intr,
  68. + .handle_interrupt = rtl8221b_handle_interrupt,
  69. .probe = rtl822x_probe,
  70. .read_status = rtl822x_read_status,
  71. .suspend = genphy_suspend,