.. | .. |
---|
| 1 | +// SPDX-License-Identifier: ISC |
---|
1 | 2 | /* |
---|
2 | 3 | * 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. |
---|
15 | 4 | */ |
---|
16 | 5 | #include <linux/netdevice.h> |
---|
17 | 6 | #include <linux/gcd.h> |
---|
.. | .. |
---|
68 | 57 | |
---|
69 | 58 | mutex_lock(&pi->req_lock); |
---|
70 | 59 | |
---|
| 60 | + /* Nothing to do if we have no requests */ |
---|
| 61 | + if (pi->n_reqs == 0) |
---|
| 62 | + goto done; |
---|
| 63 | + |
---|
71 | 64 | /* find request */ |
---|
72 | 65 | for (i = 0; i < pi->n_reqs; i++) { |
---|
73 | 66 | if (pi->reqs[i]->reqid == reqid) |
---|
.. | .. |
---|
109 | 102 | static int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq, |
---|
110 | 103 | u32 mscan, u32 bestn) |
---|
111 | 104 | { |
---|
| 105 | + struct brcmf_pub *drvr = ifp->drvr; |
---|
112 | 106 | struct brcmf_pno_param_le pfn_param; |
---|
113 | 107 | u16 flags; |
---|
114 | 108 | u32 pfnmem; |
---|
.. | .. |
---|
132 | 126 | /* set bestn in firmware */ |
---|
133 | 127 | err = brcmf_fil_iovar_int_set(ifp, "pfnmem", pfnmem); |
---|
134 | 128 | if (err < 0) { |
---|
135 | | - brcmf_err("failed to set pfnmem\n"); |
---|
| 129 | + bphy_err(drvr, "failed to set pfnmem\n"); |
---|
136 | 130 | goto exit; |
---|
137 | 131 | } |
---|
138 | 132 | /* get max mscan which the firmware supports */ |
---|
139 | 133 | err = brcmf_fil_iovar_int_get(ifp, "pfnmem", &pfnmem); |
---|
140 | 134 | if (err < 0) { |
---|
141 | | - brcmf_err("failed to get pfnmem\n"); |
---|
| 135 | + bphy_err(drvr, "failed to get pfnmem\n"); |
---|
142 | 136 | goto exit; |
---|
143 | 137 | } |
---|
144 | 138 | mscan = min_t(u32, mscan, pfnmem); |
---|
.. | .. |
---|
152 | 146 | err = brcmf_fil_iovar_data_set(ifp, "pfn_set", &pfn_param, |
---|
153 | 147 | sizeof(pfn_param)); |
---|
154 | 148 | if (err) |
---|
155 | | - brcmf_err("pfn_set failed, err=%d\n", err); |
---|
| 149 | + bphy_err(drvr, "pfn_set failed, err=%d\n", err); |
---|
156 | 150 | |
---|
157 | 151 | exit: |
---|
158 | 152 | return err; |
---|
.. | .. |
---|
160 | 154 | |
---|
161 | 155 | static int brcmf_pno_set_random(struct brcmf_if *ifp, struct brcmf_pno_info *pi) |
---|
162 | 156 | { |
---|
| 157 | + struct brcmf_pub *drvr = ifp->drvr; |
---|
163 | 158 | struct brcmf_pno_macaddr_le pfn_mac; |
---|
164 | 159 | u8 *mac_addr = NULL; |
---|
165 | 160 | u8 *mac_mask = NULL; |
---|
166 | | - int err, i; |
---|
| 161 | + int err, i, ri; |
---|
167 | 162 | |
---|
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; |
---|
172 | 167 | break; |
---|
173 | 168 | } |
---|
174 | 169 | |
---|
.. | .. |
---|
190 | 185 | pfn_mac.mac[0] |= 0x02; |
---|
191 | 186 | |
---|
192 | 187 | 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); |
---|
194 | 189 | err = brcmf_fil_iovar_data_set(ifp, "pfn_macaddr", &pfn_mac, |
---|
195 | 190 | sizeof(pfn_mac)); |
---|
196 | 191 | if (err) |
---|
197 | | - brcmf_err("pfn_macaddr failed, err=%d\n", err); |
---|
| 192 | + bphy_err(drvr, "pfn_macaddr failed, err=%d\n", err); |
---|
198 | 193 | |
---|
199 | 194 | return err; |
---|
200 | 195 | } |
---|
.. | .. |
---|
202 | 197 | static int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid, |
---|
203 | 198 | bool active) |
---|
204 | 199 | { |
---|
| 200 | + struct brcmf_pub *drvr = ifp->drvr; |
---|
205 | 201 | struct brcmf_pno_net_param_le pfn; |
---|
206 | 202 | int err; |
---|
207 | 203 | |
---|
.. | .. |
---|
218 | 214 | brcmf_dbg(SCAN, "adding ssid=%.32s (active=%d)\n", ssid->ssid, active); |
---|
219 | 215 | err = brcmf_fil_iovar_data_set(ifp, "pfn_add", &pfn, sizeof(pfn)); |
---|
220 | 216 | if (err < 0) |
---|
221 | | - brcmf_err("adding failed: err=%d\n", err); |
---|
| 217 | + bphy_err(drvr, "adding failed: err=%d\n", err); |
---|
222 | 218 | return err; |
---|
223 | 219 | } |
---|
224 | 220 | |
---|
225 | 221 | static int brcmf_pno_add_bssid(struct brcmf_if *ifp, const u8 *bssid) |
---|
226 | 222 | { |
---|
| 223 | + struct brcmf_pub *drvr = ifp->drvr; |
---|
227 | 224 | struct brcmf_pno_bssid_le bssid_cfg; |
---|
228 | 225 | int err; |
---|
229 | 226 | |
---|
.. | .. |
---|
234 | 231 | err = brcmf_fil_iovar_data_set(ifp, "pfn_add_bssid", &bssid_cfg, |
---|
235 | 232 | sizeof(bssid_cfg)); |
---|
236 | 233 | if (err < 0) |
---|
237 | | - brcmf_err("adding failed: err=%d\n", err); |
---|
| 234 | + bphy_err(drvr, "adding failed: err=%d\n", err); |
---|
238 | 235 | return err; |
---|
239 | 236 | } |
---|
240 | 237 | |
---|
.. | .. |
---|
258 | 255 | |
---|
259 | 256 | static int brcmf_pno_clean(struct brcmf_if *ifp) |
---|
260 | 257 | { |
---|
| 258 | + struct brcmf_pub *drvr = ifp->drvr; |
---|
261 | 259 | int ret; |
---|
262 | 260 | |
---|
263 | 261 | /* Disable pfn */ |
---|
.. | .. |
---|
267 | 265 | ret = brcmf_fil_iovar_data_set(ifp, "pfnclear", NULL, 0); |
---|
268 | 266 | } |
---|
269 | 267 | if (ret < 0) |
---|
270 | | - brcmf_err("failed code %d\n", ret); |
---|
| 268 | + bphy_err(drvr, "failed code %d\n", ret); |
---|
271 | 269 | |
---|
272 | 270 | return ret; |
---|
273 | 271 | } |
---|
.. | .. |
---|
392 | 390 | |
---|
393 | 391 | static int brcmf_pno_config_sched_scans(struct brcmf_if *ifp) |
---|
394 | 392 | { |
---|
| 393 | + struct brcmf_pub *drvr = ifp->drvr; |
---|
395 | 394 | struct brcmf_pno_info *pi; |
---|
396 | 395 | struct brcmf_gscan_config *gscan_cfg; |
---|
397 | 396 | struct brcmf_gscan_bucket_config *buckets; |
---|
.. | .. |
---|
416 | 415 | /* clean up everything */ |
---|
417 | 416 | err = brcmf_pno_clean(ifp); |
---|
418 | 417 | if (err < 0) { |
---|
419 | | - brcmf_err("failed error=%d\n", err); |
---|
| 418 | + bphy_err(drvr, "failed error=%d\n", err); |
---|
420 | 419 | goto free_gscan; |
---|
421 | 420 | } |
---|
422 | 421 | |
---|
.. | .. |
---|
496 | 495 | brcmf_dbg(TRACE, "reqid=%llu\n", reqid); |
---|
497 | 496 | |
---|
498 | 497 | pi = ifp_to_pno(ifp); |
---|
| 498 | + |
---|
| 499 | + /* No PNO request */ |
---|
| 500 | + if (!pi->n_reqs) |
---|
| 501 | + return 0; |
---|
| 502 | + |
---|
499 | 503 | err = brcmf_pno_remove_request(pi, reqid); |
---|
500 | 504 | if (err) |
---|
501 | 505 | return err; |
---|