rockchip_canfd.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. /* SPDX-License-Identifier: GPL-2.0
  2. *
  3. * Copyright (c) 2023, 2024 Pengutronix,
  4. * Marc Kleine-Budde <kernel@pengutronix.de>
  5. */
  6. #ifndef _ROCKCHIP_CANFD_H
  7. #define _ROCKCHIP_CANFD_H
  8. #include <linux/bitfield.h>
  9. #include <linux/can/dev.h>
  10. #include <linux/can/rx-offload.h>
  11. #include <linux/clk.h>
  12. #include <linux/io.h>
  13. #include <linux/netdevice.h>
  14. #include <linux/reset.h>
  15. #include <linux/skbuff.h>
  16. #include <linux/timecounter.h>
  17. #include <linux/types.h>
  18. #include <linux/u64_stats_sync.h>
  19. #include <linux/units.h>
  20. #define RKCANFD_REG_MODE 0x000
  21. #define RKCANFD_REG_MODE_CAN_FD_MODE_ENABLE BIT(15)
  22. #define RKCANFD_REG_MODE_DPEE BIT(14)
  23. #define RKCANFD_REG_MODE_BRSD BIT(13)
  24. #define RKCANFD_REG_MODE_SPACE_RX_MODE BIT(12)
  25. #define RKCANFD_REG_MODE_AUTO_BUS_ON BIT(11)
  26. #define RKCANFD_REG_MODE_AUTO_RETX_MODE BIT(10)
  27. #define RKCANFD_REG_MODE_OVLD_MODE BIT(9)
  28. #define RKCANFD_REG_MODE_COVER_MODE BIT(8)
  29. #define RKCANFD_REG_MODE_RXSORT_MODE BIT(7)
  30. #define RKCANFD_REG_MODE_TXORDER_MODE BIT(6)
  31. #define RKCANFD_REG_MODE_RXSTX_MODE BIT(5)
  32. #define RKCANFD_REG_MODE_LBACK_MODE BIT(4)
  33. #define RKCANFD_REG_MODE_SILENT_MODE BIT(3)
  34. #define RKCANFD_REG_MODE_SELF_TEST BIT(2)
  35. #define RKCANFD_REG_MODE_SLEEP_MODE BIT(1)
  36. #define RKCANFD_REG_MODE_WORK_MODE BIT(0)
  37. #define RKCANFD_REG_CMD 0x004
  38. #define RKCANFD_REG_CMD_TX1_REQ BIT(1)
  39. #define RKCANFD_REG_CMD_TX0_REQ BIT(0)
  40. #define RKCANFD_REG_CMD_TX_REQ(i) (RKCANFD_REG_CMD_TX0_REQ << (i))
  41. #define RKCANFD_REG_STATE 0x008
  42. #define RKCANFD_REG_STATE_SLEEP_STATE BIT(6)
  43. #define RKCANFD_REG_STATE_BUS_OFF_STATE BIT(5)
  44. #define RKCANFD_REG_STATE_ERROR_WARNING_STATE BIT(4)
  45. #define RKCANFD_REG_STATE_TX_PERIOD BIT(3)
  46. #define RKCANFD_REG_STATE_RX_PERIOD BIT(2)
  47. #define RKCANFD_REG_STATE_TX_BUFFER_FULL BIT(1)
  48. #define RKCANFD_REG_STATE_RX_BUFFER_FULL BIT(0)
  49. #define RKCANFD_REG_INT 0x00c
  50. #define RKCANFD_REG_INT_WAKEUP_INT BIT(14)
  51. #define RKCANFD_REG_INT_TXE_FIFO_FULL_INT BIT(13)
  52. #define RKCANFD_REG_INT_TXE_FIFO_OV_INT BIT(12)
  53. #define RKCANFD_REG_INT_TIMESTAMP_COUNTER_OVERFLOW_INT BIT(11)
  54. #define RKCANFD_REG_INT_BUS_OFF_RECOVERY_INT BIT(10)
  55. #define RKCANFD_REG_INT_BUS_OFF_INT BIT(9)
  56. #define RKCANFD_REG_INT_RX_FIFO_OVERFLOW_INT BIT(8)
  57. #define RKCANFD_REG_INT_RX_FIFO_FULL_INT BIT(7)
  58. #define RKCANFD_REG_INT_ERROR_INT BIT(6)
  59. #define RKCANFD_REG_INT_TX_ARBIT_FAIL_INT BIT(5)
  60. #define RKCANFD_REG_INT_PASSIVE_ERROR_INT BIT(4)
  61. #define RKCANFD_REG_INT_OVERLOAD_INT BIT(3)
  62. #define RKCANFD_REG_INT_ERROR_WARNING_INT BIT(2)
  63. #define RKCANFD_REG_INT_TX_FINISH_INT BIT(1)
  64. #define RKCANFD_REG_INT_RX_FINISH_INT BIT(0)
  65. #define RKCANFD_REG_INT_ALL \
  66. (RKCANFD_REG_INT_WAKEUP_INT | \
  67. RKCANFD_REG_INT_TXE_FIFO_FULL_INT | \
  68. RKCANFD_REG_INT_TXE_FIFO_OV_INT | \
  69. RKCANFD_REG_INT_TIMESTAMP_COUNTER_OVERFLOW_INT | \
  70. RKCANFD_REG_INT_BUS_OFF_RECOVERY_INT | \
  71. RKCANFD_REG_INT_BUS_OFF_INT | \
  72. RKCANFD_REG_INT_RX_FIFO_OVERFLOW_INT | \
  73. RKCANFD_REG_INT_RX_FIFO_FULL_INT | \
  74. RKCANFD_REG_INT_ERROR_INT | \
  75. RKCANFD_REG_INT_TX_ARBIT_FAIL_INT | \
  76. RKCANFD_REG_INT_PASSIVE_ERROR_INT | \
  77. RKCANFD_REG_INT_OVERLOAD_INT | \
  78. RKCANFD_REG_INT_ERROR_WARNING_INT | \
  79. RKCANFD_REG_INT_TX_FINISH_INT | \
  80. RKCANFD_REG_INT_RX_FINISH_INT)
  81. #define RKCANFD_REG_INT_ALL_ERROR \
  82. (RKCANFD_REG_INT_BUS_OFF_INT | \
  83. RKCANFD_REG_INT_ERROR_INT | \
  84. RKCANFD_REG_INT_PASSIVE_ERROR_INT | \
  85. RKCANFD_REG_INT_ERROR_WARNING_INT)
  86. #define RKCANFD_REG_INT_MASK 0x010
  87. #define RKCANFD_REG_DMA_CTL 0x014
  88. #define RKCANFD_REG_DMA_CTL_DMA_RX_MODE BIT(1)
  89. #define RKCANFD_REG_DMA_CTL_DMA_TX_MODE BIT(9)
  90. #define RKCANFD_REG_BITTIMING 0x018
  91. #define RKCANFD_REG_BITTIMING_SAMPLE_MODE BIT(16)
  92. #define RKCANFD_REG_BITTIMING_SJW GENMASK(15, 14)
  93. #define RKCANFD_REG_BITTIMING_BRP GENMASK(13, 8)
  94. #define RKCANFD_REG_BITTIMING_TSEG2 GENMASK(6, 4)
  95. #define RKCANFD_REG_BITTIMING_TSEG1 GENMASK(3, 0)
  96. #define RKCANFD_REG_ARBITFAIL 0x028
  97. #define RKCANFD_REG_ARBITFAIL_ARBIT_FAIL_CODE GENMASK(6, 0)
  98. /* Register seems to be clear or read */
  99. #define RKCANFD_REG_ERROR_CODE 0x02c
  100. #define RKCANFD_REG_ERROR_CODE_PHASE BIT(29)
  101. #define RKCANFD_REG_ERROR_CODE_TYPE GENMASK(28, 26)
  102. #define RKCANFD_REG_ERROR_CODE_TYPE_BIT 0x0
  103. #define RKCANFD_REG_ERROR_CODE_TYPE_STUFF 0x1
  104. #define RKCANFD_REG_ERROR_CODE_TYPE_FORM 0x2
  105. #define RKCANFD_REG_ERROR_CODE_TYPE_ACK 0x3
  106. #define RKCANFD_REG_ERROR_CODE_TYPE_CRC 0x4
  107. #define RKCANFD_REG_ERROR_CODE_DIRECTION_RX BIT(25)
  108. #define RKCANFD_REG_ERROR_CODE_TX GENMASK(24, 16)
  109. #define RKCANFD_REG_ERROR_CODE_TX_OVERLOAD BIT(24)
  110. #define RKCANFD_REG_ERROR_CODE_TX_ERROR BIT(23)
  111. #define RKCANFD_REG_ERROR_CODE_TX_ACK BIT(22)
  112. #define RKCANFD_REG_ERROR_CODE_TX_ACK_EOF BIT(21)
  113. #define RKCANFD_REG_ERROR_CODE_TX_CRC BIT(20)
  114. #define RKCANFD_REG_ERROR_CODE_TX_STUFF_COUNT BIT(19)
  115. #define RKCANFD_REG_ERROR_CODE_TX_DATA BIT(18)
  116. #define RKCANFD_REG_ERROR_CODE_TX_SOF_DLC BIT(17)
  117. #define RKCANFD_REG_ERROR_CODE_TX_IDLE BIT(16)
  118. #define RKCANFD_REG_ERROR_CODE_RX GENMASK(15, 0)
  119. #define RKCANFD_REG_ERROR_CODE_RX_BUF_INT BIT(15)
  120. #define RKCANFD_REG_ERROR_CODE_RX_SPACE BIT(14)
  121. #define RKCANFD_REG_ERROR_CODE_RX_EOF BIT(13)
  122. #define RKCANFD_REG_ERROR_CODE_RX_ACK_LIM BIT(12)
  123. #define RKCANFD_REG_ERROR_CODE_RX_ACK BIT(11)
  124. #define RKCANFD_REG_ERROR_CODE_RX_CRC_LIM BIT(10)
  125. #define RKCANFD_REG_ERROR_CODE_RX_CRC BIT(9)
  126. #define RKCANFD_REG_ERROR_CODE_RX_STUFF_COUNT BIT(8)
  127. #define RKCANFD_REG_ERROR_CODE_RX_DATA BIT(7)
  128. #define RKCANFD_REG_ERROR_CODE_RX_DLC BIT(6)
  129. #define RKCANFD_REG_ERROR_CODE_RX_BRS_ESI BIT(5)
  130. #define RKCANFD_REG_ERROR_CODE_RX_RES BIT(4)
  131. #define RKCANFD_REG_ERROR_CODE_RX_FDF BIT(3)
  132. #define RKCANFD_REG_ERROR_CODE_RX_ID2_RTR BIT(2)
  133. #define RKCANFD_REG_ERROR_CODE_RX_SOF_IDE BIT(1)
  134. #define RKCANFD_REG_ERROR_CODE_RX_IDLE BIT(0)
  135. #define RKCANFD_REG_ERROR_CODE_NOACK \
  136. (FIELD_PREP(RKCANFD_REG_ERROR_CODE_TYPE, \
  137. RKCANFD_REG_ERROR_CODE_TYPE_ACK) | \
  138. RKCANFD_REG_ERROR_CODE_TX_ACK_EOF | \
  139. RKCANFD_REG_ERROR_CODE_RX_ACK)
  140. #define RKCANFD_REG_RXERRORCNT 0x034
  141. #define RKCANFD_REG_RXERRORCNT_RX_ERR_CNT GENMASK(7, 0)
  142. #define RKCANFD_REG_TXERRORCNT 0x038
  143. #define RKCANFD_REG_TXERRORCNT_TX_ERR_CNT GENMASK(8, 0)
  144. #define RKCANFD_REG_IDCODE 0x03c
  145. #define RKCANFD_REG_IDCODE_STANDARD_FRAME_ID GENMASK(10, 0)
  146. #define RKCANFD_REG_IDCODE_EXTENDED_FRAME_ID GENMASK(28, 0)
  147. #define RKCANFD_REG_IDMASK 0x040
  148. #define RKCANFD_REG_TXFRAMEINFO 0x050
  149. #define RKCANFD_REG_FRAMEINFO_FRAME_FORMAT BIT(7)
  150. #define RKCANFD_REG_FRAMEINFO_RTR BIT(6)
  151. #define RKCANFD_REG_FRAMEINFO_DATA_LENGTH GENMASK(3, 0)
  152. #define RKCANFD_REG_TXID 0x054
  153. #define RKCANFD_REG_TXID_TX_ID GENMASK(28, 0)
  154. #define RKCANFD_REG_TXDATA0 0x058
  155. #define RKCANFD_REG_TXDATA1 0x05C
  156. #define RKCANFD_REG_RXFRAMEINFO 0x060
  157. #define RKCANFD_REG_RXID 0x064
  158. #define RKCANFD_REG_RXDATA0 0x068
  159. #define RKCANFD_REG_RXDATA1 0x06c
  160. #define RKCANFD_REG_RTL_VERSION 0x070
  161. #define RKCANFD_REG_RTL_VERSION_MAJOR GENMASK(7, 4)
  162. #define RKCANFD_REG_RTL_VERSION_MINOR GENMASK(3, 0)
  163. #define RKCANFD_REG_FD_NOMINAL_BITTIMING 0x100
  164. #define RKCANFD_REG_FD_NOMINAL_BITTIMING_SAMPLE_MODE BIT(31)
  165. #define RKCANFD_REG_FD_NOMINAL_BITTIMING_SJW GENMASK(30, 24)
  166. #define RKCANFD_REG_FD_NOMINAL_BITTIMING_BRP GENMASK(23, 16)
  167. #define RKCANFD_REG_FD_NOMINAL_BITTIMING_TSEG2 GENMASK(14, 8)
  168. #define RKCANFD_REG_FD_NOMINAL_BITTIMING_TSEG1 GENMASK(7, 0)
  169. #define RKCANFD_REG_FD_DATA_BITTIMING 0x104
  170. #define RKCANFD_REG_FD_DATA_BITTIMING_SAMPLE_MODE BIT(21)
  171. #define RKCANFD_REG_FD_DATA_BITTIMING_SJW GENMASK(20, 17)
  172. #define RKCANFD_REG_FD_DATA_BITTIMING_BRP GENMASK(16, 9)
  173. #define RKCANFD_REG_FD_DATA_BITTIMING_TSEG2 GENMASK(8, 5)
  174. #define RKCANFD_REG_FD_DATA_BITTIMING_TSEG1 GENMASK(4, 0)
  175. #define RKCANFD_REG_TRANSMIT_DELAY_COMPENSATION 0x108
  176. #define RKCANFD_REG_TRANSMIT_DELAY_COMPENSATION_TDC_OFFSET GENMASK(6, 1)
  177. #define RKCANFD_REG_TRANSMIT_DELAY_COMPENSATION_TDC_ENABLE BIT(0)
  178. #define RKCANFD_REG_TIMESTAMP_CTRL 0x10c
  179. /* datasheet says 6:1, which is wrong */
  180. #define RKCANFD_REG_TIMESTAMP_CTRL_TIME_BASE_COUNTER_PRESCALE GENMASK(5, 1)
  181. #define RKCANFD_REG_TIMESTAMP_CTRL_TIME_BASE_COUNTER_ENABLE BIT(0)
  182. #define RKCANFD_REG_TIMESTAMP 0x110
  183. #define RKCANFD_REG_TXEVENT_FIFO_CTRL 0x114
  184. #define RKCANFD_REG_TXEVENT_FIFO_CTRL_TXE_FIFO_CNT GENMASK(8, 5)
  185. #define RKCANFD_REG_TXEVENT_FIFO_CTRL_TXE_FIFO_WATERMARK GENMASK(4, 1)
  186. #define RKCANFD_REG_TXEVENT_FIFO_CTRL_TXE_FIFO_ENABLE BIT(0)
  187. #define RKCANFD_REG_RX_FIFO_CTRL 0x118
  188. #define RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_CNT GENMASK(6, 4)
  189. #define RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_FULL_WATERMARK GENMASK(3, 1)
  190. #define RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_ENABLE BIT(0)
  191. #define RKCANFD_REG_AFC_CTRL 0x11c
  192. #define RKCANFD_REG_AFC_CTRL_UAF5 BIT(4)
  193. #define RKCANFD_REG_AFC_CTRL_UAF4 BIT(3)
  194. #define RKCANFD_REG_AFC_CTRL_UAF3 BIT(2)
  195. #define RKCANFD_REG_AFC_CTRL_UAF2 BIT(1)
  196. #define RKCANFD_REG_AFC_CTRL_UAF1 BIT(0)
  197. #define RKCANFD_REG_IDCODE0 0x120
  198. #define RKCANFD_REG_IDMASK0 0x124
  199. #define RKCANFD_REG_IDCODE1 0x128
  200. #define RKCANFD_REG_IDMASK1 0x12c
  201. #define RKCANFD_REG_IDCODE2 0x130
  202. #define RKCANFD_REG_IDMASK2 0x134
  203. #define RKCANFD_REG_IDCODE3 0x138
  204. #define RKCANFD_REG_IDMASK3 0x13c
  205. #define RKCANFD_REG_IDCODE4 0x140
  206. #define RKCANFD_REG_IDMASK4 0x144
  207. #define RKCANFD_REG_FD_TXFRAMEINFO 0x200
  208. #define RKCANFD_REG_FD_FRAMEINFO_FRAME_FORMAT BIT(7)
  209. #define RKCANFD_REG_FD_FRAMEINFO_RTR BIT(6)
  210. #define RKCANFD_REG_FD_FRAMEINFO_FDF BIT(5)
  211. #define RKCANFD_REG_FD_FRAMEINFO_BRS BIT(4)
  212. #define RKCANFD_REG_FD_FRAMEINFO_DATA_LENGTH GENMASK(3, 0)
  213. #define RKCANFD_REG_FD_TXID 0x204
  214. #define RKCANFD_REG_FD_ID_EFF GENMASK(28, 0)
  215. #define RKCANFD_REG_FD_ID_SFF GENMASK(11, 0)
  216. #define RKCANFD_REG_FD_TXDATA0 0x208
  217. #define RKCANFD_REG_FD_TXDATA1 0x20c
  218. #define RKCANFD_REG_FD_TXDATA2 0x210
  219. #define RKCANFD_REG_FD_TXDATA3 0x214
  220. #define RKCANFD_REG_FD_TXDATA4 0x218
  221. #define RKCANFD_REG_FD_TXDATA5 0x21c
  222. #define RKCANFD_REG_FD_TXDATA6 0x220
  223. #define RKCANFD_REG_FD_TXDATA7 0x224
  224. #define RKCANFD_REG_FD_TXDATA8 0x228
  225. #define RKCANFD_REG_FD_TXDATA9 0x22c
  226. #define RKCANFD_REG_FD_TXDATA10 0x230
  227. #define RKCANFD_REG_FD_TXDATA11 0x234
  228. #define RKCANFD_REG_FD_TXDATA12 0x238
  229. #define RKCANFD_REG_FD_TXDATA13 0x23c
  230. #define RKCANFD_REG_FD_TXDATA14 0x240
  231. #define RKCANFD_REG_FD_TXDATA15 0x244
  232. #define RKCANFD_REG_FD_RXFRAMEINFO 0x300
  233. #define RKCANFD_REG_FD_RXID 0x304
  234. #define RKCANFD_REG_FD_RXTIMESTAMP 0x308
  235. #define RKCANFD_REG_FD_RXDATA0 0x30c
  236. #define RKCANFD_REG_FD_RXDATA1 0x310
  237. #define RKCANFD_REG_FD_RXDATA2 0x314
  238. #define RKCANFD_REG_FD_RXDATA3 0x318
  239. #define RKCANFD_REG_FD_RXDATA4 0x31c
  240. #define RKCANFD_REG_FD_RXDATA5 0x320
  241. #define RKCANFD_REG_FD_RXDATA6 0x320
  242. #define RKCANFD_REG_FD_RXDATA7 0x328
  243. #define RKCANFD_REG_FD_RXDATA8 0x32c
  244. #define RKCANFD_REG_FD_RXDATA9 0x330
  245. #define RKCANFD_REG_FD_RXDATA10 0x334
  246. #define RKCANFD_REG_FD_RXDATA11 0x338
  247. #define RKCANFD_REG_FD_RXDATA12 0x33c
  248. #define RKCANFD_REG_FD_RXDATA13 0x340
  249. #define RKCANFD_REG_FD_RXDATA14 0x344
  250. #define RKCANFD_REG_FD_RXDATA15 0x348
  251. #define RKCANFD_REG_RX_FIFO_RDATA 0x400
  252. #define RKCANFD_REG_TXE_FIFO_RDATA 0x500
  253. #define DEVICE_NAME "rockchip_canfd"
  254. #define RKCANFD_NAPI_WEIGHT 32
  255. #define RKCANFD_TXFIFO_DEPTH 2
  256. #define RKCANFD_TX_STOP_THRESHOLD 1
  257. #define RKCANFD_TX_START_THRESHOLD 1
  258. #define RKCANFD_TIMESTAMP_WORK_MAX_DELAY_SEC 60
  259. #define RKCANFD_ERRATUM_5_SYSCLOCK_HZ_MIN (300 * MEGA)
  260. /* rk3568 CAN-FD Errata, as of Tue 07 Nov 2023 11:25:31 +08:00 */
  261. /* Erratum 1: The error frame sent by the CAN controller has an
  262. * abnormal format.
  263. */
  264. #define RKCANFD_QUIRK_RK3568_ERRATUM_1 BIT(0)
  265. /* Erratum 2: The error frame sent after detecting a CRC error has an
  266. * abnormal position.
  267. */
  268. #define RKCANFD_QUIRK_RK3568_ERRATUM_2 BIT(1)
  269. /* Erratum 3: Intermittent CRC calculation errors. */
  270. #define RKCANFD_QUIRK_RK3568_ERRATUM_3 BIT(2)
  271. /* Erratum 4: Intermittent occurrence of stuffing errors. */
  272. #define RKCANFD_QUIRK_RK3568_ERRATUM_4 BIT(3)
  273. /* Erratum 5: Counters related to the TXFIFO and RXFIFO exhibit
  274. * abnormal counting behavior.
  275. *
  276. * The rk3568 CAN-FD errata sheet as of Tue 07 Nov 2023 11:25:31 +08:00
  277. * states that only the rk3568v2 is affected by this erratum, but
  278. * tests with the rk3568v2 and rk3568v3 show that the RX_FIFO_CNT is
  279. * sometimes too high. This leads to CAN frames being read from the
  280. * FIFO, which is then already empty.
  281. *
  282. * Further tests on the rk3568v2 and rk3568v3 show that in this
  283. * situation (i.e. empty FIFO) all elements of the FIFO header
  284. * (frameinfo, id, ts) contain the same data.
  285. *
  286. * On the rk3568v2 and rk3568v3, this problem only occurs extremely
  287. * rarely with the standard clock of 300 MHz, but almost immediately
  288. * at 80 MHz.
  289. *
  290. * To workaround this problem, check for empty FIFO with
  291. * rkcanfd_fifo_header_empty() in rkcanfd_handle_rx_int_one() and exit
  292. * early.
  293. *
  294. * To reproduce:
  295. * assigned-clocks = <&cru CLK_CANx>;
  296. * assigned-clock-rates = <80000000>;
  297. */
  298. #define RKCANFD_QUIRK_RK3568_ERRATUM_5 BIT(4)
  299. /* Erratum 6: The CAN controller's transmission of extended frames may
  300. * intermittently change into standard frames
  301. *
  302. * Work around this issue by activating self reception (RXSTX). If we
  303. * have pending TX CAN frames, check all RX'ed CAN frames in
  304. * rkcanfd_rxstx_filter().
  305. *
  306. * If it's a frame we've send and it's OK, call the TX complete
  307. * handler: rkcanfd_handle_tx_done_one(). Mask the TX complete IRQ.
  308. *
  309. * If it's a frame we've send, but the CAN-ID is mangled, resend the
  310. * original extended frame.
  311. *
  312. * To reproduce:
  313. * host:
  314. * canfdtest -evx -g can0
  315. * candump any,0:80000000 -cexdtA
  316. * dut:
  317. * canfdtest -evx can0
  318. * ethtool -S can0
  319. */
  320. #define RKCANFD_QUIRK_RK3568_ERRATUM_6 BIT(5)
  321. /* Erratum 7: In the passive error state, the CAN controller's
  322. * interframe space segment counting is inaccurate.
  323. */
  324. #define RKCANFD_QUIRK_RK3568_ERRATUM_7 BIT(6)
  325. /* Erratum 8: The Format-Error error flag is transmitted one bit
  326. * later.
  327. */
  328. #define RKCANFD_QUIRK_RK3568_ERRATUM_8 BIT(7)
  329. /* Erratum 9: In the arbitration segment, the CAN controller will
  330. * identify stuffing errors as arbitration failures.
  331. */
  332. #define RKCANFD_QUIRK_RK3568_ERRATUM_9 BIT(8)
  333. /* Erratum 10: Does not support the BUSOFF slow recovery mechanism. */
  334. #define RKCANFD_QUIRK_RK3568_ERRATUM_10 BIT(9)
  335. /* Erratum 11: Arbitration error. */
  336. #define RKCANFD_QUIRK_RK3568_ERRATUM_11 BIT(10)
  337. /* Erratum 12: A dominant bit at the third bit of the intermission may
  338. * cause a transmission error.
  339. */
  340. #define RKCANFD_QUIRK_RK3568_ERRATUM_12 BIT(11)
  341. /* Tests on the rk3568v2 and rk3568v3 show that receiving certain
  342. * CAN-FD frames trigger an Error Interrupt.
  343. *
  344. * - Form Error in RX Arbitration Phase: TX_IDLE RX_STUFF_COUNT (0x0a010100) CMD=0 RX=0 TX=0
  345. * Error-Warning=1 Bus-Off=0
  346. * To reproduce:
  347. * host:
  348. * cansend can0 002##01f
  349. * DUT:
  350. * candump any,0:0,#FFFFFFFF -cexdHtA
  351. *
  352. * - Form Error in RX Arbitration Phase: TX_IDLE RX_CRC (0x0a010200) CMD=0 RX=0 TX=0
  353. * Error-Warning=1 Bus-Off=0
  354. * To reproduce:
  355. * host:
  356. * cansend can0 002##07217010000000000
  357. * DUT:
  358. * candump any,0:0,#FFFFFFFF -cexdHtA
  359. */
  360. #define RKCANFD_QUIRK_CANFD_BROKEN BIT(12)
  361. /* known issues with rk3568v3:
  362. *
  363. * - Overload situation during high bus load
  364. * To reproduce:
  365. * host:
  366. * # add a 2nd CAN adapter to the CAN bus
  367. * cangen can0 -I 1 -Li -Di -p10 -g 0.3
  368. * cansequence -rve
  369. * DUT:
  370. * cangen can0 -I2 -L1 -Di -p10 -c10 -g 1 -e
  371. * cansequence -rv -i 1
  372. *
  373. * - TX starvation after repeated Bus-Off
  374. * To reproduce:
  375. * host:
  376. * sleep 3 && cangen can0 -I2 -Li -Di -p10 -g 0.0
  377. * DUT:
  378. * cangen can0 -I2 -Li -Di -p10 -g 0.05
  379. */
  380. enum rkcanfd_model {
  381. RKCANFD_MODEL_RK3568V2 = 0x35682,
  382. RKCANFD_MODEL_RK3568V3 = 0x35683,
  383. };
  384. struct rkcanfd_devtype_data {
  385. enum rkcanfd_model model;
  386. u32 quirks;
  387. };
  388. struct rkcanfd_fifo_header {
  389. u32 frameinfo;
  390. u32 id;
  391. u32 ts;
  392. };
  393. struct rkcanfd_stats {
  394. struct u64_stats_sync syncp;
  395. /* Erratum 5 */
  396. u64_stats_t rx_fifo_empty_errors;
  397. /* Erratum 6 */
  398. u64_stats_t tx_extended_as_standard_errors;
  399. };
  400. struct rkcanfd_priv {
  401. struct can_priv can;
  402. struct can_rx_offload offload;
  403. struct net_device *ndev;
  404. void __iomem *regs;
  405. unsigned int tx_head;
  406. unsigned int tx_tail;
  407. u32 reg_mode_default;
  408. u32 reg_int_mask_default;
  409. struct rkcanfd_devtype_data devtype_data;
  410. struct cyclecounter cc;
  411. struct timecounter tc;
  412. struct delayed_work timestamp;
  413. unsigned long work_delay_jiffies;
  414. struct can_berr_counter bec;
  415. struct rkcanfd_stats stats;
  416. struct reset_control *reset;
  417. struct clk_bulk_data *clks;
  418. int clks_num;
  419. };
  420. static inline u32
  421. rkcanfd_read(const struct rkcanfd_priv *priv, u32 reg)
  422. {
  423. return readl(priv->regs + reg);
  424. }
  425. static inline void
  426. rkcanfd_read_rep(const struct rkcanfd_priv *priv, u32 reg,
  427. void *buf, unsigned int len)
  428. {
  429. readsl(priv->regs + reg, buf, len / sizeof(u32));
  430. }
  431. static inline void
  432. rkcanfd_write(const struct rkcanfd_priv *priv, u32 reg, u32 val)
  433. {
  434. writel(val, priv->regs + reg);
  435. }
  436. static inline u32
  437. rkcanfd_get_timestamp(const struct rkcanfd_priv *priv)
  438. {
  439. return rkcanfd_read(priv, RKCANFD_REG_TIMESTAMP);
  440. }
  441. static inline unsigned int
  442. rkcanfd_get_tx_head(const struct rkcanfd_priv *priv)
  443. {
  444. return READ_ONCE(priv->tx_head) & (RKCANFD_TXFIFO_DEPTH - 1);
  445. }
  446. static inline unsigned int
  447. rkcanfd_get_tx_tail(const struct rkcanfd_priv *priv)
  448. {
  449. return READ_ONCE(priv->tx_tail) & (RKCANFD_TXFIFO_DEPTH - 1);
  450. }
  451. static inline unsigned int
  452. rkcanfd_get_tx_pending(const struct rkcanfd_priv *priv)
  453. {
  454. return READ_ONCE(priv->tx_head) - READ_ONCE(priv->tx_tail);
  455. }
  456. static inline unsigned int
  457. rkcanfd_get_tx_free(const struct rkcanfd_priv *priv)
  458. {
  459. return RKCANFD_TXFIFO_DEPTH - rkcanfd_get_tx_pending(priv);
  460. }
  461. void rkcanfd_ethtool_init(struct rkcanfd_priv *priv);
  462. int rkcanfd_handle_rx_int(struct rkcanfd_priv *priv);
  463. void rkcanfd_skb_set_timestamp(const struct rkcanfd_priv *priv,
  464. struct sk_buff *skb, const u32 timestamp);
  465. void rkcanfd_timestamp_init(struct rkcanfd_priv *priv);
  466. void rkcanfd_timestamp_start(struct rkcanfd_priv *priv);
  467. void rkcanfd_timestamp_stop(struct rkcanfd_priv *priv);
  468. void rkcanfd_timestamp_stop_sync(struct rkcanfd_priv *priv);
  469. unsigned int rkcanfd_get_effective_tx_free(const struct rkcanfd_priv *priv);
  470. void rkcanfd_xmit_retry(struct rkcanfd_priv *priv);
  471. netdev_tx_t rkcanfd_start_xmit(struct sk_buff *skb, struct net_device *ndev);
  472. void rkcanfd_handle_tx_done_one(struct rkcanfd_priv *priv, const u32 ts,
  473. unsigned int *frame_len_p);
  474. #endif