Lines Matching +full:traffic +full:- +full:patterns

1 // SPDX-License-Identifier: ISC
50 #define WPA_CIPHER_WEP_40 1 /* WEP (40-bit) */
53 #define WPA_CIPHER_WEP_104 5 /* WEP (104-bit) */
57 #define RSN_AKM_PSK 2 /* Pre-shared Key */
59 #define RSN_AKM_SHA256_PSK 6 /* SHA256, Pre-shared Key */
93 #define CHAN_NOISE_DUMMY (-80)
102 (sizeof(struct brcmf_assoc_params_le) - sizeof(u16))
105 (BRCMF_DCMD_MEDLEN / sizeof(__le32) - 1)
129 if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state)) { in check_vif_up()
131 vif->sme_state); in check_vif_up()
163 #define wl_a_rates_size (wl_g_rates_size - 4)
224 REG_RULE(2412-10, 2472+10, 40, 6, 20, 0),
226 /* IEEE 802.11 channel 14 - Only JP enables
229 REG_RULE(2484-10, 2484+10, 20, 6, 20, 0),
231 REG_RULE(5150-10, 5350+10, 160, 6, 20, 0),
233 REG_RULE(5470-10, 5850+10, 160, 6, 20, 0), }
333 ch->chan->center_freq, ch->center_freq1, ch->width); in chandef_to_chanspec()
334 ch_inf.chnum = ieee80211_frequency_to_channel(ch->center_freq1); in chandef_to_chanspec()
335 primary_offset = ch->chan->center_freq - ch->center_freq1; in chandef_to_chanspec()
336 switch (ch->width) { in chandef_to_chanspec()
351 if (primary_offset == -30) in chandef_to_chanspec()
353 else if (primary_offset == -10) in chandef_to_chanspec()
362 if (primary_offset == -70) in chandef_to_chanspec()
364 else if (primary_offset == -50) in chandef_to_chanspec()
366 else if (primary_offset == -30) in chandef_to_chanspec()
368 else if (primary_offset == -10) in chandef_to_chanspec()
385 switch (ch->chan->band) { in chandef_to_chanspec()
396 d11inf->encchspec(&ch_inf); in chandef_to_chanspec()
407 ch_inf.chnum = ieee80211_frequency_to_channel(ch->center_freq); in channel_to_chanspec()
409 d11inf->encchspec(&ch_inf); in channel_to_chanspec()
414 /* Traverse a string of 1-byte tag/1-byte length/variable-length value
426 int len = elt->len; in brcmf_parse_tlvs()
429 if ((elt->id == key) && (totlen >= (len + TLV_HDR_LEN))) in brcmf_parse_tlvs()
433 totlen -= (len + TLV_HDR_LEN); in brcmf_parse_tlvs()
458 *tlvs_len -= (int)(ie - *tlvs); in brcmf_tlv_has_ie()
502 list_for_each_entry(pos, &cfg->vif_list, list) in brcmf_vif_change_validate()
508 params.iftype_num[pos->wdev.iftype]++; in brcmf_vif_change_validate()
512 ret = cfg80211_check_combinations(cfg->wiphy, &params); in brcmf_vif_change_validate()
525 list_for_each_entry(pos, &cfg->vif_list, list) in brcmf_vif_add_validate()
526 params.iftype_num[pos->wdev.iftype]++; in brcmf_vif_add_validate()
529 return cfg80211_check_combinations(cfg->wiphy, &params); in brcmf_vif_add_validate()
535 key_le->index = cpu_to_le32(key->index); in convert_key_from_CPU()
536 key_le->len = cpu_to_le32(key->len); in convert_key_from_CPU()
537 key_le->algo = cpu_to_le32(key->algo); in convert_key_from_CPU()
538 key_le->flags = cpu_to_le32(key->flags); in convert_key_from_CPU()
539 key_le->rxiv.hi = cpu_to_le32(key->rxiv.hi); in convert_key_from_CPU()
540 key_le->rxiv.lo = cpu_to_le16(key->rxiv.lo); in convert_key_from_CPU()
541 key_le->iv_initialized = cpu_to_le32(key->iv_initialized); in convert_key_from_CPU()
542 memcpy(key_le->data, key->data, sizeof(key->data)); in convert_key_from_CPU()
543 memcpy(key_le->ea, key->ea, sizeof(key->ea)); in convert_key_from_CPU()
549 struct brcmf_pub *drvr = ifp->drvr; in send_key_to_dongle()
572 ifp = vif->ifp; in brcmf_cfg80211_update_proto_addr_mode()
574 if ((wdev->iftype == NL80211_IFTYPE_ADHOC) || in brcmf_cfg80211_update_proto_addr_mode()
575 (wdev->iftype == NL80211_IFTYPE_AP) || in brcmf_cfg80211_update_proto_addr_mode()
576 (wdev->iftype == NL80211_IFTYPE_P2P_GO)) in brcmf_cfg80211_update_proto_addr_mode()
577 brcmf_proto_configure_addr_mode(ifp->drvr, ifp->ifidx, in brcmf_cfg80211_update_proto_addr_mode()
580 brcmf_proto_configure_addr_mode(ifp->drvr, ifp->ifidx, in brcmf_cfg80211_update_proto_addr_mode()
592 if (!drvr->iflist[bsscfgidx]) in brcmf_get_first_free_bsscfgidx()
596 return -ENOMEM; in brcmf_get_first_free_bsscfgidx()
601 u8 mac_idx = ifp->drvr->sta_mac_idx; in brcmf_set_vif_sta_macaddr()
604 memcpy(mac_addr, ifp->mac_addr, ETH_ALEN); in brcmf_set_vif_sta_macaddr()
609 ifp->drvr->sta_mac_idx = mac_idx; in brcmf_set_vif_sta_macaddr()
669 return -EOPNOTSUPP; in brcmf_cfg80211_request_sta_if()
693 err = -EOPNOTSUPP; in brcmf_cfg80211_request_sta_if()
700 return -EIO; in brcmf_cfg80211_request_sta_if()
712 struct brcmf_pub *drvr = ifp->drvr; in brcmf_cfg80211_request_ap_if()
762 return -EOPNOTSUPP; in brcmf_cfg80211_request_ap_if()
783 err = -EOPNOTSUPP; in brcmf_cfg80211_request_ap_if()
791 bsscfgidx = brcmf_get_first_free_bsscfgidx(ifp->drvr); in brcmf_cfg80211_request_ap_if()
810 * brcmf_apsta_add_vif() - create a new AP or STA virtual interface
824 struct brcmf_pub *drvr = cfg->pub; in brcmf_apsta_add_vif()
829 return ERR_PTR(-EINVAL); in brcmf_apsta_add_vif()
832 return ERR_PTR(-EBUSY); in brcmf_apsta_add_vif()
843 err = brcmf_cfg80211_request_sta_if(ifp, params->macaddr); in brcmf_apsta_add_vif()
857 err = -EIO; in brcmf_apsta_add_vif()
862 ifp = vif->ifp; in brcmf_apsta_add_vif()
865 err = -ENOENT; in brcmf_apsta_add_vif()
869 strscpy(ifp->ndev->name, name, sizeof(ifp->ndev->name)); in brcmf_apsta_add_vif()
873 free_netdev(ifp->ndev); in brcmf_apsta_add_vif()
877 return &ifp->vif->wdev; in brcmf_apsta_add_vif()
888 iftype = vif->wdev.iftype; in brcmf_is_apmode()
894 return vif->wdev.iftype == NL80211_IFTYPE_ADHOC; in brcmf_is_ibssmode()
898 * brcmf_mon_add_vif() - create monitor mode virtual interface
912 if (cfg->pub->mon_if) { in brcmf_mon_add_vif()
913 err = -EEXIST; in brcmf_mon_add_vif()
925 err = -ENOMEM; in brcmf_mon_add_vif()
928 ndev->type = ARPHRD_IEEE80211_RADIOTAP; in brcmf_mon_add_vif()
929 ndev->ieee80211_ptr = &vif->wdev; in brcmf_mon_add_vif()
930 ndev->needs_free_netdev = true; in brcmf_mon_add_vif()
931 ndev->priv_destructor = brcmf_cfg80211_free_netdev; in brcmf_mon_add_vif()
932 SET_NETDEV_DEV(ndev, wiphy_dev(cfg->wiphy)); in brcmf_mon_add_vif()
935 ifp->vif = vif; in brcmf_mon_add_vif()
936 ifp->ndev = ndev; in brcmf_mon_add_vif()
937 ifp->drvr = cfg->pub; in brcmf_mon_add_vif()
939 vif->ifp = ifp; in brcmf_mon_add_vif()
940 vif->wdev.netdev = ndev; in brcmf_mon_add_vif()
944 brcmf_err("Failed to attach %s device\n", ndev->name); in brcmf_mon_add_vif()
949 cfg->pub->mon_if = ifp; in brcmf_mon_add_vif()
951 return &vif->wdev; in brcmf_mon_add_vif()
962 struct net_device *ndev = wdev->netdev; in brcmf_mon_del_vif()
964 ndev->netdev_ops->ndo_stop(ndev); in brcmf_mon_del_vif()
968 cfg->pub->mon_if = NULL; in brcmf_mon_del_vif()
980 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_add_iface()
995 return ERR_PTR(-EOPNOTSUPP); in brcmf_cfg80211_add_iface()
1009 return ERR_PTR(-EINVAL); in brcmf_cfg80211_add_iface()
1029 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_mpc()
1032 if (check_vif_up(ifp->vif)) { in brcmf_set_mpc()
1049 memcpy(&params_le->ssid_le, &params_v2_le->ssid_le, in brcmf_scan_params_v2_to_v1()
1050 sizeof(params_le->ssid_le)); in brcmf_scan_params_v2_to_v1()
1051 memcpy(&params_le->bssid, &params_v2_le->bssid, in brcmf_scan_params_v2_to_v1()
1052 sizeof(params_le->bssid)); in brcmf_scan_params_v2_to_v1()
1054 params_le->bss_type = params_v2_le->bss_type; in brcmf_scan_params_v2_to_v1()
1055 params_le->scan_type = le32_to_cpu(params_v2_le->scan_type); in brcmf_scan_params_v2_to_v1()
1056 params_le->nprobes = params_v2_le->nprobes; in brcmf_scan_params_v2_to_v1()
1057 params_le->active_time = params_v2_le->active_time; in brcmf_scan_params_v2_to_v1()
1058 params_le->passive_time = params_v2_le->passive_time; in brcmf_scan_params_v2_to_v1()
1059 params_le->home_time = params_v2_le->home_time; in brcmf_scan_params_v2_to_v1()
1060 params_le->channel_num = params_v2_le->channel_num; in brcmf_scan_params_v2_to_v1()
1062 ch = le32_to_cpu(params_v2_le->channel_num); in brcmf_scan_params_v2_to_v1()
1072 memcpy(&params_le->channel_list[0], in brcmf_scan_params_v2_to_v1()
1073 &params_v2_le->channel_list[0], params_size); in brcmf_scan_params_v2_to_v1()
1089 eth_broadcast_addr(params_le->bssid); in brcmf_escan_prep()
1093 params_le->version = cpu_to_le16(BRCMF_SCAN_PARAMS_VERSION_V2); in brcmf_escan_prep()
1094 params_le->bss_type = DOT11_BSSTYPE_ANY; in brcmf_escan_prep()
1095 params_le->scan_type = cpu_to_le32(BRCMF_SCANTYPE_ACTIVE); in brcmf_escan_prep()
1096 params_le->channel_num = 0; in brcmf_escan_prep()
1097 params_le->nprobes = cpu_to_le32(-1); in brcmf_escan_prep()
1098 params_le->active_time = cpu_to_le32(-1); in brcmf_escan_prep()
1099 params_le->passive_time = cpu_to_le32(-1); in brcmf_escan_prep()
1100 params_le->home_time = cpu_to_le32(-1); in brcmf_escan_prep()
1101 memset(&params_le->ssid_le, 0, sizeof(params_le->ssid_le)); in brcmf_escan_prep()
1106 params_le->channel_num = cpu_to_le32(1); in brcmf_escan_prep()
1107 params_le->channel_list[0] = cpu_to_le16(-1); in brcmf_escan_prep()
1108 params_le->length = cpu_to_le16(length); in brcmf_escan_prep()
1112 n_ssids = request->n_ssids; in brcmf_escan_prep()
1113 n_channels = request->n_channels; in brcmf_escan_prep()
1121 chanspec = channel_to_chanspec(&cfg->d11inf, in brcmf_escan_prep()
1122 request->channels[i]); in brcmf_escan_prep()
1124 request->channels[i]->hw_value, chanspec); in brcmf_escan_prep()
1125 params_le->channel_list[i] = cpu_to_le16(chanspec); in brcmf_escan_prep()
1142 cpu_to_le32(request->ssids[i].ssid_len); in brcmf_escan_prep()
1143 memcpy(ssid_le.SSID, request->ssids[i].ssid, in brcmf_escan_prep()
1144 request->ssids[i].ssid_len); in brcmf_escan_prep()
1155 params_le->scan_type = cpu_to_le32(BRCMF_SCANTYPE_PASSIVE); in brcmf_escan_prep()
1157 params_le->length = cpu_to_le16(length); in brcmf_escan_prep()
1159 params_le->channel_num = in brcmf_escan_prep()
1168 struct brcmf_pub *drvr = cfg->pub; in brcmf_notify_escan_complete()
1179 scan_request = cfg->scan_request; in brcmf_notify_escan_complete()
1180 cfg->scan_request = NULL; in brcmf_notify_escan_complete()
1182 if (timer_pending(&cfg->escan_timeout)) in brcmf_notify_escan_complete()
1183 del_timer_sync(&cfg->escan_timeout); in brcmf_notify_escan_complete()
1191 /* E-Scan (or anyother type) can be aborted by SCAN */ in brcmf_notify_escan_complete()
1212 * e-scan can be initiated internally in brcmf_notify_escan_complete()
1215 if (cfg->int_escan_map) { in brcmf_notify_escan_complete()
1217 cfg->int_escan_map); in brcmf_notify_escan_complete()
1218 while (cfg->int_escan_map) { in brcmf_notify_escan_complete()
1219 bucket = __ffs(cfg->int_escan_map); in brcmf_notify_escan_complete()
1220 cfg->int_escan_map &= ~BIT(bucket); in brcmf_notify_escan_complete()
1221 reqid = brcmf_pno_find_reqid_by_bucket(cfg->pno, in brcmf_notify_escan_complete()
1239 if (!test_and_clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) in brcmf_notify_escan_complete()
1249 struct net_device *ndev = wdev->netdev; in brcmf_cfg80211_del_apsta_iface()
1251 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_del_apsta_iface()
1255 brcmf_cfg80211_arm_vif_event(cfg, ifp->vif); in brcmf_cfg80211_del_apsta_iface()
1268 err = -EIO; in brcmf_cfg80211_del_apsta_iface()
1283 struct net_device *ndev = wdev->netdev; in brcmf_cfg80211_del_iface()
1286 return -ENOTSUPP; in brcmf_cfg80211_del_iface()
1290 return -EBUSY; in brcmf_cfg80211_del_iface()
1293 if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status) && in brcmf_cfg80211_del_iface()
1294 cfg->escan_info.ifp == netdev_priv(ndev)) in brcmf_cfg80211_del_iface()
1301 switch (wdev->iftype) { in brcmf_cfg80211_del_iface()
1306 return -EOPNOTSUPP; in brcmf_cfg80211_del_iface()
1318 return -EINVAL; in brcmf_cfg80211_del_iface()
1320 return -EOPNOTSUPP; in brcmf_cfg80211_del_iface()
1330 struct brcmf_cfg80211_vif *vif = ifp->vif; in brcmf_cfg80211_change_iface()
1331 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_change_iface()
1336 brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, type=%d\n", ifp->bsscfgidx, in brcmf_cfg80211_change_iface()
1348 ((vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) || in brcmf_cfg80211_change_iface()
1349 (vif->wdev.iftype == NL80211_IFTYPE_P2P_GO) || in brcmf_cfg80211_change_iface()
1350 (vif->wdev.iftype == NL80211_IFTYPE_P2P_DEVICE))) { in brcmf_cfg80211_change_iface()
1364 if (cfg->p2p.p2pdev_dynamically) in brcmf_cfg80211_change_iface()
1365 return -EOPNOTSUPP; in brcmf_cfg80211_change_iface()
1379 return -EOPNOTSUPP; in brcmf_cfg80211_change_iface()
1391 err = -EINVAL; in brcmf_cfg80211_change_iface()
1407 err = -EAGAIN; in brcmf_cfg80211_change_iface()
1413 ndev->ieee80211_ptr->iftype = type; in brcmf_cfg80211_change_iface()
1415 brcmf_cfg80211_update_proto_addr_mode(&vif->wdev); in brcmf_cfg80211_change_iface()
1427 struct brcmf_pub *drvr = cfg->pub; in brcmf_run_escan()
1433 brcmf_dbg(SCAN, "E-SCAN START\n"); in brcmf_run_escan()
1437 params_size += sizeof(u32) * ((request->n_channels + 1) / 2); in brcmf_run_escan()
1440 params_size += sizeof(struct brcmf_ssid_le) * request->n_ssids; in brcmf_run_escan()
1445 err = -ENOMEM; in brcmf_run_escan()
1449 brcmf_escan_prep(cfg, &params->params_v2_le, request); in brcmf_run_escan()
1451 params->version = cpu_to_le32(BRCMF_ESCAN_REQ_VERSION_V2); in brcmf_run_escan()
1456 params_size -= BRCMF_SCAN_PARAMS_V2_FIXED_SIZE; in brcmf_run_escan()
1460 err = -ENOMEM; in brcmf_run_escan()
1463 params_v1->version = cpu_to_le32(BRCMF_ESCAN_REQ_VERSION); in brcmf_run_escan()
1464 brcmf_scan_params_v2_to_v1(&params->params_v2_le, &params_v1->params_le); in brcmf_run_escan()
1469 params->action = cpu_to_le16(WL_ESCAN_ACTION_START); in brcmf_run_escan()
1470 params->sync_id = cpu_to_le16(0x1234); in brcmf_run_escan()
1474 if (err == -EBUSY) in brcmf_run_escan()
1489 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_do_escan()
1492 struct escan_info *escan = &cfg->escan_info; in brcmf_do_escan()
1495 escan->ifp = ifp; in brcmf_do_escan()
1496 escan->wiphy = cfg->wiphy; in brcmf_do_escan()
1497 escan->escan_state = WL_ESCAN_STATE_SCANNING; in brcmf_do_escan()
1500 results = (struct brcmf_scan_results *)cfg->escan_info.escan_buf; in brcmf_do_escan()
1501 results->version = 0; in brcmf_do_escan()
1502 results->count = 0; in brcmf_do_escan()
1503 results->buflen = WL_ESCAN_RESULTS_FIXED_SIZE; in brcmf_do_escan()
1505 err = escan->run(cfg, ifp, request); in brcmf_do_escan()
1515 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_scan()
1520 vif = container_of(request->wdev, struct brcmf_cfg80211_vif, wdev); in brcmf_cfg80211_scan()
1522 return -EIO; in brcmf_cfg80211_scan()
1524 if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) { in brcmf_cfg80211_scan()
1526 cfg->scan_status); in brcmf_cfg80211_scan()
1527 return -EAGAIN; in brcmf_cfg80211_scan()
1529 if (test_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status)) { in brcmf_cfg80211_scan()
1531 cfg->scan_status); in brcmf_cfg80211_scan()
1532 return -EAGAIN; in brcmf_cfg80211_scan()
1534 if (test_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status)) { in brcmf_cfg80211_scan()
1536 cfg->scan_status); in brcmf_cfg80211_scan()
1537 return -EAGAIN; in brcmf_cfg80211_scan()
1539 if (test_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state)) { in brcmf_cfg80211_scan()
1540 bphy_err(drvr, "Connecting: status (%lu)\n", vif->sme_state); in brcmf_cfg80211_scan()
1541 return -EAGAIN; in brcmf_cfg80211_scan()
1545 if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif) in brcmf_cfg80211_scan()
1546 vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif; in brcmf_cfg80211_scan()
1550 cfg->scan_request = request; in brcmf_cfg80211_scan()
1551 set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); in brcmf_cfg80211_scan()
1553 cfg->escan_info.run = brcmf_run_escan; in brcmf_cfg80211_scan()
1559 request->ie, request->ie_len); in brcmf_cfg80211_scan()
1563 err = brcmf_do_escan(vif->ifp, request); in brcmf_cfg80211_scan()
1568 mod_timer(&cfg->escan_timeout, in brcmf_cfg80211_scan()
1575 clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); in brcmf_cfg80211_scan()
1576 cfg->scan_request = NULL; in brcmf_cfg80211_scan()
1583 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_rts()
1596 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_frag()
1610 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_retry()
1630 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_set_wiphy_params()
1631 return -EIO; in brcmf_cfg80211_set_wiphy_params()
1634 (cfg->conf->rts_threshold != wiphy->rts_threshold)) { in brcmf_cfg80211_set_wiphy_params()
1635 cfg->conf->rts_threshold = wiphy->rts_threshold; in brcmf_cfg80211_set_wiphy_params()
1636 err = brcmf_set_rts(ndev, cfg->conf->rts_threshold); in brcmf_cfg80211_set_wiphy_params()
1641 (cfg->conf->frag_threshold != wiphy->frag_threshold)) { in brcmf_cfg80211_set_wiphy_params()
1642 cfg->conf->frag_threshold = wiphy->frag_threshold; in brcmf_cfg80211_set_wiphy_params()
1643 err = brcmf_set_frag(ndev, cfg->conf->frag_threshold); in brcmf_cfg80211_set_wiphy_params()
1648 && (cfg->conf->retry_long != wiphy->retry_long)) { in brcmf_cfg80211_set_wiphy_params()
1649 cfg->conf->retry_long = wiphy->retry_long; in brcmf_cfg80211_set_wiphy_params()
1650 err = brcmf_set_retry(ndev, cfg->conf->retry_long, true); in brcmf_cfg80211_set_wiphy_params()
1655 && (cfg->conf->retry_short != wiphy->retry_short)) { in brcmf_cfg80211_set_wiphy_params()
1656 cfg->conf->retry_short = wiphy->retry_short; in brcmf_cfg80211_set_wiphy_params()
1657 err = brcmf_set_retry(ndev, cfg->conf->retry_short, false); in brcmf_cfg80211_set_wiphy_params()
1676 switch (e->event_code) { in brcmf_map_fw_linkdown_reason()
1680 reason = e->reason; in brcmf_map_fw_linkdown_reason()
1692 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_pmk()
1716 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_sae_password()
1723 return -EINVAL; in brcmf_set_sae_password()
1741 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy); in brcmf_link_down()
1742 struct brcmf_pub *drvr = cfg->pub; in brcmf_link_down()
1743 bool bus_up = drvr->bus_if->state == BRCMF_BUS_UP; in brcmf_link_down()
1748 if (test_and_clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state)) { in brcmf_link_down()
1751 err = brcmf_fil_cmd_data_set(vif->ifp, in brcmf_link_down()
1758 if ((vif->wdev.iftype == NL80211_IFTYPE_STATION) || in brcmf_link_down()
1759 (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT)) in brcmf_link_down()
1760 cfg80211_disconnected(vif->wdev.netdev, reason, NULL, 0, in brcmf_link_down()
1763 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state); in brcmf_link_down()
1764 clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state); in brcmf_link_down()
1765 clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state); in brcmf_link_down()
1766 clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status); in brcmf_link_down()
1768 if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_NONE) { in brcmf_link_down()
1770 brcmf_set_pmk(vif->ifp, NULL, 0); in brcmf_link_down()
1771 vif->profile.use_fwsup = BRCMF_PROFILE_FWSUP_NONE; in brcmf_link_down()
1782 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_cfg80211_join_ibss()
1783 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_join_ibss()
1793 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_join_ibss()
1794 return -EIO; in brcmf_cfg80211_join_ibss()
1796 if (params->ssid) in brcmf_cfg80211_join_ibss()
1797 brcmf_dbg(CONN, "SSID: %s\n", params->ssid); in brcmf_cfg80211_join_ibss()
1800 return -EOPNOTSUPP; in brcmf_cfg80211_join_ibss()
1803 set_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state); in brcmf_cfg80211_join_ibss()
1805 if (params->bssid) in brcmf_cfg80211_join_ibss()
1806 brcmf_dbg(CONN, "BSSID: %pM\n", params->bssid); in brcmf_cfg80211_join_ibss()
1810 if (params->chandef.chan) in brcmf_cfg80211_join_ibss()
1812 params->chandef.chan->center_freq); in brcmf_cfg80211_join_ibss()
1816 if (params->channel_fixed) in brcmf_cfg80211_join_ibss()
1821 if (params->ie && params->ie_len) in brcmf_cfg80211_join_ibss()
1822 brcmf_dbg(CONN, "ie len: %d\n", params->ie_len); in brcmf_cfg80211_join_ibss()
1826 if (params->beacon_interval) in brcmf_cfg80211_join_ibss()
1828 params->beacon_interval); in brcmf_cfg80211_join_ibss()
1832 if (params->basic_rates) in brcmf_cfg80211_join_ibss()
1833 brcmf_dbg(CONN, "basic rates: %08X\n", params->basic_rates); in brcmf_cfg80211_join_ibss()
1837 if (params->privacy) in brcmf_cfg80211_join_ibss()
1843 if (params->privacy) in brcmf_cfg80211_join_ibss()
1853 if (params->beacon_interval) in brcmf_cfg80211_join_ibss()
1854 bcnprd = params->beacon_interval; in brcmf_cfg80211_join_ibss()
1868 ssid_len = min_t(u32, params->ssid_len, IEEE80211_MAX_SSID_LEN); in brcmf_cfg80211_join_ibss()
1869 memcpy(join_params.ssid_le.SSID, params->ssid, ssid_len); in brcmf_cfg80211_join_ibss()
1874 if (params->bssid) { in brcmf_cfg80211_join_ibss()
1875 memcpy(join_params.params_le.bssid, params->bssid, ETH_ALEN); in brcmf_cfg80211_join_ibss()
1877 memcpy(profile->bssid, params->bssid, ETH_ALEN); in brcmf_cfg80211_join_ibss()
1880 eth_zero_addr(profile->bssid); in brcmf_cfg80211_join_ibss()
1884 if (params->chandef.chan) { in brcmf_cfg80211_join_ibss()
1887 cfg->channel = in brcmf_cfg80211_join_ibss()
1889 params->chandef.chan->center_freq); in brcmf_cfg80211_join_ibss()
1890 if (params->channel_fixed) { in brcmf_cfg80211_join_ibss()
1892 chanspec = chandef_to_chanspec(&cfg->d11inf, in brcmf_cfg80211_join_ibss()
1893 &params->chandef); in brcmf_cfg80211_join_ibss()
1901 target_channel = cfg->channel; in brcmf_cfg80211_join_ibss()
1909 cfg->channel = 0; in brcmf_cfg80211_join_ibss()
1911 cfg->ibss_starter = false; in brcmf_cfg80211_join_ibss()
1923 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state); in brcmf_cfg80211_join_ibss()
1934 if (!check_vif_up(ifp->vif)) { in brcmf_cfg80211_leave_ibss()
1942 brcmf_link_down(ifp->vif, WLAN_REASON_DEAUTH_LEAVING, true); in brcmf_cfg80211_leave_ibss()
1955 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_wpa_version()
1960 if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_1) in brcmf_set_wpa_version()
1962 else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2) in brcmf_set_wpa_version()
1964 else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_3) in brcmf_set_wpa_version()
1974 sec = &profile->sec; in brcmf_set_wpa_version()
1975 sec->wpa_versions = sme->crypto.wpa_versions; in brcmf_set_wpa_version()
1984 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_auth_type()
1989 switch (sme->auth_type) { in brcmf_set_auth_type()
2004 brcmf_dbg(CONN, "automatic, auth type (%d)\n", sme->auth_type); in brcmf_set_auth_type()
2013 sec = &profile->sec; in brcmf_set_auth_type()
2014 sec->auth_type = sme->auth_type; in brcmf_set_auth_type()
2024 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_wsec_mode()
2031 if (sme->crypto.n_ciphers_pairwise) { in brcmf_set_wsec_mode()
2032 switch (sme->crypto.ciphers_pairwise[0]) { in brcmf_set_wsec_mode()
2048 sme->crypto.ciphers_pairwise[0]); in brcmf_set_wsec_mode()
2049 return -EINVAL; in brcmf_set_wsec_mode()
2052 if (sme->crypto.cipher_group) { in brcmf_set_wsec_mode()
2053 switch (sme->crypto.cipher_group) { in brcmf_set_wsec_mode()
2069 sme->crypto.cipher_group); in brcmf_set_wsec_mode()
2070 return -EINVAL; in brcmf_set_wsec_mode()
2076 /* setting AES. WPS-2.0 allows no security */ in brcmf_set_wsec_mode()
2077 if (brcmf_find_wpsie(sme->ie, sme->ie_len) && !pval && !gval && in brcmf_set_wsec_mode()
2078 sme->privacy) in brcmf_set_wsec_mode()
2088 sec = &profile->sec; in brcmf_set_wsec_mode()
2089 sec->cipher_pairwise = sme->crypto.ciphers_pairwise[0]; in brcmf_set_wsec_mode()
2090 sec->cipher_group = sme->crypto.cipher_group; in brcmf_set_wsec_mode()
2099 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_set_key_mgmt()
2100 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_key_mgmt()
2111 profile->use_fwsup = BRCMF_PROFILE_FWSUP_NONE; in brcmf_set_key_mgmt()
2112 profile->is_ft = false; in brcmf_set_key_mgmt()
2114 if (!sme->crypto.n_akm_suites) in brcmf_set_key_mgmt()
2123 switch (sme->crypto.akm_suites[0]) { in brcmf_set_key_mgmt()
2126 if (sme->want_1x) in brcmf_set_key_mgmt()
2127 profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X; in brcmf_set_key_mgmt()
2134 sme->crypto.akm_suites[0]); in brcmf_set_key_mgmt()
2135 return -EINVAL; in brcmf_set_key_mgmt()
2138 switch (sme->crypto.akm_suites[0]) { in brcmf_set_key_mgmt()
2141 if (sme->want_1x) in brcmf_set_key_mgmt()
2142 profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X; in brcmf_set_key_mgmt()
2146 if (sme->want_1x) in brcmf_set_key_mgmt()
2147 profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X; in brcmf_set_key_mgmt()
2157 profile->is_ft = true; in brcmf_set_key_mgmt()
2158 if (sme->want_1x) in brcmf_set_key_mgmt()
2159 profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X; in brcmf_set_key_mgmt()
2163 profile->is_ft = true; in brcmf_set_key_mgmt()
2167 sme->crypto.akm_suites[0]); in brcmf_set_key_mgmt()
2168 return -EINVAL; in brcmf_set_key_mgmt()
2171 switch (sme->crypto.akm_suites[0]) { 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 profile->is_ft = true; in brcmf_set_key_mgmt()
2182 if (sme->crypto.sae_pwd) { in brcmf_set_key_mgmt()
2184 profile->use_fwsup = BRCMF_PROFILE_FWSUP_SAE; in brcmf_set_key_mgmt()
2189 sme->crypto.akm_suites[0]); in brcmf_set_key_mgmt()
2190 return -EINVAL; in brcmf_set_key_mgmt()
2194 if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X) in brcmf_set_key_mgmt()
2202 rsn_ie = brcmf_parse_tlvs((const u8 *)sme->ie, sme->ie_len, in brcmf_set_key_mgmt()
2207 ie_len = rsn_ie->len + TLV_HDR_LEN; in brcmf_set_key_mgmt()
2247 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_sharedkey()
2254 brcmf_dbg(CONN, "key len (%d)\n", sme->key_len); in brcmf_set_sharedkey()
2256 if (sme->key_len == 0) in brcmf_set_sharedkey()
2259 sec = &profile->sec; in brcmf_set_sharedkey()
2261 sec->wpa_versions, sec->cipher_pairwise); in brcmf_set_sharedkey()
2263 if (sec->wpa_versions & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2 | in brcmf_set_sharedkey()
2267 if (!(sec->cipher_pairwise & in brcmf_set_sharedkey()
2272 key.len = (u32) sme->key_len; in brcmf_set_sharedkey()
2273 key.index = (u32) sme->key_idx; in brcmf_set_sharedkey()
2276 return -EINVAL; in brcmf_set_sharedkey()
2278 memcpy(key.data, sme->key, key.len); in brcmf_set_sharedkey()
2280 switch (sec->cipher_pairwise) { in brcmf_set_sharedkey()
2289 sme->crypto.ciphers_pairwise[0]); in brcmf_set_sharedkey()
2290 return -EINVAL; in brcmf_set_sharedkey()
2300 if (sec->auth_type == NL80211_AUTHTYPE_SHARED_KEY) { in brcmf_set_sharedkey()
2325 struct brcmf_pub *drvr = ifp->drvr; in brcmf_set_join_pref()
2333 if (bss_select->behaviour != NL80211_BSS_SELECT_ATTR_BAND_PREF) in brcmf_set_join_pref()
2336 switch (bss_select->behaviour) { in brcmf_set_join_pref()
2342 band = bss_select->param.band_pref; in brcmf_set_join_pref()
2348 band = bss_select->param.adjust.band; in brcmf_set_join_pref()
2350 join_pref_params[i].rssi_gain = bss_select->param.adjust.delta; in brcmf_set_join_pref()
2373 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_cfg80211_connect()
2374 struct ieee80211_channel *chan = sme->channel; in brcmf_cfg80211_connect()
2375 struct brcmf_pub *drvr = ifp->drvr; in brcmf_cfg80211_connect()
2388 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_connect()
2389 return -EIO; in brcmf_cfg80211_connect()
2391 if (!sme->ssid) { in brcmf_cfg80211_connect()
2393 return -EOPNOTSUPP; in brcmf_cfg80211_connect()
2396 if (sme->channel_hint) in brcmf_cfg80211_connect()
2397 chan = sme->channel_hint; in brcmf_cfg80211_connect()
2399 if (sme->bssid_hint) in brcmf_cfg80211_connect()
2400 sme->bssid = sme->bssid_hint; in brcmf_cfg80211_connect()
2402 if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif) { in brcmf_cfg80211_connect()
2407 wpa_ie = brcmf_find_wpaie((u8 *)sme->ie, sme->ie_len); in brcmf_cfg80211_connect()
2410 ie_len = wpa_ie->len + TLV_HDR_LEN; in brcmf_cfg80211_connect()
2413 rsn_ie = brcmf_parse_tlvs((const u8 *)sme->ie, in brcmf_cfg80211_connect()
2414 sme->ie_len, in brcmf_cfg80211_connect()
2418 ie_len = rsn_ie->len + TLV_HDR_LEN; in brcmf_cfg80211_connect()
2424 err = brcmf_vif_set_mgmt_ie(ifp->vif, BRCMF_VNDR_IE_ASSOCREQ_FLAG, in brcmf_cfg80211_connect()
2425 sme->ie, sme->ie_len); in brcmf_cfg80211_connect()
2431 set_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state); in brcmf_cfg80211_connect()
2434 cfg->channel = in brcmf_cfg80211_connect()
2435 ieee80211_frequency_to_channel(chan->center_freq); in brcmf_cfg80211_connect()
2436 chanspec = channel_to_chanspec(&cfg->d11inf, chan); in brcmf_cfg80211_connect()
2438 cfg->channel, chan->center_freq, chanspec); in brcmf_cfg80211_connect()
2440 cfg->channel = 0; in brcmf_cfg80211_connect()
2444 brcmf_dbg(INFO, "ie (%p), ie_len (%zd)\n", sme->ie, sme->ie_len); in brcmf_cfg80211_connect()
2452 sme->auth_type = brcmf_war_auth_type(ifp, sme->auth_type); in brcmf_cfg80211_connect()
2477 if (sme->crypto.psk && in brcmf_cfg80211_connect()
2478 profile->use_fwsup != BRCMF_PROFILE_FWSUP_SAE) { in brcmf_cfg80211_connect()
2479 if (WARN_ON(profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE)) { in brcmf_cfg80211_connect()
2480 err = -EINVAL; in brcmf_cfg80211_connect()
2484 profile->use_fwsup = BRCMF_PROFILE_FWSUP_PSK; in brcmf_cfg80211_connect()
2487 if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE) { in brcmf_cfg80211_connect()
2496 if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK) in brcmf_cfg80211_connect()
2497 err = brcmf_set_pmk(ifp, sme->crypto.psk, in brcmf_cfg80211_connect()
2499 else if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_SAE) { in brcmf_cfg80211_connect()
2500 /* clean up user-space RSNE */ in brcmf_cfg80211_connect()
2503 bphy_err(drvr, "failed to clean up user-space RSNE\n"); in brcmf_cfg80211_connect()
2506 err = brcmf_set_sae_password(ifp, sme->crypto.sae_pwd, in brcmf_cfg80211_connect()
2507 sme->crypto.sae_pwd_len); in brcmf_cfg80211_connect()
2508 if (!err && sme->crypto.psk) in brcmf_cfg80211_connect()
2509 err = brcmf_set_pmk(ifp, sme->crypto.psk, in brcmf_cfg80211_connect()
2520 if (cfg->channel) in brcmf_cfg80211_connect()
2524 err = -ENOMEM; in brcmf_cfg80211_connect()
2527 ssid_len = min_t(u32, sme->ssid_len, IEEE80211_MAX_SSID_LEN); in brcmf_cfg80211_connect()
2528 ext_join_params->ssid_le.SSID_len = cpu_to_le32(ssid_len); in brcmf_cfg80211_connect()
2529 memcpy(&ext_join_params->ssid_le.SSID, sme->ssid, ssid_len); in brcmf_cfg80211_connect()
2532 ext_join_params->ssid_le.SSID, ssid_len); in brcmf_cfg80211_connect()
2535 ext_join_params->scan_le.scan_type = -1; in brcmf_cfg80211_connect()
2536 ext_join_params->scan_le.home_time = cpu_to_le32(-1); in brcmf_cfg80211_connect()
2538 if (sme->bssid) in brcmf_cfg80211_connect()
2539 memcpy(&ext_join_params->assoc_le.bssid, sme->bssid, ETH_ALEN); in brcmf_cfg80211_connect()
2541 eth_broadcast_addr(ext_join_params->assoc_le.bssid); in brcmf_cfg80211_connect()
2543 if (cfg->channel) { in brcmf_cfg80211_connect()
2544 ext_join_params->assoc_le.chanspec_num = cpu_to_le32(1); in brcmf_cfg80211_connect()
2546 ext_join_params->assoc_le.chanspec_list[0] = in brcmf_cfg80211_connect()
2552 ext_join_params->scan_le.active_time = in brcmf_cfg80211_connect()
2554 ext_join_params->scan_le.passive_time = in brcmf_cfg80211_connect()
2560 ext_join_params->scan_le.nprobes = in brcmf_cfg80211_connect()
2564 ext_join_params->scan_le.active_time = cpu_to_le32(-1); in brcmf_cfg80211_connect()
2565 ext_join_params->scan_le.passive_time = cpu_to_le32(-1); in brcmf_cfg80211_connect()
2566 ext_join_params->scan_le.nprobes = cpu_to_le32(-1); in brcmf_cfg80211_connect()
2569 brcmf_set_join_pref(ifp, &sme->bss_select); in brcmf_cfg80211_connect()
2582 memcpy(&join_params.ssid_le.SSID, sme->ssid, ssid_len); in brcmf_cfg80211_connect()
2585 if (sme->bssid) in brcmf_cfg80211_connect()
2586 memcpy(join_params.params_le.bssid, sme->bssid, ETH_ALEN); in brcmf_cfg80211_connect()
2590 if (cfg->channel) { in brcmf_cfg80211_connect()
2602 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state); in brcmf_cfg80211_connect()
2613 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_cfg80211_disconnect()
2614 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_disconnect()
2619 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_disconnect()
2620 return -EIO; in brcmf_cfg80211_disconnect()
2622 clear_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state); in brcmf_cfg80211_disconnect()
2623 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state); in brcmf_cfg80211_disconnect()
2624 clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &ifp->vif->sme_state); in brcmf_cfg80211_disconnect()
2625 clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &ifp->vif->sme_state); in brcmf_cfg80211_disconnect()
2628 memcpy(&scbval.ea, &profile->bssid, ETH_ALEN); in brcmf_cfg80211_disconnect()
2646 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_set_tx_power()
2652 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_set_tx_power()
2653 return -EIO; in brcmf_cfg80211_set_tx_power()
2661 bphy_err(drvr, "TX_POWER_FIXED - dbm is negative\n"); in brcmf_cfg80211_set_tx_power()
2662 err = -EINVAL; in brcmf_cfg80211_set_tx_power()
2672 err = -EINVAL; in brcmf_cfg80211_set_tx_power()
2696 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_get_tx_power()
2702 return -EIO; in brcmf_cfg80211_get_tx_power()
2704 err = brcmf_fil_iovar_int_get(vif->ifp, "qtxpower", &qdbm); in brcmf_cfg80211_get_tx_power()
2722 struct brcmf_pub *drvr = ifp->drvr; in brcmf_cfg80211_config_default_key()
2729 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_config_default_key()
2730 return -EIO; in brcmf_cfg80211_config_default_key()
2763 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_del_key()
2764 return -EIO; in brcmf_cfg80211_del_key()
2768 return -EINVAL; in brcmf_cfg80211_del_key()
2771 key = &ifp->vif->profile.key[key_idx]; in brcmf_cfg80211_del_key()
2773 if (key->algo == CRYPTO_ALGO_OFF) { in brcmf_cfg80211_del_key()
2775 return -EINVAL; in brcmf_cfg80211_del_key()
2779 key->index = (u32)key_idx; in brcmf_cfg80211_del_key()
2780 key->flags = BRCMF_PRIMARY_KEY; in brcmf_cfg80211_del_key()
2796 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_add_key()
2806 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_add_key()
2807 return -EIO; in brcmf_cfg80211_add_key()
2812 return -EINVAL; in brcmf_cfg80211_add_key()
2815 if (params->key_len == 0) in brcmf_cfg80211_add_key()
2816 return brcmf_cfg80211_del_key(wiphy, ndev, -1, key_idx, in brcmf_cfg80211_add_key()
2819 if (params->key_len > sizeof(key->data)) { in brcmf_cfg80211_add_key()
2820 bphy_err(drvr, "Too long key length (%u)\n", params->key_len); in brcmf_cfg80211_add_key()
2821 return -EINVAL; in brcmf_cfg80211_add_key()
2825 if (mac_addr && (params->cipher != WLAN_CIPHER_SUITE_WEP40) && in brcmf_cfg80211_add_key()
2826 (params->cipher != WLAN_CIPHER_SUITE_WEP104)) { in brcmf_cfg80211_add_key()
2831 key = &ifp->vif->profile.key[key_idx]; in brcmf_cfg80211_add_key()
2834 memcpy((char *)&key->ea, (void *)mac_addr, ETH_ALEN); in brcmf_cfg80211_add_key()
2835 key->len = params->key_len; in brcmf_cfg80211_add_key()
2836 key->index = key_idx; in brcmf_cfg80211_add_key()
2837 memcpy(key->data, params->key, key->len); in brcmf_cfg80211_add_key()
2839 key->flags = BRCMF_PRIMARY_KEY; in brcmf_cfg80211_add_key()
2841 if (params->seq && params->seq_len == 6) { in brcmf_cfg80211_add_key()
2845 ivptr = (u8 *)params->seq; in brcmf_cfg80211_add_key()
2846 key->rxiv.hi = (ivptr[5] << 24) | (ivptr[4] << 16) | in brcmf_cfg80211_add_key()
2848 key->rxiv.lo = (ivptr[1] << 8) | ivptr[0]; in brcmf_cfg80211_add_key()
2849 key->iv_initialized = true; in brcmf_cfg80211_add_key()
2852 switch (params->cipher) { in brcmf_cfg80211_add_key()
2854 key->algo = CRYPTO_ALGO_WEP1; in brcmf_cfg80211_add_key()
2859 key->algo = CRYPTO_ALGO_WEP128; in brcmf_cfg80211_add_key()
2864 if (!brcmf_is_apmode(ifp->vif)) { in brcmf_cfg80211_add_key()
2866 memcpy(keybuf, &key->data[24], sizeof(keybuf)); in brcmf_cfg80211_add_key()
2867 memcpy(&key->data[24], &key->data[16], sizeof(keybuf)); in brcmf_cfg80211_add_key()
2868 memcpy(&key->data[16], keybuf, sizeof(keybuf)); in brcmf_cfg80211_add_key()
2870 key->algo = CRYPTO_ALGO_TKIP; in brcmf_cfg80211_add_key()
2875 key->algo = CRYPTO_ALGO_AES_CCM; in brcmf_cfg80211_add_key()
2880 key->algo = CRYPTO_ALGO_AES_CCM; in brcmf_cfg80211_add_key()
2885 bphy_err(drvr, "Invalid cipher (0x%x)\n", params->cipher); in brcmf_cfg80211_add_key()
2886 err = -EINVAL; in brcmf_cfg80211_add_key()
2921 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_cfg80211_get_key()
2922 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_get_key()
2929 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_get_key()
2930 return -EIO; in brcmf_cfg80211_get_key()
2938 err = -EAGAIN; in brcmf_cfg80211_get_key()
2942 sec = &profile->sec; in brcmf_cfg80211_get_key()
2943 if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP40) { in brcmf_cfg80211_get_key()
2946 } else if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP104) { in brcmf_cfg80211_get_key()
2958 err = -EINVAL; in brcmf_cfg80211_get_key()
2982 return -EOPNOTSUPP; in brcmf_cfg80211_config_default_mgmt_key()
2988 struct brcmf_pub *drvr = ifp->drvr; in brcmf_cfg80211_reconfigure_wep()
2995 key = &ifp->vif->profile.key[key_idx]; in brcmf_cfg80211_reconfigure_wep()
2996 if ((key->algo == CRYPTO_ALGO_WEP1) || in brcmf_cfg80211_reconfigure_wep()
2997 (key->algo == CRYPTO_ALGO_WEP128)) in brcmf_cfg80211_reconfigure_wep()
3024 si->filled |= BIT_ULL(NL80211_STA_INFO_STA_FLAGS); in brcmf_convert_sta_flags()
3025 sfu = &si->sta_flags; in brcmf_convert_sta_flags()
3026 sfu->mask = BIT(NL80211_STA_FLAG_WME) | in brcmf_convert_sta_flags()
3031 sfu->set |= BIT(NL80211_STA_FLAG_WME); in brcmf_convert_sta_flags()
3033 sfu->set |= BIT(NL80211_STA_FLAG_AUTHENTICATED); in brcmf_convert_sta_flags()
3035 sfu->set |= BIT(NL80211_STA_FLAG_ASSOCIATED); in brcmf_convert_sta_flags()
3037 sfu->set |= BIT(NL80211_STA_FLAG_AUTHORIZED); in brcmf_convert_sta_flags()
3042 struct brcmf_pub *drvr = ifp->drvr; in brcmf_fill_bss_param()
3054 buf->len = cpu_to_le32(WL_BSS_INFO_MAX); in brcmf_fill_bss_param()
3061 si->filled |= BIT_ULL(NL80211_STA_INFO_BSS_PARAM); in brcmf_fill_bss_param()
3062 si->bss_param.beacon_interval = le16_to_cpu(buf->bss_le.beacon_period); in brcmf_fill_bss_param()
3063 si->bss_param.dtim_period = buf->bss_le.dtim_period; in brcmf_fill_bss_param()
3064 capability = le16_to_cpu(buf->bss_le.capability); in brcmf_fill_bss_param()
3066 si->bss_param.flags |= BSS_PARAM_FLAGS_CTS_PROT; in brcmf_fill_bss_param()
3068 si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE; in brcmf_fill_bss_param()
3070 si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME; in brcmf_fill_bss_param()
3080 struct brcmf_pub *drvr = ifp->drvr; in brcmf_cfg80211_get_station_ibss()
3093 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in brcmf_cfg80211_get_station_ibss()
3094 sinfo->txrate.legacy = rate * 5; in brcmf_cfg80211_get_station_ibss()
3104 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in brcmf_cfg80211_get_station_ibss()
3105 sinfo->signal = rssi; in brcmf_cfg80211_get_station_ibss()
3113 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS) | in brcmf_cfg80211_get_station_ibss()
3117 sinfo->rx_packets = le32_to_cpu(pktcnt.rx_good_pkt); in brcmf_cfg80211_get_station_ibss()
3118 sinfo->rx_dropped_misc = le32_to_cpu(pktcnt.rx_bad_pkt); in brcmf_cfg80211_get_station_ibss()
3119 sinfo->tx_packets = le32_to_cpu(pktcnt.tx_good_pkt); in brcmf_cfg80211_get_station_ibss()
3120 sinfo->tx_failed = le32_to_cpu(pktcnt.tx_bad_pkt); in brcmf_cfg80211_get_station_ibss()
3131 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_get_station()
3144 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_get_station()
3145 return -EIO; in brcmf_cfg80211_get_station()
3147 if (brcmf_is_ibssmode(ifp->vif)) in brcmf_cfg80211_get_station()
3166 sinfo->filled = BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME); in brcmf_cfg80211_get_station()
3167 sinfo->inactive_time = le32_to_cpu(sta_info_le.idle) * 1000; in brcmf_cfg80211_get_station()
3170 sinfo->sta_flags.mask |= BIT(NL80211_STA_FLAG_TDLS_PEER); in brcmf_cfg80211_get_station()
3172 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER); in brcmf_cfg80211_get_station()
3174 sinfo->sta_flags.set &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in brcmf_cfg80211_get_station()
3176 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CONNECTED_TIME); in brcmf_cfg80211_get_station()
3177 sinfo->connected_time = le32_to_cpu(sta_info_le.in); in brcmf_cfg80211_get_station()
3181 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); in brcmf_cfg80211_get_station()
3182 sinfo->tx_failed = le32_to_cpu(sta_info_le.tx_failures); in brcmf_cfg80211_get_station()
3183 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS); in brcmf_cfg80211_get_station()
3184 sinfo->tx_packets = le32_to_cpu(sta_info_le.tx_pkts); in brcmf_cfg80211_get_station()
3185 sinfo->tx_packets += le32_to_cpu(sta_info_le.tx_mcast_pkts); in brcmf_cfg80211_get_station()
3186 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS); in brcmf_cfg80211_get_station()
3187 sinfo->rx_packets = le32_to_cpu(sta_info_le.rx_ucast_pkts); in brcmf_cfg80211_get_station()
3188 sinfo->rx_packets += le32_to_cpu(sta_info_le.rx_mcast_pkts); in brcmf_cfg80211_get_station()
3189 if (sinfo->tx_packets) { in brcmf_cfg80211_get_station()
3190 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); in brcmf_cfg80211_get_station()
3191 sinfo->txrate.legacy = in brcmf_cfg80211_get_station()
3194 if (sinfo->rx_packets) { in brcmf_cfg80211_get_station()
3195 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE); in brcmf_cfg80211_get_station()
3196 sinfo->rxrate.legacy = in brcmf_cfg80211_get_station()
3200 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES); in brcmf_cfg80211_get_station()
3201 sinfo->tx_bytes = le64_to_cpu(sta_info_le.tx_tot_bytes); in brcmf_cfg80211_get_station()
3202 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES); in brcmf_cfg80211_get_station()
3203 sinfo->rx_bytes = le64_to_cpu(sta_info_le.rx_tot_bytes); in brcmf_cfg80211_get_station()
3209 sinfo->chains |= BIT(count_rssi); in brcmf_cfg80211_get_station()
3210 sinfo->chain_signal[count_rssi] = in brcmf_cfg80211_get_station()
3212 sinfo->chain_signal_avg[count_rssi] = in brcmf_cfg80211_get_station()
3219 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in brcmf_cfg80211_get_station()
3220 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); in brcmf_cfg80211_get_station()
3221 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); in brcmf_cfg80211_get_station()
3222 sinfo->filled |= in brcmf_cfg80211_get_station()
3224 sinfo->signal = total_rssi / count_rssi; in brcmf_cfg80211_get_station()
3225 sinfo->signal_avg = total_rssi_avg / count_rssi; in brcmf_cfg80211_get_station()
3227 &ifp->vif->sme_state)) { in brcmf_cfg80211_get_station()
3237 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in brcmf_cfg80211_get_station()
3238 sinfo->signal = rssi; in brcmf_cfg80211_get_station()
3254 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_dump_station()
3260 cfg->assoclist.count = cpu_to_le32(BRCMF_MAX_ASSOCLIST); in brcmf_cfg80211_dump_station()
3262 &cfg->assoclist, in brcmf_cfg80211_dump_station()
3263 sizeof(cfg->assoclist)); in brcmf_cfg80211_dump_station()
3266 if (err == -EBADE) in brcmf_cfg80211_dump_station()
3272 cfg->assoclist.count = 0; in brcmf_cfg80211_dump_station()
3273 return -EOPNOTSUPP; in brcmf_cfg80211_dump_station()
3276 if (idx < le32_to_cpu(cfg->assoclist.count)) { in brcmf_cfg80211_dump_station()
3277 memcpy(mac, cfg->assoclist.mac[idx], ETH_ALEN); in brcmf_cfg80211_dump_station()
3280 return -ENOENT; in brcmf_cfg80211_dump_station()
3291 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_set_power_mgmt()
3302 cfg->pwr_save = enabled; in brcmf_cfg80211_set_power_mgmt()
3303 if (!check_vif_up(ifp->vif)) { in brcmf_cfg80211_set_power_mgmt()
3311 if (ifp->vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) { in brcmf_cfg80211_set_power_mgmt()
3319 if (err == -ENODEV) in brcmf_cfg80211_set_power_mgmt()
3339 struct brcmf_pub *drvr = cfg->pub; in brcmf_inform_single_bss()
3351 if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) { in brcmf_inform_single_bss()
3353 return -EINVAL; in brcmf_inform_single_bss()
3356 if (!bi->ctl_ch) { in brcmf_inform_single_bss()
3357 ch.chspec = le16_to_cpu(bi->chanspec); in brcmf_inform_single_bss()
3358 cfg->d11inf.decchspec(&ch); in brcmf_inform_single_bss()
3359 bi->ctl_ch = ch.control_ch_num; in brcmf_inform_single_bss()
3361 channel = bi->ctl_ch; in brcmf_inform_single_bss()
3372 notify_capability = le16_to_cpu(bi->capability); in brcmf_inform_single_bss()
3373 notify_interval = le16_to_cpu(bi->beacon_period); in brcmf_inform_single_bss()
3374 notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset); in brcmf_inform_single_bss()
3375 notify_ielen = le32_to_cpu(bi->ie_length); in brcmf_inform_single_bss()
3376 bss_data.signal = (s16)le16_to_cpu(bi->RSSI) * 100; in brcmf_inform_single_bss()
3378 brcmf_dbg(CONN, "bssid: %pM\n", bi->BSSID); in brcmf_inform_single_bss()
3386 (const u8 *)bi->BSSID, in brcmf_inform_single_bss()
3392 return -ENOMEM; in brcmf_inform_single_bss()
3403 return list->bss_info_le; in next_bss_le()
3405 le32_to_cpu(bss->length)); in next_bss_le()
3410 struct brcmf_pub *drvr = cfg->pub; in brcmf_inform_bss()
3416 bss_list = (struct brcmf_scan_results *)cfg->escan_info.escan_buf; in brcmf_inform_bss()
3417 if (bss_list->count != 0 && in brcmf_inform_bss()
3418 bss_list->version != BRCMF_BSS_INFO_VERSION) { in brcmf_inform_bss()
3420 bss_list->version); in brcmf_inform_bss()
3421 return -EOPNOTSUPP; in brcmf_inform_bss()
3423 brcmf_dbg(SCAN, "scanned AP count (%d)\n", bss_list->count); in brcmf_inform_bss()
3424 for (i = 0; i < bss_list->count; i++) { in brcmf_inform_bss()
3437 struct brcmf_pub *drvr = cfg->pub; in brcmf_inform_ibss()
3456 err = -ENOMEM; in brcmf_inform_ibss()
3471 ch.chspec = le16_to_cpu(bi->chanspec); in brcmf_inform_ibss()
3472 cfg->d11inf.decchspec(&ch); in brcmf_inform_ibss()
3475 band = wiphy->bands[NL80211_BAND_2GHZ]; in brcmf_inform_ibss()
3477 band = wiphy->bands[NL80211_BAND_5GHZ]; in brcmf_inform_ibss()
3479 freq = ieee80211_channel_to_frequency(ch.control_ch_num, band->band); in brcmf_inform_ibss()
3480 cfg->channel = freq; in brcmf_inform_ibss()
3483 notify_capability = le16_to_cpu(bi->capability); in brcmf_inform_ibss()
3484 notify_interval = le16_to_cpu(bi->beacon_period); in brcmf_inform_ibss()
3485 notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset); in brcmf_inform_ibss()
3486 notify_ielen = le32_to_cpu(bi->ie_length); in brcmf_inform_ibss()
3487 notify_signal = (s16)le16_to_cpu(bi->RSSI) * 100; in brcmf_inform_ibss()
3501 err = -ENOMEM; in brcmf_inform_ibss()
3519 struct brcmf_pub *drvr = cfg->pub; in brcmf_update_bss_info()
3524 if (brcmf_is_ibssmode(ifp->vif)) in brcmf_update_bss_info()
3527 *(__le32 *)cfg->extra_buf = cpu_to_le32(WL_EXTRA_BUF_MAX); in brcmf_update_bss_info()
3529 cfg->extra_buf, WL_EXTRA_BUF_MAX); in brcmf_update_bss_info()
3534 bi = (struct brcmf_bss_info_le *)(cfg->extra_buf + 4); in brcmf_update_bss_info()
3544 struct escan_info *escan = &cfg->escan_info; in brcmf_abort_scanning()
3546 set_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status); in brcmf_abort_scanning()
3547 if (cfg->int_escan_map || cfg->scan_request) { in brcmf_abort_scanning()
3548 escan->escan_state = WL_ESCAN_STATE_IDLE; in brcmf_abort_scanning()
3549 brcmf_notify_escan_complete(cfg, escan->ifp, true, true); in brcmf_abort_scanning()
3551 clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); in brcmf_abort_scanning()
3552 clear_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status); in brcmf_abort_scanning()
3562 brcmf_notify_escan_complete(cfg, cfg->escan_info.ifp, true, true); in brcmf_cfg80211_escan_timeout_worker()
3569 struct brcmf_pub *drvr = cfg->pub; in brcmf_escan_timeout()
3571 if (cfg->int_escan_map || cfg->scan_request) { in brcmf_escan_timeout()
3573 schedule_work(&cfg->escan_timeout_work); in brcmf_escan_timeout()
3584 ch_bss.chspec = le16_to_cpu(bss->chanspec); in brcmf_compare_update_same_bss()
3585 cfg->d11inf.decchspec(&ch_bss); in brcmf_compare_update_same_bss()
3586 ch_bss_info_le.chspec = le16_to_cpu(bss_info_le->chanspec); in brcmf_compare_update_same_bss()
3587 cfg->d11inf.decchspec(&ch_bss_info_le); in brcmf_compare_update_same_bss()
3589 if (!memcmp(&bss_info_le->BSSID, &bss->BSSID, ETH_ALEN) && in brcmf_compare_update_same_bss()
3591 bss_info_le->SSID_len == bss->SSID_len && in brcmf_compare_update_same_bss()
3592 !memcmp(bss_info_le->SSID, bss->SSID, bss_info_le->SSID_len)) { in brcmf_compare_update_same_bss()
3593 if ((bss->flags & BRCMF_BSS_RSSI_ON_CHANNEL) == in brcmf_compare_update_same_bss()
3594 (bss_info_le->flags & BRCMF_BSS_RSSI_ON_CHANNEL)) { in brcmf_compare_update_same_bss()
3595 s16 bss_rssi = le16_to_cpu(bss->RSSI); in brcmf_compare_update_same_bss()
3596 s16 bss_info_rssi = le16_to_cpu(bss_info_le->RSSI); in brcmf_compare_update_same_bss()
3599 * both on-channel or both off-channel in brcmf_compare_update_same_bss()
3602 bss->RSSI = bss_info_le->RSSI; in brcmf_compare_update_same_bss()
3603 } else if ((bss->flags & BRCMF_BSS_RSSI_ON_CHANNEL) && in brcmf_compare_update_same_bss()
3604 (bss_info_le->flags & BRCMF_BSS_RSSI_ON_CHANNEL) == 0) { in brcmf_compare_update_same_bss()
3605 /* preserve the on-channel rssi measurement in brcmf_compare_update_same_bss()
3608 bss->RSSI = bss_info_le->RSSI; in brcmf_compare_update_same_bss()
3609 bss->flags |= BRCMF_BSS_RSSI_ON_CHANNEL; in brcmf_compare_update_same_bss()
3620 struct brcmf_pub *drvr = ifp->drvr; in brcmf_cfg80211_escan_handler()
3621 struct brcmf_cfg80211_info *cfg = drvr->config; in brcmf_cfg80211_escan_handler()
3632 status = e->status; in brcmf_cfg80211_escan_handler()
3637 if (!test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) { in brcmf_cfg80211_escan_handler()
3639 ifp->bsscfgidx); in brcmf_cfg80211_escan_handler()
3640 return -EPERM; in brcmf_cfg80211_escan_handler()
3645 if (e->datalen < sizeof(*escan_result_le)) { in brcmf_cfg80211_escan_handler()
3654 escan_buflen = le32_to_cpu(escan_result_le->buflen); in brcmf_cfg80211_escan_handler()
3656 escan_buflen > e->datalen || in brcmf_cfg80211_escan_handler()
3662 if (le16_to_cpu(escan_result_le->bss_count) != 1) { in brcmf_cfg80211_escan_handler()
3664 escan_result_le->bss_count); in brcmf_cfg80211_escan_handler()
3667 bss_info_le = &escan_result_le->bss_info_le; in brcmf_cfg80211_escan_handler()
3672 if (!cfg->int_escan_map && !cfg->scan_request) { in brcmf_cfg80211_escan_handler()
3677 bi_length = le32_to_cpu(bss_info_le->length); in brcmf_cfg80211_escan_handler()
3678 if (bi_length != escan_buflen - WL_ESCAN_RESULTS_FIXED_SIZE) { in brcmf_cfg80211_escan_handler()
3684 if (!(cfg_to_wiphy(cfg)->interface_modes & in brcmf_cfg80211_escan_handler()
3686 if (le16_to_cpu(bss_info_le->capability) & in brcmf_cfg80211_escan_handler()
3694 cfg->escan_info.escan_buf; in brcmf_cfg80211_escan_handler()
3695 if (bi_length > BRCMF_ESCAN_BUF_SIZE - list->buflen) { in brcmf_cfg80211_escan_handler()
3700 for (i = 0; i < list->count; i++) { in brcmf_cfg80211_escan_handler()
3703 le32_to_cpu(bss->length)) : list->bss_info_le; in brcmf_cfg80211_escan_handler()
3708 memcpy(&cfg->escan_info.escan_buf[list->buflen], bss_info_le, in brcmf_cfg80211_escan_handler()
3710 list->version = le32_to_cpu(bss_info_le->version); in brcmf_cfg80211_escan_handler()
3711 list->buflen += bi_length; in brcmf_cfg80211_escan_handler()
3712 list->count++; in brcmf_cfg80211_escan_handler()
3714 cfg->escan_info.escan_state = WL_ESCAN_STATE_IDLE; in brcmf_cfg80211_escan_handler()
3717 if (cfg->int_escan_map || cfg->scan_request) { in brcmf_cfg80211_escan_handler()
3731 brcmf_fweh_register(cfg->pub, BRCMF_E_ESCAN_RESULT, in brcmf_init_escan()
3733 cfg->escan_info.escan_state = WL_ESCAN_STATE_IDLE; in brcmf_init_escan()
3735 timer_setup(&cfg->escan_timeout, brcmf_escan_timeout, 0); in brcmf_init_escan()
3736 INIT_WORK(&cfg->escan_timeout_work, in brcmf_init_escan()
3746 n_netinfo * sizeof(req->channels[0]) + in brcmf_alloc_internal_escan_request()
3747 n_netinfo * sizeof(*req->ssids); in brcmf_alloc_internal_escan_request()
3751 req->wiphy = wiphy; in brcmf_alloc_internal_escan_request()
3752 req->ssids = (void *)(&req->channels[0]) + in brcmf_alloc_internal_escan_request()
3753 n_netinfo * sizeof(req->channels[0]); in brcmf_alloc_internal_escan_request()
3772 return -EINVAL; in brcmf_internal_escan_add_info()
3774 chan = ieee80211_get_channel(req->wiphy, freq); in brcmf_internal_escan_add_info()
3776 return -EINVAL; in brcmf_internal_escan_add_info()
3778 for (i = 0; i < req->n_channels; i++) { in brcmf_internal_escan_add_info()
3779 if (req->channels[i] == chan) in brcmf_internal_escan_add_info()
3782 if (i == req->n_channels) { in brcmf_internal_escan_add_info()
3783 req->n_channels++; in brcmf_internal_escan_add_info()
3784 req->channels[i] = chan; in brcmf_internal_escan_add_info()
3787 for (i = 0; i < req->n_ssids; i++) { in brcmf_internal_escan_add_info()
3788 if (req->ssids[i].ssid_len == ssid_len && in brcmf_internal_escan_add_info()
3789 !memcmp(req->ssids[i].ssid, ssid, ssid_len)) in brcmf_internal_escan_add_info()
3792 if (i == req->n_ssids) { in brcmf_internal_escan_add_info()
3793 memcpy(req->ssids[req->n_ssids].ssid, ssid, ssid_len); in brcmf_internal_escan_add_info()
3794 req->ssids[req->n_ssids++].ssid_len = ssid_len; in brcmf_internal_escan_add_info()
3802 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_start_internal_escan()
3805 if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) { in brcmf_start_internal_escan()
3806 if (cfg->int_escan_map) in brcmf_start_internal_escan()
3808 cfg->int_escan_map); in brcmf_start_internal_escan()
3809 /* Abort any on-going scan */ in brcmf_start_internal_escan()
3814 set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); in brcmf_start_internal_escan()
3815 cfg->escan_info.run = brcmf_run_escan; in brcmf_start_internal_escan()
3818 clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); in brcmf_start_internal_escan()
3821 cfg->int_escan_map = fwmap; in brcmf_start_internal_escan()
3831 switch (pfn_v1->version) { in brcmf_get_netinfo_array()
3857 struct brcmf_pub *drvr = ifp->drvr; in brcmf_notify_sched_scan_results()
3858 struct brcmf_cfg80211_info *cfg = drvr->config; in brcmf_notify_sched_scan_results()
3871 if (e->datalen < (sizeof(*pfn_result) + sizeof(*netinfo))) { in brcmf_notify_sched_scan_results()
3876 if (e->event_code == BRCMF_E_PFN_NET_LOST) { in brcmf_notify_sched_scan_results()
3882 result_count = le32_to_cpu(pfn_result->count); in brcmf_notify_sched_scan_results()
3883 status = le32_to_cpu(pfn_result->status); in brcmf_notify_sched_scan_results()
3896 datalen = e->datalen - ((void *)netinfo_start - (void *)pfn_result); in brcmf_notify_sched_scan_results()
3905 err = -ENOMEM; in brcmf_notify_sched_scan_results()
3913 if (netinfo->SSID_len > IEEE80211_MAX_SSID_LEN) in brcmf_notify_sched_scan_results()
3914 netinfo->SSID_len = IEEE80211_MAX_SSID_LEN; in brcmf_notify_sched_scan_results()
3916 netinfo->SSID, netinfo->channel); in brcmf_notify_sched_scan_results()
3917 bucket_map |= brcmf_pno_get_bucket_map(cfg->pno, netinfo); in brcmf_notify_sched_scan_results()
3919 netinfo->SSID, in brcmf_notify_sched_scan_results()
3920 netinfo->SSID_len, in brcmf_notify_sched_scan_results()
3921 netinfo->channel); in brcmf_notify_sched_scan_results()
3947 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_sched_scan_start()
3950 req->n_match_sets, req->n_ssids); in brcmf_cfg80211_sched_scan_start()
3952 if (test_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status)) { in brcmf_cfg80211_sched_scan_start()
3954 cfg->scan_status); in brcmf_cfg80211_sched_scan_start()
3955 return -EAGAIN; in brcmf_cfg80211_sched_scan_start()
3958 if (req->n_match_sets <= 0) { in brcmf_cfg80211_sched_scan_start()
3960 req->n_match_sets); in brcmf_cfg80211_sched_scan_start()
3961 return -EINVAL; in brcmf_cfg80211_sched_scan_start()
3975 if (cfg->int_escan_map) in brcmf_cfg80211_sched_scan_stop()
4002 patternoffset = sizeof(*filter) - sizeof(filter->cmd) + masksize; in brcmf_config_wowl_pattern()
4007 return -ENOMEM; in brcmf_config_wowl_pattern()
4010 memcpy(filter->cmd, cmd, 4); in brcmf_config_wowl_pattern()
4011 filter->masksize = cpu_to_le32(masksize); in brcmf_config_wowl_pattern()
4012 filter->offset = cpu_to_le32(packet_offset); in brcmf_config_wowl_pattern()
4013 filter->patternoffset = cpu_to_le32(patternoffset); in brcmf_config_wowl_pattern()
4014 filter->patternsize = cpu_to_le32(patternsize); in brcmf_config_wowl_pattern()
4015 filter->type = cpu_to_le32(BRCMF_WOWL_PATTERN_TYPE_BITMAP); in brcmf_config_wowl_pattern()
4032 struct brcmf_pub *drvr = ifp->drvr; in brcmf_wowl_nd_results()
4033 struct brcmf_cfg80211_info *cfg = drvr->config; in brcmf_wowl_nd_results()
4039 if (e->datalen < (sizeof(*pfn_result) + sizeof(*netinfo))) { in brcmf_wowl_nd_results()
4046 if (e->event_code == BRCMF_E_PFN_NET_LOST) { in brcmf_wowl_nd_results()
4051 if (le32_to_cpu(pfn_result->count) < 1) { in brcmf_wowl_nd_results()
4053 le32_to_cpu(pfn_result->count)); in brcmf_wowl_nd_results()
4054 return -EINVAL; in brcmf_wowl_nd_results()
4058 if (netinfo->SSID_len > IEEE80211_MAX_SSID_LEN) in brcmf_wowl_nd_results()
4059 netinfo->SSID_len = IEEE80211_MAX_SSID_LEN; in brcmf_wowl_nd_results()
4060 memcpy(cfg->wowl.nd->ssid.ssid, netinfo->SSID, netinfo->SSID_len); in brcmf_wowl_nd_results()
4061 cfg->wowl.nd->ssid.ssid_len = netinfo->SSID_len; in brcmf_wowl_nd_results()
4062 cfg->wowl.nd->n_channels = 1; in brcmf_wowl_nd_results()
4063 cfg->wowl.nd->channels[0] = in brcmf_wowl_nd_results()
4064 ieee80211_channel_to_frequency(netinfo->channel, in brcmf_wowl_nd_results()
4065 netinfo->channel <= CH_MAX_2G_CHANNEL ? in brcmf_wowl_nd_results()
4067 cfg->wowl.nd_info->n_matches = 1; in brcmf_wowl_nd_results()
4068 cfg->wowl.nd_info->matches[0] = cfg->wowl.nd; in brcmf_wowl_nd_results()
4071 cfg->wowl.nd_data_completed = true; in brcmf_wowl_nd_results()
4072 wake_up(&cfg->wowl.nd_data_wait); in brcmf_wowl_nd_results()
4082 struct brcmf_pub *drvr = cfg->pub; in brcmf_report_wowl_wakeind()
4103 wakeup_data.pattern_idx = -1; in brcmf_report_wowl_wakeind()
4130 timeout = wait_event_timeout(cfg->wowl.nd_data_wait, in brcmf_report_wowl_wakeind()
4131 cfg->wowl.nd_data_completed, in brcmf_report_wowl_wakeind()
4136 wakeup_data.net_detect = cfg->wowl.nd_info; in brcmf_report_wowl_wakeind()
4145 cfg80211_report_wowlan_wakeup(&ifp->vif->wdev, wakeup, GFP_KERNEL); in brcmf_report_wowl_wakeind()
4164 if (cfg->wowl.active) { in brcmf_cfg80211_resume()
4171 cfg->wowl.pre_pmmode); in brcmf_cfg80211_resume()
4172 cfg->wowl.active = false; in brcmf_cfg80211_resume()
4173 if (cfg->wowl.nd_enabled) { in brcmf_cfg80211_resume()
4174 brcmf_cfg80211_sched_scan_stop(cfg->wiphy, ifp->ndev, 0); in brcmf_cfg80211_resume()
4175 brcmf_fweh_unregister(cfg->pub, BRCMF_E_PFN_NET_FOUND); in brcmf_cfg80211_resume()
4176 brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND, in brcmf_cfg80211_resume()
4178 cfg->wowl.nd_enabled = false; in brcmf_cfg80211_resume()
4196 brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PM, &cfg->wowl.pre_pmmode); in brcmf_configure_wowl()
4200 if (wowl->disconnect) in brcmf_configure_wowl()
4202 if (wowl->magic_pkt) in brcmf_configure_wowl()
4204 if ((wowl->patterns) && (wowl->n_patterns)) { in brcmf_configure_wowl()
4206 for (i = 0; i < wowl->n_patterns; i++) { in brcmf_configure_wowl()
4208 (u8 *)wowl->patterns[i].pattern, in brcmf_configure_wowl()
4209 wowl->patterns[i].pattern_len, in brcmf_configure_wowl()
4210 (u8 *)wowl->patterns[i].mask, in brcmf_configure_wowl()
4211 wowl->patterns[i].pkt_offset); in brcmf_configure_wowl()
4214 if (wowl->nd_config) { in brcmf_configure_wowl()
4215 brcmf_cfg80211_sched_scan_start(cfg->wiphy, ifp->ndev, in brcmf_configure_wowl()
4216 wowl->nd_config); in brcmf_configure_wowl()
4219 cfg->wowl.nd_data_completed = false; in brcmf_configure_wowl()
4220 cfg->wowl.nd_enabled = true; in brcmf_configure_wowl()
4222 brcmf_fweh_unregister(cfg->pub, BRCMF_E_PFN_NET_FOUND); in brcmf_configure_wowl()
4223 brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND, in brcmf_configure_wowl()
4226 if (wowl->gtk_rekey_failure) in brcmf_configure_wowl()
4228 if (!test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state)) in brcmf_configure_wowl()
4236 brcmf_bus_wowl_config(cfg->pub->bus_if, true); in brcmf_configure_wowl()
4237 cfg->wowl.active = true; in brcmf_configure_wowl()
4253 brcmf_err("keep-alive packet config failed, ret=%d\n", ret); in brcmf_keepalive_start()
4271 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_suspend()
4279 if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) in brcmf_cfg80211_suspend()
4283 brcmf_bus_wowl_config(cfg->pub->bus_if, false); in brcmf_cfg80211_suspend()
4284 list_for_each_entry(vif, &cfg->vif_list, list) { in brcmf_cfg80211_suspend()
4285 if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state)) in brcmf_cfg80211_suspend()
4305 /* Prevent disassociation due to inactivity with keep-alive */ in brcmf_cfg80211_suspend()
4312 cfg->scan_status = 0; in brcmf_cfg80211_suspend()
4325 pmk_op->version = cpu_to_le16(BRCMF_PMKSA_VER_3); in brcmf_pmksa_v3_op()
4329 pmk_op->count = cpu_to_le16(0); in brcmf_pmksa_v3_op()
4332 pmk_op->count = cpu_to_le16(1); in brcmf_pmksa_v3_op()
4334 memcpy(pmk_op->pmk[0].bssid, pmksa->bssid, ETH_ALEN); in brcmf_pmksa_v3_op()
4335 memcpy(pmk_op->pmk[0].pmkid, pmksa->pmkid, WLAN_PMKID_LEN); in brcmf_pmksa_v3_op()
4336 pmk_op->pmk[0].pmkid_len = WLAN_PMKID_LEN; in brcmf_pmksa_v3_op()
4337 pmk_op->pmk[0].time_left = cpu_to_le32(alive ? BRCMF_PMKSA_NO_EXPIRY : 0); in brcmf_pmksa_v3_op()
4340 pmk_op->length = cpu_to_le16(length); in brcmf_pmksa_v3_op()
4354 pmk_list = &cfg->pmk_list; in brcmf_update_pmklist()
4355 npmk = le32_to_cpu(pmk_list->npmk); in brcmf_update_pmklist()
4359 brcmf_dbg(CONN, "PMK[%d]: %pM\n", i, &pmk_list->pmk[i].bssid); in brcmf_update_pmklist()
4371 struct brcmf_pmksa *pmk = &cfg->pmk_list.pmk[0]; in brcmf_cfg80211_set_pmksa()
4372 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_set_pmksa()
4377 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_set_pmksa()
4378 return -EIO; in brcmf_cfg80211_set_pmksa()
4380 brcmf_dbg(CONN, "set_pmksa - PMK bssid: %pM =\n", pmksa->bssid); in brcmf_cfg80211_set_pmksa()
4381 brcmf_dbg(CONN, "%*ph\n", WLAN_PMKID_LEN, pmksa->pmkid); in brcmf_cfg80211_set_pmksa()
4388 npmk = le32_to_cpu(cfg->pmk_list.npmk); in brcmf_cfg80211_set_pmksa()
4390 if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN)) in brcmf_cfg80211_set_pmksa()
4393 memcpy(pmk[i].bssid, pmksa->bssid, ETH_ALEN); in brcmf_cfg80211_set_pmksa()
4394 memcpy(pmk[i].pmkid, pmksa->pmkid, WLAN_PMKID_LEN); in brcmf_cfg80211_set_pmksa()
4397 cfg->pmk_list.npmk = cpu_to_le32(npmk); in brcmf_cfg80211_set_pmksa()
4401 return -EINVAL; in brcmf_cfg80211_set_pmksa()
4416 struct brcmf_pmksa *pmk = &cfg->pmk_list.pmk[0]; in brcmf_cfg80211_del_pmksa()
4417 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_del_pmksa()
4422 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_del_pmksa()
4423 return -EIO; in brcmf_cfg80211_del_pmksa()
4425 brcmf_dbg(CONN, "del_pmksa - PMK bssid = %pM\n", pmksa->bssid); in brcmf_cfg80211_del_pmksa()
4432 npmk = le32_to_cpu(cfg->pmk_list.npmk); in brcmf_cfg80211_del_pmksa()
4434 if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN)) in brcmf_cfg80211_del_pmksa()
4438 for (; i < (npmk - 1); i++) { in brcmf_cfg80211_del_pmksa()
4444 cfg->pmk_list.npmk = cpu_to_le32(npmk - 1); in brcmf_cfg80211_del_pmksa()
4447 return -EINVAL; in brcmf_cfg80211_del_pmksa()
4465 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_flush_pmksa()
4466 return -EIO; in brcmf_cfg80211_flush_pmksa()
4473 memset(&cfg->pmk_list, 0, sizeof(cfg->pmk_list)); in brcmf_cfg80211_flush_pmksa()
4483 struct brcmf_pub *drvr = ifp->drvr; in brcmf_configure_opensecurity()
4499 /* set upper-layer auth */ in brcmf_configure_opensecurity()
4500 if (brcmf_is_ibssmode(ifp->vif)) in brcmf_configure_opensecurity()
4526 struct brcmf_pub *drvr = ifp->drvr; in brcmf_configure_wpaie()
4546 len = wpa_ie->len + TLV_HDR_LEN; in brcmf_configure_wpaie()
4556 err = -EINVAL; in brcmf_configure_wpaie()
4562 err = -EINVAL; in brcmf_configure_wpaie()
4584 err = -EINVAL; in brcmf_configure_wpaie()
4595 err = -EINVAL; in brcmf_configure_wpaie()
4601 err = -EINVAL; in brcmf_configure_wpaie()
4629 err = -EINVAL; in brcmf_configure_wpaie()
4635 err = -EINVAL; in brcmf_configure_wpaie()
4690 err = -EINVAL; in brcmf_configure_wpaie()
4755 /* set upper-layer auth */ in brcmf_configure_wpaie()
4780 if (ie->id != WLAN_EID_VENDOR_SPECIFIC) in brcmf_parse_vndr_ies()
4784 if (vndrie->len < (VS_IE_FIXED_HDR_LEN - TLV_HDR_LEN + 1)) { in brcmf_parse_vndr_ies()
4786 vndrie->len); in brcmf_parse_vndr_ies()
4790 if (!memcmp(vndrie->oui, (u8 *)WPA_OUI, TLV_OUI_LEN) && in brcmf_parse_vndr_ies()
4791 ((vndrie->oui_type == WPA_OUI_TYPE) || in brcmf_parse_vndr_ies()
4792 (vndrie->oui_type == WME_OUI_TYPE))) { in brcmf_parse_vndr_ies()
4797 parsed_info = &vndr_ies->ie_info[vndr_ies->count]; in brcmf_parse_vndr_ies()
4800 parsed_info->ie_ptr = (char *)vndrie; in brcmf_parse_vndr_ies()
4801 parsed_info->ie_len = vndrie->len + TLV_HDR_LEN; in brcmf_parse_vndr_ies()
4802 memcpy(&parsed_info->vndrie, vndrie, sizeof(*vndrie)); in brcmf_parse_vndr_ies()
4804 vndr_ies->count++; in brcmf_parse_vndr_ies()
4807 parsed_info->vndrie.oui, in brcmf_parse_vndr_ies()
4808 parsed_info->vndrie.oui_type); in brcmf_parse_vndr_ies()
4810 if (vndr_ies->count >= VNDR_IE_PARSE_LIMIT) in brcmf_parse_vndr_ies()
4813 remaining_len -= (ie->len + TLV_HDR_LEN); in brcmf_parse_vndr_ies()
4817 ie = (struct brcmf_tlv *)(((u8 *)ie) + ie->len + in brcmf_parse_vndr_ies()
4860 return -ENODEV; in brcmf_vif_set_mgmt_ie()
4861 ifp = vif->ifp; in brcmf_vif_set_mgmt_ie()
4862 drvr = ifp->drvr; in brcmf_vif_set_mgmt_ie()
4863 saved_ie = &vif->saved_ie; in brcmf_vif_set_mgmt_ie()
4865 brcmf_dbg(TRACE, "bsscfgidx %d, pktflag : 0x%02X\n", ifp->bsscfgidx, in brcmf_vif_set_mgmt_ie()
4869 return -ENOMEM; in brcmf_vif_set_mgmt_ie()
4873 mgmt_ie_buf = saved_ie->probe_req_ie; in brcmf_vif_set_mgmt_ie()
4874 mgmt_ie_len = &saved_ie->probe_req_ie_len; in brcmf_vif_set_mgmt_ie()
4875 mgmt_ie_buf_len = sizeof(saved_ie->probe_req_ie); in brcmf_vif_set_mgmt_ie()
4878 mgmt_ie_buf = saved_ie->probe_res_ie; in brcmf_vif_set_mgmt_ie()
4879 mgmt_ie_len = &saved_ie->probe_res_ie_len; in brcmf_vif_set_mgmt_ie()
4880 mgmt_ie_buf_len = sizeof(saved_ie->probe_res_ie); in brcmf_vif_set_mgmt_ie()
4883 mgmt_ie_buf = saved_ie->beacon_ie; in brcmf_vif_set_mgmt_ie()
4884 mgmt_ie_len = &saved_ie->beacon_ie_len; in brcmf_vif_set_mgmt_ie()
4885 mgmt_ie_buf_len = sizeof(saved_ie->beacon_ie); in brcmf_vif_set_mgmt_ie()
4888 mgmt_ie_buf = saved_ie->assoc_req_ie; in brcmf_vif_set_mgmt_ie()
4889 mgmt_ie_len = &saved_ie->assoc_req_ie_len; in brcmf_vif_set_mgmt_ie()
4890 mgmt_ie_buf_len = sizeof(saved_ie->assoc_req_ie); in brcmf_vif_set_mgmt_ie()
4893 mgmt_ie_buf = saved_ie->assoc_res_ie; in brcmf_vif_set_mgmt_ie()
4894 mgmt_ie_len = &saved_ie->assoc_res_ie_len; in brcmf_vif_set_mgmt_ie()
4895 mgmt_ie_buf_len = sizeof(saved_ie->assoc_res_ie); in brcmf_vif_set_mgmt_ie()
4898 err = -EPERM; in brcmf_vif_set_mgmt_ie()
4904 err = -ENOMEM; in brcmf_vif_set_mgmt_ie()
4915 memcpy(ptr + parsed_ie_buf_len, vndrie_info->ie_ptr, in brcmf_vif_set_mgmt_ie()
4916 vndrie_info->ie_len); in brcmf_vif_set_mgmt_ie()
4917 parsed_ie_buf_len += vndrie_info->ie_len; in brcmf_vif_set_mgmt_ie()
4937 vndrie_info->vndrie.id, in brcmf_vif_set_mgmt_ie()
4938 vndrie_info->vndrie.len, in brcmf_vif_set_mgmt_ie()
4939 vndrie_info->vndrie.oui); in brcmf_vif_set_mgmt_ie()
4942 vndrie_info->ie_ptr, in brcmf_vif_set_mgmt_ie()
4943 vndrie_info->ie_len, in brcmf_vif_set_mgmt_ie()
4962 if (remained_buf_len < (vndrie_info->vndrie.len + in brcmf_vif_set_mgmt_ie()
4968 remained_buf_len -= (vndrie_info->ie_len + in brcmf_vif_set_mgmt_ie()
4972 vndrie_info->vndrie.id, in brcmf_vif_set_mgmt_ie()
4973 vndrie_info->vndrie.len, in brcmf_vif_set_mgmt_ie()
4974 vndrie_info->vndrie.oui); in brcmf_vif_set_mgmt_ie()
4977 vndrie_info->ie_ptr, in brcmf_vif_set_mgmt_ie()
4978 vndrie_info->ie_len, in brcmf_vif_set_mgmt_ie()
4982 memcpy(ptr + (*mgmt_ie_len), vndrie_info->ie_ptr, in brcmf_vif_set_mgmt_ie()
4983 vndrie_info->ie_len); in brcmf_vif_set_mgmt_ie()
4984 *mgmt_ie_len += vndrie_info->ie_len; in brcmf_vif_set_mgmt_ie()
5014 memset(&vif->saved_ie, 0, sizeof(vif->saved_ie)); in brcmf_vif_clear_mgmt_ies()
5022 struct brcmf_pub *drvr = vif->ifp->drvr; in brcmf_config_ap_mgmt_ie()
5027 beacon->tail, beacon->tail_len); in brcmf_config_ap_mgmt_ie()
5036 beacon->proberesp_ies, in brcmf_config_ap_mgmt_ie()
5037 beacon->proberesp_ies_len); in brcmf_config_ap_mgmt_ie()
5045 beacon->assocresp_ies, in brcmf_config_ap_mgmt_ie()
5046 beacon->assocresp_ies_len); in brcmf_config_ap_mgmt_ie()
5065 rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, in brcmf_parse_configure_security()
5066 settings->beacon.tail_len, WLAN_EID_RSN); in brcmf_parse_configure_security()
5069 wpa_ie = brcmf_find_wpaie((u8 *)settings->beacon.tail, in brcmf_parse_configure_security()
5070 settings->beacon.tail_len); in brcmf_parse_configure_security()
5104 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_start_ap()
5105 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_cfg80211_start_ap()
5106 struct cfg80211_crypto_settings *crypto = &settings->crypto; in brcmf_cfg80211_start_ap()
5110 s32 err = -EPERM; in brcmf_cfg80211_start_ap()
5114 u16 chanspec = chandef_to_chanspec(&cfg->d11inf, &settings->chandef); in brcmf_cfg80211_start_ap()
5120 settings->chandef.chan->hw_value, in brcmf_cfg80211_start_ap()
5121 settings->chandef.center_freq1, settings->chandef.width, in brcmf_cfg80211_start_ap()
5122 settings->beacon_interval, settings->dtim_period); in brcmf_cfg80211_start_ap()
5124 settings->ssid, settings->ssid_len, settings->auth_type, in brcmf_cfg80211_start_ap()
5125 settings->inactivity_timeout); in brcmf_cfg80211_start_ap()
5126 dev_role = ifp->vif->wdev.iftype; in brcmf_cfg80211_start_ap()
5127 mbss = ifp->vif->mbss; in brcmf_cfg80211_start_ap()
5131 &ifp->vif->is_11d)) { in brcmf_cfg80211_start_ap()
5134 country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, in brcmf_cfg80211_start_ap()
5135 settings->beacon.tail_len, in brcmf_cfg80211_start_ap()
5142 if (settings->ssid == NULL || settings->ssid_len == 0) { in brcmf_cfg80211_start_ap()
5145 (u8 *)&settings->beacon.head[ie_offset], in brcmf_cfg80211_start_ap()
5146 settings->beacon.head_len - ie_offset, in brcmf_cfg80211_start_ap()
5148 if (!ssid_ie || ssid_ie->len > IEEE80211_MAX_SSID_LEN) in brcmf_cfg80211_start_ap()
5149 return -EINVAL; in brcmf_cfg80211_start_ap()
5151 memcpy(ssid_le.SSID, ssid_ie->data, ssid_ie->len); in brcmf_cfg80211_start_ap()
5152 ssid_le.SSID_len = cpu_to_le32(ssid_ie->len); in brcmf_cfg80211_start_ap()
5155 memcpy(ssid_le.SSID, settings->ssid, settings->ssid_len); in brcmf_cfg80211_start_ap()
5156 ssid_le.SSID_len = cpu_to_le32((u32)settings->ssid_len); in brcmf_cfg80211_start_ap()
5166 if ((supports_11d) && (is_11d != ifp->vif->is_11d)) { in brcmf_cfg80211_start_ap()
5175 if (settings->beacon_interval) { in brcmf_cfg80211_start_ap()
5177 settings->beacon_interval); in brcmf_cfg80211_start_ap()
5184 if (settings->dtim_period) { in brcmf_cfg80211_start_ap()
5186 settings->dtim_period); in brcmf_cfg80211_start_ap()
5195 ((ifp->ifidx == 0) || in brcmf_cfg80211_start_ap()
5212 } else if (WARN_ON(supports_11d && (is_11d != ifp->vif->is_11d))) { in brcmf_cfg80211_start_ap()
5213 /* Multiple-BSS should use same 11d configuration */ in brcmf_cfg80211_start_ap()
5214 err = -EINVAL; in brcmf_cfg80211_start_ap()
5246 if (crypto->psk) { in brcmf_cfg80211_start_ap()
5248 profile->use_fwauth |= BIT(BRCMF_PROFILE_FWAUTH_PSK); in brcmf_cfg80211_start_ap()
5249 err = brcmf_set_pmk(ifp, crypto->psk, in brcmf_cfg80211_start_ap()
5254 if (crypto->sae_pwd) { in brcmf_cfg80211_start_ap()
5256 profile->use_fwauth |= BIT(BRCMF_PROFILE_FWAUTH_SAE); in brcmf_cfg80211_start_ap()
5257 err = brcmf_set_sae_password(ifp, crypto->sae_pwd, in brcmf_cfg80211_start_ap()
5258 crypto->sae_pwd_len); in brcmf_cfg80211_start_ap()
5262 if (profile->use_fwauth == 0) in brcmf_cfg80211_start_ap()
5263 profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE); in brcmf_cfg80211_start_ap()
5289 settings->hidden_ssid); in brcmf_cfg80211_start_ap()
5292 settings->hidden_ssid ? in brcmf_cfg80211_start_ap()
5320 bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx); in brcmf_cfg80211_start_ap()
5334 brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon); in brcmf_cfg80211_start_ap()
5335 set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); in brcmf_cfg80211_start_ap()
5351 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_stop_ap()
5352 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_cfg80211_stop_ap()
5359 if (ifp->vif->wdev.iftype == NL80211_IFTYPE_AP) { in brcmf_cfg80211_stop_ap()
5364 if (profile->use_fwauth != BIT(BRCMF_PROFILE_FWAUTH_NONE)) { in brcmf_cfg80211_stop_ap()
5365 if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_PSK)) in brcmf_cfg80211_stop_ap()
5367 if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_SAE)) in brcmf_cfg80211_stop_ap()
5369 profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE); in brcmf_cfg80211_stop_ap()
5372 if (ifp->vif->mbss) { in brcmf_cfg80211_stop_ap()
5378 if (ifp->bsscfgidx == 0) in brcmf_cfg80211_stop_ap()
5395 ifp->vif->is_11d); in brcmf_cfg80211_stop_ap()
5401 brcmf_vif_clear_mgmt_ies(ifp->vif); in brcmf_cfg80211_stop_ap()
5403 bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx); in brcmf_cfg80211_stop_ap()
5412 clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); in brcmf_cfg80211_stop_ap()
5426 return brcmf_config_ap_mgmt_ie(ifp->vif, &info->beacon); in brcmf_cfg80211_change_beacon()
5434 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_del_station()
5439 if (!params->mac) in brcmf_cfg80211_del_station()
5440 return -EFAULT; in brcmf_cfg80211_del_station()
5442 brcmf_dbg(TRACE, "Enter %pM\n", params->mac); in brcmf_cfg80211_del_station()
5444 if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif) in brcmf_cfg80211_del_station()
5445 ifp = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp; in brcmf_cfg80211_del_station()
5446 if (!check_vif_up(ifp->vif)) in brcmf_cfg80211_del_station()
5447 return -EIO; in brcmf_cfg80211_del_station()
5449 memcpy(&scbval.ea, params->mac, ETH_ALEN); in brcmf_cfg80211_del_station()
5450 scbval.val = cpu_to_le32(params->reason_code); in brcmf_cfg80211_del_station()
5466 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_change_station()
5471 params->sta_flags_mask, params->sta_flags_set); in brcmf_cfg80211_change_station()
5477 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in brcmf_cfg80211_change_station()
5480 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED)) in brcmf_cfg80211_change_station()
5487 bphy_err(drvr, "Setting SCB (de-)authorize failed, %d\n", err); in brcmf_cfg80211_change_station()
5501 vif->mgmt_rx_reg = upd->interface_stypes; in brcmf_cfg80211_update_mgmt_frame_registrations()
5510 struct ieee80211_channel *chan = params->chan; in brcmf_cfg80211_mgmt_tx()
5511 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_mgmt_tx()
5512 const u8 *buf = params->buf; in brcmf_cfg80211_mgmt_tx()
5513 size_t len = params->len; in brcmf_cfg80211_mgmt_tx()
5531 if (!ieee80211_is_mgmt(mgmt->frame_control)) { in brcmf_cfg80211_mgmt_tx()
5533 return -EPERM; in brcmf_cfg80211_mgmt_tx()
5538 if (ieee80211_is_probe_resp(mgmt->frame_control)) { in brcmf_cfg80211_mgmt_tx()
5547 /* "DIRECT-". Note in future supplicant will take */ in brcmf_cfg80211_mgmt_tx()
5552 ie_len = len - ie_offset; in brcmf_cfg80211_mgmt_tx()
5553 if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif) in brcmf_cfg80211_mgmt_tx()
5554 vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif; in brcmf_cfg80211_mgmt_tx()
5561 } else if (ieee80211_is_action(mgmt->frame_control)) { in brcmf_cfg80211_mgmt_tx()
5564 err = -EINVAL; in brcmf_cfg80211_mgmt_tx()
5570 err = -ENOMEM; in brcmf_cfg80211_mgmt_tx()
5573 action_frame = &af_params->action_frame; in brcmf_cfg80211_mgmt_tx()
5575 action_frame->packet_id = cpu_to_le32(*cookie); in brcmf_cfg80211_mgmt_tx()
5577 memcpy(&action_frame->da[0], &mgmt->da[0], ETH_ALEN); in brcmf_cfg80211_mgmt_tx()
5578 memcpy(&af_params->bssid[0], &mgmt->bssid[0], ETH_ALEN); in brcmf_cfg80211_mgmt_tx()
5580 action_frame->len = cpu_to_le16(len - DOT11_MGMT_HDR_LEN); in brcmf_cfg80211_mgmt_tx()
5585 freq = chan->center_freq; in brcmf_cfg80211_mgmt_tx()
5587 brcmf_fil_cmd_int_get(vif->ifp, BRCMF_C_GET_CHANNEL, in brcmf_cfg80211_mgmt_tx()
5590 af_params->channel = cpu_to_le32(chan_nr); in brcmf_cfg80211_mgmt_tx()
5591 af_params->dwell_time = cpu_to_le32(params->wait); in brcmf_cfg80211_mgmt_tx()
5592 memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN], in brcmf_cfg80211_mgmt_tx()
5593 le16_to_cpu(action_frame->len)); in brcmf_cfg80211_mgmt_tx()
5596 *cookie, le16_to_cpu(action_frame->len), freq); in brcmf_cfg80211_mgmt_tx()
5605 brcmf_dbg(TRACE, "Unhandled, fc=%04x!!\n", mgmt->frame_control); in brcmf_cfg80211_mgmt_tx()
5624 vif = ifp->vif; in brcmf_cfg80211_set_cqm_rssi_range_config()
5626 if (rssi_low != vif->cqm_rssi_low || rssi_high != vif->cqm_rssi_high) { in brcmf_cfg80211_set_cqm_rssi_range_config()
5637 clamp_val(rssi_low, S8_MIN, S8_MAX - 2), in brcmf_cfg80211_set_cqm_rssi_range_config()
5638 clamp_val(rssi_high, S8_MIN + 1, S8_MAX - 1), in brcmf_cfg80211_set_cqm_rssi_range_config()
5646 err = -EINVAL; in brcmf_cfg80211_set_cqm_rssi_range_config()
5648 vif->cqm_rssi_low = rssi_low; in brcmf_cfg80211_set_cqm_rssi_range_config()
5649 vif->cqm_rssi_high = rssi_high; in brcmf_cfg80211_set_cqm_rssi_range_config()
5662 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_cancel_remain_on_channel()
5668 vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif; in brcmf_cfg80211_cancel_remain_on_channel()
5671 err = -ENODEV; in brcmf_cfg80211_cancel_remain_on_channel()
5674 brcmf_p2p_cancel_remain_on_channel(vif->ifp); in brcmf_cfg80211_cancel_remain_on_channel()
5685 struct net_device *ndev = wdev->netdev; in brcmf_cfg80211_get_channel()
5686 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_get_channel()
5693 if (!ndev || drvr->bus_if->state != BRCMF_BUS_UP) in brcmf_cfg80211_get_channel()
5694 return -ENODEV; in brcmf_cfg80211_get_channel()
5703 cfg->d11inf.decchspec(&ch); in brcmf_cfg80211_get_channel()
5733 chandef->chan = ieee80211_get_channel(wiphy, freq); in brcmf_cfg80211_get_channel()
5734 chandef->width = width; in brcmf_cfg80211_get_channel()
5735 chandef->center_freq1 = ieee80211_channel_to_frequency(ch.chnum, band); in brcmf_cfg80211_get_channel()
5736 chandef->center_freq2 = 0; in brcmf_cfg80211_get_channel()
5753 return -EINVAL; in brcmf_cfg80211_crit_proto_start()
5756 set_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status); in brcmf_cfg80211_crit_proto_start()
5771 clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status); in brcmf_cfg80211_crit_proto_stop()
5778 switch (e->reason) { in brcmf_notify_tdls_peer_event()
5784 brcmf_proto_add_tdls_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr); in brcmf_notify_tdls_peer_event()
5788 brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr); in brcmf_notify_tdls_peer_event()
5811 ret = -EOPNOTSUPP; in brcmf_convert_nl80211_tdls_oper()
5821 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_tdls_oper()
5851 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_update_conn_params()
5859 err = brcmf_vif_set_mgmt_ie(ifp->vif, BRCMF_VNDR_IE_ASSOCREQ_FLAG, in brcmf_cfg80211_update_conn_params()
5860 sme->ie, sme->ie_len); in brcmf_cfg80211_update_conn_params()
5875 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_set_rekey_data()
5880 brcmf_dbg(TRACE, "Enter, bssidx=%d\n", ifp->bsscfgidx); in brcmf_cfg80211_set_rekey_data()
5882 memcpy(gtk_le.kck, gtk->kck, sizeof(gtk_le.kck)); in brcmf_cfg80211_set_rekey_data()
5883 memcpy(gtk_le.kek, gtk->kek, sizeof(gtk_le.kek)); in brcmf_cfg80211_set_rekey_data()
5884 memcpy(gtk_le.replay_counter, gtk->replay_ctr, in brcmf_cfg80211_set_rekey_data()
5905 if (WARN_ON(ifp->vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_1X)) in brcmf_cfg80211_set_pmk()
5906 return -EINVAL; in brcmf_cfg80211_set_pmk()
5908 if (conf->pmk_len > BRCMF_WSEC_MAX_PSK_LEN) in brcmf_cfg80211_set_pmk()
5909 return -ERANGE; in brcmf_cfg80211_set_pmk()
5911 return brcmf_set_pmk(ifp, conf->pmk, conf->pmk_len); in brcmf_cfg80211_set_pmk()
5921 if (WARN_ON(ifp->vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_1X)) in brcmf_cfg80211_del_pmk()
5922 return -EINVAL; in brcmf_cfg80211_del_pmk()
5983 if (ops && settings->roamoff) in brcmf_cfg80211_get_ops()
5984 ops->update_connect_params = NULL; in brcmf_cfg80211_get_ops()
5995 struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0); in brcmf_alloc_vif()
6001 return ERR_PTR(-ENOMEM); in brcmf_alloc_vif()
6003 vif->wdev.wiphy = cfg->wiphy; in brcmf_alloc_vif()
6004 vif->wdev.iftype = type; in brcmf_alloc_vif()
6006 brcmf_init_prof(&vif->profile); in brcmf_alloc_vif()
6011 list_for_each_entry(vif_walk, &cfg->vif_list, list) { in brcmf_alloc_vif()
6012 if (vif_walk->wdev.iftype == NL80211_IFTYPE_AP) { in brcmf_alloc_vif()
6017 vif->mbss = mbss; in brcmf_alloc_vif()
6020 list_add_tail(&vif->list, &cfg->vif_list); in brcmf_alloc_vif()
6026 list_del(&vif->list); in brcmf_free_vif()
6036 vif = ifp->vif; in brcmf_cfg80211_free_netdev()
6045 u32 event = e->event_code; in brcmf_is_linkup()
6046 u32 status = e->status; in brcmf_is_linkup()
6048 if ((vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_PSK || in brcmf_is_linkup()
6049 vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_SAE) && in brcmf_is_linkup()
6052 set_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state); in brcmf_is_linkup()
6055 memcpy(vif->profile.bssid, e->addr, ETH_ALEN); in brcmf_is_linkup()
6056 if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_PSK && in brcmf_is_linkup()
6057 vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_SAE) in brcmf_is_linkup()
6060 set_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state); in brcmf_is_linkup()
6063 if (test_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state) && in brcmf_is_linkup()
6064 test_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state)) { in brcmf_is_linkup()
6065 clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state); in brcmf_is_linkup()
6066 clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state); in brcmf_is_linkup()
6075 u32 event = e->event_code; in brcmf_is_linkdown()
6076 u16 flags = e->flags; in brcmf_is_linkdown()
6082 clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state); in brcmf_is_linkdown()
6083 clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state); in brcmf_is_linkdown()
6092 u32 event = e->event_code; in brcmf_is_nonetwork()
6093 u32 status = e->status; in brcmf_is_nonetwork()
6097 e->flags & BRCMF_EVENT_MSG_LINK ? "up" : "down"); in brcmf_is_nonetwork()
6120 kfree(conn_info->req_ie); in brcmf_clear_assoc_ies()
6121 conn_info->req_ie = NULL; in brcmf_clear_assoc_ies()
6122 conn_info->req_ie_len = 0; in brcmf_clear_assoc_ies()
6123 kfree(conn_info->resp_ie); in brcmf_clear_assoc_ies()
6124 conn_info->resp_ie = NULL; in brcmf_clear_assoc_ies()
6125 conn_info->resp_ie_len = 0; in brcmf_clear_assoc_ies()
6136 /* For those AC(s) with ACM flag set to 1, convert its 4-level priority in brcmf_map_prio_to_prec()
6137 * to an 8-level precedence which is the same as BE's in brcmf_map_prio_to_prec()
6140 cfg->ac_priority[prio] == cfg->ac_priority[PRIO_8021D_BE]) in brcmf_map_prio_to_prec()
6141 return cfg->ac_priority[prio] * 2; in brcmf_map_prio_to_prec()
6143 /* Conversion of 4-level priority to 8-level precedence */ in brcmf_map_prio_to_prec()
6146 return cfg->ac_priority[prio] * 2; in brcmf_map_prio_to_prec()
6148 return cfg->ac_priority[prio] * 2 + 1; in brcmf_map_prio_to_prec()
6160 return cfg->ac_priority[prio]; in brcmf_map_prio_to_aci()
6197 aifsn = acp->ACI & EDCF_AIFSN_MASK; in brcmf_wifi_prioritize_acparams()
6198 acm = (acp->ACI & EDCF_ACM_MASK) ? 1 : 0; in brcmf_wifi_prioritize_acparams()
6199 ecwmin = acp->ECW & EDCF_ECWMIN_MASK; in brcmf_wifi_prioritize_acparams()
6200 ecwmax = (acp->ECW & EDCF_ECWMAX_MASK) >> EDCF_ECWMAX_SHIFT; in brcmf_wifi_prioritize_acparams()
6234 * each 802.1d traffic type, in this range. in brcmf_wifi_prioritize_acparams()
6259 brcmf_dbg(CONN, "Adj prio BE 0->%d, BK 1->%d, BK 2->%d, BE 3->%d\n", in brcmf_wifi_prioritize_acparams()
6262 brcmf_dbg(CONN, "Adj prio VI 4->%d, VI 5->%d, VO 6->%d, VO 7->%d\n", in brcmf_wifi_prioritize_acparams()
6269 struct brcmf_pub *drvr = cfg->pub; in brcmf_get_assoc_ies()
6280 cfg->extra_buf, WL_ASSOC_INFO_MAX); in brcmf_get_assoc_ies()
6286 (struct brcmf_cfg80211_assoc_ielen_le *)cfg->extra_buf; in brcmf_get_assoc_ies()
6287 req_len = le32_to_cpu(assoc_info->req_len); in brcmf_get_assoc_ies()
6288 resp_len = le32_to_cpu(assoc_info->resp_len); in brcmf_get_assoc_ies()
6292 return -EINVAL; in brcmf_get_assoc_ies()
6296 cfg->extra_buf, in brcmf_get_assoc_ies()
6302 conn_info->req_ie_len = req_len; in brcmf_get_assoc_ies()
6303 conn_info->req_ie = in brcmf_get_assoc_ies()
6304 kmemdup(cfg->extra_buf, conn_info->req_ie_len, in brcmf_get_assoc_ies()
6306 if (!conn_info->req_ie) in brcmf_get_assoc_ies()
6307 conn_info->req_ie_len = 0; in brcmf_get_assoc_ies()
6309 conn_info->req_ie_len = 0; in brcmf_get_assoc_ies()
6310 conn_info->req_ie = NULL; in brcmf_get_assoc_ies()
6314 cfg->extra_buf, in brcmf_get_assoc_ies()
6320 conn_info->resp_ie_len = resp_len; in brcmf_get_assoc_ies()
6321 conn_info->resp_ie = in brcmf_get_assoc_ies()
6322 kmemdup(cfg->extra_buf, conn_info->resp_ie_len, in brcmf_get_assoc_ies()
6324 if (!conn_info->resp_ie) in brcmf_get_assoc_ies()
6325 conn_info->resp_ie_len = 0; in brcmf_get_assoc_ies()
6336 cfg->ac_priority); in brcmf_get_assoc_ies()
6338 conn_info->resp_ie_len = 0; in brcmf_get_assoc_ies()
6339 conn_info->resp_ie = NULL; in brcmf_get_assoc_ies()
6342 conn_info->req_ie_len, conn_info->resp_ie_len); in brcmf_get_assoc_ies()
6353 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_bss_roaming_done()
6368 memcpy(profile->bssid, e->addr, ETH_ALEN); in brcmf_bss_roaming_done()
6373 err = -ENOMEM; in brcmf_bss_roaming_done()
6386 ch.chspec = le16_to_cpu(bi->chanspec); in brcmf_bss_roaming_done()
6387 cfg->d11inf.decchspec(&ch); in brcmf_bss_roaming_done()
6390 band = wiphy->bands[NL80211_BAND_2GHZ]; in brcmf_bss_roaming_done()
6392 band = wiphy->bands[NL80211_BAND_5GHZ]; in brcmf_bss_roaming_done()
6394 freq = ieee80211_channel_to_frequency(ch.control_ch_num, band->band); in brcmf_bss_roaming_done()
6401 roam_info.links[0].bssid = profile->bssid; in brcmf_bss_roaming_done()
6402 roam_info.req_ie = conn_info->req_ie; in brcmf_bss_roaming_done()
6403 roam_info.req_ie_len = conn_info->req_ie_len; in brcmf_bss_roaming_done()
6404 roam_info.resp_ie = conn_info->resp_ie; in brcmf_bss_roaming_done()
6405 roam_info.resp_ie_len = conn_info->resp_ie_len; in brcmf_bss_roaming_done()
6410 if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X && profile->is_ft) { in brcmf_bss_roaming_done()
6411 cfg80211_port_authorized(ndev, profile->bssid, NULL, 0, GFP_KERNEL); in brcmf_bss_roaming_done()
6415 set_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state); in brcmf_bss_roaming_done()
6426 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_bss_connect_done()
6433 &ifp->vif->sme_state)) { in brcmf_bss_connect_done()
6439 &ifp->vif->sme_state); in brcmf_bss_connect_done()
6443 &ifp->vif->sme_state); in brcmf_bss_connect_done()
6445 &ifp->vif->sme_state); in brcmf_bss_connect_done()
6448 conn_params.links[0].bssid = profile->bssid; in brcmf_bss_connect_done()
6449 conn_params.req_ie = conn_info->req_ie; in brcmf_bss_connect_done()
6450 conn_params.req_ie_len = conn_info->req_ie_len; in brcmf_bss_connect_done()
6451 conn_params.resp_ie = conn_info->resp_ie; in brcmf_bss_connect_done()
6452 conn_params.resp_ie_len = conn_info->resp_ie_len; in brcmf_bss_connect_done()
6454 brcmf_dbg(CONN, "Report connect result - connection %s\n", in brcmf_bss_connect_done()
6466 struct brcmf_pub *drvr = cfg->pub; in brcmf_notify_connect_status_ap()
6468 u32 event = e->event_code; in brcmf_notify_connect_status_ap()
6469 u32 reason = e->reason; in brcmf_notify_connect_status_ap()
6477 complete(&cfg->vif_disabled); in brcmf_notify_connect_status_ap()
6485 return -EINVAL; in brcmf_notify_connect_status_ap()
6490 return -ENOMEM; in brcmf_notify_connect_status_ap()
6492 sinfo->assoc_req_ies = data; in brcmf_notify_connect_status_ap()
6493 sinfo->assoc_req_ies_len = e->datalen; in brcmf_notify_connect_status_ap()
6495 sinfo->generation = generation; in brcmf_notify_connect_status_ap()
6496 cfg80211_new_sta(ndev, e->addr, sinfo, GFP_KERNEL); in brcmf_notify_connect_status_ap()
6502 cfg80211_del_sta(ndev, e->addr, GFP_KERNEL); in brcmf_notify_connect_status_ap()
6511 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_notify_connect_status()
6512 struct net_device *ndev = ifp->ndev; in brcmf_notify_connect_status()
6513 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; in brcmf_notify_connect_status()
6517 if ((e->event_code == BRCMF_E_DEAUTH) || in brcmf_notify_connect_status()
6518 (e->event_code == BRCMF_E_DEAUTH_IND) || in brcmf_notify_connect_status()
6519 (e->event_code == BRCMF_E_DISASSOC_IND) || in brcmf_notify_connect_status()
6520 ((e->event_code == BRCMF_E_LINK) && (!e->flags))) { in brcmf_notify_connect_status()
6521 brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr); in brcmf_notify_connect_status()
6524 if (brcmf_is_apmode(ifp->vif)) { in brcmf_notify_connect_status()
6526 } else if (brcmf_is_linkup(ifp->vif, e)) { in brcmf_notify_connect_status()
6528 if (brcmf_is_ibssmode(ifp->vif)) { in brcmf_notify_connect_status()
6529 brcmf_inform_ibss(cfg, ndev, e->addr); in brcmf_notify_connect_status()
6530 chan = ieee80211_get_channel(cfg->wiphy, cfg->channel); in brcmf_notify_connect_status()
6531 memcpy(profile->bssid, e->addr, ETH_ALEN); in brcmf_notify_connect_status()
6532 cfg80211_ibss_joined(ndev, e->addr, chan, GFP_KERNEL); in brcmf_notify_connect_status()
6534 &ifp->vif->sme_state); in brcmf_notify_connect_status()
6536 &ifp->vif->sme_state); in brcmf_notify_connect_status()
6540 } else if (brcmf_is_linkdown(ifp->vif, e)) { in brcmf_notify_connect_status()
6542 if (!brcmf_is_ibssmode(ifp->vif) && in brcmf_notify_connect_status()
6544 &ifp->vif->sme_state) || in brcmf_notify_connect_status()
6546 &ifp->vif->sme_state))) { in brcmf_notify_connect_status()
6548 &ifp->vif->sme_state) && in brcmf_notify_connect_status()
6549 memcmp(profile->bssid, e->addr, ETH_ALEN)) in brcmf_notify_connect_status()
6553 brcmf_link_down(ifp->vif, in brcmf_notify_connect_status()
6555 e->event_code & in brcmf_notify_connect_status()
6561 complete(&cfg->vif_disabled); in brcmf_notify_connect_status()
6565 if (brcmf_is_ibssmode(ifp->vif)) in brcmf_notify_connect_status()
6567 &ifp->vif->sme_state); in brcmf_notify_connect_status()
6579 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_notify_roaming_status()
6580 u32 event = e->event_code; in brcmf_notify_roaming_status()
6581 u32 status = e->status; in brcmf_notify_roaming_status()
6585 &ifp->vif->sme_state)) { in brcmf_notify_roaming_status()
6586 brcmf_bss_roaming_done(cfg, ifp->ndev, e); in brcmf_notify_roaming_status()
6588 brcmf_bss_connect_done(cfg, ifp->ndev, e, true); in brcmf_notify_roaming_status()
6600 u16 flags = e->flags; in brcmf_notify_mic_status()
6608 cfg80211_michael_mic_failure(ifp->ndev, (u8 *)&e->addr, key_type, -1, in brcmf_notify_mic_status()
6617 struct brcmf_cfg80211_vif *vif = ifp->vif; in brcmf_notify_rssi()
6622 if (e->datalen >= sizeof(*info)) { in brcmf_notify_rssi()
6623 rssi = be32_to_cpu(info->rssi); in brcmf_notify_rssi()
6624 snr = be32_to_cpu(info->snr); in brcmf_notify_rssi()
6625 noise = be32_to_cpu(info->noise); in brcmf_notify_rssi()
6626 } else if (e->datalen >= sizeof(rssi)) { in brcmf_notify_rssi()
6633 low = vif->cqm_rssi_low; in brcmf_notify_rssi()
6634 high = vif->cqm_rssi_high; in brcmf_notify_rssi()
6635 last = vif->cqm_rssi_last; in brcmf_notify_rssi()
6640 vif->cqm_rssi_last = rssi; in brcmf_notify_rssi()
6644 cfg80211_cqm_rssi_notify(ifp->ndev, in brcmf_notify_rssi()
6649 cfg80211_cqm_rssi_notify(ifp->ndev, in brcmf_notify_rssi()
6660 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_notify_vif_event()
6662 struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; in brcmf_notify_vif_event()
6666 ifevent->action, ifevent->flags, ifevent->ifidx, in brcmf_notify_vif_event()
6667 ifevent->bsscfgidx); in brcmf_notify_vif_event()
6669 spin_lock(&event->vif_event_lock); in brcmf_notify_vif_event()
6670 event->action = ifevent->action; in brcmf_notify_vif_event()
6671 vif = event->vif; in brcmf_notify_vif_event()
6673 switch (ifevent->action) { in brcmf_notify_vif_event()
6676 if (!cfg->vif_event.vif) { in brcmf_notify_vif_event()
6677 spin_unlock(&event->vif_event_lock); in brcmf_notify_vif_event()
6678 return -EBADF; in brcmf_notify_vif_event()
6681 ifp->vif = vif; in brcmf_notify_vif_event()
6682 vif->ifp = ifp; in brcmf_notify_vif_event()
6683 if (ifp->ndev) { in brcmf_notify_vif_event()
6684 vif->wdev.netdev = ifp->ndev; in brcmf_notify_vif_event()
6685 ifp->ndev->ieee80211_ptr = &vif->wdev; in brcmf_notify_vif_event()
6686 SET_NETDEV_DEV(ifp->ndev, wiphy_dev(cfg->wiphy)); in brcmf_notify_vif_event()
6688 spin_unlock(&event->vif_event_lock); in brcmf_notify_vif_event()
6689 wake_up(&event->vif_wq); in brcmf_notify_vif_event()
6693 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()
6701 wake_up(&event->vif_wq); in brcmf_notify_vif_event()
6705 spin_unlock(&event->vif_event_lock); in brcmf_notify_vif_event()
6708 return -EINVAL; in brcmf_notify_vif_event()
6713 conf->frag_threshold = (u32)-1; in brcmf_init_conf()
6714 conf->rts_threshold = (u32)-1; in brcmf_init_conf()
6715 conf->retry_short = (u32)-1; in brcmf_init_conf()
6716 conf->retry_long = (u32)-1; in brcmf_init_conf()
6721 brcmf_fweh_register(cfg->pub, BRCMF_E_LINK, in brcmf_register_event_handlers()
6723 brcmf_fweh_register(cfg->pub, BRCMF_E_DEAUTH_IND, in brcmf_register_event_handlers()
6725 brcmf_fweh_register(cfg->pub, BRCMF_E_DEAUTH, in brcmf_register_event_handlers()
6727 brcmf_fweh_register(cfg->pub, BRCMF_E_DISASSOC_IND, in brcmf_register_event_handlers()
6729 brcmf_fweh_register(cfg->pub, BRCMF_E_ASSOC_IND, in brcmf_register_event_handlers()
6731 brcmf_fweh_register(cfg->pub, BRCMF_E_REASSOC_IND, in brcmf_register_event_handlers()
6733 brcmf_fweh_register(cfg->pub, BRCMF_E_ROAM, in brcmf_register_event_handlers()
6735 brcmf_fweh_register(cfg->pub, BRCMF_E_MIC_ERROR, in brcmf_register_event_handlers()
6737 brcmf_fweh_register(cfg->pub, BRCMF_E_SET_SSID, in brcmf_register_event_handlers()
6739 brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND, in brcmf_register_event_handlers()
6741 brcmf_fweh_register(cfg->pub, BRCMF_E_IF, in brcmf_register_event_handlers()
6743 brcmf_fweh_register(cfg->pub, BRCMF_E_P2P_PROBEREQ_MSG, in brcmf_register_event_handlers()
6745 brcmf_fweh_register(cfg->pub, BRCMF_E_P2P_DISC_LISTEN_COMPLETE, in brcmf_register_event_handlers()
6747 brcmf_fweh_register(cfg->pub, BRCMF_E_ACTION_FRAME_RX, in brcmf_register_event_handlers()
6749 brcmf_fweh_register(cfg->pub, BRCMF_E_ACTION_FRAME_COMPLETE, in brcmf_register_event_handlers()
6751 brcmf_fweh_register(cfg->pub, BRCMF_E_ACTION_FRAME_OFF_CHAN_COMPLETE, in brcmf_register_event_handlers()
6753 brcmf_fweh_register(cfg->pub, BRCMF_E_PSK_SUP, in brcmf_register_event_handlers()
6755 brcmf_fweh_register(cfg->pub, BRCMF_E_RSSI, brcmf_notify_rssi); in brcmf_register_event_handlers()
6760 kfree(cfg->conf); in brcmf_deinit_priv_mem()
6761 cfg->conf = NULL; in brcmf_deinit_priv_mem()
6762 kfree(cfg->extra_buf); in brcmf_deinit_priv_mem()
6763 cfg->extra_buf = NULL; in brcmf_deinit_priv_mem()
6764 kfree(cfg->wowl.nd); in brcmf_deinit_priv_mem()
6765 cfg->wowl.nd = NULL; in brcmf_deinit_priv_mem()
6766 kfree(cfg->wowl.nd_info); in brcmf_deinit_priv_mem()
6767 cfg->wowl.nd_info = NULL; in brcmf_deinit_priv_mem()
6768 kfree(cfg->escan_info.escan_buf); in brcmf_deinit_priv_mem()
6769 cfg->escan_info.escan_buf = NULL; in brcmf_deinit_priv_mem()
6774 cfg->conf = kzalloc(sizeof(*cfg->conf), GFP_KERNEL); in brcmf_init_priv_mem()
6775 if (!cfg->conf) in brcmf_init_priv_mem()
6777 cfg->extra_buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL); in brcmf_init_priv_mem()
6778 if (!cfg->extra_buf) in brcmf_init_priv_mem()
6780 cfg->wowl.nd = kzalloc(sizeof(*cfg->wowl.nd) + sizeof(u32), GFP_KERNEL); in brcmf_init_priv_mem()
6781 if (!cfg->wowl.nd) in brcmf_init_priv_mem()
6783 cfg->wowl.nd_info = kzalloc(sizeof(*cfg->wowl.nd_info) + in brcmf_init_priv_mem()
6786 if (!cfg->wowl.nd_info) in brcmf_init_priv_mem()
6788 cfg->escan_info.escan_buf = kzalloc(BRCMF_ESCAN_BUF_SIZE, GFP_KERNEL); in brcmf_init_priv_mem()
6789 if (!cfg->escan_info.escan_buf) in brcmf_init_priv_mem()
6797 return -ENOMEM; in brcmf_init_priv_mem()
6804 cfg->scan_request = NULL; in wl_init_priv()
6805 cfg->pwr_save = true; in wl_init_priv()
6806 cfg->dongle_up = false; /* dongle is not up yet */ in wl_init_priv()
6811 mutex_init(&cfg->usr_sync); in wl_init_priv()
6813 brcmf_init_conf(cfg->conf); in wl_init_priv()
6814 brcmf_init_wmm_prio(cfg->ac_priority); in wl_init_priv()
6815 init_completion(&cfg->vif_disabled); in wl_init_priv()
6821 cfg->dongle_up = false; /* dongle down */ in wl_deinit_priv()
6829 init_waitqueue_head(&event->vif_wq); in init_vif_event()
6830 spin_lock_init(&event->vif_event_lock); in init_vif_event()
6835 struct brcmf_pub *drvr = ifp->drvr; in brcmf_dongle_roam()
6842 if (ifp->drvr->settings->roamoff) in brcmf_dongle_roam()
6852 /* Enable/Disable built-in roaming to allow supplicant to take care of in brcmf_dongle_roam()
6856 ifp->drvr->settings->roamoff ? "Off" : "On"); in brcmf_dongle_roam()
6858 ifp->drvr->settings->roamoff); in brcmf_dongle_roam()
6887 struct brcmf_pub *drvr = ifp->drvr; in brcmf_dongle_scantime()
6919 ht40_flag = channel->flags & IEEE80211_CHAN_NO_HT40; in brcmf_update_bw40_channel_flag()
6920 if (ch->sb == BRCMU_CHAN_SB_U) { in brcmf_update_bw40_channel_flag()
6922 channel->flags &= ~IEEE80211_CHAN_NO_HT40; in brcmf_update_bw40_channel_flag()
6923 channel->flags |= IEEE80211_CHAN_NO_HT40PLUS; in brcmf_update_bw40_channel_flag()
6929 channel->flags &= ~IEEE80211_CHAN_NO_HT40; in brcmf_update_bw40_channel_flag()
6931 channel->flags |= IEEE80211_CHAN_NO_HT40MINUS; in brcmf_update_bw40_channel_flag()
6939 struct brcmf_pub *drvr = cfg->pub; in brcmf_construct_chaninfo()
6954 return -ENOMEM; in brcmf_construct_chaninfo()
6965 band = wiphy->bands[NL80211_BAND_2GHZ]; in brcmf_construct_chaninfo()
6967 for (i = 0; i < band->n_channels; i++) in brcmf_construct_chaninfo()
6968 band->channels[i].flags = IEEE80211_CHAN_DISABLED; in brcmf_construct_chaninfo()
6969 band = wiphy->bands[NL80211_BAND_5GHZ]; in brcmf_construct_chaninfo()
6971 for (i = 0; i < band->n_channels; i++) in brcmf_construct_chaninfo()
6972 band->channels[i].flags = IEEE80211_CHAN_DISABLED; in brcmf_construct_chaninfo()
6974 total = le32_to_cpu(list->count); in brcmf_construct_chaninfo()
6978 err = -EINVAL; in brcmf_construct_chaninfo()
6983 ch.chspec = (u16)le32_to_cpu(list->element[i]); in brcmf_construct_chaninfo()
6984 cfg->d11inf.decchspec(&ch); in brcmf_construct_chaninfo()
6987 band = wiphy->bands[NL80211_BAND_2GHZ]; in brcmf_construct_chaninfo()
6989 band = wiphy->bands[NL80211_BAND_5GHZ]; in brcmf_construct_chaninfo()
6997 if (!(bw_cap[band->band] & WLC_BW_40MHZ_BIT) && in brcmf_construct_chaninfo()
7000 if (!(bw_cap[band->band] & WLC_BW_80MHZ_BIT) && in brcmf_construct_chaninfo()
7005 for (j = 0; j < band->n_channels; j++) { in brcmf_construct_chaninfo()
7006 if (band->channels[j].hw_value == ch.control_ch_num) { in brcmf_construct_chaninfo()
7007 channel = &band->channels[j]; in brcmf_construct_chaninfo()
7020 if (channel->orig_flags & IEEE80211_CHAN_DISABLED) in brcmf_construct_chaninfo()
7028 channel->flags &= ~IEEE80211_CHAN_NO_160MHZ; in brcmf_construct_chaninfo()
7031 channel->flags &= ~IEEE80211_CHAN_NO_80MHZ; in brcmf_construct_chaninfo()
7045 channel->flags = IEEE80211_CHAN_NO_HT40 | in brcmf_construct_chaninfo()
7049 cfg->d11inf.encchspec(&ch); in brcmf_construct_chaninfo()
7055 channel->flags |= in brcmf_construct_chaninfo()
7059 channel->flags |= in brcmf_construct_chaninfo()
7072 struct brcmf_pub *drvr = cfg->pub; in brcmf_enable_bw40_2g()
7105 return -ENOMEM; in brcmf_enable_bw40_2g()
7111 cfg->d11inf.encchspec(&ch); in brcmf_enable_bw40_2g()
7124 band = cfg_to_wiphy(cfg)->bands[NL80211_BAND_2GHZ]; in brcmf_enable_bw40_2g()
7126 num_chan = le32_to_cpu(list->count); in brcmf_enable_bw40_2g()
7131 return -EINVAL; in brcmf_enable_bw40_2g()
7135 ch.chspec = (u16)le32_to_cpu(list->element[i]); in brcmf_enable_bw40_2g()
7136 cfg->d11inf.decchspec(&ch); in brcmf_enable_bw40_2g()
7141 for (j = 0; j < band->n_channels; j++) { in brcmf_enable_bw40_2g()
7142 if (band->channels[j].hw_value == ch.control_ch_num) in brcmf_enable_bw40_2g()
7145 if (WARN_ON(j == band->n_channels)) in brcmf_enable_bw40_2g()
7148 brcmf_update_bw40_channel_flag(&band->channels[j], &ch); in brcmf_enable_bw40_2g()
7157 struct brcmf_pub *drvr = ifp->drvr; in brcmf_get_bwcap()
7200 band->ht_cap.ht_supported = true; in brcmf_update_ht_cap()
7201 if (bw_cap[band->band] & WLC_BW_40MHZ_BIT) { in brcmf_update_ht_cap()
7202 band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; in brcmf_update_ht_cap()
7203 band->ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; in brcmf_update_ht_cap()
7205 band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_20; in brcmf_update_ht_cap()
7206 band->ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40; in brcmf_update_ht_cap()
7207 band->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; in brcmf_update_ht_cap()
7208 band->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; in brcmf_update_ht_cap()
7209 memset(band->ht_cap.mcs.rx_mask, 0xff, nchain); in brcmf_update_ht_cap()
7210 band->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; in brcmf_update_ht_cap()
7231 if (band->band == NL80211_BAND_2GHZ) in brcmf_update_vht_cap()
7234 band->vht_cap.vht_supported = true; in brcmf_update_vht_cap()
7236 band->vht_cap.cap |= IEEE80211_VHT_CAP_SHORT_GI_80; in brcmf_update_vht_cap()
7237 if (bw_cap[band->band] & WLC_BW_160MHZ_BIT) { in brcmf_update_vht_cap()
7238 band->vht_cap.cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ; in brcmf_update_vht_cap()
7239 band->vht_cap.cap |= IEEE80211_VHT_CAP_SHORT_GI_160; in brcmf_update_vht_cap()
7241 /* all support 256-QAM */ in brcmf_update_vht_cap()
7243 band->vht_cap.vht_mcs.rx_mcs_map = mcs_map; in brcmf_update_vht_cap()
7244 band->vht_cap.vht_mcs.tx_mcs_map = mcs_map; in brcmf_update_vht_cap()
7248 band->vht_cap.cap |= IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE; in brcmf_update_vht_cap()
7250 band->vht_cap.cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE; in brcmf_update_vht_cap()
7252 band->vht_cap.cap |= IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE; in brcmf_update_vht_cap()
7254 band->vht_cap.cap |= IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE; in brcmf_update_vht_cap()
7257 band->vht_cap.cap |= in brcmf_update_vht_cap()
7259 band->vht_cap.cap |= ((txstreams - 1) << in brcmf_update_vht_cap()
7261 band->vht_cap.cap |= in brcmf_update_vht_cap()
7268 struct brcmf_pub *drvr = cfg->pub; in brcmf_setup_wiphybands()
7297 if (err == -EBADE) in brcmf_setup_wiphybands()
7305 rxchain = rxchain & (rxchain - 1); in brcmf_setup_wiphybands()
7323 for (i = 0; i < ARRAY_SIZE(wiphy->bands); i++) { in brcmf_setup_wiphybands()
7324 band = wiphy->bands[i]; in brcmf_setup_wiphybands()
7378 * brcmf_setup_ifmodes() - determine interface modes and combinations.
7400 * #STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 1, 3 total
7401 * #STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
7406 * #STA <= 2, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
7407 * #STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
7411 * #STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 2, AP <= 2,
7434 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in brcmf_setup_ifmodes()
7438 wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR); in brcmf_setup_ifmodes()
7440 wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) | in brcmf_setup_ifmodes()
7524 wiphy->n_iface_combinations = n_combos; in brcmf_setup_ifmodes()
7525 wiphy->iface_combinations = combo; in brcmf_setup_ifmodes()
7533 return -ENOMEM; in brcmf_setup_ifmodes()
7550 struct brcmf_pub *drvr = cfg->pub; in brcmf_wiphy_wowl_params()
7557 wiphy->wowlan = &brcmf_wowlan_support; in brcmf_wiphy_wowl_params()
7563 wowl->flags |= WIPHY_WOWLAN_NET_DETECT; in brcmf_wiphy_wowl_params()
7564 wowl->max_nd_match_sets = BRCMF_PNO_MAX_PFN_COUNT; in brcmf_wiphy_wowl_params()
7565 init_waitqueue_head(&cfg->wowl.nd_data_wait); in brcmf_wiphy_wowl_params()
7569 wowl->flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY; in brcmf_wiphy_wowl_params()
7570 wowl->flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE; in brcmf_wiphy_wowl_params()
7573 wiphy->wowlan = wowl; in brcmf_wiphy_wowl_params()
7579 struct brcmf_pub *drvr = ifp->drvr; in brcmf_setup_wiphy()
7588 wiphy->max_scan_ssids = WL_NUM_SCAN_MAX; in brcmf_setup_wiphy()
7589 wiphy->max_scan_ie_len = BRCMF_SCAN_IE_LEN_MAX; in brcmf_setup_wiphy()
7590 wiphy->max_num_pmkids = BRCMF_MAXPMKID; in brcmf_setup_wiphy()
7596 for (i = 0, combo = wiphy->iface_combinations; in brcmf_setup_wiphy()
7597 i < wiphy->n_iface_combinations; i++, combo++) { in brcmf_setup_wiphy()
7598 max_interfaces = max(max_interfaces, combo->max_interfaces); in brcmf_setup_wiphy()
7601 for (i = 0; i < max_interfaces && i < ARRAY_SIZE(drvr->addresses); in brcmf_setup_wiphy()
7603 u8 *addr = drvr->addresses[i].addr; in brcmf_setup_wiphy()
7605 memcpy(addr, drvr->mac, ETH_ALEN); in brcmf_setup_wiphy()
7608 addr[ETH_ALEN - 1] ^= i; in brcmf_setup_wiphy()
7611 wiphy->addresses = drvr->addresses; in brcmf_setup_wiphy()
7612 wiphy->n_addresses = i; in brcmf_setup_wiphy()
7614 wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; in brcmf_setup_wiphy()
7615 wiphy->cipher_suites = brcmf_cipher_suites; in brcmf_setup_wiphy()
7616 wiphy->n_cipher_suites = ARRAY_SIZE(brcmf_cipher_suites); in brcmf_setup_wiphy()
7618 wiphy->n_cipher_suites--; in brcmf_setup_wiphy()
7619 wiphy->bss_select_support = BIT(NL80211_BSS_SELECT_ATTR_RSSI) | in brcmf_setup_wiphy()
7623 wiphy->flags |= WIPHY_FLAG_NETNS_OK | in brcmf_setup_wiphy()
7629 wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; in brcmf_setup_wiphy()
7630 if (!ifp->drvr->settings->roamoff) in brcmf_setup_wiphy()
7631 wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM; in brcmf_setup_wiphy()
7648 wiphy->mgmt_stypes = brcmf_txrx_stypes; in brcmf_setup_wiphy()
7649 wiphy->max_remain_on_channel_duration = 5000; in brcmf_setup_wiphy()
7655 wiphy->vendor_commands = brcmf_vendor_cmds; in brcmf_setup_wiphy()
7656 wiphy->n_vendor_commands = BRCMF_VNDR_CMDS_LAST - 1; in brcmf_setup_wiphy()
7673 return -ENOMEM; in brcmf_setup_wiphy()
7675 band->channels = kmemdup(&__wl_2ghz_channels, in brcmf_setup_wiphy()
7678 if (!band->channels) { in brcmf_setup_wiphy()
7680 return -ENOMEM; in brcmf_setup_wiphy()
7683 band->n_channels = ARRAY_SIZE(__wl_2ghz_channels); in brcmf_setup_wiphy()
7684 wiphy->bands[NL80211_BAND_2GHZ] = band; in brcmf_setup_wiphy()
7690 return -ENOMEM; in brcmf_setup_wiphy()
7692 band->channels = kmemdup(&__wl_5ghz_channels, in brcmf_setup_wiphy()
7695 if (!band->channels) { in brcmf_setup_wiphy()
7697 return -ENOMEM; in brcmf_setup_wiphy()
7700 band->n_channels = ARRAY_SIZE(__wl_5ghz_channels); in brcmf_setup_wiphy()
7701 wiphy->bands[NL80211_BAND_5GHZ] = band; in brcmf_setup_wiphy()
7705 if (wiphy->bands[NL80211_BAND_5GHZ] && in brcmf_setup_wiphy()
7719 struct brcmf_pub *drvr = cfg->pub; in brcmf_config_dongle()
7726 if (cfg->dongle_up) in brcmf_config_dongle()
7730 wdev = ndev->ieee80211_ptr; in brcmf_config_dongle()
7738 power_mode = cfg->pwr_save ? PM_FAST : PM_OFF; in brcmf_config_dongle()
7748 err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype, in brcmf_config_dongle()
7761 cfg->dongle_up = true; in brcmf_config_dongle()
7770 set_bit(BRCMF_VIF_STATUS_READY, &ifp->vif->sme_state); in __brcmf_cfg80211_up()
7772 return brcmf_config_dongle(ifp->drvr->config); in __brcmf_cfg80211_up()
7777 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in __brcmf_cfg80211_down()
7783 if (check_vif_up(ifp->vif)) { in __brcmf_cfg80211_down()
7784 brcmf_link_down(ifp->vif, WLAN_REASON_UNSPECIFIED, true); in __brcmf_cfg80211_down()
7794 clear_bit(BRCMF_VIF_STATUS_READY, &ifp->vif->sme_state); in __brcmf_cfg80211_down()
7802 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_cfg80211_up()
7805 mutex_lock(&cfg->usr_sync); in brcmf_cfg80211_up()
7807 mutex_unlock(&cfg->usr_sync); in brcmf_cfg80211_up()
7815 struct brcmf_cfg80211_info *cfg = ifp->drvr->config; in brcmf_cfg80211_down()
7818 mutex_lock(&cfg->usr_sync); in brcmf_cfg80211_down()
7820 mutex_unlock(&cfg->usr_sync); in brcmf_cfg80211_down()
7827 struct wireless_dev *wdev = &ifp->vif->wdev; in brcmf_cfg80211_get_iftype()
7829 return wdev->iftype; in brcmf_cfg80211_get_iftype()
7837 list_for_each_entry(vif, &cfg->vif_list, list) { in brcmf_get_vif_state_any()
7838 if (test_bit(state, &vif->sme_state)) in brcmf_get_vif_state_any()
7849 spin_lock(&event->vif_event_lock); in vif_event_equals()
7850 evt_action = event->action; in vif_event_equals()
7851 spin_unlock(&event->vif_event_lock); in vif_event_equals()
7858 struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; in brcmf_cfg80211_arm_vif_event()
7860 spin_lock(&event->vif_event_lock); in brcmf_cfg80211_arm_vif_event()
7861 event->vif = vif; in brcmf_cfg80211_arm_vif_event()
7862 event->action = 0; in brcmf_cfg80211_arm_vif_event()
7863 spin_unlock(&event->vif_event_lock); in brcmf_cfg80211_arm_vif_event()
7868 struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; in brcmf_cfg80211_vif_event_armed()
7871 spin_lock(&event->vif_event_lock); in brcmf_cfg80211_vif_event_armed()
7872 armed = event->vif != NULL; in brcmf_cfg80211_vif_event_armed()
7873 spin_unlock(&event->vif_event_lock); in brcmf_cfg80211_vif_event_armed()
7881 struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; in brcmf_cfg80211_wait_vif_event()
7883 return wait_event_timeout(event->vif_wq, in brcmf_cfg80211_wait_vif_event()
7889 if (drvr->settings->trivial_ccode_map) in brmcf_use_iso3166_ccode_fallback()
7892 switch (drvr->bus_if->chip) { in brmcf_use_iso3166_ccode_fallback()
7911 if ((alpha2[0] == ccreq->country_abbrev[0]) && in brcmf_translate_country_code()
7912 (alpha2[1] == ccreq->country_abbrev[1])) { in brcmf_translate_country_code()
7914 return -EAGAIN; in brcmf_translate_country_code()
7917 country_codes = drvr->settings->country_codes; in brcmf_translate_country_code()
7922 ccreq->country_abbrev[0] = alpha2[0]; in brcmf_translate_country_code()
7923 ccreq->country_abbrev[1] = alpha2[1]; in brcmf_translate_country_code()
7924 ccreq->ccode[0] = alpha2[0]; in brcmf_translate_country_code()
7925 ccreq->ccode[1] = alpha2[1]; in brcmf_translate_country_code()
7930 return -EINVAL; in brcmf_translate_country_code()
7933 found_index = -1; in brcmf_translate_country_code()
7934 for (i = 0; i < country_codes->table_size; i++) { in brcmf_translate_country_code()
7935 cc = &country_codes->table[i]; in brcmf_translate_country_code()
7936 if ((cc->iso3166[0] == '\0') && (found_index == -1)) in brcmf_translate_country_code()
7938 if ((cc->iso3166[0] == alpha2[0]) && in brcmf_translate_country_code()
7939 (cc->iso3166[1] == alpha2[1])) { in brcmf_translate_country_code()
7944 if (found_index == -1) { in brcmf_translate_country_code()
7946 return -EINVAL; in brcmf_translate_country_code()
7949 ccreq->rev = cpu_to_le32(country_codes->table[found_index].rev); in brcmf_translate_country_code()
7950 memcpy(ccreq->ccode, country_codes->table[found_index].cc, in brcmf_translate_country_code()
7952 ccreq->country_abbrev[0] = alpha2[0]; in brcmf_translate_country_code()
7953 ccreq->country_abbrev[1] = alpha2[1]; in brcmf_translate_country_code()
7954 ccreq->country_abbrev[2] = 0; in brcmf_translate_country_code()
7976 survey->obss = val; in brcmf_parse_dump_obss()
7985 survey->ibss = val; in brcmf_parse_dump_obss()
7994 survey->tx = val; in brcmf_parse_dump_obss()
8003 survey->no_ctg = val; in brcmf_parse_dump_obss()
8012 survey->no_pckt = val; in brcmf_parse_dump_obss()
8021 survey->idle = val; in brcmf_parse_dump_obss()
8040 return -ENOMEM; in brcmf_dump_obss()
8047 err = -EINVAL; in brcmf_dump_obss()
8053 brcmf_parse_dump_obss(results->buf, survey); in brcmf_dump_obss()
8067 if (chan->flags & IEEE80211_CHAN_DISABLED) in brcmf_set_channel()
8068 return -EINVAL; in brcmf_set_channel()
8071 chspec = channel_to_chanspec(&cfg->d11inf, chan); in brcmf_set_channel()
8076 err = -EINVAL; in brcmf_set_channel()
8080 err = -EINVAL; in brcmf_set_channel()
8102 if ((test_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state)) || in brcmf_cfg80211_dump_survey()
8103 (test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state))) { in brcmf_cfg80211_dump_survey()
8104 return -EBUSY; in brcmf_cfg80211_dump_survey()
8108 band = wiphy->bands[band_id]; in brcmf_cfg80211_dump_survey()
8111 if (idx >= band->n_channels) { in brcmf_cfg80211_dump_survey()
8112 idx -= band->n_channels; in brcmf_cfg80211_dump_survey()
8116 info->channel = &band->channels[idx]; in brcmf_cfg80211_dump_survey()
8120 return -ENOENT; in brcmf_cfg80211_dump_survey()
8123 info->filled = 0; in brcmf_cfg80211_dump_survey()
8124 if (brcmf_set_channel(cfg, info->channel)) in brcmf_cfg80211_dump_survey()
8160 info->noise = noise; in brcmf_cfg80211_dump_survey()
8161 info->time = ACS_MSRMNT_DELAY; in brcmf_cfg80211_dump_survey()
8162 info->time_busy = ACS_MSRMNT_DELAY - survey.idle; in brcmf_cfg80211_dump_survey()
8163 info->time_rx = survey.obss + survey.ibss + survey.no_ctg + in brcmf_cfg80211_dump_survey()
8165 info->time_tx = survey.tx; in brcmf_cfg80211_dump_survey()
8166 info->filled = SURVEY_INFO_NOISE_DBM | SURVEY_INFO_TIME | in brcmf_cfg80211_dump_survey()
8171 ieee80211_frequency_to_channel(info->channel->center_freq), in brcmf_cfg80211_dump_survey()
8174 info->noise, info->time_busy, info->time_rx, info->time_tx); in brcmf_cfg80211_dump_survey()
8177 if (!brcmf_is_apmode(ifp->vif)) in brcmf_cfg80211_dump_survey()
8186 struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0); in brcmf_cfg80211_reg_notifier()
8187 struct brcmf_pub *drvr = cfg->pub; in brcmf_cfg80211_reg_notifier()
8193 if (req->alpha2[0] == '0' && req->alpha2[1] == '0') in brcmf_cfg80211_reg_notifier()
8196 /* ignore non-ISO3166 country codes */ in brcmf_cfg80211_reg_notifier()
8198 if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') { in brcmf_cfg80211_reg_notifier()
8200 req->alpha2[0], req->alpha2[1]); in brcmf_cfg80211_reg_notifier()
8204 brcmf_dbg(TRACE, "Enter: initiator=%d, alpha=%c%c\n", req->initiator, in brcmf_cfg80211_reg_notifier()
8205 req->alpha2[0], req->alpha2[1]); in brcmf_cfg80211_reg_notifier()
8213 err = brcmf_translate_country_code(ifp->drvr, req->alpha2, &ccreq); in brcmf_cfg80211_reg_notifier()
8232 if (wiphy->iface_combinations) { in brcmf_free_wiphy()
8233 for (i = 0; i < wiphy->n_iface_combinations; i++) in brcmf_free_wiphy()
8234 kfree(wiphy->iface_combinations[i].limits); in brcmf_free_wiphy()
8236 kfree(wiphy->iface_combinations); in brcmf_free_wiphy()
8237 if (wiphy->bands[NL80211_BAND_2GHZ]) { in brcmf_free_wiphy()
8238 kfree(wiphy->bands[NL80211_BAND_2GHZ]->channels); in brcmf_free_wiphy()
8239 kfree(wiphy->bands[NL80211_BAND_2GHZ]); in brcmf_free_wiphy()
8241 if (wiphy->bands[NL80211_BAND_5GHZ]) { in brcmf_free_wiphy()
8242 kfree(wiphy->bands[NL80211_BAND_5GHZ]->channels); in brcmf_free_wiphy()
8243 kfree(wiphy->bands[NL80211_BAND_5GHZ]); in brcmf_free_wiphy()
8246 if (wiphy->wowlan != &brcmf_wowlan_support) in brcmf_free_wiphy()
8247 kfree(wiphy->wowlan); in brcmf_free_wiphy()
8255 struct wiphy *wiphy = drvr->wiphy; in brcmf_cfg80211_attach()
8256 struct net_device *ndev = brcmf_get_ifp(drvr, 0)->ndev; in brcmf_cfg80211_attach()
8275 cfg->wiphy = wiphy; in brcmf_cfg80211_attach()
8276 cfg->pub = drvr; in brcmf_cfg80211_attach()
8277 init_vif_event(&cfg->vif_event); in brcmf_cfg80211_attach()
8278 INIT_LIST_HEAD(&cfg->vif_list); in brcmf_cfg80211_attach()
8285 vif->ifp = ifp; in brcmf_cfg80211_attach()
8286 vif->wdev.netdev = ndev; in brcmf_cfg80211_attach()
8287 ndev->ieee80211_ptr = &vif->wdev; in brcmf_cfg80211_attach()
8288 SET_NETDEV_DEV(ndev, wiphy_dev(cfg->wiphy)); in brcmf_cfg80211_attach()
8296 ifp->vif = vif; in brcmf_cfg80211_attach()
8304 cfg->d11inf.io_type = (u8)io_type; in brcmf_cfg80211_attach()
8305 brcmu_d11_attach(&cfg->d11inf); in brcmf_cfg80211_attach()
8310 drvr->config = cfg; in brcmf_cfg80211_attach()
8317 wiphy->reg_notifier = brcmf_cfg80211_reg_notifier; in brcmf_cfg80211_attach()
8318 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG; in brcmf_cfg80211_attach()
8325 if (wiphy->bands[NL80211_BAND_2GHZ]) { in brcmf_cfg80211_attach()
8326 cap = &wiphy->bands[NL80211_BAND_2GHZ]->ht_cap.cap; in brcmf_cfg80211_attach()
8331 ops->set_rekey_data = brcmf_cfg80211_set_rekey_data; in brcmf_cfg80211_attach()
8334 ops->dump_survey = brcmf_cfg80211_dump_survey; in brcmf_cfg80211_attach()
8373 bphy_err(drvr, "BT-coex initialisation failed (%d)\n", err); in brcmf_cfg80211_attach()
8374 brcmf_p2p_detach(&cfg->p2p); in brcmf_cfg80211_attach()
8381 brcmf_p2p_detach(&cfg->p2p); in brcmf_cfg80211_attach()
8389 wiphy->flags &= ~WIPHY_FLAG_SUPPORTS_TDLS; in brcmf_cfg80211_attach()
8391 brcmf_fweh_register(cfg->pub, BRCMF_E_TDLS_PEER_EVENT, in brcmf_cfg80211_attach()
8396 /* (re-) activate FWEH event handling */ in brcmf_cfg80211_attach()
8405 wiphy->features |= NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR; in brcmf_cfg80211_attach()
8407 if (wiphy->wowlan && in brcmf_cfg80211_attach()
8408 wiphy->wowlan->flags & WIPHY_WOWLAN_NET_DETECT) in brcmf_cfg80211_attach()
8409 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; in brcmf_cfg80211_attach()
8418 brcmf_p2p_detach(&cfg->p2p); in brcmf_cfg80211_attach()
8420 wiphy_unregister(cfg->wiphy); in brcmf_cfg80211_attach()
8424 ifp->vif = NULL; in brcmf_cfg80211_attach()
8438 wiphy_unregister(cfg->wiphy); in brcmf_cfg80211_detach()
8440 brcmf_free_wiphy(cfg->wiphy); in brcmf_cfg80211_detach()