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.

icplus.h 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #ifndef _ICPLUS_H
  2. #define _ICPLUS_H
  3. /** @file
  4. *
  5. * IC+ network driver
  6. *
  7. */
  8. #include <ipxe/nvs.h>
  9. #include <ipxe/mii_bit.h>
  10. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  11. /** BAR size */
  12. #define ICP_BAR_SIZE 0x200
  13. /** Alignment requirement */
  14. #define ICP_ALIGN 0x8
  15. /** Base address low register offset */
  16. #define ICP_BASE_LO 0x0
  17. /** Base address high register offset */
  18. #define ICP_BASE_HI 0x4
  19. /** ASIC control register (double word) */
  20. #define ICP_ASICCTRL 0x30
  21. #define ICP_ASICCTRL_PHYSPEED1000 0x00000040UL /**< PHY speed 1000 */
  22. #define ICP_ASICCTRL_GLOBALRESET 0x00010000UL /**< Global reset */
  23. #define ICP_ASICCTRL_DMA 0x00080000UL /**< DMA */
  24. #define ICP_ASICCTRL_FIFO 0x00100000UL /**< FIFO */
  25. #define ICP_ASICCTRL_NETWORK 0x00200000UL /**< Network */
  26. #define ICP_ASICCTRL_HOST 0x00400000UL /**< Host */
  27. #define ICP_ASICCTRL_AUTOINIT 0x00800000UL /**< Auto init */
  28. #define ICP_ASICCTRL_RESETBUSY 0x04000000UL /**< Reset busy */
  29. /** Maximum time to wait for reset */
  30. #define ICP_RESET_MAX_WAIT_MS 1000
  31. /** DMA control register (word/double word) */
  32. #define ICP_DMACTRL 0x00
  33. #define ICP_DMACTRL_RXPOLLNOW 0x0010 /**< Receive poll now */
  34. #define ICP_DMACTRL_TXPOLLNOW 0x1000 /**< Transmit poll now */
  35. /** EEPROM control register (word) */
  36. #define ICP_EEPROMCTRL 0x4a
  37. #define ICP_EEPROMCTRL_ADDRESS( x ) ( (x) << 0 ) /**< Address */
  38. #define ICP_EEPROMCTRL_OPCODE( x ) ( (x) << 8 ) /**< Opcode */
  39. #define ICP_EEPROMCTRL_OPCODE_READ \
  40. ICP_EEPROMCTRL_OPCODE ( 2 ) /**< Read register */
  41. #define ICP_EEPROMCTRL_BUSY 0x8000 /**< EEPROM busy */
  42. /** Maximum time to wait for reading EEPROM */
  43. #define ICP_EEPROM_MAX_WAIT_MS 1000
  44. /** EEPROM word length */
  45. #define ICP_EEPROM_WORD_LEN_LOG2 1
  46. /** Minimum EEPROM size, in words */
  47. #define ICP_EEPROM_MIN_SIZE_WORDS 0x20
  48. /** Address of MAC address within EEPROM */
  49. #define ICP_EEPROM_MAC 0x10
  50. /** EEPROM data register (word) */
  51. #define ICP_EEPROMDATA 0x48
  52. /** Interupt status register (word) */
  53. #define ICP_INTSTATUS 0x5e
  54. #define ICP_INTSTATUS_TXCOMPLETE 0x0004 /**< TX complete */
  55. #define ICP_INTSTATUS_LINKEVENT 0x0100 /**< Link event */
  56. #define ICP_INTSTATUS_RXDMACOMPLETE 0x0400 /**< RX DMA complete */
  57. /** MAC control register (double word) */
  58. #define ICP_MACCTRL 0x6c
  59. #define ICP_MACCTRL_DUPLEX 0x00000020UL /**< Duplex select */
  60. #define ICP_MACCTRL_TXENABLE 0x01000000UL /**< TX enable */
  61. #define ICP_MACCTRL_TXDISABLE 0x02000000UL /**< TX disable */
  62. #define ICP_MACCTRL_RXENABLE 0x08000000UL /**< RX enable */
  63. #define ICP_MACCTRL_RXDISABLE 0x10000000UL /**< RX disable */
  64. /** PHY control register (byte) */
  65. #define ICP_PHYCTRL 0x76
  66. #define ICP_PHYCTRL_MGMTCLK 0x01 /**< Management clock */
  67. #define ICP_PHYCTRL_MGMTDATA 0x02 /**< Management data */
  68. #define ICP_PHYCTRL_MGMTDIR 0x04 /**< Management direction */
  69. #define ICP_PHYCTRL_LINKSPEED 0xc0 /**< Link speed */
  70. /** Receive mode register (word) */
  71. #define ICP_RXMODE 0x88
  72. #define ICP_RXMODE_UNICAST 0x0001 /**< Receive unicast */
  73. #define ICP_RXMODE_MULTICAST 0x0002 /**< Receice multicast */
  74. #define ICP_RXMODE_BROADCAST 0x0004 /**< Receive broadcast */
  75. #define ICP_RXMODE_ALLFRAMES 0x0008 /**< Receive all frames */
  76. /** List pointer receive register */
  77. #define ICP_RFDLISTPTR 0x1c
  78. /** List pointer transmit register */
  79. #define ICP_TFDLISTPTR 0x10
  80. /** Transmit status register */
  81. #define ICP_TXSTATUS 0x60
  82. #define ICP_TXSTATUS_ERROR 0x00000001UL /**< TX error */
  83. /** Data fragment */
  84. union icplus_fragment {
  85. /** Address of data */
  86. uint64_t address;
  87. /** Length */
  88. struct {
  89. /** Reserved */
  90. uint8_t reserved[6];
  91. /** Length of data */
  92. uint16_t len;
  93. };
  94. };
  95. /** Transmit or receive descriptor */
  96. struct icplus_descriptor {
  97. /** Address of next descriptor */
  98. uint64_t next;
  99. /** Actual length */
  100. uint16_t len;
  101. /** Flags */
  102. uint8_t flags;
  103. /** Control */
  104. uint8_t control;
  105. /** VLAN */
  106. uint16_t vlan;
  107. /** Reserved */
  108. uint16_t reserved_a;
  109. /** Data buffer */
  110. union icplus_fragment data;
  111. /** Reserved */
  112. uint8_t reserved_b[8];
  113. };
  114. /** Descriptor complete */
  115. #define ICP_DONE 0x80
  116. /** Transmit alignment disabled */
  117. #define ICP_TX_UNALIGN 0x01
  118. /** Request transmit completion */
  119. #define ICP_TX_INDICATE 0x40
  120. /** Sole transmit fragment */
  121. #define ICP_TX_SOLE_FRAG 0x01
  122. /** Recieve frame overrun error */
  123. #define ICP_RX_ERR_OVERRUN 0x01
  124. /** Receive runt frame error */
  125. #define ICP_RX_ERR_RUNT 0x02
  126. /** Receive alignment error */
  127. #define ICP_RX_ERR_ALIGN 0x04
  128. /** Receive FCS error */
  129. #define ICP_RX_ERR_FCS 0x08
  130. /** Receive oversized frame error */
  131. #define ICP_RX_ERR_OVERSIZED 0x10
  132. /** Recieve length error */
  133. #define ICP_RX_ERR_LEN 0x20
  134. /** Descriptor ring */
  135. struct icplus_ring {
  136. /** Producer counter */
  137. unsigned int prod;
  138. /** Consumer counter */
  139. unsigned int cons;
  140. /** Ring entries */
  141. struct icplus_descriptor *entry;
  142. /* List pointer register */
  143. unsigned int listptr;
  144. };
  145. /** Number of descriptors */
  146. #define ICP_NUM_DESC 4
  147. /** Maximum receive packet length */
  148. #define ICP_RX_MAX_LEN ETH_FRAME_LEN
  149. /** An IC+ network card */
  150. struct icplus_nic {
  151. /** Registers */
  152. void *regs;
  153. /** EEPROM */
  154. struct nvs_device eeprom;
  155. /** MII bit bashing interface */
  156. struct mii_bit_basher miibit;
  157. /** MII device */
  158. struct mii_device mii;
  159. /** Transmit descriptor ring */
  160. struct icplus_ring tx;
  161. /** Receive descriptor ring */
  162. struct icplus_ring rx;
  163. /** Receive I/O buffers */
  164. struct io_buffer *rx_iobuf[ICP_NUM_DESC];
  165. };
  166. #endif /* _ICPLUS_H */