mcp251xfd-ring.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // mcp251xfd - Microchip MCP251xFD Family CAN controller driver
  4. //
  5. // Copyright (c) 2019, 2020, 2021 Pengutronix,
  6. // Marc Kleine-Budde <[email protected]>
  7. //
  8. // Based on:
  9. //
  10. // CAN bus driver for Microchip 25XXFD CAN Controller with SPI Interface
  11. //
  12. // Copyright (c) 2019 Martin Sperl <[email protected]>
  13. //
  14. #include <asm/unaligned.h>
  15. #include "mcp251xfd.h"
  16. #include "mcp251xfd-ram.h"
  17. static inline u8
  18. mcp251xfd_cmd_prepare_write_reg(const struct mcp251xfd_priv *priv,
  19. union mcp251xfd_write_reg_buf *write_reg_buf,
  20. const u16 reg, const u32 mask, const u32 val)
  21. {
  22. u8 first_byte, last_byte, len;
  23. u8 *data;
  24. __le32 val_le32;
  25. first_byte = mcp251xfd_first_byte_set(mask);
  26. last_byte = mcp251xfd_last_byte_set(mask);
  27. len = last_byte - first_byte + 1;
  28. data = mcp251xfd_spi_cmd_write(priv, write_reg_buf, reg + first_byte);
  29. val_le32 = cpu_to_le32(val >> BITS_PER_BYTE * first_byte);
  30. memcpy(data, &val_le32, len);
  31. if (priv->devtype_data.quirks & MCP251XFD_QUIRK_CRC_REG) {
  32. u16 crc;
  33. mcp251xfd_spi_cmd_crc_set_len_in_reg(&write_reg_buf->crc.cmd,
  34. len);
  35. /* CRC */
  36. len += sizeof(write_reg_buf->crc.cmd);
  37. crc = mcp251xfd_crc16_compute(&write_reg_buf->crc, len);
  38. put_unaligned_be16(crc, (void *)write_reg_buf + len);
  39. /* Total length */
  40. len += sizeof(write_reg_buf->crc.crc);
  41. } else {
  42. len += sizeof(write_reg_buf->nocrc.cmd);
  43. }
  44. return len;
  45. }
  46. static void
  47. mcp251xfd_ring_init_tef(struct mcp251xfd_priv *priv, u16 *base)
  48. {
  49. struct mcp251xfd_tef_ring *tef_ring;
  50. struct spi_transfer *xfer;
  51. u32 val;
  52. u16 addr;
  53. u8 len;
  54. int i;
  55. /* TEF */
  56. tef_ring = priv->tef;
  57. tef_ring->head = 0;
  58. tef_ring->tail = 0;
  59. /* TEF- and TX-FIFO have same number of objects */
  60. *base = mcp251xfd_get_tef_obj_addr(priv->tx->obj_num);
  61. /* FIFO IRQ enable */
  62. addr = MCP251XFD_REG_TEFCON;
  63. val = MCP251XFD_REG_TEFCON_TEFOVIE | MCP251XFD_REG_TEFCON_TEFNEIE;
  64. len = mcp251xfd_cmd_prepare_write_reg(priv, &tef_ring->irq_enable_buf,
  65. addr, val, val);
  66. tef_ring->irq_enable_xfer.tx_buf = &tef_ring->irq_enable_buf;
  67. tef_ring->irq_enable_xfer.len = len;
  68. spi_message_init_with_transfers(&tef_ring->irq_enable_msg,
  69. &tef_ring->irq_enable_xfer, 1);
  70. /* FIFO increment TEF tail pointer */
  71. addr = MCP251XFD_REG_TEFCON;
  72. val = MCP251XFD_REG_TEFCON_UINC;
  73. len = mcp251xfd_cmd_prepare_write_reg(priv, &tef_ring->uinc_buf,
  74. addr, val, val);
  75. for (i = 0; i < ARRAY_SIZE(tef_ring->uinc_xfer); i++) {
  76. xfer = &tef_ring->uinc_xfer[i];
  77. xfer->tx_buf = &tef_ring->uinc_buf;
  78. xfer->len = len;
  79. xfer->cs_change = 1;
  80. xfer->cs_change_delay.value = 0;
  81. xfer->cs_change_delay.unit = SPI_DELAY_UNIT_NSECS;
  82. }
  83. /* "cs_change == 1" on the last transfer results in an active
  84. * chip select after the complete SPI message. This causes the
  85. * controller to interpret the next register access as
  86. * data. Set "cs_change" of the last transfer to "0" to
  87. * properly deactivate the chip select at the end of the
  88. * message.
  89. */
  90. xfer->cs_change = 0;
  91. if (priv->tx_coalesce_usecs_irq || priv->tx_obj_num_coalesce_irq) {
  92. val = MCP251XFD_REG_TEFCON_UINC |
  93. MCP251XFD_REG_TEFCON_TEFOVIE |
  94. MCP251XFD_REG_TEFCON_TEFHIE;
  95. len = mcp251xfd_cmd_prepare_write_reg(priv,
  96. &tef_ring->uinc_irq_disable_buf,
  97. addr, val, val);
  98. xfer->tx_buf = &tef_ring->uinc_irq_disable_buf;
  99. xfer->len = len;
  100. }
  101. }
  102. static void
  103. mcp251xfd_tx_ring_init_tx_obj(const struct mcp251xfd_priv *priv,
  104. const struct mcp251xfd_tx_ring *ring,
  105. struct mcp251xfd_tx_obj *tx_obj,
  106. const u8 rts_buf_len,
  107. const u8 n)
  108. {
  109. struct spi_transfer *xfer;
  110. u16 addr;
  111. /* FIFO load */
  112. addr = mcp251xfd_get_tx_obj_addr(ring, n);
  113. if (priv->devtype_data.quirks & MCP251XFD_QUIRK_CRC_TX)
  114. mcp251xfd_spi_cmd_write_crc_set_addr(&tx_obj->buf.crc.cmd,
  115. addr);
  116. else
  117. mcp251xfd_spi_cmd_write_nocrc(&tx_obj->buf.nocrc.cmd,
  118. addr);
  119. xfer = &tx_obj->xfer[0];
  120. xfer->tx_buf = &tx_obj->buf;
  121. xfer->len = 0; /* actual len is assigned on the fly */
  122. xfer->cs_change = 1;
  123. xfer->cs_change_delay.value = 0;
  124. xfer->cs_change_delay.unit = SPI_DELAY_UNIT_NSECS;
  125. /* FIFO request to send */
  126. xfer = &tx_obj->xfer[1];
  127. xfer->tx_buf = &ring->rts_buf;
  128. xfer->len = rts_buf_len;
  129. /* SPI message */
  130. spi_message_init_with_transfers(&tx_obj->msg, tx_obj->xfer,
  131. ARRAY_SIZE(tx_obj->xfer));
  132. }
  133. static void
  134. mcp251xfd_ring_init_tx(struct mcp251xfd_priv *priv, u16 *base, u8 *fifo_nr)
  135. {
  136. struct mcp251xfd_tx_ring *tx_ring;
  137. struct mcp251xfd_tx_obj *tx_obj;
  138. u32 val;
  139. u16 addr;
  140. u8 len;
  141. int i;
  142. tx_ring = priv->tx;
  143. tx_ring->head = 0;
  144. tx_ring->tail = 0;
  145. tx_ring->base = *base;
  146. tx_ring->nr = 0;
  147. tx_ring->fifo_nr = *fifo_nr;
  148. *base = mcp251xfd_get_tx_obj_addr(tx_ring, tx_ring->obj_num);
  149. *fifo_nr += 1;
  150. /* FIFO request to send */
  151. addr = MCP251XFD_REG_FIFOCON(tx_ring->fifo_nr);
  152. val = MCP251XFD_REG_FIFOCON_TXREQ | MCP251XFD_REG_FIFOCON_UINC;
  153. len = mcp251xfd_cmd_prepare_write_reg(priv, &tx_ring->rts_buf,
  154. addr, val, val);
  155. mcp251xfd_for_each_tx_obj(tx_ring, tx_obj, i)
  156. mcp251xfd_tx_ring_init_tx_obj(priv, tx_ring, tx_obj, len, i);
  157. }
  158. static void
  159. mcp251xfd_ring_init_rx(struct mcp251xfd_priv *priv, u16 *base, u8 *fifo_nr)
  160. {
  161. struct mcp251xfd_rx_ring *rx_ring;
  162. struct spi_transfer *xfer;
  163. u32 val;
  164. u16 addr;
  165. u8 len;
  166. int i, j;
  167. mcp251xfd_for_each_rx_ring(priv, rx_ring, i) {
  168. rx_ring->head = 0;
  169. rx_ring->tail = 0;
  170. rx_ring->base = *base;
  171. rx_ring->nr = i;
  172. rx_ring->fifo_nr = *fifo_nr;
  173. *base = mcp251xfd_get_rx_obj_addr(rx_ring, rx_ring->obj_num);
  174. *fifo_nr += 1;
  175. /* FIFO IRQ enable */
  176. addr = MCP251XFD_REG_FIFOCON(rx_ring->fifo_nr);
  177. val = MCP251XFD_REG_FIFOCON_RXOVIE |
  178. MCP251XFD_REG_FIFOCON_TFNRFNIE;
  179. len = mcp251xfd_cmd_prepare_write_reg(priv, &rx_ring->irq_enable_buf,
  180. addr, val, val);
  181. rx_ring->irq_enable_xfer.tx_buf = &rx_ring->irq_enable_buf;
  182. rx_ring->irq_enable_xfer.len = len;
  183. spi_message_init_with_transfers(&rx_ring->irq_enable_msg,
  184. &rx_ring->irq_enable_xfer, 1);
  185. /* FIFO increment RX tail pointer */
  186. val = MCP251XFD_REG_FIFOCON_UINC;
  187. len = mcp251xfd_cmd_prepare_write_reg(priv, &rx_ring->uinc_buf,
  188. addr, val, val);
  189. for (j = 0; j < ARRAY_SIZE(rx_ring->uinc_xfer); j++) {
  190. xfer = &rx_ring->uinc_xfer[j];
  191. xfer->tx_buf = &rx_ring->uinc_buf;
  192. xfer->len = len;
  193. xfer->cs_change = 1;
  194. xfer->cs_change_delay.value = 0;
  195. xfer->cs_change_delay.unit = SPI_DELAY_UNIT_NSECS;
  196. }
  197. /* "cs_change == 1" on the last transfer results in an
  198. * active chip select after the complete SPI
  199. * message. This causes the controller to interpret
  200. * the next register access as data. Set "cs_change"
  201. * of the last transfer to "0" to properly deactivate
  202. * the chip select at the end of the message.
  203. */
  204. xfer->cs_change = 0;
  205. /* Use 1st RX-FIFO for IRQ coalescing. If enabled
  206. * (rx_coalesce_usecs_irq or rx_max_coalesce_frames_irq
  207. * is activated), use the last transfer to disable:
  208. *
  209. * - TFNRFNIE (Receive FIFO Not Empty Interrupt)
  210. *
  211. * and enable:
  212. *
  213. * - TFHRFHIE (Receive FIFO Half Full Interrupt)
  214. * - or -
  215. * - TFERFFIE (Receive FIFO Full Interrupt)
  216. *
  217. * depending on rx_max_coalesce_frames_irq.
  218. *
  219. * The RXOVIE (Overflow Interrupt) is always enabled.
  220. */
  221. if (rx_ring->nr == 0 && (priv->rx_coalesce_usecs_irq ||
  222. priv->rx_obj_num_coalesce_irq)) {
  223. val = MCP251XFD_REG_FIFOCON_UINC |
  224. MCP251XFD_REG_FIFOCON_RXOVIE;
  225. if (priv->rx_obj_num_coalesce_irq == rx_ring->obj_num)
  226. val |= MCP251XFD_REG_FIFOCON_TFERFFIE;
  227. else if (priv->rx_obj_num_coalesce_irq)
  228. val |= MCP251XFD_REG_FIFOCON_TFHRFHIE;
  229. len = mcp251xfd_cmd_prepare_write_reg(priv,
  230. &rx_ring->uinc_irq_disable_buf,
  231. addr, val, val);
  232. xfer->tx_buf = &rx_ring->uinc_irq_disable_buf;
  233. xfer->len = len;
  234. }
  235. }
  236. }
  237. int mcp251xfd_ring_init(struct mcp251xfd_priv *priv)
  238. {
  239. const struct mcp251xfd_rx_ring *rx_ring;
  240. u16 base = 0, ram_used;
  241. u8 fifo_nr = 1;
  242. int i;
  243. netdev_reset_queue(priv->ndev);
  244. mcp251xfd_ring_init_tef(priv, &base);
  245. mcp251xfd_ring_init_rx(priv, &base, &fifo_nr);
  246. mcp251xfd_ring_init_tx(priv, &base, &fifo_nr);
  247. /* mcp251xfd_handle_rxif() will iterate over all RX rings.
  248. * Rings with their corresponding bit set in
  249. * priv->regs_status.rxif are read out.
  250. *
  251. * If the chip is configured for only 1 RX-FIFO, and if there
  252. * is an RX interrupt pending (RXIF in INT register is set),
  253. * it must be the 1st RX-FIFO.
  254. *
  255. * We mark the RXIF of the 1st FIFO as pending here, so that
  256. * we can skip the read of the RXIF register in
  257. * mcp251xfd_read_regs_status() for the 1 RX-FIFO only case.
  258. *
  259. * If we use more than 1 RX-FIFO, this value gets overwritten
  260. * in mcp251xfd_read_regs_status(), so set it unconditionally
  261. * here.
  262. */
  263. priv->regs_status.rxif = BIT(priv->rx[0]->fifo_nr);
  264. if (priv->tx_obj_num_coalesce_irq) {
  265. netdev_dbg(priv->ndev,
  266. "FIFO setup: TEF: 0x%03x: %2d*%zu bytes = %4zu bytes (coalesce)\n",
  267. mcp251xfd_get_tef_obj_addr(0),
  268. priv->tx_obj_num_coalesce_irq,
  269. sizeof(struct mcp251xfd_hw_tef_obj),
  270. priv->tx_obj_num_coalesce_irq *
  271. sizeof(struct mcp251xfd_hw_tef_obj));
  272. netdev_dbg(priv->ndev,
  273. " 0x%03x: %2d*%zu bytes = %4zu bytes\n",
  274. mcp251xfd_get_tef_obj_addr(priv->tx_obj_num_coalesce_irq),
  275. priv->tx->obj_num - priv->tx_obj_num_coalesce_irq,
  276. sizeof(struct mcp251xfd_hw_tef_obj),
  277. (priv->tx->obj_num - priv->tx_obj_num_coalesce_irq) *
  278. sizeof(struct mcp251xfd_hw_tef_obj));
  279. } else {
  280. netdev_dbg(priv->ndev,
  281. "FIFO setup: TEF: 0x%03x: %2d*%zu bytes = %4zu bytes\n",
  282. mcp251xfd_get_tef_obj_addr(0),
  283. priv->tx->obj_num, sizeof(struct mcp251xfd_hw_tef_obj),
  284. priv->tx->obj_num * sizeof(struct mcp251xfd_hw_tef_obj));
  285. }
  286. mcp251xfd_for_each_rx_ring(priv, rx_ring, i) {
  287. if (rx_ring->nr == 0 && priv->rx_obj_num_coalesce_irq) {
  288. netdev_dbg(priv->ndev,
  289. "FIFO setup: RX-%u: FIFO %u/0x%03x: %2u*%u bytes = %4u bytes (coalesce)\n",
  290. rx_ring->nr, rx_ring->fifo_nr,
  291. mcp251xfd_get_rx_obj_addr(rx_ring, 0),
  292. priv->rx_obj_num_coalesce_irq, rx_ring->obj_size,
  293. priv->rx_obj_num_coalesce_irq * rx_ring->obj_size);
  294. if (priv->rx_obj_num_coalesce_irq == MCP251XFD_FIFO_DEPTH)
  295. continue;
  296. netdev_dbg(priv->ndev,
  297. " 0x%03x: %2u*%u bytes = %4u bytes\n",
  298. mcp251xfd_get_rx_obj_addr(rx_ring,
  299. priv->rx_obj_num_coalesce_irq),
  300. rx_ring->obj_num - priv->rx_obj_num_coalesce_irq,
  301. rx_ring->obj_size,
  302. (rx_ring->obj_num - priv->rx_obj_num_coalesce_irq) *
  303. rx_ring->obj_size);
  304. } else {
  305. netdev_dbg(priv->ndev,
  306. "FIFO setup: RX-%u: FIFO %u/0x%03x: %2u*%u bytes = %4u bytes\n",
  307. rx_ring->nr, rx_ring->fifo_nr,
  308. mcp251xfd_get_rx_obj_addr(rx_ring, 0),
  309. rx_ring->obj_num, rx_ring->obj_size,
  310. rx_ring->obj_num * rx_ring->obj_size);
  311. }
  312. }
  313. netdev_dbg(priv->ndev,
  314. "FIFO setup: TX: FIFO %u/0x%03x: %2u*%u bytes = %4u bytes\n",
  315. priv->tx->fifo_nr,
  316. mcp251xfd_get_tx_obj_addr(priv->tx, 0),
  317. priv->tx->obj_num, priv->tx->obj_size,
  318. priv->tx->obj_num * priv->tx->obj_size);
  319. netdev_dbg(priv->ndev,
  320. "FIFO setup: free: %4d bytes\n",
  321. MCP251XFD_RAM_SIZE - (base - MCP251XFD_RAM_START));
  322. ram_used = base - MCP251XFD_RAM_START;
  323. if (ram_used > MCP251XFD_RAM_SIZE) {
  324. netdev_err(priv->ndev,
  325. "Error during ring configuration, using more RAM (%u bytes) than available (%u bytes).\n",
  326. ram_used, MCP251XFD_RAM_SIZE);
  327. return -ENOMEM;
  328. }
  329. return 0;
  330. }
  331. void mcp251xfd_ring_free(struct mcp251xfd_priv *priv)
  332. {
  333. int i;
  334. for (i = ARRAY_SIZE(priv->rx) - 1; i >= 0; i--) {
  335. kfree(priv->rx[i]);
  336. priv->rx[i] = NULL;
  337. }
  338. }
  339. static enum hrtimer_restart mcp251xfd_rx_irq_timer(struct hrtimer *t)
  340. {
  341. struct mcp251xfd_priv *priv = container_of(t, struct mcp251xfd_priv,
  342. rx_irq_timer);
  343. struct mcp251xfd_rx_ring *ring = priv->rx[0];
  344. if (test_bit(MCP251XFD_FLAGS_DOWN, priv->flags))
  345. return HRTIMER_NORESTART;
  346. spi_async(priv->spi, &ring->irq_enable_msg);
  347. return HRTIMER_NORESTART;
  348. }
  349. static enum hrtimer_restart mcp251xfd_tx_irq_timer(struct hrtimer *t)
  350. {
  351. struct mcp251xfd_priv *priv = container_of(t, struct mcp251xfd_priv,
  352. tx_irq_timer);
  353. struct mcp251xfd_tef_ring *ring = priv->tef;
  354. if (test_bit(MCP251XFD_FLAGS_DOWN, priv->flags))
  355. return HRTIMER_NORESTART;
  356. spi_async(priv->spi, &ring->irq_enable_msg);
  357. return HRTIMER_NORESTART;
  358. }
  359. const struct can_ram_config mcp251xfd_ram_config = {
  360. .rx = {
  361. .size[CAN_RAM_MODE_CAN] = sizeof(struct mcp251xfd_hw_rx_obj_can),
  362. .size[CAN_RAM_MODE_CANFD] = sizeof(struct mcp251xfd_hw_rx_obj_canfd),
  363. .min = MCP251XFD_RX_OBJ_NUM_MIN,
  364. .max = MCP251XFD_RX_OBJ_NUM_MAX,
  365. .def[CAN_RAM_MODE_CAN] = CAN_RAM_NUM_MAX,
  366. .def[CAN_RAM_MODE_CANFD] = CAN_RAM_NUM_MAX,
  367. .fifo_num = MCP251XFD_FIFO_RX_NUM,
  368. .fifo_depth_min = MCP251XFD_RX_FIFO_DEPTH_MIN,
  369. .fifo_depth_coalesce_min = MCP251XFD_RX_FIFO_DEPTH_COALESCE_MIN,
  370. },
  371. .tx = {
  372. .size[CAN_RAM_MODE_CAN] = sizeof(struct mcp251xfd_hw_tef_obj) +
  373. sizeof(struct mcp251xfd_hw_tx_obj_can),
  374. .size[CAN_RAM_MODE_CANFD] = sizeof(struct mcp251xfd_hw_tef_obj) +
  375. sizeof(struct mcp251xfd_hw_tx_obj_canfd),
  376. .min = MCP251XFD_TX_OBJ_NUM_MIN,
  377. .max = MCP251XFD_TX_OBJ_NUM_MAX,
  378. .def[CAN_RAM_MODE_CAN] = MCP251XFD_TX_OBJ_NUM_CAN_DEFAULT,
  379. .def[CAN_RAM_MODE_CANFD] = MCP251XFD_TX_OBJ_NUM_CANFD_DEFAULT,
  380. .fifo_num = MCP251XFD_FIFO_TX_NUM,
  381. .fifo_depth_min = MCP251XFD_TX_FIFO_DEPTH_MIN,
  382. .fifo_depth_coalesce_min = MCP251XFD_TX_FIFO_DEPTH_COALESCE_MIN,
  383. },
  384. .size = MCP251XFD_RAM_SIZE,
  385. .fifo_depth = MCP251XFD_FIFO_DEPTH,
  386. };
  387. int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)
  388. {
  389. const bool fd_mode = mcp251xfd_is_fd_mode(priv);
  390. struct mcp251xfd_tx_ring *tx_ring = priv->tx;
  391. struct mcp251xfd_rx_ring *rx_ring;
  392. u8 tx_obj_size, rx_obj_size;
  393. u8 rem, i;
  394. /* switching from CAN-2.0 to CAN-FD mode or vice versa */
  395. if (fd_mode != test_bit(MCP251XFD_FLAGS_FD_MODE, priv->flags)) {
  396. struct can_ram_layout layout;
  397. can_ram_get_layout(&layout, &mcp251xfd_ram_config, NULL, NULL, fd_mode);
  398. priv->rx_obj_num = layout.default_rx;
  399. tx_ring->obj_num = layout.default_tx;
  400. }
  401. if (fd_mode) {
  402. tx_obj_size = sizeof(struct mcp251xfd_hw_tx_obj_canfd);
  403. rx_obj_size = sizeof(struct mcp251xfd_hw_rx_obj_canfd);
  404. set_bit(MCP251XFD_FLAGS_FD_MODE, priv->flags);
  405. } else {
  406. tx_obj_size = sizeof(struct mcp251xfd_hw_tx_obj_can);
  407. rx_obj_size = sizeof(struct mcp251xfd_hw_rx_obj_can);
  408. clear_bit(MCP251XFD_FLAGS_FD_MODE, priv->flags);
  409. }
  410. tx_ring->obj_size = tx_obj_size;
  411. rem = priv->rx_obj_num;
  412. for (i = 0; i < ARRAY_SIZE(priv->rx) && rem; i++) {
  413. u8 rx_obj_num;
  414. if (i == 0 && priv->rx_obj_num_coalesce_irq)
  415. rx_obj_num = min_t(u8, priv->rx_obj_num_coalesce_irq * 2,
  416. MCP251XFD_FIFO_DEPTH);
  417. else
  418. rx_obj_num = min_t(u8, rounddown_pow_of_two(rem),
  419. MCP251XFD_FIFO_DEPTH);
  420. rem -= rx_obj_num;
  421. rx_ring = kzalloc(sizeof(*rx_ring) + rx_obj_size * rx_obj_num,
  422. GFP_KERNEL);
  423. if (!rx_ring) {
  424. mcp251xfd_ring_free(priv);
  425. return -ENOMEM;
  426. }
  427. rx_ring->obj_num = rx_obj_num;
  428. rx_ring->obj_size = rx_obj_size;
  429. priv->rx[i] = rx_ring;
  430. }
  431. priv->rx_ring_num = i;
  432. hrtimer_init(&priv->rx_irq_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  433. priv->rx_irq_timer.function = mcp251xfd_rx_irq_timer;
  434. hrtimer_init(&priv->tx_irq_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  435. priv->tx_irq_timer.function = mcp251xfd_tx_irq_timer;
  436. return 0;
  437. }