can: dev: can_put_echo_skb(): extend to handle frame_len
authorVincent Mailhol <mailhol.vincent@wanadoo.fr>
Mon, 11 Jan 2021 14:19:27 +0000 (15:19 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Thu, 14 Jan 2021 07:43:43 +0000 (08:43 +0100)
Add a frame_len argument to can_put_echo_skb() which is used to save length of
the CAN frame into field frame_len of struct can_skb_priv so that it can be
later used after transmission completion. Convert all users of this function,
too.

Drivers which implement BQL call can_put_echo_skb() with the output of
can_skb_get_frame_len(skb) and drivers which do not simply pass zero as an
input (in the same way that NULL would be given to can_get_echo_skb()). This
way, we have a nice symmetry between the two echo functions.

Link: https://lore.kernel.org/r/20210111061335.39983-1-mailhol.vincent@wanadoo.fr
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Link: https://lore.kernel.org/r/20210111141930.693847-13-mkl@pengutronix.de
Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
31 files changed:
drivers/net/can/at91_can.c
drivers/net/can/c_can/c_can.c
drivers/net/can/cc770/cc770.c
drivers/net/can/dev/skb.c
drivers/net/can/flexcan.c
drivers/net/can/grcan.c
drivers/net/can/ifi_canfd/ifi_canfd.c
drivers/net/can/kvaser_pciefd.c
drivers/net/can/m_can/m_can.c
drivers/net/can/mscan/mscan.c
drivers/net/can/pch_can.c
drivers/net/can/peak_canfd/peak_canfd.c
drivers/net/can/rcar/rcar_can.c
drivers/net/can/rcar/rcar_canfd.c
drivers/net/can/sja1000/sja1000.c
drivers/net/can/softing/softing_main.c
drivers/net/can/spi/hi311x.c
drivers/net/can/spi/mcp251x.c
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
drivers/net/can/sun4i_can.c
drivers/net/can/ti_hecc.c
drivers/net/can/usb/ems_usb.c
drivers/net/can/usb/esd_usb2.c
drivers/net/can/usb/gs_usb.c
drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c
drivers/net/can/usb/mcba_usb.c
drivers/net/can/usb/peak_usb/pcan_usb_core.c
drivers/net/can/usb/ucan.c
drivers/net/can/usb/usb_8dev.c
drivers/net/can/xilinx_can.c
include/linux/can/skb.h

index 5284f0a..90b223a 100644 (file)
@@ -484,7 +484,7 @@ static netdev_tx_t at91_start_xmit(struct sk_buff *skb, struct net_device *dev)
        stats->tx_bytes += cf->len;
 
        /* _NOTE_: subtract AT91_MB_TX_FIRST offset from mb! */
-       can_put_echo_skb(skb, dev, mb - get_mb_tx_first(priv));
+       can_put_echo_skb(skb, dev, mb - get_mb_tx_first(priv), 0);
 
        /*
         * we have to stop the queue and deliver all messages in case
index 63f48b0..1363895 100644 (file)
@@ -476,7 +476,7 @@ static netdev_tx_t c_can_start_xmit(struct sk_buff *skb,
         */
        c_can_setup_tx_object(dev, IF_TX, frame, idx);
        priv->dlc[idx] = frame->len;
-       can_put_echo_skb(skb, dev, idx);
+       can_put_echo_skb(skb, dev, idx, 0);
 
        /* Update the active bits */
        atomic_add((1 << idx), &priv->tx_active);
index 8d9f332..e53ca33 100644 (file)
@@ -702,7 +702,7 @@ static void cc770_tx_interrupt(struct net_device *dev, unsigned int o)
        stats->tx_bytes += cf->len;
        stats->tx_packets++;
 
-       can_put_echo_skb(priv->tx_skb, dev, 0);
+       can_put_echo_skb(priv->tx_skb, dev, 0, 0);
        can_get_echo_skb(dev, 0);
        priv->tx_skb = NULL;
 
index 24f782a..c184b4d 100644 (file)
@@ -38,7 +38,7 @@ void can_flush_echo_skb(struct net_device *dev)
  * priv->echo_skb, if necessary.
  */
 int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
-                    unsigned int idx)
+                    unsigned int idx, unsigned int frame_len)
 {
        struct can_priv *priv = netdev_priv(dev);
 
@@ -62,6 +62,9 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
                skb->ip_summed = CHECKSUM_UNNECESSARY;
                skb->dev = dev;
 
+               /* save frame_len to reuse it when transmission is completed */
+               can_skb_prv(skb)->frame_len = frame_len;
+
                /* save this skb for tx interrupt echo handling */
                priv->echo_skb[idx] = skb;
        } else {
index 7ab20a6..202d08f 100644 (file)
@@ -815,7 +815,7 @@ static netdev_tx_t flexcan_start_xmit(struct sk_buff *skb, struct net_device *de
                priv->write(data, &priv->tx_mb->data[i / sizeof(u32)]);
        }
 
-       can_put_echo_skb(skb, dev, 0);
+       can_put_echo_skb(skb, dev, 0, 0);
 
        priv->write(can_id, &priv->tx_mb->can_id);
        priv->write(ctrl, &priv->tx_mb->can_ctrl);
index f5d94a6..8086cdc 100644 (file)
@@ -1448,7 +1448,7 @@ static netdev_tx_t grcan_start_xmit(struct sk_buff *skb,
         * taken.
         */
        priv->txdlc[slotindex] = cf->len; /* Store dlc for statistics */
-       can_put_echo_skb(skb, dev, slotindex);
+       can_put_echo_skb(skb, dev, slotindex, 0);
 
        /* Make sure everything is written before allowing hardware to
         * read from the memory
index 86b0e14..56ac9e1 100644 (file)
@@ -922,7 +922,7 @@ static netdev_tx_t ifi_canfd_start_xmit(struct sk_buff *skb,
        writel(0, priv->base + IFI_CANFD_TXFIFO_REPEATCOUNT);
        writel(0, priv->base + IFI_CANFD_TXFIFO_SUSPEND_US);
 
-       can_put_echo_skb(skb, ndev, 0);
+       can_put_echo_skb(skb, ndev, 0, 0);
 
        /* Start the transmission */
        writel(IFI_CANFD_TXSTCMD_ADD_MSG, priv->base + IFI_CANFD_TXSTCMD);
index 969cedb..0cf82f0 100644 (file)
@@ -778,7 +778,7 @@ static netdev_tx_t kvaser_pciefd_start_xmit(struct sk_buff *skb,
        spin_lock_irqsave(&can->echo_lock, irq_flags);
 
        /* Prepare and save echo skb in internal slot */
-       can_put_echo_skb(skb, netdev, can->echo_idx);
+       can_put_echo_skb(skb, netdev, can->echo_idx, 0);
 
        /* Move echo index to the next slot */
        can->echo_idx = (can->echo_idx + 1) % can->can.echo_skb_max;
index da551fd..fff7432 100644 (file)
@@ -1483,7 +1483,7 @@ static netdev_tx_t m_can_tx_handler(struct m_can_classdev *cdev)
                                         M_CAN_FIFO_DATA(i / 4),
                                         *(u32 *)(cf->data + i));
 
-               can_put_echo_skb(skb, dev, 0);
+               can_put_echo_skb(skb, dev, 0, 0);
 
                if (cdev->can.ctrlmode & CAN_CTRLMODE_FD) {
                        cccr = m_can_read(cdev, M_CAN_CCCR);
@@ -1554,7 +1554,7 @@ static netdev_tx_t m_can_tx_handler(struct m_can_classdev *cdev)
                /* Push loopback echo.
                 * Will be looped back on TX interrupt based on message marker
                 */
-               can_put_echo_skb(skb, dev, putidx);
+               can_put_echo_skb(skb, dev, putidx, 0);
 
                /* Enable TX FIFO element to start transfer  */
                m_can_write(cdev, M_CAN_TXBAR, (1 << putidx));
index 5ed00a1..a28fdaa 100644 (file)
@@ -270,7 +270,7 @@ static netdev_tx_t mscan_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
        list_add_tail(&priv->tx_queue[buf_id].list, &priv->tx_head);
 
-       can_put_echo_skb(skb, dev, buf_id);
+       can_put_echo_skb(skb, dev, buf_id, 0);
 
        /* Enable interrupt. */
        priv->tx_active |= 1 << buf_id;
index 4f9e7ec..a4c35b4 100644 (file)
@@ -924,7 +924,7 @@ static netdev_tx_t pch_xmit(struct sk_buff *skb, struct net_device *ndev)
                          &priv->regs->ifregs[1].data[i / 2]);
        }
 
-       can_put_echo_skb(skb, ndev, tx_obj_no - PCH_RX_OBJ_END - 1);
+       can_put_echo_skb(skb, ndev, tx_obj_no - PCH_RX_OBJ_END - 1, 0);
 
        /* Set the size of the data. Update if2_mcont */
        iowrite32(cf->len | PCH_IF_MCONT_NEWDAT | PCH_IF_MCONT_TXRQXT |
index c5334b0..179a8e1 100644 (file)
@@ -716,7 +716,7 @@ static netdev_tx_t peak_canfd_start_xmit(struct sk_buff *skb,
        spin_lock_irqsave(&priv->echo_lock, flags);
 
        /* prepare and save echo skb in internal slot */
-       can_put_echo_skb(skb, ndev, priv->echo_idx);
+       can_put_echo_skb(skb, ndev, priv->echo_idx, 0);
 
        /* move echo index to the next slot */
        priv->echo_idx = (priv->echo_idx + 1) % priv->can.echo_skb_max;
index c803327..0b7e488 100644 (file)
@@ -617,7 +617,7 @@ static netdev_tx_t rcar_can_start_xmit(struct sk_buff *skb,
        writeb(cf->len, &priv->regs->mb[RCAR_CAN_TX_FIFO_MBX].dlc);
 
        priv->tx_dlc[priv->tx_head % RCAR_CAN_FIFO_DEPTH] = cf->len;
-       can_put_echo_skb(skb, ndev, priv->tx_head % RCAR_CAN_FIFO_DEPTH);
+       can_put_echo_skb(skb, ndev, priv->tx_head % RCAR_CAN_FIFO_DEPTH, 0);
        priv->tx_head++;
        /* Start Tx: write 0xff to the TFPCR register to increment
         * the CPU-side pointer for the transmit FIFO to the next
index 2778ed5..38376f2 100644 (file)
@@ -1390,7 +1390,7 @@ static netdev_tx_t rcar_canfd_start_xmit(struct sk_buff *skb,
        }
 
        priv->tx_len[priv->tx_head % RCANFD_FIFO_DEPTH] = cf->len;
-       can_put_echo_skb(skb, ndev, priv->tx_head % RCANFD_FIFO_DEPTH);
+       can_put_echo_skb(skb, ndev, priv->tx_head % RCANFD_FIFO_DEPTH, 0);
 
        spin_lock_irqsave(&priv->tx_lock, flags);
        priv->tx_head++;
index b6a7003..e98482c 100644 (file)
@@ -318,7 +318,7 @@ static netdev_tx_t sja1000_start_xmit(struct sk_buff *skb,
        for (i = 0; i < cf->len; i++)
                priv->write_reg(priv, dreg++, cf->data[i]);
 
-       can_put_echo_skb(skb, dev, 0);
+       can_put_echo_skb(skb, dev, 0, 0);
 
        if (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
                cmd_reg_val |= CMD_AT;
index 40070c9..a531444 100644 (file)
@@ -104,7 +104,7 @@ static netdev_tx_t softing_netdev_start_xmit(struct sk_buff *skb,
        card->tx.last_bus = priv->index;
        ++card->tx.pending;
        ++priv->tx.pending;
-       can_put_echo_skb(skb, dev, priv->tx.echo_put);
+       can_put_echo_skb(skb, dev, priv->tx.echo_put, 0);
        ++priv->tx.echo_put;
        if (priv->tx.echo_put >= TX_ECHO_SKB_MAX)
                priv->tx.echo_put = 0;
index f9455de..8c83a9e 100644 (file)
@@ -586,7 +586,7 @@ static void hi3110_tx_work_handler(struct work_struct *ws)
                        frame = (struct can_frame *)priv->tx_skb->data;
                        hi3110_hw_tx(spi, frame);
                        priv->tx_len = 1 + frame->len;
-                       can_put_echo_skb(priv->tx_skb, net, 0);
+                       can_put_echo_skb(priv->tx_skb, net, 0, 0);
                        priv->tx_skb = NULL;
                }
        }
index 25859d1..4086675 100644 (file)
@@ -1002,7 +1002,7 @@ static void mcp251x_tx_work_handler(struct work_struct *ws)
                                frame->len = CAN_FRAME_MAX_DATA_LEN;
                        mcp251x_hw_tx(spi, frame, 0);
                        priv->tx_len = 1 + frame->len;
-                       can_put_echo_skb(priv->tx_skb, net, 0);
+                       can_put_echo_skb(priv->tx_skb, net, 0, 0);
                        priv->tx_skb = NULL;
                }
        }
index 36235af..95bba45 100644 (file)
@@ -2436,7 +2436,7 @@ static netdev_tx_t mcp251xfd_start_xmit(struct sk_buff *skb,
        if (tx_ring->head - tx_ring->tail >= tx_ring->obj_num)
                netif_stop_queue(ndev);
 
-       can_put_echo_skb(skb, ndev, tx_head);
+       can_put_echo_skb(skb, ndev, tx_head, 0);
 
        err = mcp251xfd_tx_obj_write(priv, tx_obj);
        if (err)
index 783b632..b75175d 100644 (file)
@@ -448,7 +448,7 @@ static netdev_tx_t sun4ican_start_xmit(struct sk_buff *skb, struct net_device *d
 
        writel(msg_flag_n, priv->base + SUN4I_REG_BUF0_ADDR);
 
-       can_put_echo_skb(skb, dev, 0);
+       can_put_echo_skb(skb, dev, 0, 0);
 
        if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)
                sun4i_can_write_cmdreg(priv, SUN4I_CMD_SELF_RCV_REQ);
index a6850ff..485c19b 100644 (file)
@@ -513,7 +513,7 @@ static netdev_tx_t ti_hecc_xmit(struct sk_buff *skb, struct net_device *ndev)
                               be32_to_cpu(*(__be32 *)(cf->data + 4)));
        else
                *(u32 *)(cf->data + 4) = 0;
-       can_put_echo_skb(skb, ndev, mbxno);
+       can_put_echo_skb(skb, ndev, mbxno, 0);
 
        spin_lock_irqsave(&priv->mbx_lock, flags);
        --priv->tx_head;
index 25eee44..5e53300 100644 (file)
@@ -801,7 +801,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
        urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
        usb_anchor_urb(urb, &dev->tx_submitted);
 
-       can_put_echo_skb(skb, netdev, context->echo_index);
+       can_put_echo_skb(skb, netdev, context->echo_index, 0);
 
        atomic_inc(&dev->active_tx_urbs);
 
index 9eed75a..68d8a85 100644 (file)
@@ -783,7 +783,7 @@ static netdev_tx_t esd_usb2_start_xmit(struct sk_buff *skb,
 
        usb_anchor_urb(urb, &priv->tx_submitted);
 
-       can_put_echo_skb(skb, netdev, context->echo_index);
+       can_put_echo_skb(skb, netdev, context->echo_index, 0);
 
        atomic_inc(&priv->active_tx_jobs);
 
index 0487095..5ce9ba5 100644 (file)
@@ -525,7 +525,7 @@ static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,
        urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
        usb_anchor_urb(urb, &dev->tx_submitted);
 
-       can_put_echo_skb(skb, netdev, idx);
+       can_put_echo_skb(skb, netdev, idx, 0);
 
        atomic_inc(&dev->active_tx_urbs);
 
index e2d5884..2b7efd2 100644 (file)
@@ -578,7 +578,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb,
 
        context->priv = priv;
 
-       can_put_echo_skb(skb, netdev, context->echo_index);
+       can_put_echo_skb(skb, netdev, context->echo_index, 0);
 
        usb_fill_bulk_urb(urb, dev->udev,
                          usb_sndbulkpipe(dev->udev,
index df54eb7..5347c89 100644 (file)
@@ -355,7 +355,7 @@ static netdev_tx_t mcba_usb_start_xmit(struct sk_buff *skb,
        if (cf->can_id & CAN_RTR_FLAG)
                usb_msg.dlc |= MCBA_DLC_RTR_MASK;
 
-       can_put_echo_skb(skb, priv->netdev, ctx->ndx);
+       can_put_echo_skb(skb, priv->netdev, ctx->ndx, 0);
 
        err = mcba_usb_xmit(priv, (struct mcba_usb_msg *)&usb_msg, ctx);
        if (err)
index 251835e..9567275 100644 (file)
@@ -365,7 +365,7 @@ static netdev_tx_t peak_usb_ndo_start_xmit(struct sk_buff *skb,
 
        usb_anchor_urb(urb, &dev->tx_submitted);
 
-       can_put_echo_skb(skb, netdev, context->echo_index);
+       can_put_echo_skb(skb, netdev, context->echo_index, 0);
 
        atomic_inc(&dev->active_tx_urbs);
 
index 7d92da8..5add276 100644 (file)
@@ -1137,7 +1137,7 @@ static netdev_tx_t ucan_start_xmit(struct sk_buff *skb,
 
        /* put the skb on can loopback stack */
        spin_lock_irqsave(&up->echo_skb_lock, flags);
-       can_put_echo_skb(skb, up->netdev, echo_index);
+       can_put_echo_skb(skb, up->netdev, echo_index, 0);
        spin_unlock_irqrestore(&up->echo_skb_lock, flags);
 
        /* transmit it */
index 4447830..2e824d9 100644 (file)
@@ -664,7 +664,7 @@ static netdev_tx_t usb_8dev_start_xmit(struct sk_buff *skb,
        urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
        usb_anchor_urb(urb, &priv->tx_submitted);
 
-       can_put_echo_skb(skb, netdev, context->echo_index);
+       can_put_echo_skb(skb, netdev, context->echo_index, 0);
 
        atomic_inc(&priv->active_tx_urbs);
 
index 3f54ede..8d5132a 100644 (file)
@@ -592,9 +592,9 @@ static void xcan_write_frame(struct net_device *ndev, struct sk_buff *skb,
 
        if (!(priv->devtype.flags & XCAN_FLAG_TX_MAILBOXES) &&
            (priv->devtype.flags & XCAN_FLAG_TXFEMP))
-               can_put_echo_skb(skb, ndev, priv->tx_head % priv->tx_max);
+               can_put_echo_skb(skb, ndev, priv->tx_head % priv->tx_max, 0);
        else
-               can_put_echo_skb(skb, ndev, 0);
+               can_put_echo_skb(skb, ndev, 0, 0);
 
        priv->tx_head++;
 
index 5db9da3..eaac4a6 100644 (file)
@@ -18,7 +18,7 @@
 
 void can_flush_echo_skb(struct net_device *dev);
 int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
-                    unsigned int idx);
+                    unsigned int idx, unsigned int frame_len);
 struct sk_buff *__can_get_echo_skb(struct net_device *dev, unsigned int idx,
                                   u8 *len_ptr, unsigned int *frame_len_ptr);
 unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx);