| From 53b7699cf27edf796c35be0b2730214213a28e29 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 7 Oct 2019 12:32:14 +0200 |
| Subject: mt76: add missing locking around ampdu action |
| |
| From: Felix Fietkau <nbd@nbd.name> |
| |
| [ Upstream commit 1a817fa73c3b27a593aadf0029de24db1bbc1a3e ] |
| |
| This is needed primarily to avoid races in dealing with rx aggregation |
| related data structures |
| |
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/wireless/mediatek/mt76/mt7603/main.c | 2 ++ |
| drivers/net/wireless/mediatek/mt76/mt7615/main.c | 2 ++ |
| drivers/net/wireless/mediatek/mt76/mt76x02_util.c | 2 ++ |
| 3 files changed, 6 insertions(+) |
| |
| diff --git a/drivers/net/wireless/mediatek/mt76/mt7603/main.c b/drivers/net/wireless/mediatek/mt76/mt7603/main.c |
| index 25d5b1608bc91..0a5695c3d9241 100644 |
| --- a/drivers/net/wireless/mediatek/mt76/mt7603/main.c |
| +++ b/drivers/net/wireless/mediatek/mt76/mt7603/main.c |
| @@ -561,6 +561,7 @@ mt7603_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
| |
| mtxq = (struct mt76_txq *)txq->drv_priv; |
| |
| + mutex_lock(&dev->mt76.mutex); |
| switch (action) { |
| case IEEE80211_AMPDU_RX_START: |
| mt76_rx_aggr_start(&dev->mt76, &msta->wcid, tid, ssn, |
| @@ -590,6 +591,7 @@ mt7603_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
| ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); |
| break; |
| } |
| + mutex_unlock(&dev->mt76.mutex); |
| |
| return 0; |
| } |
| diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c b/drivers/net/wireless/mediatek/mt76/mt7615/main.c |
| index 87c748715b5d7..38183aef0eb92 100644 |
| --- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c |
| +++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c |
| @@ -455,6 +455,7 @@ mt7615_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
| |
| mtxq = (struct mt76_txq *)txq->drv_priv; |
| |
| + mutex_lock(&dev->mt76.mutex); |
| switch (action) { |
| case IEEE80211_AMPDU_RX_START: |
| mt76_rx_aggr_start(&dev->mt76, &msta->wcid, tid, ssn, |
| @@ -485,6 +486,7 @@ mt7615_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
| ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); |
| break; |
| } |
| + mutex_unlock(&dev->mt76.mutex); |
| |
| return 0; |
| } |
| diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c |
| index aec73a0295e86..de0d6f21c621c 100644 |
| --- a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c |
| +++ b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c |
| @@ -371,6 +371,7 @@ int mt76x02_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
| |
| mtxq = (struct mt76_txq *)txq->drv_priv; |
| |
| + mutex_lock(&dev->mt76.mutex); |
| switch (action) { |
| case IEEE80211_AMPDU_RX_START: |
| mt76_rx_aggr_start(&dev->mt76, &msta->wcid, tid, |
| @@ -400,6 +401,7 @@ int mt76x02_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
| ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); |
| break; |
| } |
| + mutex_unlock(&dev->mt76.mutex); |
| |
| return 0; |
| } |
| -- |
| 2.25.1 |
| |