Commit 424121c3 authored by Michal Kazior's avatar Michal Kazior Committed by Kalle Valo

ath10k: fix rts/fragmentation threshold setup

If RTS and fragmentation threshold values are
0xFFFFFFFF they should be considered disabled and
no min/max limits must be applied.

This fixes some issues with throughput issues,
especially with VHT.
Signed-off-by: default avatarMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent d6015b27
...@@ -332,6 +332,29 @@ static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr) ...@@ -332,6 +332,29 @@ static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
return 0; return 0;
} }
static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
{
if (value != 0xFFFFFFFF)
value = min_t(u32, arvif->ar->hw->wiphy->rts_threshold,
ATH10K_RTS_MAX);
return ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id,
WMI_VDEV_PARAM_RTS_THRESHOLD,
value);
}
static int ath10k_mac_set_frag(struct ath10k_vif *arvif, u32 value)
{
if (value != 0xFFFFFFFF)
value = clamp_t(u32, arvif->ar->hw->wiphy->frag_threshold,
ATH10K_FRAGMT_THRESHOLD_MIN,
ATH10K_FRAGMT_THRESHOLD_MAX);
return ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id,
WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
value);
}
static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr) static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
{ {
int ret; int ret;
...@@ -1897,7 +1920,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw, ...@@ -1897,7 +1920,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
enum wmi_sta_powersave_param param; enum wmi_sta_powersave_param param;
int ret = 0; int ret = 0;
u32 value, rts, frag; u32 value;
int bit; int bit;
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
...@@ -2000,20 +2023,12 @@ static int ath10k_add_interface(struct ieee80211_hw *hw, ...@@ -2000,20 +2023,12 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
ath10k_warn("Failed to set PSPOLL count: %d\n", ret); ath10k_warn("Failed to set PSPOLL count: %d\n", ret);
} }
rts = min_t(u32, ar->hw->wiphy->rts_threshold, ATH10K_RTS_MAX); ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
WMI_VDEV_PARAM_RTS_THRESHOLD,
rts);
if (ret) if (ret)
ath10k_warn("failed to set rts threshold for vdev %d (%d)\n", ath10k_warn("failed to set rts threshold for vdev %d (%d)\n",
arvif->vdev_id, ret); arvif->vdev_id, ret);
frag = clamp_t(u32, ar->hw->wiphy->frag_threshold, ret = ath10k_mac_set_frag(arvif, ar->hw->wiphy->frag_threshold);
ATH10K_FRAGMT_THRESHOLD_MIN,
ATH10K_FRAGMT_THRESHOLD_MAX);
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
frag);
if (ret) if (ret)
ath10k_warn("failed to set frag threshold for vdev %d (%d)\n", ath10k_warn("failed to set frag threshold for vdev %d (%d)\n",
arvif->vdev_id, ret); arvif->vdev_id, ret);
...@@ -2728,11 +2743,7 @@ static void ath10k_set_rts_iter(void *data, u8 *mac, struct ieee80211_vif *vif) ...@@ -2728,11 +2743,7 @@ static void ath10k_set_rts_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
if (ar_iter->ar->state == ATH10K_STATE_RESTARTED) if (ar_iter->ar->state == ATH10K_STATE_RESTARTED)
return; return;
rts = min_t(u32, rts, ATH10K_RTS_MAX); ar_iter->ret = ath10k_mac_set_rts(arvif, rts);
ar_iter->ret = ath10k_wmi_vdev_set_param(ar_iter->ar, arvif->vdev_id,
WMI_VDEV_PARAM_RTS_THRESHOLD,
rts);
if (ar_iter->ret) if (ar_iter->ret)
ath10k_warn("Failed to set RTS threshold for VDEV: %d\n", ath10k_warn("Failed to set RTS threshold for VDEV: %d\n",
arvif->vdev_id); arvif->vdev_id);
...@@ -2764,7 +2775,6 @@ static void ath10k_set_frag_iter(void *data, u8 *mac, struct ieee80211_vif *vif) ...@@ -2764,7 +2775,6 @@ static void ath10k_set_frag_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
struct ath10k_generic_iter *ar_iter = data; struct ath10k_generic_iter *ar_iter = data;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
u32 frag = ar_iter->ar->hw->wiphy->frag_threshold; u32 frag = ar_iter->ar->hw->wiphy->frag_threshold;
int ret;
lockdep_assert_held(&arvif->ar->conf_mutex); lockdep_assert_held(&arvif->ar->conf_mutex);
...@@ -2775,15 +2785,7 @@ static void ath10k_set_frag_iter(void *data, u8 *mac, struct ieee80211_vif *vif) ...@@ -2775,15 +2785,7 @@ static void ath10k_set_frag_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
if (ar_iter->ar->state == ATH10K_STATE_RESTARTED) if (ar_iter->ar->state == ATH10K_STATE_RESTARTED)
return; return;
frag = clamp_t(u32, frag, ar_iter->ret = ath10k_mac_set_frag(arvif, frag);
ATH10K_FRAGMT_THRESHOLD_MIN,
ATH10K_FRAGMT_THRESHOLD_MAX);
ret = ath10k_wmi_vdev_set_param(ar_iter->ar, arvif->vdev_id,
WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
frag);
ar_iter->ret = ret;
if (ar_iter->ret) if (ar_iter->ret)
ath10k_warn("Failed to set frag threshold for VDEV: %d\n", ath10k_warn("Failed to set frag threshold for VDEV: %d\n",
arvif->vdev_id); arvif->vdev_id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment