diff options
Diffstat (limited to 'drivers/bluetooth/btusb.c')
| -rw-r--r-- | drivers/bluetooth/btusb.c | 38 | 
1 files changed, 33 insertions, 5 deletions
| diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 15caa6469538..271963805a38 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -426,6 +426,8 @@ static const struct usb_device_id blacklist_table[] = {  						     BTUSB_WIDEBAND_SPEECH },  	{ USB_DEVICE(0x04ca, 0x4006), .driver_info = BTUSB_REALTEK |  						     BTUSB_WIDEBAND_SPEECH }, +	{ USB_DEVICE(0x0cb8, 0xc549), .driver_info = BTUSB_REALTEK | +						     BTUSB_WIDEBAND_SPEECH },  	/* Realtek 8852CE Bluetooth devices */  	{ USB_DEVICE(0x04ca, 0x4007), .driver_info = BTUSB_REALTEK | @@ -438,6 +440,8 @@ static const struct usb_device_id blacklist_table[] = {  						     BTUSB_WIDEBAND_SPEECH },  	{ USB_DEVICE(0x13d3, 0x3586), .driver_info = BTUSB_REALTEK |  						     BTUSB_WIDEBAND_SPEECH }, +	{ USB_DEVICE(0x13d3, 0x3592), .driver_info = BTUSB_REALTEK | +						     BTUSB_WIDEBAND_SPEECH },  	/* Realtek Bluetooth devices */  	{ USB_VENDOR_AND_INTERFACE_INFO(0x0bda, 0xe0, 0x01, 0x01), @@ -466,6 +470,9 @@ static const struct usb_device_id blacklist_table[] = {  	{ USB_DEVICE(0x0489, 0xe0c8), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, +	{ USB_DEVICE(0x0489, 0xe0e0), .driver_info = BTUSB_MEDIATEK | +						     BTUSB_WIDEBAND_SPEECH | +						     BTUSB_VALID_LE_STATES },  	{ USB_DEVICE(0x04ca, 0x3802), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, @@ -478,9 +485,18 @@ static const struct usb_device_id blacklist_table[] = {  	{ USB_DEVICE(0x13d3, 0x3567), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, +	{ USB_DEVICE(0x13d3, 0x3578), .driver_info = BTUSB_MEDIATEK | +						     BTUSB_WIDEBAND_SPEECH | +						     BTUSB_VALID_LE_STATES }, +	{ USB_DEVICE(0x13d3, 0x3583), .driver_info = BTUSB_MEDIATEK | +						     BTUSB_WIDEBAND_SPEECH | +						     BTUSB_VALID_LE_STATES },  	{ USB_DEVICE(0x0489, 0xe0cd), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, +	{ USB_DEVICE(0x0e8d, 0x0608), .driver_info = BTUSB_MEDIATEK | +						     BTUSB_WIDEBAND_SPEECH | +						     BTUSB_VALID_LE_STATES },  	/* MediaTek MT7922A Bluetooth devices */  	{ USB_DEVICE(0x0489, 0xe0d8), .driver_info = BTUSB_MEDIATEK | @@ -516,19 +532,17 @@ static const struct usb_device_id blacklist_table[] = {  	{ USB_DEVICE(0x0bda, 0xb009), .driver_info = BTUSB_REALTEK },  	{ USB_DEVICE(0x2ff8, 0xb011), .driver_info = BTUSB_REALTEK }, -	/* Additional Realtek 8761B Bluetooth devices */ +	/* Additional Realtek 8761BUV Bluetooth devices */  	{ USB_DEVICE(0x2357, 0x0604), .driver_info = BTUSB_REALTEK |  						     BTUSB_WIDEBAND_SPEECH }, - -	/* Additional Realtek 8761BU Bluetooth devices */  	{ USB_DEVICE(0x0b05, 0x190e), .driver_info = BTUSB_REALTEK |  	  					     BTUSB_WIDEBAND_SPEECH },  	{ USB_DEVICE(0x2550, 0x8761), .driver_info = BTUSB_REALTEK |  						     BTUSB_WIDEBAND_SPEECH }, - -	/* Additional Realtek 8761BUV Bluetooth devices */  	{ USB_DEVICE(0x0bda, 0x8771), .driver_info = BTUSB_REALTEK |  						     BTUSB_WIDEBAND_SPEECH }, +	{ USB_DEVICE(0x7392, 0xc611), .driver_info = BTUSB_REALTEK | +						     BTUSB_WIDEBAND_SPEECH },  	/* Additional Realtek 8821AE Bluetooth devices */  	{ USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK }, @@ -2477,15 +2491,29 @@ static int btusb_mtk_hci_wmt_sync(struct hci_dev *hdev,  	set_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags); +	/* WMT cmd/event doesn't follow up the generic HCI cmd/event handling, +	 * it needs constantly polling control pipe until the host received the +	 * WMT event, thus, we should require to specifically acquire PM counter +	 * on the USB to prevent the interface from entering auto suspended +	 * while WMT cmd/event in progress. +	 */ +	err = usb_autopm_get_interface(data->intf); +	if (err < 0) +		goto err_free_wc; +  	err = __hci_cmd_send(hdev, 0xfc6f, hlen, wc);  	if (err < 0) {  		clear_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags); +		usb_autopm_put_interface(data->intf);  		goto err_free_wc;  	}  	/* Submit control IN URB on demand to process the WMT event */  	err = btusb_mtk_submit_wmt_recv_urb(hdev); + +	usb_autopm_put_interface(data->intf); +  	if (err < 0)  		goto err_free_wc; |