smsc.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. genphy_update_link(phydev);
  32. smsc_parse_status(phydev);
  33. return 0;
  34. }
  35. static struct phy_driver lan8700_driver = {
  36. .name = "SMSC LAN8700",
  37. .uid = 0x0007c0c0,
  38. .mask = 0xffff0,
  39. .features = PHY_BASIC_FEATURES,
  40. .config = &genphy_config_aneg,
  41. .startup = &smsc_startup,
  42. .shutdown = &genphy_shutdown,
  43. };
  44. static struct phy_driver lan911x_driver = {
  45. .name = "SMSC LAN911x Internal PHY",
  46. .uid = 0x0007c0d0,
  47. .mask = 0xffff0,
  48. .features = PHY_BASIC_FEATURES,
  49. .config = &genphy_config_aneg,
  50. .startup = &smsc_startup,
  51. .shutdown = &genphy_shutdown,
  52. };
  53. static struct phy_driver lan8710_driver = {
  54. .name = "SMSC LAN8710/LAN8720",
  55. .uid = 0x0007c0f0,
  56. .mask = 0xffff0,
  57. .features = PHY_BASIC_FEATURES,
  58. .config = &genphy_config_aneg,
  59. .startup = &genphy_startup,
  60. .shutdown = &genphy_shutdown,
  61. };
  62. int phy_smsc_init(void)
  63. {
  64. phy_register(&lan8710_driver);
  65. phy_register(&lan911x_driver);
  66. phy_register(&lan8700_driver);
  67. return 0;
  68. }