diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-trans-pcie.c')
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-trans-pcie.c | 33 | 
1 files changed, 17 insertions, 16 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c index da3411057af..ce918980e97 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c +++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c @@ -990,29 +990,16 @@ static int iwl_trans_tx_stop(struct iwl_trans *trans)  	return 0;  } -static void iwl_trans_pcie_disable_sync_irq(struct iwl_trans *trans) +static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)  {  	unsigned long flags; -	struct iwl_trans_pcie *trans_pcie = -		IWL_TRANS_GET_PCIE_TRANS(trans); +	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); +	/* tell the device to stop sending interrupts */  	spin_lock_irqsave(&trans->shrd->lock, flags);  	iwl_disable_interrupts(trans);  	spin_unlock_irqrestore(&trans->shrd->lock, flags); -	/* wait to make sure we flush pending tasklet*/ -	synchronize_irq(bus(trans)->irq); -	tasklet_kill(&trans_pcie->irq_tasklet); -} - -static void iwl_trans_pcie_stop_device(struct iwl_trans *trans) -{ -	/* stop and reset the on-board processor */ -	iwl_write32(bus(trans), CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET); - -	/* tell the device to stop sending interrupts */ -	iwl_trans_pcie_disable_sync_irq(trans); -  	/* device going down, Stop using ICT table */  	iwl_disable_ict(trans); @@ -1039,6 +1026,20 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)  	/* Stop the device, and put it in low power state */  	iwl_apm_stop(priv(trans)); + +	/* Upon stop, the APM issues an interrupt if HW RF kill is set. +	 * Clean again the interrupt here +	 */ +	spin_lock_irqsave(&trans->shrd->lock, flags); +	iwl_disable_interrupts(trans); +	spin_unlock_irqrestore(&trans->shrd->lock, flags); + +	/* wait to make sure we flush pending tasklet*/ +	synchronize_irq(bus(trans)->irq); +	tasklet_kill(&trans_pcie->irq_tasklet); + +	/* stop and reset the on-board processor */ +	iwl_write32(bus(trans), CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET);  }  static int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,  |