mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
mac80211: prepare sta handling for MLO support
Currently in mac80211 each STA object is represented using sta_info datastructure with the associated STA specific information and drivers access ieee80211_sta part of it. With MLO (Multi Link Operation) support being added in 802.11be standard, though the association is logically with a single Multi Link capable STA, at the physical level communication can happen via different advertised links (uniquely identified by Channel, operating class, BSSID) and hence the need to handle multiple link STA parameters within a composite sta_info object called the MLD STA. The different link STA part of MLD STA are identified using the link address which can be same or different as the MLD STA address and unique link id based on the link vif. To support extension of such a model, the sta_info datastructure is modified to hold multiple link STA objects with link specific params currently within sta_info moved to this new structure. Similarly this is done for ieee80211_sta as well which will be accessed within mac80211 as well as by drivers, hence trivial driver changes are expected to support this. For current non MLO supported drivers, only one link STA is present and link information is accessed via 'deflink' member. For MLO drivers, we still need to define the APIs etc. to get the correct link ID and access the correct part of the station info. Currently in mac80211, all link STA info are accessed directly via deflink. These will be updated to access via link pointers indexed by link id with MLO support patches, with link id being 0 for non MLO supported cases. Except for couple of macro related changes, below spatch takes care of updating mac80211 and driver code to access to the link STA info via deflink. @ieee80211_sta@ struct ieee80211_sta *s; struct sta_info *si; identifier var = {supp_rates, ht_cap, vht_cap, he_cap, he_6ghz_capa, eht_cap, rx_nss, bandwidth, txpwr}; @@ ( s-> - var + deflink.var | si->sta. - var + deflink.var ) @sta_info@ struct sta_info *si; identifier var = {gtk, pcpu_rx_stats, rx_stats, rx_stats_avg, status_stats, tx_stats, cur_max_bandwidth}; @@ ( si-> - var + deflink.var ) Signed-off-by: Sriram R <quic_srirrama@quicinc.com> Link: https://lore.kernel.org/r/1649086883-13246-1-git-send-email-quic_srirrama@quicinc.com [remove MLO-drivers notes from commit message, not clear yet; run spatch] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
5c6dd7bd56
commit
046d2e7c50
@ -1160,7 +1160,7 @@ static int ar5523_get_wlan_mode(struct ar5523 *ar,
|
||||
ar5523_info(ar, "STA not found!\n");
|
||||
return WLAN_MODE_11b;
|
||||
}
|
||||
sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band];
|
||||
sta_rate_set = sta->deflink.supp_rates[ar->hw->conf.chandef.chan->band];
|
||||
|
||||
for (bit = 0; bit < band->n_bitrates; bit++) {
|
||||
if (sta_rate_set & 1) {
|
||||
@ -1198,7 +1198,7 @@ static void ar5523_create_rateset(struct ar5523 *ar,
|
||||
ar5523_info(ar, "STA not found. Cannot set rates\n");
|
||||
sta_rate_set = bss_conf->basic_rates;
|
||||
} else
|
||||
sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band];
|
||||
sta_rate_set = sta->deflink.supp_rates[ar->hw->conf.chandef.chan->band];
|
||||
|
||||
ar5523_dbg(ar, "sta rate_set = %08x\n", sta_rate_set);
|
||||
|
||||
|
@ -2251,7 +2251,7 @@ static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
|
||||
|
||||
band = def.chan->band;
|
||||
sband = ar->hw->wiphy->bands[band];
|
||||
ratemask = sta->supp_rates[band];
|
||||
ratemask = sta->deflink.supp_rates[band];
|
||||
ratemask &= arvif->bitrate_mask.control[band].legacy;
|
||||
rates = sband->bitrates;
|
||||
|
||||
@ -2296,7 +2296,7 @@ static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
struct wmi_peer_assoc_complete_arg *arg)
|
||||
{
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
struct ath10k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct cfg80211_chan_def def;
|
||||
enum nl80211_band band;
|
||||
@ -2335,7 +2335,7 @@ static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
|
||||
if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
|
||||
arg->peer_flags |= ar->wmi.peer_flags->ldbc;
|
||||
|
||||
if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
|
||||
if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
|
||||
arg->peer_flags |= ar->wmi.peer_flags->bw40;
|
||||
arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
|
||||
}
|
||||
@ -2388,7 +2388,8 @@ static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
|
||||
arg->peer_ht_rates.rates[i] = i;
|
||||
} else {
|
||||
arg->peer_ht_rates.num_rates = n;
|
||||
arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
|
||||
arg->peer_num_spatial_streams = min(sta->deflink.rx_nss,
|
||||
max_nss);
|
||||
}
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
|
||||
@ -2545,7 +2546,7 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
struct wmi_peer_assoc_complete_arg *arg)
|
||||
{
|
||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
|
||||
struct ath10k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath10k_hw_params *hw = &ar->hw_params;
|
||||
struct cfg80211_chan_def def;
|
||||
@ -2587,10 +2588,10 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
|
||||
(1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
||||
ampdu_factor)) - 1);
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
arg->peer_flags |= ar->wmi.peer_flags->bw80;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
arg->peer_flags |= ar->wmi.peer_flags->bw160;
|
||||
|
||||
/* Calculate peer NSS capability from VHT capabilities if STA
|
||||
@ -2604,7 +2605,7 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
|
||||
vht_mcs_mask[i])
|
||||
max_nss = i + 1;
|
||||
}
|
||||
arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
|
||||
arg->peer_num_spatial_streams = min(sta->deflink.rx_nss, max_nss);
|
||||
arg->peer_vht_rates.rx_max_rate =
|
||||
__le16_to_cpu(vht_cap->vht_mcs.rx_highest);
|
||||
arg->peer_vht_rates.rx_mcs_set =
|
||||
@ -2684,15 +2685,15 @@ static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
|
||||
|
||||
static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
|
||||
{
|
||||
return sta->supp_rates[NL80211_BAND_2GHZ] >>
|
||||
return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
|
||||
ATH10K_MAC_FIRST_OFDM_RATE_IDX;
|
||||
}
|
||||
|
||||
static enum wmi_phy_mode ath10k_mac_get_phymode_vht(struct ath10k *ar,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
|
||||
switch (sta->vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
|
||||
switch (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
|
||||
case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
|
||||
return MODE_11AC_VHT160;
|
||||
case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
|
||||
@ -2703,13 +2704,13 @@ static enum wmi_phy_mode ath10k_mac_get_phymode_vht(struct ath10k *ar,
|
||||
}
|
||||
}
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
return MODE_11AC_VHT80;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
return MODE_11AC_VHT40;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
return MODE_11AC_VHT20;
|
||||
|
||||
return MODE_UNKNOWN;
|
||||
@ -2736,15 +2737,15 @@ static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
|
||||
|
||||
switch (band) {
|
||||
case NL80211_BAND_2GHZ:
|
||||
if (sta->vht_cap.vht_supported &&
|
||||
if (sta->deflink.vht_cap.vht_supported &&
|
||||
!ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
phymode = MODE_11AC_VHT40;
|
||||
else
|
||||
phymode = MODE_11AC_VHT20;
|
||||
} else if (sta->ht_cap.ht_supported &&
|
||||
} else if (sta->deflink.ht_cap.ht_supported &&
|
||||
!ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
phymode = MODE_11NG_HT40;
|
||||
else
|
||||
phymode = MODE_11NG_HT20;
|
||||
@ -2759,12 +2760,12 @@ static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
|
||||
/*
|
||||
* Check VHT first.
|
||||
*/
|
||||
if (sta->vht_cap.vht_supported &&
|
||||
if (sta->deflink.vht_cap.vht_supported &&
|
||||
!ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
|
||||
phymode = ath10k_mac_get_phymode_vht(ar, sta);
|
||||
} else if (sta->ht_cap.ht_supported &&
|
||||
} else if (sta->deflink.ht_cap.ht_supported &&
|
||||
!ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
|
||||
if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
|
||||
phymode = MODE_11NA_HT40;
|
||||
else
|
||||
phymode = MODE_11NA_HT20;
|
||||
@ -3079,8 +3080,8 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
|
||||
/* ap_sta must be accessed only within rcu section which must be left
|
||||
* before calling ath10k_setup_peer_smps() which might sleep.
|
||||
*/
|
||||
ht_cap = ap_sta->ht_cap;
|
||||
vht_cap = ap_sta->vht_cap;
|
||||
ht_cap = ap_sta->deflink.ht_cap;
|
||||
vht_cap = ap_sta->deflink.vht_cap;
|
||||
|
||||
ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
|
||||
if (ret) {
|
||||
@ -3278,7 +3279,7 @@ static int ath10k_station_assoc(struct ath10k *ar,
|
||||
*/
|
||||
if (!reassoc) {
|
||||
ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
|
||||
&sta->ht_cap);
|
||||
&sta->deflink.ht_cap);
|
||||
if (ret) {
|
||||
ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
@ -6787,10 +6788,10 @@ static int ath10k_sta_set_txpwr(struct ieee80211_hw *hw,
|
||||
int ret = 0;
|
||||
s16 txpwr;
|
||||
|
||||
if (sta->txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
|
||||
if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
|
||||
txpwr = 0;
|
||||
} else {
|
||||
txpwr = sta->txpwr.power;
|
||||
txpwr = sta->deflink.txpwr.power;
|
||||
if (!txpwr)
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -6910,26 +6911,26 @@ static int ath10k_mac_validate_rate_mask(struct ath10k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
u32 rate_ctrl_flag, u8 nss)
|
||||
{
|
||||
if (nss > sta->rx_nss) {
|
||||
if (nss > sta->deflink.rx_nss) {
|
||||
ath10k_warn(ar, "Invalid nss field, configured %u limit %u\n",
|
||||
nss, sta->rx_nss);
|
||||
nss, sta->deflink.rx_nss);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (ATH10K_HW_PREAMBLE(rate_ctrl_flag) == WMI_RATE_PREAMBLE_VHT) {
|
||||
if (!sta->vht_cap.vht_supported) {
|
||||
if (!sta->deflink.vht_cap.vht_supported) {
|
||||
ath10k_warn(ar, "Invalid VHT rate for sta %pM\n",
|
||||
sta->addr);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (ATH10K_HW_PREAMBLE(rate_ctrl_flag) == WMI_RATE_PREAMBLE_HT) {
|
||||
if (!sta->ht_cap.ht_supported || sta->vht_cap.vht_supported) {
|
||||
if (!sta->deflink.ht_cap.ht_supported || sta->deflink.vht_cap.vht_supported) {
|
||||
ath10k_warn(ar, "Invalid HT rate for sta %pM\n",
|
||||
sta->addr);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
if (sta->ht_cap.ht_supported || sta->vht_cap.vht_supported)
|
||||
if (sta->deflink.ht_cap.ht_supported || sta->deflink.vht_cap.vht_supported)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -8272,7 +8273,7 @@ static bool ath10k_mac_set_vht_bitrate_mask_fixup(struct ath10k *ar,
|
||||
u8 rate = arvif->vht_pfr;
|
||||
|
||||
/* skip non vht and multiple rate peers */
|
||||
if (!sta->vht_cap.vht_supported || arvif->vht_num_rates != 1)
|
||||
if (!sta->deflink.vht_cap.vht_supported || arvif->vht_num_rates != 1)
|
||||
return false;
|
||||
|
||||
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
|
||||
@ -8313,7 +8314,7 @@ static void ath10k_mac_clr_bitrate_mask_iter(void *data,
|
||||
int err;
|
||||
|
||||
/* clear vht peers only */
|
||||
if (arsta->arvif != arvif || !sta->vht_cap.vht_supported)
|
||||
if (arsta->arvif != arvif || !sta->deflink.vht_cap.vht_supported)
|
||||
return;
|
||||
|
||||
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
|
||||
@ -8457,13 +8458,14 @@ static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_STA,
|
||||
"mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
|
||||
sta->addr, changed, sta->bandwidth, sta->rx_nss,
|
||||
sta->addr, changed, sta->deflink.bandwidth,
|
||||
sta->deflink.rx_nss,
|
||||
sta->smps_mode);
|
||||
|
||||
if (changed & IEEE80211_RC_BW_CHANGED) {
|
||||
bw = WMI_PEER_CHWIDTH_20MHZ;
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_20:
|
||||
bw = WMI_PEER_CHWIDTH_20MHZ;
|
||||
break;
|
||||
@ -8478,7 +8480,7 @@ static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
|
||||
break;
|
||||
default:
|
||||
ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
|
||||
sta->bandwidth, sta->addr);
|
||||
sta->deflink.bandwidth, sta->addr);
|
||||
bw = WMI_PEER_CHWIDTH_20MHZ;
|
||||
break;
|
||||
}
|
||||
@ -8487,7 +8489,7 @@ static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_RC_NSS_CHANGED)
|
||||
arsta->nss = sta->rx_nss;
|
||||
arsta->nss = sta->deflink.rx_nss;
|
||||
|
||||
if (changed & IEEE80211_RC_SMPS_CHANGED) {
|
||||
smps = WMI_PEER_SMPS_PS_NONE;
|
||||
|
@ -1636,7 +1636,7 @@ static void ath11k_peer_assoc_h_rates(struct ath11k *ar,
|
||||
|
||||
band = def.chan->band;
|
||||
sband = ar->hw->wiphy->bands[band];
|
||||
ratemask = sta->supp_rates[band];
|
||||
ratemask = sta->deflink.supp_rates[band];
|
||||
ratemask &= arvif->bitrate_mask.control[band].legacy;
|
||||
rates = sband->bitrates;
|
||||
|
||||
@ -1681,7 +1681,7 @@ static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
struct peer_assoc_params *arg)
|
||||
{
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct cfg80211_chan_def def;
|
||||
enum nl80211_band band;
|
||||
@ -1718,7 +1718,7 @@ static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
|
||||
if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
|
||||
arg->ldpc_flag = true;
|
||||
|
||||
if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
|
||||
if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
|
||||
arg->bw_40 = true;
|
||||
arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
|
||||
}
|
||||
@ -1776,7 +1776,7 @@ static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
|
||||
arg->peer_ht_rates.rates[i] = i;
|
||||
} else {
|
||||
arg->peer_ht_rates.num_rates = n;
|
||||
arg->peer_nss = min(sta->rx_nss, max_nss);
|
||||
arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
|
||||
}
|
||||
|
||||
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
|
||||
@ -1878,7 +1878,7 @@ static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
struct peer_assoc_params *arg)
|
||||
{
|
||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct cfg80211_chan_def def;
|
||||
enum nl80211_band band;
|
||||
@ -1924,17 +1924,17 @@ static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
|
||||
(1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
||||
ampdu_factor)) - 1);
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
arg->bw_80 = true;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
arg->bw_160 = true;
|
||||
|
||||
vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
|
||||
|
||||
if (vht_nss > sta->rx_nss) {
|
||||
if (vht_nss > sta->deflink.rx_nss) {
|
||||
user_rate_valid = false;
|
||||
for (nss_idx = sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
|
||||
for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
|
||||
if (vht_mcs_mask[nss_idx]) {
|
||||
user_rate_valid = true;
|
||||
break;
|
||||
@ -1944,8 +1944,8 @@ static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
|
||||
|
||||
if (!user_rate_valid) {
|
||||
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac setting vht range mcs value to peer supported nss %d for peer %pM\n",
|
||||
sta->rx_nss, sta->addr);
|
||||
vht_mcs_mask[sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
|
||||
sta->deflink.rx_nss, sta->addr);
|
||||
vht_mcs_mask[sta->deflink.rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
|
||||
}
|
||||
|
||||
/* Calculate peer NSS capability from VHT capabilities if STA
|
||||
@ -1959,7 +1959,7 @@ static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
|
||||
vht_mcs_mask[i])
|
||||
max_nss = i + 1;
|
||||
}
|
||||
arg->peer_nss = min(sta->rx_nss, max_nss);
|
||||
arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
|
||||
arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
|
||||
arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
|
||||
arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
|
||||
@ -2078,7 +2078,7 @@ static void ath11k_peer_assoc_h_he(struct ath11k *ar,
|
||||
{
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct cfg80211_chan_def def;
|
||||
const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
|
||||
const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
|
||||
enum nl80211_band band;
|
||||
u16 *he_mcs_mask;
|
||||
u8 max_nss, he_mcs;
|
||||
@ -2135,7 +2135,7 @@ static void ath11k_peer_assoc_h_he(struct ath11k *ar,
|
||||
else
|
||||
max_nss = rx_mcs_80;
|
||||
|
||||
arg->peer_nss = min(sta->rx_nss, max_nss);
|
||||
arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
|
||||
|
||||
memcpy_and_pad(&arg->peer_he_cap_macinfo,
|
||||
sizeof(arg->peer_he_cap_macinfo),
|
||||
@ -2167,10 +2167,10 @@ static void ath11k_peer_assoc_h_he(struct ath11k *ar,
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
|
||||
|
||||
if (ampdu_factor) {
|
||||
if (sta->vht_cap.vht_supported)
|
||||
if (sta->deflink.vht_cap.vht_supported)
|
||||
arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
|
||||
ampdu_factor)) - 1;
|
||||
else if (sta->ht_cap.ht_supported)
|
||||
else if (sta->deflink.ht_cap.ht_supported)
|
||||
arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
|
||||
ampdu_factor)) - 1;
|
||||
}
|
||||
@ -2213,9 +2213,9 @@ static void ath11k_peer_assoc_h_he(struct ath11k *ar,
|
||||
|
||||
he_nss = ath11k_mac_max_he_nss(he_mcs_mask);
|
||||
|
||||
if (he_nss > sta->rx_nss) {
|
||||
if (he_nss > sta->deflink.rx_nss) {
|
||||
user_rate_valid = false;
|
||||
for (nss_idx = sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
|
||||
for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
|
||||
if (he_mcs_mask[nss_idx]) {
|
||||
user_rate_valid = true;
|
||||
break;
|
||||
@ -2225,11 +2225,11 @@ static void ath11k_peer_assoc_h_he(struct ath11k *ar,
|
||||
|
||||
if (!user_rate_valid) {
|
||||
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac setting he range mcs value to peer supported nss %d for peer %pM\n",
|
||||
sta->rx_nss, sta->addr);
|
||||
he_mcs_mask[sta->rx_nss - 1] = he_mcs_mask[he_nss - 1];
|
||||
sta->deflink.rx_nss, sta->addr);
|
||||
he_mcs_mask[sta->deflink.rx_nss - 1] = he_mcs_mask[he_nss - 1];
|
||||
}
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_160:
|
||||
if (he_cap->he_cap_elem.phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
|
||||
@ -2283,7 +2283,7 @@ static void ath11k_peer_assoc_h_he(struct ath11k *ar,
|
||||
he_mcs_mask[i])
|
||||
max_nss = i + 1;
|
||||
}
|
||||
arg->peer_nss = min(sta->rx_nss, max_nss);
|
||||
arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
|
||||
|
||||
if (arg->peer_phymode == MODE_11AX_HE160 ||
|
||||
arg->peer_phymode == MODE_11AX_HE80_80) {
|
||||
@ -2316,7 +2316,7 @@ static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
struct peer_assoc_params *arg)
|
||||
{
|
||||
const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
|
||||
const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
|
||||
struct cfg80211_chan_def def;
|
||||
enum nl80211_band band;
|
||||
u8 ampdu_factor;
|
||||
@ -2326,19 +2326,19 @@ static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar,
|
||||
|
||||
band = def.chan->band;
|
||||
|
||||
if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->he_6ghz_capa.capa)
|
||||
if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->deflink.he_6ghz_capa.capa)
|
||||
return;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
arg->bw_40 = true;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
arg->bw_80 = true;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
arg->bw_160 = true;
|
||||
|
||||
arg->peer_he_caps_6ghz = le16_to_cpu(sta->he_6ghz_capa.capa);
|
||||
arg->peer_he_caps_6ghz = le16_to_cpu(sta->deflink.he_6ghz_capa.capa);
|
||||
arg->peer_mpdu_density =
|
||||
ath11k_parse_mpdudensity(FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
|
||||
arg->peer_he_caps_6ghz));
|
||||
@ -2364,17 +2364,17 @@ static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar,
|
||||
static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta,
|
||||
struct peer_assoc_params *arg)
|
||||
{
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
int smps;
|
||||
|
||||
if (!ht_cap->ht_supported && !sta->he_6ghz_capa.capa)
|
||||
if (!ht_cap->ht_supported && !sta->deflink.he_6ghz_capa.capa)
|
||||
return;
|
||||
|
||||
if (ht_cap->ht_supported) {
|
||||
smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
|
||||
smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
|
||||
} else {
|
||||
smps = le16_get_bits(sta->he_6ghz_capa.capa,
|
||||
smps = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
|
||||
IEEE80211_HE_6GHZ_CAP_SM_PS);
|
||||
}
|
||||
|
||||
@ -2498,15 +2498,15 @@ err:
|
||||
|
||||
static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
|
||||
{
|
||||
return sta->supp_rates[NL80211_BAND_2GHZ] >>
|
||||
return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
|
||||
ATH11K_MAC_FIRST_OFDM_RATE_IDX;
|
||||
}
|
||||
|
||||
static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
|
||||
switch (sta->vht_cap.cap &
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
|
||||
switch (sta->deflink.vht_cap.cap &
|
||||
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
|
||||
case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
|
||||
return MODE_11AC_VHT160;
|
||||
@ -2518,13 +2518,13 @@ static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
|
||||
}
|
||||
}
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
return MODE_11AC_VHT80;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
return MODE_11AC_VHT40;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
return MODE_11AC_VHT20;
|
||||
|
||||
return MODE_UNKNOWN;
|
||||
@ -2533,24 +2533,24 @@ static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
|
||||
static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
|
||||
if (sta->he_cap.he_cap_elem.phy_cap_info[0] &
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
|
||||
if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
|
||||
return MODE_11AX_HE160;
|
||||
else if (sta->he_cap.he_cap_elem.phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
|
||||
else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
|
||||
return MODE_11AX_HE80_80;
|
||||
/* not sure if this is a valid case? */
|
||||
return MODE_11AX_HE160;
|
||||
}
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
return MODE_11AX_HE80;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
return MODE_11AX_HE40;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
return MODE_11AX_HE20;
|
||||
|
||||
return MODE_UNKNOWN;
|
||||
@ -2579,23 +2579,23 @@ static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
|
||||
|
||||
switch (band) {
|
||||
case NL80211_BAND_2GHZ:
|
||||
if (sta->he_cap.has_he &&
|
||||
if (sta->deflink.he_cap.has_he &&
|
||||
!ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
phymode = MODE_11AX_HE80_2G;
|
||||
else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
phymode = MODE_11AX_HE40_2G;
|
||||
else
|
||||
phymode = MODE_11AX_HE20_2G;
|
||||
} else if (sta->vht_cap.vht_supported &&
|
||||
!ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
} else if (sta->deflink.vht_cap.vht_supported &&
|
||||
!ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
phymode = MODE_11AC_VHT40;
|
||||
else
|
||||
phymode = MODE_11AC_VHT20;
|
||||
} else if (sta->ht_cap.ht_supported &&
|
||||
} else if (sta->deflink.ht_cap.ht_supported &&
|
||||
!ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
phymode = MODE_11NG_HT40;
|
||||
else
|
||||
phymode = MODE_11NG_HT20;
|
||||
@ -2608,15 +2608,15 @@ static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
|
||||
case NL80211_BAND_5GHZ:
|
||||
case NL80211_BAND_6GHZ:
|
||||
/* Check HE first */
|
||||
if (sta->he_cap.has_he &&
|
||||
if (sta->deflink.he_cap.has_he &&
|
||||
!ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
|
||||
phymode = ath11k_mac_get_phymode_he(ar, sta);
|
||||
} else if (sta->vht_cap.vht_supported &&
|
||||
!ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
|
||||
} else if (sta->deflink.vht_cap.vht_supported &&
|
||||
!ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
|
||||
phymode = ath11k_mac_get_phymode_vht(ar, sta);
|
||||
} else if (sta->ht_cap.ht_supported &&
|
||||
} else if (sta->deflink.ht_cap.ht_supported &&
|
||||
!ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
|
||||
if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
|
||||
phymode = MODE_11NA_HT40;
|
||||
else
|
||||
phymode = MODE_11NA_HT20;
|
||||
@ -2739,8 +2739,8 @@ static void ath11k_bss_assoc(struct ieee80211_hw *hw,
|
||||
}
|
||||
|
||||
ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid,
|
||||
&ap_sta->ht_cap,
|
||||
le16_to_cpu(ap_sta->he_6ghz_capa.capa));
|
||||
&ap_sta->deflink.ht_cap,
|
||||
le16_to_cpu(ap_sta->deflink.he_6ghz_capa.capa));
|
||||
if (ret) {
|
||||
ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
@ -4001,7 +4001,7 @@ ath11k_mac_set_peer_vht_fixed_rate(struct ath11k_vif *arvif,
|
||||
}
|
||||
|
||||
/* Avoid updating invalid nss as fixed rate*/
|
||||
if (nss > sta->rx_nss)
|
||||
if (nss > sta->deflink.rx_nss)
|
||||
return -EINVAL;
|
||||
|
||||
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
|
||||
@ -4051,7 +4051,7 @@ ath11k_mac_set_peer_he_fixed_rate(struct ath11k_vif *arvif,
|
||||
}
|
||||
|
||||
/* Avoid updating invalid nss as fixed rate */
|
||||
if (nss > sta->rx_nss)
|
||||
if (nss > sta->deflink.rx_nss)
|
||||
return -EINVAL;
|
||||
|
||||
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
|
||||
@ -4118,12 +4118,12 @@ static int ath11k_station_assoc(struct ath11k *ar,
|
||||
* fixed param.
|
||||
* Note that all other rates and NSS will be disabled for this peer.
|
||||
*/
|
||||
if (sta->vht_cap.vht_supported && num_vht_rates == 1) {
|
||||
if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
|
||||
ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
|
||||
band);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else if (sta->he_cap.has_he && num_he_rates == 1) {
|
||||
} else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
|
||||
ret = ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
|
||||
band);
|
||||
if (ret)
|
||||
@ -4137,7 +4137,8 @@ static int ath11k_station_assoc(struct ath11k *ar,
|
||||
return 0;
|
||||
|
||||
ret = ath11k_setup_peer_smps(ar, arvif, sta->addr,
|
||||
&sta->ht_cap, le16_to_cpu(sta->he_6ghz_capa.capa));
|
||||
&sta->deflink.ht_cap,
|
||||
le16_to_cpu(sta->deflink.he_6ghz_capa.capa));
|
||||
if (ret) {
|
||||
ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
@ -4299,10 +4300,10 @@ static void ath11k_sta_rc_update_wk(struct work_struct *wk)
|
||||
* TODO: Check RATEMASK_CMDID to support auto rates selection
|
||||
* across HT/VHT and for multiple VHT MCS support.
|
||||
*/
|
||||
if (sta->vht_cap.vht_supported && num_vht_rates == 1) {
|
||||
if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
|
||||
ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
|
||||
band);
|
||||
} else if (sta->he_cap.has_he && num_he_rates == 1) {
|
||||
} else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
|
||||
ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
|
||||
band);
|
||||
} else {
|
||||
@ -4624,10 +4625,10 @@ static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
|
||||
int ret = 0;
|
||||
s16 txpwr;
|
||||
|
||||
if (sta->txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
|
||||
if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
|
||||
txpwr = 0;
|
||||
} else {
|
||||
txpwr = sta->txpwr.power;
|
||||
txpwr = sta->deflink.txpwr.power;
|
||||
if (!txpwr)
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -4688,7 +4689,8 @@ static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
|
||||
|
||||
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
|
||||
"mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
|
||||
sta->addr, changed, sta->bandwidth, sta->rx_nss,
|
||||
sta->addr, changed, sta->deflink.bandwidth,
|
||||
sta->deflink.rx_nss,
|
||||
sta->smps_mode);
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
@ -4696,7 +4698,7 @@ static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
|
||||
if (changed & IEEE80211_RC_BW_CHANGED) {
|
||||
bw = WMI_PEER_CHWIDTH_20MHZ;
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_20:
|
||||
bw = WMI_PEER_CHWIDTH_20MHZ;
|
||||
break;
|
||||
@ -4711,7 +4713,7 @@ static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
|
||||
break;
|
||||
default:
|
||||
ath11k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
|
||||
sta->bandwidth, sta->addr);
|
||||
sta->deflink.bandwidth, sta->addr);
|
||||
bw = WMI_PEER_CHWIDTH_20MHZ;
|
||||
break;
|
||||
}
|
||||
@ -4720,7 +4722,7 @@ static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_RC_NSS_CHANGED)
|
||||
arsta->nss = sta->rx_nss;
|
||||
arsta->nss = sta->deflink.rx_nss;
|
||||
|
||||
if (changed & IEEE80211_RC_SMPS_CHANGED) {
|
||||
smps = WMI_PEER_SMPS_PS_NONE;
|
||||
@ -7755,13 +7757,13 @@ ath11k_mac_validate_vht_he_fixed_rate_settings(struct ath11k *ar, enum nl80211_b
|
||||
spin_lock_bh(&ar->ab->base_lock);
|
||||
list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
|
||||
if (peer->sta) {
|
||||
if (vht_fixed_rate && (!peer->sta->vht_cap.vht_supported ||
|
||||
peer->sta->rx_nss < vht_nss)) {
|
||||
if (vht_fixed_rate && (!peer->sta->deflink.vht_cap.vht_supported ||
|
||||
peer->sta->deflink.rx_nss < vht_nss)) {
|
||||
ret = false;
|
||||
goto out;
|
||||
}
|
||||
if (he_fixed_rate && (!peer->sta->he_cap.has_he ||
|
||||
peer->sta->rx_nss < he_nss)) {
|
||||
if (he_fixed_rate && (!peer->sta->deflink.he_cap.has_he ||
|
||||
peer->sta->deflink.rx_nss < he_nss)) {
|
||||
ret = false;
|
||||
goto out;
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ static ssize_t read_file_node_aggr(struct file *file, char __user *user_buf,
|
||||
if (buf == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!an->sta->ht_cap.ht_supported) {
|
||||
if (!an->sta->deflink.ht_cap.ht_supported) {
|
||||
len = scnprintf(buf, size, "%s\n",
|
||||
"HT not supported");
|
||||
goto exit;
|
||||
@ -186,7 +186,7 @@ static ssize_t read_file_node_recv(struct file *file, char __user *user_buf,
|
||||
band = ah->curchan->chan->band;
|
||||
rstats = &an->rx_rate_stats;
|
||||
|
||||
if (!sta->ht_cap.ht_supported)
|
||||
if (!sta->deflink.ht_cap.ht_supported)
|
||||
goto legacy;
|
||||
|
||||
len += scnprintf(buf + len, size - len,
|
||||
|
@ -491,7 +491,7 @@ static int ath9k_htc_add_station(struct ath9k_htc_priv *priv,
|
||||
ista->index = sta_idx;
|
||||
tsta.is_vif_sta = 0;
|
||||
maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
||||
sta->ht_cap.ampdu_factor);
|
||||
sta->deflink.ht_cap.ampdu_factor);
|
||||
tsta.maxampdu = cpu_to_be16(maxampdu);
|
||||
} else {
|
||||
memcpy(&tsta.macaddr, vif->addr, ETH_ALEN);
|
||||
@ -602,7 +602,7 @@ static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv,
|
||||
sband = priv->hw->wiphy->bands[priv->hw->conf.chandef.chan->band];
|
||||
|
||||
for (i = 0, j = 0; i < sband->n_bitrates; i++) {
|
||||
if (sta->supp_rates[sband->band] & BIT(i)) {
|
||||
if (sta->deflink.supp_rates[sband->band] & BIT(i)) {
|
||||
trate->rates.legacy_rates.rs_rates[j]
|
||||
= (sband->bitrates[i].bitrate * 2) / 10;
|
||||
j++;
|
||||
@ -610,9 +610,9 @@ static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv,
|
||||
}
|
||||
trate->rates.legacy_rates.rs_nrates = j;
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
for (i = 0, j = 0; i < 77; i++) {
|
||||
if (sta->ht_cap.mcs.rx_mask[i/8] & (1<<(i%8)))
|
||||
if (sta->deflink.ht_cap.mcs.rx_mask[i/8] & (1<<(i%8)))
|
||||
trate->rates.ht_rates.rs_rates[j++] = i;
|
||||
if (j == ATH_HTC_RATE_MAX)
|
||||
break;
|
||||
@ -620,18 +620,18 @@ static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv,
|
||||
trate->rates.ht_rates.rs_nrates = j;
|
||||
|
||||
caps = WLAN_RC_HT_FLAG;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
|
||||
caps |= ATH_RC_TX_STBC_FLAG;
|
||||
if (sta->ht_cap.mcs.rx_mask[1])
|
||||
if (sta->deflink.ht_cap.mcs.rx_mask[1])
|
||||
caps |= WLAN_RC_DS_FLAG;
|
||||
if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) &&
|
||||
(conf_is_ht40(&priv->hw->conf)))
|
||||
if ((sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) &&
|
||||
(conf_is_ht40(&priv->hw->conf)))
|
||||
caps |= WLAN_RC_40_FLAG;
|
||||
if (conf_is_ht40(&priv->hw->conf) &&
|
||||
(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
|
||||
(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
|
||||
caps |= WLAN_RC_SGI_FLAG;
|
||||
else if (conf_is_ht20(&priv->hw->conf) &&
|
||||
(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20))
|
||||
(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20))
|
||||
caps |= WLAN_RC_SGI_FLAG;
|
||||
}
|
||||
|
||||
|
@ -2048,7 +2048,7 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
|
||||
case IEEE80211_AMPDU_TX_OPERATIONAL:
|
||||
atid = ath_node_to_tid(an, tid);
|
||||
atid->baw_size = IEEE80211_MIN_AMPDU_BUF <<
|
||||
sta->ht_cap.ampdu_factor;
|
||||
sta->deflink.ht_cap.ampdu_factor;
|
||||
break;
|
||||
default:
|
||||
ath_err(ath9k_hw_common(sc->sc_ah), "Unknown AMPDU action\n");
|
||||
|
@ -1574,10 +1574,10 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
|
||||
* in HT IBSS when a beacon with HT-info is received after the station
|
||||
* has already been added.
|
||||
*/
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
an->maxampdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
||||
sta->ht_cap.ampdu_factor)) - 1;
|
||||
density = ath9k_parse_mpdudensity(sta->ht_cap.ampdu_density);
|
||||
sta->deflink.ht_cap.ampdu_factor)) - 1;
|
||||
density = ath9k_parse_mpdudensity(sta->deflink.ht_cap.ampdu_density);
|
||||
an->mpdudensity = density;
|
||||
}
|
||||
|
||||
|
@ -1306,8 +1306,8 @@ static int carl9170_op_sta_add(struct ieee80211_hw *hw,
|
||||
|
||||
atomic_set(&sta_info->pending_frames, 0);
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->ht_cap.ampdu_density > 6) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ampdu_density > 6) {
|
||||
/*
|
||||
* HW does support 16us AMPDU density.
|
||||
* No HT-Xmit for station.
|
||||
@ -1319,7 +1319,7 @@ static int carl9170_op_sta_add(struct ieee80211_hw *hw,
|
||||
for (i = 0; i < ARRAY_SIZE(sta_info->agg); i++)
|
||||
RCU_INIT_POINTER(sta_info->agg[i], NULL);
|
||||
|
||||
sta_info->ampdu_max_len = 1 << (3 + sta->ht_cap.ampdu_factor);
|
||||
sta_info->ampdu_max_len = 1 << (3 + sta->deflink.ht_cap.ampdu_factor);
|
||||
sta_info->ht_sta = true;
|
||||
}
|
||||
|
||||
@ -1335,7 +1335,7 @@ static int carl9170_op_sta_remove(struct ieee80211_hw *hw,
|
||||
unsigned int i;
|
||||
bool cleanup = false;
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
|
||||
sta_info->ht_sta = false;
|
||||
|
||||
|
@ -1044,8 +1044,9 @@ static int carl9170_tx_prepare(struct ar9170 *ar,
|
||||
if (unlikely(!sta || !cvif))
|
||||
goto err_out;
|
||||
|
||||
factor = min_t(unsigned int, 1u, sta->ht_cap.ampdu_factor);
|
||||
density = sta->ht_cap.ampdu_density;
|
||||
factor = min_t(unsigned int, 1u,
|
||||
sta->deflink.ht_cap.ampdu_factor);
|
||||
density = sta->deflink.ht_cap.ampdu_density;
|
||||
|
||||
if (density) {
|
||||
/*
|
||||
|
@ -792,7 +792,7 @@ static void wcn36xx_update_allowed_rates(struct ieee80211_sta *sta,
|
||||
int i, size;
|
||||
u16 *rates_table;
|
||||
struct wcn36xx_sta *sta_priv = wcn36xx_sta_to_priv(sta);
|
||||
u32 rates = sta->supp_rates[band];
|
||||
u32 rates = sta->deflink.supp_rates[band];
|
||||
|
||||
memset(&sta_priv->supported_rates, 0,
|
||||
sizeof(sta_priv->supported_rates));
|
||||
@ -818,20 +818,20 @@ static void wcn36xx_update_allowed_rates(struct ieee80211_sta *sta,
|
||||
}
|
||||
}
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
BUILD_BUG_ON(sizeof(sta->ht_cap.mcs.rx_mask) >
|
||||
sizeof(sta_priv->supported_rates.supported_mcs_set));
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
BUILD_BUG_ON(sizeof(sta->deflink.ht_cap.mcs.rx_mask) >
|
||||
sizeof(sta_priv->supported_rates.supported_mcs_set));
|
||||
memcpy(sta_priv->supported_rates.supported_mcs_set,
|
||||
sta->ht_cap.mcs.rx_mask,
|
||||
sizeof(sta->ht_cap.mcs.rx_mask));
|
||||
sta->deflink.ht_cap.mcs.rx_mask,
|
||||
sizeof(sta->deflink.ht_cap.mcs.rx_mask));
|
||||
}
|
||||
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
sta_priv->supported_rates.op_rate_mode = STA_11ac;
|
||||
sta_priv->supported_rates.vht_rx_mcs_map =
|
||||
sta->vht_cap.vht_mcs.rx_mcs_map;
|
||||
sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
|
||||
sta_priv->supported_rates.vht_tx_mcs_map =
|
||||
sta->vht_cap.vht_mcs.tx_mcs_map;
|
||||
sta->deflink.vht_cap.vht_mcs.tx_mcs_map;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -208,9 +208,9 @@ static void wcn36xx_smd_set_bss_nw_type(struct wcn36xx *wcn,
|
||||
{
|
||||
if (NL80211_BAND_5GHZ == WCN36XX_BAND(wcn))
|
||||
bss_params->nw_type = WCN36XX_HAL_11A_NW_TYPE;
|
||||
else if (sta && sta->ht_cap.ht_supported)
|
||||
else if (sta && sta->deflink.ht_cap.ht_supported)
|
||||
bss_params->nw_type = WCN36XX_HAL_11N_NW_TYPE;
|
||||
else if (sta && (sta->supp_rates[NL80211_BAND_2GHZ] & 0x7f))
|
||||
else if (sta && (sta->deflink.supp_rates[NL80211_BAND_2GHZ] & 0x7f))
|
||||
bss_params->nw_type = WCN36XX_HAL_11G_NW_TYPE;
|
||||
else
|
||||
bss_params->nw_type = WCN36XX_HAL_11B_NW_TYPE;
|
||||
@ -225,9 +225,10 @@ static void wcn36xx_smd_set_bss_ht_params(struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct wcn36xx_hal_config_bss_params *bss_params)
|
||||
{
|
||||
if (sta && sta->ht_cap.ht_supported) {
|
||||
unsigned long caps = sta->ht_cap.cap;
|
||||
bss_params->ht = sta->ht_cap.ht_supported;
|
||||
if (sta && sta->deflink.ht_cap.ht_supported) {
|
||||
unsigned long caps = sta->deflink.ht_cap.cap;
|
||||
|
||||
bss_params->ht = sta->deflink.ht_cap.ht_supported;
|
||||
bss_params->tx_channel_width_set = is_cap_supported(caps,
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40);
|
||||
bss_params->lsig_tx_op_protection_full_support =
|
||||
@ -250,23 +251,24 @@ wcn36xx_smd_set_bss_vht_params(struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct wcn36xx_hal_config_bss_params_v1 *bss)
|
||||
{
|
||||
if (sta && sta->vht_cap.vht_supported)
|
||||
if (sta && sta->deflink.vht_cap.vht_supported)
|
||||
bss->vht_capable = 1;
|
||||
}
|
||||
|
||||
static void wcn36xx_smd_set_sta_ht_params(struct ieee80211_sta *sta,
|
||||
struct wcn36xx_hal_config_sta_params *sta_params)
|
||||
{
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
unsigned long caps = sta->ht_cap.cap;
|
||||
sta_params->ht_capable = sta->ht_cap.ht_supported;
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
unsigned long caps = sta->deflink.ht_cap.cap;
|
||||
|
||||
sta_params->ht_capable = sta->deflink.ht_cap.ht_supported;
|
||||
sta_params->tx_channel_width_set = is_cap_supported(caps,
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40);
|
||||
sta_params->lsig_txop_protection = is_cap_supported(caps,
|
||||
IEEE80211_HT_CAP_LSIG_TXOP_PROT);
|
||||
|
||||
sta_params->max_ampdu_size = sta->ht_cap.ampdu_factor;
|
||||
sta_params->max_ampdu_density = sta->ht_cap.ampdu_density;
|
||||
sta_params->max_ampdu_size = sta->deflink.ht_cap.ampdu_factor;
|
||||
sta_params->max_ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
/* max_amsdu_size: 1 : 3839 bytes, 0 : 7935 bytes (max) */
|
||||
sta_params->max_amsdu_size = !is_cap_supported(caps,
|
||||
IEEE80211_HT_CAP_MAX_AMSDU);
|
||||
@ -287,10 +289,10 @@ static void wcn36xx_smd_set_sta_vht_params(struct wcn36xx *wcn,
|
||||
struct ieee80211_sta *sta,
|
||||
struct wcn36xx_hal_config_sta_params_v1 *sta_params)
|
||||
{
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
unsigned long caps = sta->vht_cap.cap;
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
unsigned long caps = sta->deflink.vht_cap.cap;
|
||||
|
||||
sta_params->vht_capable = sta->vht_cap.vht_supported;
|
||||
sta_params->vht_capable = sta->deflink.vht_cap.vht_supported;
|
||||
sta_params->vht_ldpc_enabled =
|
||||
is_cap_supported(caps, IEEE80211_VHT_CAP_RXLDPC);
|
||||
if (get_feat_caps(wcn->fw_feat_caps, MU_MIMO)) {
|
||||
@ -308,9 +310,10 @@ static void wcn36xx_smd_set_sta_vht_params(struct wcn36xx *wcn,
|
||||
static void wcn36xx_smd_set_sta_ht_ldpc_params(struct ieee80211_sta *sta,
|
||||
struct wcn36xx_hal_config_sta_params_v1 *sta_params)
|
||||
{
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
sta_params->ht_ldpc_enabled =
|
||||
is_cap_supported(sta->ht_cap.cap, IEEE80211_HT_CAP_LDPC_CODING);
|
||||
is_cap_supported(sta->deflink.ht_cap.cap,
|
||||
IEEE80211_HT_CAP_LDPC_CODING);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -868,7 +868,7 @@ brcms_ops_ampdu_action(struct ieee80211_hw *hw,
|
||||
spin_lock_bh(&wl->lock);
|
||||
brcms_c_ampdu_tx_operational(wl->wlc, tid, buf_size,
|
||||
(1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
||||
sta->ht_cap.ampdu_factor)) - 1);
|
||||
sta->deflink.ht_cap.ampdu_factor)) - 1);
|
||||
spin_unlock_bh(&wl->lock);
|
||||
/* Power save wakeup */
|
||||
break;
|
||||
|
@ -354,13 +354,13 @@ il3945_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
|
||||
* after assoc.. */
|
||||
|
||||
for (i = sband->n_bitrates - 1; i >= 0; i--) {
|
||||
if (sta->supp_rates[sband->band] & (1 << i)) {
|
||||
if (sta->deflink.supp_rates[sband->band] & (1 << i)) {
|
||||
rs_sta->last_txrate_idx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
il->_3945.sta_supp_rates = sta->supp_rates[sband->band];
|
||||
il->_3945.sta_supp_rates = sta->deflink.supp_rates[sband->band];
|
||||
/* For 5 GHz band it start at IL_FIRST_OFDM_RATE */
|
||||
if (sband->band == NL80211_BAND_5GHZ) {
|
||||
rs_sta->last_txrate_idx += IL_FIRST_OFDM_RATE;
|
||||
@ -631,7 +631,7 @@ il3945_rs_get_rate(void *il_r, struct ieee80211_sta *sta, void *il_sta,
|
||||
il_sta = NULL;
|
||||
}
|
||||
|
||||
rate_mask = sta->supp_rates[sband->band];
|
||||
rate_mask = sta->deflink.supp_rates[sband->band];
|
||||
|
||||
/* get user max rate if set */
|
||||
max_rate_idx = fls(txrc->rate_idx_mask) - 1;
|
||||
|
@ -627,7 +627,7 @@ il4965_rs_toggle_antenna(u32 valid_ant, u32 *rate_n_flags,
|
||||
static bool
|
||||
il4965_rs_use_green(struct il_priv *il, struct ieee80211_sta *sta)
|
||||
{
|
||||
return (sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) &&
|
||||
return (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) &&
|
||||
!il->ht.non_gf_sta_present;
|
||||
}
|
||||
|
||||
@ -970,7 +970,7 @@ il4965_rs_tx_status(void *il_r, struct ieee80211_supported_band *sband,
|
||||
lq_sta->last_rate_n_flags = tx_rate;
|
||||
done:
|
||||
/* See if there's a better rate or modulation mode to try. */
|
||||
if (sta->supp_rates[sband->band])
|
||||
if (sta->deflink.supp_rates[sband->band])
|
||||
il4965_rs_rate_scale_perform(il, skb, sta, lq_sta);
|
||||
}
|
||||
|
||||
@ -1164,7 +1164,7 @@ il4965_rs_switch_to_mimo2(struct il_priv *il, struct il_lq_sta *lq_sta,
|
||||
s32 rate;
|
||||
s8 is_green = lq_sta->is_green;
|
||||
|
||||
if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
|
||||
if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
|
||||
return -1;
|
||||
|
||||
if (sta->smps_mode == IEEE80211_SMPS_STATIC)
|
||||
@ -1182,7 +1182,7 @@ il4965_rs_switch_to_mimo2(struct il_priv *il, struct il_lq_sta *lq_sta,
|
||||
tbl->max_search = IL_MAX_SEARCH;
|
||||
rate_mask = lq_sta->active_mimo2_rate;
|
||||
|
||||
if (il_is_ht40_tx_allowed(il, &sta->ht_cap))
|
||||
if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap))
|
||||
tbl->is_ht40 = 1;
|
||||
else
|
||||
tbl->is_ht40 = 0;
|
||||
@ -1217,7 +1217,7 @@ il4965_rs_switch_to_siso(struct il_priv *il, struct il_lq_sta *lq_sta,
|
||||
u8 is_green = lq_sta->is_green;
|
||||
s32 rate;
|
||||
|
||||
if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
|
||||
if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
|
||||
return -1;
|
||||
|
||||
D_RATE("LQ: try to switch to SISO\n");
|
||||
@ -1228,7 +1228,7 @@ il4965_rs_switch_to_siso(struct il_priv *il, struct il_lq_sta *lq_sta,
|
||||
tbl->max_search = IL_MAX_SEARCH;
|
||||
rate_mask = lq_sta->active_siso_rate;
|
||||
|
||||
if (il_is_ht40_tx_allowed(il, &sta->ht_cap))
|
||||
if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap))
|
||||
tbl->is_ht40 = 1;
|
||||
else
|
||||
tbl->is_ht40 = 0;
|
||||
@ -1384,7 +1384,7 @@ il4965_rs_move_siso_to_other(struct il_priv *il, struct il_lq_sta *lq_sta,
|
||||
struct il_scale_tbl_info *search_tbl =
|
||||
&(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
|
||||
struct il_rate_scale_data *win = &(tbl->win[idx]);
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
u32 sz =
|
||||
(sizeof(struct il_scale_tbl_info) -
|
||||
(sizeof(struct il_rate_scale_data) * RATE_COUNT));
|
||||
@ -1507,7 +1507,7 @@ il4965_rs_move_mimo2_to_other(struct il_priv *il, struct il_lq_sta *lq_sta,
|
||||
struct il_scale_tbl_info *search_tbl =
|
||||
&(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
|
||||
struct il_rate_scale_data *win = &(tbl->win[idx]);
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
u32 sz =
|
||||
(sizeof(struct il_scale_tbl_info) -
|
||||
(sizeof(struct il_rate_scale_data) * RATE_COUNT));
|
||||
@ -1760,7 +1760,7 @@ il4965_rs_rate_scale_perform(struct il_priv *il, struct sk_buff *skb,
|
||||
(info->flags & IEEE80211_TX_CTL_NO_ACK))
|
||||
return;
|
||||
|
||||
lq_sta->supp_rates = sta->supp_rates[lq_sta->band];
|
||||
lq_sta->supp_rates = sta->deflink.supp_rates[lq_sta->band];
|
||||
|
||||
tid = il4965_rs_tl_add_packet(lq_sta, hdr);
|
||||
if (tid != MAX_TID_COUNT && (lq_sta->tx_agg_tid_en & (1 << tid))) {
|
||||
@ -2271,7 +2271,7 @@ il4965_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
|
||||
int i, j;
|
||||
struct ieee80211_hw *hw = il->hw;
|
||||
struct ieee80211_conf *conf = &il->hw->conf;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
struct il_station_priv *sta_priv;
|
||||
struct il_lq_sta *lq_sta;
|
||||
struct ieee80211_supported_band *sband;
|
||||
@ -2288,7 +2288,7 @@ il4965_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
|
||||
win[i]);
|
||||
|
||||
lq_sta->flush_timer = 0;
|
||||
lq_sta->supp_rates = sta->supp_rates[sband->band];
|
||||
lq_sta->supp_rates = sta->deflink.supp_rates[sband->band];
|
||||
for (j = 0; j < LQ_SIZE; j++)
|
||||
for (i = 0; i < RATE_COUNT; i++)
|
||||
il4965_rs_rate_scale_clear_win(&lq_sta->lq_info[j].
|
||||
|
@ -1863,7 +1863,7 @@ EXPORT_SYMBOL(il_send_add_sta);
|
||||
static void
|
||||
il_set_ht_add_station(struct il_priv *il, u8 idx, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->ht_cap;
|
||||
struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->deflink.ht_cap;
|
||||
__le32 sta_flags;
|
||||
|
||||
if (!sta || !sta_ht_inf->ht_supported)
|
||||
@ -1900,7 +1900,7 @@ il_set_ht_add_station(struct il_priv *il, u8 idx, struct ieee80211_sta *sta)
|
||||
cpu_to_le32((u32) sta_ht_inf->
|
||||
ampdu_density << STA_FLG_AGG_MPDU_DENSITY_POS);
|
||||
|
||||
if (il_is_ht40_tx_allowed(il, &sta->ht_cap))
|
||||
if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap))
|
||||
sta_flags |= STA_FLG_HT40_EN_MSK;
|
||||
else
|
||||
sta_flags &= ~STA_FLG_HT40_EN_MSK;
|
||||
@ -5222,7 +5222,7 @@ il_ht_conf(struct il_priv *il, struct ieee80211_vif *vif)
|
||||
rcu_read_lock();
|
||||
sta = ieee80211_find_sta(vif, bss_conf->bssid);
|
||||
if (sta) {
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
int maxstreams;
|
||||
|
||||
maxstreams =
|
||||
|
@ -1039,7 +1039,7 @@ static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband,
|
||||
lq_sta->last_rate_n_flags = tx_rate;
|
||||
done:
|
||||
/* See if there's a better rate or modulation mode to try. */
|
||||
if (sta && sta->supp_rates[sband->band])
|
||||
if (sta && sta->deflink.supp_rates[sband->band])
|
||||
rs_rate_scale_perform(priv, skb, sta, lq_sta);
|
||||
|
||||
if (priv->lib->bt_params && priv->lib->bt_params->advanced_bt_coexist)
|
||||
@ -1239,7 +1239,7 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv,
|
||||
struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
|
||||
struct iwl_rxon_context *ctx = sta_priv->ctx;
|
||||
|
||||
if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
|
||||
if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
|
||||
return -1;
|
||||
|
||||
if (sta->smps_mode == IEEE80211_SMPS_STATIC)
|
||||
@ -1294,7 +1294,7 @@ static int rs_switch_to_mimo3(struct iwl_priv *priv,
|
||||
struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
|
||||
struct iwl_rxon_context *ctx = sta_priv->ctx;
|
||||
|
||||
if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
|
||||
if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
|
||||
return -1;
|
||||
|
||||
if (sta->smps_mode == IEEE80211_SMPS_STATIC)
|
||||
@ -1350,7 +1350,7 @@ static int rs_switch_to_siso(struct iwl_priv *priv,
|
||||
struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
|
||||
struct iwl_rxon_context *ctx = sta_priv->ctx;
|
||||
|
||||
if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
|
||||
if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
|
||||
return -1;
|
||||
|
||||
IWL_DEBUG_RATE(priv, "LQ: try to switch to SISO\n");
|
||||
@ -1570,7 +1570,7 @@ static void rs_move_siso_to_other(struct iwl_priv *priv,
|
||||
struct iwl_scale_tbl_info *search_tbl =
|
||||
&(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
|
||||
struct iwl_rate_scale_data *window = &(tbl->win[index]);
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
u32 sz = (sizeof(struct iwl_scale_tbl_info) -
|
||||
(sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
|
||||
u8 start_action;
|
||||
@ -1740,7 +1740,7 @@ static void rs_move_mimo2_to_other(struct iwl_priv *priv,
|
||||
struct iwl_scale_tbl_info *search_tbl =
|
||||
&(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
|
||||
struct iwl_rate_scale_data *window = &(tbl->win[index]);
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
u32 sz = (sizeof(struct iwl_scale_tbl_info) -
|
||||
(sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
|
||||
u8 start_action;
|
||||
@ -1908,7 +1908,7 @@ static void rs_move_mimo3_to_other(struct iwl_priv *priv,
|
||||
struct iwl_scale_tbl_info *search_tbl =
|
||||
&(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
|
||||
struct iwl_rate_scale_data *window = &(tbl->win[index]);
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
u32 sz = (sizeof(struct iwl_scale_tbl_info) -
|
||||
(sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
|
||||
u8 start_action;
|
||||
@ -2212,7 +2212,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
|
||||
info->flags & IEEE80211_TX_CTL_NO_ACK)
|
||||
return;
|
||||
|
||||
lq_sta->supp_rates = sta->supp_rates[lq_sta->band];
|
||||
lq_sta->supp_rates = sta->deflink.supp_rates[lq_sta->band];
|
||||
|
||||
tid = rs_tl_add_packet(lq_sta, hdr);
|
||||
if ((tid != IWL_MAX_TID_COUNT) &&
|
||||
@ -2763,7 +2763,7 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i
|
||||
int i, j;
|
||||
struct ieee80211_hw *hw = priv->hw;
|
||||
struct ieee80211_conf *conf = &priv->hw->conf;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
struct iwl_station_priv *sta_priv;
|
||||
struct iwl_lq_sta *lq_sta;
|
||||
struct ieee80211_supported_band *sband;
|
||||
@ -2781,7 +2781,7 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i
|
||||
rs_rate_scale_clear_window(&lq_sta->lq_info[j].win[i]);
|
||||
|
||||
lq_sta->flush_timer = 0;
|
||||
lq_sta->supp_rates = sta->supp_rates[sband->band];
|
||||
lq_sta->supp_rates = sta->deflink.supp_rates[sband->band];
|
||||
|
||||
IWL_DEBUG_RATE(priv, "LQ: *** rate scale station global init for station %d ***\n",
|
||||
sta_id);
|
||||
@ -2798,7 +2798,7 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i
|
||||
/*
|
||||
* active legacy rates as per supported rates bitmap
|
||||
*/
|
||||
supp = sta->supp_rates[sband->band];
|
||||
supp = sta->deflink.supp_rates[sband->band];
|
||||
lq_sta->active_legacy_rate = 0;
|
||||
for_each_set_bit(i, &supp, BITS_PER_LONG)
|
||||
lq_sta->active_legacy_rate |= BIT(sband->bitrates[i].hw_value);
|
||||
|
@ -1280,7 +1280,7 @@ static void iwlagn_check_needed_chains(struct iwl_priv *priv,
|
||||
break;
|
||||
}
|
||||
|
||||
ht_cap = &sta->ht_cap;
|
||||
ht_cap = &sta->deflink.ht_cap;
|
||||
|
||||
need_multiple = true;
|
||||
|
||||
|
@ -139,7 +139,7 @@ bool iwl_is_ht40_tx_allowed(struct iwl_priv *priv,
|
||||
if (!sta)
|
||||
return true;
|
||||
|
||||
return sta->bandwidth >= IEEE80211_STA_RX_BW_40;
|
||||
return sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40;
|
||||
}
|
||||
|
||||
static void iwl_sta_calc_ht_flags(struct iwl_priv *priv,
|
||||
@ -147,7 +147,7 @@ static void iwl_sta_calc_ht_flags(struct iwl_priv *priv,
|
||||
struct iwl_rxon_context *ctx,
|
||||
__le32 *flags, __le32 *mask)
|
||||
{
|
||||
struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->ht_cap;
|
||||
struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->deflink.ht_cap;
|
||||
|
||||
*mask = STA_FLG_RTS_MIMO_PROT_MSK |
|
||||
STA_FLG_MIMO_DIS_MSK |
|
||||
|
@ -915,7 +915,7 @@ iwl_mvm_get_wowlan_config(struct iwl_mvm *mvm,
|
||||
/* TODO: wowlan_config_cmd->wowlan_ba_teardown_tids */
|
||||
|
||||
wowlan_config_cmd->is_11n_connection =
|
||||
ap_sta->ht_cap.ht_supported;
|
||||
ap_sta->deflink.ht_cap.ht_supported;
|
||||
wowlan_config_cmd->flags = ENABLE_L3_FILTERING |
|
||||
ENABLE_NBNS_FILTERING | ENABLE_DHCP_FILTERING;
|
||||
|
||||
|
@ -1877,8 +1877,8 @@ static void iwl_mvm_set_pkt_ext_from_he_ppe(struct iwl_mvm *mvm,
|
||||
struct ieee80211_sta *sta,
|
||||
struct iwl_he_pkt_ext_v2 *pkt_ext)
|
||||
{
|
||||
u8 nss = (sta->he_cap.ppe_thres[0] & IEEE80211_PPE_THRES_NSS_MASK) + 1;
|
||||
u8 *ppe = &sta->he_cap.ppe_thres[0];
|
||||
u8 nss = (sta->deflink.he_cap.ppe_thres[0] & IEEE80211_PPE_THRES_NSS_MASK) + 1;
|
||||
u8 *ppe = &sta->deflink.he_cap.ppe_thres[0];
|
||||
u8 ru_index_bitmap =
|
||||
u8_get_bits(*ppe,
|
||||
IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK);
|
||||
@ -1993,7 +1993,7 @@ static void iwl_mvm_cfg_he_sta(struct iwl_mvm *mvm,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!sta->he_cap.has_he) {
|
||||
if (!sta->deflink.he_cap.has_he) {
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
@ -2005,17 +2005,17 @@ static void iwl_mvm_cfg_he_sta(struct iwl_mvm *mvm,
|
||||
flags |= STA_CTXT_HE_RU_2MHZ_BLOCK;
|
||||
|
||||
/* HTC flags */
|
||||
if (sta->he_cap.he_cap_elem.mac_cap_info[0] &
|
||||
if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[0] &
|
||||
IEEE80211_HE_MAC_CAP0_HTC_HE)
|
||||
sta_ctxt_cmd.htc_flags |= cpu_to_le32(IWL_HE_HTC_SUPPORT);
|
||||
if ((sta->he_cap.he_cap_elem.mac_cap_info[1] &
|
||||
if ((sta->deflink.he_cap.he_cap_elem.mac_cap_info[1] &
|
||||
IEEE80211_HE_MAC_CAP1_LINK_ADAPTATION) ||
|
||||
(sta->he_cap.he_cap_elem.mac_cap_info[2] &
|
||||
(sta->deflink.he_cap.he_cap_elem.mac_cap_info[2] &
|
||||
IEEE80211_HE_MAC_CAP2_LINK_ADAPTATION)) {
|
||||
u8 link_adap =
|
||||
((sta->he_cap.he_cap_elem.mac_cap_info[2] &
|
||||
((sta->deflink.he_cap.he_cap_elem.mac_cap_info[2] &
|
||||
IEEE80211_HE_MAC_CAP2_LINK_ADAPTATION) << 1) +
|
||||
(sta->he_cap.he_cap_elem.mac_cap_info[1] &
|
||||
(sta->deflink.he_cap.he_cap_elem.mac_cap_info[1] &
|
||||
IEEE80211_HE_MAC_CAP1_LINK_ADAPTATION);
|
||||
|
||||
if (link_adap == 2)
|
||||
@ -2025,12 +2025,12 @@ static void iwl_mvm_cfg_he_sta(struct iwl_mvm *mvm,
|
||||
sta_ctxt_cmd.htc_flags |=
|
||||
cpu_to_le32(IWL_HE_HTC_LINK_ADAP_BOTH);
|
||||
}
|
||||
if (sta->he_cap.he_cap_elem.mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
|
||||
if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
|
||||
sta_ctxt_cmd.htc_flags |= cpu_to_le32(IWL_HE_HTC_BSR_SUPP);
|
||||
if (sta->he_cap.he_cap_elem.mac_cap_info[3] &
|
||||
if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[3] &
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
|
||||
sta_ctxt_cmd.htc_flags |= cpu_to_le32(IWL_HE_HTC_OMI_SUPP);
|
||||
if (sta->he_cap.he_cap_elem.mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
|
||||
if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
|
||||
sta_ctxt_cmd.htc_flags |= cpu_to_le32(IWL_HE_HTC_BQR_SUPP);
|
||||
|
||||
/*
|
||||
@ -2041,7 +2041,7 @@ static void iwl_mvm_cfg_he_sta(struct iwl_mvm *mvm,
|
||||
sizeof(sta_ctxt_cmd.pkt_ext));
|
||||
|
||||
/* If PPE Thresholds exist, parse them into a FW-familiar format. */
|
||||
if (sta->he_cap.he_cap_elem.phy_cap_info[6] &
|
||||
if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[6] &
|
||||
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
|
||||
iwl_mvm_set_pkt_ext_from_he_ppe(mvm, sta,
|
||||
&sta_ctxt_cmd.pkt_ext);
|
||||
@ -2050,7 +2050,7 @@ static void iwl_mvm_cfg_he_sta(struct iwl_mvm *mvm,
|
||||
* according to Common Nominal Packet Padding fiels. */
|
||||
} else {
|
||||
u8 nominal_padding =
|
||||
u8_get_bits(sta->he_cap.he_cap_elem.phy_cap_info[9],
|
||||
u8_get_bits(sta->deflink.he_cap.he_cap_elem.phy_cap_info[9],
|
||||
IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK);
|
||||
if (nominal_padding != IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED)
|
||||
iwl_mvm_set_pkt_ext_from_nominal_padding(&sta_ctxt_cmd.pkt_ext,
|
||||
@ -2058,11 +2058,11 @@ static void iwl_mvm_cfg_he_sta(struct iwl_mvm *mvm,
|
||||
&flags);
|
||||
}
|
||||
|
||||
if (sta->he_cap.he_cap_elem.mac_cap_info[2] &
|
||||
if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[2] &
|
||||
IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP)
|
||||
flags |= STA_CTXT_HE_32BIT_BA_BITMAP;
|
||||
|
||||
if (sta->he_cap.he_cap_elem.mac_cap_info[2] &
|
||||
if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[2] &
|
||||
IEEE80211_HE_MAC_CAP2_ACK_EN)
|
||||
flags |= STA_CTXT_HE_ACK_ENABLED;
|
||||
|
||||
@ -3157,7 +3157,7 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
|
||||
}
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION)
|
||||
vif->bss_conf.he_support = sta->he_cap.has_he;
|
||||
vif->bss_conf.he_support = sta->deflink.he_cap.has_he;
|
||||
|
||||
if (sta->tdls &&
|
||||
(vif->p2p ||
|
||||
@ -3189,17 +3189,17 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
|
||||
} else if (old_state == IEEE80211_STA_AUTH &&
|
||||
new_state == IEEE80211_STA_ASSOC) {
|
||||
if (vif->type == NL80211_IFTYPE_AP) {
|
||||
vif->bss_conf.he_support = sta->he_cap.has_he;
|
||||
vif->bss_conf.he_support = sta->deflink.he_cap.has_he;
|
||||
mvmvif->ap_assoc_sta_count++;
|
||||
iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
|
||||
if (vif->bss_conf.he_support &&
|
||||
!iwlwifi_mod_params.disable_11ax)
|
||||
iwl_mvm_cfg_he_sta(mvm, vif, mvm_sta->sta_id);
|
||||
} else if (vif->type == NL80211_IFTYPE_STATION) {
|
||||
vif->bss_conf.he_support = sta->he_cap.has_he;
|
||||
vif->bss_conf.he_support = sta->deflink.he_cap.has_he;
|
||||
|
||||
mvmvif->he_ru_2mhz_block = false;
|
||||
if (sta->he_cap.has_he)
|
||||
if (sta->deflink.he_cap.has_he)
|
||||
iwl_mvm_check_he_obss_narrow_bw_ru(hw, vif);
|
||||
|
||||
iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
static u8 rs_fw_bw_from_sta_bw(struct ieee80211_sta *sta)
|
||||
{
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_160:
|
||||
return IWL_TLC_MNG_CH_WIDTH_160MHZ;
|
||||
case IEEE80211_STA_RX_BW_80:
|
||||
@ -38,9 +38,9 @@ static u8 rs_fw_set_active_chains(u8 chains)
|
||||
|
||||
static u8 rs_fw_sgi_cw_support(struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
||||
struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
|
||||
struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
|
||||
u8 supp = 0;
|
||||
|
||||
if (he_cap->has_he)
|
||||
@ -62,9 +62,9 @@ static u16 rs_fw_get_config_flags(struct iwl_mvm *mvm,
|
||||
struct ieee80211_sta *sta,
|
||||
struct ieee80211_supported_band *sband)
|
||||
{
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
||||
struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
|
||||
struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
|
||||
bool vht_ena = vht_cap->vht_supported;
|
||||
u16 flags = 0;
|
||||
|
||||
@ -136,7 +136,7 @@ rs_fw_vht_set_enabled_rates(const struct ieee80211_sta *sta,
|
||||
{
|
||||
u16 supp;
|
||||
int i, highest_mcs;
|
||||
u8 max_nss = sta->rx_nss;
|
||||
u8 max_nss = sta->deflink.rx_nss;
|
||||
struct ieee80211_vht_cap ieee_vht_cap = {
|
||||
.vht_cap_info = cpu_to_le32(vht_cap->cap),
|
||||
.supp_mcs = vht_cap->vht_mcs,
|
||||
@ -154,7 +154,7 @@ rs_fw_vht_set_enabled_rates(const struct ieee80211_sta *sta,
|
||||
continue;
|
||||
|
||||
supp = BIT(highest_mcs + 1) - 1;
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
supp &= ~BIT(IWL_TLC_MNG_HT_RATE_MCS9);
|
||||
|
||||
cmd->ht_rates[i][IWL_TLC_MCS_PER_BW_80] = cpu_to_le16(supp);
|
||||
@ -163,7 +163,7 @@ rs_fw_vht_set_enabled_rates(const struct ieee80211_sta *sta,
|
||||
* configuration is supported - only for MCS 0 since we already
|
||||
* decoded the MCS bits anyway ourselves.
|
||||
*/
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_160 &&
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160 &&
|
||||
ieee80211_get_vht_max_nss(&ieee_vht_cap,
|
||||
IEEE80211_VHT_CHANWIDTH_160MHZ,
|
||||
0, true, nss) >= nss)
|
||||
@ -194,7 +194,7 @@ rs_fw_he_set_enabled_rates(const struct ieee80211_sta *sta,
|
||||
struct ieee80211_supported_band *sband,
|
||||
struct iwl_tlc_config_cmd_v4 *cmd)
|
||||
{
|
||||
const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
|
||||
const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
|
||||
u16 mcs_160 = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
|
||||
u16 mcs_80 = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
|
||||
u16 tx_mcs_80 =
|
||||
@ -202,7 +202,7 @@ rs_fw_he_set_enabled_rates(const struct ieee80211_sta *sta,
|
||||
u16 tx_mcs_160 =
|
||||
le16_to_cpu(sband->iftype_data->he_cap.he_mcs_nss_supp.tx_mcs_160);
|
||||
int i;
|
||||
u8 nss = sta->rx_nss;
|
||||
u8 nss = sta->deflink.rx_nss;
|
||||
|
||||
/* the station support only a single receive chain */
|
||||
if (sta->smps_mode == IEEE80211_SMPS_STATIC)
|
||||
@ -245,12 +245,12 @@ static void rs_fw_set_supp_rates(struct ieee80211_sta *sta,
|
||||
int i;
|
||||
u16 supp = 0;
|
||||
unsigned long tmp; /* must be unsigned long for for_each_set_bit */
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
||||
const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
|
||||
const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
|
||||
|
||||
/* non HT rates */
|
||||
tmp = sta->supp_rates[sband->band];
|
||||
tmp = sta->deflink.supp_rates[sband->band];
|
||||
for_each_set_bit(i, &tmp, BITS_PER_LONG)
|
||||
supp |= BIT(sband->bitrates[i].hw_value);
|
||||
|
||||
@ -378,11 +378,11 @@ out:
|
||||
u16 rs_fw_get_max_amsdu_len(struct ieee80211_sta *sta)
|
||||
{
|
||||
struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
|
||||
if (mvmsta->vif->bss_conf.chandef.chan->band == NL80211_BAND_6GHZ) {
|
||||
switch (le16_get_bits(sta->he_6ghz_capa.capa,
|
||||
switch (le16_get_bits(sta->deflink.he_6ghz_capa.capa,
|
||||
IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN)) {
|
||||
case IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454:
|
||||
return IEEE80211_MAX_MPDU_LEN_VHT_11454;
|
||||
|
@ -135,7 +135,7 @@ static bool rs_mimo_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
struct rs_rate *rate,
|
||||
const struct rs_tx_column *next_col)
|
||||
{
|
||||
if (!sta->ht_cap.ht_supported)
|
||||
if (!sta->deflink.ht_cap.ht_supported)
|
||||
return false;
|
||||
|
||||
if (sta->smps_mode == IEEE80211_SMPS_STATIC)
|
||||
@ -157,7 +157,7 @@ static bool rs_siso_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
struct rs_rate *rate,
|
||||
const struct rs_tx_column *next_col)
|
||||
{
|
||||
if (!sta->ht_cap.ht_supported)
|
||||
if (!sta->deflink.ht_cap.ht_supported)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@ -167,8 +167,8 @@ static bool rs_sgi_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
struct rs_rate *rate,
|
||||
const struct rs_tx_column *next_col)
|
||||
{
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
|
||||
|
||||
if (is_ht20(rate) && (ht_cap->cap &
|
||||
IEEE80211_HT_CAP_SGI_20))
|
||||
@ -1369,13 +1369,13 @@ static s32 rs_get_best_rate(struct iwl_mvm *mvm,
|
||||
|
||||
static u32 rs_bw_from_sta_bw(struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ieee80211_sta_vht_cap *sta_vht_cap = &sta->vht_cap;
|
||||
struct ieee80211_sta_vht_cap *sta_vht_cap = &sta->deflink.vht_cap;
|
||||
struct ieee80211_vht_cap vht_cap = {
|
||||
.vht_cap_info = cpu_to_le32(sta_vht_cap->cap),
|
||||
.supp_mcs = sta_vht_cap->vht_mcs,
|
||||
};
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_160:
|
||||
/*
|
||||
* Don't use 160 MHz if VHT extended NSS support
|
||||
@ -1388,7 +1388,7 @@ static u32 rs_bw_from_sta_bw(struct ieee80211_sta *sta)
|
||||
if (ieee80211_get_vht_max_nss(&vht_cap,
|
||||
IEEE80211_VHT_CHANWIDTH_160MHZ,
|
||||
0, true,
|
||||
sta->rx_nss) < sta->rx_nss)
|
||||
sta->deflink.rx_nss) < sta->deflink.rx_nss)
|
||||
return RATE_MCS_CHAN_WIDTH_80;
|
||||
return RATE_MCS_CHAN_WIDTH_160;
|
||||
case IEEE80211_STA_RX_BW_80:
|
||||
@ -2537,7 +2537,7 @@ static void rs_get_initial_rate(struct iwl_mvm *mvm,
|
||||
* In case of VHT/HT when the rssi is low fallback to the case of
|
||||
* legacy rates.
|
||||
*/
|
||||
if (sta->vht_cap.vht_supported &&
|
||||
if (sta->deflink.vht_cap.vht_supported &&
|
||||
best_rssi > IWL_RS_LOW_RSSI_THRESHOLD) {
|
||||
/*
|
||||
* In AP mode, when a new station associates, rs is initialized
|
||||
@ -2563,14 +2563,15 @@ static void rs_get_initial_rate(struct iwl_mvm *mvm,
|
||||
nentries = ARRAY_SIZE(rs_optimal_rates_vht_20mhz);
|
||||
break;
|
||||
default:
|
||||
IWL_ERR(mvm, "Invalid BW %d\n", sta->bandwidth);
|
||||
IWL_ERR(mvm, "Invalid BW %d\n",
|
||||
sta->deflink.bandwidth);
|
||||
goto out;
|
||||
}
|
||||
|
||||
active_rate = lq_sta->active_siso_rate;
|
||||
rate->type = LQ_VHT_SISO;
|
||||
rate->bw = bw;
|
||||
} else if (sta->ht_cap.ht_supported &&
|
||||
} else if (sta->deflink.ht_cap.ht_supported &&
|
||||
best_rssi > IWL_RS_LOW_RSSI_THRESHOLD) {
|
||||
initial_rates = rs_optimal_rates_ht;
|
||||
nentries = ARRAY_SIZE(rs_optimal_rates_ht);
|
||||
@ -2761,14 +2762,14 @@ static void rs_vht_set_enabled_rates(struct ieee80211_sta *sta,
|
||||
|
||||
/* VHT MCS9 isn't valid for 20Mhz for NSS=1,2 */
|
||||
if (i == IWL_RATE_MCS_9_INDEX &&
|
||||
sta->bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
continue;
|
||||
|
||||
lq_sta->active_siso_rate |= BIT(i);
|
||||
}
|
||||
}
|
||||
|
||||
if (sta->rx_nss < 2)
|
||||
if (sta->deflink.rx_nss < 2)
|
||||
return;
|
||||
|
||||
highest_mcs = rs_vht_highest_rx_mcs_index(vht_cap, 2);
|
||||
@ -2779,7 +2780,7 @@ static void rs_vht_set_enabled_rates(struct ieee80211_sta *sta,
|
||||
|
||||
/* VHT MCS9 isn't valid for 20Mhz for NSS=1,2 */
|
||||
if (i == IWL_RATE_MCS_9_INDEX &&
|
||||
sta->bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
continue;
|
||||
|
||||
lq_sta->active_mimo2_rate |= BIT(i);
|
||||
@ -2916,8 +2917,8 @@ static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
{
|
||||
int i, j;
|
||||
struct ieee80211_hw *hw = mvm->hw;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
|
||||
struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
||||
struct iwl_lq_sta *lq_sta = &mvmsta->lq_sta.rs_drv;
|
||||
struct ieee80211_supported_band *sband;
|
||||
@ -2953,7 +2954,7 @@ static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
/*
|
||||
* active legacy rates as per supported rates bitmap
|
||||
*/
|
||||
supp = sta->supp_rates[sband->band];
|
||||
supp = sta->deflink.supp_rates[sband->band];
|
||||
lq_sta->active_legacy_rate = 0;
|
||||
for_each_set_bit(i, &supp, BITS_PER_LONG)
|
||||
lq_sta->active_legacy_rate |= BIT(sband->bitrates[i].hw_value);
|
||||
@ -3246,7 +3247,7 @@ static void __iwl_mvm_rs_tx_status(struct iwl_mvm *mvm,
|
||||
IWL_DEBUG_RATE(mvm, "reduced txpower: %d\n", reduced_txp);
|
||||
done:
|
||||
/* See if there's a better rate or modulation mode to try. */
|
||||
if (sta->supp_rates[info->band])
|
||||
if (sta->deflink.supp_rates[info->band])
|
||||
rs_rate_scale_perform(mvm, sta, lq_sta, tid, ndp);
|
||||
}
|
||||
|
||||
|
@ -106,10 +106,10 @@ static void iwl_mvm_fill_sf_command(struct iwl_mvm *mvm,
|
||||
* capabilities of the AP station, and choose the watermark accordingly.
|
||||
*/
|
||||
if (sta) {
|
||||
if (sta->ht_cap.ht_supported ||
|
||||
sta->vht_cap.vht_supported ||
|
||||
sta->he_cap.has_he) {
|
||||
switch (sta->rx_nss) {
|
||||
if (sta->deflink.ht_cap.ht_supported ||
|
||||
sta->deflink.vht_cap.vht_supported ||
|
||||
sta->deflink.he_cap.has_he) {
|
||||
switch (sta->deflink.rx_nss) {
|
||||
case 1:
|
||||
watermark = SF_W_MARK_SISO;
|
||||
break;
|
||||
|
@ -86,7 +86,7 @@ int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
}
|
||||
}
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_320:
|
||||
case IEEE80211_STA_RX_BW_160:
|
||||
add_sta_cmd.station_flags |= cpu_to_le32(STA_FLG_FAT_EN_160MHZ);
|
||||
@ -98,13 +98,13 @@ int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
add_sta_cmd.station_flags |= cpu_to_le32(STA_FLG_FAT_EN_40MHZ);
|
||||
fallthrough;
|
||||
case IEEE80211_STA_RX_BW_20:
|
||||
if (sta->ht_cap.ht_supported)
|
||||
if (sta->deflink.ht_cap.ht_supported)
|
||||
add_sta_cmd.station_flags |=
|
||||
cpu_to_le32(STA_FLG_FAT_EN_20MHZ);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (sta->rx_nss) {
|
||||
switch (sta->deflink.rx_nss) {
|
||||
case 1:
|
||||
add_sta_cmd.station_flags |= cpu_to_le32(STA_FLG_MIMO_EN_SISO);
|
||||
break;
|
||||
@ -134,12 +134,12 @@ int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
break;
|
||||
}
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
add_sta_cmd.station_flags_msk |=
|
||||
cpu_to_le32(STA_FLG_MAX_AGG_SIZE_MSK |
|
||||
STA_FLG_AGG_MPDU_DENS_MSK);
|
||||
|
||||
mpdu_dens = sta->ht_cap.ampdu_density;
|
||||
mpdu_dens = sta->deflink.ht_cap.ampdu_density;
|
||||
}
|
||||
|
||||
if (mvm_sta->vif->bss_conf.chandef.chan->band == NL80211_BAND_6GHZ) {
|
||||
@ -147,18 +147,17 @@ int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
cpu_to_le32(STA_FLG_MAX_AGG_SIZE_MSK |
|
||||
STA_FLG_AGG_MPDU_DENS_MSK);
|
||||
|
||||
mpdu_dens = le16_get_bits(sta->he_6ghz_capa.capa,
|
||||
mpdu_dens = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
|
||||
IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
|
||||
agg_size = le16_get_bits(sta->he_6ghz_capa.capa,
|
||||
IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
|
||||
} else
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
agg_size = sta->vht_cap.cap &
|
||||
agg_size = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
|
||||
IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
|
||||
} else if (sta->deflink.vht_cap.vht_supported) {
|
||||
agg_size = sta->deflink.vht_cap.cap &
|
||||
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK;
|
||||
agg_size >>=
|
||||
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
|
||||
} else if (sta->ht_cap.ht_supported) {
|
||||
agg_size = sta->ht_cap.ampdu_factor;
|
||||
} else if (sta->deflink.ht_cap.ht_supported) {
|
||||
agg_size = sta->deflink.ht_cap.ampdu_factor;
|
||||
}
|
||||
|
||||
/* D6.0 10.12.2 A-MPDU length limit rules
|
||||
@ -169,8 +168,8 @@ int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
* Maximum AMPDU Length Exponent Extension field in its HE
|
||||
* Capabilities element
|
||||
*/
|
||||
if (sta->he_cap.has_he)
|
||||
agg_size += u8_get_bits(sta->he_cap.he_cap_elem.mac_cap_info[3],
|
||||
if (sta->deflink.he_cap.has_he)
|
||||
agg_size += u8_get_bits(sta->deflink.he_cap.he_cap_elem.mac_cap_info[3],
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
|
||||
|
||||
/* Limit to max A-MPDU supported by FW */
|
||||
@ -782,7 +781,7 @@ static int iwl_mvm_tvqm_enable_txq(struct iwl_mvm *mvm,
|
||||
/* this queue isn't used for traffic (cab_queue) */
|
||||
if (IS_ERR_OR_NULL(sta)) {
|
||||
size = IWL_MGMT_QUEUE_SIZE;
|
||||
} else if (sta->he_cap.has_he) {
|
||||
} else if (sta->deflink.he_cap.has_he) {
|
||||
/* support for 256 ba size */
|
||||
size = IWL_DEFAULT_QUEUE_SIZE_HE;
|
||||
} else {
|
||||
|
@ -794,7 +794,7 @@ unsigned int iwl_mvm_max_amsdu_size(struct iwl_mvm *mvm,
|
||||
int lmac = iwl_mvm_get_lmac_id(mvm->fw, band);
|
||||
|
||||
/* For HE redirect to trigger based fifos */
|
||||
if (sta->he_cap.has_he && !WARN_ON(!iwl_mvm_has_new_tx_api(mvm)))
|
||||
if (sta->deflink.he_cap.has_he && !WARN_ON(!iwl_mvm_has_new_tx_api(mvm)))
|
||||
ac += 4;
|
||||
|
||||
txf = iwl_mvm_mac_ac_to_tx_fifo(mvm, ac);
|
||||
@ -935,7 +935,7 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
||||
* section 8.7.3 NOTE 3).
|
||||
*/
|
||||
if (info->flags & IEEE80211_TX_CTL_AMPDU &&
|
||||
!sta->vht_cap.vht_supported)
|
||||
!sta->deflink.vht_cap.vht_supported)
|
||||
max_amsdu_len = min_t(unsigned int, max_amsdu_len, 4095);
|
||||
|
||||
/* Sub frame header + SNAP + IP header + TCP header + MSS */
|
||||
@ -1083,7 +1083,7 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb,
|
||||
if (WARN_ON_ONCE(mvmsta->sta_id == IWL_MVM_INVALID_STA))
|
||||
return -1;
|
||||
|
||||
if (unlikely(ieee80211_is_any_nullfunc(fc)) && sta->he_cap.has_he)
|
||||
if (unlikely(ieee80211_is_any_nullfunc(fc)) && sta->deflink.he_cap.has_he)
|
||||
return -1;
|
||||
|
||||
if (unlikely(ieee80211_is_probe_resp(fc)))
|
||||
|
@ -2189,7 +2189,7 @@ mac80211_hwsim_sta_rc_update(struct ieee80211_hw *hw,
|
||||
u32 bw = U32_MAX;
|
||||
enum nl80211_chan_width confbw = NL80211_CHAN_WIDTH_20_NOHT;
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
#define C(_bw) case IEEE80211_STA_RX_BW_##_bw: bw = _bw; break
|
||||
C(20);
|
||||
C(40);
|
||||
@ -2211,7 +2211,7 @@ mac80211_hwsim_sta_rc_update(struct ieee80211_hw *hw,
|
||||
|
||||
WARN(bw > hwsim_get_chanwidth(confbw),
|
||||
"intf %pM: bad STA %pM bandwidth %d MHz (%d) > channel config %d MHz (%d)\n",
|
||||
vif->addr, sta->addr, bw, sta->bandwidth,
|
||||
vif->addr, sta->addr, bw, sta->deflink.bandwidth,
|
||||
hwsim_get_chanwidth(data->bw), data->bw);
|
||||
}
|
||||
|
||||
|
@ -1985,7 +1985,7 @@ mwl8k_txq_xmit(struct ieee80211_hw *hw,
|
||||
|
||||
txpriority = index;
|
||||
|
||||
if (priv->ap_fw && sta && sta->ht_cap.ht_supported && !eapol_frame &&
|
||||
if (priv->ap_fw && sta && sta->deflink.ht_cap.ht_supported && !eapol_frame &&
|
||||
ieee80211_is_data_qos(wh->frame_control)) {
|
||||
tid = qos & 0xf;
|
||||
mwl8k_tx_count_packet(sta, tid);
|
||||
@ -4027,9 +4027,9 @@ mwl8k_create_ba(struct ieee80211_hw *hw, struct mwl8k_ampdu_stream *stream,
|
||||
cmd->create_params.reset_seq_no_flag = 1;
|
||||
|
||||
cmd->create_params.param_info =
|
||||
(stream->sta->ht_cap.ampdu_factor &
|
||||
(stream->sta->deflink.ht_cap.ampdu_factor &
|
||||
IEEE80211_HT_AMPDU_PARM_FACTOR) |
|
||||
((stream->sta->ht_cap.ampdu_density << 2) &
|
||||
((stream->sta->deflink.ht_cap.ampdu_density << 2) &
|
||||
IEEE80211_HT_AMPDU_PARM_DENSITY);
|
||||
|
||||
cmd->create_params.flags =
|
||||
@ -4113,18 +4113,18 @@ static int mwl8k_cmd_set_new_stn_add(struct ieee80211_hw *hw,
|
||||
cmd->stn_id = cpu_to_le16(sta->aid);
|
||||
cmd->action = cpu_to_le16(MWL8K_STA_ACTION_ADD);
|
||||
if (hw->conf.chandef.chan->band == NL80211_BAND_2GHZ)
|
||||
rates = sta->supp_rates[NL80211_BAND_2GHZ];
|
||||
rates = sta->deflink.supp_rates[NL80211_BAND_2GHZ];
|
||||
else
|
||||
rates = sta->supp_rates[NL80211_BAND_5GHZ] << 5;
|
||||
rates = sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 5;
|
||||
cmd->legacy_rates = cpu_to_le32(rates);
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
cmd->ht_rates[0] = sta->ht_cap.mcs.rx_mask[0];
|
||||
cmd->ht_rates[1] = sta->ht_cap.mcs.rx_mask[1];
|
||||
cmd->ht_rates[2] = sta->ht_cap.mcs.rx_mask[2];
|
||||
cmd->ht_rates[3] = sta->ht_cap.mcs.rx_mask[3];
|
||||
cmd->ht_capabilities_info = cpu_to_le16(sta->ht_cap.cap);
|
||||
cmd->mac_ht_param_info = (sta->ht_cap.ampdu_factor & 3) |
|
||||
((sta->ht_cap.ampdu_density & 7) << 2);
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
cmd->ht_rates[0] = sta->deflink.ht_cap.mcs.rx_mask[0];
|
||||
cmd->ht_rates[1] = sta->deflink.ht_cap.mcs.rx_mask[1];
|
||||
cmd->ht_rates[2] = sta->deflink.ht_cap.mcs.rx_mask[2];
|
||||
cmd->ht_rates[3] = sta->deflink.ht_cap.mcs.rx_mask[3];
|
||||
cmd->ht_capabilities_info = cpu_to_le16(sta->deflink.ht_cap.cap);
|
||||
cmd->mac_ht_param_info = (sta->deflink.ht_cap.ampdu_factor & 3) |
|
||||
((sta->deflink.ht_cap.ampdu_density & 7) << 2);
|
||||
cmd->is_qos_sta = 1;
|
||||
}
|
||||
|
||||
@ -4545,16 +4545,16 @@ static int mwl8k_cmd_update_stadb_add(struct ieee80211_hw *hw,
|
||||
p = &cmd->peer_info;
|
||||
p->peer_type = MWL8K_PEER_TYPE_ACCESSPOINT;
|
||||
p->basic_caps = cpu_to_le16(vif->bss_conf.assoc_capability);
|
||||
p->ht_support = sta->ht_cap.ht_supported;
|
||||
p->ht_caps = cpu_to_le16(sta->ht_cap.cap);
|
||||
p->extended_ht_caps = (sta->ht_cap.ampdu_factor & 3) |
|
||||
((sta->ht_cap.ampdu_density & 7) << 2);
|
||||
p->ht_support = sta->deflink.ht_cap.ht_supported;
|
||||
p->ht_caps = cpu_to_le16(sta->deflink.ht_cap.cap);
|
||||
p->extended_ht_caps = (sta->deflink.ht_cap.ampdu_factor & 3) |
|
||||
((sta->deflink.ht_cap.ampdu_density & 7) << 2);
|
||||
if (hw->conf.chandef.chan->band == NL80211_BAND_2GHZ)
|
||||
rates = sta->supp_rates[NL80211_BAND_2GHZ];
|
||||
rates = sta->deflink.supp_rates[NL80211_BAND_2GHZ];
|
||||
else
|
||||
rates = sta->supp_rates[NL80211_BAND_5GHZ] << 5;
|
||||
rates = sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 5;
|
||||
legacy_rate_mask_to_array(p->legacy_rates, rates);
|
||||
memcpy(p->ht_rates, &sta->ht_cap.mcs, 16);
|
||||
memcpy(p->ht_rates, &sta->deflink.ht_cap.mcs, 16);
|
||||
p->interop = 1;
|
||||
p->amsdu_enabled = 0;
|
||||
|
||||
@ -5031,12 +5031,12 @@ mwl8k_bss_info_changed_sta(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
}
|
||||
|
||||
if (hw->conf.chandef.chan->band == NL80211_BAND_2GHZ) {
|
||||
ap_legacy_rates = ap->supp_rates[NL80211_BAND_2GHZ];
|
||||
ap_legacy_rates = ap->deflink.supp_rates[NL80211_BAND_2GHZ];
|
||||
} else {
|
||||
ap_legacy_rates =
|
||||
ap->supp_rates[NL80211_BAND_5GHZ] << 5;
|
||||
ap->deflink.supp_rates[NL80211_BAND_5GHZ] << 5;
|
||||
}
|
||||
memcpy(ap_mcs_rates, &ap->ht_cap.mcs, 16);
|
||||
memcpy(ap_mcs_rates, &ap->deflink.ht_cap.mcs, 16);
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
@ -5347,7 +5347,7 @@ static int mwl8k_sta_add(struct ieee80211_hw *hw,
|
||||
ret = mwl8k_cmd_update_stadb_add(hw, vif, sta);
|
||||
if (ret >= 0) {
|
||||
MWL8K_STA(sta)->peer_id = ret;
|
||||
if (sta->ht_cap.ht_supported)
|
||||
if (sta->deflink.ht_cap.ht_supported)
|
||||
MWL8K_STA(sta)->is_ampdu_allowed = true;
|
||||
ret = 0;
|
||||
}
|
||||
|
@ -326,19 +326,21 @@ void mt7603_wtbl_update_cap(struct mt7603_dev *dev, struct ieee80211_sta *sta)
|
||||
|
||||
addr = mt7603_wtbl1_addr(idx);
|
||||
|
||||
ampdu_density = sta->ht_cap.ampdu_density;
|
||||
ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
if (ampdu_density < IEEE80211_HT_MPDU_DENSITY_4)
|
||||
ampdu_density = IEEE80211_HT_MPDU_DENSITY_4;
|
||||
|
||||
val = mt76_rr(dev, addr + 2 * 4);
|
||||
val &= MT_WTBL1_W2_KEY_TYPE | MT_WTBL1_W2_ADMISSION_CONTROL;
|
||||
val |= FIELD_PREP(MT_WTBL1_W2_AMPDU_FACTOR, sta->ht_cap.ampdu_factor) |
|
||||
FIELD_PREP(MT_WTBL1_W2_MPDU_DENSITY, sta->ht_cap.ampdu_density) |
|
||||
val |= FIELD_PREP(MT_WTBL1_W2_AMPDU_FACTOR,
|
||||
sta->deflink.ht_cap.ampdu_factor) |
|
||||
FIELD_PREP(MT_WTBL1_W2_MPDU_DENSITY,
|
||||
sta->deflink.ht_cap.ampdu_density) |
|
||||
MT_WTBL1_W2_TXS_BAF_REPORT;
|
||||
|
||||
if (sta->ht_cap.cap)
|
||||
if (sta->deflink.ht_cap.cap)
|
||||
val |= MT_WTBL1_W2_HT;
|
||||
if (sta->vht_cap.cap)
|
||||
if (sta->deflink.vht_cap.cap)
|
||||
val |= MT_WTBL1_W2_VHT;
|
||||
|
||||
mt76_wr(dev, addr + 2 * 4, val);
|
||||
@ -347,9 +349,9 @@ void mt7603_wtbl_update_cap(struct mt7603_dev *dev, struct ieee80211_sta *sta)
|
||||
val = mt76_rr(dev, addr + 9 * 4);
|
||||
val &= ~(MT_WTBL2_W9_SHORT_GI_20 | MT_WTBL2_W9_SHORT_GI_40 |
|
||||
MT_WTBL2_W9_SHORT_GI_80);
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
|
||||
val |= MT_WTBL2_W9_SHORT_GI_20;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
|
||||
val |= MT_WTBL2_W9_SHORT_GI_40;
|
||||
mt76_wr(dev, addr + 9 * 4, val);
|
||||
}
|
||||
|
@ -610,7 +610,7 @@ mt76_connac_mcu_sta_amsdu_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
|
||||
static void
|
||||
mt76_connac_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
|
||||
struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
|
||||
struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
|
||||
struct sta_rec_he *he;
|
||||
struct tlv *tlv;
|
||||
@ -698,7 +698,7 @@ mt76_connac_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
|
||||
|
||||
he->he_cap = cpu_to_le32(cap);
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_160:
|
||||
if (elem->phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
|
||||
@ -750,9 +750,9 @@ mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif,
|
||||
u8 mode = 0;
|
||||
|
||||
if (sta) {
|
||||
ht_cap = &sta->ht_cap;
|
||||
vht_cap = &sta->vht_cap;
|
||||
he_cap = &sta->he_cap;
|
||||
ht_cap = &sta->deflink.ht_cap;
|
||||
vht_cap = &sta->deflink.vht_cap;
|
||||
he_cap = &sta->deflink.he_cap;
|
||||
} else {
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
||||
@ -801,25 +801,25 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
|
||||
u16 supp_rates;
|
||||
|
||||
/* starec ht */
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
struct sta_rec_ht *ht;
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
|
||||
ht = (struct sta_rec_ht *)tlv;
|
||||
ht->ht_cap = cpu_to_le16(sta->ht_cap.cap);
|
||||
ht->ht_cap = cpu_to_le16(sta->deflink.ht_cap.cap);
|
||||
}
|
||||
|
||||
/* starec vht */
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
struct sta_rec_vht *vht;
|
||||
int len;
|
||||
|
||||
len = is_mt7921(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, len);
|
||||
vht = (struct sta_rec_vht *)tlv;
|
||||
vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
|
||||
vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
|
||||
vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
|
||||
vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
|
||||
vht->vht_rx_mcs_map = sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
|
||||
vht->vht_tx_mcs_map = sta->deflink.vht_cap.vht_mcs.tx_mcs_map;
|
||||
}
|
||||
|
||||
/* starec uapsd */
|
||||
@ -828,11 +828,11 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
|
||||
if (!is_mt7921(dev))
|
||||
return;
|
||||
|
||||
if (sta->ht_cap.ht_supported || sta->he_cap.has_he)
|
||||
if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he)
|
||||
mt76_connac_mcu_sta_amsdu_tlv(skb, sta, vif);
|
||||
|
||||
/* starec he */
|
||||
if (sta->he_cap.has_he) {
|
||||
if (sta->deflink.he_cap.has_he) {
|
||||
mt76_connac_mcu_sta_he_tlv(skb, sta);
|
||||
if (band == NL80211_BAND_6GHZ &&
|
||||
sta_state == MT76_STA_INFO_STATE_ASSOC) {
|
||||
@ -841,7 +841,7 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_6G,
|
||||
sizeof(*he_6g_capa));
|
||||
he_6g_capa = (struct sta_rec_he_6g_capa *)tlv;
|
||||
he_6g_capa->capa = sta->he_6ghz_capa.capa;
|
||||
he_6g_capa->capa = sta->deflink.he_6ghz_capa.capa;
|
||||
}
|
||||
}
|
||||
|
||||
@ -851,14 +851,14 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
|
||||
phy->basic_rate = cpu_to_le16((u16)vif->bss_conf.basic_rates);
|
||||
phy->rcpi = rcpi;
|
||||
phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR,
|
||||
sta->ht_cap.ampdu_factor) |
|
||||
sta->deflink.ht_cap.ampdu_factor) |
|
||||
FIELD_PREP(IEEE80211_HT_AMPDU_PARM_DENSITY,
|
||||
sta->ht_cap.ampdu_density);
|
||||
sta->deflink.ht_cap.ampdu_density);
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra_info));
|
||||
ra_info = (struct sta_rec_ra_info *)tlv;
|
||||
|
||||
supp_rates = sta->supp_rates[band];
|
||||
supp_rates = sta->deflink.supp_rates[band];
|
||||
if (band == NL80211_BAND_2GHZ)
|
||||
supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates >> 4) |
|
||||
FIELD_PREP(RA_LEGACY_CCK, supp_rates & 0xf);
|
||||
@ -867,17 +867,18 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
|
||||
|
||||
ra_info->legacy = cpu_to_le16(supp_rates);
|
||||
|
||||
if (sta->ht_cap.ht_supported)
|
||||
memcpy(ra_info->rx_mcs_bitmask, sta->ht_cap.mcs.rx_mask,
|
||||
if (sta->deflink.ht_cap.ht_supported)
|
||||
memcpy(ra_info->rx_mcs_bitmask,
|
||||
sta->deflink.ht_cap.mcs.rx_mask,
|
||||
HT_MCS_MASK_NUM);
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_STATE, sizeof(*state));
|
||||
state = (struct sta_rec_state *)tlv;
|
||||
state->state = sta_state;
|
||||
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
state->vht_opmode = sta->bandwidth;
|
||||
state->vht_opmode |= (sta->rx_nss - 1) <<
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
state->vht_opmode = sta->deflink.bandwidth;
|
||||
state->vht_opmode |= (sta->deflink.rx_nss - 1) <<
|
||||
IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
|
||||
}
|
||||
}
|
||||
@ -905,27 +906,27 @@ void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
struct tlv *tlv;
|
||||
u32 flags = 0;
|
||||
|
||||
if (sta->ht_cap.ht_supported || sta->he_6ghz_capa.capa) {
|
||||
if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_6ghz_capa.capa) {
|
||||
tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
|
||||
wtbl_tlv, sta_wtbl);
|
||||
ht = (struct wtbl_ht *)tlv;
|
||||
ht->ldpc = ht_ldpc &&
|
||||
!!(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
|
||||
!!(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
ht->af = sta->ht_cap.ampdu_factor;
|
||||
ht->mm = sta->ht_cap.ampdu_density;
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
ht->af = sta->deflink.ht_cap.ampdu_factor;
|
||||
ht->mm = sta->deflink.ht_cap.ampdu_density;
|
||||
} else {
|
||||
ht->af = le16_get_bits(sta->he_6ghz_capa.capa,
|
||||
ht->af = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
|
||||
IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
|
||||
ht->mm = le16_get_bits(sta->he_6ghz_capa.capa,
|
||||
ht->mm = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
|
||||
IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
|
||||
}
|
||||
|
||||
ht->ht = true;
|
||||
}
|
||||
|
||||
if (sta->vht_cap.vht_supported || sta->he_6ghz_capa.capa) {
|
||||
if (sta->deflink.vht_cap.vht_supported || sta->deflink.he_6ghz_capa.capa) {
|
||||
struct wtbl_vht *vht;
|
||||
u8 af;
|
||||
|
||||
@ -934,18 +935,18 @@ void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
sta_wtbl);
|
||||
vht = (struct wtbl_vht *)tlv;
|
||||
vht->ldpc = vht_ldpc &&
|
||||
!!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
|
||||
!!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
|
||||
vht->vht = true;
|
||||
|
||||
af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
|
||||
sta->vht_cap.cap);
|
||||
sta->deflink.vht_cap.cap);
|
||||
if (ht)
|
||||
ht->af = max(ht->af, af);
|
||||
}
|
||||
|
||||
mt76_connac_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_tlv);
|
||||
|
||||
if (is_connac_v1(dev) && sta->ht_cap.ht_supported) {
|
||||
if (is_connac_v1(dev) && sta->deflink.ht_cap.ht_supported) {
|
||||
/* sgi */
|
||||
u32 msk = MT_WTBL_W5_SHORT_GI_20 | MT_WTBL_W5_SHORT_GI_40 |
|
||||
MT_WTBL_W5_SHORT_GI_80 | MT_WTBL_W5_SHORT_GI_160;
|
||||
@ -955,15 +956,15 @@ void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
sizeof(*raw), wtbl_tlv,
|
||||
sta_wtbl);
|
||||
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
|
||||
flags |= MT_WTBL_W5_SHORT_GI_20;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
|
||||
flags |= MT_WTBL_W5_SHORT_GI_40;
|
||||
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
|
||||
flags |= MT_WTBL_W5_SHORT_GI_80;
|
||||
if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
|
||||
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
|
||||
flags |= MT_WTBL_W5_SHORT_GI_160;
|
||||
}
|
||||
raw = (struct wtbl_raw *)tlv;
|
||||
@ -1231,9 +1232,9 @@ u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
|
||||
return 0x38;
|
||||
|
||||
if (sta) {
|
||||
ht_cap = &sta->ht_cap;
|
||||
vht_cap = &sta->vht_cap;
|
||||
he_cap = &sta->he_cap;
|
||||
ht_cap = &sta->deflink.ht_cap;
|
||||
vht_cap = &sta->deflink.vht_cap;
|
||||
he_cap = &sta->deflink.he_cap;
|
||||
} else {
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
||||
|
@ -412,9 +412,9 @@ void mt76x02_mac_write_txwi(struct mt76x02_dev *dev, struct mt76x02_txwi *txwi,
|
||||
txwi->ack_ctl |= MT_TXWI_ACK_CTL_NSEQ;
|
||||
if ((info->flags & IEEE80211_TX_CTL_AMPDU) && sta) {
|
||||
u8 ba_size = IEEE80211_MIN_AMPDU_BUF;
|
||||
u8 ampdu_density = sta->ht_cap.ampdu_density;
|
||||
u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
|
||||
ba_size <<= sta->ht_cap.ampdu_factor;
|
||||
ba_size <<= sta->deflink.ht_cap.ampdu_factor;
|
||||
ba_size = min_t(int, 63, ba_size - 1);
|
||||
if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)
|
||||
ba_size = 0;
|
||||
|
@ -1017,8 +1017,8 @@ static ssize_t mt7915_sta_fixed_rate_set(struct file *file,
|
||||
|
||||
phy.ldpc = (phy.bw || phy.ldpc) * GENMASK(2, 0);
|
||||
for (i = 0; i <= phy.bw; i++) {
|
||||
phy.sgi |= gi << (i << sta->he_cap.has_he);
|
||||
phy.he_ltf |= he_ltf << (i << sta->he_cap.has_he);
|
||||
phy.sgi |= gi << (i << sta->deflink.he_cap.has_he);
|
||||
phy.he_ltf |= he_ltf << (i << sta->deflink.he_cap.has_he);
|
||||
}
|
||||
field = RATE_PARAM_FIXED;
|
||||
|
||||
|
@ -1354,7 +1354,7 @@ mt7915_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi)
|
||||
u16 fc, tid;
|
||||
u32 val;
|
||||
|
||||
if (!sta || !(sta->ht_cap.ht_supported || sta->he_cap.has_he))
|
||||
if (!sta || !(sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he))
|
||||
return;
|
||||
|
||||
tid = le32_get_bits(txwi[1], MT_TXD1_TID);
|
||||
|
@ -112,7 +112,7 @@ mt7915_mcu_set_sta_he_mcs(struct ieee80211_sta *sta, __le16 *he_mcs,
|
||||
struct mt7915_dev *dev = msta->vif->phy->dev;
|
||||
enum nl80211_band band = msta->vif->phy->mt76->chandef.chan->band;
|
||||
const u16 *mask = msta->vif->bitrate_mask.control[band].he_mcs;
|
||||
int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
|
||||
int nss, max_nss = sta->deflink.rx_nss > 3 ? 4 : sta->deflink.rx_nss;
|
||||
|
||||
for (nss = 0; nss < max_nss; nss++) {
|
||||
int mcs;
|
||||
@ -152,7 +152,7 @@ mt7915_mcu_set_sta_he_mcs(struct ieee80211_sta *sta, __le16 *he_mcs,
|
||||
|
||||
/* only support 2ss on 160MHz for mt7915 */
|
||||
if (is_mt7915(&dev->mt76) && nss > 1 &&
|
||||
sta->bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
break;
|
||||
}
|
||||
|
||||
@ -165,8 +165,8 @@ mt7915_mcu_set_sta_vht_mcs(struct ieee80211_sta *sta, __le16 *vht_mcs,
|
||||
{
|
||||
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
|
||||
struct mt7915_dev *dev = msta->vif->phy->dev;
|
||||
u16 mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.rx_mcs_map);
|
||||
int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
|
||||
u16 mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.rx_mcs_map);
|
||||
int nss, max_nss = sta->deflink.rx_nss > 3 ? 4 : sta->deflink.rx_nss;
|
||||
u16 mcs;
|
||||
|
||||
for (nss = 0; nss < max_nss; nss++, mcs_map >>= 2) {
|
||||
@ -188,7 +188,7 @@ mt7915_mcu_set_sta_vht_mcs(struct ieee80211_sta *sta, __le16 *vht_mcs,
|
||||
|
||||
/* only support 2ss on 160MHz for mt7915 */
|
||||
if (is_mt7915(&dev->mt76) && nss > 1 &&
|
||||
sta->bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -197,10 +197,10 @@ static void
|
||||
mt7915_mcu_set_sta_ht_mcs(struct ieee80211_sta *sta, u8 *ht_mcs,
|
||||
const u8 *mask)
|
||||
{
|
||||
int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
|
||||
int nss, max_nss = sta->deflink.rx_nss > 3 ? 4 : sta->deflink.rx_nss;
|
||||
|
||||
for (nss = 0; nss < max_nss; nss++)
|
||||
ht_mcs[nss] = sta->ht_cap.mcs.rx_mask[nss] & mask[nss];
|
||||
ht_mcs[nss] = sta->deflink.ht_cap.mcs.rx_mask[nss] & mask[nss];
|
||||
}
|
||||
|
||||
static int
|
||||
@ -788,13 +788,13 @@ mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
|
||||
struct ieee80211_he_cap_elem *elem = &sta->he_cap.he_cap_elem;
|
||||
struct ieee80211_he_cap_elem *elem = &sta->deflink.he_cap.he_cap_elem;
|
||||
struct ieee80211_he_mcs_nss_supp mcs_map;
|
||||
struct sta_rec_he *he;
|
||||
struct tlv *tlv;
|
||||
u32 cap = 0;
|
||||
|
||||
if (!sta->he_cap.has_he)
|
||||
if (!sta->deflink.he_cap.has_he)
|
||||
return;
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he));
|
||||
@ -880,8 +880,8 @@ mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
|
||||
|
||||
he->he_cap = cpu_to_le32(cap);
|
||||
|
||||
mcs_map = sta->he_cap.he_mcs_nss_supp;
|
||||
switch (sta->bandwidth) {
|
||||
mcs_map = sta->deflink.he_cap.he_mcs_nss_supp;
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_160:
|
||||
if (elem->phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
|
||||
@ -931,7 +931,7 @@ mt7915_mcu_sta_muru_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
|
||||
struct ieee80211_he_cap_elem *elem = &sta->he_cap.he_cap_elem;
|
||||
struct ieee80211_he_cap_elem *elem = &sta->deflink.he_cap.he_cap_elem;
|
||||
struct sta_rec_muru *muru;
|
||||
struct tlv *tlv;
|
||||
|
||||
@ -949,11 +949,11 @@ mt7915_mcu_sta_muru_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
|
||||
muru->cfg.mimo_ul_en = true;
|
||||
muru->cfg.ofdma_dl_en = true;
|
||||
|
||||
if (sta->vht_cap.vht_supported)
|
||||
if (sta->deflink.vht_cap.vht_supported)
|
||||
muru->mimo_dl.vht_mu_bfee =
|
||||
!!(sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
|
||||
!!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
|
||||
|
||||
if (!sta->he_cap.has_he)
|
||||
if (!sta->deflink.he_cap.has_he)
|
||||
return;
|
||||
|
||||
muru->mimo_dl.partial_bw_dl_mimo =
|
||||
@ -987,13 +987,13 @@ mt7915_mcu_sta_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
|
||||
struct sta_rec_ht *ht;
|
||||
struct tlv *tlv;
|
||||
|
||||
if (!sta->ht_cap.ht_supported)
|
||||
if (!sta->deflink.ht_cap.ht_supported)
|
||||
return;
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
|
||||
|
||||
ht = (struct sta_rec_ht *)tlv;
|
||||
ht->ht_cap = cpu_to_le16(sta->ht_cap.cap);
|
||||
ht->ht_cap = cpu_to_le16(sta->deflink.ht_cap.cap);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1002,15 +1002,15 @@ mt7915_mcu_sta_vht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
|
||||
struct sta_rec_vht *vht;
|
||||
struct tlv *tlv;
|
||||
|
||||
if (!sta->vht_cap.vht_supported)
|
||||
if (!sta->deflink.vht_cap.vht_supported)
|
||||
return;
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
|
||||
|
||||
vht = (struct sta_rec_vht *)tlv;
|
||||
vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
|
||||
vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
|
||||
vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
|
||||
vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
|
||||
vht->vht_rx_mcs_map = sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
|
||||
vht->vht_tx_mcs_map = sta->deflink.vht_cap.vht_mcs.tx_mcs_map;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1097,8 +1097,8 @@ mt7915_is_ebf_supported(struct mt7915_phy *phy, struct ieee80211_vif *vif,
|
||||
if (!bfee && tx_ant < 2)
|
||||
return false;
|
||||
|
||||
if (sta->he_cap.has_he) {
|
||||
struct ieee80211_he_cap_elem *pe = &sta->he_cap.he_cap_elem;
|
||||
if (sta->deflink.he_cap.has_he) {
|
||||
struct ieee80211_he_cap_elem *pe = &sta->deflink.he_cap.he_cap_elem;
|
||||
|
||||
if (bfee)
|
||||
return mvif->cap.he_su_ebfee &&
|
||||
@ -1108,8 +1108,8 @@ mt7915_is_ebf_supported(struct mt7915_phy *phy, struct ieee80211_vif *vif,
|
||||
HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]);
|
||||
}
|
||||
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
u32 cap = sta->vht_cap.cap;
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
u32 cap = sta->deflink.vht_cap.cap;
|
||||
|
||||
if (bfee)
|
||||
return mvif->cap.vht_su_ebfee &&
|
||||
@ -1135,7 +1135,7 @@ static void
|
||||
mt7915_mcu_sta_bfer_ht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
|
||||
struct sta_rec_bf *bf)
|
||||
{
|
||||
struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
|
||||
struct ieee80211_mcs_info *mcs = &sta->deflink.ht_cap.mcs;
|
||||
u8 n = 0;
|
||||
|
||||
bf->tx_mode = MT_PHY_TYPE_HT;
|
||||
@ -1160,7 +1160,7 @@ static void
|
||||
mt7915_mcu_sta_bfer_vht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
|
||||
struct sta_rec_bf *bf, bool explicit)
|
||||
{
|
||||
struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
|
||||
struct ieee80211_sta_vht_cap *pc = &sta->deflink.vht_cap;
|
||||
struct ieee80211_sta_vht_cap *vc = &phy->mt76->sband_5g.sband.vht_cap;
|
||||
u16 mcs_map = le16_to_cpu(pc->vht_mcs.rx_mcs_map);
|
||||
u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
|
||||
@ -1181,14 +1181,14 @@ mt7915_mcu_sta_bfer_vht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
|
||||
bf->ncol = min_t(u8, nss_mcs, bf->nrow);
|
||||
bf->ibf_ncol = bf->ncol;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
bf->nrow = 1;
|
||||
} else {
|
||||
bf->nrow = tx_ant;
|
||||
bf->ncol = min_t(u8, nss_mcs, bf->nrow);
|
||||
bf->ibf_ncol = nss_mcs;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
bf->ibf_nrow = 1;
|
||||
}
|
||||
}
|
||||
@ -1197,7 +1197,7 @@ static void
|
||||
mt7915_mcu_sta_bfer_he(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
|
||||
struct mt7915_phy *phy, struct sta_rec_bf *bf)
|
||||
{
|
||||
struct ieee80211_sta_he_cap *pc = &sta->he_cap;
|
||||
struct ieee80211_sta_he_cap *pc = &sta->deflink.he_cap;
|
||||
struct ieee80211_he_cap_elem *pe = &pc->he_cap_elem;
|
||||
const struct ieee80211_sta_he_cap *vc =
|
||||
mt76_connac_get_he_phy_cap(phy->mt76, vif);
|
||||
@ -1222,7 +1222,7 @@ mt7915_mcu_sta_bfer_he(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
|
||||
bf->ncol = min_t(u8, nss_mcs, bf->nrow);
|
||||
bf->ibf_ncol = bf->ncol;
|
||||
|
||||
if (sta->bandwidth != IEEE80211_STA_RX_BW_160)
|
||||
if (sta->deflink.bandwidth != IEEE80211_STA_RX_BW_160)
|
||||
return;
|
||||
|
||||
/* go over for 160MHz and 80p80 */
|
||||
@ -1270,7 +1270,7 @@ mt7915_mcu_sta_bfer_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
|
||||
};
|
||||
bool ebf;
|
||||
|
||||
if (!(sta->ht_cap.ht_supported || sta->he_cap.has_he))
|
||||
if (!(sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he))
|
||||
return;
|
||||
|
||||
ebf = mt7915_is_ebf_supported(phy, vif, sta, false);
|
||||
@ -1284,21 +1284,21 @@ mt7915_mcu_sta_bfer_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
|
||||
* vht: support eBF and iBF
|
||||
* ht: iBF only, since mac80211 lacks of eBF support
|
||||
*/
|
||||
if (sta->he_cap.has_he && ebf)
|
||||
if (sta->deflink.he_cap.has_he && ebf)
|
||||
mt7915_mcu_sta_bfer_he(sta, vif, phy, bf);
|
||||
else if (sta->vht_cap.vht_supported)
|
||||
else if (sta->deflink.vht_cap.vht_supported)
|
||||
mt7915_mcu_sta_bfer_vht(sta, phy, bf, ebf);
|
||||
else if (sta->ht_cap.ht_supported)
|
||||
else if (sta->deflink.ht_cap.ht_supported)
|
||||
mt7915_mcu_sta_bfer_ht(sta, phy, bf);
|
||||
else
|
||||
return;
|
||||
|
||||
bf->bf_cap = ebf ? ebf : dev->ibf << 1;
|
||||
bf->bw = sta->bandwidth;
|
||||
bf->ibf_dbw = sta->bandwidth;
|
||||
bf->bw = sta->deflink.bandwidth;
|
||||
bf->ibf_dbw = sta->deflink.bandwidth;
|
||||
bf->ibf_nrow = tx_ant;
|
||||
|
||||
if (!ebf && sta->bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->ncol)
|
||||
if (!ebf && sta->deflink.bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->ncol)
|
||||
bf->ibf_timeout = 0x48;
|
||||
else
|
||||
bf->ibf_timeout = 0x18;
|
||||
@ -1308,7 +1308,7 @@ mt7915_mcu_sta_bfer_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
|
||||
else
|
||||
bf->mem_20m = matrix[bf->nrow][bf->ncol];
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_160:
|
||||
case IEEE80211_STA_RX_BW_80:
|
||||
bf->mem_total = bf->mem_20m * 2;
|
||||
@ -1333,7 +1333,7 @@ mt7915_mcu_sta_bfee_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
|
||||
struct tlv *tlv;
|
||||
u8 nrow = 0;
|
||||
|
||||
if (!(sta->vht_cap.vht_supported || sta->he_cap.has_he))
|
||||
if (!(sta->deflink.vht_cap.vht_supported || sta->deflink.he_cap.has_he))
|
||||
return;
|
||||
|
||||
if (!mt7915_is_ebf_supported(phy, vif, sta, true))
|
||||
@ -1342,13 +1342,13 @@ mt7915_mcu_sta_bfee_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BFEE, sizeof(*bfee));
|
||||
bfee = (struct sta_rec_bfee *)tlv;
|
||||
|
||||
if (sta->he_cap.has_he) {
|
||||
struct ieee80211_he_cap_elem *pe = &sta->he_cap.he_cap_elem;
|
||||
if (sta->deflink.he_cap.has_he) {
|
||||
struct ieee80211_he_cap_elem *pe = &sta->deflink.he_cap.he_cap_elem;
|
||||
|
||||
nrow = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
|
||||
pe->phy_cap_info[5]);
|
||||
} else if (sta->vht_cap.vht_supported) {
|
||||
struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
|
||||
} else if (sta->deflink.vht_cap.vht_supported) {
|
||||
struct ieee80211_sta_vht_cap *pc = &sta->deflink.vht_cap;
|
||||
|
||||
nrow = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
|
||||
pc->cap);
|
||||
@ -1464,7 +1464,7 @@ mt7915_mcu_add_rate_ctrl_fixed(struct mt7915_dev *dev,
|
||||
do { \
|
||||
u8 i, gi = mask->control[band]._gi; \
|
||||
gi = (_he) ? gi : gi == NL80211_TXRATE_FORCE_SGI; \
|
||||
for (i = 0; i <= sta->bandwidth; i++) { \
|
||||
for (i = 0; i <= sta->deflink.bandwidth; i++) { \
|
||||
phy.sgi |= gi << (i << (_he)); \
|
||||
phy.he_ltf |= mask->control[band].he_ltf << (i << (_he));\
|
||||
} \
|
||||
@ -1476,11 +1476,11 @@ mt7915_mcu_add_rate_ctrl_fixed(struct mt7915_dev *dev,
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
if (sta->he_cap.has_he) {
|
||||
if (sta->deflink.he_cap.has_he) {
|
||||
__sta_phy_bitrate_mask_check(he_mcs, he_gi, 1);
|
||||
} else if (sta->vht_cap.vht_supported) {
|
||||
} else if (sta->deflink.vht_cap.vht_supported) {
|
||||
__sta_phy_bitrate_mask_check(vht_mcs, gi, 0);
|
||||
} else if (sta->ht_cap.ht_supported) {
|
||||
} else if (sta->deflink.ht_cap.ht_supported) {
|
||||
__sta_phy_bitrate_mask_check(ht_mcs, gi, 0);
|
||||
} else {
|
||||
nrates = hweight32(mask->control[band].legacy);
|
||||
@ -1514,7 +1514,7 @@ mt7915_mcu_add_rate_ctrl_fixed(struct mt7915_dev *dev,
|
||||
* actual txrate hardware sends out.
|
||||
*/
|
||||
addr = mt7915_mac_wtbl_lmac_addr(dev, msta->wcid.idx, 7);
|
||||
if (sta->he_cap.has_he)
|
||||
if (sta->deflink.he_cap.has_he)
|
||||
mt76_rmw_field(dev, addr, GENMASK(31, 24), phy.sgi);
|
||||
else
|
||||
mt76_rmw_field(dev, addr, GENMASK(15, 12), phy.sgi);
|
||||
@ -1547,7 +1547,7 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
|
||||
enum nl80211_band band = chandef->chan->band;
|
||||
struct sta_rec_ra *ra;
|
||||
struct tlv *tlv;
|
||||
u32 supp_rate = sta->supp_rates[band];
|
||||
u32 supp_rate = sta->deflink.supp_rates[band];
|
||||
u32 cap = sta->wme ? STA_CAP_WMM : 0;
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra));
|
||||
@ -1557,8 +1557,8 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
|
||||
ra->auto_rate = true;
|
||||
ra->phy_mode = mt76_connac_get_phy_mode(mphy, vif, band, sta);
|
||||
ra->channel = chandef->chan->hw_value;
|
||||
ra->bw = sta->bandwidth;
|
||||
ra->phy.bw = sta->bandwidth;
|
||||
ra->bw = sta->deflink.bandwidth;
|
||||
ra->phy.bw = sta->deflink.bandwidth;
|
||||
ra->mmps_mode = mt7915_mcu_get_mmps_mode(sta->smps_mode);
|
||||
|
||||
if (supp_rate) {
|
||||
@ -1579,22 +1579,22 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
|
||||
}
|
||||
}
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
ra->supp_mode |= MODE_HT;
|
||||
ra->af = sta->ht_cap.ampdu_factor;
|
||||
ra->ht_gf = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
|
||||
ra->af = sta->deflink.ht_cap.ampdu_factor;
|
||||
ra->ht_gf = !!(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
|
||||
|
||||
cap |= STA_CAP_HT;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
|
||||
cap |= STA_CAP_SGI_20;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
|
||||
cap |= STA_CAP_SGI_40;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_TX_STBC)
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_TX_STBC)
|
||||
cap |= STA_CAP_TX_STBC;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
|
||||
cap |= STA_CAP_RX_STBC;
|
||||
if (mvif->cap.ht_ldpc &&
|
||||
(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING))
|
||||
(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING))
|
||||
cap |= STA_CAP_LDPC;
|
||||
|
||||
mt7915_mcu_set_sta_ht_mcs(sta, ra->ht_mcs,
|
||||
@ -1602,37 +1602,37 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
|
||||
ra->supp_ht_mcs = *(__le32 *)ra->ht_mcs;
|
||||
}
|
||||
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
u8 af;
|
||||
|
||||
ra->supp_mode |= MODE_VHT;
|
||||
af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
|
||||
sta->vht_cap.cap);
|
||||
sta->deflink.vht_cap.cap);
|
||||
ra->af = max_t(u8, ra->af, af);
|
||||
|
||||
cap |= STA_CAP_VHT;
|
||||
if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
|
||||
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
|
||||
cap |= STA_CAP_VHT_SGI_80;
|
||||
if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
|
||||
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
|
||||
cap |= STA_CAP_VHT_SGI_160;
|
||||
if (sta->vht_cap.cap & IEEE80211_VHT_CAP_TXSTBC)
|
||||
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_TXSTBC)
|
||||
cap |= STA_CAP_VHT_TX_STBC;
|
||||
if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_1)
|
||||
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_1)
|
||||
cap |= STA_CAP_VHT_RX_STBC;
|
||||
if (mvif->cap.vht_ldpc &&
|
||||
(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC))
|
||||
(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC))
|
||||
cap |= STA_CAP_VHT_LDPC;
|
||||
|
||||
mt7915_mcu_set_sta_vht_mcs(sta, ra->supp_vht_mcs,
|
||||
mask->control[band].vht_mcs);
|
||||
}
|
||||
|
||||
if (sta->he_cap.has_he) {
|
||||
if (sta->deflink.he_cap.has_he) {
|
||||
ra->supp_mode |= MODE_HE;
|
||||
cap |= STA_CAP_HE;
|
||||
|
||||
if (sta->he_6ghz_capa.capa)
|
||||
ra->af = le16_get_bits(sta->he_6ghz_capa.capa,
|
||||
if (sta->deflink.he_6ghz_capa.capa)
|
||||
ra->af = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
|
||||
IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
|
||||
}
|
||||
|
||||
|
@ -1023,7 +1023,7 @@ void mt7921_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi)
|
||||
u16 fc, tid;
|
||||
u32 val;
|
||||
|
||||
if (!sta || !(sta->ht_cap.ht_supported || sta->he_cap.has_he))
|
||||
if (!sta || !(sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he))
|
||||
return;
|
||||
|
||||
tid = le32_get_bits(txwi[1], MT_TXD1_TID);
|
||||
|
@ -385,7 +385,7 @@ void mt7601u_mac_set_ampdu_factor(struct mt7601u_dev *dev)
|
||||
msta = container_of(wcid, struct mt76_sta, wcid);
|
||||
sta = container_of(msta, struct ieee80211_sta, drv_priv);
|
||||
|
||||
min_factor = min(min_factor, sta->ht_cap.ampdu_factor);
|
||||
min_factor = min(min_factor, sta->deflink.ht_cap.ampdu_factor);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
|
@ -163,7 +163,7 @@ mt7601u_push_txwi(struct mt7601u_dev *dev, struct sk_buff *skb,
|
||||
if ((info->flags & IEEE80211_TX_CTL_AMPDU) && sta) {
|
||||
u8 ba_size = IEEE80211_MIN_AMPDU_BUF;
|
||||
|
||||
ba_size <<= sta->ht_cap.ampdu_factor;
|
||||
ba_size <<= sta->deflink.ht_cap.ampdu_factor;
|
||||
ba_size = min_t(int, 63, ba_size);
|
||||
if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)
|
||||
ba_size = 0;
|
||||
@ -172,7 +172,7 @@ mt7601u_push_txwi(struct mt7601u_dev *dev, struct sk_buff *skb,
|
||||
txwi->flags =
|
||||
cpu_to_le16(MT_TXWI_FLAGS_AMPDU |
|
||||
FIELD_PREP(MT_TXWI_FLAGS_MPDU_DENSITY,
|
||||
sta->ht_cap.ampdu_density));
|
||||
sta->deflink.ht_cap.ampdu_density));
|
||||
if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)
|
||||
txwi->flags = 0;
|
||||
}
|
||||
|
@ -1801,8 +1801,8 @@ int rt2800_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
* do not have a choice if some connected STA is not capable to
|
||||
* receive the same amount of data like the others.
|
||||
*/
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
drv_data->ampdu_factor_cnt[sta->ht_cap.ampdu_factor & 3]++;
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
drv_data->ampdu_factor_cnt[sta->deflink.ht_cap.ampdu_factor & 3]++;
|
||||
rt2800_set_max_psdu_len(rt2x00dev);
|
||||
}
|
||||
|
||||
@ -1847,8 +1847,8 @@ int rt2800_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
struct rt2x00_sta *sta_priv = sta_to_rt2x00_sta(sta);
|
||||
int wcid = sta_priv->wcid;
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
drv_data->ampdu_factor_cnt[sta->ht_cap.ampdu_factor & 3]--;
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
drv_data->ampdu_factor_cnt[sta->deflink.ht_cap.ampdu_factor & 3]--;
|
||||
rt2800_set_max_psdu_len(rt2x00dev);
|
||||
}
|
||||
|
||||
|
@ -303,7 +303,7 @@ static void rt2x00queue_create_tx_descriptor_ht(struct rt2x00_dev *rt2x00dev,
|
||||
if (sta) {
|
||||
sta_priv = sta_to_rt2x00_sta(sta);
|
||||
txdesc->u.ht.wcid = sta_priv->wcid;
|
||||
density = sta->ht_cap.ampdu_density;
|
||||
density = sta->deflink.ht_cap.ampdu_density;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -4533,21 +4533,21 @@ rtl8xxxu_wireless_mode(struct ieee80211_hw *hw, struct ieee80211_sta *sta)
|
||||
u16 network_type = WIRELESS_MODE_UNKNOWN;
|
||||
|
||||
if (hw->conf.chandef.chan->band == NL80211_BAND_5GHZ) {
|
||||
if (sta->vht_cap.vht_supported)
|
||||
if (sta->deflink.vht_cap.vht_supported)
|
||||
network_type = WIRELESS_MODE_AC;
|
||||
else if (sta->ht_cap.ht_supported)
|
||||
else if (sta->deflink.ht_cap.ht_supported)
|
||||
network_type = WIRELESS_MODE_N_5G;
|
||||
|
||||
network_type |= WIRELESS_MODE_A;
|
||||
} else {
|
||||
if (sta->vht_cap.vht_supported)
|
||||
if (sta->deflink.vht_cap.vht_supported)
|
||||
network_type = WIRELESS_MODE_AC;
|
||||
else if (sta->ht_cap.ht_supported)
|
||||
else if (sta->deflink.ht_cap.ht_supported)
|
||||
network_type = WIRELESS_MODE_N_24G;
|
||||
|
||||
if (sta->supp_rates[0] <= 0xf)
|
||||
if (sta->deflink.supp_rates[0] <= 0xf)
|
||||
network_type |= WIRELESS_MODE_B;
|
||||
else if (sta->supp_rates[0] & 0xf)
|
||||
else if (sta->deflink.supp_rates[0] & 0xf)
|
||||
network_type |= (WIRELESS_MODE_B | WIRELESS_MODE_G);
|
||||
else
|
||||
network_type |= WIRELESS_MODE_G;
|
||||
@ -4591,16 +4591,16 @@ rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (sta->ht_cap.ht_supported)
|
||||
if (sta->deflink.ht_cap.ht_supported)
|
||||
dev_info(dev, "%s: HT supported\n", __func__);
|
||||
if (sta->vht_cap.vht_supported)
|
||||
if (sta->deflink.vht_cap.vht_supported)
|
||||
dev_info(dev, "%s: VHT supported\n", __func__);
|
||||
|
||||
/* TODO: Set bits 28-31 for rate adaptive id */
|
||||
ramask = (sta->supp_rates[0] & 0xfff) |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12 |
|
||||
sta->ht_cap.mcs.rx_mask[1] << 20;
|
||||
if (sta->ht_cap.cap &
|
||||
ramask = (sta->deflink.supp_rates[0] & 0xfff) |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[1] << 20;
|
||||
if (sta->deflink.ht_cap.cap &
|
||||
(IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20))
|
||||
sgi = 1;
|
||||
rcu_read_unlock();
|
||||
@ -5095,12 +5095,12 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
|
||||
/* (tx_info->flags & IEEE80211_TX_CTL_AMPDU) && */
|
||||
ampdu_enable = false;
|
||||
if (ieee80211_is_data_qos(hdr->frame_control) && sta) {
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
u32 ampdu, val32;
|
||||
u8 *qc = ieee80211_get_qos_ctl(hdr);
|
||||
u8 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
|
||||
|
||||
ampdu = (u32)sta->ht_cap.ampdu_density;
|
||||
ampdu = (u32)sta->deflink.ht_cap.ampdu_density;
|
||||
val32 = ampdu << TXDESC_AMPDU_DENSITY_SHIFT;
|
||||
tx_desc->txdw2 |= cpu_to_le32(val32);
|
||||
|
||||
@ -5115,7 +5115,7 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
|
||||
|
||||
if (rate_flag & IEEE80211_TX_RC_SHORT_GI ||
|
||||
(ieee80211_is_data_qos(hdr->frame_control) &&
|
||||
sta && sta->ht_cap.cap &
|
||||
sta && sta->deflink.ht_cap.cap &
|
||||
(IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20)))
|
||||
sgi = true;
|
||||
|
||||
@ -6162,8 +6162,8 @@ rtl8xxxu_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
switch (action) {
|
||||
case IEEE80211_AMPDU_TX_START:
|
||||
dev_dbg(dev, "%s: IEEE80211_AMPDU_TX_START\n", __func__);
|
||||
ampdu_factor = sta->ht_cap.ampdu_factor;
|
||||
ampdu_density = sta->ht_cap.ampdu_density;
|
||||
ampdu_factor = sta->deflink.ht_cap.ampdu_factor;
|
||||
ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
rtl8xxxu_set_ampdu_factor(priv, ampdu_factor);
|
||||
rtl8xxxu_set_ampdu_min_space(priv, ampdu_density);
|
||||
dev_dbg(dev,
|
||||
@ -6255,10 +6255,10 @@ static void rtl8xxxu_refresh_rate_mask(struct rtl8xxxu_priv *priv,
|
||||
u32 rate_bitmap = 0;
|
||||
|
||||
rcu_read_lock();
|
||||
rate_bitmap = (sta->supp_rates[0] & 0xfff) |
|
||||
(sta->ht_cap.mcs.rx_mask[0] << 12) |
|
||||
(sta->ht_cap.mcs.rx_mask[1] << 20);
|
||||
if (sta->ht_cap.cap &
|
||||
rate_bitmap = (sta->deflink.supp_rates[0] & 0xfff) |
|
||||
(sta->deflink.ht_cap.mcs.rx_mask[0] << 12) |
|
||||
(sta->deflink.ht_cap.mcs.rx_mask[1] << 20);
|
||||
if (sta->deflink.ht_cap.cap &
|
||||
(IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20))
|
||||
sgi = 1;
|
||||
rcu_read_unlock();
|
||||
|
@ -629,11 +629,12 @@ static void _rtl_query_shortgi(struct ieee80211_hw *hw,
|
||||
if (sta == NULL)
|
||||
return;
|
||||
|
||||
sgi_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
|
||||
sgi_20 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
|
||||
sgi_80 = sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80;
|
||||
sgi_40 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
|
||||
sgi_20 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
|
||||
sgi_80 = sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80;
|
||||
|
||||
if ((!sta->ht_cap.ht_supported) && (!sta->vht_cap.vht_supported))
|
||||
if (!sta->deflink.ht_cap.ht_supported &&
|
||||
!sta->deflink.vht_cap.vht_supported)
|
||||
return;
|
||||
|
||||
if (!sgi_40 && !sgi_20)
|
||||
@ -645,8 +646,8 @@ static void _rtl_query_shortgi(struct ieee80211_hw *hw,
|
||||
} else if (mac->opmode == NL80211_IFTYPE_AP ||
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC ||
|
||||
mac->opmode == NL80211_IFTYPE_MESH_POINT) {
|
||||
bw_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
bw_80 = sta->vht_cap.vht_supported;
|
||||
bw_40 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
bw_80 = sta->deflink.vht_cap.vht_supported;
|
||||
}
|
||||
|
||||
if (bw_80) {
|
||||
@ -864,11 +865,11 @@ static void _rtl_query_bandwidth_mode(struct ieee80211_hw *hw,
|
||||
if (mac->opmode == NL80211_IFTYPE_AP ||
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC ||
|
||||
mac->opmode == NL80211_IFTYPE_MESH_POINT) {
|
||||
if (!(sta->ht_cap.ht_supported) ||
|
||||
!(sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
|
||||
if (!(sta->deflink.ht_cap.ht_supported) ||
|
||||
!(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
|
||||
return;
|
||||
} else if (mac->opmode == NL80211_IFTYPE_STATION) {
|
||||
if (!mac->bw_40 || !(sta->ht_cap.ht_supported))
|
||||
if (!mac->bw_40 || !(sta->deflink.ht_cap.ht_supported))
|
||||
return;
|
||||
}
|
||||
if (tcb_desc->multicast || tcb_desc->broadcast)
|
||||
@ -884,11 +885,11 @@ static void _rtl_query_bandwidth_mode(struct ieee80211_hw *hw,
|
||||
if (mac->opmode == NL80211_IFTYPE_AP ||
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC ||
|
||||
mac->opmode == NL80211_IFTYPE_MESH_POINT) {
|
||||
if (!(sta->vht_cap.vht_supported))
|
||||
if (!(sta->deflink.vht_cap.vht_supported))
|
||||
return;
|
||||
} else if (mac->opmode == NL80211_IFTYPE_STATION) {
|
||||
if (!mac->bw_80 ||
|
||||
!(sta->vht_cap.vht_supported))
|
||||
!(sta->deflink.vht_cap.vht_supported))
|
||||
return;
|
||||
}
|
||||
if (tcb_desc->hw_rate <=
|
||||
@ -904,7 +905,7 @@ static u8 _rtl_get_vht_highest_n_rate(struct ieee80211_hw *hw,
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_phy *rtlphy = &(rtlpriv->phy);
|
||||
u8 hw_rate;
|
||||
u16 tx_mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.tx_mcs_map);
|
||||
u16 tx_mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.tx_mcs_map);
|
||||
|
||||
if ((get_rf_type(rtlphy) == RF_2T2R) &&
|
||||
(tx_mcs_map & 0x000c) != 0x000c) {
|
||||
@ -944,7 +945,7 @@ static u8 _rtl_get_highest_n_rate(struct ieee80211_hw *hw,
|
||||
u8 hw_rate;
|
||||
|
||||
if (get_rf_type(rtlphy) == RF_2T2R &&
|
||||
sta->ht_cap.mcs.rx_mask[1] != 0)
|
||||
sta->deflink.ht_cap.mcs.rx_mask[1] != 0)
|
||||
hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS15];
|
||||
else
|
||||
hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS7];
|
||||
@ -1271,11 +1272,11 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw,
|
||||
*and N rate will all be controlled by FW
|
||||
*when tcb_desc->use_driver_rate = false
|
||||
*/
|
||||
if (sta && sta->vht_cap.vht_supported) {
|
||||
if (sta && sta->deflink.vht_cap.vht_supported) {
|
||||
tcb_desc->hw_rate =
|
||||
_rtl_get_vht_highest_n_rate(hw, sta);
|
||||
} else {
|
||||
if (sta && sta->ht_cap.ht_supported) {
|
||||
if (sta && sta->deflink.ht_cap.ht_supported) {
|
||||
tcb_desc->hw_rate =
|
||||
_rtl_get_highest_n_rate(hw, sta);
|
||||
} else {
|
||||
|
@ -903,18 +903,18 @@ static int rtl_op_sta_add(struct ieee80211_hw *hw,
|
||||
spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
|
||||
if (rtlhal->current_bandtype == BAND_ON_2_4G) {
|
||||
sta_entry->wireless_mode = WIRELESS_MODE_G;
|
||||
if (sta->supp_rates[0] <= 0xf)
|
||||
if (sta->deflink.supp_rates[0] <= 0xf)
|
||||
sta_entry->wireless_mode = WIRELESS_MODE_B;
|
||||
if (sta->ht_cap.ht_supported)
|
||||
if (sta->deflink.ht_cap.ht_supported)
|
||||
sta_entry->wireless_mode = WIRELESS_MODE_N_24G;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_ADHOC)
|
||||
sta_entry->wireless_mode = WIRELESS_MODE_G;
|
||||
} else if (rtlhal->current_bandtype == BAND_ON_5G) {
|
||||
sta_entry->wireless_mode = WIRELESS_MODE_A;
|
||||
if (sta->ht_cap.ht_supported)
|
||||
if (sta->deflink.ht_cap.ht_supported)
|
||||
sta_entry->wireless_mode = WIRELESS_MODE_N_5G;
|
||||
if (sta->vht_cap.vht_supported)
|
||||
if (sta->deflink.vht_cap.vht_supported)
|
||||
sta_entry->wireless_mode = WIRELESS_MODE_AC_5G;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_ADHOC)
|
||||
@ -922,7 +922,7 @@ static int rtl_op_sta_add(struct ieee80211_hw *hw,
|
||||
}
|
||||
/*disable cck rate for p2p*/
|
||||
if (mac->p2p)
|
||||
sta->supp_rates[0] &= 0xfffffff0;
|
||||
sta->deflink.supp_rates[0] &= 0xfffffff0;
|
||||
|
||||
memcpy(sta_entry->mac_addr, sta->addr, ETH_ALEN);
|
||||
rtl_dbg(rtlpriv, COMP_MAC80211, DBG_DMESG,
|
||||
@ -1126,7 +1126,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||
rtl_dbg(rtlpriv, COMP_EASY_CONCURRENT, DBG_LOUD,
|
||||
"send PS STATIC frame\n");
|
||||
if (rtlpriv->dm.supp_phymode_switch) {
|
||||
if (sta->ht_cap.ht_supported)
|
||||
if (sta->deflink.ht_cap.ht_supported)
|
||||
rtl_send_smps_action(hw, sta,
|
||||
IEEE80211_SMPS_STATIC);
|
||||
}
|
||||
@ -1134,20 +1134,20 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G) {
|
||||
mac->mode = WIRELESS_MODE_A;
|
||||
} else {
|
||||
if (sta->supp_rates[0] <= 0xf)
|
||||
if (sta->deflink.supp_rates[0] <= 0xf)
|
||||
mac->mode = WIRELESS_MODE_B;
|
||||
else
|
||||
mac->mode = WIRELESS_MODE_G;
|
||||
}
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
if (rtlhal->current_bandtype == BAND_ON_2_4G)
|
||||
mac->mode = WIRELESS_MODE_N_24G;
|
||||
else
|
||||
mac->mode = WIRELESS_MODE_N_5G;
|
||||
}
|
||||
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
mac->mode = WIRELESS_MODE_AC_5G;
|
||||
else
|
||||
@ -1256,14 +1256,14 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||
rcu_read_lock();
|
||||
sta = ieee80211_find_sta(vif, (u8 *)bss_conf->bssid);
|
||||
if (sta) {
|
||||
if (sta->ht_cap.ampdu_density >
|
||||
if (sta->deflink.ht_cap.ampdu_density >
|
||||
mac->current_ampdu_density)
|
||||
mac->current_ampdu_density =
|
||||
sta->ht_cap.ampdu_density;
|
||||
if (sta->ht_cap.ampdu_factor <
|
||||
sta->deflink.ht_cap.ampdu_density;
|
||||
if (sta->deflink.ht_cap.ampdu_factor <
|
||||
mac->current_ampdu_factor)
|
||||
mac->current_ampdu_factor =
|
||||
sta->ht_cap.ampdu_factor;
|
||||
sta->deflink.ht_cap.ampdu_factor;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
@ -1298,20 +1298,20 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G) {
|
||||
mac->mode = WIRELESS_MODE_A;
|
||||
} else {
|
||||
if (sta->supp_rates[0] <= 0xf)
|
||||
if (sta->deflink.supp_rates[0] <= 0xf)
|
||||
mac->mode = WIRELESS_MODE_B;
|
||||
else
|
||||
mac->mode = WIRELESS_MODE_G;
|
||||
}
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
if (rtlhal->current_bandtype == BAND_ON_2_4G)
|
||||
mac->mode = WIRELESS_MODE_N_24G;
|
||||
else
|
||||
mac->mode = WIRELESS_MODE_N_5G;
|
||||
}
|
||||
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
mac->mode = WIRELESS_MODE_AC_5G;
|
||||
else
|
||||
@ -1327,7 +1327,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||
sta_entry->wireless_mode = mac->mode;
|
||||
}
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
mac->ht_enable = true;
|
||||
|
||||
/*
|
||||
@ -1338,16 +1338,16 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||
* */
|
||||
}
|
||||
|
||||
if (sta->vht_cap.vht_supported)
|
||||
if (sta->deflink.vht_cap.vht_supported)
|
||||
mac->vht_enable = true;
|
||||
|
||||
if (changed & BSS_CHANGED_BASIC_RATES) {
|
||||
/* for 5G must << RATE_6M_INDEX = 4,
|
||||
* because 5G have no cck rate*/
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
basic_rates = sta->supp_rates[1] << 4;
|
||||
basic_rates = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
basic_rates = sta->supp_rates[0];
|
||||
basic_rates = sta->deflink.supp_rates[0];
|
||||
|
||||
mac->basic_rates = basic_rates;
|
||||
rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BASIC_RATE,
|
||||
|
@ -66,7 +66,7 @@ static u8 _rtl_rc_get_highest_rix(struct rtl_priv *rtlpriv,
|
||||
else
|
||||
return N_MODE_MCS15_RIX;
|
||||
} else if (wireless_mode == WIRELESS_MODE_AC_24G) {
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_20) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20) {
|
||||
ieee80211_rate_set_vht(&rate,
|
||||
AC_MODE_MCS8_RIX,
|
||||
nss);
|
||||
@ -88,7 +88,7 @@ static u8 _rtl_rc_get_highest_rix(struct rtl_priv *rtlpriv,
|
||||
else
|
||||
return N_MODE_MCS15_RIX;
|
||||
} else if (wireless_mode == WIRELESS_MODE_AC_5G) {
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_20) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20) {
|
||||
ieee80211_rate_set_vht(&rate,
|
||||
AC_MODE_MCS8_RIX,
|
||||
nss);
|
||||
@ -121,9 +121,9 @@ static void _rtl_rc_rate_set_series(struct rtl_priv *rtlpriv,
|
||||
u8 sgi_20 = 0, sgi_40 = 0, sgi_80 = 0;
|
||||
|
||||
if (sta) {
|
||||
sgi_20 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
|
||||
sgi_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
|
||||
sgi_80 = sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80;
|
||||
sgi_20 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
|
||||
sgi_40 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
|
||||
sgi_80 = sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80;
|
||||
sta_entry = (struct rtl_sta_info *)sta->drv_priv;
|
||||
wireless_mode = sta_entry->wireless_mode;
|
||||
}
|
||||
@ -135,10 +135,10 @@ static void _rtl_rc_rate_set_series(struct rtl_priv *rtlpriv,
|
||||
rate->flags |= IEEE80211_TX_RC_USE_SHORT_PREAMBLE;
|
||||
if (mac->opmode == NL80211_IFTYPE_AP ||
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC) {
|
||||
if (sta && (sta->ht_cap.cap &
|
||||
if (sta && (sta->deflink.ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40))
|
||||
rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
|
||||
if (sta && sta->vht_cap.vht_supported)
|
||||
if (sta && sta->deflink.vht_cap.vht_supported)
|
||||
rate->flags |= IEEE80211_TX_RC_80_MHZ_WIDTH;
|
||||
} else {
|
||||
if (mac->bw_80)
|
||||
@ -149,11 +149,11 @@ static void _rtl_rc_rate_set_series(struct rtl_priv *rtlpriv,
|
||||
|
||||
if (sgi_20 || sgi_40 || sgi_80)
|
||||
rate->flags |= IEEE80211_TX_RC_SHORT_GI;
|
||||
if (sta && sta->ht_cap.ht_supported &&
|
||||
if (sta && sta->deflink.ht_cap.ht_supported &&
|
||||
(wireless_mode == WIRELESS_MODE_N_5G ||
|
||||
wireless_mode == WIRELESS_MODE_N_24G))
|
||||
rate->flags |= IEEE80211_TX_RC_MCS;
|
||||
if (sta && sta->vht_cap.vht_supported &&
|
||||
if (sta && sta->deflink.vht_cap.vht_supported &&
|
||||
(wireless_mode == WIRELESS_MODE_AC_5G ||
|
||||
wireless_mode == WIRELESS_MODE_AC_24G ||
|
||||
wireless_mode == WIRELESS_MODE_AC_ONLY))
|
||||
@ -229,7 +229,7 @@ static void rtl_tx_status(void *ppriv,
|
||||
if (sta) {
|
||||
/* Check if aggregation has to be enabled for this tid */
|
||||
sta_entry = (struct rtl_sta_info *)sta->drv_priv;
|
||||
if (sta->ht_cap.ht_supported &&
|
||||
if (sta->deflink.ht_cap.ht_supported &&
|
||||
!(skb->protocol == cpu_to_be16(ETH_P_PAE))) {
|
||||
if (ieee80211_is_data_qos(fc)) {
|
||||
u8 tid = rtl_get_tid(skb);
|
||||
|
@ -1975,21 +1975,21 @@ static void rtl88ee_update_hal_rate_table(struct ieee80211_hw *hw,
|
||||
u16 shortgi_rate;
|
||||
u32 tmp_ratr_value;
|
||||
u8 curtxbw_40mhz = mac->bw_40;
|
||||
u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = mac->mode;
|
||||
u32 ratr_mask;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_value = sta->supp_rates[1] << 4;
|
||||
ratr_value = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_value = sta->supp_rates[0];
|
||||
ratr_value = sta->deflink.supp_rates[0];
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_value = 0xfff;
|
||||
ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
if (ratr_value & 0x0000000c)
|
||||
@ -2061,11 +2061,11 @@ static void rtl88ee_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
struct rtl_sta_info *sta_entry = NULL;
|
||||
u32 ratr_bitmap;
|
||||
u8 ratr_index;
|
||||
u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
|
||||
u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
|
||||
? 1 : 0;
|
||||
u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = 0;
|
||||
bool b_shortgi = false;
|
||||
@ -2083,13 +2083,13 @@ static void rtl88ee_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
macid = sta->aid + 1;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_bitmap = sta->supp_rates[1] << 4;
|
||||
ratr_bitmap = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_bitmap = sta->supp_rates[0];
|
||||
ratr_bitmap = sta->deflink.supp_rates[0];
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_bitmap = 0xfff;
|
||||
ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
ratr_index = RATR_INX_WIRELESS_B;
|
||||
|
@ -504,7 +504,7 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
} else if (mac->opmode == NL80211_IFTYPE_AP ||
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC) {
|
||||
if (sta)
|
||||
bw_40 = sta->ht_cap.cap &
|
||||
bw_40 = sta->deflink.ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
}
|
||||
seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
|
||||
@ -591,7 +591,7 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
set_tx_desc_linip(pdesc, 0);
|
||||
set_tx_desc_pkt_size(pdesc, (u16)skb_len);
|
||||
if (sta) {
|
||||
u8 ampdu_density = sta->ht_cap.ampdu_density;
|
||||
u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
set_tx_desc_ampdu_density(pdesc, ampdu_density);
|
||||
}
|
||||
if (info->control.hw_key) {
|
||||
|
@ -1765,22 +1765,22 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,
|
||||
u16 shortgi_rate;
|
||||
u32 tmp_ratr_value;
|
||||
u8 curtxbw_40mhz = mac->bw_40;
|
||||
u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = mac->mode;
|
||||
u32 ratr_mask;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_value = sta->supp_rates[1] << 4;
|
||||
ratr_value = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_value = sta->supp_rates[0];
|
||||
ratr_value = sta->deflink.supp_rates[0];
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_value = 0xfff;
|
||||
|
||||
ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
if (ratr_value & 0x0000000c)
|
||||
@ -1853,11 +1853,11 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
struct rtl_sta_info *sta_entry = NULL;
|
||||
u32 ratr_bitmap;
|
||||
u8 ratr_index;
|
||||
u8 curtxbw_40mhz = (sta->ht_cap.cap &
|
||||
u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0;
|
||||
u8 curshortgi_40mhz = (sta->ht_cap.cap &
|
||||
u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SGI_40) ? 1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = 0;
|
||||
bool shortgi = false;
|
||||
@ -1874,13 +1874,13 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
macid = sta->aid + 1;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_bitmap = sta->supp_rates[1] << 4;
|
||||
ratr_bitmap = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_bitmap = sta->supp_rates[0];
|
||||
ratr_bitmap = sta->deflink.supp_rates[0];
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_bitmap = 0xfff;
|
||||
ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
ratr_index = RATR_INX_WIRELESS_B;
|
||||
|
@ -379,7 +379,7 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC ||
|
||||
mac->opmode == NL80211_IFTYPE_MESH_POINT) {
|
||||
if (sta)
|
||||
bw_40 = sta->bandwidth >= IEEE80211_STA_RX_BW_40;
|
||||
bw_40 = sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40;
|
||||
}
|
||||
|
||||
seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
|
||||
@ -441,7 +441,7 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
set_tx_desc_pkt_size(pdesc, (u16)skb->len);
|
||||
|
||||
if (sta) {
|
||||
u8 ampdu_density = sta->ht_cap.ampdu_density;
|
||||
u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
|
||||
set_tx_desc_ampdu_density(pdesc, ampdu_density);
|
||||
}
|
||||
|
@ -1918,21 +1918,21 @@ static void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw,
|
||||
u16 shortgi_rate;
|
||||
u32 tmp_ratr_value;
|
||||
u8 curtxbw_40mhz = mac->bw_40;
|
||||
u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = mac->mode;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_value = sta->supp_rates[1] << 4;
|
||||
ratr_value = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_value = sta->supp_rates[0];
|
||||
ratr_value = sta->deflink.supp_rates[0];
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_value = 0xfff;
|
||||
|
||||
ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
if (ratr_value & 0x0000000c)
|
||||
@ -2003,11 +2003,11 @@ static void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
struct rtl_sta_info *sta_entry = NULL;
|
||||
u32 ratr_bitmap;
|
||||
u8 ratr_index;
|
||||
u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
|
||||
u8 curtxbw_40mhz = (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
|
||||
u8 curshortgi_40mhz = curtxbw_40mhz &&
|
||||
(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = 0;
|
||||
bool shortgi = false;
|
||||
@ -2025,13 +2025,13 @@ static void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
macid = sta->aid + 1;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_bitmap = sta->supp_rates[1] << 4;
|
||||
ratr_bitmap = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_bitmap = sta->supp_rates[0];
|
||||
ratr_bitmap = sta->deflink.supp_rates[0];
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_bitmap = 0xfff;
|
||||
ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
ratr_index = RATR_INX_WIRELESS_B;
|
||||
|
@ -540,7 +540,7 @@ void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
rcu_read_lock();
|
||||
sta = ieee80211_find_sta(mac->vif, mac->bssid);
|
||||
if (sta) {
|
||||
u8 ampdu_density = sta->ht_cap.ampdu_density;
|
||||
u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
|
||||
set_tx_desc_ampdu_density(txdesc, ampdu_density);
|
||||
}
|
||||
|
@ -1802,18 +1802,18 @@ static void rtl92de_update_hal_rate_table(struct ieee80211_hw *hw,
|
||||
u16 shortgi_rate;
|
||||
u32 tmp_ratr_value;
|
||||
u8 curtxbw_40mhz = mac->bw_40;
|
||||
u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = mac->mode;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_value = sta->supp_rates[1] << 4;
|
||||
ratr_value = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_value = sta->supp_rates[0];
|
||||
ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_value = sta->deflink.supp_rates[0];
|
||||
ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_A:
|
||||
ratr_value &= 0x00000FF0;
|
||||
@ -1880,10 +1880,10 @@ static void rtl92de_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
struct rtl_sta_info *sta_entry = NULL;
|
||||
u32 ratr_bitmap;
|
||||
u8 ratr_index;
|
||||
u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
|
||||
u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 curtxbw_40mhz = (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
|
||||
u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = 0;
|
||||
bool shortgi = false;
|
||||
@ -1901,11 +1901,11 @@ static void rtl92de_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
macid = sta->aid + 1;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_bitmap = sta->supp_rates[1] << 4;
|
||||
ratr_bitmap = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_bitmap = sta->supp_rates[0];
|
||||
ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_bitmap = sta->deflink.supp_rates[0];
|
||||
ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
ratr_index = RATR_INX_WIRELESS_B;
|
||||
|
@ -498,7 +498,7 @@ void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
} else if (mac->opmode == NL80211_IFTYPE_AP ||
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC) {
|
||||
if (sta)
|
||||
bw_40 = sta->bandwidth >= IEEE80211_STA_RX_BW_40;
|
||||
bw_40 = sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40;
|
||||
}
|
||||
seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
|
||||
rtl_get_tcb_desc(hw, info, sta, skb, ptcb_desc);
|
||||
@ -586,7 +586,7 @@ void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
set_tx_desc_linip(pdesc, 0);
|
||||
set_tx_desc_pkt_size(pdesc, (u16)skb_len);
|
||||
if (sta) {
|
||||
u8 ampdu_density = sta->ht_cap.ampdu_density;
|
||||
u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
set_tx_desc_ampdu_density(pdesc, ampdu_density);
|
||||
}
|
||||
if (info->control.hw_key) {
|
||||
|
@ -2256,11 +2256,11 @@ static void rtl92ee_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
struct rtl_sta_info *sta_entry = NULL;
|
||||
u32 ratr_bitmap;
|
||||
u8 ratr_index;
|
||||
u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
|
||||
u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
|
||||
? 1 : 0;
|
||||
u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 b_curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 b_curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = 0;
|
||||
bool b_shortgi = false;
|
||||
@ -2276,12 +2276,12 @@ static void rtl92ee_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
macid = sta->aid + 1;
|
||||
|
||||
ratr_bitmap = sta->supp_rates[0];
|
||||
ratr_bitmap = sta->deflink.supp_rates[0];
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_bitmap = 0xfff;
|
||||
|
||||
ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
|
@ -665,7 +665,7 @@ void rtl92ee_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
} else if (mac->opmode == NL80211_IFTYPE_AP ||
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC) {
|
||||
if (sta)
|
||||
bw_40 = sta->ht_cap.cap &
|
||||
bw_40 = sta->deflink.ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
}
|
||||
seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
|
||||
@ -759,7 +759,7 @@ void rtl92ee_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
|
||||
set_tx_desc_linip(pdesc, 0);
|
||||
if (sta) {
|
||||
u8 ampdu_density = sta->ht_cap.ampdu_density;
|
||||
u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
|
||||
set_tx_desc_ampdu_density(pdesc, ampdu_density);
|
||||
}
|
||||
|
@ -2017,20 +2017,20 @@ static void rtl92se_update_hal_rate_table(struct ieee80211_hw *hw,
|
||||
u16 shortgi_rate = 0;
|
||||
u32 tmp_ratr_value = 0;
|
||||
u8 curtxbw_40mhz = mac->bw_40;
|
||||
u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = mac->mode;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_value = sta->supp_rates[1] << 4;
|
||||
ratr_value = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_value = sta->supp_rates[0];
|
||||
ratr_value = sta->deflink.supp_rates[0];
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_value = 0xfff;
|
||||
ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
ratr_value &= 0x0000000D;
|
||||
@ -2115,10 +2115,10 @@ static void rtl92se_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
struct rtl_sta_info *sta_entry = NULL;
|
||||
u32 ratr_bitmap;
|
||||
u8 ratr_index = 0;
|
||||
u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
|
||||
u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 curtxbw_40mhz = (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
|
||||
u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = 0;
|
||||
bool shortgi = false;
|
||||
@ -2139,13 +2139,13 @@ static void rtl92se_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
macid = sta->aid + 1;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_bitmap = sta->supp_rates[1] << 4;
|
||||
ratr_bitmap = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_bitmap = sta->supp_rates[0];
|
||||
ratr_bitmap = sta->deflink.supp_rates[0];
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_bitmap = 0xfff;
|
||||
ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
band |= WIRELESS_11B;
|
||||
|
@ -342,7 +342,7 @@ void rtl92se_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
} else if (mac->opmode == NL80211_IFTYPE_AP ||
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC) {
|
||||
if (sta)
|
||||
bw_40 = sta->bandwidth >= IEEE80211_STA_RX_BW_40;
|
||||
bw_40 = sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40;
|
||||
}
|
||||
|
||||
seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
|
||||
|
@ -1841,21 +1841,21 @@ static void rtl8723e_update_hal_rate_table(struct ieee80211_hw *hw,
|
||||
u16 shortgi_rate;
|
||||
u32 tmp_ratr_value;
|
||||
u8 curtxbw_40mhz = mac->bw_40;
|
||||
u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = mac->mode;
|
||||
u32 ratr_mask;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_value = sta->supp_rates[1] << 4;
|
||||
ratr_value = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_value = sta->supp_rates[0];
|
||||
ratr_value = sta->deflink.supp_rates[0];
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_value = 0xfff;
|
||||
ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
if (ratr_value & 0x0000000c)
|
||||
@ -1928,11 +1928,11 @@ static void rtl8723e_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
struct rtl_sta_info *sta_entry = NULL;
|
||||
u32 ratr_bitmap;
|
||||
u8 ratr_index;
|
||||
u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
|
||||
u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
|
||||
? 1 : 0;
|
||||
u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = 0;
|
||||
bool shortgi = false;
|
||||
@ -1949,13 +1949,13 @@ static void rtl8723e_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
macid = sta->aid + 1;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_bitmap = sta->supp_rates[1] << 4;
|
||||
ratr_bitmap = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_bitmap = sta->supp_rates[0];
|
||||
ratr_bitmap = sta->deflink.supp_rates[0];
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_bitmap = 0xfff;
|
||||
ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
ratr_index = RATR_INX_WIRELESS_B;
|
||||
|
@ -376,7 +376,7 @@ void rtl8723e_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
} else if (mac->opmode == NL80211_IFTYPE_AP ||
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC) {
|
||||
if (sta)
|
||||
bw_40 = sta->ht_cap.cap &
|
||||
bw_40 = sta->deflink.ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
}
|
||||
|
||||
@ -442,7 +442,7 @@ void rtl8723e_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
set_tx_desc_pkt_size(pdesc, (u16)skb->len);
|
||||
|
||||
if (sta) {
|
||||
u8 ampdu_density = sta->ht_cap.ampdu_density;
|
||||
u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
set_tx_desc_ampdu_density(pdesc, ampdu_density);
|
||||
}
|
||||
|
||||
|
@ -2315,11 +2315,11 @@ static void rtl8723be_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
struct rtl_sta_info *sta_entry = NULL;
|
||||
u32 ratr_bitmap;
|
||||
u8 ratr_index;
|
||||
u8 curtxbw_40mhz = (sta->ht_cap.cap &
|
||||
u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0;
|
||||
u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = 0;
|
||||
bool shortgi = false;
|
||||
@ -2335,13 +2335,13 @@ static void rtl8723be_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
macid = sta->aid + 1;
|
||||
|
||||
ratr_bitmap = sta->supp_rates[0];
|
||||
ratr_bitmap = sta->deflink.supp_rates[0];
|
||||
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_bitmap = 0xfff;
|
||||
|
||||
ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
ratr_index = RATR_INX_WIRELESS_B;
|
||||
|
@ -429,7 +429,7 @@ void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
} else if (mac->opmode == NL80211_IFTYPE_AP ||
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC) {
|
||||
if (sta)
|
||||
bw_40 = sta->ht_cap.cap &
|
||||
bw_40 = sta->deflink.ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
}
|
||||
seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
|
||||
@ -516,7 +516,7 @@ void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
set_tx_desc_linip(pdesc, 0);
|
||||
set_tx_desc_pkt_size(pdesc, (u16)skb_len);
|
||||
if (sta) {
|
||||
u8 ampdu_density = sta->ht_cap.ampdu_density;
|
||||
u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
set_tx_desc_ampdu_density(pdesc, ampdu_density);
|
||||
}
|
||||
if (info->control.hw_key) {
|
||||
|
@ -3300,20 +3300,20 @@ static void rtl8821ae_update_hal_rate_table(struct ieee80211_hw *hw,
|
||||
u16 shortgi_rate;
|
||||
u32 tmp_ratr_value;
|
||||
u8 curtxbw_40mhz = mac->bw_40;
|
||||
u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 b_curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 b_curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
enum wireless_mode wirelessmode = mac->mode;
|
||||
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
ratr_value = sta->supp_rates[1] << 4;
|
||||
ratr_value = sta->deflink.supp_rates[1] << 4;
|
||||
else
|
||||
ratr_value = sta->supp_rates[0];
|
||||
ratr_value = sta->deflink.supp_rates[0];
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_value = 0xfff;
|
||||
ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
switch (wirelessmode) {
|
||||
case WIRELESS_MODE_B:
|
||||
if (ratr_value & 0x0000000c)
|
||||
@ -3484,12 +3484,12 @@ static bool _rtl8821ae_get_ra_shortgi(struct ieee80211_hw *hw, struct ieee80211_
|
||||
u8 mac_id)
|
||||
{
|
||||
bool b_short_gi = false;
|
||||
u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
u8 b_curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
|
||||
1 : 0;
|
||||
u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
u8 b_curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
|
||||
1 : 0;
|
||||
u8 b_curshortgi_80mhz = 0;
|
||||
b_curshortgi_80mhz = (sta->vht_cap.cap &
|
||||
b_curshortgi_80mhz = (sta->deflink.vht_cap.cap &
|
||||
IEEE80211_VHT_CAP_SHORT_GI_80) ? 1 : 0;
|
||||
|
||||
if (mac_id == MAC_ID_STATIC_FOR_BROADCAST_MULTICAST)
|
||||
@ -3512,7 +3512,7 @@ static void rtl8821ae_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
u32 ratr_bitmap;
|
||||
u8 ratr_index;
|
||||
enum wireless_mode wirelessmode = 0;
|
||||
u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
|
||||
u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
|
||||
? 1 : 0;
|
||||
bool b_shortgi = false;
|
||||
u8 rate_mask[7];
|
||||
@ -3534,22 +3534,22 @@ static void rtl8821ae_update_hal_rate_mask(struct ieee80211_hw *hw,
|
||||
if (wirelessmode == WIRELESS_MODE_N_5G ||
|
||||
wirelessmode == WIRELESS_MODE_AC_5G ||
|
||||
wirelessmode == WIRELESS_MODE_A)
|
||||
ratr_bitmap = sta->supp_rates[NL80211_BAND_5GHZ] << 4;
|
||||
ratr_bitmap = sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 4;
|
||||
else
|
||||
ratr_bitmap = sta->supp_rates[NL80211_BAND_2GHZ];
|
||||
ratr_bitmap = sta->deflink.supp_rates[NL80211_BAND_2GHZ];
|
||||
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC)
|
||||
ratr_bitmap = 0xfff;
|
||||
|
||||
if (wirelessmode == WIRELESS_MODE_N_24G
|
||||
|| wirelessmode == WIRELESS_MODE_N_5G)
|
||||
ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
|
||||
sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
else if (wirelessmode == WIRELESS_MODE_AC_24G
|
||||
|| wirelessmode == WIRELESS_MODE_AC_5G
|
||||
|| wirelessmode == WIRELESS_MODE_AC_ONLY)
|
||||
ratr_bitmap |= _rtl8821ae_rate_to_bitmap_2ssvht(
|
||||
sta->vht_cap.vht_mcs.rx_mcs_map) << 12;
|
||||
sta->deflink.vht_cap.vht_mcs.rx_mcs_map) << 12;
|
||||
|
||||
b_shortgi = _rtl8821ae_get_ra_shortgi(hw, sta, macid);
|
||||
rf_type = _rtl8821ae_get_ra_rftype(hw, wirelessmode, ratr_bitmap);
|
||||
|
@ -761,7 +761,7 @@ void rtl8821ae_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
set_tx_desc_linip(pdesc, 0);
|
||||
set_tx_desc_pkt_size(pdesc, (u16)skb_len);
|
||||
if (sta) {
|
||||
u8 ampdu_density = sta->ht_cap.ampdu_density;
|
||||
u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
|
||||
set_tx_desc_ampdu_density(pdesc, ampdu_density);
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
}
|
||||
|
||||
ic_vht_cap = &hw->wiphy->bands[NL80211_BAND_5GHZ]->vht_cap;
|
||||
vht_cap = &sta->vht_cap;
|
||||
vht_cap = &sta->deflink.vht_cap;
|
||||
|
||||
if ((ic_vht_cap->cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
|
||||
(vht_cap->cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
|
||||
|
@ -904,7 +904,7 @@ static void rtw_hw_config_rf_ant_num(struct rtw_dev *rtwdev, u8 hw_ant_num)
|
||||
static u64 get_vht_ra_mask(struct ieee80211_sta *sta)
|
||||
{
|
||||
u64 ra_mask = 0;
|
||||
u16 mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.rx_mcs_map);
|
||||
u16 mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.rx_mcs_map);
|
||||
u8 vht_mcs_cap;
|
||||
int i, nss;
|
||||
|
||||
@ -1123,19 +1123,19 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
|
||||
bool is_vht_enable = false;
|
||||
bool is_support_sgi = false;
|
||||
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
is_vht_enable = true;
|
||||
ra_mask |= get_vht_ra_mask(sta);
|
||||
if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK)
|
||||
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK)
|
||||
stbc_en = VHT_STBC_EN;
|
||||
if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
|
||||
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
|
||||
ldpc_en = VHT_LDPC_EN;
|
||||
} else if (sta->ht_cap.ht_supported) {
|
||||
ra_mask |= (sta->ht_cap.mcs.rx_mask[1] << 20) |
|
||||
(sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
|
||||
} else if (sta->deflink.ht_cap.ht_supported) {
|
||||
ra_mask |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20) |
|
||||
(sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
|
||||
stbc_en = HT_STBC_EN;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)
|
||||
ldpc_en = HT_LDPC_EN;
|
||||
}
|
||||
|
||||
@ -1143,12 +1143,12 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
|
||||
ra_mask &= RA_MASK_VHT_RATES_1SS | RA_MASK_HT_RATES_1SS;
|
||||
|
||||
if (hal->current_band_type == RTW_BAND_5G) {
|
||||
ra_mask |= (u64)sta->supp_rates[NL80211_BAND_5GHZ] << 4;
|
||||
ra_mask |= (u64)sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 4;
|
||||
ra_mask_bak = ra_mask;
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
ra_mask &= RA_MASK_VHT_RATES | RA_MASK_OFDM_IN_VHT;
|
||||
wireless_set = WIRELESS_OFDM | WIRELESS_VHT;
|
||||
} else if (sta->ht_cap.ht_supported) {
|
||||
} else if (sta->deflink.ht_cap.ht_supported) {
|
||||
ra_mask &= RA_MASK_HT_RATES | RA_MASK_OFDM_IN_HT_5G;
|
||||
wireless_set = WIRELESS_OFDM | WIRELESS_HT;
|
||||
} else {
|
||||
@ -1156,19 +1156,19 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
|
||||
}
|
||||
dm_info->rrsr_val_init = RRSR_INIT_5G;
|
||||
} else if (hal->current_band_type == RTW_BAND_2G) {
|
||||
ra_mask |= sta->supp_rates[NL80211_BAND_2GHZ];
|
||||
ra_mask |= sta->deflink.supp_rates[NL80211_BAND_2GHZ];
|
||||
ra_mask_bak = ra_mask;
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
ra_mask &= RA_MASK_VHT_RATES | RA_MASK_CCK_IN_VHT |
|
||||
RA_MASK_OFDM_IN_VHT;
|
||||
wireless_set = WIRELESS_CCK | WIRELESS_OFDM |
|
||||
WIRELESS_HT | WIRELESS_VHT;
|
||||
} else if (sta->ht_cap.ht_supported) {
|
||||
} else if (sta->deflink.ht_cap.ht_supported) {
|
||||
ra_mask &= RA_MASK_HT_RATES | RA_MASK_CCK_IN_HT |
|
||||
RA_MASK_OFDM_IN_HT_2G;
|
||||
wireless_set = WIRELESS_CCK | WIRELESS_OFDM |
|
||||
WIRELESS_HT;
|
||||
} else if (sta->supp_rates[0] <= 0xf) {
|
||||
} else if (sta->deflink.supp_rates[0] <= 0xf) {
|
||||
wireless_set = WIRELESS_CCK;
|
||||
} else {
|
||||
ra_mask &= RA_MASK_OFDM_RATES | RA_MASK_CCK_IN_BG;
|
||||
@ -1181,28 +1181,28 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
|
||||
wireless_set = 0;
|
||||
}
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_80:
|
||||
bw_mode = RTW_CHANNEL_WIDTH_80;
|
||||
is_support_sgi = sta->vht_cap.vht_supported &&
|
||||
(sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80);
|
||||
is_support_sgi = sta->deflink.vht_cap.vht_supported &&
|
||||
(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80);
|
||||
break;
|
||||
case IEEE80211_STA_RX_BW_40:
|
||||
bw_mode = RTW_CHANNEL_WIDTH_40;
|
||||
is_support_sgi = sta->ht_cap.ht_supported &&
|
||||
(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40);
|
||||
is_support_sgi = sta->deflink.ht_cap.ht_supported &&
|
||||
(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40);
|
||||
break;
|
||||
default:
|
||||
bw_mode = RTW_CHANNEL_WIDTH_20;
|
||||
is_support_sgi = sta->ht_cap.ht_supported &&
|
||||
(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20);
|
||||
is_support_sgi = sta->deflink.ht_cap.ht_supported &&
|
||||
(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20);
|
||||
break;
|
||||
}
|
||||
|
||||
if (sta->vht_cap.vht_supported && ra_mask & 0xffc00000) {
|
||||
if (sta->deflink.vht_cap.vht_supported && ra_mask & 0xffc00000) {
|
||||
tx_num = 2;
|
||||
rf_type = RF_2T2R;
|
||||
} else if (sta->ht_cap.ht_supported && ra_mask & 0xfff00000) {
|
||||
} else if (sta->deflink.ht_cap.ht_supported && ra_mask & 0xfff00000) {
|
||||
tx_num = 2;
|
||||
rf_type = RF_2T2R;
|
||||
}
|
||||
|
@ -72,7 +72,7 @@ EXPORT_SYMBOL(rtw_tx_fill_tx_desc);
|
||||
|
||||
static u8 get_tx_ampdu_factor(struct ieee80211_sta *sta)
|
||||
{
|
||||
u8 exp = sta->ht_cap.ampdu_factor;
|
||||
u8 exp = sta->deflink.ht_cap.ampdu_factor;
|
||||
|
||||
/* the least ampdu factor is 8K, and the value in the tx desc is the
|
||||
* max aggregation num, which represents val * 2 packets can be
|
||||
@ -83,7 +83,7 @@ static u8 get_tx_ampdu_factor(struct ieee80211_sta *sta)
|
||||
|
||||
static u8 get_tx_ampdu_density(struct ieee80211_sta *sta)
|
||||
{
|
||||
return sta->ht_cap.ampdu_density;
|
||||
return sta->deflink.ht_cap.ampdu_density;
|
||||
}
|
||||
|
||||
static u8 get_highest_ht_tx_rate(struct rtw_dev *rtwdev,
|
||||
@ -91,7 +91,7 @@ static u8 get_highest_ht_tx_rate(struct rtw_dev *rtwdev,
|
||||
{
|
||||
u8 rate;
|
||||
|
||||
if (rtwdev->hal.rf_type == RF_2T2R && sta->ht_cap.mcs.rx_mask[1] != 0)
|
||||
if (rtwdev->hal.rf_type == RF_2T2R && sta->deflink.ht_cap.mcs.rx_mask[1] != 0)
|
||||
rate = DESC_RATEMCS15;
|
||||
else
|
||||
rate = DESC_RATEMCS7;
|
||||
@ -106,7 +106,7 @@ static u8 get_highest_vht_tx_rate(struct rtw_dev *rtwdev,
|
||||
u8 rate;
|
||||
u16 tx_mcs_map;
|
||||
|
||||
tx_mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.tx_mcs_map);
|
||||
tx_mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.tx_mcs_map);
|
||||
if (efuse->hw_cap.nss == 1) {
|
||||
switch (tx_mcs_map & 0x3) {
|
||||
case IEEE80211_VHT_MCS_SUPPORT_0_7:
|
||||
@ -340,11 +340,11 @@ static void rtw_tx_data_pkt_info_update(struct rtw_dev *rtwdev,
|
||||
if (info->control.use_rts || skb->len > hw->wiphy->rts_threshold)
|
||||
pkt_info->rts = true;
|
||||
|
||||
if (sta->vht_cap.vht_supported)
|
||||
if (sta->deflink.vht_cap.vht_supported)
|
||||
rate = get_highest_vht_tx_rate(rtwdev, sta);
|
||||
else if (sta->ht_cap.ht_supported)
|
||||
else if (sta->deflink.ht_cap.ht_supported)
|
||||
rate = get_highest_ht_tx_rate(rtwdev, sta);
|
||||
else if (sta->supp_rates[0] <= 0xf)
|
||||
else if (sta->deflink.supp_rates[0] <= 0xf)
|
||||
rate = DESC_RATE11M;
|
||||
else
|
||||
rate = DESC_RATE54M;
|
||||
|
@ -4179,14 +4179,14 @@ void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BTC,
|
||||
"[BTC], STA support HE=%d VHT=%d HT=%d\n",
|
||||
sta->he_cap.has_he,
|
||||
sta->vht_cap.vht_supported,
|
||||
sta->ht_cap.ht_supported);
|
||||
if (sta->he_cap.has_he)
|
||||
sta->deflink.he_cap.has_he,
|
||||
sta->deflink.vht_cap.vht_supported,
|
||||
sta->deflink.ht_cap.ht_supported);
|
||||
if (sta->deflink.he_cap.has_he)
|
||||
mode |= BIT(BTC_WL_MODE_HE);
|
||||
if (sta->vht_cap.vht_supported)
|
||||
if (sta->deflink.vht_cap.vht_supported)
|
||||
mode |= BIT(BTC_WL_MODE_VHT);
|
||||
if (sta->ht_cap.ht_supported)
|
||||
if (sta->deflink.ht_cap.ht_supported)
|
||||
mode |= BIT(BTC_WL_MODE_HT);
|
||||
|
||||
r.mode = mode;
|
||||
|
@ -424,10 +424,10 @@ rtw89_core_tx_update_ampdu_info(struct rtw89_dev *rtwdev,
|
||||
|
||||
ampdu_num = (u8)((rtwsta->ampdu_params[tid].agg_num ?
|
||||
rtwsta->ampdu_params[tid].agg_num :
|
||||
4 << sta->ht_cap.ampdu_factor) - 1);
|
||||
4 << sta->deflink.ht_cap.ampdu_factor) - 1);
|
||||
|
||||
desc_info->agg_en = true;
|
||||
desc_info->ampdu_density = sta->ht_cap.ampdu_density;
|
||||
desc_info->ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
desc_info->ampdu_num = ampdu_num;
|
||||
}
|
||||
|
||||
@ -612,7 +612,7 @@ __rtw89_core_tx_check_he_qos_htc(struct rtw89_dev *rtwdev,
|
||||
if (pkt_type < PACKET_MAX)
|
||||
return false;
|
||||
|
||||
if (!sta || !sta->he_cap.has_he)
|
||||
if (!sta || !sta->deflink.he_cap.has_he)
|
||||
return false;
|
||||
|
||||
if (!ieee80211_is_data_qos(fc))
|
||||
|
@ -3601,10 +3601,12 @@ static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr)
|
||||
|
||||
static inline bool rtw89_sta_has_beamformer_cap(struct ieee80211_sta *sta)
|
||||
{
|
||||
if ((sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) ||
|
||||
(sta->vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) ||
|
||||
(sta->he_cap.he_cap_elem.phy_cap_info[3] & IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER) ||
|
||||
(sta->he_cap.he_cap_elem.phy_cap_info[4] & IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER))
|
||||
if ((sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) ||
|
||||
(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) ||
|
||||
(sta->deflink.he_cap.he_cap_elem.phy_cap_info[3] &
|
||||
IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER) ||
|
||||
(sta->deflink.he_cap.he_cap_elem.phy_cap_info[4] &
|
||||
IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
@ -831,23 +831,23 @@ static void __get_sta_he_pkt_padding(struct rtw89_dev *rtwdev,
|
||||
{
|
||||
bool ppe_th;
|
||||
u8 ppe16, ppe8;
|
||||
u8 nss = min(sta->rx_nss, rtwdev->hal.tx_nss) - 1;
|
||||
u8 ppe_thres_hdr = sta->he_cap.ppe_thres[0];
|
||||
u8 nss = min(sta->deflink.rx_nss, rtwdev->hal.tx_nss) - 1;
|
||||
u8 ppe_thres_hdr = sta->deflink.he_cap.ppe_thres[0];
|
||||
u8 ru_bitmap;
|
||||
u8 n, idx, sh;
|
||||
u16 ppe;
|
||||
int i;
|
||||
|
||||
if (!sta->he_cap.has_he)
|
||||
if (!sta->deflink.he_cap.has_he)
|
||||
return;
|
||||
|
||||
ppe_th = FIELD_GET(IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT,
|
||||
sta->he_cap.he_cap_elem.phy_cap_info[6]);
|
||||
sta->deflink.he_cap.he_cap_elem.phy_cap_info[6]);
|
||||
if (!ppe_th) {
|
||||
u8 pad;
|
||||
|
||||
pad = FIELD_GET(IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK,
|
||||
sta->he_cap.he_cap_elem.phy_cap_info[9]);
|
||||
sta->deflink.he_cap.he_cap_elem.phy_cap_info[9]);
|
||||
|
||||
for (i = 0; i < RTW89_PPE_BW_NUM; i++)
|
||||
pads[i] = pad;
|
||||
@ -867,7 +867,7 @@ static void __get_sta_he_pkt_padding(struct rtw89_dev *rtwdev,
|
||||
sh = n & 7;
|
||||
n += IEEE80211_PPE_THRES_INFO_PPET_SIZE * 2;
|
||||
|
||||
ppe = le16_to_cpu(*((__le16 *)&sta->he_cap.ppe_thres[idx]));
|
||||
ppe = le16_to_cpu(*((__le16 *)&sta->deflink.he_cap.ppe_thres[idx]));
|
||||
ppe16 = (ppe >> sh) & IEEE80211_PPE_THRES_NSS_MASK;
|
||||
sh += IEEE80211_PPE_THRES_INFO_PPET_SIZE;
|
||||
ppe8 = (ppe >> sh) & IEEE80211_PPE_THRES_NSS_MASK;
|
||||
@ -921,7 +921,8 @@ int rtw89_fw_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
SET_CMC_TBL_NOMINAL_PKT_PADDING40(skb->data, pads[RTW89_CHANNEL_WIDTH_40]);
|
||||
SET_CMC_TBL_NOMINAL_PKT_PADDING80(skb->data, pads[RTW89_CHANNEL_WIDTH_80]);
|
||||
if (sta)
|
||||
SET_CMC_TBL_BSR_QUEUE_SIZE_FORMAT(skb->data, sta->he_cap.has_he);
|
||||
SET_CMC_TBL_BSR_QUEUE_SIZE_FORMAT(skb->data,
|
||||
sta->deflink.he_cap.has_he);
|
||||
if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE)
|
||||
SET_CMC_TBL_DATA_DCM(skb->data, 0);
|
||||
|
||||
|
@ -3995,7 +3995,7 @@ static int rtw89_mac_set_csi_para_reg(struct rtw89_dev *rtwdev,
|
||||
u8 nc = 1, nr = 3, ng = 0, cb = 1, cs = 1, ldpc_en = 1, stbc_en = 1;
|
||||
u8 port_sel = rtwvif->port;
|
||||
u8 sound_dim = 3, t;
|
||||
u8 *phy_cap = sta->he_cap.he_cap_elem.phy_cap_info;
|
||||
u8 *phy_cap = sta->deflink.he_cap.he_cap_elem.phy_cap_info;
|
||||
u32 reg;
|
||||
u16 val;
|
||||
int ret;
|
||||
@ -4012,12 +4012,12 @@ static int rtw89_mac_set_csi_para_reg(struct rtw89_dev *rtwdev,
|
||||
phy_cap[5]);
|
||||
sound_dim = min(sound_dim, t);
|
||||
}
|
||||
if ((sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) ||
|
||||
(sta->vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
|
||||
ldpc_en &= !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
|
||||
stbc_en &= !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK);
|
||||
if ((sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) ||
|
||||
(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
|
||||
ldpc_en &= !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
|
||||
stbc_en &= !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK);
|
||||
t = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
|
||||
sta->vht_cap.cap);
|
||||
sta->deflink.vht_cap.cap);
|
||||
sound_dim = min(sound_dim, t);
|
||||
}
|
||||
nc = min(nc, sound_dim);
|
||||
@ -4058,17 +4058,17 @@ static int rtw89_mac_csi_rrsc(struct rtw89_dev *rtwdev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (sta->he_cap.has_he) {
|
||||
if (sta->deflink.he_cap.has_he) {
|
||||
rrsc |= (BIT(RTW89_MAC_BF_RRSC_HE_MSC0) |
|
||||
BIT(RTW89_MAC_BF_RRSC_HE_MSC3) |
|
||||
BIT(RTW89_MAC_BF_RRSC_HE_MSC5));
|
||||
}
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
rrsc |= (BIT(RTW89_MAC_BF_RRSC_VHT_MSC0) |
|
||||
BIT(RTW89_MAC_BF_RRSC_VHT_MSC3) |
|
||||
BIT(RTW89_MAC_BF_RRSC_VHT_MSC5));
|
||||
}
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
rrsc |= (BIT(RTW89_MAC_BF_RRSC_HT_MSC0) |
|
||||
BIT(RTW89_MAC_BF_RRSC_HT_MSC3) |
|
||||
BIT(RTW89_MAC_BF_RRSC_HT_MSC5));
|
||||
|
@ -76,10 +76,10 @@ static u64 get_mcs_ra_mask(u16 mcs_map, u8 highest_mcs, u8 gap)
|
||||
|
||||
static u64 get_he_ra_mask(struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ieee80211_sta_he_cap cap = sta->he_cap;
|
||||
struct ieee80211_sta_he_cap cap = sta->deflink.he_cap;
|
||||
u16 mcs_map;
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_160:
|
||||
if (cap.he_cap_elem.phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
|
||||
@ -172,17 +172,17 @@ static u64 rtw89_phy_ra_mask_cfg(struct rtw89_dev *rtwdev, struct rtw89_sta *rtw
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (sta->he_cap.has_he) {
|
||||
if (sta->deflink.he_cap.has_he) {
|
||||
cfg_mask |= u64_encode_bits(mask->control[band].he_mcs[0],
|
||||
RA_MASK_HE_1SS_RATES);
|
||||
cfg_mask |= u64_encode_bits(mask->control[band].he_mcs[1],
|
||||
RA_MASK_HE_2SS_RATES);
|
||||
} else if (sta->vht_cap.vht_supported) {
|
||||
} else if (sta->deflink.vht_cap.vht_supported) {
|
||||
cfg_mask |= u64_encode_bits(mask->control[band].vht_mcs[0],
|
||||
RA_MASK_VHT_1SS_RATES);
|
||||
cfg_mask |= u64_encode_bits(mask->control[band].vht_mcs[1],
|
||||
RA_MASK_VHT_2SS_RATES);
|
||||
} else if (sta->ht_cap.ht_supported) {
|
||||
} else if (sta->deflink.ht_cap.ht_supported) {
|
||||
cfg_mask |= u64_encode_bits(mask->control[band].ht_mcs[0],
|
||||
RA_MASK_HT_1SS_RATES);
|
||||
cfg_mask |= u64_encode_bits(mask->control[band].ht_mcs[1],
|
||||
@ -223,57 +223,57 @@ static void rtw89_phy_ra_sta_update(struct rtw89_dev *rtwdev,
|
||||
|
||||
memset(ra, 0, sizeof(*ra));
|
||||
/* Set the ra mask from sta's capability */
|
||||
if (sta->he_cap.has_he) {
|
||||
if (sta->deflink.he_cap.has_he) {
|
||||
mode |= RTW89_RA_MODE_HE;
|
||||
csi_mode = RTW89_RA_RPT_MODE_HE;
|
||||
ra_mask |= get_he_ra_mask(sta);
|
||||
high_rate_masks = rtw89_ra_mask_he_rates;
|
||||
if (sta->he_cap.he_cap_elem.phy_cap_info[2] &
|
||||
if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[2] &
|
||||
IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ)
|
||||
stbc_en = 1;
|
||||
if (sta->he_cap.he_cap_elem.phy_cap_info[1] &
|
||||
if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[1] &
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)
|
||||
ldpc_en = 1;
|
||||
} else if (sta->vht_cap.vht_supported) {
|
||||
u16 mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.rx_mcs_map);
|
||||
} else if (sta->deflink.vht_cap.vht_supported) {
|
||||
u16 mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.rx_mcs_map);
|
||||
|
||||
mode |= RTW89_RA_MODE_VHT;
|
||||
csi_mode = RTW89_RA_RPT_MODE_VHT;
|
||||
/* MCS9, MCS8, MCS7 */
|
||||
ra_mask |= get_mcs_ra_mask(mcs_map, 9, 1);
|
||||
high_rate_masks = rtw89_ra_mask_vht_rates;
|
||||
if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK)
|
||||
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK)
|
||||
stbc_en = 1;
|
||||
if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
|
||||
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
|
||||
ldpc_en = 1;
|
||||
} else if (sta->ht_cap.ht_supported) {
|
||||
} else if (sta->deflink.ht_cap.ht_supported) {
|
||||
mode |= RTW89_RA_MODE_HT;
|
||||
csi_mode = RTW89_RA_RPT_MODE_HT;
|
||||
ra_mask |= ((u64)sta->ht_cap.mcs.rx_mask[3] << 48) |
|
||||
((u64)sta->ht_cap.mcs.rx_mask[2] << 36) |
|
||||
(sta->ht_cap.mcs.rx_mask[1] << 24) |
|
||||
(sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
ra_mask |= ((u64)sta->deflink.ht_cap.mcs.rx_mask[3] << 48) |
|
||||
((u64)sta->deflink.ht_cap.mcs.rx_mask[2] << 36) |
|
||||
(sta->deflink.ht_cap.mcs.rx_mask[1] << 24) |
|
||||
(sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
|
||||
high_rate_masks = rtw89_ra_mask_ht_rates;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
|
||||
stbc_en = 1;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)
|
||||
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)
|
||||
ldpc_en = 1;
|
||||
}
|
||||
|
||||
switch (rtwdev->hal.current_band_type) {
|
||||
case RTW89_BAND_2G:
|
||||
ra_mask |= sta->supp_rates[NL80211_BAND_2GHZ];
|
||||
if (sta->supp_rates[NL80211_BAND_2GHZ] <= 0xf)
|
||||
ra_mask |= sta->deflink.supp_rates[NL80211_BAND_2GHZ];
|
||||
if (sta->deflink.supp_rates[NL80211_BAND_2GHZ] <= 0xf)
|
||||
mode |= RTW89_RA_MODE_CCK;
|
||||
else
|
||||
mode |= RTW89_RA_MODE_CCK | RTW89_RA_MODE_OFDM;
|
||||
break;
|
||||
case RTW89_BAND_5G:
|
||||
ra_mask |= (u64)sta->supp_rates[NL80211_BAND_5GHZ] << 4;
|
||||
ra_mask |= (u64)sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 4;
|
||||
mode |= RTW89_RA_MODE_OFDM;
|
||||
break;
|
||||
case RTW89_BAND_6G:
|
||||
ra_mask |= (u64)sta->supp_rates[NL80211_BAND_6GHZ] << 4;
|
||||
ra_mask |= (u64)sta->deflink.supp_rates[NL80211_BAND_6GHZ] << 4;
|
||||
mode |= RTW89_RA_MODE_OFDM;
|
||||
break;
|
||||
default:
|
||||
@ -302,30 +302,30 @@ static void rtw89_phy_ra_sta_update(struct rtw89_dev *rtwdev,
|
||||
ra_mask = rtw89_phy_ra_mask_recover(ra_mask, ra_mask_bak);
|
||||
ra_mask &= rtw89_phy_ra_mask_cfg(rtwdev, rtwsta);
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_160:
|
||||
bw_mode = RTW89_CHANNEL_WIDTH_160;
|
||||
sgi = sta->vht_cap.vht_supported &&
|
||||
(sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160);
|
||||
sgi = sta->deflink.vht_cap.vht_supported &&
|
||||
(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160);
|
||||
break;
|
||||
case IEEE80211_STA_RX_BW_80:
|
||||
bw_mode = RTW89_CHANNEL_WIDTH_80;
|
||||
sgi = sta->vht_cap.vht_supported &&
|
||||
(sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80);
|
||||
sgi = sta->deflink.vht_cap.vht_supported &&
|
||||
(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80);
|
||||
break;
|
||||
case IEEE80211_STA_RX_BW_40:
|
||||
bw_mode = RTW89_CHANNEL_WIDTH_40;
|
||||
sgi = sta->ht_cap.ht_supported &&
|
||||
(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40);
|
||||
sgi = sta->deflink.ht_cap.ht_supported &&
|
||||
(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40);
|
||||
break;
|
||||
default:
|
||||
bw_mode = RTW89_CHANNEL_WIDTH_20;
|
||||
sgi = sta->ht_cap.ht_supported &&
|
||||
(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20);
|
||||
sgi = sta->deflink.ht_cap.ht_supported &&
|
||||
(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20);
|
||||
break;
|
||||
}
|
||||
|
||||
if (sta->he_cap.he_cap_elem.phy_cap_info[3] &
|
||||
if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[3] &
|
||||
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_16_QAM)
|
||||
ra->dcm_cap = 1;
|
||||
|
||||
@ -340,7 +340,7 @@ static void rtw89_phy_ra_sta_update(struct rtw89_dev *rtwdev,
|
||||
ra->macid = rtwsta->mac_id;
|
||||
ra->stbc_cap = stbc_en;
|
||||
ra->ldpc_cap = ldpc_en;
|
||||
ra->ss_num = min(sta->rx_nss, rtwdev->hal.tx_nss) - 1;
|
||||
ra->ss_num = min(sta->deflink.rx_nss, rtwdev->hal.tx_nss) - 1;
|
||||
ra->en_sgi = sgi;
|
||||
ra->ra_mask = ra_mask;
|
||||
|
||||
|
@ -1490,13 +1490,13 @@ static int rsi_mac80211_sta_add(struct ieee80211_hw *hw,
|
||||
|
||||
if ((vif->type == NL80211_IFTYPE_STATION) ||
|
||||
(vif->type == NL80211_IFTYPE_P2P_CLIENT)) {
|
||||
common->bitrate_mask[common->band] = sta->supp_rates[common->band];
|
||||
common->vif_info[0].is_ht = sta->ht_cap.ht_supported;
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
common->bitrate_mask[common->band] = sta->deflink.supp_rates[common->band];
|
||||
common->vif_info[0].is_ht = sta->deflink.ht_cap.ht_supported;
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
common->bitrate_mask[NL80211_BAND_2GHZ] =
|
||||
sta->supp_rates[NL80211_BAND_2GHZ];
|
||||
if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ||
|
||||
(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
|
||||
sta->deflink.supp_rates[NL80211_BAND_2GHZ];
|
||||
if ((sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ||
|
||||
(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
|
||||
common->vif_info[0].sgi = true;
|
||||
ieee80211_start_tx_ba_session(sta, 0, 0);
|
||||
}
|
||||
|
@ -1357,10 +1357,10 @@ static int rsi_send_auto_rate_request(struct rsi_common *common,
|
||||
is_ht = common->vif_info[0].is_ht;
|
||||
is_sgi = common->vif_info[0].sgi;
|
||||
} else {
|
||||
rate_bitmap = sta->supp_rates[band];
|
||||
is_ht = sta->ht_cap.ht_supported;
|
||||
if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ||
|
||||
(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
|
||||
rate_bitmap = sta->deflink.supp_rates[band];
|
||||
is_ht = sta->deflink.ht_cap.ht_supported;
|
||||
if ((sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ||
|
||||
(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
|
||||
is_sgi = true;
|
||||
}
|
||||
|
||||
|
@ -1907,10 +1907,10 @@ void cw1200_bss_info_changed(struct ieee80211_hw *dev,
|
||||
if (info->bssid && !info->ibss_joined)
|
||||
sta = ieee80211_find_sta(vif, info->bssid);
|
||||
if (sta) {
|
||||
priv->ht_info.ht_cap = sta->ht_cap;
|
||||
priv->ht_info.ht_cap = sta->deflink.ht_cap;
|
||||
priv->bss_params.operational_rate_set =
|
||||
cw1200_rate_mask_to_wsm(priv,
|
||||
sta->supp_rates[priv->channel->band]);
|
||||
sta->deflink.supp_rates[priv->channel->band]);
|
||||
priv->ht_info.channel_type = cfg80211_get_chandef_type(&dev->conf.chandef);
|
||||
priv->ht_info.operation_mode = info->ht_operation_mode;
|
||||
} else {
|
||||
|
@ -1558,11 +1558,11 @@ int wl12xx_cmd_add_peer(struct wl1271 *wl, struct wl12xx_vif *wlvif,
|
||||
WL1271_PSD_LEGACY;
|
||||
|
||||
|
||||
sta_rates = sta->supp_rates[wlvif->band];
|
||||
if (sta->ht_cap.ht_supported)
|
||||
sta_rates = sta->deflink.supp_rates[wlvif->band];
|
||||
if (sta->deflink.ht_cap.ht_supported)
|
||||
sta_rates |=
|
||||
(sta->ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET) |
|
||||
(sta->ht_cap.mcs.rx_mask[1] << HW_MIMO_RATES_OFFSET);
|
||||
(sta->deflink.ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET) |
|
||||
(sta->deflink.ht_cap.mcs.rx_mask[1] << HW_MIMO_RATES_OFFSET);
|
||||
|
||||
cmd->supported_rates =
|
||||
cpu_to_le32(wl1271_tx_enabled_rates_get(wl, sta_rates,
|
||||
|
@ -4439,15 +4439,15 @@ static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
|
||||
rcu_read_lock();
|
||||
sta = ieee80211_find_sta(vif, bss_conf->bssid);
|
||||
if (sta) {
|
||||
u8 *rx_mask = sta->ht_cap.mcs.rx_mask;
|
||||
u8 *rx_mask = sta->deflink.ht_cap.mcs.rx_mask;
|
||||
|
||||
/* save the supp_rates of the ap */
|
||||
sta_rate_set = sta->supp_rates[wlvif->band];
|
||||
if (sta->ht_cap.ht_supported)
|
||||
sta_rate_set = sta->deflink.supp_rates[wlvif->band];
|
||||
if (sta->deflink.ht_cap.ht_supported)
|
||||
sta_rate_set |=
|
||||
(rx_mask[0] << HW_HT_RATES_OFFSET) |
|
||||
(rx_mask[1] << HW_MIMO_RATES_OFFSET);
|
||||
sta_ht_cap = sta->ht_cap;
|
||||
sta_ht_cap = sta->deflink.ht_cap;
|
||||
sta_exists = true;
|
||||
}
|
||||
|
||||
@ -5225,7 +5225,8 @@ static int wl12xx_update_sta_state(struct wl1271 *wl,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true,
|
||||
ret = wl1271_acx_set_ht_capabilities(wl, &sta->deflink.ht_cap,
|
||||
true,
|
||||
wl_sta->hlid);
|
||||
if (ret)
|
||||
return ret;
|
||||
@ -5786,8 +5787,9 @@ static void wlcore_op_sta_rc_update(struct ieee80211_hw *hw,
|
||||
return;
|
||||
|
||||
/* this callback is atomic, so schedule a new work */
|
||||
wlvif->rc_update_bw = sta->bandwidth;
|
||||
memcpy(&wlvif->rc_ht_cap, &sta->ht_cap, sizeof(sta->ht_cap));
|
||||
wlvif->rc_update_bw = sta->deflink.bandwidth;
|
||||
memcpy(&wlvif->rc_ht_cap, &sta->deflink.ht_cap,
|
||||
sizeof(sta->deflink.ht_cap));
|
||||
ieee80211_queue_work(hw, &wlvif->rc_update_work);
|
||||
}
|
||||
|
||||
|
@ -441,11 +441,11 @@ static void wfx_join_finalize(struct wfx_vif *wvif, struct ieee80211_bss_conf *i
|
||||
rcu_read_lock(); /* protect sta */
|
||||
if (info->bssid && !info->ibss_joined)
|
||||
sta = ieee80211_find_sta(wvif->vif, info->bssid);
|
||||
if (sta && sta->ht_cap.ht_supported)
|
||||
ampdu_density = sta->ht_cap.ampdu_density;
|
||||
if (sta && sta->ht_cap.ht_supported &&
|
||||
if (sta && sta->deflink.ht_cap.ht_supported)
|
||||
ampdu_density = sta->deflink.ht_cap.ampdu_density;
|
||||
if (sta && sta->deflink.ht_cap.ht_supported &&
|
||||
!(info->ht_operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT))
|
||||
greenfield = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
|
||||
greenfield = !!(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
|
||||
rcu_read_unlock();
|
||||
|
||||
wvif->join_in_progress = false;
|
||||
|
@ -2056,6 +2056,45 @@ struct ieee80211_sta_txpwr {
|
||||
enum nl80211_tx_power_setting type;
|
||||
};
|
||||
|
||||
#define MAX_STA_LINKS 15
|
||||
|
||||
/**
|
||||
* struct ieee80211_link_sta - station Link specific info
|
||||
* All link specific info for a STA link for a non MLD STA(single)
|
||||
* or a MLD STA(multiple entries) are stored here.
|
||||
*
|
||||
* @addr: MAC address of the Link STA. For non-MLO STA this is same as the addr
|
||||
* in ieee80211_sta. For MLO Link STA this addr can be same or different
|
||||
* from addr in ieee80211_sta (representing MLD STA addr)
|
||||
* @supp_rates: Bitmap of supported rates
|
||||
* @ht_cap: HT capabilities of this STA; restricted to our own capabilities
|
||||
* @vht_cap: VHT capabilities of this STA; restricted to our own capabilities
|
||||
* @he_cap: HE capabilities of this STA
|
||||
* @he_6ghz_capa: on 6 GHz, holds the HE 6 GHz band capabilities
|
||||
* @eht_cap: EHT capabilities of this STA
|
||||
* @bandwidth: current bandwidth the station can receive with
|
||||
* @rx_nss: in HT/VHT, the maximum number of spatial streams the
|
||||
* station can receive at the moment, changed by operating mode
|
||||
* notifications and capabilities. The value is only valid after
|
||||
* the station moves to associated state.
|
||||
* @txpwr: the station tx power configuration
|
||||
*
|
||||
*/
|
||||
struct ieee80211_link_sta {
|
||||
u8 addr[ETH_ALEN];
|
||||
|
||||
u32 supp_rates[NUM_NL80211_BANDS];
|
||||
struct ieee80211_sta_ht_cap ht_cap;
|
||||
struct ieee80211_sta_vht_cap vht_cap;
|
||||
struct ieee80211_sta_he_cap he_cap;
|
||||
struct ieee80211_he_6ghz_capa he_6ghz_capa;
|
||||
struct ieee80211_sta_eht_cap eht_cap;
|
||||
|
||||
u8 rx_nss;
|
||||
enum ieee80211_sta_rx_bandwidth bandwidth;
|
||||
struct ieee80211_sta_txpwr txpwr;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_sta - station table entry
|
||||
*
|
||||
@ -2065,15 +2104,11 @@ struct ieee80211_sta_txpwr {
|
||||
* either be protected by rcu_read_lock() explicitly or implicitly,
|
||||
* or you must take good care to not use such a pointer after a
|
||||
* call to your sta_remove callback that removed it.
|
||||
* This also represents the MLD STA in case of MLO association
|
||||
* and holds pointers to various link STA's
|
||||
*
|
||||
* @addr: MAC address
|
||||
* @aid: AID we assigned to the station if we're an AP
|
||||
* @supp_rates: Bitmap of supported rates (per band)
|
||||
* @ht_cap: HT capabilities of this STA; restricted to our own capabilities
|
||||
* @vht_cap: VHT capabilities of this STA; restricted to our own capabilities
|
||||
* @he_cap: HE capabilities of this STA
|
||||
* @he_6ghz_capa: on 6 GHz, holds the HE 6 GHz band capabilities
|
||||
* @eht_cap: EHT capabilities of this STA
|
||||
* @max_rx_aggregation_subframes: maximal amount of frames in a single AMPDU
|
||||
* that this station is allowed to transmit to us.
|
||||
* Can be modified by driver.
|
||||
@ -2085,11 +2120,6 @@ struct ieee80211_sta_txpwr {
|
||||
* if wme is supported. The bits order is like in
|
||||
* IEEE80211_WMM_IE_STA_QOSINFO_AC_*.
|
||||
* @max_sp: max Service Period. Only valid if wme is supported.
|
||||
* @bandwidth: current bandwidth the station can receive with
|
||||
* @rx_nss: in HT/VHT, the maximum number of spatial streams the
|
||||
* station can receive at the moment, changed by operating mode
|
||||
* notifications and capabilities. The value is only valid after
|
||||
* the station moves to associated state.
|
||||
* @smps_mode: current SMPS mode (off, static or dynamic)
|
||||
* @rates: rate control selection table
|
||||
* @tdls: indicates whether the STA is a TDLS peer
|
||||
@ -2102,25 +2132,28 @@ struct ieee80211_sta_txpwr {
|
||||
* @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not.
|
||||
* @max_rc_amsdu_len: Maximum A-MSDU size in bytes recommended by rate control.
|
||||
* @max_tid_amsdu_len: Maximum A-MSDU size in bytes for this TID
|
||||
* @txpwr: the station tx power configuration
|
||||
* @txq: per-TID data TX queues (if driver uses the TXQ abstraction); note that
|
||||
* the last entry (%IEEE80211_NUM_TIDS) is used for non-data frames
|
||||
* @multi_link_sta: Identifies if this sta is a MLD STA
|
||||
* @deflink: This holds the default link STA information, for non MLO STA all link
|
||||
* specific STA information is accessed through @deflink or through
|
||||
* link[0] which points to address of @deflink. For MLO Link STA
|
||||
* the first added link STA will point to deflink.
|
||||
* @link: reference to Link Sta entries. For Non MLO STA, except 1st link,
|
||||
* i.e link[0] all links would be assigned to NULL by default and
|
||||
* would access link information via @deflink or link[0]. For MLO
|
||||
* STA, first link STA being added will point its link pointer to
|
||||
* @deflink address and remaining would be allocated and the address
|
||||
* would be assigned to link[link_id] where link_id is the id assigned
|
||||
* by the AP.
|
||||
*/
|
||||
struct ieee80211_sta {
|
||||
u32 supp_rates[NUM_NL80211_BANDS];
|
||||
u8 addr[ETH_ALEN];
|
||||
u16 aid;
|
||||
struct ieee80211_sta_ht_cap ht_cap;
|
||||
struct ieee80211_sta_vht_cap vht_cap;
|
||||
struct ieee80211_sta_he_cap he_cap;
|
||||
struct ieee80211_he_6ghz_capa he_6ghz_capa;
|
||||
struct ieee80211_sta_eht_cap eht_cap;
|
||||
u16 max_rx_aggregation_subframes;
|
||||
bool wme;
|
||||
u8 uapsd_queues;
|
||||
u8 max_sp;
|
||||
u8 rx_nss;
|
||||
enum ieee80211_sta_rx_bandwidth bandwidth;
|
||||
enum ieee80211_smps_mode smps_mode;
|
||||
struct ieee80211_sta_rates __rcu *rates;
|
||||
bool tdls;
|
||||
@ -2147,10 +2180,13 @@ struct ieee80211_sta {
|
||||
bool support_p2p_ps;
|
||||
u16 max_rc_amsdu_len;
|
||||
u16 max_tid_amsdu_len[IEEE80211_NUM_TIDS];
|
||||
struct ieee80211_sta_txpwr txpwr;
|
||||
|
||||
struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1];
|
||||
|
||||
bool multi_link_sta;
|
||||
struct ieee80211_link_sta deflink;
|
||||
struct ieee80211_link_sta *link[MAX_STA_LINKS];
|
||||
|
||||
/* must be last */
|
||||
u8 drv_priv[] __aligned(sizeof(void *));
|
||||
};
|
||||
@ -6371,7 +6407,7 @@ static inline int rate_supported(struct ieee80211_sta *sta,
|
||||
enum nl80211_band band,
|
||||
int index)
|
||||
{
|
||||
return (sta == NULL || sta->supp_rates[band] & BIT(index));
|
||||
return (sta == NULL || sta->deflink.supp_rates[band] & BIT(index));
|
||||
}
|
||||
|
||||
static inline s8
|
||||
|
@ -263,7 +263,7 @@ static void ieee80211_send_addba_resp(struct sta_info *sta, u8 *da, u16 tid,
|
||||
mgmt->u.action.u.addba_resp.timeout = cpu_to_le16(timeout);
|
||||
mgmt->u.action.u.addba_resp.status = cpu_to_le16(status);
|
||||
|
||||
if (sta->sta.he_cap.has_he && addbaext)
|
||||
if (sta->sta.deflink.he_cap.has_he && addbaext)
|
||||
ieee80211_add_addbaext(sdata, skb, addbaext, buf_size);
|
||||
|
||||
ieee80211_tx_skb(sdata, skb);
|
||||
@ -296,7 +296,7 @@ void ___ieee80211_start_rx_ba_session(struct sta_info *sta,
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!sta->sta.ht_cap.ht_supported &&
|
||||
if (!sta->sta.deflink.ht_cap.ht_supported &&
|
||||
sta->sdata->vif.bss_conf.chandef.chan->band != NL80211_BAND_6GHZ) {
|
||||
ht_dbg(sta->sdata,
|
||||
"STA %pM erroneously requests BA session on tid %d w/o QoS\n",
|
||||
@ -312,9 +312,9 @@ void ___ieee80211_start_rx_ba_session(struct sta_info *sta,
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (sta->sta.eht_cap.has_eht)
|
||||
if (sta->sta.deflink.eht_cap.has_eht)
|
||||
max_buf_size = IEEE80211_MAX_AMPDU_BUF_EHT;
|
||||
else if (sta->sta.he_cap.has_he)
|
||||
else if (sta->sta.deflink.he_cap.has_he)
|
||||
max_buf_size = IEEE80211_MAX_AMPDU_BUF_HE;
|
||||
else
|
||||
max_buf_size = IEEE80211_MAX_AMPDU_BUF_HT;
|
||||
@ -324,7 +324,7 @@ void ___ieee80211_start_rx_ba_session(struct sta_info *sta,
|
||||
* and if buffer size does not exceeds max value */
|
||||
/* XXX: check own ht delayed BA capability?? */
|
||||
if (((ba_policy != 1) &&
|
||||
(!(sta->sta.ht_cap.cap & IEEE80211_HT_CAP_DELAY_BA))) ||
|
||||
(!(sta->sta.deflink.ht_cap.cap & IEEE80211_HT_CAP_DELAY_BA))) ||
|
||||
(buf_size > max_buf_size)) {
|
||||
status = WLAN_STATUS_INVALID_QOS_PARAM;
|
||||
ht_dbg_ratelimited(sta->sdata,
|
||||
@ -507,7 +507,7 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,
|
||||
goto free;
|
||||
}
|
||||
|
||||
if (sta->sta.eht_cap.has_eht && elems && elems->addba_ext_ie) {
|
||||
if (sta->sta.deflink.eht_cap.has_eht && elems && elems->addba_ext_ie) {
|
||||
u8 buf_size_1k = u8_get_bits(elems->addba_ext_ie->data,
|
||||
IEEE80211_ADDBA_EXT_BUF_SIZE_MASK);
|
||||
|
||||
|
@ -467,7 +467,7 @@ static void ieee80211_send_addba_with_timeout(struct sta_info *sta,
|
||||
sta->ampdu_mlme.addba_req_num[tid]++;
|
||||
spin_unlock_bh(&sta->lock);
|
||||
|
||||
if (sta->sta.he_cap.has_he) {
|
||||
if (sta->sta.deflink.he_cap.has_he) {
|
||||
buf_size = local->hw.max_tx_aggregation_subframes;
|
||||
} else {
|
||||
/*
|
||||
@ -594,7 +594,7 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
|
||||
"Requested to start BA session on reserved tid=%d", tid))
|
||||
return -EINVAL;
|
||||
|
||||
if (!pubsta->ht_cap.ht_supported &&
|
||||
if (!pubsta->deflink.ht_cap.ht_supported &&
|
||||
sta->sdata->vif.bss_conf.chandef.chan->band != NL80211_BAND_6GHZ)
|
||||
return -EINVAL;
|
||||
|
||||
@ -647,7 +647,7 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
|
||||
* is set when we receive a bss info from a probe response or a beacon.
|
||||
*/
|
||||
if (sta->sdata->vif.type == NL80211_IFTYPE_ADHOC &&
|
||||
!sta->sta.ht_cap.ht_supported) {
|
||||
!sta->sta.deflink.ht_cap.ht_supported) {
|
||||
ht_dbg(sdata,
|
||||
"BA request denied - IBSS STA %pM does not advertise HT support\n",
|
||||
pubsta->addr);
|
||||
|
@ -647,8 +647,8 @@ u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
|
||||
struct sta_info *sta = container_of(pubsta, struct sta_info,
|
||||
sta);
|
||||
struct ieee80211_rx_status stat;
|
||||
struct ieee80211_tx_rate *tx_rate = &sta->tx_stats.last_rate;
|
||||
struct rate_info *ri = &sta->tx_stats.last_rate_info;
|
||||
struct ieee80211_tx_rate *tx_rate = &sta->deflink.tx_stats.last_rate;
|
||||
struct rate_info *ri = &sta->deflink.tx_stats.last_rate_info;
|
||||
u32 duration, overhead;
|
||||
u8 agg_shift;
|
||||
|
||||
|
@ -570,7 +570,8 @@ static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
if (pairwise)
|
||||
key = key_mtx_dereference(local, sta->ptk[key_idx]);
|
||||
else
|
||||
key = key_mtx_dereference(local, sta->gtk[key_idx]);
|
||||
key = key_mtx_dereference(local,
|
||||
sta->deflink.gtk[key_idx]);
|
||||
} else
|
||||
key = key_mtx_dereference(local, sdata->keys[key_idx]);
|
||||
|
||||
@ -620,7 +621,7 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
else if (!pairwise &&
|
||||
key_idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS +
|
||||
NUM_DEFAULT_BEACON_KEYS)
|
||||
key = rcu_dereference(sta->gtk[key_idx]);
|
||||
key = rcu_dereference(sta->deflink.gtk[key_idx]);
|
||||
} else
|
||||
key = rcu_dereference(sdata->keys[key_idx]);
|
||||
|
||||
@ -1728,9 +1729,9 @@ static int sta_apply_parameters(struct ieee80211_local *local,
|
||||
sta->listen_interval = params->listen_interval;
|
||||
|
||||
if (params->sta_modify_mask & STATION_PARAM_APPLY_STA_TXPOWER) {
|
||||
sta->sta.txpwr.type = params->txpwr.type;
|
||||
sta->sta.deflink.txpwr.type = params->txpwr.type;
|
||||
if (params->txpwr.type == NL80211_TX_POWER_LIMITED)
|
||||
sta->sta.txpwr.power = params->txpwr.power;
|
||||
sta->sta.deflink.txpwr.power = params->txpwr.power;
|
||||
ret = drv_sta_set_txpwr(local, sdata, sta);
|
||||
if (ret)
|
||||
return ret;
|
||||
@ -1740,7 +1741,7 @@ static int sta_apply_parameters(struct ieee80211_local *local,
|
||||
ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
|
||||
sband, params->supported_rates,
|
||||
params->supported_rates_len,
|
||||
&sta->sta.supp_rates[sband->band]);
|
||||
&sta->sta.deflink.supp_rates[sband->band]);
|
||||
}
|
||||
|
||||
if (params->ht_capa)
|
||||
|
@ -199,7 +199,7 @@ static enum nl80211_chan_width ieee80211_get_sta_bw(struct sta_info *sta)
|
||||
|
||||
switch (width) {
|
||||
case IEEE80211_STA_RX_BW_20:
|
||||
if (sta->sta.ht_cap.ht_supported)
|
||||
if (sta->sta.deflink.ht_cap.ht_supported)
|
||||
return NL80211_CHAN_WIDTH_20;
|
||||
else
|
||||
return NL80211_CHAN_WIDTH_20_NOHT;
|
||||
@ -375,15 +375,15 @@ static void ieee80211_chan_bw_change(struct ieee80211_local *local,
|
||||
new_sta_bw = ieee80211_sta_cur_vht_bw(sta);
|
||||
|
||||
/* nothing change */
|
||||
if (new_sta_bw == sta->sta.bandwidth)
|
||||
if (new_sta_bw == sta->sta.deflink.bandwidth)
|
||||
continue;
|
||||
|
||||
/* vif changed to narrow BW and narrow BW for station wasn't
|
||||
* requested or vise versa */
|
||||
if ((new_sta_bw < sta->sta.bandwidth) == !narrowed)
|
||||
if ((new_sta_bw < sta->sta.deflink.bandwidth) == !narrowed)
|
||||
continue;
|
||||
|
||||
sta->sta.bandwidth = new_sta_bw;
|
||||
sta->sta.deflink.bandwidth = new_sta_bw;
|
||||
rate_control_rate_update(local, sband, sta,
|
||||
IEEE80211_RC_BW_CHANGED);
|
||||
}
|
||||
|
@ -447,7 +447,7 @@ static ssize_t sta_ht_capa_read(struct file *file, char __user *userbuf,
|
||||
int i;
|
||||
ssize_t bufsz = 512;
|
||||
struct sta_info *sta = file->private_data;
|
||||
struct ieee80211_sta_ht_cap *htc = &sta->sta.ht_cap;
|
||||
struct ieee80211_sta_ht_cap *htc = &sta->sta.deflink.ht_cap;
|
||||
ssize_t ret;
|
||||
|
||||
buf = kzalloc(bufsz, GFP_KERNEL);
|
||||
@ -531,7 +531,7 @@ static ssize_t sta_vht_capa_read(struct file *file, char __user *userbuf,
|
||||
{
|
||||
char *buf, *p;
|
||||
struct sta_info *sta = file->private_data;
|
||||
struct ieee80211_sta_vht_cap *vhtc = &sta->sta.vht_cap;
|
||||
struct ieee80211_sta_vht_cap *vhtc = &sta->sta.deflink.vht_cap;
|
||||
ssize_t ret;
|
||||
ssize_t bufsz = 512;
|
||||
|
||||
@ -646,7 +646,7 @@ static ssize_t sta_he_capa_read(struct file *file, char __user *userbuf,
|
||||
char *buf, *p;
|
||||
size_t buf_sz = PAGE_SIZE;
|
||||
struct sta_info *sta = file->private_data;
|
||||
struct ieee80211_sta_he_cap *hec = &sta->sta.he_cap;
|
||||
struct ieee80211_sta_he_cap *hec = &sta->sta.deflink.he_cap;
|
||||
struct ieee80211_he_mcs_nss_supp *nss = &hec->he_mcs_nss_supp;
|
||||
u8 ppe_size;
|
||||
u8 *cap;
|
||||
@ -1052,9 +1052,9 @@ void ieee80211_sta_debugfs_add(struct sta_info *sta)
|
||||
DEBUGFS_ADD(vht_capa);
|
||||
DEBUGFS_ADD(he_capa);
|
||||
|
||||
DEBUGFS_ADD_COUNTER(rx_duplicates, rx_stats.num_duplicates);
|
||||
DEBUGFS_ADD_COUNTER(rx_fragments, rx_stats.fragments);
|
||||
DEBUGFS_ADD_COUNTER(tx_filtered, status_stats.filtered);
|
||||
DEBUGFS_ADD_COUNTER(rx_duplicates, deflink.rx_stats.num_duplicates);
|
||||
DEBUGFS_ADD_COUNTER(rx_fragments, deflink.rx_stats.fragments);
|
||||
DEBUGFS_ADD_COUNTER(tx_filtered, deflink.status_stats.filtered);
|
||||
|
||||
if (local->ops->wake_tx_queue) {
|
||||
DEBUGFS_ADD(aqm);
|
||||
|
@ -14,7 +14,7 @@ ieee80211_eht_cap_ie_to_sta_eht_cap(struct ieee80211_sub_if_data *sdata,
|
||||
const struct ieee80211_eht_cap_elem *eht_cap_ie_elem,
|
||||
u8 eht_cap_len, struct sta_info *sta)
|
||||
{
|
||||
struct ieee80211_sta_eht_cap *eht_cap = &sta->sta.eht_cap;
|
||||
struct ieee80211_sta_eht_cap *eht_cap = &sta->sta.deflink.eht_cap;
|
||||
struct ieee80211_he_cap_elem *he_cap_ie_elem = (void *)he_cap_ie;
|
||||
u8 eht_ppe_size = 0;
|
||||
u8 mcs_nss_size;
|
||||
@ -71,6 +71,6 @@ ieee80211_eht_cap_ie_to_sta_eht_cap(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
eht_cap->has_eht = true;
|
||||
|
||||
sta->cur_max_bandwidth = ieee80211_sta_cap_rx_bw(sta);
|
||||
sta->sta.bandwidth = ieee80211_sta_cur_vht_bw(sta);
|
||||
sta->deflink.cur_max_bandwidth = ieee80211_sta_cap_rx_bw(sta);
|
||||
sta->sta.deflink.bandwidth = ieee80211_sta_cur_vht_bw(sta);
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ static void ieee80211_get_stats(struct net_device *dev,
|
||||
sta_set_sinfo(sta, &sinfo, false);
|
||||
|
||||
i = 0;
|
||||
ADD_STA_STATS(sta);
|
||||
ADD_STA_STATS(sta->link[0]);
|
||||
|
||||
data[i++] = sta->sta_state;
|
||||
|
||||
@ -140,7 +140,7 @@ static void ieee80211_get_stats(struct net_device *dev,
|
||||
memset(&sinfo, 0, sizeof(sinfo));
|
||||
sta_set_sinfo(sta, &sinfo, false);
|
||||
i = 0;
|
||||
ADD_STA_STATS(sta);
|
||||
ADD_STA_STATS(sta->link[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,7 @@ ieee80211_update_from_he_6ghz_capa(const struct ieee80211_he_6ghz_capa *he_6ghz_
|
||||
break;
|
||||
}
|
||||
|
||||
sta->sta.he_6ghz_capa = *he_6ghz_capa;
|
||||
sta->sta.deflink.he_6ghz_capa = *he_6ghz_capa;
|
||||
}
|
||||
|
||||
static void ieee80211_he_mcs_disable(__le16 *he_mcs)
|
||||
@ -110,7 +110,7 @@ ieee80211_he_cap_ie_to_sta_he_cap(struct ieee80211_sub_if_data *sdata,
|
||||
const struct ieee80211_he_6ghz_capa *he_6ghz_capa,
|
||||
struct sta_info *sta)
|
||||
{
|
||||
struct ieee80211_sta_he_cap *he_cap = &sta->sta.he_cap;
|
||||
struct ieee80211_sta_he_cap *he_cap = &sta->sta.deflink.he_cap;
|
||||
struct ieee80211_sta_he_cap own_he_cap;
|
||||
struct ieee80211_he_cap_elem *he_cap_ie_elem = (void *)he_cap_ie;
|
||||
u8 he_ppe_size;
|
||||
@ -153,8 +153,8 @@ ieee80211_he_cap_ie_to_sta_he_cap(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
he_cap->has_he = true;
|
||||
|
||||
sta->cur_max_bandwidth = ieee80211_sta_cap_rx_bw(sta);
|
||||
sta->sta.bandwidth = ieee80211_sta_cur_vht_bw(sta);
|
||||
sta->deflink.cur_max_bandwidth = ieee80211_sta_cap_rx_bw(sta);
|
||||
sta->sta.deflink.bandwidth = ieee80211_sta_cur_vht_bw(sta);
|
||||
|
||||
if (sband->band == NL80211_BAND_6GHZ && he_6ghz_capa)
|
||||
ieee80211_update_from_he_6ghz_capa(he_6ghz_capa, sta);
|
||||
|
@ -243,9 +243,9 @@ bool ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata,
|
||||
sta->sta.max_amsdu_len = IEEE80211_MAX_MPDU_LEN_HT_3839;
|
||||
|
||||
apply:
|
||||
changed = memcmp(&sta->sta.ht_cap, &ht_cap, sizeof(ht_cap));
|
||||
changed = memcmp(&sta->sta.deflink.ht_cap, &ht_cap, sizeof(ht_cap));
|
||||
|
||||
memcpy(&sta->sta.ht_cap, &ht_cap, sizeof(ht_cap));
|
||||
memcpy(&sta->sta.deflink.ht_cap, &ht_cap, sizeof(ht_cap));
|
||||
|
||||
switch (sdata->vif.bss_conf.chandef.width) {
|
||||
default:
|
||||
@ -264,9 +264,9 @@ bool ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata,
|
||||
break;
|
||||
}
|
||||
|
||||
sta->sta.bandwidth = bw;
|
||||
sta->sta.deflink.bandwidth = bw;
|
||||
|
||||
sta->cur_max_bandwidth =
|
||||
sta->deflink.cur_max_bandwidth =
|
||||
ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 ?
|
||||
IEEE80211_STA_RX_BW_40 : IEEE80211_STA_RX_BW_20;
|
||||
|
||||
|
@ -637,7 +637,7 @@ ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, const u8 *bssid,
|
||||
|
||||
/* make sure mandatory rates are always added */
|
||||
sband = local->hw.wiphy->bands[band];
|
||||
sta->sta.supp_rates[band] = supp_rates |
|
||||
sta->sta.deflink.supp_rates[band] = supp_rates |
|
||||
ieee80211_mandatory_rates(sband, scan_width);
|
||||
|
||||
return ieee80211_ibss_finish_sta(sta);
|
||||
@ -1005,7 +1005,7 @@ static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
|
||||
if (sta) {
|
||||
u32 prev_rates;
|
||||
|
||||
prev_rates = sta->sta.supp_rates[band];
|
||||
prev_rates = sta->sta.deflink.supp_rates[band];
|
||||
/* make sure mandatory rates are always added */
|
||||
scan_width = NL80211_BSS_CHAN_WIDTH_20;
|
||||
if (rx_status->bw == RATE_INFO_BW_5)
|
||||
@ -1013,13 +1013,13 @@ static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
|
||||
else if (rx_status->bw == RATE_INFO_BW_10)
|
||||
scan_width = NL80211_BSS_CHAN_WIDTH_10;
|
||||
|
||||
sta->sta.supp_rates[band] = supp_rates |
|
||||
sta->sta.deflink.supp_rates[band] = supp_rates |
|
||||
ieee80211_mandatory_rates(sband, scan_width);
|
||||
if (sta->sta.supp_rates[band] != prev_rates) {
|
||||
if (sta->sta.deflink.supp_rates[band] != prev_rates) {
|
||||
ibss_dbg(sdata,
|
||||
"updated supp_rates set for %pM based on beacon/probe_resp (0x%x -> 0x%x)\n",
|
||||
sta->sta.addr, prev_rates,
|
||||
sta->sta.supp_rates[band]);
|
||||
sta->sta.deflink.supp_rates[band]);
|
||||
rates_updated = true;
|
||||
}
|
||||
} else {
|
||||
@ -1043,7 +1043,7 @@ static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
|
||||
/* we both use HT */
|
||||
struct ieee80211_ht_cap htcap_ie;
|
||||
struct cfg80211_chan_def chandef;
|
||||
enum ieee80211_sta_rx_bandwidth bw = sta->sta.bandwidth;
|
||||
enum ieee80211_sta_rx_bandwidth bw = sta->sta.deflink.bandwidth;
|
||||
|
||||
cfg80211_chandef_create(&chandef, channel, NL80211_CHAN_NO_HT);
|
||||
ieee80211_chandef_ht_oper(elems->ht_operation, &chandef);
|
||||
@ -1058,7 +1058,7 @@ static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
|
||||
sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_40) {
|
||||
/* we both use VHT */
|
||||
struct ieee80211_vht_cap cap_ie;
|
||||
struct ieee80211_sta_vht_cap cap = sta->sta.vht_cap;
|
||||
struct ieee80211_sta_vht_cap cap = sta->sta.deflink.vht_cap;
|
||||
u32 vht_cap_info =
|
||||
le32_to_cpu(elems->vht_cap_elem->vht_cap_info);
|
||||
|
||||
@ -1069,11 +1069,11 @@ static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
|
||||
memcpy(&cap_ie, elems->vht_cap_elem, sizeof(cap_ie));
|
||||
ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
|
||||
&cap_ie, sta);
|
||||
if (memcmp(&cap, &sta->sta.vht_cap, sizeof(cap)))
|
||||
if (memcmp(&cap, &sta->sta.deflink.vht_cap, sizeof(cap)))
|
||||
rates_updated |= true;
|
||||
}
|
||||
|
||||
if (bw != sta->sta.bandwidth)
|
||||
if (bw != sta->sta.deflink.bandwidth)
|
||||
rates_updated |= true;
|
||||
|
||||
if (!cfg80211_chandef_compatible(&sdata->u.ibss.chandef,
|
||||
@ -1083,12 +1083,12 @@ static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
if (sta && rates_updated) {
|
||||
u32 changed = IEEE80211_RC_SUPP_RATES_CHANGED;
|
||||
u8 rx_nss = sta->sta.rx_nss;
|
||||
u8 rx_nss = sta->sta.deflink.rx_nss;
|
||||
|
||||
/* Force rx_nss recalculation */
|
||||
sta->sta.rx_nss = 0;
|
||||
sta->sta.deflink.rx_nss = 0;
|
||||
rate_control_rate_init(sta);
|
||||
if (sta->sta.rx_nss != rx_nss)
|
||||
if (sta->sta.deflink.rx_nss != rx_nss)
|
||||
changed |= IEEE80211_RC_NSS_CHANGED;
|
||||
|
||||
drv_sta_rc_update(local, sdata, &sta->sta, changed);
|
||||
@ -1235,7 +1235,7 @@ void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
/* make sure mandatory rates are always added */
|
||||
sband = local->hw.wiphy->bands[band];
|
||||
sta->sta.supp_rates[band] = supp_rates |
|
||||
sta->sta.deflink.supp_rates[band] = supp_rates |
|
||||
ieee80211_mandatory_rates(sband, scan_width);
|
||||
|
||||
spin_lock(&ifibss->incomplete_lock);
|
||||
|
@ -476,7 +476,7 @@ static int ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
|
||||
!(new->conf.flags & IEEE80211_KEY_FLAG_NO_AUTO_TX))
|
||||
_ieee80211_set_tx_key(new, true);
|
||||
} else {
|
||||
rcu_assign_pointer(sta->gtk[idx], new);
|
||||
rcu_assign_pointer(sta->deflink.gtk[idx], new);
|
||||
}
|
||||
/* Only needed for transition from no key -> key.
|
||||
* Still triggers unnecessary when using Extended Key ID
|
||||
@ -826,7 +826,8 @@ int ieee80211_key_link(struct ieee80211_key *key,
|
||||
(old_key && old_key->conf.cipher != key->conf.cipher))
|
||||
goto out;
|
||||
} else if (sta) {
|
||||
old_key = key_mtx_dereference(sdata->local, sta->gtk[idx]);
|
||||
old_key = key_mtx_dereference(sdata->local,
|
||||
sta->deflink.gtk[idx]);
|
||||
} else {
|
||||
old_key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
|
||||
}
|
||||
@ -1076,8 +1077,8 @@ void ieee80211_free_sta_keys(struct ieee80211_local *local,
|
||||
int i;
|
||||
|
||||
mutex_lock(&local->key_mtx);
|
||||
for (i = 0; i < ARRAY_SIZE(sta->gtk); i++) {
|
||||
key = key_mtx_dereference(local, sta->gtk[i]);
|
||||
for (i = 0; i < ARRAY_SIZE(sta->deflink.gtk); i++) {
|
||||
key = key_mtx_dereference(local, sta->deflink.gtk[i]);
|
||||
if (!key)
|
||||
continue;
|
||||
ieee80211_key_replace(key->sdata, key->sta,
|
||||
|
@ -310,7 +310,7 @@ void ieee80211s_update_metric(struct ieee80211_local *local,
|
||||
LINK_FAIL_THRESH)
|
||||
mesh_plink_broken(sta);
|
||||
|
||||
sta_set_rate_info_tx(sta, &sta->tx_stats.last_rate, &rinfo);
|
||||
sta_set_rate_info_tx(sta, &sta->deflink.tx_stats.last_rate, &rinfo);
|
||||
ewma_mesh_tx_rate_avg_add(&sta->mesh->tx_rate_avg,
|
||||
cfg80211_calculate_bitrate(&rinfo));
|
||||
}
|
||||
|
@ -61,8 +61,8 @@ static bool rssi_threshold_check(struct ieee80211_sub_if_data *sdata,
|
||||
s32 rssi_threshold = sdata->u.mesh.mshcfg.rssi_threshold;
|
||||
return rssi_threshold == 0 ||
|
||||
(sta &&
|
||||
(s8)-ewma_signal_read(&sta->rx_stats_avg.signal) >
|
||||
rssi_threshold);
|
||||
(s8)-ewma_signal_read(&sta->deflink.rx_stats_avg.signal) >
|
||||
rssi_threshold);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -125,7 +125,7 @@ static u32 mesh_set_short_slot_time(struct ieee80211_sub_if_data *sdata)
|
||||
continue;
|
||||
|
||||
short_slot = false;
|
||||
if (erp_rates & sta->sta.supp_rates[sband->band])
|
||||
if (erp_rates & sta->sta.deflink.supp_rates[sband->band])
|
||||
short_slot = true;
|
||||
else
|
||||
break;
|
||||
@ -175,10 +175,10 @@ static u32 mesh_set_ht_prot_mode(struct ieee80211_sub_if_data *sdata)
|
||||
sta->mesh->plink_state != NL80211_PLINK_ESTAB)
|
||||
continue;
|
||||
|
||||
if (sta->sta.bandwidth > IEEE80211_STA_RX_BW_20)
|
||||
if (sta->sta.deflink.bandwidth > IEEE80211_STA_RX_BW_20)
|
||||
continue;
|
||||
|
||||
if (!sta->sta.ht_cap.ht_supported) {
|
||||
if (!sta->sta.deflink.ht_cap.ht_supported) {
|
||||
mpl_dbg(sdata, "nonHT sta (%pM) is present\n",
|
||||
sta->sta.addr);
|
||||
non_ht_sta = true;
|
||||
@ -415,7 +415,7 @@ static void mesh_sta_info_init(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_supported_band *sband;
|
||||
u32 rates, basic_rates = 0, changed = 0;
|
||||
enum ieee80211_sta_rx_bandwidth bw = sta->sta.bandwidth;
|
||||
enum ieee80211_sta_rx_bandwidth bw = sta->sta.deflink.bandwidth;
|
||||
|
||||
sband = ieee80211_get_sband(sdata);
|
||||
if (!sband)
|
||||
@ -425,7 +425,7 @@ static void mesh_sta_info_init(struct ieee80211_sub_if_data *sdata,
|
||||
&basic_rates);
|
||||
|
||||
spin_lock_bh(&sta->mesh->plink_lock);
|
||||
sta->rx_stats.last_rx = jiffies;
|
||||
sta->deflink.rx_stats.last_rx = jiffies;
|
||||
|
||||
/* rates and capabilities don't change during peering */
|
||||
if (sta->mesh->plink_state == NL80211_PLINK_ESTAB &&
|
||||
@ -433,9 +433,9 @@ static void mesh_sta_info_init(struct ieee80211_sub_if_data *sdata,
|
||||
goto out;
|
||||
sta->mesh->processed_beacon = true;
|
||||
|
||||
if (sta->sta.supp_rates[sband->band] != rates)
|
||||
if (sta->sta.deflink.supp_rates[sband->band] != rates)
|
||||
changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
|
||||
sta->sta.supp_rates[sband->band] = rates;
|
||||
sta->sta.deflink.supp_rates[sband->band] = rates;
|
||||
|
||||
if (ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
|
||||
elems->ht_cap_elem, sta))
|
||||
@ -449,16 +449,16 @@ static void mesh_sta_info_init(struct ieee80211_sub_if_data *sdata,
|
||||
elems->he_6ghz_capa,
|
||||
sta);
|
||||
|
||||
if (bw != sta->sta.bandwidth)
|
||||
if (bw != sta->sta.deflink.bandwidth)
|
||||
changed |= IEEE80211_RC_BW_CHANGED;
|
||||
|
||||
/* HT peer is operating 20MHz-only */
|
||||
if (elems->ht_operation &&
|
||||
!(elems->ht_operation->ht_param &
|
||||
IEEE80211_HT_PARAM_CHAN_WIDTH_ANY)) {
|
||||
if (sta->sta.bandwidth != IEEE80211_STA_RX_BW_20)
|
||||
if (sta->sta.deflink.bandwidth != IEEE80211_STA_RX_BW_20)
|
||||
changed |= IEEE80211_RC_BW_CHANGED;
|
||||
sta->sta.bandwidth = IEEE80211_STA_RX_BW_20;
|
||||
sta->sta.deflink.bandwidth = IEEE80211_STA_RX_BW_20;
|
||||
}
|
||||
|
||||
if (!test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
|
||||
|
@ -3342,7 +3342,7 @@ static bool ieee80211_twt_req_supported(const struct sta_info *sta,
|
||||
if (!(elems->ext_capab[9] & WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT))
|
||||
return false;
|
||||
|
||||
return sta->sta.he_cap.he_cap_elem.mac_cap_info[0] &
|
||||
return sta->sta.deflink.he_cap.he_cap_elem.mac_cap_info[0] &
|
||||
IEEE80211_HE_MAC_CAP0_TWT_RES;
|
||||
}
|
||||
|
||||
@ -3369,7 +3369,7 @@ static bool ieee80211_twt_bcast_support(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_vif_type_p2p(&sdata->vif));
|
||||
|
||||
return bss_conf->he_support &&
|
||||
(sta->sta.he_cap.he_cap_elem.mac_cap_info[2] &
|
||||
(sta->sta.deflink.he_cap.he_cap_elem.mac_cap_info[2] &
|
||||
IEEE80211_HE_MAC_CAP2_BCAST_TWT) &&
|
||||
own_he_cap &&
|
||||
(own_he_cap->he_cap_elem.mac_cap_info[2] &
|
||||
@ -3587,7 +3587,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
|
||||
elems->he_6ghz_capa,
|
||||
sta);
|
||||
|
||||
bss_conf->he_support = sta->sta.he_cap.has_he;
|
||||
bss_conf->he_support = sta->sta.deflink.he_cap.has_he;
|
||||
if (elems->rsnx && elems->rsnx_len &&
|
||||
(elems->rsnx[0] & WLAN_RSNX_CAPA_PROTECTED_TWT) &&
|
||||
wiphy_ext_feature_isset(local->hw.wiphy,
|
||||
@ -3607,7 +3607,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
|
||||
elems->eht_cap_len,
|
||||
sta);
|
||||
|
||||
bss_conf->eht_support = sta->sta.eht_cap.has_eht;
|
||||
bss_conf->eht_support = sta->sta.deflink.eht_cap.has_eht;
|
||||
} else {
|
||||
bss_conf->eht_support = false;
|
||||
}
|
||||
@ -3678,7 +3678,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
|
||||
nss = *elems->opmode_notif & IEEE80211_OPMODE_NOTIF_RX_NSS_MASK;
|
||||
nss >>= IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
|
||||
nss += 1;
|
||||
sta->sta.rx_nss = nss;
|
||||
sta->sta.deflink.rx_nss = nss;
|
||||
}
|
||||
|
||||
rate_control_rate_init(sta);
|
||||
@ -4836,9 +4836,9 @@ static void ieee80211_sta_conn_mon_timer(struct timer_list *t)
|
||||
if (!sta)
|
||||
return;
|
||||
|
||||
timeout = sta->status_stats.last_ack;
|
||||
if (time_before(sta->status_stats.last_ack, sta->rx_stats.last_rx))
|
||||
timeout = sta->rx_stats.last_rx;
|
||||
timeout = sta->deflink.status_stats.last_ack;
|
||||
if (time_before(sta->deflink.status_stats.last_ack, sta->deflink.rx_stats.last_rx))
|
||||
timeout = sta->deflink.rx_stats.last_rx;
|
||||
timeout += IEEE80211_CONNECTION_IDLE_TIME;
|
||||
|
||||
/* If timeout is after now, then update timer to fire at
|
||||
@ -5638,7 +5638,7 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
|
||||
if (rates)
|
||||
new_sta->sta.supp_rates[cbss->channel->band] = rates;
|
||||
new_sta->sta.deflink.supp_rates[cbss->channel->band] = rates;
|
||||
else
|
||||
sdata_info(sdata,
|
||||
"No rates found, keeping mandatory only\n");
|
||||
|
@ -74,7 +74,7 @@ void ieee80211_ocb_rx_no_sta(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
/* Add only mandatory rates for now */
|
||||
sband = local->hw.wiphy->bands[band];
|
||||
sta->sta.supp_rates[band] =
|
||||
sta->sta.deflink.supp_rates[band] =
|
||||
ieee80211_mandatory_rates(sband, scan_width);
|
||||
|
||||
spin_lock(&ifocb->incomplete_lock);
|
||||
|
@ -371,7 +371,7 @@ static void __rate_control_send_low(struct ieee80211_hw *hw,
|
||||
WARN_ONCE(i == sband->n_bitrates,
|
||||
"no supported rates for sta %pM (0x%x, band %d) in rate_mask 0x%x with flags 0x%x\n",
|
||||
sta ? sta->addr : NULL,
|
||||
sta ? sta->supp_rates[sband->band] : -1,
|
||||
sta ? sta->deflink.supp_rates[sband->band] : -1,
|
||||
sband->band,
|
||||
rate_mask, rate_flags);
|
||||
|
||||
@ -781,11 +781,11 @@ static bool rate_control_cap_mask(struct ieee80211_sub_if_data *sdata,
|
||||
u16 sta_vht_mask[NL80211_VHT_NSS_MAX];
|
||||
|
||||
/* Filter out rates that the STA does not support */
|
||||
*mask &= sta->supp_rates[sband->band];
|
||||
*mask &= sta->deflink.supp_rates[sband->band];
|
||||
for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
|
||||
mcs_mask[i] &= sta->ht_cap.mcs.rx_mask[i];
|
||||
mcs_mask[i] &= sta->deflink.ht_cap.mcs.rx_mask[i];
|
||||
|
||||
sta_vht_cap = sta->vht_cap.vht_mcs.rx_mcs_map;
|
||||
sta_vht_cap = sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
|
||||
ieee80211_get_vht_mask_from_cap(sta_vht_cap, sta_vht_mask);
|
||||
for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
|
||||
vht_mask[i] &= sta_vht_mask[i];
|
||||
|
@ -606,7 +606,7 @@ minstrel_ht_prob_rate_reduce_streams(struct minstrel_ht_sta *mi)
|
||||
int tmp_max_streams, group, tmp_idx, tmp_prob;
|
||||
int tmp_tp = 0;
|
||||
|
||||
if (!mi->sta->ht_cap.ht_supported)
|
||||
if (!mi->sta->deflink.ht_cap.ht_supported)
|
||||
return;
|
||||
|
||||
group = MI_RATE_GROUP(mi->max_tp_rate[0]);
|
||||
@ -996,7 +996,7 @@ minstrel_ht_update_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
|
||||
u16 tmp_mcs_tp_rate[MAX_THR_RATES], tmp_group_tp_rate[MAX_THR_RATES];
|
||||
u16 tmp_legacy_tp_rate[MAX_THR_RATES], tmp_max_prob_rate;
|
||||
u16 index;
|
||||
bool ht_supported = mi->sta->ht_cap.ht_supported;
|
||||
bool ht_supported = mi->sta->deflink.ht_cap.ht_supported;
|
||||
|
||||
if (mi->ampdu_packets > 0) {
|
||||
if (!ieee80211_hw_check(mp->hw, TX_STATUS_NO_AMPDU_LEN))
|
||||
@ -1419,7 +1419,7 @@ minstrel_ht_get_max_amsdu_len(struct minstrel_ht_sta *mi)
|
||||
* the limit here to avoid the complexity of having to de-aggregate
|
||||
* packets in the queue.
|
||||
*/
|
||||
if (!mi->sta->vht_cap.vht_supported)
|
||||
if (!mi->sta->deflink.vht_cap.vht_supported)
|
||||
return IEEE80211_MAX_MPDU_LEN_HT_BA;
|
||||
|
||||
/* unlimited */
|
||||
@ -1536,7 +1536,7 @@ minstrel_ht_update_cck(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
|
||||
if (sband->band != NL80211_BAND_2GHZ)
|
||||
return;
|
||||
|
||||
if (sta->ht_cap.ht_supported &&
|
||||
if (sta->deflink.ht_cap.ht_supported &&
|
||||
!ieee80211_hw_check(mp->hw, SUPPORTS_HT_CCK_RATES))
|
||||
return;
|
||||
|
||||
@ -1559,7 +1559,7 @@ minstrel_ht_update_ofdm(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
|
||||
const u8 *rates;
|
||||
int i;
|
||||
|
||||
if (sta->ht_cap.ht_supported)
|
||||
if (sta->deflink.ht_cap.ht_supported)
|
||||
return;
|
||||
|
||||
rates = mp->ofdm_rates[sband->band];
|
||||
@ -1579,9 +1579,9 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
|
||||
{
|
||||
struct minstrel_priv *mp = priv;
|
||||
struct minstrel_ht_sta *mi = priv_sta;
|
||||
struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
|
||||
u16 ht_cap = sta->ht_cap.cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
||||
struct ieee80211_mcs_info *mcs = &sta->deflink.ht_cap.mcs;
|
||||
u16 ht_cap = sta->deflink.ht_cap.cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
|
||||
const struct ieee80211_rate *ctl_rate;
|
||||
bool ldpc, erp;
|
||||
int use_vht;
|
||||
@ -1653,7 +1653,7 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
|
||||
}
|
||||
|
||||
if (gflags & IEEE80211_TX_RC_40_MHZ_WIDTH &&
|
||||
sta->bandwidth < IEEE80211_STA_RX_BW_40)
|
||||
sta->deflink.bandwidth < IEEE80211_STA_RX_BW_40)
|
||||
continue;
|
||||
|
||||
nss = minstrel_mcs_groups[i].streams;
|
||||
@ -1680,7 +1680,7 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
|
||||
continue;
|
||||
|
||||
if (gflags & IEEE80211_TX_RC_80_MHZ_WIDTH) {
|
||||
if (sta->bandwidth < IEEE80211_STA_RX_BW_80 ||
|
||||
if (sta->deflink.bandwidth < IEEE80211_STA_RX_BW_80 ||
|
||||
((gflags & IEEE80211_TX_RC_SHORT_GI) &&
|
||||
!(vht_cap->cap & IEEE80211_VHT_CAP_SHORT_GI_80))) {
|
||||
continue;
|
||||
|
@ -221,7 +221,7 @@ static void __ieee80211_queue_skb_to_iface(struct ieee80211_sub_if_data *sdata,
|
||||
skb_queue_tail(&sdata->skb_queue, skb);
|
||||
ieee80211_queue_work(&sdata->local->hw, &sdata->work);
|
||||
if (sta)
|
||||
sta->rx_stats.packets++;
|
||||
sta->deflink.rx_stats.packets++;
|
||||
}
|
||||
|
||||
static void ieee80211_queue_skb_to_iface(struct ieee80211_sub_if_data *sdata,
|
||||
@ -1465,7 +1465,7 @@ ieee80211_rx_h_check_dup(struct ieee80211_rx_data *rx)
|
||||
if (unlikely(ieee80211_has_retry(hdr->frame_control) &&
|
||||
rx->sta->last_seq_ctrl[rx->seqno_idx] == hdr->seq_ctrl)) {
|
||||
I802_DEBUG_INC(rx->local->dot11FrameDuplicateCount);
|
||||
rx->sta->rx_stats.num_duplicates++;
|
||||
rx->sta->deflink.rx_stats.num_duplicates++;
|
||||
return RX_DROP_UNUSABLE;
|
||||
} else if (!(status->flag & RX_FLAG_AMSDU_MORE)) {
|
||||
rx->sta->last_seq_ctrl[rx->seqno_idx] = hdr->seq_ctrl;
|
||||
@ -1761,46 +1761,47 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
|
||||
NL80211_IFTYPE_ADHOC);
|
||||
if (ether_addr_equal(bssid, rx->sdata->u.ibss.bssid) &&
|
||||
test_sta_flag(sta, WLAN_STA_AUTHORIZED)) {
|
||||
sta->rx_stats.last_rx = jiffies;
|
||||
sta->deflink.rx_stats.last_rx = jiffies;
|
||||
if (ieee80211_is_data(hdr->frame_control) &&
|
||||
!is_multicast_ether_addr(hdr->addr1))
|
||||
sta->rx_stats.last_rate =
|
||||
sta->deflink.rx_stats.last_rate =
|
||||
sta_stats_encode_rate(status);
|
||||
}
|
||||
} else if (rx->sdata->vif.type == NL80211_IFTYPE_OCB) {
|
||||
sta->rx_stats.last_rx = jiffies;
|
||||
sta->deflink.rx_stats.last_rx = jiffies;
|
||||
} else if (!ieee80211_is_s1g_beacon(hdr->frame_control) &&
|
||||
!is_multicast_ether_addr(hdr->addr1)) {
|
||||
/*
|
||||
* Mesh beacons will update last_rx when if they are found to
|
||||
* match the current local configuration when processed.
|
||||
*/
|
||||
sta->rx_stats.last_rx = jiffies;
|
||||
sta->deflink.rx_stats.last_rx = jiffies;
|
||||
if (ieee80211_is_data(hdr->frame_control))
|
||||
sta->rx_stats.last_rate = sta_stats_encode_rate(status);
|
||||
sta->deflink.rx_stats.last_rate = sta_stats_encode_rate(status);
|
||||
}
|
||||
|
||||
sta->rx_stats.fragments++;
|
||||
sta->deflink.rx_stats.fragments++;
|
||||
|
||||
u64_stats_update_begin(&rx->sta->rx_stats.syncp);
|
||||
sta->rx_stats.bytes += rx->skb->len;
|
||||
u64_stats_update_end(&rx->sta->rx_stats.syncp);
|
||||
u64_stats_update_begin(&rx->sta->deflink.rx_stats.syncp);
|
||||
sta->deflink.rx_stats.bytes += rx->skb->len;
|
||||
u64_stats_update_end(&rx->sta->deflink.rx_stats.syncp);
|
||||
|
||||
if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
|
||||
sta->rx_stats.last_signal = status->signal;
|
||||
ewma_signal_add(&sta->rx_stats_avg.signal, -status->signal);
|
||||
sta->deflink.rx_stats.last_signal = status->signal;
|
||||
ewma_signal_add(&sta->deflink.rx_stats_avg.signal,
|
||||
-status->signal);
|
||||
}
|
||||
|
||||
if (status->chains) {
|
||||
sta->rx_stats.chains = status->chains;
|
||||
sta->deflink.rx_stats.chains = status->chains;
|
||||
for (i = 0; i < ARRAY_SIZE(status->chain_signal); i++) {
|
||||
int signal = status->chain_signal[i];
|
||||
|
||||
if (!(status->chains & BIT(i)))
|
||||
continue;
|
||||
|
||||
sta->rx_stats.chain_signal_last[i] = signal;
|
||||
ewma_signal_add(&sta->rx_stats_avg.chain_signal[i],
|
||||
sta->deflink.rx_stats.chain_signal_last[i] = signal;
|
||||
ewma_signal_add(&sta->deflink.rx_stats_avg.chain_signal[i],
|
||||
-signal);
|
||||
}
|
||||
}
|
||||
@ -1861,7 +1862,7 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
|
||||
* Update counter and free packet here to avoid
|
||||
* counting this as a dropped packed.
|
||||
*/
|
||||
sta->rx_stats.packets++;
|
||||
sta->deflink.rx_stats.packets++;
|
||||
dev_kfree_skb(rx->skb);
|
||||
return RX_QUEUED;
|
||||
}
|
||||
@ -1893,11 +1894,11 @@ ieee80211_rx_get_bigtk(struct ieee80211_rx_data *rx, int idx)
|
||||
}
|
||||
|
||||
if (rx->sta)
|
||||
key = rcu_dereference(rx->sta->gtk[idx]);
|
||||
key = rcu_dereference(rx->sta->deflink.gtk[idx]);
|
||||
if (!key)
|
||||
key = rcu_dereference(sdata->keys[idx]);
|
||||
if (!key && rx->sta)
|
||||
key = rcu_dereference(rx->sta->gtk[idx2]);
|
||||
key = rcu_dereference(rx->sta->deflink.gtk[idx2]);
|
||||
if (!key)
|
||||
key = rcu_dereference(sdata->keys[idx2]);
|
||||
|
||||
@ -2012,7 +2013,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
||||
test_sta_flag(rx->sta, WLAN_STA_MFP))
|
||||
return RX_DROP_MONITOR;
|
||||
|
||||
rx->key = rcu_dereference(rx->sta->gtk[mmie_keyidx]);
|
||||
rx->key = rcu_dereference(rx->sta->deflink.gtk[mmie_keyidx]);
|
||||
}
|
||||
if (!rx->key)
|
||||
rx->key = rcu_dereference(rx->sdata->keys[mmie_keyidx]);
|
||||
@ -2035,7 +2036,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
||||
} else {
|
||||
if (rx->sta) {
|
||||
for (i = 0; i < NUM_DEFAULT_KEYS; i++) {
|
||||
key = rcu_dereference(rx->sta->gtk[i]);
|
||||
key = rcu_dereference(rx->sta->deflink.gtk[i]);
|
||||
if (key)
|
||||
break;
|
||||
}
|
||||
@ -2072,7 +2073,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
||||
|
||||
/* check per-station GTK first, if multicast packet */
|
||||
if (is_multicast_ether_addr(hdr->addr1) && rx->sta)
|
||||
rx->key = rcu_dereference(rx->sta->gtk[keyidx]);
|
||||
rx->key = rcu_dereference(rx->sta->deflink.gtk[keyidx]);
|
||||
|
||||
/* if not found, try default key */
|
||||
if (!rx->key) {
|
||||
@ -2398,7 +2399,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
|
||||
out:
|
||||
ieee80211_led_rx(rx->local);
|
||||
if (rx->sta)
|
||||
rx->sta->rx_stats.packets++;
|
||||
rx->sta->deflink.rx_stats.packets++;
|
||||
return RX_CONTINUE;
|
||||
}
|
||||
|
||||
@ -2645,9 +2646,9 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
|
||||
* for non-QoS-data frames. Here we know it's a data
|
||||
* frame, so count MSDUs.
|
||||
*/
|
||||
u64_stats_update_begin(&rx->sta->rx_stats.syncp);
|
||||
rx->sta->rx_stats.msdu[rx->seqno_idx]++;
|
||||
u64_stats_update_end(&rx->sta->rx_stats.syncp);
|
||||
u64_stats_update_begin(&rx->sta->deflink.rx_stats.syncp);
|
||||
rx->sta->deflink.rx_stats.msdu[rx->seqno_idx]++;
|
||||
u64_stats_update_end(&rx->sta->deflink.rx_stats.syncp);
|
||||
}
|
||||
|
||||
if ((sdata->vif.type == NL80211_IFTYPE_AP ||
|
||||
@ -3342,7 +3343,7 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
||||
switch (mgmt->u.action.category) {
|
||||
case WLAN_CATEGORY_HT:
|
||||
/* reject HT action frames from stations not supporting HT */
|
||||
if (!rx->sta->sta.ht_cap.ht_supported)
|
||||
if (!rx->sta->sta.deflink.ht_cap.ht_supported)
|
||||
goto invalid;
|
||||
|
||||
if (sdata->vif.type != NL80211_IFTYPE_STATION &&
|
||||
@ -3406,7 +3407,7 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
||||
struct sta_opmode_info sta_opmode = {};
|
||||
|
||||
/* If it doesn't support 40 MHz it can't change ... */
|
||||
if (!(rx->sta->sta.ht_cap.cap &
|
||||
if (!(rx->sta->sta.deflink.ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40))
|
||||
goto handled;
|
||||
|
||||
@ -3416,13 +3417,13 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
||||
max_bw = ieee80211_sta_cap_rx_bw(rx->sta);
|
||||
|
||||
/* set cur_max_bandwidth and recalc sta bw */
|
||||
rx->sta->cur_max_bandwidth = max_bw;
|
||||
rx->sta->deflink.cur_max_bandwidth = max_bw;
|
||||
new_bw = ieee80211_sta_cur_vht_bw(rx->sta);
|
||||
|
||||
if (rx->sta->sta.bandwidth == new_bw)
|
||||
if (rx->sta->sta.deflink.bandwidth == new_bw)
|
||||
goto handled;
|
||||
|
||||
rx->sta->sta.bandwidth = new_bw;
|
||||
rx->sta->sta.deflink.bandwidth = new_bw;
|
||||
sband = rx->local->hw.wiphy->bands[status->band];
|
||||
sta_opmode.bw =
|
||||
ieee80211_sta_rx_bw_to_chan_width(rx->sta);
|
||||
@ -3619,7 +3620,7 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
||||
|
||||
handled:
|
||||
if (rx->sta)
|
||||
rx->sta->rx_stats.packets++;
|
||||
rx->sta->deflink.rx_stats.packets++;
|
||||
dev_kfree_skb(rx->skb);
|
||||
return RX_QUEUED;
|
||||
|
||||
@ -3653,7 +3654,7 @@ ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx)
|
||||
ieee80211_rx_status_to_khz(status), sig,
|
||||
rx->skb->data, rx->skb->len, 0)) {
|
||||
if (rx->sta)
|
||||
rx->sta->rx_stats.packets++;
|
||||
rx->sta->deflink.rx_stats.packets++;
|
||||
dev_kfree_skb(rx->skb);
|
||||
return RX_QUEUED;
|
||||
}
|
||||
@ -3691,7 +3692,7 @@ ieee80211_rx_h_action_post_userspace(struct ieee80211_rx_data *rx)
|
||||
|
||||
handled:
|
||||
if (rx->sta)
|
||||
rx->sta->rx_stats.packets++;
|
||||
rx->sta->deflink.rx_stats.packets++;
|
||||
dev_kfree_skb(rx->skb);
|
||||
return RX_QUEUED;
|
||||
}
|
||||
@ -3911,7 +3912,7 @@ static void ieee80211_rx_handlers_result(struct ieee80211_rx_data *rx,
|
||||
case RX_DROP_MONITOR:
|
||||
I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop);
|
||||
if (rx->sta)
|
||||
rx->sta->rx_stats.dropped++;
|
||||
rx->sta->deflink.rx_stats.dropped++;
|
||||
fallthrough;
|
||||
case RX_CONTINUE: {
|
||||
struct ieee80211_rate *rate = NULL;
|
||||
@ -3930,7 +3931,7 @@ static void ieee80211_rx_handlers_result(struct ieee80211_rx_data *rx,
|
||||
case RX_DROP_UNUSABLE:
|
||||
I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop);
|
||||
if (rx->sta)
|
||||
rx->sta->rx_stats.dropped++;
|
||||
rx->sta->deflink.rx_stats.dropped++;
|
||||
dev_kfree_skb(rx->skb);
|
||||
break;
|
||||
case RX_QUEUED:
|
||||
@ -4482,15 +4483,15 @@ static void ieee80211_rx_8023(struct ieee80211_rx_data *rx,
|
||||
void *sa = skb->data + ETH_ALEN;
|
||||
void *da = skb->data;
|
||||
|
||||
stats = &sta->rx_stats;
|
||||
stats = &sta->deflink.rx_stats;
|
||||
if (fast_rx->uses_rss)
|
||||
stats = this_cpu_ptr(sta->pcpu_rx_stats);
|
||||
stats = this_cpu_ptr(sta->deflink.pcpu_rx_stats);
|
||||
|
||||
/* statistics part of ieee80211_rx_h_sta_process() */
|
||||
if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
|
||||
stats->last_signal = status->signal;
|
||||
if (!fast_rx->uses_rss)
|
||||
ewma_signal_add(&sta->rx_stats_avg.signal,
|
||||
ewma_signal_add(&sta->deflink.rx_stats_avg.signal,
|
||||
-status->signal);
|
||||
}
|
||||
|
||||
@ -4506,7 +4507,7 @@ static void ieee80211_rx_8023(struct ieee80211_rx_data *rx,
|
||||
|
||||
stats->chain_signal_last[i] = signal;
|
||||
if (!fast_rx->uses_rss)
|
||||
ewma_signal_add(&sta->rx_stats_avg.chain_signal[i],
|
||||
ewma_signal_add(&sta->deflink.rx_stats_avg.chain_signal[i],
|
||||
-signal);
|
||||
}
|
||||
}
|
||||
@ -4582,7 +4583,7 @@ static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,
|
||||
u8 da[ETH_ALEN];
|
||||
u8 sa[ETH_ALEN];
|
||||
} addrs __aligned(2);
|
||||
struct ieee80211_sta_rx_stats *stats = &sta->rx_stats;
|
||||
struct ieee80211_sta_rx_stats *stats = &sta->deflink.rx_stats;
|
||||
|
||||
/* for parallel-rx, we need to have DUP_VALIDATED, otherwise we write
|
||||
* to a common data structure; drivers can implement that per queue
|
||||
@ -4684,7 +4685,7 @@ static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,
|
||||
drop:
|
||||
dev_kfree_skb(skb);
|
||||
if (fast_rx->uses_rss)
|
||||
stats = this_cpu_ptr(sta->pcpu_rx_stats);
|
||||
stats = this_cpu_ptr(sta->deflink.pcpu_rx_stats);
|
||||
|
||||
stats->dropped++;
|
||||
return true;
|
||||
|
@ -11,8 +11,8 @@
|
||||
void ieee80211_s1g_sta_rate_init(struct sta_info *sta)
|
||||
{
|
||||
/* avoid indicating legacy bitrates for S1G STAs */
|
||||
sta->tx_stats.last_rate.flags |= IEEE80211_TX_RC_S1G_MCS;
|
||||
sta->rx_stats.last_rate =
|
||||
sta->deflink.tx_stats.last_rate.flags |= IEEE80211_TX_RC_S1G_MCS;
|
||||
sta->deflink.rx_stats.last_rate =
|
||||
STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_S1G);
|
||||
}
|
||||
|
||||
|
@ -287,7 +287,7 @@ void sta_info_free(struct ieee80211_local *local, struct sta_info *sta)
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
kfree(sta->mesh);
|
||||
#endif
|
||||
free_percpu(sta->pcpu_rx_stats);
|
||||
free_percpu(sta->deflink.pcpu_rx_stats);
|
||||
kfree(sta);
|
||||
}
|
||||
|
||||
@ -346,9 +346,9 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
|
||||
return NULL;
|
||||
|
||||
if (ieee80211_hw_check(hw, USES_RSS)) {
|
||||
sta->pcpu_rx_stats =
|
||||
sta->deflink.pcpu_rx_stats =
|
||||
alloc_percpu_gfp(struct ieee80211_sta_rx_stats, gfp);
|
||||
if (!sta->pcpu_rx_stats)
|
||||
if (!sta->deflink.pcpu_rx_stats)
|
||||
goto free;
|
||||
}
|
||||
|
||||
@ -376,6 +376,14 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
|
||||
sta->sta.max_rx_aggregation_subframes =
|
||||
local->hw.max_rx_aggregation_subframes;
|
||||
|
||||
/* TODO link specific alloc and assignments for MLO Link STA */
|
||||
|
||||
/* For non MLO STA, link info can be accessed either via deflink
|
||||
* or link[0]
|
||||
*/
|
||||
sta->link[0] = &sta->deflink;
|
||||
sta->sta.link[0] = &sta->sta.deflink;
|
||||
|
||||
/* Extended Key ID needs to install keys for keyid 0 and 1 Rx-only.
|
||||
* The Tx path starts to use a key as soon as the key slot ptk_idx
|
||||
* references to is not NULL. To not use the initial Rx-only key
|
||||
@ -387,9 +395,9 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
sta->local = local;
|
||||
sta->sdata = sdata;
|
||||
sta->rx_stats.last_rx = jiffies;
|
||||
sta->deflink.rx_stats.last_rx = jiffies;
|
||||
|
||||
u64_stats_init(&sta->rx_stats.syncp);
|
||||
u64_stats_init(&sta->deflink.rx_stats.syncp);
|
||||
|
||||
ieee80211_init_frag_cache(&sta->frags);
|
||||
|
||||
@ -399,10 +407,10 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
|
||||
sta->reserved_tid = IEEE80211_TID_UNRESERVED;
|
||||
|
||||
sta->last_connected = ktime_get_seconds();
|
||||
ewma_signal_init(&sta->rx_stats_avg.signal);
|
||||
ewma_avg_signal_init(&sta->status_stats.avg_ack_signal);
|
||||
for (i = 0; i < ARRAY_SIZE(sta->rx_stats_avg.chain_signal); i++)
|
||||
ewma_signal_init(&sta->rx_stats_avg.chain_signal[i]);
|
||||
ewma_signal_init(&sta->deflink.rx_stats_avg.signal);
|
||||
ewma_avg_signal_init(&sta->deflink.status_stats.avg_ack_signal);
|
||||
for (i = 0; i < ARRAY_SIZE(sta->deflink.rx_stats_avg.chain_signal); i++)
|
||||
ewma_signal_init(&sta->deflink.rx_stats_avg.chain_signal[i]);
|
||||
|
||||
if (local->ops->wake_tx_queue) {
|
||||
void *txq_data;
|
||||
@ -472,7 +480,7 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
if (!(rate->flags & mandatory))
|
||||
continue;
|
||||
sta->sta.supp_rates[i] |= BIT(r);
|
||||
sta->sta.deflink.supp_rates[i] |= BIT(r);
|
||||
}
|
||||
}
|
||||
|
||||
@ -524,7 +532,7 @@ free_txq:
|
||||
if (sta->sta.txq[0])
|
||||
kfree(to_txq_info(sta->sta.txq[0]));
|
||||
free:
|
||||
free_percpu(sta->pcpu_rx_stats);
|
||||
free_percpu(sta->deflink.pcpu_rx_stats);
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
kfree(sta->mesh);
|
||||
#endif
|
||||
@ -2087,16 +2095,16 @@ int sta_info_move_state(struct sta_info *sta,
|
||||
|
||||
u8 sta_info_tx_streams(struct sta_info *sta)
|
||||
{
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->sta.ht_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap = &sta->sta.deflink.ht_cap;
|
||||
u8 rx_streams;
|
||||
|
||||
if (!sta->sta.ht_cap.ht_supported)
|
||||
if (!sta->sta.deflink.ht_cap.ht_supported)
|
||||
return 1;
|
||||
|
||||
if (sta->sta.vht_cap.vht_supported) {
|
||||
if (sta->sta.deflink.vht_cap.vht_supported) {
|
||||
int i;
|
||||
u16 tx_mcs_map =
|
||||
le16_to_cpu(sta->sta.vht_cap.vht_mcs.tx_mcs_map);
|
||||
le16_to_cpu(sta->sta.deflink.vht_cap.vht_mcs.tx_mcs_map);
|
||||
|
||||
for (i = 7; i >= 0; i--)
|
||||
if ((tx_mcs_map & (0x3 << (i * 2))) !=
|
||||
@ -2123,16 +2131,16 @@ u8 sta_info_tx_streams(struct sta_info *sta)
|
||||
static struct ieee80211_sta_rx_stats *
|
||||
sta_get_last_rx_stats(struct sta_info *sta)
|
||||
{
|
||||
struct ieee80211_sta_rx_stats *stats = &sta->rx_stats;
|
||||
struct ieee80211_sta_rx_stats *stats = &sta->deflink.rx_stats;
|
||||
int cpu;
|
||||
|
||||
if (!sta->pcpu_rx_stats)
|
||||
if (!sta->deflink.pcpu_rx_stats)
|
||||
return stats;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct ieee80211_sta_rx_stats *cpustats;
|
||||
|
||||
cpustats = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
|
||||
cpustats = per_cpu_ptr(sta->deflink.pcpu_rx_stats, cpu);
|
||||
|
||||
if (time_after(cpustats->last_rx, stats->last_rx))
|
||||
stats = cpustats;
|
||||
@ -2226,13 +2234,15 @@ static void sta_set_tidstats(struct sta_info *sta,
|
||||
int cpu;
|
||||
|
||||
if (!(tidstats->filled & BIT(NL80211_TID_STATS_RX_MSDU))) {
|
||||
tidstats->rx_msdu += sta_get_tidstats_msdu(&sta->rx_stats, tid);
|
||||
tidstats->rx_msdu += sta_get_tidstats_msdu(&sta->deflink.rx_stats,
|
||||
tid);
|
||||
|
||||
if (sta->pcpu_rx_stats) {
|
||||
if (sta->deflink.pcpu_rx_stats) {
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct ieee80211_sta_rx_stats *cpurxs;
|
||||
|
||||
cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
|
||||
cpurxs = per_cpu_ptr(sta->deflink.pcpu_rx_stats,
|
||||
cpu);
|
||||
tidstats->rx_msdu +=
|
||||
sta_get_tidstats_msdu(cpurxs, tid);
|
||||
}
|
||||
@ -2243,19 +2253,19 @@ static void sta_set_tidstats(struct sta_info *sta,
|
||||
|
||||
if (!(tidstats->filled & BIT(NL80211_TID_STATS_TX_MSDU))) {
|
||||
tidstats->filled |= BIT(NL80211_TID_STATS_TX_MSDU);
|
||||
tidstats->tx_msdu = sta->tx_stats.msdu[tid];
|
||||
tidstats->tx_msdu = sta->deflink.tx_stats.msdu[tid];
|
||||
}
|
||||
|
||||
if (!(tidstats->filled & BIT(NL80211_TID_STATS_TX_MSDU_RETRIES)) &&
|
||||
ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
|
||||
tidstats->filled |= BIT(NL80211_TID_STATS_TX_MSDU_RETRIES);
|
||||
tidstats->tx_msdu_retries = sta->status_stats.msdu_retries[tid];
|
||||
tidstats->tx_msdu_retries = sta->deflink.status_stats.msdu_retries[tid];
|
||||
}
|
||||
|
||||
if (!(tidstats->filled & BIT(NL80211_TID_STATS_TX_MSDU_FAILED)) &&
|
||||
ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
|
||||
tidstats->filled |= BIT(NL80211_TID_STATS_TX_MSDU_FAILED);
|
||||
tidstats->tx_msdu_failed = sta->status_stats.msdu_failed[tid];
|
||||
tidstats->tx_msdu_failed = sta->deflink.status_stats.msdu_failed[tid];
|
||||
}
|
||||
|
||||
if (local->ops->wake_tx_queue && tid < IEEE80211_NUM_TIDS) {
|
||||
@ -2326,26 +2336,27 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
|
||||
BIT_ULL(NL80211_STA_INFO_TX_BYTES)))) {
|
||||
sinfo->tx_bytes = 0;
|
||||
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
|
||||
sinfo->tx_bytes += sta->tx_stats.bytes[ac];
|
||||
sinfo->tx_bytes += sta->deflink.tx_stats.bytes[ac];
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64);
|
||||
}
|
||||
|
||||
if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_PACKETS))) {
|
||||
sinfo->tx_packets = 0;
|
||||
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
|
||||
sinfo->tx_packets += sta->tx_stats.packets[ac];
|
||||
sinfo->tx_packets += sta->deflink.tx_stats.packets[ac];
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);
|
||||
}
|
||||
|
||||
if (!(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES64) |
|
||||
BIT_ULL(NL80211_STA_INFO_RX_BYTES)))) {
|
||||
sinfo->rx_bytes += sta_get_stats_bytes(&sta->rx_stats);
|
||||
sinfo->rx_bytes += sta_get_stats_bytes(&sta->deflink.rx_stats);
|
||||
|
||||
if (sta->pcpu_rx_stats) {
|
||||
if (sta->deflink.pcpu_rx_stats) {
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct ieee80211_sta_rx_stats *cpurxs;
|
||||
|
||||
cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
|
||||
cpurxs = per_cpu_ptr(sta->deflink.pcpu_rx_stats,
|
||||
cpu);
|
||||
sinfo->rx_bytes += sta_get_stats_bytes(cpurxs);
|
||||
}
|
||||
}
|
||||
@ -2354,12 +2365,13 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
|
||||
}
|
||||
|
||||
if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_PACKETS))) {
|
||||
sinfo->rx_packets = sta->rx_stats.packets;
|
||||
if (sta->pcpu_rx_stats) {
|
||||
sinfo->rx_packets = sta->deflink.rx_stats.packets;
|
||||
if (sta->deflink.pcpu_rx_stats) {
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct ieee80211_sta_rx_stats *cpurxs;
|
||||
|
||||
cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
|
||||
cpurxs = per_cpu_ptr(sta->deflink.pcpu_rx_stats,
|
||||
cpu);
|
||||
sinfo->rx_packets += cpurxs->packets;
|
||||
}
|
||||
}
|
||||
@ -2367,12 +2379,12 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
|
||||
}
|
||||
|
||||
if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_RETRIES))) {
|
||||
sinfo->tx_retries = sta->status_stats.retry_count;
|
||||
sinfo->tx_retries = sta->deflink.status_stats.retry_count;
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
|
||||
}
|
||||
|
||||
if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_FAILED))) {
|
||||
sinfo->tx_failed = sta->status_stats.retry_failed;
|
||||
sinfo->tx_failed = sta->deflink.status_stats.retry_failed;
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
|
||||
}
|
||||
|
||||
@ -2393,12 +2405,12 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_AIRTIME_WEIGHT);
|
||||
}
|
||||
|
||||
sinfo->rx_dropped_misc = sta->rx_stats.dropped;
|
||||
if (sta->pcpu_rx_stats) {
|
||||
sinfo->rx_dropped_misc = sta->deflink.rx_stats.dropped;
|
||||
if (sta->deflink.pcpu_rx_stats) {
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct ieee80211_sta_rx_stats *cpurxs;
|
||||
|
||||
cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
|
||||
cpurxs = per_cpu_ptr(sta->deflink.pcpu_rx_stats, cpu);
|
||||
sinfo->rx_dropped_misc += cpurxs->dropped;
|
||||
}
|
||||
}
|
||||
@ -2417,10 +2429,10 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
|
||||
}
|
||||
|
||||
if (!sta->pcpu_rx_stats &&
|
||||
if (!sta->deflink.pcpu_rx_stats &&
|
||||
!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG))) {
|
||||
sinfo->signal_avg =
|
||||
-ewma_signal_read(&sta->rx_stats_avg.signal);
|
||||
-ewma_signal_read(&sta->deflink.rx_stats_avg.signal);
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
|
||||
}
|
||||
}
|
||||
@ -2433,7 +2445,7 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
|
||||
!(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL) |
|
||||
BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)))) {
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
|
||||
if (!sta->pcpu_rx_stats)
|
||||
if (!sta->deflink.pcpu_rx_stats)
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG);
|
||||
|
||||
sinfo->chains = last_rxstats->chains;
|
||||
@ -2442,12 +2454,12 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
|
||||
sinfo->chain_signal[i] =
|
||||
last_rxstats->chain_signal_last[i];
|
||||
sinfo->chain_signal_avg[i] =
|
||||
-ewma_signal_read(&sta->rx_stats_avg.chain_signal[i]);
|
||||
-ewma_signal_read(&sta->deflink.rx_stats_avg.chain_signal[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE))) {
|
||||
sta_set_rate_info_tx(sta, &sta->tx_stats.last_rate,
|
||||
sta_set_rate_info_tx(sta, &sta->deflink.tx_stats.last_rate,
|
||||
&sinfo->txrate);
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
|
||||
}
|
||||
@ -2529,16 +2541,16 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
|
||||
}
|
||||
|
||||
if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL)) &&
|
||||
sta->status_stats.ack_signal_filled) {
|
||||
sinfo->ack_signal = sta->status_stats.last_ack_signal;
|
||||
sta->deflink.status_stats.ack_signal_filled) {
|
||||
sinfo->ack_signal = sta->deflink.status_stats.last_ack_signal;
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL);
|
||||
}
|
||||
|
||||
if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG)) &&
|
||||
sta->status_stats.ack_signal_filled) {
|
||||
sta->deflink.status_stats.ack_signal_filled) {
|
||||
sinfo->avg_ack_signal =
|
||||
-(s8)ewma_avg_signal_read(
|
||||
&sta->status_stats.avg_ack_signal);
|
||||
&sta->deflink.status_stats.avg_ack_signal);
|
||||
sinfo->filled |=
|
||||
BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG);
|
||||
}
|
||||
@ -2573,10 +2585,10 @@ unsigned long ieee80211_sta_last_active(struct sta_info *sta)
|
||||
{
|
||||
struct ieee80211_sta_rx_stats *stats = sta_get_last_rx_stats(sta);
|
||||
|
||||
if (!sta->status_stats.last_ack ||
|
||||
time_after(stats->last_rx, sta->status_stats.last_ack))
|
||||
if (!sta->deflink.status_stats.last_ack ||
|
||||
time_after(stats->last_rx, sta->deflink.status_stats.last_ack))
|
||||
return stats->last_rx;
|
||||
return sta->status_stats.last_ack;
|
||||
return sta->deflink.status_stats.last_ack;
|
||||
}
|
||||
|
||||
static void sta_update_codel_params(struct sta_info *sta, u32 thr)
|
||||
|
@ -483,6 +483,86 @@ struct ieee80211_fragment_cache {
|
||||
*/
|
||||
#define STA_SLOW_THRESHOLD 6000 /* 6 Mbps */
|
||||
|
||||
/**
|
||||
* struct link_sta_info - Link STA information
|
||||
* All link specific sta info are stored here for reference. This can be
|
||||
* a single entry for non-MLD STA or multiple entries for MLD STA
|
||||
* @addr: Link MAC address - Can be same as MLD STA mac address and is always
|
||||
* same for non-MLD STA. This is used as key for searching link STA
|
||||
* @link_id: Link ID uniquely identifying the link STA. This is 0 for non-MLD
|
||||
* and set to the corresponding vif LinkId for MLD STA
|
||||
* @sta: Points to the STA info
|
||||
* @gtk: group keys negotiated with this station, if any
|
||||
* @tx_stats: TX statistics
|
||||
* @tx_stats.packets: # of packets transmitted
|
||||
* @tx_stats.bytes: # of bytes in all packets transmitted
|
||||
* @tx_stats.last_rate: last TX rate
|
||||
* @tx_stats.msdu: # of transmitted MSDUs per TID
|
||||
* @rx_stats: RX statistics
|
||||
* @rx_stats_avg: averaged RX statistics
|
||||
* @rx_stats_avg.signal: averaged signal
|
||||
* @rx_stats_avg.chain_signal: averaged per-chain signal
|
||||
* @pcpu_rx_stats: per-CPU RX statistics, assigned only if the driver needs
|
||||
* this (by advertising the USES_RSS hw flag)
|
||||
* @status_stats: TX status statistics
|
||||
* @status_stats.filtered: # of filtered frames
|
||||
* @status_stats.retry_failed: # of frames that failed after retry
|
||||
* @status_stats.retry_count: # of retries attempted
|
||||
* @status_stats.lost_packets: # of lost packets
|
||||
* @status_stats.last_pkt_time: timestamp of last ACKed packet
|
||||
* @status_stats.msdu_retries: # of MSDU retries
|
||||
* @status_stats.msdu_failed: # of failed MSDUs
|
||||
* @status_stats.last_ack: last ack timestamp (jiffies)
|
||||
* @status_stats.last_ack_signal: last ACK signal
|
||||
* @status_stats.ack_signal_filled: last ACK signal validity
|
||||
* @status_stats.avg_ack_signal: average ACK signal
|
||||
* TODO Move other link params from sta_info as required for MLD operation
|
||||
*/
|
||||
struct link_sta_info {
|
||||
u8 addr[ETH_ALEN];
|
||||
u8 link_id;
|
||||
|
||||
/* TODO rhash head/node for finding link_sta based on addr */
|
||||
|
||||
struct sta_info *sta;
|
||||
struct ieee80211_key __rcu *gtk[NUM_DEFAULT_KEYS +
|
||||
NUM_DEFAULT_MGMT_KEYS +
|
||||
NUM_DEFAULT_BEACON_KEYS];
|
||||
struct ieee80211_sta_rx_stats __percpu *pcpu_rx_stats;
|
||||
|
||||
/* Updated from RX path only, no locking requirements */
|
||||
struct ieee80211_sta_rx_stats rx_stats;
|
||||
struct {
|
||||
struct ewma_signal signal;
|
||||
struct ewma_signal chain_signal[IEEE80211_MAX_CHAINS];
|
||||
} rx_stats_avg;
|
||||
|
||||
/* Updated from TX status path only, no locking requirements */
|
||||
struct {
|
||||
unsigned long filtered;
|
||||
unsigned long retry_failed, retry_count;
|
||||
unsigned int lost_packets;
|
||||
unsigned long last_pkt_time;
|
||||
u64 msdu_retries[IEEE80211_NUM_TIDS + 1];
|
||||
u64 msdu_failed[IEEE80211_NUM_TIDS + 1];
|
||||
unsigned long last_ack;
|
||||
s8 last_ack_signal;
|
||||
bool ack_signal_filled;
|
||||
struct ewma_avg_signal avg_ack_signal;
|
||||
} status_stats;
|
||||
|
||||
/* Updated from TX path only, no locking requirements */
|
||||
struct {
|
||||
u64 packets[IEEE80211_NUM_ACS];
|
||||
u64 bytes[IEEE80211_NUM_ACS];
|
||||
struct ieee80211_tx_rate last_rate;
|
||||
struct rate_info last_rate_info;
|
||||
u64 msdu[IEEE80211_NUM_TIDS + 1];
|
||||
} tx_stats;
|
||||
|
||||
enum ieee80211_sta_rx_bandwidth cur_max_bandwidth;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct sta_info - STA information
|
||||
*
|
||||
@ -498,7 +578,6 @@ struct ieee80211_fragment_cache {
|
||||
* @sdata: virtual interface this station belongs to
|
||||
* @ptk: peer keys negotiated with this station, if any
|
||||
* @ptk_idx: last installed peer key index
|
||||
* @gtk: group keys negotiated with this station, if any
|
||||
* @rate_ctrl: rate control algorithm reference
|
||||
* @rate_ctrl_lock: spinlock used to protect rate control data
|
||||
* (data inside the algorithm, so serializes calls there)
|
||||
@ -544,30 +623,19 @@ struct ieee80211_fragment_cache {
|
||||
* @fast_rx: RX fastpath information
|
||||
* @tdls_chandef: a TDLS peer can have a wider chandef that is compatible to
|
||||
* the BSS one.
|
||||
* @tx_stats: TX statistics
|
||||
* @tx_stats.packets: # of packets transmitted
|
||||
* @tx_stats.bytes: # of bytes in all packets transmitted
|
||||
* @tx_stats.last_rate: last TX rate
|
||||
* @tx_stats.msdu: # of transmitted MSDUs per TID
|
||||
* @rx_stats: RX statistics
|
||||
* @rx_stats_avg: averaged RX statistics
|
||||
* @rx_stats_avg.signal: averaged signal
|
||||
* @rx_stats_avg.chain_signal: averaged per-chain signal
|
||||
* @pcpu_rx_stats: per-CPU RX statistics, assigned only if the driver needs
|
||||
* this (by advertising the USES_RSS hw flag)
|
||||
* @status_stats: TX status statistics
|
||||
* @status_stats.filtered: # of filtered frames
|
||||
* @status_stats.retry_failed: # of frames that failed after retry
|
||||
* @status_stats.retry_count: # of retries attempted
|
||||
* @status_stats.lost_packets: # of lost packets
|
||||
* @status_stats.last_pkt_time: timestamp of last ACKed packet
|
||||
* @status_stats.msdu_retries: # of MSDU retries
|
||||
* @status_stats.msdu_failed: # of failed MSDUs
|
||||
* @status_stats.last_ack: last ack timestamp (jiffies)
|
||||
* @status_stats.last_ack_signal: last ACK signal
|
||||
* @status_stats.ack_signal_filled: last ACK signal validity
|
||||
* @status_stats.avg_ack_signal: average ACK signal
|
||||
* @frags: fragment cache
|
||||
* @multi_link_sta: Identifies if this sta is a MLD STA or regular STA
|
||||
* @deflink: This is the default link STA information, for non MLO STA all link
|
||||
* specific STA information is accessed through @deflink or through
|
||||
* link[0] which points to address of @deflink. For MLO Link STA
|
||||
* the first added link STA will point to deflink.
|
||||
* @link: reference to Link Sta entries. For Non MLO STA, except 1st link,
|
||||
* i.e link[0] all links would be assigned to NULL by default and
|
||||
* would access link information via @deflink or link[0]. For MLO
|
||||
* STA, first link STA being added will point its link pointer to
|
||||
* @deflink address and remaining would be allocated and the address
|
||||
* would be assigned to link[link_id] where link_id is the id assigned
|
||||
* by the AP.
|
||||
*/
|
||||
struct sta_info {
|
||||
/* General information, mostly static */
|
||||
@ -577,9 +645,6 @@ struct sta_info {
|
||||
u8 addr[ETH_ALEN];
|
||||
struct ieee80211_local *local;
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
struct ieee80211_key __rcu *gtk[NUM_DEFAULT_KEYS +
|
||||
NUM_DEFAULT_MGMT_KEYS +
|
||||
NUM_DEFAULT_BEACON_KEYS];
|
||||
struct ieee80211_key __rcu *ptk[NUM_DEFAULT_KEYS];
|
||||
u8 ptk_idx;
|
||||
struct rate_control_ref *rate_ctrl;
|
||||
@ -589,7 +654,6 @@ struct sta_info {
|
||||
|
||||
struct ieee80211_fast_tx __rcu *fast_tx;
|
||||
struct ieee80211_fast_rx __rcu *fast_rx;
|
||||
struct ieee80211_sta_rx_stats __percpu *pcpu_rx_stats;
|
||||
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
struct mesh_sta *mesh;
|
||||
@ -619,38 +683,9 @@ struct sta_info {
|
||||
u64 assoc_at;
|
||||
long last_connected;
|
||||
|
||||
/* Updated from RX path only, no locking requirements */
|
||||
struct ieee80211_sta_rx_stats rx_stats;
|
||||
struct {
|
||||
struct ewma_signal signal;
|
||||
struct ewma_signal chain_signal[IEEE80211_MAX_CHAINS];
|
||||
} rx_stats_avg;
|
||||
|
||||
/* Plus 1 for non-QoS frames */
|
||||
__le16 last_seq_ctrl[IEEE80211_NUM_TIDS + 1];
|
||||
|
||||
/* Updated from TX status path only, no locking requirements */
|
||||
struct {
|
||||
unsigned long filtered;
|
||||
unsigned long retry_failed, retry_count;
|
||||
unsigned int lost_packets;
|
||||
unsigned long last_pkt_time;
|
||||
u64 msdu_retries[IEEE80211_NUM_TIDS + 1];
|
||||
u64 msdu_failed[IEEE80211_NUM_TIDS + 1];
|
||||
unsigned long last_ack;
|
||||
s8 last_ack_signal;
|
||||
bool ack_signal_filled;
|
||||
struct ewma_avg_signal avg_ack_signal;
|
||||
} status_stats;
|
||||
|
||||
/* Updated from TX path only, no locking requirements */
|
||||
struct {
|
||||
u64 packets[IEEE80211_NUM_ACS];
|
||||
u64 bytes[IEEE80211_NUM_ACS];
|
||||
struct ieee80211_tx_rate last_rate;
|
||||
struct rate_info last_rate_info;
|
||||
u64 msdu[IEEE80211_NUM_TIDS + 1];
|
||||
} tx_stats;
|
||||
u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1];
|
||||
|
||||
struct airtime_info airtime[IEEE80211_NUM_ACS];
|
||||
@ -664,8 +699,6 @@ struct sta_info {
|
||||
struct dentry *debugfs_dir;
|
||||
#endif
|
||||
|
||||
enum ieee80211_sta_rx_bandwidth cur_max_bandwidth;
|
||||
|
||||
enum ieee80211_smps_mode known_smps_mode;
|
||||
const struct ieee80211_cipher_scheme *cipher_scheme;
|
||||
|
||||
@ -677,6 +710,10 @@ struct sta_info {
|
||||
|
||||
struct ieee80211_fragment_cache frags;
|
||||
|
||||
bool multi_link_sta;
|
||||
struct link_sta_info deflink;
|
||||
struct link_sta_info *link[MAX_STA_LINKS];
|
||||
|
||||
/* keep last! */
|
||||
struct ieee80211_sta sta;
|
||||
};
|
||||
|
@ -72,7 +72,7 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
|
||||
info->flags |= IEEE80211_TX_INTFL_RETRANSMISSION;
|
||||
info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
|
||||
|
||||
sta->status_stats.filtered++;
|
||||
sta->deflink.status_stats.filtered++;
|
||||
|
||||
/*
|
||||
* Clear more-data bit on filtered frames, it might be set
|
||||
@ -776,7 +776,7 @@ static void ieee80211_lost_packet(struct sta_info *sta,
|
||||
!(info->flags & IEEE80211_TX_STAT_AMPDU))
|
||||
return;
|
||||
|
||||
sta->status_stats.lost_packets++;
|
||||
sta->deflink.status_stats.lost_packets++;
|
||||
if (sta->sta.tdls) {
|
||||
pkt_time = STA_LOST_TDLS_PKT_TIME;
|
||||
pkt_thr = STA_LOST_PKT_THRESHOLD;
|
||||
@ -789,13 +789,14 @@ static void ieee80211_lost_packet(struct sta_info *sta,
|
||||
* mechanism.
|
||||
* For non-TDLS, use STA_LOST_PKT_THRESHOLD and STA_LOST_PKT_TIME
|
||||
*/
|
||||
if (sta->status_stats.lost_packets < pkt_thr ||
|
||||
!time_after(jiffies, sta->status_stats.last_pkt_time + pkt_time))
|
||||
if (sta->deflink.status_stats.lost_packets < pkt_thr ||
|
||||
!time_after(jiffies, sta->deflink.status_stats.last_pkt_time + pkt_time))
|
||||
return;
|
||||
|
||||
cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
|
||||
sta->status_stats.lost_packets, GFP_ATOMIC);
|
||||
sta->status_stats.lost_packets = 0;
|
||||
sta->deflink.status_stats.lost_packets,
|
||||
GFP_ATOMIC);
|
||||
sta->deflink.status_stats.lost_packets = 0;
|
||||
}
|
||||
|
||||
static int ieee80211_tx_get_rates(struct ieee80211_hw *hw,
|
||||
@ -930,7 +931,7 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
|
||||
if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) &&
|
||||
(ieee80211_is_data(hdr->frame_control)) &&
|
||||
(rates_idx != -1))
|
||||
sta->tx_stats.last_rate =
|
||||
sta->deflink.tx_stats.last_rate =
|
||||
info->status.rates[rates_idx];
|
||||
|
||||
if ((info->flags & IEEE80211_TX_STAT_AMPDU_NO_BACK) &&
|
||||
@ -976,9 +977,9 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
|
||||
return;
|
||||
} else if (ieee80211_is_data_present(fc)) {
|
||||
if (!acked && !noack_success)
|
||||
sta->status_stats.msdu_failed[tid]++;
|
||||
sta->deflink.status_stats.msdu_failed[tid]++;
|
||||
|
||||
sta->status_stats.msdu_retries[tid] +=
|
||||
sta->deflink.status_stats.msdu_retries[tid] +=
|
||||
retry_count;
|
||||
}
|
||||
|
||||
@ -1111,7 +1112,7 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
|
||||
sta = container_of(pubsta, struct sta_info, sta);
|
||||
|
||||
if (status->rate)
|
||||
sta->tx_stats.last_rate_info = *status->rate;
|
||||
sta->deflink.tx_stats.last_rate_info = *status->rate;
|
||||
}
|
||||
|
||||
if (skb && (tx_time_est =
|
||||
@ -1142,8 +1143,8 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
|
||||
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
||||
|
||||
if (!acked && !noack_success)
|
||||
sta->status_stats.retry_failed++;
|
||||
sta->status_stats.retry_count += retry_count;
|
||||
sta->deflink.status_stats.retry_failed++;
|
||||
sta->deflink.status_stats.retry_count += retry_count;
|
||||
|
||||
if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
|
||||
if (sdata->vif.type == NL80211_IFTYPE_STATION &&
|
||||
@ -1152,13 +1153,13 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
|
||||
acked, info->status.tx_time);
|
||||
|
||||
if (acked) {
|
||||
sta->status_stats.last_ack = jiffies;
|
||||
sta->deflink.status_stats.last_ack = jiffies;
|
||||
|
||||
if (sta->status_stats.lost_packets)
|
||||
sta->status_stats.lost_packets = 0;
|
||||
if (sta->deflink.status_stats.lost_packets)
|
||||
sta->deflink.status_stats.lost_packets = 0;
|
||||
|
||||
/* Track when last packet was ACKed */
|
||||
sta->status_stats.last_pkt_time = jiffies;
|
||||
sta->deflink.status_stats.last_pkt_time = jiffies;
|
||||
|
||||
/* Reset connection monitor */
|
||||
if (sdata->vif.type == NL80211_IFTYPE_STATION &&
|
||||
@ -1166,10 +1167,10 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
|
||||
sdata->u.mgd.probe_send_count = 0;
|
||||
|
||||
if (ack_signal_valid) {
|
||||
sta->status_stats.last_ack_signal =
|
||||
sta->deflink.status_stats.last_ack_signal =
|
||||
(s8)info->status.ack_signal;
|
||||
sta->status_stats.ack_signal_filled = true;
|
||||
ewma_avg_signal_add(&sta->status_stats.avg_ack_signal,
|
||||
sta->deflink.status_stats.ack_signal_filled = true;
|
||||
ewma_avg_signal_add(&sta->deflink.status_stats.avg_ack_signal,
|
||||
-info->status.ack_signal);
|
||||
}
|
||||
} else if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
|
||||
@ -1235,7 +1236,7 @@ void ieee80211_tx_rate_update(struct ieee80211_hw *hw,
|
||||
rate_control_tx_status(local, sband, &status);
|
||||
|
||||
if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
|
||||
sta->tx_stats.last_rate = info->status.rates[0];
|
||||
sta->deflink.tx_stats.last_rate = info->status.rates[0];
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_tx_rate_update);
|
||||
|
||||
|
@ -459,9 +459,9 @@ ieee80211_tdls_add_setup_start_ies(struct ieee80211_sub_if_data *sdata,
|
||||
pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2);
|
||||
ieee80211_ie_build_ht_cap(pos, &ht_cap, ht_cap.cap);
|
||||
} else if (action_code == WLAN_TDLS_SETUP_RESPONSE &&
|
||||
ht_cap.ht_supported && sta->sta.ht_cap.ht_supported) {
|
||||
ht_cap.ht_supported && sta->sta.deflink.ht_cap.ht_supported) {
|
||||
/* the peer caps are already intersected with our own */
|
||||
memcpy(&ht_cap, &sta->sta.ht_cap, sizeof(ht_cap));
|
||||
memcpy(&ht_cap, &sta->sta.deflink.ht_cap, sizeof(ht_cap));
|
||||
|
||||
pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2);
|
||||
ieee80211_ie_build_ht_cap(pos, &ht_cap, ht_cap.cap);
|
||||
@ -510,9 +510,9 @@ ieee80211_tdls_add_setup_start_ies(struct ieee80211_sub_if_data *sdata,
|
||||
pos = skb_put(skb, sizeof(struct ieee80211_vht_cap) + 2);
|
||||
ieee80211_ie_build_vht_cap(pos, &vht_cap, vht_cap.cap);
|
||||
} else if (action_code == WLAN_TDLS_SETUP_RESPONSE &&
|
||||
vht_cap.vht_supported && sta->sta.vht_cap.vht_supported) {
|
||||
vht_cap.vht_supported && sta->sta.deflink.vht_cap.vht_supported) {
|
||||
/* the peer caps are already intersected with our own */
|
||||
memcpy(&vht_cap, &sta->sta.vht_cap, sizeof(vht_cap));
|
||||
memcpy(&vht_cap, &sta->sta.deflink.vht_cap, sizeof(vht_cap));
|
||||
|
||||
/* the AID is present only when VHT is implemented */
|
||||
ieee80211_tdls_add_aid(sdata, skb);
|
||||
@ -603,13 +603,13 @@ ieee80211_tdls_add_setup_cfm_ies(struct ieee80211_sub_if_data *sdata,
|
||||
* if HT support is only added in TDLS, we need an HT-operation IE.
|
||||
* add the IE as required by IEEE802.11-2012 9.23.3.2.
|
||||
*/
|
||||
if (!ap_sta->sta.ht_cap.ht_supported && sta->sta.ht_cap.ht_supported) {
|
||||
if (!ap_sta->sta.deflink.ht_cap.ht_supported && sta->sta.deflink.ht_cap.ht_supported) {
|
||||
u16 prot = IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED |
|
||||
IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT |
|
||||
IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT;
|
||||
|
||||
pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_operation));
|
||||
ieee80211_ie_build_ht_oper(pos, &sta->sta.ht_cap,
|
||||
ieee80211_ie_build_ht_oper(pos, &sta->sta.deflink.ht_cap,
|
||||
&sdata->vif.bss_conf.chandef, prot,
|
||||
true);
|
||||
}
|
||||
@ -618,7 +618,7 @@ ieee80211_tdls_add_setup_cfm_ies(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
/* only include VHT-operation if not on the 2.4GHz band */
|
||||
if (sband->band != NL80211_BAND_2GHZ &&
|
||||
sta->sta.vht_cap.vht_supported) {
|
||||
sta->sta.deflink.vht_cap.vht_supported) {
|
||||
/*
|
||||
* if both peers support WIDER_BW, we can expand the chandef to
|
||||
* a wider compatible one, up to 80MHz
|
||||
@ -627,7 +627,7 @@ ieee80211_tdls_add_setup_cfm_ies(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_tdls_chandef_vht_upgrade(sdata, sta);
|
||||
|
||||
pos = skb_put(skb, 2 + sizeof(struct ieee80211_vht_operation));
|
||||
ieee80211_ie_build_vht_oper(pos, &sta->sta.vht_cap,
|
||||
ieee80211_ie_build_vht_oper(pos, &sta->sta.deflink.vht_cap,
|
||||
&sta->tdls_chandef);
|
||||
}
|
||||
|
||||
@ -1269,8 +1269,8 @@ static void iee80211_tdls_recalc_chanctx(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
bw = ieee80211_chan_width_to_rx_bw(conf->def.width);
|
||||
bw = min(bw, ieee80211_sta_cap_rx_bw(sta));
|
||||
if (bw != sta->sta.bandwidth) {
|
||||
sta->sta.bandwidth = bw;
|
||||
if (bw != sta->sta.deflink.bandwidth) {
|
||||
sta->sta.deflink.bandwidth = bw;
|
||||
rate_control_rate_update(local, sband, sta,
|
||||
IEEE80211_RC_BW_CHANGED);
|
||||
/*
|
||||
@ -1296,7 +1296,7 @@ static int iee80211_tdls_have_ht_peers(struct ieee80211_sub_if_data *sdata)
|
||||
if (!sta->sta.tdls || sta->sdata != sdata || !sta->uploaded ||
|
||||
!test_sta_flag(sta, WLAN_STA_AUTHORIZED) ||
|
||||
!test_sta_flag(sta, WLAN_STA_TDLS_PEER_AUTH) ||
|
||||
!sta->sta.ht_cap.ht_supported)
|
||||
!sta->sta.deflink.ht_cap.ht_supported)
|
||||
continue;
|
||||
result = true;
|
||||
break;
|
||||
@ -1321,7 +1321,7 @@ iee80211_tdls_recalc_ht_protection(struct ieee80211_sub_if_data *sdata,
|
||||
if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT))
|
||||
return;
|
||||
|
||||
tdls_ht = (sta && sta->sta.ht_cap.ht_supported) ||
|
||||
tdls_ht = (sta && sta->sta.deflink.ht_cap.ht_supported) ||
|
||||
iee80211_tdls_have_ht_peers(sdata);
|
||||
|
||||
opmode = sdata->vif.bss_conf.ht_operation_mode;
|
||||
@ -1900,7 +1900,7 @@ ieee80211_process_tdls_channel_switch_req(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
|
||||
/* peer should have known better */
|
||||
if (!sta->sta.ht_cap.ht_supported && elems->sec_chan_offs &&
|
||||
if (!sta->sta.deflink.ht_cap.ht_supported && elems->sec_chan_offs &&
|
||||
elems->sec_chan_offs->sec_chan_offs) {
|
||||
tdls_dbg(sdata, "TDLS chan switch - wide chan unsupported\n");
|
||||
ret = -ENOTSUPP;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user