Search Linux Wireless

Re: [PATCH 04/14] iwlwifi: cancel scan when down the device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 2010-09-10 at 07:26 -0700, Stanislaw Gruszka wrote:
> Always cancel scan when stooping device and scan is currently pending,
> we should newer have scan running after down device.
> 
> To assure we start scan cancel from restart work we have to schedule
> abort_scan to different workqueue than priv->workqueue.
> 
> Patch fix not cancel scanning when restarting firmware, what is
> one of the causes of wdev_cleanup_work warning (together with permanent
> network connection lost) reported at
> https://bugzilla.redhat.com/show_bug.cgi?id=593566
> 
> Signed-off-by: Stanislaw Gruszka <sgruszka@xxxxxxxxxx>
Acked-by: Wey-Yi W Guy <wey-yi.w.guy@xxxxxxxxx>
> ---
>  drivers/net/wireless/iwlwifi/iwl-agn.c      |   14 +++-----------
>  drivers/net/wireless/iwlwifi/iwl-scan.c     |    2 +-
>  drivers/net/wireless/iwlwifi/iwl3945-base.c |   16 ++++------------
>  3 files changed, 8 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
> index c8a2ec8..25b3540 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-agn.c
> +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
> @@ -2891,8 +2891,9 @@ static void __iwl_down(struct iwl_priv *priv)
>  
>  	IWL_DEBUG_INFO(priv, DRV_NAME " is going down\n");
>  
> -	if (!exit_pending)
> -		set_bit(STATUS_EXIT_PENDING, &priv->status);
> +	iwl_scan_cancel_timeout(priv, 200);
> +
> +	exit_pending = test_and_set_bit(STATUS_EXIT_PENDING, &priv->status);
>  
>  	/* Stop TX queues watchdog. We need to have STATUS_EXIT_PENDING bit set
>  	 * to prevent rearm timer */
> @@ -3502,15 +3503,6 @@ static void iwl_mac_stop(struct ieee80211_hw *hw)
>  
>  	priv->is_open = 0;
>  
> -	if (iwl_is_ready_rf(priv) || test_bit(STATUS_SCAN_HW, &priv->status)) {
> -		/* stop mac, cancel any scan request and clear
> -		 * RXON_FILTER_ASSOC_MSK BIT
> -		 */
> -		mutex_lock(&priv->mutex);
> -		iwl_scan_cancel_timeout(priv, 100);
> -		mutex_unlock(&priv->mutex);
> -	}
> -
>  	iwl_down(priv);
>  
>  	flush_workqueue(priv->workqueue);
> diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
> index 22bdc98..ea33849 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-scan.c
> +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
> @@ -71,7 +71,7 @@ int iwl_scan_cancel(struct iwl_priv *priv)
>  	if (test_bit(STATUS_SCANNING, &priv->status)) {
>  		if (!test_and_set_bit(STATUS_SCAN_ABORTING, &priv->status)) {
>  			IWL_DEBUG_SCAN(priv, "Queuing scan abort.\n");
> -			queue_work(priv->workqueue, &priv->abort_scan);
> +			schedule_work(&priv->abort_scan);
>  
>  		} else
>  			IWL_DEBUG_SCAN(priv, "Scan abort already in progress.\n");
> diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
> index 3b3686b..fb894d8 100644
> --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
> +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
> @@ -2568,12 +2568,13 @@ static void iwl3945_cancel_deferred_work(struct iwl_priv *priv);
>  static void __iwl3945_down(struct iwl_priv *priv)
>  {
>  	unsigned long flags;
> -	int exit_pending = test_bit(STATUS_EXIT_PENDING, &priv->status);
> +	int exit_pending;
>  
>  	IWL_DEBUG_INFO(priv, DRV_NAME " is going down\n");
>  
> -	if (!exit_pending)
> -		set_bit(STATUS_EXIT_PENDING, &priv->status);
> +	iwl_scan_cancel_timeout(priv, 200);
> +
> +	exit_pending = test_and_set_bit(STATUS_EXIT_PENDING, &priv->status);
>  
>  	/* Stop TX queues watchdog. We need to have STATUS_EXIT_PENDING bit set
>  	 * to prevent rearm timer */
> @@ -3173,15 +3174,6 @@ static void iwl3945_mac_stop(struct ieee80211_hw *hw)
>  
>  	priv->is_open = 0;
>  
> -	if (iwl_is_ready_rf(priv)) {
> -		/* stop mac, cancel any scan request and clear
> -		 * RXON_FILTER_ASSOC_MSK BIT
> -		 */
> -		mutex_lock(&priv->mutex);
> -		iwl_scan_cancel_timeout(priv, 100);
> -		mutex_unlock(&priv->mutex);
> -	}
> -
>  	iwl3945_down(priv);
>  
>  	flush_workqueue(priv->workqueue);

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux