svn commit: r227052 - user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416

Adrian Chadd adrian at FreeBSD.org
Thu Nov 3 05:27:20 UTC 2011


Author: adrian
Date: Thu Nov  3 05:27:19 2011
New Revision: 227052
URL: http://svn.freebsd.org/changeset/base/227052

Log:
  Some reset path changes, just to unify things with the Atheros HAL.
  
  * If the MAC is asleep, force it awake and _stay_ awake whilst the reset
    is done. Otherwise it may go back to sleep during the reset phase.
    This won't happen at the moment since people aren't (shouldn't!) be using
    MAC power saving in my 11n branch.
  
  * Add some further comments to describe what's going on.
  
  Obtained from:	Atheros

Modified:
  user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c

Modified: user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c	Thu Nov  3 05:08:24 2011	(r227051)
+++ user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c	Thu Nov  3 05:27:19 2011	(r227052)
@@ -1209,6 +1209,13 @@ ar5416PhyDisable(struct ath_hal *ah)
 HAL_BOOL
 ar5416SetResetReg(struct ath_hal *ah, uint32_t type)
 {
+
+	/*
+	 * Set force wake
+	 */
+	OS_REG_WRITE(ah, AR_RTC_FORCE_WAKE,
+	    AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT);
+
 	switch (type) {
 	case HAL_RESET_POWER_ON:
 		return ar5416SetResetPowerOn(ah);
@@ -1239,10 +1246,16 @@ ar5416SetResetPowerOn(struct ath_hal *ah
             AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT);    
 
     /*
-     * RTC reset and clear
+     * PowerOn reset can be used in open loop power control or failure recovery.
+     * If we do RTC reset while DMA is still running, hardware may corrupt memory.
+     * Therefore, we need to reset AHB first to stop DMA.
      */
     if (! AR_SREV_HOWL(ah))
     	OS_REG_WRITE(ah, AR_RC, AR_RC_AHB);
+
+    /*
+     * RTC reset and clear
+     */
     OS_REG_WRITE(ah, AR_RTC_RESET, 0);
     OS_DELAY(20);
 
@@ -1293,6 +1306,11 @@ ar5416SetReset(struct ath_hal *ah, int t
 #endif	/* AH_SUPPORT_AR9130 */
         /*
          * Reset AHB
+	 *
+	 * (In case the last interrupt source was a bus timeout.)
+	 * XXX TODO: this is not the way to do it! It should be recorded
+	 * XXX by the interrupt handler and passed _into_ the
+	 * XXX reset path routine so this occurs.
          */
         tmpReg = OS_REG_READ(ah, AR_INTR_SYNC_CAUSE);
         if (tmpReg & (AR_INTR_SYNC_LOCAL_TIMEOUT|AR_INTR_SYNC_RADM_CPL_TIMEOUT)) {


More information about the svn-src-user mailing list