Message ID | 20201111022108.9834-2-pkshih@realtek.com |
---|---|
State | New |
Headers | show |
Series | rtw88: coex: fix and update settings to enhance coex performance | expand |
> -----Original Message----- > From: kvalo=codeaurora.org@mg.codeaurora.org [mailto:kvalo=codeaurora.org@mg.codeaurora.org] On > Behalf Of Kalle Valo > Sent: Wednesday, November 11, 2020 4:34 PM > To: Pkshih > Cc: tony0620emma@gmail.com; linux-wireless@vger.kernel.org > Subject: Re: [PATCH 01/11] rtw88: coex: update TDMA settings for different beacon interval > > <pkshih@realtek.com> writes: > > > From: Ching-Te Ku <ku920601@realtek.com> > > > > Add considering for different WLAN beacon interval in coexistence > > mechanism. > > Because the WLAN beacon period may be not 100 ms, so it's necessary > > to consider any beacon period and set timer according to the interval. > > > > Signed-off-by: Ching-Te Ku <ku920601@realtek.com> > > Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> > > [...] > > > + } else if (tbtt_interval < 80 && tbtt_interval > 0) { > > + para[1] = (100 / tbtt_interval); > > + > > + if (100 % tbtt_interval != 0) > > + para[1] = para[1] + 1; > > + > > + para[1] = para[1] & 0x3f; > > + } else if (tbtt_interval >= 180) { > > + para[1] = (tbtt_interval / 100); > > + > > + if (tbtt_interval % 100 <= 80) > > + para[1] = para[1] - 1; > > + > > + para[1] = para[1] & 0x3f; > > + para[1] = para[1] | 0x80; > > Magic numbers 0x3f and 0x80, GENMASK() & FIELD_PREP() is the modern way > to handle bitmasks like these. And there's also the operator '|=' > I'll give proper names and use suggested macros it in v2. Thank you. --- Ping-Ke
diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c index 61e91565cd7d..141aaa60c805 100644 --- a/drivers/net/wireless/realtek/rtw88/coex.c +++ b/drivers/net/wireless/realtek/rtw88/coex.c @@ -225,6 +225,7 @@ static void rtw_coex_tdma_timer_base(struct rtw_dev *rtwdev, u8 type) struct rtw_coex *coex = &rtwdev->coex; struct rtw_coex_stat *coex_stat = &coex->stat; u8 para[2] = {0}; + u16 tbtt_interval = coex_stat->wl_beacon_interval; if (coex_stat->tdma_timer_base == type) return; @@ -233,10 +234,29 @@ static void rtw_coex_tdma_timer_base(struct rtw_dev *rtwdev, u8 type) para[0] = COEX_H2C69_TDMA_SLOT; - if (type == 3) /* 4-slot */ + rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], tbtt_interval = %d\n", + tbtt_interval); + + if (type == 3) { /* 4-slot */ para[1] = PARA1_H2C69_TDMA_4SLOT; /* 4-slot */ - else /* 2-slot */ + } else if (tbtt_interval < 80 && tbtt_interval > 0) { + para[1] = (100 / tbtt_interval); + + if (100 % tbtt_interval != 0) + para[1] = para[1] + 1; + + para[1] = para[1] & 0x3f; + } else if (tbtt_interval >= 180) { + para[1] = (tbtt_interval / 100); + + if (tbtt_interval % 100 <= 80) + para[1] = para[1] - 1; + + para[1] = para[1] & 0x3f; + para[1] = para[1] | 0x80; + } else { para[1] = PARA1_H2C69_TDMA_2SLOT; + } rtw_fw_bt_wifi_control(rtwdev, para[0], ¶[1]); diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c index c69397719fdf..1f1b639cd124 100644 --- a/drivers/net/wireless/realtek/rtw88/mac80211.c +++ b/drivers/net/wireless/realtek/rtw88/mac80211.c @@ -351,6 +351,8 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, { struct rtw_dev *rtwdev = hw->priv; struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; + struct rtw_coex *coex = &rtwdev->coex; + struct rtw_coex_stat *coex_stat = &coex->stat; u32 config = 0; mutex_lock(&rtwdev->mutex); @@ -381,6 +383,11 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, config |= PORT_SET_BSSID; } + if (changed & BSS_CHANGED_BEACON_INT) { + if (ieee80211_vif_type_p2p(vif) == NL80211_IFTYPE_STATION) + coex_stat->wl_beacon_interval = conf->beacon_int; + } + if (changed & BSS_CHANGED_BEACON) rtw_fw_download_rsvd_page(rtwdev); diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h index a3a687a63734..3941aea51f9c 100644 --- a/drivers/net/wireless/realtek/rtw88/main.h +++ b/drivers/net/wireless/realtek/rtw88/main.h @@ -1354,6 +1354,7 @@ struct rtw_coex_stat { u8 bt_a2dp_bitpool; u8 bt_iqk_state; + u16 wl_beacon_interval; u8 wl_noisy_level; u8 wl_fw_dbg_info[10]; u8 wl_fw_dbg_info_pre[10];