> 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 <[email protected]> > --- > .../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
>
signature.asc
Description: PGP signature
