> mac .start(), .stop() callbacks are never called concurrently with other > mac 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 <sgruszka@xxxxxxxxxx> > --- > .../net/wireless/mediatek/mt76/mt76x0/pci.c | 6 ----- > .../net/wireless/mediatek/mt76/mt76x0/usb.c | 22 +++++-------------- > .../wireless/mediatek/mt76/mt76x2/pci_main.c | 5 ----- > .../wireless/mediatek/mt76/mt76x2/usb_main.c | 10 ++------- > 4 files changed, 7 insertions(+), 36 deletions(-) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c > index 156d3d064ba0..ac979128386a 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c > +++ b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c > @@ -25,8 +25,6 @@ static int mt76x0e_start(struct ieee80211_hw *hw) > { > struct mt76x02_dev *dev = hw->priv; > > - mutex_lock(&dev->mt76.mutex); > - > mt76x02_mac_start(dev); > mt76x0_phy_calibrate(dev, true); > ieee80211_queue_delayed_work(dev->mt76.hw, &dev->mac_work, > @@ -35,8 +33,6 @@ static int mt76x0e_start(struct ieee80211_hw *hw) > MT_CALIBRATE_INTERVAL); > set_bit(MT76_STATE_RUNNING, &dev->mt76.state); > > - mutex_unlock(&dev->mt76.mutex); > - > return 0; > } > > @@ -62,10 +58,8 @@ static void mt76x0e_stop(struct ieee80211_hw *hw) > { > struct mt76x02_dev *dev = hw->priv; > > - mutex_lock(&dev->mt76.mutex); > clear_bit(MT76_STATE_RUNNING, &dev->mt76.state); > mt76x0e_stop_hw(dev); > - mutex_unlock(&dev->mt76.mutex); > } > > static void [..] > static const struct ieee80211_ops mt76x0u_ops = { > diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c > index 16dc8e2451b5..1b5caabebff5 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c > +++ b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c > @@ -22,8 +22,6 @@ mt76x2_start(struct ieee80211_hw *hw) > struct mt76x02_dev *dev = hw->priv; > int ret; > > - mutex_lock(&dev->mt76.mutex); > - > ret = mt76x2_mac_start(dev); > if (ret) > goto out; You can remove goto here and just return ret (same below) > @@ -40,7 +38,6 @@ mt76x2_start(struct ieee80211_hw *hw) > set_bit(MT76_STATE_RUNNING, &dev->mt76.state); > > out: > - mutex_unlock(&dev->mt76.mutex); > return ret; > } > > @@ -49,10 +46,8 @@ mt76x2_stop(struct ieee80211_hw *hw) > { > struct mt76x02_dev *dev = hw->priv; > > - mutex_lock(&dev->mt76.mutex); > clear_bit(MT76_STATE_RUNNING, &dev->mt76.state); > mt76x2_stop_hardware(dev); > - mutex_unlock(&dev->mt76.mutex); > } > > static int > diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c > index 0771de210c6a..32726b4906ea 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c > +++ b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c > @@ -21,30 +21,24 @@ static int mt76x2u_start(struct ieee80211_hw *hw) > struct mt76x02_dev *dev = hw->priv; > int ret; > > - mutex_lock(&dev->mt76.mutex); > - > ret = mt76x2u_mac_start(dev); > if (ret) > - goto out; > + return ret; > > ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mac_work, > MT_MAC_WORK_INTERVAL); > set_bit(MT76_STATE_RUNNING, &dev->mt76.state); > > -out: > - mutex_unlock(&dev->mt76.mutex); > - return ret; > + return 0; > } > > static void mt76x2u_stop(struct ieee80211_hw *hw) > { > struct mt76x02_dev *dev = hw->priv; > > - mutex_lock(&dev->mt76.mutex); > clear_bit(MT76_STATE_RUNNING, &dev->mt76.state); > mt76u_stop_tx(&dev->mt76); > mt76x2u_stop_hw(dev); > - mutex_unlock(&dev->mt76.mutex); > } > > static int > -- > 2.20.1 >
Attachment:
signature.asc
Description: PGP signature