Skip to content

Commit 3ddf446

Browse files
committed
Merge tag 'linux-can-fixes-for-6.19-20260116' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can
Marc Kleine-Budde says: ==================== pull-request: can 2026-01-16 The first patch is by me and sets the missing CAN device default capabilities in the CAN device layer. The next patch is by me, target the gs_usb driver and adds the missing unanchor URB on usb_submit_urb() error. The last 5 patches are also from me and fix the same USB-URB leak (as in the gs_usb driver) in the affected CAN-USB driver: ems_usb, esd_usb, kvaser_usb, mcba_usb and usb_8dev. * tag 'linux-can-fixes-for-6.19-20260116' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can: can: usb_8dev: usb_8dev_read_bulk_callback(): fix URB memory leak can: mcba_usb: mcba_usb_read_bulk_callback(): fix URB memory leak can: kvaser_usb: kvaser_usb_read_bulk_callback(): fix URB memory leak can: esd_usb: esd_usb_read_bulk_callback(): fix URB memory leak can: ems_usb: ems_usb_read_bulk_callback(): fix URB memory leak can: gs_usb: gs_usb_receive_bulk_callback(): unanchor URL on usb_submit_urb() error can: dev: alloc_candev_mqs(): add missing default CAN capabilities ==================== Link: https://patch.msgid.link/20260116200323.366877-1-mkl@pengutronix.de Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents ab9b218 + 70458a3 commit 3ddf446

7 files changed

Lines changed: 45 additions & 5 deletions

File tree

drivers/net/can/dev/dev.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max,
332332

333333
can_ml = (void *)priv + ALIGN(sizeof_priv, NETDEV_ALIGN);
334334
can_set_ml_priv(dev, can_ml);
335+
can_set_cap(dev, CAN_CAP_CC);
335336

336337
if (echo_skb_max) {
337338
priv->echo_skb_max = echo_skb_max;

drivers/net/can/usb/ems_usb.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,11 +486,17 @@ static void ems_usb_read_bulk_callback(struct urb *urb)
486486
urb->transfer_buffer, RX_BUFFER_SIZE,
487487
ems_usb_read_bulk_callback, dev);
488488

489+
usb_anchor_urb(urb, &dev->rx_submitted);
490+
489491
retval = usb_submit_urb(urb, GFP_ATOMIC);
492+
if (!retval)
493+
return;
494+
495+
usb_unanchor_urb(urb);
490496

491497
if (retval == -ENODEV)
492498
netif_device_detach(netdev);
493-
else if (retval)
499+
else
494500
netdev_err(netdev,
495501
"failed resubmitting read bulk urb: %d\n", retval);
496502
}

drivers/net/can/usb/esd_usb.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -541,13 +541,20 @@ static void esd_usb_read_bulk_callback(struct urb *urb)
541541
urb->transfer_buffer, ESD_USB_RX_BUFFER_SIZE,
542542
esd_usb_read_bulk_callback, dev);
543543

544+
usb_anchor_urb(urb, &dev->rx_submitted);
545+
544546
err = usb_submit_urb(urb, GFP_ATOMIC);
547+
if (!err)
548+
return;
549+
550+
usb_unanchor_urb(urb);
551+
545552
if (err == -ENODEV) {
546553
for (i = 0; i < dev->net_count; i++) {
547554
if (dev->nets[i])
548555
netif_device_detach(dev->nets[i]->netdev);
549556
}
550-
} else if (err) {
557+
} else {
551558
dev_err(dev->udev->dev.parent,
552559
"failed resubmitting read bulk urb: %pe\n", ERR_PTR(err));
553560
}

drivers/net/can/usb/gs_usb.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,10 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
754754
usb_anchor_urb(urb, &parent->rx_submitted);
755755

756756
rc = usb_submit_urb(urb, GFP_ATOMIC);
757+
if (!rc)
758+
return;
759+
760+
usb_unanchor_urb(urb);
757761

758762
/* USB failure take down all interfaces */
759763
if (rc == -ENODEV) {
@@ -762,6 +766,9 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
762766
if (parent->canch[rc])
763767
netif_device_detach(parent->canch[rc]->netdev);
764768
}
769+
} else if (rc != -ESHUTDOWN && net_ratelimit()) {
770+
netdev_info(netdev, "failed to re-submit IN URB: %pe\n",
771+
ERR_PTR(urb->status));
765772
}
766773
}
767774

drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,14 @@ static void kvaser_usb_read_bulk_callback(struct urb *urb)
361361
urb->transfer_buffer, KVASER_USB_RX_BUFFER_SIZE,
362362
kvaser_usb_read_bulk_callback, dev);
363363

364+
usb_anchor_urb(urb, &dev->rx_submitted);
365+
364366
err = usb_submit_urb(urb, GFP_ATOMIC);
367+
if (!err)
368+
return;
369+
370+
usb_unanchor_urb(urb);
371+
365372
if (err == -ENODEV) {
366373
for (i = 0; i < dev->nchannels; i++) {
367374
struct kvaser_usb_net_priv *priv;
@@ -372,7 +379,7 @@ static void kvaser_usb_read_bulk_callback(struct urb *urb)
372379

373380
netif_device_detach(priv->netdev);
374381
}
375-
} else if (err) {
382+
} else {
376383
dev_err(&dev->intf->dev,
377384
"Failed resubmitting read bulk urb: %d\n", err);
378385
}

drivers/net/can/usb/mcba_usb.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,11 +608,17 @@ static void mcba_usb_read_bulk_callback(struct urb *urb)
608608
urb->transfer_buffer, MCBA_USB_RX_BUFF_SIZE,
609609
mcba_usb_read_bulk_callback, priv);
610610

611+
usb_anchor_urb(urb, &priv->rx_submitted);
612+
611613
retval = usb_submit_urb(urb, GFP_ATOMIC);
614+
if (!retval)
615+
return;
616+
617+
usb_unanchor_urb(urb);
612618

613619
if (retval == -ENODEV)
614620
netif_device_detach(netdev);
615-
else if (retval)
621+
else
616622
netdev_err(netdev, "failed resubmitting read bulk urb: %d\n",
617623
retval);
618624
}

drivers/net/can/usb/usb_8dev.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -541,11 +541,17 @@ static void usb_8dev_read_bulk_callback(struct urb *urb)
541541
urb->transfer_buffer, RX_BUFFER_SIZE,
542542
usb_8dev_read_bulk_callback, priv);
543543

544+
usb_anchor_urb(urb, &priv->rx_submitted);
545+
544546
retval = usb_submit_urb(urb, GFP_ATOMIC);
547+
if (!retval)
548+
return;
549+
550+
usb_unanchor_urb(urb);
545551

546552
if (retval == -ENODEV)
547553
netif_device_detach(netdev);
548-
else if (retval)
554+
else
549555
netdev_err(netdev,
550556
"failed resubmitting read bulk urb: %d\n", retval);
551557
}

0 commit comments

Comments
 (0)