Merge ~canonical-hwe-team/ubuntu/+source/backport-iwlwifi-dkms/+git/backport-iwlwifi-dkms:vicamo/for-hwe/sync-debian-7906 into ~canonical-hwe-team/ubuntu/+source/backport-iwlwifi-dkms/+git/backport-iwlwifi-dkms:ubuntu/master
- Git
- lp:~canonical-hwe-team/ubuntu/+source/backport-iwlwifi-dkms/+git/backport-iwlwifi-dkms
- vicamo/for-hwe/sync-debian-7906
- Merge into ubuntu/master
Proposed by
You-Sheng Yang
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | You-Sheng Yang | ||||
Approved revision: | 7a7c921e3ef0534469277d77219db5e8e144c15a | ||||
Merged at revision: | 7a7c921e3ef0534469277d77219db5e8e144c15a | ||||
Proposed branch: | ~canonical-hwe-team/ubuntu/+source/backport-iwlwifi-dkms/+git/backport-iwlwifi-dkms:vicamo/for-hwe/sync-debian-7906 | ||||
Merge into: | ~canonical-hwe-team/ubuntu/+source/backport-iwlwifi-dkms/+git/backport-iwlwifi-dkms:ubuntu/master | ||||
Diff against target: |
4344 lines (+1417/-733) 51 files modified
backport-include/linux/skbuff.h (+5/-5) backport-include/net/genetlink.h (+2/-1) backport-include/net/netlink.h (+13/-5) compat/Makefile (+1/-1) compat/backport-4.20.c (+7/-1) compat/backport-genetlink.c (+1/-1) compat/verification/pkcs7_verify.c (+0/-1) debian/backport-iwlwifi-dkms.modaliases (+2/-0) debian/changelog (+6/-0) drivers/net/wireless/intel/iwlwifi/cfg/22000.c (+55/-6) drivers/net/wireless/intel/iwlwifi/fw/acpi.h (+12/-0) drivers/net/wireless/intel/iwlwifi/fw/api/dbg-tlv.h (+2/-0) drivers/net/wireless/intel/iwlwifi/fw/api/location.h (+2/-2) drivers/net/wireless/intel/iwlwifi/fw/api/phy.h (+7/-0) drivers/net/wireless/intel/iwlwifi/fw/api/power.h (+12/-0) drivers/net/wireless/intel/iwlwifi/fw/api/rx.h (+2/-1) drivers/net/wireless/intel/iwlwifi/fw/dbg.c (+30/-26) drivers/net/wireless/intel/iwlwifi/fw/file.h (+1/-0) drivers/net/wireless/intel/iwlwifi/fw/img.h (+0/-9) drivers/net/wireless/intel/iwlwifi/iwl-config.h (+7/-0) drivers/net/wireless/intel/iwlwifi/iwl-csr.h (+1/-0) drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c (+44/-109) drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.h (+10/-14) drivers/net/wireless/intel/iwlwifi/iwl-drv.c (+4/-8) drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c (+0/-14) drivers/net/wireless/intel/iwlwifi/iwl-tm-gnl.c (+11/-6) drivers/net/wireless/intel/iwlwifi/iwl-trans.h (+3/-1) drivers/net/wireless/intel/iwlwifi/mvm/d3.c (+3/-0) drivers/net/wireless/intel/iwlwifi/mvm/fw.c (+141/-7) drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c (+3/-1) drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c (+79/-44) drivers/net/wireless/intel/iwlwifi/mvm/mvm.h (+7/-4) drivers/net/wireless/intel/iwlwifi/mvm/nvm.c (+1/-1) drivers/net/wireless/intel/iwlwifi/mvm/ops.c (+15/-14) drivers/net/wireless/intel/iwlwifi/mvm/rs.c (+268/-251) drivers/net/wireless/intel/iwlwifi/mvm/rs.h (+2/-1) drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c (+134/-51) drivers/net/wireless/intel/iwlwifi/mvm/sta.c (+4/-2) drivers/net/wireless/intel/iwlwifi/mvm/sta.h (+10/-2) drivers/net/wireless/intel/iwlwifi/mvm/utils.c (+2/-2) drivers/net/wireless/intel/iwlwifi/pcie/drv.c (+23/-0) drivers/net/wireless/intel/iwlwifi/pcie/trans.c (+4/-5) drivers/net/wireless/mac80211_hwsim.c (+25/-6) net/mac80211/ibss.c (+7/-3) net/mac80211/ieee80211_i.h (+1/-1) net/mac80211/main.c (+13/-0) net/mac80211/mlme.c (+4/-4) net/mac80211/scan.c (+2/-3) net/mac80211/util.c (+6/-5) net/wireless/nl80211.c (+422/-114) versions (+1/-1) |
||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Anthony Wong | Approve | ||
Canonical Hardware Enablement | Pending | ||
Review via email: mp+369867@code.launchpad.net |
Commit message
Description of the change
Sync with debian 7906-1.
To post a comment you must log in.
Revision history for this message
You-Sheng Yang (vicamo) wrote : | # |
Revision history for this message
You-Sheng Yang (vicamo) wrote : | # |
Successfully built. Checked built blobs works on 4.15.0-1045-oem as well as 5.0.0-1011-oem-osp1 with Intel Wireless-AC 9560.
Revision history for this message
You-Sheng Yang (vicamo) wrote : | # |
> Successfully built. Checked built blobs works on 4.15.0-1045-oem as well as
> 5.0.0-1011-oem-osp1 with Intel Wireless-AC 9560.
On IceLake platform, of course.
Revision history for this message
You-Sheng Yang (vicamo) wrote : | # |
Verified same thing with 9462 on ICL.
Revision history for this message
Anthony Wong (anthonywong) wrote : | # |
Is this just to merge upstream's code at 7906?
review:
Needs Information
Revision history for this message
You-Sheng Yang (vicamo) wrote : | # |
@anthonywong, yes, and update modaliases since 7906 includes support to new device models.
Revision history for this message
Anthony Wong (anthonywong) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/backport-include/linux/skbuff.h b/backport-include/linux/skbuff.h | |||
2 | index 4d37569..c60cbcc 100644 | |||
3 | --- a/backport-include/linux/skbuff.h | |||
4 | +++ b/backport-include/linux/skbuff.h | |||
5 | @@ -200,14 +200,14 @@ static inline struct sk_buff *__pskb_copy_fclone(struct sk_buff *skb, | |||
6 | 200 | struct sk_buff *skb_clone_sk(struct sk_buff *skb); | 200 | struct sk_buff *skb_clone_sk(struct sk_buff *skb); |
7 | 201 | #endif | 201 | #endif |
8 | 202 | 202 | ||
11 | 203 | static inline bool skb_xmit_more(struct sk_buff *skb) | 203 | |
10 | 204 | { | ||
12 | 205 | #if LINUX_VERSION_IS_LESS(3,18,0) | 204 | #if LINUX_VERSION_IS_LESS(3,18,0) |
14 | 206 | return false; | 205 | #define skb_xmit_more(skb) false |
15 | 206 | #elif LINUX_VERSION_IS_LESS(5,2,0) | ||
16 | 207 | #define skb_xmit_more(skb) ((skb)->xmit_more) | ||
17 | 207 | #else | 208 | #else |
19 | 208 | return skb->xmit_more; | 209 | #define skb_xmit_more(skb) netdev_xmit_more() |
20 | 209 | #endif | 210 | #endif |
21 | 210 | } | ||
22 | 211 | 211 | ||
23 | 212 | #if LINUX_VERSION_IS_LESS(3,19,0) | 212 | #if LINUX_VERSION_IS_LESS(3,19,0) |
24 | 213 | /** | 213 | /** |
25 | diff --git a/backport-include/net/genetlink.h b/backport-include/net/genetlink.h | |||
26 | index 844ed2a..59611a8 100644 | |||
27 | --- a/backport-include/net/genetlink.h | |||
28 | +++ b/backport-include/net/genetlink.h | |||
29 | @@ -93,7 +93,7 @@ void backport_genl_dump_check_consistent(struct netlink_callback *cb, | |||
30 | 93 | #endif | 93 | #endif |
31 | 94 | #endif /* LINUX_VERSION_IS_LESS(4,15,0) */ | 94 | #endif /* LINUX_VERSION_IS_LESS(4,15,0) */ |
32 | 95 | 95 | ||
34 | 96 | #if LINUX_VERSION_IS_LESS(4,20,0) | 96 | #if LINUX_VERSION_IS_LESS(5,2,0) |
35 | 97 | static inline int | 97 | static inline int |
36 | 98 | __real_backport_genl_register_family(struct genl_family *family) | 98 | __real_backport_genl_register_family(struct genl_family *family) |
37 | 99 | { | 99 | { |
38 | @@ -117,6 +117,7 @@ struct backport_genl_family { | |||
39 | 117 | unsigned int maxattr; | 117 | unsigned int maxattr; |
40 | 118 | bool netnsok; | 118 | bool netnsok; |
41 | 119 | bool parallel_ops; | 119 | bool parallel_ops; |
42 | 120 | const struct nla_policy *policy; | ||
43 | 120 | int (*pre_doit)(__genl_const struct genl_ops *ops, | 121 | int (*pre_doit)(__genl_const struct genl_ops *ops, |
44 | 121 | struct sk_buff *skb, | 122 | struct sk_buff *skb, |
45 | 122 | struct genl_info *info); | 123 | struct genl_info *info); |
46 | diff --git a/backport-include/net/netlink.h b/backport-include/net/netlink.h | |||
47 | index 8b58301..87c30cc 100644 | |||
48 | --- a/backport-include/net/netlink.h | |||
49 | +++ b/backport-include/net/netlink.h | |||
50 | @@ -4,6 +4,19 @@ | |||
51 | 4 | #include <linux/version.h> | 4 | #include <linux/version.h> |
52 | 5 | #include <linux/in6.h> | 5 | #include <linux/in6.h> |
53 | 6 | 6 | ||
54 | 7 | #if LINUX_VERSION_IS_LESS(5,1,0) | ||
55 | 8 | #undef NLA_POLICY_NESTED | ||
56 | 9 | #undef NLA_POLICY_NESTED_ARRAY | ||
57 | 10 | #define _NLA_POLICY_NESTED(maxattr, policy) \ | ||
58 | 11 | { .type = NLA_NESTED, .validation_data = policy, .len = maxattr } | ||
59 | 12 | #define _NLA_POLICY_NESTED_ARRAY(maxattr, policy) \ | ||
60 | 13 | { .type = NLA_NESTED_ARRAY, .validation_data = policy, .len = maxattr } | ||
61 | 14 | #define NLA_POLICY_NESTED(policy) \ | ||
62 | 15 | _NLA_POLICY_NESTED(ARRAY_SIZE(policy) - 1, policy) | ||
63 | 16 | #define NLA_POLICY_NESTED_ARRAY(policy) \ | ||
64 | 17 | _NLA_POLICY_NESTED_ARRAY(ARRAY_SIZE(policy) - 1, policy) | ||
65 | 18 | #endif /* < 5.1 */ | ||
66 | 19 | |||
67 | 7 | #if LINUX_VERSION_IS_LESS(4,20,0) | 20 | #if LINUX_VERSION_IS_LESS(4,20,0) |
68 | 8 | /* can't backport using the enum - need to override */ | 21 | /* can't backport using the enum - need to override */ |
69 | 9 | #define NLA_UNSPEC 0 | 22 | #define NLA_UNSPEC 0 |
70 | @@ -59,11 +72,6 @@ struct backport_nla_policy { | |||
71 | 59 | #define NLA_POLICY_ETH_ADDR NLA_POLICY_EXACT_LEN(ETH_ALEN) | 72 | #define NLA_POLICY_ETH_ADDR NLA_POLICY_EXACT_LEN(ETH_ALEN) |
72 | 60 | #define NLA_POLICY_ETH_ADDR_COMPAT NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN) | 73 | #define NLA_POLICY_ETH_ADDR_COMPAT NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN) |
73 | 61 | 74 | ||
74 | 62 | #define NLA_POLICY_NESTED(maxattr, policy) \ | ||
75 | 63 | { .type = NLA_NESTED, .validation_data = policy, .len = maxattr } | ||
76 | 64 | #define NLA_POLICY_NESTED_ARRAY(maxattr, policy) \ | ||
77 | 65 | { .type = NLA_NESTED_ARRAY, .validation_data = policy, .len = maxattr } | ||
78 | 66 | |||
79 | 67 | #define __NLA_ENSURE(condition) (sizeof(char[1 - 2*!(condition)]) - 1) | 75 | #define __NLA_ENSURE(condition) (sizeof(char[1 - 2*!(condition)]) - 1) |
80 | 68 | #define NLA_ENSURE_INT_TYPE(tp) \ | 76 | #define NLA_ENSURE_INT_TYPE(tp) \ |
81 | 69 | (__NLA_ENSURE(tp == NLA_S8 || tp == NLA_U8 || \ | 77 | (__NLA_ENSURE(tp == NLA_S8 || tp == NLA_U8 || \ |
82 | diff --git a/compat/Makefile b/compat/Makefile | |||
83 | index 7d2278b..1f62e4f 100644 | |||
84 | --- a/compat/Makefile | |||
85 | +++ b/compat/Makefile | |||
86 | @@ -39,7 +39,7 @@ compat-$(CPTCFG_KERNEL_4_10) += backport-4.10.o | |||
87 | 39 | compat-$(CPTCFG_KERNEL_4_18) += backport-4.18.o | 39 | compat-$(CPTCFG_KERNEL_4_18) += backport-4.18.o |
88 | 40 | compat-$(CPTCFG_KERNEL_4_20) += backport-4.20.o | 40 | compat-$(CPTCFG_KERNEL_4_20) += backport-4.20.o |
89 | 41 | 41 | ||
91 | 42 | compat-$(CPTCFG_KERNEL_4_20) += backport-genetlink.o | 42 | compat-$(CPTCFG_KERNEL_5_2) += backport-genetlink.o |
92 | 43 | 43 | ||
93 | 44 | compat-$(CPTCFG_BPAUTO_BUILD_SYSTEM_DATA_VERIFICATION) += verification/verify.o | 44 | compat-$(CPTCFG_BPAUTO_BUILD_SYSTEM_DATA_VERIFICATION) += verification/verify.o |
94 | 45 | compat-$(CPTCFG_BPAUTO_BUILD_SYSTEM_DATA_VERIFICATION) += verification/pkcs7.asn1.o | 45 | compat-$(CPTCFG_BPAUTO_BUILD_SYSTEM_DATA_VERIFICATION) += verification/pkcs7.asn1.o |
95 | diff --git a/compat/backport-4.20.c b/compat/backport-4.20.c | |||
96 | index e26f3b5..a75657f 100644 | |||
97 | --- a/compat/backport-4.20.c | |||
98 | +++ b/compat/backport-4.20.c | |||
99 | @@ -1,5 +1,5 @@ | |||
100 | 1 | /* | 1 | /* |
102 | 2 | * Copyright (C) 2018 Intel Corporation | 2 | * Copyright (C) 2018 - 2019 Intel Corporation |
103 | 3 | * | 3 | * |
104 | 4 | * Backport functionality introduced in Linux 4.20. | 4 | * Backport functionality introduced in Linux 4.20. |
105 | 5 | * This is basically upstream lib/nlattr.c. | 5 | * This is basically upstream lib/nlattr.c. |
106 | @@ -158,6 +158,9 @@ static int validate_nla(const struct nlattr *nla, int maxtype, | |||
107 | 158 | if (type <= 0 || type > maxtype) | 158 | if (type <= 0 || type > maxtype) |
108 | 159 | return 0; | 159 | return 0; |
109 | 160 | 160 | ||
110 | 161 | if (WARN_ON(!policy)) | ||
111 | 162 | return -EINVAL; | ||
112 | 163 | |||
113 | 161 | pt = &policy[type]; | 164 | pt = &policy[type]; |
114 | 162 | 165 | ||
115 | 163 | BUG_ON(pt->type > NLA_TYPE_MAX); | 166 | BUG_ON(pt->type > NLA_TYPE_MAX); |
116 | @@ -316,6 +319,9 @@ int backport_nla_validate(const struct nlattr *head, int len, int maxtype, | |||
117 | 316 | const struct nlattr *nla; | 319 | const struct nlattr *nla; |
118 | 317 | int rem; | 320 | int rem; |
119 | 318 | 321 | ||
120 | 322 | if (!policy) | ||
121 | 323 | return 0; | ||
122 | 324 | |||
123 | 319 | nla_for_each_attr(nla, head, len, rem) { | 325 | nla_for_each_attr(nla, head, len, rem) { |
124 | 320 | int err = validate_nla(nla, maxtype, policy, extack); | 326 | int err = validate_nla(nla, maxtype, policy, extack); |
125 | 321 | 327 | ||
126 | diff --git a/compat/backport-genetlink.c b/compat/backport-genetlink.c | |||
127 | index fb559d2..f9e307b 100644 | |||
128 | --- a/compat/backport-genetlink.c | |||
129 | +++ b/compat/backport-genetlink.c | |||
130 | @@ -169,7 +169,7 @@ static int backport_pre_doit(__genl_const struct genl_ops *ops, | |||
131 | 169 | #endif | 169 | #endif |
132 | 170 | 170 | ||
133 | 171 | err = nlmsg_validate(info->nlhdr, GENL_HDRLEN + family->hdrsize, | 171 | err = nlmsg_validate(info->nlhdr, GENL_HDRLEN + family->hdrsize, |
135 | 172 | family->maxattr, ops->policy, extack); | 172 | family->maxattr, family->policy, extack); |
136 | 173 | if (!err && family->pre_doit) | 173 | if (!err && family->pre_doit) |
137 | 174 | err = family->pre_doit(ops, skb, info); | 174 | err = family->pre_doit(ops, skb, info); |
138 | 175 | 175 | ||
139 | diff --git a/compat/verification/pkcs7_verify.c b/compat/verification/pkcs7_verify.c | |||
140 | index 97c77f6..f7b0980 100644 | |||
141 | --- a/compat/verification/pkcs7_verify.c | |||
142 | +++ b/compat/verification/pkcs7_verify.c | |||
143 | @@ -56,7 +56,6 @@ static int pkcs7_digest(struct pkcs7_message *pkcs7, | |||
144 | 56 | goto error_no_desc; | 56 | goto error_no_desc; |
145 | 57 | 57 | ||
146 | 58 | desc->tfm = tfm; | 58 | desc->tfm = tfm; |
147 | 59 | desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP; | ||
148 | 60 | 59 | ||
149 | 61 | /* Digest the message [RFC2315 9.3] */ | 60 | /* Digest the message [RFC2315 9.3] */ |
150 | 62 | ret = crypto_shash_digest(desc, pkcs7->data, pkcs7->data_len, | 61 | ret = crypto_shash_digest(desc, pkcs7->data, pkcs7->data_len, |
151 | diff --git a/debian/backport-iwlwifi-dkms.modaliases b/debian/backport-iwlwifi-dkms.modaliases | |||
152 | index 4ac4b99..9e7706a 100644 | |||
153 | --- a/debian/backport-iwlwifi-dkms.modaliases | |||
154 | +++ b/debian/backport-iwlwifi-dkms.modaliases | |||
155 | @@ -2,6 +2,7 @@ alias net-pf-16-proto-16-family-nl80211 cfg80211 | |||
156 | 2 | alias pci:v00008086d00007AF0sv*sd00000A10bc*sc*i* iwlwifi | 2 | alias pci:v00008086d00007AF0sv*sd00000A10bc*sc*i* iwlwifi |
157 | 3 | alias pci:v00008086d00007AF0sv*sd00000510bc*sc*i* iwlwifi | 3 | alias pci:v00008086d00007AF0sv*sd00000510bc*sc*i* iwlwifi |
158 | 4 | alias pci:v00008086d00007AF0sv*sd00000310bc*sc*i* iwlwifi | 4 | alias pci:v00008086d00007AF0sv*sd00000310bc*sc*i* iwlwifi |
159 | 5 | alias pci:v00008086d00007AF0sv*sd00000090bc*sc*i* iwlwifi | ||
160 | 5 | alias pci:v00008086d00007A70sv*sd00000A10bc*sc*i* iwlwifi | 6 | alias pci:v00008086d00007A70sv*sd00000A10bc*sc*i* iwlwifi |
161 | 6 | alias pci:v00008086d00007A70sv*sd00000510bc*sc*i* iwlwifi | 7 | alias pci:v00008086d00007A70sv*sd00000510bc*sc*i* iwlwifi |
162 | 7 | alias pci:v00008086d00007A70sv*sd00000310bc*sc*i* iwlwifi | 8 | alias pci:v00008086d00007A70sv*sd00000310bc*sc*i* iwlwifi |
163 | @@ -366,6 +367,7 @@ alias pci:v00008086d0000271Bsv*sd00000010bc*sc*i* iwlwifi | |||
164 | 366 | alias pci:v00008086d00002526sv*sd0000A014bc*sc*i* iwlwifi | 367 | alias pci:v00008086d00002526sv*sd0000A014bc*sc*i* iwlwifi |
165 | 367 | alias pci:v00008086d00002526sv*sd00008010bc*sc*i* iwlwifi | 368 | alias pci:v00008086d00002526sv*sd00008010bc*sc*i* iwlwifi |
166 | 368 | alias pci:v00008086d00002526sv*sd00008014bc*sc*i* iwlwifi | 369 | alias pci:v00008086d00002526sv*sd00008014bc*sc*i* iwlwifi |
167 | 370 | alias pci:v00008086d00002526sv*sd00006014bc*sc*i* iwlwifi | ||
168 | 369 | alias pci:v00008086d00002526sv*sd000042A4bc*sc*i* iwlwifi | 371 | alias pci:v00008086d00002526sv*sd000042A4bc*sc*i* iwlwifi |
169 | 370 | alias pci:v00008086d00002526sv*sd00004234bc*sc*i* iwlwifi | 372 | alias pci:v00008086d00002526sv*sd00004234bc*sc*i* iwlwifi |
170 | 371 | alias pci:v00008086d00002526sv*sd000040A4bc*sc*i* iwlwifi | 373 | alias pci:v00008086d00002526sv*sd000040A4bc*sc*i* iwlwifi |
171 | diff --git a/debian/changelog b/debian/changelog | |||
172 | index d70c99a..75ea7c7 100644 | |||
173 | --- a/debian/changelog | |||
174 | +++ b/debian/changelog | |||
175 | @@ -1,3 +1,9 @@ | |||
176 | 1 | backport-iwlwifi-dkms (7906-ubuntu1) UNRELEASED; urgency=low | ||
177 | 2 | |||
178 | 3 | * Sync with debian 7906-1. | ||
179 | 4 | |||
180 | 5 | -- You-Sheng Yang <vicamo@gmail.com> Tue, 9 Jul 2019 16:35:22 +0800 | ||
181 | 6 | |||
182 | 1 | backport-iwlwifi-dkms (7858-ubuntu2) UNRELEASED; urgency=low | 7 | backport-iwlwifi-dkms (7858-ubuntu2) UNRELEASED; urgency=low |
183 | 2 | 8 | ||
184 | 3 | * Fix build on recent kernel that removes *.lex.c and *.tab.c at clean | 9 | * Fix build on recent kernel that removes *.lex.c and *.tab.c at clean |
185 | diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c | |||
186 | index c5a0b6f..351f2c0 100644 | |||
187 | --- a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c | |||
188 | +++ b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c | |||
189 | @@ -56,7 +56,7 @@ | |||
190 | 56 | #include "iwl-config.h" | 56 | #include "iwl-config.h" |
191 | 57 | 57 | ||
192 | 58 | /* Highest firmware API version supported */ | 58 | /* Highest firmware API version supported */ |
194 | 59 | #define IWL_22000_UCODE_API_MAX 50 | 59 | #define IWL_22000_UCODE_API_MAX 51 |
195 | 60 | 60 | ||
196 | 61 | /* Lowest firmware API version supported */ | 61 | /* Lowest firmware API version supported */ |
197 | 62 | #define IWL_22000_UCODE_API_MIN 39 | 62 | #define IWL_22000_UCODE_API_MIN 39 |
198 | @@ -76,11 +76,12 @@ | |||
199 | 76 | #define IWL_22000_HR_FW_PRE "iwlwifi-Qu-a0-hr-a0-" | 76 | #define IWL_22000_HR_FW_PRE "iwlwifi-Qu-a0-hr-a0-" |
200 | 77 | #define IWL_22000_HR_CDB_FW_PRE "iwlwifi-QuIcp-z0-hrcdb-a0-" | 77 | #define IWL_22000_HR_CDB_FW_PRE "iwlwifi-QuIcp-z0-hrcdb-a0-" |
201 | 78 | #define IWL_22000_HR_A_F0_FW_PRE "iwlwifi-QuQnj-f0-hr-a0-" | 78 | #define IWL_22000_HR_A_F0_FW_PRE "iwlwifi-QuQnj-f0-hr-a0-" |
202 | 79 | #define IWL_22000_HR_B_F0_FW_PRE "iwlwifi-Qu-b0-hr-b0-" | ||
203 | 80 | #define IWL_22000_QU_B_HR_B_FW_PRE "iwlwifi-Qu-b0-hr-b0-" | 79 | #define IWL_22000_QU_B_HR_B_FW_PRE "iwlwifi-Qu-b0-hr-b0-" |
204 | 81 | #define IWL_22000_HR_B_FW_PRE "iwlwifi-QuQnj-b0-hr-b0-" | 80 | #define IWL_22000_HR_B_FW_PRE "iwlwifi-QuQnj-b0-hr-b0-" |
205 | 82 | #define IWL_22000_HR_A0_FW_PRE "iwlwifi-QuQnj-a0-hr-a0-" | 81 | #define IWL_22000_HR_A0_FW_PRE "iwlwifi-QuQnj-a0-hr-a0-" |
206 | 82 | #define IWL_QU_C_HR_B_FW_PRE "iwlwifi-Qu-c0-hr-b0-" | ||
207 | 83 | #define IWL_QU_B_JF_B_FW_PRE "iwlwifi-Qu-b0-jf-b0-" | 83 | #define IWL_QU_B_JF_B_FW_PRE "iwlwifi-Qu-b0-jf-b0-" |
208 | 84 | #define IWL_QU_C_JF_B_FW_PRE "iwlwifi-Qu-c0-jf-b0-" | ||
209 | 84 | #define IWL_QUZ_A_HR_B_FW_PRE "iwlwifi-QuZ-a0-hr-b0-" | 85 | #define IWL_QUZ_A_HR_B_FW_PRE "iwlwifi-QuZ-a0-hr-b0-" |
210 | 85 | #define IWL_QUZ_A_JF_B_FW_PRE "iwlwifi-QuZ-a0-jf-b0-" | 86 | #define IWL_QUZ_A_JF_B_FW_PRE "iwlwifi-QuZ-a0-jf-b0-" |
211 | 86 | #define IWL_QNJ_B_JF_B_FW_PRE "iwlwifi-QuQnj-b0-jf-b0-" | 87 | #define IWL_QNJ_B_JF_B_FW_PRE "iwlwifi-QuQnj-b0-jf-b0-" |
212 | @@ -97,8 +98,6 @@ | |||
213 | 97 | IWL_22000_JF_FW_PRE __stringify(api) ".ucode" | 98 | IWL_22000_JF_FW_PRE __stringify(api) ".ucode" |
214 | 98 | #define IWL_22000_HR_A_F0_QNJ_MODULE_FIRMWARE(api) \ | 99 | #define IWL_22000_HR_A_F0_QNJ_MODULE_FIRMWARE(api) \ |
215 | 99 | IWL_22000_HR_A_F0_FW_PRE __stringify(api) ".ucode" | 100 | IWL_22000_HR_A_F0_FW_PRE __stringify(api) ".ucode" |
216 | 100 | #define IWL_22000_HR_B_F0_QNJ_MODULE_FIRMWARE(api) \ | ||
217 | 101 | IWL_22000_HR_B_F0_FW_PRE __stringify(api) ".ucode" | ||
218 | 102 | #define IWL_22000_QU_B_HR_B_MODULE_FIRMWARE(api) \ | 101 | #define IWL_22000_QU_B_HR_B_MODULE_FIRMWARE(api) \ |
219 | 103 | IWL_22000_QU_B_HR_B_FW_PRE __stringify(api) ".ucode" | 102 | IWL_22000_QU_B_HR_B_FW_PRE __stringify(api) ".ucode" |
220 | 104 | #define IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(api) \ | 103 | #define IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(api) \ |
221 | @@ -109,6 +108,8 @@ | |||
222 | 109 | IWL_QUZ_A_HR_B_FW_PRE __stringify(api) ".ucode" | 108 | IWL_QUZ_A_HR_B_FW_PRE __stringify(api) ".ucode" |
223 | 110 | #define IWL_QUZ_A_JF_B_MODULE_FIRMWARE(api) \ | 109 | #define IWL_QUZ_A_JF_B_MODULE_FIRMWARE(api) \ |
224 | 111 | IWL_QUZ_A_JF_B_FW_PRE __stringify(api) ".ucode" | 110 | IWL_QUZ_A_JF_B_FW_PRE __stringify(api) ".ucode" |
225 | 111 | #define IWL_QU_C_HR_B_MODULE_FIRMWARE(api) \ | ||
226 | 112 | IWL_QU_C_HR_B_FW_PRE __stringify(api) ".ucode" | ||
227 | 112 | #define IWL_QU_B_JF_B_MODULE_FIRMWARE(api) \ | 113 | #define IWL_QU_B_JF_B_MODULE_FIRMWARE(api) \ |
228 | 113 | IWL_QU_B_JF_B_FW_PRE __stringify(api) ".ucode" | 114 | IWL_QU_B_JF_B_FW_PRE __stringify(api) ".ucode" |
229 | 114 | #define IWL_QNJ_B_JF_B_MODULE_FIRMWARE(api) \ | 115 | #define IWL_QNJ_B_JF_B_MODULE_FIRMWARE(api) \ |
230 | @@ -256,6 +257,30 @@ const struct iwl_cfg iwl_ax201_cfg_qu_hr = { | |||
231 | 256 | .max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT, | 257 | .max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT, |
232 | 257 | }; | 258 | }; |
233 | 258 | 259 | ||
234 | 260 | const struct iwl_cfg iwl_ax101_cfg_qu_c0_hr_b0 = { | ||
235 | 261 | .name = "Intel(R) Wi-Fi 6 AX101", | ||
236 | 262 | .fw_name_pre = IWL_QU_C_HR_B_FW_PRE, | ||
237 | 263 | IWL_DEVICE_22500, | ||
238 | 264 | /* | ||
239 | 265 | * This device doesn't support receiving BlockAck with a large bitmap | ||
240 | 266 | * so we need to restrict the size of transmitted aggregation to the | ||
241 | 267 | * HT size; mac80211 would otherwise pick the HE max (256) by default. | ||
242 | 268 | */ | ||
243 | 269 | .max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT, | ||
244 | 270 | }; | ||
245 | 271 | |||
246 | 272 | const struct iwl_cfg iwl_ax201_cfg_qu_c0_hr_b0 = { | ||
247 | 273 | .name = "Intel(R) Wi-Fi 6 AX201 160MHz", | ||
248 | 274 | .fw_name_pre = IWL_QU_C_HR_B_FW_PRE, | ||
249 | 275 | IWL_DEVICE_22500, | ||
250 | 276 | /* | ||
251 | 277 | * This device doesn't support receiving BlockAck with a large bitmap | ||
252 | 278 | * so we need to restrict the size of transmitted aggregation to the | ||
253 | 279 | * HT size; mac80211 would otherwise pick the HE max (256) by default. | ||
254 | 280 | */ | ||
255 | 281 | .max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT, | ||
256 | 282 | }; | ||
257 | 283 | |||
258 | 259 | const struct iwl_cfg iwl_ax101_cfg_quz_hr = { | 284 | const struct iwl_cfg iwl_ax101_cfg_quz_hr = { |
259 | 260 | .name = "Intel(R) Wi-Fi 6 AX101", | 285 | .name = "Intel(R) Wi-Fi 6 AX101", |
260 | 261 | .fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE, | 286 | .fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE, |
261 | @@ -372,6 +397,30 @@ const struct iwl_cfg iwl9560_2ac_160_cfg_qu_b0_jf_b0 = { | |||
262 | 372 | IWL_DEVICE_22500, | 397 | IWL_DEVICE_22500, |
263 | 373 | }; | 398 | }; |
264 | 374 | 399 | ||
265 | 400 | const struct iwl_cfg iwl9461_2ac_cfg_qu_c0_jf_b0 = { | ||
266 | 401 | .name = "Intel(R) Wireless-AC 9461", | ||
267 | 402 | .fw_name_pre = IWL_QU_C_JF_B_FW_PRE, | ||
268 | 403 | IWL_DEVICE_22500, | ||
269 | 404 | }; | ||
270 | 405 | |||
271 | 406 | const struct iwl_cfg iwl9462_2ac_cfg_qu_c0_jf_b0 = { | ||
272 | 407 | .name = "Intel(R) Wireless-AC 9462", | ||
273 | 408 | .fw_name_pre = IWL_QU_C_JF_B_FW_PRE, | ||
274 | 409 | IWL_DEVICE_22500, | ||
275 | 410 | }; | ||
276 | 411 | |||
277 | 412 | const struct iwl_cfg iwl9560_2ac_cfg_qu_c0_jf_b0 = { | ||
278 | 413 | .name = "Intel(R) Wireless-AC 9560", | ||
279 | 414 | .fw_name_pre = IWL_QU_C_JF_B_FW_PRE, | ||
280 | 415 | IWL_DEVICE_22500, | ||
281 | 416 | }; | ||
282 | 417 | |||
283 | 418 | const struct iwl_cfg iwl9560_2ac_160_cfg_qu_c0_jf_b0 = { | ||
284 | 419 | .name = "Intel(R) Wireless-AC 9560 160MHz", | ||
285 | 420 | .fw_name_pre = IWL_QU_C_JF_B_FW_PRE, | ||
286 | 421 | IWL_DEVICE_22500, | ||
287 | 422 | }; | ||
288 | 423 | |||
289 | 375 | const struct iwl_cfg iwl9560_2ac_cfg_qnj_jf_b0 = { | 424 | const struct iwl_cfg iwl9560_2ac_cfg_qnj_jf_b0 = { |
290 | 376 | .name = "Intel(R) Wireless-AC 9560 160MHz", | 425 | .name = "Intel(R) Wireless-AC 9560 160MHz", |
291 | 377 | .fw_name_pre = IWL_QNJ_B_JF_B_FW_PRE, | 426 | .fw_name_pre = IWL_QNJ_B_JF_B_FW_PRE, |
292 | @@ -530,7 +579,7 @@ const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0_f0 = { | |||
293 | 530 | 579 | ||
294 | 531 | const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_b0_f0 = { | 580 | const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_b0_f0 = { |
295 | 532 | .name = "Intel(R) Dual Band Wireless AX 22000", | 581 | .name = "Intel(R) Dual Band Wireless AX 22000", |
297 | 533 | .fw_name_pre = IWL_22000_HR_B_F0_FW_PRE, | 582 | .fw_name_pre = IWL_22000_QU_B_HR_B_FW_PRE, |
298 | 534 | IWL_DEVICE_22500, | 583 | IWL_DEVICE_22500, |
299 | 535 | /* | 584 | /* |
300 | 536 | * This device doesn't support receiving BlockAck with a large bitmap | 585 | * This device doesn't support receiving BlockAck with a large bitmap |
301 | @@ -599,9 +648,9 @@ const struct iwl_cfg iwlax411_2ax_cfg_so_gf4_a0 = { | |||
302 | 599 | MODULE_FIRMWARE(IWL_22000_HR_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); | 648 | MODULE_FIRMWARE(IWL_22000_HR_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
303 | 600 | MODULE_FIRMWARE(IWL_22000_JF_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); | 649 | MODULE_FIRMWARE(IWL_22000_JF_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
304 | 601 | MODULE_FIRMWARE(IWL_22000_HR_A_F0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); | 650 | MODULE_FIRMWARE(IWL_22000_HR_A_F0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
305 | 602 | MODULE_FIRMWARE(IWL_22000_HR_B_F0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); | ||
306 | 603 | MODULE_FIRMWARE(IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); | 651 | MODULE_FIRMWARE(IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
307 | 604 | MODULE_FIRMWARE(IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); | 652 | MODULE_FIRMWARE(IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
308 | 653 | MODULE_FIRMWARE(IWL_QU_C_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); | ||
309 | 605 | MODULE_FIRMWARE(IWL_QU_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); | 654 | MODULE_FIRMWARE(IWL_QU_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
310 | 606 | MODULE_FIRMWARE(IWL_QUZ_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); | 655 | MODULE_FIRMWARE(IWL_QUZ_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
311 | 607 | MODULE_FIRMWARE(IWL_QUZ_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); | 656 | MODULE_FIRMWARE(IWL_QUZ_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
312 | diff --git a/drivers/net/wireless/intel/iwlwifi/fw/acpi.h b/drivers/net/wireless/intel/iwlwifi/fw/acpi.h | |||
313 | index 991a234..6cb2d1f 100644 | |||
314 | --- a/drivers/net/wireless/intel/iwlwifi/fw/acpi.h | |||
315 | +++ b/drivers/net/wireless/intel/iwlwifi/fw/acpi.h | |||
316 | @@ -68,6 +68,7 @@ | |||
317 | 68 | #define ACPI_WRDD_METHOD "WRDD" | 68 | #define ACPI_WRDD_METHOD "WRDD" |
318 | 69 | #define ACPI_SPLC_METHOD "SPLC" | 69 | #define ACPI_SPLC_METHOD "SPLC" |
319 | 70 | #define ACPI_ECKV_METHOD "ECKV" | 70 | #define ACPI_ECKV_METHOD "ECKV" |
320 | 71 | #define ACPI_PPAG_METHOD "PPAG" | ||
321 | 71 | 72 | ||
322 | 72 | #define ACPI_WIFI_DOMAIN (0x07) | 73 | #define ACPI_WIFI_DOMAIN (0x07) |
323 | 73 | 74 | ||
324 | @@ -92,6 +93,17 @@ | |||
325 | 92 | #define ACPI_WGDS_NUM_BANDS 2 | 93 | #define ACPI_WGDS_NUM_BANDS 2 |
326 | 93 | #define ACPI_WGDS_TABLE_SIZE 3 | 94 | #define ACPI_WGDS_TABLE_SIZE 3 |
327 | 94 | 95 | ||
328 | 96 | #define ACPI_PPAG_NUM_CHAINS 2 | ||
329 | 97 | #define ACPI_PPAG_NUM_SUB_BANDS 5 | ||
330 | 98 | #define ACPI_PPAG_WIFI_DATA_SIZE ((ACPI_PPAG_NUM_CHAINS * \ | ||
331 | 99 | ACPI_PPAG_NUM_SUB_BANDS) + 3) | ||
332 | 100 | |||
333 | 101 | /* PPAG gain value bounds in 1/8 dBm */ | ||
334 | 102 | #define ACPI_PPAG_MIN_LB -16 | ||
335 | 103 | #define ACPI_PPAG_MAX_LB 24 | ||
336 | 104 | #define ACPI_PPAG_MIN_HB -16 | ||
337 | 105 | #define ACPI_PPAG_MAX_HB 40 | ||
338 | 106 | |||
339 | 95 | #ifdef CONFIG_ACPI | 107 | #ifdef CONFIG_ACPI |
340 | 96 | 108 | ||
341 | 97 | void *iwl_acpi_get_object(struct device *dev, acpi_string method); | 109 | void *iwl_acpi_get_object(struct device *dev, acpi_string method); |
342 | diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/dbg-tlv.h b/drivers/net/wireless/intel/iwlwifi/fw/api/dbg-tlv.h | |||
343 | index aaf3974..e02e289 100644 | |||
344 | --- a/drivers/net/wireless/intel/iwlwifi/fw/api/dbg-tlv.h | |||
345 | +++ b/drivers/net/wireless/intel/iwlwifi/fw/api/dbg-tlv.h | |||
346 | @@ -439,6 +439,7 @@ enum iwl_fw_ini_apply_point { | |||
347 | 439 | * @IWL_FW_INI_ALLOCATION_ID_SDFX: for SDFX module | 439 | * @IWL_FW_INI_ALLOCATION_ID_SDFX: for SDFX module |
348 | 440 | * @IWL_FW_INI_ALLOCATION_ID_FW_DUMP: used for crash and runtime dumps | 440 | * @IWL_FW_INI_ALLOCATION_ID_FW_DUMP: used for crash and runtime dumps |
349 | 441 | * @IWL_FW_INI_ALLOCATION_ID_USER_DEFINED: for future user scenarios | 441 | * @IWL_FW_INI_ALLOCATION_ID_USER_DEFINED: for future user scenarios |
350 | 442 | * @IWL_FW_INI_ALLOCATION_NUM: number of allocation ids | ||
351 | 442 | */ | 443 | */ |
352 | 443 | enum iwl_fw_ini_allocation_id { | 444 | enum iwl_fw_ini_allocation_id { |
353 | 444 | IWL_FW_INI_ALLOCATION_INVALID, | 445 | IWL_FW_INI_ALLOCATION_INVALID, |
354 | @@ -448,6 +449,7 @@ enum iwl_fw_ini_allocation_id { | |||
355 | 448 | IWL_FW_INI_ALLOCATION_ID_SDFX, | 449 | IWL_FW_INI_ALLOCATION_ID_SDFX, |
356 | 449 | IWL_FW_INI_ALLOCATION_ID_FW_DUMP, | 450 | IWL_FW_INI_ALLOCATION_ID_FW_DUMP, |
357 | 450 | IWL_FW_INI_ALLOCATION_ID_USER_DEFINED, | 451 | IWL_FW_INI_ALLOCATION_ID_USER_DEFINED, |
358 | 452 | IWL_FW_INI_ALLOCATION_NUM, | ||
359 | 451 | }; /* FW_DEBUG_TLV_ALLOCATION_ID_E_VER_1 */ | 453 | }; /* FW_DEBUG_TLV_ALLOCATION_ID_E_VER_1 */ |
360 | 452 | 454 | ||
361 | 453 | /** | 455 | /** |
362 | diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/location.h b/drivers/net/wireless/intel/iwlwifi/fw/api/location.h | |||
363 | index ec864c7..7a0fe5a 100644 | |||
364 | --- a/drivers/net/wireless/intel/iwlwifi/fw/api/location.h | |||
365 | +++ b/drivers/net/wireless/intel/iwlwifi/fw/api/location.h | |||
366 | @@ -82,7 +82,7 @@ enum iwl_location_subcmd_ids { | |||
367 | 82 | TOF_RANGE_ABORT_CMD = 0x2, | 82 | TOF_RANGE_ABORT_CMD = 0x2, |
368 | 83 | /** | 83 | /** |
369 | 84 | * @TOF_RANGE_REQ_EXT_CMD: TOF extended ranging config, | 84 | * @TOF_RANGE_REQ_EXT_CMD: TOF extended ranging config, |
371 | 85 | * uses &struct iwl_tof_range_request_ext_cmd | 85 | * uses &struct iwl_tof_range_req_ext_cmd |
372 | 86 | */ | 86 | */ |
373 | 87 | TOF_RANGE_REQ_EXT_CMD = 0x3, | 87 | TOF_RANGE_REQ_EXT_CMD = 0x3, |
374 | 88 | /** | 88 | /** |
375 | @@ -292,7 +292,7 @@ struct iwl_tof_responder_dyn_config_cmd { | |||
376 | 292 | } __packed; /* TOF_RESPONDER_DYN_CONFIG_CMD_API_S_VER_2 */ | 292 | } __packed; /* TOF_RESPONDER_DYN_CONFIG_CMD_API_S_VER_2 */ |
377 | 293 | 293 | ||
378 | 294 | /** | 294 | /** |
380 | 295 | * struct iwl_tof_range_request_ext_cmd - extended range req for WLS | 295 | * struct iwl_tof_range_req_ext_cmd - extended range req for WLS |
381 | 296 | * @tsf_timer_offset_msec: the recommended time offset (mSec) from the AP's TSF | 296 | * @tsf_timer_offset_msec: the recommended time offset (mSec) from the AP's TSF |
382 | 297 | * @reserved: reserved | 297 | * @reserved: reserved |
383 | 298 | * @min_delta_ftm: Minimal time between two consecutive measurements, | 298 | * @min_delta_ftm: Minimal time between two consecutive measurements, |
384 | diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/phy.h b/drivers/net/wireless/intel/iwlwifi/fw/api/phy.h | |||
385 | index 9cc59e0..8991ddf 100644 | |||
386 | --- a/drivers/net/wireless/intel/iwlwifi/fw/api/phy.h | |||
387 | +++ b/drivers/net/wireless/intel/iwlwifi/fw/api/phy.h | |||
388 | @@ -8,6 +8,7 @@ | |||
389 | 8 | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. | 8 | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. |
390 | 9 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH | 9 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH |
391 | 10 | * Copyright(c) 2016 - 2017 Intel Deutschland GmbH | 10 | * Copyright(c) 2016 - 2017 Intel Deutschland GmbH |
392 | 11 | * Copyright(c) 2019 Intel Corporation | ||
393 | 11 | * | 12 | * |
394 | 12 | * This program is free software; you can redistribute it and/or modify | 13 | * This program is free software; you can redistribute it and/or modify |
395 | 13 | * it under the terms of version 2 of the GNU General Public License as | 14 | * it under the terms of version 2 of the GNU General Public License as |
396 | @@ -30,6 +31,7 @@ | |||
397 | 30 | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. | 31 | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. |
398 | 31 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH | 32 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH |
399 | 32 | * Copyright(c) 2016 - 2017 Intel Deutschland GmbH | 33 | * Copyright(c) 2016 - 2017 Intel Deutschland GmbH |
400 | 34 | * Copyright(c) 2019 Intel Corporation | ||
401 | 33 | * All rights reserved. | 35 | * All rights reserved. |
402 | 34 | * | 36 | * |
403 | 35 | * Redistribution and use in source and binary forms, with or without | 37 | * Redistribution and use in source and binary forms, with or without |
404 | @@ -90,6 +92,11 @@ enum iwl_phy_ops_subcmd_ids { | |||
405 | 90 | GEO_TX_POWER_LIMIT = 0x05, | 92 | GEO_TX_POWER_LIMIT = 0x05, |
406 | 91 | 93 | ||
407 | 92 | /** | 94 | /** |
408 | 95 | * @PER_PLATFORM_ANT_GAIN_CMD: &struct iwl_ppag_table_cmd | ||
409 | 96 | */ | ||
410 | 97 | PER_PLATFORM_ANT_GAIN_CMD = 0x07, | ||
411 | 98 | |||
412 | 99 | /** | ||
413 | 93 | * @CT_KILL_NOTIFICATION: &struct ct_kill_notif | 100 | * @CT_KILL_NOTIFICATION: &struct ct_kill_notif |
414 | 94 | */ | 101 | */ |
415 | 95 | CT_KILL_NOTIFICATION = 0xFE, | 102 | CT_KILL_NOTIFICATION = 0xFE, |
416 | diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/power.h b/drivers/net/wireless/intel/iwlwifi/fw/api/power.h | |||
417 | index f195db3..6e1b9b2 100644 | |||
418 | --- a/drivers/net/wireless/intel/iwlwifi/fw/api/power.h | |||
419 | +++ b/drivers/net/wireless/intel/iwlwifi/fw/api/power.h | |||
420 | @@ -450,6 +450,18 @@ struct iwl_geo_tx_power_profiles_resp { | |||
421 | 450 | } __packed; /* GEO_TX_POWER_LIMIT_RESP */ | 450 | } __packed; /* GEO_TX_POWER_LIMIT_RESP */ |
422 | 451 | 451 | ||
423 | 452 | /** | 452 | /** |
424 | 453 | * struct iwl_ppag_table_cmd - struct for PER_PLATFORM_ANT_GAIN_CMD cmd. | ||
425 | 454 | * @enabled: 1 if PPAG is enabled, 0 otherwise | ||
426 | 455 | * @gain: table of antenna gain values per chain and sub-band | ||
427 | 456 | * @reserved: reserved | ||
428 | 457 | */ | ||
429 | 458 | struct iwl_ppag_table_cmd { | ||
430 | 459 | __le32 enabled; | ||
431 | 460 | s8 gain[IWL_NUM_CHAIN_LIMITS][IWL_NUM_SUB_BANDS]; | ||
432 | 461 | s8 reserved[2]; | ||
433 | 462 | } __packed; /* PER_PLATFORM_ANT_GAIN_CMD */ | ||
434 | 463 | |||
435 | 464 | /** | ||
436 | 453 | * struct iwl_beacon_filter_cmd | 465 | * struct iwl_beacon_filter_cmd |
437 | 454 | * REPLY_BEACON_FILTERING_CMD = 0xd2 (command) | 466 | * REPLY_BEACON_FILTERING_CMD = 0xd2 (command) |
438 | 455 | * @bf_energy_delta: Used for RSSI filtering, if in 'normal' state. Send beacon | 467 | * @bf_energy_delta: Used for RSSI filtering, if in 'normal' state. Send beacon |
439 | diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/rx.h b/drivers/net/wireless/intel/iwlwifi/fw/api/rx.h | |||
440 | index 4a96090..2920a11 100644 | |||
441 | --- a/drivers/net/wireless/intel/iwlwifi/fw/api/rx.h | |||
442 | +++ b/drivers/net/wireless/intel/iwlwifi/fw/api/rx.h | |||
443 | @@ -777,7 +777,6 @@ struct iwl_rss_config_cmd { | |||
444 | 777 | u8 indirection_table[IWL_RSS_INDIRECTION_TABLE_SIZE]; | 777 | u8 indirection_table[IWL_RSS_INDIRECTION_TABLE_SIZE]; |
445 | 778 | } __packed; /* RSS_CONFIG_CMD_API_S_VER_1 */ | 778 | } __packed; /* RSS_CONFIG_CMD_API_S_VER_1 */ |
446 | 779 | 779 | ||
447 | 780 | #define IWL_MULTI_QUEUE_SYNC_MSG_MAX_SIZE 128 | ||
448 | 781 | #define IWL_MULTI_QUEUE_SYNC_SENDER_POS 0 | 780 | #define IWL_MULTI_QUEUE_SYNC_SENDER_POS 0 |
449 | 782 | #define IWL_MULTI_QUEUE_SYNC_SENDER_MSK 0xf | 781 | #define IWL_MULTI_QUEUE_SYNC_SENDER_MSK 0xf |
450 | 783 | 782 | ||
451 | @@ -813,10 +812,12 @@ struct iwl_rxq_sync_notification { | |||
452 | 813 | * | 812 | * |
453 | 814 | * @IWL_MVM_RXQ_EMPTY: empty sync notification | 813 | * @IWL_MVM_RXQ_EMPTY: empty sync notification |
454 | 815 | * @IWL_MVM_RXQ_NOTIF_DEL_BA: notify RSS queues of delBA | 814 | * @IWL_MVM_RXQ_NOTIF_DEL_BA: notify RSS queues of delBA |
455 | 815 | * @IWL_MVM_RXQ_NSSN_SYNC: notify all the RSS queues with the new NSSN | ||
456 | 816 | */ | 816 | */ |
457 | 817 | enum iwl_mvm_rxq_notif_type { | 817 | enum iwl_mvm_rxq_notif_type { |
458 | 818 | IWL_MVM_RXQ_EMPTY, | 818 | IWL_MVM_RXQ_EMPTY, |
459 | 819 | IWL_MVM_RXQ_NOTIF_DEL_BA, | 819 | IWL_MVM_RXQ_NOTIF_DEL_BA, |
460 | 820 | IWL_MVM_RXQ_NSSN_SYNC, | ||
461 | 820 | }; | 821 | }; |
462 | 821 | 822 | ||
463 | 822 | /** | 823 | /** |
464 | diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c | |||
465 | index d5a595a..d243f71 100644 | |||
466 | --- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c | |||
467 | +++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c | |||
468 | @@ -468,6 +468,9 @@ static const struct iwl_prph_range iwl_prph_dump_addr_9000[] = { | |||
469 | 468 | { .start = 0x00a05400, .end = 0x00a056e8 }, | 468 | { .start = 0x00a05400, .end = 0x00a056e8 }, |
470 | 469 | { .start = 0x00a08000, .end = 0x00a098bc }, | 469 | { .start = 0x00a08000, .end = 0x00a098bc }, |
471 | 470 | { .start = 0x00a02400, .end = 0x00a02758 }, | 470 | { .start = 0x00a02400, .end = 0x00a02758 }, |
472 | 471 | { .start = 0x00a04764, .end = 0x00a0476c }, | ||
473 | 472 | { .start = 0x00a04770, .end = 0x00a04774 }, | ||
474 | 473 | { .start = 0x00a04620, .end = 0x00a04624 }, | ||
475 | 471 | }; | 474 | }; |
476 | 472 | 475 | ||
477 | 473 | static const struct iwl_prph_range iwl_prph_dump_addr_22000[] = { | 476 | static const struct iwl_prph_range iwl_prph_dump_addr_22000[] = { |
478 | @@ -1905,8 +1908,6 @@ static void iwl_fw_ini_dump_trigger(struct iwl_fw_runtime *fwrt, | |||
479 | 1905 | iwl_dump_ini_mem(fwrt, data, reg, &ops); | 1908 | iwl_dump_ini_mem(fwrt, data, reg, &ops); |
480 | 1906 | break; | 1909 | break; |
481 | 1907 | case IWL_FW_INI_REGION_PERIPHERY_MAC: | 1910 | case IWL_FW_INI_REGION_PERIPHERY_MAC: |
482 | 1908 | case IWL_FW_INI_REGION_PERIPHERY_PHY: | ||
483 | 1909 | case IWL_FW_INI_REGION_PERIPHERY_AUX: | ||
484 | 1910 | ops.get_num_of_ranges = iwl_dump_ini_mem_ranges; | 1911 | ops.get_num_of_ranges = iwl_dump_ini_mem_ranges; |
485 | 1911 | ops.get_size = iwl_dump_ini_mem_get_size; | 1912 | ops.get_size = iwl_dump_ini_mem_get_size; |
486 | 1912 | ops.fill_mem_hdr = iwl_dump_ini_mem_fill_header; | 1913 | ops.fill_mem_hdr = iwl_dump_ini_mem_fill_header; |
487 | @@ -1971,6 +1972,8 @@ static void iwl_fw_ini_dump_trigger(struct iwl_fw_runtime *fwrt, | |||
488 | 1971 | ops.fill_range = iwl_dump_ini_csr_iter; | 1972 | ops.fill_range = iwl_dump_ini_csr_iter; |
489 | 1972 | iwl_dump_ini_mem(fwrt, data, reg, &ops); | 1973 | iwl_dump_ini_mem(fwrt, data, reg, &ops); |
490 | 1973 | break; | 1974 | break; |
491 | 1975 | case IWL_FW_INI_REGION_PERIPHERY_PHY: | ||
492 | 1976 | case IWL_FW_INI_REGION_PERIPHERY_AUX: | ||
493 | 1974 | case IWL_FW_INI_REGION_DRAM_IMR: | 1977 | case IWL_FW_INI_REGION_DRAM_IMR: |
494 | 1975 | /* This is undefined yet */ | 1978 | /* This is undefined yet */ |
495 | 1976 | default: | 1979 | default: |
496 | @@ -2481,8 +2484,7 @@ iwl_fw_dbg_buffer_allocation(struct iwl_fw_runtime *fwrt, u32 size) | |||
497 | 2481 | 2484 | ||
498 | 2482 | virtual_addr = | 2485 | virtual_addr = |
499 | 2483 | dma_alloc_coherent(fwrt->trans->dev, size, &phys_addr, | 2486 | dma_alloc_coherent(fwrt->trans->dev, size, &phys_addr, |
502 | 2484 | GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO | | 2487 | GFP_KERNEL | __GFP_NOWARN); |
501 | 2485 | __GFP_COMP); | ||
503 | 2486 | 2488 | ||
504 | 2487 | /* TODO: alloc fragments if needed */ | 2489 | /* TODO: alloc fragments if needed */ |
505 | 2488 | if (!virtual_addr) | 2490 | if (!virtual_addr) |
506 | @@ -2499,7 +2501,7 @@ iwl_fw_dbg_buffer_allocation(struct iwl_fw_runtime *fwrt, u32 size) | |||
507 | 2499 | } | 2501 | } |
508 | 2500 | 2502 | ||
509 | 2501 | static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt, | 2503 | static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt, |
511 | 2502 | struct iwl_fw_ini_allocation_data *alloc, | 2504 | struct iwl_fw_ini_allocation_tlv *alloc, |
512 | 2503 | enum iwl_fw_ini_apply_point pnt) | 2505 | enum iwl_fw_ini_apply_point pnt) |
513 | 2504 | { | 2506 | { |
514 | 2505 | struct iwl_trans *trans = fwrt->trans; | 2507 | struct iwl_trans *trans = fwrt->trans; |
515 | @@ -2514,7 +2516,14 @@ static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt, | |||
516 | 2514 | .len[0] = sizeof(ldbg_cmd), | 2516 | .len[0] = sizeof(ldbg_cmd), |
517 | 2515 | }; | 2517 | }; |
518 | 2516 | int block_idx = trans->dbg.num_blocks; | 2518 | int block_idx = trans->dbg.num_blocks; |
520 | 2517 | u32 buf_location = le32_to_cpu(alloc->tlv.buffer_location); | 2519 | u32 buf_location = le32_to_cpu(alloc->buffer_location); |
521 | 2520 | u32 alloc_id = le32_to_cpu(alloc->allocation_id); | ||
522 | 2521 | |||
523 | 2522 | if (alloc_id <= IWL_FW_INI_ALLOCATION_INVALID || | ||
524 | 2523 | alloc_id >= IWL_FW_INI_ALLOCATION_NUM) { | ||
525 | 2524 | IWL_ERR(fwrt, "WRT: Invalid allocation id %d\n", alloc_id); | ||
526 | 2525 | return; | ||
527 | 2526 | } | ||
528 | 2518 | 2527 | ||
529 | 2519 | if (fwrt->trans->dbg.ini_dest == IWL_FW_INI_LOCATION_INVALID) | 2528 | if (fwrt->trans->dbg.ini_dest == IWL_FW_INI_LOCATION_INVALID) |
530 | 2520 | fwrt->trans->dbg.ini_dest = buf_location; | 2529 | fwrt->trans->dbg.ini_dest = buf_location; |
531 | @@ -2539,12 +2548,11 @@ static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt, | |||
532 | 2539 | if (buf_location != IWL_FW_INI_LOCATION_DRAM_PATH) | 2548 | if (buf_location != IWL_FW_INI_LOCATION_DRAM_PATH) |
533 | 2540 | return; | 2549 | return; |
534 | 2541 | 2550 | ||
538 | 2542 | if (!alloc->is_alloc) { | 2551 | if (!(BIT(alloc_id) & fwrt->trans->dbg.is_alloc)) { |
539 | 2543 | iwl_fw_dbg_buffer_allocation(fwrt, | 2552 | iwl_fw_dbg_buffer_allocation(fwrt, le32_to_cpu(alloc->size)); |
537 | 2544 | le32_to_cpu(alloc->tlv.size)); | ||
540 | 2545 | if (block_idx == trans->dbg.num_blocks) | 2553 | if (block_idx == trans->dbg.num_blocks) |
541 | 2546 | return; | 2554 | return; |
543 | 2547 | alloc->is_alloc = 1; | 2555 | fwrt->trans->dbg.is_alloc |= BIT(alloc_id); |
544 | 2548 | } | 2556 | } |
545 | 2549 | 2557 | ||
546 | 2550 | /* First block is assigned via registers / context info */ | 2558 | /* First block is assigned via registers / context info */ |
547 | @@ -2557,9 +2565,9 @@ static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt, | |||
548 | 2557 | cmd->num_frags = cpu_to_le32(1); | 2565 | cmd->num_frags = cpu_to_le32(1); |
549 | 2558 | cmd->fragments[0].address = | 2566 | cmd->fragments[0].address = |
550 | 2559 | cpu_to_le64(trans->dbg.fw_mon[block_idx].physical); | 2567 | cpu_to_le64(trans->dbg.fw_mon[block_idx].physical); |
554 | 2560 | cmd->fragments[0].size = alloc->tlv.size; | 2568 | cmd->fragments[0].size = alloc->size; |
555 | 2561 | cmd->allocation_id = alloc->tlv.allocation_id; | 2569 | cmd->allocation_id = alloc->allocation_id; |
556 | 2562 | cmd->buffer_location = alloc->tlv.buffer_location; | 2570 | cmd->buffer_location = alloc->buffer_location; |
557 | 2563 | 2571 | ||
558 | 2564 | iwl_trans_send_cmd(trans, &hcmd); | 2572 | iwl_trans_send_cmd(trans, &hcmd); |
559 | 2565 | } | 2573 | } |
560 | @@ -2773,10 +2781,13 @@ static void _iwl_fw_dbg_apply_point(struct iwl_fw_runtime *fwrt, | |||
561 | 2773 | enum iwl_fw_ini_apply_point pnt, | 2781 | enum iwl_fw_ini_apply_point pnt, |
562 | 2774 | bool ext) | 2782 | bool ext) |
563 | 2775 | { | 2783 | { |
565 | 2776 | void *iter = data->data; | 2784 | struct iwl_apply_point_data *iter; |
566 | 2785 | |||
567 | 2786 | if (!data->list.next) | ||
568 | 2787 | return; | ||
569 | 2777 | 2788 | ||
572 | 2778 | while (iter && iter < data->data + data->size) { | 2789 | list_for_each_entry(iter, &data->list, list) { |
573 | 2779 | struct iwl_ucode_tlv *tlv = iter; | 2790 | struct iwl_ucode_tlv *tlv = &iter->tlv; |
574 | 2780 | void *ini_tlv = (void *)tlv->data; | 2791 | void *ini_tlv = (void *)tlv->data; |
575 | 2781 | u32 type = le32_to_cpu(tlv->type); | 2792 | u32 type = le32_to_cpu(tlv->type); |
576 | 2782 | const char invalid_ap_str[] = | 2793 | const char invalid_ap_str[] = |
577 | @@ -2786,24 +2797,19 @@ static void _iwl_fw_dbg_apply_point(struct iwl_fw_runtime *fwrt, | |||
578 | 2786 | case IWL_UCODE_TLV_TYPE_DEBUG_INFO: | 2797 | case IWL_UCODE_TLV_TYPE_DEBUG_INFO: |
579 | 2787 | iwl_fw_dbg_info_apply(fwrt, ini_tlv, ext, pnt); | 2798 | iwl_fw_dbg_info_apply(fwrt, ini_tlv, ext, pnt); |
580 | 2788 | break; | 2799 | break; |
584 | 2789 | case IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION: { | 2800 | case IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION: |
582 | 2790 | struct iwl_fw_ini_allocation_data *buf_alloc = ini_tlv; | ||
583 | 2791 | |||
585 | 2792 | if (pnt != IWL_FW_INI_APPLY_EARLY) { | 2801 | if (pnt != IWL_FW_INI_APPLY_EARLY) { |
586 | 2793 | IWL_ERR(fwrt, invalid_ap_str, ext, pnt, | 2802 | IWL_ERR(fwrt, invalid_ap_str, ext, pnt, |
587 | 2794 | "buffer allocation"); | 2803 | "buffer allocation"); |
589 | 2795 | goto next; | 2804 | break; |
590 | 2796 | } | 2805 | } |
591 | 2797 | |||
592 | 2798 | iwl_fw_dbg_buffer_apply(fwrt, ini_tlv, pnt); | 2806 | iwl_fw_dbg_buffer_apply(fwrt, ini_tlv, pnt); |
593 | 2799 | iter += sizeof(buf_alloc->is_alloc); | ||
594 | 2800 | break; | 2807 | break; |
595 | 2801 | } | ||
596 | 2802 | case IWL_UCODE_TLV_TYPE_HCMD: | 2808 | case IWL_UCODE_TLV_TYPE_HCMD: |
597 | 2803 | if (pnt < IWL_FW_INI_APPLY_AFTER_ALIVE) { | 2809 | if (pnt < IWL_FW_INI_APPLY_AFTER_ALIVE) { |
598 | 2804 | IWL_ERR(fwrt, invalid_ap_str, ext, pnt, | 2810 | IWL_ERR(fwrt, invalid_ap_str, ext, pnt, |
599 | 2805 | "host command"); | 2811 | "host command"); |
601 | 2806 | goto next; | 2812 | break; |
602 | 2807 | } | 2813 | } |
603 | 2808 | iwl_fw_dbg_send_hcmd(fwrt, tlv, ext); | 2814 | iwl_fw_dbg_send_hcmd(fwrt, tlv, ext); |
604 | 2809 | break; | 2815 | break; |
605 | @@ -2821,8 +2827,6 @@ static void _iwl_fw_dbg_apply_point(struct iwl_fw_runtime *fwrt, | |||
606 | 2821 | ext, type); | 2827 | ext, type); |
607 | 2822 | break; | 2828 | break; |
608 | 2823 | } | 2829 | } |
609 | 2824 | next: | ||
610 | 2825 | iter += sizeof(*tlv) + le32_to_cpu(tlv->length); | ||
611 | 2826 | } | 2830 | } |
612 | 2827 | } | 2831 | } |
613 | 2828 | 2832 | ||
614 | diff --git a/drivers/net/wireless/intel/iwlwifi/fw/file.h b/drivers/net/wireless/intel/iwlwifi/fw/file.h | |||
615 | index a2b9299..d2b162f 100644 | |||
616 | --- a/drivers/net/wireless/intel/iwlwifi/fw/file.h | |||
617 | +++ b/drivers/net/wireless/intel/iwlwifi/fw/file.h | |||
618 | @@ -476,6 +476,7 @@ enum iwl_ucode_tlv_capa { | |||
619 | 476 | IWL_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS = (__force iwl_ucode_tlv_capa_t)48, | 476 | IWL_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS = (__force iwl_ucode_tlv_capa_t)48, |
620 | 477 | IWL_UCODE_TLV_CAPA_CS_MODIFY = (__force iwl_ucode_tlv_capa_t)49, | 477 | IWL_UCODE_TLV_CAPA_CS_MODIFY = (__force iwl_ucode_tlv_capa_t)49, |
621 | 478 | IWL_UCODE_TLV_CAPA_SET_LTR_GEN2 = (__force iwl_ucode_tlv_capa_t)50, | 478 | IWL_UCODE_TLV_CAPA_SET_LTR_GEN2 = (__force iwl_ucode_tlv_capa_t)50, |
622 | 479 | IWL_UCODE_TLV_CAPA_SET_PPAG = (__force iwl_ucode_tlv_capa_t)52, | ||
623 | 479 | 480 | ||
624 | 480 | /* set 2 */ | 481 | /* set 2 */ |
625 | 481 | IWL_UCODE_TLV_CAPA_EXTENDED_DTS_MEASURE = (__force iwl_ucode_tlv_capa_t)64, | 482 | IWL_UCODE_TLV_CAPA_EXTENDED_DTS_MEASURE = (__force iwl_ucode_tlv_capa_t)64, |
626 | diff --git a/drivers/net/wireless/intel/iwlwifi/fw/img.h b/drivers/net/wireless/intel/iwlwifi/fw/img.h | |||
627 | index 18ca5f1..039576d 100644 | |||
628 | --- a/drivers/net/wireless/intel/iwlwifi/fw/img.h | |||
629 | +++ b/drivers/net/wireless/intel/iwlwifi/fw/img.h | |||
630 | @@ -228,15 +228,6 @@ struct iwl_fw_dbg { | |||
631 | 228 | }; | 228 | }; |
632 | 229 | 229 | ||
633 | 230 | /** | 230 | /** |
634 | 231 | * @tlv: the buffer allocation tlv | ||
635 | 232 | * @is_alloc: indicates if the buffer was already allocated | ||
636 | 233 | */ | ||
637 | 234 | struct iwl_fw_ini_allocation_data { | ||
638 | 235 | struct iwl_fw_ini_allocation_tlv tlv; | ||
639 | 236 | u32 is_alloc; | ||
640 | 237 | } __packed; | ||
641 | 238 | |||
642 | 239 | /** | ||
643 | 240 | * struct iwl_fw_ini_active_triggers | 231 | * struct iwl_fw_ini_active_triggers |
644 | 241 | * @active: is this trigger active | 232 | * @active: is this trigger active |
645 | 242 | * @size: allocated memory size of the trigger | 233 | * @size: allocated memory size of the trigger |
646 | diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-config.h b/drivers/net/wireless/intel/iwlwifi/iwl-config.h | |||
647 | index 286bc0c..2cc02f0 100644 | |||
648 | --- a/drivers/net/wireless/intel/iwlwifi/iwl-config.h | |||
649 | +++ b/drivers/net/wireless/intel/iwlwifi/iwl-config.h | |||
650 | @@ -523,10 +523,13 @@ extern const struct iwl_cfg iwl22000_2ac_cfg_hr; | |||
651 | 523 | extern const struct iwl_cfg iwl22000_2ac_cfg_hr_cdb; | 523 | extern const struct iwl_cfg iwl22000_2ac_cfg_hr_cdb; |
652 | 524 | extern const struct iwl_cfg iwl22000_2ac_cfg_jf; | 524 | extern const struct iwl_cfg iwl22000_2ac_cfg_jf; |
653 | 525 | extern const struct iwl_cfg iwl_ax101_cfg_qu_hr; | 525 | extern const struct iwl_cfg iwl_ax101_cfg_qu_hr; |
654 | 526 | extern const struct iwl_cfg iwl_ax101_cfg_qu_c0_hr_b0; | ||
655 | 526 | extern const struct iwl_cfg iwl_ax101_cfg_quz_hr; | 527 | extern const struct iwl_cfg iwl_ax101_cfg_quz_hr; |
656 | 527 | extern const struct iwl_cfg iwl22000_2ax_cfg_hr; | 528 | extern const struct iwl_cfg iwl22000_2ax_cfg_hr; |
657 | 528 | extern const struct iwl_cfg iwl_ax200_cfg_cc; | 529 | extern const struct iwl_cfg iwl_ax200_cfg_cc; |
658 | 529 | extern const struct iwl_cfg iwl_ax201_cfg_qu_hr; | 530 | extern const struct iwl_cfg iwl_ax201_cfg_qu_hr; |
659 | 531 | extern const struct iwl_cfg iwl_ax201_cfg_qu_hr; | ||
660 | 532 | extern const struct iwl_cfg iwl_ax201_cfg_qu_c0_hr_b0; | ||
661 | 530 | extern const struct iwl_cfg iwl_ax201_cfg_quz_hr; | 533 | extern const struct iwl_cfg iwl_ax201_cfg_quz_hr; |
662 | 531 | extern const struct iwl_cfg iwl_ax1650i_cfg_quz_hr; | 534 | extern const struct iwl_cfg iwl_ax1650i_cfg_quz_hr; |
663 | 532 | extern const struct iwl_cfg iwl_ax1650s_cfg_quz_hr; | 535 | extern const struct iwl_cfg iwl_ax1650s_cfg_quz_hr; |
664 | @@ -538,6 +541,10 @@ extern const struct iwl_cfg iwl9461_2ac_cfg_qu_b0_jf_b0; | |||
665 | 538 | extern const struct iwl_cfg iwl9462_2ac_cfg_qu_b0_jf_b0; | 541 | extern const struct iwl_cfg iwl9462_2ac_cfg_qu_b0_jf_b0; |
666 | 539 | extern const struct iwl_cfg iwl9560_2ac_cfg_qu_b0_jf_b0; | 542 | extern const struct iwl_cfg iwl9560_2ac_cfg_qu_b0_jf_b0; |
667 | 540 | extern const struct iwl_cfg iwl9560_2ac_160_cfg_qu_b0_jf_b0; | 543 | extern const struct iwl_cfg iwl9560_2ac_160_cfg_qu_b0_jf_b0; |
668 | 544 | extern const struct iwl_cfg iwl9461_2ac_cfg_qu_c0_jf_b0; | ||
669 | 545 | extern const struct iwl_cfg iwl9462_2ac_cfg_qu_c0_jf_b0; | ||
670 | 546 | extern const struct iwl_cfg iwl9560_2ac_cfg_qu_c0_jf_b0; | ||
671 | 547 | extern const struct iwl_cfg iwl9560_2ac_160_cfg_qu_c0_jf_b0; | ||
672 | 541 | extern const struct iwl_cfg killer1550i_2ac_cfg_qu_b0_jf_b0; | 548 | extern const struct iwl_cfg killer1550i_2ac_cfg_qu_b0_jf_b0; |
673 | 542 | extern const struct iwl_cfg killer1550s_2ac_cfg_qu_b0_jf_b0; | 549 | extern const struct iwl_cfg killer1550s_2ac_cfg_qu_b0_jf_b0; |
674 | 543 | extern const struct iwl_cfg iwl22000_2ax_cfg_jf; | 550 | extern const struct iwl_cfg iwl22000_2ax_cfg_jf; |
675 | diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-csr.h b/drivers/net/wireless/intel/iwlwifi/iwl-csr.h | |||
676 | index 1c867ce..cb4c551 100644 | |||
677 | --- a/drivers/net/wireless/intel/iwlwifi/iwl-csr.h | |||
678 | +++ b/drivers/net/wireless/intel/iwlwifi/iwl-csr.h | |||
679 | @@ -329,6 +329,7 @@ enum { | |||
680 | 329 | #define CSR_HW_REV_TYPE_QNJ (0x0000360) | 329 | #define CSR_HW_REV_TYPE_QNJ (0x0000360) |
681 | 330 | #define CSR_HW_REV_TYPE_QNJ_B0 (0x0000364) | 330 | #define CSR_HW_REV_TYPE_QNJ_B0 (0x0000364) |
682 | 331 | #define CSR_HW_REV_TYPE_QU_B0 (0x0000334) | 331 | #define CSR_HW_REV_TYPE_QU_B0 (0x0000334) |
683 | 332 | #define CSR_HW_REV_TYPE_QU_C0 (0x0000338) | ||
684 | 332 | #define CSR_HW_REV_TYPE_QUZ (0x0000354) | 333 | #define CSR_HW_REV_TYPE_QUZ (0x0000354) |
685 | 333 | #define CSR_HW_REV_TYPE_HR_CDB (0x0000340) | 334 | #define CSR_HW_REV_TYPE_HR_CDB (0x0000340) |
686 | 334 | #define CSR_HW_REV_TYPE_SO (0x0000370) | 335 | #define CSR_HW_REV_TYPE_SO (0x0000370) |
687 | diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c b/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c | |||
688 | index c4481aa..3029236 100644 | |||
689 | --- a/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c | |||
690 | +++ b/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c | |||
691 | @@ -60,143 +60,79 @@ | |||
692 | 60 | #include "iwl-trans.h" | 60 | #include "iwl-trans.h" |
693 | 61 | #include "iwl-dbg-tlv.h" | 61 | #include "iwl-dbg-tlv.h" |
694 | 62 | 62 | ||
697 | 63 | void iwl_fw_dbg_copy_tlv(struct iwl_trans *trans, struct iwl_ucode_tlv *tlv, | 63 | void iwl_dbg_tlv_copy(struct iwl_trans *trans, struct iwl_ucode_tlv *tlv, |
698 | 64 | bool ext) | 64 | bool ext) |
699 | 65 | { | 65 | { |
701 | 66 | struct iwl_apply_point_data *data; | 66 | struct iwl_apply_point_data *dbg_cfg, *tlv_copy; |
702 | 67 | struct iwl_fw_ini_header *header = (void *)&tlv->data[0]; | 67 | struct iwl_fw_ini_header *header = (void *)&tlv->data[0]; |
703 | 68 | u32 tlv_type = le32_to_cpu(tlv->type); | ||
704 | 69 | u32 len = le32_to_cpu(tlv->length); | ||
705 | 68 | u32 apply_point = le32_to_cpu(header->apply_point); | 70 | u32 apply_point = le32_to_cpu(header->apply_point); |
706 | 69 | 71 | ||
707 | 70 | int copy_size = le32_to_cpu(tlv->length) + sizeof(*tlv); | ||
708 | 71 | int offset_size = copy_size; | ||
709 | 72 | |||
710 | 73 | if (le32_to_cpu(header->tlv_version) != 1) | 72 | if (le32_to_cpu(header->tlv_version) != 1) |
711 | 74 | return; | 73 | return; |
712 | 75 | 74 | ||
713 | 76 | if (WARN_ONCE(apply_point >= IWL_FW_INI_APPLY_NUM, | 75 | if (WARN_ONCE(apply_point >= IWL_FW_INI_APPLY_NUM, |
715 | 77 | "Invalid apply point id %d\n", apply_point)) | 76 | "Invalid apply point %d\n", apply_point)) |
716 | 78 | return; | 77 | return; |
717 | 79 | 78 | ||
718 | 79 | IWL_DEBUG_FW(trans, "WRT: read TLV 0x%x, apply point %d\n", | ||
719 | 80 | tlv_type, apply_point); | ||
720 | 81 | |||
721 | 80 | if (ext) | 82 | if (ext) |
723 | 81 | data = &trans->dbg.apply_points_ext[apply_point]; | 83 | dbg_cfg = &trans->dbg.apply_points_ext[apply_point]; |
724 | 82 | else | 84 | else |
734 | 83 | data = &trans->dbg.apply_points[apply_point]; | 85 | dbg_cfg = &trans->dbg.apply_points[apply_point]; |
726 | 84 | |||
727 | 85 | /* add room for is_alloc field in &iwl_fw_ini_allocation_data struct */ | ||
728 | 86 | if (le32_to_cpu(tlv->type) == IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION) { | ||
729 | 87 | struct iwl_fw_ini_allocation_data *buf_alloc = | ||
730 | 88 | (void *)tlv->data; | ||
731 | 89 | |||
732 | 90 | offset_size += sizeof(buf_alloc->is_alloc); | ||
733 | 91 | } | ||
735 | 92 | 86 | ||
743 | 93 | /* | 87 | tlv_copy = kzalloc(sizeof(*tlv_copy) + len, GFP_KERNEL); |
744 | 94 | * Make sure we still have room to copy this TLV. Offset points to the | 88 | if (!tlv_copy) { |
745 | 95 | * location the last copy ended. | 89 | IWL_ERR(trans, "WRT: No memory for TLV 0x%x, apply point %d\n", |
746 | 96 | */ | 90 | tlv_type, apply_point); |
740 | 97 | if (WARN_ONCE(data->offset + offset_size > data->size, | ||
741 | 98 | "Not enough memory for apply point %d\n", | ||
742 | 99 | apply_point)) | ||
747 | 100 | return; | 91 | return; |
748 | 101 | |||
749 | 102 | memcpy(data->data + data->offset, (void *)tlv, copy_size); | ||
750 | 103 | data->offset += offset_size; | ||
751 | 104 | } | ||
752 | 105 | |||
753 | 106 | void iwl_alloc_dbg_tlv(struct iwl_trans *trans, size_t len, const u8 *data, | ||
754 | 107 | bool ext) | ||
755 | 108 | { | ||
756 | 109 | struct iwl_ucode_tlv *tlv; | ||
757 | 110 | u32 size[IWL_FW_INI_APPLY_NUM] = {0}; | ||
758 | 111 | int i; | ||
759 | 112 | |||
760 | 113 | while (len >= sizeof(*tlv)) { | ||
761 | 114 | u32 tlv_len, tlv_type, apply; | ||
762 | 115 | struct iwl_fw_ini_header *hdr; | ||
763 | 116 | |||
764 | 117 | len -= sizeof(*tlv); | ||
765 | 118 | tlv = (void *)data; | ||
766 | 119 | |||
767 | 120 | tlv_len = le32_to_cpu(tlv->length); | ||
768 | 121 | tlv_type = le32_to_cpu(tlv->type); | ||
769 | 122 | |||
770 | 123 | if (len < tlv_len) | ||
771 | 124 | return; | ||
772 | 125 | |||
773 | 126 | len -= ALIGN(tlv_len, 4); | ||
774 | 127 | data += sizeof(*tlv) + ALIGN(tlv_len, 4); | ||
775 | 128 | |||
776 | 129 | if (tlv_type < IWL_UCODE_TLV_DEBUG_BASE || | ||
777 | 130 | tlv_type > IWL_UCODE_TLV_DEBUG_MAX) | ||
778 | 131 | continue; | ||
779 | 132 | |||
780 | 133 | hdr = (void *)&tlv->data[0]; | ||
781 | 134 | apply = le32_to_cpu(hdr->apply_point); | ||
782 | 135 | |||
783 | 136 | if (le32_to_cpu(hdr->tlv_version) != 1) | ||
784 | 137 | continue; | ||
785 | 138 | |||
786 | 139 | IWL_DEBUG_FW(trans, "WRT: read TLV 0x%x, apply point %d\n", | ||
787 | 140 | le32_to_cpu(tlv->type), apply); | ||
788 | 141 | |||
789 | 142 | if (WARN_ON(apply >= IWL_FW_INI_APPLY_NUM)) | ||
790 | 143 | continue; | ||
791 | 144 | |||
792 | 145 | /* add room for is_alloc field in &iwl_fw_ini_allocation_data | ||
793 | 146 | * struct | ||
794 | 147 | */ | ||
795 | 148 | if (tlv_type == IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION) { | ||
796 | 149 | struct iwl_fw_ini_allocation_data *buf_alloc = | ||
797 | 150 | (void *)tlv->data; | ||
798 | 151 | |||
799 | 152 | size[apply] += sizeof(buf_alloc->is_alloc); | ||
800 | 153 | } | ||
801 | 154 | |||
802 | 155 | size[apply] += sizeof(*tlv) + tlv_len; | ||
803 | 156 | } | 92 | } |
804 | 157 | 93 | ||
807 | 158 | for (i = 0; i < ARRAY_SIZE(size); i++) { | 94 | INIT_LIST_HEAD(&tlv_copy->list); |
808 | 159 | void *mem; | 95 | memcpy(&tlv_copy->tlv, tlv, sizeof(*tlv) + len); |
809 | 160 | 96 | ||
812 | 161 | if (!size[i]) | 97 | if (!dbg_cfg->list.next) |
813 | 162 | continue; | 98 | INIT_LIST_HEAD(&dbg_cfg->list); |
814 | 163 | 99 | ||
816 | 164 | mem = kzalloc(size[i], GFP_KERNEL); | 100 | list_add_tail(&tlv_copy->list, &dbg_cfg->list); |
817 | 165 | 101 | ||
822 | 166 | if (!mem) { | 102 | trans->dbg.ini_valid = true; |
823 | 167 | IWL_ERR(trans, "No memory for apply point %d\n", i); | 103 | } |
820 | 168 | return; | ||
821 | 169 | } | ||
824 | 170 | 104 | ||
832 | 171 | if (ext) { | 105 | static void iwl_dbg_tlv_free_list(struct list_head *list) |
833 | 172 | trans->dbg.apply_points_ext[i].data = mem; | 106 | { |
834 | 173 | trans->dbg.apply_points_ext[i].size = size[i]; | 107 | if (!list || !list->next) |
835 | 174 | } else { | 108 | return; |
829 | 175 | trans->dbg.apply_points[i].data = mem; | ||
830 | 176 | trans->dbg.apply_points[i].size = size[i]; | ||
831 | 177 | } | ||
836 | 178 | 109 | ||
838 | 179 | trans->dbg.ini_valid = true; | 110 | while (!list_empty(list)) { |
839 | 111 | struct iwl_apply_point_data *node = | ||
840 | 112 | list_entry(list->next, typeof(*node), list); | ||
841 | 113 | |||
842 | 114 | list_del(&node->list); | ||
843 | 115 | kfree(node); | ||
844 | 180 | } | 116 | } |
845 | 181 | } | 117 | } |
846 | 182 | 118 | ||
848 | 183 | void iwl_fw_dbg_free(struct iwl_trans *trans) | 119 | void iwl_dbg_tlv_free(struct iwl_trans *trans) |
849 | 184 | { | 120 | { |
850 | 185 | int i; | 121 | int i; |
851 | 186 | 122 | ||
852 | 187 | for (i = 0; i < ARRAY_SIZE(trans->dbg.apply_points); i++) { | 123 | for (i = 0; i < ARRAY_SIZE(trans->dbg.apply_points); i++) { |
856 | 188 | kfree(trans->dbg.apply_points[i].data); | 124 | struct iwl_apply_point_data *data; |
857 | 189 | trans->dbg.apply_points[i].size = 0; | 125 | |
858 | 190 | trans->dbg.apply_points[i].offset = 0; | 126 | data = &trans->dbg.apply_points[i]; |
859 | 127 | iwl_dbg_tlv_free_list(&data->list); | ||
860 | 191 | 128 | ||
864 | 192 | kfree(trans->dbg.apply_points_ext[i].data); | 129 | data = &trans->dbg.apply_points_ext[i]; |
865 | 193 | trans->dbg.apply_points_ext[i].size = 0; | 130 | iwl_dbg_tlv_free_list(&data->list); |
863 | 194 | trans->dbg.apply_points_ext[i].offset = 0; | ||
866 | 195 | } | 131 | } |
867 | 196 | } | 132 | } |
868 | 197 | 133 | ||
871 | 198 | static int iwl_parse_fw_dbg_tlv(struct iwl_trans *trans, const u8 *data, | 134 | static int iwl_dbg_tlv_parse_bin(struct iwl_trans *trans, const u8 *data, |
872 | 199 | size_t len) | 135 | size_t len) |
873 | 200 | { | 136 | { |
874 | 201 | struct iwl_ucode_tlv *tlv; | 137 | struct iwl_ucode_tlv *tlv; |
875 | 202 | enum iwl_ucode_tlv_type tlv_type; | 138 | enum iwl_ucode_tlv_type tlv_type; |
876 | @@ -224,7 +160,7 @@ static int iwl_parse_fw_dbg_tlv(struct iwl_trans *trans, const u8 *data, | |||
877 | 224 | case IWL_UCODE_TLV_TYPE_REGIONS: | 160 | case IWL_UCODE_TLV_TYPE_REGIONS: |
878 | 225 | case IWL_UCODE_TLV_TYPE_TRIGGERS: | 161 | case IWL_UCODE_TLV_TYPE_TRIGGERS: |
879 | 226 | case IWL_UCODE_TLV_TYPE_DEBUG_FLOW: | 162 | case IWL_UCODE_TLV_TYPE_DEBUG_FLOW: |
881 | 227 | iwl_fw_dbg_copy_tlv(trans, tlv, true); | 163 | iwl_dbg_tlv_copy(trans, tlv, true); |
882 | 228 | break; | 164 | break; |
883 | 229 | default: | 165 | default: |
884 | 230 | WARN_ONCE(1, "Invalid TLV %x\n", tlv_type); | 166 | WARN_ONCE(1, "Invalid TLV %x\n", tlv_type); |
885 | @@ -235,7 +171,7 @@ static int iwl_parse_fw_dbg_tlv(struct iwl_trans *trans, const u8 *data, | |||
886 | 235 | return 0; | 171 | return 0; |
887 | 236 | } | 172 | } |
888 | 237 | 173 | ||
890 | 238 | void iwl_load_fw_dbg_tlv(struct device *dev, struct iwl_trans *trans) | 174 | void iwl_dbg_tlv_load_bin(struct device *dev, struct iwl_trans *trans) |
891 | 239 | { | 175 | { |
892 | 240 | const struct firmware *fw; | 176 | const struct firmware *fw; |
893 | 241 | int res; | 177 | int res; |
894 | @@ -247,8 +183,7 @@ void iwl_load_fw_dbg_tlv(struct device *dev, struct iwl_trans *trans) | |||
895 | 247 | if (res) | 183 | if (res) |
896 | 248 | return; | 184 | return; |
897 | 249 | 185 | ||
900 | 250 | iwl_alloc_dbg_tlv(trans, fw->size, fw->data, true); | 186 | iwl_dbg_tlv_parse_bin(trans, fw->data, fw->size); |
899 | 251 | iwl_parse_fw_dbg_tlv(trans, fw->data, fw->size); | ||
901 | 252 | 187 | ||
902 | 253 | trans->dbg.external_ini_loaded = true; | 188 | trans->dbg.external_ini_loaded = true; |
903 | 254 | release_firmware(fw); | 189 | release_firmware(fw); |
904 | diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.h b/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.h | |||
905 | index ee416f4..20c60a9 100644 | |||
906 | --- a/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.h | |||
907 | +++ b/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.h | |||
908 | @@ -5,7 +5,7 @@ | |||
909 | 5 | * | 5 | * |
910 | 6 | * GPL LICENSE SUMMARY | 6 | * GPL LICENSE SUMMARY |
911 | 7 | * | 7 | * |
913 | 8 | * Copyright (C) 2018 Intel Corporation | 8 | * Copyright (C) 2018 - 2019 Intel Corporation |
914 | 9 | * | 9 | * |
915 | 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
916 | 11 | * it under the terms of version 2 of the GNU General Public License as | 11 | * it under the terms of version 2 of the GNU General Public License as |
917 | @@ -25,7 +25,7 @@ | |||
918 | 25 | * | 25 | * |
919 | 26 | * BSD LICENSE | 26 | * BSD LICENSE |
920 | 27 | * | 27 | * |
922 | 28 | * Copyright (C) 2018 Intel Corporation | 28 | * Copyright (C) 2018 - 2019 Intel Corporation |
923 | 29 | * All rights reserved. | 29 | * All rights reserved. |
924 | 30 | * | 30 | * |
925 | 31 | * Redistribution and use in source and binary forms, with or without | 31 | * Redistribution and use in source and binary forms, with or without |
926 | @@ -63,22 +63,18 @@ | |||
927 | 63 | 63 | ||
928 | 64 | /** | 64 | /** |
929 | 65 | * struct iwl_apply_point_data | 65 | * struct iwl_apply_point_data |
933 | 66 | * @data: start address of this apply point data | 66 | * @list: list to go through the TLVs of the apply point |
934 | 67 | * @size total size of the data | 67 | * @tlv: a debug TLV |
932 | 68 | * @offset: current offset of the copied data | ||
935 | 69 | */ | 68 | */ |
936 | 70 | struct iwl_apply_point_data { | 69 | struct iwl_apply_point_data { |
940 | 71 | void *data; | 70 | struct list_head list; |
941 | 72 | int size; | 71 | struct iwl_ucode_tlv tlv; |
939 | 73 | int offset; | ||
942 | 74 | }; | 72 | }; |
943 | 75 | 73 | ||
944 | 76 | struct iwl_trans; | 74 | struct iwl_trans; |
951 | 77 | void iwl_load_fw_dbg_tlv(struct device *dev, struct iwl_trans *trans); | 75 | void iwl_dbg_tlv_load_bin(struct device *dev, struct iwl_trans *trans); |
952 | 78 | void iwl_fw_dbg_free(struct iwl_trans *trans); | 76 | void iwl_dbg_tlv_free(struct iwl_trans *trans); |
953 | 79 | void iwl_fw_dbg_copy_tlv(struct iwl_trans *trans, struct iwl_ucode_tlv *tlv, | 77 | void iwl_dbg_tlv_copy(struct iwl_trans *trans, struct iwl_ucode_tlv *tlv, |
954 | 80 | bool ext); | 78 | bool ext); |
949 | 81 | void iwl_alloc_dbg_tlv(struct iwl_trans *trans, size_t len, const u8 *data, | ||
950 | 82 | bool ext); | ||
955 | 83 | 79 | ||
956 | 84 | #endif /* __iwl_dbg_tlv_h__*/ | 80 | #endif /* __iwl_dbg_tlv_h__*/ |
957 | diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c | |||
958 | index c4bfbb8..f70a749 100644 | |||
959 | --- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c | |||
960 | +++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c | |||
961 | @@ -897,9 +897,6 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv, | |||
962 | 897 | fw_dbg_conf: | 897 | fw_dbg_conf: |
963 | 898 | #endif | 898 | #endif |
964 | 899 | 899 | ||
965 | 900 | if (iwlwifi_mod_params.enable_ini) | ||
966 | 901 | iwl_alloc_dbg_tlv(drv->trans, len, data, false); | ||
967 | 902 | |||
968 | 903 | while (len >= sizeof(*tlv)) { | 900 | while (len >= sizeof(*tlv)) { |
969 | 904 | len -= sizeof(*tlv); | 901 | len -= sizeof(*tlv); |
970 | 905 | tlv = (void *)data; | 902 | tlv = (void *)data; |
971 | @@ -1437,7 +1434,7 @@ fw_dbg_conf: | |||
972 | 1437 | case IWL_UCODE_TLV_TYPE_TRIGGERS: | 1434 | case IWL_UCODE_TLV_TYPE_TRIGGERS: |
973 | 1438 | case IWL_UCODE_TLV_TYPE_DEBUG_FLOW: | 1435 | case IWL_UCODE_TLV_TYPE_DEBUG_FLOW: |
974 | 1439 | if (iwlwifi_mod_params.enable_ini) | 1436 | if (iwlwifi_mod_params.enable_ini) |
976 | 1440 | iwl_fw_dbg_copy_tlv(drv->trans, tlv, false); | 1437 | iwl_dbg_tlv_copy(drv->trans, tlv, false); |
977 | 1441 | break; | 1438 | break; |
978 | 1442 | case IWL_UCODE_TLV_CMD_VERSIONS: | 1439 | case IWL_UCODE_TLV_CMD_VERSIONS: |
979 | 1443 | if (tlv_len % sizeof(struct iwl_fw_cmd_version)) { | 1440 | if (tlv_len % sizeof(struct iwl_fw_cmd_version)) { |
980 | @@ -1956,9 +1953,8 @@ struct iwl_drv *iwl_drv_start(struct iwl_trans *trans) | |||
981 | 1956 | #ifdef CPTCFG_IWLWIFI_SUPPORT_DEBUG_OVERRIDES | 1953 | #ifdef CPTCFG_IWLWIFI_SUPPORT_DEBUG_OVERRIDES |
982 | 1957 | trans->dbg_cfg = current_dbg_config; | 1954 | trans->dbg_cfg = current_dbg_config; |
983 | 1958 | iwl_dbg_cfg_load_ini(drv->trans->dev, &drv->trans->dbg_cfg); | 1955 | iwl_dbg_cfg_load_ini(drv->trans->dev, &drv->trans->dbg_cfg); |
984 | 1959 | |||
985 | 1960 | iwl_load_fw_dbg_tlv(drv->trans->dev, drv->trans); | ||
986 | 1961 | #endif | 1956 | #endif |
987 | 1957 | iwl_dbg_tlv_load_bin(drv->trans->dev, drv->trans); | ||
988 | 1962 | 1958 | ||
989 | 1963 | #ifdef CPTCFG_IWLWIFI_DEBUGFS | 1959 | #ifdef CPTCFG_IWLWIFI_DEBUGFS |
990 | 1964 | /* Create the device debugfs entries. */ | 1960 | /* Create the device debugfs entries. */ |
991 | @@ -1995,8 +1991,8 @@ err_fw: | |||
992 | 1995 | #endif | 1991 | #endif |
993 | 1996 | #ifdef CPTCFG_IWLWIFI_DEBUGFS | 1992 | #ifdef CPTCFG_IWLWIFI_DEBUGFS |
994 | 1997 | debugfs_remove_recursive(drv->dbgfs_drv); | 1993 | debugfs_remove_recursive(drv->dbgfs_drv); |
995 | 1998 | iwl_fw_dbg_free(drv->trans); | ||
996 | 1999 | #endif | 1994 | #endif |
997 | 1995 | iwl_dbg_tlv_free(drv->trans); | ||
998 | 2000 | kfree(drv); | 1996 | kfree(drv); |
999 | 2001 | err: | 1997 | err: |
1000 | 2002 | return ERR_PTR(ret); | 1998 | return ERR_PTR(ret); |
1001 | @@ -2029,7 +2025,7 @@ void iwl_drv_stop(struct iwl_drv *drv) | |||
1002 | 2029 | #ifdef CPTCFG_IWLWIFI_SUPPORT_DEBUG_OVERRIDES | 2025 | #ifdef CPTCFG_IWLWIFI_SUPPORT_DEBUG_OVERRIDES |
1003 | 2030 | iwl_dbg_cfg_free(&drv->trans->dbg_cfg); | 2026 | iwl_dbg_cfg_free(&drv->trans->dbg_cfg); |
1004 | 2031 | #endif | 2027 | #endif |
1006 | 2032 | iwl_fw_dbg_free(drv->trans); | 2028 | iwl_dbg_tlv_free(drv->trans); |
1007 | 2033 | 2029 | ||
1008 | 2034 | #if IS_ENABLED(CPTCFG_IWLXVT) | 2030 | #if IS_ENABLED(CPTCFG_IWLXVT) |
1009 | 2035 | iwl_remove_sysfs_file(drv); | 2031 | iwl_remove_sysfs_file(drv); |
1010 | diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c | |||
1011 | index 1b26b5d..c83de0e 100644 | |||
1012 | --- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c | |||
1013 | +++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c | |||
1014 | @@ -1232,11 +1232,6 @@ static u32 iwl_nvm_get_regdom_bw_flags(const u16 *nvm_chan, | |||
1015 | 1232 | return flags; | 1232 | return flags; |
1016 | 1233 | } | 1233 | } |
1017 | 1234 | 1234 | ||
1018 | 1235 | struct regdb_ptrs { | ||
1019 | 1236 | struct ieee80211_wmm_rule *rule; | ||
1020 | 1237 | u32 token; | ||
1021 | 1238 | }; | ||
1022 | 1239 | |||
1023 | 1240 | struct ieee80211_regdomain * | 1235 | struct ieee80211_regdomain * |
1024 | 1241 | iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, | 1236 | iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, |
1025 | 1242 | int num_of_ch, __le32 *channels, u16 fw_mcc, | 1237 | int num_of_ch, __le32 *channels, u16 fw_mcc, |
1026 | @@ -1248,7 +1243,6 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, | |||
1027 | 1248 | const u16 *nvm_chan; | 1243 | const u16 *nvm_chan; |
1028 | 1249 | struct ieee80211_regdomain *regd, *copy_rd; | 1244 | struct ieee80211_regdomain *regd, *copy_rd; |
1029 | 1250 | struct ieee80211_reg_rule *rule; | 1245 | struct ieee80211_reg_rule *rule; |
1030 | 1251 | struct regdb_ptrs *regdb_ptrs; | ||
1031 | 1252 | enum nl80211_band band; | 1246 | enum nl80211_band band; |
1032 | 1253 | int center_freq, prev_center_freq = 0; | 1247 | int center_freq, prev_center_freq = 0; |
1033 | 1254 | int valid_rules = 0; | 1248 | int valid_rules = 0; |
1034 | @@ -1280,12 +1274,6 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, | |||
1035 | 1280 | if (!regd) | 1274 | if (!regd) |
1036 | 1281 | return ERR_PTR(-ENOMEM); | 1275 | return ERR_PTR(-ENOMEM); |
1037 | 1282 | 1276 | ||
1038 | 1283 | regdb_ptrs = kcalloc(num_of_ch, sizeof(*regdb_ptrs), GFP_KERNEL); | ||
1039 | 1284 | if (!regdb_ptrs) { | ||
1040 | 1285 | copy_rd = ERR_PTR(-ENOMEM); | ||
1041 | 1286 | goto out; | ||
1042 | 1287 | } | ||
1043 | 1288 | |||
1044 | 1289 | /* set alpha2 from FW. */ | 1277 | /* set alpha2 from FW. */ |
1045 | 1290 | regd->alpha2[0] = fw_mcc >> 8; | 1278 | regd->alpha2[0] = fw_mcc >> 8; |
1046 | 1291 | regd->alpha2[1] = fw_mcc & 0xff; | 1279 | regd->alpha2[1] = fw_mcc & 0xff; |
1047 | @@ -1357,8 +1345,6 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, | |||
1048 | 1357 | if (!copy_rd) | 1345 | if (!copy_rd) |
1049 | 1358 | copy_rd = ERR_PTR(-ENOMEM); | 1346 | copy_rd = ERR_PTR(-ENOMEM); |
1050 | 1359 | 1347 | ||
1051 | 1360 | out: | ||
1052 | 1361 | kfree(regdb_ptrs); | ||
1053 | 1362 | kfree(regd); | 1348 | kfree(regd); |
1054 | 1363 | return copy_rd; | 1349 | return copy_rd; |
1055 | 1364 | } | 1350 | } |
1056 | diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-tm-gnl.c b/drivers/net/wireless/intel/iwlwifi/iwl-tm-gnl.c | |||
1057 | index 79be4e6..55358f5 100644 | |||
1058 | --- a/drivers/net/wireless/intel/iwlwifi/iwl-tm-gnl.c | |||
1059 | +++ b/drivers/net/wireless/intel/iwlwifi/iwl-tm-gnl.c | |||
1060 | @@ -5,10 +5,9 @@ | |||
1061 | 5 | * | 5 | * |
1062 | 6 | * GPL LICENSE SUMMARY | 6 | * GPL LICENSE SUMMARY |
1063 | 7 | * | 7 | * |
1065 | 8 | * Copyright(c) 2010 - 2014 Intel Corporation. All rights reserved. | 8 | * Copyright(c) 2010 - 2014, 2018 - 2019 Intel Corporation |
1066 | 9 | * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH | 9 | * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH |
1067 | 10 | * Copyright(c) 2016 - 2017 Intel Deutschland GmbH | 10 | * Copyright(c) 2016 - 2017 Intel Deutschland GmbH |
1068 | 11 | * Copyright(c) 2018 Intel Corporation | ||
1069 | 12 | * | 11 | * |
1070 | 13 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
1071 | 14 | * it under the terms of version 2 of the GNU General Public License as | 13 | * it under the terms of version 2 of the GNU General Public License as |
1072 | @@ -28,10 +27,9 @@ | |||
1073 | 28 | * | 27 | * |
1074 | 29 | * BSD LICENSE | 28 | * BSD LICENSE |
1075 | 30 | * | 29 | * |
1077 | 31 | * Copyright(c) 2010 - 2014 Intel Corporation. All rights reserved. | 30 | * Copyright(c) 2010 - 2014, 2018 - 2019 Intel Corporation |
1078 | 32 | * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH | 31 | * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH |
1079 | 33 | * Copyright(c) 2016 - 2017 Intel Deutschland GmbH | 32 | * Copyright(c) 2016 - 2017 Intel Deutschland GmbH |
1080 | 34 | * Copyright(c) 2018 Intel Corporation | ||
1081 | 35 | * All rights reserved. | 33 | * All rights reserved. |
1082 | 36 | * | 34 | * |
1083 | 37 | * Redistribution and use in source and binary forms, with or without | 35 | * Redistribution and use in source and binary forms, with or without |
1084 | @@ -1081,14 +1079,20 @@ static int iwl_tm_gnl_cmd_subscribe(struct sk_buff *skb, struct genl_info *info) | |||
1085 | 1081 | static __genl_const struct genl_ops iwl_tm_gnl_ops[] = { | 1079 | static __genl_const struct genl_ops iwl_tm_gnl_ops[] = { |
1086 | 1082 | { | 1080 | { |
1087 | 1083 | .cmd = IWL_TM_GNL_CMD_EXECUTE, | 1081 | .cmd = IWL_TM_GNL_CMD_EXECUTE, |
1089 | 1084 | .policy = iwl_tm_gnl_msg_policy, | 1082 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
1090 | 1083 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
1091 | 1084 | #endif | ||
1092 | 1085 | |||
1093 | 1085 | .doit = iwl_tm_gnl_cmd_do, | 1086 | .doit = iwl_tm_gnl_cmd_do, |
1094 | 1086 | .dumpit = iwl_tm_gnl_dump, | 1087 | .dumpit = iwl_tm_gnl_dump, |
1095 | 1087 | .done = iwl_tm_gnl_done, | 1088 | .done = iwl_tm_gnl_done, |
1096 | 1088 | }, | 1089 | }, |
1097 | 1089 | { | 1090 | { |
1098 | 1090 | .cmd = IWL_TM_GNL_CMD_SUBSCRIBE_EVENTS, | 1091 | .cmd = IWL_TM_GNL_CMD_SUBSCRIBE_EVENTS, |
1100 | 1091 | .policy = iwl_tm_gnl_msg_policy, | 1092 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
1101 | 1093 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
1102 | 1094 | #endif | ||
1103 | 1095 | |||
1104 | 1092 | .doit = iwl_tm_gnl_cmd_subscribe, | 1096 | .doit = iwl_tm_gnl_cmd_subscribe, |
1105 | 1093 | }, | 1097 | }, |
1106 | 1094 | }; | 1098 | }; |
1107 | @@ -1098,6 +1102,7 @@ static struct genl_family iwl_tm_gnl_family __genl_ro_after_init = { | |||
1108 | 1098 | .name = IWL_TM_GNL_FAMILY_NAME, | 1102 | .name = IWL_TM_GNL_FAMILY_NAME, |
1109 | 1099 | .version = IWL_TM_GNL_VERSION_NR, | 1103 | .version = IWL_TM_GNL_VERSION_NR, |
1110 | 1100 | .maxattr = IWL_TM_GNL_MSG_ATTR_MAX, | 1104 | .maxattr = IWL_TM_GNL_MSG_ATTR_MAX, |
1111 | 1105 | .policy = iwl_tm_gnl_msg_policy, | ||
1112 | 1101 | .module = THIS_MODULE, | 1106 | .module = THIS_MODULE, |
1113 | 1102 | .ops = iwl_tm_gnl_ops, | 1107 | .ops = iwl_tm_gnl_ops, |
1114 | 1103 | .n_ops = ARRAY_SIZE(iwl_tm_gnl_ops), | 1108 | .n_ops = ARRAY_SIZE(iwl_tm_gnl_ops), |
1115 | diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h | |||
1116 | index 6d156ee..6d0403a 100644 | |||
1117 | --- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h | |||
1118 | +++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h | |||
1119 | @@ -708,6 +708,7 @@ struct iwl_self_init_dram { | |||
1120 | 708 | * @ini_valid: indicates if debug ini mode is on | 708 | * @ini_valid: indicates if debug ini mode is on |
1121 | 709 | * @num_blocks: number of blocks in fw_mon | 709 | * @num_blocks: number of blocks in fw_mon |
1122 | 710 | * @fw_mon: address of the buffers for firmware monitor | 710 | * @fw_mon: address of the buffers for firmware monitor |
1123 | 711 | * @is_alloc: bit i is set if buffer i was allocated | ||
1124 | 711 | * @hw_error: equals true if hw error interrupt was received from the FW | 712 | * @hw_error: equals true if hw error interrupt was received from the FW |
1125 | 712 | * @ini_dest: debug monitor destination uses &enum iwl_fw_ini_buffer_location | 713 | * @ini_dest: debug monitor destination uses &enum iwl_fw_ini_buffer_location |
1126 | 713 | */ | 714 | */ |
1127 | @@ -730,7 +731,8 @@ struct iwl_trans_debug { | |||
1128 | 730 | struct iwl_apply_point_data apply_points_ext[IWL_FW_INI_APPLY_NUM]; | 731 | struct iwl_apply_point_data apply_points_ext[IWL_FW_INI_APPLY_NUM]; |
1129 | 731 | 732 | ||
1130 | 732 | int num_blocks; | 733 | int num_blocks; |
1132 | 733 | struct iwl_dram_data fw_mon[IWL_FW_INI_APPLY_NUM]; | 734 | struct iwl_dram_data fw_mon[IWL_FW_INI_ALLOCATION_NUM]; |
1133 | 735 | u32 is_alloc; | ||
1134 | 734 | 736 | ||
1135 | 735 | bool hw_error; | 737 | bool hw_error; |
1136 | 736 | enum iwl_fw_ini_buffer_location ini_dest; | 738 | enum iwl_fw_ini_buffer_location ini_dest; |
1137 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c | |||
1138 | index 5e6cd75..dfc553e 100644 | |||
1139 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c | |||
1140 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c | |||
1141 | @@ -1965,6 +1965,9 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test) | |||
1142 | 1965 | */ | 1965 | */ |
1143 | 1966 | iwl_mvm_update_changed_regdom(mvm); | 1966 | iwl_mvm_update_changed_regdom(mvm); |
1144 | 1967 | 1967 | ||
1145 | 1968 | /* Re-configure PPAG settings */ | ||
1146 | 1969 | iwl_mvm_ppag_send_cmd(mvm); | ||
1147 | 1970 | |||
1148 | 1968 | if (!unified_image) | 1971 | if (!unified_image) |
1149 | 1969 | /* Re-configure default SAR profile */ | 1972 | /* Re-configure default SAR profile */ |
1150 | 1970 | iwl_mvm_sar_select_profile(mvm, 1, 1); | 1973 | iwl_mvm_sar_select_profile(mvm, 1, 1); |
1151 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c | |||
1152 | index bb2ad8b..e413f0a 100644 | |||
1153 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c | |||
1154 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c | |||
1155 | @@ -987,6 +987,17 @@ int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b) | |||
1156 | 987 | return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0, len, &cmd); | 987 | return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0, len, &cmd); |
1157 | 988 | } | 988 | } |
1158 | 989 | 989 | ||
1159 | 990 | static bool iwl_mvm_sar_geo_support(struct iwl_mvm *mvm) | ||
1160 | 991 | { | ||
1161 | 992 | /* | ||
1162 | 993 | * The GEO_TX_POWER_LIMIT command is not supported on earlier | ||
1163 | 994 | * firmware versions. Unfortunately, we don't have a TLV API | ||
1164 | 995 | * flag to rely on, so rely on the major version which is in | ||
1165 | 996 | * the first byte of ucode_ver. | ||
1166 | 997 | */ | ||
1167 | 998 | return IWL_UCODE_SERIAL(mvm->fw->ucode_ver) >= 41; | ||
1168 | 999 | } | ||
1169 | 1000 | |||
1170 | 990 | int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm) | 1001 | int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm) |
1171 | 991 | { | 1002 | { |
1172 | 992 | struct iwl_geo_tx_power_profiles_resp *resp; | 1003 | struct iwl_geo_tx_power_profiles_resp *resp; |
1173 | @@ -1016,6 +1027,9 @@ int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm) | |||
1174 | 1016 | .data = { data }, | 1027 | .data = { data }, |
1175 | 1017 | }; | 1028 | }; |
1176 | 1018 | 1029 | ||
1177 | 1030 | if (!iwl_mvm_sar_geo_support(mvm)) | ||
1178 | 1031 | return -EOPNOTSUPP; | ||
1179 | 1032 | |||
1180 | 1019 | ret = iwl_mvm_send_cmd(mvm, &cmd); | 1033 | ret = iwl_mvm_send_cmd(mvm, &cmd); |
1181 | 1020 | if (ret) { | 1034 | if (ret) { |
1182 | 1021 | IWL_ERR(mvm, "Failed to get geographic profile info %d\n", ret); | 1035 | IWL_ERR(mvm, "Failed to get geographic profile info %d\n", ret); |
1183 | @@ -1041,13 +1055,7 @@ static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm) | |||
1184 | 1041 | int ret, i, j; | 1055 | int ret, i, j; |
1185 | 1042 | u16 cmd_wide_id = WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT); | 1056 | u16 cmd_wide_id = WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT); |
1186 | 1043 | 1057 | ||
1194 | 1044 | /* | 1058 | if (!iwl_mvm_sar_geo_support(mvm)) |
1188 | 1045 | * This command is not supported on earlier firmware versions. | ||
1189 | 1046 | * Unfortunately, we don't have a TLV API flag to rely on, so | ||
1190 | 1047 | * rely on the major version which is in the first byte of | ||
1191 | 1048 | * ucode_ver. | ||
1192 | 1049 | */ | ||
1193 | 1050 | if (IWL_UCODE_SERIAL(mvm->fw->ucode_ver) < 41) | ||
1195 | 1051 | return 0; | 1059 | return 0; |
1196 | 1052 | 1060 | ||
1197 | 1053 | ret = iwl_mvm_sar_get_wgds_table(mvm); | 1061 | ret = iwl_mvm_sar_get_wgds_table(mvm); |
1198 | @@ -1096,6 +1104,113 @@ static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm) | |||
1199 | 1096 | return iwl_mvm_send_cmd_pdu(mvm, cmd_wide_id, 0, sizeof(cmd), &cmd); | 1104 | return iwl_mvm_send_cmd_pdu(mvm, cmd_wide_id, 0, sizeof(cmd), &cmd); |
1200 | 1097 | } | 1105 | } |
1201 | 1098 | 1106 | ||
1202 | 1107 | static int iwl_mvm_get_ppag_table(struct iwl_mvm *mvm) | ||
1203 | 1108 | { | ||
1204 | 1109 | union acpi_object *wifi_pkg, *data, *enabled; | ||
1205 | 1110 | int i, j, ret, tbl_rev; | ||
1206 | 1111 | int idx = 2; | ||
1207 | 1112 | |||
1208 | 1113 | mvm->ppag_table.enabled = cpu_to_le32(0); | ||
1209 | 1114 | data = iwl_acpi_get_object(mvm->dev, ACPI_PPAG_METHOD); | ||
1210 | 1115 | if (IS_ERR(data)) | ||
1211 | 1116 | return PTR_ERR(data); | ||
1212 | 1117 | |||
1213 | 1118 | wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data, | ||
1214 | 1119 | ACPI_PPAG_WIFI_DATA_SIZE, &tbl_rev); | ||
1215 | 1120 | |||
1216 | 1121 | if (IS_ERR(wifi_pkg) || tbl_rev != 0) { | ||
1217 | 1122 | ret = PTR_ERR(wifi_pkg); | ||
1218 | 1123 | goto out_free; | ||
1219 | 1124 | } | ||
1220 | 1125 | |||
1221 | 1126 | enabled = &wifi_pkg->package.elements[1]; | ||
1222 | 1127 | if (enabled->type != ACPI_TYPE_INTEGER || | ||
1223 | 1128 | (enabled->integer.value != 0 && enabled->integer.value != 1)) { | ||
1224 | 1129 | ret = -EINVAL; | ||
1225 | 1130 | goto out_free; | ||
1226 | 1131 | } | ||
1227 | 1132 | |||
1228 | 1133 | mvm->ppag_table.enabled = cpu_to_le32(enabled->integer.value); | ||
1229 | 1134 | if (!mvm->ppag_table.enabled) { | ||
1230 | 1135 | ret = 0; | ||
1231 | 1136 | goto out_free; | ||
1232 | 1137 | } | ||
1233 | 1138 | |||
1234 | 1139 | /* | ||
1235 | 1140 | * read, verify gain values and save them into the PPAG table. | ||
1236 | 1141 | * first sub-band (j=0) corresponds to Low-Band (2.4GHz), and the | ||
1237 | 1142 | * following sub-bands to High-Band (5GHz). | ||
1238 | 1143 | */ | ||
1239 | 1144 | for (i = 0; i < ACPI_PPAG_NUM_CHAINS; i++) { | ||
1240 | 1145 | for (j = 0; j < ACPI_PPAG_NUM_SUB_BANDS; j++) { | ||
1241 | 1146 | union acpi_object *ent; | ||
1242 | 1147 | |||
1243 | 1148 | ent = &wifi_pkg->package.elements[idx++]; | ||
1244 | 1149 | if (ent->type != ACPI_TYPE_INTEGER || | ||
1245 | 1150 | (j == 0 && ent->integer.value > ACPI_PPAG_MAX_LB) || | ||
1246 | 1151 | (j == 0 && ent->integer.value < ACPI_PPAG_MIN_LB) || | ||
1247 | 1152 | (j != 0 && ent->integer.value > ACPI_PPAG_MAX_HB) || | ||
1248 | 1153 | (j != 0 && ent->integer.value < ACPI_PPAG_MIN_HB)) { | ||
1249 | 1154 | mvm->ppag_table.enabled = cpu_to_le32(0); | ||
1250 | 1155 | ret = -EINVAL; | ||
1251 | 1156 | goto out_free; | ||
1252 | 1157 | } | ||
1253 | 1158 | mvm->ppag_table.gain[i][j] = ent->integer.value; | ||
1254 | 1159 | } | ||
1255 | 1160 | } | ||
1256 | 1161 | ret = 0; | ||
1257 | 1162 | out_free: | ||
1258 | 1163 | kfree(data); | ||
1259 | 1164 | return ret; | ||
1260 | 1165 | } | ||
1261 | 1166 | |||
1262 | 1167 | int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm) | ||
1263 | 1168 | { | ||
1264 | 1169 | int i, j, ret; | ||
1265 | 1170 | |||
1266 | 1171 | if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SET_PPAG)) { | ||
1267 | 1172 | IWL_DEBUG_RADIO(mvm, | ||
1268 | 1173 | "PPAG capability not supported by FW, command not sent.\n"); | ||
1269 | 1174 | return 0; | ||
1270 | 1175 | } | ||
1271 | 1176 | |||
1272 | 1177 | IWL_DEBUG_RADIO(mvm, "Sending PER_PLATFORM_ANT_GAIN_CMD\n"); | ||
1273 | 1178 | IWL_DEBUG_RADIO(mvm, "PPAG is %s\n", | ||
1274 | 1179 | mvm->ppag_table.enabled ? "enabled" : "disabled"); | ||
1275 | 1180 | |||
1276 | 1181 | for (i = 0; i < ACPI_PPAG_NUM_CHAINS; i++) { | ||
1277 | 1182 | for (j = 0; j < ACPI_PPAG_NUM_SUB_BANDS; j++) { | ||
1278 | 1183 | IWL_DEBUG_RADIO(mvm, | ||
1279 | 1184 | "PPAG table: chain[%d] band[%d]: gain = %d\n", | ||
1280 | 1185 | i, j, mvm->ppag_table.gain[i][j]); | ||
1281 | 1186 | } | ||
1282 | 1187 | } | ||
1283 | 1188 | |||
1284 | 1189 | ret = iwl_mvm_send_cmd_pdu(mvm, WIDE_ID(PHY_OPS_GROUP, | ||
1285 | 1190 | PER_PLATFORM_ANT_GAIN_CMD), | ||
1286 | 1191 | 0, sizeof(mvm->ppag_table), | ||
1287 | 1192 | &mvm->ppag_table); | ||
1288 | 1193 | if (ret < 0) | ||
1289 | 1194 | IWL_ERR(mvm, "failed to send PER_PLATFORM_ANT_GAIN_CMD (%d)\n", | ||
1290 | 1195 | ret); | ||
1291 | 1196 | |||
1292 | 1197 | return ret; | ||
1293 | 1198 | } | ||
1294 | 1199 | |||
1295 | 1200 | static int iwl_mvm_ppag_init(struct iwl_mvm *mvm) | ||
1296 | 1201 | { | ||
1297 | 1202 | int ret; | ||
1298 | 1203 | |||
1299 | 1204 | ret = iwl_mvm_get_ppag_table(mvm); | ||
1300 | 1205 | if (ret < 0) { | ||
1301 | 1206 | IWL_DEBUG_RADIO(mvm, | ||
1302 | 1207 | "PPAG BIOS table invalid or unavailable. (%d)\n", | ||
1303 | 1208 | ret); | ||
1304 | 1209 | return 0; | ||
1305 | 1210 | } | ||
1306 | 1211 | return iwl_mvm_ppag_send_cmd(mvm); | ||
1307 | 1212 | } | ||
1308 | 1213 | |||
1309 | 1099 | #else /* CONFIG_ACPI */ | 1214 | #else /* CONFIG_ACPI */ |
1310 | 1100 | static int iwl_mvm_sar_get_wrds_table(struct iwl_mvm *mvm) | 1215 | static int iwl_mvm_sar_get_wrds_table(struct iwl_mvm *mvm) |
1311 | 1101 | { | 1216 | { |
1312 | @@ -1127,6 +1242,21 @@ int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm) | |||
1313 | 1127 | { | 1242 | { |
1314 | 1128 | return -ENOENT; | 1243 | return -ENOENT; |
1315 | 1129 | } | 1244 | } |
1316 | 1245 | |||
1317 | 1246 | static int iwl_mvm_get_ppag_table(struct iwl_mvm *mvm) | ||
1318 | 1247 | { | ||
1319 | 1248 | return -ENOENT; | ||
1320 | 1249 | } | ||
1321 | 1250 | |||
1322 | 1251 | static int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm) | ||
1323 | 1252 | { | ||
1324 | 1253 | return -ENOENT; | ||
1325 | 1254 | } | ||
1326 | 1255 | |||
1327 | 1256 | static int iwl_mvm_ppag_init(struct iwl_mvm *mvm) | ||
1328 | 1257 | { | ||
1329 | 1258 | return -ENOENT; | ||
1330 | 1259 | } | ||
1331 | 1130 | #endif /* CONFIG_ACPI */ | 1260 | #endif /* CONFIG_ACPI */ |
1332 | 1131 | 1261 | ||
1333 | 1132 | void iwl_mvm_send_recovery_cmd(struct iwl_mvm *mvm, u32 flags) | 1262 | void iwl_mvm_send_recovery_cmd(struct iwl_mvm *mvm, u32 flags) |
1334 | @@ -1497,6 +1627,10 @@ int iwl_mvm_up(struct iwl_mvm *mvm) | |||
1335 | 1497 | if (iwl_acpi_get_eckv(mvm->dev, &mvm->ext_clock_valid)) | 1627 | if (iwl_acpi_get_eckv(mvm->dev, &mvm->ext_clock_valid)) |
1336 | 1498 | IWL_DEBUG_INFO(mvm, "ECKV table doesn't exist in BIOS\n"); | 1628 | IWL_DEBUG_INFO(mvm, "ECKV table doesn't exist in BIOS\n"); |
1337 | 1499 | 1629 | ||
1338 | 1630 | ret = iwl_mvm_ppag_init(mvm); | ||
1339 | 1631 | if (ret) | ||
1340 | 1632 | goto error; | ||
1341 | 1633 | |||
1342 | 1500 | ret = iwl_mvm_sar_init(mvm); | 1634 | ret = iwl_mvm_sar_init(mvm); |
1343 | 1501 | if (ret == 0) { | 1635 | if (ret == 0) { |
1344 | 1502 | ret = iwl_mvm_sar_geo_init(mvm); | 1636 | ret = iwl_mvm_sar_geo_init(mvm); |
1345 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c | |||
1346 | index ebcacd1..69dc7d1 100644 | |||
1347 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c | |||
1348 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c | |||
1349 | @@ -1623,7 +1623,9 @@ void iwl_mvm_channel_switch_noa_notif(struct iwl_mvm *mvm, | |||
1350 | 1623 | RCU_INIT_POINTER(mvm->csa_vif, NULL); | 1623 | RCU_INIT_POINTER(mvm->csa_vif, NULL); |
1351 | 1624 | return; | 1624 | return; |
1352 | 1625 | case NL80211_IFTYPE_STATION: | 1625 | case NL80211_IFTYPE_STATION: |
1354 | 1626 | iwl_mvm_csa_client_absent(mvm, vif); | 1626 | if (!fw_has_capa(&mvm->fw->ucode_capa, |
1355 | 1627 | IWL_UCODE_TLV_CAPA_CHANNEL_SWITCH_CMD)) | ||
1356 | 1628 | iwl_mvm_csa_client_absent(mvm, vif); | ||
1357 | 1627 | cancel_delayed_work(&mvmvif->csa_work); | 1629 | cancel_delayed_work(&mvmvif->csa_work); |
1358 | 1628 | ieee80211_chswitch_done(vif, true); | 1630 | ieee80211_chswitch_done(vif, true); |
1359 | 1629 | break; | 1631 | break; |
1360 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | |||
1361 | index c610056..3ab1876 100644 | |||
1362 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | |||
1363 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | |||
1364 | @@ -246,11 +246,11 @@ static const struct cfg80211_pmsr_capabilities iwl_mvm_pmsr_capa = { | |||
1365 | 246 | }, | 246 | }, |
1366 | 247 | }; | 247 | }; |
1367 | 248 | 248 | ||
1373 | 249 | static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, | 249 | static int __iwl_mvm_mac_set_key(struct ieee80211_hw *hw, |
1374 | 250 | enum set_key_cmd cmd, | 250 | enum set_key_cmd cmd, |
1375 | 251 | struct ieee80211_vif *vif, | 251 | struct ieee80211_vif *vif, |
1376 | 252 | struct ieee80211_sta *sta, | 252 | struct ieee80211_sta *sta, |
1377 | 253 | struct ieee80211_key_conf *key); | 253 | struct ieee80211_key_conf *key); |
1378 | 254 | 254 | ||
1379 | 255 | static void iwl_mvm_reset_phy_ctxts(struct iwl_mvm *mvm) | 255 | static void iwl_mvm_reset_phy_ctxts(struct iwl_mvm *mvm) |
1380 | 256 | { | 256 | { |
1381 | @@ -1401,15 +1401,20 @@ static int iwl_mvm_post_channel_switch(struct ieee80211_hw *hw, | |||
1382 | 1401 | goto out_unlock; | 1401 | goto out_unlock; |
1383 | 1402 | } | 1402 | } |
1384 | 1403 | 1403 | ||
1386 | 1404 | iwl_mvm_sta_modify_disable_tx(mvm, mvmsta, false); | 1404 | if (!fw_has_capa(&mvm->fw->ucode_capa, |
1387 | 1405 | IWL_UCODE_TLV_CAPA_CHANNEL_SWITCH_CMD)) | ||
1388 | 1406 | iwl_mvm_sta_modify_disable_tx(mvm, mvmsta, false); | ||
1389 | 1405 | 1407 | ||
1390 | 1406 | iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL); | 1408 | iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL); |
1391 | 1407 | 1409 | ||
1395 | 1408 | ret = iwl_mvm_enable_beacon_filter(mvm, vif, 0); | 1410 | if (!fw_has_capa(&mvm->fw->ucode_capa, |
1396 | 1409 | if (ret) | 1411 | IWL_UCODE_TLV_CAPA_CHANNEL_SWITCH_CMD)) { |
1397 | 1410 | goto out_unlock; | 1412 | ret = iwl_mvm_enable_beacon_filter(mvm, vif, 0); |
1398 | 1413 | if (ret) | ||
1399 | 1414 | goto out_unlock; | ||
1400 | 1411 | 1415 | ||
1402 | 1412 | iwl_mvm_stop_session_protection(mvm, vif); | 1416 | iwl_mvm_stop_session_protection(mvm, vif); |
1403 | 1417 | } | ||
1404 | 1413 | } | 1418 | } |
1405 | 1414 | 1419 | ||
1406 | 1415 | mvmvif->ps_disabled = false; | 1420 | mvmvif->ps_disabled = false; |
1407 | @@ -2640,7 +2645,7 @@ static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw, | |||
1408 | 2640 | 2645 | ||
1409 | 2641 | mvmvif->ap_early_keys[i] = NULL; | 2646 | mvmvif->ap_early_keys[i] = NULL; |
1410 | 2642 | 2647 | ||
1412 | 2643 | ret = iwl_mvm_mac_set_key(hw, SET_KEY, vif, NULL, key); | 2648 | ret = __iwl_mvm_mac_set_key(hw, SET_KEY, vif, NULL, key); |
1413 | 2644 | if (ret) | 2649 | if (ret) |
1414 | 2645 | goto out_quota_failed; | 2650 | goto out_quota_failed; |
1415 | 2646 | } | 2651 | } |
1416 | @@ -3445,11 +3450,11 @@ static int iwl_mvm_mac_sched_scan_stop(struct ieee80211_hw *hw, | |||
1417 | 3445 | return ret; | 3450 | return ret; |
1418 | 3446 | } | 3451 | } |
1419 | 3447 | 3452 | ||
1425 | 3448 | static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, | 3453 | static int __iwl_mvm_mac_set_key(struct ieee80211_hw *hw, |
1426 | 3449 | enum set_key_cmd cmd, | 3454 | enum set_key_cmd cmd, |
1427 | 3450 | struct ieee80211_vif *vif, | 3455 | struct ieee80211_vif *vif, |
1428 | 3451 | struct ieee80211_sta *sta, | 3456 | struct ieee80211_sta *sta, |
1429 | 3452 | struct ieee80211_key_conf *key) | 3457 | struct ieee80211_key_conf *key) |
1430 | 3453 | { | 3458 | { |
1431 | 3454 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); | 3459 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); |
1432 | 3455 | struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); | 3460 | struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); |
1433 | @@ -3504,8 +3509,6 @@ static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, | |||
1434 | 3504 | return -EOPNOTSUPP; | 3509 | return -EOPNOTSUPP; |
1435 | 3505 | } | 3510 | } |
1436 | 3506 | 3511 | ||
1437 | 3507 | mutex_lock(&mvm->mutex); | ||
1438 | 3508 | |||
1439 | 3509 | switch (cmd) { | 3512 | switch (cmd) { |
1440 | 3510 | case SET_KEY: | 3513 | case SET_KEY: |
1441 | 3511 | if ((vif->type == NL80211_IFTYPE_ADHOC || | 3514 | if ((vif->type == NL80211_IFTYPE_ADHOC || |
1442 | @@ -3651,7 +3654,22 @@ static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, | |||
1443 | 3651 | ret = -EINVAL; | 3654 | ret = -EINVAL; |
1444 | 3652 | } | 3655 | } |
1445 | 3653 | 3656 | ||
1446 | 3657 | return ret; | ||
1447 | 3658 | } | ||
1448 | 3659 | |||
1449 | 3660 | static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, | ||
1450 | 3661 | enum set_key_cmd cmd, | ||
1451 | 3662 | struct ieee80211_vif *vif, | ||
1452 | 3663 | struct ieee80211_sta *sta, | ||
1453 | 3664 | struct ieee80211_key_conf *key) | ||
1454 | 3665 | { | ||
1455 | 3666 | struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); | ||
1456 | 3667 | int ret; | ||
1457 | 3668 | |||
1458 | 3669 | mutex_lock(&mvm->mutex); | ||
1459 | 3670 | ret = __iwl_mvm_mac_set_key(hw, cmd, vif, sta, key); | ||
1460 | 3654 | mutex_unlock(&mvm->mutex); | 3671 | mutex_unlock(&mvm->mutex); |
1461 | 3672 | |||
1462 | 3655 | return ret; | 3673 | return ret; |
1463 | 3656 | } | 3674 | } |
1464 | 3657 | 3675 | ||
1465 | @@ -4554,6 +4572,42 @@ static int iwl_mvm_schedule_client_csa(struct iwl_mvm *mvm, | |||
1466 | 4554 | 0, sizeof(cmd), &cmd); | 4572 | 0, sizeof(cmd), &cmd); |
1467 | 4555 | } | 4573 | } |
1468 | 4556 | 4574 | ||
1469 | 4575 | static int iwl_mvm_old_pre_chan_sw_sta(struct iwl_mvm *mvm, | ||
1470 | 4576 | struct ieee80211_vif *vif, | ||
1471 | 4577 | struct ieee80211_channel_switch *chsw) | ||
1472 | 4578 | { | ||
1473 | 4579 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); | ||
1474 | 4580 | u32 apply_time; | ||
1475 | 4581 | |||
1476 | 4582 | /* Schedule the time event to a bit before beacon 1, | ||
1477 | 4583 | * to make sure we're in the new channel when the | ||
1478 | 4584 | * GO/AP arrives. In case count <= 1 immediately schedule the | ||
1479 | 4585 | * TE (this might result with some packet loss or connection | ||
1480 | 4586 | * loss). | ||
1481 | 4587 | */ | ||
1482 | 4588 | if (chsw->count <= 1) | ||
1483 | 4589 | apply_time = 0; | ||
1484 | 4590 | else | ||
1485 | 4591 | apply_time = chsw->device_timestamp + | ||
1486 | 4592 | ((vif->bss_conf.beacon_int * (chsw->count - 1) - | ||
1487 | 4593 | IWL_MVM_CHANNEL_SWITCH_TIME_CLIENT) * 1024); | ||
1488 | 4594 | |||
1489 | 4595 | if (chsw->block_tx) | ||
1490 | 4596 | iwl_mvm_csa_client_absent(mvm, vif); | ||
1491 | 4597 | |||
1492 | 4598 | if (mvmvif->bf_data.bf_enabled) { | ||
1493 | 4599 | int ret = iwl_mvm_disable_beacon_filter(mvm, vif, 0); | ||
1494 | 4600 | |||
1495 | 4601 | if (ret) | ||
1496 | 4602 | return ret; | ||
1497 | 4603 | } | ||
1498 | 4604 | |||
1499 | 4605 | iwl_mvm_schedule_csa_period(mvm, vif, vif->bss_conf.beacon_int, | ||
1500 | 4606 | apply_time); | ||
1501 | 4607 | |||
1502 | 4608 | return 0; | ||
1503 | 4609 | } | ||
1504 | 4610 | |||
1505 | 4557 | #define IWL_MAX_CSA_BLOCK_TX 1500 | 4611 | #define IWL_MAX_CSA_BLOCK_TX 1500 |
1506 | 4558 | static int iwl_mvm_pre_channel_switch(struct ieee80211_hw *hw, | 4612 | static int iwl_mvm_pre_channel_switch(struct ieee80211_hw *hw, |
1507 | 4559 | struct ieee80211_vif *vif, | 4613 | struct ieee80211_vif *vif, |
1508 | @@ -4562,7 +4616,6 @@ static int iwl_mvm_pre_channel_switch(struct ieee80211_hw *hw, | |||
1509 | 4562 | struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); | 4616 | struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); |
1510 | 4563 | struct ieee80211_vif *csa_vif; | 4617 | struct ieee80211_vif *csa_vif; |
1511 | 4564 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); | 4618 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); |
1512 | 4565 | u32 apply_time; | ||
1513 | 4566 | int ret; | 4619 | int ret; |
1514 | 4567 | 4620 | ||
1515 | 4568 | mutex_lock(&mvm->mutex); | 4621 | mutex_lock(&mvm->mutex); |
1516 | @@ -4606,21 +4659,7 @@ static int iwl_mvm_pre_channel_switch(struct ieee80211_hw *hw, | |||
1517 | 4606 | 4659 | ||
1518 | 4607 | break; | 4660 | break; |
1519 | 4608 | case NL80211_IFTYPE_STATION: | 4661 | case NL80211_IFTYPE_STATION: |
1520 | 4609 | /* Schedule the time event to a bit before beacon 1, | ||
1521 | 4610 | * to make sure we're in the new channel when the | ||
1522 | 4611 | * GO/AP arrives. In case count <= 1 immediately schedule the | ||
1523 | 4612 | * TE (this might result with some packet loss or connection | ||
1524 | 4613 | * loss). | ||
1525 | 4614 | */ | ||
1526 | 4615 | if (chsw->count <= 1) | ||
1527 | 4616 | apply_time = 0; | ||
1528 | 4617 | else | ||
1529 | 4618 | apply_time = chsw->device_timestamp + | ||
1530 | 4619 | ((vif->bss_conf.beacon_int * (chsw->count - 1) - | ||
1531 | 4620 | IWL_MVM_CHANNEL_SWITCH_TIME_CLIENT) * 1024); | ||
1532 | 4621 | |||
1533 | 4622 | if (chsw->block_tx) { | 4662 | if (chsw->block_tx) { |
1534 | 4623 | iwl_mvm_csa_client_absent(mvm, vif); | ||
1535 | 4624 | /* | 4663 | /* |
1536 | 4625 | * In case of undetermined / long time with immediate | 4664 | * In case of undetermined / long time with immediate |
1537 | 4626 | * quiet monitor status to gracefully disconnect | 4665 | * quiet monitor status to gracefully disconnect |
1538 | @@ -4632,19 +4671,14 @@ static int iwl_mvm_pre_channel_switch(struct ieee80211_hw *hw, | |||
1539 | 4632 | msecs_to_jiffies(IWL_MAX_CSA_BLOCK_TX)); | 4671 | msecs_to_jiffies(IWL_MAX_CSA_BLOCK_TX)); |
1540 | 4633 | } | 4672 | } |
1541 | 4634 | 4673 | ||
1544 | 4635 | if (mvmvif->bf_data.bf_enabled) { | 4674 | if (!fw_has_capa(&mvm->fw->ucode_capa, |
1545 | 4636 | ret = iwl_mvm_disable_beacon_filter(mvm, vif, 0); | 4675 | IWL_UCODE_TLV_CAPA_CHANNEL_SWITCH_CMD)) { |
1546 | 4676 | ret = iwl_mvm_old_pre_chan_sw_sta(mvm, vif, chsw); | ||
1547 | 4637 | if (ret) | 4677 | if (ret) |
1548 | 4638 | goto out_unlock; | 4678 | goto out_unlock; |
1553 | 4639 | } | 4679 | } else { |
1550 | 4640 | |||
1551 | 4641 | if (fw_has_capa(&mvm->fw->ucode_capa, | ||
1552 | 4642 | IWL_UCODE_TLV_CAPA_CHANNEL_SWITCH_CMD)) | ||
1554 | 4643 | iwl_mvm_schedule_client_csa(mvm, vif, chsw); | 4680 | iwl_mvm_schedule_client_csa(mvm, vif, chsw); |
1559 | 4644 | else | 4681 | } |
1556 | 4645 | iwl_mvm_schedule_csa_period(mvm, vif, | ||
1557 | 4646 | vif->bss_conf.beacon_int, | ||
1558 | 4647 | apply_time); | ||
1560 | 4648 | 4682 | ||
1561 | 4649 | mvmvif->csa_count = chsw->count; | 4683 | mvmvif->csa_count = chsw->count; |
1562 | 4650 | mvmvif->csa_misbehave = false; | 4684 | mvmvif->csa_misbehave = false; |
1563 | @@ -5246,7 +5280,8 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm, | |||
1564 | 5246 | atomic_set(&mvm->queue_sync_counter, | 5280 | atomic_set(&mvm->queue_sync_counter, |
1565 | 5247 | mvm->trans->num_rx_queues); | 5281 | mvm->trans->num_rx_queues); |
1566 | 5248 | 5282 | ||
1568 | 5249 | ret = iwl_mvm_notify_rx_queue(mvm, qmask, (u8 *)notif, size); | 5283 | ret = iwl_mvm_notify_rx_queue(mvm, qmask, (u8 *)notif, |
1569 | 5284 | size, !notif->sync); | ||
1570 | 5250 | if (ret) { | 5285 | if (ret) { |
1571 | 5251 | IWL_ERR(mvm, "Failed to trigger RX queues sync (%d)\n", ret); | 5286 | IWL_ERR(mvm, "Failed to trigger RX queues sync (%d)\n", ret); |
1572 | 5252 | goto out; | 5287 | goto out; |
1573 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | |||
1574 | index e140a1f..c9f8c5d 100644 | |||
1575 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | |||
1576 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | |||
1577 | @@ -1227,6 +1227,8 @@ struct iwl_mvm { | |||
1578 | 1227 | #endif | 1227 | #endif |
1579 | 1228 | struct iwl_mvm_geo_profile geo_profiles[ACPI_NUM_GEO_PROFILES]; | 1228 | struct iwl_mvm_geo_profile geo_profiles[ACPI_NUM_GEO_PROFILES]; |
1580 | 1229 | u32 geo_rev; | 1229 | u32 geo_rev; |
1581 | 1230 | struct iwl_ppag_table_cmd ppag_table; | ||
1582 | 1231 | u32 ppag_rev; | ||
1583 | 1230 | #endif | 1232 | #endif |
1584 | 1231 | 1233 | ||
1585 | 1232 | }; | 1234 | }; |
1586 | @@ -1698,9 +1700,9 @@ void iwl_mvm_rx_monitor_no_data(struct iwl_mvm *mvm, struct napi_struct *napi, | |||
1587 | 1698 | void iwl_mvm_rx_frame_release(struct iwl_mvm *mvm, struct napi_struct *napi, | 1700 | void iwl_mvm_rx_frame_release(struct iwl_mvm *mvm, struct napi_struct *napi, |
1588 | 1699 | struct iwl_rx_cmd_buffer *rxb, int queue); | 1701 | struct iwl_rx_cmd_buffer *rxb, int queue); |
1589 | 1700 | int iwl_mvm_notify_rx_queue(struct iwl_mvm *mvm, u32 rxq_mask, | 1702 | int iwl_mvm_notify_rx_queue(struct iwl_mvm *mvm, u32 rxq_mask, |
1593 | 1701 | const u8 *data, u32 count); | 1703 | const u8 *data, u32 count, bool async); |
1594 | 1702 | void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb, | 1704 | void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct napi_struct *napi, |
1595 | 1703 | int queue); | 1705 | struct iwl_rx_cmd_buffer *rxb, int queue); |
1596 | 1704 | void iwl_mvm_rx_tx_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb); | 1706 | void iwl_mvm_rx_tx_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb); |
1597 | 1705 | void iwl_mvm_mfu_assert_dump_notif(struct iwl_mvm *mvm, | 1707 | void iwl_mvm_mfu_assert_dump_notif(struct iwl_mvm *mvm, |
1598 | 1706 | struct iwl_rx_cmd_buffer *rxb); | 1708 | struct iwl_rx_cmd_buffer *rxb); |
1599 | @@ -1847,7 +1849,7 @@ iwl_mvm_vif_dbgfs_clean(struct iwl_mvm *mvm, struct ieee80211_vif *vif) | |||
1600 | 1847 | #endif /* CPTCFG_IWLWIFI_DEBUGFS */ | 1849 | #endif /* CPTCFG_IWLWIFI_DEBUGFS */ |
1601 | 1848 | 1850 | ||
1602 | 1849 | /* rate scaling */ | 1851 | /* rate scaling */ |
1604 | 1850 | int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq, bool sync); | 1852 | int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq); |
1605 | 1851 | void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg); | 1853 | void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg); |
1606 | 1852 | int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate); | 1854 | int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate); |
1607 | 1853 | void rs_update_last_rssi(struct iwl_mvm *mvm, | 1855 | void rs_update_last_rssi(struct iwl_mvm *mvm, |
1608 | @@ -2199,6 +2201,7 @@ int iwl_mvm_nan_config_nan_faw_cmd(struct iwl_mvm *mvm, | |||
1609 | 2199 | 2201 | ||
1610 | 2200 | int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b); | 2202 | int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b); |
1611 | 2201 | int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm); | 2203 | int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm); |
1612 | 2204 | int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm); | ||
1613 | 2202 | #ifdef CPTCFG_IWLWIFI_DEBUGFS | 2205 | #ifdef CPTCFG_IWLWIFI_DEBUGFS |
1614 | 2203 | void iwl_mvm_sta_add_debugfs(struct ieee80211_hw *hw, | 2206 | void iwl_mvm_sta_add_debugfs(struct ieee80211_hw *hw, |
1615 | 2204 | struct ieee80211_vif *vif, | 2207 | struct ieee80211_vif *vif, |
1616 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | |||
1617 | index 5a81722..cd3b5d6 100644 | |||
1618 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | |||
1619 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | |||
1620 | @@ -620,7 +620,7 @@ void iwl_mvm_rx_chub_update_mcc(struct iwl_mvm *mvm, | |||
1621 | 620 | enum iwl_mcc_source src; | 620 | enum iwl_mcc_source src; |
1622 | 621 | char mcc[3]; | 621 | char mcc[3]; |
1623 | 622 | struct ieee80211_regdomain *regd; | 622 | struct ieee80211_regdomain *regd; |
1625 | 623 | u32 wgds_tbl_idx; | 623 | int wgds_tbl_idx; |
1626 | 624 | 624 | ||
1627 | 625 | lockdep_assert_held(&mvm->mutex); | 625 | lockdep_assert_held(&mvm->mutex); |
1628 | 626 | 626 | ||
1629 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c | |||
1630 | index ca25c5c..7ef326e 100644 | |||
1631 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c | |||
1632 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c | |||
1633 | @@ -1260,7 +1260,7 @@ static void iwl_mvm_rx_mq(struct iwl_op_mode *op_mode, | |||
1634 | 1260 | iwl_mvm_rx_mpdu_mq(mvm, napi, rxb, 0); | 1260 | iwl_mvm_rx_mpdu_mq(mvm, napi, rxb, 0); |
1635 | 1261 | else if (unlikely(cmd == WIDE_ID(DATA_PATH_GROUP, | 1261 | else if (unlikely(cmd == WIDE_ID(DATA_PATH_GROUP, |
1636 | 1262 | RX_QUEUES_NOTIFICATION))) | 1262 | RX_QUEUES_NOTIFICATION))) |
1638 | 1263 | iwl_mvm_rx_queue_notif(mvm, rxb, 0); | 1263 | iwl_mvm_rx_queue_notif(mvm, napi, rxb, 0); |
1639 | 1264 | else if (cmd == WIDE_ID(LEGACY_GROUP, FRAME_RELEASE)) | 1264 | else if (cmd == WIDE_ID(LEGACY_GROUP, FRAME_RELEASE)) |
1640 | 1265 | iwl_mvm_rx_frame_release(mvm, napi, rxb, 0); | 1265 | iwl_mvm_rx_frame_release(mvm, napi, rxb, 0); |
1641 | 1266 | else if (cmd == WIDE_ID(DATA_PATH_GROUP, RX_NO_DATA_NOTIF)) | 1266 | else if (cmd == WIDE_ID(DATA_PATH_GROUP, RX_NO_DATA_NOTIF)) |
1642 | @@ -1489,18 +1489,19 @@ void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error) | |||
1643 | 1489 | IWL_ERR(mvm, "HW restart already requested, but not started\n"); | 1489 | IWL_ERR(mvm, "HW restart already requested, but not started\n"); |
1644 | 1490 | } else if (mvm->fwrt.cur_fw_img == IWL_UCODE_REGULAR && | 1490 | } else if (mvm->fwrt.cur_fw_img == IWL_UCODE_REGULAR && |
1645 | 1491 | mvm->hw_registered && | 1491 | mvm->hw_registered && |
1658 | 1492 | !test_bit(STATUS_TRANS_DEAD, &mvm->trans->status) && | 1492 | !test_bit(STATUS_TRANS_DEAD, &mvm->trans->status)) { |
1659 | 1493 | mvm->fw->ucode_capa.error_log_size) { | 1493 | if (mvm->fw->ucode_capa.error_log_size) { |
1660 | 1494 | u32 src_size = mvm->fw->ucode_capa.error_log_size; | 1494 | u32 src_size = mvm->fw->ucode_capa.error_log_size; |
1661 | 1495 | u32 src_addr = mvm->fw->ucode_capa.error_log_addr; | 1495 | u32 src_addr = mvm->fw->ucode_capa.error_log_addr; |
1662 | 1496 | u8 *recover_buf = kzalloc(src_size, GFP_ATOMIC); | 1496 | u8 *recover_buf = kzalloc(src_size, GFP_ATOMIC); |
1663 | 1497 | 1497 | ||
1664 | 1498 | if (recover_buf) { | 1498 | if (recover_buf) { |
1665 | 1499 | mvm->error_recovery_buf = recover_buf; | 1499 | mvm->error_recovery_buf = recover_buf; |
1666 | 1500 | iwl_trans_read_mem_bytes(mvm->trans, | 1500 | iwl_trans_read_mem_bytes(mvm->trans, |
1667 | 1501 | src_addr, | 1501 | src_addr, |
1668 | 1502 | recover_buf, | 1502 | recover_buf, |
1669 | 1503 | src_size); | 1503 | src_size); |
1670 | 1504 | } | ||
1671 | 1504 | } | 1505 | } |
1672 | 1505 | 1506 | ||
1673 | 1506 | iwl_fw_error_collect(&mvm->fwrt); | 1507 | iwl_fw_error_collect(&mvm->fwrt); |
1674 | @@ -1574,7 +1575,7 @@ static void iwl_mvm_rx_mq_rss(struct iwl_op_mode *op_mode, | |||
1675 | 1574 | iwl_mvm_rx_frame_release(mvm, napi, rxb, queue); | 1575 | iwl_mvm_rx_frame_release(mvm, napi, rxb, queue); |
1676 | 1575 | else if (unlikely(cmd == WIDE_ID(DATA_PATH_GROUP, | 1576 | else if (unlikely(cmd == WIDE_ID(DATA_PATH_GROUP, |
1677 | 1576 | RX_QUEUES_NOTIFICATION))) | 1577 | RX_QUEUES_NOTIFICATION))) |
1679 | 1577 | iwl_mvm_rx_queue_notif(mvm, rxb, queue); | 1578 | iwl_mvm_rx_queue_notif(mvm, napi, rxb, queue); |
1680 | 1578 | else if (likely(cmd == WIDE_ID(LEGACY_GROUP, REPLY_RX_MPDU_CMD))) | 1579 | else if (likely(cmd == WIDE_ID(LEGACY_GROUP, REPLY_RX_MPDU_CMD))) |
1681 | 1579 | iwl_mvm_rx_mpdu_mq(mvm, napi, rxb, queue); | 1580 | iwl_mvm_rx_mpdu_mq(mvm, napi, rxb, queue); |
1682 | 1580 | } | 1581 | } |
1683 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c | |||
1684 | index 190c514..8cb07f4 100644 | |||
1685 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c | |||
1686 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c | |||
1687 | @@ -1208,240 +1208,6 @@ static u8 rs_get_tid(struct ieee80211_hdr *hdr) | |||
1688 | 1208 | return tid; | 1208 | return tid; |
1689 | 1209 | } | 1209 | } |
1690 | 1210 | 1210 | ||
1691 | 1211 | void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | ||
1692 | 1212 | int tid, struct ieee80211_tx_info *info, bool ndp) | ||
1693 | 1213 | { | ||
1694 | 1214 | int legacy_success; | ||
1695 | 1215 | int retries; | ||
1696 | 1216 | int i; | ||
1697 | 1217 | struct iwl_lq_cmd *table; | ||
1698 | 1218 | u32 lq_hwrate; | ||
1699 | 1219 | struct rs_rate lq_rate, tx_resp_rate; | ||
1700 | 1220 | struct iwl_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl; | ||
1701 | 1221 | u32 tlc_info = (uintptr_t)info->status.status_driver_data[0]; | ||
1702 | 1222 | u8 reduced_txp = tlc_info & RS_DRV_DATA_TXP_MSK; | ||
1703 | 1223 | u8 lq_color = RS_DRV_DATA_LQ_COLOR_GET(tlc_info); | ||
1704 | 1224 | u32 tx_resp_hwrate = (uintptr_t)info->status.status_driver_data[1]; | ||
1705 | 1225 | struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); | ||
1706 | 1226 | struct iwl_lq_sta *lq_sta = &mvmsta->lq_sta.rs_drv; | ||
1707 | 1227 | |||
1708 | 1228 | /* Treat uninitialized rate scaling data same as non-existing. */ | ||
1709 | 1229 | if (!lq_sta) { | ||
1710 | 1230 | IWL_DEBUG_RATE(mvm, "Station rate scaling not created yet.\n"); | ||
1711 | 1231 | return; | ||
1712 | 1232 | } else if (!lq_sta->pers.drv) { | ||
1713 | 1233 | IWL_DEBUG_RATE(mvm, "Rate scaling not initialized yet.\n"); | ||
1714 | 1234 | return; | ||
1715 | 1235 | } | ||
1716 | 1236 | |||
1717 | 1237 | /* This packet was aggregated but doesn't carry status info */ | ||
1718 | 1238 | if ((info->flags & IEEE80211_TX_CTL_AMPDU) && | ||
1719 | 1239 | !(info->flags & IEEE80211_TX_STAT_AMPDU)) | ||
1720 | 1240 | return; | ||
1721 | 1241 | |||
1722 | 1242 | if (rs_rate_from_ucode_rate(tx_resp_hwrate, info->band, | ||
1723 | 1243 | &tx_resp_rate)) { | ||
1724 | 1244 | WARN_ON_ONCE(1); | ||
1725 | 1245 | return; | ||
1726 | 1246 | } | ||
1727 | 1247 | |||
1728 | 1248 | #ifdef CPTCFG_MAC80211_DEBUGFS | ||
1729 | 1249 | /* Disable last tx check if we are debugging with fixed rate but | ||
1730 | 1250 | * update tx stats */ | ||
1731 | 1251 | if (lq_sta->pers.dbg_fixed_rate) { | ||
1732 | 1252 | int index = tx_resp_rate.index; | ||
1733 | 1253 | enum rs_column column; | ||
1734 | 1254 | int attempts, success; | ||
1735 | 1255 | |||
1736 | 1256 | column = rs_get_column_from_rate(&tx_resp_rate); | ||
1737 | 1257 | if (WARN_ONCE(column == RS_COLUMN_INVALID, | ||
1738 | 1258 | "Can't map rate 0x%x to column", | ||
1739 | 1259 | tx_resp_hwrate)) | ||
1740 | 1260 | return; | ||
1741 | 1261 | |||
1742 | 1262 | if (info->flags & IEEE80211_TX_STAT_AMPDU) { | ||
1743 | 1263 | attempts = info->status.ampdu_len; | ||
1744 | 1264 | success = info->status.ampdu_ack_len; | ||
1745 | 1265 | } else { | ||
1746 | 1266 | attempts = info->status.rates[0].count; | ||
1747 | 1267 | success = !!(info->flags & IEEE80211_TX_STAT_ACK); | ||
1748 | 1268 | } | ||
1749 | 1269 | |||
1750 | 1270 | lq_sta->pers.tx_stats[column][index].total += attempts; | ||
1751 | 1271 | lq_sta->pers.tx_stats[column][index].success += success; | ||
1752 | 1272 | |||
1753 | 1273 | IWL_DEBUG_RATE(mvm, "Fixed rate 0x%x success %d attempts %d\n", | ||
1754 | 1274 | tx_resp_hwrate, success, attempts); | ||
1755 | 1275 | return; | ||
1756 | 1276 | } | ||
1757 | 1277 | #endif | ||
1758 | 1278 | |||
1759 | 1279 | if (time_after(jiffies, | ||
1760 | 1280 | (unsigned long)(lq_sta->last_tx + | ||
1761 | 1281 | (IWL_MVM_RS_IDLE_TIMEOUT * HZ)))) { | ||
1762 | 1282 | IWL_DEBUG_RATE(mvm, "Tx idle for too long. reinit rs\n"); | ||
1763 | 1283 | iwl_mvm_rs_rate_init(mvm, sta, info->band, true); | ||
1764 | 1284 | return; | ||
1765 | 1285 | } | ||
1766 | 1286 | lq_sta->last_tx = jiffies; | ||
1767 | 1287 | |||
1768 | 1288 | /* Ignore this Tx frame response if its initial rate doesn't match | ||
1769 | 1289 | * that of latest Link Quality command. There may be stragglers | ||
1770 | 1290 | * from a previous Link Quality command, but we're no longer interested | ||
1771 | 1291 | * in those; they're either from the "active" mode while we're trying | ||
1772 | 1292 | * to check "search" mode, or a prior "search" mode after we've moved | ||
1773 | 1293 | * to a new "search" mode (which might become the new "active" mode). | ||
1774 | 1294 | */ | ||
1775 | 1295 | table = &lq_sta->lq; | ||
1776 | 1296 | lq_hwrate = le32_to_cpu(table->rs_table[0]); | ||
1777 | 1297 | if (rs_rate_from_ucode_rate(lq_hwrate, info->band, &lq_rate)) { | ||
1778 | 1298 | WARN_ON_ONCE(1); | ||
1779 | 1299 | return; | ||
1780 | 1300 | } | ||
1781 | 1301 | |||
1782 | 1302 | /* Here we actually compare this rate to the latest LQ command */ | ||
1783 | 1303 | if (lq_color != LQ_FLAG_COLOR_GET(table->flags)) { | ||
1784 | 1304 | IWL_DEBUG_RATE(mvm, | ||
1785 | 1305 | "tx resp color 0x%x does not match 0x%x\n", | ||
1786 | 1306 | lq_color, LQ_FLAG_COLOR_GET(table->flags)); | ||
1787 | 1307 | |||
1788 | 1308 | /* | ||
1789 | 1309 | * Since rates mis-match, the last LQ command may have failed. | ||
1790 | 1310 | * After IWL_MISSED_RATE_MAX mis-matches, resync the uCode with | ||
1791 | 1311 | * ... driver. | ||
1792 | 1312 | */ | ||
1793 | 1313 | lq_sta->missed_rate_counter++; | ||
1794 | 1314 | if (lq_sta->missed_rate_counter > IWL_MVM_RS_MISSED_RATE_MAX) { | ||
1795 | 1315 | lq_sta->missed_rate_counter = 0; | ||
1796 | 1316 | IWL_DEBUG_RATE(mvm, | ||
1797 | 1317 | "Too many rates mismatch. Send sync LQ. rs_state %d\n", | ||
1798 | 1318 | lq_sta->rs_state); | ||
1799 | 1319 | iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, false); | ||
1800 | 1320 | } | ||
1801 | 1321 | /* Regardless, ignore this status info for outdated rate */ | ||
1802 | 1322 | return; | ||
1803 | 1323 | } else | ||
1804 | 1324 | /* Rate did match, so reset the missed_rate_counter */ | ||
1805 | 1325 | lq_sta->missed_rate_counter = 0; | ||
1806 | 1326 | |||
1807 | 1327 | if (!lq_sta->search_better_tbl) { | ||
1808 | 1328 | curr_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); | ||
1809 | 1329 | other_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); | ||
1810 | 1330 | } else { | ||
1811 | 1331 | curr_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); | ||
1812 | 1332 | other_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); | ||
1813 | 1333 | } | ||
1814 | 1334 | |||
1815 | 1335 | if (WARN_ON_ONCE(!rs_rate_column_match(&lq_rate, &curr_tbl->rate))) { | ||
1816 | 1336 | IWL_DEBUG_RATE(mvm, | ||
1817 | 1337 | "Neither active nor search matches tx rate\n"); | ||
1818 | 1338 | tmp_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); | ||
1819 | 1339 | rs_dump_rate(mvm, &tmp_tbl->rate, "ACTIVE"); | ||
1820 | 1340 | tmp_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); | ||
1821 | 1341 | rs_dump_rate(mvm, &tmp_tbl->rate, "SEARCH"); | ||
1822 | 1342 | rs_dump_rate(mvm, &lq_rate, "ACTUAL"); | ||
1823 | 1343 | |||
1824 | 1344 | /* | ||
1825 | 1345 | * no matching table found, let's by-pass the data collection | ||
1826 | 1346 | * and continue to perform rate scale to find the rate table | ||
1827 | 1347 | */ | ||
1828 | 1348 | rs_stay_in_table(lq_sta, true); | ||
1829 | 1349 | goto done; | ||
1830 | 1350 | } | ||
1831 | 1351 | |||
1832 | 1352 | /* | ||
1833 | 1353 | * Updating the frame history depends on whether packets were | ||
1834 | 1354 | * aggregated. | ||
1835 | 1355 | * | ||
1836 | 1356 | * For aggregation, all packets were transmitted at the same rate, the | ||
1837 | 1357 | * first index into rate scale table. | ||
1838 | 1358 | */ | ||
1839 | 1359 | if (info->flags & IEEE80211_TX_STAT_AMPDU) { | ||
1840 | 1360 | rs_collect_tpc_data(mvm, lq_sta, curr_tbl, tx_resp_rate.index, | ||
1841 | 1361 | info->status.ampdu_len, | ||
1842 | 1362 | info->status.ampdu_ack_len, | ||
1843 | 1363 | reduced_txp); | ||
1844 | 1364 | |||
1845 | 1365 | /* ampdu_ack_len = 0 marks no BA was received. For TLC, treat | ||
1846 | 1366 | * it as a single frame loss as we don't want the success ratio | ||
1847 | 1367 | * to dip too quickly because a BA wasn't received. | ||
1848 | 1368 | * For TPC, there's no need for this optimisation since we want | ||
1849 | 1369 | * to recover very quickly from a bad power reduction and, | ||
1850 | 1370 | * therefore we'd like the success ratio to get an immediate hit | ||
1851 | 1371 | * when failing to get a BA, so we'd switch back to a lower or | ||
1852 | 1372 | * zero power reduction. When FW transmits agg with a rate | ||
1853 | 1373 | * different from the initial rate, it will not use reduced txp | ||
1854 | 1374 | * and will send BA notification twice (one empty with reduced | ||
1855 | 1375 | * txp equal to the value from LQ and one with reduced txp 0). | ||
1856 | 1376 | * We need to update counters for each txp level accordingly. | ||
1857 | 1377 | */ | ||
1858 | 1378 | if (info->status.ampdu_ack_len == 0) | ||
1859 | 1379 | info->status.ampdu_len = 1; | ||
1860 | 1380 | |||
1861 | 1381 | rs_collect_tlc_data(mvm, mvmsta, tid, curr_tbl, | ||
1862 | 1382 | tx_resp_rate.index, | ||
1863 | 1383 | info->status.ampdu_len, | ||
1864 | 1384 | info->status.ampdu_ack_len); | ||
1865 | 1385 | |||
1866 | 1386 | /* Update success/fail counts if not searching for new mode */ | ||
1867 | 1387 | if (lq_sta->rs_state == RS_STATE_STAY_IN_COLUMN) { | ||
1868 | 1388 | lq_sta->total_success += info->status.ampdu_ack_len; | ||
1869 | 1389 | lq_sta->total_failed += (info->status.ampdu_len - | ||
1870 | 1390 | info->status.ampdu_ack_len); | ||
1871 | 1391 | } | ||
1872 | 1392 | } else { | ||
1873 | 1393 | /* For legacy, update frame history with for each Tx retry. */ | ||
1874 | 1394 | retries = info->status.rates[0].count - 1; | ||
1875 | 1395 | /* HW doesn't send more than 15 retries */ | ||
1876 | 1396 | retries = min(retries, 15); | ||
1877 | 1397 | |||
1878 | 1398 | /* The last transmission may have been successful */ | ||
1879 | 1399 | legacy_success = !!(info->flags & IEEE80211_TX_STAT_ACK); | ||
1880 | 1400 | /* Collect data for each rate used during failed TX attempts */ | ||
1881 | 1401 | for (i = 0; i <= retries; ++i) { | ||
1882 | 1402 | lq_hwrate = le32_to_cpu(table->rs_table[i]); | ||
1883 | 1403 | if (rs_rate_from_ucode_rate(lq_hwrate, info->band, | ||
1884 | 1404 | &lq_rate)) { | ||
1885 | 1405 | WARN_ON_ONCE(1); | ||
1886 | 1406 | return; | ||
1887 | 1407 | } | ||
1888 | 1408 | |||
1889 | 1409 | /* | ||
1890 | 1410 | * Only collect stats if retried rate is in the same RS | ||
1891 | 1411 | * table as active/search. | ||
1892 | 1412 | */ | ||
1893 | 1413 | if (rs_rate_column_match(&lq_rate, &curr_tbl->rate)) | ||
1894 | 1414 | tmp_tbl = curr_tbl; | ||
1895 | 1415 | else if (rs_rate_column_match(&lq_rate, | ||
1896 | 1416 | &other_tbl->rate)) | ||
1897 | 1417 | tmp_tbl = other_tbl; | ||
1898 | 1418 | else | ||
1899 | 1419 | continue; | ||
1900 | 1420 | |||
1901 | 1421 | rs_collect_tpc_data(mvm, lq_sta, tmp_tbl, | ||
1902 | 1422 | tx_resp_rate.index, 1, | ||
1903 | 1423 | i < retries ? 0 : legacy_success, | ||
1904 | 1424 | reduced_txp); | ||
1905 | 1425 | rs_collect_tlc_data(mvm, mvmsta, tid, tmp_tbl, | ||
1906 | 1426 | tx_resp_rate.index, 1, | ||
1907 | 1427 | i < retries ? 0 : legacy_success); | ||
1908 | 1428 | } | ||
1909 | 1429 | |||
1910 | 1430 | /* Update success/fail counts if not searching for new mode */ | ||
1911 | 1431 | if (lq_sta->rs_state == RS_STATE_STAY_IN_COLUMN) { | ||
1912 | 1432 | lq_sta->total_success += legacy_success; | ||
1913 | 1433 | lq_sta->total_failed += retries + (1 - legacy_success); | ||
1914 | 1434 | } | ||
1915 | 1435 | } | ||
1916 | 1436 | /* The last TX rate is cached in lq_sta; it's set in if/else above */ | ||
1917 | 1437 | lq_sta->last_rate_n_flags = lq_hwrate; | ||
1918 | 1438 | IWL_DEBUG_RATE(mvm, "reduced txpower: %d\n", reduced_txp); | ||
1919 | 1439 | done: | ||
1920 | 1440 | /* See if there's a better rate or modulation mode to try. */ | ||
1921 | 1441 | if (sta->supp_rates[info->band]) | ||
1922 | 1442 | rs_rate_scale_perform(mvm, sta, lq_sta, tid, ndp); | ||
1923 | 1443 | } | ||
1924 | 1444 | |||
1925 | 1445 | /* | 1211 | /* |
1926 | 1446 | * mac80211 sends us Tx status | 1212 | * mac80211 sends us Tx status |
1927 | 1447 | */ | 1213 | */ |
1928 | @@ -1454,8 +1220,9 @@ static void rs_drv_mac80211_tx_status(void *mvm_r, | |||
1929 | 1454 | struct iwl_op_mode *op_mode = mvm_r; | 1220 | struct iwl_op_mode *op_mode = mvm_r; |
1930 | 1455 | struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode); | 1221 | struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode); |
1931 | 1456 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 1222 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1932 | 1223 | struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); | ||
1933 | 1457 | 1224 | ||
1935 | 1458 | if (!iwl_mvm_sta_from_mac80211(sta)->vif) | 1225 | if (!mvmsta->vif) |
1936 | 1459 | return; | 1226 | return; |
1937 | 1460 | 1227 | ||
1938 | 1461 | if (!ieee80211_is_data(hdr->frame_control) || | 1228 | if (!ieee80211_is_data(hdr->frame_control) || |
1939 | @@ -1806,7 +1573,7 @@ static void rs_update_rate_tbl(struct iwl_mvm *mvm, | |||
1940 | 1806 | struct iwl_scale_tbl_info *tbl) | 1573 | struct iwl_scale_tbl_info *tbl) |
1941 | 1807 | { | 1574 | { |
1942 | 1808 | rs_fill_lq_cmd(mvm, sta, lq_sta, &tbl->rate); | 1575 | rs_fill_lq_cmd(mvm, sta, lq_sta, &tbl->rate); |
1944 | 1809 | iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, false); | 1576 | iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq); |
1945 | 1810 | } | 1577 | } |
1946 | 1811 | 1578 | ||
1947 | 1812 | static bool rs_tweak_rate_tbl(struct iwl_mvm *mvm, | 1579 | static bool rs_tweak_rate_tbl(struct iwl_mvm *mvm, |
1948 | @@ -2908,7 +2675,7 @@ void rs_update_last_rssi(struct iwl_mvm *mvm, | |||
1949 | 2908 | static void rs_initialize_lq(struct iwl_mvm *mvm, | 2675 | static void rs_initialize_lq(struct iwl_mvm *mvm, |
1950 | 2909 | struct ieee80211_sta *sta, | 2676 | struct ieee80211_sta *sta, |
1951 | 2910 | struct iwl_lq_sta *lq_sta, | 2677 | struct iwl_lq_sta *lq_sta, |
1953 | 2911 | enum nl80211_band band, bool update) | 2678 | enum nl80211_band band) |
1954 | 2912 | { | 2679 | { |
1955 | 2913 | struct iwl_scale_tbl_info *tbl; | 2680 | struct iwl_scale_tbl_info *tbl; |
1956 | 2914 | struct rs_rate *rate; | 2681 | struct rs_rate *rate; |
1957 | @@ -2938,7 +2705,7 @@ static void rs_initialize_lq(struct iwl_mvm *mvm, | |||
1958 | 2938 | rs_set_expected_tpt_table(lq_sta, tbl); | 2705 | rs_set_expected_tpt_table(lq_sta, tbl); |
1959 | 2939 | rs_fill_lq_cmd(mvm, sta, lq_sta, rate); | 2706 | rs_fill_lq_cmd(mvm, sta, lq_sta, rate); |
1960 | 2940 | /* TODO restore station should remember the lq cmd */ | 2707 | /* TODO restore station should remember the lq cmd */ |
1962 | 2941 | iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, !update); | 2708 | iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq); |
1963 | 2942 | } | 2709 | } |
1964 | 2943 | 2710 | ||
1965 | 2944 | static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta, | 2711 | static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta, |
1966 | @@ -3187,7 +2954,7 @@ void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg) | |||
1967 | 3187 | * Called after adding a new station to initialize rate scaling | 2954 | * Called after adding a new station to initialize rate scaling |
1968 | 3188 | */ | 2955 | */ |
1969 | 3189 | static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | 2956 | static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, |
1971 | 3190 | enum nl80211_band band, bool update) | 2957 | enum nl80211_band band) |
1972 | 3191 | { | 2958 | { |
1973 | 3192 | int i, j; | 2959 | int i, j; |
1974 | 3193 | struct ieee80211_hw *hw = mvm->hw; | 2960 | struct ieee80211_hw *hw = mvm->hw; |
1975 | @@ -3198,6 +2965,8 @@ static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | |||
1976 | 3198 | struct ieee80211_supported_band *sband; | 2965 | struct ieee80211_supported_band *sband; |
1977 | 3199 | unsigned long supp; /* must be unsigned long for for_each_set_bit */ | 2966 | unsigned long supp; /* must be unsigned long for for_each_set_bit */ |
1978 | 3200 | 2967 | ||
1979 | 2968 | lockdep_assert_held(&mvmsta->lq_sta.rs_drv.pers.lock); | ||
1980 | 2969 | |||
1981 | 3201 | /* clear all non-persistent lq data */ | 2970 | /* clear all non-persistent lq data */ |
1982 | 3202 | memset(lq_sta, 0, offsetof(typeof(*lq_sta), pers)); | 2971 | memset(lq_sta, 0, offsetof(typeof(*lq_sta), pers)); |
1983 | 3203 | 2972 | ||
1984 | @@ -3267,7 +3036,7 @@ static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | |||
1985 | 3267 | #ifdef CPTCFG_IWLWIFI_DEBUGFS | 3036 | #ifdef CPTCFG_IWLWIFI_DEBUGFS |
1986 | 3268 | iwl_mvm_reset_frame_stats(mvm); | 3037 | iwl_mvm_reset_frame_stats(mvm); |
1987 | 3269 | #endif | 3038 | #endif |
1989 | 3270 | rs_initialize_lq(mvm, sta, lq_sta, band, update); | 3039 | rs_initialize_lq(mvm, sta, lq_sta, band); |
1990 | 3271 | } | 3040 | } |
1991 | 3272 | 3041 | ||
1992 | 3273 | static void rs_drv_rate_update(void *mvm_r, | 3042 | static void rs_drv_rate_update(void *mvm_r, |
1993 | @@ -3290,6 +3059,254 @@ static void rs_drv_rate_update(void *mvm_r, | |||
1994 | 3290 | iwl_mvm_rs_rate_init(mvm, sta, sband->band, true); | 3059 | iwl_mvm_rs_rate_init(mvm, sta, sband->band, true); |
1995 | 3291 | } | 3060 | } |
1996 | 3292 | 3061 | ||
1997 | 3062 | static void __iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, | ||
1998 | 3063 | struct ieee80211_sta *sta, | ||
1999 | 3064 | int tid, struct ieee80211_tx_info *info, | ||
2000 | 3065 | bool ndp) | ||
2001 | 3066 | { | ||
2002 | 3067 | int legacy_success; | ||
2003 | 3068 | int retries; | ||
2004 | 3069 | int i; | ||
2005 | 3070 | struct iwl_lq_cmd *table; | ||
2006 | 3071 | u32 lq_hwrate; | ||
2007 | 3072 | struct rs_rate lq_rate, tx_resp_rate; | ||
2008 | 3073 | struct iwl_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl; | ||
2009 | 3074 | u32 tlc_info = (uintptr_t)info->status.status_driver_data[0]; | ||
2010 | 3075 | u8 reduced_txp = tlc_info & RS_DRV_DATA_TXP_MSK; | ||
2011 | 3076 | u8 lq_color = RS_DRV_DATA_LQ_COLOR_GET(tlc_info); | ||
2012 | 3077 | u32 tx_resp_hwrate = (uintptr_t)info->status.status_driver_data[1]; | ||
2013 | 3078 | struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); | ||
2014 | 3079 | struct iwl_lq_sta *lq_sta = &mvmsta->lq_sta.rs_drv; | ||
2015 | 3080 | |||
2016 | 3081 | if (!lq_sta->pers.drv) { | ||
2017 | 3082 | IWL_DEBUG_RATE(mvm, "Rate scaling not initialized yet.\n"); | ||
2018 | 3083 | return; | ||
2019 | 3084 | } | ||
2020 | 3085 | |||
2021 | 3086 | /* This packet was aggregated but doesn't carry status info */ | ||
2022 | 3087 | if ((info->flags & IEEE80211_TX_CTL_AMPDU) && | ||
2023 | 3088 | !(info->flags & IEEE80211_TX_STAT_AMPDU)) | ||
2024 | 3089 | return; | ||
2025 | 3090 | |||
2026 | 3091 | if (rs_rate_from_ucode_rate(tx_resp_hwrate, info->band, | ||
2027 | 3092 | &tx_resp_rate)) { | ||
2028 | 3093 | WARN_ON_ONCE(1); | ||
2029 | 3094 | return; | ||
2030 | 3095 | } | ||
2031 | 3096 | |||
2032 | 3097 | #ifdef CPTCFG_MAC80211_DEBUGFS | ||
2033 | 3098 | /* Disable last tx check if we are debugging with fixed rate but | ||
2034 | 3099 | * update tx stats | ||
2035 | 3100 | */ | ||
2036 | 3101 | if (lq_sta->pers.dbg_fixed_rate) { | ||
2037 | 3102 | int index = tx_resp_rate.index; | ||
2038 | 3103 | enum rs_column column; | ||
2039 | 3104 | int attempts, success; | ||
2040 | 3105 | |||
2041 | 3106 | column = rs_get_column_from_rate(&tx_resp_rate); | ||
2042 | 3107 | if (WARN_ONCE(column == RS_COLUMN_INVALID, | ||
2043 | 3108 | "Can't map rate 0x%x to column", | ||
2044 | 3109 | tx_resp_hwrate)) | ||
2045 | 3110 | return; | ||
2046 | 3111 | |||
2047 | 3112 | if (info->flags & IEEE80211_TX_STAT_AMPDU) { | ||
2048 | 3113 | attempts = info->status.ampdu_len; | ||
2049 | 3114 | success = info->status.ampdu_ack_len; | ||
2050 | 3115 | } else { | ||
2051 | 3116 | attempts = info->status.rates[0].count; | ||
2052 | 3117 | success = !!(info->flags & IEEE80211_TX_STAT_ACK); | ||
2053 | 3118 | } | ||
2054 | 3119 | |||
2055 | 3120 | lq_sta->pers.tx_stats[column][index].total += attempts; | ||
2056 | 3121 | lq_sta->pers.tx_stats[column][index].success += success; | ||
2057 | 3122 | |||
2058 | 3123 | IWL_DEBUG_RATE(mvm, "Fixed rate 0x%x success %d attempts %d\n", | ||
2059 | 3124 | tx_resp_hwrate, success, attempts); | ||
2060 | 3125 | return; | ||
2061 | 3126 | } | ||
2062 | 3127 | #endif | ||
2063 | 3128 | |||
2064 | 3129 | if (time_after(jiffies, | ||
2065 | 3130 | (unsigned long)(lq_sta->last_tx + | ||
2066 | 3131 | (IWL_MVM_RS_IDLE_TIMEOUT * HZ)))) { | ||
2067 | 3132 | IWL_DEBUG_RATE(mvm, "Tx idle for too long. reinit rs\n"); | ||
2068 | 3133 | /* reach here only in case of driver RS, call directly | ||
2069 | 3134 | * the unlocked version | ||
2070 | 3135 | */ | ||
2071 | 3136 | rs_drv_rate_init(mvm, sta, info->band); | ||
2072 | 3137 | return; | ||
2073 | 3138 | } | ||
2074 | 3139 | lq_sta->last_tx = jiffies; | ||
2075 | 3140 | |||
2076 | 3141 | /* Ignore this Tx frame response if its initial rate doesn't match | ||
2077 | 3142 | * that of latest Link Quality command. There may be stragglers | ||
2078 | 3143 | * from a previous Link Quality command, but we're no longer interested | ||
2079 | 3144 | * in those; they're either from the "active" mode while we're trying | ||
2080 | 3145 | * to check "search" mode, or a prior "search" mode after we've moved | ||
2081 | 3146 | * to a new "search" mode (which might become the new "active" mode). | ||
2082 | 3147 | */ | ||
2083 | 3148 | table = &lq_sta->lq; | ||
2084 | 3149 | lq_hwrate = le32_to_cpu(table->rs_table[0]); | ||
2085 | 3150 | if (rs_rate_from_ucode_rate(lq_hwrate, info->band, &lq_rate)) { | ||
2086 | 3151 | WARN_ON_ONCE(1); | ||
2087 | 3152 | return; | ||
2088 | 3153 | } | ||
2089 | 3154 | |||
2090 | 3155 | /* Here we actually compare this rate to the latest LQ command */ | ||
2091 | 3156 | if (lq_color != LQ_FLAG_COLOR_GET(table->flags)) { | ||
2092 | 3157 | IWL_DEBUG_RATE(mvm, | ||
2093 | 3158 | "tx resp color 0x%x does not match 0x%x\n", | ||
2094 | 3159 | lq_color, LQ_FLAG_COLOR_GET(table->flags)); | ||
2095 | 3160 | |||
2096 | 3161 | /* Since rates mis-match, the last LQ command may have failed. | ||
2097 | 3162 | * After IWL_MISSED_RATE_MAX mis-matches, resync the uCode with | ||
2098 | 3163 | * ... driver. | ||
2099 | 3164 | */ | ||
2100 | 3165 | lq_sta->missed_rate_counter++; | ||
2101 | 3166 | if (lq_sta->missed_rate_counter > IWL_MVM_RS_MISSED_RATE_MAX) { | ||
2102 | 3167 | lq_sta->missed_rate_counter = 0; | ||
2103 | 3168 | IWL_DEBUG_RATE(mvm, | ||
2104 | 3169 | "Too many rates mismatch. Send sync LQ. rs_state %d\n", | ||
2105 | 3170 | lq_sta->rs_state); | ||
2106 | 3171 | iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq); | ||
2107 | 3172 | } | ||
2108 | 3173 | /* Regardless, ignore this status info for outdated rate */ | ||
2109 | 3174 | return; | ||
2110 | 3175 | } | ||
2111 | 3176 | |||
2112 | 3177 | /* Rate did match, so reset the missed_rate_counter */ | ||
2113 | 3178 | lq_sta->missed_rate_counter = 0; | ||
2114 | 3179 | |||
2115 | 3180 | if (!lq_sta->search_better_tbl) { | ||
2116 | 3181 | curr_tbl = &lq_sta->lq_info[lq_sta->active_tbl]; | ||
2117 | 3182 | other_tbl = &lq_sta->lq_info[1 - lq_sta->active_tbl]; | ||
2118 | 3183 | } else { | ||
2119 | 3184 | curr_tbl = &lq_sta->lq_info[1 - lq_sta->active_tbl]; | ||
2120 | 3185 | other_tbl = &lq_sta->lq_info[lq_sta->active_tbl]; | ||
2121 | 3186 | } | ||
2122 | 3187 | |||
2123 | 3188 | if (WARN_ON_ONCE(!rs_rate_column_match(&lq_rate, &curr_tbl->rate))) { | ||
2124 | 3189 | IWL_DEBUG_RATE(mvm, | ||
2125 | 3190 | "Neither active nor search matches tx rate\n"); | ||
2126 | 3191 | tmp_tbl = &lq_sta->lq_info[lq_sta->active_tbl]; | ||
2127 | 3192 | rs_dump_rate(mvm, &tmp_tbl->rate, "ACTIVE"); | ||
2128 | 3193 | tmp_tbl = &lq_sta->lq_info[1 - lq_sta->active_tbl]; | ||
2129 | 3194 | rs_dump_rate(mvm, &tmp_tbl->rate, "SEARCH"); | ||
2130 | 3195 | rs_dump_rate(mvm, &lq_rate, "ACTUAL"); | ||
2131 | 3196 | |||
2132 | 3197 | /* no matching table found, let's by-pass the data collection | ||
2133 | 3198 | * and continue to perform rate scale to find the rate table | ||
2134 | 3199 | */ | ||
2135 | 3200 | rs_stay_in_table(lq_sta, true); | ||
2136 | 3201 | goto done; | ||
2137 | 3202 | } | ||
2138 | 3203 | |||
2139 | 3204 | /* Updating the frame history depends on whether packets were | ||
2140 | 3205 | * aggregated. | ||
2141 | 3206 | * | ||
2142 | 3207 | * For aggregation, all packets were transmitted at the same rate, the | ||
2143 | 3208 | * first index into rate scale table. | ||
2144 | 3209 | */ | ||
2145 | 3210 | if (info->flags & IEEE80211_TX_STAT_AMPDU) { | ||
2146 | 3211 | rs_collect_tpc_data(mvm, lq_sta, curr_tbl, tx_resp_rate.index, | ||
2147 | 3212 | info->status.ampdu_len, | ||
2148 | 3213 | info->status.ampdu_ack_len, | ||
2149 | 3214 | reduced_txp); | ||
2150 | 3215 | |||
2151 | 3216 | /* ampdu_ack_len = 0 marks no BA was received. For TLC, treat | ||
2152 | 3217 | * it as a single frame loss as we don't want the success ratio | ||
2153 | 3218 | * to dip too quickly because a BA wasn't received. | ||
2154 | 3219 | * For TPC, there's no need for this optimisation since we want | ||
2155 | 3220 | * to recover very quickly from a bad power reduction and, | ||
2156 | 3221 | * therefore we'd like the success ratio to get an immediate hit | ||
2157 | 3222 | * when failing to get a BA, so we'd switch back to a lower or | ||
2158 | 3223 | * zero power reduction. When FW transmits agg with a rate | ||
2159 | 3224 | * different from the initial rate, it will not use reduced txp | ||
2160 | 3225 | * and will send BA notification twice (one empty with reduced | ||
2161 | 3226 | * txp equal to the value from LQ and one with reduced txp 0). | ||
2162 | 3227 | * We need to update counters for each txp level accordingly. | ||
2163 | 3228 | */ | ||
2164 | 3229 | if (info->status.ampdu_ack_len == 0) | ||
2165 | 3230 | info->status.ampdu_len = 1; | ||
2166 | 3231 | |||
2167 | 3232 | rs_collect_tlc_data(mvm, mvmsta, tid, curr_tbl, | ||
2168 | 3233 | tx_resp_rate.index, | ||
2169 | 3234 | info->status.ampdu_len, | ||
2170 | 3235 | info->status.ampdu_ack_len); | ||
2171 | 3236 | |||
2172 | 3237 | /* Update success/fail counts if not searching for new mode */ | ||
2173 | 3238 | if (lq_sta->rs_state == RS_STATE_STAY_IN_COLUMN) { | ||
2174 | 3239 | lq_sta->total_success += info->status.ampdu_ack_len; | ||
2175 | 3240 | lq_sta->total_failed += (info->status.ampdu_len - | ||
2176 | 3241 | info->status.ampdu_ack_len); | ||
2177 | 3242 | } | ||
2178 | 3243 | } else { | ||
2179 | 3244 | /* For legacy, update frame history with for each Tx retry. */ | ||
2180 | 3245 | retries = info->status.rates[0].count - 1; | ||
2181 | 3246 | /* HW doesn't send more than 15 retries */ | ||
2182 | 3247 | retries = min(retries, 15); | ||
2183 | 3248 | |||
2184 | 3249 | /* The last transmission may have been successful */ | ||
2185 | 3250 | legacy_success = !!(info->flags & IEEE80211_TX_STAT_ACK); | ||
2186 | 3251 | /* Collect data for each rate used during failed TX attempts */ | ||
2187 | 3252 | for (i = 0; i <= retries; ++i) { | ||
2188 | 3253 | lq_hwrate = le32_to_cpu(table->rs_table[i]); | ||
2189 | 3254 | if (rs_rate_from_ucode_rate(lq_hwrate, info->band, | ||
2190 | 3255 | &lq_rate)) { | ||
2191 | 3256 | WARN_ON_ONCE(1); | ||
2192 | 3257 | return; | ||
2193 | 3258 | } | ||
2194 | 3259 | |||
2195 | 3260 | /* Only collect stats if retried rate is in the same RS | ||
2196 | 3261 | * table as active/search. | ||
2197 | 3262 | */ | ||
2198 | 3263 | if (rs_rate_column_match(&lq_rate, &curr_tbl->rate)) | ||
2199 | 3264 | tmp_tbl = curr_tbl; | ||
2200 | 3265 | else if (rs_rate_column_match(&lq_rate, | ||
2201 | 3266 | &other_tbl->rate)) | ||
2202 | 3267 | tmp_tbl = other_tbl; | ||
2203 | 3268 | else | ||
2204 | 3269 | continue; | ||
2205 | 3270 | |||
2206 | 3271 | rs_collect_tpc_data(mvm, lq_sta, tmp_tbl, | ||
2207 | 3272 | tx_resp_rate.index, 1, | ||
2208 | 3273 | i < retries ? 0 : legacy_success, | ||
2209 | 3274 | reduced_txp); | ||
2210 | 3275 | rs_collect_tlc_data(mvm, mvmsta, tid, tmp_tbl, | ||
2211 | 3276 | tx_resp_rate.index, 1, | ||
2212 | 3277 | i < retries ? 0 : legacy_success); | ||
2213 | 3278 | } | ||
2214 | 3279 | |||
2215 | 3280 | /* Update success/fail counts if not searching for new mode */ | ||
2216 | 3281 | if (lq_sta->rs_state == RS_STATE_STAY_IN_COLUMN) { | ||
2217 | 3282 | lq_sta->total_success += legacy_success; | ||
2218 | 3283 | lq_sta->total_failed += retries + (1 - legacy_success); | ||
2219 | 3284 | } | ||
2220 | 3285 | } | ||
2221 | 3286 | /* The last TX rate is cached in lq_sta; it's set in if/else above */ | ||
2222 | 3287 | lq_sta->last_rate_n_flags = lq_hwrate; | ||
2223 | 3288 | IWL_DEBUG_RATE(mvm, "reduced txpower: %d\n", reduced_txp); | ||
2224 | 3289 | done: | ||
2225 | 3290 | /* See if there's a better rate or modulation mode to try. */ | ||
2226 | 3291 | if (sta->supp_rates[info->band]) | ||
2227 | 3292 | rs_rate_scale_perform(mvm, sta, lq_sta, tid, ndp); | ||
2228 | 3293 | } | ||
2229 | 3294 | |||
2230 | 3295 | void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | ||
2231 | 3296 | int tid, struct ieee80211_tx_info *info, bool ndp) | ||
2232 | 3297 | { | ||
2233 | 3298 | struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); | ||
2234 | 3299 | |||
2235 | 3300 | /* If it's locked we are in middle of init flow | ||
2236 | 3301 | * just wait for next tx status to update the lq_sta data | ||
2237 | 3302 | */ | ||
2238 | 3303 | if (!spin_trylock(&mvmsta->lq_sta.rs_drv.pers.lock)) | ||
2239 | 3304 | return; | ||
2240 | 3305 | |||
2241 | 3306 | __iwl_mvm_rs_tx_status(mvm, sta, tid, info, ndp); | ||
2242 | 3307 | spin_unlock(&mvmsta->lq_sta.rs_drv.pers.lock); | ||
2243 | 3308 | } | ||
2244 | 3309 | |||
2245 | 3293 | #ifdef CPTCFG_MAC80211_DEBUGFS | 3310 | #ifdef CPTCFG_MAC80211_DEBUGFS |
2246 | 3294 | static void rs_build_rates_table_from_fixed(struct iwl_mvm *mvm, | 3311 | static void rs_build_rates_table_from_fixed(struct iwl_mvm *mvm, |
2247 | 3295 | struct iwl_lq_cmd *lq_cmd, | 3312 | struct iwl_lq_cmd *lq_cmd, |
2248 | @@ -3581,7 +3598,7 @@ static void rs_set_lq_ss_params(struct iwl_mvm *mvm, | |||
2249 | 3581 | 3598 | ||
2250 | 3582 | bfersta_ss_params &= ~LQ_SS_BFER_ALLOWED; | 3599 | bfersta_ss_params &= ~LQ_SS_BFER_ALLOWED; |
2251 | 3583 | bfersta_lq_cmd->ss_params = cpu_to_le32(bfersta_ss_params); | 3600 | bfersta_lq_cmd->ss_params = cpu_to_le32(bfersta_ss_params); |
2253 | 3584 | iwl_mvm_send_lq_cmd(mvm, bfersta_lq_cmd, false); | 3601 | iwl_mvm_send_lq_cmd(mvm, bfersta_lq_cmd); |
2254 | 3585 | 3602 | ||
2255 | 3586 | ss_params |= LQ_SS_BFER_ALLOWED; | 3603 | ss_params |= LQ_SS_BFER_ALLOWED; |
2256 | 3587 | IWL_DEBUG_RATE(mvm, | 3604 | IWL_DEBUG_RATE(mvm, |
2257 | @@ -3747,7 +3764,7 @@ static void rs_program_fix_rate(struct iwl_mvm *mvm, | |||
2258 | 3747 | 3764 | ||
2259 | 3748 | if (lq_sta->pers.dbg_fixed_rate) { | 3765 | if (lq_sta->pers.dbg_fixed_rate) { |
2260 | 3749 | rs_fill_lq_cmd(mvm, NULL, lq_sta, NULL); | 3766 | rs_fill_lq_cmd(mvm, NULL, lq_sta, NULL); |
2262 | 3750 | iwl_mvm_send_lq_cmd(lq_sta->pers.drv, &lq_sta->lq, false); | 3767 | iwl_mvm_send_lq_cmd(lq_sta->pers.drv, &lq_sta->lq); |
2263 | 3751 | } | 3768 | } |
2264 | 3752 | } | 3769 | } |
2265 | 3753 | 3770 | ||
2266 | @@ -4105,10 +4122,6 @@ static void rs_drv_add_sta_debugfs(void *mvm, void *priv_sta, | |||
2267 | 4105 | 4122 | ||
2268 | 4106 | MVM_DEBUGFS_ADD_FILE_RS(ss_force, dir, 0600); | 4123 | MVM_DEBUGFS_ADD_FILE_RS(ss_force, dir, 0600); |
2269 | 4107 | } | 4124 | } |
2270 | 4108 | |||
2271 | 4109 | void rs_remove_sta_debugfs(void *mvm, void *mvm_sta) | ||
2272 | 4110 | { | ||
2273 | 4111 | } | ||
2274 | 4112 | #endif | 4125 | #endif |
2275 | 4113 | 4126 | ||
2276 | 4114 | /* | 4127 | /* |
2277 | @@ -4136,7 +4149,6 @@ static const struct rate_control_ops rs_mvm_ops_drv = { | |||
2278 | 4136 | .rate_update = rs_drv_rate_update, | 4149 | .rate_update = rs_drv_rate_update, |
2279 | 4137 | #ifdef CPTCFG_MAC80211_DEBUGFS | 4150 | #ifdef CPTCFG_MAC80211_DEBUGFS |
2280 | 4138 | .add_sta_debugfs = rs_drv_add_sta_debugfs, | 4151 | .add_sta_debugfs = rs_drv_add_sta_debugfs, |
2281 | 4139 | .remove_sta_debugfs = rs_remove_sta_debugfs, | ||
2282 | 4140 | #endif | 4152 | #endif |
2283 | 4141 | .capa = RATE_CTRL_CAPA_VHT_EXT_NSS_BW, | 4153 | .capa = RATE_CTRL_CAPA_VHT_EXT_NSS_BW, |
2284 | 4142 | }; | 4154 | }; |
2285 | @@ -4144,10 +4156,15 @@ static const struct rate_control_ops rs_mvm_ops_drv = { | |||
2286 | 4144 | void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | 4156 | void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, |
2287 | 4145 | enum nl80211_band band, bool update) | 4157 | enum nl80211_band band, bool update) |
2288 | 4146 | { | 4158 | { |
2290 | 4147 | if (iwl_mvm_has_tlc_offload(mvm)) | 4159 | if (iwl_mvm_has_tlc_offload(mvm)) { |
2291 | 4148 | rs_fw_rate_init(mvm, sta, band, update); | 4160 | rs_fw_rate_init(mvm, sta, band, update); |
2294 | 4149 | else | 4161 | } else { |
2295 | 4150 | rs_drv_rate_init(mvm, sta, band, update); | 4162 | struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); |
2296 | 4163 | |||
2297 | 4164 | spin_lock(&mvmsta->lq_sta.rs_drv.pers.lock); | ||
2298 | 4165 | rs_drv_rate_init(mvm, sta, band); | ||
2299 | 4166 | spin_unlock(&mvmsta->lq_sta.rs_drv.pers.lock); | ||
2300 | 4167 | } | ||
2301 | 4151 | } | 4168 | } |
2302 | 4152 | 4169 | ||
2303 | 4153 | int iwl_mvm_rate_control_register(void) | 4170 | int iwl_mvm_rate_control_register(void) |
2304 | @@ -4177,7 +4194,7 @@ static int rs_drv_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta, | |||
2305 | 4177 | lq->flags &= ~LQ_FLAG_USE_RTS_MSK; | 4194 | lq->flags &= ~LQ_FLAG_USE_RTS_MSK; |
2306 | 4178 | } | 4195 | } |
2307 | 4179 | 4196 | ||
2309 | 4180 | return iwl_mvm_send_lq_cmd(mvm, lq, false); | 4197 | return iwl_mvm_send_lq_cmd(mvm, lq); |
2310 | 4181 | } | 4198 | } |
2311 | 4182 | 4199 | ||
2312 | 4183 | /** | 4200 | /** |
2313 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.h b/drivers/net/wireless/intel/iwlwifi/mvm/rs.h | |||
2314 | index b80eebc..b199b43 100644 | |||
2315 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.h | |||
2316 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.h | |||
2317 | @@ -3,7 +3,7 @@ | |||
2318 | 3 | * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved. | 3 | * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved. |
2319 | 4 | * Copyright(c) 2015 Intel Mobile Communications GmbH | 4 | * Copyright(c) 2015 Intel Mobile Communications GmbH |
2320 | 5 | * Copyright(c) 2017 Intel Deutschland GmbH | 5 | * Copyright(c) 2017 Intel Deutschland GmbH |
2322 | 6 | * Copyright(c) 2018 Intel Corporation | 6 | * Copyright(c) 2018 - 2019 Intel Corporation |
2323 | 7 | * | 7 | * |
2324 | 8 | * This program is free software; you can redistribute it and/or modify it | 8 | * This program is free software; you can redistribute it and/or modify it |
2325 | 9 | * under the terms of version 2 of the GNU General Public License as | 9 | * under the terms of version 2 of the GNU General Public License as |
2326 | @@ -396,6 +396,7 @@ struct iwl_lq_sta { | |||
2327 | 396 | s8 last_rssi; | 396 | s8 last_rssi; |
2328 | 397 | struct rs_rate_stats tx_stats[RS_COLUMN_COUNT][IWL_RATE_COUNT]; | 397 | struct rs_rate_stats tx_stats[RS_COLUMN_COUNT][IWL_RATE_COUNT]; |
2329 | 398 | struct iwl_mvm *drv; | 398 | struct iwl_mvm *drv; |
2330 | 399 | spinlock_t lock; /* for races in reinit/update table */ | ||
2331 | 399 | } pers; | 400 | } pers; |
2332 | 400 | }; | 401 | }; |
2333 | 401 | 402 | ||
2334 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | |||
2335 | index c35c3dd..6eadeb7 100644 | |||
2336 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | |||
2337 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | |||
2338 | @@ -462,20 +462,22 @@ static bool iwl_mvm_is_dup(struct ieee80211_sta *sta, int queue, | |||
2339 | 462 | } | 462 | } |
2340 | 463 | 463 | ||
2341 | 464 | int iwl_mvm_notify_rx_queue(struct iwl_mvm *mvm, u32 rxq_mask, | 464 | int iwl_mvm_notify_rx_queue(struct iwl_mvm *mvm, u32 rxq_mask, |
2343 | 465 | const u8 *data, u32 count) | 465 | const u8 *data, u32 count, bool async) |
2344 | 466 | { | 466 | { |
2346 | 467 | struct iwl_rxq_sync_cmd *cmd; | 467 | u8 buf[sizeof(struct iwl_rxq_sync_cmd) + |
2347 | 468 | sizeof(struct iwl_mvm_rss_sync_notif)]; | ||
2348 | 469 | struct iwl_rxq_sync_cmd *cmd = (void *)buf; | ||
2349 | 468 | u32 data_size = sizeof(*cmd) + count; | 470 | u32 data_size = sizeof(*cmd) + count; |
2350 | 469 | int ret; | 471 | int ret; |
2351 | 470 | 472 | ||
2354 | 471 | /* should be DWORD aligned */ | 473 | /* |
2355 | 472 | if (WARN_ON(count & 3 || count > IWL_MULTI_QUEUE_SYNC_MSG_MAX_SIZE)) | 474 | * size must be a multiple of DWORD |
2356 | 475 | * Ensure we don't overflow buf | ||
2357 | 476 | */ | ||
2358 | 477 | if (WARN_ON(count & 3 || | ||
2359 | 478 | count > sizeof(struct iwl_mvm_rss_sync_notif))) | ||
2360 | 473 | return -EINVAL; | 479 | return -EINVAL; |
2361 | 474 | 480 | ||
2362 | 475 | cmd = kzalloc(data_size, GFP_KERNEL); | ||
2363 | 476 | if (!cmd) | ||
2364 | 477 | return -ENOMEM; | ||
2365 | 478 | |||
2366 | 479 | cmd->rxq_mask = cpu_to_le32(rxq_mask); | 481 | cmd->rxq_mask = cpu_to_le32(rxq_mask); |
2367 | 480 | cmd->count = cpu_to_le32(count); | 482 | cmd->count = cpu_to_le32(count); |
2368 | 481 | cmd->flags = 0; | 483 | cmd->flags = 0; |
2369 | @@ -484,9 +486,8 @@ int iwl_mvm_notify_rx_queue(struct iwl_mvm *mvm, u32 rxq_mask, | |||
2370 | 484 | ret = iwl_mvm_send_cmd_pdu(mvm, | 486 | ret = iwl_mvm_send_cmd_pdu(mvm, |
2371 | 485 | WIDE_ID(DATA_PATH_GROUP, | 487 | WIDE_ID(DATA_PATH_GROUP, |
2372 | 486 | TRIGGER_RX_QUEUES_NOTIF_CMD), | 488 | TRIGGER_RX_QUEUES_NOTIF_CMD), |
2374 | 487 | 0, data_size, cmd); | 489 | async ? CMD_ASYNC : 0, data_size, cmd); |
2375 | 488 | 490 | ||
2376 | 489 | kfree(cmd); | ||
2377 | 490 | return ret; | 491 | return ret; |
2378 | 491 | } | 492 | } |
2379 | 492 | 493 | ||
2380 | @@ -502,14 +503,31 @@ static bool iwl_mvm_is_sn_less(u16 sn1, u16 sn2, u16 buffer_size) | |||
2381 | 502 | !ieee80211_sn_less(sn1, sn2 - buffer_size); | 503 | !ieee80211_sn_less(sn1, sn2 - buffer_size); |
2382 | 503 | } | 504 | } |
2383 | 504 | 505 | ||
2384 | 506 | static void iwl_mvm_sync_nssn(struct iwl_mvm *mvm, u8 baid, u16 nssn) | ||
2385 | 507 | { | ||
2386 | 508 | struct iwl_mvm_rss_sync_notif notif = { | ||
2387 | 509 | .metadata.type = IWL_MVM_RXQ_NSSN_SYNC, | ||
2388 | 510 | .metadata.sync = 0, | ||
2389 | 511 | .nssn_sync.baid = baid, | ||
2390 | 512 | .nssn_sync.nssn = nssn, | ||
2391 | 513 | }; | ||
2392 | 514 | |||
2393 | 515 | iwl_mvm_sync_rx_queues_internal(mvm, (void *)¬if, sizeof(notif)); | ||
2394 | 516 | } | ||
2395 | 517 | |||
2396 | 505 | #define RX_REORDER_BUF_TIMEOUT_MQ (HZ / 10) | 518 | #define RX_REORDER_BUF_TIMEOUT_MQ (HZ / 10) |
2397 | 506 | 519 | ||
2398 | 520 | enum iwl_mvm_release_flags { | ||
2399 | 521 | IWL_MVM_RELEASE_SEND_RSS_SYNC = BIT(0), | ||
2400 | 522 | IWL_MVM_RELEASE_FROM_RSS_SYNC = BIT(1), | ||
2401 | 523 | }; | ||
2402 | 524 | |||
2403 | 507 | static void iwl_mvm_release_frames(struct iwl_mvm *mvm, | 525 | static void iwl_mvm_release_frames(struct iwl_mvm *mvm, |
2404 | 508 | struct ieee80211_sta *sta, | 526 | struct ieee80211_sta *sta, |
2405 | 509 | struct napi_struct *napi, | 527 | struct napi_struct *napi, |
2406 | 510 | struct iwl_mvm_baid_data *baid_data, | 528 | struct iwl_mvm_baid_data *baid_data, |
2407 | 511 | struct iwl_mvm_reorder_buffer *reorder_buf, | 529 | struct iwl_mvm_reorder_buffer *reorder_buf, |
2409 | 512 | u16 nssn) | 530 | u16 nssn, u32 flags) |
2410 | 513 | { | 531 | { |
2411 | 514 | struct iwl_mvm_reorder_buf_entry *entries = | 532 | struct iwl_mvm_reorder_buf_entry *entries = |
2412 | 515 | &baid_data->entries[reorder_buf->queue * | 533 | &baid_data->entries[reorder_buf->queue * |
2413 | @@ -518,6 +536,18 @@ static void iwl_mvm_release_frames(struct iwl_mvm *mvm, | |||
2414 | 518 | 536 | ||
2415 | 519 | lockdep_assert_held(&reorder_buf->lock); | 537 | lockdep_assert_held(&reorder_buf->lock); |
2416 | 520 | 538 | ||
2417 | 539 | /* | ||
2418 | 540 | * We keep the NSSN not too far behind, if we are sync'ing it and it | ||
2419 | 541 | * is more than 2048 ahead of us, it must be behind us. Discard it. | ||
2420 | 542 | * This can happen if the queue that hit the 0 / 2048 seqno was lagging | ||
2421 | 543 | * behind and this queue already processed packets. The next if | ||
2422 | 544 | * would have caught cases where this queue would have processed less | ||
2423 | 545 | * than 64 packets, but it may have processed more than 64 packets. | ||
2424 | 546 | */ | ||
2425 | 547 | if ((flags & IWL_MVM_RELEASE_FROM_RSS_SYNC) && | ||
2426 | 548 | ieee80211_sn_less(nssn, ssn)) | ||
2427 | 549 | goto set_timer; | ||
2428 | 550 | |||
2429 | 521 | /* ignore nssn smaller than head sn - this can happen due to timeout */ | 551 | /* ignore nssn smaller than head sn - this can happen due to timeout */ |
2430 | 522 | if (iwl_mvm_is_sn_less(nssn, ssn, reorder_buf->buf_size)) | 552 | if (iwl_mvm_is_sn_less(nssn, ssn, reorder_buf->buf_size)) |
2431 | 523 | goto set_timer; | 553 | goto set_timer; |
2432 | @@ -528,6 +558,9 @@ static void iwl_mvm_release_frames(struct iwl_mvm *mvm, | |||
2433 | 528 | struct sk_buff *skb; | 558 | struct sk_buff *skb; |
2434 | 529 | 559 | ||
2435 | 530 | ssn = ieee80211_sn_inc(ssn); | 560 | ssn = ieee80211_sn_inc(ssn); |
2436 | 561 | if ((flags & IWL_MVM_RELEASE_SEND_RSS_SYNC) && | ||
2437 | 562 | (ssn == 2048 || ssn == 0)) | ||
2438 | 563 | iwl_mvm_sync_nssn(mvm, baid_data->baid, ssn); | ||
2439 | 531 | 564 | ||
2440 | 532 | /* | 565 | /* |
2441 | 533 | * Empty the list. Will have more than one frame for A-MSDU. | 566 | * Empty the list. Will have more than one frame for A-MSDU. |
2442 | @@ -614,7 +647,8 @@ void iwl_mvm_reorder_timer_expired(struct timer_list *t) | |||
2443 | 614 | sta_id, sn); | 647 | sta_id, sn); |
2444 | 615 | iwl_mvm_event_frame_timeout_callback(buf->mvm, mvmsta->vif, | 648 | iwl_mvm_event_frame_timeout_callback(buf->mvm, mvmsta->vif, |
2445 | 616 | sta, baid_data->tid); | 649 | sta, baid_data->tid); |
2447 | 617 | iwl_mvm_release_frames(buf->mvm, sta, NULL, baid_data, buf, sn); | 650 | iwl_mvm_release_frames(buf->mvm, sta, NULL, baid_data, |
2448 | 651 | buf, sn, IWL_MVM_RELEASE_SEND_RSS_SYNC); | ||
2449 | 618 | rcu_read_unlock(); | 652 | rcu_read_unlock(); |
2450 | 619 | } else { | 653 | } else { |
2451 | 620 | /* | 654 | /* |
2452 | @@ -656,7 +690,8 @@ static void iwl_mvm_del_ba(struct iwl_mvm *mvm, int queue, | |||
2453 | 656 | spin_lock_bh(&reorder_buf->lock); | 690 | spin_lock_bh(&reorder_buf->lock); |
2454 | 657 | iwl_mvm_release_frames(mvm, sta, NULL, ba_data, reorder_buf, | 691 | iwl_mvm_release_frames(mvm, sta, NULL, ba_data, reorder_buf, |
2455 | 658 | ieee80211_sn_add(reorder_buf->head_sn, | 692 | ieee80211_sn_add(reorder_buf->head_sn, |
2457 | 659 | reorder_buf->buf_size)); | 693 | reorder_buf->buf_size), |
2458 | 694 | 0); | ||
2459 | 660 | spin_unlock_bh(&reorder_buf->lock); | 695 | spin_unlock_bh(&reorder_buf->lock); |
2460 | 661 | del_timer_sync(&reorder_buf->reorder_timer); | 696 | del_timer_sync(&reorder_buf->reorder_timer); |
2461 | 662 | 697 | ||
2462 | @@ -664,8 +699,54 @@ out: | |||
2463 | 664 | rcu_read_unlock(); | 699 | rcu_read_unlock(); |
2464 | 665 | } | 700 | } |
2465 | 666 | 701 | ||
2468 | 667 | void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb, | 702 | static void iwl_mvm_release_frames_from_notif(struct iwl_mvm *mvm, |
2469 | 668 | int queue) | 703 | struct napi_struct *napi, |
2470 | 704 | u8 baid, u16 nssn, int queue, | ||
2471 | 705 | u32 flags) | ||
2472 | 706 | { | ||
2473 | 707 | struct ieee80211_sta *sta; | ||
2474 | 708 | struct iwl_mvm_reorder_buffer *reorder_buf; | ||
2475 | 709 | struct iwl_mvm_baid_data *ba_data; | ||
2476 | 710 | |||
2477 | 711 | IWL_DEBUG_HT(mvm, "Frame release notification for BAID %u, NSSN %d\n", | ||
2478 | 712 | baid, nssn); | ||
2479 | 713 | |||
2480 | 714 | if (WARN_ON_ONCE(baid == IWL_RX_REORDER_DATA_INVALID_BAID || | ||
2481 | 715 | baid >= ARRAY_SIZE(mvm->baid_map))) | ||
2482 | 716 | return; | ||
2483 | 717 | |||
2484 | 718 | rcu_read_lock(); | ||
2485 | 719 | |||
2486 | 720 | ba_data = rcu_dereference(mvm->baid_map[baid]); | ||
2487 | 721 | if (WARN_ON_ONCE(!ba_data)) | ||
2488 | 722 | goto out; | ||
2489 | 723 | |||
2490 | 724 | sta = rcu_dereference(mvm->fw_id_to_mac_id[ba_data->sta_id]); | ||
2491 | 725 | if (WARN_ON_ONCE(IS_ERR_OR_NULL(sta))) | ||
2492 | 726 | goto out; | ||
2493 | 727 | |||
2494 | 728 | reorder_buf = &ba_data->reorder_buf[queue]; | ||
2495 | 729 | |||
2496 | 730 | spin_lock_bh(&reorder_buf->lock); | ||
2497 | 731 | iwl_mvm_release_frames(mvm, sta, napi, ba_data, | ||
2498 | 732 | reorder_buf, nssn, flags); | ||
2499 | 733 | spin_unlock_bh(&reorder_buf->lock); | ||
2500 | 734 | |||
2501 | 735 | out: | ||
2502 | 736 | rcu_read_unlock(); | ||
2503 | 737 | } | ||
2504 | 738 | |||
2505 | 739 | static void iwl_mvm_nssn_sync(struct iwl_mvm *mvm, | ||
2506 | 740 | struct napi_struct *napi, int queue, | ||
2507 | 741 | const struct iwl_mvm_nssn_sync_data *data) | ||
2508 | 742 | { | ||
2509 | 743 | iwl_mvm_release_frames_from_notif(mvm, napi, data->baid, | ||
2510 | 744 | data->nssn, queue, | ||
2511 | 745 | IWL_MVM_RELEASE_FROM_RSS_SYNC); | ||
2512 | 746 | } | ||
2513 | 747 | |||
2514 | 748 | void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct napi_struct *napi, | ||
2515 | 749 | struct iwl_rx_cmd_buffer *rxb, int queue) | ||
2516 | 669 | { | 750 | { |
2517 | 670 | struct iwl_rx_packet *pkt = rxb_addr(rxb); | 751 | struct iwl_rx_packet *pkt = rxb_addr(rxb); |
2518 | 671 | struct iwl_rxq_sync_notification *notif; | 752 | struct iwl_rxq_sync_notification *notif; |
2519 | @@ -686,6 +767,10 @@ void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb, | |||
2520 | 686 | case IWL_MVM_RXQ_NOTIF_DEL_BA: | 767 | case IWL_MVM_RXQ_NOTIF_DEL_BA: |
2521 | 687 | iwl_mvm_del_ba(mvm, queue, (void *)internal_notif->data); | 768 | iwl_mvm_del_ba(mvm, queue, (void *)internal_notif->data); |
2522 | 688 | break; | 769 | break; |
2523 | 770 | case IWL_MVM_RXQ_NSSN_SYNC: | ||
2524 | 771 | iwl_mvm_nssn_sync(mvm, napi, queue, | ||
2525 | 772 | (void *)internal_notif->data); | ||
2526 | 773 | break; | ||
2527 | 689 | default: | 774 | default: |
2528 | 690 | WARN_ONCE(1, "Invalid identifier %d", internal_notif->type); | 775 | WARN_ONCE(1, "Invalid identifier %d", internal_notif->type); |
2529 | 691 | } | 776 | } |
2530 | @@ -784,7 +869,8 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm, | |||
2531 | 784 | } | 869 | } |
2532 | 785 | 870 | ||
2533 | 786 | if (ieee80211_is_back_req(hdr->frame_control)) { | 871 | if (ieee80211_is_back_req(hdr->frame_control)) { |
2535 | 787 | iwl_mvm_release_frames(mvm, sta, napi, baid_data, buffer, nssn); | 872 | iwl_mvm_release_frames(mvm, sta, napi, baid_data, |
2536 | 873 | buffer, nssn, 0); | ||
2537 | 788 | goto drop; | 874 | goto drop; |
2538 | 789 | } | 875 | } |
2539 | 790 | 876 | ||
2540 | @@ -793,7 +879,10 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm, | |||
2541 | 793 | * If the SN is smaller than the NSSN it might need to first go into | 879 | * If the SN is smaller than the NSSN it might need to first go into |
2542 | 794 | * the reorder buffer, in which case we just release up to it and the | 880 | * the reorder buffer, in which case we just release up to it and the |
2543 | 795 | * rest of the function will take care of storing it and releasing up to | 881 | * rest of the function will take care of storing it and releasing up to |
2545 | 796 | * the nssn | 882 | * the nssn. |
2546 | 883 | * This should not happen. This queue has been lagging and it should | ||
2547 | 884 | * have been updated by a IWL_MVM_RXQ_NSSN_SYNC notification. Be nice | ||
2548 | 885 | * and update the other queues. | ||
2549 | 797 | */ | 886 | */ |
2550 | 798 | if (!iwl_mvm_is_sn_less(nssn, buffer->head_sn + buffer->buf_size, | 887 | if (!iwl_mvm_is_sn_less(nssn, buffer->head_sn + buffer->buf_size, |
2551 | 799 | buffer->buf_size) || | 888 | buffer->buf_size) || |
2552 | @@ -801,7 +890,7 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm, | |||
2553 | 801 | u16 min_sn = ieee80211_sn_less(sn, nssn) ? sn : nssn; | 890 | u16 min_sn = ieee80211_sn_less(sn, nssn) ? sn : nssn; |
2554 | 802 | 891 | ||
2555 | 803 | iwl_mvm_release_frames(mvm, sta, napi, baid_data, buffer, | 892 | iwl_mvm_release_frames(mvm, sta, napi, baid_data, buffer, |
2557 | 804 | min_sn); | 893 | min_sn, IWL_MVM_RELEASE_SEND_RSS_SYNC); |
2558 | 805 | } | 894 | } |
2559 | 806 | 895 | ||
2560 | 807 | /* drop any oudated packets */ | 896 | /* drop any oudated packets */ |
2561 | @@ -812,8 +901,23 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm, | |||
2562 | 812 | if (!buffer->num_stored && ieee80211_sn_less(sn, nssn)) { | 901 | if (!buffer->num_stored && ieee80211_sn_less(sn, nssn)) { |
2563 | 813 | if (iwl_mvm_is_sn_less(buffer->head_sn, nssn, | 902 | if (iwl_mvm_is_sn_less(buffer->head_sn, nssn, |
2564 | 814 | buffer->buf_size) && | 903 | buffer->buf_size) && |
2566 | 815 | (!amsdu || last_subframe)) | 904 | (!amsdu || last_subframe)) { |
2567 | 905 | /* | ||
2568 | 906 | * If we crossed the 2048 or 0 SN, notify all the | ||
2569 | 907 | * queues. This is done in order to avoid having a | ||
2570 | 908 | * head_sn that lags behind for too long. When that | ||
2571 | 909 | * happens, we can get to a situation where the head_sn | ||
2572 | 910 | * is within the interval [nssn - buf_size : nssn] | ||
2573 | 911 | * which will make us think that the nssn is a packet | ||
2574 | 912 | * that we already freed because of the reordering | ||
2575 | 913 | * buffer and we will ignore it. So maintain the | ||
2576 | 914 | * head_sn somewhat updated across all the queues: | ||
2577 | 915 | * when it crosses 0 and 2048. | ||
2578 | 916 | */ | ||
2579 | 917 | if (sn == 2048 || sn == 0) | ||
2580 | 918 | iwl_mvm_sync_nssn(mvm, baid, sn); | ||
2581 | 816 | buffer->head_sn = nssn; | 919 | buffer->head_sn = nssn; |
2582 | 920 | } | ||
2583 | 817 | /* No need to update AMSDU last SN - we are moving the head */ | 921 | /* No need to update AMSDU last SN - we are moving the head */ |
2584 | 818 | spin_unlock_bh(&buffer->lock); | 922 | spin_unlock_bh(&buffer->lock); |
2585 | 819 | return false; | 923 | return false; |
2586 | @@ -828,8 +932,11 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm, | |||
2587 | 828 | * while technically there is no hole and we can move forward. | 932 | * while technically there is no hole and we can move forward. |
2588 | 829 | */ | 933 | */ |
2589 | 830 | if (!buffer->num_stored && sn == buffer->head_sn) { | 934 | if (!buffer->num_stored && sn == buffer->head_sn) { |
2591 | 831 | if (!amsdu || last_subframe) | 935 | if (!amsdu || last_subframe) { |
2592 | 936 | if (sn == 2048 || sn == 0) | ||
2593 | 937 | iwl_mvm_sync_nssn(mvm, baid, sn); | ||
2594 | 832 | buffer->head_sn = ieee80211_sn_inc(buffer->head_sn); | 938 | buffer->head_sn = ieee80211_sn_inc(buffer->head_sn); |
2595 | 939 | } | ||
2596 | 833 | /* No need to update AMSDU last SN - we are moving the head */ | 940 | /* No need to update AMSDU last SN - we are moving the head */ |
2597 | 834 | spin_unlock_bh(&buffer->lock); | 941 | spin_unlock_bh(&buffer->lock); |
2598 | 835 | return false; | 942 | return false; |
2599 | @@ -874,7 +981,9 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm, | |||
2600 | 874 | * release notification with up to date NSSN. | 981 | * release notification with up to date NSSN. |
2601 | 875 | */ | 982 | */ |
2602 | 876 | if (!amsdu || last_subframe) | 983 | if (!amsdu || last_subframe) |
2604 | 877 | iwl_mvm_release_frames(mvm, sta, napi, baid_data, buffer, nssn); | 984 | iwl_mvm_release_frames(mvm, sta, napi, baid_data, |
2605 | 985 | buffer, nssn, | ||
2606 | 986 | IWL_MVM_RELEASE_SEND_RSS_SYNC); | ||
2607 | 878 | 987 | ||
2608 | 879 | spin_unlock_bh(&buffer->lock); | 988 | spin_unlock_bh(&buffer->lock); |
2609 | 880 | return true; | 989 | return true; |
2610 | @@ -1843,40 +1952,14 @@ void iwl_mvm_rx_monitor_no_data(struct iwl_mvm *mvm, struct napi_struct *napi, | |||
2611 | 1843 | out: | 1952 | out: |
2612 | 1844 | rcu_read_unlock(); | 1953 | rcu_read_unlock(); |
2613 | 1845 | } | 1954 | } |
2614 | 1955 | |||
2615 | 1846 | void iwl_mvm_rx_frame_release(struct iwl_mvm *mvm, struct napi_struct *napi, | 1956 | void iwl_mvm_rx_frame_release(struct iwl_mvm *mvm, struct napi_struct *napi, |
2616 | 1847 | struct iwl_rx_cmd_buffer *rxb, int queue) | 1957 | struct iwl_rx_cmd_buffer *rxb, int queue) |
2617 | 1848 | { | 1958 | { |
2618 | 1849 | struct iwl_rx_packet *pkt = rxb_addr(rxb); | 1959 | struct iwl_rx_packet *pkt = rxb_addr(rxb); |
2619 | 1850 | struct iwl_frame_release *release = (void *)pkt->data; | 1960 | struct iwl_frame_release *release = (void *)pkt->data; |
2620 | 1851 | struct ieee80211_sta *sta; | ||
2621 | 1852 | struct iwl_mvm_reorder_buffer *reorder_buf; | ||
2622 | 1853 | struct iwl_mvm_baid_data *ba_data; | ||
2623 | 1854 | |||
2624 | 1855 | int baid = release->baid; | ||
2625 | 1856 | |||
2626 | 1857 | IWL_DEBUG_HT(mvm, "Frame release notification for BAID %u, NSSN %d\n", | ||
2627 | 1858 | release->baid, le16_to_cpu(release->nssn)); | ||
2628 | 1859 | 1961 | ||
2651 | 1860 | if (WARN_ON_ONCE(baid == IWL_RX_REORDER_DATA_INVALID_BAID)) | 1962 | iwl_mvm_release_frames_from_notif(mvm, napi, release->baid, |
2652 | 1861 | return; | 1963 | le16_to_cpu(release->nssn), |
2653 | 1862 | 1964 | queue, 0); | |
2632 | 1863 | rcu_read_lock(); | ||
2633 | 1864 | |||
2634 | 1865 | ba_data = rcu_dereference(mvm->baid_map[baid]); | ||
2635 | 1866 | if (WARN_ON_ONCE(!ba_data)) | ||
2636 | 1867 | goto out; | ||
2637 | 1868 | |||
2638 | 1869 | sta = rcu_dereference(mvm->fw_id_to_mac_id[ba_data->sta_id]); | ||
2639 | 1870 | if (WARN_ON_ONCE(IS_ERR_OR_NULL(sta))) | ||
2640 | 1871 | goto out; | ||
2641 | 1872 | |||
2642 | 1873 | reorder_buf = &ba_data->reorder_buf[queue]; | ||
2643 | 1874 | |||
2644 | 1875 | spin_lock_bh(&reorder_buf->lock); | ||
2645 | 1876 | iwl_mvm_release_frames(mvm, sta, napi, ba_data, reorder_buf, | ||
2646 | 1877 | le16_to_cpu(release->nssn)); | ||
2647 | 1878 | spin_unlock_bh(&reorder_buf->lock); | ||
2648 | 1879 | |||
2649 | 1880 | out: | ||
2650 | 1881 | rcu_read_unlock(); | ||
2654 | 1882 | } | 1965 | } |
2655 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c | |||
2656 | index 7d667f3..1cdfebc 100644 | |||
2657 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c | |||
2658 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c | |||
2659 | @@ -1678,6 +1678,8 @@ int iwl_mvm_add_sta(struct iwl_mvm *mvm, | |||
2660 | 1678 | */ | 1678 | */ |
2661 | 1679 | if (iwl_mvm_has_tlc_offload(mvm)) | 1679 | if (iwl_mvm_has_tlc_offload(mvm)) |
2662 | 1680 | iwl_mvm_rs_add_sta(mvm, mvm_sta); | 1680 | iwl_mvm_rs_add_sta(mvm, mvm_sta); |
2663 | 1681 | else | ||
2664 | 1682 | spin_lock_init(&mvm_sta->lq_sta.rs_drv.pers.lock); | ||
2665 | 1681 | 1683 | ||
2666 | 1682 | iwl_mvm_toggle_tx_ant(mvm, &mvm_sta->tx_ant); | 1684 | iwl_mvm_toggle_tx_ant(mvm, &mvm_sta->tx_ant); |
2667 | 1683 | 1685 | ||
2668 | @@ -2411,7 +2413,7 @@ int iwl_mvm_rm_mcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif) | |||
2669 | 2411 | 2413 | ||
2670 | 2412 | static void iwl_mvm_sync_rxq_del_ba(struct iwl_mvm *mvm, u8 baid) | 2414 | static void iwl_mvm_sync_rxq_del_ba(struct iwl_mvm *mvm, u8 baid) |
2671 | 2413 | { | 2415 | { |
2673 | 2414 | struct iwl_mvm_delba_notif notif = { | 2416 | struct iwl_mvm_rss_sync_notif notif = { |
2674 | 2415 | .metadata.type = IWL_MVM_RXQ_NOTIF_DEL_BA, | 2417 | .metadata.type = IWL_MVM_RXQ_NOTIF_DEL_BA, |
2675 | 2416 | .metadata.sync = 1, | 2418 | .metadata.sync = 1, |
2676 | 2417 | .delba.baid = baid, | 2419 | .delba.baid = baid, |
2677 | @@ -2955,7 +2957,7 @@ out: | |||
2678 | 2955 | IWL_DEBUG_HT(mvm, "Tx aggregation enabled on ra = %pM tid = %d\n", | 2957 | IWL_DEBUG_HT(mvm, "Tx aggregation enabled on ra = %pM tid = %d\n", |
2679 | 2956 | sta->addr, tid); | 2958 | sta->addr, tid); |
2680 | 2957 | 2959 | ||
2682 | 2958 | return iwl_mvm_send_lq_cmd(mvm, &mvmsta->lq_sta.rs_drv.lq, false); | 2960 | return iwl_mvm_send_lq_cmd(mvm, &mvmsta->lq_sta.rs_drv.lq); |
2683 | 2959 | } | 2961 | } |
2684 | 2960 | 2962 | ||
2685 | 2961 | static void iwl_mvm_unreserve_agg_queue(struct iwl_mvm *mvm, | 2963 | static void iwl_mvm_unreserve_agg_queue(struct iwl_mvm *mvm, |
2686 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h | |||
2687 | index 4487cc3..8d70093 100644 | |||
2688 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h | |||
2689 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h | |||
2690 | @@ -343,9 +343,17 @@ struct iwl_mvm_delba_data { | |||
2691 | 343 | u32 baid; | 343 | u32 baid; |
2692 | 344 | } __packed; | 344 | } __packed; |
2693 | 345 | 345 | ||
2695 | 346 | struct iwl_mvm_delba_notif { | 346 | struct iwl_mvm_nssn_sync_data { |
2696 | 347 | u32 baid; | ||
2697 | 348 | u32 nssn; | ||
2698 | 349 | } __packed; | ||
2699 | 350 | |||
2700 | 351 | struct iwl_mvm_rss_sync_notif { | ||
2701 | 347 | struct iwl_mvm_internal_rxq_notif metadata; | 352 | struct iwl_mvm_internal_rxq_notif metadata; |
2703 | 348 | struct iwl_mvm_delba_data delba; | 353 | union { |
2704 | 354 | struct iwl_mvm_delba_data delba; | ||
2705 | 355 | struct iwl_mvm_nssn_sync_data nssn_sync; | ||
2706 | 356 | }; | ||
2707 | 349 | } __packed; | 357 | } __packed; |
2708 | 350 | 358 | ||
2709 | 351 | /** | 359 | /** |
2710 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/utils.c b/drivers/net/wireless/intel/iwlwifi/mvm/utils.c | |||
2711 | index dd65970..99f02f8 100644 | |||
2712 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/utils.c | |||
2713 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/utils.c | |||
2714 | @@ -647,12 +647,12 @@ int iwl_mvm_reconfig_scd(struct iwl_mvm *mvm, int queue, int fifo, int sta_id, | |||
2715 | 647 | * this case to clear the state indicating that station creation is in | 647 | * this case to clear the state indicating that station creation is in |
2716 | 648 | * progress. | 648 | * progress. |
2717 | 649 | */ | 649 | */ |
2719 | 650 | int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq, bool sync) | 650 | int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq) |
2720 | 651 | { | 651 | { |
2721 | 652 | struct iwl_host_cmd cmd = { | 652 | struct iwl_host_cmd cmd = { |
2722 | 653 | .id = LQ_CMD, | 653 | .id = LQ_CMD, |
2723 | 654 | .len = { sizeof(struct iwl_lq_cmd), }, | 654 | .len = { sizeof(struct iwl_lq_cmd), }, |
2725 | 655 | .flags = sync ? 0 : CMD_ASYNC, | 655 | .flags = CMD_ASYNC, |
2726 | 656 | .data = { lq, }, | 656 | .data = { lq, }, |
2727 | 657 | }; | 657 | }; |
2728 | 658 | 658 | ||
2729 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c | |||
2730 | index fee789b..1324f23 100644 | |||
2731 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c | |||
2732 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c | |||
2733 | @@ -417,6 +417,7 @@ static const struct pci_device_id iwl_hw_card_ids[] = { | |||
2734 | 417 | {IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9460_2ac_cfg)}, | 417 | {IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9460_2ac_cfg)}, |
2735 | 418 | {IWL_PCI_DEVICE(0x2526, 0x4234, iwl9560_2ac_cfg_soc)}, | 418 | {IWL_PCI_DEVICE(0x2526, 0x4234, iwl9560_2ac_cfg_soc)}, |
2736 | 419 | {IWL_PCI_DEVICE(0x2526, 0x42A4, iwl9462_2ac_cfg_soc)}, | 419 | {IWL_PCI_DEVICE(0x2526, 0x42A4, iwl9462_2ac_cfg_soc)}, |
2737 | 420 | {IWL_PCI_DEVICE(0x2526, 0x6014, iwl9260_2ac_160_cfg)}, | ||
2738 | 420 | {IWL_PCI_DEVICE(0x2526, 0x8014, iwl9260_2ac_160_cfg)}, | 421 | {IWL_PCI_DEVICE(0x2526, 0x8014, iwl9260_2ac_160_cfg)}, |
2739 | 421 | {IWL_PCI_DEVICE(0x2526, 0x8010, iwl9260_2ac_160_cfg)}, | 422 | {IWL_PCI_DEVICE(0x2526, 0x8010, iwl9260_2ac_160_cfg)}, |
2740 | 422 | {IWL_PCI_DEVICE(0x2526, 0xA014, iwl9260_2ac_160_cfg)}, | 423 | {IWL_PCI_DEVICE(0x2526, 0xA014, iwl9260_2ac_160_cfg)}, |
2741 | @@ -789,6 +790,7 @@ static const struct pci_device_id iwl_hw_card_ids[] = { | |||
2742 | 789 | {IWL_PCI_DEVICE(0x7A70, 0x0310, iwlax211_2ax_cfg_so_gf_a0)}, | 790 | {IWL_PCI_DEVICE(0x7A70, 0x0310, iwlax211_2ax_cfg_so_gf_a0)}, |
2743 | 790 | {IWL_PCI_DEVICE(0x7A70, 0x0510, iwlax211_2ax_cfg_so_gf_a0)}, | 791 | {IWL_PCI_DEVICE(0x7A70, 0x0510, iwlax211_2ax_cfg_so_gf_a0)}, |
2744 | 791 | {IWL_PCI_DEVICE(0x7A70, 0x0A10, iwlax211_2ax_cfg_so_gf_a0)}, | 792 | {IWL_PCI_DEVICE(0x7A70, 0x0A10, iwlax211_2ax_cfg_so_gf_a0)}, |
2745 | 793 | {IWL_PCI_DEVICE(0x7AF0, 0x0090, iwlax211_2ax_cfg_so_gf_a0)}, | ||
2746 | 792 | {IWL_PCI_DEVICE(0x7AF0, 0x0310, iwlax211_2ax_cfg_so_gf_a0)}, | 794 | {IWL_PCI_DEVICE(0x7AF0, 0x0310, iwlax211_2ax_cfg_so_gf_a0)}, |
2747 | 793 | {IWL_PCI_DEVICE(0x7AF0, 0x0510, iwlax211_2ax_cfg_so_gf_a0)}, | 795 | {IWL_PCI_DEVICE(0x7AF0, 0x0510, iwlax211_2ax_cfg_so_gf_a0)}, |
2748 | 794 | {IWL_PCI_DEVICE(0x7AF0, 0x0A10, iwlax211_2ax_cfg_so_gf_a0)}, | 796 | {IWL_PCI_DEVICE(0x7AF0, 0x0A10, iwlax211_2ax_cfg_so_gf_a0)}, |
2749 | @@ -861,6 +863,27 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
2750 | 861 | } | 863 | } |
2751 | 862 | iwl_trans->cfg = cfg; | 864 | iwl_trans->cfg = cfg; |
2752 | 863 | } | 865 | } |
2753 | 866 | |||
2754 | 867 | /* | ||
2755 | 868 | * This is a hack to switch from Qu B0 to Qu C0. We need to | ||
2756 | 869 | * do this for all cfgs that use Qu B0. All this code is in | ||
2757 | 870 | * urgent need for a refactor, but for now this is the easiest | ||
2758 | 871 | * thing to do to support Qu C-step. | ||
2759 | 872 | */ | ||
2760 | 873 | if (iwl_trans->hw_rev == CSR_HW_REV_TYPE_QU_C0) { | ||
2761 | 874 | if (iwl_trans->cfg == &iwl_ax101_cfg_qu_hr) | ||
2762 | 875 | iwl_trans->cfg = &iwl_ax101_cfg_qu_c0_hr_b0; | ||
2763 | 876 | else if (iwl_trans->cfg == &iwl_ax201_cfg_qu_hr) | ||
2764 | 877 | iwl_trans->cfg = &iwl_ax201_cfg_qu_c0_hr_b0; | ||
2765 | 878 | else if (iwl_trans->cfg == &iwl9461_2ac_cfg_qu_b0_jf_b0) | ||
2766 | 879 | iwl_trans->cfg = &iwl9461_2ac_cfg_qu_c0_jf_b0; | ||
2767 | 880 | else if (iwl_trans->cfg == &iwl9462_2ac_cfg_qu_b0_jf_b0) | ||
2768 | 881 | iwl_trans->cfg = &iwl9462_2ac_cfg_qu_c0_jf_b0; | ||
2769 | 882 | else if (iwl_trans->cfg == &iwl9560_2ac_cfg_qu_b0_jf_b0) | ||
2770 | 883 | iwl_trans->cfg = &iwl9560_2ac_cfg_qu_c0_jf_b0; | ||
2771 | 884 | else if (iwl_trans->cfg == &iwl9560_2ac_160_cfg_qu_b0_jf_b0) | ||
2772 | 885 | iwl_trans->cfg = &iwl9560_2ac_160_cfg_qu_c0_jf_b0; | ||
2773 | 886 | } | ||
2774 | 864 | #endif | 887 | #endif |
2775 | 865 | 888 | ||
2776 | 866 | pci_set_drvdata(pdev, iwl_trans); | 889 | pci_set_drvdata(pdev, iwl_trans); |
2777 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c | |||
2778 | index 1e63a59..519a421 100644 | |||
2779 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c | |||
2780 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c | |||
2781 | @@ -218,8 +218,7 @@ static void iwl_pcie_alloc_fw_monitor_block(struct iwl_trans *trans, | |||
2782 | 218 | for (power = max_power; power >= min_power; power--) { | 218 | for (power = max_power; power >= min_power; power--) { |
2783 | 219 | size = BIT(power); | 219 | size = BIT(power); |
2784 | 220 | cpu_addr = dma_alloc_coherent(trans->dev, size, &phys, | 220 | cpu_addr = dma_alloc_coherent(trans->dev, size, &phys, |
2787 | 221 | GFP_KERNEL | __GFP_NOWARN | | 221 | GFP_KERNEL | __GFP_NOWARN); |
2786 | 222 | __GFP_ZERO | __GFP_COMP); | ||
2788 | 223 | if (!cpu_addr) | 222 | if (!cpu_addr) |
2789 | 224 | continue; | 223 | continue; |
2790 | 225 | 224 | ||
2791 | @@ -2140,7 +2139,6 @@ static void iwl_trans_pcie_release_nic_access(struct iwl_trans *trans, | |||
2792 | 2140 | * MAC_ACCESS_REQ bit to be performed before any other writes | 2139 | * MAC_ACCESS_REQ bit to be performed before any other writes |
2793 | 2141 | * scheduled on different CPUs (after we drop reg_lock). | 2140 | * scheduled on different CPUs (after we drop reg_lock). |
2794 | 2142 | */ | 2141 | */ |
2795 | 2143 | mmiowb(); | ||
2796 | 2144 | out: | 2142 | out: |
2797 | 2145 | spin_unlock_irqrestore(&trans_pcie->reg_lock, *flags); | 2143 | spin_unlock_irqrestore(&trans_pcie->reg_lock, *flags); |
2798 | 2146 | } | 2144 | } |
2799 | @@ -3615,8 +3613,9 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, | |||
2800 | 3615 | } else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) == | 3613 | } else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) == |
2801 | 3616 | CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR) && | 3614 | CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR) && |
2802 | 3617 | ((trans->cfg != &iwl_ax200_cfg_cc && | 3615 | ((trans->cfg != &iwl_ax200_cfg_cc && |
2805 | 3618 | trans->cfg != &killer1650x_2ax_cfg && | 3616 | trans->cfg != &killer1650x_2ax_cfg && |
2806 | 3619 | trans->cfg != &killer1650w_2ax_cfg) || | 3617 | trans->cfg != &killer1650w_2ax_cfg && |
2807 | 3618 | trans->cfg != &iwl_ax201_cfg_quz_hr) || | ||
2808 | 3620 | trans->hw_rev == CSR_HW_REV_TYPE_QNJ_B0)) { | 3619 | trans->hw_rev == CSR_HW_REV_TYPE_QNJ_B0)) { |
2809 | 3621 | u32 hw_status; | 3620 | u32 hw_status; |
2810 | 3622 | 3621 | ||
2811 | diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c | |||
2812 | index 26e4405..880445d 100644 | |||
2813 | --- a/drivers/net/wireless/mac80211_hwsim.c | |||
2814 | +++ b/drivers/net/wireless/mac80211_hwsim.c | |||
2815 | @@ -3654,35 +3654,53 @@ done: | |||
2816 | 3654 | static __genl_const struct genl_ops hwsim_ops[] = { | 3654 | static __genl_const struct genl_ops hwsim_ops[] = { |
2817 | 3655 | { | 3655 | { |
2818 | 3656 | .cmd = HWSIM_CMD_REGISTER, | 3656 | .cmd = HWSIM_CMD_REGISTER, |
2820 | 3657 | .policy = hwsim_genl_policy, | 3657 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
2821 | 3658 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
2822 | 3659 | #endif | ||
2823 | 3660 | |||
2824 | 3658 | .doit = hwsim_register_received_nl, | 3661 | .doit = hwsim_register_received_nl, |
2825 | 3659 | .flags = GENL_UNS_ADMIN_PERM, | 3662 | .flags = GENL_UNS_ADMIN_PERM, |
2826 | 3660 | }, | 3663 | }, |
2827 | 3661 | { | 3664 | { |
2828 | 3662 | .cmd = HWSIM_CMD_FRAME, | 3665 | .cmd = HWSIM_CMD_FRAME, |
2830 | 3663 | .policy = hwsim_genl_policy, | 3666 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
2831 | 3667 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
2832 | 3668 | #endif | ||
2833 | 3669 | |||
2834 | 3664 | .doit = hwsim_cloned_frame_received_nl, | 3670 | .doit = hwsim_cloned_frame_received_nl, |
2835 | 3665 | }, | 3671 | }, |
2836 | 3666 | { | 3672 | { |
2837 | 3667 | .cmd = HWSIM_CMD_TX_INFO_FRAME, | 3673 | .cmd = HWSIM_CMD_TX_INFO_FRAME, |
2839 | 3668 | .policy = hwsim_genl_policy, | 3674 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
2840 | 3675 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
2841 | 3676 | #endif | ||
2842 | 3677 | |||
2843 | 3669 | .doit = hwsim_tx_info_frame_received_nl, | 3678 | .doit = hwsim_tx_info_frame_received_nl, |
2844 | 3670 | }, | 3679 | }, |
2845 | 3671 | { | 3680 | { |
2846 | 3672 | .cmd = HWSIM_CMD_NEW_RADIO, | 3681 | .cmd = HWSIM_CMD_NEW_RADIO, |
2848 | 3673 | .policy = hwsim_genl_policy, | 3682 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
2849 | 3683 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
2850 | 3684 | #endif | ||
2851 | 3685 | |||
2852 | 3674 | .doit = hwsim_new_radio_nl, | 3686 | .doit = hwsim_new_radio_nl, |
2853 | 3675 | .flags = GENL_UNS_ADMIN_PERM, | 3687 | .flags = GENL_UNS_ADMIN_PERM, |
2854 | 3676 | }, | 3688 | }, |
2855 | 3677 | { | 3689 | { |
2856 | 3678 | .cmd = HWSIM_CMD_DEL_RADIO, | 3690 | .cmd = HWSIM_CMD_DEL_RADIO, |
2858 | 3679 | .policy = hwsim_genl_policy, | 3691 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
2859 | 3692 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
2860 | 3693 | #endif | ||
2861 | 3694 | |||
2862 | 3680 | .doit = hwsim_del_radio_nl, | 3695 | .doit = hwsim_del_radio_nl, |
2863 | 3681 | .flags = GENL_UNS_ADMIN_PERM, | 3696 | .flags = GENL_UNS_ADMIN_PERM, |
2864 | 3682 | }, | 3697 | }, |
2865 | 3683 | { | 3698 | { |
2866 | 3684 | .cmd = HWSIM_CMD_GET_RADIO, | 3699 | .cmd = HWSIM_CMD_GET_RADIO, |
2868 | 3685 | .policy = hwsim_genl_policy, | 3700 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
2869 | 3701 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
2870 | 3702 | #endif | ||
2871 | 3703 | |||
2872 | 3686 | .doit = hwsim_get_radio_nl, | 3704 | .doit = hwsim_get_radio_nl, |
2873 | 3687 | .dumpit = hwsim_dump_radio_nl, | 3705 | .dumpit = hwsim_dump_radio_nl, |
2874 | 3688 | }, | 3706 | }, |
2875 | @@ -3692,6 +3710,7 @@ static struct genl_family hwsim_genl_family __genl_ro_after_init = { | |||
2876 | 3692 | .name = "MAC80211_HWSIM", | 3710 | .name = "MAC80211_HWSIM", |
2877 | 3693 | .version = 1, | 3711 | .version = 1, |
2878 | 3694 | .maxattr = HWSIM_ATTR_MAX, | 3712 | .maxattr = HWSIM_ATTR_MAX, |
2879 | 3713 | .policy = hwsim_genl_policy, | ||
2880 | 3695 | .netnsok = true, | 3714 | .netnsok = true, |
2881 | 3696 | .module = THIS_MODULE, | 3715 | .module = THIS_MODULE, |
2882 | 3697 | .ops = hwsim_ops, | 3716 | .ops = hwsim_ops, |
2883 | diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c | |||
2884 | index fc29f99..ba2d64a 100644 | |||
2885 | --- a/net/mac80211/ibss.c | |||
2886 | +++ b/net/mac80211/ibss.c | |||
2887 | @@ -1193,6 +1193,7 @@ void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data *sdata, | |||
2888 | 1193 | { | 1193 | { |
2889 | 1194 | struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; | 1194 | struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; |
2890 | 1195 | struct ieee80211_chanctx_conf *chanctx_conf; | 1195 | struct ieee80211_chanctx_conf *chanctx_conf; |
2891 | 1196 | struct sk_buff *skb; | ||
2892 | 1196 | 1197 | ||
2893 | 1197 | if (ifibss->state == IEEE80211_IBSS_MLME_SEARCH) | 1198 | if (ifibss->state == IEEE80211_IBSS_MLME_SEARCH) |
2894 | 1198 | return; | 1199 | return; |
2895 | @@ -1207,9 +1208,12 @@ void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data *sdata, | |||
2896 | 1207 | return; | 1208 | return; |
2897 | 1208 | } | 1209 | } |
2898 | 1209 | 1210 | ||
2902 | 1210 | ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, addr, | 1211 | skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, addr, bssid, |
2903 | 1211 | sdata->u.ibss.ssid, sdata->u.ibss.ssid_len, | 1212 | (u32)-1, chanctx_conf->def.chan, |
2904 | 1212 | chanctx_conf->def.chan); | 1213 | ifibss->ssid, ifibss->ssid_len, NULL, 0, |
2905 | 1214 | IEEE80211_PROBE_FLAG_DIRECTED); | ||
2906 | 1215 | if (skb) | ||
2907 | 1216 | ieee80211_tx_skb(sdata, skb); | ||
2908 | 1213 | rcu_read_unlock(); | 1217 | rcu_read_unlock(); |
2909 | 1214 | } | 1218 | } |
2910 | 1215 | 1219 | ||
2911 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h | |||
2912 | index fca3b96..1c659c7 100644 | |||
2913 | --- a/net/mac80211/ieee80211_i.h | |||
2914 | +++ b/net/mac80211/ieee80211_i.h | |||
2915 | @@ -2212,7 +2212,7 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, | |||
2916 | 2212 | u32 flags); | 2212 | u32 flags); |
2917 | 2213 | struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata, | 2213 | struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata, |
2918 | 2214 | const u8 *src, const u8 *dst, | 2214 | const u8 *src, const u8 *dst, |
2920 | 2215 | u32 ratemask, | 2215 | const u8 *bssid, u32 ratemask, |
2921 | 2216 | struct ieee80211_channel *chan, | 2216 | struct ieee80211_channel *chan, |
2922 | 2217 | const u8 *ssid, size_t ssid_len, | 2217 | const u8 *ssid, size_t ssid_len, |
2923 | 2218 | const u8 *ie, size_t ie_len, | 2218 | const u8 *ie, size_t ie_len, |
2924 | diff --git a/net/mac80211/main.c b/net/mac80211/main.c | |||
2925 | index e470b33..e6f291e 100644 | |||
2926 | --- a/net/mac80211/main.c | |||
2927 | +++ b/net/mac80211/main.c | |||
2928 | @@ -422,7 +422,20 @@ ieee80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = { | |||
2929 | 422 | }, | 422 | }, |
2930 | 423 | [NL80211_IFTYPE_STATION] = { | 423 | [NL80211_IFTYPE_STATION] = { |
2931 | 424 | .tx = 0xffff, | 424 | .tx = 0xffff, |
2932 | 425 | /* | ||
2933 | 426 | * To support Pre Association Security Negotiation (PASN) while | ||
2934 | 427 | * already associated to one AP, allow user space to register to | ||
2935 | 428 | * Rx authentication frames, so that the user space logic would | ||
2936 | 429 | * be able to receive/handle authentication frames from a | ||
2937 | 430 | * different AP as part of PASN. | ||
2938 | 431 | * It is expected that user space would intelligently register | ||
2939 | 432 | * for Rx authentication frames, i.e., only when PASN is used | ||
2940 | 433 | * and configure a match filter only for PASN authentication | ||
2941 | 434 | * algorithm, as otherwise the MLME functionality of mac80211 | ||
2942 | 435 | * would be broken. | ||
2943 | 436 | */ | ||
2944 | 425 | .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | | 437 | .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | |
2945 | 438 | BIT(IEEE80211_STYPE_AUTH >> 4) | | ||
2946 | 426 | BIT(IEEE80211_STYPE_PROBE_REQ >> 4), | 439 | BIT(IEEE80211_STYPE_PROBE_REQ >> 4), |
2947 | 427 | }, | 440 | }, |
2948 | 428 | [NL80211_IFTYPE_AP] = { | 441 | [NL80211_IFTYPE_AP] = { |
2949 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c | |||
2950 | index 7791e4d..b929cb4 100644 | |||
2951 | --- a/net/mac80211/mlme.c | |||
2952 | +++ b/net/mac80211/mlme.c | |||
2953 | @@ -2480,8 +2480,8 @@ void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata, | |||
2954 | 2480 | { | 2480 | { |
2955 | 2481 | struct sk_buff *skb; | 2481 | struct sk_buff *skb; |
2956 | 2482 | 2482 | ||
2959 | 2483 | skb = ieee80211_build_probe_req(sdata, src, dst, (u32)-1, channel, | 2483 | skb = ieee80211_build_probe_req(sdata, src, dst, dst, (u32)-1, |
2960 | 2484 | ssid, ssid_len, NULL, 0, | 2484 | channel, ssid, ssid_len, NULL, 0, |
2961 | 2485 | IEEE80211_PROBE_FLAG_DIRECTED); | 2485 | IEEE80211_PROBE_FLAG_DIRECTED); |
2962 | 2486 | if (skb) | 2486 | if (skb) |
2963 | 2487 | ieee80211_tx_skb(sdata, skb); | 2487 | ieee80211_tx_skb(sdata, skb); |
2964 | @@ -2635,7 +2635,7 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw, | |||
2965 | 2635 | ssid_len = ssid[1]; | 2635 | ssid_len = ssid[1]; |
2966 | 2636 | 2636 | ||
2967 | 2637 | skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid, | 2637 | skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid, |
2969 | 2638 | (u32) -1, cbss->channel, | 2638 | cbss->bssid, (u32)-1, cbss->channel, |
2970 | 2639 | ssid + 2, ssid_len, | 2639 | ssid + 2, ssid_len, |
2971 | 2640 | NULL, 0, IEEE80211_PROBE_FLAG_DIRECTED); | 2640 | NULL, 0, IEEE80211_PROBE_FLAG_DIRECTED); |
2972 | 2641 | rcu_read_unlock(); | 2641 | rcu_read_unlock(); |
2973 | @@ -5308,7 +5308,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, | |||
2974 | 5308 | ifmgd->flags |= IEEE80211_STA_DISABLE_VHT; | 5308 | ifmgd->flags |= IEEE80211_STA_DISABLE_VHT; |
2975 | 5309 | ifmgd->flags |= IEEE80211_STA_DISABLE_HE; | 5309 | ifmgd->flags |= IEEE80211_STA_DISABLE_HE; |
2976 | 5310 | netdev_info(sdata->dev, | 5310 | netdev_info(sdata->dev, |
2978 | 5311 | "disabling HE/HT/VHT due to WEP/TKIP use\n"); | 5311 | "disabling HT/VHT/HE due to WEP/TKIP use\n"); |
2979 | 5312 | } | 5312 | } |
2980 | 5313 | } | 5313 | } |
2981 | 5314 | 5314 | ||
2982 | diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c | |||
2983 | index 565bc1e..57ba759 100644 | |||
2984 | --- a/net/mac80211/scan.c | |||
2985 | +++ b/net/mac80211/scan.c | |||
2986 | @@ -565,9 +565,8 @@ static void ieee80211_send_scan_probe_req(struct ieee80211_sub_if_data *sdata, | |||
2987 | 565 | struct sk_buff *skb; | 565 | struct sk_buff *skb; |
2988 | 566 | u32 txdata_flags = 0; | 566 | u32 txdata_flags = 0; |
2989 | 567 | 567 | ||
2993 | 568 | skb = ieee80211_build_probe_req(sdata, src, dst, ratemask, channel, | 568 | skb = ieee80211_build_probe_req(sdata, src, dst, dst, ratemask, channel, |
2994 | 569 | ssid, ssid_len, | 569 | ssid, ssid_len, ie, ie_len, flags); |
2992 | 570 | ie, ie_len, flags); | ||
2995 | 571 | 570 | ||
2996 | 572 | if (skb) { | 571 | if (skb) { |
2997 | 573 | if (flags & IEEE80211_PROBE_FLAG_RANDOM_SN) { | 572 | if (flags & IEEE80211_PROBE_FLAG_RANDOM_SN) { |
2998 | diff --git a/net/mac80211/util.c b/net/mac80211/util.c | |||
2999 | index c8f6405..2a4515c 100644 | |||
3000 | --- a/net/mac80211/util.c | |||
3001 | +++ b/net/mac80211/util.c | |||
3002 | @@ -1857,7 +1857,7 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, | |||
3003 | 1857 | 1857 | ||
3004 | 1858 | struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata, | 1858 | struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata, |
3005 | 1859 | const u8 *src, const u8 *dst, | 1859 | const u8 *src, const u8 *dst, |
3007 | 1860 | u32 ratemask, | 1860 | const u8 *bssid, u32 ratemask, |
3008 | 1861 | struct ieee80211_channel *chan, | 1861 | struct ieee80211_channel *chan, |
3009 | 1862 | const u8 *ssid, size_t ssid_len, | 1862 | const u8 *ssid, size_t ssid_len, |
3010 | 1863 | const u8 *ie, size_t ie_len, | 1863 | const u8 *ie, size_t ie_len, |
3011 | @@ -1894,11 +1894,12 @@ struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata, | |||
3012 | 1894 | rate_masks, &chandef, flags); | 1894 | rate_masks, &chandef, flags); |
3013 | 1895 | skb_put(skb, ies_len); | 1895 | skb_put(skb, ies_len); |
3014 | 1896 | 1896 | ||
3017 | 1897 | if (dst) { | 1897 | mgmt = (void *)skb->data; |
3018 | 1898 | mgmt = (struct ieee80211_mgmt *) skb->data; | 1898 | if (dst) |
3019 | 1899 | memcpy(mgmt->da, dst, ETH_ALEN); | 1899 | memcpy(mgmt->da, dst, ETH_ALEN); |
3022 | 1900 | memcpy(mgmt->bssid, dst, ETH_ALEN); | 1900 | |
3023 | 1901 | } | 1901 | if (bssid) |
3024 | 1902 | memcpy(mgmt->bssid, bssid, ETH_ALEN); | ||
3025 | 1902 | 1903 | ||
3026 | 1903 | IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; | 1904 | IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; |
3027 | 1904 | 1905 | ||
3028 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c | |||
3029 | index a3547aa..98b8f96 100644 | |||
3030 | --- a/net/wireless/nl80211.c | |||
3031 | +++ b/net/wireless/nl80211.c | |||
3032 | @@ -248,15 +248,13 @@ nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX + 1] = { | |||
3033 | 248 | static const struct nla_policy | 248 | static const struct nla_policy |
3034 | 249 | nl80211_pmsr_req_data_policy[NL80211_PMSR_TYPE_MAX + 1] = { | 249 | nl80211_pmsr_req_data_policy[NL80211_PMSR_TYPE_MAX + 1] = { |
3035 | 250 | [NL80211_PMSR_TYPE_FTM] = | 250 | [NL80211_PMSR_TYPE_FTM] = |
3038 | 251 | NLA_POLICY_NESTED(NL80211_PMSR_FTM_REQ_ATTR_MAX, | 251 | NLA_POLICY_NESTED(nl80211_pmsr_ftm_req_attr_policy), |
3037 | 252 | nl80211_pmsr_ftm_req_attr_policy), | ||
3039 | 253 | }; | 252 | }; |
3040 | 254 | 253 | ||
3041 | 255 | static const struct nla_policy | 254 | static const struct nla_policy |
3042 | 256 | nl80211_pmsr_req_attr_policy[NL80211_PMSR_REQ_ATTR_MAX + 1] = { | 255 | nl80211_pmsr_req_attr_policy[NL80211_PMSR_REQ_ATTR_MAX + 1] = { |
3043 | 257 | [NL80211_PMSR_REQ_ATTR_DATA] = | 256 | [NL80211_PMSR_REQ_ATTR_DATA] = |
3046 | 258 | NLA_POLICY_NESTED(NL80211_PMSR_TYPE_MAX, | 257 | NLA_POLICY_NESTED(nl80211_pmsr_req_data_policy), |
3045 | 259 | nl80211_pmsr_req_data_policy), | ||
3047 | 260 | [NL80211_PMSR_REQ_ATTR_GET_AP_TSF] = { .type = NLA_FLAG }, | 258 | [NL80211_PMSR_REQ_ATTR_GET_AP_TSF] = { .type = NLA_FLAG }, |
3048 | 261 | }; | 259 | }; |
3049 | 262 | 260 | ||
3050 | @@ -269,8 +267,7 @@ nl80211_psmr_peer_attr_policy[NL80211_PMSR_PEER_ATTR_MAX + 1] = { | |||
3051 | 269 | */ | 267 | */ |
3052 | 270 | [NL80211_PMSR_PEER_ATTR_CHAN] = { .type = NLA_NESTED }, | 268 | [NL80211_PMSR_PEER_ATTR_CHAN] = { .type = NLA_NESTED }, |
3053 | 271 | [NL80211_PMSR_PEER_ATTR_REQ] = | 269 | [NL80211_PMSR_PEER_ATTR_REQ] = |
3056 | 272 | NLA_POLICY_NESTED(NL80211_PMSR_REQ_ATTR_MAX, | 270 | NLA_POLICY_NESTED(nl80211_pmsr_req_attr_policy), |
3055 | 273 | nl80211_pmsr_req_attr_policy), | ||
3057 | 274 | [NL80211_PMSR_PEER_ATTR_RESP] = { .type = NLA_REJECT }, | 271 | [NL80211_PMSR_PEER_ATTR_RESP] = { .type = NLA_REJECT }, |
3058 | 275 | }; | 272 | }; |
3059 | 276 | 273 | ||
3060 | @@ -281,8 +278,7 @@ nl80211_pmsr_attr_policy[NL80211_PMSR_ATTR_MAX + 1] = { | |||
3061 | 281 | [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR] = { .type = NLA_REJECT }, | 278 | [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR] = { .type = NLA_REJECT }, |
3062 | 282 | [NL80211_PMSR_ATTR_TYPE_CAPA] = { .type = NLA_REJECT }, | 279 | [NL80211_PMSR_ATTR_TYPE_CAPA] = { .type = NLA_REJECT }, |
3063 | 283 | [NL80211_PMSR_ATTR_PEERS] = | 280 | [NL80211_PMSR_ATTR_PEERS] = |
3066 | 284 | NLA_POLICY_NESTED_ARRAY(NL80211_PMSR_PEER_ATTR_MAX, | 281 | NLA_POLICY_NESTED_ARRAY(nl80211_psmr_peer_attr_policy), |
3065 | 285 | nl80211_psmr_peer_attr_policy), | ||
3067 | 286 | }; | 282 | }; |
3068 | 287 | 283 | ||
3069 | 288 | const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { | 284 | const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { |
3070 | @@ -543,8 +539,7 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { | |||
3071 | 543 | }, | 539 | }, |
3072 | 544 | [NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1), | 540 | [NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1), |
3073 | 545 | [NL80211_ATTR_PEER_MEASUREMENTS] = | 541 | [NL80211_ATTR_PEER_MEASUREMENTS] = |
3076 | 546 | NLA_POLICY_NESTED(NL80211_PMSR_FTM_REQ_ATTR_MAX, | 542 | NLA_POLICY_NESTED(nl80211_pmsr_attr_policy), |
3075 | 547 | nl80211_pmsr_attr_policy), | ||
3077 | 548 | 543 | ||
3078 | 549 | [NL80211_ATTR_NAN_CDW_2G] = { .type = NLA_U8 }, | 544 | [NL80211_ATTR_NAN_CDW_2G] = { .type = NLA_U8 }, |
3079 | 550 | [NL80211_ATTR_NAN_CDW_5G] = { .type = NLA_U8 }, | 545 | [NL80211_ATTR_NAN_CDW_5G] = { .type = NLA_U8 }, |
3080 | @@ -13645,66 +13640,90 @@ static void nl80211_post_doit(__genl_const struct genl_ops *ops, | |||
3081 | 13645 | static __genl_const struct genl_ops nl80211_ops[] = { | 13640 | static __genl_const struct genl_ops nl80211_ops[] = { |
3082 | 13646 | { | 13641 | { |
3083 | 13647 | .cmd = NL80211_CMD_GET_WIPHY, | 13642 | .cmd = NL80211_CMD_GET_WIPHY, |
3084 | 13643 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3085 | 13644 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3086 | 13645 | #endif | ||
3087 | 13646 | |||
3088 | 13648 | .doit = nl80211_get_wiphy, | 13647 | .doit = nl80211_get_wiphy, |
3089 | 13649 | .dumpit = nl80211_dump_wiphy, | 13648 | .dumpit = nl80211_dump_wiphy, |
3090 | 13650 | .done = nl80211_dump_wiphy_done, | 13649 | .done = nl80211_dump_wiphy_done, |
3091 | 13651 | .policy = nl80211_policy, | ||
3092 | 13652 | /* can be retrieved by unprivileged users */ | 13650 | /* can be retrieved by unprivileged users */ |
3093 | 13653 | .internal_flags = NL80211_FLAG_NEED_WIPHY | | 13651 | .internal_flags = NL80211_FLAG_NEED_WIPHY | |
3094 | 13654 | NL80211_FLAG_NEED_RTNL, | 13652 | NL80211_FLAG_NEED_RTNL, |
3095 | 13655 | }, | 13653 | }, |
3096 | 13656 | { | 13654 | { |
3097 | 13657 | .cmd = NL80211_CMD_SET_WIPHY, | 13655 | .cmd = NL80211_CMD_SET_WIPHY, |
3098 | 13656 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3099 | 13657 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3100 | 13658 | #endif | ||
3101 | 13659 | |||
3102 | 13658 | .doit = nl80211_set_wiphy, | 13660 | .doit = nl80211_set_wiphy, |
3103 | 13659 | .policy = nl80211_policy, | ||
3104 | 13660 | .flags = GENL_UNS_ADMIN_PERM, | 13661 | .flags = GENL_UNS_ADMIN_PERM, |
3105 | 13661 | .internal_flags = NL80211_FLAG_NEED_RTNL, | 13662 | .internal_flags = NL80211_FLAG_NEED_RTNL, |
3106 | 13662 | }, | 13663 | }, |
3107 | 13663 | { | 13664 | { |
3108 | 13664 | .cmd = NL80211_CMD_GET_INTERFACE, | 13665 | .cmd = NL80211_CMD_GET_INTERFACE, |
3109 | 13666 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3110 | 13667 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3111 | 13668 | #endif | ||
3112 | 13669 | |||
3113 | 13665 | .doit = nl80211_get_interface, | 13670 | .doit = nl80211_get_interface, |
3114 | 13666 | .dumpit = nl80211_dump_interface, | 13671 | .dumpit = nl80211_dump_interface, |
3115 | 13667 | .policy = nl80211_policy, | ||
3116 | 13668 | /* can be retrieved by unprivileged users */ | 13672 | /* can be retrieved by unprivileged users */ |
3117 | 13669 | .internal_flags = NL80211_FLAG_NEED_WDEV | | 13673 | .internal_flags = NL80211_FLAG_NEED_WDEV | |
3118 | 13670 | NL80211_FLAG_NEED_RTNL, | 13674 | NL80211_FLAG_NEED_RTNL, |
3119 | 13671 | }, | 13675 | }, |
3120 | 13672 | { | 13676 | { |
3121 | 13673 | .cmd = NL80211_CMD_SET_INTERFACE, | 13677 | .cmd = NL80211_CMD_SET_INTERFACE, |
3122 | 13678 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3123 | 13679 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3124 | 13680 | #endif | ||
3125 | 13681 | |||
3126 | 13674 | .doit = nl80211_set_interface, | 13682 | .doit = nl80211_set_interface, |
3127 | 13675 | .policy = nl80211_policy, | ||
3128 | 13676 | .flags = GENL_UNS_ADMIN_PERM, | 13683 | .flags = GENL_UNS_ADMIN_PERM, |
3129 | 13677 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 13684 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
3130 | 13678 | NL80211_FLAG_NEED_RTNL, | 13685 | NL80211_FLAG_NEED_RTNL, |
3131 | 13679 | }, | 13686 | }, |
3132 | 13680 | { | 13687 | { |
3133 | 13681 | .cmd = NL80211_CMD_NEW_INTERFACE, | 13688 | .cmd = NL80211_CMD_NEW_INTERFACE, |
3134 | 13689 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3135 | 13690 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3136 | 13691 | #endif | ||
3137 | 13692 | |||
3138 | 13682 | .doit = nl80211_new_interface, | 13693 | .doit = nl80211_new_interface, |
3139 | 13683 | .policy = nl80211_policy, | ||
3140 | 13684 | .flags = GENL_UNS_ADMIN_PERM, | 13694 | .flags = GENL_UNS_ADMIN_PERM, |
3141 | 13685 | .internal_flags = NL80211_FLAG_NEED_WIPHY | | 13695 | .internal_flags = NL80211_FLAG_NEED_WIPHY | |
3142 | 13686 | NL80211_FLAG_NEED_RTNL, | 13696 | NL80211_FLAG_NEED_RTNL, |
3143 | 13687 | }, | 13697 | }, |
3144 | 13688 | { | 13698 | { |
3145 | 13689 | .cmd = NL80211_CMD_DEL_INTERFACE, | 13699 | .cmd = NL80211_CMD_DEL_INTERFACE, |
3146 | 13700 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3147 | 13701 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3148 | 13702 | #endif | ||
3149 | 13703 | |||
3150 | 13690 | .doit = nl80211_del_interface, | 13704 | .doit = nl80211_del_interface, |
3151 | 13691 | .policy = nl80211_policy, | ||
3152 | 13692 | .flags = GENL_UNS_ADMIN_PERM, | 13705 | .flags = GENL_UNS_ADMIN_PERM, |
3153 | 13693 | .internal_flags = NL80211_FLAG_NEED_WDEV | | 13706 | .internal_flags = NL80211_FLAG_NEED_WDEV | |
3154 | 13694 | NL80211_FLAG_NEED_RTNL, | 13707 | NL80211_FLAG_NEED_RTNL, |
3155 | 13695 | }, | 13708 | }, |
3156 | 13696 | { | 13709 | { |
3157 | 13697 | .cmd = NL80211_CMD_GET_KEY, | 13710 | .cmd = NL80211_CMD_GET_KEY, |
3158 | 13711 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3159 | 13712 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3160 | 13713 | #endif | ||
3161 | 13714 | |||
3162 | 13698 | .doit = nl80211_get_key, | 13715 | .doit = nl80211_get_key, |
3163 | 13699 | .policy = nl80211_policy, | ||
3164 | 13700 | .flags = GENL_UNS_ADMIN_PERM, | 13716 | .flags = GENL_UNS_ADMIN_PERM, |
3165 | 13701 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13717 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3166 | 13702 | NL80211_FLAG_NEED_RTNL, | 13718 | NL80211_FLAG_NEED_RTNL, |
3167 | 13703 | }, | 13719 | }, |
3168 | 13704 | { | 13720 | { |
3169 | 13705 | .cmd = NL80211_CMD_SET_KEY, | 13721 | .cmd = NL80211_CMD_SET_KEY, |
3170 | 13722 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3171 | 13723 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3172 | 13724 | #endif | ||
3173 | 13725 | |||
3174 | 13706 | .doit = nl80211_set_key, | 13726 | .doit = nl80211_set_key, |
3175 | 13707 | .policy = nl80211_policy, | ||
3176 | 13708 | .flags = GENL_UNS_ADMIN_PERM, | 13727 | .flags = GENL_UNS_ADMIN_PERM, |
3177 | 13709 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13728 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3178 | 13710 | NL80211_FLAG_NEED_RTNL | | 13729 | NL80211_FLAG_NEED_RTNL | |
3179 | @@ -13712,8 +13731,11 @@ static __genl_const struct genl_ops nl80211_ops[] = { | |||
3180 | 13712 | }, | 13731 | }, |
3181 | 13713 | { | 13732 | { |
3182 | 13714 | .cmd = NL80211_CMD_NEW_KEY, | 13733 | .cmd = NL80211_CMD_NEW_KEY, |
3183 | 13734 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3184 | 13735 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3185 | 13736 | #endif | ||
3186 | 13737 | |||
3187 | 13715 | .doit = nl80211_new_key, | 13738 | .doit = nl80211_new_key, |
3188 | 13716 | .policy = nl80211_policy, | ||
3189 | 13717 | .flags = GENL_UNS_ADMIN_PERM, | 13739 | .flags = GENL_UNS_ADMIN_PERM, |
3190 | 13718 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13740 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3191 | 13719 | NL80211_FLAG_NEED_RTNL | | 13741 | NL80211_FLAG_NEED_RTNL | |
3192 | @@ -13721,15 +13743,21 @@ static __genl_const struct genl_ops nl80211_ops[] = { | |||
3193 | 13721 | }, | 13743 | }, |
3194 | 13722 | { | 13744 | { |
3195 | 13723 | .cmd = NL80211_CMD_DEL_KEY, | 13745 | .cmd = NL80211_CMD_DEL_KEY, |
3196 | 13746 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3197 | 13747 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3198 | 13748 | #endif | ||
3199 | 13749 | |||
3200 | 13724 | .doit = nl80211_del_key, | 13750 | .doit = nl80211_del_key, |
3201 | 13725 | .policy = nl80211_policy, | ||
3202 | 13726 | .flags = GENL_UNS_ADMIN_PERM, | 13751 | .flags = GENL_UNS_ADMIN_PERM, |
3203 | 13727 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13752 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3204 | 13728 | NL80211_FLAG_NEED_RTNL, | 13753 | NL80211_FLAG_NEED_RTNL, |
3205 | 13729 | }, | 13754 | }, |
3206 | 13730 | { | 13755 | { |
3207 | 13731 | .cmd = NL80211_CMD_SET_BEACON, | 13756 | .cmd = NL80211_CMD_SET_BEACON, |
3209 | 13732 | .policy = nl80211_policy, | 13757 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
3210 | 13758 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3211 | 13759 | #endif | ||
3212 | 13760 | |||
3213 | 13733 | .flags = GENL_UNS_ADMIN_PERM, | 13761 | .flags = GENL_UNS_ADMIN_PERM, |
3214 | 13734 | .doit = nl80211_set_beacon, | 13762 | .doit = nl80211_set_beacon, |
3215 | 13735 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13763 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3216 | @@ -13737,7 +13765,10 @@ static __genl_const struct genl_ops nl80211_ops[] = { | |||
3217 | 13737 | }, | 13765 | }, |
3218 | 13738 | { | 13766 | { |
3219 | 13739 | .cmd = NL80211_CMD_START_AP, | 13767 | .cmd = NL80211_CMD_START_AP, |
3221 | 13740 | .policy = nl80211_policy, | 13768 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
3222 | 13769 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3223 | 13770 | #endif | ||
3224 | 13771 | |||
3225 | 13741 | .flags = GENL_UNS_ADMIN_PERM, | 13772 | .flags = GENL_UNS_ADMIN_PERM, |
3226 | 13742 | .doit = nl80211_start_ap, | 13773 | .doit = nl80211_start_ap, |
3227 | 13743 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13774 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3228 | @@ -13745,7 +13776,10 @@ static __genl_const struct genl_ops nl80211_ops[] = { | |||
3229 | 13745 | }, | 13776 | }, |
3230 | 13746 | { | 13777 | { |
3231 | 13747 | .cmd = NL80211_CMD_STOP_AP, | 13778 | .cmd = NL80211_CMD_STOP_AP, |
3233 | 13748 | .policy = nl80211_policy, | 13779 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
3234 | 13780 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3235 | 13781 | #endif | ||
3236 | 13782 | |||
3237 | 13749 | .flags = GENL_UNS_ADMIN_PERM, | 13783 | .flags = GENL_UNS_ADMIN_PERM, |
3238 | 13750 | .doit = nl80211_stop_ap, | 13784 | .doit = nl80211_stop_ap, |
3239 | 13751 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13785 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3240 | @@ -13753,172 +13787,238 @@ static __genl_const struct genl_ops nl80211_ops[] = { | |||
3241 | 13753 | }, | 13787 | }, |
3242 | 13754 | { | 13788 | { |
3243 | 13755 | .cmd = NL80211_CMD_GET_STATION, | 13789 | .cmd = NL80211_CMD_GET_STATION, |
3244 | 13790 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3245 | 13791 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3246 | 13792 | #endif | ||
3247 | 13793 | |||
3248 | 13756 | .doit = nl80211_get_station, | 13794 | .doit = nl80211_get_station, |
3249 | 13757 | .dumpit = nl80211_dump_station, | 13795 | .dumpit = nl80211_dump_station, |
3250 | 13758 | .policy = nl80211_policy, | ||
3251 | 13759 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 13796 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
3252 | 13760 | NL80211_FLAG_NEED_RTNL, | 13797 | NL80211_FLAG_NEED_RTNL, |
3253 | 13761 | }, | 13798 | }, |
3254 | 13762 | { | 13799 | { |
3255 | 13763 | .cmd = NL80211_CMD_SET_STATION, | 13800 | .cmd = NL80211_CMD_SET_STATION, |
3256 | 13801 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3257 | 13802 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3258 | 13803 | #endif | ||
3259 | 13804 | |||
3260 | 13764 | .doit = nl80211_set_station, | 13805 | .doit = nl80211_set_station, |
3261 | 13765 | .policy = nl80211_policy, | ||
3262 | 13766 | .flags = GENL_UNS_ADMIN_PERM, | 13806 | .flags = GENL_UNS_ADMIN_PERM, |
3263 | 13767 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13807 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3264 | 13768 | NL80211_FLAG_NEED_RTNL, | 13808 | NL80211_FLAG_NEED_RTNL, |
3265 | 13769 | }, | 13809 | }, |
3266 | 13770 | { | 13810 | { |
3267 | 13771 | .cmd = NL80211_CMD_NEW_STATION, | 13811 | .cmd = NL80211_CMD_NEW_STATION, |
3268 | 13812 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3269 | 13813 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3270 | 13814 | #endif | ||
3271 | 13815 | |||
3272 | 13772 | .doit = nl80211_new_station, | 13816 | .doit = nl80211_new_station, |
3273 | 13773 | .policy = nl80211_policy, | ||
3274 | 13774 | .flags = GENL_UNS_ADMIN_PERM, | 13817 | .flags = GENL_UNS_ADMIN_PERM, |
3275 | 13775 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13818 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3276 | 13776 | NL80211_FLAG_NEED_RTNL, | 13819 | NL80211_FLAG_NEED_RTNL, |
3277 | 13777 | }, | 13820 | }, |
3278 | 13778 | { | 13821 | { |
3279 | 13779 | .cmd = NL80211_CMD_DEL_STATION, | 13822 | .cmd = NL80211_CMD_DEL_STATION, |
3280 | 13823 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3281 | 13824 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3282 | 13825 | #endif | ||
3283 | 13826 | |||
3284 | 13780 | .doit = nl80211_del_station, | 13827 | .doit = nl80211_del_station, |
3285 | 13781 | .policy = nl80211_policy, | ||
3286 | 13782 | .flags = GENL_UNS_ADMIN_PERM, | 13828 | .flags = GENL_UNS_ADMIN_PERM, |
3287 | 13783 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13829 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3288 | 13784 | NL80211_FLAG_NEED_RTNL, | 13830 | NL80211_FLAG_NEED_RTNL, |
3289 | 13785 | }, | 13831 | }, |
3290 | 13786 | { | 13832 | { |
3291 | 13787 | .cmd = NL80211_CMD_GET_MPATH, | 13833 | .cmd = NL80211_CMD_GET_MPATH, |
3292 | 13834 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3293 | 13835 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3294 | 13836 | #endif | ||
3295 | 13837 | |||
3296 | 13788 | .doit = nl80211_get_mpath, | 13838 | .doit = nl80211_get_mpath, |
3297 | 13789 | .dumpit = nl80211_dump_mpath, | 13839 | .dumpit = nl80211_dump_mpath, |
3298 | 13790 | .policy = nl80211_policy, | ||
3299 | 13791 | .flags = GENL_UNS_ADMIN_PERM, | 13840 | .flags = GENL_UNS_ADMIN_PERM, |
3300 | 13792 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13841 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3301 | 13793 | NL80211_FLAG_NEED_RTNL, | 13842 | NL80211_FLAG_NEED_RTNL, |
3302 | 13794 | }, | 13843 | }, |
3303 | 13795 | { | 13844 | { |
3304 | 13796 | .cmd = NL80211_CMD_GET_MPP, | 13845 | .cmd = NL80211_CMD_GET_MPP, |
3305 | 13846 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3306 | 13847 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3307 | 13848 | #endif | ||
3308 | 13849 | |||
3309 | 13797 | .doit = nl80211_get_mpp, | 13850 | .doit = nl80211_get_mpp, |
3310 | 13798 | .dumpit = nl80211_dump_mpp, | 13851 | .dumpit = nl80211_dump_mpp, |
3311 | 13799 | .policy = nl80211_policy, | ||
3312 | 13800 | .flags = GENL_UNS_ADMIN_PERM, | 13852 | .flags = GENL_UNS_ADMIN_PERM, |
3313 | 13801 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13853 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3314 | 13802 | NL80211_FLAG_NEED_RTNL, | 13854 | NL80211_FLAG_NEED_RTNL, |
3315 | 13803 | }, | 13855 | }, |
3316 | 13804 | { | 13856 | { |
3317 | 13805 | .cmd = NL80211_CMD_SET_MPATH, | 13857 | .cmd = NL80211_CMD_SET_MPATH, |
3318 | 13858 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3319 | 13859 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3320 | 13860 | #endif | ||
3321 | 13861 | |||
3322 | 13806 | .doit = nl80211_set_mpath, | 13862 | .doit = nl80211_set_mpath, |
3323 | 13807 | .policy = nl80211_policy, | ||
3324 | 13808 | .flags = GENL_UNS_ADMIN_PERM, | 13863 | .flags = GENL_UNS_ADMIN_PERM, |
3325 | 13809 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13864 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3326 | 13810 | NL80211_FLAG_NEED_RTNL, | 13865 | NL80211_FLAG_NEED_RTNL, |
3327 | 13811 | }, | 13866 | }, |
3328 | 13812 | { | 13867 | { |
3329 | 13813 | .cmd = NL80211_CMD_NEW_MPATH, | 13868 | .cmd = NL80211_CMD_NEW_MPATH, |
3330 | 13869 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3331 | 13870 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3332 | 13871 | #endif | ||
3333 | 13872 | |||
3334 | 13814 | .doit = nl80211_new_mpath, | 13873 | .doit = nl80211_new_mpath, |
3335 | 13815 | .policy = nl80211_policy, | ||
3336 | 13816 | .flags = GENL_UNS_ADMIN_PERM, | 13874 | .flags = GENL_UNS_ADMIN_PERM, |
3337 | 13817 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13875 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3338 | 13818 | NL80211_FLAG_NEED_RTNL, | 13876 | NL80211_FLAG_NEED_RTNL, |
3339 | 13819 | }, | 13877 | }, |
3340 | 13820 | { | 13878 | { |
3341 | 13821 | .cmd = NL80211_CMD_DEL_MPATH, | 13879 | .cmd = NL80211_CMD_DEL_MPATH, |
3342 | 13880 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3343 | 13881 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3344 | 13882 | #endif | ||
3345 | 13883 | |||
3346 | 13822 | .doit = nl80211_del_mpath, | 13884 | .doit = nl80211_del_mpath, |
3347 | 13823 | .policy = nl80211_policy, | ||
3348 | 13824 | .flags = GENL_UNS_ADMIN_PERM, | 13885 | .flags = GENL_UNS_ADMIN_PERM, |
3349 | 13825 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13886 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3350 | 13826 | NL80211_FLAG_NEED_RTNL, | 13887 | NL80211_FLAG_NEED_RTNL, |
3351 | 13827 | }, | 13888 | }, |
3352 | 13828 | { | 13889 | { |
3353 | 13829 | .cmd = NL80211_CMD_SET_BSS, | 13890 | .cmd = NL80211_CMD_SET_BSS, |
3354 | 13891 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3355 | 13892 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3356 | 13893 | #endif | ||
3357 | 13894 | |||
3358 | 13830 | .doit = nl80211_set_bss, | 13895 | .doit = nl80211_set_bss, |
3359 | 13831 | .policy = nl80211_policy, | ||
3360 | 13832 | .flags = GENL_UNS_ADMIN_PERM, | 13896 | .flags = GENL_UNS_ADMIN_PERM, |
3361 | 13833 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13897 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3362 | 13834 | NL80211_FLAG_NEED_RTNL, | 13898 | NL80211_FLAG_NEED_RTNL, |
3363 | 13835 | }, | 13899 | }, |
3364 | 13836 | { | 13900 | { |
3365 | 13837 | .cmd = NL80211_CMD_GET_REG, | 13901 | .cmd = NL80211_CMD_GET_REG, |
3366 | 13902 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3367 | 13903 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3368 | 13904 | #endif | ||
3369 | 13905 | |||
3370 | 13838 | .doit = nl80211_get_reg_do, | 13906 | .doit = nl80211_get_reg_do, |
3371 | 13839 | .dumpit = nl80211_get_reg_dump, | 13907 | .dumpit = nl80211_get_reg_dump, |
3372 | 13840 | .policy = nl80211_policy, | ||
3373 | 13841 | .internal_flags = NL80211_FLAG_NEED_RTNL, | 13908 | .internal_flags = NL80211_FLAG_NEED_RTNL, |
3374 | 13842 | /* can be retrieved by unprivileged users */ | 13909 | /* can be retrieved by unprivileged users */ |
3375 | 13843 | }, | 13910 | }, |
3376 | 13844 | #ifdef CPTCFG_CFG80211_CRDA_SUPPORT | 13911 | #ifdef CPTCFG_CFG80211_CRDA_SUPPORT |
3377 | 13845 | { | 13912 | { |
3378 | 13846 | .cmd = NL80211_CMD_SET_REG, | 13913 | .cmd = NL80211_CMD_SET_REG, |
3379 | 13914 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3380 | 13915 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3381 | 13916 | #endif | ||
3382 | 13917 | |||
3383 | 13847 | .doit = nl80211_set_reg, | 13918 | .doit = nl80211_set_reg, |
3384 | 13848 | .policy = nl80211_policy, | ||
3385 | 13849 | .flags = GENL_ADMIN_PERM, | 13919 | .flags = GENL_ADMIN_PERM, |
3386 | 13850 | .internal_flags = NL80211_FLAG_NEED_RTNL, | 13920 | .internal_flags = NL80211_FLAG_NEED_RTNL, |
3387 | 13851 | }, | 13921 | }, |
3388 | 13852 | #endif | 13922 | #endif |
3389 | 13853 | { | 13923 | { |
3390 | 13854 | .cmd = NL80211_CMD_REQ_SET_REG, | 13924 | .cmd = NL80211_CMD_REQ_SET_REG, |
3391 | 13925 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3392 | 13926 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3393 | 13927 | #endif | ||
3394 | 13928 | |||
3395 | 13855 | .doit = nl80211_req_set_reg, | 13929 | .doit = nl80211_req_set_reg, |
3396 | 13856 | .policy = nl80211_policy, | ||
3397 | 13857 | .flags = GENL_ADMIN_PERM, | 13930 | .flags = GENL_ADMIN_PERM, |
3398 | 13858 | }, | 13931 | }, |
3399 | 13859 | { | 13932 | { |
3400 | 13860 | .cmd = NL80211_CMD_RELOAD_REGDB, | 13933 | .cmd = NL80211_CMD_RELOAD_REGDB, |
3401 | 13934 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3402 | 13935 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3403 | 13936 | #endif | ||
3404 | 13937 | |||
3405 | 13861 | .doit = nl80211_reload_regdb, | 13938 | .doit = nl80211_reload_regdb, |
3406 | 13862 | .policy = nl80211_policy, | ||
3407 | 13863 | .flags = GENL_ADMIN_PERM, | 13939 | .flags = GENL_ADMIN_PERM, |
3408 | 13864 | }, | 13940 | }, |
3409 | 13865 | { | 13941 | { |
3410 | 13866 | .cmd = NL80211_CMD_GET_MESH_CONFIG, | 13942 | .cmd = NL80211_CMD_GET_MESH_CONFIG, |
3411 | 13943 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3412 | 13944 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3413 | 13945 | #endif | ||
3414 | 13946 | |||
3415 | 13867 | .doit = nl80211_get_mesh_config, | 13947 | .doit = nl80211_get_mesh_config, |
3416 | 13868 | .policy = nl80211_policy, | ||
3417 | 13869 | /* can be retrieved by unprivileged users */ | 13948 | /* can be retrieved by unprivileged users */ |
3418 | 13870 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13949 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3419 | 13871 | NL80211_FLAG_NEED_RTNL, | 13950 | NL80211_FLAG_NEED_RTNL, |
3420 | 13872 | }, | 13951 | }, |
3421 | 13873 | { | 13952 | { |
3422 | 13874 | .cmd = NL80211_CMD_SET_MESH_CONFIG, | 13953 | .cmd = NL80211_CMD_SET_MESH_CONFIG, |
3423 | 13954 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3424 | 13955 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3425 | 13956 | #endif | ||
3426 | 13957 | |||
3427 | 13875 | .doit = nl80211_update_mesh_config, | 13958 | .doit = nl80211_update_mesh_config, |
3428 | 13876 | .policy = nl80211_policy, | ||
3429 | 13877 | .flags = GENL_UNS_ADMIN_PERM, | 13959 | .flags = GENL_UNS_ADMIN_PERM, |
3430 | 13878 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 13960 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3431 | 13879 | NL80211_FLAG_NEED_RTNL, | 13961 | NL80211_FLAG_NEED_RTNL, |
3432 | 13880 | }, | 13962 | }, |
3433 | 13881 | { | 13963 | { |
3434 | 13882 | .cmd = NL80211_CMD_TRIGGER_SCAN, | 13964 | .cmd = NL80211_CMD_TRIGGER_SCAN, |
3435 | 13965 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3436 | 13966 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3437 | 13967 | #endif | ||
3438 | 13968 | |||
3439 | 13883 | .doit = nl80211_trigger_scan, | 13969 | .doit = nl80211_trigger_scan, |
3440 | 13884 | .policy = nl80211_policy, | ||
3441 | 13885 | .flags = GENL_UNS_ADMIN_PERM, | 13970 | .flags = GENL_UNS_ADMIN_PERM, |
3442 | 13886 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 13971 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
3443 | 13887 | NL80211_FLAG_NEED_RTNL, | 13972 | NL80211_FLAG_NEED_RTNL, |
3444 | 13888 | }, | 13973 | }, |
3445 | 13889 | { | 13974 | { |
3446 | 13890 | .cmd = NL80211_CMD_ABORT_SCAN, | 13975 | .cmd = NL80211_CMD_ABORT_SCAN, |
3447 | 13976 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3448 | 13977 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3449 | 13978 | #endif | ||
3450 | 13979 | |||
3451 | 13891 | .doit = nl80211_abort_scan, | 13980 | .doit = nl80211_abort_scan, |
3452 | 13892 | .policy = nl80211_policy, | ||
3453 | 13893 | .flags = GENL_UNS_ADMIN_PERM, | 13981 | .flags = GENL_UNS_ADMIN_PERM, |
3454 | 13894 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 13982 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
3455 | 13895 | NL80211_FLAG_NEED_RTNL, | 13983 | NL80211_FLAG_NEED_RTNL, |
3456 | 13896 | }, | 13984 | }, |
3457 | 13897 | { | 13985 | { |
3458 | 13898 | .cmd = NL80211_CMD_GET_SCAN, | 13986 | .cmd = NL80211_CMD_GET_SCAN, |
3460 | 13899 | .policy = nl80211_policy, | 13987 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
3461 | 13988 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3462 | 13989 | #endif | ||
3463 | 13990 | |||
3464 | 13900 | .dumpit = nl80211_dump_scan, | 13991 | .dumpit = nl80211_dump_scan, |
3465 | 13901 | }, | 13992 | }, |
3466 | 13902 | { | 13993 | { |
3467 | 13903 | .cmd = NL80211_CMD_START_SCHED_SCAN, | 13994 | .cmd = NL80211_CMD_START_SCHED_SCAN, |
3468 | 13995 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3469 | 13996 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3470 | 13997 | #endif | ||
3471 | 13998 | |||
3472 | 13904 | .doit = nl80211_start_sched_scan, | 13999 | .doit = nl80211_start_sched_scan, |
3473 | 13905 | .policy = nl80211_policy, | ||
3474 | 13906 | .flags = GENL_UNS_ADMIN_PERM, | 14000 | .flags = GENL_UNS_ADMIN_PERM, |
3475 | 13907 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14001 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3476 | 13908 | NL80211_FLAG_NEED_RTNL, | 14002 | NL80211_FLAG_NEED_RTNL, |
3477 | 13909 | }, | 14003 | }, |
3478 | 13910 | { | 14004 | { |
3479 | 13911 | .cmd = NL80211_CMD_STOP_SCHED_SCAN, | 14005 | .cmd = NL80211_CMD_STOP_SCHED_SCAN, |
3480 | 14006 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3481 | 14007 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3482 | 14008 | #endif | ||
3483 | 14009 | |||
3484 | 13912 | .doit = nl80211_stop_sched_scan, | 14010 | .doit = nl80211_stop_sched_scan, |
3485 | 13913 | .policy = nl80211_policy, | ||
3486 | 13914 | .flags = GENL_UNS_ADMIN_PERM, | 14011 | .flags = GENL_UNS_ADMIN_PERM, |
3487 | 13915 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14012 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3488 | 13916 | NL80211_FLAG_NEED_RTNL, | 14013 | NL80211_FLAG_NEED_RTNL, |
3489 | 13917 | }, | 14014 | }, |
3490 | 13918 | { | 14015 | { |
3491 | 13919 | .cmd = NL80211_CMD_AUTHENTICATE, | 14016 | .cmd = NL80211_CMD_AUTHENTICATE, |
3492 | 14017 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3493 | 14018 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3494 | 14019 | #endif | ||
3495 | 14020 | |||
3496 | 13920 | .doit = nl80211_authenticate, | 14021 | .doit = nl80211_authenticate, |
3497 | 13921 | .policy = nl80211_policy, | ||
3498 | 13922 | .flags = GENL_UNS_ADMIN_PERM, | 14022 | .flags = GENL_UNS_ADMIN_PERM, |
3499 | 13923 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14023 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3500 | 13924 | NL80211_FLAG_NEED_RTNL | | 14024 | NL80211_FLAG_NEED_RTNL | |
3501 | @@ -13926,40 +14026,55 @@ static __genl_const struct genl_ops nl80211_ops[] = { | |||
3502 | 13926 | }, | 14026 | }, |
3503 | 13927 | { | 14027 | { |
3504 | 13928 | .cmd = NL80211_CMD_ASSOCIATE, | 14028 | .cmd = NL80211_CMD_ASSOCIATE, |
3505 | 14029 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3506 | 14030 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3507 | 14031 | #endif | ||
3508 | 14032 | |||
3509 | 13929 | .doit = nl80211_associate, | 14033 | .doit = nl80211_associate, |
3510 | 13930 | .policy = nl80211_policy, | ||
3511 | 13931 | .flags = GENL_UNS_ADMIN_PERM, | 14034 | .flags = GENL_UNS_ADMIN_PERM, |
3512 | 13932 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14035 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3513 | 13933 | NL80211_FLAG_NEED_RTNL, | 14036 | NL80211_FLAG_NEED_RTNL, |
3514 | 13934 | }, | 14037 | }, |
3515 | 13935 | { | 14038 | { |
3516 | 13936 | .cmd = NL80211_CMD_DEAUTHENTICATE, | 14039 | .cmd = NL80211_CMD_DEAUTHENTICATE, |
3517 | 14040 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3518 | 14041 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3519 | 14042 | #endif | ||
3520 | 14043 | |||
3521 | 13937 | .doit = nl80211_deauthenticate, | 14044 | .doit = nl80211_deauthenticate, |
3522 | 13938 | .policy = nl80211_policy, | ||
3523 | 13939 | .flags = GENL_UNS_ADMIN_PERM, | 14045 | .flags = GENL_UNS_ADMIN_PERM, |
3524 | 13940 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14046 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3525 | 13941 | NL80211_FLAG_NEED_RTNL, | 14047 | NL80211_FLAG_NEED_RTNL, |
3526 | 13942 | }, | 14048 | }, |
3527 | 13943 | { | 14049 | { |
3528 | 13944 | .cmd = NL80211_CMD_DISASSOCIATE, | 14050 | .cmd = NL80211_CMD_DISASSOCIATE, |
3529 | 14051 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3530 | 14052 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3531 | 14053 | #endif | ||
3532 | 14054 | |||
3533 | 13945 | .doit = nl80211_disassociate, | 14055 | .doit = nl80211_disassociate, |
3534 | 13946 | .policy = nl80211_policy, | ||
3535 | 13947 | .flags = GENL_UNS_ADMIN_PERM, | 14056 | .flags = GENL_UNS_ADMIN_PERM, |
3536 | 13948 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14057 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3537 | 13949 | NL80211_FLAG_NEED_RTNL, | 14058 | NL80211_FLAG_NEED_RTNL, |
3538 | 13950 | }, | 14059 | }, |
3539 | 13951 | { | 14060 | { |
3540 | 13952 | .cmd = NL80211_CMD_JOIN_IBSS, | 14061 | .cmd = NL80211_CMD_JOIN_IBSS, |
3541 | 14062 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3542 | 14063 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3543 | 14064 | #endif | ||
3544 | 14065 | |||
3545 | 13953 | .doit = nl80211_join_ibss, | 14066 | .doit = nl80211_join_ibss, |
3546 | 13954 | .policy = nl80211_policy, | ||
3547 | 13955 | .flags = GENL_UNS_ADMIN_PERM, | 14067 | .flags = GENL_UNS_ADMIN_PERM, |
3548 | 13956 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14068 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3549 | 13957 | NL80211_FLAG_NEED_RTNL, | 14069 | NL80211_FLAG_NEED_RTNL, |
3550 | 13958 | }, | 14070 | }, |
3551 | 13959 | { | 14071 | { |
3552 | 13960 | .cmd = NL80211_CMD_LEAVE_IBSS, | 14072 | .cmd = NL80211_CMD_LEAVE_IBSS, |
3553 | 14073 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3554 | 14074 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3555 | 14075 | #endif | ||
3556 | 14076 | |||
3557 | 13961 | .doit = nl80211_leave_ibss, | 14077 | .doit = nl80211_leave_ibss, |
3558 | 13962 | .policy = nl80211_policy, | ||
3559 | 13963 | .flags = GENL_UNS_ADMIN_PERM, | 14078 | .flags = GENL_UNS_ADMIN_PERM, |
3560 | 13964 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14079 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3561 | 13965 | NL80211_FLAG_NEED_RTNL, | 14080 | NL80211_FLAG_NEED_RTNL, |
3562 | @@ -13967,9 +14082,12 @@ static __genl_const struct genl_ops nl80211_ops[] = { | |||
3563 | 13967 | #ifdef CPTCFG_NL80211_TESTMODE | 14082 | #ifdef CPTCFG_NL80211_TESTMODE |
3564 | 13968 | { | 14083 | { |
3565 | 13969 | .cmd = NL80211_CMD_TESTMODE, | 14084 | .cmd = NL80211_CMD_TESTMODE, |
3566 | 14085 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3567 | 14086 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3568 | 14087 | #endif | ||
3569 | 14088 | |||
3570 | 13970 | .doit = nl80211_testmode_do, | 14089 | .doit = nl80211_testmode_do, |
3571 | 13971 | .dumpit = nl80211_testmode_dump, | 14090 | .dumpit = nl80211_testmode_dump, |
3572 | 13972 | .policy = nl80211_policy, | ||
3573 | 13973 | .flags = GENL_UNS_ADMIN_PERM, | 14091 | .flags = GENL_UNS_ADMIN_PERM, |
3574 | 13974 | .internal_flags = NL80211_FLAG_NEED_WIPHY | | 14092 | .internal_flags = NL80211_FLAG_NEED_WIPHY | |
3575 | 13975 | NL80211_FLAG_NEED_RTNL, | 14093 | NL80211_FLAG_NEED_RTNL, |
3576 | @@ -13977,181 +14095,250 @@ static __genl_const struct genl_ops nl80211_ops[] = { | |||
3577 | 13977 | #endif | 14095 | #endif |
3578 | 13978 | { | 14096 | { |
3579 | 13979 | .cmd = NL80211_CMD_CONNECT, | 14097 | .cmd = NL80211_CMD_CONNECT, |
3580 | 14098 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3581 | 14099 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3582 | 14100 | #endif | ||
3583 | 14101 | |||
3584 | 13980 | .doit = nl80211_connect, | 14102 | .doit = nl80211_connect, |
3585 | 13981 | .policy = nl80211_policy, | ||
3586 | 13982 | .flags = GENL_UNS_ADMIN_PERM, | 14103 | .flags = GENL_UNS_ADMIN_PERM, |
3587 | 13983 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14104 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3588 | 13984 | NL80211_FLAG_NEED_RTNL, | 14105 | NL80211_FLAG_NEED_RTNL, |
3589 | 13985 | }, | 14106 | }, |
3590 | 13986 | { | 14107 | { |
3591 | 13987 | .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, | 14108 | .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, |
3592 | 14109 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3593 | 14110 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3594 | 14111 | #endif | ||
3595 | 14112 | |||
3596 | 13988 | .doit = nl80211_update_connect_params, | 14113 | .doit = nl80211_update_connect_params, |
3597 | 13989 | .policy = nl80211_policy, | ||
3598 | 13990 | .flags = GENL_ADMIN_PERM, | 14114 | .flags = GENL_ADMIN_PERM, |
3599 | 13991 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14115 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3600 | 13992 | NL80211_FLAG_NEED_RTNL, | 14116 | NL80211_FLAG_NEED_RTNL, |
3601 | 13993 | }, | 14117 | }, |
3602 | 13994 | { | 14118 | { |
3603 | 13995 | .cmd = NL80211_CMD_DISCONNECT, | 14119 | .cmd = NL80211_CMD_DISCONNECT, |
3604 | 14120 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3605 | 14121 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3606 | 14122 | #endif | ||
3607 | 14123 | |||
3608 | 13996 | .doit = nl80211_disconnect, | 14124 | .doit = nl80211_disconnect, |
3609 | 13997 | .policy = nl80211_policy, | ||
3610 | 13998 | .flags = GENL_UNS_ADMIN_PERM, | 14125 | .flags = GENL_UNS_ADMIN_PERM, |
3611 | 13999 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14126 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3612 | 14000 | NL80211_FLAG_NEED_RTNL, | 14127 | NL80211_FLAG_NEED_RTNL, |
3613 | 14001 | }, | 14128 | }, |
3614 | 14002 | { | 14129 | { |
3615 | 14003 | .cmd = NL80211_CMD_SET_WIPHY_NETNS, | 14130 | .cmd = NL80211_CMD_SET_WIPHY_NETNS, |
3616 | 14131 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3617 | 14132 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3618 | 14133 | #endif | ||
3619 | 14134 | |||
3620 | 14004 | .doit = nl80211_wiphy_netns, | 14135 | .doit = nl80211_wiphy_netns, |
3621 | 14005 | .policy = nl80211_policy, | ||
3622 | 14006 | .flags = GENL_UNS_ADMIN_PERM, | 14136 | .flags = GENL_UNS_ADMIN_PERM, |
3623 | 14007 | .internal_flags = NL80211_FLAG_NEED_WIPHY | | 14137 | .internal_flags = NL80211_FLAG_NEED_WIPHY | |
3624 | 14008 | NL80211_FLAG_NEED_RTNL, | 14138 | NL80211_FLAG_NEED_RTNL, |
3625 | 14009 | }, | 14139 | }, |
3626 | 14010 | { | 14140 | { |
3627 | 14011 | .cmd = NL80211_CMD_GET_SURVEY, | 14141 | .cmd = NL80211_CMD_GET_SURVEY, |
3629 | 14012 | .policy = nl80211_policy, | 14142 | #if LINUX_VERSION_IS_GEQ(5,2,0) |
3630 | 14143 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3631 | 14144 | #endif | ||
3632 | 14145 | |||
3633 | 14013 | .dumpit = nl80211_dump_survey, | 14146 | .dumpit = nl80211_dump_survey, |
3634 | 14014 | }, | 14147 | }, |
3635 | 14015 | { | 14148 | { |
3636 | 14016 | .cmd = NL80211_CMD_SET_PMKSA, | 14149 | .cmd = NL80211_CMD_SET_PMKSA, |
3637 | 14150 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3638 | 14151 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3639 | 14152 | #endif | ||
3640 | 14153 | |||
3641 | 14017 | .doit = nl80211_setdel_pmksa, | 14154 | .doit = nl80211_setdel_pmksa, |
3642 | 14018 | .policy = nl80211_policy, | ||
3643 | 14019 | .flags = GENL_UNS_ADMIN_PERM, | 14155 | .flags = GENL_UNS_ADMIN_PERM, |
3644 | 14020 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14156 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3645 | 14021 | NL80211_FLAG_NEED_RTNL, | 14157 | NL80211_FLAG_NEED_RTNL, |
3646 | 14022 | }, | 14158 | }, |
3647 | 14023 | { | 14159 | { |
3648 | 14024 | .cmd = NL80211_CMD_DEL_PMKSA, | 14160 | .cmd = NL80211_CMD_DEL_PMKSA, |
3649 | 14161 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3650 | 14162 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3651 | 14163 | #endif | ||
3652 | 14164 | |||
3653 | 14025 | .doit = nl80211_setdel_pmksa, | 14165 | .doit = nl80211_setdel_pmksa, |
3654 | 14026 | .policy = nl80211_policy, | ||
3655 | 14027 | .flags = GENL_UNS_ADMIN_PERM, | 14166 | .flags = GENL_UNS_ADMIN_PERM, |
3656 | 14028 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14167 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3657 | 14029 | NL80211_FLAG_NEED_RTNL, | 14168 | NL80211_FLAG_NEED_RTNL, |
3658 | 14030 | }, | 14169 | }, |
3659 | 14031 | { | 14170 | { |
3660 | 14032 | .cmd = NL80211_CMD_FLUSH_PMKSA, | 14171 | .cmd = NL80211_CMD_FLUSH_PMKSA, |
3661 | 14172 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3662 | 14173 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3663 | 14174 | #endif | ||
3664 | 14175 | |||
3665 | 14033 | .doit = nl80211_flush_pmksa, | 14176 | .doit = nl80211_flush_pmksa, |
3666 | 14034 | .policy = nl80211_policy, | ||
3667 | 14035 | .flags = GENL_UNS_ADMIN_PERM, | 14177 | .flags = GENL_UNS_ADMIN_PERM, |
3668 | 14036 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14178 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3669 | 14037 | NL80211_FLAG_NEED_RTNL, | 14179 | NL80211_FLAG_NEED_RTNL, |
3670 | 14038 | }, | 14180 | }, |
3671 | 14039 | { | 14181 | { |
3672 | 14040 | .cmd = NL80211_CMD_REMAIN_ON_CHANNEL, | 14182 | .cmd = NL80211_CMD_REMAIN_ON_CHANNEL, |
3673 | 14183 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3674 | 14184 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3675 | 14185 | #endif | ||
3676 | 14186 | |||
3677 | 14041 | .doit = nl80211_remain_on_channel, | 14187 | .doit = nl80211_remain_on_channel, |
3678 | 14042 | .policy = nl80211_policy, | ||
3679 | 14043 | .flags = GENL_UNS_ADMIN_PERM, | 14188 | .flags = GENL_UNS_ADMIN_PERM, |
3680 | 14044 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 14189 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
3681 | 14045 | NL80211_FLAG_NEED_RTNL, | 14190 | NL80211_FLAG_NEED_RTNL, |
3682 | 14046 | }, | 14191 | }, |
3683 | 14047 | { | 14192 | { |
3684 | 14048 | .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, | 14193 | .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, |
3685 | 14194 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3686 | 14195 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3687 | 14196 | #endif | ||
3688 | 14197 | |||
3689 | 14049 | .doit = nl80211_cancel_remain_on_channel, | 14198 | .doit = nl80211_cancel_remain_on_channel, |
3690 | 14050 | .policy = nl80211_policy, | ||
3691 | 14051 | .flags = GENL_UNS_ADMIN_PERM, | 14199 | .flags = GENL_UNS_ADMIN_PERM, |
3692 | 14052 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 14200 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
3693 | 14053 | NL80211_FLAG_NEED_RTNL, | 14201 | NL80211_FLAG_NEED_RTNL, |
3694 | 14054 | }, | 14202 | }, |
3695 | 14055 | { | 14203 | { |
3696 | 14056 | .cmd = NL80211_CMD_SET_TX_BITRATE_MASK, | 14204 | .cmd = NL80211_CMD_SET_TX_BITRATE_MASK, |
3697 | 14205 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3698 | 14206 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3699 | 14207 | #endif | ||
3700 | 14208 | |||
3701 | 14057 | .doit = nl80211_set_tx_bitrate_mask, | 14209 | .doit = nl80211_set_tx_bitrate_mask, |
3702 | 14058 | .policy = nl80211_policy, | ||
3703 | 14059 | .flags = GENL_UNS_ADMIN_PERM, | 14210 | .flags = GENL_UNS_ADMIN_PERM, |
3704 | 14060 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 14211 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
3705 | 14061 | NL80211_FLAG_NEED_RTNL, | 14212 | NL80211_FLAG_NEED_RTNL, |
3706 | 14062 | }, | 14213 | }, |
3707 | 14063 | { | 14214 | { |
3708 | 14064 | .cmd = NL80211_CMD_REGISTER_FRAME, | 14215 | .cmd = NL80211_CMD_REGISTER_FRAME, |
3709 | 14216 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3710 | 14217 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3711 | 14218 | #endif | ||
3712 | 14219 | |||
3713 | 14065 | .doit = nl80211_register_mgmt, | 14220 | .doit = nl80211_register_mgmt, |
3714 | 14066 | .policy = nl80211_policy, | ||
3715 | 14067 | .flags = GENL_UNS_ADMIN_PERM, | 14221 | .flags = GENL_UNS_ADMIN_PERM, |
3716 | 14068 | .internal_flags = NL80211_FLAG_NEED_WDEV | | 14222 | .internal_flags = NL80211_FLAG_NEED_WDEV | |
3717 | 14069 | NL80211_FLAG_NEED_RTNL, | 14223 | NL80211_FLAG_NEED_RTNL, |
3718 | 14070 | }, | 14224 | }, |
3719 | 14071 | { | 14225 | { |
3720 | 14072 | .cmd = NL80211_CMD_FRAME, | 14226 | .cmd = NL80211_CMD_FRAME, |
3721 | 14227 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3722 | 14228 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3723 | 14229 | #endif | ||
3724 | 14230 | |||
3725 | 14073 | .doit = nl80211_tx_mgmt, | 14231 | .doit = nl80211_tx_mgmt, |
3726 | 14074 | .policy = nl80211_policy, | ||
3727 | 14075 | .flags = GENL_UNS_ADMIN_PERM, | 14232 | .flags = GENL_UNS_ADMIN_PERM, |
3728 | 14076 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 14233 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
3729 | 14077 | NL80211_FLAG_NEED_RTNL, | 14234 | NL80211_FLAG_NEED_RTNL, |
3730 | 14078 | }, | 14235 | }, |
3731 | 14079 | { | 14236 | { |
3732 | 14080 | .cmd = NL80211_CMD_FRAME_WAIT_CANCEL, | 14237 | .cmd = NL80211_CMD_FRAME_WAIT_CANCEL, |
3733 | 14238 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3734 | 14239 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3735 | 14240 | #endif | ||
3736 | 14241 | |||
3737 | 14081 | .doit = nl80211_tx_mgmt_cancel_wait, | 14242 | .doit = nl80211_tx_mgmt_cancel_wait, |
3738 | 14082 | .policy = nl80211_policy, | ||
3739 | 14083 | .flags = GENL_UNS_ADMIN_PERM, | 14243 | .flags = GENL_UNS_ADMIN_PERM, |
3740 | 14084 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 14244 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
3741 | 14085 | NL80211_FLAG_NEED_RTNL, | 14245 | NL80211_FLAG_NEED_RTNL, |
3742 | 14086 | }, | 14246 | }, |
3743 | 14087 | { | 14247 | { |
3744 | 14088 | .cmd = NL80211_CMD_SET_POWER_SAVE, | 14248 | .cmd = NL80211_CMD_SET_POWER_SAVE, |
3745 | 14249 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3746 | 14250 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3747 | 14251 | #endif | ||
3748 | 14252 | |||
3749 | 14089 | .doit = nl80211_set_power_save, | 14253 | .doit = nl80211_set_power_save, |
3750 | 14090 | .policy = nl80211_policy, | ||
3751 | 14091 | .flags = GENL_UNS_ADMIN_PERM, | 14254 | .flags = GENL_UNS_ADMIN_PERM, |
3752 | 14092 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 14255 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
3753 | 14093 | NL80211_FLAG_NEED_RTNL, | 14256 | NL80211_FLAG_NEED_RTNL, |
3754 | 14094 | }, | 14257 | }, |
3755 | 14095 | { | 14258 | { |
3756 | 14096 | .cmd = NL80211_CMD_GET_POWER_SAVE, | 14259 | .cmd = NL80211_CMD_GET_POWER_SAVE, |
3757 | 14260 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3758 | 14261 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3759 | 14262 | #endif | ||
3760 | 14263 | |||
3761 | 14097 | .doit = nl80211_get_power_save, | 14264 | .doit = nl80211_get_power_save, |
3762 | 14098 | .policy = nl80211_policy, | ||
3763 | 14099 | /* can be retrieved by unprivileged users */ | 14265 | /* can be retrieved by unprivileged users */ |
3764 | 14100 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 14266 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
3765 | 14101 | NL80211_FLAG_NEED_RTNL, | 14267 | NL80211_FLAG_NEED_RTNL, |
3766 | 14102 | }, | 14268 | }, |
3767 | 14103 | { | 14269 | { |
3768 | 14104 | .cmd = NL80211_CMD_SET_CQM, | 14270 | .cmd = NL80211_CMD_SET_CQM, |
3769 | 14271 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3770 | 14272 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3771 | 14273 | #endif | ||
3772 | 14274 | |||
3773 | 14105 | .doit = nl80211_set_cqm, | 14275 | .doit = nl80211_set_cqm, |
3774 | 14106 | .policy = nl80211_policy, | ||
3775 | 14107 | .flags = GENL_UNS_ADMIN_PERM, | 14276 | .flags = GENL_UNS_ADMIN_PERM, |
3776 | 14108 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 14277 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
3777 | 14109 | NL80211_FLAG_NEED_RTNL, | 14278 | NL80211_FLAG_NEED_RTNL, |
3778 | 14110 | }, | 14279 | }, |
3779 | 14111 | { | 14280 | { |
3780 | 14112 | .cmd = NL80211_CMD_SET_CHANNEL, | 14281 | .cmd = NL80211_CMD_SET_CHANNEL, |
3781 | 14282 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3782 | 14283 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3783 | 14284 | #endif | ||
3784 | 14285 | |||
3785 | 14113 | .doit = nl80211_set_channel, | 14286 | .doit = nl80211_set_channel, |
3786 | 14114 | .policy = nl80211_policy, | ||
3787 | 14115 | .flags = GENL_UNS_ADMIN_PERM, | 14287 | .flags = GENL_UNS_ADMIN_PERM, |
3788 | 14116 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 14288 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
3789 | 14117 | NL80211_FLAG_NEED_RTNL, | 14289 | NL80211_FLAG_NEED_RTNL, |
3790 | 14118 | }, | 14290 | }, |
3791 | 14119 | { | 14291 | { |
3792 | 14120 | .cmd = NL80211_CMD_SET_WDS_PEER, | 14292 | .cmd = NL80211_CMD_SET_WDS_PEER, |
3793 | 14293 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3794 | 14294 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3795 | 14295 | #endif | ||
3796 | 14296 | |||
3797 | 14121 | .doit = nl80211_set_wds_peer, | 14297 | .doit = nl80211_set_wds_peer, |
3798 | 14122 | .policy = nl80211_policy, | ||
3799 | 14123 | .flags = GENL_UNS_ADMIN_PERM, | 14298 | .flags = GENL_UNS_ADMIN_PERM, |
3800 | 14124 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 14299 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
3801 | 14125 | NL80211_FLAG_NEED_RTNL, | 14300 | NL80211_FLAG_NEED_RTNL, |
3802 | 14126 | }, | 14301 | }, |
3803 | 14127 | { | 14302 | { |
3804 | 14128 | .cmd = NL80211_CMD_JOIN_MESH, | 14303 | .cmd = NL80211_CMD_JOIN_MESH, |
3805 | 14304 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3806 | 14305 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3807 | 14306 | #endif | ||
3808 | 14307 | |||
3809 | 14129 | .doit = nl80211_join_mesh, | 14308 | .doit = nl80211_join_mesh, |
3810 | 14130 | .policy = nl80211_policy, | ||
3811 | 14131 | .flags = GENL_UNS_ADMIN_PERM, | 14309 | .flags = GENL_UNS_ADMIN_PERM, |
3812 | 14132 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14310 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3813 | 14133 | NL80211_FLAG_NEED_RTNL, | 14311 | NL80211_FLAG_NEED_RTNL, |
3814 | 14134 | }, | 14312 | }, |
3815 | 14135 | { | 14313 | { |
3816 | 14136 | .cmd = NL80211_CMD_LEAVE_MESH, | 14314 | .cmd = NL80211_CMD_LEAVE_MESH, |
3817 | 14315 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3818 | 14316 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3819 | 14317 | #endif | ||
3820 | 14318 | |||
3821 | 14137 | .doit = nl80211_leave_mesh, | 14319 | .doit = nl80211_leave_mesh, |
3822 | 14138 | .policy = nl80211_policy, | ||
3823 | 14139 | .flags = GENL_UNS_ADMIN_PERM, | 14320 | .flags = GENL_UNS_ADMIN_PERM, |
3824 | 14140 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14321 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3825 | 14141 | NL80211_FLAG_NEED_RTNL, | 14322 | NL80211_FLAG_NEED_RTNL, |
3826 | 14142 | }, | 14323 | }, |
3827 | 14143 | { | 14324 | { |
3828 | 14144 | .cmd = NL80211_CMD_JOIN_OCB, | 14325 | .cmd = NL80211_CMD_JOIN_OCB, |
3829 | 14326 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3830 | 14327 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3831 | 14328 | #endif | ||
3832 | 14329 | |||
3833 | 14145 | .doit = nl80211_join_ocb, | 14330 | .doit = nl80211_join_ocb, |
3834 | 14146 | .policy = nl80211_policy, | ||
3835 | 14147 | .flags = GENL_UNS_ADMIN_PERM, | 14331 | .flags = GENL_UNS_ADMIN_PERM, |
3836 | 14148 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14332 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3837 | 14149 | NL80211_FLAG_NEED_RTNL, | 14333 | NL80211_FLAG_NEED_RTNL, |
3838 | 14150 | }, | 14334 | }, |
3839 | 14151 | { | 14335 | { |
3840 | 14152 | .cmd = NL80211_CMD_LEAVE_OCB, | 14336 | .cmd = NL80211_CMD_LEAVE_OCB, |
3841 | 14337 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3842 | 14338 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3843 | 14339 | #endif | ||
3844 | 14340 | |||
3845 | 14153 | .doit = nl80211_leave_ocb, | 14341 | .doit = nl80211_leave_ocb, |
3846 | 14154 | .policy = nl80211_policy, | ||
3847 | 14155 | .flags = GENL_UNS_ADMIN_PERM, | 14342 | .flags = GENL_UNS_ADMIN_PERM, |
3848 | 14156 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14343 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3849 | 14157 | NL80211_FLAG_NEED_RTNL, | 14344 | NL80211_FLAG_NEED_RTNL, |
3850 | @@ -14159,16 +14346,22 @@ static __genl_const struct genl_ops nl80211_ops[] = { | |||
3851 | 14159 | #ifdef CONFIG_PM | 14346 | #ifdef CONFIG_PM |
3852 | 14160 | { | 14347 | { |
3853 | 14161 | .cmd = NL80211_CMD_GET_WOWLAN, | 14348 | .cmd = NL80211_CMD_GET_WOWLAN, |
3854 | 14349 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3855 | 14350 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3856 | 14351 | #endif | ||
3857 | 14352 | |||
3858 | 14162 | .doit = nl80211_get_wowlan, | 14353 | .doit = nl80211_get_wowlan, |
3859 | 14163 | .policy = nl80211_policy, | ||
3860 | 14164 | /* can be retrieved by unprivileged users */ | 14354 | /* can be retrieved by unprivileged users */ |
3861 | 14165 | .internal_flags = NL80211_FLAG_NEED_WIPHY | | 14355 | .internal_flags = NL80211_FLAG_NEED_WIPHY | |
3862 | 14166 | NL80211_FLAG_NEED_RTNL, | 14356 | NL80211_FLAG_NEED_RTNL, |
3863 | 14167 | }, | 14357 | }, |
3864 | 14168 | { | 14358 | { |
3865 | 14169 | .cmd = NL80211_CMD_SET_WOWLAN, | 14359 | .cmd = NL80211_CMD_SET_WOWLAN, |
3866 | 14360 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3867 | 14361 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3868 | 14362 | #endif | ||
3869 | 14363 | |||
3870 | 14170 | .doit = nl80211_set_wowlan, | 14364 | .doit = nl80211_set_wowlan, |
3871 | 14171 | .policy = nl80211_policy, | ||
3872 | 14172 | .flags = GENL_UNS_ADMIN_PERM, | 14365 | .flags = GENL_UNS_ADMIN_PERM, |
3873 | 14173 | .internal_flags = NL80211_FLAG_NEED_WIPHY | | 14366 | .internal_flags = NL80211_FLAG_NEED_WIPHY | |
3874 | 14174 | NL80211_FLAG_NEED_RTNL, | 14367 | NL80211_FLAG_NEED_RTNL, |
3875 | @@ -14176,8 +14369,11 @@ static __genl_const struct genl_ops nl80211_ops[] = { | |||
3876 | 14176 | #endif | 14369 | #endif |
3877 | 14177 | { | 14370 | { |
3878 | 14178 | .cmd = NL80211_CMD_SET_REKEY_OFFLOAD, | 14371 | .cmd = NL80211_CMD_SET_REKEY_OFFLOAD, |
3879 | 14372 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3880 | 14373 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3881 | 14374 | #endif | ||
3882 | 14375 | |||
3883 | 14179 | .doit = nl80211_set_rekey_data, | 14376 | .doit = nl80211_set_rekey_data, |
3884 | 14180 | .policy = nl80211_policy, | ||
3885 | 14181 | .flags = GENL_UNS_ADMIN_PERM, | 14377 | .flags = GENL_UNS_ADMIN_PERM, |
3886 | 14182 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14378 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3887 | 14183 | NL80211_FLAG_NEED_RTNL | | 14379 | NL80211_FLAG_NEED_RTNL | |
3888 | @@ -14185,290 +14381,401 @@ static __genl_const struct genl_ops nl80211_ops[] = { | |||
3889 | 14185 | }, | 14381 | }, |
3890 | 14186 | { | 14382 | { |
3891 | 14187 | .cmd = NL80211_CMD_TDLS_MGMT, | 14383 | .cmd = NL80211_CMD_TDLS_MGMT, |
3892 | 14384 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3893 | 14385 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3894 | 14386 | #endif | ||
3895 | 14387 | |||
3896 | 14188 | .doit = nl80211_tdls_mgmt, | 14388 | .doit = nl80211_tdls_mgmt, |
3897 | 14189 | .policy = nl80211_policy, | ||
3898 | 14190 | .flags = GENL_UNS_ADMIN_PERM, | 14389 | .flags = GENL_UNS_ADMIN_PERM, |
3899 | 14191 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14390 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3900 | 14192 | NL80211_FLAG_NEED_RTNL, | 14391 | NL80211_FLAG_NEED_RTNL, |
3901 | 14193 | }, | 14392 | }, |
3902 | 14194 | { | 14393 | { |
3903 | 14195 | .cmd = NL80211_CMD_TDLS_OPER, | 14394 | .cmd = NL80211_CMD_TDLS_OPER, |
3904 | 14395 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3905 | 14396 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3906 | 14397 | #endif | ||
3907 | 14398 | |||
3908 | 14196 | .doit = nl80211_tdls_oper, | 14399 | .doit = nl80211_tdls_oper, |
3909 | 14197 | .policy = nl80211_policy, | ||
3910 | 14198 | .flags = GENL_UNS_ADMIN_PERM, | 14400 | .flags = GENL_UNS_ADMIN_PERM, |
3911 | 14199 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14401 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3912 | 14200 | NL80211_FLAG_NEED_RTNL, | 14402 | NL80211_FLAG_NEED_RTNL, |
3913 | 14201 | }, | 14403 | }, |
3914 | 14202 | { | 14404 | { |
3915 | 14203 | .cmd = NL80211_CMD_UNEXPECTED_FRAME, | 14405 | .cmd = NL80211_CMD_UNEXPECTED_FRAME, |
3916 | 14406 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3917 | 14407 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3918 | 14408 | #endif | ||
3919 | 14409 | |||
3920 | 14204 | .doit = nl80211_register_unexpected_frame, | 14410 | .doit = nl80211_register_unexpected_frame, |
3921 | 14205 | .policy = nl80211_policy, | ||
3922 | 14206 | .flags = GENL_UNS_ADMIN_PERM, | 14411 | .flags = GENL_UNS_ADMIN_PERM, |
3923 | 14207 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 14412 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
3924 | 14208 | NL80211_FLAG_NEED_RTNL, | 14413 | NL80211_FLAG_NEED_RTNL, |
3925 | 14209 | }, | 14414 | }, |
3926 | 14210 | { | 14415 | { |
3927 | 14211 | .cmd = NL80211_CMD_PROBE_CLIENT, | 14416 | .cmd = NL80211_CMD_PROBE_CLIENT, |
3928 | 14417 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3929 | 14418 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3930 | 14419 | #endif | ||
3931 | 14420 | |||
3932 | 14212 | .doit = nl80211_probe_client, | 14421 | .doit = nl80211_probe_client, |
3933 | 14213 | .policy = nl80211_policy, | ||
3934 | 14214 | .flags = GENL_UNS_ADMIN_PERM, | 14422 | .flags = GENL_UNS_ADMIN_PERM, |
3935 | 14215 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14423 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
3936 | 14216 | NL80211_FLAG_NEED_RTNL, | 14424 | NL80211_FLAG_NEED_RTNL, |
3937 | 14217 | }, | 14425 | }, |
3938 | 14218 | { | 14426 | { |
3939 | 14219 | .cmd = NL80211_CMD_REGISTER_BEACONS, | 14427 | .cmd = NL80211_CMD_REGISTER_BEACONS, |
3940 | 14428 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3941 | 14429 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3942 | 14430 | #endif | ||
3943 | 14431 | |||
3944 | 14220 | .doit = nl80211_register_beacons, | 14432 | .doit = nl80211_register_beacons, |
3945 | 14221 | .policy = nl80211_policy, | ||
3946 | 14222 | .flags = GENL_UNS_ADMIN_PERM, | 14433 | .flags = GENL_UNS_ADMIN_PERM, |
3947 | 14223 | .internal_flags = NL80211_FLAG_NEED_WIPHY | | 14434 | .internal_flags = NL80211_FLAG_NEED_WIPHY | |
3948 | 14224 | NL80211_FLAG_NEED_RTNL, | 14435 | NL80211_FLAG_NEED_RTNL, |
3949 | 14225 | }, | 14436 | }, |
3950 | 14226 | { | 14437 | { |
3951 | 14227 | .cmd = NL80211_CMD_SET_NOACK_MAP, | 14438 | .cmd = NL80211_CMD_SET_NOACK_MAP, |
3952 | 14439 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3953 | 14440 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3954 | 14441 | #endif | ||
3955 | 14442 | |||
3956 | 14228 | .doit = nl80211_set_noack_map, | 14443 | .doit = nl80211_set_noack_map, |
3957 | 14229 | .policy = nl80211_policy, | ||
3958 | 14230 | .flags = GENL_UNS_ADMIN_PERM, | 14444 | .flags = GENL_UNS_ADMIN_PERM, |
3959 | 14231 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 14445 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
3960 | 14232 | NL80211_FLAG_NEED_RTNL, | 14446 | NL80211_FLAG_NEED_RTNL, |
3961 | 14233 | }, | 14447 | }, |
3962 | 14234 | { | 14448 | { |
3963 | 14235 | .cmd = NL80211_CMD_START_P2P_DEVICE, | 14449 | .cmd = NL80211_CMD_START_P2P_DEVICE, |
3964 | 14450 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3965 | 14451 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3966 | 14452 | #endif | ||
3967 | 14453 | |||
3968 | 14236 | .doit = nl80211_start_p2p_device, | 14454 | .doit = nl80211_start_p2p_device, |
3969 | 14237 | .policy = nl80211_policy, | ||
3970 | 14238 | .flags = GENL_UNS_ADMIN_PERM, | 14455 | .flags = GENL_UNS_ADMIN_PERM, |
3971 | 14239 | .internal_flags = NL80211_FLAG_NEED_WDEV | | 14456 | .internal_flags = NL80211_FLAG_NEED_WDEV | |
3972 | 14240 | NL80211_FLAG_NEED_RTNL, | 14457 | NL80211_FLAG_NEED_RTNL, |
3973 | 14241 | }, | 14458 | }, |
3974 | 14242 | { | 14459 | { |
3975 | 14243 | .cmd = NL80211_CMD_STOP_P2P_DEVICE, | 14460 | .cmd = NL80211_CMD_STOP_P2P_DEVICE, |
3976 | 14461 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3977 | 14462 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3978 | 14463 | #endif | ||
3979 | 14464 | |||
3980 | 14244 | .doit = nl80211_stop_p2p_device, | 14465 | .doit = nl80211_stop_p2p_device, |
3981 | 14245 | .policy = nl80211_policy, | ||
3982 | 14246 | .flags = GENL_UNS_ADMIN_PERM, | 14466 | .flags = GENL_UNS_ADMIN_PERM, |
3983 | 14247 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 14467 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
3984 | 14248 | NL80211_FLAG_NEED_RTNL, | 14468 | NL80211_FLAG_NEED_RTNL, |
3985 | 14249 | }, | 14469 | }, |
3986 | 14250 | { | 14470 | { |
3987 | 14251 | .cmd = NL80211_CMD_START_NAN, | 14471 | .cmd = NL80211_CMD_START_NAN, |
3988 | 14472 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
3989 | 14473 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
3990 | 14474 | #endif | ||
3991 | 14475 | |||
3992 | 14252 | .doit = nl80211_start_nan, | 14476 | .doit = nl80211_start_nan, |
3993 | 14253 | .policy = nl80211_policy, | ||
3994 | 14254 | .flags = GENL_ADMIN_PERM, | 14477 | .flags = GENL_ADMIN_PERM, |
3995 | 14255 | .internal_flags = NL80211_FLAG_NEED_WDEV | | 14478 | .internal_flags = NL80211_FLAG_NEED_WDEV | |
3996 | 14256 | NL80211_FLAG_NEED_RTNL, | 14479 | NL80211_FLAG_NEED_RTNL, |
3997 | 14257 | }, | 14480 | }, |
3998 | 14258 | { | 14481 | { |
3999 | 14259 | .cmd = NL80211_CMD_STOP_NAN, | 14482 | .cmd = NL80211_CMD_STOP_NAN, |
4000 | 14483 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4001 | 14484 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4002 | 14485 | #endif | ||
4003 | 14486 | |||
4004 | 14260 | .doit = nl80211_stop_nan, | 14487 | .doit = nl80211_stop_nan, |
4005 | 14261 | .policy = nl80211_policy, | ||
4006 | 14262 | .flags = GENL_ADMIN_PERM, | 14488 | .flags = GENL_ADMIN_PERM, |
4007 | 14263 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 14489 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
4008 | 14264 | NL80211_FLAG_NEED_RTNL, | 14490 | NL80211_FLAG_NEED_RTNL, |
4009 | 14265 | }, | 14491 | }, |
4010 | 14266 | { | 14492 | { |
4011 | 14267 | .cmd = NL80211_CMD_ADD_NAN_FUNCTION, | 14493 | .cmd = NL80211_CMD_ADD_NAN_FUNCTION, |
4012 | 14494 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4013 | 14495 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4014 | 14496 | #endif | ||
4015 | 14497 | |||
4016 | 14268 | .doit = nl80211_nan_add_func, | 14498 | .doit = nl80211_nan_add_func, |
4017 | 14269 | .policy = nl80211_policy, | ||
4018 | 14270 | .flags = GENL_ADMIN_PERM, | 14499 | .flags = GENL_ADMIN_PERM, |
4019 | 14271 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 14500 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
4020 | 14272 | NL80211_FLAG_NEED_RTNL, | 14501 | NL80211_FLAG_NEED_RTNL, |
4021 | 14273 | }, | 14502 | }, |
4022 | 14274 | { | 14503 | { |
4023 | 14275 | .cmd = NL80211_CMD_DEL_NAN_FUNCTION, | 14504 | .cmd = NL80211_CMD_DEL_NAN_FUNCTION, |
4024 | 14505 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4025 | 14506 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4026 | 14507 | #endif | ||
4027 | 14508 | |||
4028 | 14276 | .doit = nl80211_nan_del_func, | 14509 | .doit = nl80211_nan_del_func, |
4029 | 14277 | .policy = nl80211_policy, | ||
4030 | 14278 | .flags = GENL_ADMIN_PERM, | 14510 | .flags = GENL_ADMIN_PERM, |
4031 | 14279 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 14511 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
4032 | 14280 | NL80211_FLAG_NEED_RTNL, | 14512 | NL80211_FLAG_NEED_RTNL, |
4033 | 14281 | }, | 14513 | }, |
4034 | 14282 | { | 14514 | { |
4035 | 14283 | .cmd = NL80211_CMD_CHANGE_NAN_CONFIG, | 14515 | .cmd = NL80211_CMD_CHANGE_NAN_CONFIG, |
4036 | 14516 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4037 | 14517 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4038 | 14518 | #endif | ||
4039 | 14519 | |||
4040 | 14284 | .doit = nl80211_nan_change_config, | 14520 | .doit = nl80211_nan_change_config, |
4041 | 14285 | .policy = nl80211_policy, | ||
4042 | 14286 | .flags = GENL_ADMIN_PERM, | 14521 | .flags = GENL_ADMIN_PERM, |
4043 | 14287 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 14522 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
4044 | 14288 | NL80211_FLAG_NEED_RTNL, | 14523 | NL80211_FLAG_NEED_RTNL, |
4045 | 14289 | }, | 14524 | }, |
4046 | 14290 | { | 14525 | { |
4047 | 14291 | .cmd = NL80211_CMD_SET_MCAST_RATE, | 14526 | .cmd = NL80211_CMD_SET_MCAST_RATE, |
4048 | 14527 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4049 | 14528 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4050 | 14529 | #endif | ||
4051 | 14530 | |||
4052 | 14292 | .doit = nl80211_set_mcast_rate, | 14531 | .doit = nl80211_set_mcast_rate, |
4053 | 14293 | .policy = nl80211_policy, | ||
4054 | 14294 | .flags = GENL_UNS_ADMIN_PERM, | 14532 | .flags = GENL_UNS_ADMIN_PERM, |
4055 | 14295 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 14533 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
4056 | 14296 | NL80211_FLAG_NEED_RTNL, | 14534 | NL80211_FLAG_NEED_RTNL, |
4057 | 14297 | }, | 14535 | }, |
4058 | 14298 | { | 14536 | { |
4059 | 14299 | .cmd = NL80211_CMD_SET_MAC_ACL, | 14537 | .cmd = NL80211_CMD_SET_MAC_ACL, |
4060 | 14538 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4061 | 14539 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4062 | 14540 | #endif | ||
4063 | 14541 | |||
4064 | 14300 | .doit = nl80211_set_mac_acl, | 14542 | .doit = nl80211_set_mac_acl, |
4065 | 14301 | .policy = nl80211_policy, | ||
4066 | 14302 | .flags = GENL_UNS_ADMIN_PERM, | 14543 | .flags = GENL_UNS_ADMIN_PERM, |
4067 | 14303 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 14544 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
4068 | 14304 | NL80211_FLAG_NEED_RTNL, | 14545 | NL80211_FLAG_NEED_RTNL, |
4069 | 14305 | }, | 14546 | }, |
4070 | 14306 | { | 14547 | { |
4071 | 14307 | .cmd = NL80211_CMD_RADAR_DETECT, | 14548 | .cmd = NL80211_CMD_RADAR_DETECT, |
4072 | 14549 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4073 | 14550 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4074 | 14551 | #endif | ||
4075 | 14552 | |||
4076 | 14308 | .doit = nl80211_start_radar_detection, | 14553 | .doit = nl80211_start_radar_detection, |
4077 | 14309 | .policy = nl80211_policy, | ||
4078 | 14310 | .flags = GENL_UNS_ADMIN_PERM, | 14554 | .flags = GENL_UNS_ADMIN_PERM, |
4079 | 14311 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14555 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4080 | 14312 | NL80211_FLAG_NEED_RTNL, | 14556 | NL80211_FLAG_NEED_RTNL, |
4081 | 14313 | }, | 14557 | }, |
4082 | 14314 | { | 14558 | { |
4083 | 14315 | .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, | 14559 | .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, |
4084 | 14560 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4085 | 14561 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4086 | 14562 | #endif | ||
4087 | 14563 | |||
4088 | 14316 | .doit = nl80211_get_protocol_features, | 14564 | .doit = nl80211_get_protocol_features, |
4089 | 14317 | .policy = nl80211_policy, | ||
4090 | 14318 | }, | 14565 | }, |
4091 | 14319 | { | 14566 | { |
4092 | 14320 | .cmd = NL80211_CMD_UPDATE_FT_IES, | 14567 | .cmd = NL80211_CMD_UPDATE_FT_IES, |
4093 | 14568 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4094 | 14569 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4095 | 14570 | #endif | ||
4096 | 14571 | |||
4097 | 14321 | .doit = nl80211_update_ft_ies, | 14572 | .doit = nl80211_update_ft_ies, |
4098 | 14322 | .policy = nl80211_policy, | ||
4099 | 14323 | .flags = GENL_UNS_ADMIN_PERM, | 14573 | .flags = GENL_UNS_ADMIN_PERM, |
4100 | 14324 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14574 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4101 | 14325 | NL80211_FLAG_NEED_RTNL, | 14575 | NL80211_FLAG_NEED_RTNL, |
4102 | 14326 | }, | 14576 | }, |
4103 | 14327 | { | 14577 | { |
4104 | 14328 | .cmd = NL80211_CMD_CRIT_PROTOCOL_START, | 14578 | .cmd = NL80211_CMD_CRIT_PROTOCOL_START, |
4105 | 14579 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4106 | 14580 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4107 | 14581 | #endif | ||
4108 | 14582 | |||
4109 | 14329 | .doit = nl80211_crit_protocol_start, | 14583 | .doit = nl80211_crit_protocol_start, |
4110 | 14330 | .policy = nl80211_policy, | ||
4111 | 14331 | .flags = GENL_UNS_ADMIN_PERM, | 14584 | .flags = GENL_UNS_ADMIN_PERM, |
4112 | 14332 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 14585 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
4113 | 14333 | NL80211_FLAG_NEED_RTNL, | 14586 | NL80211_FLAG_NEED_RTNL, |
4114 | 14334 | }, | 14587 | }, |
4115 | 14335 | { | 14588 | { |
4116 | 14336 | .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, | 14589 | .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, |
4117 | 14590 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4118 | 14591 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4119 | 14592 | #endif | ||
4120 | 14593 | |||
4121 | 14337 | .doit = nl80211_crit_protocol_stop, | 14594 | .doit = nl80211_crit_protocol_stop, |
4122 | 14338 | .policy = nl80211_policy, | ||
4123 | 14339 | .flags = GENL_UNS_ADMIN_PERM, | 14595 | .flags = GENL_UNS_ADMIN_PERM, |
4124 | 14340 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 14596 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
4125 | 14341 | NL80211_FLAG_NEED_RTNL, | 14597 | NL80211_FLAG_NEED_RTNL, |
4126 | 14342 | }, | 14598 | }, |
4127 | 14343 | { | 14599 | { |
4128 | 14344 | .cmd = NL80211_CMD_GET_COALESCE, | 14600 | .cmd = NL80211_CMD_GET_COALESCE, |
4129 | 14601 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4130 | 14602 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4131 | 14603 | #endif | ||
4132 | 14604 | |||
4133 | 14345 | .doit = nl80211_get_coalesce, | 14605 | .doit = nl80211_get_coalesce, |
4134 | 14346 | .policy = nl80211_policy, | ||
4135 | 14347 | .internal_flags = NL80211_FLAG_NEED_WIPHY | | 14606 | .internal_flags = NL80211_FLAG_NEED_WIPHY | |
4136 | 14348 | NL80211_FLAG_NEED_RTNL, | 14607 | NL80211_FLAG_NEED_RTNL, |
4137 | 14349 | }, | 14608 | }, |
4138 | 14350 | { | 14609 | { |
4139 | 14351 | .cmd = NL80211_CMD_SET_COALESCE, | 14610 | .cmd = NL80211_CMD_SET_COALESCE, |
4140 | 14611 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4141 | 14612 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4142 | 14613 | #endif | ||
4143 | 14614 | |||
4144 | 14352 | .doit = nl80211_set_coalesce, | 14615 | .doit = nl80211_set_coalesce, |
4145 | 14353 | .policy = nl80211_policy, | ||
4146 | 14354 | .flags = GENL_UNS_ADMIN_PERM, | 14616 | .flags = GENL_UNS_ADMIN_PERM, |
4147 | 14355 | .internal_flags = NL80211_FLAG_NEED_WIPHY | | 14617 | .internal_flags = NL80211_FLAG_NEED_WIPHY | |
4148 | 14356 | NL80211_FLAG_NEED_RTNL, | 14618 | NL80211_FLAG_NEED_RTNL, |
4149 | 14357 | }, | 14619 | }, |
4150 | 14358 | { | 14620 | { |
4151 | 14359 | .cmd = NL80211_CMD_CHANNEL_SWITCH, | 14621 | .cmd = NL80211_CMD_CHANNEL_SWITCH, |
4152 | 14622 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4153 | 14623 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4154 | 14624 | #endif | ||
4155 | 14625 | |||
4156 | 14360 | .doit = nl80211_channel_switch, | 14626 | .doit = nl80211_channel_switch, |
4157 | 14361 | .policy = nl80211_policy, | ||
4158 | 14362 | .flags = GENL_UNS_ADMIN_PERM, | 14627 | .flags = GENL_UNS_ADMIN_PERM, |
4159 | 14363 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14628 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4160 | 14364 | NL80211_FLAG_NEED_RTNL, | 14629 | NL80211_FLAG_NEED_RTNL, |
4161 | 14365 | }, | 14630 | }, |
4162 | 14366 | { | 14631 | { |
4163 | 14367 | .cmd = NL80211_CMD_VENDOR, | 14632 | .cmd = NL80211_CMD_VENDOR, |
4164 | 14633 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4165 | 14634 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4166 | 14635 | #endif | ||
4167 | 14636 | |||
4168 | 14368 | .doit = nl80211_vendor_cmd, | 14637 | .doit = nl80211_vendor_cmd, |
4169 | 14369 | .dumpit = nl80211_vendor_cmd_dump, | 14638 | .dumpit = nl80211_vendor_cmd_dump, |
4170 | 14370 | .policy = nl80211_policy, | ||
4171 | 14371 | .flags = GENL_UNS_ADMIN_PERM, | 14639 | .flags = GENL_UNS_ADMIN_PERM, |
4172 | 14372 | .internal_flags = NL80211_FLAG_NEED_WIPHY | | 14640 | .internal_flags = NL80211_FLAG_NEED_WIPHY | |
4173 | 14373 | NL80211_FLAG_NEED_RTNL, | 14641 | NL80211_FLAG_NEED_RTNL, |
4174 | 14374 | }, | 14642 | }, |
4175 | 14375 | { | 14643 | { |
4176 | 14376 | .cmd = NL80211_CMD_SET_QOS_MAP, | 14644 | .cmd = NL80211_CMD_SET_QOS_MAP, |
4177 | 14645 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4178 | 14646 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4179 | 14647 | #endif | ||
4180 | 14648 | |||
4181 | 14377 | .doit = nl80211_set_qos_map, | 14649 | .doit = nl80211_set_qos_map, |
4182 | 14378 | .policy = nl80211_policy, | ||
4183 | 14379 | .flags = GENL_UNS_ADMIN_PERM, | 14650 | .flags = GENL_UNS_ADMIN_PERM, |
4184 | 14380 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14651 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4185 | 14381 | NL80211_FLAG_NEED_RTNL, | 14652 | NL80211_FLAG_NEED_RTNL, |
4186 | 14382 | }, | 14653 | }, |
4187 | 14383 | { | 14654 | { |
4188 | 14384 | .cmd = NL80211_CMD_ADD_TX_TS, | 14655 | .cmd = NL80211_CMD_ADD_TX_TS, |
4189 | 14656 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4190 | 14657 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4191 | 14658 | #endif | ||
4192 | 14659 | |||
4193 | 14385 | .doit = nl80211_add_tx_ts, | 14660 | .doit = nl80211_add_tx_ts, |
4194 | 14386 | .policy = nl80211_policy, | ||
4195 | 14387 | .flags = GENL_UNS_ADMIN_PERM, | 14661 | .flags = GENL_UNS_ADMIN_PERM, |
4196 | 14388 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14662 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4197 | 14389 | NL80211_FLAG_NEED_RTNL, | 14663 | NL80211_FLAG_NEED_RTNL, |
4198 | 14390 | }, | 14664 | }, |
4199 | 14391 | { | 14665 | { |
4200 | 14392 | .cmd = NL80211_CMD_DEL_TX_TS, | 14666 | .cmd = NL80211_CMD_DEL_TX_TS, |
4201 | 14667 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4202 | 14668 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4203 | 14669 | #endif | ||
4204 | 14670 | |||
4205 | 14393 | .doit = nl80211_del_tx_ts, | 14671 | .doit = nl80211_del_tx_ts, |
4206 | 14394 | .policy = nl80211_policy, | ||
4207 | 14395 | .flags = GENL_UNS_ADMIN_PERM, | 14672 | .flags = GENL_UNS_ADMIN_PERM, |
4208 | 14396 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14673 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4209 | 14397 | NL80211_FLAG_NEED_RTNL, | 14674 | NL80211_FLAG_NEED_RTNL, |
4210 | 14398 | }, | 14675 | }, |
4211 | 14399 | { | 14676 | { |
4212 | 14400 | .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH, | 14677 | .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH, |
4213 | 14678 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4214 | 14679 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4215 | 14680 | #endif | ||
4216 | 14681 | |||
4217 | 14401 | .doit = nl80211_tdls_channel_switch, | 14682 | .doit = nl80211_tdls_channel_switch, |
4218 | 14402 | .policy = nl80211_policy, | ||
4219 | 14403 | .flags = GENL_UNS_ADMIN_PERM, | 14683 | .flags = GENL_UNS_ADMIN_PERM, |
4220 | 14404 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14684 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4221 | 14405 | NL80211_FLAG_NEED_RTNL, | 14685 | NL80211_FLAG_NEED_RTNL, |
4222 | 14406 | }, | 14686 | }, |
4223 | 14407 | { | 14687 | { |
4224 | 14408 | .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, | 14688 | .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, |
4225 | 14689 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4226 | 14690 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4227 | 14691 | #endif | ||
4228 | 14692 | |||
4229 | 14409 | .doit = nl80211_tdls_cancel_channel_switch, | 14693 | .doit = nl80211_tdls_cancel_channel_switch, |
4230 | 14410 | .policy = nl80211_policy, | ||
4231 | 14411 | .flags = GENL_UNS_ADMIN_PERM, | 14694 | .flags = GENL_UNS_ADMIN_PERM, |
4232 | 14412 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14695 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4233 | 14413 | NL80211_FLAG_NEED_RTNL, | 14696 | NL80211_FLAG_NEED_RTNL, |
4234 | 14414 | }, | 14697 | }, |
4235 | 14415 | { | 14698 | { |
4236 | 14416 | .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST, | 14699 | .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST, |
4237 | 14700 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4238 | 14701 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4239 | 14702 | #endif | ||
4240 | 14703 | |||
4241 | 14417 | .doit = nl80211_set_multicast_to_unicast, | 14704 | .doit = nl80211_set_multicast_to_unicast, |
4242 | 14418 | .policy = nl80211_policy, | ||
4243 | 14419 | .flags = GENL_UNS_ADMIN_PERM, | 14705 | .flags = GENL_UNS_ADMIN_PERM, |
4244 | 14420 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 14706 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
4245 | 14421 | NL80211_FLAG_NEED_RTNL, | 14707 | NL80211_FLAG_NEED_RTNL, |
4246 | 14422 | }, | 14708 | }, |
4247 | 14423 | { | 14709 | { |
4248 | 14424 | .cmd = NL80211_CMD_SET_PMK, | 14710 | .cmd = NL80211_CMD_SET_PMK, |
4249 | 14711 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4250 | 14712 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4251 | 14713 | #endif | ||
4252 | 14714 | |||
4253 | 14425 | .doit = nl80211_set_pmk, | 14715 | .doit = nl80211_set_pmk, |
4254 | 14426 | .policy = nl80211_policy, | ||
4255 | 14427 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14716 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4256 | 14428 | NL80211_FLAG_NEED_RTNL, | 14717 | NL80211_FLAG_NEED_RTNL, |
4257 | 14429 | }, | 14718 | }, |
4258 | 14430 | { | 14719 | { |
4259 | 14431 | .cmd = NL80211_CMD_DEL_PMK, | 14720 | .cmd = NL80211_CMD_DEL_PMK, |
4260 | 14721 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4261 | 14722 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4262 | 14723 | #endif | ||
4263 | 14724 | |||
4264 | 14432 | .doit = nl80211_del_pmk, | 14725 | .doit = nl80211_del_pmk, |
4265 | 14433 | .policy = nl80211_policy, | ||
4266 | 14434 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14726 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4267 | 14435 | NL80211_FLAG_NEED_RTNL, | 14727 | NL80211_FLAG_NEED_RTNL, |
4268 | 14436 | }, | 14728 | }, |
4269 | 14437 | { | 14729 | { |
4270 | 14438 | .cmd = NL80211_CMD_EXTERNAL_AUTH, | 14730 | .cmd = NL80211_CMD_EXTERNAL_AUTH, |
4271 | 14731 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4272 | 14732 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4273 | 14733 | #endif | ||
4274 | 14734 | |||
4275 | 14439 | .doit = nl80211_external_auth, | 14735 | .doit = nl80211_external_auth, |
4276 | 14440 | .policy = nl80211_policy, | ||
4277 | 14441 | .flags = GENL_ADMIN_PERM, | 14736 | .flags = GENL_ADMIN_PERM, |
4278 | 14442 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14737 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4279 | 14443 | NL80211_FLAG_NEED_RTNL, | 14738 | NL80211_FLAG_NEED_RTNL, |
4280 | 14444 | }, | 14739 | }, |
4281 | 14445 | { | 14740 | { |
4282 | 14446 | .cmd = NL80211_CMD_CONTROL_PORT_FRAME, | 14741 | .cmd = NL80211_CMD_CONTROL_PORT_FRAME, |
4283 | 14742 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4284 | 14743 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4285 | 14744 | #endif | ||
4286 | 14745 | |||
4287 | 14447 | .doit = nl80211_tx_control_port, | 14746 | .doit = nl80211_tx_control_port, |
4288 | 14448 | .policy = nl80211_policy, | ||
4289 | 14449 | .flags = GENL_UNS_ADMIN_PERM, | 14747 | .flags = GENL_UNS_ADMIN_PERM, |
4290 | 14450 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14748 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4291 | 14451 | NL80211_FLAG_NEED_RTNL, | 14749 | NL80211_FLAG_NEED_RTNL, |
4292 | 14452 | }, | 14750 | }, |
4293 | 14453 | { | 14751 | { |
4294 | 14454 | .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS, | 14752 | .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS, |
4295 | 14753 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4296 | 14754 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4297 | 14755 | #endif | ||
4298 | 14756 | |||
4299 | 14455 | .doit = nl80211_get_ftm_responder_stats, | 14757 | .doit = nl80211_get_ftm_responder_stats, |
4300 | 14456 | .policy = nl80211_policy, | ||
4301 | 14457 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 14758 | .internal_flags = NL80211_FLAG_NEED_NETDEV | |
4302 | 14458 | NL80211_FLAG_NEED_RTNL, | 14759 | NL80211_FLAG_NEED_RTNL, |
4303 | 14459 | }, | 14760 | }, |
4304 | 14460 | { | 14761 | { |
4305 | 14461 | .cmd = NL80211_CMD_PEER_MEASUREMENT_START, | 14762 | .cmd = NL80211_CMD_PEER_MEASUREMENT_START, |
4306 | 14763 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4307 | 14764 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4308 | 14765 | #endif | ||
4309 | 14766 | |||
4310 | 14462 | .doit = nl80211_pmsr_start, | 14767 | .doit = nl80211_pmsr_start, |
4311 | 14463 | .policy = nl80211_policy, | ||
4312 | 14464 | .flags = GENL_UNS_ADMIN_PERM, | 14768 | .flags = GENL_UNS_ADMIN_PERM, |
4313 | 14465 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | | 14769 | .internal_flags = NL80211_FLAG_NEED_WDEV_UP | |
4314 | 14466 | NL80211_FLAG_NEED_RTNL, | 14770 | NL80211_FLAG_NEED_RTNL, |
4315 | 14467 | }, | 14771 | }, |
4316 | 14468 | { | 14772 | { |
4317 | 14469 | .cmd = NL80211_CMD_NOTIFY_RADAR, | 14773 | .cmd = NL80211_CMD_NOTIFY_RADAR, |
4318 | 14774 | #if LINUX_VERSION_IS_GEQ(5,2,0) | ||
4319 | 14775 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
4320 | 14776 | #endif | ||
4321 | 14777 | |||
4322 | 14470 | .doit = nl80211_notify_radar_detection, | 14778 | .doit = nl80211_notify_radar_detection, |
4323 | 14471 | .policy = nl80211_policy, | ||
4324 | 14472 | .flags = GENL_UNS_ADMIN_PERM, | 14779 | .flags = GENL_UNS_ADMIN_PERM, |
4325 | 14473 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | | 14780 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
4326 | 14474 | NL80211_FLAG_NEED_RTNL, | 14781 | NL80211_FLAG_NEED_RTNL, |
4327 | @@ -14480,6 +14787,7 @@ static struct genl_family nl80211_fam __genl_ro_after_init = { | |||
4328 | 14480 | .hdrsize = 0, /* no private header */ | 14787 | .hdrsize = 0, /* no private header */ |
4329 | 14481 | .version = 1, /* no particular meaning now */ | 14788 | .version = 1, /* no particular meaning now */ |
4330 | 14482 | .maxattr = NL80211_ATTR_MAX, | 14789 | .maxattr = NL80211_ATTR_MAX, |
4331 | 14790 | .policy = nl80211_policy, | ||
4332 | 14483 | .netnsok = true, | 14791 | .netnsok = true, |
4333 | 14484 | .pre_doit = nl80211_pre_doit, | 14792 | .pre_doit = nl80211_pre_doit, |
4334 | 14485 | .post_doit = nl80211_post_doit, | 14793 | .post_doit = nl80211_post_doit, |
4335 | diff --git a/versions b/versions | |||
4336 | index a2de5cc..95f63c9 100644 | |||
4337 | --- a/versions | |||
4338 | +++ b/versions | |||
4339 | @@ -2,4 +2,4 @@ BACKPORTS_VERSION="(see git)" | |||
4340 | 2 | BACKPORTED_KERNEL_VERSION="(see git)" | 2 | BACKPORTED_KERNEL_VERSION="(see git)" |
4341 | 3 | BACKPORTED_KERNEL_NAME="iwlwifi" | 3 | BACKPORTED_KERNEL_NAME="iwlwifi" |
4342 | 4 | BACKPORTS_BUILD_TSTAMP=__DATE__ \" \" __TIME__ | 4 | BACKPORTS_BUILD_TSTAMP=__DATE__ \" \" __TIME__ |
4344 | 5 | BACKPORTS_GIT_TRACKED="iwlwifi-stack-public:master:7858:cb17257d" | 5 | BACKPORTS_GIT_TRACKED="iwlwifi-stack-public:master:7906:7773a757" |
Test build: https:/ /code.launchpad .net/~vicamo/ +recipe/ test-mp- 369867- backport- iwlwifi- dkms