static const struct {
        u16 subver;
        const char *name;
-} bcm_subver_table[] = {
+} bcm_uart_subver_table[] = {
+       { 0x410e, "BCM43341B0"  },      /* 002.001.014 */
+       { }
+};
+
+static const struct {
+       u16 subver;
+       const char *name;
+} bcm_usb_subver_table[] = {
        { 0x210b, "BCM43142A0"  },      /* 001.001.011 */
        { 0x2112, "BCM4314A0"   },      /* 001.001.018 */
        { 0x2118, "BCM20702A0"  },      /* 001.001.024 */
        BT_INFO("%s: BCM: chip id %u", hdev->name, skb->data[1]);
        kfree_skb(skb);
 
-       /* Read USB Product Info */
-       skb = btbcm_read_usb_product(hdev);
-       if (IS_ERR(skb))
-               return PTR_ERR(skb);
+       switch ((rev & 0xf000) >> 12) {
+       case 0:
+               for (i = 0; bcm_uart_subver_table[i].name; i++) {
+                       if (subver == bcm_uart_subver_table[i].subver) {
+                               hw_name = bcm_uart_subver_table[i].name;
+                               break;
+                       }
+               }
 
-       vid = get_unaligned_le16(skb->data + 1);
-       pid = get_unaligned_le16(skb->data + 3);
-       kfree_skb(skb);
+               snprintf(fw_name, sizeof(fw_name), "brcm/%s.hcd",
+                        hw_name ? : "BCM");
+               break;
+       case 1:
+       case 2:
+               /* Read USB Product Info */
+               skb = btbcm_read_usb_product(hdev);
+               if (IS_ERR(skb))
+                       return PTR_ERR(skb);
+
+               vid = get_unaligned_le16(skb->data + 1);
+               pid = get_unaligned_le16(skb->data + 3);
+               kfree_skb(skb);
 
-       for (i = 0; bcm_subver_table[i].name; i++) {
-               if (subver == bcm_subver_table[i].subver) {
-                       hw_name = bcm_subver_table[i].name;
-                       break;
+               for (i = 0; bcm_usb_subver_table[i].name; i++) {
+                       if (subver == bcm_usb_subver_table[i].subver) {
+                               hw_name = bcm_usb_subver_table[i].name;
+                               break;
+                       }
                }
+
+               snprintf(fw_name, sizeof(fw_name), "brcm/%s-%4.4x-%4.4x.hcd",
+                        hw_name ? : "BCM", vid, pid);
+               break;
+       default:
+               return 0;
        }
 
        BT_INFO("%s: %s (%3.3u.%3.3u.%3.3u) build %4.4u", hdev->name,
                hw_name ? : "BCM", (subver & 0x7000) >> 13,
                (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
 
-       snprintf(fw_name, sizeof(fw_name), "brcm/%s-%4.4x-%4.4x.hcd",
-                hw_name ? : "BCM", vid, pid);
-
        err = request_firmware(&fw, fw_name, &hdev->dev);
        if (err < 0) {
                BT_INFO("%s: BCM: patch %s not found", hdev->name, fw_name);