mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	Bluetooth: btusb: Cancel sync commands for certain URB errors
Cancel sync commands when transmission of URBs fail. This is done for both failures to send a command URB and also when the interrupt URB used to retrieve a response fails. This approach is sufficient to quickly deal with certain errors such as a device being disconnected while synchronous commands are done during initialization. Signed-off-by: Benjamin Berg <bberg@redhat.com> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
		
							parent
							
								
									2250abadd3
								
							
						
					
					
						commit
						c97a747efc
					
				
					 1 changed files with 9 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -933,6 +933,8 @@ static void btusb_intr_complete(struct urb *urb)
 | 
			
		|||
		if (err != -EPERM && err != -ENODEV)
 | 
			
		||||
			bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
 | 
			
		||||
				   urb, -err);
 | 
			
		||||
		if (err != -EPERM)
 | 
			
		||||
			hci_cmd_sync_cancel(hdev, -err);
 | 
			
		||||
		usb_unanchor_urb(urb);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -976,6 +978,8 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
 | 
			
		|||
		if (err != -EPERM && err != -ENODEV)
 | 
			
		||||
			bt_dev_err(hdev, "urb %p submission failed (%d)",
 | 
			
		||||
				   urb, -err);
 | 
			
		||||
		if (err != -EPERM)
 | 
			
		||||
			hci_cmd_sync_cancel(hdev, -err);
 | 
			
		||||
		usb_unanchor_urb(urb);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1331,10 +1335,13 @@ static void btusb_tx_complete(struct urb *urb)
 | 
			
		|||
	if (!test_bit(HCI_RUNNING, &hdev->flags))
 | 
			
		||||
		goto done;
 | 
			
		||||
 | 
			
		||||
	if (!urb->status)
 | 
			
		||||
	if (!urb->status) {
 | 
			
		||||
		hdev->stat.byte_tx += urb->transfer_buffer_length;
 | 
			
		||||
	else
 | 
			
		||||
	} else {
 | 
			
		||||
		if (hci_skb_pkt_type(skb) == HCI_COMMAND_PKT)
 | 
			
		||||
			hci_cmd_sync_cancel(hdev, -urb->status);
 | 
			
		||||
		hdev->stat.err_tx++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
	spin_lock_irqsave(&data->txlock, flags);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue