Author: rpaulo
Date: Tue Jun  1 15:33:10 2010
New Revision: 208711
URL: http://svn.freebsd.org/changeset/base/208711

Log:
  Bring in a couple of fixes from the Linux ath9k related to chip hangs.
  While there, try to make the register write pattern look like what's
  done by ath9k.
  
  MFC after:    3 days

Modified:
  head/sys/dev/ath/ath_hal/ah.h
  head/sys/dev/ath/ath_hal/ah_eeprom_v4k.c
  head/sys/dev/ath/ath_hal/ah_eeprom_v4k.h
  head/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c
  head/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c
  head/sys/dev/ath/ath_hal/ar5416/ar5416phy.h
  head/sys/dev/ath/ath_hal/ar5416/ar5416reg.h
  head/sys/dev/ath/ath_hal/ar5416/ar9285_attach.c

Modified: head/sys/dev/ath/ath_hal/ah.h
==============================================================================
--- head/sys/dev/ath/ath_hal/ah.h       Tue Jun  1 15:24:19 2010        
(r208710)
+++ head/sys/dev/ath/ath_hal/ah.h       Tue Jun  1 15:33:10 2010        
(r208711)
@@ -324,6 +324,7 @@ typedef enum {
        HAL_INT_RXORN   = 0x00000020,
        HAL_INT_TX      = 0x00000040,   /* Non-common mapping */
        HAL_INT_TXDESC  = 0x00000080,
+       HAL_INT_TIM_TIMER= 0x00000100,
        HAL_INT_TXURN   = 0x00000800,
        HAL_INT_MIB     = 0x00001000,
        HAL_INT_RXPHY   = 0x00004000,

Modified: head/sys/dev/ath/ath_hal/ah_eeprom_v4k.c
==============================================================================
--- head/sys/dev/ath/ath_hal/ah_eeprom_v4k.c    Tue Jun  1 15:24:19 2010        
(r208710)
+++ head/sys/dev/ath/ath_hal/ah_eeprom_v4k.c    Tue Jun  1 15:33:10 2010        
(r208711)
@@ -38,11 +38,8 @@ v4kEepromGet(struct ath_hal *ah, int par
        int i;
 
        switch (param) {
-        case AR_EEP_NFTHRESH_5:
-               *(int16_t *)val = pModal[0].noiseFloorThreshCh[0];
-               return HAL_OK;
         case AR_EEP_NFTHRESH_2:
-               *(int16_t *)val = pModal[1].noiseFloorThreshCh[0];
+               *(int16_t *)val = pModal->noiseFloorThreshCh[0];
                return HAL_OK;
         case AR_EEP_MACADDR:           /* Get MAC Address */
                sum = 0;
@@ -67,14 +64,10 @@ v4kEepromGet(struct ath_hal *ah, int par
                return pBase->opCapFlags;
         case AR_EEP_RFSILENT:
                return pBase->rfSilent;
-       case AR_EEP_OB_5:
-               return pModal[CHAN_A_IDX].ob;
-       case AR_EEP_DB_5:
-               return pModal[CHAN_A_IDX].db;
        case AR_EEP_OB_2:
-               return pModal[CHAN_B_IDX].ob;
+               return pModal->ob;
        case AR_EEP_DB_2:
-               return pModal[CHAN_B_IDX].db;
+               return pModal->db;
        case AR_EEP_TXMASK:
                return pBase->txMask;
        case AR_EEP_RXMASK:
@@ -84,11 +77,9 @@ v4kEepromGet(struct ath_hal *ah, int par
        case AR_EEP_TXGAIN_TYPE:
                return IS_VERS(>=, AR5416_EEP_MINOR_VER_19) ?
                    pBase->txGainType : AR5416_EEP_TXGAIN_ORIG;
-#if 0
        case AR_EEP_OL_PWRCTRL:
                HALASSERT(val == AH_NULL);
-               return pBase->openLoopPwrCntl ?  HAL_OK : HAL_EIO;
-#endif
+               return HAL_EIO;
        case AR_EEP_AMODE:
                HALASSERT(val == AH_NULL);
                return pBase->opCapFlags & AR5416_OPFLAGS_11A ?
@@ -110,15 +101,11 @@ v4kEepromGet(struct ath_hal *ah, int par
        case AR_EEP_AES:
        case AR_EEP_BURST:
         case AR_EEP_RFKILL:
-       case AR_EEP_TURBO5DISABLE:
        case AR_EEP_TURBO2DISABLE:
                HALASSERT(val == AH_NULL);
                return HAL_OK;
        case AR_EEP_ANTGAINMAX_2:
-               *(int8_t *) val = ee->ee_antennaGainMax[1];
-               return HAL_OK;
-       case AR_EEP_ANTGAINMAX_5:
-               *(int8_t *) val = ee->ee_antennaGainMax[0];
+               *(int8_t *) val = ee->ee_antennaGainMax;
                return HAL_OK;
         default:
                HALASSERT(0);
@@ -136,10 +123,7 @@ v4kEepromSet(struct ath_hal *ah, int par
 
        switch (param) {
        case AR_EEP_ANTGAINMAX_2:
-               ee->ee_antennaGainMax[1] = (int8_t) v;
-               return HAL_OK;
-       case AR_EEP_ANTGAINMAX_5:
-               ee->ee_antennaGainMax[0] = (int8_t) v;
+               ee->ee_antennaGainMax = (int8_t) v;
                return HAL_OK;
        }
        return HAL_EINVAL;
@@ -252,7 +236,7 @@ v4kEepromReadCTLInfo(struct ath_hal *ah,
        RD_EDGES_POWER *rep = ee->ee_rdEdgesPower;
        int i, j;
        
-       HALASSERT(AR5416_NUM_CTLS <= sizeof(ee->ee_rdEdgesPower)/NUM_EDGES);
+       HALASSERT(AR5416_4K_NUM_CTLS <= sizeof(ee->ee_rdEdgesPower)/NUM_EDGES);
 
        for (i = 0; ee->ee_base.ctlIndex[i] != 0 && i < AR5416_4K_NUM_CTLS; 
i++) {
                for (j = 0; j < NUM_EDGES; j ++) {

Modified: head/sys/dev/ath/ath_hal/ah_eeprom_v4k.h
==============================================================================
--- head/sys/dev/ath/ath_hal/ah_eeprom_v4k.h    Tue Jun  1 15:24:19 2010        
(r208710)
+++ head/sys/dev/ath/ath_hal/ah_eeprom_v4k.h    Tue Jun  1 15:33:10 2010        
(r208711)
@@ -23,6 +23,8 @@
 #include "ah_eeprom.h"
 #include "ah_eeprom_v14.h"
 
+#define        AR9285_RDEXT_DEFAULT    0x1F
+
 #undef owl_eep_start_loc
 #ifdef __LINUX_ARM_ARCH__ /* AP71 */
 #define owl_eep_start_loc              0
@@ -150,6 +152,6 @@ typedef struct {
        uint16_t        ee_numCtls;
        RD_EDGES_POWER  ee_rdEdgesPower[NUM_EDGES*AR5416_4K_NUM_CTLS];
        /* XXX these are dynamically calculated for use by shared code */
-       int8_t          ee_antennaGainMax[2];
+       int8_t          ee_antennaGainMax;
 } HAL_EEPROM_v4k;
 #endif /* _AH_EEPROM_V4K_H_ */

Modified: head/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c
==============================================================================
--- head/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c Tue Jun  1 15:24:19 
2010        (r208710)
+++ head/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c Tue Jun  1 15:33:10 
2010        (r208711)
@@ -120,6 +120,13 @@ ar5416GetPendingInterrupts(struct ath_ha
                        ahp->ah_intrTxqs |= MS(isr1, AR_ISR_S1_QCU_TXEOL);
                }
 
+               if (AR_SREV_MERLIN(ah) || AR_SREV_KITE(ah)) {
+                       uint32_t isr5;
+                       isr5 = OS_REG_READ(ah, AR_ISR_S5_S);
+                       if (isr5 & AR_ISR_S5_TIM_TIMER)
+                               *masked |= HAL_INT_TIM_TIMER;
+               }
+
                /* Interrupt Mitigation on AR5416 */
 #ifdef AR5416_INT_MITIGATION
                if (isr & (AR_ISR_RXMINTR | AR_ISR_RXINTM))

Modified: head/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c
==============================================================================
--- head/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c      Tue Jun  1 15:24:19 
2010        (r208710)
+++ head/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c      Tue Jun  1 15:33:10 
2010        (r208711)
@@ -170,7 +170,16 @@ ar5416Reset(struct ath_hal *ah, HAL_OPMO
        OS_REG_WRITE(ah, AR_RSSI_THR, rssiThrReg);
 
        OS_MARK(ah, AH_MARK_RESET_LINE, __LINE__);
+       if (AR_SREV_MERLIN_10_OR_LATER(ah))
+               OS_REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE);
 
+       if (AR_SREV_KITE(ah)) {
+               uint32_t val;
+               val = OS_REG_READ(ah, AR_PHY_HEAVY_CLIP_FACTOR_RIFS);
+               val &= ~AR_PHY_RIFS_INIT_DELAY;
+               OS_REG_WRITE(ah, AR_PHY_HEAVY_CLIP_FACTOR_RIFS, val);
+       }
+       
        AH5416(ah)->ah_writeIni(ah, chan);
 
        /* Setup 11n MAC/Phy mode registers */
@@ -1019,8 +1028,11 @@ ar5416SetResetPowerOn(struct ath_hal *ah
     /*
      * RTC reset and clear
      */
+    OS_REG_WRITE(ah, AR_RC, AR_RC_AHB);
     OS_REG_WRITE(ah, AR_RTC_RESET, 0);
     OS_DELAY(20);
+    OS_REG_WRITE(ah, AR_RC, 0);
+
     OS_REG_WRITE(ah, AR_RTC_RESET, 1);
 
     /*

Modified: head/sys/dev/ath/ath_hal/ar5416/ar5416phy.h
==============================================================================
--- head/sys/dev/ath/ath_hal/ar5416/ar5416phy.h Tue Jun  1 15:24:19 2010        
(r208710)
+++ head/sys/dev/ath/ath_hal/ar5416/ar5416phy.h Tue Jun  1 15:33:10 2010        
(r208711)
@@ -111,6 +111,9 @@
 
 #define AR_PHY_HEAVY_CLIP_ENABLE    0x99E0
 
+#define AR_PHY_HEAVY_CLIP_FACTOR_RIFS  0x99ec
+#define AR_PHY_RIFS_INIT_DELAY         0x03ff0000
+
 #define AR_PHY_M_SLEEP      0x99f0      /* sleep control registers */
 #define AR_PHY_REFCLKDLY    0x99f4
 #define AR_PHY_REFCLKPD     0x99f8

Modified: head/sys/dev/ath/ath_hal/ar5416/ar5416reg.h
==============================================================================
--- head/sys/dev/ath/ath_hal/ar5416/ar5416reg.h Tue Jun  1 15:24:19 2010        
(r208710)
+++ head/sys/dev/ath/ath_hal/ar5416/ar5416reg.h Tue Jun  1 15:33:10 2010        
(r208711)
@@ -127,6 +127,7 @@
 #define        AR_EXTRCCNT             0x8328  /* extension channel rx clear 
count */
 #define        AR_SELFGEN_MASK         0x832c  /* rx and cal chain masks */
 #define        AR_PCU_TXBUF_CTRL       0x8340
+#define        AR_PCU_MISC_MODE2       0x8344
 
 /* DMA & PCI Registers in PCI space (usable during sleep)*/
 #define        AR_RC_AHB               0x00000001      /* AHB reset */
@@ -244,6 +245,10 @@
 #define        AR_ISR_S2_GTT           0x00800000      /* Global transmit 
timeout */
 #define        AR_ISR_S2_TSFOOR        0x40000000      /* RX TSF out of range 
*/
 
+#define        AR_ISR_S5               0x0098
+#define        AR_ISR_S5_S             0x00d8
+#define        AR_ISR_S5_TIM_TIMER     0x00000010
+
 #define        AR_INTR_SPURIOUS        0xffffffff
 #define        AR_INTR_RTC_IRQ         0x00000001      /* rtc in shutdown 
state */
 #define        AR_INTR_MAC_IRQ         0x00000002      /* pending mac 
interrupt */
@@ -495,6 +500,8 @@
 #define        AR_PCU_CLEAR_VMF                0x01000000 /* clear vmf mode 
(fast cc)*/
 #define        AR_PCU_CLEAR_BA_VALID           0x04000000 /* clear ba state */
 
+#define        AR_PCU_MISC_MODE2_HWWAR1        0x00100000
+
 /* GPIO Interrupt */
 #define        AR_INTR_GPIO            0x3FF00000      /* gpio interrupted */
 #define        AR_INTR_GPIO_S          20
@@ -521,6 +528,8 @@
 #define        AR_GPIO_INTR_POL_VAL    0x1FFF
 #define        AR_GPIO_INTR_POL_VAL_S  0
 
+#define        AR_GPIO_JTAG_DISABLE    0x00020000
+
 #define        AR_2040_JOINED_RX_CLEAR 0x00000001      /* use ctl + ext 
rx_clear for cca */
 
 #define        AR_PCU_TXBUF_CTRL_SIZE_MASK     0x7FF

Modified: head/sys/dev/ath/ath_hal/ar5416/ar9285_attach.c
==============================================================================
--- head/sys/dev/ath/ath_hal/ar5416/ar9285_attach.c     Tue Jun  1 15:24:19 
2010        (r208710)
+++ head/sys/dev/ath/ath_hal/ar5416/ar9285_attach.c     Tue Jun  1 15:33:10 
2010        (r208711)
@@ -316,6 +316,16 @@ ar9285WriteIni(struct ath_hal *ah, const
        regWrites = ath_hal_ini_write(ah, &AH5212(ah)->ah_ini_common,
            1, regWrites);
 
+       OS_REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT));
+
+       if (AR_SREV_MERLIN_10_OR_LATER(ah)) {
+               uint32_t val;
+               val = OS_REG_READ(ah, AR_PCU_MISC_MODE2) &
+                       (~AR_PCU_MISC_MODE2_HWWAR1);
+               OS_REG_WRITE(ah, AR_PCU_MISC_MODE2, val);
+               OS_REG_WRITE(ah, 0x9800 + (651 << 2), 0x11);
+       }
+
 }
 
 /*
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to