Skip to content

Commit

Permalink
can: xilinx_can: Fix usage of skb memory
Browse files Browse the repository at this point in the history
As per linux can framework, driver not allowed to touch the skb memory
after can_put_echo_skb() call.
This patch fixes the same.
https://www.spinics.net/lists/linux-can/msg02199.html

Signed-off-by: Srinivas Neeli <srinivas.neeli@xilinx.com>
Reviewed-by: Appana Durga Kedareswara Rao <appana.durga.rao@xilinx.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
  • Loading branch information
Srinivas Neeli authored and Marc Kleine-Budde committed Dec 3, 2019
1 parent b848238 commit 3d3c817
Showing 1 changed file with 13 additions and 12 deletions.
25 changes: 13 additions & 12 deletions drivers/net/can/xilinx_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -542,16 +542,17 @@ static int xcan_do_set_mode(struct net_device *ndev, enum can_mode mode)

/**
* xcan_write_frame - Write a frame to HW
* @priv: Driver private data structure
* @ndev: Pointer to net_device structure
* @skb: sk_buff pointer that contains data to be Txed
* @frame_offset: Register offset to write the frame to
*/
static void xcan_write_frame(struct xcan_priv *priv, struct sk_buff *skb,
static void xcan_write_frame(struct net_device *ndev, struct sk_buff *skb,
int frame_offset)
{
u32 id, dlc, data[2] = {0, 0};
struct canfd_frame *cf = (struct canfd_frame *)skb->data;
u32 ramoff, dwindex = 0, i;
struct xcan_priv *priv = netdev_priv(ndev);

/* Watch carefully on the bit sequence */
if (cf->can_id & CAN_EFF_FLAG) {
Expand Down Expand Up @@ -587,6 +588,14 @@ static void xcan_write_frame(struct xcan_priv *priv, struct sk_buff *skb,
dlc |= XCAN_DLCR_EDL_MASK;
}

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);
else
can_put_echo_skb(skb, ndev, 0);

priv->tx_head++;

priv->write_reg(priv, XCAN_FRAME_ID_OFFSET(frame_offset), id);
/* If the CAN frame is RTR frame this write triggers transmission
* (not on CAN FD)
Expand Down Expand Up @@ -638,13 +647,9 @@ static int xcan_start_xmit_fifo(struct sk_buff *skb, struct net_device *ndev)
XCAN_SR_TXFLL_MASK))
return -ENOSPC;

can_put_echo_skb(skb, ndev, priv->tx_head % priv->tx_max);

spin_lock_irqsave(&priv->tx_lock, flags);

priv->tx_head++;

xcan_write_frame(priv, skb, XCAN_TXFIFO_OFFSET);
xcan_write_frame(ndev, skb, XCAN_TXFIFO_OFFSET);

/* Clear TX-FIFO-empty interrupt for xcan_tx_interrupt() */
if (priv->tx_max > 1)
Expand Down Expand Up @@ -675,13 +680,9 @@ static int xcan_start_xmit_mailbox(struct sk_buff *skb, struct net_device *ndev)
BIT(XCAN_TX_MAILBOX_IDX)))
return -ENOSPC;

can_put_echo_skb(skb, ndev, 0);

spin_lock_irqsave(&priv->tx_lock, flags);

priv->tx_head++;

xcan_write_frame(priv, skb,
xcan_write_frame(ndev, skb,
XCAN_TXMSG_FRAME_OFFSET(XCAN_TX_MAILBOX_IDX));

/* Mark buffer as ready for transmit */
Expand Down

0 comments on commit 3d3c817

Please sign in to comment.