sunxi: improve A20 Lime2 upload speed
[openwrt/staging/lynxis.git] / package / kernel / mac80211 / patches / 007-revert-genetlink-changes.patch
1 --- a/net/wireless/nl80211.c
2 +++ b/net/wireless/nl80211.c
3 @@ -32,8 +32,22 @@ static int nl80211_crypto_settings(struc
4 struct cfg80211_crypto_settings *settings,
5 int cipher_limit);
6
7 +static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
8 + struct genl_info *info);
9 +static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
10 + struct genl_info *info);
11 +
12 /* the netlink family */
13 -static struct genl_family nl80211_fam;
14 +static struct genl_family nl80211_fam = {
15 + .id = GENL_ID_GENERATE, /* don't bother with a hardcoded ID */
16 + .name = NL80211_GENL_NAME, /* have users key off the name instead */
17 + .hdrsize = 0, /* no private header */
18 + .version = 1, /* no particular meaning now */
19 + .maxattr = NL80211_ATTR_MAX,
20 + .netnsok = true,
21 + .pre_doit = nl80211_pre_doit,
22 + .post_doit = nl80211_post_doit,
23 +};
24
25 /* multicast groups */
26 enum nl80211_multicast_groups {
27 @@ -549,14 +563,13 @@ static int nl80211_prepare_wdev_dump(str
28
29 if (!cb->args[0]) {
30 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
31 - genl_family_attrbuf(&nl80211_fam),
32 - nl80211_fam.maxattr, nl80211_policy);
33 + nl80211_fam.attrbuf, nl80211_fam.maxattr,
34 + nl80211_policy);
35 if (err)
36 goto out_unlock;
37
38 - *wdev = __cfg80211_wdev_from_attrs(
39 - sock_net(skb->sk),
40 - genl_family_attrbuf(&nl80211_fam));
41 + *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk),
42 + nl80211_fam.attrbuf);
43 if (IS_ERR(*wdev)) {
44 err = PTR_ERR(*wdev);
45 goto out_unlock;
46 @@ -1903,7 +1916,7 @@ static int nl80211_dump_wiphy_parse(stru
47 struct netlink_callback *cb,
48 struct nl80211_dump_wiphy_state *state)
49 {
50 - struct nlattr **tb = genl_family_attrbuf(&nl80211_fam);
51 + struct nlattr **tb = nl80211_fam.attrbuf;
52 int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
53 tb, nl80211_fam.maxattr, nl80211_policy);
54 /* ignore parse errors for backward compatibility */
55 @@ -7733,7 +7746,6 @@ static int nl80211_send_survey(struct sk
56
57 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
58 {
59 - struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
60 struct survey_info survey;
61 struct cfg80211_registered_device *rdev;
62 struct wireless_dev *wdev;
63 @@ -7746,7 +7758,7 @@ static int nl80211_dump_survey(struct sk
64 return res;
65
66 /* prepare_wdev_dump parsed the attributes */
67 - radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
68 + radio_stats = nl80211_fam.attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
69
70 if (!wdev->netdev) {
71 res = -EINVAL;
72 @@ -8594,14 +8606,14 @@ static int nl80211_testmode_dump(struct
73 */
74 phy_idx = cb->args[0] - 1;
75 } else {
76 - struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
77 -
78 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
79 - attrbuf, nl80211_fam.maxattr, nl80211_policy);
80 + nl80211_fam.attrbuf, nl80211_fam.maxattr,
81 + nl80211_policy);
82 if (err)
83 goto out_err;
84
85 - rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
86 + rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk),
87 + nl80211_fam.attrbuf);
88 if (IS_ERR(rdev)) {
89 err = PTR_ERR(rdev);
90 goto out_err;
91 @@ -8609,8 +8621,9 @@ static int nl80211_testmode_dump(struct
92 phy_idx = rdev->wiphy_idx;
93 rdev = NULL;
94
95 - if (attrbuf[NL80211_ATTR_TESTDATA])
96 - cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA];
97 + if (nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA])
98 + cb->args[1] =
99 + (long)nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA];
100 }
101
102 if (cb->args[1]) {
103 @@ -10814,7 +10827,8 @@ static int handle_nan_filter(struct nlat
104
105 i = 0;
106 nla_for_each_nested(attr, attr_filter, rem) {
107 - filter[i].filter = nla_memdup(attr, GFP_KERNEL);
108 + filter[i].filter = kmemdup(nla_data(attr), nla_len(attr),
109 + GFP_KERNEL);
110 filter[i].len = nla_len(attr);
111 i++;
112 }
113 @@ -11450,7 +11464,6 @@ static int nl80211_prepare_vendor_dump(s
114 struct cfg80211_registered_device **rdev,
115 struct wireless_dev **wdev)
116 {
117 - struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
118 u32 vid, subcmd;
119 unsigned int i;
120 int vcmd_idx = -1;
121 @@ -11486,28 +11499,31 @@ static int nl80211_prepare_vendor_dump(s
122 }
123
124 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
125 - attrbuf, nl80211_fam.maxattr, nl80211_policy);
126 + nl80211_fam.attrbuf, nl80211_fam.maxattr,
127 + nl80211_policy);
128 if (err)
129 goto out_unlock;
130
131 - if (!attrbuf[NL80211_ATTR_VENDOR_ID] ||
132 - !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) {
133 + if (!nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID] ||
134 + !nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) {
135 err = -EINVAL;
136 goto out_unlock;
137 }
138
139 - *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf);
140 + *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk),
141 + nl80211_fam.attrbuf);
142 if (IS_ERR(*wdev))
143 *wdev = NULL;
144
145 - *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
146 + *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk),
147 + nl80211_fam.attrbuf);
148 if (IS_ERR(*rdev)) {
149 err = PTR_ERR(*rdev);
150 goto out_unlock;
151 }
152
153 - vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]);
154 - subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
155 + vid = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID]);
156 + subcmd = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
157
158 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) {
159 const struct wiphy_vendor_command *vcmd;
160 @@ -11531,9 +11547,9 @@ static int nl80211_prepare_vendor_dump(s
161 goto out_unlock;
162 }
163
164 - if (attrbuf[NL80211_ATTR_VENDOR_DATA]) {
165 - data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]);
166 - data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]);
167 + if (nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]) {
168 + data = nla_data(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]);
169 + data_len = nla_len(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]);
170 }
171
172 /* 0 is the first index - add 1 to parse only once */
173 @@ -12795,21 +12811,6 @@ static __genl_const struct genl_ops nl80
174 },
175 };
176
177 -static struct genl_family nl80211_fam __ro_after_init = {
178 - .name = NL80211_GENL_NAME, /* have users key off the name instead */
179 - .hdrsize = 0, /* no private header */
180 - .version = 1, /* no particular meaning now */
181 - .maxattr = NL80211_ATTR_MAX,
182 - .netnsok = true,
183 - .pre_doit = nl80211_pre_doit,
184 - .post_doit = nl80211_post_doit,
185 - .module = THIS_MODULE,
186 - .ops = nl80211_ops,
187 - .n_ops = ARRAY_SIZE(nl80211_ops),
188 - .mcgrps = nl80211_mcgrps,
189 - .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps),
190 -};
191 -
192 /* notification functions */
193
194 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
195 @@ -14759,11 +14760,12 @@ void nl80211_send_ap_stopped(struct wire
196
197 /* initialisation/exit functions */
198
199 -int __init nl80211_init(void)
200 +int nl80211_init(void)
201 {
202 int err;
203
204 - err = genl_register_family(&nl80211_fam);
205 + err = genl_register_family_with_ops_groups(&nl80211_fam, nl80211_ops,
206 + nl80211_mcgrps);
207 if (err)
208 return err;
209
210 --- a/drivers/net/wireless/mac80211_hwsim.c
211 +++ b/drivers/net/wireless/mac80211_hwsim.c
212 @@ -587,8 +587,15 @@ struct hwsim_radiotap_ack_hdr {
213 __le16 rt_chbitmask;
214 } __packed;
215
216 -/* MAC80211_HWSIM netlink family */
217 -static struct genl_family hwsim_genl_family;
218 +/* MAC80211_HWSIM netlinf family */
219 +static struct genl_family hwsim_genl_family = {
220 + .id = GENL_ID_GENERATE,
221 + .hdrsize = 0,
222 + .name = "MAC80211_HWSIM",
223 + .version = 1,
224 + .maxattr = HWSIM_ATTR_MAX,
225 + .netnsok = true,
226 +};
227
228 enum hwsim_multicast_groups {
229 HWSIM_MCGRP_CONFIG,
230 @@ -3250,18 +3257,6 @@ static __genl_const struct genl_ops hwsi
231 },
232 };
233
234 -static struct genl_family hwsim_genl_family __ro_after_init = {
235 - .name = "MAC80211_HWSIM",
236 - .version = 1,
237 - .maxattr = HWSIM_ATTR_MAX,
238 - .netnsok = true,
239 - .module = THIS_MODULE,
240 - .ops = hwsim_ops,
241 - .n_ops = ARRAY_SIZE(hwsim_ops),
242 - .mcgrps = hwsim_mcgrps,
243 - .n_mcgrps = ARRAY_SIZE(hwsim_mcgrps),
244 -};
245 -
246 static void destroy_radio(struct work_struct *work)
247 {
248 struct mac80211_hwsim_data *data =
249 @@ -3309,13 +3304,15 @@ static struct notifier_block hwsim_netli
250 .notifier_call = mac80211_hwsim_netlink_notify,
251 };
252
253 -static int __init hwsim_init_netlink(void)
254 +static int hwsim_init_netlink(void)
255 {
256 int rc;
257
258 printk(KERN_INFO "mac80211_hwsim: initializing netlink\n");
259
260 - rc = genl_register_family(&hwsim_genl_family);
261 + rc = genl_register_family_with_ops_groups(&hwsim_genl_family,
262 + hwsim_ops,
263 + hwsim_mcgrps);
264 if (rc)
265 goto failure;
266