Skip to content

Commit 091a79f

Browse files
Stanislaw Gruszkanbd168
Stanislaw Gruszka
authored andcommitted
mt76: mt76x02: remove bogus mutex usage
mac80211 .start(), .stop() callbacks are never called concurrently with other callbacks. The only concurencly is with mt76 works which we cancel on stop() and schedule on start(). This fixes possible deadlock on cancel_delayed_work_sync(&dev->mac_work) as mac_work also take mutex. Signed-off-by: Stanislaw Gruszka <[email protected]> Signed-off-by: Felix Fietkau <[email protected]>
1 parent 39d501d commit 091a79f

File tree

4 files changed

+10
-41
lines changed

4 files changed

+10
-41
lines changed

drivers/net/wireless/mediatek/mt76/mt76x0/pci.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ static int mt76x0e_start(struct ieee80211_hw *hw)
2525
{
2626
struct mt76x02_dev *dev = hw->priv;
2727

28-
mutex_lock(&dev->mt76.mutex);
29-
3028
mt76x02_mac_start(dev);
3129
mt76x0_phy_calibrate(dev, true);
3230
ieee80211_queue_delayed_work(dev->mt76.hw, &dev->mt76.mac_work,
@@ -35,8 +33,6 @@ static int mt76x0e_start(struct ieee80211_hw *hw)
3533
MT_CALIBRATE_INTERVAL);
3634
set_bit(MT76_STATE_RUNNING, &dev->mt76.state);
3735

38-
mutex_unlock(&dev->mt76.mutex);
39-
4036
return 0;
4137
}
4238

@@ -62,10 +58,8 @@ static void mt76x0e_stop(struct ieee80211_hw *hw)
6258
{
6359
struct mt76x02_dev *dev = hw->priv;
6460

65-
mutex_lock(&dev->mt76.mutex);
6661
clear_bit(MT76_STATE_RUNNING, &dev->mt76.state);
6762
mt76x0e_stop_hw(dev);
68-
mutex_unlock(&dev->mt76.mutex);
6963
}
7064

7165
static void

drivers/net/wireless/mediatek/mt76/mt76x0/usb.c

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,10 @@ static void mt76x0u_cleanup(struct mt76x02_dev *dev)
8181
mt76u_queues_deinit(&dev->mt76);
8282
}
8383

84-
static void mt76x0u_mac_stop(struct mt76x02_dev *dev)
84+
static void mt76x0u_stop(struct ieee80211_hw *hw)
8585
{
86+
struct mt76x02_dev *dev = hw->priv;
87+
8688
clear_bit(MT76_STATE_RUNNING, &dev->mt76.state);
8789
cancel_delayed_work_sync(&dev->cal_work);
8890
cancel_delayed_work_sync(&dev->mt76.mac_work);
@@ -106,31 +108,17 @@ static int mt76x0u_start(struct ieee80211_hw *hw)
106108
struct mt76x02_dev *dev = hw->priv;
107109
int ret;
108110

109-
mutex_lock(&dev->mt76.mutex);
110-
111111
ret = mt76x0_mac_start(dev);
112112
if (ret)
113-
goto out;
113+
return ret;
114114

115115
mt76x0_phy_calibrate(dev, true);
116116
ieee80211_queue_delayed_work(dev->mt76.hw, &dev->mt76.mac_work,
117117
MT_MAC_WORK_INTERVAL);
118118
ieee80211_queue_delayed_work(dev->mt76.hw, &dev->cal_work,
119119
MT_CALIBRATE_INTERVAL);
120120
set_bit(MT76_STATE_RUNNING, &dev->mt76.state);
121-
122-
out:
123-
mutex_unlock(&dev->mt76.mutex);
124-
return ret;
125-
}
126-
127-
static void mt76x0u_stop(struct ieee80211_hw *hw)
128-
{
129-
struct mt76x02_dev *dev = hw->priv;
130-
131-
mutex_lock(&dev->mt76.mutex);
132-
mt76x0u_mac_stop(dev);
133-
mutex_unlock(&dev->mt76.mutex);
121+
return 0;
134122
}
135123

136124
static const struct ieee80211_ops mt76x0u_ops = {

drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,37 +22,30 @@ mt76x2_start(struct ieee80211_hw *hw)
2222
struct mt76x02_dev *dev = hw->priv;
2323
int ret;
2424

25-
mutex_lock(&dev->mt76.mutex);
26-
2725
ret = mt76x2_mac_start(dev);
2826
if (ret)
29-
goto out;
27+
return ret;
3028

3129
ret = mt76x2_phy_start(dev);
3230
if (ret)
33-
goto out;
31+
return ret;
3432

3533
ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mt76.mac_work,
3634
MT_MAC_WORK_INTERVAL);
3735
ieee80211_queue_delayed_work(mt76_hw(dev), &dev->wdt_work,
3836
MT_WATCHDOG_TIME);
3937

4038
set_bit(MT76_STATE_RUNNING, &dev->mt76.state);
41-
42-
out:
43-
mutex_unlock(&dev->mt76.mutex);
44-
return ret;
39+
return 0;
4540
}
4641

4742
static void
4843
mt76x2_stop(struct ieee80211_hw *hw)
4944
{
5045
struct mt76x02_dev *dev = hw->priv;
5146

52-
mutex_lock(&dev->mt76.mutex);
5347
clear_bit(MT76_STATE_RUNNING, &dev->mt76.state);
5448
mt76x2_stop_hardware(dev);
55-
mutex_unlock(&dev->mt76.mutex);
5649
}
5750

5851
static int

drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,30 +21,24 @@ static int mt76x2u_start(struct ieee80211_hw *hw)
2121
struct mt76x02_dev *dev = hw->priv;
2222
int ret;
2323

24-
mutex_lock(&dev->mt76.mutex);
25-
2624
ret = mt76x2u_mac_start(dev);
2725
if (ret)
28-
goto out;
26+
return ret;
2927

3028
ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mt76.mac_work,
3129
MT_MAC_WORK_INTERVAL);
3230
set_bit(MT76_STATE_RUNNING, &dev->mt76.state);
3331

34-
out:
35-
mutex_unlock(&dev->mt76.mutex);
36-
return ret;
32+
return 0;
3733
}
3834

3935
static void mt76x2u_stop(struct ieee80211_hw *hw)
4036
{
4137
struct mt76x02_dev *dev = hw->priv;
4238

43-
mutex_lock(&dev->mt76.mutex);
4439
clear_bit(MT76_STATE_RUNNING, &dev->mt76.state);
4540
mt76u_stop_tx(&dev->mt76);
4641
mt76x2u_stop_hw(dev);
47-
mutex_unlock(&dev->mt76.mutex);
4842
}
4943

5044
static int

0 commit comments

Comments
 (0)