Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- realtek.c.origin 2014-05-10 12:56:19.692367478 +0800
- +++ realtek.c 2014-05-10 12:53:16.156363116 +0800
- @@ -14,6 +14,12 @@
- *
- */
- #include <linux/phy.h>
- +#include <linux/module.h>
- +
- +#define RTL8201F_INSR 0x1e
- +#define RTL8201F_PGSR 0x1f
- +#define RTL8201F_INER 0x13
- +#define RTL8201F_INER_MASK 0x3800
- #define RTL821x_PHYSR 0x11
- #define RTL821x_PHYSR_DUPLEX 0x2000
- @@ -26,6 +32,15 @@
- MODULE_AUTHOR("Johnson Leung");
- MODULE_LICENSE("GPL");
- +static int rtl8201f_ack_interrupt(struct phy_device *phydev)
- +{
- + int err;
- +
- + err = phy_read(phydev, RTL8201F_INSR);
- +
- + return (err < 0) ? err : 0;
- +}
- +
- static int rtl821x_ack_interrupt(struct phy_device *phydev)
- {
- int err;
- @@ -35,6 +50,29 @@
- return (err < 0) ? err : 0;
- }
- +static void rtl8201f_select_page(struct phy_device *phydev, int page)
- +{
- + phy_write(phydev, RTL8201F_PGSR, page);
- +}
- +
- +static int rtl8201f_config_intr(struct phy_device *phydev)
- +{
- + int err;
- +
- + rtl8201f_select_page(phydev, 7);
- +
- + if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
- + err = phy_write(phydev, RTL8201F_INER, RTL8201F_INER_MASK |
- + phy_read(phydev, RTL8201F_INER));
- + else
- + err = phy_write(phydev, RTL8201F_INER, ~RTL8201F_INER_MASK &
- + phy_read(phydev, RTL8201F_INER));
- +
- + rtl8201f_select_page(phydev, 0);
- +
- + return err;
- +}
- +
- static int rtl821x_config_intr(struct phy_device *phydev)
- {
- int err;
- @@ -48,6 +86,23 @@
- return err;
- }
- +/* RTL8201F */
- +static struct phy_driver rtl8201f_driver = {
- + .phy_id = 0x001cc816,
- + .name = "RTL8201F 10/100Mbps Ethernet",
- + .phy_id_mask = 0x001fffff,
- + .features = PHY_BASIC_FEATURES,
- + .flags = PHY_HAS_INTERRUPT,
- + .config_aneg = &genphy_config_aneg,
- + .read_status = &genphy_read_status,
- + .ack_interrupt = &rtl8201f_ack_interrupt,
- + .config_intr = &rtl8201f_config_intr,
- + .suspend = genphy_suspend,
- + .resume = genphy_resume,
- + .driver = { .owner = THIS_MODULE,},
- +};
- +
- +
- /* RTL8211B */
- static struct phy_driver rtl821x_driver = {
- .phy_id = 0x001cc912,
- @@ -65,7 +120,9 @@
- static int __init realtek_init(void)
- {
- int ret;
- -
- + ret = phy_driver_register(&rtl8201f_driver);
- + if (ret < 0)
- + return -ENODEV;
- ret = phy_driver_register(&rtl821x_driver);
- return ret;
- @@ -73,6 +130,7 @@
- static void __exit realtek_exit(void)
- {
- + phy_driver_unregister(&rtl8201f_driver);
- phy_driver_unregister(&rtl821x_driver);
- }
- @@ -80,6 +138,7 @@
- module_exit(realtek_exit);
- static struct mdio_device_id __maybe_unused realtek_tbl[] = {
- + { 0x001cc816, 0x001fffff },
- { 0x001cc912, 0x001fffff },
- { }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement