aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Chadd <adrian@FreeBSD.org>2011-11-08 22:50:28 +0000
committerAdrian Chadd <adrian@FreeBSD.org>2011-11-08 22:50:28 +0000
commit31fdf3d6d27e50d8074ce4eae4366d175f461fd9 (patch)
treee48212686266192ed8e1ee9e9a1f3358d0ab8477
parenteb6f0de09db233bf9b4b75b7aa79d9319b5fc7c1 (diff)
downloadsrc-31fdf3d6d27e50d8074ce4eae4366d175f461fd9.tar.gz
src-31fdf3d6d27e50d8074ce4eae4366d175f461fd9.zip
Fix the KTR option to compile by default - it was referencing
some unmerged interrupt status debugging code from my branch. * Add ah_intrstate[8] which will have the record of the last call to ath_hal_getintr(). * Wrap the KTR code behind ATH_KTR_INTR_DEBUG. * Add the HAL interrupt debugging behind AH_INTERRUPT_DEBUGGING. This is only done for the AR5416 and later NICs but it will be trivial to add to the earlier NICs if required. Neither are enabled by default, although to minimise HAL binary API differences, the ah_intrstate[] array is always compiled into the ath_hal struct.
Notes
Notes: svn path=/head/; revision=227365
-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 a5d915675a95..1919c0f1eee7 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 3bc2cc56e561..35511ae42cbd 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 210b96503b36..ac2dd2aa76f3 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 */