linux-can-fixes-for-5.5-20191203

-----BEGIN PGP SIGNATURE-----
 
 iQFHBAABCgAxFiEEmvEkXzgOfc881GuFWsYho5HknSAFAl3mOAwTHG1rbEBwZW5n
 dXRyb25peC5kZQAKCRBaxiGjkeSdIPq9B/951kXPnxKh/U7Uto4CdWKOAnI7juIA
 29mM21yFMME4FCsrvowNfQfQ1o4b4mQ39lPJW9jvwqVPyxsp14O+gyeAYPlRaiDI
 AngYoUER4lHOAu948GlRqLCxXD68zOSptMO3sJwBKp3hGocDctja+2t4UMCSHnGs
 +s4S/U73gsdSW16DUYomhzl0dCPonUeXh/DGh13pImc7zKz8M1Pu8Ukb/4wGO9lg
 HDqT3l7cXtrrbuwkENLTXLvEg7+kS31fZCF1j2jWTGfjwA4g5zA1LETZtz2aou8o
 OPs1XrQ5KntBKsyljA3pL914DuJpJSnfuxpN60Fxpb3+x8284BTnL11I
 =yhsG
 -----END PGP SIGNATURE-----

Merge tag 'linux-can-fixes-for-5.5-20191203' of git://git.kernel.org/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 <davem@davemloft.net>
This commit is contained in:
David S. Miller 2019-12-03 11:14:41 -08:00
commit 56e7a2f83d
4 changed files with 34 additions and 14 deletions

View File

@ -10094,6 +10094,15 @@ W: https://linuxtv.org
S: Maintained S: Maintained
F: drivers/media/radio/radio-maxiradio* F: drivers/media/radio/radio-maxiradio*
MCAN MMIO DEVICE DRIVER
M: Sriram Dash <sriram.dash@samsung.com>
L: linux-can@vger.kernel.org
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 MCP4018 AND MCP4531 MICROCHIP DIGITAL POTENTIOMETER DRIVERS
M: Peter Rosin <peda@axentia.se> M: Peter Rosin <peda@axentia.se>
L: linux-iio@vger.kernel.org L: linux-iio@vger.kernel.org
@ -18103,6 +18112,14 @@ M: Radhey Shyam Pandey <radhey.shyam.pandey@xilinx.com>
S: Maintained S: Maintained
F: drivers/net/ethernet/xilinx/xilinx_axienet* F: drivers/net/ethernet/xilinx/xilinx_axienet*
XILINX CAN DRIVER
M: Appana Durga Kedareswara rao <appana.durga.rao@xilinx.com>
R: Naga Sureshkumar Relli <naga.sureshkumar.relli@xilinx.com>
L: linux-can@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/net/can/xilinx_can.txt
F: drivers/net/can/xilinx_can.c
XILINX UARTLITE SERIAL DRIVER XILINX UARTLITE SERIAL DRIVER
M: Peter Korsgaard <jacmet@sunsite.dk> M: Peter Korsgaard <jacmet@sunsite.dk>
L: linux-serial@vger.kernel.org L: linux-serial@vger.kernel.org

View File

@ -617,6 +617,7 @@ err_free_chan:
sl->tty = NULL; sl->tty = NULL;
tty->disc_data = NULL; tty->disc_data = NULL;
clear_bit(SLF_INUSE, &sl->flags); clear_bit(SLF_INUSE, &sl->flags);
slc_free_netdev(sl->dev);
free_netdev(sl->dev); free_netdev(sl->dev);
err_exit: err_exit:

View File

@ -792,7 +792,7 @@ resubmit:
up); up);
usb_anchor_urb(urb, &up->rx_urbs); usb_anchor_urb(urb, &up->rx_urbs);
ret = usb_submit_urb(urb, GFP_KERNEL); ret = usb_submit_urb(urb, GFP_ATOMIC);
if (ret < 0) { if (ret < 0) {
netdev_err(up->netdev, netdev_err(up->netdev,

View File

@ -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 * 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 * @skb: sk_buff pointer that contains data to be Txed
* @frame_offset: Register offset to write the frame to * @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) int frame_offset)
{ {
u32 id, dlc, data[2] = {0, 0}; u32 id, dlc, data[2] = {0, 0};
struct canfd_frame *cf = (struct canfd_frame *)skb->data; struct canfd_frame *cf = (struct canfd_frame *)skb->data;
u32 ramoff, dwindex = 0, i; u32 ramoff, dwindex = 0, i;
struct xcan_priv *priv = netdev_priv(ndev);
/* Watch carefully on the bit sequence */ /* Watch carefully on the bit sequence */
if (cf->can_id & CAN_EFF_FLAG) { if (cf->can_id & CAN_EFF_FLAG) {
@ -587,6 +588,14 @@ static void xcan_write_frame(struct xcan_priv *priv, struct sk_buff *skb,
dlc |= XCAN_DLCR_EDL_MASK; 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); priv->write_reg(priv, XCAN_FRAME_ID_OFFSET(frame_offset), id);
/* If the CAN frame is RTR frame this write triggers transmission /* If the CAN frame is RTR frame this write triggers transmission
* (not on CAN FD) * (not on CAN FD)
@ -638,13 +647,9 @@ static int xcan_start_xmit_fifo(struct sk_buff *skb, struct net_device *ndev)
XCAN_SR_TXFLL_MASK)) XCAN_SR_TXFLL_MASK))
return -ENOSPC; return -ENOSPC;
can_put_echo_skb(skb, ndev, priv->tx_head % priv->tx_max);
spin_lock_irqsave(&priv->tx_lock, flags); spin_lock_irqsave(&priv->tx_lock, flags);
priv->tx_head++; xcan_write_frame(ndev, skb, XCAN_TXFIFO_OFFSET);
xcan_write_frame(priv, skb, XCAN_TXFIFO_OFFSET);
/* Clear TX-FIFO-empty interrupt for xcan_tx_interrupt() */ /* Clear TX-FIFO-empty interrupt for xcan_tx_interrupt() */
if (priv->tx_max > 1) if (priv->tx_max > 1)
@ -675,13 +680,9 @@ static int xcan_start_xmit_mailbox(struct sk_buff *skb, struct net_device *ndev)
BIT(XCAN_TX_MAILBOX_IDX))) BIT(XCAN_TX_MAILBOX_IDX)))
return -ENOSPC; return -ENOSPC;
can_put_echo_skb(skb, ndev, 0);
spin_lock_irqsave(&priv->tx_lock, flags); spin_lock_irqsave(&priv->tx_lock, flags);
priv->tx_head++; xcan_write_frame(ndev, skb,
xcan_write_frame(priv, skb,
XCAN_TXMSG_FRAME_OFFSET(XCAN_TX_MAILBOX_IDX)); XCAN_TXMSG_FRAME_OFFSET(XCAN_TX_MAILBOX_IDX));
/* Mark buffer as ready for transmit */ /* Mark buffer as ready for transmit */
@ -1772,7 +1773,8 @@ static int xcan_probe(struct platform_device *pdev)
priv->bus_clk = devm_clk_get(&pdev->dev, devtype->bus_clk_name); priv->bus_clk = devm_clk_get(&pdev->dev, devtype->bus_clk_name);
if (IS_ERR(priv->bus_clk)) { 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); ret = PTR_ERR(priv->bus_clk);
goto err_free; goto err_free;
} }