diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/hw.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 314 | 
1 files changed, 135 insertions, 179 deletions
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index c33f17dbe6f..8d291ccf5c8 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c @@ -23,11 +23,6 @@  #include "rc.h"  #include "ar9003_mac.h" -#define ATH9K_CLOCK_RATE_CCK		22 -#define ATH9K_CLOCK_RATE_5GHZ_OFDM	40 -#define ATH9K_CLOCK_RATE_2GHZ_OFDM	44 -#define ATH9K_CLOCK_FAST_RATE_5GHZ_OFDM 44 -  static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type);  MODULE_AUTHOR("Atheros Communications"); @@ -80,6 +75,15 @@ static void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah)  	ath9k_hw_private_ops(ah)->init_mode_gain_regs(ah);  } +static void ath9k_hw_ani_cache_ini_regs(struct ath_hw *ah) +{ +	/* You will not have this callback if using the old ANI */ +	if (!ath9k_hw_private_ops(ah)->ani_cache_ini_regs) +		return; + +	ath9k_hw_private_ops(ah)->ani_cache_ini_regs(ah); +} +  /********************/  /* Helper Functions */  /********************/ @@ -371,13 +375,7 @@ static void ath9k_hw_init_config(struct ath_hw *ah)  	ah->config.ofdm_trig_high = 500;  	ah->config.cck_trig_high = 200;  	ah->config.cck_trig_low = 100; - -	/* -	 * For now ANI is disabled for AR9003, it is still -	 * being tested. -	 */ -	if (!AR_SREV_9300_20_OR_LATER(ah)) -		ah->config.enable_ani = 1; +	ah->config.enable_ani = true;  	for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {  		ah->config.spurchans[i][0] = AR_NO_SPUR; @@ -390,12 +388,7 @@ static void ath9k_hw_init_config(struct ath_hw *ah)  		ah->config.ht_enable = 0;  	ah->config.rx_intr_mitigation = true; - -	/* -	 * Tx IQ Calibration (ah->config.tx_iq_calibration) is only -	 * used by AR9003, but it is showing reliability issues. -	 * It will take a while to fix so this is currently disabled. -	 */ +	ah->config.pcieSerDesWrite = true;  	/*  	 * We need this for PCI devices only (Cardbus, PCI, miniPCI) @@ -433,7 +426,9 @@ static void ath9k_hw_init_defaults(struct ath_hw *ah)  		ah->ah_flags = AH_USE_EEPROM;  	ah->atim_window = 0; -	ah->sta_id1_defaults = AR_STA_ID1_CRPT_MIC_ENABLE; +	ah->sta_id1_defaults = +		AR_STA_ID1_CRPT_MIC_ENABLE | +		AR_STA_ID1_MCAST_KSRCH;  	ah->beacon_interval = 100;  	ah->enable_32kHz_clock = DONT_USE_32KHZ;  	ah->slottime = (u32) -1; @@ -537,7 +532,8 @@ static int __ath9k_hw_init(struct ath_hw *ah)  	if (ah->config.serialize_regmode == SER_REG_MODE_AUTO) {  		if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI || -		    (AR_SREV_9280(ah) && !ah->is_pciexpress)) { +		    ((AR_SREV_9160(ah) || AR_SREV_9280(ah)) && +		     !ah->is_pciexpress)) {  			ah->config.serialize_regmode =  				SER_REG_MODE_ON;  		} else { @@ -571,28 +567,19 @@ static int __ath9k_hw_init(struct ath_hw *ah)  	ah->ani_function = ATH9K_ANI_ALL;  	if (AR_SREV_9280_10_OR_LATER(ah) && !AR_SREV_9300_20_OR_LATER(ah))  		ah->ani_function &= ~ATH9K_ANI_NOISE_IMMUNITY_LEVEL; +	if (!AR_SREV_9300_20_OR_LATER(ah)) +		ah->ani_function &= ~ATH9K_ANI_MRC_CCK;  	ath9k_hw_init_mode_regs(ah);  	/* -	 * Configire PCIE after Ini init. SERDES values now come from ini file -	 * This enables PCIe low power mode. +	 * Read back AR_WA into a permanent copy and set bits 14 and 17. +	 * We need to do this to avoid RMW of this register. We cannot +	 * read the reg when chip is asleep.  	 */ -	if (AR_SREV_9300_20_OR_LATER(ah)) { -		u32 regval; -		unsigned int i; - -		/* Set Bits 16 and 17 in the AR_WA register. */ -		regval = REG_READ(ah, AR_WA); -		regval |= 0x00030000; -		REG_WRITE(ah, AR_WA, regval); - -		for (i = 0; i < ah->iniPcieSerdesLowPower.ia_rows; i++) { -			REG_WRITE(ah, -				  INI_RA(&ah->iniPcieSerdesLowPower, i, 0), -				  INI_RA(&ah->iniPcieSerdesLowPower, i, 1)); -		} -	} +	ah->WARegVal = REG_READ(ah, AR_WA); +	ah->WARegVal |= (AR_WA_D3_L1_DISABLE | +			 AR_WA_ASPM_TIMER_BASED_DISABLE);  	if (ah->is_pciexpress)  		ath9k_hw_configpcipowersave(ah, 0, 0); @@ -623,10 +610,8 @@ static int __ath9k_hw_init(struct ath_hw *ah)  	else  		ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S); -	if (AR_SREV_9300_20_OR_LATER(ah)) -		ar9003_hw_set_nf_limits(ah); -  	ath9k_init_nfcal_hist_buffer(ah); +	ah->bb_watchdog_timeout_ms = 25;  	common->state = ATH_HW_INITIALIZED; @@ -1012,6 +997,11 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)  	ENABLE_REGWRITE_BUFFER(ah); +	if (AR_SREV_9300_20_OR_LATER(ah)) { +		REG_WRITE(ah, AR_WA, ah->WARegVal); +		udelay(10); +	} +  	REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |  		  AR_RTC_FORCE_WAKE_ON_INT); @@ -1066,6 +1056,11 @@ static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)  {  	ENABLE_REGWRITE_BUFFER(ah); +	if (AR_SREV_9300_20_OR_LATER(ah)) { +		REG_WRITE(ah, AR_WA, ah->WARegVal); +		udelay(10); +	} +  	REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |  		  AR_RTC_FORCE_WAKE_ON_INT); @@ -1073,6 +1068,7 @@ static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)  		REG_WRITE(ah, AR_RC, AR_RC_AHB);  	REG_WRITE(ah, AR_RTC_RESET, 0); +	udelay(2);  	REGWRITE_BUFFER_FLUSH(ah);  	DISABLE_REGWRITE_BUFFER(ah); @@ -1102,6 +1098,11 @@ static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)  static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type)  { +	if (AR_SREV_9300_20_OR_LATER(ah)) { +		REG_WRITE(ah, AR_WA, ah->WARegVal); +		udelay(10); +	} +  	REG_WRITE(ah, AR_RTC_FORCE_WAKE,  		  AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT); @@ -1232,9 +1233,11 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	if (!ah->chip_fullsleep) {  		ath9k_hw_abortpcurecv(ah); -		if (!ath9k_hw_stopdmarecv(ah)) +		if (!ath9k_hw_stopdmarecv(ah)) {  			ath_print(common, ATH_DBG_XMIT,  				"Failed to stop receive dma\n"); +			bChannelChange = false; +		}  	}  	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) @@ -1265,7 +1268,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	macStaId1 = REG_READ(ah, AR_STA_ID1) & AR_STA_ID1_BASE_RATE_11B;  	/* For chips on which RTC reset is done, save TSF before it gets cleared */ -	if (AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL)) +	if (AR_SREV_9100(ah) || +	    (AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL)))  		tsf = ath9k_hw_gettsf64(ah);  	saveLedState = REG_READ(ah, AR_CFG_LED) & @@ -1297,16 +1301,30 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	}  	/* Restore TSF */ -	if (tsf && AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL)) +	if (tsf)  		ath9k_hw_settsf64(ah, tsf);  	if (AR_SREV_9280_10_OR_LATER(ah))  		REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE); +	if (!AR_SREV_9300_20_OR_LATER(ah)) +		ar9002_hw_enable_async_fifo(ah); +  	r = ath9k_hw_process_ini(ah, chan);  	if (r)  		return r; +	/* +	 * Some AR91xx SoC devices frequently fail to accept TSF writes +	 * right after the chip reset. When that happens, write a new +	 * value after the initvals have been applied, with an offset +	 * based on measured time difference +	 */ +	if (AR_SREV_9100(ah) && (ath9k_hw_gettsf64(ah) < tsf)) { +		tsf += 1500; +		ath9k_hw_settsf64(ah, tsf); +	} +  	/* Setup MFP options for CCMP */  	if (AR_SREV_9280_20_OR_LATER(ah)) {  		/* Mask Retry(b11), PwrMgt(b12), MoreData(b13) to 0 in mgmt @@ -1367,6 +1385,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  		ath9k_hw_resettxqueue(ah, i);  	ath9k_hw_init_interrupt_masks(ah, ah->opmode); +	ath9k_hw_ani_cache_ini_regs(ah);  	ath9k_hw_init_qos(ah);  	if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) @@ -1375,7 +1394,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	ath9k_hw_init_global_settings(ah);  	if (!AR_SREV_9300_20_OR_LATER(ah)) { -		ar9002_hw_enable_async_fifo(ah); +		ar9002_hw_update_async_fifo(ah);  		ar9002_hw_enable_wep_aggregation(ah);  	} @@ -1426,9 +1445,13 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  				"Setting CFG 0x%x\n", REG_READ(ah, AR_CFG));  		}  	} else { -		/* Configure AR9271 target WLAN */ -                if (AR_SREV_9271(ah)) -			REG_WRITE(ah, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB); +		if (common->bus_ops->ath_bus_type == ATH_USB) { +			/* Configure AR9271 target WLAN */ +			if (AR_SREV_9271(ah)) +				REG_WRITE(ah, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB); +			else +				REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD); +		}  #ifdef __BIG_ENDIAN                  else  			REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD); @@ -1441,6 +1464,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	if (AR_SREV_9300_20_OR_LATER(ah)) {  		ath9k_hw_loadnf(ah, curchan);  		ath9k_hw_start_nfcal(ah); +		ar9003_hw_bb_watchdog_config(ah);  	}  	return 0; @@ -1486,9 +1510,10 @@ bool ath9k_hw_keyreset(struct ath_hw *ah, u16 entry)  }  EXPORT_SYMBOL(ath9k_hw_keyreset); -bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac) +static bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac)  {  	u32 macHi, macLo; +	u32 unicast_flag = AR_KEYTABLE_VALID;  	if (entry >= ah->caps.keycache_size) {  		ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL, @@ -1497,6 +1522,16 @@ bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac)  	}  	if (mac != NULL) { +		/* +		 * AR_KEYTABLE_VALID indicates that the address is a unicast +		 * address, which must match the transmitter address for +		 * decrypting frames. +		 * Not setting this bit allows the hardware to use the key +		 * for multicast frame decryption. +		 */ +		if (mac[0] & 0x01) +			unicast_flag = 0; +  		macHi = (mac[5] << 8) | mac[4];  		macLo = (mac[3] << 24) |  			(mac[2] << 16) | @@ -1509,11 +1544,10 @@ bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac)  		macLo = macHi = 0;  	}  	REG_WRITE(ah, AR_KEYTABLE_MAC0(entry), macLo); -	REG_WRITE(ah, AR_KEYTABLE_MAC1(entry), macHi | AR_KEYTABLE_VALID); +	REG_WRITE(ah, AR_KEYTABLE_MAC1(entry), macHi | unicast_flag);  	return true;  } -EXPORT_SYMBOL(ath9k_hw_keysetmac);  bool ath9k_hw_set_keycache_entry(struct ath_hw *ah, u16 entry,  				 const struct ath9k_keyval *k, @@ -1714,17 +1748,6 @@ bool ath9k_hw_set_keycache_entry(struct ath_hw *ah, u16 entry,  }  EXPORT_SYMBOL(ath9k_hw_set_keycache_entry); -bool ath9k_hw_keyisvalid(struct ath_hw *ah, u16 entry) -{ -	if (entry < ah->caps.keycache_size) { -		u32 val = REG_READ(ah, AR_KEYTABLE_MAC1(entry)); -		if (val & AR_KEYTABLE_VALID) -			return true; -	} -	return false; -} -EXPORT_SYMBOL(ath9k_hw_keyisvalid); -  /******************************/  /* Power Management (Chipset) */  /******************************/ @@ -1751,6 +1774,11 @@ static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip)  			REG_CLR_BIT(ah, (AR_RTC_RESET),  				    AR_RTC_RESET_EN);  	} + +	/* Clear Bit 14 of AR_WA after putting chip into Full Sleep mode. */ +	if (AR_SREV_9300_20_OR_LATER(ah)) +		REG_WRITE(ah, AR_WA, +			  ah->WARegVal & ~AR_WA_D3_L1_DISABLE);  }  /* @@ -1777,6 +1805,10 @@ static void ath9k_set_power_network_sleep(struct ath_hw *ah, int setChip)  				    AR_RTC_FORCE_WAKE_EN);  		}  	} + +	/* Clear Bit 14 of AR_WA after putting chip into Net Sleep mode. */ +	if (AR_SREV_9300_20_OR_LATER(ah)) +		REG_WRITE(ah, AR_WA, ah->WARegVal & ~AR_WA_D3_L1_DISABLE);  }  static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip) @@ -1784,6 +1816,12 @@ static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip)  	u32 val;  	int i; +	/* Set Bits 14 and 17 of AR_WA before powering on the chip. */ +	if (AR_SREV_9300_20_OR_LATER(ah)) { +		REG_WRITE(ah, AR_WA, ah->WARegVal); +		udelay(10); +	} +  	if (setChip) {  		if ((REG_READ(ah, AR_RTC_STATUS) &  		     AR_RTC_STATUS_M) == AR_RTC_STATUS_SHUTDOWN) { @@ -2138,6 +2176,8 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)  	if (AR_SREV_9271(ah))  		pCap->num_gpio_pins = AR9271_NUM_GPIO; +	else if (AR_DEVID_7010(ah)) +		pCap->num_gpio_pins = AR7010_NUM_GPIO;  	else if (AR_SREV_9285_10_OR_LATER(ah))  		pCap->num_gpio_pins = AR9285_NUM_GPIO;  	else if (AR_SREV_9280_10_OR_LATER(ah)) @@ -2165,7 +2205,7 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)  		pCap->hw_caps |= ATH9K_HW_CAP_RFSILENT;  	}  #endif -	if (AR_SREV_9271(ah)) +	if (AR_SREV_9271(ah) || AR_SREV_9300_20_OR_LATER(ah))  		pCap->hw_caps |= ATH9K_HW_CAP_AUTOSLEEP;  	else  		pCap->hw_caps &= ~ATH9K_HW_CAP_AUTOSLEEP; @@ -2220,6 +2260,8 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)  		pCap->rx_status_len = sizeof(struct ar9003_rxs);  		pCap->tx_desc_len = sizeof(struct ar9003_txc);  		pCap->txs_len = sizeof(struct ar9003_txs); +		if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD)) +			pCap->hw_caps |= ATH9K_HW_CAP_PAPRD;  	} else {  		pCap->tx_desc_len = sizeof(struct ath_desc);  		if (AR_SREV_9280_20(ah) && @@ -2232,100 +2274,11 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)  	if (AR_SREV_9300_20_OR_LATER(ah))  		pCap->hw_caps |= ATH9K_HW_CAP_RAC_SUPPORTED; -	return 0; -} +	if (AR_SREV_9287_10_OR_LATER(ah) || AR_SREV_9271(ah)) +		pCap->hw_caps |= ATH9K_HW_CAP_SGI_20; -bool ath9k_hw_getcapability(struct ath_hw *ah, enum ath9k_capability_type type, -			    u32 capability, u32 *result) -{ -	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); -	switch (type) { -	case ATH9K_CAP_CIPHER: -		switch (capability) { -		case ATH9K_CIPHER_AES_CCM: -		case ATH9K_CIPHER_AES_OCB: -		case ATH9K_CIPHER_TKIP: -		case ATH9K_CIPHER_WEP: -		case ATH9K_CIPHER_MIC: -		case ATH9K_CIPHER_CLR: -			return true; -		default: -			return false; -		} -	case ATH9K_CAP_TKIP_MIC: -		switch (capability) { -		case 0: -			return true; -		case 1: -			return (ah->sta_id1_defaults & -				AR_STA_ID1_CRPT_MIC_ENABLE) ? true : -			false; -		} -	case ATH9K_CAP_TKIP_SPLIT: -		return (ah->misc_mode & AR_PCU_MIC_NEW_LOC_ENA) ? -			false : true; -	case ATH9K_CAP_MCAST_KEYSRCH: -		switch (capability) { -		case 0: -			return true; -		case 1: -			if (REG_READ(ah, AR_STA_ID1) & AR_STA_ID1_ADHOC) { -				return false; -			} else { -				return (ah->sta_id1_defaults & -					AR_STA_ID1_MCAST_KSRCH) ? true : -					false; -			} -		} -		return false; -	case ATH9K_CAP_TXPOW: -		switch (capability) { -		case 0: -			return 0; -		case 1: -			*result = regulatory->power_limit; -			return 0; -		case 2: -			*result = regulatory->max_power_level; -			return 0; -		case 3: -			*result = regulatory->tp_scale; -			return 0; -		} -		return false; -	case ATH9K_CAP_DS: -		return (AR_SREV_9280_20_OR_LATER(ah) && -			(ah->eep_ops->get_eeprom(ah, EEP_RC_CHAIN_MASK) == 1)) -			? false : true; -	default: -		return false; -	} -} -EXPORT_SYMBOL(ath9k_hw_getcapability); - -bool ath9k_hw_setcapability(struct ath_hw *ah, enum ath9k_capability_type type, -			    u32 capability, u32 setting, int *status) -{ -	switch (type) { -	case ATH9K_CAP_TKIP_MIC: -		if (setting) -			ah->sta_id1_defaults |= -				AR_STA_ID1_CRPT_MIC_ENABLE; -		else -			ah->sta_id1_defaults &= -				~AR_STA_ID1_CRPT_MIC_ENABLE; -		return true; -	case ATH9K_CAP_MCAST_KEYSRCH: -		if (setting) -			ah->sta_id1_defaults |= AR_STA_ID1_MCAST_KSRCH; -		else -			ah->sta_id1_defaults &= ~AR_STA_ID1_MCAST_KSRCH; -		return true; -	default: -		return false; -	} +	return 0;  } -EXPORT_SYMBOL(ath9k_hw_setcapability);  /****************************/  /* GPIO / RFKILL / Antennae */ @@ -2365,8 +2318,15 @@ void ath9k_hw_cfg_gpio_input(struct ath_hw *ah, u32 gpio)  	BUG_ON(gpio >= ah->caps.num_gpio_pins); -	gpio_shift = gpio << 1; +	if (AR_DEVID_7010(ah)) { +		gpio_shift = gpio; +		REG_RMW(ah, AR7010_GPIO_OE, +			(AR7010_GPIO_OE_AS_INPUT << gpio_shift), +			(AR7010_GPIO_OE_MASK << gpio_shift)); +		return; +	} +	gpio_shift = gpio << 1;  	REG_RMW(ah,  		AR_GPIO_OE_OUT,  		(AR_GPIO_OE_OUT_DRV_NO << gpio_shift), @@ -2382,7 +2342,11 @@ u32 ath9k_hw_gpio_get(struct ath_hw *ah, u32 gpio)  	if (gpio >= ah->caps.num_gpio_pins)  		return 0xffffffff; -	if (AR_SREV_9300_20_OR_LATER(ah)) +	if (AR_DEVID_7010(ah)) { +		u32 val; +		val = REG_READ(ah, AR7010_GPIO_IN); +		return (MS(val, AR7010_GPIO_IN_VAL) & AR_GPIO_BIT(gpio)) == 0; +	} else if (AR_SREV_9300_20_OR_LATER(ah))  		return MS_REG_READ(AR9300, gpio) != 0;  	else if (AR_SREV_9271(ah))  		return MS_REG_READ(AR9271, gpio) != 0; @@ -2402,10 +2366,16 @@ void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio,  {  	u32 gpio_shift; -	ath9k_hw_gpio_cfg_output_mux(ah, gpio, ah_signal_type); +	if (AR_DEVID_7010(ah)) { +		gpio_shift = gpio; +		REG_RMW(ah, AR7010_GPIO_OE, +			(AR7010_GPIO_OE_AS_OUTPUT << gpio_shift), +			(AR7010_GPIO_OE_MASK << gpio_shift)); +		return; +	} +	ath9k_hw_gpio_cfg_output_mux(ah, gpio, ah_signal_type);  	gpio_shift = 2 * gpio; -  	REG_RMW(ah,  		AR_GPIO_OE_OUT,  		(AR_GPIO_OE_OUT_DRV_ALL << gpio_shift), @@ -2415,6 +2385,13 @@ EXPORT_SYMBOL(ath9k_hw_cfg_output);  void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val)  { +	if (AR_DEVID_7010(ah)) { +		val = val ? 0 : 1; +		REG_RMW(ah, AR7010_GPIO_OUT, ((val&1) << gpio), +			AR_GPIO_BIT(gpio)); +		return; +	} +  	if (AR_SREV_9271(ah))  		val = ~val; @@ -2520,12 +2497,6 @@ void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit)  }  EXPORT_SYMBOL(ath9k_hw_set_txpowerlimit); -void ath9k_hw_setmac(struct ath_hw *ah, const u8 *mac) -{ -	memcpy(ath9k_hw_common(ah)->macaddr, mac, ETH_ALEN); -} -EXPORT_SYMBOL(ath9k_hw_setmac); -  void ath9k_hw_setopmode(struct ath_hw *ah)  {  	ath9k_hw_set_operating_mode(ah, ah->opmode); @@ -2598,21 +2569,6 @@ void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting)  }  EXPORT_SYMBOL(ath9k_hw_set_tsfadjust); -/* - *  Extend 15-bit time stamp from rx descriptor to - *  a full 64-bit TSF using the current h/w TSF. -*/ -u64 ath9k_hw_extend_tsf(struct ath_hw *ah, u32 rstamp) -{ -	u64 tsf; - -	tsf = ath9k_hw_gettsf64(ah); -	if ((tsf & 0x7fff) < rstamp) -		tsf -= 0x8000; -	return (tsf & ~0x7fff) | rstamp; -} -EXPORT_SYMBOL(ath9k_hw_extend_tsf); -  void ath9k_hw_set11nmac2040(struct ath_hw *ah)  {  	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;  |