You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mii.h 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #ifndef _IPXE_MII_H
  2. #define _IPXE_MII_H
  3. /** @file
  4. *
  5. * Media Independent Interface
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  9. #include <mii.h>
  10. #include <ipxe/netdevice.h>
  11. struct mii_interface;
  12. /** MII interface operations */
  13. struct mii_operations {
  14. /**
  15. * Read from MII register
  16. *
  17. * @v mdio MII interface
  18. * @v phy PHY address
  19. * @v reg Register address
  20. * @ret data Data read, or negative error
  21. */
  22. int ( * read ) ( struct mii_interface *mdio, unsigned int phy,
  23. unsigned int reg );
  24. /**
  25. * Write to MII register
  26. *
  27. * @v mdio MII interface
  28. * @v phy PHY address
  29. * @v reg Register address
  30. * @v data Data to write
  31. * @ret rc Return status code
  32. */
  33. int ( * write ) ( struct mii_interface *mdio, unsigned int phy,
  34. unsigned int reg, unsigned int data );
  35. };
  36. /** An MII interface */
  37. struct mii_interface {
  38. /** Interface operations */
  39. struct mii_operations *op;
  40. };
  41. /** An MII device */
  42. struct mii_device {
  43. /** MII interface */
  44. struct mii_interface *mdio;
  45. /** PHY address */
  46. unsigned int address;
  47. };
  48. /**
  49. * Initialise MII interface
  50. *
  51. * @v mdio MII interface
  52. * @v op MII interface operations
  53. */
  54. static inline __attribute__ (( always_inline )) void
  55. mdio_init ( struct mii_interface *mdio, struct mii_operations *op ) {
  56. mdio->op = op;
  57. }
  58. /**
  59. * Initialise MII device
  60. *
  61. * @v mii MII device
  62. * @v mdio MII interface
  63. * @v address PHY address
  64. */
  65. static inline __attribute__ (( always_inline )) void
  66. mii_init ( struct mii_device *mii, struct mii_interface *mdio,
  67. unsigned int address ) {
  68. mii->mdio = mdio;
  69. mii->address = address;
  70. }
  71. /**
  72. * Read from MII register
  73. *
  74. * @v mii MII device
  75. * @v reg Register address
  76. * @ret data Data read, or negative error
  77. */
  78. static inline __attribute__ (( always_inline )) int
  79. mii_read ( struct mii_device *mii, unsigned int reg ) {
  80. struct mii_interface *mdio = mii->mdio;
  81. return mdio->op->read ( mdio, mii->address, reg );
  82. }
  83. /**
  84. * Write to MII register
  85. *
  86. * @v mii MII device
  87. * @v reg Register address
  88. * @v data Data to write
  89. * @ret rc Return status code
  90. */
  91. static inline __attribute__ (( always_inline )) int
  92. mii_write ( struct mii_device *mii, unsigned int reg, unsigned int data ) {
  93. struct mii_interface *mdio = mii->mdio;
  94. return mdio->op->write ( mdio, mii->address, reg, data );
  95. }
  96. /**
  97. * Dump MII registers (for debugging)
  98. *
  99. * @v mii MII device
  100. */
  101. static inline void
  102. mii_dump ( struct mii_device *mii ) {
  103. unsigned int i;
  104. int data;
  105. /* Do nothing unless debug output is enabled */
  106. if ( ! DBG_LOG )
  107. return;
  108. /* Dump basic MII register set */
  109. for ( i = 0 ; i < 16 ; i++ ) {
  110. if ( ( i % 8 ) == 0 ) {
  111. DBGC ( mii, "MII %p registers %02x-%02x:",
  112. mii, i, ( i + 7 ) );
  113. }
  114. data = mii_read ( mii, i );
  115. if ( data >= 0 ) {
  116. DBGC ( mii, " %04x", data );
  117. } else {
  118. DBGC ( mii, " XXXX" );
  119. }
  120. if ( ( i % 8 ) == 7 )
  121. DBGC ( mii, "\n" );
  122. }
  123. }
  124. /** Maximum time to wait for a reset, in milliseconds */
  125. #define MII_RESET_MAX_WAIT_MS 500
  126. extern int mii_restart ( struct mii_device *mii );
  127. extern int mii_reset ( struct mii_device *mii );
  128. extern int mii_check_link ( struct mii_device *mii,
  129. struct net_device *netdev );
  130. #endif /* _IPXE_MII_H */