chry_phy_lan8742.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * Copyright (c) 2024, sakumisu
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "chry_phy.h"
  7. /* LAN8742A PHY Special Control/Status Register (Register 0x1F / 31)
  8. * Reference: STM32 LAN8742 BSP driver */
  9. #define LAN8742_PHYSCSR 31 /* PHY Special Control/Status Register */
  10. /* PHYSCSR Register bit definitions */
  11. #define LAN8742_PHYSCSR_AUTONEGO_DONE (0x1000U) /* Auto-negotiation complete */
  12. #define LAN8742_PHYSCSR_HCDSPEEDMASK (0x001CU) /* Speed/Duplex mask (bits [4:2]) */
  13. /* Speed and Duplex status values (read from PHYSCSR & HCDSPEEDMASK) */
  14. #define LAN8742_PHYSCSR_10BT_HD (0x0004U) /* 10Base-T Half Duplex */
  15. #define LAN8742_PHYSCSR_10BT_FD (0x0014U) /* 10Base-T Full Duplex */
  16. #define LAN8742_PHYSCSR_100BTX_HD (0x0008U) /* 100Base-TX Half Duplex */
  17. #define LAN8742_PHYSCSR_100BTX_FD (0x0018U) /* 100Base-TX Full Duplex */
  18. void lan8742_phy_init(struct chry_phy_device *phydev, struct chry_phy_config *config)
  19. {
  20. /* LAN8742A does not require special initialization beyond standard PHY reset and config
  21. * which is handled by chry_phy_init in ec_netdev.c */
  22. }
  23. void lan8742_phy_get_status(struct chry_phy_device *phydev, struct chry_phy_status *status)
  24. {
  25. uint16_t regval;
  26. /* Read Basic Status Register to check link status */
  27. regval = phydev->mdio_read(phydev, phydev->phy_addr, MII_BMSR);
  28. status->link = (regval & BMSR_LINKSTATUS) ? true : false;
  29. if (status->link) {
  30. /* Read PHY Special Control/Status Register for speed and duplex info */
  31. regval = phydev->mdio_read(phydev, phydev->phy_addr, LAN8742_PHYSCSR);
  32. /* Extract speed and duplex bits [4:2] */
  33. uint16_t speed_duplex = regval & LAN8742_PHYSCSR_HCDSPEEDMASK;
  34. switch (speed_duplex) {
  35. case LAN8742_PHYSCSR_10BT_HD:
  36. status->speed = 10;
  37. status->duplex = false;
  38. break;
  39. case LAN8742_PHYSCSR_10BT_FD:
  40. status->speed = 10;
  41. status->duplex = true;
  42. break;
  43. case LAN8742_PHYSCSR_100BTX_HD:
  44. status->speed = 100;
  45. status->duplex = false;
  46. break;
  47. case LAN8742_PHYSCSR_100BTX_FD:
  48. status->speed = 100;
  49. status->duplex = true;
  50. break;
  51. default:
  52. status->speed = 0;
  53. status->duplex = false;
  54. break;
  55. }
  56. }
  57. }
  58. const struct chry_phy_driver lan8742_driver = {
  59. .phy_id = 0x0007C130, /* LAN8742A PHY ID base (matches 0x0007C13x with mask) */
  60. .phy_id_mask = 0xFFFFFFF0, /* Mask for comparing PHY ID (matches revision 0x0-0xF) */
  61. .phy_name = "LAN8742A",
  62. .phy_desc = "MICROCHIP LAN8742A Ethernet PHY",
  63. .phy_init = lan8742_phy_init,
  64. .phy_get_status = lan8742_phy_get_status,
  65. };