From 3cbd420a91f8bc3216a76afc8bae0a42fbd093dd Mon Sep 17 00:00:00 2001 From: Jakub Kicinski Date: Sun, 1 Feb 2015 11:18:40 +0100 Subject: [PATCH] fix setting cw values in hardware mac80211 passes integer cw_min and cw_max values while hardware registers should be programmed with the exponent Signed-off-by: Jakub Kicinski --- main.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/main.c b/main.c index 2f9aee8a..42d928ec 100644 --- a/main.c +++ b/main.c @@ -310,12 +310,18 @@ mt76_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue, const struct ieee80211_tx_queue_params *params) { struct mt76_dev *dev = hw->priv; + u8 cw_min = 5, cw_max = 10; u32 val; + if (params->cw_min) + cw_min = fls(params->cw_min); + if (params->cw_max) + cw_max = fls(params->cw_max); + val = MT76_SET(MT_EDCA_CFG_TXOP, params->txop) | MT76_SET(MT_EDCA_CFG_AIFSN, params->aifs) | - MT76_SET(MT_EDCA_CFG_CWMIN, params->cw_min) | - MT76_SET(MT_EDCA_CFG_CWMAX, params->cw_max); + MT76_SET(MT_EDCA_CFG_CWMIN, cw_min) | + MT76_SET(MT_EDCA_CFG_CWMAX, cw_max); mt76_wr(dev, MT_EDCA_CFG_AC(queue), val); val = mt76_rr(dev, MT_WMM_TXOP(queue)); @@ -330,12 +336,12 @@ mt76_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue, val = mt76_rr(dev, MT_WMM_CWMIN); val &= ~(MT_WMM_CWMIN_MASK << MT_WMM_CWMIN_SHIFT(queue)); - val |= params->cw_min << MT_WMM_CWMIN_SHIFT(queue); + val |= cw_min << MT_WMM_CWMIN_SHIFT(queue); mt76_wr(dev, MT_WMM_CWMIN, val); val = mt76_rr(dev, MT_WMM_CWMAX); val &= ~(MT_WMM_CWMAX_MASK << MT_WMM_CWMAX_SHIFT(queue)); - val |= params->cw_max << MT_WMM_CWMAX_SHIFT(queue); + val |= cw_max << MT_WMM_CWMAX_SHIFT(queue); mt76_wr(dev, MT_WMM_CWMAX, val); return 0;