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
