Commit 7de16123 authored by Bitterblue Smith's avatar Bitterblue Smith Committed by Kalle Valo
Browse files

wifi: rtl8xxxu: Introduce rtl8xxxu_update_ra_report



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: default avatarBitterblue Smith <rtl8821cerfe2@gmail.com>
Reviewed-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/0777ad35-fe03-473c-2e02-e3390bef5dd0@gmail.com
parent 76c16af2
Loading
Loading
Loading
Loading
+45 −60
Original line number Diff line number Diff line
@@ -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;
				bw = RATE_INFO_BW_40;
			else
					rarpt->txrate.bw = RATE_INFO_BW_20;
			}
				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;

				rarpt->txrate.mcs = mcs;
				rarpt->txrate.nss = nss;

				if (sgi) {
					rarpt->txrate.flags |=
						RATE_INFO_FLAGS_SHORT_GI;
				}
			bw = rarpt->txrate.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;
					rarpt->txrate.bw = bw;
			}
			}
			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;