mt7603: implement support for SMPS

The hardware needs to be notified of peers using dynamic SMPS mode
Fixes using dual-stream rates on some clients (e.g. Intel)

Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
Felix Fietkau
2019-01-20 17:46:51 +01:00
parent 158529d679
commit fc31457cd9
3 changed files with 18 additions and 0 deletions
+12
View File
@@ -201,6 +201,18 @@ void mt7603_filter_tx(struct mt7603_dev *dev, int idx, bool abort)
mt7603_wtbl_set_skip_tx(dev, idx, false); mt7603_wtbl_set_skip_tx(dev, idx, false);
} }
void mt7603_wtbl_set_smps(struct mt7603_dev *dev, struct mt7603_sta *sta,
bool enabled)
{
u32 addr = mt7603_wtbl1_addr(sta->wcid.idx);
if (sta->smps == enabled)
return;
mt76_rmw_field(dev, addr + 2 * 4, MT_WTBL1_W2_SMPS, enabled);
sta->smps = enabled;
}
void mt7603_wtbl_set_ps(struct mt7603_dev *dev, struct mt7603_sta *sta, void mt7603_wtbl_set_ps(struct mt7603_dev *dev, struct mt7603_sta *sta,
bool enabled) bool enabled)
{ {
+3
View File
@@ -359,6 +359,7 @@ mt7603_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
__skb_queue_head_init(&msta->psq); __skb_queue_head_init(&msta->psq);
msta->ps = ~0; msta->ps = ~0;
msta->smps = ~0;
msta->wcid.sta = 1; msta->wcid.sta = 1;
msta->wcid.idx = idx; msta->wcid.idx = idx;
mt7603_wtbl_init(dev, idx, mvif->idx, sta->addr); mt7603_wtbl_init(dev, idx, mvif->idx, sta->addr);
@@ -643,6 +644,8 @@ mt7603_sta_rate_tbl_update(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
msta->n_rates = i; msta->n_rates = i;
mt7603_wtbl_set_rates(dev, msta, NULL, msta->rates); mt7603_wtbl_set_rates(dev, msta, NULL, msta->rates);
msta->rate_probe = false; msta->rate_probe = false;
mt7603_wtbl_set_smps(dev, msta,
sta->smps_mode == IEEE80211_SMPS_DYNAMIC);
spin_unlock_bh(&dev->mt76.lock); spin_unlock_bh(&dev->mt76.lock);
} }
+3
View File
@@ -78,6 +78,7 @@ struct mt7603_sta {
u8 n_rates; u8 n_rates;
u8 rate_probe; u8 rate_probe;
u8 smps;
u8 ps; u8 ps;
}; };
@@ -235,6 +236,8 @@ int mt7603_wtbl_set_key(struct mt7603_dev *dev, int wcid,
struct ieee80211_key_conf *key); struct ieee80211_key_conf *key);
void mt7603_wtbl_set_ps(struct mt7603_dev *dev, struct mt7603_sta *sta, void mt7603_wtbl_set_ps(struct mt7603_dev *dev, struct mt7603_sta *sta,
bool enabled); bool enabled);
void mt7603_wtbl_set_smps(struct mt7603_dev *dev, struct mt7603_sta *sta,
bool enabled);
void mt7603_filter_tx(struct mt7603_dev *dev, int idx, bool abort); void mt7603_filter_tx(struct mt7603_dev *dev, int idx, bool abort);
int mt7603_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, int mt7603_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,