@@ -71,6 +71,17 @@ mcp251xfd_ring_init_tef(struct mcp251xfd_priv *priv, u16 *base)
71
71
/* TEF- and TX-FIFO have same number of objects */
72
72
* base = mcp251xfd_get_tef_obj_addr (priv -> tx -> obj_num );
73
73
74
+ /* FIFO IRQ enable */
75
+ addr = MCP251XFD_REG_TEFCON ;
76
+ val = MCP251XFD_REG_TEFCON_TEFOVIE | MCP251XFD_REG_TEFCON_TEFNEIE ;
77
+
78
+ len = mcp251xfd_cmd_prepare_write_reg (priv , & tef_ring -> irq_enable_buf ,
79
+ addr , val , val );
80
+ tef_ring -> irq_enable_xfer .tx_buf = & tef_ring -> irq_enable_buf ;
81
+ tef_ring -> irq_enable_xfer .len = len ;
82
+ spi_message_init_with_transfers (& tef_ring -> irq_enable_msg ,
83
+ & tef_ring -> irq_enable_xfer , 1 );
84
+
74
85
/* FIFO increment TEF tail pointer */
75
86
addr = MCP251XFD_REG_TEFCON ;
76
87
val = MCP251XFD_REG_TEFCON_UINC ;
@@ -94,6 +105,18 @@ mcp251xfd_ring_init_tef(struct mcp251xfd_priv *priv, u16 *base)
94
105
* message.
95
106
*/
96
107
xfer -> cs_change = 0 ;
108
+
109
+ if (priv -> tx_coalesce_usecs_irq || priv -> tx_obj_num_coalesce_irq ) {
110
+ val = MCP251XFD_REG_TEFCON_UINC |
111
+ MCP251XFD_REG_TEFCON_TEFOVIE |
112
+ MCP251XFD_REG_TEFCON_TEFHIE ;
113
+
114
+ len = mcp251xfd_cmd_prepare_write_reg (priv ,
115
+ & tef_ring -> uinc_irq_disable_buf ,
116
+ addr , val , val );
117
+ xfer -> tx_buf = & tef_ring -> uinc_irq_disable_buf ;
118
+ xfer -> len = len ;
119
+ }
97
120
}
98
121
99
122
static void
@@ -282,11 +305,29 @@ int mcp251xfd_ring_init(struct mcp251xfd_priv *priv)
282
305
*/
283
306
priv -> regs_status .rxif = BIT (priv -> rx [0 ]-> fifo_nr );
284
307
285
- netdev_dbg (priv -> ndev ,
286
- "FIFO setup: TEF: 0x%03x: %2d*%zu bytes = %4zu bytes\n" ,
287
- mcp251xfd_get_tef_obj_addr (0 ),
288
- priv -> tx -> obj_num , sizeof (struct mcp251xfd_hw_tef_obj ),
289
- priv -> tx -> obj_num * sizeof (struct mcp251xfd_hw_tef_obj ));
308
+ if (priv -> tx_obj_num_coalesce_irq ) {
309
+ netdev_dbg (priv -> ndev ,
310
+ "FIFO setup: TEF: 0x%03x: %2d*%zu bytes = %4zu bytes (coalesce)\n" ,
311
+ mcp251xfd_get_tef_obj_addr (0 ),
312
+ priv -> tx_obj_num_coalesce_irq ,
313
+ sizeof (struct mcp251xfd_hw_tef_obj ),
314
+ priv -> tx_obj_num_coalesce_irq *
315
+ sizeof (struct mcp251xfd_hw_tef_obj ));
316
+
317
+ netdev_dbg (priv -> ndev ,
318
+ " 0x%03x: %2d*%zu bytes = %4zu bytes\n" ,
319
+ mcp251xfd_get_tef_obj_addr (priv -> tx_obj_num_coalesce_irq ),
320
+ priv -> tx -> obj_num - priv -> tx_obj_num_coalesce_irq ,
321
+ sizeof (struct mcp251xfd_hw_tef_obj ),
322
+ (priv -> tx -> obj_num - priv -> tx_obj_num_coalesce_irq ) *
323
+ sizeof (struct mcp251xfd_hw_tef_obj ));
324
+ } else {
325
+ netdev_dbg (priv -> ndev ,
326
+ "FIFO setup: TEF: 0x%03x: %2d*%zu bytes = %4zu bytes\n" ,
327
+ mcp251xfd_get_tef_obj_addr (0 ),
328
+ priv -> tx -> obj_num , sizeof (struct mcp251xfd_hw_tef_obj ),
329
+ priv -> tx -> obj_num * sizeof (struct mcp251xfd_hw_tef_obj ));
330
+ }
290
331
291
332
mcp251xfd_for_each_rx_ring (priv , rx_ring , i ) {
292
333
if (rx_ring -> nr == 0 && priv -> rx_obj_num_coalesce_irq ) {
@@ -364,6 +405,20 @@ static enum hrtimer_restart mcp251xfd_rx_irq_timer(struct hrtimer *t)
364
405
return HRTIMER_NORESTART ;
365
406
}
366
407
408
+ static enum hrtimer_restart mcp251xfd_tx_irq_timer (struct hrtimer * t )
409
+ {
410
+ struct mcp251xfd_priv * priv = container_of (t , struct mcp251xfd_priv ,
411
+ tx_irq_timer );
412
+ struct mcp251xfd_tef_ring * ring = priv -> tef ;
413
+
414
+ if (test_bit (MCP251XFD_FLAGS_DOWN , priv -> flags ))
415
+ return HRTIMER_NORESTART ;
416
+
417
+ spi_async (priv -> spi , & ring -> irq_enable_msg );
418
+
419
+ return HRTIMER_NORESTART ;
420
+ }
421
+
367
422
const struct can_ram_config mcp251xfd_ram_config = {
368
423
.rx = {
369
424
.size [CAN_RAM_MODE_CAN ] = sizeof (struct mcp251xfd_hw_rx_obj_can ),
@@ -449,5 +504,8 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)
449
504
hrtimer_init (& priv -> rx_irq_timer , CLOCK_MONOTONIC , HRTIMER_MODE_REL );
450
505
priv -> rx_irq_timer .function = mcp251xfd_rx_irq_timer ;
451
506
507
+ hrtimer_init (& priv -> tx_irq_timer , CLOCK_MONOTONIC , HRTIMER_MODE_REL );
508
+ priv -> tx_irq_timer .function = mcp251xfd_tx_irq_timer ;
509
+
452
510
return 0 ;
453
511
}
0 commit comments