smsc.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * SMSC PHY drivers
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. *
  6. * Base code from drivers/net/phy/davicom.c
  7. * Copyright 2010-2011 Freescale Semiconductor, Inc.
  8. * author Andy Fleming
  9. *
  10. * Some code copied from linux kernel
  11. * Copyright (c) 2006 Herbert Valerio Riedel <hvr@gnu.org>
  12. */
  13. #include <miiphy.h>
  14. /* This code does not check the partner abilities. */
  15. static int smsc_parse_status(struct phy_device *phydev)
  16. {
  17. int mii_reg;
  18. mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
  19. if (mii_reg & (BMSR_100FULL | BMSR_100HALF))
  20. phydev->speed = SPEED_100;
  21. else
  22. phydev->speed = SPEED_10;
  23. if (mii_reg & (BMSR_10FULL | BMSR_100FULL))
  24. phydev->duplex = DUPLEX_FULL;
  25. else
  26. phydev->duplex = DUPLEX_HALF;
  27. return 0;
  28. }
  29. static int smsc_startup(struct phy_device *phydev)
  30. {
  31. int ret;
  32. ret = genphy_update_link(phydev);
  33. if (ret)
  34. return ret;
  35. return smsc_parse_status(phydev);
  36. }
  37. static struct phy_driver lan8700_driver = {
  38. .name = "SMSC LAN8700",
  39. .uid = 0x0007c0c0,
  40. .mask = 0xffff0,
  41. .features = PHY_BASIC_FEATURES,
  42. .config = &genphy_config_aneg,
  43. .startup = &smsc_startup,
  44. .shutdown = &genphy_shutdown,
  45. };
  46. static struct phy_driver lan911x_driver = {
  47. .name = "SMSC LAN911x Internal PHY",
  48. .uid = 0x0007c0d0,
  49. .mask = 0xffff0,
  50. .features = PHY_BASIC_FEATURES,
  51. .config = &genphy_config_aneg,
  52. .startup = &smsc_startup,
  53. .shutdown = &genphy_shutdown,
  54. };
  55. static struct phy_driver lan8710_driver = {
  56. .name = "SMSC LAN8710/LAN8720",
  57. .uid = 0x0007c0f0,
  58. .mask = 0xffff0,
  59. .features = PHY_BASIC_FEATURES,
  60. .config = &genphy_config_aneg,
  61. .startup = &genphy_startup,
  62. .shutdown = &genphy_shutdown,
  63. };
  64. static struct phy_driver lan8740_driver = {
  65. .name = "SMSC LAN8740",
  66. .uid = 0x0007c110,
  67. .mask = 0xffff0,
  68. .features = PHY_BASIC_FEATURES,
  69. .config = &genphy_config_aneg,
  70. .startup = &genphy_startup,
  71. .shutdown = &genphy_shutdown,
  72. };
  73. int phy_smsc_init(void)
  74. {
  75. phy_register(&lan8710_driver);
  76. phy_register(&lan911x_driver);
  77. phy_register(&lan8700_driver);
  78. phy_register(&lan8740_driver);
  79. return 0;
  80. }