mac80211: update to version 4.19.85
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> Tested-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
This commit is contained in:
		| @@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk | |||||||
|  |  | ||||||
| PKG_NAME:=mac80211 | PKG_NAME:=mac80211 | ||||||
|  |  | ||||||
| PKG_VERSION:=4.19.79-1 | PKG_VERSION:=4.19.85-1 | ||||||
| PKG_RELEASE:=1 | PKG_RELEASE:=1 | ||||||
| PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v4.19.79/ | PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v4.19.85/ | ||||||
| PKG_HASH:=ee03b16949e4968092cfed3cd763ff4682bc29fa3b52ebc239aa915583413cf3 | PKG_HASH:=6a92df43e8c3e2410638d84dfd18773d667757532dd0a911227c9b7d65aee34d | ||||||
|  |  | ||||||
| PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz | PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz | ||||||
| PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION) | PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION) | ||||||
|   | |||||||
| @@ -1,92 +0,0 @@ | |||||||
| From: Felix Fietkau <nbd@nbd.name> |  | ||||||
| Date: Mon, 20 Aug 2018 11:35:05 +0200 |  | ||||||
| Subject: [PATCH] ath9k: fix tx99 with monitor mode interface |  | ||||||
|  |  | ||||||
| Tx99 is typically configured via a monitor mode interface, which does |  | ||||||
| not get added to the driver as a vif. Since the code currently expects |  | ||||||
| a configured virtual interface for tx99, enabling tx99 via debugfs fails. |  | ||||||
| Since the vif is not needed anyway, remove all checks for it. |  | ||||||
|  |  | ||||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |  | ||||||
| --- |  | ||||||
|  |  | ||||||
| --- a/drivers/net/wireless/ath/ath9k/ath9k.h |  | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/ath9k.h |  | ||||||
| @@ -1074,7 +1074,6 @@ struct ath_softc { |  | ||||||
|   |  | ||||||
|  	struct ath_spec_scan_priv spec_priv; |  | ||||||
|   |  | ||||||
| -	struct ieee80211_vif *tx99_vif; |  | ||||||
|  	struct sk_buff *tx99_skb; |  | ||||||
|  	bool tx99_state; |  | ||||||
|  	s16 tx99_power; |  | ||||||
| --- a/drivers/net/wireless/ath/ath9k/main.c |  | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/main.c |  | ||||||
| @@ -1251,15 +1251,10 @@ static int ath9k_add_interface(struct ie |  | ||||||
|  	struct ath_vif *avp = (void *)vif->drv_priv; |  | ||||||
|  	struct ath_node *an = &avp->mcast_node; |  | ||||||
|   |  | ||||||
| -	mutex_lock(&sc->mutex); |  | ||||||
| +	if (IS_ENABLED(CPTCFG_ATH9K_TX99)) |  | ||||||
| +		return -EOPNOTSUPP; |  | ||||||
|   |  | ||||||
| -	if (IS_ENABLED(CPTCFG_ATH9K_TX99)) { |  | ||||||
| -		if (sc->cur_chan->nvifs >= 1) { |  | ||||||
| -			mutex_unlock(&sc->mutex); |  | ||||||
| -			return -EOPNOTSUPP; |  | ||||||
| -		} |  | ||||||
| -		sc->tx99_vif = vif; |  | ||||||
| -	} |  | ||||||
| +	mutex_lock(&sc->mutex); |  | ||||||
|   |  | ||||||
|  	ath_dbg(common, CONFIG, "Attach a VIF of type: %d\n", vif->type); |  | ||||||
|  	sc->cur_chan->nvifs++; |  | ||||||
| @@ -1342,7 +1337,6 @@ static void ath9k_remove_interface(struc |  | ||||||
|  	ath9k_p2p_remove_vif(sc, vif); |  | ||||||
|   |  | ||||||
|  	sc->cur_chan->nvifs--; |  | ||||||
| -	sc->tx99_vif = NULL; |  | ||||||
|  	if (!ath9k_is_chanctx_enabled()) |  | ||||||
|  		list_del(&avp->list); |  | ||||||
|   |  | ||||||
| --- a/drivers/net/wireless/ath/ath9k/tx99.c |  | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/tx99.c |  | ||||||
| @@ -54,12 +54,6 @@ static struct sk_buff *ath9k_build_tx99_ |  | ||||||
|  	struct ieee80211_hdr *hdr; |  | ||||||
|  	struct ieee80211_tx_info *tx_info; |  | ||||||
|  	struct sk_buff *skb; |  | ||||||
| -	struct ath_vif *avp; |  | ||||||
| - |  | ||||||
| -	if (!sc->tx99_vif) |  | ||||||
| -		return NULL; |  | ||||||
| - |  | ||||||
| -	avp = (struct ath_vif *)sc->tx99_vif->drv_priv; |  | ||||||
|   |  | ||||||
|  	skb = alloc_skb(len, GFP_KERNEL); |  | ||||||
|  	if (!skb) |  | ||||||
| @@ -77,14 +71,11 @@ static struct sk_buff *ath9k_build_tx99_ |  | ||||||
|  	memcpy(hdr->addr2, hw->wiphy->perm_addr, ETH_ALEN); |  | ||||||
|  	memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN); |  | ||||||
|   |  | ||||||
| -	hdr->seq_ctrl |= cpu_to_le16(avp->seq_no); |  | ||||||
| - |  | ||||||
|  	tx_info = IEEE80211_SKB_CB(skb); |  | ||||||
|  	memset(tx_info, 0, sizeof(*tx_info)); |  | ||||||
|  	rate = &tx_info->control.rates[0]; |  | ||||||
|  	tx_info->band = sc->cur_chan->chandef.chan->band; |  | ||||||
|  	tx_info->flags = IEEE80211_TX_CTL_NO_ACK; |  | ||||||
| -	tx_info->control.vif = sc->tx99_vif; |  | ||||||
|  	rate->count = 1; |  | ||||||
|  	if (ah->curchan && IS_CHAN_HT(ah->curchan)) { |  | ||||||
|  		rate->flags |= IEEE80211_TX_RC_MCS; |  | ||||||
| --- a/drivers/net/wireless/ath/ath9k/xmit.c |  | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/xmit.c |  | ||||||
| @@ -2974,7 +2974,7 @@ int ath9k_tx99_send(struct ath_softc *sc |  | ||||||
|  		return -EINVAL; |  | ||||||
|  	} |  | ||||||
|   |  | ||||||
| -	ath_set_rates(sc->tx99_vif, NULL, bf); |  | ||||||
| +	ath_set_rates(NULL, NULL, bf); |  | ||||||
|   |  | ||||||
|  	ath9k_hw_set_desc_link(sc->sc_ah, bf->bf_desc, bf->bf_daddr); |  | ||||||
|  	ath9k_hw_tx99_start(sc->sc_ah, txctl->txq->axq_qnum); |  | ||||||
| @@ -1,96 +0,0 @@ | |||||||
| From: Felix Fietkau <nbd@nbd.name> |  | ||||||
| Date: Sat, 22 Sep 2018 15:20:50 +0200 |  | ||||||
| Subject: [PATCH] ath9k: add back support for using active monitor interfaces |  | ||||||
|  for tx99 |  | ||||||
|  |  | ||||||
| Various documented examples on how to set up tx99 with ath9k rely |  | ||||||
| on setting up a regular monitor interface for setting the channel. |  | ||||||
| My previous patch "ath9k: fix tx99 with monitor mode interface" made |  | ||||||
| it possible to set it up this way again. However, it was removing support |  | ||||||
| for using an active monitor interface, which is required for controlling |  | ||||||
| the bitrate as well, since the bitrate is not passed down with a regular |  | ||||||
| monitor interface. |  | ||||||
|  |  | ||||||
| This patch partially reverts the previous one, but keeps support for using |  | ||||||
| a regular monitor interface to keep documented steps working in cases |  | ||||||
| where the bitrate does not matter |  | ||||||
|  |  | ||||||
| Fixes: d9c52fd17cb48 ("ath9k: fix tx99 with monitor mode interface") |  | ||||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |  | ||||||
| --- |  | ||||||
|  |  | ||||||
| --- a/drivers/net/wireless/ath/ath9k/ath9k.h |  | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/ath9k.h |  | ||||||
| @@ -1074,6 +1074,7 @@ struct ath_softc { |  | ||||||
|   |  | ||||||
|  	struct ath_spec_scan_priv spec_priv; |  | ||||||
|   |  | ||||||
| +	struct ieee80211_vif *tx99_vif; |  | ||||||
|  	struct sk_buff *tx99_skb; |  | ||||||
|  	bool tx99_state; |  | ||||||
|  	s16 tx99_power; |  | ||||||
| --- a/drivers/net/wireless/ath/ath9k/main.c |  | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/main.c |  | ||||||
| @@ -1251,8 +1251,13 @@ static int ath9k_add_interface(struct ie |  | ||||||
|  	struct ath_vif *avp = (void *)vif->drv_priv; |  | ||||||
|  	struct ath_node *an = &avp->mcast_node; |  | ||||||
|   |  | ||||||
| -	if (IS_ENABLED(CPTCFG_ATH9K_TX99)) |  | ||||||
| -		return -EOPNOTSUPP; |  | ||||||
| +	if (IS_ENABLED(CPTCFG_ATH9K_TX99)) { |  | ||||||
| +		if (sc->cur_chan->nvifs >= 1) { |  | ||||||
| +			mutex_unlock(&sc->mutex); |  | ||||||
| +			return -EOPNOTSUPP; |  | ||||||
| +		} |  | ||||||
| +		sc->tx99_vif = vif; |  | ||||||
| +	} |  | ||||||
|   |  | ||||||
|  	mutex_lock(&sc->mutex); |  | ||||||
|   |  | ||||||
| @@ -1337,6 +1342,7 @@ static void ath9k_remove_interface(struc |  | ||||||
|  	ath9k_p2p_remove_vif(sc, vif); |  | ||||||
|   |  | ||||||
|  	sc->cur_chan->nvifs--; |  | ||||||
| +	sc->tx99_vif = NULL; |  | ||||||
|  	if (!ath9k_is_chanctx_enabled()) |  | ||||||
|  		list_del(&avp->list); |  | ||||||
|   |  | ||||||
| --- a/drivers/net/wireless/ath/ath9k/tx99.c |  | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/tx99.c |  | ||||||
| @@ -54,6 +54,7 @@ static struct sk_buff *ath9k_build_tx99_ |  | ||||||
|  	struct ieee80211_hdr *hdr; |  | ||||||
|  	struct ieee80211_tx_info *tx_info; |  | ||||||
|  	struct sk_buff *skb; |  | ||||||
| +	struct ath_vif *avp; |  | ||||||
|   |  | ||||||
|  	skb = alloc_skb(len, GFP_KERNEL); |  | ||||||
|  	if (!skb) |  | ||||||
| @@ -71,11 +72,17 @@ static struct sk_buff *ath9k_build_tx99_ |  | ||||||
|  	memcpy(hdr->addr2, hw->wiphy->perm_addr, ETH_ALEN); |  | ||||||
|  	memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN); |  | ||||||
|   |  | ||||||
| +	if (sc->tx99_vif) { |  | ||||||
| +		avp = (struct ath_vif *) sc->tx99_vif->drv_priv; |  | ||||||
| +		hdr->seq_ctrl |= cpu_to_le16(avp->seq_no); |  | ||||||
| +	} |  | ||||||
| + |  | ||||||
|  	tx_info = IEEE80211_SKB_CB(skb); |  | ||||||
|  	memset(tx_info, 0, sizeof(*tx_info)); |  | ||||||
|  	rate = &tx_info->control.rates[0]; |  | ||||||
|  	tx_info->band = sc->cur_chan->chandef.chan->band; |  | ||||||
|  	tx_info->flags = IEEE80211_TX_CTL_NO_ACK; |  | ||||||
| +	tx_info->control.vif = sc->tx99_vif; |  | ||||||
|  	rate->count = 1; |  | ||||||
|  	if (ah->curchan && IS_CHAN_HT(ah->curchan)) { |  | ||||||
|  		rate->flags |= IEEE80211_TX_RC_MCS; |  | ||||||
| --- a/drivers/net/wireless/ath/ath9k/xmit.c |  | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/xmit.c |  | ||||||
| @@ -2974,7 +2974,7 @@ int ath9k_tx99_send(struct ath_softc *sc |  | ||||||
|  		return -EINVAL; |  | ||||||
|  	} |  | ||||||
|   |  | ||||||
| -	ath_set_rates(NULL, NULL, bf); |  | ||||||
| +	ath_set_rates(sc->tx99_vif, NULL, bf); |  | ||||||
|   |  | ||||||
|  	ath9k_hw_set_desc_link(sc->sc_ah, bf->bf_desc, bf->bf_daddr); |  | ||||||
|  	ath9k_hw_tx99_start(sc->sc_ah, txctl->txq->axq_qnum); |  | ||||||
| @@ -1,6 +1,6 @@ | |||||||
| --- a/net/wireless/reg.c | --- a/net/wireless/reg.c | ||||||
| +++ b/net/wireless/reg.c | +++ b/net/wireless/reg.c | ||||||
| @@ -3021,6 +3021,8 @@ void regulatory_hint_country_ie(struct w | @@ -3027,6 +3027,8 @@ void regulatory_hint_country_ie(struct w | ||||||
|  	enum environment_cap env = ENVIRON_ANY; |  	enum environment_cap env = ENVIRON_ANY; | ||||||
|  	struct regulatory_request *request = NULL, *lr; |  	struct regulatory_request *request = NULL, *lr; | ||||||
|   |   | ||||||
| @@ -9,11 +9,11 @@ | |||||||
|  	/* IE len must be evenly divisible by 2 */ |  	/* IE len must be evenly divisible by 2 */ | ||||||
|  	if (country_ie_len & 0x01) |  	if (country_ie_len & 0x01) | ||||||
|  		return; |  		return; | ||||||
| @@ -3227,6 +3229,7 @@ static void restore_regulatory_settings( | @@ -3252,6 +3254,7 @@ static bool is_wiphy_all_set_reg_flag(en | ||||||
|   |   | ||||||
|  void regulatory_hint_disconnect(void) |  void regulatory_hint_disconnect(void) | ||||||
|  { |  { | ||||||
| +	return; | +	return; | ||||||
|  	pr_debug("All devices are disconnected, going to restore regulatory settings\n"); |  	/* Restore of regulatory settings is not required when wiphy(s) | ||||||
|  	restore_regulatory_settings(false); |  	 * ignore IE from connected access point but clearance of beacon hints | ||||||
|  } |  	 * is required when wiphy(s) supports beacon hints. | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ Signed-off-by: Sven Eckelmann <sven@open-mesh.com> | |||||||
|  |  | ||||||
| --- a/drivers/net/wireless/ath/ath10k/core.c | --- a/drivers/net/wireless/ath/ath10k/core.c | ||||||
| +++ b/drivers/net/wireless/ath/ath10k/core.c | +++ b/drivers/net/wireless/ath/ath10k/core.c | ||||||
| @@ -2720,6 +2720,16 @@ int ath10k_core_register(struct ath10k * | @@ -2735,6 +2735,16 @@ int ath10k_core_register(struct ath10k * | ||||||
|  	ar->chip_id = chip_id; |  	ar->chip_id = chip_id; | ||||||
|  	queue_work(ar->workqueue, &ar->register_work); |  	queue_work(ar->workqueue, &ar->register_work); | ||||||
|   |   | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| --- a/drivers/net/wireless/ath/ath10k/mac.c | --- a/drivers/net/wireless/ath/ath10k/mac.c | ||||||
| +++ b/drivers/net/wireless/ath/ath10k/mac.c | +++ b/drivers/net/wireless/ath/ath10k/mac.c | ||||||
| @@ -8286,6 +8286,21 @@ static int ath10k_mac_init_rd(struct ath | @@ -8287,6 +8287,21 @@ static int ath10k_mac_init_rd(struct ath | ||||||
|  	return 0; |  	return 0; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -22,7 +22,7 @@ | |||||||
|  int ath10k_mac_register(struct ath10k *ar) |  int ath10k_mac_register(struct ath10k *ar) | ||||||
|  { |  { | ||||||
|  	static const u32 cipher_suites[] = { |  	static const u32 cipher_suites[] = { | ||||||
| @@ -8575,6 +8590,12 @@ int ath10k_mac_register(struct ath10k *a | @@ -8577,6 +8592,12 @@ int ath10k_mac_register(struct ath10k *a | ||||||
|   |   | ||||||
|  	wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); |  	wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); | ||||||
|   |   | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ v9: use SM/MS macros from code.h to simplify shift/mask handling | |||||||
|  3 files changed, 52 insertions(+), 23 deletions(-) |  3 files changed, 52 insertions(+), 23 deletions(-) | ||||||
| --- a/drivers/net/wireless/ath/ath10k/mac.c | --- a/drivers/net/wireless/ath/ath10k/mac.c | ||||||
| +++ b/drivers/net/wireless/ath/ath10k/mac.c | +++ b/drivers/net/wireless/ath/ath10k/mac.c | ||||||
| @@ -2473,7 +2473,7 @@ static void ath10k_peer_assoc_h_vht(stru | @@ -2474,7 +2474,7 @@ static void ath10k_peer_assoc_h_vht(stru | ||||||
|  	const u16 *vht_mcs_mask; |  	const u16 *vht_mcs_mask; | ||||||
|  	u8 ampdu_factor; |  	u8 ampdu_factor; | ||||||
|  	u8 max_nss, vht_mcs; |  	u8 max_nss, vht_mcs; | ||||||
| @@ -32,7 +32,7 @@ v9: use SM/MS macros from code.h to simplify shift/mask handling | |||||||
|   |   | ||||||
|  	if (WARN_ON(ath10k_mac_vif_chan(vif, &def))) |  	if (WARN_ON(ath10k_mac_vif_chan(vif, &def))) | ||||||
|  		return; |  		return; | ||||||
| @@ -2533,23 +2533,45 @@ static void ath10k_peer_assoc_h_vht(stru | @@ -2534,23 +2534,45 @@ static void ath10k_peer_assoc_h_vht(stru | ||||||
|  		__le16_to_cpu(vht_cap->vht_mcs.tx_highest); |  		__le16_to_cpu(vht_cap->vht_mcs.tx_highest); | ||||||
|  	arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit( |  	arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit( | ||||||
|  		__le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask); |  		__le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask); | ||||||
| @@ -92,7 +92,7 @@ v9: use SM/MS macros from code.h to simplify shift/mask handling | |||||||
|  } |  } | ||||||
|   |   | ||||||
|  static void ath10k_peer_assoc_h_qos(struct ath10k *ar, |  static void ath10k_peer_assoc_h_qos(struct ath10k *ar, | ||||||
| @@ -2701,9 +2723,9 @@ static int ath10k_peer_assoc_prepare(str | @@ -2702,9 +2724,9 @@ static int ath10k_peer_assoc_prepare(str | ||||||
|  	ath10k_peer_assoc_h_crypto(ar, vif, sta, arg); |  	ath10k_peer_assoc_h_crypto(ar, vif, sta, arg); | ||||||
|  	ath10k_peer_assoc_h_rates(ar, vif, sta, arg); |  	ath10k_peer_assoc_h_rates(ar, vif, sta, arg); | ||||||
|  	ath10k_peer_assoc_h_ht(ar, vif, sta, arg); |  	ath10k_peer_assoc_h_ht(ar, vif, sta, arg); | ||||||
| @@ -105,7 +105,7 @@ v9: use SM/MS macros from code.h to simplify shift/mask handling | |||||||
|  } |  } | ||||||
| --- a/drivers/net/wireless/ath/ath10k/wmi.c | --- a/drivers/net/wireless/ath/ath10k/wmi.c | ||||||
| +++ b/drivers/net/wireless/ath/ath10k/wmi.c | +++ b/drivers/net/wireless/ath/ath10k/wmi.c | ||||||
| @@ -7357,12 +7357,7 @@ ath10k_wmi_peer_assoc_fill_10_4(struct a | @@ -7365,12 +7365,7 @@ ath10k_wmi_peer_assoc_fill_10_4(struct a | ||||||
|  	struct wmi_10_4_peer_assoc_complete_cmd *cmd = buf; |  	struct wmi_10_4_peer_assoc_complete_cmd *cmd = buf; | ||||||
|   |   | ||||||
|  	ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg); |  	ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg); | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ v2: fix trailing whitespace issue and fix some typos within the commit note | |||||||
|  2 files changed, 8 insertions(+), 10 deletions(-) |  2 files changed, 8 insertions(+), 10 deletions(-) | ||||||
| --- a/drivers/net/wireless/ath/ath10k/mac.c | --- a/drivers/net/wireless/ath/ath10k/mac.c | ||||||
| +++ b/drivers/net/wireless/ath/ath10k/mac.c | +++ b/drivers/net/wireless/ath/ath10k/mac.c | ||||||
| @@ -4477,13 +4477,6 @@ static struct ieee80211_sta_vht_cap ath1 | @@ -4478,13 +4478,6 @@ static struct ieee80211_sta_vht_cap ath1 | ||||||
|  		vht_cap.cap |= val; |  		vht_cap.cap |= val; | ||||||
|  	} |  	} | ||||||
|   |   | ||||||
|   | |||||||
| @@ -140,7 +140,7 @@ v13: | |||||||
|  		.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR, |  		.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR, | ||||||
|  		.uart_pin = 7, |  		.uart_pin = 7, | ||||||
|  		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL, |  		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL, | ||||||
| @@ -129,6 +131,7 @@ static const struct ath10k_hw_params ath | @@ -131,6 +133,7 @@ static const struct ath10k_hw_params ath | ||||||
|  		.id = QCA9887_HW_1_0_VERSION, |  		.id = QCA9887_HW_1_0_VERSION, | ||||||
|  		.dev_id = QCA9887_1_0_DEVICE_ID, |  		.dev_id = QCA9887_1_0_DEVICE_ID, | ||||||
|  		.name = "qca9887 hw1.0", |  		.name = "qca9887 hw1.0", | ||||||
| @@ -148,7 +148,7 @@ v13: | |||||||
|  		.patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR, |  		.patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR, | ||||||
|  		.uart_pin = 7, |  		.uart_pin = 7, | ||||||
|  		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL, |  		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL, | ||||||
| @@ -293,6 +296,7 @@ static const struct ath10k_hw_params ath | @@ -300,6 +303,7 @@ static const struct ath10k_hw_params ath | ||||||
|  		.id = QCA99X0_HW_2_0_DEV_VERSION, |  		.id = QCA99X0_HW_2_0_DEV_VERSION, | ||||||
|  		.dev_id = QCA99X0_2_0_DEVICE_ID, |  		.dev_id = QCA99X0_2_0_DEVICE_ID, | ||||||
|  		.name = "qca99x0 hw2.0", |  		.name = "qca99x0 hw2.0", | ||||||
| @@ -156,7 +156,7 @@ v13: | |||||||
|  		.patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR, |  		.patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR, | ||||||
|  		.uart_pin = 7, |  		.uart_pin = 7, | ||||||
|  		.otp_exe_param = 0x00000700, |  		.otp_exe_param = 0x00000700, | ||||||
| @@ -331,6 +335,7 @@ static const struct ath10k_hw_params ath | @@ -339,6 +343,7 @@ static const struct ath10k_hw_params ath | ||||||
|  		.id = QCA9984_HW_1_0_DEV_VERSION, |  		.id = QCA9984_HW_1_0_DEV_VERSION, | ||||||
|  		.dev_id = QCA9984_1_0_DEVICE_ID, |  		.dev_id = QCA9984_1_0_DEVICE_ID, | ||||||
|  		.name = "qca9984/qca9994 hw1.0", |  		.name = "qca9984/qca9994 hw1.0", | ||||||
| @@ -164,7 +164,7 @@ v13: | |||||||
|  		.patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR, |  		.patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR, | ||||||
|  		.uart_pin = 7, |  		.uart_pin = 7, | ||||||
|  		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH, |  		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH, | ||||||
| @@ -374,6 +379,7 @@ static const struct ath10k_hw_params ath | @@ -383,6 +388,7 @@ static const struct ath10k_hw_params ath | ||||||
|  		.id = QCA9888_HW_2_0_DEV_VERSION, |  		.id = QCA9888_HW_2_0_DEV_VERSION, | ||||||
|  		.dev_id = QCA9888_2_0_DEVICE_ID, |  		.dev_id = QCA9888_2_0_DEVICE_ID, | ||||||
|  		.name = "qca9888 hw2.0", |  		.name = "qca9888 hw2.0", | ||||||
| @@ -172,7 +172,7 @@ v13: | |||||||
|  		.patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR, |  		.patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR, | ||||||
|  		.uart_pin = 7, |  		.uart_pin = 7, | ||||||
|  		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH, |  		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH, | ||||||
| @@ -2441,6 +2447,10 @@ int ath10k_core_start(struct ath10k *ar, | @@ -2456,6 +2462,10 @@ int ath10k_core_start(struct ath10k *ar, | ||||||
|  	if (status) |  	if (status) | ||||||
|  		goto err_hif_stop; |  		goto err_hif_stop; | ||||||
|   |   | ||||||
| @@ -183,7 +183,7 @@ v13: | |||||||
|  	return 0; |  	return 0; | ||||||
|   |   | ||||||
|  err_hif_stop: |  err_hif_stop: | ||||||
| @@ -2695,9 +2705,18 @@ static void ath10k_core_register_work(st | @@ -2710,9 +2720,18 @@ static void ath10k_core_register_work(st | ||||||
|  		goto err_spectral_destroy; |  		goto err_spectral_destroy; | ||||||
|  	} |  	} | ||||||
|   |   | ||||||
| @@ -202,7 +202,7 @@ v13: | |||||||
|  err_spectral_destroy: |  err_spectral_destroy: | ||||||
|  	ath10k_spectral_destroy(ar); |  	ath10k_spectral_destroy(ar); | ||||||
|  err_debug_destroy: |  err_debug_destroy: | ||||||
| @@ -2741,6 +2760,8 @@ void ath10k_core_unregister(struct ath10 | @@ -2756,6 +2775,8 @@ void ath10k_core_unregister(struct ath10 | ||||||
|  	if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags)) |  	if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags)) | ||||||
|  		return; |  		return; | ||||||
|   |   | ||||||
| @@ -405,7 +405,7 @@ v13: | |||||||
| +#endif /* _LEDS_H_ */ | +#endif /* _LEDS_H_ */ | ||||||
| --- a/drivers/net/wireless/ath/ath10k/mac.c | --- a/drivers/net/wireless/ath/ath10k/mac.c | ||||||
| +++ b/drivers/net/wireless/ath/ath10k/mac.c | +++ b/drivers/net/wireless/ath/ath10k/mac.c | ||||||
| @@ -33,6 +33,7 @@ | @@ -34,6 +34,7 @@ | ||||||
|  #include "wmi-tlv.h" |  #include "wmi-tlv.h" | ||||||
|  #include "wmi-ops.h" |  #include "wmi-ops.h" | ||||||
|  #include "wow.h" |  #include "wow.h" | ||||||
| @@ -475,7 +475,7 @@ v13: | |||||||
|  static const struct wmi_peer_flags_map wmi_tlv_peer_flags_map = { |  static const struct wmi_peer_flags_map wmi_tlv_peer_flags_map = { | ||||||
| --- a/drivers/net/wireless/ath/ath10k/wmi.c | --- a/drivers/net/wireless/ath/ath10k/wmi.c | ||||||
| +++ b/drivers/net/wireless/ath/ath10k/wmi.c | +++ b/drivers/net/wireless/ath/ath10k/wmi.c | ||||||
| @@ -7177,6 +7177,49 @@ ath10k_wmi_op_gen_peer_set_param(struct | @@ -7185,6 +7185,49 @@ ath10k_wmi_op_gen_peer_set_param(struct | ||||||
|  	return skb; |  	return skb; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -525,7 +525,7 @@ v13: | |||||||
|  static struct sk_buff * |  static struct sk_buff * | ||||||
|  ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id, |  ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id, | ||||||
|  			     enum wmi_sta_ps_mode psmode) |  			     enum wmi_sta_ps_mode psmode) | ||||||
| @@ -8788,6 +8831,9 @@ static const struct wmi_ops wmi_ops = { | @@ -8796,6 +8839,9 @@ static const struct wmi_ops wmi_ops = { | ||||||
|  	.fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill, |  	.fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill, | ||||||
|  	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, |  	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, | ||||||
|  	.gen_echo = ath10k_wmi_op_gen_echo, |  	.gen_echo = ath10k_wmi_op_gen_echo, | ||||||
| @@ -535,7 +535,7 @@ v13: | |||||||
|  	/* .gen_bcn_tmpl not implemented */ |  	/* .gen_bcn_tmpl not implemented */ | ||||||
|  	/* .gen_prb_tmpl not implemented */ |  	/* .gen_prb_tmpl not implemented */ | ||||||
|  	/* .gen_p2p_go_bcn_ie not implemented */ |  	/* .gen_p2p_go_bcn_ie not implemented */ | ||||||
| @@ -8858,6 +8904,8 @@ static const struct wmi_ops wmi_10_1_ops | @@ -8866,6 +8912,8 @@ static const struct wmi_ops wmi_10_1_ops | ||||||
|  	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, |  	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, | ||||||
|  	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, |  	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, | ||||||
|  	.gen_echo = ath10k_wmi_op_gen_echo, |  	.gen_echo = ath10k_wmi_op_gen_echo, | ||||||
| @@ -544,7 +544,7 @@ v13: | |||||||
|  	/* .gen_bcn_tmpl not implemented */ |  	/* .gen_bcn_tmpl not implemented */ | ||||||
|  	/* .gen_prb_tmpl not implemented */ |  	/* .gen_prb_tmpl not implemented */ | ||||||
|  	/* .gen_p2p_go_bcn_ie not implemented */ |  	/* .gen_p2p_go_bcn_ie not implemented */ | ||||||
| @@ -8929,6 +8977,8 @@ static const struct wmi_ops wmi_10_2_ops | @@ -8937,6 +8985,8 @@ static const struct wmi_ops wmi_10_2_ops | ||||||
|  	.gen_delba_send = ath10k_wmi_op_gen_delba_send, |  	.gen_delba_send = ath10k_wmi_op_gen_delba_send, | ||||||
|  	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, |  	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, | ||||||
|  	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, |  	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, | ||||||
| @@ -553,7 +553,7 @@ v13: | |||||||
|  	/* .gen_pdev_enable_adaptive_cca not implemented */ |  	/* .gen_pdev_enable_adaptive_cca not implemented */ | ||||||
|  }; |  }; | ||||||
|   |   | ||||||
| @@ -8999,6 +9049,8 @@ static const struct wmi_ops wmi_10_2_4_o | @@ -9007,6 +9057,8 @@ static const struct wmi_ops wmi_10_2_4_o | ||||||
|  	.gen_pdev_enable_adaptive_cca = |  	.gen_pdev_enable_adaptive_cca = | ||||||
|  		ath10k_wmi_op_gen_pdev_enable_adaptive_cca, |  		ath10k_wmi_op_gen_pdev_enable_adaptive_cca, | ||||||
|  	.get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype, |  	.get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype, | ||||||
| @@ -562,7 +562,7 @@ v13: | |||||||
|  	/* .gen_bcn_tmpl not implemented */ |  	/* .gen_bcn_tmpl not implemented */ | ||||||
|  	/* .gen_prb_tmpl not implemented */ |  	/* .gen_prb_tmpl not implemented */ | ||||||
|  	/* .gen_p2p_go_bcn_ie not implemented */ |  	/* .gen_p2p_go_bcn_ie not implemented */ | ||||||
| @@ -9078,6 +9130,8 @@ static const struct wmi_ops wmi_10_4_ops | @@ -9086,6 +9138,8 @@ static const struct wmi_ops wmi_10_4_ops | ||||||
|  	.gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info, |  	.gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info, | ||||||
|  	.gen_echo = ath10k_wmi_op_gen_echo, |  	.gen_echo = ath10k_wmi_op_gen_echo, | ||||||
|  	.gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config, |  	.gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config, | ||||||
|   | |||||||
| @@ -42,7 +42,7 @@ Signed-off-by: Mathias Kresin <dev@kresin.me> | |||||||
|  	if (ret) |  	if (ret) | ||||||
| --- a/drivers/net/wireless/ath/ath10k/mac.c | --- a/drivers/net/wireless/ath/ath10k/mac.c | ||||||
| +++ b/drivers/net/wireless/ath/ath10k/mac.c | +++ b/drivers/net/wireless/ath/ath10k/mac.c | ||||||
| @@ -8607,7 +8607,7 @@ int ath10k_mac_register(struct ath10k *a | @@ -8609,7 +8609,7 @@ int ath10k_mac_register(struct ath10k *a | ||||||
|  	wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); |  	wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); | ||||||
|   |   | ||||||
|  #ifdef CPTCFG_MAC80211_LEDS |  #ifdef CPTCFG_MAC80211_LEDS | ||||||
|   | |||||||
| @@ -1,39 +0,0 @@ | |||||||
| From bbf0a8af2261bc7ae39b227ff6a1e9f45a008c27 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Sven Eckelmann <sven.eckelmann@openmesh.com> |  | ||||||
| Date: Mon, 30 Jul 2018 17:31:41 +0200 |  | ||||||
| Subject: [PATCH] ath10k: Limit available channels via DT ieee80211-freq-limit |  | ||||||
|  |  | ||||||
| Tri-band devices (1x 2.4GHz + 2x 5GHz) often incorporate special filters in |  | ||||||
| the RX and TX path. These filtered channel can in theory still be used by |  | ||||||
| the hardware but the signal strength is reduced so much that it makes no |  | ||||||
| sense. |  | ||||||
|  |  | ||||||
| There is already a DT property to limit the available channels but ath10k |  | ||||||
| has to manually call this functionality to limit the currrently set wiphy |  | ||||||
| channels further. |  | ||||||
|  |  | ||||||
| Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com> |  | ||||||
|  |  | ||||||
| Forwarded: https://patchwork.kernel.org/patch/10549245/ |  | ||||||
| --- |  | ||||||
|  drivers/net/wireless/ath/ath10k/mac.c | 2 ++ |  | ||||||
|  1 file changed, 2 insertions(+) |  | ||||||
|  |  | ||||||
| --- a/drivers/net/wireless/ath/ath10k/mac.c |  | ||||||
| +++ b/drivers/net/wireless/ath/ath10k/mac.c |  | ||||||
| @@ -18,6 +18,7 @@ |  | ||||||
|   |  | ||||||
|  #include "mac.h" |  | ||||||
|   |  | ||||||
| +#include <net/cfg80211.h> |  | ||||||
|  #include <net/mac80211.h> |  | ||||||
|  #include <linux/etherdevice.h> |  | ||||||
|  #include <linux/acpi.h> |  | ||||||
| @@ -8394,6 +8395,7 @@ int ath10k_mac_register(struct ath10k *a |  | ||||||
|  		ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band; |  | ||||||
|  	} |  | ||||||
|   |  | ||||||
| +	wiphy_read_of_freq_limits(ar->hw->wiphy); |  | ||||||
|  	ath10k_mac_setup_ht_vht_cap(ar); |  | ||||||
|   |  | ||||||
|  	ar->hw->wiphy->interface_modes = |  | ||||||
| @@ -1,38 +0,0 @@ | |||||||
| From cb18e2e9ec71d42409a51b83546686c609780dde Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Rasmus Villemoes <linux@rasmusvillemoes.dk> |  | ||||||
| Date: Wed, 22 Aug 2018 15:22:15 +0200 |  | ||||||
| Subject: [PATCH] brcmfmac: fix wrong strnchr usage |  | ||||||
|  |  | ||||||
| strnchr takes arguments in the order of its name: string, max bytes to |  | ||||||
| read, character to search for. Here we're passing '\n' aka 10 as the |  | ||||||
| buffer size, and searching for sizeof(buf) aka BRCMF_DCMD_SMLEN aka |  | ||||||
| 256 (aka '\0', since it's implicitly converted to char) within those 10 |  | ||||||
| bytes. |  | ||||||
|  |  | ||||||
| Just interchanging the last two arguments would still leave a bug, |  | ||||||
| because if we've been successful once, there are not sizeof(buf) |  | ||||||
| characters left after the new value of p. |  | ||||||
|  |  | ||||||
| Since clmver is immediately afterwards passed as a %s argument, I assume |  | ||||||
| that it is actually a properly nul-terminated string. For that case, we |  | ||||||
| have strreplace(). |  | ||||||
|  |  | ||||||
| Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> |  | ||||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> |  | ||||||
| --- |  | ||||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 4 +--- |  | ||||||
|  1 file changed, 1 insertion(+), 3 deletions(-) |  | ||||||
|  |  | ||||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c |  | ||||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c |  | ||||||
| @@ -296,9 +296,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i |  | ||||||
|  		/* Replace all newline/linefeed characters with space |  | ||||||
|  		 * character |  | ||||||
|  		 */ |  | ||||||
| -		ptr = clmver; |  | ||||||
| -		while ((ptr = strnchr(ptr, '\n', sizeof(buf))) != NULL) |  | ||||||
| -			*ptr = ' '; |  | ||||||
| +		strreplace(clmver, '\n', ' '); |  | ||||||
|   |  | ||||||
|  		brcmf_dbg(INFO, "CLM version = %s\n", clmver); |  | ||||||
|  	} |  | ||||||
| @@ -1,28 +0,0 @@ | |||||||
| From: Arend van Spriel <arend.vanspriel@broadcom.com> |  | ||||||
| Date: Wed, 5 Sep 2018 09:48:59 +0200 |  | ||||||
| Subject: [PATCH] brcmfmac: increase buffer for obtaining firmware capabilities |  | ||||||
|  |  | ||||||
| When obtaining the firmware capability a buffer is provided of 512 |  | ||||||
| bytes. However, if all features in firmware are supported the buffer |  | ||||||
| needs to be 565 bytes as otherwise truncated information is retrieved |  | ||||||
| from firmware. Increasing the buffer to 768 bytes on stack. |  | ||||||
|  |  | ||||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> |  | ||||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> |  | ||||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> |  | ||||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> |  | ||||||
| --- |  | ||||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c | 2 +- |  | ||||||
|  1 file changed, 1 insertion(+), 1 deletion(-) |  | ||||||
|  |  | ||||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c |  | ||||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c |  | ||||||
| @@ -178,7 +178,7 @@ static void brcmf_feat_iovar_data_set(st |  | ||||||
|  	ifp->fwil_fwerr = false; |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| -#define MAX_CAPS_BUFFER_SIZE	512 |  | ||||||
| +#define MAX_CAPS_BUFFER_SIZE	768 |  | ||||||
|  static void brcmf_feat_firmware_capabilities(struct brcmf_if *ifp) |  | ||||||
|  { |  | ||||||
|  	char caps[MAX_CAPS_BUFFER_SIZE]; |  | ||||||
| @@ -148,7 +148,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | |||||||
|  	MAX_NL80211_EXT_FEATURES = NUM_NL80211_EXT_FEATURES - 1 |  	MAX_NL80211_EXT_FEATURES = NUM_NL80211_EXT_FEATURES - 1 | ||||||
| --- a/net/wireless/nl80211.c | --- a/net/wireless/nl80211.c | ||||||
| +++ b/net/wireless/nl80211.c | +++ b/net/wireless/nl80211.c | ||||||
| @@ -462,6 +462,7 @@ static const struct nla_policy nl80211_p | @@ -463,6 +463,7 @@ static const struct nla_policy nl80211_p | ||||||
|  	[NL80211_ATTR_TXQ_QUANTUM] = { .type = NLA_U32 }, |  	[NL80211_ATTR_TXQ_QUANTUM] = { .type = NLA_U32 }, | ||||||
|  	[NL80211_ATTR_HE_CAPABILITY] = { .type = NLA_BINARY, |  	[NL80211_ATTR_HE_CAPABILITY] = { .type = NLA_BINARY, | ||||||
|  					 .len = NL80211_HE_MAX_CAPABILITY_LEN }, |  					 .len = NL80211_HE_MAX_CAPABILITY_LEN }, | ||||||
| @@ -156,7 +156,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | |||||||
|  }; |  }; | ||||||
|   |   | ||||||
|  /* policy for the key attributes */ |  /* policy for the key attributes */ | ||||||
| @@ -4702,6 +4703,11 @@ static int nl80211_send_station(struct s | @@ -4703,6 +4704,11 @@ static int nl80211_send_station(struct s | ||||||
|  	PUT_SINFO(PLID, plid, u16); |  	PUT_SINFO(PLID, plid, u16); | ||||||
|  	PUT_SINFO(PLINK_STATE, plink_state, u8); |  	PUT_SINFO(PLINK_STATE, plink_state, u8); | ||||||
|  	PUT_SINFO_U64(RX_DURATION, rx_duration); |  	PUT_SINFO_U64(RX_DURATION, rx_duration); | ||||||
| @@ -168,7 +168,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | |||||||
|   |   | ||||||
|  	switch (rdev->wiphy.signal_type) { |  	switch (rdev->wiphy.signal_type) { | ||||||
|  	case CFG80211_SIGNAL_TYPE_MBM: |  	case CFG80211_SIGNAL_TYPE_MBM: | ||||||
| @@ -5338,6 +5344,15 @@ static int nl80211_set_station(struct sk | @@ -5339,6 +5345,15 @@ static int nl80211_set_station(struct sk | ||||||
|  			nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); |  			nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); | ||||||
|  	} |  	} | ||||||
|   |   | ||||||
| @@ -184,7 +184,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | |||||||
|  	/* Include parameters for TDLS peer (will check later) */ |  	/* Include parameters for TDLS peer (will check later) */ | ||||||
|  	err = nl80211_set_station_tdls(info, ¶ms); |  	err = nl80211_set_station_tdls(info, ¶ms); | ||||||
|  	if (err) |  	if (err) | ||||||
| @@ -5476,6 +5491,15 @@ static int nl80211_new_station(struct sk | @@ -5477,6 +5492,15 @@ static int nl80211_new_station(struct sk | ||||||
|  			return -EINVAL; |  			return -EINVAL; | ||||||
|  	} |  	} | ||||||
|   |   | ||||||
|   | |||||||
| @@ -10,37 +10,53 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  |  | ||||||
| --- a/include/net/fq_impl.h | --- a/include/net/fq_impl.h | ||||||
| +++ b/include/net/fq_impl.h | +++ b/include/net/fq_impl.h | ||||||
| @@ -107,21 +107,23 @@ begin: | @@ -107,29 +107,31 @@ begin: | ||||||
|  	return skb; |  	return skb; | ||||||
|  } |  } | ||||||
|   |   | ||||||
|  | -static struct fq_flow *fq_flow_classify(struct fq *fq, | ||||||
|  | -					struct fq_tin *tin, | ||||||
|  | -					struct sk_buff *skb, | ||||||
|  | -					fq_flow_get_default_t get_default_func) | ||||||
| +static u32 fq_flow_idx(struct fq *fq, struct sk_buff *skb) | +static u32 fq_flow_idx(struct fq *fq, struct sk_buff *skb) | ||||||
| +{ |  { | ||||||
|  | -	struct fq_flow *flow; | ||||||
|  | -	u32 hash; | ||||||
|  | -	u32 idx; | ||||||
|  | - | ||||||
|  | -	lockdep_assert_held(&fq->lock); | ||||||
|  | - | ||||||
|  |  #if LINUX_VERSION_IS_GEQ(5,3,10) || \ | ||||||
|  |      LINUX_VERSION_IN_RANGE(4,19,83, 4,20,0) || \ | ||||||
|  |      LINUX_VERSION_IN_RANGE(4,14,153, 4,15,0) || \ | ||||||
|  |      LINUX_VERSION_IN_RANGE(4,9,200, 4,10,0) || \ | ||||||
|  |      LINUX_VERSION_IN_RANGE(4,4,200, 4,5,0) | ||||||
|  | -	hash = skb_get_hash_perturb(skb, &fq->perturbation); | ||||||
|  | +	u32 hash = skb_get_hash_perturb(skb, &fq->perturbation); | ||||||
|  |  #else | ||||||
|  | -	hash = skb_get_hash_perturb(skb, fq->perturbation); | ||||||
| +	u32 hash = skb_get_hash_perturb(skb, fq->perturbation); | +	u32 hash = skb_get_hash_perturb(skb, fq->perturbation); | ||||||
| + |  #endif | ||||||
|  | -	idx = reciprocal_scale(hash, fq->flows_cnt); | ||||||
|  | -	flow = &fq->flows[idx]; | ||||||
|  |   | ||||||
| +	return reciprocal_scale(hash, fq->flows_cnt); | +	return reciprocal_scale(hash, fq->flows_cnt); | ||||||
| +} | +} | ||||||
| + | + | ||||||
|  static struct fq_flow *fq_flow_classify(struct fq *fq, | +static struct fq_flow *fq_flow_classify(struct fq *fq, | ||||||
| -					struct fq_tin *tin, |  | ||||||
| +					struct fq_tin *tin, u32 idx, | +					struct fq_tin *tin, u32 idx, | ||||||
|  					struct sk_buff *skb, | +					struct sk_buff *skb, | ||||||
|  					fq_flow_get_default_t get_default_func) | +					fq_flow_get_default_t get_default_func) | ||||||
|  { | +{ | ||||||
|  	struct fq_flow *flow; | +	struct fq_flow *flow; | ||||||
| -	u32 hash; | + | ||||||
| -	u32 idx; | +	lockdep_assert_held(&fq->lock); | ||||||
|   | + | ||||||
|  	lockdep_assert_held(&fq->lock); | +	flow = &fq->flows[idx]; | ||||||
|   |  | ||||||
| -	hash = skb_get_hash_perturb(skb, fq->perturbation); |  | ||||||
| -	idx = reciprocal_scale(hash, fq->flows_cnt); |  | ||||||
|  	flow = &fq->flows[idx]; |  | ||||||
| - |  | ||||||
|  	if (flow->tin && flow->tin != tin) { |  	if (flow->tin && flow->tin != tin) { | ||||||
|  		flow = get_default_func(fq, tin, idx, skb); |  		flow = get_default_func(fq, tin, idx, skb); | ||||||
|  		tin->collisions++; |  		tin->collisions++; | ||||||
| @@ -153,7 +155,7 @@ static void fq_recalc_backlog(struct fq | @@ -161,7 +163,7 @@ static void fq_recalc_backlog(struct fq | ||||||
|  } |  } | ||||||
|   |   | ||||||
|  static void fq_tin_enqueue(struct fq *fq, |  static void fq_tin_enqueue(struct fq *fq, | ||||||
| @@ -49,7 +65,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  			   struct sk_buff *skb, |  			   struct sk_buff *skb, | ||||||
|  			   fq_skb_free_t free_func, |  			   fq_skb_free_t free_func, | ||||||
|  			   fq_flow_get_default_t get_default_func) |  			   fq_flow_get_default_t get_default_func) | ||||||
| @@ -163,7 +165,7 @@ static void fq_tin_enqueue(struct fq *fq | @@ -171,7 +173,7 @@ static void fq_tin_enqueue(struct fq *fq | ||||||
|   |   | ||||||
|  	lockdep_assert_held(&fq->lock); |  	lockdep_assert_held(&fq->lock); | ||||||
|   |   | ||||||
|   | |||||||
| @@ -78,7 +78,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | |||||||
|  	} |  	} | ||||||
|   |   | ||||||
|  	/* flush out frame - make sure the deauth was actually sent */ |  	/* flush out frame - make sure the deauth was actually sent */ | ||||||
| @@ -4371,7 +4372,7 @@ void ieee80211_mgd_quiesce(struct ieee80 | @@ -4369,7 +4370,7 @@ void ieee80211_mgd_quiesce(struct ieee80 | ||||||
|  		 * cfg80211 won't know and won't actually abort those attempts, |  		 * cfg80211 won't know and won't actually abort those attempts, | ||||||
|  		 * thus we need to do that ourselves. |  		 * thus we need to do that ourselves. | ||||||
|  		 */ |  		 */ | ||||||
| @@ -87,7 +87,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | |||||||
|  					       IEEE80211_STYPE_DEAUTH, |  					       IEEE80211_STYPE_DEAUTH, | ||||||
|  					       WLAN_REASON_DEAUTH_LEAVING, |  					       WLAN_REASON_DEAUTH_LEAVING, | ||||||
|  					       false, frame_buf); |  					       false, frame_buf); | ||||||
| @@ -5351,7 +5352,7 @@ int ieee80211_mgd_deauth(struct ieee8021 | @@ -5349,7 +5350,7 @@ int ieee80211_mgd_deauth(struct ieee8021 | ||||||
|  			   ieee80211_get_reason_code_string(req->reason_code)); |  			   ieee80211_get_reason_code_string(req->reason_code)); | ||||||
|   |   | ||||||
|  		drv_mgd_prepare_tx(sdata->local, sdata, 0); |  		drv_mgd_prepare_tx(sdata->local, sdata, 0); | ||||||
| @@ -96,7 +96,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | |||||||
|  					       IEEE80211_STYPE_DEAUTH, |  					       IEEE80211_STYPE_DEAUTH, | ||||||
|  					       req->reason_code, tx, |  					       req->reason_code, tx, | ||||||
|  					       frame_buf); |  					       frame_buf); | ||||||
| @@ -5371,7 +5372,7 @@ int ieee80211_mgd_deauth(struct ieee8021 | @@ -5369,7 +5370,7 @@ int ieee80211_mgd_deauth(struct ieee8021 | ||||||
|  			   ieee80211_get_reason_code_string(req->reason_code)); |  			   ieee80211_get_reason_code_string(req->reason_code)); | ||||||
|   |   | ||||||
|  		drv_mgd_prepare_tx(sdata->local, sdata, 0); |  		drv_mgd_prepare_tx(sdata->local, sdata, 0); | ||||||
|   | |||||||
| @@ -1,68 +0,0 @@ | |||||||
| From e3c57dd949835419cee8d3b45db38de58bf6ebd5 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Hauke Mehrtens <hauke@hauke-m.de> |  | ||||||
| Date: Mon, 18 Nov 2019 01:13:37 +0100 |  | ||||||
| Subject: [PATCH] backports: Adapt to changes to skb_get_hash_perturb() |  | ||||||
|  |  | ||||||
| The skb_get_hash_perturb() function now takes a siphash_key_t instead of |  | ||||||
| an u32. This was changed in commit 55667441c84f ("net/flow_dissector: |  | ||||||
| switch to siphash"). Use the correct type in the fq header file |  | ||||||
| depending on the kernel version. |  | ||||||
|  |  | ||||||
| Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> |  | ||||||
| --- |  | ||||||
|  include/net/fq.h      | 8 ++++++++ |  | ||||||
|  include/net/fq_impl.h | 8 ++++++++ |  | ||||||
|  2 files changed, 16 insertions(+) |  | ||||||
|  |  | ||||||
| --- a/include/net/fq.h |  | ||||||
| +++ b/include/net/fq.h |  | ||||||
| @@ -70,7 +70,15 @@ struct fq { |  | ||||||
|  	struct list_head backlogs; |  | ||||||
|  	spinlock_t lock; |  | ||||||
|  	u32 flows_cnt; |  | ||||||
| +#if LINUX_VERSION_IS_GEQ(5,3,10) || \ |  | ||||||
| +    LINUX_VERSION_IN_RANGE(4,19,83, 4,20,0) || \ |  | ||||||
| +    LINUX_VERSION_IN_RANGE(4,14,153, 4,15,0) || \ |  | ||||||
| +    LINUX_VERSION_IN_RANGE(4,9,200, 4,10,0) || \ |  | ||||||
| +    LINUX_VERSION_IN_RANGE(4,4,200, 4,5,0) |  | ||||||
| +	siphash_key_t	perturbation; |  | ||||||
| +#else |  | ||||||
|  	u32 perturbation; |  | ||||||
| +#endif |  | ||||||
|  	u32 limit; |  | ||||||
|  	u32 memory_limit; |  | ||||||
|  	u32 memory_usage; |  | ||||||
| --- a/include/net/fq_impl.h |  | ||||||
| +++ b/include/net/fq_impl.h |  | ||||||
| @@ -109,7 +109,15 @@ begin: |  | ||||||
|   |  | ||||||
|  static u32 fq_flow_idx(struct fq *fq, struct sk_buff *skb) |  | ||||||
|  { |  | ||||||
| +#if LINUX_VERSION_IS_GEQ(5,3,10) || \ |  | ||||||
| +    LINUX_VERSION_IN_RANGE(4,19,83, 4,20,0) || \ |  | ||||||
| +    LINUX_VERSION_IN_RANGE(4,14,153, 4,15,0) || \ |  | ||||||
| +    LINUX_VERSION_IN_RANGE(4,9,200, 4,10,0) || \ |  | ||||||
| +    LINUX_VERSION_IN_RANGE(4,4,200, 4,5,0) |  | ||||||
| +	u32 hash = skb_get_hash_perturb(skb, &fq->perturbation); |  | ||||||
| +#else |  | ||||||
|  	u32 hash = skb_get_hash_perturb(skb, fq->perturbation); |  | ||||||
| +#endif |  | ||||||
|   |  | ||||||
|  	return reciprocal_scale(hash, fq->flows_cnt); |  | ||||||
|  } |  | ||||||
| @@ -309,7 +317,15 @@ static int fq_init(struct fq *fq, int fl |  | ||||||
|  	INIT_LIST_HEAD(&fq->backlogs); |  | ||||||
|  	spin_lock_init(&fq->lock); |  | ||||||
|  	fq->flows_cnt = max_t(u32, flows_cnt, 1); |  | ||||||
| +#if LINUX_VERSION_IS_GEQ(5,3,10) || \ |  | ||||||
| +    LINUX_VERSION_IN_RANGE(4,19,83, 4,20,0) || \ |  | ||||||
| +    LINUX_VERSION_IN_RANGE(4,14,153, 4,15,0) || \ |  | ||||||
| +    LINUX_VERSION_IN_RANGE(4,9,200, 4,10,0) || \ |  | ||||||
| +    LINUX_VERSION_IN_RANGE(4,4,200, 4,5,0) |  | ||||||
| +	get_random_bytes(&fq->perturbation, sizeof(fq->perturbation)); |  | ||||||
| +#else |  | ||||||
|  	fq->perturbation = prandom_u32(); |  | ||||||
| +#endif |  | ||||||
|  	fq->quantum = 300; |  | ||||||
|  	fq->limit = 8192; |  | ||||||
|  	fq->memory_limit = 16 << 20; /* 16 MBytes */ |  | ||||||
| @@ -129,7 +129,7 @@ | |||||||
|  	local->user_power_level = IEEE80211_UNSET_POWER_LEVEL; |  	local->user_power_level = IEEE80211_UNSET_POWER_LEVEL; | ||||||
| --- a/net/wireless/nl80211.c | --- a/net/wireless/nl80211.c | ||||||
| +++ b/net/wireless/nl80211.c | +++ b/net/wireless/nl80211.c | ||||||
| @@ -463,6 +463,7 @@ static const struct nla_policy nl80211_p | @@ -464,6 +464,7 @@ static const struct nla_policy nl80211_p | ||||||
|  	[NL80211_ATTR_HE_CAPABILITY] = { .type = NLA_BINARY, |  	[NL80211_ATTR_HE_CAPABILITY] = { .type = NLA_BINARY, | ||||||
|  					 .len = NL80211_HE_MAX_CAPABILITY_LEN }, |  					 .len = NL80211_HE_MAX_CAPABILITY_LEN }, | ||||||
|  	[NL80211_ATTR_AIRTIME_WEIGHT] = NLA_POLICY_MIN(NLA_U16, 1), |  	[NL80211_ATTR_AIRTIME_WEIGHT] = NLA_POLICY_MIN(NLA_U16, 1), | ||||||
| @@ -137,7 +137,7 @@ | |||||||
|  }; |  }; | ||||||
|   |   | ||||||
|  /* policy for the key attributes */ |  /* policy for the key attributes */ | ||||||
| @@ -2622,6 +2623,20 @@ static int nl80211_set_wiphy(struct sk_b | @@ -2623,6 +2624,20 @@ static int nl80211_set_wiphy(struct sk_b | ||||||
|  		if (result) |  		if (result) | ||||||
|  			return result; |  			return result; | ||||||
|  	} |  	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Hauke Mehrtens
					Hauke Mehrtens