hc
2024-01-31 f9004dbfff8a3fbbd7e2a88c8a4327c7f2f8e5b2
kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
....@@ -1,17 +1,6 @@
1
+// SPDX-License-Identifier: ISC
12 /*
23 * Copyright (c) 2016 Broadcom
3
- *
4
- * Permission to use, copy, modify, and/or distribute this software for any
5
- * purpose with or without fee is hereby granted, provided that the above
6
- * copyright notice and this permission notice appear in all copies.
7
- *
8
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
154 */
165 #include <linux/netdevice.h>
176 #include <linux/gcd.h>
....@@ -68,6 +57,10 @@
6857
6958 mutex_lock(&pi->req_lock);
7059
60
+ /* Nothing to do if we have no requests */
61
+ if (pi->n_reqs == 0)
62
+ goto done;
63
+
7164 /* find request */
7265 for (i = 0; i < pi->n_reqs; i++) {
7366 if (pi->reqs[i]->reqid == reqid)
....@@ -109,6 +102,7 @@
109102 static int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq,
110103 u32 mscan, u32 bestn)
111104 {
105
+ struct brcmf_pub *drvr = ifp->drvr;
112106 struct brcmf_pno_param_le pfn_param;
113107 u16 flags;
114108 u32 pfnmem;
....@@ -132,13 +126,13 @@
132126 /* set bestn in firmware */
133127 err = brcmf_fil_iovar_int_set(ifp, "pfnmem", pfnmem);
134128 if (err < 0) {
135
- brcmf_err("failed to set pfnmem\n");
129
+ bphy_err(drvr, "failed to set pfnmem\n");
136130 goto exit;
137131 }
138132 /* get max mscan which the firmware supports */
139133 err = brcmf_fil_iovar_int_get(ifp, "pfnmem", &pfnmem);
140134 if (err < 0) {
141
- brcmf_err("failed to get pfnmem\n");
135
+ bphy_err(drvr, "failed to get pfnmem\n");
142136 goto exit;
143137 }
144138 mscan = min_t(u32, mscan, pfnmem);
....@@ -152,7 +146,7 @@
152146 err = brcmf_fil_iovar_data_set(ifp, "pfn_set", &pfn_param,
153147 sizeof(pfn_param));
154148 if (err)
155
- brcmf_err("pfn_set failed, err=%d\n", err);
149
+ bphy_err(drvr, "pfn_set failed, err=%d\n", err);
156150
157151 exit:
158152 return err;
....@@ -160,15 +154,16 @@
160154
161155 static int brcmf_pno_set_random(struct brcmf_if *ifp, struct brcmf_pno_info *pi)
162156 {
157
+ struct brcmf_pub *drvr = ifp->drvr;
163158 struct brcmf_pno_macaddr_le pfn_mac;
164159 u8 *mac_addr = NULL;
165160 u8 *mac_mask = NULL;
166
- int err, i;
161
+ int err, i, ri;
167162
168
- for (i = 0; i < pi->n_reqs; i++)
169
- if (pi->reqs[i]->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
170
- mac_addr = pi->reqs[i]->mac_addr;
171
- mac_mask = pi->reqs[i]->mac_addr_mask;
163
+ for (ri = 0; ri < pi->n_reqs; ri++)
164
+ if (pi->reqs[ri]->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
165
+ mac_addr = pi->reqs[ri]->mac_addr;
166
+ mac_mask = pi->reqs[ri]->mac_addr_mask;
172167 break;
173168 }
174169
....@@ -190,11 +185,11 @@
190185 pfn_mac.mac[0] |= 0x02;
191186
192187 brcmf_dbg(SCAN, "enabling random mac: reqid=%llu mac=%pM\n",
193
- pi->reqs[i]->reqid, pfn_mac.mac);
188
+ pi->reqs[ri]->reqid, pfn_mac.mac);
194189 err = brcmf_fil_iovar_data_set(ifp, "pfn_macaddr", &pfn_mac,
195190 sizeof(pfn_mac));
196191 if (err)
197
- brcmf_err("pfn_macaddr failed, err=%d\n", err);
192
+ bphy_err(drvr, "pfn_macaddr failed, err=%d\n", err);
198193
199194 return err;
200195 }
....@@ -202,6 +197,7 @@
202197 static int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid,
203198 bool active)
204199 {
200
+ struct brcmf_pub *drvr = ifp->drvr;
205201 struct brcmf_pno_net_param_le pfn;
206202 int err;
207203
....@@ -218,12 +214,13 @@
218214 brcmf_dbg(SCAN, "adding ssid=%.32s (active=%d)\n", ssid->ssid, active);
219215 err = brcmf_fil_iovar_data_set(ifp, "pfn_add", &pfn, sizeof(pfn));
220216 if (err < 0)
221
- brcmf_err("adding failed: err=%d\n", err);
217
+ bphy_err(drvr, "adding failed: err=%d\n", err);
222218 return err;
223219 }
224220
225221 static int brcmf_pno_add_bssid(struct brcmf_if *ifp, const u8 *bssid)
226222 {
223
+ struct brcmf_pub *drvr = ifp->drvr;
227224 struct brcmf_pno_bssid_le bssid_cfg;
228225 int err;
229226
....@@ -234,7 +231,7 @@
234231 err = brcmf_fil_iovar_data_set(ifp, "pfn_add_bssid", &bssid_cfg,
235232 sizeof(bssid_cfg));
236233 if (err < 0)
237
- brcmf_err("adding failed: err=%d\n", err);
234
+ bphy_err(drvr, "adding failed: err=%d\n", err);
238235 return err;
239236 }
240237
....@@ -258,6 +255,7 @@
258255
259256 static int brcmf_pno_clean(struct brcmf_if *ifp)
260257 {
258
+ struct brcmf_pub *drvr = ifp->drvr;
261259 int ret;
262260
263261 /* Disable pfn */
....@@ -267,7 +265,7 @@
267265 ret = brcmf_fil_iovar_data_set(ifp, "pfnclear", NULL, 0);
268266 }
269267 if (ret < 0)
270
- brcmf_err("failed code %d\n", ret);
268
+ bphy_err(drvr, "failed code %d\n", ret);
271269
272270 return ret;
273271 }
....@@ -392,6 +390,7 @@
392390
393391 static int brcmf_pno_config_sched_scans(struct brcmf_if *ifp)
394392 {
393
+ struct brcmf_pub *drvr = ifp->drvr;
395394 struct brcmf_pno_info *pi;
396395 struct brcmf_gscan_config *gscan_cfg;
397396 struct brcmf_gscan_bucket_config *buckets;
....@@ -416,7 +415,7 @@
416415 /* clean up everything */
417416 err = brcmf_pno_clean(ifp);
418417 if (err < 0) {
419
- brcmf_err("failed error=%d\n", err);
418
+ bphy_err(drvr, "failed error=%d\n", err);
420419 goto free_gscan;
421420 }
422421
....@@ -496,6 +495,11 @@
496495 brcmf_dbg(TRACE, "reqid=%llu\n", reqid);
497496
498497 pi = ifp_to_pno(ifp);
498
+
499
+ /* No PNO request */
500
+ if (!pi->n_reqs)
501
+ return 0;
502
+
499503 err = brcmf_pno_remove_request(pi, reqid);
500504 if (err)
501505 return err;