struct rtw_chip_info *chip = rtwdev->chip;
        struct sk_buff *skb, *tmp;
        u8 page_offset = 1, *buf, page_size = chip->page_size;
-       u8 pages = page_offset + num_probes * RTW_PROBE_PG_CNT;
        u16 pg_addr = rtwdev->fifo.rsvd_h2c_info_addr, loc;
        u16 buf_offset = page_size * page_offset;
        u8 tx_desc_sz = chip->tx_pkt_desc_sz;
+       u8 page_cnt, pages;
        unsigned int pkt_len;
        int ret;
 
+       if (rtw_fw_feature_ext_check(&rtwdev->fw, FW_FEATURE_EXT_OLD_PAGE_NUM))
+               page_cnt = RTW_OLD_PROBE_PG_CNT;
+       else
+               page_cnt = RTW_PROBE_PG_CNT;
+
+       pages = page_offset + num_probes * page_cnt;
+
        buf = kzalloc(page_size * pages, GFP_KERNEL);
        if (!buf)
                return -ENOMEM;
        skb_queue_walk_safe(probe_req_list, skb, tmp) {
                skb_unlink(skb, probe_req_list);
                rtw_fill_rsvd_page_desc(rtwdev, skb, RSVD_PROBE_REQ);
-               if (skb->len > page_size * RTW_PROBE_PG_CNT) {
+               if (skb->len > page_size * page_cnt) {
                        ret = -EINVAL;
                        goto out;
                }
                loc = pg_addr - rtwdev->fifo.rsvd_boundary + page_offset;
                __rtw_fw_update_pkt(rtwdev, RTW_PACKET_PROBE_REQ, pkt_len, loc);
 
-               buf_offset += RTW_PROBE_PG_CNT * page_size;
-               page_offset += RTW_PROBE_PG_CNT;
+               buf_offset += page_cnt * page_size;
+               page_offset += page_cnt;
                kfree_skb(skb);
        }
 
 
 #define RTW_EX_CH_INFO_HDR_SIZE                2
 #define RTW_SCAN_WIDTH                 0
 #define RTW_PRI_CH_IDX                 1
-#define RTW_PROBE_PG_CNT               2
+#define RTW_OLD_PROBE_PG_CNT           2
+#define RTW_PROBE_PG_CNT               4
 
 enum rtw_c2h_cmd_id {
        C2H_CCX_TX_RPT = 0x03,
        FW_FEATURE_MAX = BIT(31),
 };
 
+enum rtw_fw_feature_ext {
+       FW_FEATURE_EXT_OLD_PAGE_NUM = BIT(0),
+};
+
 enum rtw_beacon_filter_offload_mode {
        BCN_FILTER_OFFLOAD_MODE_0 = 0,
        BCN_FILTER_OFFLOAD_MODE_1,
        __le32 rsvd5;
 } __packed;
 
+#define RTW_FW_VER_CODE(ver, sub_ver, idx)     \
+       (((ver) << 16) | ((sub_ver) << 8) | (idx))
+#define RTW_FW_SUIT_VER_CODE(s)        \
+       RTW_FW_VER_CODE((s).version, (s).sub_version, (s).sub_index)
+
 /* C2H */
 #define GET_CCX_REPORT_SEQNUM_V0(c2h_payload)  (c2h_payload[6] & 0xfc)
 #define GET_CCX_REPORT_STATUS_V0(c2h_payload)  (c2h_payload[0] & 0xc0)
        return !!(fw->feature & feature);
 }
 
+static inline bool rtw_fw_feature_ext_check(struct rtw_fw_state *fw,
+                                           enum rtw_fw_feature_ext feature)
+{
+       return !!(fw->feature_ext & feature);
+}
+
 void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset,
                               struct sk_buff *skb);
 void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb);
 
        vht_cap->vht_mcs.tx_highest = highest;
 }
 
+static u16 rtw_get_max_scan_ie_len(struct rtw_dev *rtwdev)
+{
+       u16 len;
+
+       len = rtwdev->chip->max_scan_ie_len;
+
+       if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_SCAN_OFFLOAD) &&
+           rtwdev->chip->id == RTW_CHIP_TYPE_8822C)
+               len = IEEE80211_MAX_DATA_LEN;
+       else if (rtw_fw_feature_ext_check(&rtwdev->fw, FW_FEATURE_EXT_OLD_PAGE_NUM))
+               len -= RTW_OLD_PROBE_PG_CNT * TX_PAGE_SIZE;
+
+       return len;
+}
+
 static void rtw_set_supported_band(struct ieee80211_hw *hw,
                                   struct rtw_chip_info *chip)
 {
 
        feature = le32_to_cpu(fw_hdr->feature);
        fw->feature = feature & FW_FEATURE_SIG ? feature : 0;
+
+       if (rtwdev->chip->id == RTW_CHIP_TYPE_8822C &&
+           RTW_FW_SUIT_VER_CODE(rtwdev->fw) < RTW_FW_VER_CODE(9, 9, 13))
+               fw->feature_ext |= FW_FEATURE_EXT_OLD_PAGE_NUM;
 }
 
 static void __update_firmware_info(struct rtw_dev *rtwdev,
 
        hw->wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
        hw->wiphy->max_scan_ssids = RTW_SCAN_MAX_SSIDS;
-       hw->wiphy->max_scan_ie_len = RTW_SCAN_MAX_IE_LEN;
+       hw->wiphy->max_scan_ie_len = rtw_get_max_scan_ie_len(rtwdev);
 
        wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
        wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_SCAN_RANDOM_SN);
 
 #define MAX_PG_CAM_BACKUP_NUM          8
 
 #define RTW_SCAN_MAX_SSIDS             4
-#define RTW_SCAN_MAX_IE_LEN            128
 
 #define RTW_MAX_PATTERN_NUM            12
 #define RTW_MAX_PATTERN_MASK_SIZE      16
 #define RFREG_MASK                     0xfffff
 #define INV_RF_DATA                    0xffffffff
 #define TX_PAGE_SIZE_SHIFT             7
+#define TX_PAGE_SIZE                   (1 << TX_PAGE_SIZE_SHIFT)
 
 #define RTW_CHANNEL_WIDTH_MAX          3
 #define RTW_RF_PATH_MAX                        4
        const char *wow_fw_name;
        const struct wiphy_wowlan_support *wowlan_stub;
        const u8 max_sched_scan_ssids;
+       const u16 max_scan_ie_len;
 
        /* coex paras */
        u32 coex_para_ver;
        u8 sub_index;
        u16 h2c_version;
        u32 feature;
+       u32 feature_ext;
 };
 
 enum rtw_sar_sources {
 
        .max_power_index = 0x3f,
        .csi_buf_pg_num = 0,
        .band = RTW_BAND_2G,
-       .page_size = 128,
+       .page_size = TX_PAGE_SIZE,
        .dig_min = 0x20,
        .ht_supported = true,
        .vht_supported = false,
        .pwr_track_tbl = &rtw8723d_rtw_pwr_track_tbl,
        .iqk_threshold = 8,
        .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
+       .max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
 
        .coex_para_ver = 0x2007022f,
        .bt_desired_ver = 0x2f,
 
        .max_power_index = 0x3f,
        .csi_buf_pg_num = 0,
        .band = RTW_BAND_2G | RTW_BAND_5G,
-       .page_size = 128,
+       .page_size = TX_PAGE_SIZE,
        .dig_min = 0x1c,
        .ht_supported = true,
        .vht_supported = true,
        .bfer_su_max_num = 2,
        .bfer_mu_max_num = 1,
        .ampdu_density = IEEE80211_HT_MPDU_DENSITY_2,
+       .max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
 
        .coex_para_ver = 0x19092746,
        .bt_desired_ver = 0x46,
 
        .max_power_index = 0x3f,
        .csi_buf_pg_num = 0,
        .band = RTW_BAND_2G | RTW_BAND_5G,
-       .page_size = 128,
+       .page_size = TX_PAGE_SIZE,
        .dig_min = 0x1c,
        .ht_supported = true,
        .vht_supported = true,
        .l2h_th_ini_cs = 10 + EDCCA_IGI_BASE,
        .l2h_th_ini_ad = -14 + EDCCA_IGI_BASE,
        .ampdu_density = IEEE80211_HT_MPDU_DENSITY_2,
+       .max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
 
        .coex_para_ver = 0x20070206,
        .bt_desired_ver = 0x6,
 
        .max_power_index = 0x7f,
        .csi_buf_pg_num = 50,
        .band = RTW_BAND_2G | RTW_BAND_5G,
-       .page_size = 128,
+       .page_size = TX_PAGE_SIZE,
        .dig_min = 0x20,
        .default_1ss_tx_path = BB_PATH_A,
        .path_div_supported = true,
        .wowlan_stub = &rtw_wowlan_stub_8822c,
        .max_sched_scan_ssids = 4,
 #endif
+       .max_scan_ie_len = (RTW_PROBE_PG_CNT - 1) * TX_PAGE_SIZE,
        .coex_para_ver = 0x22020720,
        .bt_desired_ver = 0x20,
        .scbd_support = true,