USB: CDC-ACM: fix poison/unpoison imbalance
suspend() does its poisoning conditionally, resume() does it
unconditionally. On a device with combined interfaces this
will balance, on a device with two interfaces the counter will
go negative and resubmission will fail.
Both actions need to be done conditionally.
Fixes: 6069e3e927 ("USB: cdc-acm: untangle a circular dependency between callback and softint")
Signed-off-by: Oliver Neukum <oneukum@suse.com>
Cc: stable <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20210421074513.4327-1-oneukum@suse.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									ca91fd8c76
								
							
						
					
					
						commit
						a8b3b51961
					
				| @ -1624,12 +1624,13 @@ static int acm_resume(struct usb_interface *intf) | ||||
| 	struct urb *urb; | ||||
| 	int rv = 0; | ||||
| 
 | ||||
| 	acm_unpoison_urbs(acm); | ||||
| 	spin_lock_irq(&acm->write_lock); | ||||
| 
 | ||||
| 	if (--acm->susp_count) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	acm_unpoison_urbs(acm); | ||||
| 
 | ||||
| 	if (tty_port_initialized(&acm->port)) { | ||||
| 		rv = usb_submit_urb(acm->ctrlurb, GFP_ATOMIC); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user