diff options
Diffstat (limited to 'drivers/bluetooth/btusb.c')
| -rw-r--r-- | drivers/bluetooth/btusb.c | 55 | 
1 files changed, 39 insertions, 16 deletions
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index e3946f7b736e..e384ef6ff050 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -477,6 +477,7 @@ static const struct usb_device_id quirks_table[] = {  	{ USB_DEVICE(0x8087, 0x0033), .driver_info = BTUSB_INTEL_COMBINED },  	{ USB_DEVICE(0x8087, 0x0035), .driver_info = BTUSB_INTEL_COMBINED },  	{ USB_DEVICE(0x8087, 0x0036), .driver_info = BTUSB_INTEL_COMBINED }, +	{ USB_DEVICE(0x8087, 0x0037), .driver_info = BTUSB_INTEL_COMBINED },  	{ USB_DEVICE(0x8087, 0x0038), .driver_info = BTUSB_INTEL_COMBINED },  	{ USB_DEVICE(0x8087, 0x07da), .driver_info = BTUSB_CSR },  	{ USB_DEVICE(0x8087, 0x07dc), .driver_info = BTUSB_INTEL_COMBINED | @@ -588,6 +589,9 @@ static const struct usb_device_id quirks_table[] = {  	{ USB_DEVICE(0x0489, 0xe0c8), .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(0x0489, 0xe0e0), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, @@ -597,6 +601,9 @@ static const struct usb_device_id quirks_table[] = {  	{ USB_DEVICE(0x04ca, 0x3802), .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 },  	{ USB_DEVICE(0x13d3, 0x3563), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, @@ -612,10 +619,12 @@ static const struct usb_device_id quirks_table[] = {  	{ USB_DEVICE(0x13d3, 0x3583), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, -	{ USB_DEVICE(0x0489, 0xe0cd), .driver_info = BTUSB_MEDIATEK | +	{ USB_DEVICE(0x13d3, 0x3606), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, -	{ USB_DEVICE(0x0e8d, 0x0608), .driver_info = BTUSB_MEDIATEK | + +	/* MediaTek MT7922 Bluetooth devices */ +	{ USB_DEVICE(0x13d3, 0x3585), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, @@ -626,12 +635,6 @@ static const struct usb_device_id quirks_table[] = {  	{ USB_DEVICE(0x0489, 0xe0d9), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, -	{ USB_DEVICE(0x0489, 0xe0f5), .driver_info = BTUSB_MEDIATEK | -						     BTUSB_WIDEBAND_SPEECH | -						     BTUSB_VALID_LE_STATES }, -	{ USB_DEVICE(0x13d3, 0x3568), .driver_info = BTUSB_MEDIATEK | -						     BTUSB_WIDEBAND_SPEECH | -						     BTUSB_VALID_LE_STATES },  	{ USB_DEVICE(0x0489, 0xe0e2), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, @@ -656,14 +659,38 @@ static const struct usb_device_id quirks_table[] = {  	{ USB_DEVICE(0x04ca, 0x3804), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, +	{ USB_DEVICE(0x04ca, 0x38e4), .driver_info = BTUSB_MEDIATEK | +						     BTUSB_WIDEBAND_SPEECH | +						     BTUSB_VALID_LE_STATES }, +	{ USB_DEVICE(0x13d3, 0x3568), .driver_info = BTUSB_MEDIATEK | +						     BTUSB_WIDEBAND_SPEECH | +						     BTUSB_VALID_LE_STATES }, +	{ USB_DEVICE(0x13d3, 0x3605), .driver_info = BTUSB_MEDIATEK | +						     BTUSB_WIDEBAND_SPEECH | +						     BTUSB_VALID_LE_STATES }, +	{ USB_DEVICE(0x13d3, 0x3607), .driver_info = BTUSB_MEDIATEK | +						     BTUSB_WIDEBAND_SPEECH | +						     BTUSB_VALID_LE_STATES }, +	{ USB_DEVICE(0x13d3, 0x3614), .driver_info = BTUSB_MEDIATEK | +						     BTUSB_WIDEBAND_SPEECH | +						     BTUSB_VALID_LE_STATES }, +	{ USB_DEVICE(0x13d3, 0x3615), .driver_info = BTUSB_MEDIATEK | +						     BTUSB_WIDEBAND_SPEECH | +						     BTUSB_VALID_LE_STATES },  	{ USB_DEVICE(0x35f5, 0x7922), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES },  	/* Additional MediaTek MT7925 Bluetooth devices */ +	{ USB_DEVICE(0x0489, 0xe113), .driver_info = BTUSB_MEDIATEK | +						     BTUSB_WIDEBAND_SPEECH | +						     BTUSB_VALID_LE_STATES },  	{ USB_DEVICE(0x13d3, 0x3602), .driver_info = BTUSB_MEDIATEK |  						     BTUSB_WIDEBAND_SPEECH |  						     BTUSB_VALID_LE_STATES }, +	{ USB_DEVICE(0x13d3, 0x3603), .driver_info = BTUSB_MEDIATEK | +						     BTUSB_WIDEBAND_SPEECH | +						     BTUSB_VALID_LE_STATES },  	/* Additional Realtek 8723AE Bluetooth devices */  	{ USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK }, @@ -2951,7 +2978,7 @@ static int btusb_mtk_uhw_reg_read(struct btusb_data *data, u32 reg, u32 *val)  	err = usb_control_msg(data->udev, pipe, 0x01,  			      0xDE,  			      reg >> 16, reg & 0xffff, -			      buf, 4, USB_CTRL_SET_TIMEOUT); +			      buf, 4, USB_CTRL_GET_TIMEOUT);  	if (err < 0) {  		bt_dev_err(hdev, "Failed to read uhw reg(%d)", err);  		goto err_free_buf; @@ -2979,7 +3006,7 @@ static int btusb_mtk_reg_read(struct btusb_data *data, u32 reg, u32 *val)  	err = usb_control_msg(data->udev, pipe, 0x63,  			      USB_TYPE_VENDOR | USB_DIR_IN,  			      reg >> 16, reg & 0xffff, -			      buf, size, USB_CTRL_SET_TIMEOUT); +			      buf, size, USB_CTRL_GET_TIMEOUT);  	if (err < 0)  		goto err_free_buf; @@ -3118,6 +3145,7 @@ static int btusb_mtk_setup(struct hci_dev *hdev)  			bt_dev_err(hdev, "Failed to get fw flavor (%d)", err);  			return err;  		} +		fw_flavor = (fw_flavor & 0x00000080) >> 7;  	}  	mediatek = hci_get_priv(hdev); @@ -3693,7 +3721,7 @@ static int btusb_qca_send_vendor_req(struct usb_device *udev, u8 request,  	 */  	pipe = usb_rcvctrlpipe(udev, 0);  	err = usb_control_msg(udev, pipe, request, USB_TYPE_VENDOR | USB_DIR_IN, -			      0, 0, buf, size, USB_CTRL_SET_TIMEOUT); +			      0, 0, buf, size, USB_CTRL_GET_TIMEOUT);  	if (err < 0) {  		dev_err(&udev->dev, "Failed to access otp area (%d)", err);  		goto done; @@ -4331,11 +4359,6 @@ static int btusb_probe(struct usb_interface *intf,  	hdev->bus = HCI_USB;  	hci_set_drvdata(hdev, data); -	if (id->driver_info & BTUSB_AMP) -		hdev->dev_type = HCI_AMP; -	else -		hdev->dev_type = HCI_PRIMARY; -  	data->hdev = hdev;  	SET_HCIDEV_DEV(hdev, &intf->dev);  |