iwlwifi: correctly set the NMI register
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Wed, 7 Jan 2015 14:44:06 +0000 (16:44 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Thu, 22 Jan 2015 15:54:05 +0000 (17:54 +0200)
When we want to trigger an NMI in the device, we need to set
bit 7 and not bit 0. However, older firmwares don't register
to the interrupt issued by bit 7. Use bit 7 first so that
the correct interrupt will be issued hoping that the firmware
will react. To be on the safe side, set bit 0 in case the
firmware didn't register to the proper interrupt.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/iwl-io.c
drivers/net/wireless/iwlwifi/iwl-prph.h

index 7a2cbf6..03250a4 100644 (file)
@@ -193,11 +193,15 @@ void iwl_force_nmi(struct iwl_trans *trans)
         * DEVICE_SET_NMI_8000B_REG - is used.
         */
        if ((trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) ||
-           (CSR_HW_REV_STEP(trans->hw_rev) == SILICON_A_STEP))
-               iwl_write_prph(trans, DEVICE_SET_NMI_REG, DEVICE_SET_NMI_VAL);
-       else
+           (CSR_HW_REV_STEP(trans->hw_rev) == SILICON_A_STEP)) {
+               iwl_write_prph(trans, DEVICE_SET_NMI_REG,
+                              DEVICE_SET_NMI_VAL_DRV);
+               iwl_write_prph(trans, DEVICE_SET_NMI_REG,
+                              DEVICE_SET_NMI_VAL_HW);
+       } else {
                iwl_write_prph(trans, DEVICE_SET_NMI_8000B_REG,
                               DEVICE_SET_NMI_8000B_VAL);
+       }
 }
 IWL_EXPORT_SYMBOL(iwl_force_nmi);
 
index 387a5aa..b21fcf0 100644 (file)
 
 /* Device NMI register */
 #define DEVICE_SET_NMI_REG 0x00a01c30
-#define DEVICE_SET_NMI_VAL 0x1
+#define DEVICE_SET_NMI_VAL_HW BIT(0)
+#define DEVICE_SET_NMI_VAL_DRV BIT(7)
 #define DEVICE_SET_NMI_8000B_REG 0x00a01c24
 #define DEVICE_SET_NMI_8000B_VAL 0x1000000