1: b6cc13fd3e33 = 1: 477ecd982462 wifi: rtw88: 8812a, 8814a: enable STBC for HT transmissions 2: 0685b8c72d37 ! 2: e757681e159e wifi: rtw88: 88xxa: receive VHT SU beamformed transmissions @@ drivers/net/wireless/realtek/rtw88/bf.h #define BIT_DIS_CHK_VHTSIGB_CRC BIT(6) #define BIT_DIS_CHK_VHTSIGA_CRC BIT(5)  - ## drivers/net/wireless/realtek/rtw88/main.c ## -@@ drivers/net/wireless/realtek/rtw88/main.c: static void rtw_init_ht_cap(struct rtw_dev *rtwdev, - static void rtw_init_vht_cap(struct rtw_dev *rtwdev, - struct ieee80211_sta_vht_cap *vht_cap) - { -+ const struct rtw_chip_info *chip = rtwdev->chip; - struct rtw_efuse *efuse = &rtwdev->efuse; - u16 mcs_map = 0; - __le16 highest; -@@ drivers/net/wireless/realtek/rtw88/main.c: static void rtw_init_vht_cap(struct rtw_dev *rtwdev, - 0; - if (rtwdev->hal.rf_path_num > 1) - vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC; -- vht_cap->cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE | -- IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE; -- vht_cap->cap |= (rtwdev->hal.bfee_sts_cap << -- IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT); -+ if (rtw_bf_support && chip->bfer_su_max_num) { -+ vht_cap->cap |= IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE; -+ vht_cap->cap |= rtwdev->hal.bfee_sts_cap << -+ IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT; -+ } -+ if (rtw_bf_support && chip->bfer_mu_max_num) -+ vht_cap->cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; -  - if (rtw_chip_has_rx_ldpc(rtwdev)) - vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC; - ## drivers/net/wireless/realtek/rtw88/reg.h ##  @@ #define REG_IQK_COM96 0x0984 @@ drivers/net/wireless/realtek/rtw88/rtw88xxa.c: static void rtw88xxa_read_usb_typ efuse->hw_cap.nss = 1; else efuse->hw_cap.nss = 2; -+ hal->bfee_sts_cap = 1; ++ rtwdev->hal.bfee_sts_cap = 1;  if (rtwdev->chip->id == RTW_CHIP_TYPE_8821A) goto print_hw_cap; -: ------------ > 3: cdb165ae672c wifi: rtw88: correctly expose beamformee capabilities 3: cdd21b1490f6 = 4: 6e4873e20788 wifi: rtw88: prepare frequency-offset correction for more chips 4: 1bd2718f04e2 = 5: 603b4b07a154 wifi: rtw88: 88xxa: correct carrier-frequency offset 5: 0b3688aa547b ! 6: 60a9863efe85 wifi: rtw88: 88xxa: adapt channel sensing to receiver gain @@ drivers/net/wireless/realtek/rtw88/main.h: struct rtw_dm_info { u8 scan_density; };  + ## drivers/net/wireless/realtek/rtw88/phy.c ## +@@ drivers/net/wireless/realtek/rtw88/phy.c: void rtw_phy_dig_set_max_coverage(struct rtw_dev *rtwdev) + DIG_CVRG_MIN); +  + rtw_phy_dig_write(rtwdev, DIG_CVRG_MIN); ++ ++ /* EDCCA thresholds can be relative to the IGI */ ++ if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_ADAPTIVITY)) ++ rtw_phy_adaptivity(rtwdev); + } +  + void rtw_phy_dig_reset(struct rtw_dev *rtwdev) +@@ drivers/net/wireless/realtek/rtw88/phy.c: void rtw_phy_dig_reset(struct rtw_dev *rtwdev) + rtw_dbg(rtwdev, RTW_DBG_PHY, "Resetting IGI=%#x\n", last_igi); +  + rtw_phy_dig_write(rtwdev, last_igi); ++ ++ if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_ADAPTIVITY)) ++ rtw_phy_adaptivity(rtwdev); + } +  + static bool + ## drivers/net/wireless/realtek/rtw88/rtw8812a.c ##  @@ drivers/net/wireless/realtek/rtw88/rtw8812a.c: static const struct rtw_chip_ops rtw8812a_ops = { .coex_set_wl_rx_gain = rtw8821a_coex_cfg_wl_rx_gain, @@ drivers/net/wireless/realtek/rtw88/rtw88xxa.c: void rtw88xxa_cfo_track(struct rt  +void rtw88xxa_adaptivity(struct rtw_dev *rtwdev)  +{  + struct rtw_dm_info *dm_info = &rtwdev->dm_info; -+ int igi_diff = EDCCA_IGI_BASE - dm_info->igi_history[0]; ++ /* igi_history[0] keeps the pre-scan IGI while scanning */ ++ u8 igi = rtw_read32_mask(rtwdev, REG_RXIGI_A, 0x7f); ++ int igi_diff = EDCCA_IGI_BASE - igi;  + s8 l2h_lb = dm_info->l2h_th_lb;  + s8 l2h, h2l;  + @@ drivers/net/wireless/realtek/rtw88/rtw88xxa.c: void rtw88xxa_cfo_track(struct rt  +  + rtw_dbg(rtwdev, RTW_DBG_ADAPTIVITY,  + "EDCCA mode %d, IGI 0x%x, L2H %d, H2L %d\n", -+ dm_info->edcca_mode, dm_info->igi_history[0], l2h, h2l); ++ dm_info->edcca_mode, igi, l2h, h2l);  +}  +EXPORT_SYMBOL(rtw88xxa_adaptivity);  + 6: aa818afb6fd6 = 7: 4e835de5e99c wifi: rtw88: 8812a, 8821a: respect peer A-MPDU size limits