root/drivers/net/phy/realtek.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. rtl821x_read_page
  2. rtl821x_write_page
  3. rtl8201_ack_interrupt
  4. rtl821x_ack_interrupt
  5. rtl8211f_ack_interrupt
  6. rtl8201_config_intr
  7. rtl8211b_config_intr
  8. rtl8211e_config_intr
  9. rtl8211f_config_intr
  10. rtl8211_config_aneg
  11. rtl8211c_config_init
  12. rtl8211f_config_init
  13. rtl8211e_config_init
  14. rtl8211b_suspend
  15. rtl8211b_resume
  16. rtl8366rb_config_init
  17. rtlgen_read_mmd
  18. rtlgen_write_mmd
  19. rtl8125_read_mmd
  20. rtl8125_write_mmd
  21. rtl8125_get_features
  22. rtl8125_config_aneg
  23. rtl8125_read_status
  24. rtlgen_supports_2_5gbps
  25. rtlgen_match_phy_device
  26. rtl8125_match_phy_device

   1 // SPDX-License-Identifier: GPL-2.0+
   2 /*
   3  * drivers/net/phy/realtek.c
   4  *
   5  * Driver for Realtek PHYs
   6  *
   7  * Author: Johnson Leung <r58129@freescale.com>
   8  *
   9  * Copyright (c) 2004 Freescale Semiconductor, Inc.
  10  */
  11 #include <linux/bitops.h>
  12 #include <linux/phy.h>
  13 #include <linux/module.h>
  14 
  15 #define RTL821x_PHYSR                           0x11
  16 #define RTL821x_PHYSR_DUPLEX                    BIT(13)
  17 #define RTL821x_PHYSR_SPEED                     GENMASK(15, 14)
  18 
  19 #define RTL821x_INER                            0x12
  20 #define RTL8211B_INER_INIT                      0x6400
  21 #define RTL8211E_INER_LINK_STATUS               BIT(10)
  22 #define RTL8211F_INER_LINK_STATUS               BIT(4)
  23 
  24 #define RTL821x_INSR                            0x13
  25 
  26 #define RTL821x_EXT_PAGE_SELECT                 0x1e
  27 #define RTL821x_PAGE_SELECT                     0x1f
  28 
  29 #define RTL8211F_INSR                           0x1d
  30 
  31 #define RTL8211F_TX_DELAY                       BIT(8)
  32 #define RTL8211E_TX_DELAY                       BIT(1)
  33 #define RTL8211E_RX_DELAY                       BIT(2)
  34 #define RTL8211E_MODE_MII_GMII                  BIT(3)
  35 
  36 #define RTL8201F_ISR                            0x1e
  37 #define RTL8201F_IER                            0x13
  38 
  39 #define RTL8366RB_POWER_SAVE                    0x15
  40 #define RTL8366RB_POWER_SAVE_ON                 BIT(12)
  41 
  42 #define RTL_SUPPORTS_5000FULL                   BIT(14)
  43 #define RTL_SUPPORTS_2500FULL                   BIT(13)
  44 #define RTL_SUPPORTS_10000FULL                  BIT(0)
  45 #define RTL_ADV_2500FULL                        BIT(7)
  46 #define RTL_LPADV_10000FULL                     BIT(11)
  47 #define RTL_LPADV_5000FULL                      BIT(6)
  48 #define RTL_LPADV_2500FULL                      BIT(5)
  49 
  50 #define RTL_GENERIC_PHYID                       0x001cc800
  51 
  52 MODULE_DESCRIPTION("Realtek PHY driver");
  53 MODULE_AUTHOR("Johnson Leung");
  54 MODULE_LICENSE("GPL");
  55 
  56 static int rtl821x_read_page(struct phy_device *phydev)
  57 {
  58         return __phy_read(phydev, RTL821x_PAGE_SELECT);
  59 }
  60 
  61 static int rtl821x_write_page(struct phy_device *phydev, int page)
  62 {
  63         return __phy_write(phydev, RTL821x_PAGE_SELECT, page);
  64 }
  65 
  66 static int rtl8201_ack_interrupt(struct phy_device *phydev)
  67 {
  68         int err;
  69 
  70         err = phy_read(phydev, RTL8201F_ISR);
  71 
  72         return (err < 0) ? err : 0;
  73 }
  74 
  75 static int rtl821x_ack_interrupt(struct phy_device *phydev)
  76 {
  77         int err;
  78 
  79         err = phy_read(phydev, RTL821x_INSR);
  80 
  81         return (err < 0) ? err : 0;
  82 }
  83 
  84 static int rtl8211f_ack_interrupt(struct phy_device *phydev)
  85 {
  86         int err;
  87 
  88         err = phy_read_paged(phydev, 0xa43, RTL8211F_INSR);
  89 
  90         return (err < 0) ? err : 0;
  91 }
  92 
  93 static int rtl8201_config_intr(struct phy_device *phydev)
  94 {
  95         u16 val;
  96 
  97         if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
  98                 val = BIT(13) | BIT(12) | BIT(11);
  99         else
 100                 val = 0;
 101 
 102         return phy_write_paged(phydev, 0x7, RTL8201F_IER, val);
 103 }
 104 
 105 static int rtl8211b_config_intr(struct phy_device *phydev)
 106 {
 107         int err;
 108 
 109         if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
 110                 err = phy_write(phydev, RTL821x_INER,
 111                                 RTL8211B_INER_INIT);
 112         else
 113                 err = phy_write(phydev, RTL821x_INER, 0);
 114 
 115         return err;
 116 }
 117 
 118 static int rtl8211e_config_intr(struct phy_device *phydev)
 119 {
 120         int err;
 121 
 122         if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
 123                 err = phy_write(phydev, RTL821x_INER,
 124                                 RTL8211E_INER_LINK_STATUS);
 125         else
 126                 err = phy_write(phydev, RTL821x_INER, 0);
 127 
 128         return err;
 129 }
 130 
 131 static int rtl8211f_config_intr(struct phy_device *phydev)
 132 {
 133         u16 val;
 134 
 135         if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
 136                 val = RTL8211F_INER_LINK_STATUS;
 137         else
 138                 val = 0;
 139 
 140         return phy_write_paged(phydev, 0xa42, RTL821x_INER, val);
 141 }
 142 
 143 static int rtl8211_config_aneg(struct phy_device *phydev)
 144 {
 145         int ret;
 146 
 147         ret = genphy_config_aneg(phydev);
 148         if (ret < 0)
 149                 return ret;
 150 
 151         /* Quirk was copied from vendor driver. Unfortunately it includes no
 152          * description of the magic numbers.
 153          */
 154         if (phydev->speed == SPEED_100 && phydev->autoneg == AUTONEG_DISABLE) {
 155                 phy_write(phydev, 0x17, 0x2138);
 156                 phy_write(phydev, 0x0e, 0x0260);
 157         } else {
 158                 phy_write(phydev, 0x17, 0x2108);
 159                 phy_write(phydev, 0x0e, 0x0000);
 160         }
 161 
 162         return 0;
 163 }
 164 
 165 static int rtl8211c_config_init(struct phy_device *phydev)
 166 {
 167         /* RTL8211C has an issue when operating in Gigabit slave mode */
 168         return phy_set_bits(phydev, MII_CTRL1000,
 169                             CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER);
 170 }
 171 
 172 static int rtl8211f_config_init(struct phy_device *phydev)
 173 {
 174         struct device *dev = &phydev->mdio.dev;
 175         u16 val;
 176         int ret;
 177 
 178         /* enable TX-delay for rgmii-{id,txid}, and disable it for rgmii and
 179          * rgmii-rxid. The RX-delay can be enabled by the external RXDLY pin.
 180          */
 181         switch (phydev->interface) {
 182         case PHY_INTERFACE_MODE_RGMII:
 183         case PHY_INTERFACE_MODE_RGMII_RXID:
 184                 val = 0;
 185                 break;
 186         case PHY_INTERFACE_MODE_RGMII_ID:
 187         case PHY_INTERFACE_MODE_RGMII_TXID:
 188                 val = RTL8211F_TX_DELAY;
 189                 break;
 190         default: /* the rest of the modes imply leaving delay as is. */
 191                 return 0;
 192         }
 193 
 194         ret = phy_modify_paged_changed(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY,
 195                                        val);
 196         if (ret < 0) {
 197                 dev_err(dev, "Failed to update the TX delay register\n");
 198                 return ret;
 199         } else if (ret) {
 200                 dev_dbg(dev,
 201                         "%s 2ns TX delay (and changing the value from pin-strapping RXD1 or the bootloader)\n",
 202                         val ? "Enabling" : "Disabling");
 203         } else {
 204                 dev_dbg(dev,
 205                         "2ns TX delay was already %s (by pin-strapping RXD1 or bootloader configuration)\n",
 206                         val ? "enabled" : "disabled");
 207         }
 208 
 209         return 0;
 210 }
 211 
 212 static int rtl8211e_config_init(struct phy_device *phydev)
 213 {
 214         int ret = 0, oldpage;
 215         u16 val;
 216 
 217         /* enable TX/RX delay for rgmii-* modes, and disable them for rgmii. */
 218         switch (phydev->interface) {
 219         case PHY_INTERFACE_MODE_RGMII:
 220                 val = 0;
 221                 break;
 222         case PHY_INTERFACE_MODE_RGMII_ID:
 223                 val = RTL8211E_TX_DELAY | RTL8211E_RX_DELAY;
 224                 break;
 225         case PHY_INTERFACE_MODE_RGMII_RXID:
 226                 val = RTL8211E_RX_DELAY;
 227                 break;
 228         case PHY_INTERFACE_MODE_RGMII_TXID:
 229                 val = RTL8211E_TX_DELAY;
 230                 break;
 231         default: /* the rest of the modes imply leaving delays as is. */
 232                 return 0;
 233         }
 234 
 235         /* According to a sample driver there is a 0x1c config register on the
 236          * 0xa4 extension page (0x7) layout. It can be used to disable/enable
 237          * the RX/TX delays otherwise controlled by RXDLY/TXDLY pins. It can
 238          * also be used to customize the whole configuration register:
 239          * 8:6 = PHY Address, 5:4 = Auto-Negotiation, 3 = Interface Mode Select,
 240          * 2 = RX Delay, 1 = TX Delay, 0 = SELRGV (see original PHY datasheet
 241          * for details).
 242          */
 243         oldpage = phy_select_page(phydev, 0x7);
 244         if (oldpage < 0)
 245                 goto err_restore_page;
 246 
 247         ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4);
 248         if (ret)
 249                 goto err_restore_page;
 250 
 251         ret = __phy_modify(phydev, 0x1c, RTL8211E_TX_DELAY | RTL8211E_RX_DELAY,
 252                            val);
 253 
 254 err_restore_page:
 255         return phy_restore_page(phydev, oldpage, ret);
 256 }
 257 
 258 static int rtl8211b_suspend(struct phy_device *phydev)
 259 {
 260         phy_write(phydev, MII_MMD_DATA, BIT(9));
 261 
 262         return genphy_suspend(phydev);
 263 }
 264 
 265 static int rtl8211b_resume(struct phy_device *phydev)
 266 {
 267         phy_write(phydev, MII_MMD_DATA, 0);
 268 
 269         return genphy_resume(phydev);
 270 }
 271 
 272 static int rtl8366rb_config_init(struct phy_device *phydev)
 273 {
 274         int ret;
 275 
 276         ret = phy_set_bits(phydev, RTL8366RB_POWER_SAVE,
 277                            RTL8366RB_POWER_SAVE_ON);
 278         if (ret) {
 279                 dev_err(&phydev->mdio.dev,
 280                         "error enabling power management\n");
 281         }
 282 
 283         return ret;
 284 }
 285 
 286 static int rtlgen_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
 287 {
 288         int ret;
 289 
 290         if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE) {
 291                 rtl821x_write_page(phydev, 0xa5c);
 292                 ret = __phy_read(phydev, 0x12);
 293                 rtl821x_write_page(phydev, 0);
 294         } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
 295                 rtl821x_write_page(phydev, 0xa5d);
 296                 ret = __phy_read(phydev, 0x10);
 297                 rtl821x_write_page(phydev, 0);
 298         } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE) {
 299                 rtl821x_write_page(phydev, 0xa5d);
 300                 ret = __phy_read(phydev, 0x11);
 301                 rtl821x_write_page(phydev, 0);
 302         } else {
 303                 ret = -EOPNOTSUPP;
 304         }
 305 
 306         return ret;
 307 }
 308 
 309 static int rtlgen_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
 310                             u16 val)
 311 {
 312         int ret;
 313 
 314         if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV) {
 315                 rtl821x_write_page(phydev, 0xa5d);
 316                 ret = __phy_write(phydev, 0x10, val);
 317                 rtl821x_write_page(phydev, 0);
 318         } else {
 319                 ret = -EOPNOTSUPP;
 320         }
 321 
 322         return ret;
 323 }
 324 
 325 static int rtl8125_read_mmd(struct phy_device *phydev, int devnum, u16 regnum)
 326 {
 327         int ret = rtlgen_read_mmd(phydev, devnum, regnum);
 328 
 329         if (ret != -EOPNOTSUPP)
 330                 return ret;
 331 
 332         if (devnum == MDIO_MMD_PCS && regnum == MDIO_PCS_EEE_ABLE2) {
 333                 rtl821x_write_page(phydev, 0xa6e);
 334                 ret = __phy_read(phydev, 0x16);
 335                 rtl821x_write_page(phydev, 0);
 336         } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
 337                 rtl821x_write_page(phydev, 0xa6d);
 338                 ret = __phy_read(phydev, 0x12);
 339                 rtl821x_write_page(phydev, 0);
 340         } else if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_LPABLE2) {
 341                 rtl821x_write_page(phydev, 0xa6d);
 342                 ret = __phy_read(phydev, 0x10);
 343                 rtl821x_write_page(phydev, 0);
 344         }
 345 
 346         return ret;
 347 }
 348 
 349 static int rtl8125_write_mmd(struct phy_device *phydev, int devnum, u16 regnum,
 350                              u16 val)
 351 {
 352         int ret = rtlgen_write_mmd(phydev, devnum, regnum, val);
 353 
 354         if (ret != -EOPNOTSUPP)
 355                 return ret;
 356 
 357         if (devnum == MDIO_MMD_AN && regnum == MDIO_AN_EEE_ADV2) {
 358                 rtl821x_write_page(phydev, 0xa6d);
 359                 ret = __phy_write(phydev, 0x12, val);
 360                 rtl821x_write_page(phydev, 0);
 361         }
 362 
 363         return ret;
 364 }
 365 
 366 static int rtl8125_get_features(struct phy_device *phydev)
 367 {
 368         int val;
 369 
 370         val = phy_read_paged(phydev, 0xa61, 0x13);
 371         if (val < 0)
 372                 return val;
 373 
 374         linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
 375                          phydev->supported, val & RTL_SUPPORTS_2500FULL);
 376         linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
 377                          phydev->supported, val & RTL_SUPPORTS_5000FULL);
 378         linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
 379                          phydev->supported, val & RTL_SUPPORTS_10000FULL);
 380 
 381         return genphy_read_abilities(phydev);
 382 }
 383 
 384 static int rtl8125_config_aneg(struct phy_device *phydev)
 385 {
 386         int ret = 0;
 387 
 388         if (phydev->autoneg == AUTONEG_ENABLE) {
 389                 u16 adv2500 = 0;
 390 
 391                 if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
 392                                       phydev->advertising))
 393                         adv2500 = RTL_ADV_2500FULL;
 394 
 395                 ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12,
 396                                                RTL_ADV_2500FULL, adv2500);
 397                 if (ret < 0)
 398                         return ret;
 399         }
 400 
 401         return __genphy_config_aneg(phydev, ret);
 402 }
 403 
 404 static int rtl8125_read_status(struct phy_device *phydev)
 405 {
 406         if (phydev->autoneg == AUTONEG_ENABLE) {
 407                 int lpadv = phy_read_paged(phydev, 0xa5d, 0x13);
 408 
 409                 if (lpadv < 0)
 410                         return lpadv;
 411 
 412                 linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
 413                         phydev->lp_advertising, lpadv & RTL_LPADV_10000FULL);
 414                 linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
 415                         phydev->lp_advertising, lpadv & RTL_LPADV_5000FULL);
 416                 linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
 417                         phydev->lp_advertising, lpadv & RTL_LPADV_2500FULL);
 418         }
 419 
 420         return genphy_read_status(phydev);
 421 }
 422 
 423 static bool rtlgen_supports_2_5gbps(struct phy_device *phydev)
 424 {
 425         int val;
 426 
 427         phy_write(phydev, RTL821x_PAGE_SELECT, 0xa61);
 428         val = phy_read(phydev, 0x13);
 429         phy_write(phydev, RTL821x_PAGE_SELECT, 0);
 430 
 431         return val >= 0 && val & RTL_SUPPORTS_2500FULL;
 432 }
 433 
 434 static int rtlgen_match_phy_device(struct phy_device *phydev)
 435 {
 436         return phydev->phy_id == RTL_GENERIC_PHYID &&
 437                !rtlgen_supports_2_5gbps(phydev);
 438 }
 439 
 440 static int rtl8125_match_phy_device(struct phy_device *phydev)
 441 {
 442         return phydev->phy_id == RTL_GENERIC_PHYID &&
 443                rtlgen_supports_2_5gbps(phydev);
 444 }
 445 
 446 static struct phy_driver realtek_drvs[] = {
 447         {
 448                 PHY_ID_MATCH_EXACT(0x00008201),
 449                 .name           = "RTL8201CP Ethernet",
 450         }, {
 451                 PHY_ID_MATCH_EXACT(0x001cc816),
 452                 .name           = "RTL8201F Fast Ethernet",
 453                 .ack_interrupt  = &rtl8201_ack_interrupt,
 454                 .config_intr    = &rtl8201_config_intr,
 455                 .suspend        = genphy_suspend,
 456                 .resume         = genphy_resume,
 457                 .read_page      = rtl821x_read_page,
 458                 .write_page     = rtl821x_write_page,
 459         }, {
 460                 PHY_ID_MATCH_MODEL(0x001cc880),
 461                 .name           = "RTL8208 Fast Ethernet",
 462                 .read_mmd       = genphy_read_mmd_unsupported,
 463                 .write_mmd      = genphy_write_mmd_unsupported,
 464                 .suspend        = genphy_suspend,
 465                 .resume         = genphy_resume,
 466                 .read_page      = rtl821x_read_page,
 467                 .write_page     = rtl821x_write_page,
 468         }, {
 469                 PHY_ID_MATCH_EXACT(0x001cc910),
 470                 .name           = "RTL8211 Gigabit Ethernet",
 471                 .config_aneg    = rtl8211_config_aneg,
 472                 .read_mmd       = &genphy_read_mmd_unsupported,
 473                 .write_mmd      = &genphy_write_mmd_unsupported,
 474                 .read_page      = rtl821x_read_page,
 475                 .write_page     = rtl821x_write_page,
 476         }, {
 477                 PHY_ID_MATCH_EXACT(0x001cc912),
 478                 .name           = "RTL8211B Gigabit Ethernet",
 479                 .ack_interrupt  = &rtl821x_ack_interrupt,
 480                 .config_intr    = &rtl8211b_config_intr,
 481                 .read_mmd       = &genphy_read_mmd_unsupported,
 482                 .write_mmd      = &genphy_write_mmd_unsupported,
 483                 .suspend        = rtl8211b_suspend,
 484                 .resume         = rtl8211b_resume,
 485                 .read_page      = rtl821x_read_page,
 486                 .write_page     = rtl821x_write_page,
 487         }, {
 488                 PHY_ID_MATCH_EXACT(0x001cc913),
 489                 .name           = "RTL8211C Gigabit Ethernet",
 490                 .config_init    = rtl8211c_config_init,
 491                 .read_mmd       = &genphy_read_mmd_unsupported,
 492                 .write_mmd      = &genphy_write_mmd_unsupported,
 493                 .read_page      = rtl821x_read_page,
 494                 .write_page     = rtl821x_write_page,
 495         }, {
 496                 PHY_ID_MATCH_EXACT(0x001cc914),
 497                 .name           = "RTL8211DN Gigabit Ethernet",
 498                 .ack_interrupt  = rtl821x_ack_interrupt,
 499                 .config_intr    = rtl8211e_config_intr,
 500                 .suspend        = genphy_suspend,
 501                 .resume         = genphy_resume,
 502                 .read_page      = rtl821x_read_page,
 503                 .write_page     = rtl821x_write_page,
 504         }, {
 505                 PHY_ID_MATCH_EXACT(0x001cc915),
 506                 .name           = "RTL8211E Gigabit Ethernet",
 507                 .config_init    = &rtl8211e_config_init,
 508                 .ack_interrupt  = &rtl821x_ack_interrupt,
 509                 .config_intr    = &rtl8211e_config_intr,
 510                 .suspend        = genphy_suspend,
 511                 .resume         = genphy_resume,
 512                 .read_page      = rtl821x_read_page,
 513                 .write_page     = rtl821x_write_page,
 514         }, {
 515                 PHY_ID_MATCH_EXACT(0x001cc916),
 516                 .name           = "RTL8211F Gigabit Ethernet",
 517                 .config_init    = &rtl8211f_config_init,
 518                 .ack_interrupt  = &rtl8211f_ack_interrupt,
 519                 .config_intr    = &rtl8211f_config_intr,
 520                 .suspend        = genphy_suspend,
 521                 .resume         = genphy_resume,
 522                 .read_page      = rtl821x_read_page,
 523                 .write_page     = rtl821x_write_page,
 524         }, {
 525                 .name           = "Generic FE-GE Realtek PHY",
 526                 .match_phy_device = rtlgen_match_phy_device,
 527                 .suspend        = genphy_suspend,
 528                 .resume         = genphy_resume,
 529                 .read_page      = rtl821x_read_page,
 530                 .write_page     = rtl821x_write_page,
 531                 .read_mmd       = rtlgen_read_mmd,
 532                 .write_mmd      = rtlgen_write_mmd,
 533         }, {
 534                 .name           = "RTL8125 2.5Gbps internal",
 535                 .match_phy_device = rtl8125_match_phy_device,
 536                 .get_features   = rtl8125_get_features,
 537                 .config_aneg    = rtl8125_config_aneg,
 538                 .read_status    = rtl8125_read_status,
 539                 .suspend        = genphy_suspend,
 540                 .resume         = genphy_resume,
 541                 .read_page      = rtl821x_read_page,
 542                 .write_page     = rtl821x_write_page,
 543                 .read_mmd       = rtl8125_read_mmd,
 544                 .write_mmd      = rtl8125_write_mmd,
 545         }, {
 546                 PHY_ID_MATCH_EXACT(0x001cc961),
 547                 .name           = "RTL8366RB Gigabit Ethernet",
 548                 .config_init    = &rtl8366rb_config_init,
 549                 /* These interrupts are handled by the irq controller
 550                  * embedded inside the RTL8366RB, they get unmasked when the
 551                  * irq is requested and ACKed by reading the status register,
 552                  * which is done by the irqchip code.
 553                  */
 554                 .ack_interrupt  = genphy_no_ack_interrupt,
 555                 .config_intr    = genphy_no_config_intr,
 556                 .suspend        = genphy_suspend,
 557                 .resume         = genphy_resume,
 558         },
 559 };
 560 
 561 module_phy_driver(realtek_drvs);
 562 
 563 static const struct mdio_device_id __maybe_unused realtek_tbl[] = {
 564         { PHY_ID_MATCH_VENDOR(0x001cc800) },
 565         { }
 566 };
 567 
 568 MODULE_DEVICE_TABLE(mdio, realtek_tbl);

/* [<][>][^][v][top][bottom][index][help] */