svn commit: r219441 - in head/sys/dev/ath/ath_hal: . ar5416 ar9002

Adrian Chadd adrian at FreeBSD.org
Thu Mar 10 02:09:06 UTC 2011


Author: adrian
Date: Thu Mar 10 02:09:06 2011
New Revision: 219441
URL: http://svn.freebsd.org/changeset/base/219441

Log:
  Introduce the Merlin PWDCLKIND workaround.
  
  This is something bus clock related from what I can gather. It is needed for
  the AR9220 based Ubiquiti SR71-12 and SR71-15 Mini-PCI NICs.
  
  (Note: those NICs don't work right now because of earlier changes to handle
  power table offset correctly. That'll be resolved in a follow-up commit.)

Modified:
  head/sys/dev/ath/ath_hal/ah_eeprom.h
  head/sys/dev/ath/ath_hal/ah_eeprom_v14.c
  head/sys/dev/ath/ath_hal/ah_eeprom_v14.h
  head/sys/dev/ath/ath_hal/ar5416/ar5416.h
  head/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c

Modified: head/sys/dev/ath/ath_hal/ah_eeprom.h
==============================================================================
--- head/sys/dev/ath/ath_hal/ah_eeprom.h	Thu Mar 10 01:02:53 2011	(r219440)
+++ head/sys/dev/ath/ath_hal/ah_eeprom.h	Thu Mar 10 02:09:06 2011	(r219441)
@@ -100,7 +100,8 @@ enum {
 	AR_EEP_ANTGAINMAX_5,	/* int8_t* */
 	AR_EEP_ANTGAINMAX_2,	/* int8_t* */
 	AR_EEP_WRITEPROTECT,	/* use ath_hal_eepromGetFlag */
-	AR_EEP_PWR_TABLE_OFFSET	/* int8_t* */
+	AR_EEP_PWR_TABLE_OFFSET,/* int8_t* */
+	AR_EEP_PWDCLKIND	/* uint8_t* */
 };
 
 typedef struct {

Modified: head/sys/dev/ath/ath_hal/ah_eeprom_v14.c
==============================================================================
--- head/sys/dev/ath/ath_hal/ah_eeprom_v14.c	Thu Mar 10 01:02:53 2011	(r219440)
+++ head/sys/dev/ath/ath_hal/ah_eeprom_v14.c	Thu Mar 10 02:09:06 2011	(r219441)
@@ -132,6 +132,12 @@ v14EepromGet(struct ath_hal *ah, int par
 		else
 			*(int8_t *) val = AR5416_PWR_TABLE_OFFSET_DB;
 		return HAL_OK;
+	case AR_EEP_PWDCLKIND:
+		if (IS_VERS(>=, AR5416_EEP_MINOR_VER_10)) {
+			*(uint8_t *) val = pBase->pwdclkind;
+			return HAL_OK;
+		}
+		return HAL_EIO;
 		
         default:
 		HALASSERT(0);

Modified: head/sys/dev/ath/ath_hal/ah_eeprom_v14.h
==============================================================================
--- head/sys/dev/ath/ath_hal/ah_eeprom_v14.h	Thu Mar 10 01:02:53 2011	(r219440)
+++ head/sys/dev/ath/ath_hal/ah_eeprom_v14.h	Thu Mar 10 02:09:06 2011	(r219441)
@@ -49,6 +49,7 @@
 #define AR5416_EEP_MINOR_VER_3		0x3
 #define AR5416_EEP_MINOR_VER_7		0x7
 #define AR5416_EEP_MINOR_VER_9		0x9
+#define AR5416_EEP_MINOR_VER_10		0xa
 #define AR5416_EEP_MINOR_VER_16		0x10
 #define AR5416_EEP_MINOR_VER_17		0x11
 #define AR5416_EEP_MINOR_VER_19		0x13

Modified: head/sys/dev/ath/ath_hal/ar5416/ar5416.h
==============================================================================
--- head/sys/dev/ath/ath_hal/ar5416/ar5416.h	Thu Mar 10 01:02:53 2011	(r219440)
+++ head/sys/dev/ath/ath_hal/ar5416/ar5416.h	Thu Mar 10 02:09:06 2011	(r219441)
@@ -105,6 +105,8 @@ struct ath_hal_5416 {
 	struct ar5416NfLimits nf_5g;
 
 	int		initPDADC;
+
+	int		ah_need_an_top2_fixup;	/* merlin or later chips that may need this workaround */
 };
 #define	AH5416(_ah)	((struct ath_hal_5416 *)(_ah))
 

Modified: head/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c
==============================================================================
--- head/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c	Thu Mar 10 01:02:53 2011	(r219440)
+++ head/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c	Thu Mar 10 02:09:06 2011	(r219441)
@@ -114,6 +114,7 @@ ar9280Attach(uint16_t devid, HAL_SOFTC s
 	HAL_STATUS ecode;
 	HAL_BOOL rfStatus;
 	int8_t pwr_table_offset;
+	uint8_t pwr;
 
 	HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
 	    __func__, sc, (void*) st, (void*) sh);
@@ -246,6 +247,20 @@ ar9280Attach(uint16_t devid, HAL_SOFTC s
 		goto bad;
 	}
 
+	/* Enable fixup for AR_AN_TOP2 if necessary */
+	/*
+	 * The v14 EEPROM layer returns HAL_EIO if PWDCLKIND isn't supported
+	 * by the EEPROM version.
+	 *
+	 * ath9k checks the EEPROM minor version is >= 0x0a here, instead of
+	 * the abstracted EEPROM access layer.
+	 */
+	ecode = ath_hal_eepromGet(ah, AR_EEP_PWDCLKIND, &pwr);
+	if (AR_SREV_MERLIN_20_OR_LATER(ah) && ecode == HAL_OK && pwr == 0) {
+		printf("[ath] enabling AN_TOP2_FIXUP\n");
+		AH5416(ah)->ah_need_an_top2_fixup = 1;
+	}
+
         /*
          * Check whether the power table offset isn't the default.
          * This can occur with eeprom minor V21 or greater on Merlin.
@@ -362,6 +377,8 @@ ar9280WriteIni(struct ath_hal *ah, const
 {
 	u_int modesIndex, freqIndex;
 	int regWrites = 0;
+	int i;
+	const HAL_INI_ARRAY *ia;
 
 	/* Setup the indices for the next set of register array writes */
 	/* XXX Ignore 11n dynamic mode on the AR5416 for the moment */
@@ -386,10 +403,33 @@ ar9280WriteIni(struct ath_hal *ah, const
 	OS_REG_WRITE(ah, AR_PHY(0), 0x00000007);
 	OS_REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC);
 
-	/* XXX Merlin ini fixups */
-	/* XXX Merlin 100us delay for shift registers */
+	/*
+	 * This is unwound because at the moment, there's a requirement
+	 * for Merlin (and later, perhaps) to have a specific bit fixed
+	 * in the AR_AN_TOP2 register before writing it.
+	 */
+	ia = &AH5212(ah)->ah_ini_modes;
+#if 0
 	regWrites = ath_hal_ini_write(ah, &AH5212(ah)->ah_ini_modes,
 	    modesIndex, regWrites);
+#endif
+	HALASSERT(modesIndex < ia->cols);
+	for (i = 0; i < ia->rows; i++) {
+		uint32_t reg = HAL_INI_VAL(ia, i, 0);
+		uint32_t val = HAL_INI_VAL(ia, i, modesIndex);
+
+		if (reg == AR_AN_TOP2 && AH5416(ah)->ah_need_an_top2_fixup)
+			val &= ~AR_AN_TOP2_PWDCLKIND;
+
+		OS_REG_WRITE(ah, reg, val);
+
+		/* Analog shift register delay seems needed for Merlin - PR kern/154220 */
+		if (reg >= 0x7800 && reg < 0x78a0)
+			OS_DELAY(100);
+
+		DMA_YIELD(regWrites);
+	}
+
 	if (AR_SREV_MERLIN_20_OR_LATER(ah)) {
 		regWrites = ath_hal_ini_write(ah, &AH9280(ah)->ah_ini_rxgain,
 		    modesIndex, regWrites);


More information about the svn-src-head mailing list