@@ -521,6 +521,9 @@ static int btintel_version_info_tlv(struct hci_dev *hdev,
521
521
version -> min_fw_build_nn , version -> min_fw_build_cw ,
522
522
2000 + version -> min_fw_build_yy );
523
523
break ;
524
+ case BTINTEL_IMG_IML :
525
+ variant = "Intermediate loader" ;
526
+ break ;
524
527
case BTINTEL_IMG_OP :
525
528
variant = "Firmware" ;
526
529
break ;
@@ -2194,10 +2197,26 @@ static void btintel_get_fw_name_tlv(const struct intel_version_tlv *ver,
2194
2197
char * fw_name , size_t len ,
2195
2198
const char * suffix )
2196
2199
{
2200
+ const char * format ;
2197
2201
/* The firmware file name for new generation controllers will be
2198
2202
* ibt-<cnvi_top type+cnvi_top step>-<cnvr_top type+cnvr_top step>
2199
2203
*/
2200
- snprintf (fw_name , len , "intel/ibt-%04x-%04x.%s" ,
2204
+ switch (ver -> cnvi_top & 0xfff ) {
2205
+ /* Only Blazar product supports downloading of intermediate loader
2206
+ * image
2207
+ */
2208
+ case BTINTEL_CNVI_BLAZARI :
2209
+ if (ver -> img_type == BTINTEL_IMG_BOOTLOADER )
2210
+ format = "intel/ibt-%04x-%04x-iml.%s" ;
2211
+ else
2212
+ format = "intel/ibt-%04x-%04x.%s" ;
2213
+ break ;
2214
+ default :
2215
+ format = "intel/ibt-%04x-%04x.%s" ;
2216
+ break ;
2217
+ }
2218
+
2219
+ snprintf (fw_name , len , format ,
2201
2220
INTEL_CNVX_TOP_PACK_SWAB (INTEL_CNVX_TOP_TYPE (ver -> cnvi_top ),
2202
2221
INTEL_CNVX_TOP_STEP (ver -> cnvi_top )),
2203
2222
INTEL_CNVX_TOP_PACK_SWAB (INTEL_CNVX_TOP_TYPE (ver -> cnvr_top ),
@@ -2607,6 +2626,23 @@ static int btintel_bootloader_setup_tlv(struct hci_dev *hdev,
2607
2626
if (err )
2608
2627
return err ;
2609
2628
2629
+ err = btintel_read_version_tlv (hdev , ver );
2630
+ if (err )
2631
+ return err ;
2632
+
2633
+ /* If image type returned is BTINTEL_IMG_IML, then controller supports
2634
+ * intermediae loader image
2635
+ */
2636
+ if (ver -> img_type == BTINTEL_IMG_IML ) {
2637
+ err = btintel_prepare_fw_download_tlv (hdev , ver , & boot_param );
2638
+ if (err )
2639
+ return err ;
2640
+
2641
+ err = btintel_boot (hdev , boot_param );
2642
+ if (err )
2643
+ return err ;
2644
+ }
2645
+
2610
2646
btintel_clear_flag (hdev , INTEL_BOOTLOADER );
2611
2647
2612
2648
btintel_get_fw_name_tlv (ver , ddcname , sizeof (ddcname ), "ddc" );
0 commit comments