|
@@ -1210,6 +1210,8 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
|
|
|
iwl_disable_interrupts(trans);
|
|
|
spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
|
|
|
|
|
|
+ iwl_enable_rfkill_int(trans);
|
|
|
+
|
|
|
/* wait to make sure we flush pending tasklet*/
|
|
|
synchronize_irq(trans_pcie->irq);
|
|
|
tasklet_kill(&trans_pcie->irq_tasklet);
|
|
@@ -1436,24 +1438,37 @@ error:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static void iwl_trans_pcie_stop_hw(struct iwl_trans *trans)
|
|
|
+static void iwl_trans_pcie_stop_hw(struct iwl_trans *trans,
|
|
|
+ bool op_mode_leaving)
|
|
|
{
|
|
|
bool hw_rfkill;
|
|
|
+ unsigned long flags;
|
|
|
+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
|
|
|
|
|
iwl_apm_stop(trans);
|
|
|
|
|
|
- iwl_write32(trans, CSR_INT, 0xFFFFFFFF);
|
|
|
+ spin_lock_irqsave(&trans_pcie->irq_lock, flags);
|
|
|
+ iwl_disable_interrupts(trans);
|
|
|
+ spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
|
|
|
|
|
|
- /* Even if we stop the HW, we still want the RF kill interrupt */
|
|
|
- iwl_enable_rfkill_int(trans);
|
|
|
+ iwl_write32(trans, CSR_INT, 0xFFFFFFFF);
|
|
|
|
|
|
- /*
|
|
|
- * Check again since the RF kill state may have changed while all the
|
|
|
- * interrupts were disabled, in this case we couldn't receive the
|
|
|
- * RF kill interrupt and update the state in the op_mode.
|
|
|
- */
|
|
|
- hw_rfkill = iwl_is_rfkill_set(trans);
|
|
|
- iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill);
|
|
|
+ if (!op_mode_leaving) {
|
|
|
+ /*
|
|
|
+ * Even if we stop the HW, we still want the RF kill
|
|
|
+ * interrupt
|
|
|
+ */
|
|
|
+ iwl_enable_rfkill_int(trans);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Check again since the RF kill state may have changed while
|
|
|
+ * all the interrupts were disabled, in this case we couldn't
|
|
|
+ * receive the RF kill interrupt and update the state in the
|
|
|
+ * op_mode.
|
|
|
+ */
|
|
|
+ hw_rfkill = iwl_is_rfkill_set(trans);
|
|
|
+ iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void iwl_trans_pcie_reclaim(struct iwl_trans *trans, int txq_id, int ssn,
|