Skip to content

Commit e050d3e

Browse files
mnuralAdityaGarg8
authored andcommitted
Fix freezing on turning off camera
Detailed logs and reason behind can be seen here: t2linux/T2-Debian-and-Ubuntu-Kernel#130 (comment)
1 parent 639c39a commit e050d3e

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

vhci/transfer.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ int bce_vhci_urb_request_cancel(struct bce_vhci_transfer_queue *q, struct urb *u
400400
struct bce_vhci_urb *vurb;
401401
unsigned long flags;
402402
int ret;
403+
enum bce_vhci_urb_state old_state;
403404

404405
spin_lock_irqsave(&q->urb_lock, flags);
405406
if ((ret = usb_hcd_check_unlink_urb(q->vhci->hcd, urb, status))) {
@@ -408,8 +409,19 @@ int bce_vhci_urb_request_cancel(struct bce_vhci_transfer_queue *q, struct urb *u
408409
}
409410

410411
vurb = urb->hcpriv;
412+
413+
old_state = vurb->state; /* save old state to use later because we'll set state as cancelled */
414+
415+
if (old_state == BCE_VHCI_URB_CANCELLED) {
416+
spin_unlock_irqrestore(&q->urb_lock, flags);
417+
pr_debug("bce-vhci: URB %p is already cancelled, skipping\n", urb);
418+
return 0;
419+
}
420+
421+
vurb->state = BCE_VHCI_URB_CANCELLED;
422+
411423
/* If the URB wasn't posted to the device yet, we can still remove it on the host without pausing the queue. */
412-
if (vurb->state != BCE_VHCI_URB_INIT_PENDING) {
424+
if (old_state != BCE_VHCI_URB_INIT_PENDING) {
413425
pr_debug("bce-vhci: [%02x] Cancelling URB\n", q->endp_addr);
414426

415427
spin_unlock_irqrestore(&q->urb_lock, flags);
@@ -425,7 +437,7 @@ int bce_vhci_urb_request_cancel(struct bce_vhci_transfer_queue *q, struct urb *u
425437

426438
usb_hcd_giveback_urb(q->vhci->hcd, urb, status);
427439

428-
if (vurb->state != BCE_VHCI_URB_INIT_PENDING)
440+
if (old_state != BCE_VHCI_URB_INIT_PENDING)
429441
bce_vhci_transfer_queue_resume(q, BCE_VHCI_PAUSE_INTERNAL_WQ);
430442

431443
kfree(vurb);

vhci/transfer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ enum bce_vhci_urb_state {
4444

4545
BCE_VHCI_URB_CONTROL_WAITING_FOR_SETUP_REQUEST,
4646
BCE_VHCI_URB_CONTROL_WAITING_FOR_SETUP_COMPLETION,
47-
BCE_VHCI_URB_CONTROL_COMPLETE
47+
BCE_VHCI_URB_CONTROL_COMPLETE,
48+
49+
BCE_VHCI_URB_CANCELLED
4850
};
4951
struct bce_vhci_urb {
5052
struct urb *urb;

0 commit comments

Comments
 (0)