@@ -2876,6 +2876,9 @@ static int btusb_set_bdaddr_wcn6855(struct hci_dev *hdev,
28762876#define QCA_DFU_TIMEOUT 3000
28772877#define QCA_FLAG_MULTI_NVM 0x80
28782878
2879+ #define WCN6855_2_0_RAM_VERSION_GF 0x400c1200
2880+ #define WCN6855_2_1_RAM_VERSION_GF 0x400c1211
2881+
28792882struct qca_version {
28802883 __le32 rom_version ;
28812884 __le32 patch_version ;
@@ -2907,6 +2910,7 @@ static const struct qca_device_info qca_devices_table[] = {
29072910 { 0x00000302 , 28 , 4 , 16 }, /* Rome 3.2 */
29082911 { 0x00130100 , 40 , 4 , 16 }, /* WCN6855 1.0 */
29092912 { 0x00130200 , 40 , 4 , 16 }, /* WCN6855 2.0 */
2913+ { 0x00130201 , 40 , 4 , 16 }, /* WCN6855 2.1 */
29102914};
29112915
29122916static int btusb_qca_send_vendor_req (struct usb_device * udev , u8 request ,
@@ -3061,6 +3065,40 @@ static int btusb_setup_qca_load_rampatch(struct hci_dev *hdev,
30613065 return err ;
30623066}
30633067
3068+ static void btusb_generate_qca_nvm_name (char * fwname , size_t max_size ,
3069+ const struct qca_version * ver )
3070+ {
3071+ u32 rom_version = le32_to_cpu (ver -> rom_version );
3072+ u16 flag = le16_to_cpu (ver -> flag );
3073+
3074+ if (((flag >> 8 ) & 0xff ) == QCA_FLAG_MULTI_NVM ) {
3075+ u16 board_id = le16_to_cpu (ver -> board_id );
3076+ const char * variant ;
3077+
3078+ switch (le32_to_cpu (ver -> ram_version )) {
3079+ case WCN6855_2_0_RAM_VERSION_GF :
3080+ case WCN6855_2_1_RAM_VERSION_GF :
3081+ variant = "_gf" ;
3082+ break ;
3083+ default :
3084+ variant = "" ;
3085+ break ;
3086+ }
3087+
3088+ if (board_id == 0 ) {
3089+ snprintf (fwname , max_size , "qca/nvm_usb_%08x%s.bin" ,
3090+ rom_version , variant );
3091+ } else {
3092+ snprintf (fwname , max_size , "qca/nvm_usb_%08x%s_%04x.bin" ,
3093+ rom_version , variant , board_id );
3094+ }
3095+ } else {
3096+ snprintf (fwname , max_size , "qca/nvm_usb_%08x.bin" ,
3097+ rom_version );
3098+ }
3099+
3100+ }
3101+
30643102static int btusb_setup_qca_load_nvm (struct hci_dev * hdev ,
30653103 struct qca_version * ver ,
30663104 const struct qca_device_info * info )
@@ -3069,20 +3107,7 @@ static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
30693107 char fwname [64 ];
30703108 int err ;
30713109
3072- if (((ver -> flag >> 8 ) & 0xff ) == QCA_FLAG_MULTI_NVM ) {
3073- /* if boardid equal 0, use default nvm without surfix */
3074- if (le16_to_cpu (ver -> board_id ) == 0x0 ) {
3075- snprintf (fwname , sizeof (fwname ), "qca/nvm_usb_%08x.bin" ,
3076- le32_to_cpu (ver -> rom_version ));
3077- } else {
3078- snprintf (fwname , sizeof (fwname ), "qca/nvm_usb_%08x_%04x.bin" ,
3079- le32_to_cpu (ver -> rom_version ),
3080- le16_to_cpu (ver -> board_id ));
3081- }
3082- } else {
3083- snprintf (fwname , sizeof (fwname ), "qca/nvm_usb_%08x.bin" ,
3084- le32_to_cpu (ver -> rom_version ));
3085- }
3110+ btusb_generate_qca_nvm_name (fwname , sizeof (fwname ), ver );
30863111
30873112 err = request_firmware (& fw , fwname , & hdev -> dev );
30883113 if (err ) {
0 commit comments