@@ -335,6 +335,8 @@ static void mcp251xfd_ring_init(struct mcp251xfd_priv *priv)
335
335
u8 len ;
336
336
int i , j ;
337
337
338
+ netdev_reset_queue (priv -> ndev );
339
+
338
340
/* TEF */
339
341
tef_ring = priv -> tef ;
340
342
tef_ring -> head = 0 ;
@@ -1262,7 +1264,8 @@ mcp251xfd_handle_tefif_recover(const struct mcp251xfd_priv *priv, const u32 seq)
1262
1264
1263
1265
static int
1264
1266
mcp251xfd_handle_tefif_one (struct mcp251xfd_priv * priv ,
1265
- const struct mcp251xfd_hw_tef_obj * hw_tef_obj )
1267
+ const struct mcp251xfd_hw_tef_obj * hw_tef_obj ,
1268
+ unsigned int * frame_len_ptr )
1266
1269
{
1267
1270
struct net_device_stats * stats = & priv -> ndev -> stats ;
1268
1271
struct sk_buff * skb ;
@@ -1288,8 +1291,8 @@ mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv,
1288
1291
mcp251xfd_skb_set_timestamp (priv , skb , hw_tef_obj -> ts );
1289
1292
stats -> tx_bytes +=
1290
1293
can_rx_offload_get_echo_skb (& priv -> offload ,
1291
- tef_tail ,
1292
- hw_tef_obj -> ts , NULL );
1294
+ tef_tail , hw_tef_obj -> ts ,
1295
+ frame_len_ptr );
1293
1296
stats -> tx_packets ++ ;
1294
1297
priv -> tef -> tail ++ ;
1295
1298
@@ -1347,6 +1350,7 @@ mcp251xfd_tef_obj_read(const struct mcp251xfd_priv *priv,
1347
1350
static int mcp251xfd_handle_tefif (struct mcp251xfd_priv * priv )
1348
1351
{
1349
1352
struct mcp251xfd_hw_tef_obj hw_tef_obj [MCP251XFD_TX_OBJ_NUM_MAX ];
1353
+ unsigned int total_frame_len = 0 ;
1350
1354
u8 tef_tail , len , l ;
1351
1355
int err , i ;
1352
1356
@@ -1368,7 +1372,9 @@ static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv)
1368
1372
}
1369
1373
1370
1374
for (i = 0 ; i < len ; i ++ ) {
1371
- err = mcp251xfd_handle_tefif_one (priv , & hw_tef_obj [i ]);
1375
+ unsigned int frame_len = 0 ;
1376
+
1377
+ err = mcp251xfd_handle_tefif_one (priv , & hw_tef_obj [i ], & frame_len );
1372
1378
/* -EAGAIN means the Sequence Number in the TEF
1373
1379
* doesn't match our tef_tail. This can happen if we
1374
1380
* read the TEF objects too early. Leave loop let the
@@ -1378,6 +1384,8 @@ static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv)
1378
1384
goto out_netif_wake_queue ;
1379
1385
if (err )
1380
1386
return err ;
1387
+
1388
+ total_frame_len += frame_len ;
1381
1389
}
1382
1390
1383
1391
out_netif_wake_queue :
@@ -1403,6 +1411,7 @@ static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv)
1403
1411
return err ;
1404
1412
1405
1413
tx_ring -> tail += len ;
1414
+ netdev_completed_queue (priv -> ndev , len , total_frame_len );
1406
1415
1407
1416
err = mcp251xfd_check_tef_tail (priv );
1408
1417
if (err )
@@ -2446,6 +2455,7 @@ static netdev_tx_t mcp251xfd_start_xmit(struct sk_buff *skb,
2446
2455
struct mcp251xfd_priv * priv = netdev_priv (ndev );
2447
2456
struct mcp251xfd_tx_ring * tx_ring = priv -> tx ;
2448
2457
struct mcp251xfd_tx_obj * tx_obj ;
2458
+ unsigned int frame_len ;
2449
2459
u8 tx_head ;
2450
2460
int err ;
2451
2461
@@ -2464,7 +2474,10 @@ static netdev_tx_t mcp251xfd_start_xmit(struct sk_buff *skb,
2464
2474
if (mcp251xfd_get_tx_free (tx_ring ) == 0 )
2465
2475
netif_stop_queue (ndev );
2466
2476
2467
- can_put_echo_skb (skb , ndev , tx_head , 0 );
2477
+ frame_len = can_skb_get_frame_len (skb );
2478
+ err = can_put_echo_skb (skb , ndev , tx_head , frame_len );
2479
+ if (!err )
2480
+ netdev_sent_queue (priv -> ndev , frame_len );
2468
2481
2469
2482
err = mcp251xfd_tx_obj_write (priv , tx_obj );
2470
2483
if (err )
0 commit comments