> 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
> 

Attachment: signature.asc
Description: PGP signature

Reply via email to