Commit 8d670412 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge tag 'linux-can-fixes-for-5.14-20210730' of...

Merge tag 'linux-can-fixes-for-5.14-20210730' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can

Marc Kleine-Budde says:

====================
pull-request: can 2021-07-30

The first patch is by me and adds Yasushi SHOJI as a reviewer for the
Microchip CAN BUS Analyzer Tool driver.

Dan Carpenter's patch fixes a signedness bug in the hi311x driver.

Pavel Skripkin provides 4 patches, the first targets the mcba_usb
driver by adding the missing urb->transfer_dma initialization, which
was broken in a previous commit. The last 3 patches fix a memory leak
in the usb_8dev, ems_usb and esd_usb2 driver.

* tag 'linux-can-fixes-for-5.14-20210730' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can:
  can: esd_usb2: fix memory leak
  can: ems_usb: fix memory leak
  can: usb_8dev: fix memory leak
  can: mcba_usb_start(): add missing urb->transfer_dma initialization
  can: hi311x: fix a signedness bug in hi3110_cmd()
  MAINTAINERS: add Yasushi SHOJI as reviewer for the Microchip CAN BUS Analyzer Tool driver
====================

Link: https://lore.kernel.org/r/20210730070526.1699867-1-mkl@pengutronix.deSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 028a7177 928150fa
...@@ -11327,6 +11327,12 @@ W: https://linuxtv.org ...@@ -11327,6 +11327,12 @@ W: https://linuxtv.org
T: git git://linuxtv.org/media_tree.git T: git git://linuxtv.org/media_tree.git
F: drivers/media/radio/radio-maxiradio* F: drivers/media/radio/radio-maxiradio*
MCAB MICROCHIP CAN BUS ANALYZER TOOL DRIVER
R: Yasushi SHOJI <yashi@spacecubics.com>
L: linux-can@vger.kernel.org
S: Maintained
F: drivers/net/can/usb/mcba_usb.c
MCAN MMIO DEVICE DRIVER MCAN MMIO DEVICE DRIVER
M: Chandrasekar Ramakrishnan <rcsekar@samsung.com> M: Chandrasekar Ramakrishnan <rcsekar@samsung.com>
L: linux-can@vger.kernel.org L: linux-can@vger.kernel.org
......
...@@ -218,7 +218,7 @@ static int hi3110_spi_trans(struct spi_device *spi, int len) ...@@ -218,7 +218,7 @@ static int hi3110_spi_trans(struct spi_device *spi, int len)
return ret; return ret;
} }
static u8 hi3110_cmd(struct spi_device *spi, u8 command) static int hi3110_cmd(struct spi_device *spi, u8 command)
{ {
struct hi3110_priv *priv = spi_get_drvdata(spi); struct hi3110_priv *priv = spi_get_drvdata(spi);
......
...@@ -255,6 +255,8 @@ struct ems_usb { ...@@ -255,6 +255,8 @@ struct ems_usb {
unsigned int free_slots; /* remember number of available slots */ unsigned int free_slots; /* remember number of available slots */
struct ems_cpc_msg active_params; /* active controller parameters */ struct ems_cpc_msg active_params; /* active controller parameters */
void *rxbuf[MAX_RX_URBS];
dma_addr_t rxbuf_dma[MAX_RX_URBS];
}; };
static void ems_usb_read_interrupt_callback(struct urb *urb) static void ems_usb_read_interrupt_callback(struct urb *urb)
...@@ -587,6 +589,7 @@ static int ems_usb_start(struct ems_usb *dev) ...@@ -587,6 +589,7 @@ static int ems_usb_start(struct ems_usb *dev)
for (i = 0; i < MAX_RX_URBS; i++) { for (i = 0; i < MAX_RX_URBS; i++) {
struct urb *urb = NULL; struct urb *urb = NULL;
u8 *buf = NULL; u8 *buf = NULL;
dma_addr_t buf_dma;
/* create a URB, and a buffer for it */ /* create a URB, and a buffer for it */
urb = usb_alloc_urb(0, GFP_KERNEL); urb = usb_alloc_urb(0, GFP_KERNEL);
...@@ -596,7 +599,7 @@ static int ems_usb_start(struct ems_usb *dev) ...@@ -596,7 +599,7 @@ static int ems_usb_start(struct ems_usb *dev)
} }
buf = usb_alloc_coherent(dev->udev, RX_BUFFER_SIZE, GFP_KERNEL, buf = usb_alloc_coherent(dev->udev, RX_BUFFER_SIZE, GFP_KERNEL,
&urb->transfer_dma); &buf_dma);
if (!buf) { if (!buf) {
netdev_err(netdev, "No memory left for USB buffer\n"); netdev_err(netdev, "No memory left for USB buffer\n");
usb_free_urb(urb); usb_free_urb(urb);
...@@ -604,6 +607,8 @@ static int ems_usb_start(struct ems_usb *dev) ...@@ -604,6 +607,8 @@ static int ems_usb_start(struct ems_usb *dev)
break; break;
} }
urb->transfer_dma = buf_dma;
usb_fill_bulk_urb(urb, dev->udev, usb_rcvbulkpipe(dev->udev, 2), usb_fill_bulk_urb(urb, dev->udev, usb_rcvbulkpipe(dev->udev, 2),
buf, RX_BUFFER_SIZE, buf, RX_BUFFER_SIZE,
ems_usb_read_bulk_callback, dev); ems_usb_read_bulk_callback, dev);
...@@ -619,6 +624,9 @@ static int ems_usb_start(struct ems_usb *dev) ...@@ -619,6 +624,9 @@ static int ems_usb_start(struct ems_usb *dev)
break; break;
} }
dev->rxbuf[i] = buf;
dev->rxbuf_dma[i] = buf_dma;
/* Drop reference, USB core will take care of freeing it */ /* Drop reference, USB core will take care of freeing it */
usb_free_urb(urb); usb_free_urb(urb);
} }
...@@ -684,6 +692,10 @@ static void unlink_all_urbs(struct ems_usb *dev) ...@@ -684,6 +692,10 @@ static void unlink_all_urbs(struct ems_usb *dev)
usb_kill_anchored_urbs(&dev->rx_submitted); usb_kill_anchored_urbs(&dev->rx_submitted);
for (i = 0; i < MAX_RX_URBS; ++i)
usb_free_coherent(dev->udev, RX_BUFFER_SIZE,
dev->rxbuf[i], dev->rxbuf_dma[i]);
usb_kill_anchored_urbs(&dev->tx_submitted); usb_kill_anchored_urbs(&dev->tx_submitted);
atomic_set(&dev->active_tx_urbs, 0); atomic_set(&dev->active_tx_urbs, 0);
......
...@@ -195,6 +195,8 @@ struct esd_usb2 { ...@@ -195,6 +195,8 @@ struct esd_usb2 {
int net_count; int net_count;
u32 version; u32 version;
int rxinitdone; int rxinitdone;
void *rxbuf[MAX_RX_URBS];
dma_addr_t rxbuf_dma[MAX_RX_URBS];
}; };
struct esd_usb2_net_priv { struct esd_usb2_net_priv {
...@@ -545,6 +547,7 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev) ...@@ -545,6 +547,7 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev)
for (i = 0; i < MAX_RX_URBS; i++) { for (i = 0; i < MAX_RX_URBS; i++) {
struct urb *urb = NULL; struct urb *urb = NULL;
u8 *buf = NULL; u8 *buf = NULL;
dma_addr_t buf_dma;
/* create a URB, and a buffer for it */ /* create a URB, and a buffer for it */
urb = usb_alloc_urb(0, GFP_KERNEL); urb = usb_alloc_urb(0, GFP_KERNEL);
...@@ -554,7 +557,7 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev) ...@@ -554,7 +557,7 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev)
} }
buf = usb_alloc_coherent(dev->udev, RX_BUFFER_SIZE, GFP_KERNEL, buf = usb_alloc_coherent(dev->udev, RX_BUFFER_SIZE, GFP_KERNEL,
&urb->transfer_dma); &buf_dma);
if (!buf) { if (!buf) {
dev_warn(dev->udev->dev.parent, dev_warn(dev->udev->dev.parent,
"No memory left for USB buffer\n"); "No memory left for USB buffer\n");
...@@ -562,6 +565,8 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev) ...@@ -562,6 +565,8 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev)
goto freeurb; goto freeurb;
} }
urb->transfer_dma = buf_dma;
usb_fill_bulk_urb(urb, dev->udev, usb_fill_bulk_urb(urb, dev->udev,
usb_rcvbulkpipe(dev->udev, 1), usb_rcvbulkpipe(dev->udev, 1),
buf, RX_BUFFER_SIZE, buf, RX_BUFFER_SIZE,
...@@ -574,8 +579,12 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev) ...@@ -574,8 +579,12 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev)
usb_unanchor_urb(urb); usb_unanchor_urb(urb);
usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf, usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf,
urb->transfer_dma); urb->transfer_dma);
goto freeurb;
} }
dev->rxbuf[i] = buf;
dev->rxbuf_dma[i] = buf_dma;
freeurb: freeurb:
/* Drop reference, USB core will take care of freeing it */ /* Drop reference, USB core will take care of freeing it */
usb_free_urb(urb); usb_free_urb(urb);
...@@ -663,6 +672,11 @@ static void unlink_all_urbs(struct esd_usb2 *dev) ...@@ -663,6 +672,11 @@ static void unlink_all_urbs(struct esd_usb2 *dev)
int i, j; int i, j;
usb_kill_anchored_urbs(&dev->rx_submitted); usb_kill_anchored_urbs(&dev->rx_submitted);
for (i = 0; i < MAX_RX_URBS; ++i)
usb_free_coherent(dev->udev, RX_BUFFER_SIZE,
dev->rxbuf[i], dev->rxbuf_dma[i]);
for (i = 0; i < dev->net_count; i++) { for (i = 0; i < dev->net_count; i++) {
priv = dev->nets[i]; priv = dev->nets[i];
if (priv) { if (priv) {
......
...@@ -653,6 +653,8 @@ static int mcba_usb_start(struct mcba_priv *priv) ...@@ -653,6 +653,8 @@ static int mcba_usb_start(struct mcba_priv *priv)
break; break;
} }
urb->transfer_dma = buf_dma;
usb_fill_bulk_urb(urb, priv->udev, usb_fill_bulk_urb(urb, priv->udev,
usb_rcvbulkpipe(priv->udev, MCBA_USB_EP_IN), usb_rcvbulkpipe(priv->udev, MCBA_USB_EP_IN),
buf, MCBA_USB_RX_BUFF_SIZE, buf, MCBA_USB_RX_BUFF_SIZE,
......
...@@ -137,7 +137,8 @@ struct usb_8dev_priv { ...@@ -137,7 +137,8 @@ struct usb_8dev_priv {
u8 *cmd_msg_buffer; u8 *cmd_msg_buffer;
struct mutex usb_8dev_cmd_lock; struct mutex usb_8dev_cmd_lock;
void *rxbuf[MAX_RX_URBS];
dma_addr_t rxbuf_dma[MAX_RX_URBS];
}; };
/* tx frame */ /* tx frame */
...@@ -733,6 +734,7 @@ static int usb_8dev_start(struct usb_8dev_priv *priv) ...@@ -733,6 +734,7 @@ static int usb_8dev_start(struct usb_8dev_priv *priv)
for (i = 0; i < MAX_RX_URBS; i++) { for (i = 0; i < MAX_RX_URBS; i++) {
struct urb *urb = NULL; struct urb *urb = NULL;
u8 *buf; u8 *buf;
dma_addr_t buf_dma;
/* create a URB, and a buffer for it */ /* create a URB, and a buffer for it */
urb = usb_alloc_urb(0, GFP_KERNEL); urb = usb_alloc_urb(0, GFP_KERNEL);
...@@ -742,7 +744,7 @@ static int usb_8dev_start(struct usb_8dev_priv *priv) ...@@ -742,7 +744,7 @@ static int usb_8dev_start(struct usb_8dev_priv *priv)
} }
buf = usb_alloc_coherent(priv->udev, RX_BUFFER_SIZE, GFP_KERNEL, buf = usb_alloc_coherent(priv->udev, RX_BUFFER_SIZE, GFP_KERNEL,
&urb->transfer_dma); &buf_dma);
if (!buf) { if (!buf) {
netdev_err(netdev, "No memory left for USB buffer\n"); netdev_err(netdev, "No memory left for USB buffer\n");
usb_free_urb(urb); usb_free_urb(urb);
...@@ -750,6 +752,8 @@ static int usb_8dev_start(struct usb_8dev_priv *priv) ...@@ -750,6 +752,8 @@ static int usb_8dev_start(struct usb_8dev_priv *priv)
break; break;
} }
urb->transfer_dma = buf_dma;
usb_fill_bulk_urb(urb, priv->udev, usb_fill_bulk_urb(urb, priv->udev,
usb_rcvbulkpipe(priv->udev, usb_rcvbulkpipe(priv->udev,
USB_8DEV_ENDP_DATA_RX), USB_8DEV_ENDP_DATA_RX),
...@@ -767,6 +771,9 @@ static int usb_8dev_start(struct usb_8dev_priv *priv) ...@@ -767,6 +771,9 @@ static int usb_8dev_start(struct usb_8dev_priv *priv)
break; break;
} }
priv->rxbuf[i] = buf;
priv->rxbuf_dma[i] = buf_dma;
/* Drop reference, USB core will take care of freeing it */ /* Drop reference, USB core will take care of freeing it */
usb_free_urb(urb); usb_free_urb(urb);
} }
...@@ -836,6 +843,10 @@ static void unlink_all_urbs(struct usb_8dev_priv *priv) ...@@ -836,6 +843,10 @@ static void unlink_all_urbs(struct usb_8dev_priv *priv)
usb_kill_anchored_urbs(&priv->rx_submitted); usb_kill_anchored_urbs(&priv->rx_submitted);
for (i = 0; i < MAX_RX_URBS; ++i)
usb_free_coherent(priv->udev, RX_BUFFER_SIZE,
priv->rxbuf[i], priv->rxbuf_dma[i]);
usb_kill_anchored_urbs(&priv->tx_submitted); usb_kill_anchored_urbs(&priv->tx_submitted);
atomic_set(&priv->active_tx_urbs, 0); atomic_set(&priv->active_tx_urbs, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment