Lines Matching +full:combo +full:- +full:phy
1 // SPDX-License-Identifier: ISC
3 * Copyright (c) 2012-2017 Qualcomm Atheros, Inc.
4 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
109 if (!test_bit(WMI_FW_CAPABILITY_CHANNEL_4, wil->fw_capabilities)) in wil_num_supported_channels()
110 num_channels--; in wil_num_supported_channels()
121 wiphy->bands[NL80211_BAND_60GHZ]->n_channels = in update_supported_bands()
124 if (test_bit(WMI_FW_CAPABILITY_CHANNEL_BONDING, wil->fw_capabilities)) { in update_supported_bands()
125 wiphy->bands[NL80211_BAND_60GHZ]->edmg_cap.channels = in update_supported_bands()
127 wiphy->bands[NL80211_BAND_60GHZ]->edmg_cap.bw_config = in update_supported_bands()
136 * qca_wlan_vendor_attr is open source file src/common/qca-vendor.h in
175 QCA_ATTR_DMG_RF_SECTOR_CFG_AFTER_LAST - 1
265 /* MCS 1..12 - SC PHY */
347 return -EOPNOTSUPP; in wil_iftype_nl2wmi()
384 return -EINVAL; in wil_spec2wmi_ch()
424 return -EINVAL; in wil_wmi2spec_ch()
442 struct wil_net_stats *stats = &wil->sta[cid].stats; in wil_cid_fill_sinfo()
448 rc = wmi_call(wil, WMI_NOTIFY_REQ_CMDID, vif->mid, &cmd, sizeof(cmd), in wil_cid_fill_sinfo()
460 cid, vif->mid, le16_to_cpu(reply.evt.bf_mcs), in wil_cid_fill_sinfo()
473 sinfo->generation = wil->sinfo_gen; in wil_cid_fill_sinfo()
475 sinfo->filled = BIT_ULL(NL80211_STA_INFO_RX_BYTES) | in wil_cid_fill_sinfo()
484 if (wil->use_enhanced_dma_hw && reply.evt.tx_mode != WMI_TX_MODE_DMG) in wil_cid_fill_sinfo()
487 sinfo->txrate.flags = txflag; in wil_cid_fill_sinfo()
488 sinfo->txrate.mcs = le16_to_cpu(reply.evt.bf_mcs); in wil_cid_fill_sinfo()
489 sinfo->rxrate.mcs = stats->last_mcs_rx; in wil_cid_fill_sinfo()
490 sinfo->txrate.n_bonded_ch = in wil_cid_fill_sinfo()
492 sinfo->rxrate.n_bonded_ch = in wil_cid_fill_sinfo()
493 wil_rx_cb_mode_to_n_bonded(stats->last_cb_mode_rx); in wil_cid_fill_sinfo()
494 sinfo->rx_bytes = stats->rx_bytes; in wil_cid_fill_sinfo()
495 sinfo->rx_packets = stats->rx_packets; in wil_cid_fill_sinfo()
496 sinfo->rx_dropped_misc = stats->rx_dropped; in wil_cid_fill_sinfo()
497 sinfo->tx_bytes = stats->tx_bytes; in wil_cid_fill_sinfo()
498 sinfo->tx_packets = stats->tx_packets; in wil_cid_fill_sinfo()
499 sinfo->tx_failed = stats->tx_errors; in wil_cid_fill_sinfo()
501 if (test_bit(wil_vif_fwconnected, vif->status)) { in wil_cid_fill_sinfo()
502 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in wil_cid_fill_sinfo()
504 wil->fw_capabilities)) in wil_cid_fill_sinfo()
505 sinfo->signal = reply.evt.rssi; in wil_cid_fill_sinfo()
507 sinfo->signal = reply.evt.sqi; in wil_cid_fill_sinfo()
521 int cid = wil_find_cid(wil, vif->mid, mac); in wil_cfg80211_get_station()
524 vif->mid); in wil_cfg80211_get_station()
526 return -ENOENT; in wil_cfg80211_get_station()
534 * Find @idx-th active STA for specific MID for station dump.
540 for (i = 0; i < wil->max_assoc_sta; i++) { in wil_find_cid_by_idx()
541 if (wil->sta[i].status == wil_sta_unused) in wil_find_cid_by_idx()
543 if (wil->sta[i].mid != mid) in wil_find_cid_by_idx()
547 idx--; in wil_find_cid_by_idx()
550 return -ENOENT; in wil_find_cid_by_idx()
560 int cid = wil_find_cid_by_idx(wil, vif->mid, idx); in wil_cfg80211_dump_station()
563 return -ENOENT; in wil_cfg80211_dump_station()
565 ether_addr_copy(mac, wil->sta[cid].addr); in wil_cfg80211_dump_station()
567 vif->mid); in wil_cfg80211_dump_station()
580 wil->p2p_dev_started = 1; in wil_cfg80211_start_p2p_device()
589 if (!wil->p2p_dev_started) in wil_cfg80211_stop_p2p_device()
593 mutex_lock(&wil->mutex); in wil_cfg80211_stop_p2p_device()
594 mutex_lock(&wil->vif_mutex); in wil_cfg80211_stop_p2p_device()
596 wil->p2p_dev_started = 0; in wil_cfg80211_stop_p2p_device()
597 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_stop_p2p_device()
598 mutex_unlock(&wil->mutex); in wil_cfg80211_stop_p2p_device()
611 if (wil->vifs[i]) { in wil_cfg80211_validate_add_iface()
612 wdev = vif_to_wdev(wil->vifs[i]); in wil_cfg80211_validate_add_iface()
613 params.iftype_num[wdev->iftype]++; in wil_cfg80211_validate_add_iface()
617 return cfg80211_check_combinations(wil->wiphy, ¶ms); in wil_cfg80211_validate_add_iface()
632 struct wil6210_vif *vif_pos = wil->vifs[i]; in wil_cfg80211_validate_change_iface()
636 params.iftype_num[wdev->iftype]++; in wil_cfg80211_validate_change_iface()
643 ret = cfg80211_check_combinations(wil->wiphy, ¶ms); in wil_cfg80211_validate_change_iface()
655 struct net_device *ndev_main = wil->main_ndev, *ndev; in wil_cfg80211_add_iface()
662 /* P2P device is not a real virtual interface, it is a management-only in wil_cfg80211_add_iface()
667 if (wil->p2p_wdev) { in wil_cfg80211_add_iface()
669 return ERR_PTR(-EINVAL); in wil_cfg80211_add_iface()
674 return ERR_PTR(-ENOMEM); in wil_cfg80211_add_iface()
676 p2p_wdev->iftype = type; in wil_cfg80211_add_iface()
677 p2p_wdev->wiphy = wiphy; in wil_cfg80211_add_iface()
679 ether_addr_copy(p2p_wdev->address, ndev_main->perm_addr); in wil_cfg80211_add_iface()
681 wil->p2p_wdev = p2p_wdev; in wil_cfg80211_add_iface()
686 if (!wil->wiphy->n_iface_combinations) { in wil_cfg80211_add_iface()
688 return ERR_PTR(-EINVAL); in wil_cfg80211_add_iface()
702 ether_addr_copy(ndev->perm_addr, ndev_main->perm_addr); in wil_cfg80211_add_iface()
703 if (is_valid_ether_addr(params->macaddr)) { in wil_cfg80211_add_iface()
704 ether_addr_copy(ndev->dev_addr, params->macaddr); in wil_cfg80211_add_iface()
706 ether_addr_copy(ndev->dev_addr, ndev_main->perm_addr); in wil_cfg80211_add_iface()
707 ndev->dev_addr[0] = (ndev->dev_addr[0] ^ (1 << vif->mid)) | in wil_cfg80211_add_iface()
711 ether_addr_copy(wdev->address, ndev->dev_addr); in wil_cfg80211_add_iface()
718 vif->mid, type, wdev->address); in wil_cfg80211_add_iface()
732 if (wdev->iftype != NL80211_IFTYPE_AP) in wil_vif_prepare_stop()
759 if (wdev->iftype == NL80211_IFTYPE_P2P_DEVICE) { in wil_cfg80211_del_iface()
760 if (wdev != wil->p2p_wdev) { in wil_cfg80211_del_iface()
763 return -EINVAL; in wil_cfg80211_del_iface()
771 if (vif->mid == 0) { in wil_cfg80211_del_iface()
773 return -EINVAL; in wil_cfg80211_del_iface()
781 vif->mid, wdev->iftype, wdev->address); in wil_cfg80211_del_iface()
783 wil_vif_remove(wil, vif->mid); in wil_cfg80211_del_iface()
811 if (wiphy->n_iface_combinations) { in wil_cfg80211_change_iface()
824 !wil_is_safe_switch(wdev->iftype, type)) { in wil_cfg80211_change_iface()
826 mutex_lock(&wil->mutex); in wil_cfg80211_change_iface()
829 mutex_unlock(&wil->mutex); in wil_cfg80211_change_iface()
843 if (params->flags) in wil_cfg80211_change_iface()
844 wil->monitor_flags = params->flags; in wil_cfg80211_change_iface()
847 return -EOPNOTSUPP; in wil_cfg80211_change_iface()
850 if (vif->mid != 0 && wil_has_active_ifaces(wil, true, false)) { in wil_cfg80211_change_iface()
853 rc = wmi_port_delete(wil, vif->mid); in wil_cfg80211_change_iface()
856 rc = wmi_port_allocate(wil, vif->mid, ndev->dev_addr, type); in wil_cfg80211_change_iface()
861 wdev->iftype = type; in wil_cfg80211_change_iface()
869 struct wireless_dev *wdev = request->wdev; in wil_cfg80211_scan()
878 wil_dbg_misc(wil, "scan: wdev=0x%p iftype=%d\n", wdev, wdev->iftype); in wil_cfg80211_scan()
881 switch (wdev->iftype) { in wil_cfg80211_scan()
888 return -EOPNOTSUPP; in wil_cfg80211_scan()
892 if (test_bit(wil_status_dontscan, wil->status)) { in wil_cfg80211_scan()
894 return -EBUSY; in wil_cfg80211_scan()
897 mutex_lock(&wil->mutex); in wil_cfg80211_scan()
899 mutex_lock(&wil->vif_mutex); in wil_cfg80211_scan()
900 if (vif->scan_request || vif->p2p.discovery_started) { in wil_cfg80211_scan()
902 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_scan()
903 rc = -EAGAIN; in wil_cfg80211_scan()
906 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_scan()
908 if (wdev->iftype == NL80211_IFTYPE_P2P_DEVICE) { in wil_cfg80211_scan()
909 if (!wil->p2p_dev_started) { in wil_cfg80211_scan()
911 rc = -EIO; in wil_cfg80211_scan()
916 vif->scan_request = request; in wil_cfg80211_scan()
917 if (vif->mid == 0) in wil_cfg80211_scan()
918 wil->radio_wdev = wdev; in wil_cfg80211_scan()
921 if (vif->mid == 0) in wil_cfg80211_scan()
922 wil->radio_wdev = in wil_cfg80211_scan()
923 wil->main_ndev->ieee80211_ptr; in wil_cfg80211_scan()
924 vif->scan_request = NULL; in wil_cfg80211_scan()
933 wil_dbg_misc(wil, "SSID count: %d", request->n_ssids); in wil_cfg80211_scan()
935 for (i = 0; i < request->n_ssids; i++) { in wil_cfg80211_scan()
938 request->ssids[i].ssid, in wil_cfg80211_scan()
939 request->ssids[i].ssid_len, true); in wil_cfg80211_scan()
942 if (request->n_ssids) in wil_cfg80211_scan()
943 rc = wmi_set_ssid(vif, request->ssids[0].ssid_len, in wil_cfg80211_scan()
944 request->ssids[0].ssid); in wil_cfg80211_scan()
953 vif->scan_request = request; in wil_cfg80211_scan()
954 mod_timer(&vif->scan_timer, jiffies + WIL6210_SCAN_TO); in wil_cfg80211_scan()
959 n = min(request->n_channels, 4U); in wil_cfg80211_scan()
961 int ch = request->channels[i]->hw_value; in wil_cfg80211_scan()
966 request->channels[i]->center_freq); in wil_cfg80211_scan()
969 /* 0-based channel indexes */ in wil_cfg80211_scan()
970 cmd.cmd.channel_list[cmd.cmd.num_channels++].channel = ch - 1; in wil_cfg80211_scan()
972 request->channels[i]->center_freq); in wil_cfg80211_scan()
975 if (request->ie_len) in wil_cfg80211_scan()
977 request->ie, request->ie_len, true); in wil_cfg80211_scan()
982 request->ie_len, request->ie); in wil_cfg80211_scan()
986 if (wil->discovery_mode && cmd.cmd.scan_type == WMI_ACTIVE_SCAN) { in wil_cfg80211_scan()
991 if (vif->mid == 0) in wil_cfg80211_scan()
992 wil->radio_wdev = wdev; in wil_cfg80211_scan()
993 rc = wmi_send(wil, WMI_START_SCAN_CMDID, vif->mid, in wil_cfg80211_scan()
999 del_timer_sync(&vif->scan_timer); in wil_cfg80211_scan()
1000 if (vif->mid == 0) in wil_cfg80211_scan()
1001 wil->radio_wdev = wil->main_ndev->ieee80211_ptr; in wil_cfg80211_scan()
1002 vif->scan_request = NULL; in wil_cfg80211_scan()
1005 mutex_unlock(&wil->mutex); in wil_cfg80211_scan()
1015 wil_dbg_misc(wil, "wdev=0x%p iftype=%d\n", wdev, wdev->iftype); in wil_cfg80211_abort_scan()
1017 mutex_lock(&wil->mutex); in wil_cfg80211_abort_scan()
1018 mutex_lock(&wil->vif_mutex); in wil_cfg80211_abort_scan()
1020 if (!vif->scan_request) in wil_cfg80211_abort_scan()
1023 if (wdev != vif->scan_request->wdev) { in wil_cfg80211_abort_scan()
1028 if (wdev == wil->p2p_wdev && wil->radio_wdev == wil->p2p_wdev) in wil_cfg80211_abort_scan()
1034 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_abort_scan()
1035 mutex_unlock(&wil->mutex); in wil_cfg80211_abort_scan()
1044 c->wpa_versions, c->cipher_group); in wil_print_crypto()
1045 wil_dbg_misc(wil, "Pairwise ciphers [%d] {\n", c->n_ciphers_pairwise); in wil_print_crypto()
1046 n = min_t(int, c->n_ciphers_pairwise, ARRAY_SIZE(c->ciphers_pairwise)); in wil_print_crypto()
1049 c->ciphers_pairwise[i]); in wil_print_crypto()
1051 wil_dbg_misc(wil, "AKM suites [%d] {\n", c->n_akm_suites); in wil_print_crypto()
1052 n = min_t(int, c->n_akm_suites, ARRAY_SIZE(c->akm_suites)); in wil_print_crypto()
1055 c->akm_suites[i]); in wil_print_crypto()
1058 c->control_port, be16_to_cpu(c->control_port_ethertype), in wil_print_crypto()
1059 c->control_port_no_encrypt); in wil_print_crypto()
1086 if (sme->channel) { in wil_print_connect_params()
1088 sme->channel->hw_value, sme->channel->center_freq); in wil_print_connect_params()
1090 if (sme->bssid) in wil_print_connect_params()
1091 wil_info(wil, " BSSID: %pM\n", sme->bssid); in wil_print_connect_params()
1092 if (sme->ssid) in wil_print_connect_params()
1094 16, 1, sme->ssid, sme->ssid_len, true); in wil_print_connect_params()
1095 if (sme->prev_bssid) in wil_print_connect_params()
1096 wil_info(wil, " Previous BSSID=%pM\n", sme->prev_bssid); in wil_print_connect_params()
1098 wil_get_auth_type_name(sme->auth_type)); in wil_print_connect_params()
1099 wil_info(wil, " Privacy: %s\n", sme->privacy ? "secure" : "open"); in wil_print_connect_params()
1100 wil_info(wil, " PBSS: %d\n", sme->pbss); in wil_print_connect_params()
1101 wil_print_crypto(wil, &sme->crypto); in wil_print_connect_params()
1113 if (!test_bit(WMI_FW_CAPABILITY_FT_ROAMING, wil->fw_capabilities)) { in wil_ft_connect()
1115 return -EOPNOTSUPP; in wil_ft_connect()
1118 if (!sme->prev_bssid) { in wil_ft_connect()
1120 return -EINVAL; in wil_ft_connect()
1123 if (ether_addr_equal(sme->prev_bssid, sme->bssid)) { in wil_ft_connect()
1125 return -EINVAL; in wil_ft_connect()
1128 if (!test_bit(wil_vif_fwconnected, vif->status)) { in wil_ft_connect()
1130 return -EINVAL; in wil_ft_connect()
1133 if (vif->privacy != sme->privacy) { in wil_ft_connect()
1135 vif->privacy, sme->privacy); in wil_ft_connect()
1136 return -EINVAL; in wil_ft_connect()
1139 if (sme->pbss) { in wil_ft_connect()
1141 return -EINVAL; in wil_ft_connect()
1145 auth_cmd.channel = sme->channel->hw_value - 1; in wil_ft_connect()
1146 ether_addr_copy(auth_cmd.bssid, sme->bssid); in wil_ft_connect()
1150 set_bit(wil_vif_ft_roam, vif->status); in wil_ft_connect()
1151 rc = wmi_send(wil, WMI_FT_AUTH_CMDID, vif->mid, in wil_ft_connect()
1154 mod_timer(&vif->connect_timer, in wil_ft_connect()
1157 clear_bit(wil_vif_ft_roam, vif->status); in wil_ft_connect()
1180 return -EINVAL; in wil_get_wmi_edmg_channel()
1185 return -EINVAL; in wil_get_wmi_edmg_channel()
1205 wil_dbg_misc(wil, "connect, mid=%d\n", vif->mid); in wil_cfg80211_connect()
1208 if (sme->auth_type == NL80211_AUTHTYPE_FT) in wil_cfg80211_connect()
1210 if (sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC && in wil_cfg80211_connect()
1211 test_bit(wil_vif_fwconnected, vif->status)) in wil_cfg80211_connect()
1215 if (test_bit(wil_vif_fwconnecting, vif->status) || in wil_cfg80211_connect()
1216 test_bit(wil_vif_fwconnected, vif->status)) in wil_cfg80211_connect()
1217 return -EALREADY; in wil_cfg80211_connect()
1219 if (sme->ie_len > WMI_MAX_IE_LEN) { in wil_cfg80211_connect()
1220 wil_err(wil, "IE too large (%td bytes)\n", sme->ie_len); in wil_cfg80211_connect()
1221 return -ERANGE; in wil_cfg80211_connect()
1224 rsn_eid = sme->ie ? in wil_cfg80211_connect()
1225 cfg80211_find_ie(WLAN_EID_RSN, sme->ie, sme->ie_len) : in wil_cfg80211_connect()
1227 if (sme->privacy && !rsn_eid) { in wil_cfg80211_connect()
1231 return -EINVAL; in wil_cfg80211_connect()
1235 if (sme->pbss) in wil_cfg80211_connect()
1238 bss = cfg80211_get_bss(wiphy, sme->channel, sme->bssid, in wil_cfg80211_connect()
1239 sme->ssid, sme->ssid_len, in wil_cfg80211_connect()
1243 return -ENOENT; in wil_cfg80211_connect()
1249 rc = -ENOENT; in wil_cfg80211_connect()
1252 vif->privacy = sme->privacy; in wil_cfg80211_connect()
1253 vif->pbss = sme->pbss; in wil_cfg80211_connect()
1255 rc = wmi_set_ie(vif, WMI_FRAME_ASSOC_REQ, sme->ie_len, sme->ie); in wil_cfg80211_connect()
1259 switch (bss->capability & WLAN_CAPABILITY_DMG_TYPE_MASK) { in wil_cfg80211_connect()
1268 bss->capability); in wil_cfg80211_connect()
1269 rc = -EINVAL; in wil_cfg80211_connect()
1273 ch = bss->channel->hw_value; in wil_cfg80211_connect()
1276 bss->channel->center_freq); in wil_cfg80211_connect()
1277 rc = -EOPNOTSUPP; in wil_cfg80211_connect()
1284 bss->capability); in wil_cfg80211_connect()
1285 rc = -EINVAL; in wil_cfg80211_connect()
1290 vif->bss = bss; in wil_cfg80211_connect()
1294 if (vif->privacy) { in wil_cfg80211_connect()
1296 rc = wmi_del_cipher_key(vif, 0, bss->bssid, in wil_cfg80211_connect()
1302 rc = wmi_del_cipher_key(vif, 0, bss->bssid, in wil_cfg80211_connect()
1313 if (vif->privacy) { in wil_cfg80211_connect()
1332 conn.channel = ch - 1; in wil_cfg80211_connect()
1334 rc = wil_get_wmi_edmg_channel(wil, sme->edmg.bw_config, in wil_cfg80211_connect()
1335 sme->edmg.channels, &conn.edmg_channel); in wil_cfg80211_connect()
1339 ether_addr_copy(conn.bssid, bss->bssid); in wil_cfg80211_connect()
1340 ether_addr_copy(conn.dst_mac, bss->bssid); in wil_cfg80211_connect()
1342 set_bit(wil_vif_fwconnecting, vif->status); in wil_cfg80211_connect()
1344 rc = wmi_send(wil, WMI_CONNECT_CMDID, vif->mid, &conn, sizeof(conn)); in wil_cfg80211_connect()
1349 vif->bss = bss; in wil_cfg80211_connect()
1351 mod_timer(&vif->connect_timer, in wil_cfg80211_connect()
1354 clear_bit(wil_vif_fwconnecting, vif->status); in wil_cfg80211_connect()
1372 reason_code, vif->mid); in wil_cfg80211_disconnect()
1374 if (!(test_bit(wil_vif_fwconnecting, vif->status) || in wil_cfg80211_disconnect()
1375 test_bit(wil_vif_fwconnected, vif->status))) { in wil_cfg80211_disconnect()
1380 vif->locally_generated_disc = true; in wil_cfg80211_disconnect()
1381 rc = wmi_call(wil, WMI_DISCONNECT_CMDID, vif->mid, NULL, 0, in wil_cfg80211_disconnect()
1399 return -ENOTSUPP; in wil_cfg80211_set_wiphy_params()
1402 rc = wmi_set_mgmt_retry(wil, wiphy->retry_short); in wil_cfg80211_set_wiphy_params()
1414 const u8 *buf = params->buf; in wil_cfg80211_mgmt_tx()
1415 size_t len = params->len; in wil_cfg80211_mgmt_tx()
1422 params->chan ? params->chan->hw_value : -1, in wil_cfg80211_mgmt_tx()
1423 params->offchan, in wil_cfg80211_mgmt_tx()
1424 params->wait); in wil_cfg80211_mgmt_tx()
1427 * In other modes, user-space must call remain_on_channel before in wil_cfg80211_mgmt_tx()
1431 if (params->chan && params->chan->hw_value == 0) { in wil_cfg80211_mgmt_tx()
1433 return -EINVAL; in wil_cfg80211_mgmt_tx()
1436 if (wdev->iftype != NL80211_IFTYPE_AP) { in wil_cfg80211_mgmt_tx()
1438 "send WMI_SW_TX_REQ_CMDID on non-AP interfaces\n"); in wil_cfg80211_mgmt_tx()
1443 if (!params->chan || params->chan->hw_value == vif->channel) { in wil_cfg80211_mgmt_tx()
1445 "send WMI_SW_TX_REQ_CMDID for on-channel\n"); in wil_cfg80211_mgmt_tx()
1450 if (params->offchan == 0) { in wil_cfg80211_mgmt_tx()
1452 "invalid channel params: current %d requested %d, off-channel not allowed\n", in wil_cfg80211_mgmt_tx()
1453 vif->channel, params->chan->hw_value); in wil_cfg80211_mgmt_tx()
1454 return -EBUSY; in wil_cfg80211_mgmt_tx()
1457 /* use the wmi_mgmt_tx_ext only on AP mode and off-channel */ in wil_cfg80211_mgmt_tx()
1458 rc = wmi_mgmt_tx_ext(vif, buf, len, params->chan->hw_value, in wil_cfg80211_mgmt_tx()
1459 params->wait); in wil_cfg80211_mgmt_tx()
1463 * be -EAGAIN. In this case this function needs to return success, in wil_cfg80211_mgmt_tx()
1467 rc = (rc == -EAGAIN) ? 0 : rc; in wil_cfg80211_mgmt_tx()
1479 wil->monitor_chandef = *chandef; in wil_cfg80211_set_channel()
1493 switch (wdev->iftype) { in wil_detect_key_usage()
1509 wil_dbg_misc(wil, "detect_key_usage: -> %s\n", key_usage_str[rc]); in wil_detect_key_usage()
1518 int cid = -EINVAL; in wil_find_sta_by_key_usage()
1534 return &wil->sta[cid]; in wil_find_sta_by_key_usage()
1551 cc = &cs->tid_crypto_rx[tid].key_id[key_index]; in wil_set_crypto_rx()
1552 if (params->seq) in wil_set_crypto_rx()
1553 memcpy(cc->pn, params->seq, in wil_set_crypto_rx()
1556 memset(cc->pn, 0, IEEE80211_GCMP_PN_LEN); in wil_set_crypto_rx()
1557 cc->key_set = true; in wil_set_crypto_rx()
1561 cc = &cs->group_crypto_rx.key_id[key_index]; in wil_set_crypto_rx()
1562 if (params->seq) in wil_set_crypto_rx()
1563 memcpy(cc->pn, params->seq, IEEE80211_GCMP_PN_LEN); in wil_set_crypto_rx()
1565 memset(cc->pn, 0, IEEE80211_GCMP_PN_LEN); in wil_set_crypto_rx()
1566 cc->key_set = true; in wil_set_crypto_rx()
1585 cc = &cs->tid_crypto_rx[tid].key_id[key_index]; in wil_del_rx_key()
1586 cc->key_set = false; in wil_del_rx_key()
1590 cc = &cs->group_crypto_rx.key_id[key_index]; in wil_del_rx_key()
1591 cc->key_set = false; in wil_del_rx_key()
1609 struct wil_sta_info *cs = wil_find_sta_by_key_usage(wil, vif->mid, in wil_cfg80211_add_key()
1615 return -EINVAL; in wil_cfg80211_add_key()
1620 params->seq_len, params->seq); in wil_cfg80211_add_key()
1626 if (!test_bit(wil_vif_ft_roam, vif->status)) { in wil_cfg80211_add_key()
1629 params->seq_len, params->seq); in wil_cfg80211_add_key()
1630 return -EINVAL; in wil_cfg80211_add_key()
1637 if (params->seq && params->seq_len != IEEE80211_GCMP_PN_LEN) { in wil_cfg80211_add_key()
1640 params->seq_len, mac_addr, in wil_cfg80211_add_key()
1642 params->seq_len, params->seq); in wil_cfg80211_add_key()
1643 return -EINVAL; in wil_cfg80211_add_key()
1646 spin_lock_bh(&wil->eap_lock); in wil_cfg80211_add_key()
1647 if (pairwise && wdev->iftype == NL80211_IFTYPE_STATION && in wil_cfg80211_add_key()
1648 (vif->ptk_rekey_state == WIL_REKEY_M3_RECEIVED || in wil_cfg80211_add_key()
1649 vif->ptk_rekey_state == WIL_REKEY_WAIT_M4_SENT)) { in wil_cfg80211_add_key()
1651 vif->ptk_rekey_state = WIL_REKEY_WAIT_M4_SENT; in wil_cfg80211_add_key()
1654 spin_unlock_bh(&wil->eap_lock); in wil_cfg80211_add_key()
1656 rc = wmi_add_cipher_key(vif, key_index, mac_addr, params->key_len, in wil_cfg80211_add_key()
1657 params->key, key_usage); in wil_cfg80211_add_key()
1660 if (key_usage == WMI_KEY_USE_TX_GROUP && params->key && in wil_cfg80211_add_key()
1661 params->key_len <= WMI_MAX_KEY_LEN) { in wil_cfg80211_add_key()
1662 vif->gtk_index = key_index; in wil_cfg80211_add_key()
1663 memcpy(vif->gtk, params->key, params->key_len); in wil_cfg80211_add_key()
1664 vif->gtk_len = params->key_len; in wil_cfg80211_add_key()
1684 struct wil_sta_info *cs = wil_find_sta_by_key_usage(wil, vif->mid, in wil_cfg80211_del_key()
1724 chan->center_freq, duration, wdev->iftype); in wil_remain_on_channel()
1764 oui = vie->oui[0] << 16 | vie->oui[1] << 8 | vie->oui[2]; in _wil_cfg80211_find_ie()
1765 return cfg80211_find_vendor_ie(oui, vie->oui_type, ies, in _wil_cfg80211_find_ie()
1773 * the merged list sorted (since vendor-specific IE has the
1798 return -ENOMEM; in _wil_cfg80211_merge_extra_ies()
1819 *merged_len = dpos - buf; in _wil_cfg80211_merge_extra_ies()
1826 b->head, b->head_len, true); in wil_print_bcon_data()
1828 b->tail, b->tail_len, true); in wil_print_bcon_data()
1830 b->beacon_ies, b->beacon_ies_len, true); in wil_print_bcon_data()
1832 b->probe_resp, b->probe_resp_len, true); in wil_print_bcon_data()
1834 b->proberesp_ies, b->proberesp_ies_len, true); in wil_print_bcon_data()
1836 b->assocresp_ies, b->assocresp_ies_len, true); in wil_print_bcon_data()
1852 ies = f->u.probe_resp.variable; in _wil_cfg80211_get_proberesp_ies()
1854 *ies_len = proberesp_len - hlen; in _wil_cfg80211_get_proberesp_ies()
1868 wil_memdup_ie(&vif->proberesp, &vif->proberesp_len, bcon->probe_resp, in _wil_cfg80211_set_ies()
1869 bcon->probe_resp_len); in _wil_cfg80211_set_ies()
1870 wil_memdup_ie(&vif->proberesp_ies, &vif->proberesp_ies_len, in _wil_cfg80211_set_ies()
1871 bcon->proberesp_ies, bcon->proberesp_ies_len); in _wil_cfg80211_set_ies()
1872 wil_memdup_ie(&vif->assocresp_ies, &vif->assocresp_ies_len, in _wil_cfg80211_set_ies()
1873 bcon->assocresp_ies, bcon->assocresp_ies_len); in _wil_cfg80211_set_ies()
1875 proberesp = _wil_cfg80211_get_proberesp_ies(bcon->probe_resp, in _wil_cfg80211_set_ies()
1876 bcon->probe_resp_len, in _wil_cfg80211_set_ies()
1880 bcon->proberesp_ies, in _wil_cfg80211_set_ies()
1881 bcon->proberesp_ies_len, in _wil_cfg80211_set_ies()
1891 if (bcon->assocresp_ies) in _wil_cfg80211_set_ies()
1893 bcon->assocresp_ies_len, bcon->assocresp_ies); in _wil_cfg80211_set_ies()
1901 bcon->tail_len, bcon->tail); in _wil_cfg80211_set_ies()
1918 struct wireless_dev *wdev = ndev->ieee80211_ptr; in _wil_cfg80211_start_ap()
1919 u8 wmi_nettype = wil_iftype_nl2wmi(wdev->iftype); in _wil_cfg80211_start_ap()
1920 u8 is_go = (wdev->iftype == NL80211_IFTYPE_P2P_GO); in _wil_cfg80211_start_ap()
1928 wil_dbg_misc(wil, "start_ap: mid=%d, is_go=%d\n", vif->mid, is_go); in _wil_cfg80211_start_ap()
1931 return -ENOTSUPP; in _wil_cfg80211_start_ap()
1936 proberesp = _wil_cfg80211_get_proberesp_ies(bcon->probe_resp, in _wil_cfg80211_start_ap()
1937 bcon->probe_resp_len, in _wil_cfg80211_start_ap()
1948 wil->fw_capabilities)) { in _wil_cfg80211_start_ap()
1950 return -ENOTSUPP; in _wil_cfg80211_start_ap()
1952 set_bit(wil_vif_ft_roam, vif->status); in _wil_cfg80211_start_ap()
1955 mutex_lock(&wil->mutex); in _wil_cfg80211_start_ap()
1972 vif->privacy = privacy; in _wil_cfg80211_start_ap()
1973 vif->channel = chan; in _wil_cfg80211_start_ap()
1974 vif->wmi_edmg_channel = wmi_edmg_channel; in _wil_cfg80211_start_ap()
1975 vif->hidden_ssid = hidden_ssid; in _wil_cfg80211_start_ap()
1976 vif->pbss = pbss; in _wil_cfg80211_start_ap()
1977 vif->bi = bi; in _wil_cfg80211_start_ap()
1978 memcpy(vif->ssid, ssid, ssid_len); in _wil_cfg80211_start_ap()
1979 vif->ssid_len = ssid_len; in _wil_cfg80211_start_ap()
2003 mutex_unlock(&wil->mutex); in _wil_cfg80211_start_ap()
2013 struct wil6210_vif *vif = wil->vifs[i]; in wil_cfg80211_ap_recovery()
2018 if (!vif || vif->ssid_len == 0) in wil_cfg80211_ap_recovery()
2022 bcon.proberesp_ies = vif->proberesp_ies; in wil_cfg80211_ap_recovery()
2023 bcon.assocresp_ies = vif->assocresp_ies; in wil_cfg80211_ap_recovery()
2024 bcon.probe_resp = vif->proberesp; in wil_cfg80211_ap_recovery()
2025 bcon.proberesp_ies_len = vif->proberesp_ies_len; in wil_cfg80211_ap_recovery()
2026 bcon.assocresp_ies_len = vif->assocresp_ies_len; in wil_cfg80211_ap_recovery()
2027 bcon.probe_resp_len = vif->proberesp_len; in wil_cfg80211_ap_recovery()
2031 i, vif->privacy, vif->bi, vif->channel, in wil_cfg80211_ap_recovery()
2032 vif->hidden_ssid, vif->pbss); in wil_cfg80211_ap_recovery()
2034 vif->ssid, vif->ssid_len, true); in wil_cfg80211_ap_recovery()
2036 vif->ssid, vif->ssid_len, in wil_cfg80211_ap_recovery()
2037 vif->privacy, vif->bi, in wil_cfg80211_ap_recovery()
2038 vif->channel, in wil_cfg80211_ap_recovery()
2039 vif->wmi_edmg_channel, &bcon, in wil_cfg80211_ap_recovery()
2040 vif->hidden_ssid, vif->pbss); in wil_cfg80211_ap_recovery()
2046 if (!vif->privacy || vif->gtk_len == 0) in wil_cfg80211_ap_recovery()
2049 key_params.key = vif->gtk; in wil_cfg80211_ap_recovery()
2050 key_params.key_len = vif->gtk_len; in wil_cfg80211_ap_recovery()
2052 rc = wil_cfg80211_add_key(wiphy, ndev, vif->gtk_index, false, in wil_cfg80211_ap_recovery()
2065 struct wireless_dev *wdev = ndev->ieee80211_ptr; in wil_cfg80211_change_beacon()
2070 wil_dbg_misc(wil, "change_beacon, mid=%d\n", vif->mid); in wil_cfg80211_change_beacon()
2073 if (bcon->tail && in wil_cfg80211_change_beacon()
2074 cfg80211_find_ie(WLAN_EID_RSN, bcon->tail, in wil_cfg80211_change_beacon()
2075 bcon->tail_len)) in wil_cfg80211_change_beacon()
2078 memcpy(vif->ssid, wdev->ssid, wdev->ssid_len); in wil_cfg80211_change_beacon()
2079 vif->ssid_len = wdev->ssid_len; in wil_cfg80211_change_beacon()
2082 if (vif->privacy != privacy) { in wil_cfg80211_change_beacon()
2084 vif->privacy, privacy); in wil_cfg80211_change_beacon()
2086 rc = _wil_cfg80211_start_ap(wiphy, ndev, vif->ssid, in wil_cfg80211_change_beacon()
2087 vif->ssid_len, privacy, in wil_cfg80211_change_beacon()
2088 wdev->beacon_interval, in wil_cfg80211_change_beacon()
2089 vif->channel, in wil_cfg80211_change_beacon()
2090 vif->wmi_edmg_channel, bcon, in wil_cfg80211_change_beacon()
2091 vif->hidden_ssid, in wil_cfg80211_change_beacon()
2092 vif->pbss); in wil_cfg80211_change_beacon()
2106 struct ieee80211_channel *channel = info->chandef.chan; in wil_cfg80211_start_ap()
2107 struct cfg80211_beacon_data *bcon = &info->beacon; in wil_cfg80211_start_ap()
2108 struct cfg80211_crypto_settings *crypto = &info->crypto; in wil_cfg80211_start_ap()
2114 rc = wil_get_wmi_edmg_channel(wil, info->chandef.edmg.bw_config, in wil_cfg80211_start_ap()
2115 info->chandef.edmg.channels, in wil_cfg80211_start_ap()
2122 return -EINVAL; in wil_cfg80211_start_ap()
2125 switch (info->hidden_ssid) { in wil_cfg80211_start_ap()
2139 wil_err(wil, "AP: Invalid hidden SSID %d\n", info->hidden_ssid); in wil_cfg80211_start_ap()
2140 return -EOPNOTSUPP; in wil_cfg80211_start_ap()
2142 wil_dbg_misc(wil, "AP on Channel %d %d MHz, %s\n", channel->hw_value, in wil_cfg80211_start_ap()
2143 channel->center_freq, info->privacy ? "secure" : "open"); in wil_cfg80211_start_ap()
2145 info->privacy, info->auth_type); in wil_cfg80211_start_ap()
2147 info->hidden_ssid); in wil_cfg80211_start_ap()
2148 wil_dbg_misc(wil, "BI %d DTIM %d\n", info->beacon_interval, in wil_cfg80211_start_ap()
2149 info->dtim_period); in wil_cfg80211_start_ap()
2150 wil_dbg_misc(wil, "PBSS %d\n", info->pbss); in wil_cfg80211_start_ap()
2152 info->ssid, info->ssid_len, true); in wil_cfg80211_start_ap()
2157 info->ssid, info->ssid_len, info->privacy, in wil_cfg80211_start_ap()
2158 info->beacon_interval, channel->hw_value, in wil_cfg80211_start_ap()
2160 info->pbss); in wil_cfg80211_start_ap()
2172 wil_dbg_misc(wil, "stop_ap, mid=%d\n", vif->mid); in wil_cfg80211_stop_ap()
2179 set_bit(wil_status_resetting, wil->status); in wil_cfg80211_stop_ap()
2182 mutex_lock(&wil->mutex); in wil_cfg80211_stop_ap()
2185 clear_bit(wil_vif_ft_roam, vif->status); in wil_cfg80211_stop_ap()
2186 vif->ssid_len = 0; in wil_cfg80211_stop_ap()
2187 wil_memdup_ie(&vif->proberesp, &vif->proberesp_len, NULL, 0); in wil_cfg80211_stop_ap()
2188 wil_memdup_ie(&vif->proberesp_ies, &vif->proberesp_ies_len, NULL, 0); in wil_cfg80211_stop_ap()
2189 wil_memdup_ie(&vif->assocresp_ies, &vif->assocresp_ies_len, NULL, 0); in wil_cfg80211_stop_ap()
2190 memset(vif->gtk, 0, WMI_MAX_KEY_LEN); in wil_cfg80211_stop_ap()
2191 vif->gtk_len = 0; in wil_cfg80211_stop_ap()
2198 mutex_unlock(&wil->mutex); in wil_cfg80211_stop_ap()
2212 mac, params->aid, vif->mid, in wil_cfg80211_add_station()
2213 params->sta_flags_mask, params->sta_flags_set); in wil_cfg80211_add_station()
2217 return -EOPNOTSUPP; in wil_cfg80211_add_station()
2220 if (params->aid > WIL_MAX_DMG_AID) { in wil_cfg80211_add_station()
2222 return -EINVAL; in wil_cfg80211_add_station()
2225 return wmi_new_sta(vif, mac, params->aid); in wil_cfg80211_add_station()
2236 params->mac, params->reason_code, vif->mid); in wil_cfg80211_del_station()
2238 mutex_lock(&wil->mutex); in wil_cfg80211_del_station()
2239 wil6210_disconnect(vif, params->mac, params->reason_code); in wil_cfg80211_del_station()
2240 mutex_unlock(&wil->mutex); in wil_cfg80211_del_station()
2257 mac, params->sta_flags_mask, params->sta_flags_set, in wil_cfg80211_change_station()
2258 vif->mid); in wil_cfg80211_change_station()
2262 return -EOPNOTSUPP; in wil_cfg80211_change_station()
2265 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in wil_cfg80211_change_station()
2268 cid = wil_find_cid(wil, vif->mid, mac); in wil_cfg80211_change_station()
2271 return -ENOLINK; in wil_cfg80211_change_station()
2274 for (i = 0; i < ARRAY_SIZE(wil->ring2cid_tid); i++) in wil_cfg80211_change_station()
2275 if (wil->ring2cid_tid[i][0] == cid) { in wil_cfg80211_change_station()
2276 txdata = &wil->ring_tx_data[i]; in wil_cfg80211_change_station()
2282 return -ENOLINK; in wil_cfg80211_change_station()
2285 authorize = params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED); in wil_cfg80211_change_station()
2286 txdata->dot1x_open = authorize ? 1 : 0; in wil_cfg80211_change_station()
2288 txdata->dot1x_open); in wil_cfg80211_change_station()
2299 struct wil_sta_info *sta = &wil->sta[req->cid]; in wil_probe_client_handle()
2303 bool alive = (sta->status == wil_sta_connected); in wil_probe_client_handle()
2305 cfg80211_probe_status(ndev, sta->addr, req->cookie, alive, in wil_probe_client_handle()
2313 mutex_lock(&vif->probe_client_mutex); in next_probe_client()
2315 if (!list_empty(&vif->probe_client_pending)) { in next_probe_client()
2316 ret = vif->probe_client_pending.next; in next_probe_client()
2320 mutex_unlock(&vif->probe_client_mutex); in next_probe_client()
2348 mutex_lock(&vif->probe_client_mutex); in wil_probe_client_flush()
2350 list_for_each_entry_safe(req, t, &vif->probe_client_pending, list) { in wil_probe_client_flush()
2351 list_del(&req->list); in wil_probe_client_flush()
2355 mutex_unlock(&vif->probe_client_mutex); in wil_probe_client_flush()
2365 int cid = wil_find_cid(wil, vif->mid, peer); in wil_cfg80211_probe_client()
2368 peer, cid, vif->mid); in wil_cfg80211_probe_client()
2371 return -ENOLINK; in wil_cfg80211_probe_client()
2375 return -ENOMEM; in wil_cfg80211_probe_client()
2377 req->cid = cid; in wil_cfg80211_probe_client()
2378 req->cookie = cid; in wil_cfg80211_probe_client()
2380 mutex_lock(&vif->probe_client_mutex); in wil_cfg80211_probe_client()
2381 list_add_tail(&req->list, &vif->probe_client_pending); in wil_cfg80211_probe_client()
2382 mutex_unlock(&vif->probe_client_mutex); in wil_cfg80211_probe_client()
2384 *cookie = req->cookie; in wil_cfg80211_probe_client()
2385 queue_work(wil->wq_service, &vif->probe_client_worker); in wil_cfg80211_probe_client()
2396 if (params->ap_isolate >= 0) { in wil_cfg80211_change_bss()
2398 vif->mid, vif->ap_isolate, params->ap_isolate); in wil_cfg80211_change_bss()
2399 vif->ap_isolate = params->ap_isolate; in wil_cfg80211_change_bss()
2431 if (test_bit(wil_status_suspended, wil->status)) { in wil_cfg80211_suspend()
2442 mutex_lock(&wil->mutex); in wil_cfg80211_suspend()
2443 mutex_lock(&wil->vif_mutex); in wil_cfg80211_suspend()
2446 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_suspend()
2447 mutex_unlock(&wil->mutex); in wil_cfg80211_suspend()
2471 if (vif->mid != 0) in wil_cfg80211_sched_scan_start()
2472 return -EOPNOTSUPP; in wil_cfg80211_sched_scan_start()
2476 request->n_ssids, request->ie_len, request->flags); in wil_cfg80211_sched_scan_start()
2477 for (i = 0; i < request->n_ssids; i++) { in wil_cfg80211_sched_scan_start()
2480 request->ssids[i].ssid, in wil_cfg80211_sched_scan_start()
2481 request->ssids[i].ssid_len, true); in wil_cfg80211_sched_scan_start()
2484 for (i = 0; i < request->n_channels; i++) in wil_cfg80211_sched_scan_start()
2485 wil_dbg_misc(wil, " %d%s", request->channels[i]->hw_value, in wil_cfg80211_sched_scan_start()
2486 i == request->n_channels - 1 ? "\n" : ""); in wil_cfg80211_sched_scan_start()
2488 request->n_match_sets, request->min_rssi_thold, in wil_cfg80211_sched_scan_start()
2489 request->delay); in wil_cfg80211_sched_scan_start()
2490 for (i = 0; i < request->n_match_sets; i++) { in wil_cfg80211_sched_scan_start()
2491 struct cfg80211_match_set *ms = &request->match_sets[i]; in wil_cfg80211_sched_scan_start()
2494 i, ms->rssi_thold); in wil_cfg80211_sched_scan_start()
2496 ms->ssid.ssid, in wil_cfg80211_sched_scan_start()
2497 ms->ssid.ssid_len, true); in wil_cfg80211_sched_scan_start()
2499 wil_dbg_misc(wil, "n_scan_plans %d\n", request->n_scan_plans); in wil_cfg80211_sched_scan_start()
2500 for (i = 0; i < request->n_scan_plans; i++) { in wil_cfg80211_sched_scan_start()
2501 struct cfg80211_sched_scan_plan *sp = &request->scan_plans[i]; in wil_cfg80211_sched_scan_start()
2504 i, sp->interval, sp->iterations); in wil_cfg80211_sched_scan_start()
2508 request->ie_len, request->ie); in wil_cfg80211_sched_scan_start()
2522 if (vif->mid != 0) in wil_cfg80211_sched_scan_stop()
2523 return -EOPNOTSUPP; in wil_cfg80211_sched_scan_stop()
2527 * ignore the return code so user space and driver gets back in-sync in wil_cfg80211_sched_scan_stop()
2544 wil_dbg_misc(wil, "update ft ies, mid=%d\n", vif->mid); in wil_cfg80211_update_ft_ies()
2546 ftie->ie, ftie->ie_len, true); in wil_cfg80211_update_ft_ies()
2548 if (!test_bit(WMI_FW_CAPABILITY_FT_ROAMING, wil->fw_capabilities)) { in wil_cfg80211_update_ft_ies()
2550 return -EOPNOTSUPP; in wil_cfg80211_update_ft_ies()
2553 rc = wmi_update_ft_ies(vif, ftie->ie_len, ftie->ie); in wil_cfg80211_update_ft_ies()
2557 if (!test_bit(wil_vif_ft_roam, vif->status)) in wil_cfg80211_update_ft_ies()
2565 bss = vif->bss; in wil_cfg80211_update_ft_ies()
2568 return -EINVAL; in wil_cfg80211_update_ft_ies()
2572 ether_addr_copy(reassoc.bssid, bss->bssid); in wil_cfg80211_update_ft_ies()
2574 rc = wmi_send(wil, WMI_FT_REASSOC_CMDID, vif->mid, in wil_cfg80211_update_ft_ies()
2588 if (wil->multicast_to_unicast == enabled) in wil_cfg80211_set_multicast_to_unicast()
2592 wil->multicast_to_unicast = enabled; in wil_cfg80211_set_multicast_to_unicast()
2604 wil->cqm_rssi_thold = rssi_thold; in wil_cfg80211_set_cqm_rssi_config()
2609 wil->cqm_rssi_thold = 0; in wil_cfg80211_set_cqm_rssi_config()
2656 wiphy->max_scan_ssids = 1; in wil_wiphy_init()
2657 wiphy->max_scan_ie_len = WMI_MAX_IE_LEN; in wil_wiphy_init()
2658 wiphy->max_remain_on_channel_duration = WIL_MAX_ROC_DURATION_MS; in wil_wiphy_init()
2659 wiphy->max_num_pmkids = 0 /* TODO: */; in wil_wiphy_init()
2660 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in wil_wiphy_init()
2666 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | in wil_wiphy_init()
2670 wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME; in wil_wiphy_init()
2672 __func__, wiphy->flags); in wil_wiphy_init()
2673 wiphy->probe_resp_offload = in wil_wiphy_init()
2678 wiphy->bands[NL80211_BAND_60GHZ] = &wil_band_60ghz; in wil_wiphy_init()
2681 wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC; in wil_wiphy_init()
2683 wiphy->cipher_suites = wil_cipher_suites; in wil_wiphy_init()
2684 wiphy->n_cipher_suites = ARRAY_SIZE(wil_cipher_suites); in wil_wiphy_init()
2685 wiphy->mgmt_stypes = wil_mgmt_stypes; in wil_wiphy_init()
2686 wiphy->features |= NL80211_FEATURE_SK_TX_STATUS; in wil_wiphy_init()
2688 wiphy->n_vendor_commands = ARRAY_SIZE(wil_nl80211_vendor_commands); in wil_wiphy_init()
2689 wiphy->vendor_commands = wil_nl80211_vendor_commands; in wil_wiphy_init()
2692 wiphy->wowlan = &wil_wowlan_support; in wil_wiphy_init()
2702 const struct wil_fw_concurrency_combo *combo; in wil_cfg80211_iface_combinations_from_fw() local
2708 if (wiphy->iface_combinations) { in wil_cfg80211_iface_combinations_from_fw()
2713 combo = conc->combos; in wil_cfg80211_iface_combinations_from_fw()
2714 n_combos = le16_to_cpu(conc->n_combos); in wil_cfg80211_iface_combinations_from_fw()
2716 total_limits += combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2717 limit = combo->limits + combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2718 combo = (struct wil_fw_concurrency_combo *)limit; in wil_cfg80211_iface_combinations_from_fw()
2726 return -ENOMEM; in wil_cfg80211_iface_combinations_from_fw()
2729 combo = conc->combos; in wil_cfg80211_iface_combinations_from_fw()
2731 iface_combinations[i].max_interfaces = combo->max_interfaces; in wil_cfg80211_iface_combinations_from_fw()
2733 combo->n_diff_channels; in wil_cfg80211_iface_combinations_from_fw()
2735 combo->same_bi; in wil_cfg80211_iface_combinations_from_fw()
2736 iface_combinations[i].n_limits = combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2742 limit = combo->limits; in wil_cfg80211_iface_combinations_from_fw()
2743 for (j = 0; j < combo->n_limits; j++) { in wil_cfg80211_iface_combinations_from_fw()
2751 iface_limit += combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2752 limit += combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2753 combo = (struct wil_fw_concurrency_combo *)limit; in wil_cfg80211_iface_combinations_from_fw()
2756 wil_dbg_misc(wil, "multiple VIFs supported, n_mids %d\n", conc->n_mids); in wil_cfg80211_iface_combinations_from_fw()
2757 wil->max_vifs = conc->n_mids + 1; /* including main interface */ in wil_cfg80211_iface_combinations_from_fw()
2758 if (wil->max_vifs > WIL_MAX_VIFS) { in wil_cfg80211_iface_combinations_from_fw()
2760 WIL_MAX_VIFS, wil->max_vifs); in wil_cfg80211_iface_combinations_from_fw()
2761 wil->max_vifs = WIL_MAX_VIFS; in wil_cfg80211_iface_combinations_from_fw()
2763 wiphy->n_iface_combinations = n_combos; in wil_cfg80211_iface_combinations_from_fw()
2764 wiphy->iface_combinations = iface_combinations; in wil_cfg80211_iface_combinations_from_fw()
2782 return ERR_PTR(-ENOMEM); in wil_cfg80211_init()
2788 wil->wiphy = wiphy; in wil_cfg80211_init()
2791 ch = wiphy->bands[NL80211_BAND_60GHZ]->channels; in wil_cfg80211_init()
2792 cfg80211_chandef_create(&wil->monitor_chandef, ch, NL80211_CHAN_NO_HT); in wil_cfg80211_init()
2806 kfree(wiphy->iface_combinations); in wil_cfg80211_deinit()
2807 wiphy->iface_combinations = NULL; in wil_cfg80211_deinit()
2817 mutex_lock(&wil->vif_mutex); in wil_p2p_wdev_free()
2818 p2p_wdev = wil->p2p_wdev; in wil_p2p_wdev_free()
2819 wil->p2p_wdev = NULL; in wil_p2p_wdev_free()
2820 wil->radio_wdev = wil->main_ndev->ieee80211_ptr; in wil_p2p_wdev_free()
2821 mutex_unlock(&wil->vif_mutex); in wil_p2p_wdev_free()
2834 return -EINVAL; in wil_rf_sector_status_to_rc()
2836 return -EAGAIN; in wil_rf_sector_status_to_rc()
2838 return -EOPNOTSUPP; in wil_rf_sector_status_to_rc()
2840 return -EINVAL; in wil_rf_sector_status_to_rc()
2867 if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities)) in wil_rf_sector_get_cfg()
2868 return -EOPNOTSUPP; in wil_rf_sector_get_cfg()
2881 return -EINVAL; in wil_rf_sector_get_cfg()
2888 return -EINVAL; in wil_rf_sector_get_cfg()
2894 return -EINVAL; in wil_rf_sector_get_cfg()
2901 return -EINVAL; in wil_rf_sector_get_cfg()
2907 rc = wmi_call(wil, WMI_GET_RF_SECTOR_PARAMS_CMDID, vif->mid, in wil_rf_sector_get_cfg()
2922 return -ENOMEM; in wil_rf_sector_get_cfg()
2942 le32_to_cpu(si->etype0)) || in wil_rf_sector_get_cfg()
2944 le32_to_cpu(si->etype1)) || in wil_rf_sector_get_cfg()
2946 le32_to_cpu(si->etype2)) || in wil_rf_sector_get_cfg()
2948 le32_to_cpu(si->psh_hi)) || in wil_rf_sector_get_cfg()
2950 le32_to_cpu(si->psh_lo)) || in wil_rf_sector_get_cfg()
2952 le32_to_cpu(si->dtype_swch_off))) in wil_rf_sector_get_cfg()
2962 return -ENOBUFS; in wil_rf_sector_get_cfg()
2987 if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities)) in wil_rf_sector_set_cfg()
2988 return -EOPNOTSUPP; in wil_rf_sector_set_cfg()
3001 return -EINVAL; in wil_rf_sector_set_cfg()
3008 return -EINVAL; in wil_rf_sector_set_cfg()
3014 return -EINVAL; in wil_rf_sector_set_cfg()
3030 return -EINVAL; in wil_rf_sector_set_cfg()
3041 return -EINVAL; in wil_rf_sector_set_cfg()
3049 return -EINVAL; in wil_rf_sector_set_cfg()
3053 si->etype0 = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3055 si->etype1 = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3057 si->etype2 = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3059 si->psh_hi = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3061 si->psh_lo = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3063 si->dtype_swch_off = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3068 rc = wmi_call(wil, WMI_SET_RF_SECTOR_PARAMS_CMDID, vif->mid, in wil_rf_sector_set_cfg()
3096 if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities)) in wil_rf_sector_get_selected()
3097 return -EOPNOTSUPP; in wil_rf_sector_get_selected()
3108 return -EINVAL; in wil_rf_sector_get_selected()
3113 return -EINVAL; in wil_rf_sector_get_selected()
3118 cid = wil_find_cid(wil, vif->mid, mac_addr); in wil_rf_sector_get_selected()
3121 return -ENOENT; in wil_rf_sector_get_selected()
3124 if (test_bit(wil_vif_fwconnected, vif->status)) { in wil_rf_sector_get_selected()
3126 return -EINVAL; in wil_rf_sector_get_selected()
3133 rc = wmi_call(wil, WMI_GET_SELECTED_RF_SECTOR_INDEX_CMDID, vif->mid, in wil_rf_sector_get_selected()
3149 return -ENOMEM; in wil_rf_sector_get_selected()
3162 return -ENOBUFS; in wil_rf_sector_get_selected()
3204 if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities)) in wil_rf_sector_set_selected()
3205 return -EOPNOTSUPP; in wil_rf_sector_set_selected()
3217 return -EINVAL; in wil_rf_sector_set_selected()
3225 return -EINVAL; in wil_rf_sector_set_selected()
3231 return -EINVAL; in wil_rf_sector_set_selected()
3237 cid = wil_find_cid(wil, vif->mid, mac_addr); in wil_rf_sector_set_selected()
3241 return -ENOENT; in wil_rf_sector_set_selected()
3246 return -EINVAL; in wil_rf_sector_set_selected()
3248 cid = -1; in wil_rf_sector_set_selected()
3251 if (test_bit(wil_vif_fwconnected, vif->status)) { in wil_rf_sector_set_selected()
3253 return -EINVAL; in wil_rf_sector_set_selected()
3259 rc = wil_rf_sector_wmi_set_selected(wil, vif->mid, sector_index, in wil_rf_sector_set_selected()
3264 wil, vif->mid, WMI_INVALID_RF_SECTOR_INDEX, in wil_rf_sector_set_selected()
3266 if (rc == -EINVAL) { in wil_rf_sector_set_selected()
3267 for (i = 0; i < wil->max_assoc_sta; i++) { in wil_rf_sector_set_selected()
3268 if (wil->sta[i].mid != vif->mid) in wil_rf_sector_set_selected()
3271 wil, vif->mid, in wil_rf_sector_set_selected()