Lines Matching +full:pm +full:- +full:alive
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()
450 rc = wmi_call(wil, WMI_NOTIFY_REQ_CMDID, vif->mid, &cmd, sizeof(cmd), in wil_cid_fill_sinfo()
464 cid, vif->mid, WIL_EXTENDED_MCS_CHECK(tx_mcs), in wil_cid_fill_sinfo()
477 sinfo->generation = wil->sinfo_gen; in wil_cid_fill_sinfo()
479 sinfo->filled = BIT_ULL(NL80211_STA_INFO_RX_BYTES) | in wil_cid_fill_sinfo()
488 if (wil->use_enhanced_dma_hw && reply.evt.tx_mode != WMI_TX_MODE_DMG) { in wil_cid_fill_sinfo()
493 rx_mcs = stats->last_mcs_rx; in wil_cid_fill_sinfo()
507 sinfo->txrate.flags = tx_rate_flag; in wil_cid_fill_sinfo()
508 sinfo->rxrate.flags = rx_rate_flag; in wil_cid_fill_sinfo()
509 sinfo->txrate.mcs = tx_mcs; in wil_cid_fill_sinfo()
510 sinfo->rxrate.mcs = rx_mcs; in wil_cid_fill_sinfo()
512 sinfo->txrate.n_bonded_ch = in wil_cid_fill_sinfo()
514 sinfo->rxrate.n_bonded_ch = in wil_cid_fill_sinfo()
515 wil_rx_cb_mode_to_n_bonded(stats->last_cb_mode_rx); in wil_cid_fill_sinfo()
516 sinfo->rx_bytes = stats->rx_bytes; in wil_cid_fill_sinfo()
517 sinfo->rx_packets = stats->rx_packets; in wil_cid_fill_sinfo()
518 sinfo->rx_dropped_misc = stats->rx_dropped; in wil_cid_fill_sinfo()
519 sinfo->tx_bytes = stats->tx_bytes; in wil_cid_fill_sinfo()
520 sinfo->tx_packets = stats->tx_packets; in wil_cid_fill_sinfo()
521 sinfo->tx_failed = stats->tx_errors; in wil_cid_fill_sinfo()
523 if (test_bit(wil_vif_fwconnected, vif->status)) { in wil_cid_fill_sinfo()
524 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); in wil_cid_fill_sinfo()
526 wil->fw_capabilities)) in wil_cid_fill_sinfo()
527 sinfo->signal = reply.evt.rssi; in wil_cid_fill_sinfo()
529 sinfo->signal = reply.evt.sqi; in wil_cid_fill_sinfo()
543 int cid = wil_find_cid(wil, vif->mid, mac); in wil_cfg80211_get_station()
545 wil_dbg_misc(wil, "get_station: %pM CID %d MID %d\n", mac, cid, in wil_cfg80211_get_station()
546 vif->mid); in wil_cfg80211_get_station()
548 return -ENOENT; in wil_cfg80211_get_station()
556 * Find @idx-th active STA for specific MID for station dump.
562 for (i = 0; i < wil->max_assoc_sta; i++) { in wil_find_cid_by_idx()
563 if (wil->sta[i].status == wil_sta_unused) in wil_find_cid_by_idx()
565 if (wil->sta[i].mid != mid) in wil_find_cid_by_idx()
569 idx--; in wil_find_cid_by_idx()
572 return -ENOENT; in wil_find_cid_by_idx()
582 int cid = wil_find_cid_by_idx(wil, vif->mid, idx); in wil_cfg80211_dump_station()
585 return -ENOENT; in wil_cfg80211_dump_station()
587 ether_addr_copy(mac, wil->sta[cid].addr); in wil_cfg80211_dump_station()
588 wil_dbg_misc(wil, "dump_station: %pM CID %d MID %d\n", mac, cid, in wil_cfg80211_dump_station()
589 vif->mid); in wil_cfg80211_dump_station()
602 wil->p2p_dev_started = 1; in wil_cfg80211_start_p2p_device()
611 if (!wil->p2p_dev_started) in wil_cfg80211_stop_p2p_device()
615 mutex_lock(&wil->mutex); in wil_cfg80211_stop_p2p_device()
616 mutex_lock(&wil->vif_mutex); in wil_cfg80211_stop_p2p_device()
618 wil->p2p_dev_started = 0; in wil_cfg80211_stop_p2p_device()
619 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_stop_p2p_device()
620 mutex_unlock(&wil->mutex); in wil_cfg80211_stop_p2p_device()
633 if (wil->vifs[i]) { in wil_cfg80211_validate_add_iface()
634 wdev = vif_to_wdev(wil->vifs[i]); in wil_cfg80211_validate_add_iface()
635 params.iftype_num[wdev->iftype]++; in wil_cfg80211_validate_add_iface()
639 return cfg80211_check_combinations(wil->wiphy, ¶ms); in wil_cfg80211_validate_add_iface()
654 struct wil6210_vif *vif_pos = wil->vifs[i]; in wil_cfg80211_validate_change_iface()
658 params.iftype_num[wdev->iftype]++; in wil_cfg80211_validate_change_iface()
665 ret = cfg80211_check_combinations(wil->wiphy, ¶ms); in wil_cfg80211_validate_change_iface()
677 struct net_device *ndev_main = wil->main_ndev, *ndev; in wil_cfg80211_add_iface()
684 /* P2P device is not a real virtual interface, it is a management-only in wil_cfg80211_add_iface()
689 if (wil->p2p_wdev) { in wil_cfg80211_add_iface()
691 return ERR_PTR(-EINVAL); in wil_cfg80211_add_iface()
696 return ERR_PTR(-ENOMEM); in wil_cfg80211_add_iface()
698 p2p_wdev->iftype = type; in wil_cfg80211_add_iface()
699 p2p_wdev->wiphy = wiphy; in wil_cfg80211_add_iface()
701 ether_addr_copy(p2p_wdev->address, ndev_main->perm_addr); in wil_cfg80211_add_iface()
703 wil->p2p_wdev = p2p_wdev; in wil_cfg80211_add_iface()
708 if (!wil->wiphy->n_iface_combinations) { in wil_cfg80211_add_iface()
710 return ERR_PTR(-EINVAL); in wil_cfg80211_add_iface()
724 ether_addr_copy(ndev->perm_addr, ndev_main->perm_addr); in wil_cfg80211_add_iface()
725 if (is_valid_ether_addr(params->macaddr)) { in wil_cfg80211_add_iface()
726 eth_hw_addr_set(ndev, params->macaddr); in wil_cfg80211_add_iface()
730 ether_addr_copy(addr, ndev_main->perm_addr); in wil_cfg80211_add_iface()
731 addr[0] = (addr[0] ^ (1 << vif->mid)) | 0x2; /* locally administered */ in wil_cfg80211_add_iface()
735 ether_addr_copy(wdev->address, ndev->dev_addr); in wil_cfg80211_add_iface()
741 wil_info(wil, "added VIF, mid %d iftype %d MAC %pM\n", in wil_cfg80211_add_iface()
742 vif->mid, type, wdev->address); in wil_cfg80211_add_iface()
756 if (wdev->iftype != NL80211_IFTYPE_AP) in wil_vif_prepare_stop()
783 if (wdev->iftype == NL80211_IFTYPE_P2P_DEVICE) { in wil_cfg80211_del_iface()
784 if (wdev != wil->p2p_wdev) { in wil_cfg80211_del_iface()
787 return -EINVAL; in wil_cfg80211_del_iface()
795 if (vif->mid == 0) { in wil_cfg80211_del_iface()
797 return -EINVAL; in wil_cfg80211_del_iface()
804 wil_info(wil, "deleted VIF, mid %d iftype %d MAC %pM\n", in wil_cfg80211_del_iface()
805 vif->mid, wdev->iftype, wdev->address); in wil_cfg80211_del_iface()
807 wil_vif_remove(wil, vif->mid); in wil_cfg80211_del_iface()
835 if (wiphy->n_iface_combinations) { in wil_cfg80211_change_iface()
848 !wil_is_safe_switch(wdev->iftype, type)) { in wil_cfg80211_change_iface()
850 mutex_lock(&wil->mutex); in wil_cfg80211_change_iface()
853 mutex_unlock(&wil->mutex); in wil_cfg80211_change_iface()
867 if (params->flags) in wil_cfg80211_change_iface()
868 wil->monitor_flags = params->flags; in wil_cfg80211_change_iface()
871 return -EOPNOTSUPP; in wil_cfg80211_change_iface()
874 if (vif->mid != 0 && wil_has_active_ifaces(wil, true, false)) { in wil_cfg80211_change_iface()
877 rc = wmi_port_delete(wil, vif->mid); in wil_cfg80211_change_iface()
880 rc = wmi_port_allocate(wil, vif->mid, ndev->dev_addr, type); in wil_cfg80211_change_iface()
885 wdev->iftype = type; in wil_cfg80211_change_iface()
893 struct wireless_dev *wdev = request->wdev; in wil_cfg80211_scan()
900 wil_dbg_misc(wil, "scan: wdev=0x%p iftype=%d\n", wdev, wdev->iftype); in wil_cfg80211_scan()
903 switch (wdev->iftype) { in wil_cfg80211_scan()
910 return -EOPNOTSUPP; in wil_cfg80211_scan()
914 if (test_bit(wil_status_dontscan, wil->status)) { in wil_cfg80211_scan()
916 return -EBUSY; in wil_cfg80211_scan()
919 mutex_lock(&wil->mutex); in wil_cfg80211_scan()
921 mutex_lock(&wil->vif_mutex); in wil_cfg80211_scan()
922 if (vif->scan_request || vif->p2p.discovery_started) { in wil_cfg80211_scan()
924 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_scan()
925 rc = -EAGAIN; in wil_cfg80211_scan()
928 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_scan()
930 if (wdev->iftype == NL80211_IFTYPE_P2P_DEVICE) { in wil_cfg80211_scan()
931 if (!wil->p2p_dev_started) { in wil_cfg80211_scan()
933 rc = -EIO; in wil_cfg80211_scan()
938 vif->scan_request = request; in wil_cfg80211_scan()
939 if (vif->mid == 0) in wil_cfg80211_scan()
940 wil->radio_wdev = wdev; in wil_cfg80211_scan()
943 if (vif->mid == 0) in wil_cfg80211_scan()
944 wil->radio_wdev = in wil_cfg80211_scan()
945 wil->main_ndev->ieee80211_ptr; in wil_cfg80211_scan()
946 vif->scan_request = NULL; in wil_cfg80211_scan()
955 wil_dbg_misc(wil, "SSID count: %d", request->n_ssids); in wil_cfg80211_scan()
957 for (i = 0; i < request->n_ssids; i++) { in wil_cfg80211_scan()
960 request->ssids[i].ssid, in wil_cfg80211_scan()
961 request->ssids[i].ssid_len, true); in wil_cfg80211_scan()
964 if (request->n_ssids) in wil_cfg80211_scan()
965 rc = wmi_set_ssid(vif, request->ssids[0].ssid_len, in wil_cfg80211_scan()
966 request->ssids[0].ssid); in wil_cfg80211_scan()
975 vif->scan_request = request; in wil_cfg80211_scan()
976 mod_timer(&vif->scan_timer, jiffies + WIL6210_SCAN_TO); in wil_cfg80211_scan()
978 cmd->scan_type = WMI_ACTIVE_SCAN; in wil_cfg80211_scan()
979 cmd->num_channels = 0; in wil_cfg80211_scan()
980 n = min(request->n_channels, 4U); in wil_cfg80211_scan()
982 int ch = request->channels[i]->hw_value; in wil_cfg80211_scan()
987 request->channels[i]->center_freq); in wil_cfg80211_scan()
990 /* 0-based channel indexes */ in wil_cfg80211_scan()
991 cmd->num_channels++; in wil_cfg80211_scan()
992 cmd->channel_list[cmd->num_channels - 1].channel = ch - 1; in wil_cfg80211_scan()
994 request->channels[i]->center_freq); in wil_cfg80211_scan()
997 if (request->ie_len) in wil_cfg80211_scan()
999 request->ie, request->ie_len, true); in wil_cfg80211_scan()
1004 request->ie_len, request->ie); in wil_cfg80211_scan()
1008 if (wil->discovery_mode && cmd->scan_type == WMI_ACTIVE_SCAN) { in wil_cfg80211_scan()
1009 cmd->discovery_mode = 1; in wil_cfg80211_scan()
1013 if (vif->mid == 0) in wil_cfg80211_scan()
1014 wil->radio_wdev = wdev; in wil_cfg80211_scan()
1015 rc = wmi_send(wil, WMI_START_SCAN_CMDID, vif->mid, in wil_cfg80211_scan()
1016 cmd, struct_size(cmd, channel_list, cmd->num_channels)); in wil_cfg80211_scan()
1020 del_timer_sync(&vif->scan_timer); in wil_cfg80211_scan()
1021 if (vif->mid == 0) in wil_cfg80211_scan()
1022 wil->radio_wdev = wil->main_ndev->ieee80211_ptr; in wil_cfg80211_scan()
1023 vif->scan_request = NULL; in wil_cfg80211_scan()
1026 mutex_unlock(&wil->mutex); in wil_cfg80211_scan()
1036 wil_dbg_misc(wil, "wdev=0x%p iftype=%d\n", wdev, wdev->iftype); in wil_cfg80211_abort_scan()
1038 mutex_lock(&wil->mutex); in wil_cfg80211_abort_scan()
1039 mutex_lock(&wil->vif_mutex); in wil_cfg80211_abort_scan()
1041 if (!vif->scan_request) in wil_cfg80211_abort_scan()
1044 if (wdev != vif->scan_request->wdev) { in wil_cfg80211_abort_scan()
1049 if (wdev == wil->p2p_wdev && wil->radio_wdev == wil->p2p_wdev) in wil_cfg80211_abort_scan()
1055 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_abort_scan()
1056 mutex_unlock(&wil->mutex); in wil_cfg80211_abort_scan()
1065 c->wpa_versions, c->cipher_group); in wil_print_crypto()
1066 wil_dbg_misc(wil, "Pairwise ciphers [%d] {\n", c->n_ciphers_pairwise); in wil_print_crypto()
1067 n = min_t(int, c->n_ciphers_pairwise, ARRAY_SIZE(c->ciphers_pairwise)); in wil_print_crypto()
1070 c->ciphers_pairwise[i]); in wil_print_crypto()
1072 wil_dbg_misc(wil, "AKM suites [%d] {\n", c->n_akm_suites); in wil_print_crypto()
1073 n = min_t(int, c->n_akm_suites, ARRAY_SIZE(c->akm_suites)); in wil_print_crypto()
1076 c->akm_suites[i]); in wil_print_crypto()
1079 c->control_port, be16_to_cpu(c->control_port_ethertype), in wil_print_crypto()
1080 c->control_port_no_encrypt); in wil_print_crypto()
1107 if (sme->channel) { in wil_print_connect_params()
1109 sme->channel->hw_value, sme->channel->center_freq); in wil_print_connect_params()
1111 if (sme->bssid) in wil_print_connect_params()
1112 wil_info(wil, " BSSID: %pM\n", sme->bssid); in wil_print_connect_params()
1113 if (sme->ssid) in wil_print_connect_params()
1115 16, 1, sme->ssid, sme->ssid_len, true); in wil_print_connect_params()
1116 if (sme->prev_bssid) in wil_print_connect_params()
1117 wil_info(wil, " Previous BSSID=%pM\n", sme->prev_bssid); in wil_print_connect_params()
1119 wil_get_auth_type_name(sme->auth_type)); in wil_print_connect_params()
1120 wil_info(wil, " Privacy: %s\n", sme->privacy ? "secure" : "open"); in wil_print_connect_params()
1121 wil_info(wil, " PBSS: %d\n", sme->pbss); in wil_print_connect_params()
1122 wil_print_crypto(wil, &sme->crypto); in wil_print_connect_params()
1134 if (!test_bit(WMI_FW_CAPABILITY_FT_ROAMING, wil->fw_capabilities)) { in wil_ft_connect()
1136 return -EOPNOTSUPP; in wil_ft_connect()
1139 if (!sme->prev_bssid) { in wil_ft_connect()
1141 return -EINVAL; in wil_ft_connect()
1144 if (ether_addr_equal(sme->prev_bssid, sme->bssid)) { in wil_ft_connect()
1146 return -EINVAL; in wil_ft_connect()
1149 if (!test_bit(wil_vif_fwconnected, vif->status)) { in wil_ft_connect()
1151 return -EINVAL; in wil_ft_connect()
1154 if (vif->privacy != sme->privacy) { in wil_ft_connect()
1156 vif->privacy, sme->privacy); in wil_ft_connect()
1157 return -EINVAL; in wil_ft_connect()
1160 if (sme->pbss) { in wil_ft_connect()
1162 return -EINVAL; in wil_ft_connect()
1166 auth_cmd.channel = sme->channel->hw_value - 1; in wil_ft_connect()
1167 ether_addr_copy(auth_cmd.bssid, sme->bssid); in wil_ft_connect()
1171 set_bit(wil_vif_ft_roam, vif->status); in wil_ft_connect()
1172 rc = wmi_send(wil, WMI_FT_AUTH_CMDID, vif->mid, in wil_ft_connect()
1175 mod_timer(&vif->connect_timer, in wil_ft_connect()
1178 clear_bit(wil_vif_ft_roam, vif->status); in wil_ft_connect()
1201 return -EINVAL; in wil_get_wmi_edmg_channel()
1206 return -EINVAL; in wil_get_wmi_edmg_channel()
1226 wil_dbg_misc(wil, "connect, mid=%d\n", vif->mid); in wil_cfg80211_connect()
1229 if (sme->auth_type == NL80211_AUTHTYPE_FT) in wil_cfg80211_connect()
1231 if (sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC && in wil_cfg80211_connect()
1232 test_bit(wil_vif_fwconnected, vif->status)) in wil_cfg80211_connect()
1236 if (test_bit(wil_vif_fwconnecting, vif->status) || in wil_cfg80211_connect()
1237 test_bit(wil_vif_fwconnected, vif->status)) in wil_cfg80211_connect()
1238 return -EALREADY; in wil_cfg80211_connect()
1240 if (sme->ie_len > WMI_MAX_IE_LEN) { in wil_cfg80211_connect()
1241 wil_err(wil, "IE too large (%td bytes)\n", sme->ie_len); in wil_cfg80211_connect()
1242 return -ERANGE; in wil_cfg80211_connect()
1245 rsn_eid = sme->ie ? in wil_cfg80211_connect()
1246 cfg80211_find_ie(WLAN_EID_RSN, sme->ie, sme->ie_len) : in wil_cfg80211_connect()
1248 if (sme->privacy && !rsn_eid) { in wil_cfg80211_connect()
1252 return -EINVAL; in wil_cfg80211_connect()
1256 if (sme->pbss) in wil_cfg80211_connect()
1259 bss = cfg80211_get_bss(wiphy, sme->channel, sme->bssid, in wil_cfg80211_connect()
1260 sme->ssid, sme->ssid_len, in wil_cfg80211_connect()
1264 return -ENOENT; in wil_cfg80211_connect()
1270 rc = -ENOENT; in wil_cfg80211_connect()
1273 vif->privacy = sme->privacy; in wil_cfg80211_connect()
1274 vif->pbss = sme->pbss; in wil_cfg80211_connect()
1276 rc = wmi_set_ie(vif, WMI_FRAME_ASSOC_REQ, sme->ie_len, sme->ie); in wil_cfg80211_connect()
1280 switch (bss->capability & WLAN_CAPABILITY_DMG_TYPE_MASK) { in wil_cfg80211_connect()
1289 bss->capability); in wil_cfg80211_connect()
1290 rc = -EINVAL; in wil_cfg80211_connect()
1294 ch = bss->channel->hw_value; in wil_cfg80211_connect()
1297 bss->channel->center_freq); in wil_cfg80211_connect()
1298 rc = -EOPNOTSUPP; in wil_cfg80211_connect()
1305 bss->capability); in wil_cfg80211_connect()
1306 rc = -EINVAL; in wil_cfg80211_connect()
1311 vif->bss = bss; in wil_cfg80211_connect()
1315 if (vif->privacy) { in wil_cfg80211_connect()
1317 rc = wmi_del_cipher_key(vif, 0, bss->bssid, in wil_cfg80211_connect()
1323 rc = wmi_del_cipher_key(vif, 0, bss->bssid, in wil_cfg80211_connect()
1334 if (vif->privacy) { in wil_cfg80211_connect()
1353 conn.channel = ch - 1; in wil_cfg80211_connect()
1355 rc = wil_get_wmi_edmg_channel(wil, sme->edmg.bw_config, in wil_cfg80211_connect()
1356 sme->edmg.channels, &conn.edmg_channel); in wil_cfg80211_connect()
1360 ether_addr_copy(conn.bssid, bss->bssid); in wil_cfg80211_connect()
1361 ether_addr_copy(conn.dst_mac, bss->bssid); in wil_cfg80211_connect()
1363 set_bit(wil_vif_fwconnecting, vif->status); in wil_cfg80211_connect()
1365 rc = wmi_send(wil, WMI_CONNECT_CMDID, vif->mid, &conn, sizeof(conn)); in wil_cfg80211_connect()
1370 vif->bss = bss; in wil_cfg80211_connect()
1372 mod_timer(&vif->connect_timer, in wil_cfg80211_connect()
1375 clear_bit(wil_vif_fwconnecting, vif->status); in wil_cfg80211_connect()
1393 reason_code, vif->mid); in wil_cfg80211_disconnect()
1395 if (!(test_bit(wil_vif_fwconnecting, vif->status) || in wil_cfg80211_disconnect()
1396 test_bit(wil_vif_fwconnected, vif->status))) { in wil_cfg80211_disconnect()
1401 vif->locally_generated_disc = true; in wil_cfg80211_disconnect()
1402 rc = wmi_call(wil, WMI_DISCONNECT_CMDID, vif->mid, NULL, 0, in wil_cfg80211_disconnect()
1420 return -ENOTSUPP; in wil_cfg80211_set_wiphy_params()
1423 rc = wmi_set_mgmt_retry(wil, wiphy->retry_short); in wil_cfg80211_set_wiphy_params()
1435 const u8 *buf = params->buf; in wil_cfg80211_mgmt_tx()
1436 size_t len = params->len; in wil_cfg80211_mgmt_tx()
1443 params->chan ? params->chan->hw_value : -1, in wil_cfg80211_mgmt_tx()
1444 params->offchan, in wil_cfg80211_mgmt_tx()
1445 params->wait); in wil_cfg80211_mgmt_tx()
1448 * In other modes, user-space must call remain_on_channel before in wil_cfg80211_mgmt_tx()
1452 if (params->chan && params->chan->hw_value == 0) { in wil_cfg80211_mgmt_tx()
1454 return -EINVAL; in wil_cfg80211_mgmt_tx()
1457 if (wdev->iftype != NL80211_IFTYPE_AP) { in wil_cfg80211_mgmt_tx()
1459 "send WMI_SW_TX_REQ_CMDID on non-AP interfaces\n"); in wil_cfg80211_mgmt_tx()
1464 if (!params->chan || params->chan->hw_value == vif->channel) { in wil_cfg80211_mgmt_tx()
1466 "send WMI_SW_TX_REQ_CMDID for on-channel\n"); in wil_cfg80211_mgmt_tx()
1471 if (params->offchan == 0) { in wil_cfg80211_mgmt_tx()
1473 "invalid channel params: current %d requested %d, off-channel not allowed\n", in wil_cfg80211_mgmt_tx()
1474 vif->channel, params->chan->hw_value); in wil_cfg80211_mgmt_tx()
1475 return -EBUSY; in wil_cfg80211_mgmt_tx()
1478 /* use the wmi_mgmt_tx_ext only on AP mode and off-channel */ in wil_cfg80211_mgmt_tx()
1479 rc = wmi_mgmt_tx_ext(vif, buf, len, params->chan->hw_value, in wil_cfg80211_mgmt_tx()
1480 params->wait); in wil_cfg80211_mgmt_tx()
1484 * be -EAGAIN. In this case this function needs to return success, in wil_cfg80211_mgmt_tx()
1488 rc = (rc == -EAGAIN) ? 0 : rc; in wil_cfg80211_mgmt_tx()
1501 wil->monitor_chandef = *chandef; in wil_cfg80211_set_channel()
1515 switch (wdev->iftype) { in wil_detect_key_usage()
1531 wil_dbg_misc(wil, "detect_key_usage: -> %s\n", key_usage_str[rc]); in wil_detect_key_usage()
1540 int cid = -EINVAL; in wil_find_sta_by_key_usage()
1551 wil_err(wil, "No CID for %pM %s\n", mac_addr, in wil_find_sta_by_key_usage()
1556 return &wil->sta[cid]; in wil_find_sta_by_key_usage()
1573 cc = &cs->tid_crypto_rx[tid].key_id[key_index]; in wil_set_crypto_rx()
1574 if (params->seq) in wil_set_crypto_rx()
1575 memcpy(cc->pn, params->seq, in wil_set_crypto_rx()
1578 memset(cc->pn, 0, IEEE80211_GCMP_PN_LEN); in wil_set_crypto_rx()
1579 cc->key_set = true; in wil_set_crypto_rx()
1583 cc = &cs->group_crypto_rx.key_id[key_index]; in wil_set_crypto_rx()
1584 if (params->seq) in wil_set_crypto_rx()
1585 memcpy(cc->pn, params->seq, IEEE80211_GCMP_PN_LEN); in wil_set_crypto_rx()
1587 memset(cc->pn, 0, IEEE80211_GCMP_PN_LEN); in wil_set_crypto_rx()
1588 cc->key_set = true; in wil_set_crypto_rx()
1607 cc = &cs->tid_crypto_rx[tid].key_id[key_index]; in wil_del_rx_key()
1608 cc->key_set = false; in wil_del_rx_key()
1612 cc = &cs->group_crypto_rx.key_id[key_index]; in wil_del_rx_key()
1613 cc->key_set = false; in wil_del_rx_key()
1631 struct wil_sta_info *cs = wil_find_sta_by_key_usage(wil, vif->mid, in wil_cfg80211_add_key()
1637 return -EINVAL; in wil_cfg80211_add_key()
1640 wil_dbg_misc(wil, "add_key: %pM %s[%d] PN %*phN\n", in wil_cfg80211_add_key()
1642 params->seq_len, params->seq); in wil_cfg80211_add_key()
1648 if (!test_bit(wil_vif_ft_roam, vif->status)) { in wil_cfg80211_add_key()
1649 wil_err(wil, "Not connected, %pM %s[%d] PN %*phN\n", in wil_cfg80211_add_key()
1651 params->seq_len, params->seq); in wil_cfg80211_add_key()
1652 return -EINVAL; in wil_cfg80211_add_key()
1658 if (params->seq && params->seq_len != IEEE80211_GCMP_PN_LEN) { in wil_cfg80211_add_key()
1660 "Wrong PN len %d, %pM %s[%d] PN %*phN\n", in wil_cfg80211_add_key()
1661 params->seq_len, mac_addr, in wil_cfg80211_add_key()
1663 params->seq_len, params->seq); in wil_cfg80211_add_key()
1664 return -EINVAL; in wil_cfg80211_add_key()
1667 spin_lock_bh(&wil->eap_lock); in wil_cfg80211_add_key()
1668 if (pairwise && wdev->iftype == NL80211_IFTYPE_STATION && in wil_cfg80211_add_key()
1669 (vif->ptk_rekey_state == WIL_REKEY_M3_RECEIVED || in wil_cfg80211_add_key()
1670 vif->ptk_rekey_state == WIL_REKEY_WAIT_M4_SENT)) { in wil_cfg80211_add_key()
1672 vif->ptk_rekey_state = WIL_REKEY_WAIT_M4_SENT; in wil_cfg80211_add_key()
1675 spin_unlock_bh(&wil->eap_lock); in wil_cfg80211_add_key()
1677 rc = wmi_add_cipher_key(vif, key_index, mac_addr, params->key_len, in wil_cfg80211_add_key()
1678 params->key, key_usage); in wil_cfg80211_add_key()
1681 if (key_usage == WMI_KEY_USE_TX_GROUP && params->key && in wil_cfg80211_add_key()
1682 params->key_len <= WMI_MAX_KEY_LEN) { in wil_cfg80211_add_key()
1683 vif->gtk_index = key_index; in wil_cfg80211_add_key()
1684 memcpy(vif->gtk, params->key, params->key_len); in wil_cfg80211_add_key()
1685 vif->gtk_len = params->key_len; in wil_cfg80211_add_key()
1705 struct wil_sta_info *cs = wil_find_sta_by_key_usage(wil, vif->mid, in wil_cfg80211_del_key()
1709 wil_dbg_misc(wil, "del_key: %pM %s[%d]\n", mac_addr, in wil_cfg80211_del_key()
1713 wil_info(wil, "Not connected, %pM %s[%d]\n", in wil_cfg80211_del_key()
1745 chan->center_freq, duration, wdev->iftype); in wil_remain_on_channel()
1785 oui = vie->oui[0] << 16 | vie->oui[1] << 8 | vie->oui[2]; in _wil_cfg80211_find_ie()
1786 return cfg80211_find_vendor_ie(oui, vie->oui_type, ies, in _wil_cfg80211_find_ie()
1794 * the merged list sorted (since vendor-specific IE has the
1819 return -ENOMEM; in _wil_cfg80211_merge_extra_ies()
1840 *merged_len = dpos - buf; in _wil_cfg80211_merge_extra_ies()
1847 b->head, b->head_len, true); in wil_print_bcon_data()
1849 b->tail, b->tail_len, true); in wil_print_bcon_data()
1851 b->beacon_ies, b->beacon_ies_len, true); in wil_print_bcon_data()
1853 b->probe_resp, b->probe_resp_len, true); in wil_print_bcon_data()
1855 b->proberesp_ies, b->proberesp_ies_len, true); in wil_print_bcon_data()
1857 b->assocresp_ies, b->assocresp_ies_len, true); in wil_print_bcon_data()
1873 ies = f->u.probe_resp.variable; in _wil_cfg80211_get_proberesp_ies()
1875 *ies_len = proberesp_len - hlen; in _wil_cfg80211_get_proberesp_ies()
1889 wil_memdup_ie(&vif->proberesp, &vif->proberesp_len, bcon->probe_resp, in _wil_cfg80211_set_ies()
1890 bcon->probe_resp_len); in _wil_cfg80211_set_ies()
1891 wil_memdup_ie(&vif->proberesp_ies, &vif->proberesp_ies_len, in _wil_cfg80211_set_ies()
1892 bcon->proberesp_ies, bcon->proberesp_ies_len); in _wil_cfg80211_set_ies()
1893 wil_memdup_ie(&vif->assocresp_ies, &vif->assocresp_ies_len, in _wil_cfg80211_set_ies()
1894 bcon->assocresp_ies, bcon->assocresp_ies_len); in _wil_cfg80211_set_ies()
1896 proberesp = _wil_cfg80211_get_proberesp_ies(bcon->probe_resp, in _wil_cfg80211_set_ies()
1897 bcon->probe_resp_len, in _wil_cfg80211_set_ies()
1901 bcon->proberesp_ies, in _wil_cfg80211_set_ies()
1902 bcon->proberesp_ies_len, in _wil_cfg80211_set_ies()
1912 if (bcon->assocresp_ies) in _wil_cfg80211_set_ies()
1914 bcon->assocresp_ies_len, bcon->assocresp_ies); in _wil_cfg80211_set_ies()
1922 bcon->tail_len, bcon->tail); in _wil_cfg80211_set_ies()
1939 struct wireless_dev *wdev = ndev->ieee80211_ptr; in _wil_cfg80211_start_ap()
1940 u8 wmi_nettype = wil_iftype_nl2wmi(wdev->iftype); in _wil_cfg80211_start_ap()
1941 u8 is_go = (wdev->iftype == NL80211_IFTYPE_P2P_GO); in _wil_cfg80211_start_ap()
1949 wil_dbg_misc(wil, "start_ap: mid=%d, is_go=%d\n", vif->mid, is_go); in _wil_cfg80211_start_ap()
1952 return -ENOTSUPP; in _wil_cfg80211_start_ap()
1957 proberesp = _wil_cfg80211_get_proberesp_ies(bcon->probe_resp, in _wil_cfg80211_start_ap()
1958 bcon->probe_resp_len, in _wil_cfg80211_start_ap()
1969 wil->fw_capabilities)) { in _wil_cfg80211_start_ap()
1971 return -ENOTSUPP; in _wil_cfg80211_start_ap()
1973 set_bit(wil_vif_ft_roam, vif->status); in _wil_cfg80211_start_ap()
1976 mutex_lock(&wil->mutex); in _wil_cfg80211_start_ap()
1993 vif->privacy = privacy; in _wil_cfg80211_start_ap()
1994 vif->channel = chan; in _wil_cfg80211_start_ap()
1995 vif->wmi_edmg_channel = wmi_edmg_channel; in _wil_cfg80211_start_ap()
1996 vif->hidden_ssid = hidden_ssid; in _wil_cfg80211_start_ap()
1997 vif->pbss = pbss; in _wil_cfg80211_start_ap()
1998 vif->bi = bi; in _wil_cfg80211_start_ap()
1999 memcpy(vif->ssid, ssid, ssid_len); in _wil_cfg80211_start_ap()
2000 vif->ssid_len = ssid_len; in _wil_cfg80211_start_ap()
2024 mutex_unlock(&wil->mutex); in _wil_cfg80211_start_ap()
2034 struct wil6210_vif *vif = wil->vifs[i]; in wil_cfg80211_ap_recovery()
2039 if (!vif || vif->ssid_len == 0) in wil_cfg80211_ap_recovery()
2043 bcon.proberesp_ies = vif->proberesp_ies; in wil_cfg80211_ap_recovery()
2044 bcon.assocresp_ies = vif->assocresp_ies; in wil_cfg80211_ap_recovery()
2045 bcon.probe_resp = vif->proberesp; in wil_cfg80211_ap_recovery()
2046 bcon.proberesp_ies_len = vif->proberesp_ies_len; in wil_cfg80211_ap_recovery()
2047 bcon.assocresp_ies_len = vif->assocresp_ies_len; in wil_cfg80211_ap_recovery()
2048 bcon.probe_resp_len = vif->proberesp_len; in wil_cfg80211_ap_recovery()
2052 i, vif->privacy, vif->bi, vif->channel, in wil_cfg80211_ap_recovery()
2053 vif->hidden_ssid, vif->pbss); in wil_cfg80211_ap_recovery()
2055 vif->ssid, vif->ssid_len, true); in wil_cfg80211_ap_recovery()
2057 vif->ssid, vif->ssid_len, in wil_cfg80211_ap_recovery()
2058 vif->privacy, vif->bi, in wil_cfg80211_ap_recovery()
2059 vif->channel, in wil_cfg80211_ap_recovery()
2060 vif->wmi_edmg_channel, &bcon, in wil_cfg80211_ap_recovery()
2061 vif->hidden_ssid, vif->pbss); in wil_cfg80211_ap_recovery()
2067 if (!vif->privacy || vif->gtk_len == 0) in wil_cfg80211_ap_recovery()
2070 key_params.key = vif->gtk; in wil_cfg80211_ap_recovery()
2071 key_params.key_len = vif->gtk_len; in wil_cfg80211_ap_recovery()
2073 rc = wil_cfg80211_add_key(wiphy, ndev, -1, vif->gtk_index, in wil_cfg80211_ap_recovery()
2086 struct wireless_dev *wdev = ndev->ieee80211_ptr; in wil_cfg80211_change_beacon()
2088 struct cfg80211_beacon_data *bcon = ¶ms->beacon; in wil_cfg80211_change_beacon()
2092 wil_dbg_misc(wil, "change_beacon, mid=%d\n", vif->mid); in wil_cfg80211_change_beacon()
2095 if (bcon->tail && in wil_cfg80211_change_beacon()
2096 cfg80211_find_ie(WLAN_EID_RSN, bcon->tail, in wil_cfg80211_change_beacon()
2097 bcon->tail_len)) in wil_cfg80211_change_beacon()
2100 memcpy(vif->ssid, wdev->u.ap.ssid, wdev->u.ap.ssid_len); in wil_cfg80211_change_beacon()
2101 vif->ssid_len = wdev->u.ap.ssid_len; in wil_cfg80211_change_beacon()
2104 if (vif->privacy != privacy) { in wil_cfg80211_change_beacon()
2106 vif->privacy, privacy); in wil_cfg80211_change_beacon()
2108 rc = _wil_cfg80211_start_ap(wiphy, ndev, vif->ssid, in wil_cfg80211_change_beacon()
2109 vif->ssid_len, privacy, in wil_cfg80211_change_beacon()
2110 wdev->links[0].ap.beacon_interval, in wil_cfg80211_change_beacon()
2111 vif->channel, in wil_cfg80211_change_beacon()
2112 vif->wmi_edmg_channel, bcon, in wil_cfg80211_change_beacon()
2113 vif->hidden_ssid, in wil_cfg80211_change_beacon()
2114 vif->pbss); in wil_cfg80211_change_beacon()
2128 struct ieee80211_channel *channel = info->chandef.chan; in wil_cfg80211_start_ap()
2129 struct cfg80211_beacon_data *bcon = &info->beacon; in wil_cfg80211_start_ap()
2130 struct cfg80211_crypto_settings *crypto = &info->crypto; in wil_cfg80211_start_ap()
2136 rc = wil_get_wmi_edmg_channel(wil, info->chandef.edmg.bw_config, in wil_cfg80211_start_ap()
2137 info->chandef.edmg.channels, in wil_cfg80211_start_ap()
2144 return -EINVAL; in wil_cfg80211_start_ap()
2147 switch (info->hidden_ssid) { in wil_cfg80211_start_ap()
2161 wil_err(wil, "AP: Invalid hidden SSID %d\n", info->hidden_ssid); in wil_cfg80211_start_ap()
2162 return -EOPNOTSUPP; in wil_cfg80211_start_ap()
2164 wil_dbg_misc(wil, "AP on Channel %d %d MHz, %s\n", channel->hw_value, in wil_cfg80211_start_ap()
2165 channel->center_freq, info->privacy ? "secure" : "open"); in wil_cfg80211_start_ap()
2167 info->privacy, info->auth_type); in wil_cfg80211_start_ap()
2169 info->hidden_ssid); in wil_cfg80211_start_ap()
2170 wil_dbg_misc(wil, "BI %d DTIM %d\n", info->beacon_interval, in wil_cfg80211_start_ap()
2171 info->dtim_period); in wil_cfg80211_start_ap()
2172 wil_dbg_misc(wil, "PBSS %d\n", info->pbss); in wil_cfg80211_start_ap()
2174 info->ssid, info->ssid_len, true); in wil_cfg80211_start_ap()
2179 info->ssid, info->ssid_len, info->privacy, in wil_cfg80211_start_ap()
2180 info->beacon_interval, channel->hw_value, in wil_cfg80211_start_ap()
2182 info->pbss); in wil_cfg80211_start_ap()
2195 wil_dbg_misc(wil, "stop_ap, mid=%d\n", vif->mid); in wil_cfg80211_stop_ap()
2202 set_bit(wil_status_resetting, wil->status); in wil_cfg80211_stop_ap()
2205 mutex_lock(&wil->mutex); in wil_cfg80211_stop_ap()
2208 clear_bit(wil_vif_ft_roam, vif->status); in wil_cfg80211_stop_ap()
2209 vif->ssid_len = 0; in wil_cfg80211_stop_ap()
2210 wil_memdup_ie(&vif->proberesp, &vif->proberesp_len, NULL, 0); in wil_cfg80211_stop_ap()
2211 wil_memdup_ie(&vif->proberesp_ies, &vif->proberesp_ies_len, NULL, 0); in wil_cfg80211_stop_ap()
2212 wil_memdup_ie(&vif->assocresp_ies, &vif->assocresp_ies_len, NULL, 0); in wil_cfg80211_stop_ap()
2213 memset(vif->gtk, 0, WMI_MAX_KEY_LEN); in wil_cfg80211_stop_ap()
2214 vif->gtk_len = 0; in wil_cfg80211_stop_ap()
2221 mutex_unlock(&wil->mutex); in wil_cfg80211_stop_ap()
2234 wil_dbg_misc(wil, "add station %pM aid %d mid %d mask 0x%x set 0x%x\n", in wil_cfg80211_add_station()
2235 mac, params->aid, vif->mid, in wil_cfg80211_add_station()
2236 params->sta_flags_mask, params->sta_flags_set); in wil_cfg80211_add_station()
2240 return -EOPNOTSUPP; in wil_cfg80211_add_station()
2243 if (params->aid > WIL_MAX_DMG_AID) { in wil_cfg80211_add_station()
2245 return -EINVAL; in wil_cfg80211_add_station()
2248 return wmi_new_sta(vif, mac, params->aid); in wil_cfg80211_add_station()
2258 wil_dbg_misc(wil, "del_station: %pM, reason=%d mid=%d\n", in wil_cfg80211_del_station()
2259 params->mac, params->reason_code, vif->mid); in wil_cfg80211_del_station()
2261 mutex_lock(&wil->mutex); in wil_cfg80211_del_station()
2262 wil6210_disconnect(vif, params->mac, params->reason_code); in wil_cfg80211_del_station()
2263 mutex_unlock(&wil->mutex); in wil_cfg80211_del_station()
2279 wil_dbg_misc(wil, "change station %pM mask 0x%x set 0x%x mid %d\n", in wil_cfg80211_change_station()
2280 mac, params->sta_flags_mask, params->sta_flags_set, in wil_cfg80211_change_station()
2281 vif->mid); in wil_cfg80211_change_station()
2285 return -EOPNOTSUPP; in wil_cfg80211_change_station()
2288 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in wil_cfg80211_change_station()
2291 cid = wil_find_cid(wil, vif->mid, mac); in wil_cfg80211_change_station()
2294 return -ENOLINK; in wil_cfg80211_change_station()
2297 for (i = 0; i < ARRAY_SIZE(wil->ring2cid_tid); i++) in wil_cfg80211_change_station()
2298 if (wil->ring2cid_tid[i][0] == cid) { in wil_cfg80211_change_station()
2299 txdata = &wil->ring_tx_data[i]; in wil_cfg80211_change_station()
2305 return -ENOLINK; in wil_cfg80211_change_station()
2308 authorize = params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED); in wil_cfg80211_change_station()
2309 txdata->dot1x_open = authorize ? 1 : 0; in wil_cfg80211_change_station()
2311 txdata->dot1x_open); in wil_cfg80211_change_station()
2322 struct wil_sta_info *sta = &wil->sta[req->cid]; in wil_probe_client_handle()
2323 /* assume STA is alive if it is still connected, in wil_probe_client_handle()
2326 bool alive = (sta->status == wil_sta_connected); in wil_probe_client_handle() local
2328 cfg80211_probe_status(ndev, sta->addr, req->cookie, alive, in wil_probe_client_handle()
2336 mutex_lock(&vif->probe_client_mutex); in next_probe_client()
2338 if (!list_empty(&vif->probe_client_pending)) { in next_probe_client()
2339 ret = vif->probe_client_pending.next; in next_probe_client()
2343 mutex_unlock(&vif->probe_client_mutex); in next_probe_client()
2371 mutex_lock(&vif->probe_client_mutex); in wil_probe_client_flush()
2373 list_for_each_entry_safe(req, t, &vif->probe_client_pending, list) { in wil_probe_client_flush()
2374 list_del(&req->list); in wil_probe_client_flush()
2378 mutex_unlock(&vif->probe_client_mutex); in wil_probe_client_flush()
2388 int cid = wil_find_cid(wil, vif->mid, peer); in wil_cfg80211_probe_client()
2390 wil_dbg_misc(wil, "probe_client: %pM => CID %d MID %d\n", in wil_cfg80211_probe_client()
2391 peer, cid, vif->mid); in wil_cfg80211_probe_client()
2394 return -ENOLINK; in wil_cfg80211_probe_client()
2398 return -ENOMEM; in wil_cfg80211_probe_client()
2400 req->cid = cid; in wil_cfg80211_probe_client()
2401 req->cookie = cid; in wil_cfg80211_probe_client()
2403 mutex_lock(&vif->probe_client_mutex); in wil_cfg80211_probe_client()
2404 list_add_tail(&req->list, &vif->probe_client_pending); in wil_cfg80211_probe_client()
2405 mutex_unlock(&vif->probe_client_mutex); in wil_cfg80211_probe_client()
2407 *cookie = req->cookie; in wil_cfg80211_probe_client()
2408 queue_work(wil->wq_service, &vif->probe_client_worker); in wil_cfg80211_probe_client()
2419 if (params->ap_isolate >= 0) { in wil_cfg80211_change_bss()
2421 vif->mid, vif->ap_isolate, params->ap_isolate); in wil_cfg80211_change_bss()
2422 vif->ap_isolate = params->ap_isolate; in wil_cfg80211_change_bss()
2454 if (test_bit(wil_status_suspended, wil->status)) { in wil_cfg80211_suspend()
2465 mutex_lock(&wil->mutex); in wil_cfg80211_suspend()
2466 mutex_lock(&wil->vif_mutex); in wil_cfg80211_suspend()
2469 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_suspend()
2470 mutex_unlock(&wil->mutex); in wil_cfg80211_suspend()
2494 if (vif->mid != 0) in wil_cfg80211_sched_scan_start()
2495 return -EOPNOTSUPP; in wil_cfg80211_sched_scan_start()
2499 request->n_ssids, request->ie_len, request->flags); in wil_cfg80211_sched_scan_start()
2500 for (i = 0; i < request->n_ssids; i++) { in wil_cfg80211_sched_scan_start()
2503 request->ssids[i].ssid, in wil_cfg80211_sched_scan_start()
2504 request->ssids[i].ssid_len, true); in wil_cfg80211_sched_scan_start()
2507 for (i = 0; i < request->n_channels; i++) in wil_cfg80211_sched_scan_start()
2508 wil_dbg_misc(wil, " %d%s", request->channels[i]->hw_value, in wil_cfg80211_sched_scan_start()
2509 i == request->n_channels - 1 ? "\n" : ""); in wil_cfg80211_sched_scan_start()
2511 request->n_match_sets, request->min_rssi_thold, in wil_cfg80211_sched_scan_start()
2512 request->delay); in wil_cfg80211_sched_scan_start()
2513 for (i = 0; i < request->n_match_sets; i++) { in wil_cfg80211_sched_scan_start()
2514 struct cfg80211_match_set *ms = &request->match_sets[i]; in wil_cfg80211_sched_scan_start()
2517 i, ms->rssi_thold); in wil_cfg80211_sched_scan_start()
2519 ms->ssid.ssid, in wil_cfg80211_sched_scan_start()
2520 ms->ssid.ssid_len, true); in wil_cfg80211_sched_scan_start()
2522 wil_dbg_misc(wil, "n_scan_plans %d\n", request->n_scan_plans); in wil_cfg80211_sched_scan_start()
2523 for (i = 0; i < request->n_scan_plans; i++) { in wil_cfg80211_sched_scan_start()
2524 struct cfg80211_sched_scan_plan *sp = &request->scan_plans[i]; in wil_cfg80211_sched_scan_start()
2527 i, sp->interval, sp->iterations); in wil_cfg80211_sched_scan_start()
2531 request->ie_len, request->ie); in wil_cfg80211_sched_scan_start()
2545 if (vif->mid != 0) in wil_cfg80211_sched_scan_stop()
2546 return -EOPNOTSUPP; in wil_cfg80211_sched_scan_stop()
2550 * ignore the return code so user space and driver gets back in-sync in wil_cfg80211_sched_scan_stop()
2567 wil_dbg_misc(wil, "update ft ies, mid=%d\n", vif->mid); in wil_cfg80211_update_ft_ies()
2569 ftie->ie, ftie->ie_len, true); in wil_cfg80211_update_ft_ies()
2571 if (!test_bit(WMI_FW_CAPABILITY_FT_ROAMING, wil->fw_capabilities)) { in wil_cfg80211_update_ft_ies()
2573 return -EOPNOTSUPP; in wil_cfg80211_update_ft_ies()
2576 rc = wmi_update_ft_ies(vif, ftie->ie_len, ftie->ie); in wil_cfg80211_update_ft_ies()
2580 if (!test_bit(wil_vif_ft_roam, vif->status)) in wil_cfg80211_update_ft_ies()
2588 bss = vif->bss; in wil_cfg80211_update_ft_ies()
2591 return -EINVAL; in wil_cfg80211_update_ft_ies()
2595 ether_addr_copy(reassoc.bssid, bss->bssid); in wil_cfg80211_update_ft_ies()
2597 rc = wmi_send(wil, WMI_FT_REASSOC_CMDID, vif->mid, in wil_cfg80211_update_ft_ies()
2611 if (wil->multicast_to_unicast == enabled) in wil_cfg80211_set_multicast_to_unicast()
2615 wil->multicast_to_unicast = enabled; in wil_cfg80211_set_multicast_to_unicast()
2627 wil->cqm_rssi_thold = rssi_thold; in wil_cfg80211_set_cqm_rssi_config()
2632 wil->cqm_rssi_thold = 0; in wil_cfg80211_set_cqm_rssi_config()
2679 wiphy->max_scan_ssids = 1; in wil_wiphy_init()
2680 wiphy->max_scan_ie_len = WMI_MAX_IE_LEN; in wil_wiphy_init()
2681 wiphy->max_remain_on_channel_duration = WIL_MAX_ROC_DURATION_MS; in wil_wiphy_init()
2682 wiphy->max_num_pmkids = 0 /* TODO: */; in wil_wiphy_init()
2683 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in wil_wiphy_init()
2689 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | in wil_wiphy_init()
2693 wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME; in wil_wiphy_init()
2695 __func__, wiphy->flags); in wil_wiphy_init()
2696 wiphy->probe_resp_offload = in wil_wiphy_init()
2701 wiphy->bands[NL80211_BAND_60GHZ] = &wil_band_60ghz; in wil_wiphy_init()
2704 wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC; in wil_wiphy_init()
2706 wiphy->cipher_suites = wil_cipher_suites; in wil_wiphy_init()
2707 wiphy->n_cipher_suites = ARRAY_SIZE(wil_cipher_suites); in wil_wiphy_init()
2708 wiphy->mgmt_stypes = wil_mgmt_stypes; in wil_wiphy_init()
2709 wiphy->features |= NL80211_FEATURE_SK_TX_STATUS; in wil_wiphy_init()
2711 wiphy->n_vendor_commands = ARRAY_SIZE(wil_nl80211_vendor_commands); in wil_wiphy_init()
2712 wiphy->vendor_commands = wil_nl80211_vendor_commands; in wil_wiphy_init()
2715 wiphy->wowlan = &wil_wowlan_support; in wil_wiphy_init()
2731 if (wiphy->iface_combinations) { in wil_cfg80211_iface_combinations_from_fw()
2737 n_combos = le16_to_cpu(conc->n_combos); in wil_cfg80211_iface_combinations_from_fw()
2739 total_limits += combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2740 limit = combo->limits + combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2749 return -ENOMEM; in wil_cfg80211_iface_combinations_from_fw()
2754 iface_combinations[i].max_interfaces = combo->max_interfaces; in wil_cfg80211_iface_combinations_from_fw()
2756 combo->n_diff_channels; in wil_cfg80211_iface_combinations_from_fw()
2758 combo->same_bi; in wil_cfg80211_iface_combinations_from_fw()
2759 iface_combinations[i].n_limits = combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2765 limit = combo->limits; in wil_cfg80211_iface_combinations_from_fw()
2766 for (j = 0; j < combo->n_limits; j++) { in wil_cfg80211_iface_combinations_from_fw()
2774 iface_limit += combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2775 limit += combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2779 wil_dbg_misc(wil, "multiple VIFs supported, n_mids %d\n", conc->n_mids); in wil_cfg80211_iface_combinations_from_fw()
2780 wil->max_vifs = conc->n_mids + 1; /* including main interface */ in wil_cfg80211_iface_combinations_from_fw()
2781 if (wil->max_vifs > WIL_MAX_VIFS) { in wil_cfg80211_iface_combinations_from_fw()
2783 WIL_MAX_VIFS, wil->max_vifs); in wil_cfg80211_iface_combinations_from_fw()
2784 wil->max_vifs = WIL_MAX_VIFS; in wil_cfg80211_iface_combinations_from_fw()
2786 wiphy->n_iface_combinations = n_combos; in wil_cfg80211_iface_combinations_from_fw()
2787 wiphy->iface_combinations = iface_combinations; in wil_cfg80211_iface_combinations_from_fw()
2805 return ERR_PTR(-ENOMEM); in wil_cfg80211_init()
2811 wil->wiphy = wiphy; in wil_cfg80211_init()
2814 ch = wiphy->bands[NL80211_BAND_60GHZ]->channels; in wil_cfg80211_init()
2815 cfg80211_chandef_create(&wil->monitor_chandef, ch, NL80211_CHAN_NO_HT); in wil_cfg80211_init()
2829 kfree(wiphy->iface_combinations); in wil_cfg80211_deinit()
2830 wiphy->iface_combinations = NULL; in wil_cfg80211_deinit()
2840 mutex_lock(&wil->vif_mutex); in wil_p2p_wdev_free()
2841 p2p_wdev = wil->p2p_wdev; in wil_p2p_wdev_free()
2842 wil->p2p_wdev = NULL; in wil_p2p_wdev_free()
2843 wil->radio_wdev = wil->main_ndev->ieee80211_ptr; in wil_p2p_wdev_free()
2844 mutex_unlock(&wil->vif_mutex); in wil_p2p_wdev_free()
2857 return -EINVAL; in wil_rf_sector_status_to_rc()
2859 return -EAGAIN; in wil_rf_sector_status_to_rc()
2861 return -EOPNOTSUPP; in wil_rf_sector_status_to_rc()
2863 return -EINVAL; in wil_rf_sector_status_to_rc()
2890 if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities)) in wil_rf_sector_get_cfg()
2891 return -EOPNOTSUPP; in wil_rf_sector_get_cfg()
2904 return -EINVAL; in wil_rf_sector_get_cfg()
2911 return -EINVAL; in wil_rf_sector_get_cfg()
2917 return -EINVAL; in wil_rf_sector_get_cfg()
2924 return -EINVAL; in wil_rf_sector_get_cfg()
2930 rc = wmi_call(wil, WMI_GET_RF_SECTOR_PARAMS_CMDID, vif->mid, in wil_rf_sector_get_cfg()
2945 return -ENOMEM; in wil_rf_sector_get_cfg()
2965 le32_to_cpu(si->etype0)) || in wil_rf_sector_get_cfg()
2967 le32_to_cpu(si->etype1)) || in wil_rf_sector_get_cfg()
2969 le32_to_cpu(si->etype2)) || in wil_rf_sector_get_cfg()
2971 le32_to_cpu(si->psh_hi)) || in wil_rf_sector_get_cfg()
2973 le32_to_cpu(si->psh_lo)) || in wil_rf_sector_get_cfg()
2975 le32_to_cpu(si->dtype_swch_off))) in wil_rf_sector_get_cfg()
2985 return -ENOBUFS; in wil_rf_sector_get_cfg()
3010 if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities)) in wil_rf_sector_set_cfg()
3011 return -EOPNOTSUPP; in wil_rf_sector_set_cfg()
3024 return -EINVAL; in wil_rf_sector_set_cfg()
3031 return -EINVAL; in wil_rf_sector_set_cfg()
3037 return -EINVAL; in wil_rf_sector_set_cfg()
3053 return -EINVAL; in wil_rf_sector_set_cfg()
3064 return -EINVAL; in wil_rf_sector_set_cfg()
3072 return -EINVAL; in wil_rf_sector_set_cfg()
3076 si->etype0 = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3078 si->etype1 = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3080 si->etype2 = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3082 si->psh_hi = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3084 si->psh_lo = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3086 si->dtype_swch_off = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3091 rc = wmi_call(wil, WMI_SET_RF_SECTOR_PARAMS_CMDID, vif->mid, in wil_rf_sector_set_cfg()
3119 if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities)) in wil_rf_sector_get_selected()
3120 return -EOPNOTSUPP; in wil_rf_sector_get_selected()
3131 return -EINVAL; in wil_rf_sector_get_selected()
3136 return -EINVAL; in wil_rf_sector_get_selected()
3141 cid = wil_find_cid(wil, vif->mid, mac_addr); in wil_rf_sector_get_selected()
3143 wil_err(wil, "invalid MAC address %pM\n", mac_addr); in wil_rf_sector_get_selected()
3144 return -ENOENT; in wil_rf_sector_get_selected()
3147 if (test_bit(wil_vif_fwconnected, vif->status)) { in wil_rf_sector_get_selected()
3149 return -EINVAL; in wil_rf_sector_get_selected()
3156 rc = wmi_call(wil, WMI_GET_SELECTED_RF_SECTOR_INDEX_CMDID, vif->mid, in wil_rf_sector_get_selected()
3172 return -ENOMEM; in wil_rf_sector_get_selected()
3185 return -ENOBUFS; in wil_rf_sector_get_selected()
3227 if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities)) in wil_rf_sector_set_selected()
3228 return -EOPNOTSUPP; in wil_rf_sector_set_selected()
3240 return -EINVAL; in wil_rf_sector_set_selected()
3248 return -EINVAL; in wil_rf_sector_set_selected()
3254 return -EINVAL; in wil_rf_sector_set_selected()
3260 cid = wil_find_cid(wil, vif->mid, mac_addr); in wil_rf_sector_set_selected()
3262 wil_err(wil, "invalid MAC address %pM\n", in wil_rf_sector_set_selected()
3264 return -ENOENT; in wil_rf_sector_set_selected()
3269 return -EINVAL; in wil_rf_sector_set_selected()
3271 cid = -1; in wil_rf_sector_set_selected()
3274 if (test_bit(wil_vif_fwconnected, vif->status)) { in wil_rf_sector_set_selected()
3276 return -EINVAL; in wil_rf_sector_set_selected()
3282 rc = wil_rf_sector_wmi_set_selected(wil, vif->mid, sector_index, in wil_rf_sector_set_selected()
3287 wil, vif->mid, WMI_INVALID_RF_SECTOR_INDEX, in wil_rf_sector_set_selected()
3289 if (rc == -EINVAL) { in wil_rf_sector_set_selected()
3290 for (i = 0; i < wil->max_assoc_sta; i++) { in wil_rf_sector_set_selected()
3291 if (wil->sta[i].mid != vif->mid) in wil_rf_sector_set_selected()
3294 wil, vif->mid, in wil_rf_sector_set_selected()