u8      ver_offset;     /* offset of version structure in rampatch */
 };
 
+struct qca_custom_firmware {
+       u32 rom_version;
+       u16 board_id;
+       const char *subdirectory;
+};
+
 static const struct qca_device_info qca_devices_table[] = {
        { 0x00000100, 20, 4,  8 }, /* Rome 1.0 */
        { 0x00000101, 20, 4,  8 }, /* Rome 1.1 */
        { 0x00190200, 40, 4, 16 }, /* WCN785x 2.0 */
 };
 
+static const struct qca_custom_firmware qca_custom_btfws[] = {
+       { 0x00130201, 0x030A, "QCA2066" },
+       { },
+};
+
 static u16 qca_extract_board_id(const struct qca_version *ver)
 {
        u16 flag = le16_to_cpu(ver->flag);
        return board_id;
 }
 
+static const char *qca_get_fw_subdirectory(const struct qca_version *ver)
+{
+       const struct qca_custom_firmware *ptr;
+       u32 rom_ver;
+       u16 board_id;
+
+       rom_ver = le32_to_cpu(ver->rom_version);
+       board_id = qca_extract_board_id(ver);
+       if (!board_id)
+               return NULL;
+
+       for (ptr = qca_custom_btfws; ptr->rom_version; ptr++) {
+               if (ptr->rom_version == rom_ver &&
+                   ptr->board_id == board_id)
+                       return ptr->subdirectory;
+       }
+
+       return NULL;
+}
+
 static int btusb_qca_send_vendor_req(struct usb_device *udev, u8 request,
                                     void *data, u16 size)
 {
 {
        struct qca_rampatch_version *rver;
        const struct firmware *fw;
+       const char *fw_subdir;
        u32 ver_rom, ver_patch, rver_rom;
        u16 rver_rom_low, rver_rom_high, rver_patch;
-       char fwname[64];
+       char fwname[80];
        int err;
 
        ver_rom = le32_to_cpu(ver->rom_version);
        ver_patch = le32_to_cpu(ver->patch_version);
 
-       snprintf(fwname, sizeof(fwname), "qca/rampatch_usb_%08x.bin", ver_rom);
+       fw_subdir = qca_get_fw_subdirectory(ver);
+       if (fw_subdir)
+               snprintf(fwname, sizeof(fwname), "qca/%s/rampatch_usb_%08x.bin",
+                        fw_subdir, ver_rom);
+       else
+               snprintf(fwname, sizeof(fwname), "qca/rampatch_usb_%08x.bin",
+                        ver_rom);
 
        err = request_firmware(&fw, fwname, &hdev->dev);
        if (err) {
                                        const struct qca_version *ver)
 {
        u32 rom_version = le32_to_cpu(ver->rom_version);
-       const char *variant;
+       const char *variant, *fw_subdir;
        int len;
        u16 board_id;
 
+       fw_subdir = qca_get_fw_subdirectory(ver);
        board_id = qca_extract_board_id(ver);
 
        switch (le32_to_cpu(ver->ram_version)) {
                break;
        }
 
-       len = snprintf(fwname, max_size, "qca/nvm_usb_%08x", rom_version);
+       if (fw_subdir)
+               len = snprintf(fwname, max_size, "qca/%s/nvm_usb_%08x",
+                              fw_subdir, rom_version);
+       else
+               len = snprintf(fwname, max_size, "qca/nvm_usb_%08x",
+                              rom_version);
        if (variant)
                len += snprintf(fwname + len, max_size - len, "%s", variant);
        if (board_id)
                                    const struct qca_device_info *info)
 {
        const struct firmware *fw;
-       char fwname[64];
+       char fwname[80];
        int err;
 
        btusb_generate_qca_nvm_name(fwname, sizeof(fwname), ver);