Skip to content

Commit

Permalink
Merge tag 'linux-can-fixes-for-5.5-20191203' of git://git.kernel.org/…
Browse files Browse the repository at this point in the history
…pub/scm/linux/kernel/git/mkl/linux-can

Marc Kleine-Budde says:

====================
pull-request: can 2019-12-03

this is a pull request of 6 patches for net/master.

The first two patches are against the MAINTAINERS file and adds Appana
Durga Kedareswara rao as maintainer for the xilinx-can driver and Sriram
Dash for the m_can (mmio) driver.

The next patch is by Jouni Hogander and fixes a use-after-free in the
slcan driver.

Johan Hovold's patch for the ucan driver fixes the non-atomic allocation
in the completion handler.

The last two patches target the xilinx-can driver. The first one is by
Venkatesh Yadav Abbarapu and skips the error message on deferred probe,
the second one is by Srinivas Neeli and fixes the usage of the skb after
can_put_echo_skb().
====================

Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
davem330 committed Dec 3, 2019
2 parents 040b5cf + 3d3c817 commit 56e7a2f
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 14 deletions.
17 changes: 17 additions & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -10094,6 +10094,15 @@ W: https://linuxtv.org
S: Maintained
F: drivers/media/radio/radio-maxiradio*

MCAN MMIO DEVICE DRIVER
M: Sriram Dash <[email protected]>
L: [email protected]
S: Maintained
F: Documentation/devicetree/bindings/net/can/m_can.txt
F: drivers/net/can/m_can/m_can.c
F: drivers/net/can/m_can/m_can.h
F: drivers/net/can/m_can/m_can_platform.c

MCP4018 AND MCP4531 MICROCHIP DIGITAL POTENTIOMETER DRIVERS
M: Peter Rosin <[email protected]>
L: [email protected]
Expand Down Expand Up @@ -18103,6 +18112,14 @@ M: Radhey Shyam Pandey <[email protected]>
S: Maintained
F: drivers/net/ethernet/xilinx/xilinx_axienet*

XILINX CAN DRIVER
M: Appana Durga Kedareswara rao <[email protected]>
R: Naga Sureshkumar Relli <[email protected]>
L: [email protected]
S: Maintained
F: Documentation/devicetree/bindings/net/can/xilinx_can.txt
F: drivers/net/can/xilinx_can.c

XILINX UARTLITE SERIAL DRIVER
M: Peter Korsgaard <[email protected]>
L: [email protected]
Expand Down
1 change: 1 addition & 0 deletions drivers/net/can/slcan.c
Original file line number Diff line number Diff line change
Expand Up @@ -617,6 +617,7 @@ static int slcan_open(struct tty_struct *tty)
sl->tty = NULL;
tty->disc_data = NULL;
clear_bit(SLF_INUSE, &sl->flags);
slc_free_netdev(sl->dev);
free_netdev(sl->dev);

err_exit:
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/can/usb/ucan.c
Original file line number Diff line number Diff line change
Expand Up @@ -792,7 +792,7 @@ static void ucan_read_bulk_callback(struct urb *urb)
up);

usb_anchor_urb(urb, &up->rx_urbs);
ret = usb_submit_urb(urb, GFP_KERNEL);
ret = usb_submit_urb(urb, GFP_ATOMIC);

if (ret < 0) {
netdev_err(up->netdev,
Expand Down
28 changes: 15 additions & 13 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 Expand Up @@ -1772,7 +1773,8 @@ static int xcan_probe(struct platform_device *pdev)

priv->bus_clk = devm_clk_get(&pdev->dev, devtype->bus_clk_name);
if (IS_ERR(priv->bus_clk)) {
dev_err(&pdev->dev, "bus clock not found\n");
if (PTR_ERR(priv->bus_clk) != -EPROBE_DEFER)
dev_err(&pdev->dev, "bus clock not found\n");
ret = PTR_ERR(priv->bus_clk);
goto err_free;
}
Expand Down

0 comments on commit 56e7a2f

Please sign in to comment.