diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/hw.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 25 | 
1 files changed, 17 insertions, 8 deletions
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 7f25da8444f..15dfefcf2d0 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c @@ -1172,6 +1172,7 @@ u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, struct ath9k_channel *chan)  static inline void ath9k_hw_set_dma(struct ath_hw *ah)  {  	struct ath_common *common = ath9k_hw_common(ah); +	int txbuf_size;  	ENABLE_REGWRITE_BUFFER(ah); @@ -1225,13 +1226,17 @@ static inline void ath9k_hw_set_dma(struct ath_hw *ah)  		 * So set the usable tx buf size also to half to  		 * avoid data/delimiter underruns  		 */ -		REG_WRITE(ah, AR_PCU_TXBUF_CTRL, -			  AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE); -	} else if (!AR_SREV_9271(ah)) { -		REG_WRITE(ah, AR_PCU_TXBUF_CTRL, -			  AR_PCU_TXBUF_CTRL_USABLE_SIZE); +		txbuf_size = AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE; +	} else if (AR_SREV_9340_13_OR_LATER(ah)) { +		/* Uses fewer entries for AR934x v1.3+ to prevent rx overruns */ +		txbuf_size = AR_9340_PCU_TXBUF_CTRL_USABLE_SIZE; +	} else { +		txbuf_size = AR_PCU_TXBUF_CTRL_USABLE_SIZE;  	} +	if (!AR_SREV_9271(ah)) +		REG_WRITE(ah, AR_PCU_TXBUF_CTRL, txbuf_size); +  	REGWRITE_BUFFER_FLUSH(ah);  	if (AR_SREV_9300_20_OR_LATER(ah)) @@ -1306,9 +1311,13 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)  			AR_RTC_RC_COLD_RESET | AR_RTC_RC_WARM_RESET;  	} else {  		tmpReg = REG_READ(ah, AR_INTR_SYNC_CAUSE); -		if (tmpReg & -		    (AR_INTR_SYNC_LOCAL_TIMEOUT | -		     AR_INTR_SYNC_RADM_CPL_TIMEOUT)) { +		if (AR_SREV_9340(ah)) +			tmpReg &= AR9340_INTR_SYNC_LOCAL_TIMEOUT; +		else +			tmpReg &= AR_INTR_SYNC_LOCAL_TIMEOUT | +				  AR_INTR_SYNC_RADM_CPL_TIMEOUT; + +		if (tmpReg) {  			u32 val;  			REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0);  |