2
0

741-net-phy-realtek-support-interrupt-of-RTL8221B.patch 1.5 KB

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