rtw89: correct scan behavior and results
Ping-Ke Shih
maintainercover rtw89: correct scan behavior and results
First patch fixes no ack to probe response for randomize MAC sacn. The second one is to report correct frequency and rate while scanning.
Note: this patchset add some functions followed by the patchset
"rtw89: fix crash when loading firmware file on certain platforms"
Ping-Ke Shih (1):
rtw89: update scan_mac_addr during scanning period
Po Hao Huang (1):
rtw89: fix incorrect channel info during scan
drivers/net/wireless/realtek/rtw89/cam.c | 22 ++-- drivers/net/wireless/realtek/rtw89/cam.h | 3 +- drivers/net/wireless/realtek/rtw89/core.c | 57 ++++++--- drivers/net/wireless/realtek/rtw89/core.h | 4 + drivers/net/wireless/realtek/rtw89/debug.c | 2 +- drivers/net/wireless/realtek/rtw89/fw.c | 5 +- drivers/net/wireless/realtek/rtw89/fw.h | 3 +- drivers/net/wireless/realtek/rtw89/mac.c | 4 +- drivers/net/wireless/realtek/rtw89/mac80211.c | 6 +- drivers/net/wireless/realtek/rtw89/phy.c | 111 ++++++++++++++++++ drivers/net/wireless/realtek/rtw89/phy.h | 60 ++++++++++ drivers/net/wireless/realtek/rtw89/reg.h | 23 ++++ drivers/net/wireless/realtek/rtw89/rtw8852a.c | 19 +++ drivers/net/wireless/realtek/rtw89/txrx.h | 45 +------ 14 files changed, 292 insertions(+), 72 deletions(-)
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 1/2 rtw89: update scan_mac_addr during scanning period
Update scan_mac_addr to address CAM as A1, so hardware can ACK probe response properly.
--- drivers/net/wireless/realtek/rtw89/cam.c | 22 ++++++++++--------- drivers/net/wireless/realtek/rtw89/cam.h | 3 ++- drivers/net/wireless/realtek/rtw89/core.c | 4 ++-- drivers/net/wireless/realtek/rtw89/fw.c | 5 +++-- drivers/net/wireless/realtek/rtw89/fw.h | 3 ++- drivers/net/wireless/realtek/rtw89/mac.c | 4 ++-- drivers/net/wireless/realtek/rtw89/mac80211.c | 6 ++++- 7 files changed, 28 insertions(+), 19 deletions(-)
drivers/net/wireless/realtek/rtw89/cam.c +12 -10
@@ -243,7 +243,7 @@ static int rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev, addr_cam->sec_ent[key_idx] = sec_cam->sec_cam_idx; addr_cam->sec_entries[key_idx] = sec_cam;set_bit (key_idx, addr_cam->sec_cam_map); - ret =rtw89_fw_h2c_cam (rtwdev, rtwvif); + ret =rtw89_fw_h2c_cam (rtwdev, rtwvif,NULL );if (ret) {rtw89_err (rtwdev,"failed to update addr cam sec entry: %d\n" , ret);
@@ -394,7 +394,7 @@ int rtw89_cam_sec_key_del(struct rtw89_dev *rtwdev,clear_bit (key_idx, addr_cam->sec_cam_map); addr_cam->sec_entries[key_idx] =NULL ;if (inform_fw) { - ret =rtw89_fw_h2c_cam (rtwdev, rtwvif); + ret =rtw89_fw_h2c_cam (rtwdev, rtwvif,NULL );if (ret)rtw89_err (rtwdev,"failed to update cam del key: %d\n" , ret); }
@@ -593,7 +593,7 @@ int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev,return 0 ; } -static u8 rtw89_cam_addr_hash (u8 start,u8 *addr) +static u8 rtw89_cam_addr_hash (u8 start,const u8 *addr) {u8 hash =0 ;u8 i;
@@ -606,12 +606,14 @@ static u8 rtw89_cam_addr_hash(u8 start, u8 *addr)void rtw89_cam_fill_addr_cam_info (struct rtw89_dev *rtwdev,struct rtw89_vif *rtwvif, +const u8 *scan_mac_addr,u8 *cmd) {struct ieee80211_vif *vif =rtwvif_to_vif (rtwvif);struct ieee80211_sta *sta;struct rtw89_sta *rtwsta;struct rtw89_addr_cam_entry *addr_cam = &rtwvif->addr_cam; +const u8 *sma = scan_mac_addr ? scan_mac_addr : rtwvif->mac_addr;u8 sma_hash, tma_hash, addr_msk_start;u8 sma_start =0 ;u8 tma_start =0 ;
@@ -623,7 +625,7 @@ void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,else if (addr_cam->mask_sel ==RTW89_TMA ) tma_start = addr_msk_start; } - sma_hash =rtw89_cam_addr_hash (sma_start, rtwvif->mac_addr); + sma_hash =rtw89_cam_addr_hash (sma_start, sma); tma_hash =rtw89_cam_addr_hash (tma_start, addr_cam->tma);FWCMD_SET_ADDR_IDX (cmd, addr_cam->addr_cam_idx);
@@ -642,12 +644,12 @@ void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,FWCMD_SET_ADDR_BSSID_CAM_IDX (cmd, addr_cam->bssid_cam_idx); -FWCMD_SET_ADDR_SMA0 (cmd, rtwvif->mac_addr[0 ]); -FWCMD_SET_ADDR_SMA1 (cmd, rtwvif->mac_addr[1 ]); -FWCMD_SET_ADDR_SMA2 (cmd, rtwvif->mac_addr[2 ]); -FWCMD_SET_ADDR_SMA3 (cmd, rtwvif->mac_addr[3 ]); -FWCMD_SET_ADDR_SMA4 (cmd, rtwvif->mac_addr[4 ]); -FWCMD_SET_ADDR_SMA5 (cmd, rtwvif->mac_addr[5 ]); +FWCMD_SET_ADDR_SMA0 (cmd, sma[0 ]); +FWCMD_SET_ADDR_SMA1 (cmd, sma[1 ]); +FWCMD_SET_ADDR_SMA2 (cmd, sma[2 ]); +FWCMD_SET_ADDR_SMA3 (cmd, sma[3 ]); +FWCMD_SET_ADDR_SMA4 (cmd, sma[4 ]); +FWCMD_SET_ADDR_SMA5 (cmd, sma[5 ]);FWCMD_SET_ADDR_TMA0 (cmd, addr_cam->tma[0 ]);FWCMD_SET_ADDR_TMA1 (cmd, addr_cam->tma[1 ]);
drivers/net/wireless/realtek/rtw89/cam.h +2 -1
@@ -347,7 +347,8 @@ static inline void FWCMD_SET_ADDR_BSSID_BSSID5(void *cmd, u32 value)int rtw89_cam_init (struct rtw89_dev *rtwdev,struct rtw89_vif *vif);void rtw89_cam_deinit (struct rtw89_dev *rtwdev,struct rtw89_vif *vif);void rtw89_cam_fill_addr_cam_info (struct rtw89_dev *rtwdev, -struct rtw89_vif *vif,u8 *cmd); +struct rtw89_vif *vif, +const u8 *scan_mac_addr,u8 *cmd);int rtw89_cam_fill_bssid_cam_info (struct rtw89_dev *rtwdev,struct rtw89_vif *vif,u8 *cmd); int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev,
drivers/net/wireless/realtek/rtw89/core.c +2 -2
@@ -1872,7 +1872,7 @@ int rtw89_core_sta_disconnect(struct rtw89_dev *rtwdev, }/* update cam aid mac_id net_type */ -rtw89_fw_h2c_cam (rtwdev, rtwvif); +rtw89_fw_h2c_cam (rtwdev, rtwvif,NULL );if (ret) {rtw89_warn (rtwdev,"failed to send h2c cam\n" );return ret;
@@ -1908,7 +1908,7 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev, }/* update cam aid mac_id net_type */ -rtw89_fw_h2c_cam (rtwdev, rtwvif); +rtw89_fw_h2c_cam (rtwdev, rtwvif,NULL );if (ret) {rtw89_warn (rtwdev,"failed to send h2c cam\n" );return ret;
drivers/net/wireless/realtek/rtw89/fw.c +3 -2
@@ -523,7 +523,8 @@ void rtw89_unload_firmware(struct rtw89_dev *rtwdev) }#define H2C_CAM_LEN 60 -int rtw89_fw_h2c_cam (struct rtw89_dev *rtwdev,struct rtw89_vif *rtwvif) +int rtw89_fw_h2c_cam (struct rtw89_dev *rtwdev,struct rtw89_vif *rtwvif, +const u8 *scan_mac_addr) {struct sk_buff *skb;
@@ -533,7 +534,7 @@ int rtw89_fw_h2c_cam(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)return -ENOMEM ; }skb_put (skb,H2C_CAM_LEN ); -rtw89_cam_fill_addr_cam_info (rtwdev, rtwvif, skb->data); +rtw89_cam_fill_addr_cam_info (rtwdev, rtwvif, scan_mac_addr, skb->data);rtw89_cam_fill_bssid_cam_info (rtwdev, rtwvif, skb->data); rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
drivers/net/wireless/realtek/rtw89/fw.h +2 -1
@@ -1590,7 +1590,8 @@ int rtw89_fw_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta);int rtw89_fw_h2c_txtime_cmac_tbl (struct rtw89_dev *rtwdev,struct rtw89_sta *rtwsta); -int rtw89_fw_h2c_cam (struct rtw89_dev *rtwdev,struct rtw89_vif *vif); +int rtw89_fw_h2c_cam (struct rtw89_dev *rtwdev,struct rtw89_vif *vif, +const u8 *scan_mac_addr);void rtw89_fw_c2h_irqsafe (struct rtw89_dev *rtwdev,struct sk_buff *c2h);void rtw89_fw_c2h_work (struct work_struct *work); int rtw89_fw_h2c_vif_maintain(struct rtw89_dev *rtwdev,
drivers/net/wireless/realtek/rtw89/mac.c +2 -2
@@ -2991,7 +2991,7 @@ int rtw89_mac_vif_init(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)if (ret)return ret; - ret =rtw89_fw_h2c_cam (rtwdev, rtwvif); + ret =rtw89_fw_h2c_cam (rtwdev, rtwvif,NULL );if (ret)return ret;
@@ -3012,7 +3012,7 @@ int rtw89_mac_vif_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)rtw89_cam_deinit (rtwdev, rtwvif); - ret =rtw89_fw_h2c_cam (rtwdev, rtwvif); + ret =rtw89_fw_h2c_cam (rtwdev, rtwvif,NULL );if (ret)return ret;
drivers/net/wireless/realtek/rtw89/mac80211.c +5 -1
@@ -336,7 +336,7 @@ static void rtw89_ops_bss_info_changed(struct ieee80211_hw *hw,if (changed &BSS_CHANGED_BSSID ) {ether_addr_copy (rtwvif->bssid, conf->bssid);rtw89_cam_bssid_changed (rtwdev, rtwvif); -rtw89_fw_h2c_cam (rtwdev, rtwvif); +rtw89_fw_h2c_cam (rtwdev, rtwvif,NULL ); }if (changed &BSS_CHANGED_ERP_SLOT )
@@ -615,6 +615,7 @@ static void rtw89_ops_sw_scan_start(struct ieee80211_hw *hw, const u8 *mac_addr) {struct rtw89_dev *rtwdev = hw->priv; +struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;struct rtw89_hal *hal = &rtwdev->hal;mutex_lock (&rtwdev->mutex);
@@ -623,6 +624,7 @@ static void rtw89_ops_sw_scan_start(struct ieee80211_hw *hw,rtw89_btc_ntfy_scan_start (rtwdev,RTW89_PHY_0 , hal->current_band_type);rtw89_chip_rfk_scan (rtwdev, true);rtw89_hci_recalc_int_mit (rtwdev); +rtw89_fw_h2c_cam (rtwdev, rtwvif, mac_addr);mutex_unlock (&rtwdev->mutex); }
@@ -630,8 +632,10 @@ static void rtw89_ops_sw_scan_complete(struct ieee80211_hw *hw, struct ieee80211_vif *vif) {struct rtw89_dev *rtwdev = hw->priv; +struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;mutex_lock (&rtwdev->mutex); +rtw89_fw_h2c_cam (rtwdev, rtwvif,NULL );rtw89_chip_rfk_scan (rtwdev, false);rtw89_btc_ntfy_scan_finish (rtwdev,RTW89_PHY_0 ); rtwdev->scanning = false;
Signature · 1 line
2.25.1
Re: [PATCH 1/2] rtw89: update scan_mac_addr during scanning period
Quoted 4 lines · Ping-Ke Shih
Update
scan_mac_addrto address CAM as A1, so hardware can ACK probe response properly.Signed-off-by Ping-Ke Shih <[email protected]>
Failed to apply to wireless-drivers-next, please respin.
error: sha1 information is lacking or useless (drivers/net/wireless/realtek/rtw89/txrx.h).
error: could not build fake ancestor
hint: Use 'git am --show-current-patch' to see the failed patch
Applying: rtw89: fix incorrect channel info during scan
Patch failed at 0001 rtw89: fix incorrect channel info during scan
2 patches set to Changes Requested.
12613957 [1/2] rtw89: update scan_mac_addr during scanning period 12613959 [2/2] rtw89: fix incorrect channel info during scan
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
Pkshih
maintainerRe: [PATCH 1/2] rtw89: update scan_mac_addr during scanning period
Quoted 15 lines · Kalle Valo
Quoted 4 lines · Ping-Ke Shih
Update
scan_mac_addrto address CAM as A1, so hardware can ACK probe response properly.Signed-off-by Ping-Ke Shih <[email protected]>Failed to apply to wireless-drivers-next, please respin.
error: sha1 information is lacking or useless (
drivers/net/wireless/realtek/rtw89/txrx.h).
error: could not build fake ancestor
hint: Use 'git am --show-current-patch' to see the failed patch
Applying: rtw89: fix incorrect channel info during scan
Patch failed at 0001 rtw89: fix incorrect channel info during scan
Quoted 5 lines
2 patches set to Changes Requested.
12613957 [1/2] rtw89: update
scan_mac_addrduring scanning period 12613959 [2/2] rtw89: fix incorrect channel info during scan
This patchset is based on the the 2 patches of another patchset whose status is Awaiting Upstream:
12628209 [v3,2/3] rtw89: add const in the cast of le32_get_bits() 12628211 [v3,3/3] rtw89: use inline function instead macro to set H2C and CAM
If I do rebase on this patchset and get merged, the awaiting patchset could be conflict. Should I wait the awaiting patchset get merged?
Please guide me the way to deal with this.
Sorry for the inconvenience.
--
Ping-Ke
Re: [PATCH 1/2] rtw89: update scan_mac_addr during scanning period
Quoted 26 lines · Pkshih
Quoted 16 lines · Kalle Valo
Quoted 4 lines · Ping-Ke Shih
Update
scan_mac_addrto address CAM as A1, so hardware can ACK probe response properly.Signed-off-by Ping-Ke Shih <[email protected]>Failed to apply to wireless-drivers-next, please respin.
error: sha1 information is lacking or useless (
drivers/net/wireless/realtek/rtw89/txrx.h).
error: could not build fake ancestor
hint: Use 'git am --show-current-patch' to see the failed patch
Applying: rtw89: fix incorrect channel info during scan Patch failed at 0001 rtw89: fix incorrect channel info during scanQuoted 5 lines
2 patches set to Changes Requested.
12613957 [1/2] rtw89: update
scan_mac_addrduring scanning period 12613959 [2/2] rtw89: fix incorrect channel info during scanThis patchset is based on the the 2 patches of another patchset whose status is Awaiting Upstream:
Quoted 7 lines
12628209 [v3,2/3] rtw89: add const in the cast of
le32_get_bits()12628211 [v3,3/3] rtw89: use inline function instead macro to set H2C and CAMIf I do rebase on this patchset and get merged, the awaiting patchset could be conflict. Should I wait the awaiting patchset get merged?
Please guide me the way to deal with this.
I think the easiest is that I also mark these patches as Awaiting Upstream and apply the patches after the dependencies have been applied.
Quoted 1 line
Sorry for the inconvenience.
No problem, this is business as usual. But this is exactly why I keep the bar high in patches going to wireless-drivers and only take important fixes, the conflicts between w-d and w-d-next just cause too much of a hassle.
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/list/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
Re: [PATCH 1/2] rtw89: update scan_mac_addr during scanning period
In reply to Ping-Ke ShihQuoted 4 lines · Ping-Ke Shih
Update
scan_mac_addrto address CAM as A1, so hardware can ACK probe response properly.Signed-off-by Ping-Ke Shih <[email protected]>
2 patches applied to wireless-drivers-next.git, thanks.
e45a9e6265d2 rtw89: update scan_mac_addr during scanning period eb4e52b3f38d rtw89: fix incorrect channel info during scan
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
Ping-Ke Shih
maintainerPATCH 2/2 rtw89: fix incorrect channel info during scan
In reply to Ping-Ke ShihFrom: Po Hao Huang <[email protected]>
We used to fill in rx skbs' frequency field by mac80211's current channel value. In some cases, mac80211 switches channel before all rx packets have been processed. This results in incorrect bss info. We fix this by filling in frequency field with channel index obtained from hardware, then fix potential cck missing issue by skb's original hw rate. After all fix is done, convert hw rate back to the supported band rate index.
--- drivers/net/wireless/realtek/rtw89/core.c | 53 +++++++-- drivers/net/wireless/realtek/rtw89/core.h | 4 + drivers/net/wireless/realtek/rtw89/debug.c | 2 +- drivers/net/wireless/realtek/rtw89/phy.c | 111 ++++++++++++++++++ drivers/net/wireless/realtek/rtw89/phy.h | 60 ++++++++++ drivers/net/wireless/realtek/rtw89/reg.h | 23 ++++ drivers/net/wireless/realtek/rtw89/rtw8852a.c | 19 +++ drivers/net/wireless/realtek/rtw89/txrx.h | 45 +------ 8 files changed, 264 insertions(+), 53 deletions(-)
drivers/net/wireless/realtek/rtw89/core.c +41 -12
@@ -242,6 +242,7 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev) hal->current_band_width = bandwidth; hal->current_channel = center_chan; + hal->prev_primary_channel = hal->current_primary_channel; hal->current_primary_channel = ch_param.primary_chan; hal->current_band_type = band_type;
@@ -881,8 +882,11 @@ static void rtw89_core_parse_phy_status_ie01(struct rtw89_dev *rtwdev, u8 *addr, {s16 cfo; + phy_ppdu->chan_idx =RTW89_GET_PHY_STS_IE01_CH_IDX (addr); +if (phy_ppdu->rate <RTW89_HW_RATE_OFDM6 ) +return ;/* sign conversion for S(12,2) */ - cfo =sign_extend32 (RTW89_GET_PHY_STS_IE0_CFO (addr),11 ); + cfo =sign_extend32 (RTW89_GET_PHY_STS_IE01_CFO (addr),11 );rtw89_phy_cfo_parse (rtwdev, cfo, phy_ppdu); }
@@ -908,6 +912,7 @@ static void rtw89_core_update_phy_ppdu(struct rtw89_rx_phy_ppdu *phy_ppdu)s8 *rssi = phy_ppdu->rssi;u8 *buf = phy_ppdu->buf; + phy_ppdu->ie =RTW89_GET_PHY_STS_IE_MAP (buf); phy_ppdu->rssi_avg =RTW89_GET_PHY_STS_RSSI_AVG (buf); rssi[RF_PATH_A ] =RTW89_RSSI_RAW_TO_DBM (RTW89_GET_PHY_STS_RSSI_A (buf)); rssi[RF_PATH_B ] =RTW89_RSSI_RAW_TO_DBM (RTW89_GET_PHY_STS_RSSI_B (buf));
@@ -936,8 +941,9 @@ static int rtw89_core_rx_parse_phy_sts(struct rtw89_dev *rtwdev,u16 ie_len;u8 *pos, *end; -if (!phy_ppdu->to_self) -return 0 ; +/* mark invalid reports and bypass them */ +if (phy_ppdu->ie <RTW89_CCK_PKT ) +return -EINVAL ; pos = (u8 *)phy_ppdu->buf +PHY_STS_HDR_LEN ; end = (u8 *)phy_ppdu->buf + phy_ppdu->len;
@@ -1000,9 +1006,7 @@ static bool rtw89_core_rx_ppdu_match(struct rtw89_dev *rtwdev, data_rate_mode =GET_DATA_RATE_MODE (data_rate);if (data_rate_mode ==DATA_RATE_MODE_NON_HT ) { rate_idx =GET_DATA_RATE_NOT_HT_IDX (data_rate); -/* No 4 CCK rates for 5G */ -if (status->band ==NL80211_BAND_5GHZ ) - rate_idx -=4 ; +/* rate_idx is still hardware value here */ }else if (data_rate_mode ==DATA_RATE_MODE_HT ) { rate_idx =GET_DATA_RATE_HT_IDX (data_rate); }else if (data_rate_mode ==DATA_RATE_MODE_VHT ) {
@@ -1081,6 +1085,29 @@ static void rtw89_core_rx_stats(struct rtw89_dev *rtwdev,rtw89_iterate_vifs_bh (rtwdev, rtw89_vif_rx_stats_iter, &iter_data); } +static void rtw89_correct_cck_chan (struct rtw89_dev *rtwdev, +struct ieee80211_rx_status *status) +{ +u16 chan = rtwdev->hal.prev_primary_channel; +u8 band = chan <=14 ?NL80211_BAND_2GHZ :NL80211_BAND_5GHZ ; + +if (status->band !=NL80211_BAND_2GHZ && + status->encoding ==RX_ENC_LEGACY && + status->rate_idx <RTW89_HW_RATE_OFDM6 ) { + status->freq =ieee80211_channel_to_frequency (chan, band); + status->band = band; + } +} + +static void rtw89_core_hw_to_sband_rate (struct ieee80211_rx_status *rx_status) +{ +if (rx_status->band ==NL80211_BAND_2GHZ || + rx_status->encoding !=RX_ENC_LEGACY ) +return ; +/* No 4 CCK rates for non-2G */ + rx_status->rate_idx -=4 ; +} + static void rtw89_core_rx_pending_skb(struct rtw89_dev *rtwdev, struct rtw89_rx_phy_ppdu *phy_ppdu, struct rtw89_rx_desc_info *desc_info,
@@ -1099,6 +1126,8 @@ static void rtw89_core_rx_pending_skb(struct rtw89_dev *rtwdev, rx_status =IEEE80211_SKB_RXCB (skb_ppdu);if (rtw89_core_rx_ppdu_match (rtwdev, desc_info, rx_status))rtw89_chip_query_ppdu (rtwdev, phy_ppdu, rx_status); +rtw89_correct_cck_chan (rtwdev, rx_status); +rtw89_core_hw_to_sband_rate (rx_status);rtw89_core_rx_stats (rtwdev, phy_ppdu, desc_info, skb_ppdu);ieee80211_rx_napi (rtwdev->hw,NULL , skb_ppdu, &rtwdev->napi); rtwdev->napi_budget_countdown--;
@@ -1112,6 +1141,7 @@ static void rtw89_core_rx_process_ppdu_sts(struct rtw89_dev *rtwdev,struct rtw89_rx_phy_ppdu phy_ppdu = {.buf = skb->data, .valid = false, .len = skb->len, .to_self = desc_info->addr1_match, + .rate = desc_info->data_rate, .mac_id = desc_info->mac_id};int ret;
@@ -1267,12 +1297,7 @@ static void rtw89_core_update_rx_status(struct rtw89_dev *rtwdev,if (data_rate_mode ==DATA_RATE_MODE_NON_HT ) { rx_status->encoding =RX_ENC_LEGACY ; rx_status->rate_idx =GET_DATA_RATE_NOT_HT_IDX (data_rate); -/* No 4 CCK rates for 5G */ -if (rx_status->band ==NL80211_BAND_5GHZ ) - rx_status->rate_idx -=4 ; -if (rtwdev->scanning) - rx_status->rate_idx =min_t (u8, rx_status->rate_idx, -ARRAY_SIZE (rtw89_bitrates) -5 ); +/* convert rate_idx after we get the correct band */ }else if (data_rate_mode ==DATA_RATE_MODE_HT ) { rx_status->encoding =RX_ENC_HT ; rx_status->rate_idx =GET_DATA_RATE_HT_IDX (data_rate);
@@ -1324,10 +1349,13 @@ static void rtw89_core_flush_ppdu_rx_queue(struct rtw89_dev *rtwdev, {struct rtw89_ppdu_sts_info *ppdu_sts = &rtwdev->ppdu_sts;u8 band = desc_info->bb_sel ?RTW89_PHY_1 :RTW89_PHY_0 ; +struct ieee80211_rx_status *rx_status;struct sk_buff *skb_ppdu, *tmp; skb_queue_walk_safe(&ppdu_sts->rx_queue[band], skb_ppdu, tmp) {skb_unlink (skb_ppdu, &ppdu_sts->rx_queue[band]); + rx_status =IEEE80211_SKB_RXCB (skb_ppdu); +rtw89_core_hw_to_sband_rate (rx_status);rtw89_core_rx_stats (rtwdev,NULL , desc_info, skb_ppdu);ieee80211_rx_napi (rtwdev->hw,NULL , skb_ppdu, &rtwdev->napi); rtwdev->napi_budget_countdown--;
@@ -1360,6 +1388,7 @@ void rtw89_core_rx(struct rtw89_dev *rtwdev, BIT(desc_info->frame_type) & PPDU_FILTER_BITMAP) { skb_queue_tail(&ppdu_sts->rx_queue[band], skb); } else { +rtw89_core_hw_to_sband_rate (rx_status);rtw89_core_rx_stats (rtwdev,NULL , desc_info, skb);ieee80211_rx_napi (rtwdev->hw,NULL , skb, &rtwdev->napi); rtwdev->napi_budget_countdown--;
drivers/net/wireless/realtek/rtw89/core.h +4 -0
@@ -472,6 +472,9 @@ struct rtw89_rx_phy_ppdu {u8 rssi_avg;s8 rssi[RF_PATH_MAX ];u8 mac_id; +u8 chan_idx; +u8 ie; +u16 rate;bool to_self;bool valid; };
@@ -2354,6 +2357,7 @@ struct rtw89_hal {u32 rx_fltr;u8 cv;u8 current_channel; +u8 prev_primary_channel;u8 current_primary_channel;enum rtw89_subband current_subband;u8 current_band_width;
drivers/net/wireless/realtek/rtw89/debug.c +1 -1
@@ -2280,7 +2280,7 @@ static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)switch (status->encoding) {case RX_ENC_LEGACY :seq_printf (m,"Legacy %d" , status->rate_idx + - (status->band ==NL80211_BAND_5GHZ ?4 :0 )); + (status->band !=NL80211_BAND_2GHZ ?4 :0 ));break ;case RX_ENC_HT : seq_printf(m, "HT MCS-%d%s", status->rate_idx,
drivers/net/wireless/realtek/rtw89/phy.c +111 -0
123 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/phy.h +60 -0
66 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/reg.h +23 -0
@@ -1674,6 +1674,29 @@#define B_UPD_CLK_ADC_VAL GENMASK(26, 25)#define R_RSTB_ASYNC 0x0704#define B_RSTB_ASYNC_ALL BIT(1) +#define R_MAC_PIN_SEL 0x0734 +#define B_CH_IDX_SEG0 GENMASK(23, 16) +#define R_PLCP_HISTOGRAM 0x0738 +#define B_STS_DIS_TRIG_BY_BRK BIT(2) +#define B_STS_DIS_TRIG_BY_FAIL BIT(3) +#define R_PHY_STS_BITMAP_ADDR_START R_PHY_STS_BITMAP_SEARCH_FAIL +#define B_PHY_STS_BITMAP_ADDR_MASK GENMASK(6, 2) +#define R_PHY_STS_BITMAP_SEARCH_FAIL 0x073C +#define B_PHY_STS_BITMAP_MSK_52A 0x337cff3f +#define R_PHY_STS_BITMAP_R2T 0x0740 +#define R_PHY_STS_BITMAP_CCA_SPOOF 0x0744 +#define R_PHY_STS_BITMAP_OFDM_BRK 0x0748 +#define R_PHY_STS_BITMAP_CCK_BRK 0x074C +#define R_PHY_STS_BITMAP_DL_MU_SPOOF 0x0750 +#define R_PHY_STS_BITMAP_HE_MU 0x0754 +#define R_PHY_STS_BITMAP_VHT_MU 0x0758 +#define R_PHY_STS_BITMAP_UL_TB_SPOOF 0x075C +#define R_PHY_STS_BITMAP_TRIGBASE 0x0760 +#define R_PHY_STS_BITMAP_CCK 0x0764 +#define R_PHY_STS_BITMAP_LEGACY 0x0768 +#define R_PHY_STS_BITMAP_HT 0x076C +#define R_PHY_STS_BITMAP_VHT 0x0770 +#define R_PHY_STS_BITMAP_HE 0x0774#define R_PMAC_GNT 0x0980#define B_PMAC_GNT_TXEN BIT(0)#define B_PMAC_GNT_RXEN BIT(16)
drivers/net/wireless/realtek/rtw89/rtw8852a.c +19 -0
@@ -1069,6 +1069,8 @@ static void rtw8852a_set_channel_bb(struct rtw89_dev *rtwdev,rtw8852a_bbrst_for_rfk (rtwdev, phy_idx); }rtw8852a_spur_elimination (rtwdev, param->center_chan); +rtw89_phy_write32_mask (rtwdev,R_MAC_PIN_SEL ,B_CH_IDX_SEG0 , + param->primary_chan);rtw8852a_bb_reset_all (rtwdev, phy_idx); }
@@ -1927,6 +1929,21 @@ void rtw8852a_btc_wl_s1_standby(struct rtw89_dev *rtwdev, bool state)rtw89_write_rf (rtwdev,RF_PATH_B ,RR_LUTWE ,RFREG_MASK ,0x0 ); } +static void rtw8852a_fill_freq_with_ppdu (struct rtw89_dev *rtwdev, +struct rtw89_rx_phy_ppdu *phy_ppdu, +struct ieee80211_rx_status *status) +{ +u16 chan = phy_ppdu->chan_idx; +u8 band; + +if (chan ==0 ) +return ; + + band = chan <=14 ?NL80211_BAND_2GHZ :NL80211_BAND_5GHZ ; + status->freq =ieee80211_channel_to_frequency (chan, band); + status->band = band; +} +static void rtw8852a_query_ppdu (struct rtw89_dev *rtwdev,struct rtw89_rx_phy_ppdu *phy_ppdu,struct ieee80211_rx_status *status)
@@ -1939,6 +1956,8 @@ static void rtw8852a_query_ppdu(struct rtw89_dev *rtwdev, status->chains |=BIT (path); status->chain_signal[path] = rx_power[path]; } +if (phy_ppdu->valid) +rtw8852a_fill_freq_with_ppdu (rtwdev, phy_ppdu, status); }static const struct rtw89_chip_ops rtw8852a_chip_ops = {
drivers/net/wireless/realtek/rtw89/txrx.h +5 -40
63 lines not on this page · raw message
Signature · 1 line
2.25.1