|
|
@@ -343,6 +343,7 @@ static const struct usb_device_id blacklist_table[] = {
|
|
|
/* Intel Bluetooth devices */
|
|
|
{ USB_DEVICE(0x8087, 0x0025), .driver_info = BTUSB_INTEL_NEW },
|
|
|
{ USB_DEVICE(0x8087, 0x0026), .driver_info = BTUSB_INTEL_NEW },
|
|
|
+ { USB_DEVICE(0x8087, 0x0029), .driver_info = BTUSB_INTEL_NEW },
|
|
|
{ USB_DEVICE(0x8087, 0x07da), .driver_info = BTUSB_CSR },
|
|
|
{ USB_DEVICE(0x8087, 0x07dc), .driver_info = BTUSB_INTEL },
|
|
|
{ USB_DEVICE(0x8087, 0x0a2a), .driver_info = BTUSB_INTEL },
|
|
|
@@ -2054,6 +2055,35 @@ static int btusb_send_frame_intel(struct hci_dev *hdev, struct sk_buff *skb)
|
|
|
return -EILSEQ;
|
|
|
}
|
|
|
|
|
|
+static bool btusb_setup_intel_new_get_fw_name(struct intel_version *ver,
|
|
|
+ struct intel_boot_params *params,
|
|
|
+ char *fw_name, size_t len,
|
|
|
+ const char *suffix)
|
|
|
+{
|
|
|
+ switch (ver->hw_variant) {
|
|
|
+ case 0x0b: /* SfP */
|
|
|
+ case 0x0c: /* WsP */
|
|
|
+ snprintf(fw_name, len, "intel/ibt-%u-%u.%s",
|
|
|
+ le16_to_cpu(ver->hw_variant),
|
|
|
+ le16_to_cpu(params->dev_revid),
|
|
|
+ suffix);
|
|
|
+ break;
|
|
|
+ case 0x11: /* JfP */
|
|
|
+ case 0x12: /* ThP */
|
|
|
+ case 0x13: /* HrP */
|
|
|
+ case 0x14: /* CcP */
|
|
|
+ snprintf(fw_name, len, "intel/ibt-%u-%u-%u.%s",
|
|
|
+ le16_to_cpu(ver->hw_variant),
|
|
|
+ le16_to_cpu(ver->hw_revision),
|
|
|
+ le16_to_cpu(ver->fw_revision),
|
|
|
+ suffix);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
static int btusb_setup_intel_new(struct hci_dev *hdev)
|
|
|
{
|
|
|
struct btusb_data *data = hci_get_drvdata(hdev);
|
|
|
@@ -2105,7 +2135,7 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
|
|
|
case 0x11: /* JfP */
|
|
|
case 0x12: /* ThP */
|
|
|
case 0x13: /* HrP */
|
|
|
- case 0x14: /* QnJ, IcP */
|
|
|
+ case 0x14: /* CcP */
|
|
|
break;
|
|
|
default:
|
|
|
bt_dev_err(hdev, "Unsupported Intel hardware variant (%u)",
|
|
|
@@ -2189,23 +2219,9 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
|
|
|
* ibt-<hw_variant>-<hw_revision>-<fw_revision>.sfi.
|
|
|
*
|
|
|
*/
|
|
|
- switch (ver.hw_variant) {
|
|
|
- case 0x0b: /* SfP */
|
|
|
- case 0x0c: /* WsP */
|
|
|
- snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.sfi",
|
|
|
- le16_to_cpu(ver.hw_variant),
|
|
|
- le16_to_cpu(params.dev_revid));
|
|
|
- break;
|
|
|
- case 0x11: /* JfP */
|
|
|
- case 0x12: /* ThP */
|
|
|
- case 0x13: /* HrP */
|
|
|
- case 0x14: /* QnJ, IcP */
|
|
|
- snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u-%u.sfi",
|
|
|
- le16_to_cpu(ver.hw_variant),
|
|
|
- le16_to_cpu(ver.hw_revision),
|
|
|
- le16_to_cpu(ver.fw_revision));
|
|
|
- break;
|
|
|
- default:
|
|
|
+ err = btusb_setup_intel_new_get_fw_name(&ver, ¶ms, fwname,
|
|
|
+ sizeof(fwname), "sfi");
|
|
|
+ if (!err) {
|
|
|
bt_dev_err(hdev, "Unsupported Intel firmware naming");
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
@@ -2221,23 +2237,9 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
|
|
|
/* Save the DDC file name for later use to apply once the firmware
|
|
|
* downloading is done.
|
|
|
*/
|
|
|
- switch (ver.hw_variant) {
|
|
|
- case 0x0b: /* SfP */
|
|
|
- case 0x0c: /* WsP */
|
|
|
- snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.ddc",
|
|
|
- le16_to_cpu(ver.hw_variant),
|
|
|
- le16_to_cpu(params.dev_revid));
|
|
|
- break;
|
|
|
- case 0x11: /* JfP */
|
|
|
- case 0x12: /* ThP */
|
|
|
- case 0x13: /* HrP */
|
|
|
- case 0x14: /* QnJ, IcP */
|
|
|
- snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u-%u.ddc",
|
|
|
- le16_to_cpu(ver.hw_variant),
|
|
|
- le16_to_cpu(ver.hw_revision),
|
|
|
- le16_to_cpu(ver.fw_revision));
|
|
|
- break;
|
|
|
- default:
|
|
|
+ err = btusb_setup_intel_new_get_fw_name(&ver, ¶ms, fwname,
|
|
|
+ sizeof(fwname), "ddc");
|
|
|
+ if (!err) {
|
|
|
bt_dev_err(hdev, "Unsupported Intel firmware naming");
|
|
|
return -EINVAL;
|
|
|
}
|