This patch doesn't apply to the .37 stable tree.
If someone wants it applied there, please email the backport
to [email protected]

thanks,

greg k-h

> commit: ea888357ec005abffb95acee2e61aac68dff429c
> From: Stanislaw Gruszka <[email protected]>
> Date: Tue, 25 Jan 2011 14:15:12 +0100
> Subject: [PATCH] ath9k_htc: fix race conditions when stop device
> 
> We do not kill any scheduled tasklets when stopping device, that may
> cause usage of resources after free. Disable interrupts, kill tasklets
> and then works in correct order.
> 
> Cc: [email protected]
> Tested-by: Sujith <[email protected]>
> Signed-off-by: Stanislaw Gruszka <[email protected]>
> Signed-off-by: John W. Linville <[email protected]>
> ---
>  drivers/net/wireless/ath/ath9k/htc_drv_init.c |    3 ---
>  drivers/net/wireless/ath/ath9k/htc_drv_main.c |   21 +++++++++++++++------
>  2 files changed, 15 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c 
> b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
> index 38433f9..0352f09 100644
> --- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
> +++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
> @@ -142,9 +142,6 @@ static void ath9k_deinit_priv(struct ath9k_htc_priv *priv)
>  {
>       ath9k_htc_exit_debug(priv->ah);
>       ath9k_hw_deinit(priv->ah);
> -     tasklet_kill(&priv->swba_tasklet);
> -     tasklet_kill(&priv->rx_tasklet);
> -     tasklet_kill(&priv->tx_tasklet);
>       kfree(priv->ah);
>       priv->ah = NULL;
>  }
> diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c 
> b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
> index f4d576b..6bb5995 100644
> --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
> +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
> @@ -1025,12 +1025,6 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)
>       int ret = 0;
>       u8 cmd_rsp;
>  
> -     /* Cancel all the running timers/work .. */
> -     cancel_work_sync(&priv->fatal_work);
> -     cancel_work_sync(&priv->ps_work);
> -     cancel_delayed_work_sync(&priv->ath9k_led_blink_work);
> -     ath9k_led_stop_brightness(priv);
> -
>       mutex_lock(&priv->mutex);
>  
>       if (priv->op_flags & OP_INVALID) {
> @@ -1044,8 +1038,23 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)
>       WMI_CMD(WMI_DISABLE_INTR_CMDID);
>       WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
>       WMI_CMD(WMI_STOP_RECV_CMDID);
> +
> +     tasklet_kill(&priv->swba_tasklet);
> +     tasklet_kill(&priv->rx_tasklet);
> +     tasklet_kill(&priv->tx_tasklet);
> +
>       skb_queue_purge(&priv->tx_queue);
>  
> +     mutex_unlock(&priv->mutex);
> +
> +     /* Cancel all the running timers/work .. */
> +     cancel_work_sync(&priv->fatal_work);
> +     cancel_work_sync(&priv->ps_work);
> +     cancel_delayed_work_sync(&priv->ath9k_led_blink_work);
> +     ath9k_led_stop_brightness(priv);
> +
> +     mutex_lock(&priv->mutex);
> +
>       /* Remove monitor interface here */
>       if (ah->opmode == NL80211_IFTYPE_MONITOR) {
>               if (ath9k_htc_remove_monitor_interface(priv))
> 
> _______________________________________________
> stable mailing list
> [email protected]
> http://linux.kernel.org/mailman/listinfo/stable

_______________________________________________
stable mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/stable

Reply via email to