| .. | .. |
|---|
| 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; |
|---|