summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/ath/ath_hal/ah.h2
-rw-r--r--sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c17
-rw-r--r--sys/dev/ath/if_ath.c2
3 files changed, 21 insertions, 0 deletions
diff --git a/sys/dev/ath/ath_hal/ah.h b/sys/dev/ath/ath_hal/ah.h
index a5d9156..1919c0f 100644
--- a/sys/dev/ath/ath_hal/ah.h
+++ b/sys/dev/ath/ath_hal/ah.h
@@ -810,6 +810,8 @@ struct ath_hal {
uint16_t *ah_eepromdata; /* eeprom buffer, if needed */
+ uint32_t ah_intrstate[8]; /* last int state */
+
HAL_OPS_CONFIG ah_config;
const HAL_RATE_TABLE *__ahdecl(*ah_getRateTable)(struct ath_hal *,
u_int mode);
diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c b/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c
index 3bc2cc5..35511ae 100644
--- a/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c
+++ b/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c
@@ -70,6 +70,13 @@ ar5416GetPendingInterrupts(struct ath_hal *ah, HAL_INT *masked)
uint32_t isr, isr0, isr1, sync_cause = 0;
HAL_CAPABILITIES *pCap = &AH_PRIVATE(ah)->ah_caps;
+#ifdef AH_INTERRUPT_DEBUGGING
+ /*
+ * Blank the interrupt debugging area regardless.
+ */
+ bzero(&ah->ah_intrstate, sizeof(ah->ah_intrstate));
+#endif
+
/*
* Verify there's a mac interrupt and the RTC is on.
*/
@@ -90,6 +97,16 @@ ar5416GetPendingInterrupts(struct ath_hal *ah, HAL_INT *masked)
return AH_FALSE;
}
+#ifdef AH_INTERRUPT_DEBUGGING
+ ah->ah_intrstate[0] = isr;
+ ah->ah_intrstate[1] = OS_REG_READ(ah, AR_ISR_S0);
+ ah->ah_intrstate[2] = OS_REG_READ(ah, AR_ISR_S1);
+ ah->ah_intrstate[3] = OS_REG_READ(ah, AR_ISR_S2);
+ ah->ah_intrstate[4] = OS_REG_READ(ah, AR_ISR_S3);
+ ah->ah_intrstate[5] = OS_REG_READ(ah, AR_ISR_S4);
+ ah->ah_intrstate[6] = OS_REG_READ(ah, AR_ISR_S5);
+#endif
+
if (isr != 0) {
struct ath_hal_5212 *ahp = AH5212(ah);
uint32_t mask2;
diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c
index 210b965..ac2dd2a 100644
--- a/sys/dev/ath/if_ath.c
+++ b/sys/dev/ath/if_ath.c
@@ -1376,6 +1376,7 @@ ath_intr(void *arg)
ath_hal_getisr(ah, &status); /* NB: clears ISR too */
DPRINTF(sc, ATH_DEBUG_INTR, "%s: status 0x%x\n", __func__, status);
CTR1(ATH_KTR_INTR, "ath_intr: mask=0x%.8x", status);
+#ifdef ATH_KTR_INTR_DEBUG
CTR5(ATH_KTR_INTR,
"ath_intr: ISR=0x%.8x, ISR_S0=0x%.8x, ISR_S1=0x%.8x, ISR_S2=0x%.8x, ISR_S5=0x%.8x",
ah->ah_intrstate[0],
@@ -1383,6 +1384,7 @@ ath_intr(void *arg)
ah->ah_intrstate[2],
ah->ah_intrstate[3],
ah->ah_intrstate[6]);
+#endif
status &= sc->sc_imask; /* discard unasked for bits */
/* Short-circuit un-handled interrupts */
OpenPOWER on IntegriCloud