]> git.baikalelectronics.ru Git - kernel.git/commitdiff
can: mcp251xfd: add BQL support
authorMarc Kleine-Budde <mkl@pengutronix.de>
Sun, 13 Dec 2020 16:25:15 +0000 (17:25 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 7 Apr 2021 07:31:28 +0000 (09:31 +0200)
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/20210406110617.1865592-3-mkl@pengutronix.de
Cc: Manivannan Sadhasivam <mani@kernel.org>
Cc: Thomas Kopp <thomas.kopp@microchip.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c

index 142eb4506b55cf33c16ac302523ad416f9372e6a..970dc570e7a5b77044f5942524b5e6695dfbc4da 100644 (file)
@@ -335,6 +335,8 @@ static void mcp251xfd_ring_init(struct mcp251xfd_priv *priv)
        u8 len;
        int i, j;
 
+       netdev_reset_queue(priv->ndev);
+
        /* TEF */
        tef_ring = priv->tef;
        tef_ring->head = 0;
@@ -1262,7 +1264,8 @@ mcp251xfd_handle_tefif_recover(const struct mcp251xfd_priv *priv, const u32 seq)
 
 static int
 mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv,
-                          const struct mcp251xfd_hw_tef_obj *hw_tef_obj)
+                          const struct mcp251xfd_hw_tef_obj *hw_tef_obj,
+                          unsigned int *frame_len_ptr)
 {
        struct net_device_stats *stats = &priv->ndev->stats;
        struct sk_buff *skb;
@@ -1288,8 +1291,8 @@ mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv,
                mcp251xfd_skb_set_timestamp(priv, skb, hw_tef_obj->ts);
        stats->tx_bytes +=
                can_rx_offload_get_echo_skb(&priv->offload,
-                                           tef_tail,
-                                           hw_tef_obj->ts, NULL);
+                                           tef_tail, hw_tef_obj->ts,
+                                           frame_len_ptr);
        stats->tx_packets++;
        priv->tef->tail++;
 
@@ -1347,6 +1350,7 @@ mcp251xfd_tef_obj_read(const struct mcp251xfd_priv *priv,
 static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv)
 {
        struct mcp251xfd_hw_tef_obj hw_tef_obj[MCP251XFD_TX_OBJ_NUM_MAX];
+       unsigned int total_frame_len = 0;
        u8 tef_tail, len, l;
        int err, i;
 
@@ -1368,7 +1372,9 @@ static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv)
        }
 
        for (i = 0; i < len; i++) {
-               err = mcp251xfd_handle_tefif_one(priv, &hw_tef_obj[i]);
+               unsigned int frame_len = 0;
+
+               err = mcp251xfd_handle_tefif_one(priv, &hw_tef_obj[i], &frame_len);
                /* -EAGAIN means the Sequence Number in the TEF
                 * doesn't match our tef_tail. This can happen if we
                 * read the TEF objects too early. Leave loop let the
@@ -1378,6 +1384,8 @@ static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv)
                        goto out_netif_wake_queue;
                if (err)
                        return err;
+
+               total_frame_len += frame_len;
        }
 
  out_netif_wake_queue:
@@ -1403,6 +1411,7 @@ static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv)
                        return err;
 
                tx_ring->tail += len;
+               netdev_completed_queue(priv->ndev, len, total_frame_len);
 
                err = mcp251xfd_check_tef_tail(priv);
                if (err)
@@ -2446,6 +2455,7 @@ static netdev_tx_t mcp251xfd_start_xmit(struct sk_buff *skb,
        struct mcp251xfd_priv *priv = netdev_priv(ndev);
        struct mcp251xfd_tx_ring *tx_ring = priv->tx;
        struct mcp251xfd_tx_obj *tx_obj;
+       unsigned int frame_len;
        u8 tx_head;
        int err;
 
@@ -2464,7 +2474,10 @@ static netdev_tx_t mcp251xfd_start_xmit(struct sk_buff *skb,
        if (mcp251xfd_get_tx_free(tx_ring) == 0)
                netif_stop_queue(ndev);
 
-       can_put_echo_skb(skb, ndev, tx_head, 0);
+       frame_len = can_skb_get_frame_len(skb);
+       err = can_put_echo_skb(skb, ndev, tx_head, frame_len);
+       if (!err)
+               netdev_sent_queue(priv->ndev, frame_len);
 
        err = mcp251xfd_tx_obj_write(priv, tx_obj);
        if (err)