Lines Matching +full:traffic +full:- +full:patterns
1 // SPDX-License-Identifier: ISC
51 #define WPA_CIPHER_WEP_40 1 /* WEP (40-bit) */
54 #define WPA_CIPHER_WEP_104 5 /* WEP (104-bit) */
58 #define RSN_AKM_PSK 2 /* Pre-shared Key */
60 #define RSN_AKM_SHA256_PSK 6 /* SHA256, Pre-shared Key */
94 #define CHAN_NOISE_DUMMY (-80)
103 (sizeof(struct brcmf_assoc_params_le) - sizeof(u16))
106 (BRCMF_DCMD_MEDLEN / sizeof(__le32) - 1)
130 if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state)) { in check_vif_up()
132 vif->sme_state); in check_vif_up()
164 #define wl_a_rates_size (wl_g_rates_size - 4)
225 REG_RULE(2412-10, 2472+10, 40, 6, 20, 0),
227 /* IEEE 802.11 channel 14 - Only JP enables
230 REG_RULE(2484-10, 2484+10, 20, 6, 20, 0),
232 REG_RULE(5150-10, 5350+10, 160, 6, 20, 0),
234 REG_RULE(5470-10, 5850+10, 160, 6, 20, 0), }
334 ch->chan->center_freq, ch->center_freq1, ch->width); in chandef_to_chanspec()
335 ch_inf.chnum = ieee80211_frequency_to_channel(ch->center_freq1); in chandef_to_chanspec()
336 primary_offset = ch->chan->center_freq - ch->center_freq1; in chandef_to_chanspec()
337 switch (ch->width) { in chandef_to_chanspec()
352 if (primary_offset == -30) in chandef_to_chanspec()
354 else if (primary_offset == -10) in chandef_to_chanspec()
363 if (primary_offset == -70) in chandef_to_chanspec()
365 else if (primary_offset == -50) in chandef_to_chanspec()
367 else if (primary_offset == -30) in chandef_to_chanspec()
369 else if (primary_offset == -10) in chandef_to_chanspec()
386 switch (ch->chan->band) { in chandef_to_chanspec()
397 d11inf->encchspec(&ch_inf); in chandef_to_chanspec()
408 ch_inf.chnum = ieee80211_frequency_to_channel(ch->center_freq); in channel_to_chanspec()
410 d11inf->encchspec(&ch_inf); in channel_to_chanspec()
415 /* Traverse a string of 1-byte tag/1-byte length/variable-length value
427 int len = elt->len; in brcmf_parse_tlvs()
430 if ((elt->id == key) && (totlen >= (len + TLV_HDR_LEN))) in brcmf_parse_tlvs()
434 totlen -= (len + TLV_HDR_LEN); in brcmf_parse_tlvs()
459 *tlvs_len -= (int)(ie - *tlvs); in brcmf_tlv_has_ie()
503 list_for_each_entry(pos, &cfg->vif_list, list) in brcmf_vif_change_validate()
509 params.iftype_num[pos->wdev.iftype]++; in brcmf_vif_change_validate()
513 ret = cfg80211_check_combinations(cfg->wiphy, ¶ms); in brcmf_vif_change_validate()
526 list_for_each_entry(pos, &cfg->vif_list, list) in brcmf_vif_add_validate()
527 params.iftype_num[pos->wdev.iftype]++; in brcmf_vif_add_validate()
530 return cfg80211_check_combinations(cfg->wiphy, ¶ms); in brcmf_vif_add_validate()
536 key_le->index = cpu_to_le32(key->index); in convert_key_from_CPU()
537 key_le->len = cpu_to_le32(key->len); in convert_key_from_CPU()
538 key_le->algo = cpu_to_le32(key->algo); in convert_key_from_CPU()
539 key_le->flags = cpu_to_le32(key->flags); in convert_key_from_CPU()
540 key_le->rxiv.hi = cpu_to_le32(key->rxiv.hi); in convert_key_from_CPU()
541 key_le->rxiv.lo = cpu_to_le16(key->rxiv.lo); in convert_key_from_CPU()
542 key_le->iv_initialized = cpu_to_le32(key->iv_initialized); in convert_key_from_CPU()
543 memcpy(key_le->data, key->data, sizeof(key->data)); in convert_key_from_CPU()
544 memcpy(key_le->ea, key->ea, sizeof(key->ea)); in convert_key_from_CPU()
550 struct brcmf_pub *drvr = ifp->drvr; in send_key_to_dongle()
573 ifp = vif->ifp; in brcmf_cfg80211_update_proto_addr_mode()
575 if ((wdev->iftype == NL80211_IFTYPE_ADHOC) || in brcmf_cfg80211_update_proto_addr_mode()
576 (wdev->iftype == NL80211_IFTYPE_AP) || in brcmf_cfg80211_update_proto_addr_mode()
577 (wdev->iftype == NL80211_IFTYPE_P2P_GO)) in brcmf_cfg80211_update_proto_addr_mode()
578 brcmf_proto_configure_addr_mode(ifp->drvr, ifp->ifidx, in brcmf_cfg80211_update_proto_addr_mode()
581 brcmf_proto_configure_addr_mode(ifp->drvr, ifp->ifidx, in brcmf_cfg80211_update_proto_addr_mode()
593 if (!drvr->iflist[bsscfgidx]) in brcmf_get_first_free_bsscfgidx()
597 return -ENOMEM; in brcmf_get_first_free_bsscfgidx()
602 u8 mac_idx = ifp->drvr->sta_mac_idx; in brcmf_set_vif_sta_macaddr()
605 memcpy(mac_addr, ifp->mac_addr, ETH_ALEN); in brcmf_set_vif_sta_macaddr()
610 ifp->drvr->sta_mac_idx = mac_idx; in brcmf_set_vif_sta_macaddr()
670 return -EOPNOTSUPP; in brcmf_cfg80211_request_sta_if()
694 err = -EOPNOTSUPP; in brcmf_cfg80211_request_sta_if()
701 return -EIO; in brcmf_cfg80211_request_sta_if()
713 struct brcmf_pub *drvr = ifp->drvr; in brcmf_cfg80211_request_ap_if()
763 return -EOPNOTSUPP; in brcmf_cfg80211_request_ap_if()
784 err = -EOPNOTSUPP; in brcmf_cfg80211_request_ap_if()
792 bsscfgidx = brcmf_get_first_free_bsscfgidx(ifp->drvr); in brcmf_cfg80211_request_ap_if()
811 * brcmf_apsta_add_vif() - create a new AP or STA virtual interface
818 * Return: pointer to new vif on success, ERR_PTR(-errno) if not
827 struct brcmf_pub *drvr = cfg->pub; in brcmf_apsta_add_vif()
832 return ERR_PTR(-EINVAL); in brcmf_apsta_add_vif()
835 return ERR_PTR(-EBUSY); in brcmf_apsta_add_vif()
846 err = brcmf_cfg80211_request_sta_if(ifp, params->macaddr); in brcmf_apsta_add_vif()
860 err = -EIO; in brcmf_apsta_add_vif()
865 ifp = vif->ifp; in brcmf_apsta_add_vif()
868 err = -ENOENT; in brcmf_apsta_add_vif()
872 strscpy(ifp->ndev->name, name, sizeof(ifp->ndev->name)); in brcmf_apsta_add_vif()
876 free_netdev(ifp->ndev); in brcmf_apsta_add_vif()
880 return &ifp->vif->wdev; in brcmf_apsta_add_vif()
891 iftype = vif->wdev.iftype; in brcmf_is_apmode()
897 return vif->wdev.iftype == NL80211_IFTYPE_ADHOC; in brcmf_is_ibssmode()
901 * brcmf_mon_add_vif() - create monitor mode virtual interface
906 * Return: pointer to new vif on success, ERR_PTR(-errno) if not
917 if (cfg->pub->mon_if) { in brcmf_mon_add_vif()
918 err = -EEXIST; in brcmf_mon_add_vif()
930 err = -ENOMEM; in brcmf_mon_add_vif()
933 ndev->type = ARPHRD_IEEE80211_RADIOTAP; in brcmf_mon_add_vif()
934 ndev->ieee80211_ptr = &vif->wdev; in brcmf_mon_add_vif()
935 ndev->needs_free_netdev = true; in brcmf_mon_add_vif()
936 ndev->priv_destructor = brcmf_cfg80211_free_netdev; in brcmf_mon_add_vif()
937 SET_NETDEV_DEV(ndev, wiphy_dev(cfg->wiphy)); in brcmf_mon_add_vif()
940 ifp->vif = vif; in brcmf_mon_add_vif()
941 ifp->ndev = ndev; in brcmf_mon_add_vif()
942 ifp->drvr = cfg->pub; in brcmf_mon_add_vif()
944 vif->ifp = ifp; in brcmf_mon_add_vif()
945 vif->wdev.netdev = ndev; in brcmf_mon_add_vif()
949 brcmf_err("Failed to attach %s device\n", ndev->name); in brcmf_mon_add_vif()
954 cfg->pub->mon_if = ifp; in brcmf_mon_add_vif()
956 return &vif->wdev; in brcmf_mon_add_vif()
967 struct net_device *ndev = wdev->netdev; in brcmf_mon_del_vif()
969 ndev->netdev_ops->ndo_stop(ndev); in brcmf_mon_del_vif()
973 cfg->pub->mon_if = NULL; in brcmf_mon_del_vif()
985 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_add_iface()
1000 return ERR_PTR(-EOPNOTSUPP); in brcmf_cfg80211_add_iface()
1014 return ERR_PTR(-EINVAL); in brcmf_cfg80211_add_iface()
1034 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_mpc()
1037 if (check_vif_up(ifp->vif)) { in brcmf_set_mpc()
1054 memcpy(¶ms_le->ssid_le, ¶ms_v2_le->ssid_le, in brcmf_scan_params_v2_to_v1()
1055 sizeof(params_le->ssid_le)); in brcmf_scan_params_v2_to_v1()
1056 memcpy(¶ms_le->bssid, ¶ms_v2_le->bssid, in brcmf_scan_params_v2_to_v1()
1057 sizeof(params_le->bssid)); in brcmf_scan_params_v2_to_v1()
1059 params_le->bss_type = params_v2_le->bss_type; in brcmf_scan_params_v2_to_v1()
1060 params_le->scan_type = le32_to_cpu(params_v2_le->scan_type); in brcmf_scan_params_v2_to_v1()
1061 params_le->nprobes = params_v2_le->nprobes; in brcmf_scan_params_v2_to_v1()
1062 params_le->active_time = params_v2_le->active_time; in brcmf_scan_params_v2_to_v1()
1063 params_le->passive_time = params_v2_le->passive_time; in brcmf_scan_params_v2_to_v1()
1064 params_le->home_time = params_v2_le->home_time; in brcmf_scan_params_v2_to_v1()
1065 params_le->channel_num = params_v2_le->channel_num; in brcmf_scan_params_v2_to_v1()
1067 ch = le32_to_cpu(params_v2_le->channel_num); in brcmf_scan_params_v2_to_v1()
1077 memcpy(¶ms_le->channel_list[0], in brcmf_scan_params_v2_to_v1()
1078 ¶ms_v2_le->channel_list[0], params_size); in brcmf_scan_params_v2_to_v1()
1094 eth_broadcast_addr(params_le->bssid); in brcmf_escan_prep()
1098 params_le->version = cpu_to_le16(BRCMF_SCAN_PARAMS_VERSION_V2); in brcmf_escan_prep()
1099 params_le->bss_type = DOT11_BSSTYPE_ANY; in brcmf_escan_prep()
1100 params_le->scan_type = cpu_to_le32(BRCMF_SCANTYPE_ACTIVE); in brcmf_escan_prep()
1101 params_le->channel_num = 0; in brcmf_escan_prep()
1102 params_le->nprobes = cpu_to_le32(-1); in brcmf_escan_prep()
1103 params_le->active_time = cpu_to_le32(-1); in brcmf_escan_prep()
1104 params_le->passive_time = cpu_to_le32(-1); in brcmf_escan_prep()
1105 params_le->home_time = cpu_to_le32(-1); in brcmf_escan_prep()
1106 memset(¶ms_le->ssid_le, 0, sizeof(params_le->ssid_le)); in brcmf_escan_prep()
1111 params_le->channel_num = cpu_to_le32(1); in brcmf_escan_prep()
1112 params_le->channel_list[0] = cpu_to_le16(-1); in brcmf_escan_prep()
1113 params_le->length = cpu_to_le16(length); in brcmf_escan_prep()
1117 n_ssids = request->n_ssids; in brcmf_escan_prep()
1118 n_channels = request->n_channels; in brcmf_escan_prep()
1126 chanspec = channel_to_chanspec(&cfg->d11inf, in brcmf_escan_prep()
1127 request->channels[i]); in brcmf_escan_prep()
1129 request->channels[i]->hw_value, chanspec); in brcmf_escan_prep()
1130 params_le->channel_list[i] = cpu_to_le16(chanspec); in brcmf_escan_prep()
1147 cpu_to_le32(request->ssids[i].ssid_len); in brcmf_escan_prep()
1148 memcpy(ssid_le.SSID, request->ssids[i].ssid, in brcmf_escan_prep()
1149 request->ssids[i].ssid_len); in brcmf_escan_prep()
1160 params_le->scan_type = cpu_to_le32(BRCMF_SCANTYPE_PASSIVE); in brcmf_escan_prep()
1162 params_le->length = cpu_to_le16(length); in brcmf_escan_prep()
1164 params_le->channel_num = in brcmf_escan_prep()
1173 struct brcmf_pub *drvr = cfg->pub; in brcmf_notify_escan_complete()
1184 scan_request = cfg->scan_request; in brcmf_notify_escan_complete()
1185 cfg->scan_request = NULL; in brcmf_notify_escan_complete()
1187 timer_delete_sync(&cfg->escan_timeout); in brcmf_notify_escan_complete()
1195 /* E-Scan (or anyother type) can be aborted by SCAN */ in brcmf_notify_escan_complete()
1216 * e-scan can be initiated internally in brcmf_notify_escan_complete()
1219 if (cfg->int_escan_map) { in brcmf_notify_escan_complete()
1221 cfg->int_escan_map); in brcmf_notify_escan_complete()
1222 while (cfg->int_escan_map) { in brcmf_notify_escan_complete()
1223 bucket = __ffs(cfg->int_escan_map); in brcmf_notify_escan_complete()
1224 cfg->int_escan_map &= ~BIT(bucket); in brcmf_notify_escan_complete()
1225 reqid = brcmf_pno_find_reqid_by_bucket(cfg->pno, in brcmf_notify_escan_complete()
1243 if (!test_and_clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) in brcmf_notify_escan_complete()
1253 struct net_device *ndev = wdev->netdev; in brcmf_cfg80211_del_apsta_iface()
1255 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_del_apsta_iface()
1259 brcmf_cfg80211_arm_vif_event(cfg, ifp->vif); in brcmf_cfg80211_del_apsta_iface()
1272 err = -EIO; in brcmf_cfg80211_del_apsta_iface()
1287 struct net_device *ndev = wdev->netdev; in brcmf_cfg80211_del_iface()
1290 return -ENOTSUPP; in brcmf_cfg80211_del_iface()
1294 return -EBUSY; in brcmf_cfg80211_del_iface()
1297 if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status) && in brcmf_cfg80211_del_iface()
1298 cfg->escan_info.ifp == netdev_priv(ndev)) in brcmf_cfg80211_del_iface()
1305 switch (wdev->iftype) { in brcmf_cfg80211_del_iface()
1310 return -EOPNOTSUPP; in brcmf_cfg80211_del_iface()
1322 return -EINVAL; in brcmf_cfg80211_del_iface()
1324 return -EOPNOTSUPP; in brcmf_cfg80211_del_iface()
1334 struct brcmf_cfg80211_vif *vif = ifp->vif; in brcmf_cfg80211_change_iface()
1335 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_change_iface()
1340 brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, type=%d\n", ifp->bsscfgidx, in brcmf_cfg80211_change_iface()
1352 ((vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) || in brcmf_cfg80211_change_iface()
1353 (vif->wdev.iftype == NL80211_IFTYPE_P2P_GO) || in brcmf_cfg80211_change_iface()
1354 (vif->wdev.iftype == NL80211_IFTYPE_P2P_DEVICE))) { in brcmf_cfg80211_change_iface()
1368 if (cfg->p2p.p2pdev_dynamically) in brcmf_cfg80211_change_iface()
1369 return -EOPNOTSUPP; in brcmf_cfg80211_change_iface()
1383 return -EOPNOTSUPP; in brcmf_cfg80211_change_iface()
1395 err = -EINVAL; in brcmf_cfg80211_change_iface()
1411 err = -EAGAIN; in brcmf_cfg80211_change_iface()
1417 ndev->ieee80211_ptr->iftype = type; in brcmf_cfg80211_change_iface()
1419 brcmf_cfg80211_update_proto_addr_mode(&vif->wdev); in brcmf_cfg80211_change_iface()
1431 struct brcmf_pub *drvr = cfg->pub; in brcmf_run_escan()
1437 brcmf_dbg(SCAN, "E-SCAN START\n"); in brcmf_run_escan()
1441 params_size += sizeof(u32) * ((request->n_channels + 1) / 2); in brcmf_run_escan()
1444 params_size += sizeof(struct brcmf_ssid_le) * request->n_ssids; in brcmf_run_escan()
1449 err = -ENOMEM; in brcmf_run_escan()
1453 brcmf_escan_prep(cfg, ¶ms->params_v2_le, request); in brcmf_run_escan()
1455 params->version = cpu_to_le32(BRCMF_ESCAN_REQ_VERSION_V2); in brcmf_run_escan()
1460 params_size -= BRCMF_SCAN_PARAMS_V2_FIXED_SIZE; in brcmf_run_escan()
1464 err = -ENOMEM; in brcmf_run_escan()
1467 params_v1->version = cpu_to_le32(BRCMF_ESCAN_REQ_VERSION); in brcmf_run_escan()
1468 brcmf_scan_params_v2_to_v1(¶ms->params_v2_le, ¶ms_v1->params_le); in brcmf_run_escan()
1473 params->action = cpu_to_le16(WL_ESCAN_ACTION_START); in brcmf_run_escan()
1474 params->sync_id = cpu_to_le16(0x1234); in brcmf_run_escan()
1478 if (err == -EBUSY) in brcmf_run_escan()
1493 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_do_escan()
1496 struct escan_info *escan = &cfg->escan_info; in brcmf_do_escan()
1499 escan->ifp = ifp; in brcmf_do_escan()
1500 escan->wiphy = cfg->wiphy; in brcmf_do_escan()
1501 escan->escan_state = WL_ESCAN_STATE_SCANNING; in brcmf_do_escan()
1504 results = (struct brcmf_scan_results *)cfg->escan_info.escan_buf; in brcmf_do_escan()
1505 results->version = 0; in brcmf_do_escan()
1506 results->count = 0; in brcmf_do_escan()
1507 results->buflen = WL_ESCAN_RESULTS_FIXED_SIZE; in brcmf_do_escan()
1509 err = escan->run(cfg, ifp, request); in brcmf_do_escan()
1519 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_scan()
1524 vif = container_of(request->wdev, struct brcmf_cfg80211_vif, wdev); in brcmf_cfg80211_scan()
1526 return -EIO; in brcmf_cfg80211_scan()
1528 if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) { in brcmf_cfg80211_scan()
1530 cfg->scan_status); in brcmf_cfg80211_scan()
1531 return -EAGAIN; in brcmf_cfg80211_scan()
1533 if (test_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status)) { in brcmf_cfg80211_scan()
1535 cfg->scan_status); in brcmf_cfg80211_scan()
1536 return -EAGAIN; in brcmf_cfg80211_scan()
1538 if (test_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status)) { in brcmf_cfg80211_scan()
1540 cfg->scan_status); in brcmf_cfg80211_scan()
1541 return -EAGAIN; in brcmf_cfg80211_scan()
1543 if (test_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state)) { in brcmf_cfg80211_scan()
1544 bphy_err(drvr, "Connecting: status (%lu)\n", vif->sme_state); in brcmf_cfg80211_scan()
1545 return -EAGAIN; in brcmf_cfg80211_scan()
1549 if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif) in brcmf_cfg80211_scan()
1550 vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif; in brcmf_cfg80211_scan()
1554 cfg->scan_request = request; in brcmf_cfg80211_scan()
1555 set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); in brcmf_cfg80211_scan()
1557 cfg->escan_info.run = brcmf_run_escan; in brcmf_cfg80211_scan()
1563 request->ie, request->ie_len); in brcmf_cfg80211_scan()
1567 err = brcmf_do_escan(vif->ifp, request); in brcmf_cfg80211_scan()
1572 mod_timer(&cfg->escan_timeout, in brcmf_cfg80211_scan()
1579 clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); in brcmf_cfg80211_scan()
1580 cfg->scan_request = NULL; in brcmf_cfg80211_scan()
1587 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_rts()
1600 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_frag()
1614 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_retry()
1634 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_set_wiphy_params()
1635 return -EIO; in brcmf_cfg80211_set_wiphy_params()
1638 (cfg->conf->rts_threshold != wiphy->rts_threshold)) { in brcmf_cfg80211_set_wiphy_params()
1639 cfg->conf->rts_threshold = wiphy->rts_threshold; in brcmf_cfg80211_set_wiphy_params()
1640 err = brcmf_set_rts(ndev, cfg->conf->rts_threshold); in brcmf_cfg80211_set_wiphy_params()
1645 (cfg->conf->frag_threshold != wiphy->frag_threshold)) { in brcmf_cfg80211_set_wiphy_params()
1646 cfg->conf->frag_threshold = wiphy->frag_threshold; in brcmf_cfg80211_set_wiphy_params()
1647 err = brcmf_set_frag(ndev, cfg->conf->frag_threshold); in brcmf_cfg80211_set_wiphy_params()
1652 && (cfg->conf->retry_long != wiphy->retry_long)) { in brcmf_cfg80211_set_wiphy_params()
1653 cfg->conf->retry_long = wiphy->retry_long; in brcmf_cfg80211_set_wiphy_params()
1654 err = brcmf_set_retry(ndev, cfg->conf->retry_long, true); in brcmf_cfg80211_set_wiphy_params()
1659 && (cfg->conf->retry_short != wiphy->retry_short)) { in brcmf_cfg80211_set_wiphy_params()
1660 cfg->conf->retry_short = wiphy->retry_short; in brcmf_cfg80211_set_wiphy_params()
1661 err = brcmf_set_retry(ndev, cfg->conf->retry_short, false); in brcmf_cfg80211_set_wiphy_params()
1680 switch (e->event_code) { in brcmf_map_fw_linkdown_reason()
1684 reason = e->reason; in brcmf_map_fw_linkdown_reason()
1696 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_wsec()
1703 return -EINVAL; in brcmf_set_wsec()
1732 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy); in brcmf_link_down()
1733 struct brcmf_pub *drvr = cfg->pub; in brcmf_link_down()
1734 bool bus_up = drvr->bus_if->state == BRCMF_BUS_UP; in brcmf_link_down()
1739 if (test_and_clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state)) { in brcmf_link_down()
1742 err = brcmf_fil_cmd_data_set(vif->ifp, in brcmf_link_down()
1749 if ((vif->wdev.iftype == NL80211_IFTYPE_STATION) || in brcmf_link_down()
1750 (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT)) in brcmf_link_down()
1751 cfg80211_disconnected(vif->wdev.netdev, reason, NULL, 0, in brcmf_link_down()
1754 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state); in brcmf_link_down()
1755 clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state); in brcmf_link_down()
1756 clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state); in brcmf_link_down()
1757 clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status); in brcmf_link_down()
1759 if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_NONE) { in brcmf_link_down()
1761 brcmf_set_pmk(vif->ifp, NULL, 0); in brcmf_link_down()
1762 vif->profile.use_fwsup = BRCMF_PROFILE_FWSUP_NONE; in brcmf_link_down()
1773 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_cfg80211_join_ibss()
1774 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_join_ibss()
1784 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_join_ibss()
1785 return -EIO; in brcmf_cfg80211_join_ibss()
1787 if (params->ssid) in brcmf_cfg80211_join_ibss()
1788 brcmf_dbg(CONN, "SSID: %s\n", params->ssid); in brcmf_cfg80211_join_ibss()
1791 return -EOPNOTSUPP; in brcmf_cfg80211_join_ibss()
1794 set_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state); in brcmf_cfg80211_join_ibss()
1796 if (params->bssid) in brcmf_cfg80211_join_ibss()
1797 brcmf_dbg(CONN, "BSSID: %pM\n", params->bssid); in brcmf_cfg80211_join_ibss()
1801 if (params->chandef.chan) in brcmf_cfg80211_join_ibss()
1803 params->chandef.chan->center_freq); in brcmf_cfg80211_join_ibss()
1807 if (params->channel_fixed) in brcmf_cfg80211_join_ibss()
1812 if (params->ie && params->ie_len) in brcmf_cfg80211_join_ibss()
1813 brcmf_dbg(CONN, "ie len: %d\n", params->ie_len); in brcmf_cfg80211_join_ibss()
1817 if (params->beacon_interval) in brcmf_cfg80211_join_ibss()
1819 params->beacon_interval); in brcmf_cfg80211_join_ibss()
1823 if (params->basic_rates) in brcmf_cfg80211_join_ibss()
1824 brcmf_dbg(CONN, "basic rates: %08X\n", params->basic_rates); in brcmf_cfg80211_join_ibss()
1828 if (params->privacy) in brcmf_cfg80211_join_ibss()
1834 if (params->privacy) in brcmf_cfg80211_join_ibss()
1844 if (params->beacon_interval) in brcmf_cfg80211_join_ibss()
1845 bcnprd = params->beacon_interval; in brcmf_cfg80211_join_ibss()
1859 ssid_len = min_t(u32, params->ssid_len, IEEE80211_MAX_SSID_LEN); in brcmf_cfg80211_join_ibss()
1860 memcpy(join_params.ssid_le.SSID, params->ssid, ssid_len); in brcmf_cfg80211_join_ibss()
1865 if (params->bssid) { in brcmf_cfg80211_join_ibss()
1866 memcpy(join_params.params_le.bssid, params->bssid, ETH_ALEN); in brcmf_cfg80211_join_ibss()
1868 memcpy(profile->bssid, params->bssid, ETH_ALEN); in brcmf_cfg80211_join_ibss()
1871 eth_zero_addr(profile->bssid); in brcmf_cfg80211_join_ibss()
1875 if (params->chandef.chan) { in brcmf_cfg80211_join_ibss()
1878 cfg->channel = in brcmf_cfg80211_join_ibss()
1880 params->chandef.chan->center_freq); in brcmf_cfg80211_join_ibss()
1881 if (params->channel_fixed) { in brcmf_cfg80211_join_ibss()
1883 chanspec = chandef_to_chanspec(&cfg->d11inf, in brcmf_cfg80211_join_ibss()
1884 ¶ms->chandef); in brcmf_cfg80211_join_ibss()
1892 target_channel = cfg->channel; in brcmf_cfg80211_join_ibss()
1900 cfg->channel = 0; in brcmf_cfg80211_join_ibss()
1902 cfg->ibss_starter = false; in brcmf_cfg80211_join_ibss()
1914 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state); in brcmf_cfg80211_join_ibss()
1925 if (!check_vif_up(ifp->vif)) { in brcmf_cfg80211_leave_ibss()
1933 brcmf_link_down(ifp->vif, WLAN_REASON_DEAUTH_LEAVING, true); in brcmf_cfg80211_leave_ibss()
1946 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_wpa_version()
1951 if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_1) in brcmf_set_wpa_version()
1953 else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2) in brcmf_set_wpa_version()
1955 else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_3) in brcmf_set_wpa_version()
1965 sec = &profile->sec; in brcmf_set_wpa_version()
1966 sec->wpa_versions = sme->crypto.wpa_versions; in brcmf_set_wpa_version()
1975 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_auth_type()
1980 switch (sme->auth_type) { in brcmf_set_auth_type()
1995 brcmf_dbg(CONN, "automatic, auth type (%d)\n", sme->auth_type); in brcmf_set_auth_type()
2004 sec = &profile->sec; in brcmf_set_auth_type()
2005 sec->auth_type = sme->auth_type; in brcmf_set_auth_type()
2015 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_wsec_mode()
2022 if (sme->crypto.n_ciphers_pairwise) { in brcmf_set_wsec_mode()
2023 switch (sme->crypto.ciphers_pairwise[0]) { in brcmf_set_wsec_mode()
2039 sme->crypto.ciphers_pairwise[0]); in brcmf_set_wsec_mode()
2040 return -EINVAL; in brcmf_set_wsec_mode()
2043 if (sme->crypto.cipher_group) { in brcmf_set_wsec_mode()
2044 switch (sme->crypto.cipher_group) { in brcmf_set_wsec_mode()
2060 sme->crypto.cipher_group); in brcmf_set_wsec_mode()
2061 return -EINVAL; in brcmf_set_wsec_mode()
2067 /* setting AES. WPS-2.0 allows no security */ in brcmf_set_wsec_mode()
2068 if (brcmf_find_wpsie(sme->ie, sme->ie_len) && !pval && !gval && in brcmf_set_wsec_mode()
2069 sme->privacy) in brcmf_set_wsec_mode()
2079 sec = &profile->sec; in brcmf_set_wsec_mode()
2080 sec->cipher_pairwise = sme->crypto.ciphers_pairwise[0]; in brcmf_set_wsec_mode()
2081 sec->cipher_group = sme->crypto.cipher_group; in brcmf_set_wsec_mode()
2090 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_set_key_mgmt()
2091 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_key_mgmt()
2102 profile->use_fwsup = BRCMF_PROFILE_FWSUP_NONE; in brcmf_set_key_mgmt()
2103 profile->is_ft = false; in brcmf_set_key_mgmt()
2105 if (!sme->crypto.n_akm_suites) in brcmf_set_key_mgmt()
2115 switch (sme->crypto.akm_suites[0]) { in brcmf_set_key_mgmt()
2118 if (sme->want_1x) in brcmf_set_key_mgmt()
2119 profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X; in brcmf_set_key_mgmt()
2126 sme->crypto.akm_suites[0]); in brcmf_set_key_mgmt()
2127 return -EINVAL; in brcmf_set_key_mgmt()
2130 switch (sme->crypto.akm_suites[0]) { in brcmf_set_key_mgmt()
2133 if (sme->want_1x) in brcmf_set_key_mgmt()
2134 profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X; in brcmf_set_key_mgmt()
2138 if (sme->want_1x) in brcmf_set_key_mgmt()
2139 profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X; in brcmf_set_key_mgmt()
2149 profile->is_ft = true; in brcmf_set_key_mgmt()
2150 if (sme->want_1x) in brcmf_set_key_mgmt()
2151 profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X; in brcmf_set_key_mgmt()
2155 profile->is_ft = true; in brcmf_set_key_mgmt()
2159 sme->crypto.akm_suites[0]); in brcmf_set_key_mgmt()
2160 return -EINVAL; in brcmf_set_key_mgmt()
2163 switch (sme->crypto.akm_suites[0]) { in brcmf_set_key_mgmt()
2166 if (sme->crypto.sae_pwd) { in brcmf_set_key_mgmt()
2168 profile->use_fwsup = BRCMF_PROFILE_FWSUP_SAE; in brcmf_set_key_mgmt()
2173 profile->is_ft = true; in brcmf_set_key_mgmt()
2174 if (sme->crypto.sae_pwd) { in brcmf_set_key_mgmt()
2176 profile->use_fwsup = BRCMF_PROFILE_FWSUP_SAE; in brcmf_set_key_mgmt()
2181 sme->crypto.akm_suites[0]); in brcmf_set_key_mgmt()
2182 return -EINVAL; in brcmf_set_key_mgmt()
2186 if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X) in brcmf_set_key_mgmt()
2194 rsn_ie = brcmf_parse_tlvs((const u8 *)sme->ie, sme->ie_len, in brcmf_set_key_mgmt()
2199 ie_len = rsn_ie->len + TLV_HDR_LEN; in brcmf_set_key_mgmt()
2239 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_sharedkey()
2246 brcmf_dbg(CONN, "key len (%d)\n", sme->key_len); in brcmf_set_sharedkey()
2248 if (sme->key_len == 0) in brcmf_set_sharedkey()
2251 sec = &profile->sec; in brcmf_set_sharedkey()
2253 sec->wpa_versions, sec->cipher_pairwise); in brcmf_set_sharedkey()
2255 if (sec->wpa_versions & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2 | in brcmf_set_sharedkey()
2259 if (!(sec->cipher_pairwise & in brcmf_set_sharedkey()
2264 key.len = (u32) sme->key_len; in brcmf_set_sharedkey()
2265 key.index = (u32) sme->key_idx; in brcmf_set_sharedkey()
2268 return -EINVAL; in brcmf_set_sharedkey()
2270 memcpy(key.data, sme->key, key.len); in brcmf_set_sharedkey()
2272 switch (sec->cipher_pairwise) { in brcmf_set_sharedkey()
2281 sme->crypto.ciphers_pairwise[0]); in brcmf_set_sharedkey()
2282 return -EINVAL; in brcmf_set_sharedkey()
2292 if (sec->auth_type == NL80211_AUTHTYPE_SHARED_KEY) { in brcmf_set_sharedkey()
2317 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_join_pref()
2325 if (bss_select->behaviour != NL80211_BSS_SELECT_ATTR_BAND_PREF) in brcmf_set_join_pref()
2328 switch (bss_select->behaviour) { in brcmf_set_join_pref()
2334 band = bss_select->param.band_pref; in brcmf_set_join_pref()
2340 band = bss_select->param.adjust.band; in brcmf_set_join_pref()
2342 join_pref_params[i].rssi_gain = bss_select->param.adjust.delta; in brcmf_set_join_pref()
2365 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_cfg80211_connect()
2366 struct ieee80211_channel *chan = sme->channel; in brcmf_cfg80211_connect()
2367 struct brcmf_pub *drvr = ifp->drvr; in brcmf_cfg80211_connect()
2380 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_connect()
2381 return -EIO; in brcmf_cfg80211_connect()
2383 if (!sme->ssid) { in brcmf_cfg80211_connect()
2385 return -EOPNOTSUPP; in brcmf_cfg80211_connect()
2388 if (sme->channel_hint) in brcmf_cfg80211_connect()
2389 chan = sme->channel_hint; in brcmf_cfg80211_connect()
2391 if (sme->bssid_hint) in brcmf_cfg80211_connect()
2392 sme->bssid = sme->bssid_hint; in brcmf_cfg80211_connect()
2394 if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif) { in brcmf_cfg80211_connect()
2399 wpa_ie = brcmf_find_wpaie((u8 *)sme->ie, sme->ie_len); in brcmf_cfg80211_connect()
2402 ie_len = wpa_ie->len + TLV_HDR_LEN; in brcmf_cfg80211_connect()
2405 rsn_ie = brcmf_parse_tlvs((const u8 *)sme->ie, in brcmf_cfg80211_connect()
2406 sme->ie_len, in brcmf_cfg80211_connect()
2410 ie_len = rsn_ie->len + TLV_HDR_LEN; in brcmf_cfg80211_connect()
2416 err = brcmf_vif_set_mgmt_ie(ifp->vif, BRCMF_VNDR_IE_ASSOCREQ_FLAG, in brcmf_cfg80211_connect()
2417 sme->ie, sme->ie_len); in brcmf_cfg80211_connect()
2423 set_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state); in brcmf_cfg80211_connect()
2426 cfg->channel = in brcmf_cfg80211_connect()
2427 ieee80211_frequency_to_channel(chan->center_freq); in brcmf_cfg80211_connect()
2428 chanspec = channel_to_chanspec(&cfg->d11inf, chan); in brcmf_cfg80211_connect()
2430 cfg->channel, chan->center_freq, chanspec); in brcmf_cfg80211_connect()
2432 cfg->channel = 0; in brcmf_cfg80211_connect()
2436 brcmf_dbg(INFO, "ie (%p), ie_len (%zd)\n", sme->ie, sme->ie_len); in brcmf_cfg80211_connect()
2444 sme->auth_type = brcmf_war_auth_type(ifp, sme->auth_type); in brcmf_cfg80211_connect()
2469 if (sme->crypto.psk && in brcmf_cfg80211_connect()
2470 profile->use_fwsup != BRCMF_PROFILE_FWSUP_SAE) { in brcmf_cfg80211_connect()
2471 if (WARN_ON(profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE)) { in brcmf_cfg80211_connect()
2472 err = -EINVAL; in brcmf_cfg80211_connect()
2476 profile->use_fwsup = BRCMF_PROFILE_FWSUP_PSK; in brcmf_cfg80211_connect()
2479 if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE) { in brcmf_cfg80211_connect()
2488 if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK) in brcmf_cfg80211_connect()
2489 err = brcmf_set_pmk(ifp, sme->crypto.psk, in brcmf_cfg80211_connect()
2491 else if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_SAE) { in brcmf_cfg80211_connect()
2492 /* clean up user-space RSNE */ in brcmf_cfg80211_connect()
2495 bphy_err(drvr, "failed to clean up user-space RSNE\n"); in brcmf_cfg80211_connect()
2498 err = brcmf_fwvid_set_sae_password(ifp, &sme->crypto); in brcmf_cfg80211_connect()
2499 if (!err && sme->crypto.psk) in brcmf_cfg80211_connect()
2500 err = brcmf_set_pmk(ifp, sme->crypto.psk, in brcmf_cfg80211_connect()
2511 if (cfg->channel) in brcmf_cfg80211_connect()
2515 err = -ENOMEM; in brcmf_cfg80211_connect()
2518 ssid_len = min_t(u32, sme->ssid_len, IEEE80211_MAX_SSID_LEN); in brcmf_cfg80211_connect()
2519 ext_join_params->ssid_le.SSID_len = cpu_to_le32(ssid_len); in brcmf_cfg80211_connect()
2520 memcpy(&ext_join_params->ssid_le.SSID, sme->ssid, ssid_len); in brcmf_cfg80211_connect()
2523 ext_join_params->ssid_le.SSID, ssid_len); in brcmf_cfg80211_connect()
2526 ext_join_params->scan_le.scan_type = -1; in brcmf_cfg80211_connect()
2527 ext_join_params->scan_le.home_time = cpu_to_le32(-1); in brcmf_cfg80211_connect()
2529 if (sme->bssid) in brcmf_cfg80211_connect()
2530 memcpy(&ext_join_params->assoc_le.bssid, sme->bssid, ETH_ALEN); in brcmf_cfg80211_connect()
2532 eth_broadcast_addr(ext_join_params->assoc_le.bssid); in brcmf_cfg80211_connect()
2534 if (cfg->channel) { in brcmf_cfg80211_connect()
2535 ext_join_params->assoc_le.chanspec_num = cpu_to_le32(1); in brcmf_cfg80211_connect()
2537 ext_join_params->assoc_le.chanspec_list[0] = in brcmf_cfg80211_connect()
2543 ext_join_params->scan_le.active_time = in brcmf_cfg80211_connect()
2545 ext_join_params->scan_le.passive_time = in brcmf_cfg80211_connect()
2551 ext_join_params->scan_le.nprobes = in brcmf_cfg80211_connect()
2555 ext_join_params->scan_le.active_time = cpu_to_le32(-1); in brcmf_cfg80211_connect()
2556 ext_join_params->scan_le.passive_time = cpu_to_le32(-1); in brcmf_cfg80211_connect()
2557 ext_join_params->scan_le.nprobes = cpu_to_le32(-1); in brcmf_cfg80211_connect()
2560 brcmf_set_join_pref(ifp, &sme->bss_select); in brcmf_cfg80211_connect()
2573 memcpy(&join_params.ssid_le.SSID, sme->ssid, ssid_len); in brcmf_cfg80211_connect()
2576 if (sme->bssid) in brcmf_cfg80211_connect()
2577 memcpy(join_params.params_le.bssid, sme->bssid, ETH_ALEN); in brcmf_cfg80211_connect()
2581 if (cfg->channel) { in brcmf_cfg80211_connect()
2593 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state); in brcmf_cfg80211_connect()
2604 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_cfg80211_disconnect()
2605 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_disconnect()
2610 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_disconnect()
2611 return -EIO; in brcmf_cfg80211_disconnect()
2613 clear_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state); in brcmf_cfg80211_disconnect()
2614 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state); in brcmf_cfg80211_disconnect()
2615 clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &ifp->vif->sme_state); in brcmf_cfg80211_disconnect()
2616 clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &ifp->vif->sme_state); in brcmf_cfg80211_disconnect()
2619 memcpy(&scbval.ea, &profile->bssid, ETH_ALEN); in brcmf_cfg80211_disconnect()
2637 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_set_tx_power()
2643 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_set_tx_power()
2644 return -EIO; in brcmf_cfg80211_set_tx_power()
2652 bphy_err(drvr, "TX_POWER_FIXED - dbm is negative\n"); in brcmf_cfg80211_set_tx_power()
2653 err = -EINVAL; in brcmf_cfg80211_set_tx_power()
2663 err = -EINVAL; in brcmf_cfg80211_set_tx_power()
2687 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_get_tx_power()
2693 return -EIO; in brcmf_cfg80211_get_tx_power()
2695 err = brcmf_fil_iovar_int_get(vif->ifp, "qtxpower", &qdbm); in brcmf_cfg80211_get_tx_power()
2713 struct brcmf_pub *drvr = ifp->drvr; in brcmf_cfg80211_config_default_key()
2720 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_config_default_key()
2721 return -EIO; in brcmf_cfg80211_config_default_key()
2754 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_del_key()
2755 return -EIO; in brcmf_cfg80211_del_key()
2759 return -EINVAL; in brcmf_cfg80211_del_key()
2762 key = &ifp->vif->profile.key[key_idx]; in brcmf_cfg80211_del_key()
2764 if (key->algo == CRYPTO_ALGO_OFF) { in brcmf_cfg80211_del_key()
2766 return -EINVAL; in brcmf_cfg80211_del_key()
2770 key->index = (u32)key_idx; in brcmf_cfg80211_del_key()
2771 key->flags = BRCMF_PRIMARY_KEY; in brcmf_cfg80211_del_key()
2787 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_add_key()
2797 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_add_key()
2798 return -EIO; in brcmf_cfg80211_add_key()
2803 return -EINVAL; in brcmf_cfg80211_add_key()
2806 if (params->key_len == 0) in brcmf_cfg80211_add_key()
2807 return brcmf_cfg80211_del_key(wiphy, ndev, -1, key_idx, in brcmf_cfg80211_add_key()
2810 if (params->key_len > sizeof(key->data)) { in brcmf_cfg80211_add_key()
2811 bphy_err(drvr, "Too long key length (%u)\n", params->key_len); in brcmf_cfg80211_add_key()
2812 return -EINVAL; in brcmf_cfg80211_add_key()
2816 if (mac_addr && (params->cipher != WLAN_CIPHER_SUITE_WEP40) && in brcmf_cfg80211_add_key()
2817 (params->cipher != WLAN_CIPHER_SUITE_WEP104)) { in brcmf_cfg80211_add_key()
2822 key = &ifp->vif->profile.key[key_idx]; in brcmf_cfg80211_add_key()
2825 memcpy((char *)&key->ea, (void *)mac_addr, ETH_ALEN); in brcmf_cfg80211_add_key()
2826 key->len = params->key_len; in brcmf_cfg80211_add_key()
2827 key->index = key_idx; in brcmf_cfg80211_add_key()
2828 memcpy(key->data, params->key, key->len); in brcmf_cfg80211_add_key()
2830 key->flags = BRCMF_PRIMARY_KEY; in brcmf_cfg80211_add_key()
2832 if (params->seq && params->seq_len == 6) { in brcmf_cfg80211_add_key()
2836 ivptr = (u8 *)params->seq; in brcmf_cfg80211_add_key()
2837 key->rxiv.hi = (ivptr[5] << 24) | (ivptr[4] << 16) | in brcmf_cfg80211_add_key()
2839 key->rxiv.lo = (ivptr[1] << 8) | ivptr[0]; in brcmf_cfg80211_add_key()
2840 key->iv_initialized = true; in brcmf_cfg80211_add_key()
2843 switch (params->cipher) { in brcmf_cfg80211_add_key()
2845 key->algo = CRYPTO_ALGO_WEP1; in brcmf_cfg80211_add_key()
2850 key->algo = CRYPTO_ALGO_WEP128; in brcmf_cfg80211_add_key()
2855 if (!brcmf_is_apmode(ifp->vif)) { in brcmf_cfg80211_add_key()
2857 memcpy(keybuf, &key->data[24], sizeof(keybuf)); in brcmf_cfg80211_add_key()
2858 memcpy(&key->data[24], &key->data[16], sizeof(keybuf)); in brcmf_cfg80211_add_key()
2859 memcpy(&key->data[16], keybuf, sizeof(keybuf)); in brcmf_cfg80211_add_key()
2861 key->algo = CRYPTO_ALGO_TKIP; in brcmf_cfg80211_add_key()
2866 key->algo = CRYPTO_ALGO_AES_CCM; in brcmf_cfg80211_add_key()
2871 key->algo = CRYPTO_ALGO_AES_CCM; in brcmf_cfg80211_add_key()
2876 bphy_err(drvr, "Invalid cipher (0x%x)\n", params->cipher); in brcmf_cfg80211_add_key()
2877 err = -EINVAL; in brcmf_cfg80211_add_key()
2912 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_cfg80211_get_key()
2913 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_get_key()
2920 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_get_key()
2921 return -EIO; in brcmf_cfg80211_get_key()
2929 err = -EAGAIN; in brcmf_cfg80211_get_key()
2933 sec = &profile->sec; in brcmf_cfg80211_get_key()
2934 if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP40) { in brcmf_cfg80211_get_key()
2937 } else if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP104) { in brcmf_cfg80211_get_key()
2949 err = -EINVAL; in brcmf_cfg80211_get_key()
2973 return -EOPNOTSUPP; in brcmf_cfg80211_config_default_mgmt_key()
2979 struct brcmf_pub *drvr = ifp->drvr; in brcmf_cfg80211_reconfigure_wep()
2986 key = &ifp->vif->profile.key[key_idx]; in brcmf_cfg80211_reconfigure_wep()
2987 if ((key->algo == CRYPTO_ALGO_WEP1) || in brcmf_cfg80211_reconfigure_wep()
2988 (key->algo == CRYPTO_ALGO_WEP128)) in brcmf_cfg80211_reconfigure_wep()
3015 si->filled |= BIT_ULL(NL80211_STA_INFO_STA_FLAGS); in brcmf_convert_sta_flags()
3016 sfu = &si->sta_flags; in brcmf_convert_sta_flags()
3017 sfu->mask = BIT(NL80211_STA_FLAG_WME) | in brcmf_convert_sta_flags()
3022 sfu->set |= BIT(NL80211_STA_FLAG_WME); in brcmf_convert_sta_flags()
3024 sfu->set |= BIT(NL80211_STA_FLAG_AUTHENTICATED); in brcmf_convert_sta_flags()
3026 sfu->set |= BIT(NL80211_STA_FLAG_ASSOCIATED); in brcmf_convert_sta_flags()
3028 sfu->set |= BIT(NL80211_STA_FLAG_AUTHORIZED); in brcmf_convert_sta_flags()
3033 struct brcmf_pub *drvr = ifp->drvr; in brcmf_fill_bss_param()
3045 buf->len = cpu_to_le32(WL_BSS_INFO_MAX); in brcmf_fill_bss_param()
3052 si->filled |= BIT_ULL(NL80211_STA_INFO_BSS_PARAM); in brcmf_fill_bss_param()
3053 si->bss_param.beacon_interval = le16_to_cpu(buf->bss_le.beacon_period); in brcmf_fill_bss_param()
3054 si->bss_param.dtim_period = buf->bss_le.dtim_period; in brcmf_fill_bss_param()
3055 capability = le16_to_cpu(buf->bss_le.capability); in brcmf_fill_bss_param()
3057 si->bss_param.flags |= BSS_PARAM_FLAGS_CTS_PROT; in brcmf_fill_bss_param()
3059 si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE; in brcmf_fill_bss_param()
3061 si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME; in brcmf_fill_bss_param()
3071 struct brcmf_pub *drvr = ifp->drvr; in brcmf_cfg80211_get_station_ibss()
3084 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in brcmf_cfg80211_get_station_ibss()
3085 sinfo->txrate.legacy = rate * 5; in brcmf_cfg80211_get_station_ibss()
3095 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in brcmf_cfg80211_get_station_ibss()
3096 sinfo->signal = rssi; in brcmf_cfg80211_get_station_ibss()
3104 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS) | in brcmf_cfg80211_get_station_ibss()
3108 sinfo->rx_packets = le32_to_cpu(pktcnt.rx_good_pkt); in brcmf_cfg80211_get_station_ibss()
3109 sinfo->rx_dropped_misc = le32_to_cpu(pktcnt.rx_bad_pkt); in brcmf_cfg80211_get_station_ibss()
3110 sinfo->tx_packets = le32_to_cpu(pktcnt.tx_good_pkt); in brcmf_cfg80211_get_station_ibss()
3111 sinfo->tx_failed = le32_to_cpu(pktcnt.tx_bad_pkt); in brcmf_cfg80211_get_station_ibss()
3122 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_get_station()
3135 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_get_station()
3136 return -EIO; in brcmf_cfg80211_get_station()
3138 if (brcmf_is_ibssmode(ifp->vif)) in brcmf_cfg80211_get_station()
3157 sinfo->filled = BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME); in brcmf_cfg80211_get_station()
3158 sinfo->inactive_time = le32_to_cpu(sta_info_le.idle) * 1000; in brcmf_cfg80211_get_station()
3161 sinfo->sta_flags.mask |= BIT(NL80211_STA_FLAG_TDLS_PEER); in brcmf_cfg80211_get_station()
3163 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER); in brcmf_cfg80211_get_station()
3165 sinfo->sta_flags.set &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in brcmf_cfg80211_get_station()
3167 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CONNECTED_TIME); in brcmf_cfg80211_get_station()
3168 sinfo->connected_time = le32_to_cpu(sta_info_le.in); in brcmf_cfg80211_get_station()
3172 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); in brcmf_cfg80211_get_station()
3173 sinfo->tx_failed = le32_to_cpu(sta_info_le.tx_failures); in brcmf_cfg80211_get_station()
3174 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS); in brcmf_cfg80211_get_station()
3175 sinfo->tx_packets = le32_to_cpu(sta_info_le.tx_pkts); in brcmf_cfg80211_get_station()
3176 sinfo->tx_packets += le32_to_cpu(sta_info_le.tx_mcast_pkts); in brcmf_cfg80211_get_station()
3177 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS); in brcmf_cfg80211_get_station()
3178 sinfo->rx_packets = le32_to_cpu(sta_info_le.rx_ucast_pkts); in brcmf_cfg80211_get_station()
3179 sinfo->rx_packets += le32_to_cpu(sta_info_le.rx_mcast_pkts); in brcmf_cfg80211_get_station()
3180 if (sinfo->tx_packets) { in brcmf_cfg80211_get_station()
3181 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in brcmf_cfg80211_get_station()
3182 sinfo->txrate.legacy = in brcmf_cfg80211_get_station()
3185 if (sinfo->rx_packets) { in brcmf_cfg80211_get_station()
3186 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE); in brcmf_cfg80211_get_station()
3187 sinfo->rxrate.legacy = in brcmf_cfg80211_get_station()
3191 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES); in brcmf_cfg80211_get_station()
3192 sinfo->tx_bytes = le64_to_cpu(sta_info_le.tx_tot_bytes); in brcmf_cfg80211_get_station()
3193 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES); in brcmf_cfg80211_get_station()
3194 sinfo->rx_bytes = le64_to_cpu(sta_info_le.rx_tot_bytes); in brcmf_cfg80211_get_station()
3200 sinfo->chains |= BIT(count_rssi); in brcmf_cfg80211_get_station()
3201 sinfo->chain_signal[count_rssi] = in brcmf_cfg80211_get_station()
3203 sinfo->chain_signal_avg[count_rssi] = in brcmf_cfg80211_get_station()
3210 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in brcmf_cfg80211_get_station()
3211 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); in brcmf_cfg80211_get_station()
3212 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); in brcmf_cfg80211_get_station()
3213 sinfo->filled |= in brcmf_cfg80211_get_station()
3215 sinfo->signal = total_rssi / count_rssi; in brcmf_cfg80211_get_station()
3216 sinfo->signal_avg = total_rssi_avg / count_rssi; in brcmf_cfg80211_get_station()
3218 &ifp->vif->sme_state)) { in brcmf_cfg80211_get_station()
3228 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in brcmf_cfg80211_get_station()
3229 sinfo->signal = rssi; in brcmf_cfg80211_get_station()
3245 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_dump_station()
3251 cfg->assoclist.count = cpu_to_le32(BRCMF_MAX_ASSOCLIST); in brcmf_cfg80211_dump_station()
3253 &cfg->assoclist, in brcmf_cfg80211_dump_station()
3254 sizeof(cfg->assoclist)); in brcmf_cfg80211_dump_station()
3257 if (err == -EBADE) in brcmf_cfg80211_dump_station()
3263 cfg->assoclist.count = 0; in brcmf_cfg80211_dump_station()
3264 return -EOPNOTSUPP; in brcmf_cfg80211_dump_station()
3267 if (idx < le32_to_cpu(cfg->assoclist.count)) { in brcmf_cfg80211_dump_station()
3268 memcpy(mac, cfg->assoclist.mac[idx], ETH_ALEN); in brcmf_cfg80211_dump_station()
3271 return -ENOENT; in brcmf_cfg80211_dump_station()
3282 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_set_power_mgmt()
3293 cfg->pwr_save = enabled; in brcmf_cfg80211_set_power_mgmt()
3294 if (!check_vif_up(ifp->vif)) { in brcmf_cfg80211_set_power_mgmt()
3302 if (ifp->vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) { in brcmf_cfg80211_set_power_mgmt()
3310 if (err == -ENODEV) in brcmf_cfg80211_set_power_mgmt()
3330 struct brcmf_pub *drvr = cfg->pub; in brcmf_inform_single_bss()
3342 if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) { in brcmf_inform_single_bss()
3344 return -EINVAL; in brcmf_inform_single_bss()
3347 if (!bi->ctl_ch) { in brcmf_inform_single_bss()
3348 ch.chspec = le16_to_cpu(bi->chanspec); in brcmf_inform_single_bss()
3349 cfg->d11inf.decchspec(&ch); in brcmf_inform_single_bss()
3350 bi->ctl_ch = ch.control_ch_num; in brcmf_inform_single_bss()
3352 channel = bi->ctl_ch; in brcmf_inform_single_bss()
3363 notify_capability = le16_to_cpu(bi->capability); in brcmf_inform_single_bss()
3364 notify_interval = le16_to_cpu(bi->beacon_period); in brcmf_inform_single_bss()
3365 notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset); in brcmf_inform_single_bss()
3366 notify_ielen = le32_to_cpu(bi->ie_length); in brcmf_inform_single_bss()
3367 bss_data.signal = (s16)le16_to_cpu(bi->RSSI) * 100; in brcmf_inform_single_bss()
3369 brcmf_dbg(CONN, "bssid: %pM\n", bi->BSSID); in brcmf_inform_single_bss()
3377 (const u8 *)bi->BSSID, in brcmf_inform_single_bss()
3383 return -ENOMEM; in brcmf_inform_single_bss()
3394 return list->bss_info_le; in next_bss_le()
3396 le32_to_cpu(bss->length)); in next_bss_le()
3401 struct brcmf_pub *drvr = cfg->pub; in brcmf_inform_bss()
3407 bss_list = (struct brcmf_scan_results *)cfg->escan_info.escan_buf; in brcmf_inform_bss()
3408 if (bss_list->count != 0 && in brcmf_inform_bss()
3409 bss_list->version != BRCMF_BSS_INFO_VERSION) { in brcmf_inform_bss()
3411 bss_list->version); in brcmf_inform_bss()
3412 return -EOPNOTSUPP; in brcmf_inform_bss()
3414 brcmf_dbg(SCAN, "scanned AP count (%d)\n", bss_list->count); in brcmf_inform_bss()
3415 for (i = 0; i < bss_list->count; i++) { in brcmf_inform_bss()
3428 struct brcmf_pub *drvr = cfg->pub; in brcmf_inform_ibss()
3447 err = -ENOMEM; in brcmf_inform_ibss()
3462 ch.chspec = le16_to_cpu(bi->chanspec); in brcmf_inform_ibss()
3463 cfg->d11inf.decchspec(&ch); in brcmf_inform_ibss()
3466 band = wiphy->bands[NL80211_BAND_2GHZ]; in brcmf_inform_ibss()
3468 band = wiphy->bands[NL80211_BAND_5GHZ]; in brcmf_inform_ibss()
3470 freq = ieee80211_channel_to_frequency(ch.control_ch_num, band->band); in brcmf_inform_ibss()
3471 cfg->channel = freq; in brcmf_inform_ibss()
3474 notify_capability = le16_to_cpu(bi->capability); in brcmf_inform_ibss()
3475 notify_interval = le16_to_cpu(bi->beacon_period); in brcmf_inform_ibss()
3476 notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset); in brcmf_inform_ibss()
3477 notify_ielen = le32_to_cpu(bi->ie_length); in brcmf_inform_ibss()
3478 notify_signal = (s16)le16_to_cpu(bi->RSSI) * 100; in brcmf_inform_ibss()
3492 err = -ENOMEM; in brcmf_inform_ibss()
3510 struct brcmf_pub *drvr = cfg->pub; in brcmf_update_bss_info()
3515 if (brcmf_is_ibssmode(ifp->vif)) in brcmf_update_bss_info()
3518 *(__le32 *)cfg->extra_buf = cpu_to_le32(WL_EXTRA_BUF_MAX); in brcmf_update_bss_info()
3520 cfg->extra_buf, WL_EXTRA_BUF_MAX); in brcmf_update_bss_info()
3525 bi = (struct brcmf_bss_info_le *)(cfg->extra_buf + 4); in brcmf_update_bss_info()
3535 struct escan_info *escan = &cfg->escan_info; in brcmf_abort_scanning()
3537 set_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status); in brcmf_abort_scanning()
3538 if (cfg->int_escan_map || cfg->scan_request) { in brcmf_abort_scanning()
3539 escan->escan_state = WL_ESCAN_STATE_IDLE; in brcmf_abort_scanning()
3540 brcmf_notify_escan_complete(cfg, escan->ifp, true, true); in brcmf_abort_scanning()
3542 clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); in brcmf_abort_scanning()
3543 clear_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status); in brcmf_abort_scanning()
3553 brcmf_notify_escan_complete(cfg, cfg->escan_info.ifp, true, true); in brcmf_cfg80211_escan_timeout_worker()
3560 struct brcmf_pub *drvr = cfg->pub; in brcmf_escan_timeout()
3562 if (cfg->int_escan_map || cfg->scan_request) { in brcmf_escan_timeout()
3564 schedule_work(&cfg->escan_timeout_work); in brcmf_escan_timeout()
3575 ch_bss.chspec = le16_to_cpu(bss->chanspec); in brcmf_compare_update_same_bss()
3576 cfg->d11inf.decchspec(&ch_bss); in brcmf_compare_update_same_bss()
3577 ch_bss_info_le.chspec = le16_to_cpu(bss_info_le->chanspec); in brcmf_compare_update_same_bss()
3578 cfg->d11inf.decchspec(&ch_bss_info_le); in brcmf_compare_update_same_bss()
3580 if (!memcmp(&bss_info_le->BSSID, &bss->BSSID, ETH_ALEN) && in brcmf_compare_update_same_bss()
3582 bss_info_le->SSID_len == bss->SSID_len && in brcmf_compare_update_same_bss()
3583 !memcmp(bss_info_le->SSID, bss->SSID, bss_info_le->SSID_len)) { in brcmf_compare_update_same_bss()
3584 if ((bss->flags & BRCMF_BSS_RSSI_ON_CHANNEL) == in brcmf_compare_update_same_bss()
3585 (bss_info_le->flags & BRCMF_BSS_RSSI_ON_CHANNEL)) { in brcmf_compare_update_same_bss()
3586 s16 bss_rssi = le16_to_cpu(bss->RSSI); in brcmf_compare_update_same_bss()
3587 s16 bss_info_rssi = le16_to_cpu(bss_info_le->RSSI); in brcmf_compare_update_same_bss()
3590 * both on-channel or both off-channel in brcmf_compare_update_same_bss()
3593 bss->RSSI = bss_info_le->RSSI; in brcmf_compare_update_same_bss()
3594 } else if ((bss->flags & BRCMF_BSS_RSSI_ON_CHANNEL) && in brcmf_compare_update_same_bss()
3595 (bss_info_le->flags & BRCMF_BSS_RSSI_ON_CHANNEL) == 0) { in brcmf_compare_update_same_bss()
3596 /* preserve the on-channel rssi measurement in brcmf_compare_update_same_bss()
3599 bss->RSSI = bss_info_le->RSSI; in brcmf_compare_update_same_bss()
3600 bss->flags |= BRCMF_BSS_RSSI_ON_CHANNEL; in brcmf_compare_update_same_bss()
3611 struct brcmf_pub *drvr = ifp->drvr; in brcmf_cfg80211_escan_handler()
3612 struct brcmf_cfg80211_info *cfg = drvr->config; in brcmf_cfg80211_escan_handler()
3623 status = e->status; in brcmf_cfg80211_escan_handler()
3628 if (!test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) { in brcmf_cfg80211_escan_handler()
3630 ifp->bsscfgidx); in brcmf_cfg80211_escan_handler()
3631 return -EPERM; in brcmf_cfg80211_escan_handler()
3636 if (e->datalen < sizeof(*escan_result_le)) { in brcmf_cfg80211_escan_handler()
3645 escan_buflen = le32_to_cpu(escan_result_le->buflen); in brcmf_cfg80211_escan_handler()
3647 escan_buflen > e->datalen || in brcmf_cfg80211_escan_handler()
3653 if (le16_to_cpu(escan_result_le->bss_count) != 1) { in brcmf_cfg80211_escan_handler()
3655 escan_result_le->bss_count); in brcmf_cfg80211_escan_handler()
3658 bss_info_le = &escan_result_le->bss_info_le; in brcmf_cfg80211_escan_handler()
3663 if (!cfg->int_escan_map && !cfg->scan_request) { in brcmf_cfg80211_escan_handler()
3668 bi_length = le32_to_cpu(bss_info_le->length); in brcmf_cfg80211_escan_handler()
3669 if (bi_length != escan_buflen - WL_ESCAN_RESULTS_FIXED_SIZE) { in brcmf_cfg80211_escan_handler()
3675 if (!(cfg_to_wiphy(cfg)->interface_modes & in brcmf_cfg80211_escan_handler()
3677 if (le16_to_cpu(bss_info_le->capability) & in brcmf_cfg80211_escan_handler()
3685 cfg->escan_info.escan_buf; in brcmf_cfg80211_escan_handler()
3686 if (bi_length > BRCMF_ESCAN_BUF_SIZE - list->buflen) { in brcmf_cfg80211_escan_handler()
3691 for (i = 0; i < list->count; i++) { in brcmf_cfg80211_escan_handler()
3694 le32_to_cpu(bss->length)) : list->bss_info_le; in brcmf_cfg80211_escan_handler()
3699 memcpy(&cfg->escan_info.escan_buf[list->buflen], bss_info_le, in brcmf_cfg80211_escan_handler()
3701 list->version = le32_to_cpu(bss_info_le->version); in brcmf_cfg80211_escan_handler()
3702 list->buflen += bi_length; in brcmf_cfg80211_escan_handler()
3703 list->count++; in brcmf_cfg80211_escan_handler()
3705 cfg->escan_info.escan_state = WL_ESCAN_STATE_IDLE; in brcmf_cfg80211_escan_handler()
3708 if (cfg->int_escan_map || cfg->scan_request) { in brcmf_cfg80211_escan_handler()
3722 brcmf_fweh_register(cfg->pub, BRCMF_E_ESCAN_RESULT, in brcmf_init_escan()
3724 cfg->escan_info.escan_state = WL_ESCAN_STATE_IDLE; in brcmf_init_escan()
3726 timer_setup(&cfg->escan_timeout, brcmf_escan_timeout, 0); in brcmf_init_escan()
3727 INIT_WORK(&cfg->escan_timeout_work, in brcmf_init_escan()
3737 n_netinfo * sizeof(req->channels[0]) + in brcmf_alloc_internal_escan_request()
3738 n_netinfo * sizeof(*req->ssids); in brcmf_alloc_internal_escan_request()
3742 req->wiphy = wiphy; in brcmf_alloc_internal_escan_request()
3743 req->ssids = (void *)(&req->channels[0]) + in brcmf_alloc_internal_escan_request()
3744 n_netinfo * sizeof(req->channels[0]); in brcmf_alloc_internal_escan_request()
3763 return -EINVAL; in brcmf_internal_escan_add_info()
3765 chan = ieee80211_get_channel(req->wiphy, freq); in brcmf_internal_escan_add_info()
3767 return -EINVAL; in brcmf_internal_escan_add_info()
3769 for (i = 0; i < req->n_channels; i++) { in brcmf_internal_escan_add_info()
3770 if (req->channels[i] == chan) in brcmf_internal_escan_add_info()
3773 if (i == req->n_channels) { in brcmf_internal_escan_add_info()
3774 req->n_channels++; in brcmf_internal_escan_add_info()
3775 req->channels[i] = chan; in brcmf_internal_escan_add_info()
3778 for (i = 0; i < req->n_ssids; i++) { in brcmf_internal_escan_add_info()
3779 if (req->ssids[i].ssid_len == ssid_len && in brcmf_internal_escan_add_info()
3780 !memcmp(req->ssids[i].ssid, ssid, ssid_len)) in brcmf_internal_escan_add_info()
3783 if (i == req->n_ssids) { in brcmf_internal_escan_add_info()
3784 memcpy(req->ssids[req->n_ssids].ssid, ssid, ssid_len); in brcmf_internal_escan_add_info()
3785 req->ssids[req->n_ssids++].ssid_len = ssid_len; in brcmf_internal_escan_add_info()
3793 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_start_internal_escan()
3796 if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) { in brcmf_start_internal_escan()
3797 if (cfg->int_escan_map) in brcmf_start_internal_escan()
3799 cfg->int_escan_map); in brcmf_start_internal_escan()
3800 /* Abort any on-going scan */ in brcmf_start_internal_escan()
3805 set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); in brcmf_start_internal_escan()
3806 cfg->escan_info.run = brcmf_run_escan; in brcmf_start_internal_escan()
3809 clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); in brcmf_start_internal_escan()
3812 cfg->int_escan_map = fwmap; in brcmf_start_internal_escan()
3822 switch (pfn_v1->version) { in brcmf_get_netinfo_array()
3848 struct brcmf_pub *drvr = ifp->drvr; in brcmf_notify_sched_scan_results()
3849 struct brcmf_cfg80211_info *cfg = drvr->config; in brcmf_notify_sched_scan_results()
3862 if (e->datalen < (sizeof(*pfn_result) + sizeof(*netinfo))) { in brcmf_notify_sched_scan_results()
3867 if (e->event_code == BRCMF_E_PFN_NET_LOST) { in brcmf_notify_sched_scan_results()
3873 result_count = le32_to_cpu(pfn_result->count); in brcmf_notify_sched_scan_results()
3874 status = le32_to_cpu(pfn_result->status); in brcmf_notify_sched_scan_results()
3887 datalen = e->datalen - ((void *)netinfo_start - (void *)pfn_result); in brcmf_notify_sched_scan_results()
3896 err = -ENOMEM; in brcmf_notify_sched_scan_results()
3904 if (netinfo->SSID_len > IEEE80211_MAX_SSID_LEN) in brcmf_notify_sched_scan_results()
3905 netinfo->SSID_len = IEEE80211_MAX_SSID_LEN; in brcmf_notify_sched_scan_results()
3907 netinfo->SSID, netinfo->channel); in brcmf_notify_sched_scan_results()
3908 bucket_map |= brcmf_pno_get_bucket_map(cfg->pno, netinfo); in brcmf_notify_sched_scan_results()
3910 netinfo->SSID, in brcmf_notify_sched_scan_results()
3911 netinfo->SSID_len, in brcmf_notify_sched_scan_results()
3912 netinfo->channel); in brcmf_notify_sched_scan_results()
3938 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_sched_scan_start()
3941 req->n_match_sets, req->n_ssids); in brcmf_cfg80211_sched_scan_start()
3943 if (test_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status)) { in brcmf_cfg80211_sched_scan_start()
3945 cfg->scan_status); in brcmf_cfg80211_sched_scan_start()
3946 return -EAGAIN; in brcmf_cfg80211_sched_scan_start()
3949 if (req->n_match_sets <= 0) { in brcmf_cfg80211_sched_scan_start()
3951 req->n_match_sets); in brcmf_cfg80211_sched_scan_start()
3952 return -EINVAL; in brcmf_cfg80211_sched_scan_start()
3966 if (cfg->int_escan_map) in brcmf_cfg80211_sched_scan_stop()
3993 patternoffset = sizeof(*filter) - sizeof(filter->cmd) + masksize; in brcmf_config_wowl_pattern()
3998 return -ENOMEM; in brcmf_config_wowl_pattern()
4001 memcpy(filter->cmd, cmd, 4); in brcmf_config_wowl_pattern()
4002 filter->masksize = cpu_to_le32(masksize); in brcmf_config_wowl_pattern()
4003 filter->offset = cpu_to_le32(packet_offset); in brcmf_config_wowl_pattern()
4004 filter->patternoffset = cpu_to_le32(patternoffset); in brcmf_config_wowl_pattern()
4005 filter->patternsize = cpu_to_le32(patternsize); in brcmf_config_wowl_pattern()
4006 filter->type = cpu_to_le32(BRCMF_WOWL_PATTERN_TYPE_BITMAP); in brcmf_config_wowl_pattern()
4023 struct brcmf_pub *drvr = ifp->drvr; in brcmf_wowl_nd_results()
4024 struct brcmf_cfg80211_info *cfg = drvr->config; in brcmf_wowl_nd_results()
4030 if (e->datalen < (sizeof(*pfn_result) + sizeof(*netinfo))) { in brcmf_wowl_nd_results()
4037 if (e->event_code == BRCMF_E_PFN_NET_LOST) { in brcmf_wowl_nd_results()
4042 if (le32_to_cpu(pfn_result->count) < 1) { in brcmf_wowl_nd_results()
4044 le32_to_cpu(pfn_result->count)); in brcmf_wowl_nd_results()
4045 return -EINVAL; in brcmf_wowl_nd_results()
4049 if (netinfo->SSID_len > IEEE80211_MAX_SSID_LEN) in brcmf_wowl_nd_results()
4050 netinfo->SSID_len = IEEE80211_MAX_SSID_LEN; in brcmf_wowl_nd_results()
4051 memcpy(cfg->wowl.nd->ssid.ssid, netinfo->SSID, netinfo->SSID_len); in brcmf_wowl_nd_results()
4052 cfg->wowl.nd->ssid.ssid_len = netinfo->SSID_len; in brcmf_wowl_nd_results()
4053 cfg->wowl.nd->n_channels = 1; in brcmf_wowl_nd_results()
4054 cfg->wowl.nd->channels[0] = in brcmf_wowl_nd_results()
4055 ieee80211_channel_to_frequency(netinfo->channel, in brcmf_wowl_nd_results()
4056 netinfo->channel <= CH_MAX_2G_CHANNEL ? in brcmf_wowl_nd_results()
4058 cfg->wowl.nd_info->n_matches = 1; in brcmf_wowl_nd_results()
4059 cfg->wowl.nd_info->matches[0] = cfg->wowl.nd; in brcmf_wowl_nd_results()
4062 cfg->wowl.nd_data_completed = true; in brcmf_wowl_nd_results()
4063 wake_up(&cfg->wowl.nd_data_wait); in brcmf_wowl_nd_results()
4073 struct brcmf_pub *drvr = cfg->pub; in brcmf_report_wowl_wakeind()
4094 wakeup_data.pattern_idx = -1; in brcmf_report_wowl_wakeind()
4121 time_left = wait_event_timeout(cfg->wowl.nd_data_wait, in brcmf_report_wowl_wakeind()
4122 cfg->wowl.nd_data_completed, in brcmf_report_wowl_wakeind()
4127 wakeup_data.net_detect = cfg->wowl.nd_info; in brcmf_report_wowl_wakeind()
4136 cfg80211_report_wowlan_wakeup(&ifp->vif->wdev, wakeup, GFP_KERNEL); in brcmf_report_wowl_wakeind()
4155 if (cfg->wowl.active) { in brcmf_cfg80211_resume()
4162 cfg->wowl.pre_pmmode); in brcmf_cfg80211_resume()
4163 cfg->wowl.active = false; in brcmf_cfg80211_resume()
4164 if (cfg->wowl.nd_enabled) { in brcmf_cfg80211_resume()
4165 brcmf_cfg80211_sched_scan_stop(cfg->wiphy, ifp->ndev, 0); in brcmf_cfg80211_resume()
4166 brcmf_fweh_unregister(cfg->pub, BRCMF_E_PFN_NET_FOUND); in brcmf_cfg80211_resume()
4167 brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND, in brcmf_cfg80211_resume()
4169 cfg->wowl.nd_enabled = false; in brcmf_cfg80211_resume()
4187 brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PM, &cfg->wowl.pre_pmmode); in brcmf_configure_wowl()
4191 if (wowl->disconnect) in brcmf_configure_wowl()
4193 if (wowl->magic_pkt) in brcmf_configure_wowl()
4195 if ((wowl->patterns) && (wowl->n_patterns)) { in brcmf_configure_wowl()
4197 for (i = 0; i < wowl->n_patterns; i++) { in brcmf_configure_wowl()
4199 (u8 *)wowl->patterns[i].pattern, in brcmf_configure_wowl()
4200 wowl->patterns[i].pattern_len, in brcmf_configure_wowl()
4201 (u8 *)wowl->patterns[i].mask, in brcmf_configure_wowl()
4202 wowl->patterns[i].pkt_offset); in brcmf_configure_wowl()
4205 if (wowl->nd_config) { in brcmf_configure_wowl()
4206 brcmf_cfg80211_sched_scan_start(cfg->wiphy, ifp->ndev, in brcmf_configure_wowl()
4207 wowl->nd_config); in brcmf_configure_wowl()
4210 cfg->wowl.nd_data_completed = false; in brcmf_configure_wowl()
4211 cfg->wowl.nd_enabled = true; in brcmf_configure_wowl()
4213 brcmf_fweh_unregister(cfg->pub, BRCMF_E_PFN_NET_FOUND); in brcmf_configure_wowl()
4214 brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND, in brcmf_configure_wowl()
4217 if (wowl->gtk_rekey_failure) in brcmf_configure_wowl()
4219 if (!test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state)) in brcmf_configure_wowl()
4227 brcmf_bus_wowl_config(cfg->pub->bus_if, true); in brcmf_configure_wowl()
4228 cfg->wowl.active = true; in brcmf_configure_wowl()
4244 brcmf_err("keep-alive packet config failed, ret=%d\n", ret); in brcmf_keepalive_start()
4262 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_suspend()
4270 if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) in brcmf_cfg80211_suspend()
4274 brcmf_bus_wowl_config(cfg->pub->bus_if, false); in brcmf_cfg80211_suspend()
4275 list_for_each_entry(vif, &cfg->vif_list, list) { in brcmf_cfg80211_suspend()
4276 if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state)) in brcmf_cfg80211_suspend()
4296 /* Prevent disassociation due to inactivity with keep-alive */ in brcmf_cfg80211_suspend()
4303 cfg->scan_status = 0; in brcmf_cfg80211_suspend()
4317 return -ENOMEM; in brcmf_pmksa_v3_op()
4319 pmk_op->version = cpu_to_le16(BRCMF_PMKSA_VER_3); in brcmf_pmksa_v3_op()
4323 pmk_op->count = cpu_to_le16(0); in brcmf_pmksa_v3_op()
4326 pmk_op->count = cpu_to_le16(1); in brcmf_pmksa_v3_op()
4328 if (pmksa->bssid) in brcmf_pmksa_v3_op()
4329 memcpy(pmk_op->pmk[0].bssid, pmksa->bssid, ETH_ALEN); in brcmf_pmksa_v3_op()
4330 if (pmksa->pmkid) { in brcmf_pmksa_v3_op()
4331 memcpy(pmk_op->pmk[0].pmkid, pmksa->pmkid, WLAN_PMKID_LEN); in brcmf_pmksa_v3_op()
4332 pmk_op->pmk[0].pmkid_len = WLAN_PMKID_LEN; in brcmf_pmksa_v3_op()
4334 if (pmksa->ssid && pmksa->ssid_len) { in brcmf_pmksa_v3_op()
4335 memcpy(pmk_op->pmk[0].ssid.SSID, pmksa->ssid, pmksa->ssid_len); in brcmf_pmksa_v3_op()
4336 pmk_op->pmk[0].ssid.SSID_len = pmksa->ssid_len; in brcmf_pmksa_v3_op()
4338 pmk_op->pmk[0].time_left = cpu_to_le32(alive ? BRCMF_PMKSA_NO_EXPIRY : 0); in brcmf_pmksa_v3_op()
4341 pmk_op->length = cpu_to_le16(length); in brcmf_pmksa_v3_op()
4355 pmk_list = &cfg->pmk_list; in brcmf_update_pmklist()
4356 npmk = le32_to_cpu(pmk_list->npmk); in brcmf_update_pmklist()
4360 brcmf_dbg(CONN, "PMK[%d]: %pM\n", i, &pmk_list->pmk[i].bssid); in brcmf_update_pmklist()
4372 struct brcmf_pmksa *pmk = &cfg->pmk_list.pmk[0]; in brcmf_cfg80211_set_pmksa()
4373 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_set_pmksa()
4378 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_set_pmksa()
4379 return -EIO; in brcmf_cfg80211_set_pmksa()
4381 brcmf_dbg(CONN, "set_pmksa - PMK bssid: %pM =\n", pmksa->bssid); in brcmf_cfg80211_set_pmksa()
4382 brcmf_dbg(CONN, "%*ph\n", WLAN_PMKID_LEN, pmksa->pmkid); in brcmf_cfg80211_set_pmksa()
4389 npmk = le32_to_cpu(cfg->pmk_list.npmk); in brcmf_cfg80211_set_pmksa()
4391 if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN)) in brcmf_cfg80211_set_pmksa()
4394 memcpy(pmk[i].bssid, pmksa->bssid, ETH_ALEN); in brcmf_cfg80211_set_pmksa()
4395 memcpy(pmk[i].pmkid, pmksa->pmkid, WLAN_PMKID_LEN); in brcmf_cfg80211_set_pmksa()
4398 cfg->pmk_list.npmk = cpu_to_le32(npmk); in brcmf_cfg80211_set_pmksa()
4402 return -EINVAL; in brcmf_cfg80211_set_pmksa()
4417 struct brcmf_pmksa *pmk = &cfg->pmk_list.pmk[0]; in brcmf_cfg80211_del_pmksa()
4418 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_del_pmksa()
4423 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_del_pmksa()
4424 return -EIO; in brcmf_cfg80211_del_pmksa()
4426 brcmf_dbg(CONN, "del_pmksa - PMK bssid = %pM\n", pmksa->bssid); in brcmf_cfg80211_del_pmksa()
4433 npmk = le32_to_cpu(cfg->pmk_list.npmk); in brcmf_cfg80211_del_pmksa()
4435 if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN)) in brcmf_cfg80211_del_pmksa()
4439 for (; i < (npmk - 1); i++) { in brcmf_cfg80211_del_pmksa()
4445 cfg->pmk_list.npmk = cpu_to_le32(npmk - 1); in brcmf_cfg80211_del_pmksa()
4448 return -EINVAL; in brcmf_cfg80211_del_pmksa()
4466 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_flush_pmksa()
4467 return -EIO; in brcmf_cfg80211_flush_pmksa()
4474 memset(&cfg->pmk_list, 0, sizeof(cfg->pmk_list)); in brcmf_cfg80211_flush_pmksa()
4484 struct brcmf_pub *drvr = ifp->drvr; in brcmf_configure_opensecurity()
4500 /* set upper-layer auth */ in brcmf_configure_opensecurity()
4501 if (brcmf_is_ibssmode(ifp->vif)) in brcmf_configure_opensecurity()
4527 struct brcmf_pub *drvr = ifp->drvr; in brcmf_configure_wpaie()
4547 len = wpa_ie->len + TLV_HDR_LEN; in brcmf_configure_wpaie()
4557 err = -EINVAL; in brcmf_configure_wpaie()
4563 err = -EINVAL; in brcmf_configure_wpaie()
4585 err = -EINVAL; in brcmf_configure_wpaie()
4596 err = -EINVAL; in brcmf_configure_wpaie()
4602 err = -EINVAL; in brcmf_configure_wpaie()
4630 err = -EINVAL; in brcmf_configure_wpaie()
4636 err = -EINVAL; in brcmf_configure_wpaie()
4691 err = -EINVAL; in brcmf_configure_wpaie()
4756 /* set upper-layer auth */ in brcmf_configure_wpaie()
4781 if (ie->id != WLAN_EID_VENDOR_SPECIFIC) in brcmf_parse_vndr_ies()
4785 if (vndrie->len < (VS_IE_FIXED_HDR_LEN - TLV_HDR_LEN + 1)) { in brcmf_parse_vndr_ies()
4787 vndrie->len); in brcmf_parse_vndr_ies()
4791 if (!memcmp(vndrie->oui, (u8 *)WPA_OUI, TLV_OUI_LEN) && in brcmf_parse_vndr_ies()
4792 ((vndrie->oui_type == WPA_OUI_TYPE) || in brcmf_parse_vndr_ies()
4793 (vndrie->oui_type == WME_OUI_TYPE))) { in brcmf_parse_vndr_ies()
4798 parsed_info = &vndr_ies->ie_info[vndr_ies->count]; in brcmf_parse_vndr_ies()
4801 parsed_info->ie_ptr = (char *)vndrie; in brcmf_parse_vndr_ies()
4802 parsed_info->ie_len = vndrie->len + TLV_HDR_LEN; in brcmf_parse_vndr_ies()
4803 memcpy(&parsed_info->vndrie, vndrie, sizeof(*vndrie)); in brcmf_parse_vndr_ies()
4805 vndr_ies->count++; in brcmf_parse_vndr_ies()
4808 parsed_info->vndrie.oui, in brcmf_parse_vndr_ies()
4809 parsed_info->vndrie.oui_type); in brcmf_parse_vndr_ies()
4811 if (vndr_ies->count >= VNDR_IE_PARSE_LIMIT) in brcmf_parse_vndr_ies()
4814 remaining_len -= (ie->len + TLV_HDR_LEN); in brcmf_parse_vndr_ies()
4818 ie = (struct brcmf_tlv *)(((u8 *)ie) + ie->len + in brcmf_parse_vndr_ies()
4861 return -ENODEV; in brcmf_vif_set_mgmt_ie()
4862 ifp = vif->ifp; in brcmf_vif_set_mgmt_ie()
4863 drvr = ifp->drvr; in brcmf_vif_set_mgmt_ie()
4864 saved_ie = &vif->saved_ie; in brcmf_vif_set_mgmt_ie()
4866 brcmf_dbg(TRACE, "bsscfgidx %d, pktflag : 0x%02X\n", ifp->bsscfgidx, in brcmf_vif_set_mgmt_ie()
4870 return -ENOMEM; in brcmf_vif_set_mgmt_ie()
4874 mgmt_ie_buf = saved_ie->probe_req_ie; in brcmf_vif_set_mgmt_ie()
4875 mgmt_ie_len = &saved_ie->probe_req_ie_len; in brcmf_vif_set_mgmt_ie()
4876 mgmt_ie_buf_len = sizeof(saved_ie->probe_req_ie); in brcmf_vif_set_mgmt_ie()
4879 mgmt_ie_buf = saved_ie->probe_res_ie; in brcmf_vif_set_mgmt_ie()
4880 mgmt_ie_len = &saved_ie->probe_res_ie_len; in brcmf_vif_set_mgmt_ie()
4881 mgmt_ie_buf_len = sizeof(saved_ie->probe_res_ie); in brcmf_vif_set_mgmt_ie()
4884 mgmt_ie_buf = saved_ie->beacon_ie; in brcmf_vif_set_mgmt_ie()
4885 mgmt_ie_len = &saved_ie->beacon_ie_len; in brcmf_vif_set_mgmt_ie()
4886 mgmt_ie_buf_len = sizeof(saved_ie->beacon_ie); in brcmf_vif_set_mgmt_ie()
4889 mgmt_ie_buf = saved_ie->assoc_req_ie; in brcmf_vif_set_mgmt_ie()
4890 mgmt_ie_len = &saved_ie->assoc_req_ie_len; in brcmf_vif_set_mgmt_ie()
4891 mgmt_ie_buf_len = sizeof(saved_ie->assoc_req_ie); in brcmf_vif_set_mgmt_ie()
4894 mgmt_ie_buf = saved_ie->assoc_res_ie; in brcmf_vif_set_mgmt_ie()
4895 mgmt_ie_len = &saved_ie->assoc_res_ie_len; in brcmf_vif_set_mgmt_ie()
4896 mgmt_ie_buf_len = sizeof(saved_ie->assoc_res_ie); in brcmf_vif_set_mgmt_ie()
4899 err = -EPERM; in brcmf_vif_set_mgmt_ie()
4905 err = -ENOMEM; in brcmf_vif_set_mgmt_ie()
4916 memcpy(ptr + parsed_ie_buf_len, vndrie_info->ie_ptr, in brcmf_vif_set_mgmt_ie()
4917 vndrie_info->ie_len); in brcmf_vif_set_mgmt_ie()
4918 parsed_ie_buf_len += vndrie_info->ie_len; in brcmf_vif_set_mgmt_ie()
4938 vndrie_info->vndrie.id, in brcmf_vif_set_mgmt_ie()
4939 vndrie_info->vndrie.len, in brcmf_vif_set_mgmt_ie()
4940 vndrie_info->vndrie.oui); in brcmf_vif_set_mgmt_ie()
4943 vndrie_info->ie_ptr, in brcmf_vif_set_mgmt_ie()
4944 vndrie_info->ie_len, in brcmf_vif_set_mgmt_ie()
4963 if (remained_buf_len < (vndrie_info->vndrie.len + in brcmf_vif_set_mgmt_ie()
4969 remained_buf_len -= (vndrie_info->ie_len + in brcmf_vif_set_mgmt_ie()
4973 vndrie_info->vndrie.id, in brcmf_vif_set_mgmt_ie()
4974 vndrie_info->vndrie.len, in brcmf_vif_set_mgmt_ie()
4975 vndrie_info->vndrie.oui); in brcmf_vif_set_mgmt_ie()
4978 vndrie_info->ie_ptr, in brcmf_vif_set_mgmt_ie()
4979 vndrie_info->ie_len, in brcmf_vif_set_mgmt_ie()
4983 memcpy(ptr + (*mgmt_ie_len), vndrie_info->ie_ptr, in brcmf_vif_set_mgmt_ie()
4984 vndrie_info->ie_len); in brcmf_vif_set_mgmt_ie()
4985 *mgmt_ie_len += vndrie_info->ie_len; in brcmf_vif_set_mgmt_ie()
5011 if (vif->wdev.iftype == NL80211_IFTYPE_AP) in brcmf_vif_clear_mgmt_ies()
5019 memset(&vif->saved_ie, 0, sizeof(vif->saved_ie)); in brcmf_vif_clear_mgmt_ies()
5027 struct brcmf_pub *drvr = vif->ifp->drvr; in brcmf_config_ap_mgmt_ie()
5032 beacon->tail, beacon->tail_len); in brcmf_config_ap_mgmt_ie()
5041 beacon->proberesp_ies, in brcmf_config_ap_mgmt_ie()
5042 beacon->proberesp_ies_len); in brcmf_config_ap_mgmt_ie()
5050 beacon->assocresp_ies, in brcmf_config_ap_mgmt_ie()
5051 beacon->assocresp_ies_len); in brcmf_config_ap_mgmt_ie()
5070 rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, in brcmf_parse_configure_security()
5071 settings->beacon.tail_len, WLAN_EID_RSN); in brcmf_parse_configure_security()
5074 wpa_ie = brcmf_find_wpaie((u8 *)settings->beacon.tail, in brcmf_parse_configure_security()
5075 settings->beacon.tail_len); in brcmf_parse_configure_security()
5109 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_start_ap()
5110 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_cfg80211_start_ap()
5111 struct cfg80211_crypto_settings *crypto = &settings->crypto; in brcmf_cfg80211_start_ap()
5115 s32 err = -EPERM; in brcmf_cfg80211_start_ap()
5119 u16 chanspec = chandef_to_chanspec(&cfg->d11inf, &settings->chandef); in brcmf_cfg80211_start_ap()
5126 settings->chandef.chan->hw_value, in brcmf_cfg80211_start_ap()
5127 settings->chandef.center_freq1, settings->chandef.width, in brcmf_cfg80211_start_ap()
5128 settings->beacon_interval, settings->dtim_period); in brcmf_cfg80211_start_ap()
5130 settings->ssid, settings->ssid_len, settings->auth_type, in brcmf_cfg80211_start_ap()
5131 settings->inactivity_timeout); in brcmf_cfg80211_start_ap()
5132 dev_role = ifp->vif->wdev.iftype; in brcmf_cfg80211_start_ap()
5133 mbss = ifp->vif->mbss; in brcmf_cfg80211_start_ap()
5137 &ifp->vif->is_11d)) { in brcmf_cfg80211_start_ap()
5140 country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, in brcmf_cfg80211_start_ap()
5141 settings->beacon.tail_len, in brcmf_cfg80211_start_ap()
5148 if (settings->ssid == NULL || settings->ssid_len == 0) { in brcmf_cfg80211_start_ap()
5151 (u8 *)&settings->beacon.head[ie_offset], in brcmf_cfg80211_start_ap()
5152 settings->beacon.head_len - ie_offset, in brcmf_cfg80211_start_ap()
5154 if (!ssid_ie || ssid_ie->len > IEEE80211_MAX_SSID_LEN) in brcmf_cfg80211_start_ap()
5155 return -EINVAL; in brcmf_cfg80211_start_ap()
5157 memcpy(ssid_le.SSID, ssid_ie->data, ssid_ie->len); in brcmf_cfg80211_start_ap()
5158 ssid_le.SSID_len = cpu_to_le32(ssid_ie->len); in brcmf_cfg80211_start_ap()
5161 memcpy(ssid_le.SSID, settings->ssid, settings->ssid_len); in brcmf_cfg80211_start_ap()
5162 ssid_le.SSID_len = cpu_to_le32((u32)settings->ssid_len); in brcmf_cfg80211_start_ap()
5172 if ((supports_11d) && (is_11d != ifp->vif->is_11d)) { in brcmf_cfg80211_start_ap()
5181 if (settings->beacon_interval) { in brcmf_cfg80211_start_ap()
5183 settings->beacon_interval); in brcmf_cfg80211_start_ap()
5190 if (settings->dtim_period) { in brcmf_cfg80211_start_ap()
5192 settings->dtim_period); in brcmf_cfg80211_start_ap()
5201 ((ifp->ifidx == 0) || in brcmf_cfg80211_start_ap()
5218 } else if (WARN_ON(supports_11d && (is_11d != ifp->vif->is_11d))) { in brcmf_cfg80211_start_ap()
5219 /* Multiple-BSS should use same 11d configuration */ in brcmf_cfg80211_start_ap()
5220 err = -EINVAL; in brcmf_cfg80211_start_ap()
5252 if (crypto->psk) { in brcmf_cfg80211_start_ap()
5254 profile->use_fwauth |= BIT(BRCMF_PROFILE_FWAUTH_PSK); in brcmf_cfg80211_start_ap()
5255 err = brcmf_set_pmk(ifp, crypto->psk, in brcmf_cfg80211_start_ap()
5260 if (crypto->sae_pwd) { in brcmf_cfg80211_start_ap()
5262 profile->use_fwauth |= BIT(BRCMF_PROFILE_FWAUTH_SAE); in brcmf_cfg80211_start_ap()
5267 if (profile->use_fwauth == 0) in brcmf_cfg80211_start_ap()
5268 profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE); in brcmf_cfg80211_start_ap()
5294 (settings->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE); in brcmf_cfg80211_start_ap()
5325 bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx); in brcmf_cfg80211_start_ap()
5339 brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon); in brcmf_cfg80211_start_ap()
5340 set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); in brcmf_cfg80211_start_ap()
5356 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_stop_ap()
5357 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_cfg80211_stop_ap()
5364 if (ifp->vif->wdev.iftype == NL80211_IFTYPE_AP) { in brcmf_cfg80211_stop_ap()
5369 if (profile->use_fwauth != BIT(BRCMF_PROFILE_FWAUTH_NONE)) { in brcmf_cfg80211_stop_ap()
5372 if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_PSK)) in brcmf_cfg80211_stop_ap()
5374 if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_SAE)) in brcmf_cfg80211_stop_ap()
5376 profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE); in brcmf_cfg80211_stop_ap()
5379 if (ifp->vif->mbss) { in brcmf_cfg80211_stop_ap()
5385 if (ifp->bsscfgidx == 0) in brcmf_cfg80211_stop_ap()
5402 ifp->vif->is_11d); in brcmf_cfg80211_stop_ap()
5408 brcmf_vif_clear_mgmt_ies(ifp->vif); in brcmf_cfg80211_stop_ap()
5410 bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx); in brcmf_cfg80211_stop_ap()
5419 clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); in brcmf_cfg80211_stop_ap()
5433 return brcmf_config_ap_mgmt_ie(ifp->vif, &info->beacon); in brcmf_cfg80211_change_beacon()
5441 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_del_station()
5446 if (!params->mac) in brcmf_cfg80211_del_station()
5447 return -EFAULT; in brcmf_cfg80211_del_station()
5449 brcmf_dbg(TRACE, "Enter %pM\n", params->mac); in brcmf_cfg80211_del_station()
5451 if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif) in brcmf_cfg80211_del_station()
5452 ifp = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp; in brcmf_cfg80211_del_station()
5453 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_del_station()
5454 return -EIO; in brcmf_cfg80211_del_station()
5456 memcpy(&scbval.ea, params->mac, ETH_ALEN); in brcmf_cfg80211_del_station()
5457 scbval.val = cpu_to_le32(params->reason_code); in brcmf_cfg80211_del_station()
5473 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_change_station()
5478 params->sta_flags_mask, params->sta_flags_set); in brcmf_cfg80211_change_station()
5484 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in brcmf_cfg80211_change_station()
5487 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED)) in brcmf_cfg80211_change_station()
5494 bphy_err(drvr, "Setting SCB (de-)authorize failed, %d\n", err); in brcmf_cfg80211_change_station()
5508 vif->mgmt_rx_reg = upd->interface_stypes; in brcmf_cfg80211_update_mgmt_frame_registrations()
5517 struct ieee80211_channel *chan = params->chan; in brcmf_cfg80211_mgmt_tx()
5518 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_mgmt_tx()
5519 const u8 *buf = params->buf; in brcmf_cfg80211_mgmt_tx()
5520 size_t len = params->len; in brcmf_cfg80211_mgmt_tx()
5538 if (!ieee80211_is_mgmt(mgmt->frame_control)) { in brcmf_cfg80211_mgmt_tx()
5540 return -EPERM; in brcmf_cfg80211_mgmt_tx()
5545 if (ieee80211_is_probe_resp(mgmt->frame_control)) { in brcmf_cfg80211_mgmt_tx()
5554 /* "DIRECT-". Note in future supplicant will take */ in brcmf_cfg80211_mgmt_tx()
5559 ie_len = len - ie_offset; in brcmf_cfg80211_mgmt_tx()
5560 if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif) in brcmf_cfg80211_mgmt_tx()
5561 vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif; in brcmf_cfg80211_mgmt_tx()
5568 } else if (ieee80211_is_action(mgmt->frame_control)) { in brcmf_cfg80211_mgmt_tx()
5571 err = -EINVAL; in brcmf_cfg80211_mgmt_tx()
5577 err = -ENOMEM; in brcmf_cfg80211_mgmt_tx()
5580 action_frame = &af_params->action_frame; in brcmf_cfg80211_mgmt_tx()
5582 action_frame->packet_id = cpu_to_le32(*cookie); in brcmf_cfg80211_mgmt_tx()
5584 memcpy(&action_frame->da[0], &mgmt->da[0], ETH_ALEN); in brcmf_cfg80211_mgmt_tx()
5585 memcpy(&af_params->bssid[0], &mgmt->bssid[0], ETH_ALEN); in brcmf_cfg80211_mgmt_tx()
5587 action_frame->len = cpu_to_le16(len - DOT11_MGMT_HDR_LEN); in brcmf_cfg80211_mgmt_tx()
5592 freq = chan->center_freq; in brcmf_cfg80211_mgmt_tx()
5594 brcmf_fil_cmd_int_get(vif->ifp, BRCMF_C_GET_CHANNEL, in brcmf_cfg80211_mgmt_tx()
5597 af_params->channel = cpu_to_le32(chan_nr); in brcmf_cfg80211_mgmt_tx()
5598 af_params->dwell_time = cpu_to_le32(params->wait); in brcmf_cfg80211_mgmt_tx()
5599 memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN], in brcmf_cfg80211_mgmt_tx()
5600 le16_to_cpu(action_frame->len)); in brcmf_cfg80211_mgmt_tx()
5603 *cookie, le16_to_cpu(action_frame->len), freq); in brcmf_cfg80211_mgmt_tx()
5612 brcmf_dbg(TRACE, "Unhandled, fc=%04x!!\n", mgmt->frame_control); in brcmf_cfg80211_mgmt_tx()
5631 vif = ifp->vif; in brcmf_cfg80211_set_cqm_rssi_range_config()
5633 if (rssi_low != vif->cqm_rssi_low || rssi_high != vif->cqm_rssi_high) { in brcmf_cfg80211_set_cqm_rssi_range_config()
5644 clamp_val(rssi_low, S8_MIN, S8_MAX - 2), in brcmf_cfg80211_set_cqm_rssi_range_config()
5645 clamp_val(rssi_high, S8_MIN + 1, S8_MAX - 1), in brcmf_cfg80211_set_cqm_rssi_range_config()
5653 err = -EINVAL; in brcmf_cfg80211_set_cqm_rssi_range_config()
5655 vif->cqm_rssi_low = rssi_low; in brcmf_cfg80211_set_cqm_rssi_range_config()
5656 vif->cqm_rssi_high = rssi_high; in brcmf_cfg80211_set_cqm_rssi_range_config()
5669 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_cancel_remain_on_channel()
5675 vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif; in brcmf_cfg80211_cancel_remain_on_channel()
5678 err = -ENODEV; in brcmf_cfg80211_cancel_remain_on_channel()
5681 brcmf_p2p_cancel_remain_on_channel(vif->ifp); in brcmf_cfg80211_cancel_remain_on_channel()
5692 struct net_device *ndev = wdev->netdev; in brcmf_cfg80211_get_channel()
5693 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_get_channel()
5700 if (!ndev || drvr->bus_if->state != BRCMF_BUS_UP) in brcmf_cfg80211_get_channel()
5701 return -ENODEV; in brcmf_cfg80211_get_channel()
5710 cfg->d11inf.decchspec(&ch); in brcmf_cfg80211_get_channel()
5740 chandef->chan = ieee80211_get_channel(wiphy, freq); in brcmf_cfg80211_get_channel()
5741 chandef->width = width; in brcmf_cfg80211_get_channel()
5742 chandef->center_freq1 = ieee80211_channel_to_frequency(ch.chnum, band); in brcmf_cfg80211_get_channel()
5743 chandef->center_freq2 = 0; in brcmf_cfg80211_get_channel()
5760 return -EINVAL; in brcmf_cfg80211_crit_proto_start()
5763 set_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status); in brcmf_cfg80211_crit_proto_start()
5778 clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status); in brcmf_cfg80211_crit_proto_stop()
5785 switch (e->reason) { in brcmf_notify_tdls_peer_event()
5791 brcmf_proto_add_tdls_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr); in brcmf_notify_tdls_peer_event()
5795 brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr); in brcmf_notify_tdls_peer_event()
5818 ret = -EOPNOTSUPP; in brcmf_convert_nl80211_tdls_oper()
5828 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_tdls_oper()
5858 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_update_conn_params()
5866 err = brcmf_vif_set_mgmt_ie(ifp->vif, BRCMF_VNDR_IE_ASSOCREQ_FLAG, in brcmf_cfg80211_update_conn_params()
5867 sme->ie, sme->ie_len); in brcmf_cfg80211_update_conn_params()
5882 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_set_rekey_data()
5887 brcmf_dbg(TRACE, "Enter, bssidx=%d\n", ifp->bsscfgidx); in brcmf_cfg80211_set_rekey_data()
5889 memcpy(gtk_le.kck, gtk->kck, sizeof(gtk_le.kck)); in brcmf_cfg80211_set_rekey_data()
5890 memcpy(gtk_le.kek, gtk->kek, sizeof(gtk_le.kek)); in brcmf_cfg80211_set_rekey_data()
5891 memcpy(gtk_le.replay_counter, gtk->replay_ctr, in brcmf_cfg80211_set_rekey_data()
5912 if (WARN_ON(ifp->vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_1X)) in brcmf_cfg80211_set_pmk()
5913 return -EINVAL; in brcmf_cfg80211_set_pmk()
5915 if (conf->pmk_len > BRCMF_WSEC_MAX_PSK_LEN) in brcmf_cfg80211_set_pmk()
5916 return -ERANGE; in brcmf_cfg80211_set_pmk()
5918 return brcmf_set_pmk(ifp, conf->pmk, conf->pmk_len); in brcmf_cfg80211_set_pmk()
5928 if (WARN_ON(ifp->vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_1X)) in brcmf_cfg80211_del_pmk()
5929 return -EINVAL; in brcmf_cfg80211_del_pmk()
5990 if (ops && settings->roamoff) in brcmf_cfg80211_get_ops()
5991 ops->update_connect_params = NULL; in brcmf_cfg80211_get_ops()
6002 struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0); in brcmf_alloc_vif()
6008 return ERR_PTR(-ENOMEM); in brcmf_alloc_vif()
6010 vif->wdev.wiphy = cfg->wiphy; in brcmf_alloc_vif()
6011 vif->wdev.iftype = type; in brcmf_alloc_vif()
6013 brcmf_init_prof(&vif->profile); in brcmf_alloc_vif()
6018 list_for_each_entry(vif_walk, &cfg->vif_list, list) { in brcmf_alloc_vif()
6019 if (vif_walk->wdev.iftype == NL80211_IFTYPE_AP) { in brcmf_alloc_vif()
6024 vif->mbss = mbss; in brcmf_alloc_vif()
6027 list_add_tail(&vif->list, &cfg->vif_list); in brcmf_alloc_vif()
6033 list_del(&vif->list); in brcmf_free_vif()
6043 vif = ifp->vif; in brcmf_cfg80211_free_netdev()
6052 u32 event = e->event_code; in brcmf_is_linkup()
6053 u32 status = e->status; in brcmf_is_linkup()
6055 if ((vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_PSK || in brcmf_is_linkup()
6056 vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_SAE) && in brcmf_is_linkup()
6059 set_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state); in brcmf_is_linkup()
6062 memcpy(vif->profile.bssid, e->addr, ETH_ALEN); in brcmf_is_linkup()
6063 if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_PSK && in brcmf_is_linkup()
6064 vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_SAE) in brcmf_is_linkup()
6067 set_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state); in brcmf_is_linkup()
6070 if (test_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state) && in brcmf_is_linkup()
6071 test_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state)) { in brcmf_is_linkup()
6072 clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state); in brcmf_is_linkup()
6073 clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state); in brcmf_is_linkup()
6082 u32 event = e->event_code; in brcmf_is_linkdown()
6083 u16 flags = e->flags; in brcmf_is_linkdown()
6089 clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state); in brcmf_is_linkdown()
6090 clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state); in brcmf_is_linkdown()
6099 u32 event = e->event_code; in brcmf_is_nonetwork()
6100 u32 status = e->status; in brcmf_is_nonetwork()
6104 e->flags & BRCMF_EVENT_MSG_LINK ? "up" : "down"); in brcmf_is_nonetwork()
6127 kfree(conn_info->req_ie); in brcmf_clear_assoc_ies()
6128 conn_info->req_ie = NULL; in brcmf_clear_assoc_ies()
6129 conn_info->req_ie_len = 0; in brcmf_clear_assoc_ies()
6130 kfree(conn_info->resp_ie); in brcmf_clear_assoc_ies()
6131 conn_info->resp_ie = NULL; in brcmf_clear_assoc_ies()
6132 conn_info->resp_ie_len = 0; in brcmf_clear_assoc_ies()
6143 /* For those AC(s) with ACM flag set to 1, convert its 4-level priority in brcmf_map_prio_to_prec()
6144 * to an 8-level precedence which is the same as BE's in brcmf_map_prio_to_prec()
6147 cfg->ac_priority[prio] == cfg->ac_priority[PRIO_8021D_BE]) in brcmf_map_prio_to_prec()
6148 return cfg->ac_priority[prio] * 2; in brcmf_map_prio_to_prec()
6150 /* Conversion of 4-level priority to 8-level precedence */ in brcmf_map_prio_to_prec()
6153 return cfg->ac_priority[prio] * 2; in brcmf_map_prio_to_prec()
6155 return cfg->ac_priority[prio] * 2 + 1; in brcmf_map_prio_to_prec()
6167 return cfg->ac_priority[prio]; in brcmf_map_prio_to_aci()
6204 aifsn = acp->ACI & EDCF_AIFSN_MASK; in brcmf_wifi_prioritize_acparams()
6205 acm = (acp->ACI & EDCF_ACM_MASK) ? 1 : 0; in brcmf_wifi_prioritize_acparams()
6206 ecwmin = acp->ECW & EDCF_ECWMIN_MASK; in brcmf_wifi_prioritize_acparams()
6207 ecwmax = (acp->ECW & EDCF_ECWMAX_MASK) >> EDCF_ECWMAX_SHIFT; in brcmf_wifi_prioritize_acparams()
6241 * each 802.1d traffic type, in this range. in brcmf_wifi_prioritize_acparams()
6266 brcmf_dbg(CONN, "Adj prio BE 0->%d, BK 1->%d, BK 2->%d, BE 3->%d\n", in brcmf_wifi_prioritize_acparams()
6269 brcmf_dbg(CONN, "Adj prio VI 4->%d, VI 5->%d, VO 6->%d, VO 7->%d\n", in brcmf_wifi_prioritize_acparams()
6276 struct brcmf_pub *drvr = cfg->pub; in brcmf_get_assoc_ies()
6287 cfg->extra_buf, WL_ASSOC_INFO_MAX); in brcmf_get_assoc_ies()
6293 (struct brcmf_cfg80211_assoc_ielen_le *)cfg->extra_buf; in brcmf_get_assoc_ies()
6294 req_len = le32_to_cpu(assoc_info->req_len); in brcmf_get_assoc_ies()
6295 resp_len = le32_to_cpu(assoc_info->resp_len); in brcmf_get_assoc_ies()
6299 return -EINVAL; in brcmf_get_assoc_ies()
6303 cfg->extra_buf, in brcmf_get_assoc_ies()
6309 conn_info->req_ie_len = req_len; in brcmf_get_assoc_ies()
6310 conn_info->req_ie = in brcmf_get_assoc_ies()
6311 kmemdup(cfg->extra_buf, conn_info->req_ie_len, in brcmf_get_assoc_ies()
6313 if (!conn_info->req_ie) in brcmf_get_assoc_ies()
6314 conn_info->req_ie_len = 0; in brcmf_get_assoc_ies()
6316 conn_info->req_ie_len = 0; in brcmf_get_assoc_ies()
6317 conn_info->req_ie = NULL; in brcmf_get_assoc_ies()
6321 cfg->extra_buf, in brcmf_get_assoc_ies()
6327 conn_info->resp_ie_len = resp_len; in brcmf_get_assoc_ies()
6328 conn_info->resp_ie = in brcmf_get_assoc_ies()
6329 kmemdup(cfg->extra_buf, conn_info->resp_ie_len, in brcmf_get_assoc_ies()
6331 if (!conn_info->resp_ie) in brcmf_get_assoc_ies()
6332 conn_info->resp_ie_len = 0; in brcmf_get_assoc_ies()
6343 cfg->ac_priority); in brcmf_get_assoc_ies()
6345 conn_info->resp_ie_len = 0; in brcmf_get_assoc_ies()
6346 conn_info->resp_ie = NULL; in brcmf_get_assoc_ies()
6349 conn_info->req_ie_len, conn_info->resp_ie_len); in brcmf_get_assoc_ies()
6360 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_bss_roaming_done()
6375 memcpy(profile->bssid, e->addr, ETH_ALEN); in brcmf_bss_roaming_done()
6380 err = -ENOMEM; in brcmf_bss_roaming_done()
6393 ch.chspec = le16_to_cpu(bi->chanspec); in brcmf_bss_roaming_done()
6394 cfg->d11inf.decchspec(&ch); in brcmf_bss_roaming_done()
6397 band = wiphy->bands[NL80211_BAND_2GHZ]; in brcmf_bss_roaming_done()
6399 band = wiphy->bands[NL80211_BAND_5GHZ]; in brcmf_bss_roaming_done()
6401 freq = ieee80211_channel_to_frequency(ch.control_ch_num, band->band); in brcmf_bss_roaming_done()
6408 roam_info.links[0].bssid = profile->bssid; in brcmf_bss_roaming_done()
6409 roam_info.req_ie = conn_info->req_ie; in brcmf_bss_roaming_done()
6410 roam_info.req_ie_len = conn_info->req_ie_len; in brcmf_bss_roaming_done()
6411 roam_info.resp_ie = conn_info->resp_ie; in brcmf_bss_roaming_done()
6412 roam_info.resp_ie_len = conn_info->resp_ie_len; in brcmf_bss_roaming_done()
6417 if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X && profile->is_ft) { in brcmf_bss_roaming_done()
6418 cfg80211_port_authorized(ndev, profile->bssid, NULL, 0, GFP_KERNEL); in brcmf_bss_roaming_done()
6422 set_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state); in brcmf_bss_roaming_done()
6433 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_bss_connect_done()
6440 &ifp->vif->sme_state)) { in brcmf_bss_connect_done()
6446 &ifp->vif->sme_state); in brcmf_bss_connect_done()
6450 &ifp->vif->sme_state); in brcmf_bss_connect_done()
6452 &ifp->vif->sme_state); in brcmf_bss_connect_done()
6455 conn_params.links[0].bssid = profile->bssid; in brcmf_bss_connect_done()
6456 conn_params.req_ie = conn_info->req_ie; in brcmf_bss_connect_done()
6457 conn_params.req_ie_len = conn_info->req_ie_len; in brcmf_bss_connect_done()
6458 conn_params.resp_ie = conn_info->resp_ie; in brcmf_bss_connect_done()
6459 conn_params.resp_ie_len = conn_info->resp_ie_len; in brcmf_bss_connect_done()
6461 brcmf_dbg(CONN, "Report connect result - connection %s\n", in brcmf_bss_connect_done()
6473 struct brcmf_pub *drvr = cfg->pub; in brcmf_notify_connect_status_ap()
6475 u32 event = e->event_code; in brcmf_notify_connect_status_ap()
6476 u32 reason = e->reason; in brcmf_notify_connect_status_ap()
6484 complete(&cfg->vif_disabled); in brcmf_notify_connect_status_ap()
6492 return -EINVAL; in brcmf_notify_connect_status_ap()
6497 return -ENOMEM; in brcmf_notify_connect_status_ap()
6499 sinfo->assoc_req_ies = data; in brcmf_notify_connect_status_ap()
6500 sinfo->assoc_req_ies_len = e->datalen; in brcmf_notify_connect_status_ap()
6502 sinfo->generation = generation; in brcmf_notify_connect_status_ap()
6503 cfg80211_new_sta(ndev, e->addr, sinfo, GFP_KERNEL); in brcmf_notify_connect_status_ap()
6509 cfg80211_del_sta(ndev, e->addr, GFP_KERNEL); in brcmf_notify_connect_status_ap()
6518 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_notify_connect_status()
6519 struct net_device *ndev = ifp->ndev; in brcmf_notify_connect_status()
6520 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_notify_connect_status()
6524 if ((e->event_code == BRCMF_E_DEAUTH) || in brcmf_notify_connect_status()
6525 (e->event_code == BRCMF_E_DEAUTH_IND) || in brcmf_notify_connect_status()
6526 (e->event_code == BRCMF_E_DISASSOC_IND) || in brcmf_notify_connect_status()
6527 ((e->event_code == BRCMF_E_LINK) && (!e->flags))) { in brcmf_notify_connect_status()
6528 brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr); in brcmf_notify_connect_status()
6531 if (brcmf_is_apmode(ifp->vif)) { in brcmf_notify_connect_status()
6533 } else if (brcmf_is_linkup(ifp->vif, e)) { in brcmf_notify_connect_status()
6535 if (brcmf_is_ibssmode(ifp->vif)) { in brcmf_notify_connect_status()
6536 brcmf_inform_ibss(cfg, ndev, e->addr); in brcmf_notify_connect_status()
6537 chan = ieee80211_get_channel(cfg->wiphy, cfg->channel); in brcmf_notify_connect_status()
6538 memcpy(profile->bssid, e->addr, ETH_ALEN); in brcmf_notify_connect_status()
6539 cfg80211_ibss_joined(ndev, e->addr, chan, GFP_KERNEL); in brcmf_notify_connect_status()
6541 &ifp->vif->sme_state); in brcmf_notify_connect_status()
6543 &ifp->vif->sme_state); in brcmf_notify_connect_status()
6547 } else if (brcmf_is_linkdown(ifp->vif, e)) { in brcmf_notify_connect_status()
6549 if (!brcmf_is_ibssmode(ifp->vif) && in brcmf_notify_connect_status()
6551 &ifp->vif->sme_state) || in brcmf_notify_connect_status()
6553 &ifp->vif->sme_state))) { in brcmf_notify_connect_status()
6555 &ifp->vif->sme_state) && in brcmf_notify_connect_status()
6556 memcmp(profile->bssid, e->addr, ETH_ALEN)) in brcmf_notify_connect_status()
6560 brcmf_link_down(ifp->vif, in brcmf_notify_connect_status()
6562 e->event_code & in brcmf_notify_connect_status()
6568 complete(&cfg->vif_disabled); in brcmf_notify_connect_status()
6572 if (brcmf_is_ibssmode(ifp->vif)) in brcmf_notify_connect_status()
6574 &ifp->vif->sme_state); in brcmf_notify_connect_status()
6586 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_notify_roaming_status()
6587 u32 event = e->event_code; in brcmf_notify_roaming_status()
6588 u32 status = e->status; in brcmf_notify_roaming_status()
6592 &ifp->vif->sme_state)) { in brcmf_notify_roaming_status()
6593 brcmf_bss_roaming_done(cfg, ifp->ndev, e); in brcmf_notify_roaming_status()
6595 brcmf_bss_connect_done(cfg, ifp->ndev, e, true); in brcmf_notify_roaming_status()
6607 u16 flags = e->flags; in brcmf_notify_mic_status()
6615 cfg80211_michael_mic_failure(ifp->ndev, (u8 *)&e->addr, key_type, -1, in brcmf_notify_mic_status()
6624 struct brcmf_cfg80211_vif *vif = ifp->vif; in brcmf_notify_rssi()
6629 if (e->datalen >= sizeof(*info)) { in brcmf_notify_rssi()
6630 rssi = be32_to_cpu(info->rssi); in brcmf_notify_rssi()
6631 snr = be32_to_cpu(info->snr); in brcmf_notify_rssi()
6632 noise = be32_to_cpu(info->noise); in brcmf_notify_rssi()
6633 } else if (e->datalen >= sizeof(rssi)) { in brcmf_notify_rssi()
6640 low = vif->cqm_rssi_low; in brcmf_notify_rssi()
6641 high = vif->cqm_rssi_high; in brcmf_notify_rssi()
6642 last = vif->cqm_rssi_last; in brcmf_notify_rssi()
6647 vif->cqm_rssi_last = rssi; in brcmf_notify_rssi()
6651 cfg80211_cqm_rssi_notify(ifp->ndev, in brcmf_notify_rssi()
6656 cfg80211_cqm_rssi_notify(ifp->ndev, in brcmf_notify_rssi()
6667 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_notify_vif_event()
6669 struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; in brcmf_notify_vif_event()
6673 ifevent->action, ifevent->flags, ifevent->ifidx, in brcmf_notify_vif_event()
6674 ifevent->bsscfgidx); in brcmf_notify_vif_event()
6676 spin_lock(&event->vif_event_lock); in brcmf_notify_vif_event()
6677 event->action = ifevent->action; in brcmf_notify_vif_event()
6678 vif = event->vif; in brcmf_notify_vif_event()
6680 switch (ifevent->action) { in brcmf_notify_vif_event()
6683 if (!cfg->vif_event.vif) { in brcmf_notify_vif_event()
6684 spin_unlock(&event->vif_event_lock); in brcmf_notify_vif_event()
6685 return -EBADF; in brcmf_notify_vif_event()
6688 ifp->vif = vif; in brcmf_notify_vif_event()
6689 vif->ifp = ifp; in brcmf_notify_vif_event()
6690 if (ifp->ndev) { in brcmf_notify_vif_event()
6691 vif->wdev.netdev = ifp->ndev; in brcmf_notify_vif_event()
6692 ifp->ndev->ieee80211_ptr = &vif->wdev; in brcmf_notify_vif_event()
6693 SET_NETDEV_DEV(ifp->ndev, wiphy_dev(cfg->wiphy)); in brcmf_notify_vif_event()
6695 spin_unlock(&event->vif_event_lock); in brcmf_notify_vif_event()
6696 wake_up(&event->vif_wq); in brcmf_notify_vif_event()
6700 spin_unlock(&event->vif_event_lock); in brcmf_notify_vif_event()
6703 wake_up(&event->vif_wq); in brcmf_notify_vif_event()
6707 spin_unlock(&event->vif_event_lock); in brcmf_notify_vif_event()
6708 wake_up(&event->vif_wq); in brcmf_notify_vif_event()
6712 spin_unlock(&event->vif_event_lock); in brcmf_notify_vif_event()
6715 return -EINVAL; in brcmf_notify_vif_event()
6720 conf->frag_threshold = (u32)-1; in brcmf_init_conf()
6721 conf->rts_threshold = (u32)-1; in brcmf_init_conf()
6722 conf->retry_short = (u32)-1; in brcmf_init_conf()
6723 conf->retry_long = (u32)-1; in brcmf_init_conf()
6728 brcmf_fweh_register(cfg->pub, BRCMF_E_LINK, in brcmf_register_event_handlers()
6730 brcmf_fweh_register(cfg->pub, BRCMF_E_DEAUTH_IND, in brcmf_register_event_handlers()
6732 brcmf_fweh_register(cfg->pub, BRCMF_E_DEAUTH, in brcmf_register_event_handlers()
6734 brcmf_fweh_register(cfg->pub, BRCMF_E_DISASSOC_IND, in brcmf_register_event_handlers()
6736 brcmf_fweh_register(cfg->pub, BRCMF_E_ASSOC_IND, in brcmf_register_event_handlers()
6738 brcmf_fweh_register(cfg->pub, BRCMF_E_REASSOC_IND, in brcmf_register_event_handlers()
6740 brcmf_fweh_register(cfg->pub, BRCMF_E_ROAM, in brcmf_register_event_handlers()
6742 brcmf_fweh_register(cfg->pub, BRCMF_E_MIC_ERROR, in brcmf_register_event_handlers()
6744 brcmf_fweh_register(cfg->pub, BRCMF_E_SET_SSID, in brcmf_register_event_handlers()
6746 brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND, in brcmf_register_event_handlers()
6748 brcmf_fweh_register(cfg->pub, BRCMF_E_IF, in brcmf_register_event_handlers()
6750 brcmf_fweh_register(cfg->pub, BRCMF_E_P2P_PROBEREQ_MSG, in brcmf_register_event_handlers()
6752 brcmf_fweh_register(cfg->pub, BRCMF_E_P2P_DISC_LISTEN_COMPLETE, in brcmf_register_event_handlers()
6754 brcmf_fweh_register(cfg->pub, BRCMF_E_ACTION_FRAME_RX, in brcmf_register_event_handlers()
6756 brcmf_fweh_register(cfg->pub, BRCMF_E_ACTION_FRAME_COMPLETE, in brcmf_register_event_handlers()
6758 brcmf_fweh_register(cfg->pub, BRCMF_E_ACTION_FRAME_OFF_CHAN_COMPLETE, in brcmf_register_event_handlers()
6760 brcmf_fweh_register(cfg->pub, BRCMF_E_PSK_SUP, in brcmf_register_event_handlers()
6762 brcmf_fweh_register(cfg->pub, BRCMF_E_RSSI, brcmf_notify_rssi); in brcmf_register_event_handlers()
6767 kfree(cfg->conf); in brcmf_deinit_priv_mem()
6768 cfg->conf = NULL; in brcmf_deinit_priv_mem()
6769 kfree(cfg->extra_buf); in brcmf_deinit_priv_mem()
6770 cfg->extra_buf = NULL; in brcmf_deinit_priv_mem()
6771 kfree(cfg->wowl.nd); in brcmf_deinit_priv_mem()
6772 cfg->wowl.nd = NULL; in brcmf_deinit_priv_mem()
6773 kfree(cfg->wowl.nd_info); in brcmf_deinit_priv_mem()
6774 cfg->wowl.nd_info = NULL; in brcmf_deinit_priv_mem()
6775 kfree(cfg->escan_info.escan_buf); in brcmf_deinit_priv_mem()
6776 cfg->escan_info.escan_buf = NULL; in brcmf_deinit_priv_mem()
6781 cfg->conf = kzalloc(sizeof(*cfg->conf), GFP_KERNEL); in brcmf_init_priv_mem()
6782 if (!cfg->conf) in brcmf_init_priv_mem()
6784 cfg->extra_buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL); in brcmf_init_priv_mem()
6785 if (!cfg->extra_buf) in brcmf_init_priv_mem()
6787 cfg->wowl.nd = kzalloc(sizeof(*cfg->wowl.nd) + sizeof(u32), GFP_KERNEL); in brcmf_init_priv_mem()
6788 if (!cfg->wowl.nd) in brcmf_init_priv_mem()
6790 cfg->wowl.nd_info = kzalloc(sizeof(*cfg->wowl.nd_info) + in brcmf_init_priv_mem()
6793 if (!cfg->wowl.nd_info) in brcmf_init_priv_mem()
6795 cfg->escan_info.escan_buf = kzalloc(BRCMF_ESCAN_BUF_SIZE, GFP_KERNEL); in brcmf_init_priv_mem()
6796 if (!cfg->escan_info.escan_buf) in brcmf_init_priv_mem()
6804 return -ENOMEM; in brcmf_init_priv_mem()
6811 cfg->scan_request = NULL; in wl_init_priv()
6812 cfg->pwr_save = true; in wl_init_priv()
6813 cfg->dongle_up = false; /* dongle is not up yet */ in wl_init_priv()
6818 mutex_init(&cfg->usr_sync); in wl_init_priv()
6820 brcmf_init_conf(cfg->conf); in wl_init_priv()
6821 brcmf_init_wmm_prio(cfg->ac_priority); in wl_init_priv()
6822 init_completion(&cfg->vif_disabled); in wl_init_priv()
6828 cfg->dongle_up = false; /* dongle down */ in wl_deinit_priv()
6836 init_waitqueue_head(&event->vif_wq); in init_vif_event()
6837 spin_lock_init(&event->vif_event_lock); in init_vif_event()
6842 struct brcmf_pub *drvr = ifp->drvr; in brcmf_dongle_roam()
6849 if (ifp->drvr->settings->roamoff) in brcmf_dongle_roam()
6859 /* Enable/Disable built-in roaming to allow supplicant to take care of in brcmf_dongle_roam()
6863 ifp->drvr->settings->roamoff ? "Off" : "On"); in brcmf_dongle_roam()
6865 ifp->drvr->settings->roamoff); in brcmf_dongle_roam()
6894 struct brcmf_pub *drvr = ifp->drvr; in brcmf_dongle_scantime()
6926 ht40_flag = channel->flags & IEEE80211_CHAN_NO_HT40; in brcmf_update_bw40_channel_flag()
6927 if (ch->sb == BRCMU_CHAN_SB_U) { in brcmf_update_bw40_channel_flag()
6929 channel->flags &= ~IEEE80211_CHAN_NO_HT40; in brcmf_update_bw40_channel_flag()
6930 channel->flags |= IEEE80211_CHAN_NO_HT40PLUS; in brcmf_update_bw40_channel_flag()
6936 channel->flags &= ~IEEE80211_CHAN_NO_HT40; in brcmf_update_bw40_channel_flag()
6938 channel->flags |= IEEE80211_CHAN_NO_HT40MINUS; in brcmf_update_bw40_channel_flag()
6946 struct brcmf_pub *drvr = cfg->pub; in brcmf_construct_chaninfo()
6961 return -ENOMEM; in brcmf_construct_chaninfo()
6972 band = wiphy->bands[NL80211_BAND_2GHZ]; in brcmf_construct_chaninfo()
6974 for (i = 0; i < band->n_channels; i++) in brcmf_construct_chaninfo()
6975 band->channels[i].flags = IEEE80211_CHAN_DISABLED; in brcmf_construct_chaninfo()
6976 band = wiphy->bands[NL80211_BAND_5GHZ]; in brcmf_construct_chaninfo()
6978 for (i = 0; i < band->n_channels; i++) in brcmf_construct_chaninfo()
6979 band->channels[i].flags = IEEE80211_CHAN_DISABLED; in brcmf_construct_chaninfo()
6981 total = le32_to_cpu(list->count); in brcmf_construct_chaninfo()
6985 err = -EINVAL; in brcmf_construct_chaninfo()
6990 ch.chspec = (u16)le32_to_cpu(list->element[i]); in brcmf_construct_chaninfo()
6991 cfg->d11inf.decchspec(&ch); in brcmf_construct_chaninfo()
6994 band = wiphy->bands[NL80211_BAND_2GHZ]; in brcmf_construct_chaninfo()
6996 band = wiphy->bands[NL80211_BAND_5GHZ]; in brcmf_construct_chaninfo()
7004 if (!(bw_cap[band->band] & WLC_BW_40MHZ_BIT) && in brcmf_construct_chaninfo()
7007 if (!(bw_cap[band->band] & WLC_BW_80MHZ_BIT) && in brcmf_construct_chaninfo()
7012 for (j = 0; j < band->n_channels; j++) { in brcmf_construct_chaninfo()
7013 if (band->channels[j].hw_value == ch.control_ch_num) { in brcmf_construct_chaninfo()
7014 channel = &band->channels[j]; in brcmf_construct_chaninfo()
7027 if (channel->orig_flags & IEEE80211_CHAN_DISABLED) in brcmf_construct_chaninfo()
7035 channel->flags &= ~IEEE80211_CHAN_NO_160MHZ; in brcmf_construct_chaninfo()
7038 channel->flags &= ~IEEE80211_CHAN_NO_80MHZ; in brcmf_construct_chaninfo()
7052 channel->flags = IEEE80211_CHAN_NO_HT40 | in brcmf_construct_chaninfo()
7056 cfg->d11inf.encchspec(&ch); in brcmf_construct_chaninfo()
7062 channel->flags |= in brcmf_construct_chaninfo()
7066 channel->flags |= in brcmf_construct_chaninfo()
7079 struct brcmf_pub *drvr = cfg->pub; in brcmf_enable_bw40_2g()
7112 return -ENOMEM; in brcmf_enable_bw40_2g()
7118 cfg->d11inf.encchspec(&ch); in brcmf_enable_bw40_2g()
7131 band = cfg_to_wiphy(cfg)->bands[NL80211_BAND_2GHZ]; in brcmf_enable_bw40_2g()
7133 num_chan = le32_to_cpu(list->count); in brcmf_enable_bw40_2g()
7138 return -EINVAL; in brcmf_enable_bw40_2g()
7142 ch.chspec = (u16)le32_to_cpu(list->element[i]); in brcmf_enable_bw40_2g()
7143 cfg->d11inf.decchspec(&ch); in brcmf_enable_bw40_2g()
7148 for (j = 0; j < band->n_channels; j++) { in brcmf_enable_bw40_2g()
7149 if (band->channels[j].hw_value == ch.control_ch_num) in brcmf_enable_bw40_2g()
7152 if (WARN_ON(j == band->n_channels)) in brcmf_enable_bw40_2g()
7155 brcmf_update_bw40_channel_flag(&band->channels[j], &ch); in brcmf_enable_bw40_2g()
7164 struct brcmf_pub *drvr = ifp->drvr; in brcmf_get_bwcap()
7206 band->ht_cap.ht_supported = true; in brcmf_update_ht_cap()
7207 if (bw_cap[band->band] & WLC_BW_40MHZ_BIT) { in brcmf_update_ht_cap()
7208 band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; in brcmf_update_ht_cap()
7209 band->ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; in brcmf_update_ht_cap()
7211 band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_20; in brcmf_update_ht_cap()
7212 band->ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40; in brcmf_update_ht_cap()
7213 band->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; in brcmf_update_ht_cap()
7214 band->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; in brcmf_update_ht_cap()
7215 memset(band->ht_cap.mcs.rx_mask, 0xff, nchain); in brcmf_update_ht_cap()
7216 band->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; in brcmf_update_ht_cap()
7237 if (band->band == NL80211_BAND_2GHZ) in brcmf_update_vht_cap()
7240 band->vht_cap.vht_supported = true; in brcmf_update_vht_cap()
7242 band->vht_cap.cap |= IEEE80211_VHT_CAP_SHORT_GI_80; in brcmf_update_vht_cap()
7243 if (bw_cap[band->band] & WLC_BW_160MHZ_BIT) { in brcmf_update_vht_cap()
7244 band->vht_cap.cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ; in brcmf_update_vht_cap()
7245 band->vht_cap.cap |= IEEE80211_VHT_CAP_SHORT_GI_160; in brcmf_update_vht_cap()
7247 /* all support 256-QAM */ in brcmf_update_vht_cap()
7249 band->vht_cap.vht_mcs.rx_mcs_map = mcs_map; in brcmf_update_vht_cap()
7250 band->vht_cap.vht_mcs.tx_mcs_map = mcs_map; in brcmf_update_vht_cap()
7254 band->vht_cap.cap |= IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE; in brcmf_update_vht_cap()
7256 band->vht_cap.cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; in brcmf_update_vht_cap()
7258 band->vht_cap.cap |= IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE; in brcmf_update_vht_cap()
7260 band->vht_cap.cap |= IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE; in brcmf_update_vht_cap()
7263 band->vht_cap.cap |= in brcmf_update_vht_cap()
7265 band->vht_cap.cap |= ((txstreams - 1) << in brcmf_update_vht_cap()
7267 band->vht_cap.cap |= in brcmf_update_vht_cap()
7274 struct brcmf_pub *drvr = cfg->pub; in brcmf_setup_wiphybands()
7303 if (err == -EBADE) in brcmf_setup_wiphybands()
7311 rxchain = rxchain & (rxchain - 1); in brcmf_setup_wiphybands()
7329 for (i = 0; i < ARRAY_SIZE(wiphy->bands); i++) { in brcmf_setup_wiphybands()
7330 band = wiphy->bands[i]; in brcmf_setup_wiphybands()
7384 * brcmf_setup_ifmodes() - determine interface modes and combinations.
7406 * #STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 1, 3 total
7407 * #STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
7412 * #STA <= 2, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
7413 * #STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
7417 * #STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 2, AP <= 2,
7442 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in brcmf_setup_ifmodes()
7446 wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR); in brcmf_setup_ifmodes()
7448 wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) | in brcmf_setup_ifmodes()
7532 wiphy->n_iface_combinations = n_combos; in brcmf_setup_ifmodes()
7533 wiphy->iface_combinations = combo; in brcmf_setup_ifmodes()
7541 return -ENOMEM; in brcmf_setup_ifmodes()
7558 struct brcmf_pub *drvr = cfg->pub; in brcmf_wiphy_wowl_params()
7565 wiphy->wowlan = &brcmf_wowlan_support; in brcmf_wiphy_wowl_params()
7571 wowl->flags |= WIPHY_WOWLAN_NET_DETECT; in brcmf_wiphy_wowl_params()
7572 wowl->max_nd_match_sets = BRCMF_PNO_MAX_PFN_COUNT; in brcmf_wiphy_wowl_params()
7573 init_waitqueue_head(&cfg->wowl.nd_data_wait); in brcmf_wiphy_wowl_params()
7577 wowl->flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY; in brcmf_wiphy_wowl_params()
7578 wowl->flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE; in brcmf_wiphy_wowl_params()
7581 wiphy->wowlan = wowl; in brcmf_wiphy_wowl_params()
7587 struct brcmf_pub *drvr = ifp->drvr; in brcmf_setup_wiphy()
7596 wiphy->max_scan_ssids = WL_NUM_SCAN_MAX; in brcmf_setup_wiphy()
7597 wiphy->max_scan_ie_len = BRCMF_SCAN_IE_LEN_MAX; in brcmf_setup_wiphy()
7598 wiphy->max_num_pmkids = BRCMF_MAXPMKID; in brcmf_setup_wiphy()
7604 for (i = 0, combo = wiphy->iface_combinations; in brcmf_setup_wiphy()
7605 i < wiphy->n_iface_combinations; i++, combo++) { in brcmf_setup_wiphy()
7606 max_interfaces = max(max_interfaces, combo->max_interfaces); in brcmf_setup_wiphy()
7609 for (i = 0; i < max_interfaces && i < ARRAY_SIZE(drvr->addresses); in brcmf_setup_wiphy()
7611 u8 *addr = drvr->addresses[i].addr; in brcmf_setup_wiphy()
7613 memcpy(addr, drvr->mac, ETH_ALEN); in brcmf_setup_wiphy()
7616 addr[ETH_ALEN - 1] ^= i; in brcmf_setup_wiphy()
7619 wiphy->addresses = drvr->addresses; in brcmf_setup_wiphy()
7620 wiphy->n_addresses = i; in brcmf_setup_wiphy()
7622 wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; in brcmf_setup_wiphy()
7623 wiphy->cipher_suites = brcmf_cipher_suites; in brcmf_setup_wiphy()
7624 wiphy->n_cipher_suites = ARRAY_SIZE(brcmf_cipher_suites); in brcmf_setup_wiphy()
7626 wiphy->n_cipher_suites--; in brcmf_setup_wiphy()
7627 wiphy->bss_select_support = BIT(NL80211_BSS_SELECT_ATTR_RSSI) | in brcmf_setup_wiphy()
7631 wiphy->flags |= WIPHY_FLAG_NETNS_OK | in brcmf_setup_wiphy()
7637 wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; in brcmf_setup_wiphy()
7638 if (!ifp->drvr->settings->roamoff) in brcmf_setup_wiphy()
7639 wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM; in brcmf_setup_wiphy()
7656 wiphy->mgmt_stypes = brcmf_txrx_stypes; in brcmf_setup_wiphy()
7657 wiphy->max_remain_on_channel_duration = 5000; in brcmf_setup_wiphy()
7663 wiphy->vendor_commands = brcmf_vendor_cmds; in brcmf_setup_wiphy()
7664 wiphy->n_vendor_commands = BRCMF_VNDR_CMDS_LAST - 1; in brcmf_setup_wiphy()
7681 return -ENOMEM; in brcmf_setup_wiphy()
7683 band->channels = kmemdup(&__wl_2ghz_channels, in brcmf_setup_wiphy()
7686 if (!band->channels) { in brcmf_setup_wiphy()
7688 return -ENOMEM; in brcmf_setup_wiphy()
7691 band->n_channels = ARRAY_SIZE(__wl_2ghz_channels); in brcmf_setup_wiphy()
7692 wiphy->bands[NL80211_BAND_2GHZ] = band; in brcmf_setup_wiphy()
7698 return -ENOMEM; in brcmf_setup_wiphy()
7700 band->channels = kmemdup(&__wl_5ghz_channels, in brcmf_setup_wiphy()
7703 if (!band->channels) { in brcmf_setup_wiphy()
7705 return -ENOMEM; in brcmf_setup_wiphy()
7708 band->n_channels = ARRAY_SIZE(__wl_5ghz_channels); in brcmf_setup_wiphy()
7709 wiphy->bands[NL80211_BAND_5GHZ] = band; in brcmf_setup_wiphy()
7713 if (wiphy->bands[NL80211_BAND_5GHZ] && in brcmf_setup_wiphy()
7727 struct brcmf_pub *drvr = cfg->pub; in brcmf_config_dongle()
7734 if (cfg->dongle_up) in brcmf_config_dongle()
7738 wdev = ndev->ieee80211_ptr; in brcmf_config_dongle()
7746 power_mode = cfg->pwr_save ? PM_FAST : PM_OFF; in brcmf_config_dongle()
7756 err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype, in brcmf_config_dongle()
7769 cfg->dongle_up = true; in brcmf_config_dongle()
7778 set_bit(BRCMF_VIF_STATUS_READY, &ifp->vif->sme_state); in __brcmf_cfg80211_up()
7780 return brcmf_config_dongle(ifp->drvr->config); in __brcmf_cfg80211_up()
7785 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in __brcmf_cfg80211_down()
7791 if (check_vif_up(ifp->vif)) { in __brcmf_cfg80211_down()
7792 brcmf_link_down(ifp->vif, WLAN_REASON_UNSPECIFIED, true); in __brcmf_cfg80211_down()
7802 clear_bit(BRCMF_VIF_STATUS_READY, &ifp->vif->sme_state); in __brcmf_cfg80211_down()
7810 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_cfg80211_up()
7813 mutex_lock(&cfg->usr_sync); in brcmf_cfg80211_up()
7815 mutex_unlock(&cfg->usr_sync); in brcmf_cfg80211_up()
7823 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_cfg80211_down()
7826 mutex_lock(&cfg->usr_sync); in brcmf_cfg80211_down()
7828 mutex_unlock(&cfg->usr_sync); in brcmf_cfg80211_down()
7838 list_for_each_entry(vif, &cfg->vif_list, list) { in brcmf_get_vif_state_any()
7839 if (test_bit(state, &vif->sme_state)) in brcmf_get_vif_state_any()
7850 spin_lock(&event->vif_event_lock); in vif_event_equals()
7851 evt_action = event->action; in vif_event_equals()
7852 spin_unlock(&event->vif_event_lock); in vif_event_equals()
7859 struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; in brcmf_cfg80211_arm_vif_event()
7861 spin_lock(&event->vif_event_lock); in brcmf_cfg80211_arm_vif_event()
7862 event->vif = vif; in brcmf_cfg80211_arm_vif_event()
7863 event->action = 0; in brcmf_cfg80211_arm_vif_event()
7864 spin_unlock(&event->vif_event_lock); in brcmf_cfg80211_arm_vif_event()
7869 struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; in brcmf_cfg80211_vif_event_armed()
7872 spin_lock(&event->vif_event_lock); in brcmf_cfg80211_vif_event_armed()
7873 armed = event->vif != NULL; in brcmf_cfg80211_vif_event_armed()
7874 spin_unlock(&event->vif_event_lock); in brcmf_cfg80211_vif_event_armed()
7882 struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; in brcmf_cfg80211_wait_vif_event()
7884 return wait_event_timeout(event->vif_wq, in brcmf_cfg80211_wait_vif_event()
7890 if (drvr->settings->trivial_ccode_map) in brmcf_use_iso3166_ccode_fallback()
7893 switch (drvr->bus_if->chip) { in brmcf_use_iso3166_ccode_fallback()
7912 if ((alpha2[0] == ccreq->country_abbrev[0]) && in brcmf_translate_country_code()
7913 (alpha2[1] == ccreq->country_abbrev[1])) { in brcmf_translate_country_code()
7915 return -EAGAIN; in brcmf_translate_country_code()
7918 country_codes = drvr->settings->country_codes; in brcmf_translate_country_code()
7923 ccreq->country_abbrev[0] = alpha2[0]; in brcmf_translate_country_code()
7924 ccreq->country_abbrev[1] = alpha2[1]; in brcmf_translate_country_code()
7925 ccreq->ccode[0] = alpha2[0]; in brcmf_translate_country_code()
7926 ccreq->ccode[1] = alpha2[1]; in brcmf_translate_country_code()
7931 return -EINVAL; in brcmf_translate_country_code()
7934 found_index = -1; in brcmf_translate_country_code()
7935 for (i = 0; i < country_codes->table_size; i++) { in brcmf_translate_country_code()
7936 cc = &country_codes->table[i]; in brcmf_translate_country_code()
7937 if ((cc->iso3166[0] == '\0') && (found_index == -1)) in brcmf_translate_country_code()
7939 if ((cc->iso3166[0] == alpha2[0]) && in brcmf_translate_country_code()
7940 (cc->iso3166[1] == alpha2[1])) { in brcmf_translate_country_code()
7945 if (found_index == -1) { in brcmf_translate_country_code()
7947 return -EINVAL; in brcmf_translate_country_code()
7950 ccreq->rev = cpu_to_le32(country_codes->table[found_index].rev); in brcmf_translate_country_code()
7951 memcpy(ccreq->ccode, country_codes->table[found_index].cc, in brcmf_translate_country_code()
7953 ccreq->country_abbrev[0] = alpha2[0]; in brcmf_translate_country_code()
7954 ccreq->country_abbrev[1] = alpha2[1]; in brcmf_translate_country_code()
7955 ccreq->country_abbrev[2] = 0; in brcmf_translate_country_code()
7977 survey->obss = val; in brcmf_parse_dump_obss()
7986 survey->ibss = val; in brcmf_parse_dump_obss()
7995 survey->tx = val; in brcmf_parse_dump_obss()
8004 survey->no_ctg = val; in brcmf_parse_dump_obss()
8013 survey->no_pckt = val; in brcmf_parse_dump_obss()
8022 survey->idle = val; in brcmf_parse_dump_obss()
8041 return -ENOMEM; in brcmf_dump_obss()
8048 err = -EINVAL; in brcmf_dump_obss()
8054 brcmf_parse_dump_obss(results->buf, survey); in brcmf_dump_obss()
8068 if (chan->flags & IEEE80211_CHAN_DISABLED) in brcmf_set_channel()
8069 return -EINVAL; in brcmf_set_channel()
8072 chspec = channel_to_chanspec(&cfg->d11inf, chan); in brcmf_set_channel()
8077 err = -EINVAL; in brcmf_set_channel()
8081 err = -EINVAL; in brcmf_set_channel()
8103 if ((test_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state)) || in brcmf_cfg80211_dump_survey()
8104 (test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state))) { in brcmf_cfg80211_dump_survey()
8105 return -EBUSY; in brcmf_cfg80211_dump_survey()
8109 band = wiphy->bands[band_id]; in brcmf_cfg80211_dump_survey()
8112 if (idx >= band->n_channels) { in brcmf_cfg80211_dump_survey()
8113 idx -= band->n_channels; in brcmf_cfg80211_dump_survey()
8117 info->channel = &band->channels[idx]; in brcmf_cfg80211_dump_survey()
8121 return -ENOENT; in brcmf_cfg80211_dump_survey()
8124 info->filled = 0; in brcmf_cfg80211_dump_survey()
8125 if (brcmf_set_channel(cfg, info->channel)) in brcmf_cfg80211_dump_survey()
8161 info->noise = noise; in brcmf_cfg80211_dump_survey()
8162 info->time = ACS_MSRMNT_DELAY; in brcmf_cfg80211_dump_survey()
8163 info->time_busy = ACS_MSRMNT_DELAY - survey.idle; in brcmf_cfg80211_dump_survey()
8164 info->time_rx = survey.obss + survey.ibss + survey.no_ctg + in brcmf_cfg80211_dump_survey()
8166 info->time_tx = survey.tx; in brcmf_cfg80211_dump_survey()
8167 info->filled = SURVEY_INFO_NOISE_DBM | SURVEY_INFO_TIME | in brcmf_cfg80211_dump_survey()
8172 ieee80211_frequency_to_channel(info->channel->center_freq), in brcmf_cfg80211_dump_survey()
8175 info->noise, info->time_busy, info->time_rx, info->time_tx); in brcmf_cfg80211_dump_survey()
8178 if (!brcmf_is_apmode(ifp->vif)) in brcmf_cfg80211_dump_survey()
8187 struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0); in brcmf_cfg80211_reg_notifier()
8188 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_reg_notifier()
8194 if (req->alpha2[0] == '0' && req->alpha2[1] == '0') in brcmf_cfg80211_reg_notifier()
8197 /* ignore non-ISO3166 country codes */ in brcmf_cfg80211_reg_notifier()
8199 if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') { in brcmf_cfg80211_reg_notifier()
8201 req->alpha2[0], req->alpha2[1]); in brcmf_cfg80211_reg_notifier()
8205 brcmf_dbg(TRACE, "Enter: initiator=%d, alpha=%c%c\n", req->initiator, in brcmf_cfg80211_reg_notifier()
8206 req->alpha2[0], req->alpha2[1]); in brcmf_cfg80211_reg_notifier()
8214 err = brcmf_translate_country_code(ifp->drvr, req->alpha2, &ccreq); in brcmf_cfg80211_reg_notifier()
8233 if (wiphy->iface_combinations) { in brcmf_free_wiphy()
8234 for (i = 0; i < wiphy->n_iface_combinations; i++) in brcmf_free_wiphy()
8235 kfree(wiphy->iface_combinations[i].limits); in brcmf_free_wiphy()
8237 kfree(wiphy->iface_combinations); in brcmf_free_wiphy()
8238 if (wiphy->bands[NL80211_BAND_2GHZ]) { in brcmf_free_wiphy()
8239 kfree(wiphy->bands[NL80211_BAND_2GHZ]->channels); in brcmf_free_wiphy()
8240 kfree(wiphy->bands[NL80211_BAND_2GHZ]); in brcmf_free_wiphy()
8242 if (wiphy->bands[NL80211_BAND_5GHZ]) { in brcmf_free_wiphy()
8243 kfree(wiphy->bands[NL80211_BAND_5GHZ]->channels); in brcmf_free_wiphy()
8244 kfree(wiphy->bands[NL80211_BAND_5GHZ]); in brcmf_free_wiphy()
8247 if (wiphy->wowlan != &brcmf_wowlan_support) in brcmf_free_wiphy()
8248 kfree(wiphy->wowlan); in brcmf_free_wiphy()
8256 struct wiphy *wiphy = drvr->wiphy; in brcmf_cfg80211_attach()
8257 struct net_device *ndev = brcmf_get_ifp(drvr, 0)->ndev; in brcmf_cfg80211_attach()
8276 cfg->wiphy = wiphy; in brcmf_cfg80211_attach()
8277 cfg->pub = drvr; in brcmf_cfg80211_attach()
8278 init_vif_event(&cfg->vif_event); in brcmf_cfg80211_attach()
8279 INIT_LIST_HEAD(&cfg->vif_list); in brcmf_cfg80211_attach()
8286 vif->ifp = ifp; in brcmf_cfg80211_attach()
8287 vif->wdev.netdev = ndev; in brcmf_cfg80211_attach()
8288 ndev->ieee80211_ptr = &vif->wdev; in brcmf_cfg80211_attach()
8289 SET_NETDEV_DEV(ndev, wiphy_dev(cfg->wiphy)); in brcmf_cfg80211_attach()
8297 ifp->vif = vif; in brcmf_cfg80211_attach()
8305 cfg->d11inf.io_type = (u8)io_type; in brcmf_cfg80211_attach()
8306 brcmu_d11_attach(&cfg->d11inf); in brcmf_cfg80211_attach()
8311 drvr->config = cfg; in brcmf_cfg80211_attach()
8318 wiphy->reg_notifier = brcmf_cfg80211_reg_notifier; in brcmf_cfg80211_attach()
8319 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG; in brcmf_cfg80211_attach()
8326 if (wiphy->bands[NL80211_BAND_2GHZ]) { in brcmf_cfg80211_attach()
8327 cap = &wiphy->bands[NL80211_BAND_2GHZ]->ht_cap.cap; in brcmf_cfg80211_attach()
8332 ops->set_rekey_data = brcmf_cfg80211_set_rekey_data; in brcmf_cfg80211_attach()
8335 ops->dump_survey = brcmf_cfg80211_dump_survey; in brcmf_cfg80211_attach()
8374 bphy_err(drvr, "BT-coex initialisation failed (%d)\n", err); in brcmf_cfg80211_attach()
8375 brcmf_p2p_detach(&cfg->p2p); in brcmf_cfg80211_attach()
8382 brcmf_p2p_detach(&cfg->p2p); in brcmf_cfg80211_attach()
8390 wiphy->flags &= ~WIPHY_FLAG_SUPPORTS_TDLS; in brcmf_cfg80211_attach()
8392 brcmf_fweh_register(cfg->pub, BRCMF_E_TDLS_PEER_EVENT, in brcmf_cfg80211_attach()
8397 /* (re-) activate FWEH event handling */ in brcmf_cfg80211_attach()
8406 wiphy->features |= NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR; in brcmf_cfg80211_attach()
8408 if (wiphy->wowlan && in brcmf_cfg80211_attach()
8409 wiphy->wowlan->flags & WIPHY_WOWLAN_NET_DETECT) in brcmf_cfg80211_attach()
8410 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; in brcmf_cfg80211_attach()
8419 brcmf_p2p_detach(&cfg->p2p); in brcmf_cfg80211_attach()
8421 wiphy_unregister(cfg->wiphy); in brcmf_cfg80211_attach()
8425 ifp->vif = NULL; in brcmf_cfg80211_attach()
8439 wiphy_unregister(cfg->wiphy); in brcmf_cfg80211_detach()
8441 cancel_work_sync(&cfg->escan_timeout_work); in brcmf_cfg80211_detach()
8442 brcmf_free_wiphy(cfg->wiphy); in brcmf_cfg80211_detach()