Advertisement
Guest User

rtl8201f-3.0.patch

a guest
May 10th, 2014
609
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1. --- realtek.c.origin 2014-05-10 12:56:19.692367478 +0800
  2. +++ realtek.c 2014-05-10 12:53:16.156363116 +0800
  3. @@ -14,6 +14,12 @@
  4. *
  5. */
  6. #include <linux/phy.h>
  7. +#include <linux/module.h>
  8. +
  9. +#define RTL8201F_INSR 0x1e
  10. +#define RTL8201F_PGSR 0x1f
  11. +#define RTL8201F_INER 0x13
  12. +#define RTL8201F_INER_MASK 0x3800
  13.  
  14. #define RTL821x_PHYSR 0x11
  15. #define RTL821x_PHYSR_DUPLEX 0x2000
  16. @@ -26,6 +32,15 @@
  17. MODULE_AUTHOR("Johnson Leung");
  18. MODULE_LICENSE("GPL");
  19.  
  20. +static int rtl8201f_ack_interrupt(struct phy_device *phydev)
  21. +{
  22. + int err;
  23. +
  24. + err = phy_read(phydev, RTL8201F_INSR);
  25. +
  26. + return (err < 0) ? err : 0;
  27. +}
  28. +
  29. static int rtl821x_ack_interrupt(struct phy_device *phydev)
  30. {
  31. int err;
  32. @@ -35,6 +50,29 @@
  33. return (err < 0) ? err : 0;
  34. }
  35.  
  36. +static void rtl8201f_select_page(struct phy_device *phydev, int page)
  37. +{
  38. + phy_write(phydev, RTL8201F_PGSR, page);
  39. +}
  40. +
  41. +static int rtl8201f_config_intr(struct phy_device *phydev)
  42. +{
  43. + int err;
  44. +
  45. + rtl8201f_select_page(phydev, 7);
  46. +
  47. + if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
  48. + err = phy_write(phydev, RTL8201F_INER, RTL8201F_INER_MASK |
  49. + phy_read(phydev, RTL8201F_INER));
  50. + else
  51. + err = phy_write(phydev, RTL8201F_INER, ~RTL8201F_INER_MASK &
  52. + phy_read(phydev, RTL8201F_INER));
  53. +
  54. + rtl8201f_select_page(phydev, 0);
  55. +
  56. + return err;
  57. +}
  58. +
  59. static int rtl821x_config_intr(struct phy_device *phydev)
  60. {
  61. int err;
  62. @@ -48,6 +86,23 @@
  63. return err;
  64. }
  65.  
  66. +/* RTL8201F */
  67. +static struct phy_driver rtl8201f_driver = {
  68. + .phy_id = 0x001cc816,
  69. + .name = "RTL8201F 10/100Mbps Ethernet",
  70. + .phy_id_mask = 0x001fffff,
  71. + .features = PHY_BASIC_FEATURES,
  72. + .flags = PHY_HAS_INTERRUPT,
  73. + .config_aneg = &genphy_config_aneg,
  74. + .read_status = &genphy_read_status,
  75. + .ack_interrupt = &rtl8201f_ack_interrupt,
  76. + .config_intr = &rtl8201f_config_intr,
  77. + .suspend = genphy_suspend,
  78. + .resume = genphy_resume,
  79. + .driver = { .owner = THIS_MODULE,},
  80. +};
  81. +
  82. +
  83. /* RTL8211B */
  84. static struct phy_driver rtl821x_driver = {
  85. .phy_id = 0x001cc912,
  86. @@ -65,7 +120,9 @@
  87. static int __init realtek_init(void)
  88. {
  89. int ret;
  90. -
  91. + ret = phy_driver_register(&rtl8201f_driver);
  92. + if (ret < 0)
  93. + return -ENODEV;
  94. ret = phy_driver_register(&rtl821x_driver);
  95.  
  96. return ret;
  97. @@ -73,6 +130,7 @@
  98.  
  99. static void __exit realtek_exit(void)
  100. {
  101. + phy_driver_unregister(&rtl8201f_driver);
  102. phy_driver_unregister(&rtl821x_driver);
  103. }
  104.  
  105. @@ -80,6 +138,7 @@
  106. module_exit(realtek_exit);
  107.  
  108. static struct mdio_device_id __maybe_unused realtek_tbl[] = {
  109. + { 0x001cc816, 0x001fffff },
  110. { 0x001cc912, 0x001fffff },
  111. { }
  112. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement