| @@ -37,7 +37,7 @@ | |||||||
|  void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature); |  void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature); | ||||||
| --- a/local-symbols | --- a/local-symbols | ||||||
| +++ b/local-symbols | +++ b/local-symbols | ||||||
| @@ -142,6 +142,7 @@ ATH10K_SNOC= | @@ -143,6 +143,7 @@ ATH10K_SNOC= | ||||||
|  ATH10K_DEBUG= |  ATH10K_DEBUG= | ||||||
|  ATH10K_DEBUGFS= |  ATH10K_DEBUGFS= | ||||||
|  ATH10K_SPECTRAL= |  ATH10K_SPECTRAL= | ||||||
|   | |||||||
| @@ -29,21 +29,6 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| -		npend = ath9k_hw_numtxpending(ah, i); | -		npend = ath9k_hw_numtxpending(ah, i); | ||||||
| -		if (npend) | -		if (npend) | ||||||
| -			break; | -			break; | ||||||
| -	} |  | ||||||
| - |  | ||||||
| -	if (ah->external_reset && |  | ||||||
| -	    (npend || type == ATH9K_RESET_COLD)) { |  | ||||||
| -		int reset_err = 0; |  | ||||||
| - |  | ||||||
| -		ath_dbg(ath9k_hw_common(ah), RESET, |  | ||||||
| -			"reset MAC via external reset\n"); |  | ||||||
| - |  | ||||||
| -		reset_err = ah->external_reset(); |  | ||||||
| -		if (reset_err) { |  | ||||||
| -			ath_err(ath9k_hw_common(ah), |  | ||||||
| -				"External reset failed, err=%d\n", |  | ||||||
| -				reset_err); |  | ||||||
| -			return false; |  | ||||||
| +	if (type == ATH9K_RESET_COLD) | +	if (type == ATH9K_RESET_COLD) | ||||||
| +		return true; | +		return true; | ||||||
| + | + | ||||||
| @@ -59,35 +44,47 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| +		for (i = 0; i < AR_NUM_QCU; i++) { | +		for (i = 0; i < AR_NUM_QCU; i++) { | ||||||
| +			if (ath9k_hw_numtxpending(ah, i)) | +			if (ath9k_hw_numtxpending(ah, i)) | ||||||
| +				return true; | +				return true; | ||||||
|  		} | +		} | ||||||
| +	} |  	} | ||||||
| + |   | ||||||
|  | -	if (ah->external_reset && | ||||||
|  | -	    (npend || type == ATH9K_RESET_COLD)) { | ||||||
|  | -		int reset_err = 0; | ||||||
| +	return false; | +	return false; | ||||||
| +} | +} | ||||||
| + |   | ||||||
|  | -		ath_dbg(ath9k_hw_common(ah), RESET, | ||||||
|  | -			"reset MAC via external reset\n"); | ||||||
| +static bool ath9k_hw_external_reset(struct ath_hw *ah, int type) | +static bool ath9k_hw_external_reset(struct ath_hw *ah, int type) | ||||||
| +{ | +{ | ||||||
| +	int err; | +	int err; | ||||||
| + |   | ||||||
|  | -		reset_err = ah->external_reset(); | ||||||
|  | -		if (reset_err) { | ||||||
|  | -			ath_err(ath9k_hw_common(ah), | ||||||
|  | -				"External reset failed, err=%d\n", | ||||||
|  | -				reset_err); | ||||||
|  | -			return false; | ||||||
|  | -		} | ||||||
| +	if (!ah->external_reset || !ath9k_hw_need_external_reset(ah, type)) | +	if (!ah->external_reset || !ath9k_hw_need_external_reset(ah, type)) | ||||||
| +		return true; | +		return true; | ||||||
| + |  | ||||||
| +	ath_dbg(ath9k_hw_common(ah), RESET, |  | ||||||
| +		"reset MAC via external reset\n"); |  | ||||||
|   |   | ||||||
| -		REG_WRITE(ah, AR_RTC_RESET, 1); | -		REG_WRITE(ah, AR_RTC_RESET, 1); | ||||||
|  | +	ath_dbg(ath9k_hw_common(ah), RESET, | ||||||
|  | +		"reset MAC via external reset\n"); | ||||||
|  | + | ||||||
| +	err = ah->external_reset(); | +	err = ah->external_reset(); | ||||||
| +	if (err) { | +	if (err) { | ||||||
| +		ath_err(ath9k_hw_common(ah), | +		ath_err(ath9k_hw_common(ah), | ||||||
| +			"External reset failed, err=%d\n", err); | +			"External reset failed, err=%d\n", err); | ||||||
| +		return false; | +		return false; | ||||||
|  	} | +	} | ||||||
|   | + | ||||||
| +	if (AR_SREV_9550(ah)) { | +	if (AR_SREV_9550(ah)) { | ||||||
| +		REG_WRITE(ah, AR_RTC_RESET, 0); | +		REG_WRITE(ah, AR_RTC_RESET, 0); | ||||||
| +		udelay(10); | +		udelay(10); | ||||||
| +	} |  	} | ||||||
| + |   | ||||||
| +	REG_WRITE(ah, AR_RTC_RESET, 1); | +	REG_WRITE(ah, AR_RTC_RESET, 1); | ||||||
| +	udelay(10); | +	udelay(10); | ||||||
| + | + | ||||||
|   | |||||||
| @@ -82,7 +82,7 @@ | |||||||
|  	help |  	help | ||||||
| --- a/local-symbols | --- a/local-symbols | ||||||
| +++ b/local-symbols | +++ b/local-symbols | ||||||
| @@ -85,6 +85,7 @@ ADM8211= | @@ -86,6 +86,7 @@ ADM8211= | ||||||
|  ATH_COMMON= |  ATH_COMMON= | ||||||
|  WLAN_VENDOR_ATH= |  WLAN_VENDOR_ATH= | ||||||
|  ATH_DEBUG= |  ATH_DEBUG= | ||||||
|   | |||||||
| @@ -103,7 +103,8 @@ | |||||||
| +		      GFP_KERNEL); | +		      GFP_KERNEL); | ||||||
| +	if (!led) | +	if (!led) | ||||||
| +		return -ENOMEM; | +		return -ENOMEM; | ||||||
| + |   | ||||||
|  | -	ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val); | ||||||
| +	led->gpio = gpio = (struct gpio_led *) (led + 1); | +	led->gpio = gpio = (struct gpio_led *) (led + 1); | ||||||
| +	_name = (char *) (led->gpio + 1); | +	_name = (char *) (led->gpio + 1); | ||||||
| + | + | ||||||
| @@ -116,8 +117,7 @@ | |||||||
| +	ret = ath_add_led(sc, led); | +	ret = ath_add_led(sc, led); | ||||||
| +	if (unlikely(ret < 0)) | +	if (unlikely(ret < 0)) | ||||||
| +		kfree(led); | +		kfree(led); | ||||||
|   | + | ||||||
| -	ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val); |  | ||||||
| +	return ret; | +	return ret; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -125,11 +125,11 @@ | |||||||
|  { |  { | ||||||
| -	if (!sc->led_registered) | -	if (!sc->led_registered) | ||||||
| -		return; | -		return; | ||||||
| +	struct ath_led *led; | - | ||||||
|   |  | ||||||
| -	ath_led_brightness(&sc->led_cdev, LED_OFF); | -	ath_led_brightness(&sc->led_cdev, LED_OFF); | ||||||
| -	led_classdev_unregister(&sc->led_cdev); | -	led_classdev_unregister(&sc->led_cdev); | ||||||
| - | +	struct ath_led *led; | ||||||
|  |   | ||||||
| -	ath9k_hw_gpio_free(sc->sc_ah, sc->sc_ah->led_pin); | -	ath9k_hw_gpio_free(sc->sc_ah, sc->sc_ah->led_pin); | ||||||
| +	while (!list_empty(&sc->leds)) { | +	while (!list_empty(&sc->leds)) { | ||||||
| +		led = list_first_entry(&sc->leds, struct ath_led, list); | +		led = list_first_entry(&sc->leds, struct ath_led, list); | ||||||
|   | |||||||
| @@ -371,7 +371,7 @@ | |||||||
|   |   | ||||||
| --- a/local-symbols | --- a/local-symbols | ||||||
| +++ b/local-symbols | +++ b/local-symbols | ||||||
| @@ -112,6 +112,7 @@ ATH9K_WOW= | @@ -113,6 +113,7 @@ ATH9K_WOW= | ||||||
|  ATH9K_RFKILL= |  ATH9K_RFKILL= | ||||||
|  ATH9K_CHANNEL_CONTEXT= |  ATH9K_CHANNEL_CONTEXT= | ||||||
|  ATH9K_PCOEM= |  ATH9K_PCOEM= | ||||||
|   | |||||||
| @@ -114,7 +114,7 @@ v13: | |||||||
|  ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o |  ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o | ||||||
| --- a/local-symbols | --- a/local-symbols | ||||||
| +++ b/local-symbols | +++ b/local-symbols | ||||||
| @@ -145,6 +145,7 @@ ATH10K_DEBUG= | @@ -146,6 +146,7 @@ ATH10K_DEBUG= | ||||||
|  ATH10K_DEBUGFS= |  ATH10K_DEBUGFS= | ||||||
|  ATH10K_SPECTRAL= |  ATH10K_SPECTRAL= | ||||||
|  ATH10K_THERMAL= |  ATH10K_THERMAL= | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| --- a/local-symbols | --- a/local-symbols | ||||||
| +++ b/local-symbols | +++ b/local-symbols | ||||||
| @@ -332,6 +332,7 @@ RT2X00_LIB_FIRMWARE= | @@ -333,6 +333,7 @@ RT2X00_LIB_FIRMWARE= | ||||||
|  RT2X00_LIB_CRYPTO= |  RT2X00_LIB_CRYPTO= | ||||||
|  RT2X00_LIB_LEDS= |  RT2X00_LIB_LEDS= | ||||||
|  RT2X00_LIB_DEBUGFS= |  RT2X00_LIB_DEBUGFS= | ||||||
|   | |||||||
| @@ -22,16 +22,15 @@ | |||||||
| -	rfcsr = rt2800_rfcsr_read(rt2x00dev, 16); | -	rfcsr = rt2800_rfcsr_read(rt2x00dev, 16); | ||||||
| -	rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80); | -	rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80); | ||||||
| -	rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); | -	rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); | ||||||
| - |  | ||||||
| -	rfcsr = rt2800_rfcsr_read(rt2x00dev, 21); |  | ||||||
| -	rt2x00_set_field8(&rfcsr, RFCSR21_BIT8, 1); |  | ||||||
| -	rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); |  | ||||||
| +	if (rt2800_hw_get_chipver(rt2x00dev) > 1) { | +	if (rt2800_hw_get_chipver(rt2x00dev) > 1) { | ||||||
| +		/* Default: XO=20MHz , SDM mode */ | +		/* Default: XO=20MHz , SDM mode */ | ||||||
| +		rfcsr = rt2800_rfcsr_read(rt2x00dev, 16); | +		rfcsr = rt2800_rfcsr_read(rt2x00dev, 16); | ||||||
| +		rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80); | +		rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80); | ||||||
| +		rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); | +		rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); | ||||||
| + |   | ||||||
|  | -	rfcsr = rt2800_rfcsr_read(rt2x00dev, 21); | ||||||
|  | -	rt2x00_set_field8(&rfcsr, RFCSR21_BIT8, 1); | ||||||
|  | -	rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); | ||||||
| +		rfcsr = rt2800_rfcsr_read(rt2x00dev, 21); | +		rfcsr = rt2800_rfcsr_read(rt2x00dev, 21); | ||||||
| +		rt2x00_set_field8(&rfcsr, RFCSR21_BIT8, 1); | +		rt2x00_set_field8(&rfcsr, RFCSR21_BIT8, 1); | ||||||
| +		rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); | +		rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); | ||||||
| @@ -217,10 +216,6 @@ | |||||||
| -	rt2800_rfcsr_write(rt2x00dev, 28, 0x61); | -	rt2800_rfcsr_write(rt2x00dev, 28, 0x61); | ||||||
| -	rt2800_rfcsr_write(rt2x00dev, 29, 0xB5); | -	rt2800_rfcsr_write(rt2x00dev, 29, 0xB5); | ||||||
| -	rt2800_rfcsr_write(rt2x00dev, 43, 0x02); | -	rt2800_rfcsr_write(rt2x00dev, 43, 0x02); | ||||||
| - |  | ||||||
| -	rt2800_rfcsr_write(rt2x00dev, 28, 0x62); |  | ||||||
| -	rt2800_rfcsr_write(rt2x00dev, 29, 0xAD); |  | ||||||
| -	rt2800_rfcsr_write(rt2x00dev, 39, 0x80); |  | ||||||
| +	if (rt2800_hw_get_chipver(rt2x00dev) > 1) { | +	if (rt2800_hw_get_chipver(rt2x00dev) > 1) { | ||||||
| +		rt2800_rfcsr_write(rt2x00dev, 11, 0x21); | +		rt2800_rfcsr_write(rt2x00dev, 11, 0x21); | ||||||
| +		if (rt2800_clk_is_20mhz(rt2x00dev)) | +		if (rt2800_clk_is_20mhz(rt2x00dev)) | ||||||
| @@ -244,7 +239,10 @@ | |||||||
| +		rt2800_rfcsr_write(rt2x00dev, 29, 0xB5); | +		rt2800_rfcsr_write(rt2x00dev, 29, 0xB5); | ||||||
| +		rt2800_rfcsr_write(rt2x00dev, 43, 0x02); | +		rt2800_rfcsr_write(rt2x00dev, 43, 0x02); | ||||||
| +	} | +	} | ||||||
| + |   | ||||||
|  | -	rt2800_rfcsr_write(rt2x00dev, 28, 0x62); | ||||||
|  | -	rt2800_rfcsr_write(rt2x00dev, 29, 0xAD); | ||||||
|  | -	rt2800_rfcsr_write(rt2x00dev, 39, 0x80); | ||||||
| +	if (rt2800_hw_get_chipver(rt2x00dev) > 1 && | +	if (rt2800_hw_get_chipver(rt2x00dev) > 1 && | ||||||
| +	    rt2800_hw_get_chipeco(rt2x00dev) >= 2) { | +	    rt2800_hw_get_chipeco(rt2x00dev) >= 2) { | ||||||
| +		rt2800_rfcsr_write(rt2x00dev, 28, 0x62); | +		rt2800_rfcsr_write(rt2x00dev, 28, 0x62); | ||||||
| @@ -288,33 +286,6 @@ | |||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7); | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7); | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09); | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09); | ||||||
| - |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x51); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x2C); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x64); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x51); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x36); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16); |  | ||||||
| - |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); |  | ||||||
| - |  | ||||||
| -	/* Initialize RF channel register for DRQFN */ |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xE3); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xE5); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x28); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x68); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xF7); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x02); |  | ||||||
| -	rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xC7); |  | ||||||
| +	if (rt2800_hw_get_chipver(rt2x00dev) > 1) { | +	if (rt2800_hw_get_chipver(rt2x00dev) > 1) { | ||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x47); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x47); | ||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x71); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x71); | ||||||
| @@ -347,7 +318,16 @@ | |||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7); | ||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09); | ||||||
| +	} | +	} | ||||||
| + |   | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x51); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x2C); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x64); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x51); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x36); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16); | ||||||
| +	if (rt2800_hw_get_chipver(rt2x00dev) > 1 && | +	if (rt2800_hw_get_chipver(rt2x00dev) > 1 && | ||||||
| +	    rt2800_hw_get_chipeco(rt2x00dev) >= 2) { | +	    rt2800_hw_get_chipeco(rt2x00dev) >= 2) { | ||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x51); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x51); | ||||||
| @@ -359,7 +339,13 @@ | |||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x36); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x36); | ||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53); | ||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16); | ||||||
| + |   | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); | ||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C); | ||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC); | ||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F); | ||||||
| @@ -367,7 +353,16 @@ | |||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); | ||||||
| +		rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); | +		rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); | ||||||
| +	} | +	} | ||||||
| + |   | ||||||
|  | -	/* Initialize RF channel register for DRQFN */ | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xE3); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xE5); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x28); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x68); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xF7); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x02); | ||||||
|  | -	rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xC7); | ||||||
| +	if (rt2800_hw_get_chippkg(rt2x00dev) == 0 && | +	if (rt2800_hw_get_chippkg(rt2x00dev) == 0 && | ||||||
| +	    rt2800_hw_get_chipver(rt2x00dev) == 1) { | +	    rt2800_hw_get_chipver(rt2x00dev) == 1) { | ||||||
| +		/* Initialize RF channel register for DRQFN */ | +		/* Initialize RF channel register for DRQFN */ | ||||||
|   | |||||||
| @@ -53,22 +53,20 @@ | |||||||
| -	idle = rt2800_register_read(rt2x00dev, CH_IDLE_STA); | -	idle = rt2800_register_read(rt2x00dev, CH_IDLE_STA); | ||||||
| -	busy = rt2800_register_read(rt2x00dev, CH_BUSY_STA); | -	busy = rt2800_register_read(rt2x00dev, CH_BUSY_STA); | ||||||
| -	busy_ext = rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC); | -	busy_ext = rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC); | ||||||
| - | +	survey->channel = &rt2x00dev->bands[band].channels[idx]; | ||||||
|  |   | ||||||
| -	if (idle || busy) { | -	if (idle || busy) { | ||||||
| -		survey->filled = SURVEY_INFO_TIME | | -		survey->filled = SURVEY_INFO_TIME | | ||||||
| -				 SURVEY_INFO_TIME_BUSY | | -				 SURVEY_INFO_TIME_BUSY | | ||||||
| -				 SURVEY_INFO_TIME_EXT_BUSY; | -				 SURVEY_INFO_TIME_EXT_BUSY; | ||||||
| - | +	survey->filled = SURVEY_INFO_TIME | | ||||||
|  | +			 SURVEY_INFO_TIME_BUSY | | ||||||
|  | +			 SURVEY_INFO_TIME_EXT_BUSY; | ||||||
|  |   | ||||||
| -		survey->time = (idle + busy) / 1000; | -		survey->time = (idle + busy) / 1000; | ||||||
| -		survey->time_busy = busy / 1000; | -		survey->time_busy = busy / 1000; | ||||||
| -		survey->time_ext_busy = busy_ext / 1000; | -		survey->time_ext_busy = busy_ext / 1000; | ||||||
| -	} | -	} | ||||||
| +	survey->channel = &rt2x00dev->bands[band].channels[idx]; |  | ||||||
| + |  | ||||||
| +	survey->filled = SURVEY_INFO_TIME | |  | ||||||
| +			 SURVEY_INFO_TIME_BUSY | |  | ||||||
| +			 SURVEY_INFO_TIME_EXT_BUSY; |  | ||||||
| + |  | ||||||
| +	survey->time = div_u64(chan_survey->time_idle + chan_survey->time_busy, 1000); | +	survey->time = div_u64(chan_survey->time_idle + chan_survey->time_busy, 1000); | ||||||
| +	survey->time_busy = div_u64(chan_survey->time_busy, 1000); | +	survey->time_busy = div_u64(chan_survey->time_busy, 1000); | ||||||
| +	survey->time_ext_busy = div_u64(chan_survey->time_ext_busy, 1000); | +	survey->time_ext_busy = div_u64(chan_survey->time_ext_busy, 1000); | ||||||
|   | |||||||
| @@ -166,8 +166,7 @@ | |||||||
|  #define AES_CCM_H |  #define AES_CCM_H | ||||||
|   |   | ||||||
| -#include "aead_api.h" | -#include "aead_api.h" | ||||||
| +#include <linux/crypto.h> | - | ||||||
|   |  | ||||||
| -#define CCM_AAD_LEN	32 | -#define CCM_AAD_LEN	32 | ||||||
| - | - | ||||||
| -static inline struct crypto_aead * | -static inline struct crypto_aead * | ||||||
| @@ -195,7 +194,8 @@ | |||||||
| -			    be16_to_cpup((__be16 *)aad), | -			    be16_to_cpup((__be16 *)aad), | ||||||
| -			    data, data_len, mic); | -			    data, data_len, mic); | ||||||
| -} | -} | ||||||
| - | +#include <linux/crypto.h> | ||||||
|  |   | ||||||
| -static inline void ieee80211_aes_key_free(struct crypto_aead *tfm) | -static inline void ieee80211_aes_key_free(struct crypto_aead *tfm) | ||||||
| -{ | -{ | ||||||
| -	return aead_key_free(tfm); | -	return aead_key_free(tfm); | ||||||
| @@ -331,10 +331,10 @@ | |||||||
|  #define AES_GCM_H |  #define AES_GCM_H | ||||||
|   |   | ||||||
| -#include "aead_api.h" | -#include "aead_api.h" | ||||||
|  | - | ||||||
|  | -#define GCM_AAD_LEN	32 | ||||||
| +#include <linux/crypto.h> | +#include <linux/crypto.h> | ||||||
|   |   | ||||||
| -#define GCM_AAD_LEN	32 |  | ||||||
| - |  | ||||||
| -static inline int ieee80211_aes_gcm_encrypt(struct crypto_aead *tfm, | -static inline int ieee80211_aes_gcm_encrypt(struct crypto_aead *tfm, | ||||||
| -					    u8 *j_0, u8 *aad,  u8 *data, | -					    u8 *j_0, u8 *aad,  u8 *data, | ||||||
| -					    size_t data_len, u8 *mic) | -					    size_t data_len, u8 *mic) | ||||||
|   | |||||||
| @@ -27,7 +27,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| -	if (!mi->avg_ampdu_len) | -	if (!mi->avg_ampdu_len) | ||||||
| -		return AVG_AMPDU_SIZE; | -		return AVG_AMPDU_SIZE; | ||||||
| +	int duration; | +	int duration; | ||||||
| + |   | ||||||
|  | -	return MINSTREL_TRUNC(mi->avg_ampdu_len); | ||||||
| +	if (mi->avg_ampdu_len) | +	if (mi->avg_ampdu_len) | ||||||
| +		return MINSTREL_TRUNC(mi->avg_ampdu_len); | +		return MINSTREL_TRUNC(mi->avg_ampdu_len); | ||||||
| + | + | ||||||
| @@ -35,8 +36,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| +		return 1; | +		return 1; | ||||||
| + | + | ||||||
| +	duration = minstrel_get_duration(mi->max_tp_rate[0]); | +	duration = minstrel_get_duration(mi->max_tp_rate[0]); | ||||||
|   | + | ||||||
| -	return MINSTREL_TRUNC(mi->avg_ampdu_len); |  | ||||||
| +	if (duration > 400 * 1000) | +	if (duration > 400 * 1000) | ||||||
| +		return 2; | +		return 2; | ||||||
| + | + | ||||||
|   | |||||||
| @@ -179,14 +179,14 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| +	if (!rate) | +	if (!rate) | ||||||
|  		return; |  		return; | ||||||
| -	} | -	} | ||||||
| - |   | ||||||
| -	i = 0; | -	i = 0; | ||||||
| -	if (n_rates > 1) { | -	if (n_rates > 1) { | ||||||
| -		random = prandom_u32(); | -		random = prandom_u32(); | ||||||
| -		i = random % n_rates; | -		i = random % n_rates; | ||||||
| -	} | -	} | ||||||
| -	probe_rate = rates[i]; | -	probe_rate = rates[i]; | ||||||
|   | - | ||||||
| -out: | -out: | ||||||
| -	mi->sample_rate = probe_rate; | -	mi->sample_rate = probe_rate; | ||||||
| +	mi->sample_rate = rate; | +	mi->sample_rate = rate; | ||||||
| @@ -584,13 +584,13 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| - | - | ||||||
| -	if (!(mi->supported[sample_group] & BIT(sample_idx))) | -	if (!(mi->supported[sample_group] & BIT(sample_idx))) | ||||||
| -		return -1; | -		return -1; | ||||||
| +	u8 seq; | - | ||||||
|   |  | ||||||
| -	mrs = &mg->rates[sample_idx]; | -	mrs = &mg->rates[sample_idx]; | ||||||
| -	sample_idx += MI_RATE(sample_group, 0); | -	sample_idx += MI_RATE(sample_group, 0); | ||||||
| - | - | ||||||
| -	tp_rate1 = mi->max_tp_rate[0]; | -	tp_rate1 = mi->max_tp_rate[0]; | ||||||
| - | +	u8 seq; | ||||||
|  |   | ||||||
| -	/* Set tp_rate2 to the second highest max_tp_rate */ | -	/* Set tp_rate2 to the second highest max_tp_rate */ | ||||||
| -	if (minstrel_get_duration(mi->max_tp_rate[0]) > | -	if (minstrel_get_duration(mi->max_tp_rate[0]) > | ||||||
| -	    minstrel_get_duration(mi->max_tp_rate[1])) { | -	    minstrel_get_duration(mi->max_tp_rate[1])) { | ||||||
| @@ -673,7 +673,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| -	else | -	else | ||||||
| -		sample_idx = minstrel_get_sample_rate(mp, mi); | -		sample_idx = minstrel_get_sample_rate(mp, mi); | ||||||
| +		return; | +		return; | ||||||
| + |   | ||||||
|  | -	if (sample_idx < 0) | ||||||
| +	if (mp->hw->max_rates == 1 && mp->sample_switch && | +	if (mp->hw->max_rates == 1 && mp->sample_switch && | ||||||
| +	    (mi->total_packets_cur >= SAMPLE_SWITCH_THR || | +	    (mi->total_packets_cur >= SAMPLE_SWITCH_THR || | ||||||
| +	     mp->sample_switch == 1)) | +	     mp->sample_switch == 1)) | ||||||
| @@ -681,8 +682,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| + | + | ||||||
| +	if (time_is_before_jiffies(mi->sample_time)) | +	if (time_is_before_jiffies(mi->sample_time)) | ||||||
| +		return; | +		return; | ||||||
|   | + | ||||||
| -	if (sample_idx < 0) |  | ||||||
| +	mi->sample_time = jiffies + MINSTREL_SAMPLE_INTERVAL; | +	mi->sample_time = jiffies + MINSTREL_SAMPLE_INTERVAL; | ||||||
| +	sample_idx = minstrel_ht_get_sample_rate(mp, mi); | +	sample_idx = minstrel_ht_get_sample_rate(mp, mi); | ||||||
| +	if (!sample_idx) | +	if (!sample_idx) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau