wifi: rtl8xxxu: Introduce rtl8xxxu_update_ra_report
authorBitterblue Smith <rtl8821cerfe2@gmail.com>
Thu, 1 Dec 2022 14:16:46 +0000 (16:16 +0200)
committerKalle Valo <kvalo@kernel.org>
Thu, 8 Dec 2022 14:45:16 +0000 (16:45 +0200)
The ra_report struct is used for reporting the TX rate via
sta_statistics. The code which fills it out is duplicated in two
places, and the RTL8188EU will need it in a third place. Move this
code into a new function rtl8xxxu_update_ra_report.

Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/0777ad35-fe03-473c-2e02-e3390bef5dd0@gmail.com
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c

index 7ca46fb77a3b979e5f19636a418cd55c5d2808cd..3ed435401e5703a79930d7c9f59c65ffd58fd359 100644 (file)
@@ -4598,6 +4598,32 @@ static void rtl8xxxu_set_aifs(struct rtl8xxxu_priv *priv, u8 slot_time)
        }
 }
 
+static void rtl8xxxu_update_ra_report(struct rtl8xxxu_ra_report *rarpt,
+                                     u8 rate, u8 sgi, u8 bw)
+{
+       u8 mcs, nss;
+
+       rarpt->txrate.flags = 0;
+
+       if (rate <= DESC_RATE_54M) {
+               rarpt->txrate.legacy = rtl8xxxu_legacy_ratetable[rate].bitrate;
+       } else {
+               rtl8xxxu_desc_to_mcsrate(rate, &mcs, &nss);
+               rarpt->txrate.flags |= RATE_INFO_FLAGS_MCS;
+
+               rarpt->txrate.mcs = mcs;
+               rarpt->txrate.nss = nss;
+
+               if (sgi)
+                       rarpt->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
+
+               rarpt->txrate.bw = bw;
+       }
+
+       rarpt->bit_rate = cfg80211_calculate_bitrate(&rarpt->txrate);
+       rarpt->desc_rate = rate;
+}
+
 static void
 rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                          struct ieee80211_bss_conf *bss_conf, u64 changed)
@@ -4620,9 +4646,7 @@ rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                        u32 ramask;
                        int sgi = 0;
                        u8 highest_rate;
-                       u8 mcs = 0, nss = 0;
-                       u32 bit_rate;
-
+                       u8 bw;
 
                        rcu_read_lock();
                        sta = ieee80211_find_sta(vif, bss_conf->bssid);
@@ -4647,37 +4671,19 @@ rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                                sgi = 1;
 
                        highest_rate = fls(ramask) - 1;
-                       if (highest_rate < DESC_RATE_MCS0) {
-                               rarpt->txrate.legacy =
-                               rtl8xxxu_legacy_ratetable[highest_rate].bitrate;
-                       } else {
-                               rtl8xxxu_desc_to_mcsrate(highest_rate,
-                                                        &mcs, &nss);
-                               rarpt->txrate.flags |= RATE_INFO_FLAGS_MCS;
-
-                               rarpt->txrate.mcs = mcs;
-                               rarpt->txrate.nss = nss;
-
-                               if (sgi) {
-                                       rarpt->txrate.flags |=
-                                               RATE_INFO_FLAGS_SHORT_GI;
-                               }
-
-                               if (rtl8xxxu_ht40_2g &&
-                                   (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
-                                       rarpt->txrate.bw = RATE_INFO_BW_40;
-                               else
-                                       rarpt->txrate.bw = RATE_INFO_BW_20;
-                       }
+                       if (rtl8xxxu_ht40_2g &&
+                           (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
+                               bw = RATE_INFO_BW_40;
+                       else
+                               bw = RATE_INFO_BW_20;
                        rcu_read_unlock();
-                       bit_rate = cfg80211_calculate_bitrate(&rarpt->txrate);
-                       rarpt->bit_rate = bit_rate;
-                       rarpt->desc_rate = highest_rate;
+
+                       rtl8xxxu_update_ra_report(rarpt, highest_rate, sgi, bw);
 
                        priv->vif = vif;
                        priv->rssi_level = RTL8XXXU_RATR_STA_INIT;
 
-                       priv->fops->update_rate_mask(priv, ramask, 0, sgi, rarpt->txrate.bw == RATE_INFO_BW_40);
+                       priv->fops->update_rate_mask(priv, ramask, 0, sgi, bw == RATE_INFO_BW_40);
 
                        rtl8xxxu_write8(priv, REG_BCN_MAX_ERR, 0xff);
 
@@ -5538,9 +5544,7 @@ static void rtl8xxxu_c2hcmd_callback(struct work_struct *work)
        u8 bt_info = 0;
        struct rtl8xxxu_btcoex *btcoex;
        struct rtl8xxxu_ra_report *rarpt;
-       u8 rate, sgi, bw;
-       u32 bit_rate;
-       u8 mcs = 0, nss = 0;
+       u8 bw;
 
        priv = container_of(work, struct rtl8xxxu_priv, c2hcmd_work);
        btcoex = &priv->bt_coex;
@@ -5566,36 +5570,17 @@ static void rtl8xxxu_c2hcmd_callback(struct work_struct *work)
                        rtl8723bu_handle_bt_info(priv);
                        break;
                case C2H_8723B_RA_REPORT:
-                       rarpt->txrate.flags = 0;
-                       rate = c2h->ra_report.rate;
-                       sgi = c2h->ra_report.sgi;
-
-                       if (rate < DESC_RATE_MCS0) {
-                               rarpt->txrate.legacy =
-                                       rtl8xxxu_legacy_ratetable[rate].bitrate;
-                       } else {
-                               rtl8xxxu_desc_to_mcsrate(rate, &mcs, &nss);
-                               rarpt->txrate.flags |= RATE_INFO_FLAGS_MCS;
+                       bw = rarpt->txrate.bw;
 
-                               rarpt->txrate.mcs = mcs;
-                               rarpt->txrate.nss = nss;
-
-                               if (sgi) {
-                                       rarpt->txrate.flags |=
-                                               RATE_INFO_FLAGS_SHORT_GI;
-                               }
-
-                               if (skb->len >= offsetofend(typeof(*c2h), ra_report.bw)) {
-                                       if (c2h->ra_report.bw == RTL8XXXU_CHANNEL_WIDTH_40)
-                                               bw = RATE_INFO_BW_40;
-                                       else
-                                               bw = RATE_INFO_BW_20;
-                                       rarpt->txrate.bw = bw;
-                               }
+                       if (skb->len >= offsetofend(typeof(*c2h), ra_report.bw)) {
+                               if (c2h->ra_report.bw == RTL8XXXU_CHANNEL_WIDTH_40)
+                                       bw = RATE_INFO_BW_40;
+                               else
+                                       bw = RATE_INFO_BW_20;
                        }
-                       bit_rate = cfg80211_calculate_bitrate(&rarpt->txrate);
-                       rarpt->bit_rate = bit_rate;
-                       rarpt->desc_rate = rate;
+
+                       rtl8xxxu_update_ra_report(rarpt, c2h->ra_report.rate,
+                                                 c2h->ra_report.sgi, bw);
                        break;
                default:
                        break;