Skip to content

Commit 0084e29

Browse files
can: mcp251xfd: add BQL support
This patch re-adds BQL support to the driver. Support for netdev_xmit_more() will be added in a separate patch series. Link: https://lore.kernel.org/r/[email protected] Cc: Manivannan Sadhasivam <[email protected]> Cc: Thomas Kopp <[email protected]> Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent 8dc9875 commit 0084e29

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,8 @@ static void mcp251xfd_ring_init(struct mcp251xfd_priv *priv)
335335
u8 len;
336336
int i, j;
337337

338+
netdev_reset_queue(priv->ndev);
339+
338340
/* TEF */
339341
tef_ring = priv->tef;
340342
tef_ring->head = 0;
@@ -1262,7 +1264,8 @@ mcp251xfd_handle_tefif_recover(const struct mcp251xfd_priv *priv, const u32 seq)
12621264

12631265
static int
12641266
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)
12661269
{
12671270
struct net_device_stats *stats = &priv->ndev->stats;
12681271
struct sk_buff *skb;
@@ -1288,8 +1291,8 @@ mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv,
12881291
mcp251xfd_skb_set_timestamp(priv, skb, hw_tef_obj->ts);
12891292
stats->tx_bytes +=
12901293
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);
12931296
stats->tx_packets++;
12941297
priv->tef->tail++;
12951298

@@ -1347,6 +1350,7 @@ mcp251xfd_tef_obj_read(const struct mcp251xfd_priv *priv,
13471350
static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv)
13481351
{
13491352
struct mcp251xfd_hw_tef_obj hw_tef_obj[MCP251XFD_TX_OBJ_NUM_MAX];
1353+
unsigned int total_frame_len = 0;
13501354
u8 tef_tail, len, l;
13511355
int err, i;
13521356

@@ -1368,7 +1372,9 @@ static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv)
13681372
}
13691373

13701374
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);
13721378
/* -EAGAIN means the Sequence Number in the TEF
13731379
* doesn't match our tef_tail. This can happen if we
13741380
* read the TEF objects too early. Leave loop let the
@@ -1378,6 +1384,8 @@ static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv)
13781384
goto out_netif_wake_queue;
13791385
if (err)
13801386
return err;
1387+
1388+
total_frame_len += frame_len;
13811389
}
13821390

13831391
out_netif_wake_queue:
@@ -1403,6 +1411,7 @@ static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv)
14031411
return err;
14041412

14051413
tx_ring->tail += len;
1414+
netdev_completed_queue(priv->ndev, len, total_frame_len);
14061415

14071416
err = mcp251xfd_check_tef_tail(priv);
14081417
if (err)
@@ -2446,6 +2455,7 @@ static netdev_tx_t mcp251xfd_start_xmit(struct sk_buff *skb,
24462455
struct mcp251xfd_priv *priv = netdev_priv(ndev);
24472456
struct mcp251xfd_tx_ring *tx_ring = priv->tx;
24482457
struct mcp251xfd_tx_obj *tx_obj;
2458+
unsigned int frame_len;
24492459
u8 tx_head;
24502460
int err;
24512461

@@ -2464,7 +2474,10 @@ static netdev_tx_t mcp251xfd_start_xmit(struct sk_buff *skb,
24642474
if (mcp251xfd_get_tx_free(tx_ring) == 0)
24652475
netif_stop_queue(ndev);
24662476

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);
24682481

24692482
err = mcp251xfd_tx_obj_write(priv, tx_obj);
24702483
if (err)

0 commit comments

Comments
 (0)