ifi_canfd.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. /*
  2. * CAN bus driver for IFI CANFD controller
  3. *
  4. * Copyright (C) 2016 Marek Vasut <marex@denx.de>
  5. *
  6. * Details about this controller can be found at
  7. * http://www.ifi-pld.de/IP/CANFD/canfd.html
  8. *
  9. * This file is licensed under the terms of the GNU General Public
  10. * License version 2. This program is licensed "as is" without any
  11. * warranty of any kind, whether express or implied.
  12. */
  13. #include <linux/clk.h>
  14. #include <linux/delay.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/io.h>
  17. #include <linux/kernel.h>
  18. #include <linux/module.h>
  19. #include <linux/netdevice.h>
  20. #include <linux/of.h>
  21. #include <linux/of_device.h>
  22. #include <linux/platform_device.h>
  23. #include <linux/can/dev.h>
  24. #define IFI_CANFD_STCMD 0x0
  25. #define IFI_CANFD_STCMD_HARDRESET 0xDEADCAFD
  26. #define IFI_CANFD_STCMD_ENABLE BIT(0)
  27. #define IFI_CANFD_STCMD_ERROR_ACTIVE BIT(2)
  28. #define IFI_CANFD_STCMD_ERROR_PASSIVE BIT(3)
  29. #define IFI_CANFD_STCMD_BUSOFF BIT(4)
  30. #define IFI_CANFD_STCMD_BUSMONITOR BIT(16)
  31. #define IFI_CANFD_STCMD_LOOPBACK BIT(18)
  32. #define IFI_CANFD_STCMD_DISABLE_CANFD BIT(24)
  33. #define IFI_CANFD_STCMD_ENABLE_ISO BIT(25)
  34. #define IFI_CANFD_STCMD_NORMAL_MODE ((u32)BIT(31))
  35. #define IFI_CANFD_RXSTCMD 0x4
  36. #define IFI_CANFD_RXSTCMD_REMOVE_MSG BIT(0)
  37. #define IFI_CANFD_RXSTCMD_RESET BIT(7)
  38. #define IFI_CANFD_RXSTCMD_EMPTY BIT(8)
  39. #define IFI_CANFD_RXSTCMD_OVERFLOW BIT(13)
  40. #define IFI_CANFD_TXSTCMD 0x8
  41. #define IFI_CANFD_TXSTCMD_ADD_MSG BIT(0)
  42. #define IFI_CANFD_TXSTCMD_HIGH_PRIO BIT(1)
  43. #define IFI_CANFD_TXSTCMD_RESET BIT(7)
  44. #define IFI_CANFD_TXSTCMD_EMPTY BIT(8)
  45. #define IFI_CANFD_TXSTCMD_FULL BIT(12)
  46. #define IFI_CANFD_TXSTCMD_OVERFLOW BIT(13)
  47. #define IFI_CANFD_INTERRUPT 0xc
  48. #define IFI_CANFD_INTERRUPT_ERROR_WARNING ((u32)BIT(1))
  49. #define IFI_CANFD_INTERRUPT_TXFIFO_EMPTY BIT(16)
  50. #define IFI_CANFD_INTERRUPT_TXFIFO_REMOVE BIT(22)
  51. #define IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY BIT(24)
  52. #define IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY_PER BIT(25)
  53. #define IFI_CANFD_INTERRUPT_SET_IRQ ((u32)BIT(31))
  54. #define IFI_CANFD_IRQMASK 0x10
  55. #define IFI_CANFD_IRQMASK_SET_ERR BIT(7)
  56. #define IFI_CANFD_IRQMASK_SET_TS BIT(15)
  57. #define IFI_CANFD_IRQMASK_TXFIFO_EMPTY BIT(16)
  58. #define IFI_CANFD_IRQMASK_SET_TX BIT(23)
  59. #define IFI_CANFD_IRQMASK_RXFIFO_NEMPTY BIT(24)
  60. #define IFI_CANFD_IRQMASK_SET_RX ((u32)BIT(31))
  61. #define IFI_CANFD_TIME 0x14
  62. #define IFI_CANFD_FTIME 0x18
  63. #define IFI_CANFD_TIME_TIMEB_OFF 0
  64. #define IFI_CANFD_TIME_TIMEA_OFF 8
  65. #define IFI_CANFD_TIME_PRESCALE_OFF 16
  66. #define IFI_CANFD_TIME_SJW_OFF_ISO 25
  67. #define IFI_CANFD_TIME_SJW_OFF_BOSCH 28
  68. #define IFI_CANFD_TIME_SET_SJW_BOSCH BIT(6)
  69. #define IFI_CANFD_TIME_SET_TIMEB_BOSCH BIT(7)
  70. #define IFI_CANFD_TIME_SET_PRESC_BOSCH BIT(14)
  71. #define IFI_CANFD_TIME_SET_TIMEA_BOSCH BIT(15)
  72. #define IFI_CANFD_TDELAY 0x1c
  73. #define IFI_CANFD_ERROR 0x20
  74. #define IFI_CANFD_ERROR_TX_OFFSET 0
  75. #define IFI_CANFD_ERROR_TX_MASK 0xff
  76. #define IFI_CANFD_ERROR_RX_OFFSET 16
  77. #define IFI_CANFD_ERROR_RX_MASK 0xff
  78. #define IFI_CANFD_ERRCNT 0x24
  79. #define IFI_CANFD_SUSPEND 0x28
  80. #define IFI_CANFD_REPEAT 0x2c
  81. #define IFI_CANFD_TRAFFIC 0x30
  82. #define IFI_CANFD_TSCONTROL 0x34
  83. #define IFI_CANFD_TSC 0x38
  84. #define IFI_CANFD_TST 0x3c
  85. #define IFI_CANFD_RES1 0x40
  86. #define IFI_CANFD_RES2 0x44
  87. #define IFI_CANFD_PAR 0x48
  88. #define IFI_CANFD_CANCLOCK 0x4c
  89. #define IFI_CANFD_SYSCLOCK 0x50
  90. #define IFI_CANFD_VER 0x54
  91. #define IFI_CANFD_IP_ID 0x58
  92. #define IFI_CANFD_IP_ID_VALUE 0xD073CAFD
  93. #define IFI_CANFD_TEST 0x5c
  94. #define IFI_CANFD_RXFIFO_TS_63_32 0x60
  95. #define IFI_CANFD_RXFIFO_TS_31_0 0x64
  96. #define IFI_CANFD_RXFIFO_DLC 0x68
  97. #define IFI_CANFD_RXFIFO_DLC_DLC_OFFSET 0
  98. #define IFI_CANFD_RXFIFO_DLC_DLC_MASK 0xf
  99. #define IFI_CANFD_RXFIFO_DLC_RTR BIT(4)
  100. #define IFI_CANFD_RXFIFO_DLC_EDL BIT(5)
  101. #define IFI_CANFD_RXFIFO_DLC_BRS BIT(6)
  102. #define IFI_CANFD_RXFIFO_DLC_ESI BIT(7)
  103. #define IFI_CANFD_RXFIFO_DLC_OBJ_OFFSET 8
  104. #define IFI_CANFD_RXFIFO_DLC_OBJ_MASK 0x1ff
  105. #define IFI_CANFD_RXFIFO_DLC_FNR_OFFSET 24
  106. #define IFI_CANFD_RXFIFO_DLC_FNR_MASK 0xff
  107. #define IFI_CANFD_RXFIFO_ID 0x6c
  108. #define IFI_CANFD_RXFIFO_ID_ID_OFFSET 0
  109. #define IFI_CANFD_RXFIFO_ID_ID_STD_MASK CAN_SFF_MASK
  110. #define IFI_CANFD_RXFIFO_ID_ID_STD_OFFSET 0
  111. #define IFI_CANFD_RXFIFO_ID_ID_STD_WIDTH 10
  112. #define IFI_CANFD_RXFIFO_ID_ID_XTD_MASK CAN_EFF_MASK
  113. #define IFI_CANFD_RXFIFO_ID_ID_XTD_OFFSET 11
  114. #define IFI_CANFD_RXFIFO_ID_ID_XTD_WIDTH 18
  115. #define IFI_CANFD_RXFIFO_ID_IDE BIT(29)
  116. #define IFI_CANFD_RXFIFO_DATA 0x70 /* 0x70..0xac */
  117. #define IFI_CANFD_TXFIFO_SUSPEND_US 0xb0
  118. #define IFI_CANFD_TXFIFO_REPEATCOUNT 0xb4
  119. #define IFI_CANFD_TXFIFO_DLC 0xb8
  120. #define IFI_CANFD_TXFIFO_DLC_DLC_OFFSET 0
  121. #define IFI_CANFD_TXFIFO_DLC_DLC_MASK 0xf
  122. #define IFI_CANFD_TXFIFO_DLC_RTR BIT(4)
  123. #define IFI_CANFD_TXFIFO_DLC_EDL BIT(5)
  124. #define IFI_CANFD_TXFIFO_DLC_BRS BIT(6)
  125. #define IFI_CANFD_TXFIFO_DLC_FNR_OFFSET 24
  126. #define IFI_CANFD_TXFIFO_DLC_FNR_MASK 0xff
  127. #define IFI_CANFD_TXFIFO_ID 0xbc
  128. #define IFI_CANFD_TXFIFO_ID_ID_OFFSET 0
  129. #define IFI_CANFD_TXFIFO_ID_ID_STD_MASK CAN_SFF_MASK
  130. #define IFI_CANFD_TXFIFO_ID_ID_STD_OFFSET 0
  131. #define IFI_CANFD_TXFIFO_ID_ID_STD_WIDTH 10
  132. #define IFI_CANFD_TXFIFO_ID_ID_XTD_MASK CAN_EFF_MASK
  133. #define IFI_CANFD_TXFIFO_ID_ID_XTD_OFFSET 11
  134. #define IFI_CANFD_TXFIFO_ID_ID_XTD_WIDTH 18
  135. #define IFI_CANFD_TXFIFO_ID_IDE BIT(29)
  136. #define IFI_CANFD_TXFIFO_DATA 0xc0 /* 0xb0..0xfc */
  137. #define IFI_CANFD_FILTER_MASK(n) (0x800 + ((n) * 8) + 0)
  138. #define IFI_CANFD_FILTER_MASK_EXT BIT(29)
  139. #define IFI_CANFD_FILTER_MASK_EDL BIT(30)
  140. #define IFI_CANFD_FILTER_MASK_VALID ((u32)BIT(31))
  141. #define IFI_CANFD_FILTER_IDENT(n) (0x800 + ((n) * 8) + 4)
  142. #define IFI_CANFD_FILTER_IDENT_IDE BIT(29)
  143. #define IFI_CANFD_FILTER_IDENT_CANFD BIT(30)
  144. #define IFI_CANFD_FILTER_IDENT_VALID ((u32)BIT(31))
  145. /* IFI CANFD private data structure */
  146. struct ifi_canfd_priv {
  147. struct can_priv can; /* must be the first member */
  148. struct napi_struct napi;
  149. struct net_device *ndev;
  150. void __iomem *base;
  151. };
  152. static void ifi_canfd_irq_enable(struct net_device *ndev, bool enable)
  153. {
  154. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  155. u32 enirq = 0;
  156. if (enable) {
  157. enirq = IFI_CANFD_IRQMASK_TXFIFO_EMPTY |
  158. IFI_CANFD_IRQMASK_RXFIFO_NEMPTY;
  159. }
  160. writel(IFI_CANFD_IRQMASK_SET_ERR |
  161. IFI_CANFD_IRQMASK_SET_TS |
  162. IFI_CANFD_IRQMASK_SET_TX |
  163. IFI_CANFD_IRQMASK_SET_RX | enirq,
  164. priv->base + IFI_CANFD_IRQMASK);
  165. }
  166. static void ifi_canfd_read_fifo(struct net_device *ndev)
  167. {
  168. struct net_device_stats *stats = &ndev->stats;
  169. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  170. struct canfd_frame *cf;
  171. struct sk_buff *skb;
  172. const u32 rx_irq_mask = IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY |
  173. IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY_PER;
  174. u32 rxdlc, rxid;
  175. u32 dlc, id;
  176. int i;
  177. rxdlc = readl(priv->base + IFI_CANFD_RXFIFO_DLC);
  178. if (rxdlc & IFI_CANFD_RXFIFO_DLC_EDL)
  179. skb = alloc_canfd_skb(ndev, &cf);
  180. else
  181. skb = alloc_can_skb(ndev, (struct can_frame **)&cf);
  182. if (!skb) {
  183. stats->rx_dropped++;
  184. return;
  185. }
  186. dlc = (rxdlc >> IFI_CANFD_RXFIFO_DLC_DLC_OFFSET) &
  187. IFI_CANFD_RXFIFO_DLC_DLC_MASK;
  188. if (rxdlc & IFI_CANFD_RXFIFO_DLC_EDL)
  189. cf->len = can_dlc2len(dlc);
  190. else
  191. cf->len = get_can_dlc(dlc);
  192. rxid = readl(priv->base + IFI_CANFD_RXFIFO_ID);
  193. id = (rxid >> IFI_CANFD_RXFIFO_ID_ID_OFFSET);
  194. if (id & IFI_CANFD_RXFIFO_ID_IDE) {
  195. id &= IFI_CANFD_RXFIFO_ID_ID_XTD_MASK;
  196. /*
  197. * In case the Extended ID frame is received, the standard
  198. * and extended part of the ID are swapped in the register,
  199. * so swap them back to obtain the correct ID.
  200. */
  201. id = (id >> IFI_CANFD_RXFIFO_ID_ID_XTD_OFFSET) |
  202. ((id & IFI_CANFD_RXFIFO_ID_ID_STD_MASK) <<
  203. IFI_CANFD_RXFIFO_ID_ID_XTD_WIDTH);
  204. id |= CAN_EFF_FLAG;
  205. } else {
  206. id &= IFI_CANFD_RXFIFO_ID_ID_STD_MASK;
  207. }
  208. cf->can_id = id;
  209. if (rxdlc & IFI_CANFD_RXFIFO_DLC_ESI) {
  210. cf->flags |= CANFD_ESI;
  211. netdev_dbg(ndev, "ESI Error\n");
  212. }
  213. if (!(rxdlc & IFI_CANFD_RXFIFO_DLC_EDL) &&
  214. (rxdlc & IFI_CANFD_RXFIFO_DLC_RTR)) {
  215. cf->can_id |= CAN_RTR_FLAG;
  216. } else {
  217. if (rxdlc & IFI_CANFD_RXFIFO_DLC_BRS)
  218. cf->flags |= CANFD_BRS;
  219. for (i = 0; i < cf->len; i += 4) {
  220. *(u32 *)(cf->data + i) =
  221. readl(priv->base + IFI_CANFD_RXFIFO_DATA + i);
  222. }
  223. }
  224. /* Remove the packet from FIFO */
  225. writel(IFI_CANFD_RXSTCMD_REMOVE_MSG, priv->base + IFI_CANFD_RXSTCMD);
  226. writel(rx_irq_mask, priv->base + IFI_CANFD_INTERRUPT);
  227. stats->rx_packets++;
  228. stats->rx_bytes += cf->len;
  229. netif_receive_skb(skb);
  230. }
  231. static int ifi_canfd_do_rx_poll(struct net_device *ndev, int quota)
  232. {
  233. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  234. u32 pkts = 0;
  235. u32 rxst;
  236. rxst = readl(priv->base + IFI_CANFD_RXSTCMD);
  237. if (rxst & IFI_CANFD_RXSTCMD_EMPTY) {
  238. netdev_dbg(ndev, "No messages in RX FIFO\n");
  239. return 0;
  240. }
  241. for (;;) {
  242. if (rxst & IFI_CANFD_RXSTCMD_EMPTY)
  243. break;
  244. if (quota <= 0)
  245. break;
  246. ifi_canfd_read_fifo(ndev);
  247. quota--;
  248. pkts++;
  249. rxst = readl(priv->base + IFI_CANFD_RXSTCMD);
  250. }
  251. if (pkts)
  252. can_led_event(ndev, CAN_LED_EVENT_RX);
  253. return pkts;
  254. }
  255. static int ifi_canfd_handle_lost_msg(struct net_device *ndev)
  256. {
  257. struct net_device_stats *stats = &ndev->stats;
  258. struct sk_buff *skb;
  259. struct can_frame *frame;
  260. netdev_err(ndev, "RX FIFO overflow, message(s) lost.\n");
  261. stats->rx_errors++;
  262. stats->rx_over_errors++;
  263. skb = alloc_can_err_skb(ndev, &frame);
  264. if (unlikely(!skb))
  265. return 0;
  266. frame->can_id |= CAN_ERR_CRTL;
  267. frame->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
  268. netif_receive_skb(skb);
  269. return 1;
  270. }
  271. static int ifi_canfd_get_berr_counter(const struct net_device *ndev,
  272. struct can_berr_counter *bec)
  273. {
  274. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  275. u32 err;
  276. err = readl(priv->base + IFI_CANFD_ERROR);
  277. bec->rxerr = (err >> IFI_CANFD_ERROR_RX_OFFSET) &
  278. IFI_CANFD_ERROR_RX_MASK;
  279. bec->txerr = (err >> IFI_CANFD_ERROR_TX_OFFSET) &
  280. IFI_CANFD_ERROR_TX_MASK;
  281. return 0;
  282. }
  283. static int ifi_canfd_handle_state_change(struct net_device *ndev,
  284. enum can_state new_state)
  285. {
  286. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  287. struct net_device_stats *stats = &ndev->stats;
  288. struct can_frame *cf;
  289. struct sk_buff *skb;
  290. struct can_berr_counter bec;
  291. switch (new_state) {
  292. case CAN_STATE_ERROR_ACTIVE:
  293. /* error warning state */
  294. priv->can.can_stats.error_warning++;
  295. priv->can.state = CAN_STATE_ERROR_WARNING;
  296. break;
  297. case CAN_STATE_ERROR_PASSIVE:
  298. /* error passive state */
  299. priv->can.can_stats.error_passive++;
  300. priv->can.state = CAN_STATE_ERROR_PASSIVE;
  301. break;
  302. case CAN_STATE_BUS_OFF:
  303. /* bus-off state */
  304. priv->can.state = CAN_STATE_BUS_OFF;
  305. ifi_canfd_irq_enable(ndev, 0);
  306. priv->can.can_stats.bus_off++;
  307. can_bus_off(ndev);
  308. break;
  309. default:
  310. break;
  311. }
  312. /* propagate the error condition to the CAN stack */
  313. skb = alloc_can_err_skb(ndev, &cf);
  314. if (unlikely(!skb))
  315. return 0;
  316. ifi_canfd_get_berr_counter(ndev, &bec);
  317. switch (new_state) {
  318. case CAN_STATE_ERROR_ACTIVE:
  319. /* error warning state */
  320. cf->can_id |= CAN_ERR_CRTL;
  321. cf->data[1] = (bec.txerr > bec.rxerr) ?
  322. CAN_ERR_CRTL_TX_WARNING :
  323. CAN_ERR_CRTL_RX_WARNING;
  324. cf->data[6] = bec.txerr;
  325. cf->data[7] = bec.rxerr;
  326. break;
  327. case CAN_STATE_ERROR_PASSIVE:
  328. /* error passive state */
  329. cf->can_id |= CAN_ERR_CRTL;
  330. cf->data[1] |= CAN_ERR_CRTL_RX_PASSIVE;
  331. if (bec.txerr > 127)
  332. cf->data[1] |= CAN_ERR_CRTL_TX_PASSIVE;
  333. cf->data[6] = bec.txerr;
  334. cf->data[7] = bec.rxerr;
  335. break;
  336. case CAN_STATE_BUS_OFF:
  337. /* bus-off state */
  338. cf->can_id |= CAN_ERR_BUSOFF;
  339. break;
  340. default:
  341. break;
  342. }
  343. stats->rx_packets++;
  344. stats->rx_bytes += cf->can_dlc;
  345. netif_receive_skb(skb);
  346. return 1;
  347. }
  348. static int ifi_canfd_handle_state_errors(struct net_device *ndev, u32 stcmd)
  349. {
  350. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  351. int work_done = 0;
  352. u32 isr;
  353. /*
  354. * The ErrWarn condition is a little special, since the bit is
  355. * located in the INTERRUPT register instead of STCMD register.
  356. */
  357. isr = readl(priv->base + IFI_CANFD_INTERRUPT);
  358. if ((isr & IFI_CANFD_INTERRUPT_ERROR_WARNING) &&
  359. (priv->can.state != CAN_STATE_ERROR_WARNING)) {
  360. /* Clear the interrupt */
  361. writel(IFI_CANFD_INTERRUPT_ERROR_WARNING,
  362. priv->base + IFI_CANFD_INTERRUPT);
  363. netdev_dbg(ndev, "Error, entered warning state\n");
  364. work_done += ifi_canfd_handle_state_change(ndev,
  365. CAN_STATE_ERROR_WARNING);
  366. }
  367. if ((stcmd & IFI_CANFD_STCMD_ERROR_PASSIVE) &&
  368. (priv->can.state != CAN_STATE_ERROR_PASSIVE)) {
  369. netdev_dbg(ndev, "Error, entered passive state\n");
  370. work_done += ifi_canfd_handle_state_change(ndev,
  371. CAN_STATE_ERROR_PASSIVE);
  372. }
  373. if ((stcmd & IFI_CANFD_STCMD_BUSOFF) &&
  374. (priv->can.state != CAN_STATE_BUS_OFF)) {
  375. netdev_dbg(ndev, "Error, entered bus-off state\n");
  376. work_done += ifi_canfd_handle_state_change(ndev,
  377. CAN_STATE_BUS_OFF);
  378. }
  379. return work_done;
  380. }
  381. static int ifi_canfd_poll(struct napi_struct *napi, int quota)
  382. {
  383. struct net_device *ndev = napi->dev;
  384. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  385. const u32 stcmd_state_mask = IFI_CANFD_STCMD_ERROR_PASSIVE |
  386. IFI_CANFD_STCMD_BUSOFF;
  387. int work_done = 0;
  388. u32 stcmd = readl(priv->base + IFI_CANFD_STCMD);
  389. u32 rxstcmd = readl(priv->base + IFI_CANFD_STCMD);
  390. /* Handle bus state changes */
  391. if ((stcmd & stcmd_state_mask) ||
  392. ((stcmd & IFI_CANFD_STCMD_ERROR_ACTIVE) == 0))
  393. work_done += ifi_canfd_handle_state_errors(ndev, stcmd);
  394. /* Handle lost messages on RX */
  395. if (rxstcmd & IFI_CANFD_RXSTCMD_OVERFLOW)
  396. work_done += ifi_canfd_handle_lost_msg(ndev);
  397. /* Handle normal messages on RX */
  398. if (!(rxstcmd & IFI_CANFD_RXSTCMD_EMPTY))
  399. work_done += ifi_canfd_do_rx_poll(ndev, quota - work_done);
  400. if (work_done < quota) {
  401. napi_complete(napi);
  402. ifi_canfd_irq_enable(ndev, 1);
  403. }
  404. return work_done;
  405. }
  406. static irqreturn_t ifi_canfd_isr(int irq, void *dev_id)
  407. {
  408. struct net_device *ndev = (struct net_device *)dev_id;
  409. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  410. struct net_device_stats *stats = &ndev->stats;
  411. const u32 rx_irq_mask = IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY |
  412. IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY_PER;
  413. const u32 tx_irq_mask = IFI_CANFD_INTERRUPT_TXFIFO_EMPTY |
  414. IFI_CANFD_INTERRUPT_TXFIFO_REMOVE;
  415. const u32 clr_irq_mask = ~(IFI_CANFD_INTERRUPT_SET_IRQ |
  416. IFI_CANFD_INTERRUPT_ERROR_WARNING);
  417. u32 isr;
  418. isr = readl(priv->base + IFI_CANFD_INTERRUPT);
  419. /* No interrupt */
  420. if (isr == 0)
  421. return IRQ_NONE;
  422. /* Clear all pending interrupts but ErrWarn */
  423. writel(clr_irq_mask, priv->base + IFI_CANFD_INTERRUPT);
  424. /* RX IRQ, start NAPI */
  425. if (isr & rx_irq_mask) {
  426. ifi_canfd_irq_enable(ndev, 0);
  427. napi_schedule(&priv->napi);
  428. }
  429. /* TX IRQ */
  430. if (isr & tx_irq_mask) {
  431. stats->tx_bytes += can_get_echo_skb(ndev, 0);
  432. stats->tx_packets++;
  433. can_led_event(ndev, CAN_LED_EVENT_TX);
  434. netif_wake_queue(ndev);
  435. }
  436. return IRQ_HANDLED;
  437. }
  438. static const struct can_bittiming_const ifi_canfd_bittiming_const = {
  439. .name = KBUILD_MODNAME,
  440. .tseg1_min = 1, /* Time segment 1 = prop_seg + phase_seg1 */
  441. .tseg1_max = 64,
  442. .tseg2_min = 2, /* Time segment 2 = phase_seg2 */
  443. .tseg2_max = 64,
  444. .sjw_max = 16,
  445. .brp_min = 2,
  446. .brp_max = 256,
  447. .brp_inc = 1,
  448. };
  449. static const struct can_bittiming_const ifi_canfd_data_bittiming_const = {
  450. .name = KBUILD_MODNAME,
  451. .tseg1_min = 1, /* Time segment 1 = prop_seg + phase_seg1 */
  452. .tseg1_max = 64,
  453. .tseg2_min = 2, /* Time segment 2 = phase_seg2 */
  454. .tseg2_max = 64,
  455. .sjw_max = 16,
  456. .brp_min = 2,
  457. .brp_max = 256,
  458. .brp_inc = 1,
  459. };
  460. static void ifi_canfd_set_bittiming(struct net_device *ndev)
  461. {
  462. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  463. const struct can_bittiming *bt = &priv->can.bittiming;
  464. const struct can_bittiming *dbt = &priv->can.data_bittiming;
  465. u16 brp, sjw, tseg1, tseg2;
  466. u32 noniso_arg = 0;
  467. u32 time_off;
  468. if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) &&
  469. !(priv->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO)) {
  470. time_off = IFI_CANFD_TIME_SJW_OFF_ISO;
  471. } else {
  472. noniso_arg = IFI_CANFD_TIME_SET_TIMEB_BOSCH |
  473. IFI_CANFD_TIME_SET_TIMEA_BOSCH |
  474. IFI_CANFD_TIME_SET_PRESC_BOSCH |
  475. IFI_CANFD_TIME_SET_SJW_BOSCH;
  476. time_off = IFI_CANFD_TIME_SJW_OFF_BOSCH;
  477. }
  478. /* Configure bit timing */
  479. brp = bt->brp - 2;
  480. sjw = bt->sjw - 1;
  481. tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
  482. tseg2 = bt->phase_seg2 - 2;
  483. writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) |
  484. (tseg1 << IFI_CANFD_TIME_TIMEA_OFF) |
  485. (brp << IFI_CANFD_TIME_PRESCALE_OFF) |
  486. (sjw << time_off) |
  487. noniso_arg,
  488. priv->base + IFI_CANFD_TIME);
  489. /* Configure data bit timing */
  490. brp = dbt->brp - 2;
  491. sjw = dbt->sjw - 1;
  492. tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1;
  493. tseg2 = dbt->phase_seg2 - 2;
  494. writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) |
  495. (tseg1 << IFI_CANFD_TIME_TIMEA_OFF) |
  496. (brp << IFI_CANFD_TIME_PRESCALE_OFF) |
  497. (sjw << time_off) |
  498. noniso_arg,
  499. priv->base + IFI_CANFD_FTIME);
  500. }
  501. static void ifi_canfd_set_filter(struct net_device *ndev, const u32 id,
  502. const u32 mask, const u32 ident)
  503. {
  504. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  505. writel(mask, priv->base + IFI_CANFD_FILTER_MASK(id));
  506. writel(ident, priv->base + IFI_CANFD_FILTER_IDENT(id));
  507. }
  508. static void ifi_canfd_set_filters(struct net_device *ndev)
  509. {
  510. /* Receive all CAN frames (standard ID) */
  511. ifi_canfd_set_filter(ndev, 0,
  512. IFI_CANFD_FILTER_MASK_VALID |
  513. IFI_CANFD_FILTER_MASK_EXT,
  514. IFI_CANFD_FILTER_IDENT_VALID);
  515. /* Receive all CAN frames (extended ID) */
  516. ifi_canfd_set_filter(ndev, 1,
  517. IFI_CANFD_FILTER_MASK_VALID |
  518. IFI_CANFD_FILTER_MASK_EXT,
  519. IFI_CANFD_FILTER_IDENT_VALID |
  520. IFI_CANFD_FILTER_IDENT_IDE);
  521. /* Receive all CANFD frames */
  522. ifi_canfd_set_filter(ndev, 2,
  523. IFI_CANFD_FILTER_MASK_VALID |
  524. IFI_CANFD_FILTER_MASK_EDL |
  525. IFI_CANFD_FILTER_MASK_EXT,
  526. IFI_CANFD_FILTER_IDENT_VALID |
  527. IFI_CANFD_FILTER_IDENT_CANFD |
  528. IFI_CANFD_FILTER_IDENT_IDE);
  529. }
  530. static void ifi_canfd_start(struct net_device *ndev)
  531. {
  532. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  533. u32 stcmd;
  534. /* Reset the IP */
  535. writel(IFI_CANFD_STCMD_HARDRESET, priv->base + IFI_CANFD_STCMD);
  536. writel(0, priv->base + IFI_CANFD_STCMD);
  537. ifi_canfd_set_bittiming(ndev);
  538. ifi_canfd_set_filters(ndev);
  539. /* Reset FIFOs */
  540. writel(IFI_CANFD_RXSTCMD_RESET, priv->base + IFI_CANFD_RXSTCMD);
  541. writel(0, priv->base + IFI_CANFD_RXSTCMD);
  542. writel(IFI_CANFD_TXSTCMD_RESET, priv->base + IFI_CANFD_TXSTCMD);
  543. writel(0, priv->base + IFI_CANFD_TXSTCMD);
  544. /* Repeat transmission until successful */
  545. writel(0, priv->base + IFI_CANFD_REPEAT);
  546. writel(0, priv->base + IFI_CANFD_SUSPEND);
  547. /* Clear all pending interrupts */
  548. writel((u32)(~IFI_CANFD_INTERRUPT_SET_IRQ),
  549. priv->base + IFI_CANFD_INTERRUPT);
  550. stcmd = IFI_CANFD_STCMD_ENABLE | IFI_CANFD_STCMD_NORMAL_MODE;
  551. if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
  552. stcmd |= IFI_CANFD_STCMD_BUSMONITOR;
  553. if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)
  554. stcmd |= IFI_CANFD_STCMD_LOOPBACK;
  555. if (priv->can.ctrlmode & CAN_CTRLMODE_FD)
  556. stcmd |= IFI_CANFD_STCMD_ENABLE_ISO;
  557. if (!(priv->can.ctrlmode & (CAN_CTRLMODE_FD | CAN_CTRLMODE_FD_NON_ISO)))
  558. stcmd |= IFI_CANFD_STCMD_DISABLE_CANFD;
  559. priv->can.state = CAN_STATE_ERROR_ACTIVE;
  560. ifi_canfd_irq_enable(ndev, 1);
  561. /* Enable controller */
  562. writel(stcmd, priv->base + IFI_CANFD_STCMD);
  563. }
  564. static void ifi_canfd_stop(struct net_device *ndev)
  565. {
  566. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  567. /* Reset the IP */
  568. writel(IFI_CANFD_STCMD_HARDRESET, priv->base + IFI_CANFD_STCMD);
  569. /* Mask all interrupts */
  570. writel(~0, priv->base + IFI_CANFD_IRQMASK);
  571. /* Clear all pending interrupts */
  572. writel((u32)(~IFI_CANFD_INTERRUPT_SET_IRQ),
  573. priv->base + IFI_CANFD_INTERRUPT);
  574. /* Set the state as STOPPED */
  575. priv->can.state = CAN_STATE_STOPPED;
  576. }
  577. static int ifi_canfd_set_mode(struct net_device *ndev, enum can_mode mode)
  578. {
  579. switch (mode) {
  580. case CAN_MODE_START:
  581. ifi_canfd_start(ndev);
  582. netif_wake_queue(ndev);
  583. break;
  584. default:
  585. return -EOPNOTSUPP;
  586. }
  587. return 0;
  588. }
  589. static int ifi_canfd_open(struct net_device *ndev)
  590. {
  591. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  592. int ret;
  593. ret = open_candev(ndev);
  594. if (ret) {
  595. netdev_err(ndev, "Failed to open CAN device\n");
  596. return ret;
  597. }
  598. /* Register interrupt handler */
  599. ret = request_irq(ndev->irq, ifi_canfd_isr, IRQF_SHARED,
  600. ndev->name, ndev);
  601. if (ret < 0) {
  602. netdev_err(ndev, "Failed to request interrupt\n");
  603. goto err_irq;
  604. }
  605. ifi_canfd_start(ndev);
  606. can_led_event(ndev, CAN_LED_EVENT_OPEN);
  607. napi_enable(&priv->napi);
  608. netif_start_queue(ndev);
  609. return 0;
  610. err_irq:
  611. close_candev(ndev);
  612. return ret;
  613. }
  614. static int ifi_canfd_close(struct net_device *ndev)
  615. {
  616. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  617. netif_stop_queue(ndev);
  618. napi_disable(&priv->napi);
  619. ifi_canfd_stop(ndev);
  620. free_irq(ndev->irq, ndev);
  621. close_candev(ndev);
  622. can_led_event(ndev, CAN_LED_EVENT_STOP);
  623. return 0;
  624. }
  625. static netdev_tx_t ifi_canfd_start_xmit(struct sk_buff *skb,
  626. struct net_device *ndev)
  627. {
  628. struct ifi_canfd_priv *priv = netdev_priv(ndev);
  629. struct canfd_frame *cf = (struct canfd_frame *)skb->data;
  630. u32 txst, txid, txdlc;
  631. int i;
  632. if (can_dropped_invalid_skb(ndev, skb))
  633. return NETDEV_TX_OK;
  634. /* Check if the TX buffer is full */
  635. txst = readl(priv->base + IFI_CANFD_TXSTCMD);
  636. if (txst & IFI_CANFD_TXSTCMD_FULL) {
  637. netif_stop_queue(ndev);
  638. netdev_err(ndev, "BUG! TX FIFO full when queue awake!\n");
  639. return NETDEV_TX_BUSY;
  640. }
  641. netif_stop_queue(ndev);
  642. if (cf->can_id & CAN_EFF_FLAG) {
  643. txid = cf->can_id & CAN_EFF_MASK;
  644. /*
  645. * In case the Extended ID frame is transmitted, the
  646. * standard and extended part of the ID are swapped
  647. * in the register, so swap them back to send the
  648. * correct ID.
  649. */
  650. txid = (txid >> IFI_CANFD_TXFIFO_ID_ID_XTD_WIDTH) |
  651. ((txid & IFI_CANFD_TXFIFO_ID_ID_XTD_MASK) <<
  652. IFI_CANFD_TXFIFO_ID_ID_XTD_OFFSET);
  653. txid |= IFI_CANFD_TXFIFO_ID_IDE;
  654. } else {
  655. txid = cf->can_id & CAN_SFF_MASK;
  656. }
  657. txdlc = can_len2dlc(cf->len);
  658. if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) && can_is_canfd_skb(skb)) {
  659. txdlc |= IFI_CANFD_TXFIFO_DLC_EDL;
  660. if (cf->flags & CANFD_BRS)
  661. txdlc |= IFI_CANFD_TXFIFO_DLC_BRS;
  662. }
  663. if (cf->can_id & CAN_RTR_FLAG)
  664. txdlc |= IFI_CANFD_TXFIFO_DLC_RTR;
  665. /* message ram configuration */
  666. writel(txid, priv->base + IFI_CANFD_TXFIFO_ID);
  667. writel(txdlc, priv->base + IFI_CANFD_TXFIFO_DLC);
  668. for (i = 0; i < cf->len; i += 4) {
  669. writel(*(u32 *)(cf->data + i),
  670. priv->base + IFI_CANFD_TXFIFO_DATA + i);
  671. }
  672. writel(0, priv->base + IFI_CANFD_TXFIFO_REPEATCOUNT);
  673. writel(0, priv->base + IFI_CANFD_TXFIFO_SUSPEND_US);
  674. can_put_echo_skb(skb, ndev, 0);
  675. /* Start the transmission */
  676. writel(IFI_CANFD_TXSTCMD_ADD_MSG, priv->base + IFI_CANFD_TXSTCMD);
  677. return NETDEV_TX_OK;
  678. }
  679. static const struct net_device_ops ifi_canfd_netdev_ops = {
  680. .ndo_open = ifi_canfd_open,
  681. .ndo_stop = ifi_canfd_close,
  682. .ndo_start_xmit = ifi_canfd_start_xmit,
  683. .ndo_change_mtu = can_change_mtu,
  684. };
  685. static int ifi_canfd_plat_probe(struct platform_device *pdev)
  686. {
  687. struct device *dev = &pdev->dev;
  688. struct net_device *ndev;
  689. struct ifi_canfd_priv *priv;
  690. struct resource *res;
  691. void __iomem *addr;
  692. int irq, ret;
  693. u32 id;
  694. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  695. addr = devm_ioremap_resource(dev, res);
  696. irq = platform_get_irq(pdev, 0);
  697. if (IS_ERR(addr) || irq < 0)
  698. return -EINVAL;
  699. id = readl(addr + IFI_CANFD_IP_ID);
  700. if (id != IFI_CANFD_IP_ID_VALUE) {
  701. dev_err(dev, "This block is not IFI CANFD, id=%08x\n", id);
  702. return -EINVAL;
  703. }
  704. ndev = alloc_candev(sizeof(*priv), 1);
  705. if (!ndev)
  706. return -ENOMEM;
  707. ndev->irq = irq;
  708. ndev->flags |= IFF_ECHO; /* we support local echo */
  709. ndev->netdev_ops = &ifi_canfd_netdev_ops;
  710. priv = netdev_priv(ndev);
  711. priv->ndev = ndev;
  712. priv->base = addr;
  713. netif_napi_add(ndev, &priv->napi, ifi_canfd_poll, 64);
  714. priv->can.state = CAN_STATE_STOPPED;
  715. priv->can.clock.freq = readl(addr + IFI_CANFD_CANCLOCK);
  716. priv->can.bittiming_const = &ifi_canfd_bittiming_const;
  717. priv->can.data_bittiming_const = &ifi_canfd_data_bittiming_const;
  718. priv->can.do_set_mode = ifi_canfd_set_mode;
  719. priv->can.do_get_berr_counter = ifi_canfd_get_berr_counter;
  720. /* IFI CANFD can do both Bosch FD and ISO FD */
  721. priv->can.ctrlmode = CAN_CTRLMODE_FD;
  722. /* IFI CANFD can do both Bosch FD and ISO FD */
  723. priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
  724. CAN_CTRLMODE_LISTENONLY |
  725. CAN_CTRLMODE_FD |
  726. CAN_CTRLMODE_FD_NON_ISO;
  727. platform_set_drvdata(pdev, ndev);
  728. SET_NETDEV_DEV(ndev, dev);
  729. ret = register_candev(ndev);
  730. if (ret) {
  731. dev_err(dev, "Failed to register (ret=%d)\n", ret);
  732. goto err_reg;
  733. }
  734. devm_can_led_init(ndev);
  735. dev_info(dev, "Driver registered: regs=%p, irq=%d, clock=%d\n",
  736. priv->base, ndev->irq, priv->can.clock.freq);
  737. return 0;
  738. err_reg:
  739. free_candev(ndev);
  740. return ret;
  741. }
  742. static int ifi_canfd_plat_remove(struct platform_device *pdev)
  743. {
  744. struct net_device *ndev = platform_get_drvdata(pdev);
  745. unregister_candev(ndev);
  746. platform_set_drvdata(pdev, NULL);
  747. free_candev(ndev);
  748. return 0;
  749. }
  750. static const struct of_device_id ifi_canfd_of_table[] = {
  751. { .compatible = "ifi,canfd-1.0", .data = NULL },
  752. { /* sentinel */ },
  753. };
  754. MODULE_DEVICE_TABLE(of, ifi_canfd_of_table);
  755. static struct platform_driver ifi_canfd_plat_driver = {
  756. .driver = {
  757. .name = KBUILD_MODNAME,
  758. .of_match_table = ifi_canfd_of_table,
  759. },
  760. .probe = ifi_canfd_plat_probe,
  761. .remove = ifi_canfd_plat_remove,
  762. };
  763. module_platform_driver(ifi_canfd_plat_driver);
  764. MODULE_AUTHOR("Marek Vasut <marex@denx.de>");
  765. MODULE_LICENSE("GPL v2");
  766. MODULE_DESCRIPTION("CAN bus driver for IFI CANFD controller");