Lines Matching +full:rx +full:- +full:sched +full:- +full:sp

1 // SPDX-License-Identifier: ISC
3 * Copyright (c) 2012-2017 Qualcomm Atheros, Inc.
4 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
59 /* Rx channel bonding mode */
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 */
277 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
287 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
298 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
304 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
310 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
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()
461 " Tx Tpt %d goodput %d Rx goodput %d\n" in wil_cid_fill_sinfo()
462 " Sectors(rx:tx) my %d:%d peer %d:%d\n" 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()
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()
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, &params); 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, &params); 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()
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()
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()
902 wil_dbg_misc(wil, "scan: wdev=0x%p iftype=%d\n", wdev, wdev->iftype); in wil_cfg80211_scan()
905 switch (wdev->iftype) { in wil_cfg80211_scan()
912 return -EOPNOTSUPP; in wil_cfg80211_scan()
916 if (test_bit(wil_status_dontscan, wil->status)) { in wil_cfg80211_scan()
918 return -EBUSY; in wil_cfg80211_scan()
921 mutex_lock(&wil->mutex); in wil_cfg80211_scan()
923 mutex_lock(&wil->vif_mutex); in wil_cfg80211_scan()
924 if (vif->scan_request || vif->p2p.discovery_started) { in wil_cfg80211_scan()
926 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_scan()
927 rc = -EAGAIN; in wil_cfg80211_scan()
930 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_scan()
932 if (wdev->iftype == NL80211_IFTYPE_P2P_DEVICE) { in wil_cfg80211_scan()
933 if (!wil->p2p_dev_started) { in wil_cfg80211_scan()
935 rc = -EIO; in wil_cfg80211_scan()
940 vif->scan_request = request; in wil_cfg80211_scan()
941 if (vif->mid == 0) in wil_cfg80211_scan()
942 wil->radio_wdev = wdev; in wil_cfg80211_scan()
945 if (vif->mid == 0) in wil_cfg80211_scan()
946 wil->radio_wdev = in wil_cfg80211_scan()
947 wil->main_ndev->ieee80211_ptr; in wil_cfg80211_scan()
948 vif->scan_request = NULL; in wil_cfg80211_scan()
957 wil_dbg_misc(wil, "SSID count: %d", request->n_ssids); in wil_cfg80211_scan()
959 for (i = 0; i < request->n_ssids; i++) { in wil_cfg80211_scan()
962 request->ssids[i].ssid, in wil_cfg80211_scan()
963 request->ssids[i].ssid_len, true); in wil_cfg80211_scan()
966 if (request->n_ssids) in wil_cfg80211_scan()
967 rc = wmi_set_ssid(vif, request->ssids[0].ssid_len, in wil_cfg80211_scan()
968 request->ssids[0].ssid); in wil_cfg80211_scan()
977 vif->scan_request = request; in wil_cfg80211_scan()
978 mod_timer(&vif->scan_timer, jiffies + WIL6210_SCAN_TO); in wil_cfg80211_scan()
983 n = min(request->n_channels, 4U); in wil_cfg80211_scan()
985 int ch = request->channels[i]->hw_value; in wil_cfg80211_scan()
990 request->channels[i]->center_freq); in wil_cfg80211_scan()
993 /* 0-based channel indexes */ in wil_cfg80211_scan()
994 cmd.cmd.channel_list[cmd.cmd.num_channels++].channel = ch - 1; in wil_cfg80211_scan()
996 request->channels[i]->center_freq); in wil_cfg80211_scan()
999 if (request->ie_len) in wil_cfg80211_scan()
1001 request->ie, request->ie_len, true); in wil_cfg80211_scan()
1006 request->ie_len, request->ie); in wil_cfg80211_scan()
1010 if (wil->discovery_mode && cmd.cmd.scan_type == WMI_ACTIVE_SCAN) { in wil_cfg80211_scan()
1015 if (vif->mid == 0) in wil_cfg80211_scan()
1016 wil->radio_wdev = wdev; in wil_cfg80211_scan()
1017 rc = wmi_send(wil, WMI_START_SCAN_CMDID, vif->mid, in wil_cfg80211_scan()
1023 del_timer_sync(&vif->scan_timer); in wil_cfg80211_scan()
1024 if (vif->mid == 0) in wil_cfg80211_scan()
1025 wil->radio_wdev = wil->main_ndev->ieee80211_ptr; in wil_cfg80211_scan()
1026 vif->scan_request = NULL; in wil_cfg80211_scan()
1029 mutex_unlock(&wil->mutex); in wil_cfg80211_scan()
1039 wil_dbg_misc(wil, "wdev=0x%p iftype=%d\n", wdev, wdev->iftype); in wil_cfg80211_abort_scan()
1041 mutex_lock(&wil->mutex); in wil_cfg80211_abort_scan()
1042 mutex_lock(&wil->vif_mutex); in wil_cfg80211_abort_scan()
1044 if (!vif->scan_request) in wil_cfg80211_abort_scan()
1047 if (wdev != vif->scan_request->wdev) { in wil_cfg80211_abort_scan()
1052 if (wdev == wil->p2p_wdev && wil->radio_wdev == wil->p2p_wdev) in wil_cfg80211_abort_scan()
1058 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_abort_scan()
1059 mutex_unlock(&wil->mutex); in wil_cfg80211_abort_scan()
1068 c->wpa_versions, c->cipher_group); in wil_print_crypto()
1069 wil_dbg_misc(wil, "Pairwise ciphers [%d] {\n", c->n_ciphers_pairwise); in wil_print_crypto()
1070 n = min_t(int, c->n_ciphers_pairwise, ARRAY_SIZE(c->ciphers_pairwise)); in wil_print_crypto()
1073 c->ciphers_pairwise[i]); in wil_print_crypto()
1075 wil_dbg_misc(wil, "AKM suites [%d] {\n", c->n_akm_suites); in wil_print_crypto()
1076 n = min_t(int, c->n_akm_suites, ARRAY_SIZE(c->akm_suites)); in wil_print_crypto()
1079 c->akm_suites[i]); in wil_print_crypto()
1082 c->control_port, be16_to_cpu(c->control_port_ethertype), in wil_print_crypto()
1083 c->control_port_no_encrypt); in wil_print_crypto()
1110 if (sme->channel) { in wil_print_connect_params()
1112 sme->channel->hw_value, sme->channel->center_freq); in wil_print_connect_params()
1114 if (sme->bssid) in wil_print_connect_params()
1115 wil_info(wil, " BSSID: %pM\n", sme->bssid); in wil_print_connect_params()
1116 if (sme->ssid) in wil_print_connect_params()
1118 16, 1, sme->ssid, sme->ssid_len, true); in wil_print_connect_params()
1119 if (sme->prev_bssid) in wil_print_connect_params()
1120 wil_info(wil, " Previous BSSID=%pM\n", sme->prev_bssid); in wil_print_connect_params()
1122 wil_get_auth_type_name(sme->auth_type)); in wil_print_connect_params()
1123 wil_info(wil, " Privacy: %s\n", sme->privacy ? "secure" : "open"); in wil_print_connect_params()
1124 wil_info(wil, " PBSS: %d\n", sme->pbss); in wil_print_connect_params()
1125 wil_print_crypto(wil, &sme->crypto); in wil_print_connect_params()
1137 if (!test_bit(WMI_FW_CAPABILITY_FT_ROAMING, wil->fw_capabilities)) { in wil_ft_connect()
1139 return -EOPNOTSUPP; in wil_ft_connect()
1142 if (!sme->prev_bssid) { in wil_ft_connect()
1144 return -EINVAL; in wil_ft_connect()
1147 if (ether_addr_equal(sme->prev_bssid, sme->bssid)) { in wil_ft_connect()
1149 return -EINVAL; in wil_ft_connect()
1152 if (!test_bit(wil_vif_fwconnected, vif->status)) { in wil_ft_connect()
1154 return -EINVAL; in wil_ft_connect()
1157 if (vif->privacy != sme->privacy) { in wil_ft_connect()
1159 vif->privacy, sme->privacy); in wil_ft_connect()
1160 return -EINVAL; in wil_ft_connect()
1163 if (sme->pbss) { in wil_ft_connect()
1165 return -EINVAL; in wil_ft_connect()
1169 auth_cmd.channel = sme->channel->hw_value - 1; in wil_ft_connect()
1170 ether_addr_copy(auth_cmd.bssid, sme->bssid); in wil_ft_connect()
1174 set_bit(wil_vif_ft_roam, vif->status); in wil_ft_connect()
1175 rc = wmi_send(wil, WMI_FT_AUTH_CMDID, vif->mid, in wil_ft_connect()
1178 mod_timer(&vif->connect_timer, in wil_ft_connect()
1181 clear_bit(wil_vif_ft_roam, vif->status); in wil_ft_connect()
1204 return -EINVAL; in wil_get_wmi_edmg_channel()
1209 return -EINVAL; in wil_get_wmi_edmg_channel()
1229 wil_dbg_misc(wil, "connect, mid=%d\n", vif->mid); in wil_cfg80211_connect()
1232 if (sme->auth_type == NL80211_AUTHTYPE_FT) in wil_cfg80211_connect()
1234 if (sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC && in wil_cfg80211_connect()
1235 test_bit(wil_vif_fwconnected, vif->status)) in wil_cfg80211_connect()
1239 if (test_bit(wil_vif_fwconnecting, vif->status) || in wil_cfg80211_connect()
1240 test_bit(wil_vif_fwconnected, vif->status)) in wil_cfg80211_connect()
1241 return -EALREADY; in wil_cfg80211_connect()
1243 if (sme->ie_len > WMI_MAX_IE_LEN) { in wil_cfg80211_connect()
1244 wil_err(wil, "IE too large (%td bytes)\n", sme->ie_len); in wil_cfg80211_connect()
1245 return -ERANGE; in wil_cfg80211_connect()
1248 rsn_eid = sme->ie ? in wil_cfg80211_connect()
1249 cfg80211_find_ie(WLAN_EID_RSN, sme->ie, sme->ie_len) : in wil_cfg80211_connect()
1251 if (sme->privacy && !rsn_eid) { in wil_cfg80211_connect()
1255 return -EINVAL; in wil_cfg80211_connect()
1259 if (sme->pbss) in wil_cfg80211_connect()
1262 bss = cfg80211_get_bss(wiphy, sme->channel, sme->bssid, in wil_cfg80211_connect()
1263 sme->ssid, sme->ssid_len, in wil_cfg80211_connect()
1267 return -ENOENT; in wil_cfg80211_connect()
1273 rc = -ENOENT; in wil_cfg80211_connect()
1276 vif->privacy = sme->privacy; in wil_cfg80211_connect()
1277 vif->pbss = sme->pbss; in wil_cfg80211_connect()
1279 rc = wmi_set_ie(vif, WMI_FRAME_ASSOC_REQ, sme->ie_len, sme->ie); in wil_cfg80211_connect()
1283 switch (bss->capability & WLAN_CAPABILITY_DMG_TYPE_MASK) { in wil_cfg80211_connect()
1292 bss->capability); in wil_cfg80211_connect()
1293 rc = -EINVAL; in wil_cfg80211_connect()
1297 ch = bss->channel->hw_value; in wil_cfg80211_connect()
1300 bss->channel->center_freq); in wil_cfg80211_connect()
1301 rc = -EOPNOTSUPP; in wil_cfg80211_connect()
1308 bss->capability); in wil_cfg80211_connect()
1309 rc = -EINVAL; in wil_cfg80211_connect()
1314 vif->bss = bss; in wil_cfg80211_connect()
1318 if (vif->privacy) { in wil_cfg80211_connect()
1320 rc = wmi_del_cipher_key(vif, 0, bss->bssid, in wil_cfg80211_connect()
1326 rc = wmi_del_cipher_key(vif, 0, bss->bssid, in wil_cfg80211_connect()
1337 if (vif->privacy) { in wil_cfg80211_connect()
1356 conn.channel = ch - 1; in wil_cfg80211_connect()
1358 rc = wil_get_wmi_edmg_channel(wil, sme->edmg.bw_config, in wil_cfg80211_connect()
1359 sme->edmg.channels, &conn.edmg_channel); in wil_cfg80211_connect()
1363 ether_addr_copy(conn.bssid, bss->bssid); in wil_cfg80211_connect()
1364 ether_addr_copy(conn.dst_mac, bss->bssid); in wil_cfg80211_connect()
1366 set_bit(wil_vif_fwconnecting, vif->status); in wil_cfg80211_connect()
1368 rc = wmi_send(wil, WMI_CONNECT_CMDID, vif->mid, &conn, sizeof(conn)); in wil_cfg80211_connect()
1373 vif->bss = bss; in wil_cfg80211_connect()
1375 mod_timer(&vif->connect_timer, in wil_cfg80211_connect()
1378 clear_bit(wil_vif_fwconnecting, vif->status); in wil_cfg80211_connect()
1396 reason_code, vif->mid); in wil_cfg80211_disconnect()
1398 if (!(test_bit(wil_vif_fwconnecting, vif->status) || in wil_cfg80211_disconnect()
1399 test_bit(wil_vif_fwconnected, vif->status))) { in wil_cfg80211_disconnect()
1404 vif->locally_generated_disc = true; in wil_cfg80211_disconnect()
1405 rc = wmi_call(wil, WMI_DISCONNECT_CMDID, vif->mid, NULL, 0, in wil_cfg80211_disconnect()
1423 return -ENOTSUPP; in wil_cfg80211_set_wiphy_params()
1426 rc = wmi_set_mgmt_retry(wil, wiphy->retry_short); in wil_cfg80211_set_wiphy_params()
1438 const u8 *buf = params->buf; in wil_cfg80211_mgmt_tx()
1439 size_t len = params->len; in wil_cfg80211_mgmt_tx()
1446 params->chan ? params->chan->hw_value : -1, in wil_cfg80211_mgmt_tx()
1447 params->offchan, in wil_cfg80211_mgmt_tx()
1448 params->wait); in wil_cfg80211_mgmt_tx()
1451 * In other modes, user-space must call remain_on_channel before in wil_cfg80211_mgmt_tx()
1455 if (params->chan && params->chan->hw_value == 0) { in wil_cfg80211_mgmt_tx()
1457 return -EINVAL; in wil_cfg80211_mgmt_tx()
1460 if (wdev->iftype != NL80211_IFTYPE_AP) { in wil_cfg80211_mgmt_tx()
1462 "send WMI_SW_TX_REQ_CMDID on non-AP interfaces\n"); in wil_cfg80211_mgmt_tx()
1467 if (!params->chan || params->chan->hw_value == vif->channel) { in wil_cfg80211_mgmt_tx()
1469 "send WMI_SW_TX_REQ_CMDID for on-channel\n"); in wil_cfg80211_mgmt_tx()
1474 if (params->offchan == 0) { in wil_cfg80211_mgmt_tx()
1476 "invalid channel params: current %d requested %d, off-channel not allowed\n", in wil_cfg80211_mgmt_tx()
1477 vif->channel, params->chan->hw_value); in wil_cfg80211_mgmt_tx()
1478 return -EBUSY; in wil_cfg80211_mgmt_tx()
1481 /* use the wmi_mgmt_tx_ext only on AP mode and off-channel */ in wil_cfg80211_mgmt_tx()
1482 rc = wmi_mgmt_tx_ext(vif, buf, len, params->chan->hw_value, in wil_cfg80211_mgmt_tx()
1483 params->wait); in wil_cfg80211_mgmt_tx()
1487 * be -EAGAIN. In this case this function needs to return success, in wil_cfg80211_mgmt_tx()
1491 rc = (rc == -EAGAIN) ? 0 : rc; in wil_cfg80211_mgmt_tx()
1503 wil->monitor_chandef = *chandef; in wil_cfg80211_set_channel()
1517 switch (wdev->iftype) { in wil_detect_key_usage()
1527 /* TODO: Rx GTK or Tx GTK? */ in wil_detect_key_usage()
1533 wil_dbg_misc(wil, "detect_key_usage: -> %s\n", key_usage_str[rc]); in wil_detect_key_usage()
1542 int cid = -EINVAL; in wil_find_sta_by_key_usage()
1547 /* supplicant provides Rx group key in STA mode with NULL MAC address */ in wil_find_sta_by_key_usage()
1558 return &wil->sta[cid]; in wil_find_sta_by_key_usage()
1575 cc = &cs->tid_crypto_rx[tid].key_id[key_index]; in wil_set_crypto_rx()
1576 if (params->seq) in wil_set_crypto_rx()
1577 memcpy(cc->pn, params->seq, in wil_set_crypto_rx()
1580 memset(cc->pn, 0, IEEE80211_GCMP_PN_LEN); in wil_set_crypto_rx()
1581 cc->key_set = true; in wil_set_crypto_rx()
1585 cc = &cs->group_crypto_rx.key_id[key_index]; in wil_set_crypto_rx()
1586 if (params->seq) in wil_set_crypto_rx()
1587 memcpy(cc->pn, params->seq, IEEE80211_GCMP_PN_LEN); in wil_set_crypto_rx()
1589 memset(cc->pn, 0, IEEE80211_GCMP_PN_LEN); in wil_set_crypto_rx()
1590 cc->key_set = true; in wil_set_crypto_rx()
1609 cc = &cs->tid_crypto_rx[tid].key_id[key_index]; in wil_del_rx_key()
1610 cc->key_set = false; in wil_del_rx_key()
1614 cc = &cs->group_crypto_rx.key_id[key_index]; in wil_del_rx_key()
1615 cc->key_set = false; in wil_del_rx_key()
1633 struct wil_sta_info *cs = wil_find_sta_by_key_usage(wil, vif->mid, in wil_cfg80211_add_key()
1639 return -EINVAL; in wil_cfg80211_add_key()
1644 params->seq_len, params->seq); in wil_cfg80211_add_key()
1650 if (!test_bit(wil_vif_ft_roam, vif->status)) { in wil_cfg80211_add_key()
1653 params->seq_len, params->seq); in wil_cfg80211_add_key()
1654 return -EINVAL; in wil_cfg80211_add_key()
1660 if (params->seq && params->seq_len != IEEE80211_GCMP_PN_LEN) { in wil_cfg80211_add_key()
1663 params->seq_len, mac_addr, in wil_cfg80211_add_key()
1665 params->seq_len, params->seq); in wil_cfg80211_add_key()
1666 return -EINVAL; in wil_cfg80211_add_key()
1669 spin_lock_bh(&wil->eap_lock); in wil_cfg80211_add_key()
1670 if (pairwise && wdev->iftype == NL80211_IFTYPE_STATION && in wil_cfg80211_add_key()
1671 (vif->ptk_rekey_state == WIL_REKEY_M3_RECEIVED || in wil_cfg80211_add_key()
1672 vif->ptk_rekey_state == WIL_REKEY_WAIT_M4_SENT)) { in wil_cfg80211_add_key()
1674 vif->ptk_rekey_state = WIL_REKEY_WAIT_M4_SENT; in wil_cfg80211_add_key()
1677 spin_unlock_bh(&wil->eap_lock); in wil_cfg80211_add_key()
1679 rc = wmi_add_cipher_key(vif, key_index, mac_addr, params->key_len, in wil_cfg80211_add_key()
1680 params->key, key_usage); in wil_cfg80211_add_key()
1683 if (key_usage == WMI_KEY_USE_TX_GROUP && params->key && in wil_cfg80211_add_key()
1684 params->key_len <= WMI_MAX_KEY_LEN) { in wil_cfg80211_add_key()
1685 vif->gtk_index = key_index; in wil_cfg80211_add_key()
1686 memcpy(vif->gtk, params->key, params->key_len); in wil_cfg80211_add_key()
1687 vif->gtk_len = params->key_len; in wil_cfg80211_add_key()
1707 struct wil_sta_info *cs = wil_find_sta_by_key_usage(wil, vif->mid, in wil_cfg80211_del_key()
1747 chan->center_freq, duration, wdev->iftype); in wil_remain_on_channel()
1787 oui = vie->oui[0] << 16 | vie->oui[1] << 8 | vie->oui[2]; in _wil_cfg80211_find_ie()
1788 return cfg80211_find_vendor_ie(oui, vie->oui_type, ies, in _wil_cfg80211_find_ie()
1796 * the merged list sorted (since vendor-specific IE has the
1821 return -ENOMEM; in _wil_cfg80211_merge_extra_ies()
1842 *merged_len = dpos - buf; in _wil_cfg80211_merge_extra_ies()
1849 b->head, b->head_len, true); in wil_print_bcon_data()
1851 b->tail, b->tail_len, true); in wil_print_bcon_data()
1853 b->beacon_ies, b->beacon_ies_len, true); in wil_print_bcon_data()
1855 b->probe_resp, b->probe_resp_len, true); in wil_print_bcon_data()
1857 b->proberesp_ies, b->proberesp_ies_len, true); in wil_print_bcon_data()
1859 b->assocresp_ies, b->assocresp_ies_len, true); in wil_print_bcon_data()
1875 ies = f->u.probe_resp.variable; in _wil_cfg80211_get_proberesp_ies()
1877 *ies_len = proberesp_len - hlen; in _wil_cfg80211_get_proberesp_ies()
1891 wil_memdup_ie(&vif->proberesp, &vif->proberesp_len, bcon->probe_resp, in _wil_cfg80211_set_ies()
1892 bcon->probe_resp_len); in _wil_cfg80211_set_ies()
1893 wil_memdup_ie(&vif->proberesp_ies, &vif->proberesp_ies_len, in _wil_cfg80211_set_ies()
1894 bcon->proberesp_ies, bcon->proberesp_ies_len); in _wil_cfg80211_set_ies()
1895 wil_memdup_ie(&vif->assocresp_ies, &vif->assocresp_ies_len, in _wil_cfg80211_set_ies()
1896 bcon->assocresp_ies, bcon->assocresp_ies_len); in _wil_cfg80211_set_ies()
1898 proberesp = _wil_cfg80211_get_proberesp_ies(bcon->probe_resp, in _wil_cfg80211_set_ies()
1899 bcon->probe_resp_len, in _wil_cfg80211_set_ies()
1903 bcon->proberesp_ies, in _wil_cfg80211_set_ies()
1904 bcon->proberesp_ies_len, in _wil_cfg80211_set_ies()
1914 if (bcon->assocresp_ies) in _wil_cfg80211_set_ies()
1916 bcon->assocresp_ies_len, bcon->assocresp_ies); in _wil_cfg80211_set_ies()
1924 bcon->tail_len, bcon->tail); in _wil_cfg80211_set_ies()
1941 struct wireless_dev *wdev = ndev->ieee80211_ptr; in _wil_cfg80211_start_ap()
1942 u8 wmi_nettype = wil_iftype_nl2wmi(wdev->iftype); in _wil_cfg80211_start_ap()
1943 u8 is_go = (wdev->iftype == NL80211_IFTYPE_P2P_GO); in _wil_cfg80211_start_ap()
1951 wil_dbg_misc(wil, "start_ap: mid=%d, is_go=%d\n", vif->mid, is_go); in _wil_cfg80211_start_ap()
1954 return -ENOTSUPP; in _wil_cfg80211_start_ap()
1959 proberesp = _wil_cfg80211_get_proberesp_ies(bcon->probe_resp, in _wil_cfg80211_start_ap()
1960 bcon->probe_resp_len, in _wil_cfg80211_start_ap()
1971 wil->fw_capabilities)) { in _wil_cfg80211_start_ap()
1973 return -ENOTSUPP; in _wil_cfg80211_start_ap()
1975 set_bit(wil_vif_ft_roam, vif->status); in _wil_cfg80211_start_ap()
1978 mutex_lock(&wil->mutex); in _wil_cfg80211_start_ap()
1995 vif->privacy = privacy; in _wil_cfg80211_start_ap()
1996 vif->channel = chan; in _wil_cfg80211_start_ap()
1997 vif->wmi_edmg_channel = wmi_edmg_channel; in _wil_cfg80211_start_ap()
1998 vif->hidden_ssid = hidden_ssid; in _wil_cfg80211_start_ap()
1999 vif->pbss = pbss; in _wil_cfg80211_start_ap()
2000 vif->bi = bi; in _wil_cfg80211_start_ap()
2001 memcpy(vif->ssid, ssid, ssid_len); in _wil_cfg80211_start_ap()
2002 vif->ssid_len = ssid_len; in _wil_cfg80211_start_ap()
2026 mutex_unlock(&wil->mutex); in _wil_cfg80211_start_ap()
2036 struct wil6210_vif *vif = wil->vifs[i]; in wil_cfg80211_ap_recovery()
2041 if (!vif || vif->ssid_len == 0) in wil_cfg80211_ap_recovery()
2045 bcon.proberesp_ies = vif->proberesp_ies; in wil_cfg80211_ap_recovery()
2046 bcon.assocresp_ies = vif->assocresp_ies; in wil_cfg80211_ap_recovery()
2047 bcon.probe_resp = vif->proberesp; in wil_cfg80211_ap_recovery()
2048 bcon.proberesp_ies_len = vif->proberesp_ies_len; in wil_cfg80211_ap_recovery()
2049 bcon.assocresp_ies_len = vif->assocresp_ies_len; in wil_cfg80211_ap_recovery()
2050 bcon.probe_resp_len = vif->proberesp_len; in wil_cfg80211_ap_recovery()
2054 i, vif->privacy, vif->bi, vif->channel, in wil_cfg80211_ap_recovery()
2055 vif->hidden_ssid, vif->pbss); in wil_cfg80211_ap_recovery()
2057 vif->ssid, vif->ssid_len, true); in wil_cfg80211_ap_recovery()
2059 vif->ssid, vif->ssid_len, in wil_cfg80211_ap_recovery()
2060 vif->privacy, vif->bi, in wil_cfg80211_ap_recovery()
2061 vif->channel, in wil_cfg80211_ap_recovery()
2062 vif->wmi_edmg_channel, &bcon, in wil_cfg80211_ap_recovery()
2063 vif->hidden_ssid, vif->pbss); in wil_cfg80211_ap_recovery()
2069 if (!vif->privacy || vif->gtk_len == 0) in wil_cfg80211_ap_recovery()
2072 key_params.key = vif->gtk; in wil_cfg80211_ap_recovery()
2073 key_params.key_len = vif->gtk_len; in wil_cfg80211_ap_recovery()
2075 rc = wil_cfg80211_add_key(wiphy, ndev, -1, vif->gtk_index, in wil_cfg80211_ap_recovery()
2088 struct wireless_dev *wdev = ndev->ieee80211_ptr; in wil_cfg80211_change_beacon()
2093 wil_dbg_misc(wil, "change_beacon, mid=%d\n", vif->mid); in wil_cfg80211_change_beacon()
2096 if (bcon->tail && in wil_cfg80211_change_beacon()
2097 cfg80211_find_ie(WLAN_EID_RSN, bcon->tail, in wil_cfg80211_change_beacon()
2098 bcon->tail_len)) in wil_cfg80211_change_beacon()
2101 memcpy(vif->ssid, wdev->u.ap.ssid, wdev->u.ap.ssid_len); in wil_cfg80211_change_beacon()
2102 vif->ssid_len = wdev->u.ap.ssid_len; in wil_cfg80211_change_beacon()
2105 if (vif->privacy != privacy) { in wil_cfg80211_change_beacon()
2107 vif->privacy, privacy); in wil_cfg80211_change_beacon()
2109 rc = _wil_cfg80211_start_ap(wiphy, ndev, vif->ssid, in wil_cfg80211_change_beacon()
2110 vif->ssid_len, privacy, in wil_cfg80211_change_beacon()
2111 wdev->links[0].ap.beacon_interval, in wil_cfg80211_change_beacon()
2112 vif->channel, in wil_cfg80211_change_beacon()
2113 vif->wmi_edmg_channel, bcon, in wil_cfg80211_change_beacon()
2114 vif->hidden_ssid, in wil_cfg80211_change_beacon()
2115 vif->pbss); in wil_cfg80211_change_beacon()
2129 struct ieee80211_channel *channel = info->chandef.chan; in wil_cfg80211_start_ap()
2130 struct cfg80211_beacon_data *bcon = &info->beacon; in wil_cfg80211_start_ap()
2131 struct cfg80211_crypto_settings *crypto = &info->crypto; in wil_cfg80211_start_ap()
2137 rc = wil_get_wmi_edmg_channel(wil, info->chandef.edmg.bw_config, in wil_cfg80211_start_ap()
2138 info->chandef.edmg.channels, in wil_cfg80211_start_ap()
2145 return -EINVAL; in wil_cfg80211_start_ap()
2148 switch (info->hidden_ssid) { in wil_cfg80211_start_ap()
2162 wil_err(wil, "AP: Invalid hidden SSID %d\n", info->hidden_ssid); in wil_cfg80211_start_ap()
2163 return -EOPNOTSUPP; in wil_cfg80211_start_ap()
2165 wil_dbg_misc(wil, "AP on Channel %d %d MHz, %s\n", channel->hw_value, in wil_cfg80211_start_ap()
2166 channel->center_freq, info->privacy ? "secure" : "open"); in wil_cfg80211_start_ap()
2168 info->privacy, info->auth_type); in wil_cfg80211_start_ap()
2170 info->hidden_ssid); in wil_cfg80211_start_ap()
2171 wil_dbg_misc(wil, "BI %d DTIM %d\n", info->beacon_interval, in wil_cfg80211_start_ap()
2172 info->dtim_period); in wil_cfg80211_start_ap()
2173 wil_dbg_misc(wil, "PBSS %d\n", info->pbss); in wil_cfg80211_start_ap()
2175 info->ssid, info->ssid_len, true); in wil_cfg80211_start_ap()
2180 info->ssid, info->ssid_len, info->privacy, in wil_cfg80211_start_ap()
2181 info->beacon_interval, channel->hw_value, in wil_cfg80211_start_ap()
2183 info->pbss); in wil_cfg80211_start_ap()
2196 wil_dbg_misc(wil, "stop_ap, mid=%d\n", vif->mid); in wil_cfg80211_stop_ap()
2203 set_bit(wil_status_resetting, wil->status); in wil_cfg80211_stop_ap()
2206 mutex_lock(&wil->mutex); in wil_cfg80211_stop_ap()
2209 clear_bit(wil_vif_ft_roam, vif->status); in wil_cfg80211_stop_ap()
2210 vif->ssid_len = 0; in wil_cfg80211_stop_ap()
2211 wil_memdup_ie(&vif->proberesp, &vif->proberesp_len, NULL, 0); in wil_cfg80211_stop_ap()
2212 wil_memdup_ie(&vif->proberesp_ies, &vif->proberesp_ies_len, NULL, 0); in wil_cfg80211_stop_ap()
2213 wil_memdup_ie(&vif->assocresp_ies, &vif->assocresp_ies_len, NULL, 0); in wil_cfg80211_stop_ap()
2214 memset(vif->gtk, 0, WMI_MAX_KEY_LEN); in wil_cfg80211_stop_ap()
2215 vif->gtk_len = 0; in wil_cfg80211_stop_ap()
2222 mutex_unlock(&wil->mutex); in wil_cfg80211_stop_ap()
2236 mac, params->aid, vif->mid, in wil_cfg80211_add_station()
2237 params->sta_flags_mask, params->sta_flags_set); in wil_cfg80211_add_station()
2241 return -EOPNOTSUPP; in wil_cfg80211_add_station()
2244 if (params->aid > WIL_MAX_DMG_AID) { in wil_cfg80211_add_station()
2246 return -EINVAL; in wil_cfg80211_add_station()
2249 return wmi_new_sta(vif, mac, params->aid); in wil_cfg80211_add_station()
2260 params->mac, params->reason_code, vif->mid); in wil_cfg80211_del_station()
2262 mutex_lock(&wil->mutex); in wil_cfg80211_del_station()
2263 wil6210_disconnect(vif, params->mac, params->reason_code); in wil_cfg80211_del_station()
2264 mutex_unlock(&wil->mutex); in wil_cfg80211_del_station()
2281 mac, params->sta_flags_mask, params->sta_flags_set, in wil_cfg80211_change_station()
2282 vif->mid); in wil_cfg80211_change_station()
2286 return -EOPNOTSUPP; in wil_cfg80211_change_station()
2289 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in wil_cfg80211_change_station()
2292 cid = wil_find_cid(wil, vif->mid, mac); in wil_cfg80211_change_station()
2295 return -ENOLINK; in wil_cfg80211_change_station()
2298 for (i = 0; i < ARRAY_SIZE(wil->ring2cid_tid); i++) in wil_cfg80211_change_station()
2299 if (wil->ring2cid_tid[i][0] == cid) { in wil_cfg80211_change_station()
2300 txdata = &wil->ring_tx_data[i]; in wil_cfg80211_change_station()
2306 return -ENOLINK; in wil_cfg80211_change_station()
2309 authorize = params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED); in wil_cfg80211_change_station()
2310 txdata->dot1x_open = authorize ? 1 : 0; in wil_cfg80211_change_station()
2312 txdata->dot1x_open); in wil_cfg80211_change_station()
2323 struct wil_sta_info *sta = &wil->sta[req->cid]; in wil_probe_client_handle()
2327 bool alive = (sta->status == wil_sta_connected); in wil_probe_client_handle()
2329 cfg80211_probe_status(ndev, sta->addr, req->cookie, alive, in wil_probe_client_handle()
2337 mutex_lock(&vif->probe_client_mutex); in next_probe_client()
2339 if (!list_empty(&vif->probe_client_pending)) { in next_probe_client()
2340 ret = vif->probe_client_pending.next; in next_probe_client()
2344 mutex_unlock(&vif->probe_client_mutex); in next_probe_client()
2372 mutex_lock(&vif->probe_client_mutex); in wil_probe_client_flush()
2374 list_for_each_entry_safe(req, t, &vif->probe_client_pending, list) { in wil_probe_client_flush()
2375 list_del(&req->list); in wil_probe_client_flush()
2379 mutex_unlock(&vif->probe_client_mutex); in wil_probe_client_flush()
2389 int cid = wil_find_cid(wil, vif->mid, peer); in wil_cfg80211_probe_client()
2392 peer, cid, vif->mid); in wil_cfg80211_probe_client()
2395 return -ENOLINK; in wil_cfg80211_probe_client()
2399 return -ENOMEM; in wil_cfg80211_probe_client()
2401 req->cid = cid; in wil_cfg80211_probe_client()
2402 req->cookie = cid; in wil_cfg80211_probe_client()
2404 mutex_lock(&vif->probe_client_mutex); in wil_cfg80211_probe_client()
2405 list_add_tail(&req->list, &vif->probe_client_pending); in wil_cfg80211_probe_client()
2406 mutex_unlock(&vif->probe_client_mutex); in wil_cfg80211_probe_client()
2408 *cookie = req->cookie; in wil_cfg80211_probe_client()
2409 queue_work(wil->wq_service, &vif->probe_client_worker); in wil_cfg80211_probe_client()
2420 if (params->ap_isolate >= 0) { in wil_cfg80211_change_bss()
2422 vif->mid, vif->ap_isolate, params->ap_isolate); in wil_cfg80211_change_bss()
2423 vif->ap_isolate = params->ap_isolate; in wil_cfg80211_change_bss()
2455 if (test_bit(wil_status_suspended, wil->status)) { in wil_cfg80211_suspend()
2466 mutex_lock(&wil->mutex); in wil_cfg80211_suspend()
2467 mutex_lock(&wil->vif_mutex); in wil_cfg80211_suspend()
2470 mutex_unlock(&wil->vif_mutex); in wil_cfg80211_suspend()
2471 mutex_unlock(&wil->mutex); in wil_cfg80211_suspend()
2495 if (vif->mid != 0) in wil_cfg80211_sched_scan_start()
2496 return -EOPNOTSUPP; in wil_cfg80211_sched_scan_start()
2499 "sched scan start: n_ssids %d, ie_len %zu, flags 0x%x\n", in wil_cfg80211_sched_scan_start()
2500 request->n_ssids, request->ie_len, request->flags); in wil_cfg80211_sched_scan_start()
2501 for (i = 0; i < request->n_ssids; i++) { in wil_cfg80211_sched_scan_start()
2504 request->ssids[i].ssid, in wil_cfg80211_sched_scan_start()
2505 request->ssids[i].ssid_len, true); in wil_cfg80211_sched_scan_start()
2508 for (i = 0; i < request->n_channels; i++) in wil_cfg80211_sched_scan_start()
2509 wil_dbg_misc(wil, " %d%s", request->channels[i]->hw_value, in wil_cfg80211_sched_scan_start()
2510 i == request->n_channels - 1 ? "\n" : ""); in wil_cfg80211_sched_scan_start()
2512 request->n_match_sets, request->min_rssi_thold, in wil_cfg80211_sched_scan_start()
2513 request->delay); in wil_cfg80211_sched_scan_start()
2514 for (i = 0; i < request->n_match_sets; i++) { in wil_cfg80211_sched_scan_start()
2515 struct cfg80211_match_set *ms = &request->match_sets[i]; in wil_cfg80211_sched_scan_start()
2518 i, ms->rssi_thold); in wil_cfg80211_sched_scan_start()
2520 ms->ssid.ssid, in wil_cfg80211_sched_scan_start()
2521 ms->ssid.ssid_len, true); in wil_cfg80211_sched_scan_start()
2523 wil_dbg_misc(wil, "n_scan_plans %d\n", request->n_scan_plans); in wil_cfg80211_sched_scan_start()
2524 for (i = 0; i < request->n_scan_plans; i++) { in wil_cfg80211_sched_scan_start()
2525 struct cfg80211_sched_scan_plan *sp = &request->scan_plans[i]; in wil_cfg80211_sched_scan_start() local
2528 i, sp->interval, sp->iterations); in wil_cfg80211_sched_scan_start()
2532 request->ie_len, request->ie); in wil_cfg80211_sched_scan_start()
2546 if (vif->mid != 0) in wil_cfg80211_sched_scan_stop()
2547 return -EOPNOTSUPP; in wil_cfg80211_sched_scan_stop()
2551 * ignore the return code so user space and driver gets back in-sync in wil_cfg80211_sched_scan_stop()
2553 wil_dbg_misc(wil, "sched scan stopped (%d)\n", rc); in wil_cfg80211_sched_scan_stop()
2568 wil_dbg_misc(wil, "update ft ies, mid=%d\n", vif->mid); in wil_cfg80211_update_ft_ies()
2570 ftie->ie, ftie->ie_len, true); in wil_cfg80211_update_ft_ies()
2572 if (!test_bit(WMI_FW_CAPABILITY_FT_ROAMING, wil->fw_capabilities)) { in wil_cfg80211_update_ft_ies()
2574 return -EOPNOTSUPP; in wil_cfg80211_update_ft_ies()
2577 rc = wmi_update_ft_ies(vif, ftie->ie_len, ftie->ie); in wil_cfg80211_update_ft_ies()
2581 if (!test_bit(wil_vif_ft_roam, vif->status)) in wil_cfg80211_update_ft_ies()
2589 bss = vif->bss; in wil_cfg80211_update_ft_ies()
2592 return -EINVAL; in wil_cfg80211_update_ft_ies()
2596 ether_addr_copy(reassoc.bssid, bss->bssid); in wil_cfg80211_update_ft_ies()
2598 rc = wmi_send(wil, WMI_FT_REASSOC_CMDID, vif->mid, in wil_cfg80211_update_ft_ies()
2612 if (wil->multicast_to_unicast == enabled) in wil_cfg80211_set_multicast_to_unicast()
2616 wil->multicast_to_unicast = enabled; in wil_cfg80211_set_multicast_to_unicast()
2628 wil->cqm_rssi_thold = rssi_thold; in wil_cfg80211_set_cqm_rssi_config()
2633 wil->cqm_rssi_thold = 0; in wil_cfg80211_set_cqm_rssi_config()
2680 wiphy->max_scan_ssids = 1; in wil_wiphy_init()
2681 wiphy->max_scan_ie_len = WMI_MAX_IE_LEN; in wil_wiphy_init()
2682 wiphy->max_remain_on_channel_duration = WIL_MAX_ROC_DURATION_MS; in wil_wiphy_init()
2683 wiphy->max_num_pmkids = 0 /* TODO: */; in wil_wiphy_init()
2684 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in wil_wiphy_init()
2690 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | in wil_wiphy_init()
2694 wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME; in wil_wiphy_init()
2696 __func__, wiphy->flags); in wil_wiphy_init()
2697 wiphy->probe_resp_offload = in wil_wiphy_init()
2702 wiphy->bands[NL80211_BAND_60GHZ] = &wil_band_60ghz; in wil_wiphy_init()
2705 wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC; in wil_wiphy_init()
2707 wiphy->cipher_suites = wil_cipher_suites; in wil_wiphy_init()
2708 wiphy->n_cipher_suites = ARRAY_SIZE(wil_cipher_suites); in wil_wiphy_init()
2709 wiphy->mgmt_stypes = wil_mgmt_stypes; in wil_wiphy_init()
2710 wiphy->features |= NL80211_FEATURE_SK_TX_STATUS; in wil_wiphy_init()
2712 wiphy->n_vendor_commands = ARRAY_SIZE(wil_nl80211_vendor_commands); in wil_wiphy_init()
2713 wiphy->vendor_commands = wil_nl80211_vendor_commands; in wil_wiphy_init()
2716 wiphy->wowlan = &wil_wowlan_support; in wil_wiphy_init()
2732 if (wiphy->iface_combinations) { in wil_cfg80211_iface_combinations_from_fw()
2737 combo = conc->combos; in wil_cfg80211_iface_combinations_from_fw()
2738 n_combos = le16_to_cpu(conc->n_combos); in wil_cfg80211_iface_combinations_from_fw()
2740 total_limits += combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2741 limit = combo->limits + combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2750 return -ENOMEM; in wil_cfg80211_iface_combinations_from_fw()
2753 combo = conc->combos; in wil_cfg80211_iface_combinations_from_fw()
2755 iface_combinations[i].max_interfaces = combo->max_interfaces; in wil_cfg80211_iface_combinations_from_fw()
2757 combo->n_diff_channels; in wil_cfg80211_iface_combinations_from_fw()
2759 combo->same_bi; in wil_cfg80211_iface_combinations_from_fw()
2760 iface_combinations[i].n_limits = combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2766 limit = combo->limits; in wil_cfg80211_iface_combinations_from_fw()
2767 for (j = 0; j < combo->n_limits; j++) { in wil_cfg80211_iface_combinations_from_fw()
2775 iface_limit += combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2776 limit += combo->n_limits; in wil_cfg80211_iface_combinations_from_fw()
2780 wil_dbg_misc(wil, "multiple VIFs supported, n_mids %d\n", conc->n_mids); in wil_cfg80211_iface_combinations_from_fw()
2781 wil->max_vifs = conc->n_mids + 1; /* including main interface */ in wil_cfg80211_iface_combinations_from_fw()
2782 if (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()
2785 wil->max_vifs = WIL_MAX_VIFS; in wil_cfg80211_iface_combinations_from_fw()
2787 wiphy->n_iface_combinations = n_combos; in wil_cfg80211_iface_combinations_from_fw()
2788 wiphy->iface_combinations = iface_combinations; in wil_cfg80211_iface_combinations_from_fw()
2806 return ERR_PTR(-ENOMEM); in wil_cfg80211_init()
2812 wil->wiphy = wiphy; in wil_cfg80211_init()
2815 ch = wiphy->bands[NL80211_BAND_60GHZ]->channels; in wil_cfg80211_init()
2816 cfg80211_chandef_create(&wil->monitor_chandef, ch, NL80211_CHAN_NO_HT); in wil_cfg80211_init()
2830 kfree(wiphy->iface_combinations); in wil_cfg80211_deinit()
2831 wiphy->iface_combinations = NULL; in wil_cfg80211_deinit()
2841 mutex_lock(&wil->vif_mutex); in wil_p2p_wdev_free()
2842 p2p_wdev = wil->p2p_wdev; in wil_p2p_wdev_free()
2843 wil->p2p_wdev = NULL; in wil_p2p_wdev_free()
2844 wil->radio_wdev = wil->main_ndev->ieee80211_ptr; in wil_p2p_wdev_free()
2845 mutex_unlock(&wil->vif_mutex); in wil_p2p_wdev_free()
2858 return -EINVAL; in wil_rf_sector_status_to_rc()
2860 return -EAGAIN; in wil_rf_sector_status_to_rc()
2862 return -EOPNOTSUPP; in wil_rf_sector_status_to_rc()
2864 return -EINVAL; in wil_rf_sector_status_to_rc()
2891 if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities)) in wil_rf_sector_get_cfg()
2892 return -EOPNOTSUPP; in wil_rf_sector_get_cfg()
2905 return -EINVAL; in wil_rf_sector_get_cfg()
2912 return -EINVAL; in wil_rf_sector_get_cfg()
2918 return -EINVAL; in wil_rf_sector_get_cfg()
2925 return -EINVAL; in wil_rf_sector_get_cfg()
2931 rc = wmi_call(wil, WMI_GET_RF_SECTOR_PARAMS_CMDID, vif->mid, in wil_rf_sector_get_cfg()
2946 return -ENOMEM; in wil_rf_sector_get_cfg()
2966 le32_to_cpu(si->etype0)) || in wil_rf_sector_get_cfg()
2968 le32_to_cpu(si->etype1)) || in wil_rf_sector_get_cfg()
2970 le32_to_cpu(si->etype2)) || in wil_rf_sector_get_cfg()
2972 le32_to_cpu(si->psh_hi)) || in wil_rf_sector_get_cfg()
2974 le32_to_cpu(si->psh_lo)) || in wil_rf_sector_get_cfg()
2976 le32_to_cpu(si->dtype_swch_off))) in wil_rf_sector_get_cfg()
2986 return -ENOBUFS; in wil_rf_sector_get_cfg()
3011 if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities)) in wil_rf_sector_set_cfg()
3012 return -EOPNOTSUPP; in wil_rf_sector_set_cfg()
3025 return -EINVAL; in wil_rf_sector_set_cfg()
3032 return -EINVAL; in wil_rf_sector_set_cfg()
3038 return -EINVAL; in wil_rf_sector_set_cfg()
3054 return -EINVAL; in wil_rf_sector_set_cfg()
3065 return -EINVAL; in wil_rf_sector_set_cfg()
3073 return -EINVAL; in wil_rf_sector_set_cfg()
3077 si->etype0 = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3079 si->etype1 = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3081 si->etype2 = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3083 si->psh_hi = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3085 si->psh_lo = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3087 si->dtype_swch_off = cpu_to_le32(nla_get_u32( in wil_rf_sector_set_cfg()
3092 rc = wmi_call(wil, WMI_SET_RF_SECTOR_PARAMS_CMDID, vif->mid, in wil_rf_sector_set_cfg()
3120 if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities)) in wil_rf_sector_get_selected()
3121 return -EOPNOTSUPP; in wil_rf_sector_get_selected()
3132 return -EINVAL; in wil_rf_sector_get_selected()
3137 return -EINVAL; in wil_rf_sector_get_selected()
3142 cid = wil_find_cid(wil, vif->mid, mac_addr); in wil_rf_sector_get_selected()
3145 return -ENOENT; in wil_rf_sector_get_selected()
3148 if (test_bit(wil_vif_fwconnected, vif->status)) { in wil_rf_sector_get_selected()
3150 return -EINVAL; in wil_rf_sector_get_selected()
3157 rc = wmi_call(wil, WMI_GET_SELECTED_RF_SECTOR_INDEX_CMDID, vif->mid, in wil_rf_sector_get_selected()
3173 return -ENOMEM; in wil_rf_sector_get_selected()
3186 return -ENOBUFS; in wil_rf_sector_get_selected()
3228 if (!test_bit(WMI_FW_CAPABILITY_RF_SECTORS, wil->fw_capabilities)) in wil_rf_sector_set_selected()
3229 return -EOPNOTSUPP; in wil_rf_sector_set_selected()
3241 return -EINVAL; in wil_rf_sector_set_selected()
3249 return -EINVAL; in wil_rf_sector_set_selected()
3255 return -EINVAL; in wil_rf_sector_set_selected()
3261 cid = wil_find_cid(wil, vif->mid, mac_addr); in wil_rf_sector_set_selected()
3265 return -ENOENT; in wil_rf_sector_set_selected()
3270 return -EINVAL; in wil_rf_sector_set_selected()
3272 cid = -1; in wil_rf_sector_set_selected()
3275 if (test_bit(wil_vif_fwconnected, vif->status)) { in wil_rf_sector_set_selected()
3277 return -EINVAL; in wil_rf_sector_set_selected()
3283 rc = wil_rf_sector_wmi_set_selected(wil, vif->mid, sector_index, in wil_rf_sector_set_selected()
3288 wil, vif->mid, WMI_INVALID_RF_SECTOR_INDEX, in wil_rf_sector_set_selected()
3290 if (rc == -EINVAL) { in wil_rf_sector_set_selected()
3291 for (i = 0; i < wil->max_assoc_sta; i++) { in wil_rf_sector_set_selected()
3292 if (wil->sta[i].mid != vif->mid) in wil_rf_sector_set_selected()
3295 wil, vif->mid, in wil_rf_sector_set_selected()