mirror of https://gitee.com/openkylin/linux.git
ath10k: add recalc RTS/CTS protection method
Add recalculation of RTS/CTS protection when one or more legacy stations are connected to ath10k. In this case enable RTS/CTS protection and set sw retry profile are needed in the FW. Without this change legacy station is starved and has very low throughput. Signed-off-by: Marek Kwaczynski <marek.kwaczynski@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
44d6fa90a8
commit
e81bd10482
|
@ -260,6 +260,8 @@ struct ath10k_vif {
|
||||||
u8 fixed_rate;
|
u8 fixed_rate;
|
||||||
u8 fixed_nss;
|
u8 fixed_nss;
|
||||||
u8 force_sgi;
|
u8 force_sgi;
|
||||||
|
bool use_cts_prot;
|
||||||
|
int num_legacy_stations;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ath10k_vif_iter {
|
struct ath10k_vif_iter {
|
||||||
|
|
|
@ -739,6 +739,26 @@ static int ath10k_monitor_destroy(struct ath10k *ar)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
|
||||||
|
{
|
||||||
|
struct ath10k *ar = arvif->ar;
|
||||||
|
u32 vdev_param, rts_cts = 0;
|
||||||
|
|
||||||
|
lockdep_assert_held(&ar->conf_mutex);
|
||||||
|
|
||||||
|
vdev_param = ar->wmi.vdev_param->enable_rtscts;
|
||||||
|
|
||||||
|
if (arvif->use_cts_prot || arvif->num_legacy_stations > 0)
|
||||||
|
rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
|
||||||
|
|
||||||
|
if (arvif->num_legacy_stations > 0)
|
||||||
|
rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
|
||||||
|
WMI_RTSCTS_PROFILE);
|
||||||
|
|
||||||
|
return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
|
||||||
|
rts_cts);
|
||||||
|
}
|
||||||
|
|
||||||
static int ath10k_start_cac(struct ath10k *ar)
|
static int ath10k_start_cac(struct ath10k *ar)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -1552,6 +1572,16 @@ static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!sta->wme) {
|
||||||
|
arvif->num_legacy_stations++;
|
||||||
|
ret = ath10k_recalc_rtscts_prot(arvif);
|
||||||
|
if (ret) {
|
||||||
|
ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
|
||||||
|
arvif->vdev_id, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
|
ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath10k_warn("could not install peer wep keys for vdev %i: %d\n",
|
ath10k_warn("could not install peer wep keys for vdev %i: %d\n",
|
||||||
|
@ -1576,6 +1606,16 @@ static int ath10k_station_disassoc(struct ath10k *ar, struct ath10k_vif *arvif,
|
||||||
|
|
||||||
lockdep_assert_held(&ar->conf_mutex);
|
lockdep_assert_held(&ar->conf_mutex);
|
||||||
|
|
||||||
|
if (!sta->wme) {
|
||||||
|
arvif->num_legacy_stations--;
|
||||||
|
ret = ath10k_recalc_rtscts_prot(arvif);
|
||||||
|
if (ret) {
|
||||||
|
ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
|
||||||
|
arvif->vdev_id, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ret = ath10k_clear_peer_keys(arvif, sta->addr);
|
ret = ath10k_clear_peer_keys(arvif, sta->addr);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath10k_warn("could not clear all peer wep keys for vdev %i: %d\n",
|
ath10k_warn("could not clear all peer wep keys for vdev %i: %d\n",
|
||||||
|
@ -2869,20 +2909,13 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
|
||||||
ath10k_control_beaconing(arvif, info);
|
ath10k_control_beaconing(arvif, info);
|
||||||
|
|
||||||
if (changed & BSS_CHANGED_ERP_CTS_PROT) {
|
if (changed & BSS_CHANGED_ERP_CTS_PROT) {
|
||||||
u32 cts_prot;
|
arvif->use_cts_prot = info->use_cts_prot;
|
||||||
if (info->use_cts_prot)
|
|
||||||
cts_prot = 1;
|
|
||||||
else
|
|
||||||
cts_prot = 0;
|
|
||||||
|
|
||||||
ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
|
ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n",
|
||||||
arvif->vdev_id, cts_prot);
|
arvif->vdev_id, info->use_cts_prot);
|
||||||
|
|
||||||
vdev_param = ar->wmi.vdev_param->enable_rtscts;
|
ret = ath10k_recalc_rtscts_prot(arvif);
|
||||||
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
|
|
||||||
cts_prot);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
ath10k_warn("Failed to set CTS prot for vdev %d: %d\n",
|
ath10k_warn("Failed to recalculate rts/cts prot for vdev %d: %d\n",
|
||||||
arvif->vdev_id, ret);
|
arvif->vdev_id, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2210,6 +2210,19 @@ enum ath10k_protmode {
|
||||||
ATH10K_PROT_RTSCTS = 2, /* RTS-CTS */
|
ATH10K_PROT_RTSCTS = 2, /* RTS-CTS */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum wmi_rtscts_profile {
|
||||||
|
WMI_RTSCTS_FOR_NO_RATESERIES = 0,
|
||||||
|
WMI_RTSCTS_FOR_SECOND_RATESERIES,
|
||||||
|
WMI_RTSCTS_ACROSS_SW_RETRIES
|
||||||
|
};
|
||||||
|
|
||||||
|
#define WMI_RTSCTS_ENABLED 1
|
||||||
|
#define WMI_RTSCTS_SET_MASK 0x0f
|
||||||
|
#define WMI_RTSCTS_SET_LSB 0
|
||||||
|
|
||||||
|
#define WMI_RTSCTS_PROFILE_MASK 0xf0
|
||||||
|
#define WMI_RTSCTS_PROFILE_LSB 4
|
||||||
|
|
||||||
enum wmi_beacon_gen_mode {
|
enum wmi_beacon_gen_mode {
|
||||||
WMI_BEACON_STAGGERED_MODE = 0,
|
WMI_BEACON_STAGGERED_MODE = 0,
|
||||||
WMI_BEACON_BURST_MODE = 1
|
WMI_BEACON_BURST_MODE = 1
|
||||||
|
|
Loading…
Reference in New Issue