Skip to content

Commit 6dfd65a

Browse files
Merge patch series "can: usb: f81604: handle short interrupt urb messages properly"
In this series Greg Kroah-Hartman takes the recent fixes on the gs_usb driver and applies similar fixes to the f81604 driver. Link: https://patch.msgid.link/2026022331-opal-evaluator-a928@gregkh Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
2 parents 5eaad4f + 952caa5 commit 6dfd65a

1 file changed

Lines changed: 40 additions & 5 deletions

File tree

drivers/net/can/usb/f81604.c

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ static void f81604_read_bulk_callback(struct urb *urb)
413413
{
414414
struct f81604_can_frame *frame = urb->transfer_buffer;
415415
struct net_device *netdev = urb->context;
416+
struct f81604_port_priv *priv = netdev_priv(netdev);
416417
int ret;
417418

418419
if (!netif_device_present(netdev))
@@ -445,10 +446,15 @@ static void f81604_read_bulk_callback(struct urb *urb)
445446
f81604_process_rx_packet(netdev, frame);
446447

447448
resubmit_urb:
449+
usb_anchor_urb(urb, &priv->urbs_anchor);
448450
ret = usb_submit_urb(urb, GFP_ATOMIC);
451+
if (!ret)
452+
return;
453+
usb_unanchor_urb(urb);
454+
449455
if (ret == -ENODEV)
450456
netif_device_detach(netdev);
451-
else if (ret)
457+
else
452458
netdev_err(netdev,
453459
"%s: failed to resubmit read bulk urb: %pe\n",
454460
__func__, ERR_PTR(ret));
@@ -620,6 +626,12 @@ static void f81604_read_int_callback(struct urb *urb)
620626
netdev_info(netdev, "%s: Int URB aborted: %pe\n", __func__,
621627
ERR_PTR(urb->status));
622628

629+
if (urb->actual_length < sizeof(*data)) {
630+
netdev_warn(netdev, "%s: short int URB: %u < %zu\n",
631+
__func__, urb->actual_length, sizeof(*data));
632+
goto resubmit_urb;
633+
}
634+
623635
switch (urb->status) {
624636
case 0: /* success */
625637
break;
@@ -646,10 +658,15 @@ static void f81604_read_int_callback(struct urb *urb)
646658
f81604_handle_tx(priv, data);
647659

648660
resubmit_urb:
661+
usb_anchor_urb(urb, &priv->urbs_anchor);
649662
ret = usb_submit_urb(urb, GFP_ATOMIC);
663+
if (!ret)
664+
return;
665+
usb_unanchor_urb(urb);
666+
650667
if (ret == -ENODEV)
651668
netif_device_detach(netdev);
652-
else if (ret)
669+
else
653670
netdev_err(netdev, "%s: failed to resubmit int urb: %pe\n",
654671
__func__, ERR_PTR(ret));
655672
}
@@ -874,9 +891,27 @@ static void f81604_write_bulk_callback(struct urb *urb)
874891
if (!netif_device_present(netdev))
875892
return;
876893

877-
if (urb->status)
878-
netdev_info(netdev, "%s: Tx URB error: %pe\n", __func__,
879-
ERR_PTR(urb->status));
894+
if (!urb->status)
895+
return;
896+
897+
switch (urb->status) {
898+
case -ENOENT:
899+
case -ECONNRESET:
900+
case -ESHUTDOWN:
901+
return;
902+
default:
903+
break;
904+
}
905+
906+
if (net_ratelimit())
907+
netdev_err(netdev, "%s: Tx URB error: %pe\n", __func__,
908+
ERR_PTR(urb->status));
909+
910+
can_free_echo_skb(netdev, 0, NULL);
911+
netdev->stats.tx_dropped++;
912+
netdev->stats.tx_errors++;
913+
914+
netif_wake_queue(netdev);
880915
}
881916

882917
static void f81604_clear_reg_work(struct work_struct *work)

0 commit comments

Comments
 (0)