Lines Matching +full:get +full:- +full:wiphy
1 // SPDX-License-Identifier: GPL-2.0+
2 /* Copyright (c) 2015-2016 Quantenna Communications. All rights reserved. */
74 qtnf_validate_iface_combinations(struct wiphy *wiphy, in qtnf_validate_iface_combinations() argument
86 mac = wiphy_priv(wiphy); in qtnf_validate_iface_combinations()
88 return -EFAULT; in qtnf_validate_iface_combinations()
91 vif = &mac->iflist[i]; in qtnf_validate_iface_combinations()
92 if (vif->wdev.iftype != NL80211_IFTYPE_UNSPECIFIED) in qtnf_validate_iface_combinations()
93 params.iftype_num[vif->wdev.iftype]++; in qtnf_validate_iface_combinations()
98 params.iftype_num[change_vif->wdev.iftype]--; in qtnf_validate_iface_combinations()
103 ret = cfg80211_check_combinations(wiphy, ¶ms); in qtnf_validate_iface_combinations()
113 if (vif && vif->wdev.iftype == NL80211_IFTYPE_AP && in qtnf_validate_iface_combinations()
115 ret = -EINVAL; in qtnf_validate_iface_combinations()
117 mac->macid); in qtnf_validate_iface_combinations()
124 qtnf_change_virtual_intf(struct wiphy *wiphy, in qtnf_change_virtual_intf() argument
134 ret = qtnf_validate_iface_combinations(wiphy, vif, type); in qtnf_change_virtual_intf()
137 vif->mac->macid, vif->vifid, type); in qtnf_change_virtual_intf()
142 mac_addr = params->macaddr; in qtnf_change_virtual_intf()
143 use4addr = params->use_4addr; in qtnf_change_virtual_intf()
146 qtnf_scan_done(vif->mac, true); in qtnf_change_virtual_intf()
151 vif->mac->macid, vif->vifid, type); in qtnf_change_virtual_intf()
155 vif->wdev.iftype = type; in qtnf_change_virtual_intf()
159 int qtnf_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev) in qtnf_del_virtual_intf() argument
161 struct net_device *netdev = wdev->netdev; in qtnf_del_virtual_intf()
166 return -EFAULT; in qtnf_del_virtual_intf()
168 vif = qtnf_netdev_get_priv(wdev->netdev); in qtnf_del_virtual_intf()
170 qtnf_scan_done(vif->mac, true); in qtnf_del_virtual_intf()
177 while ((skb = skb_dequeue(&vif->high_pri_tx_queue))) in qtnf_del_virtual_intf()
180 cancel_work_sync(&vif->high_pri_tx_work); in qtnf_del_virtual_intf()
182 if (netdev->reg_state == NETREG_REGISTERED) in qtnf_del_virtual_intf()
186 pr_err("VIF%u.%u: failed to delete VIF\n", vif->mac->macid, in qtnf_del_virtual_intf()
187 vif->vifid); in qtnf_del_virtual_intf()
189 vif->netdev->ieee80211_ptr = NULL; in qtnf_del_virtual_intf()
190 vif->netdev = NULL; in qtnf_del_virtual_intf()
191 vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED; in qtnf_del_virtual_intf()
196 static struct wireless_dev *qtnf_add_virtual_intf(struct wiphy *wiphy, in qtnf_add_virtual_intf() argument
208 mac = wiphy_priv(wiphy); in qtnf_add_virtual_intf()
211 return ERR_PTR(-EFAULT); in qtnf_add_virtual_intf()
213 ret = qtnf_validate_iface_combinations(wiphy, NULL, type); in qtnf_add_virtual_intf()
216 mac->macid, type); in qtnf_add_virtual_intf()
225 pr_err("MAC%u: no free VIF available\n", mac->macid); in qtnf_add_virtual_intf()
226 return ERR_PTR(-EFAULT); in qtnf_add_virtual_intf()
229 eth_zero_addr(vif->mac_addr); in qtnf_add_virtual_intf()
230 eth_zero_addr(vif->bssid); in qtnf_add_virtual_intf()
231 vif->bss_priority = QTNF_DEF_BSS_PRIORITY; in qtnf_add_virtual_intf()
232 memset(&vif->wdev, 0, sizeof(vif->wdev)); in qtnf_add_virtual_intf()
233 vif->wdev.wiphy = wiphy; in qtnf_add_virtual_intf()
234 vif->wdev.iftype = type; in qtnf_add_virtual_intf()
237 pr_err("MAC%u: unsupported IF type %d\n", mac->macid, type); in qtnf_add_virtual_intf()
238 return ERR_PTR(-ENOTSUPP); in qtnf_add_virtual_intf()
242 mac_addr = params->macaddr; in qtnf_add_virtual_intf()
243 use4addr = params->use_4addr; in qtnf_add_virtual_intf()
249 mac->macid, vif->vifid, mac_addr); in qtnf_add_virtual_intf()
253 if (!is_valid_ether_addr(vif->mac_addr)) { in qtnf_add_virtual_intf()
255 mac->macid, vif->vifid, vif->mac_addr); in qtnf_add_virtual_intf()
256 ret = -EINVAL; in qtnf_add_virtual_intf()
262 pr_err("VIF%u.%u: failed to attach netdev\n", mac->macid, in qtnf_add_virtual_intf()
263 vif->vifid); in qtnf_add_virtual_intf()
267 if (qtnf_hwcap_is_set(&mac->bus->hw_info, QLINK_HW_CAPAB_HW_BRIDGE)) { in qtnf_add_virtual_intf()
268 ret = qtnf_cmd_netdev_changeupper(vif, vif->netdev->ifindex); in qtnf_add_virtual_intf()
270 cfg80211_unregister_netdevice(vif->netdev); in qtnf_add_virtual_intf()
271 vif->netdev = NULL; in qtnf_add_virtual_intf()
276 vif->wdev.netdev = vif->netdev; in qtnf_add_virtual_intf()
277 return &vif->wdev; in qtnf_add_virtual_intf()
282 vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED; in qtnf_add_virtual_intf()
292 if (!info->beacon_ies || !info->beacon_ies_len) { in qtnf_mgmt_set_appie()
297 info->beacon_ies, in qtnf_mgmt_set_appie()
298 info->beacon_ies_len); in qtnf_mgmt_set_appie()
304 if (!info->proberesp_ies || !info->proberesp_ies_len) { in qtnf_mgmt_set_appie()
311 info->proberesp_ies, in qtnf_mgmt_set_appie()
312 info->proberesp_ies_len); in qtnf_mgmt_set_appie()
318 if (!info->assocresp_ies || !info->assocresp_ies_len) { in qtnf_mgmt_set_appie()
325 info->assocresp_ies, in qtnf_mgmt_set_appie()
326 info->assocresp_ies_len); in qtnf_mgmt_set_appie()
333 static int qtnf_change_beacon(struct wiphy *wiphy, struct net_device *dev, in qtnf_change_beacon() argument
338 return qtnf_mgmt_set_appie(vif, &info->beacon); in qtnf_change_beacon()
341 static int qtnf_start_ap(struct wiphy *wiphy, struct net_device *dev, in qtnf_start_ap() argument
349 pr_err("VIF%u.%u: failed to start AP\n", vif->mac->macid, in qtnf_start_ap()
350 vif->vifid); in qtnf_start_ap()
355 static int qtnf_stop_ap(struct wiphy *wiphy, struct net_device *dev, in qtnf_stop_ap() argument
361 qtnf_scan_done(vif->mac, true); in qtnf_stop_ap()
366 vif->mac->macid, vif->vifid); in qtnf_stop_ap()
368 netif_carrier_off(vif->netdev); in qtnf_stop_ap()
373 static int qtnf_set_wiphy_params(struct wiphy *wiphy, int radio_idx, in qtnf_set_wiphy_params() argument
376 struct qtnf_wmac *mac = wiphy_priv(wiphy); in qtnf_set_wiphy_params()
382 pr_err("MAC%u: primary VIF is not configured\n", mac->macid); in qtnf_set_wiphy_params()
383 return -EFAULT; in qtnf_set_wiphy_params()
388 pr_err("MAC%u: failed to update PHY params\n", mac->macid); in qtnf_set_wiphy_params()
394 qtnf_update_mgmt_frame_registrations(struct wiphy *wiphy, in qtnf_update_mgmt_frame_registrations() argument
398 struct qtnf_vif *vif = qtnf_netdev_get_priv(wdev->netdev); in qtnf_update_mgmt_frame_registrations()
399 u16 new_mask = upd->interface_stypes; in qtnf_update_mgmt_frame_registrations()
400 u16 old_mask = vif->mgmt_frames_bitmask; in qtnf_update_mgmt_frame_registrations()
440 vif->mac->macid, vif->vifid, reg ? "" : "un", in qtnf_update_mgmt_frame_registrations()
444 vif->mgmt_frames_bitmask = new_mask; in qtnf_update_mgmt_frame_registrations()
448 qtnf_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, in qtnf_mgmt_tx() argument
451 struct qtnf_vif *vif = qtnf_netdev_get_priv(wdev->netdev); in qtnf_mgmt_tx()
452 const struct ieee80211_mgmt *mgmt_frame = (void *)params->buf; in qtnf_mgmt_tx()
459 if (params->offchan) in qtnf_mgmt_tx()
462 if (params->no_cck) in qtnf_mgmt_tx()
465 if (params->dont_wait_for_ack) in qtnf_mgmt_tx()
471 if (params->chan) in qtnf_mgmt_tx()
472 freq = params->chan->center_freq; in qtnf_mgmt_tx()
477 wdev->netdev->name, freq, in qtnf_mgmt_tx()
478 le16_to_cpu(mgmt_frame->frame_control), mgmt_frame->da, in qtnf_mgmt_tx()
479 params->len, short_cookie, flags); in qtnf_mgmt_tx()
482 freq, params->buf, params->len); in qtnf_mgmt_tx()
486 qtnf_get_station(struct wiphy *wiphy, struct net_device *dev, in qtnf_get_station() argument
491 sinfo->generation = vif->generation; in qtnf_get_station()
496 qtnf_dump_station(struct wiphy *wiphy, struct net_device *dev, in qtnf_dump_station() argument
503 switch (vif->wdev.iftype) { in qtnf_dump_station()
505 if (idx != 0 || !vif->wdev.connected) in qtnf_dump_station()
506 return -ENOENT; in qtnf_dump_station()
508 ether_addr_copy(mac, vif->bssid); in qtnf_dump_station()
511 sta_node = qtnf_sta_list_lookup_index(&vif->sta_list, idx); in qtnf_dump_station()
513 return -ENOENT; in qtnf_dump_station()
515 ether_addr_copy(mac, sta_node->mac_addr); in qtnf_dump_station()
518 return -ENOTSUPP; in qtnf_dump_station()
523 if (vif->wdev.iftype == NL80211_IFTYPE_AP) { in qtnf_dump_station()
524 if (ret == -ENOENT) { in qtnf_dump_station()
525 cfg80211_del_sta(vif->netdev, mac, GFP_KERNEL); in qtnf_dump_station()
526 sinfo->filled = 0; in qtnf_dump_station()
530 sinfo->generation = vif->generation; in qtnf_dump_station()
535 static int qtnf_add_key(struct wiphy *wiphy, struct net_device *dev, in qtnf_add_key() argument
545 vif->mac->macid, vif->vifid, params->cipher, key_index, in qtnf_add_key()
551 static int qtnf_del_key(struct wiphy *wiphy, struct net_device *dev, in qtnf_del_key() argument
560 if (ret == -ENOENT) { in qtnf_del_key()
562 vif->mac->macid, vif->vifid, key_index); in qtnf_del_key()
565 vif->mac->macid, vif->vifid, in qtnf_del_key()
573 static int qtnf_set_default_key(struct wiphy *wiphy, struct net_device *dev, in qtnf_set_default_key() argument
583 vif->mac->macid, vif->vifid, key_index, unicast, in qtnf_set_default_key()
590 qtnf_set_default_mgmt_key(struct wiphy *wiphy, struct net_device *dev, in qtnf_set_default_mgmt_key() argument
599 vif->mac->macid, vif->vifid, key_index); in qtnf_set_default_mgmt_key()
605 qtnf_change_station(struct wiphy *wiphy, struct net_device *dev, in qtnf_change_station() argument
614 vif->mac->macid, vif->vifid, mac); in qtnf_change_station()
620 qtnf_del_station(struct wiphy *wiphy, struct net_device *dev, in qtnf_del_station() argument
626 if (params->mac && in qtnf_del_station()
627 (vif->wdev.iftype == NL80211_IFTYPE_AP) && in qtnf_del_station()
628 !is_broadcast_ether_addr(params->mac) && in qtnf_del_station()
629 !qtnf_sta_list_lookup(&vif->sta_list, params->mac)) in qtnf_del_station()
635 vif->mac->macid, vif->vifid, params->mac); in qtnf_del_station()
641 qtnf_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request) in qtnf_scan() argument
643 struct qtnf_wmac *mac = wiphy_priv(wiphy); in qtnf_scan()
646 cancel_delayed_work_sync(&mac->scan_timeout); in qtnf_scan()
648 mac->scan_req = request; in qtnf_scan()
652 pr_err("MAC%u: failed to start scan\n", mac->macid); in qtnf_scan()
653 mac->scan_req = NULL; in qtnf_scan()
657 pr_debug("MAC%u: scan started\n", mac->macid); in qtnf_scan()
658 queue_delayed_work(mac->bus->workqueue, &mac->scan_timeout, in qtnf_scan()
666 qtnf_connect(struct wiphy *wiphy, struct net_device *dev, in qtnf_connect() argument
672 if (vif->wdev.iftype != NL80211_IFTYPE_STATION) in qtnf_connect()
673 return -EOPNOTSUPP; in qtnf_connect()
675 if (sme->auth_type == NL80211_AUTHTYPE_SAE && in qtnf_connect()
676 !(sme->flags & CONNECT_REQ_EXTERNAL_AUTH_SUPPORT)) { in qtnf_connect()
678 return -EOPNOTSUPP; in qtnf_connect()
681 if (sme->bssid) in qtnf_connect()
682 ether_addr_copy(vif->bssid, sme->bssid); in qtnf_connect()
684 eth_zero_addr(vif->bssid); in qtnf_connect()
689 vif->mac->macid, vif->vifid); in qtnf_connect()
695 qtnf_external_auth(struct wiphy *wiphy, struct net_device *dev, in qtnf_external_auth() argument
701 if (vif->wdev.iftype == NL80211_IFTYPE_STATION && in qtnf_external_auth()
702 !ether_addr_equal(vif->bssid, auth->bssid)) in qtnf_external_auth()
703 pr_warn("unexpected bssid: %pM", auth->bssid); in qtnf_external_auth()
708 vif->mac->macid, vif->vifid); in qtnf_external_auth()
714 qtnf_disconnect(struct wiphy *wiphy, struct net_device *dev, in qtnf_disconnect() argument
717 struct qtnf_wmac *mac = wiphy_priv(wiphy); in qtnf_disconnect()
723 pr_err("MAC%u: primary VIF is not configured\n", mac->macid); in qtnf_disconnect()
724 return -EFAULT; in qtnf_disconnect()
727 if (vif->wdev.iftype != NL80211_IFTYPE_STATION) in qtnf_disconnect()
728 return -EOPNOTSUPP; in qtnf_disconnect()
733 mac->macid, vif->vifid); in qtnf_disconnect()
735 if (vif->wdev.connected) { in qtnf_disconnect()
736 netif_carrier_off(vif->netdev); in qtnf_disconnect()
737 cfg80211_disconnected(vif->netdev, reason_code, in qtnf_disconnect()
745 qtnf_dump_survey(struct wiphy *wiphy, struct net_device *dev, in qtnf_dump_survey() argument
748 struct qtnf_wmac *mac = wiphy_priv(wiphy); in qtnf_dump_survey()
749 struct wireless_dev *wdev = dev->ieee80211_ptr; in qtnf_dump_survey()
755 sband = wiphy->bands[NL80211_BAND_2GHZ]; in qtnf_dump_survey()
756 if (sband && idx >= sband->n_channels) { in qtnf_dump_survey()
757 idx -= sband->n_channels; in qtnf_dump_survey()
762 sband = wiphy->bands[NL80211_BAND_5GHZ]; in qtnf_dump_survey()
764 if (!sband || idx >= sband->n_channels) in qtnf_dump_survey()
765 return -ENOENT; in qtnf_dump_survey()
767 chan = &sband->channels[idx]; in qtnf_dump_survey()
768 survey->channel = chan; in qtnf_dump_survey()
769 survey->filled = 0x0; in qtnf_dump_survey()
771 if (chandef && chan == chandef->chan) in qtnf_dump_survey()
772 survey->filled = SURVEY_INFO_IN_USE; in qtnf_dump_survey()
774 ret = qtnf_cmd_get_chan_stats(mac, chan->center_freq, survey); in qtnf_dump_survey()
776 pr_debug("failed to get chan(%d) stats from card\n", in qtnf_dump_survey()
777 chan->hw_value); in qtnf_dump_survey()
783 qtnf_get_channel(struct wiphy *wiphy, struct wireless_dev *wdev, in qtnf_get_channel() argument
786 struct net_device *ndev = wdev->netdev; in qtnf_get_channel()
791 return -ENODEV; in qtnf_get_channel()
793 vif = qtnf_netdev_get_priv(wdev->netdev); in qtnf_get_channel()
797 pr_err("%s: failed to get channel: %d\n", ndev->name, ret); in qtnf_get_channel()
798 ret = -ENODATA; in qtnf_get_channel()
804 ndev->name, chandef->chan->center_freq, in qtnf_get_channel()
805 chandef->center_freq1, chandef->center_freq2, in qtnf_get_channel()
806 chandef->width); in qtnf_get_channel()
807 ret = -ENODATA; in qtnf_get_channel()
815 static int qtnf_channel_switch(struct wiphy *wiphy, struct net_device *dev, in qtnf_channel_switch() argument
821 pr_debug("%s: chan(%u) count(%u) radar(%u) block_tx(%u)\n", dev->name, in qtnf_channel_switch()
822 params->chandef.chan->hw_value, params->count, in qtnf_channel_switch()
823 params->radar_required, params->block_tx); in qtnf_channel_switch()
825 if (!cfg80211_chandef_valid(¶ms->chandef)) { in qtnf_channel_switch()
826 pr_err("%s: invalid channel\n", dev->name); in qtnf_channel_switch()
827 return -EINVAL; in qtnf_channel_switch()
833 dev->name, params->chandef.chan->hw_value); in qtnf_channel_switch()
838 static int qtnf_start_radar_detection(struct wiphy *wiphy, in qtnf_start_radar_detection() argument
846 if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) in qtnf_start_radar_detection()
847 return -ENOTSUPP; in qtnf_start_radar_detection()
851 pr_err("%s: failed to start CAC ret=%d\n", ndev->name, ret); in qtnf_start_radar_detection()
856 static int qtnf_set_mac_acl(struct wiphy *wiphy, in qtnf_set_mac_acl() argument
865 pr_err("%s: failed to set mac ACL ret=%d\n", dev->name, ret); in qtnf_set_mac_acl()
870 static int qtnf_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, in qtnf_set_power_mgmt() argument
879 pr_err("%s: failed to set PM mode ret=%d\n", dev->name, ret); in qtnf_set_power_mgmt()
884 static int qtnf_get_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev, in qtnf_get_tx_power() argument
887 struct qtnf_vif *vif = qtnf_netdev_get_priv(wdev->netdev); in qtnf_get_tx_power()
892 pr_err("MAC%u: failed to get Tx power\n", vif->mac->macid); in qtnf_get_tx_power()
897 static int qtnf_set_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev, in qtnf_set_tx_power() argument
905 vif = qtnf_netdev_get_priv(wdev->netdev); in qtnf_set_tx_power()
907 struct qtnf_wmac *mac = wiphy_priv(wiphy); in qtnf_set_tx_power()
912 mac->macid); in qtnf_set_tx_power()
913 return -EFAULT; in qtnf_set_tx_power()
919 pr_err("MAC%u: failed to set Tx power\n", vif->mac->macid); in qtnf_set_tx_power()
924 static int qtnf_update_owe_info(struct wiphy *wiphy, struct net_device *dev, in qtnf_update_owe_info() argument
930 if (vif->wdev.iftype != NL80211_IFTYPE_AP) in qtnf_update_owe_info()
931 return -EOPNOTSUPP; in qtnf_update_owe_info()
936 vif->mac->macid, vif->vifid); in qtnf_update_owe_info()
942 static int qtnf_suspend(struct wiphy *wiphy, struct cfg80211_wowlan *wowlan) in qtnf_suspend() argument
944 struct qtnf_wmac *mac = wiphy_priv(wiphy); in qtnf_suspend()
950 pr_err("MAC%u: primary VIF is not configured\n", mac->macid); in qtnf_suspend()
951 ret = -EFAULT; in qtnf_suspend()
957 qtnf_virtual_intf_cleanup(vif->netdev); in qtnf_suspend()
961 qtnf_scan_done(vif->mac, true); in qtnf_suspend()
966 mac->macid); in qtnf_suspend()
974 static int qtnf_resume(struct wiphy *wiphy) in qtnf_resume() argument
976 struct qtnf_wmac *mac = wiphy_priv(wiphy); in qtnf_resume()
982 pr_err("MAC%u: primary VIF is not configured\n", mac->macid); in qtnf_resume()
983 return -EFAULT; in qtnf_resume()
989 mac->macid); in qtnf_resume()
994 static void qtnf_set_wakeup(struct wiphy *wiphy, bool enabled) in qtnf_set_wakeup() argument
996 struct qtnf_wmac *mac = wiphy_priv(wiphy); in qtnf_set_wakeup()
997 struct qtnf_bus *bus = mac->bus; in qtnf_set_wakeup()
999 device_set_wakeup_enable(bus->dev, enabled); in qtnf_set_wakeup()
1042 static void qtnf_cfg80211_reg_notifier(struct wiphy *wiphy, in qtnf_cfg80211_reg_notifier() argument
1045 struct qtnf_wmac *mac = wiphy_priv(wiphy); in qtnf_cfg80211_reg_notifier()
1049 pr_debug("MAC%u: initiator=%d alpha=%c%c\n", mac->macid, req->initiator, in qtnf_cfg80211_reg_notifier()
1050 req->alpha2[0], req->alpha2[1]); in qtnf_cfg80211_reg_notifier()
1056 mac->macid, req->alpha2[0], req->alpha2[1], ret); in qtnf_cfg80211_reg_notifier()
1061 if (!wiphy->bands[band]) in qtnf_cfg80211_reg_notifier()
1064 ret = qtnf_cmd_band_info_get(mac, wiphy->bands[band]); in qtnf_cfg80211_reg_notifier()
1067 mac->macid, band); in qtnf_cfg80211_reg_notifier()
1071 struct wiphy *qtnf_wiphy_allocate(struct qtnf_bus *bus, in qtnf_wiphy_allocate()
1074 struct wiphy *wiphy; in qtnf_wiphy_allocate() local
1077 qtnf_hwcap_is_set(&bus->hw_info, QLINK_HW_CAPAB_DFS_OFFLOAD)) in qtnf_wiphy_allocate()
1080 if (!qtnf_hwcap_is_set(&bus->hw_info, QLINK_HW_CAPAB_PWR_MGMT)) in qtnf_wiphy_allocate()
1083 wiphy = wiphy_new(&qtn_cfg80211_ops, sizeof(struct qtnf_wmac)); in qtnf_wiphy_allocate()
1084 if (!wiphy) in qtnf_wiphy_allocate()
1088 set_wiphy_dev(wiphy, &pdev->dev); in qtnf_wiphy_allocate()
1090 set_wiphy_dev(wiphy, bus->dev); in qtnf_wiphy_allocate()
1092 return wiphy; in qtnf_wiphy_allocate()
1096 qtnf_wiphy_setup_if_comb(struct wiphy *wiphy, struct qtnf_mac_info *mac_info) in qtnf_wiphy_setup_if_comb() argument
1103 if_comb = mac_info->if_comb; in qtnf_wiphy_setup_if_comb()
1104 n_if_comb = mac_info->n_if_comb; in qtnf_wiphy_setup_if_comb()
1107 return -ENOENT; in qtnf_wiphy_setup_if_comb()
1110 if_comb[i].radar_detect_widths = mac_info->radar_detect_widths; in qtnf_wiphy_setup_if_comb()
1116 wiphy->iface_combinations = if_comb; in qtnf_wiphy_setup_if_comb()
1117 wiphy->n_iface_combinations = n_if_comb; in qtnf_wiphy_setup_if_comb()
1118 wiphy->interface_modes = interface_modes; in qtnf_wiphy_setup_if_comb()
1125 struct wiphy *wiphy = priv_to_wiphy(mac); in qtnf_wiphy_register() local
1126 struct qtnf_mac_info *macinfo = &mac->macinfo; in qtnf_wiphy_register()
1130 if (!wiphy) { in qtnf_wiphy_register()
1131 pr_err("invalid wiphy pointer\n"); in qtnf_wiphy_register()
1132 return -EFAULT; in qtnf_wiphy_register()
1135 wiphy->frag_threshold = macinfo->frag_thr; in qtnf_wiphy_register()
1136 wiphy->rts_threshold = macinfo->rts_thr; in qtnf_wiphy_register()
1137 wiphy->retry_short = macinfo->sretry_limit; in qtnf_wiphy_register()
1138 wiphy->retry_long = macinfo->lretry_limit; in qtnf_wiphy_register()
1139 wiphy->coverage_class = macinfo->coverage_class; in qtnf_wiphy_register()
1141 wiphy->max_scan_ssids = in qtnf_wiphy_register()
1142 (macinfo->max_scan_ssids) ? macinfo->max_scan_ssids : 1; in qtnf_wiphy_register()
1143 wiphy->max_scan_ie_len = QTNF_MAX_VSIE_LEN; in qtnf_wiphy_register()
1144 wiphy->mgmt_stypes = qtnf_mgmt_stypes; in qtnf_wiphy_register()
1145 wiphy->max_remain_on_channel_duration = 5000; in qtnf_wiphy_register()
1146 wiphy->max_acl_mac_addrs = macinfo->max_acl_mac_addrs; in qtnf_wiphy_register()
1147 wiphy->max_num_csa_counters = 2; in qtnf_wiphy_register()
1149 ret = qtnf_wiphy_setup_if_comb(wiphy, macinfo); in qtnf_wiphy_register()
1154 wiphy->cipher_suites = qtnf_cipher_suites; in qtnf_wiphy_register()
1155 wiphy->n_cipher_suites = ARRAY_SIZE(qtnf_cipher_suites); in qtnf_wiphy_register()
1156 wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; in qtnf_wiphy_register()
1157 wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME | in qtnf_wiphy_register()
1163 wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; in qtnf_wiphy_register()
1167 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD); in qtnf_wiphy_register()
1170 wiphy_ext_feature_set(wiphy, in qtnf_wiphy_register()
1173 wiphy->probe_resp_offload = NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS | in qtnf_wiphy_register()
1176 wiphy->available_antennas_tx = macinfo->num_tx_chain; in qtnf_wiphy_register()
1177 wiphy->available_antennas_rx = macinfo->num_rx_chain; in qtnf_wiphy_register()
1179 wiphy->max_ap_assoc_sta = macinfo->max_ap_assoc_sta; in qtnf_wiphy_register()
1180 wiphy->ht_capa_mod_mask = &macinfo->ht_cap_mod_mask; in qtnf_wiphy_register()
1181 wiphy->vht_capa_mod_mask = &macinfo->vht_cap_mod_mask; in qtnf_wiphy_register()
1183 ether_addr_copy(wiphy->perm_addr, mac->macaddr); in qtnf_wiphy_register()
1186 wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER; in qtnf_wiphy_register()
1189 wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR; in qtnf_wiphy_register()
1192 wiphy->features |= NL80211_FEATURE_NEED_OBSS_SCAN; in qtnf_wiphy_register()
1195 wiphy->features |= NL80211_FEATURE_SAE; in qtnf_wiphy_register()
1198 if (macinfo->wowlan) in qtnf_wiphy_register()
1199 wiphy->wowlan = macinfo->wowlan; in qtnf_wiphy_register()
1202 regdomain_is_known = isalpha(mac->rd->alpha2[0]) && in qtnf_wiphy_register()
1203 isalpha(mac->rd->alpha2[1]); in qtnf_wiphy_register()
1206 wiphy->reg_notifier = qtnf_cfg80211_reg_notifier; in qtnf_wiphy_register()
1208 if (mac->rd->alpha2[0] == '9' && mac->rd->alpha2[1] == '9') { in qtnf_wiphy_register()
1209 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG | in qtnf_wiphy_register()
1211 wiphy_apply_custom_regulatory(wiphy, mac->rd); in qtnf_wiphy_register()
1213 wiphy->regulatory_flags |= REGULATORY_STRICT_REG; in qtnf_wiphy_register()
1216 wiphy->regulatory_flags |= REGULATORY_WIPHY_SELF_MANAGED; in qtnf_wiphy_register()
1219 if (mac->macinfo.extended_capabilities_len) { in qtnf_wiphy_register()
1220 wiphy->extended_capabilities = in qtnf_wiphy_register()
1221 mac->macinfo.extended_capabilities; in qtnf_wiphy_register()
1222 wiphy->extended_capabilities_mask = in qtnf_wiphy_register()
1223 mac->macinfo.extended_capabilities_mask; in qtnf_wiphy_register()
1224 wiphy->extended_capabilities_len = in qtnf_wiphy_register()
1225 mac->macinfo.extended_capabilities_len; in qtnf_wiphy_register()
1228 strscpy(wiphy->fw_version, hw_info->fw_version, in qtnf_wiphy_register()
1229 sizeof(wiphy->fw_version)); in qtnf_wiphy_register()
1230 wiphy->hw_version = hw_info->hw_version; in qtnf_wiphy_register()
1232 ret = wiphy_register(wiphy); in qtnf_wiphy_register()
1236 if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) in qtnf_wiphy_register()
1237 ret = regulatory_set_wiphy_regd(wiphy, mac->rd); in qtnf_wiphy_register()
1239 ret = regulatory_hint(wiphy, mac->rd->alpha2); in qtnf_wiphy_register()
1251 up ? "UP" : "DOWN", vif->mac->macid, vif->vifid); in qtnf_netdev_updown()
1257 struct qtnf_wmac *mac = wiphy_priv(vif->wdev.wiphy); in qtnf_virtual_intf_cleanup()
1259 if (vif->wdev.iftype == NL80211_IFTYPE_STATION) in qtnf_virtual_intf_cleanup()
1260 qtnf_disconnect(vif->wdev.wiphy, ndev, in qtnf_virtual_intf_cleanup()
1268 if (vif->wdev.iftype == NL80211_IFTYPE_STATION) in qtnf_cfg80211_vif_reset()
1269 cfg80211_disconnected(vif->netdev, WLAN_REASON_DEAUTH_LEAVING, in qtnf_cfg80211_vif_reset()
1272 cfg80211_shutdown_all_interfaces(vif->wdev.wiphy); in qtnf_cfg80211_vif_reset()
1277 switch (band->band) { in qtnf_band_init_rates()
1279 band->bitrates = qtnf_rates_2g; in qtnf_band_init_rates()
1280 band->n_bitrates = ARRAY_SIZE(qtnf_rates_2g); in qtnf_band_init_rates()
1283 band->bitrates = qtnf_rates_5g; in qtnf_band_init_rates()
1284 band->n_bitrates = ARRAY_SIZE(qtnf_rates_5g); in qtnf_band_init_rates()
1287 band->bitrates = NULL; in qtnf_band_init_rates()
1288 band->n_bitrates = 0; in qtnf_band_init_rates()