@@ -97,7 +97,7 @@ static void x8h7_can_status(struct x8h7_can_priv *priv, u8 intf, u8 eflag)
97
97
int can_id = 0 ;
98
98
int data1 = 0 ;
99
99
100
- DBG_PRINT ("\n" );
100
+ // DBG_PRINT("\n");
101
101
102
102
if (intf & X8H7_CAN_STS_INT_ERR )
103
103
{
@@ -120,12 +120,25 @@ static void x8h7_can_status(struct x8h7_can_priv *priv, u8 intf, u8 eflag)
120
120
}
121
121
}
122
122
123
- if (intf & X8H7_CAN_STS_INT_TX ) {
123
+ if (intf & X8H7_CAN_STS_INT_TX_COMPLETE ) {
124
+ DBG_PRINT ("TX COMPLETE" );
124
125
net -> stats .tx_packets ++ ;
125
126
net -> stats .tx_bytes += priv -> tx_len ;
126
127
priv -> tx_len = 0 ;
127
128
can_led_event (net , CAN_LED_EVENT_TX );
128
- //can_get_echo_skb(net, 0);
129
+ can_get_echo_skb (net , 0 );
130
+ netif_wake_queue (net );
131
+ }
132
+
133
+ if (intf & X8H7_CAN_STS_INT_TX_ABORT_COMPLETE )
134
+ {
135
+ DBG_PRINT ("TX ABORT COMPLETE" );
136
+ netif_wake_queue (net );
137
+ }
138
+
139
+ if (intf & X8H7_CAN_STS_INT_TX_FIFO_EMPTY )
140
+ {
141
+ DBG_PRINT ("TX FIFO EMPTY" );
129
142
netif_wake_queue (net );
130
143
}
131
144
}
@@ -348,56 +361,65 @@ static int x8h7_can_stop(struct net_device *net)
348
361
return 0 ;
349
362
}
350
363
351
- /**
352
- */
353
- static int x8h7_can_frame_message_tx_obj_num_elems (struct x8h7_can_frame_message_tx_obj_buf * tx_obj_buf )
364
+ static void tx_obj_buf_push (struct x8h7_can_frame_message_tx_obj_buf * tx_obj_buf , union x8h7_can_frame_message const * x8h7_can_msg )
354
365
{
355
- uint8_t num_elems = 0 ;
356
-
357
366
spin_lock (& tx_obj_buf -> lock );
358
- num_elems = tx_obj_buf -> num_elems ;
367
+ memcpy (tx_obj_buf -> data + tx_obj_buf -> head , x8h7_can_msg , sizeof (x8h7_can_msg -> buf ));
368
+ tx_obj_buf -> head = (tx_obj_buf -> head + 1 ) % X8H7_TX_FIFO_SIZE ;
369
+ tx_obj_buf -> num_elems ++ ;
359
370
spin_unlock (& tx_obj_buf -> lock );
371
+ }
360
372
361
- return num_elems ;
373
+ static uint8_t tx_obj_buf_num_elems (struct x8h7_can_frame_message_tx_obj_buf * tx_obj_buf )
374
+ {
375
+ uint8_t ret ;
376
+ spin_lock (& tx_obj_buf -> lock );
377
+ ret = tx_obj_buf -> num_elems ;
378
+ spin_unlock (& tx_obj_buf -> lock );
379
+ return ret ;
362
380
}
363
381
364
382
/**
365
383
*/
366
384
static netdev_tx_t x8h7_can_start_xmit (struct sk_buff * skb ,
367
385
struct net_device * net )
368
386
{
369
- struct x8h7_can_priv * priv = netdev_priv (net );
370
- const struct device * dev = priv -> dev ;
371
- struct can_frame * frame ;
372
-
387
+ struct x8h7_can_priv * priv = netdev_priv (net );
388
+ const struct device * dev = priv -> dev ;
389
+ struct can_frame * frame ;
390
+ union x8h7_can_frame_message x8h7_can_msg ;
373
391
374
392
DBG_PRINT ("\n" );
375
393
376
394
if (can_dropped_invalid_skb (net , skb ))
377
395
return NETDEV_TX_OK ;
378
396
379
- if (x8h7_can_frame_message_tx_obj_num_elems (& priv -> tx_obj_buf ) == X8H7_TX_FIFO_SIZE ) {
397
+ if (tx_obj_buf_num_elems (& priv -> tx_obj_buf ) > 0 ) {
380
398
netif_stop_queue (net );
381
- dev_warn (dev , "hard_xmit called while tx fifo is full\n " );
399
+ dev_warn (dev , "xmit called while device busy " );
382
400
return NETDEV_TX_BUSY ;
383
401
}
384
402
385
- spin_lock (& priv -> tx_obj_buf .lock );
386
-
387
403
frame = (struct can_frame * )skb -> data ;
388
- x8h7_can_frame_to_tx_obj (frame , priv -> tx_obj_buf .data + priv -> tx_obj_buf .head );
389
- priv -> tx_obj_buf .head = (priv -> tx_obj_buf .head + 1 ) % X8H7_TX_FIFO_SIZE ;
390
- priv -> tx_obj_buf .num_elems ++ ;
404
+ x8h7_can_frame_to_tx_obj (frame , & x8h7_can_msg );
405
+ tx_obj_buf_push (& priv -> tx_obj_buf , & x8h7_can_msg );
391
406
392
- spin_unlock (& priv -> tx_obj_buf .lock );
393
-
394
- //can_put_echo_skb(skb, net, 0);
407
+ can_put_echo_skb (skb , net , 0 );
395
408
396
409
queue_work (priv -> wq , & priv -> work );
397
410
398
411
return NETDEV_TX_OK ;
399
412
}
400
413
414
+ static void tx_obj_buf_pop (struct x8h7_can_frame_message_tx_obj_buf * tx_obj_buf , union x8h7_can_frame_message * x8h7_can_msg )
415
+ {
416
+ spin_lock (& tx_obj_buf -> lock );
417
+ memcpy (x8h7_can_msg , tx_obj_buf -> data + tx_obj_buf -> tail , sizeof (x8h7_can_msg -> buf ));
418
+ tx_obj_buf -> tail = (tx_obj_buf -> tail + 1 ) % X8H7_TX_FIFO_SIZE ;
419
+ tx_obj_buf -> num_elems -- ;
420
+ spin_unlock (& tx_obj_buf -> lock );
421
+ }
422
+
401
423
/**
402
424
*/
403
425
static void x8h7_can_tx_work_handler (struct work_struct * ws )
@@ -412,33 +434,21 @@ static void x8h7_can_tx_work_handler(struct work_struct *ws)
412
434
413
435
DBG_PRINT ("\n" );
414
436
415
- while (x8h7_can_frame_message_tx_obj_num_elems (& priv -> tx_obj_buf ) > 0 )
437
+ while (tx_obj_buf_num_elems (& priv -> tx_obj_buf ) > 0 )
416
438
{
417
439
union x8h7_can_frame_message x8h7_can_msg ;
418
-
419
- spin_lock (& priv -> tx_obj_buf .lock );
420
-
421
- memcpy (& x8h7_can_msg ,
422
- priv -> tx_obj_buf .data + priv -> tx_obj_buf .tail ,
423
- sizeof (x8h7_can_msg ));
424
- priv -> tx_obj_buf .tail = (priv -> tx_obj_buf .tail + 1 ) % X8H7_TX_FIFO_SIZE ;
425
- priv -> tx_obj_buf .num_elems -- ;
426
-
427
- spin_unlock (& priv -> tx_obj_buf .lock );
428
-
440
+ tx_obj_buf_pop (& priv -> tx_obj_buf , & x8h7_can_msg );
429
441
x8h7_pkt_enq (priv -> periph ,
430
442
X8H7_CAN_OC_SEND ,
431
443
X8H7_CAN_HEADER_SIZE + x8h7_can_msg .field .len , /* Send 4-Byte ID, 1-Byte Length and the required number of data bytes. */
432
444
x8h7_can_msg .buf );
433
-
434
445
#ifdef DEBUG
435
446
i = 0 ; len = 0 ;
436
447
for (i = 0 ; (i < x8h7_can_msg .field .len ) && (len < sizeof (data_str )); i ++ )
437
448
len += snprintf (data_str + len , sizeof (data_str ) - len , " %02X" , x8h7_can_msg .field .data [i ]);
438
449
DBG_PRINT ("Enqueue CAN frame to H7: id = %08X, len = %d, data = [%s ]\n" , x8h7_can_msg .field .id , x8h7_can_msg .field .len , data_str );
439
450
#endif
440
451
}
441
-
442
452
x8h7_pkt_send ();
443
453
}
444
454
0 commit comments