wifi: rtw89: fw: add version field to BB MCU firmware element
authorPing-Ke Shih <pkshih@realtek.com>
Wed, 13 Dec 2023 00:50:50 +0000 (08:50 +0800)
committerKalle Valo <kvalo@kernel.org>
Fri, 15 Dec 2023 13:38:25 +0000 (15:38 +0200)
8922AE has more than one hardware version, and they use different BB MCU
firmware, so occupy a byte from element priv[] to annotate version. Since
there are more than one firmware and only matched version is adopted,
return 1 to ignore not matched firmware.

     +===========================================+
     |  elm ID  | elm size | version  |          |
     +----------+----------+----------+----------+
     |                     |  element_priv[]     |
     +-------------------------------------------+

                change to  |
                           v

     +===========================================+
     |  elm ID  | elm size | version  |          |
     +----------+----------+----------+----------+
     |                     | cv | element_rsvd[] |
     +-------------------------------------------+

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20231213005054.10568-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h

index f9727c00d8b9751fb06b2b14f377ec7d0d2a4512..76c948da669ec6574adc5640864c197dc04e654b 100644 (file)
@@ -401,10 +401,14 @@ int __rtw89_fw_recognize_from_elm(struct rtw89_dev *rtwdev,
                                  const union rtw89_fw_element_arg arg)
 {
        enum rtw89_fw_type type = arg.fw_type;
+       struct rtw89_hal *hal = &rtwdev->hal;
        struct rtw89_fw_suit *fw_suit;
 
+       if (hal->cv != elm->u.bbmcu.cv)
+               return 1; /* ignore this element */
+
        fw_suit = rtw89_fw_suit_get(rtwdev, type);
-       fw_suit->data = elm->u.common.contents;
+       fw_suit->data = elm->u.bbmcu.contents;
        fw_suit->size = le32_to_cpu(elm->size);
 
        return rtw89_fw_update_ver(rtwdev, type, fw_suit);
@@ -820,6 +824,8 @@ int rtw89_fw_recognize_elements(struct rtw89_dev *rtwdev)
                        goto next;
 
                ret = handler->fn(rtwdev, hdr, handler->arg);
+               if (ret == 1) /* ignore this element */
+                       goto next;
                if (ret)
                        return ret;
 
index 033ea4467876051fa6a01bf869d2370db842509e..f2b61e9ad8a71c2c8a522eea4a58068add5f5745 100644 (file)
@@ -3532,6 +3532,11 @@ struct rtw89_fw_element_hdr {
                                __le32 data;
                        } __packed regs[];
                } __packed reg2;
+               struct {
+                       u8 cv;
+                       u8 priv[7];
+                       u8 contents[];
+               } __packed bbmcu;
                struct {
                        __le32 bitmap; /* bitmap of enum rtw89_fw_txpwr_trk_type */
                        __le32 rsvd;