Commit 1dcb6e57 authored by Vincent Mailhol's avatar Vincent Mailhol Committed by Marc Kleine-Budde
Browse files

can: dev: can_put_echo_skb(): extend to handle frame_len

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: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
Reviewed-by: default avatarVincent Mailhol <mailhol.vincent@wanadoo.fr>
Link: https://lore.kernel.org/r/20210111141930.693847-13-mkl@pengutronix.de


Signed-off-by: default avatarVincent Mailhol <mailhol.vincent@wanadoo.fr>
parent f0ef72fe
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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;

+4 −1
Original line number Diff line number Diff line
@@ -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 {
+1 −1
Original line number Diff line number Diff line
@@ -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);
Loading