Lines Matching +full:cs +full:- +full:dev +full:- +full:assoc
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright 2011-2020 NXP
63 * The mapping is as follows -
64 * NL80211_CHAN_NO_HT -> IEEE80211_HT_PARAM_CHA_SEC_NONE
65 * NL80211_CHAN_HT20 -> IEEE80211_HT_PARAM_CHA_SEC_NONE
66 * NL80211_CHAN_HT40PLUS -> IEEE80211_HT_PARAM_CHA_SEC_ABOVE
67 * NL80211_CHAN_HT40MINUS -> IEEE80211_HT_PARAM_CHA_SEC_BELOW
68 * Others -> IEEE80211_HT_PARAM_CHA_SEC_NONE
153 mwifiex_dbg(priv->adapter, ERROR, "deleting the crypto keys\n"); in mwifiex_cfg80211_del_key()
154 return -EFAULT; in mwifiex_cfg80211_del_key()
157 mwifiex_dbg(priv->adapter, INFO, "info: crypto keys deleted\n"); in mwifiex_cfg80211_del_key()
186 len - sizeof(struct ieee80211_hdr_3addr)); in mwifiex_form_mgmt_frame()
188 skb->priority = LOW_PRIO_TID; in mwifiex_form_mgmt_frame()
201 const u8 *buf = params->buf; in mwifiex_cfg80211_mgmt_tx()
202 size_t len = params->len; in mwifiex_cfg80211_mgmt_tx()
207 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_cfg80211_mgmt_tx()
210 mwifiex_dbg(priv->adapter, ERROR, "invalid buffer and length\n"); in mwifiex_cfg80211_mgmt_tx()
211 return -EFAULT; in mwifiex_cfg80211_mgmt_tx()
216 ieee80211_is_probe_resp(mgmt->frame_control)) { in mwifiex_cfg80211_mgmt_tx()
219 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_mgmt_tx()
230 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_mgmt_tx()
232 return -ENOMEM; in mwifiex_cfg80211_mgmt_tx()
237 tx_info->bss_num = priv->bss_num; in mwifiex_cfg80211_mgmt_tx()
238 tx_info->bss_type = priv->bss_type; in mwifiex_cfg80211_mgmt_tx()
239 tx_info->pkt_len = pkt_len; in mwifiex_cfg80211_mgmt_tx()
244 if (ieee80211_is_action(mgmt->frame_control)) in mwifiex_cfg80211_mgmt_tx()
254 mwifiex_dbg(priv->adapter, INFO, "info: management frame transmitted\n"); in mwifiex_cfg80211_mgmt_tx()
266 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_cfg80211_update_mgmt_frame_registrations()
267 u32 mask = upd->interface_stypes; in mwifiex_cfg80211_update_mgmt_frame_registrations()
269 if (mask != priv->mgmt_frame_mask) { in mwifiex_cfg80211_update_mgmt_frame_registrations()
270 priv->mgmt_frame_mask = mask; in mwifiex_cfg80211_update_mgmt_frame_registrations()
273 &priv->mgmt_frame_mask, false); in mwifiex_cfg80211_update_mgmt_frame_registrations()
274 mwifiex_dbg(priv->adapter, INFO, "info: mgmt frame registered\n"); in mwifiex_cfg80211_update_mgmt_frame_registrations()
287 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_cfg80211_remain_on_channel()
291 mwifiex_dbg(priv->adapter, ERROR, "Invalid parameter for ROC\n"); in mwifiex_cfg80211_remain_on_channel()
292 return -EINVAL; in mwifiex_cfg80211_remain_on_channel()
295 if (priv->roc_cfg.cookie) { in mwifiex_cfg80211_remain_on_channel()
296 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_remain_on_channel()
298 priv->roc_cfg.cookie); in mwifiex_cfg80211_remain_on_channel()
299 return -EBUSY; in mwifiex_cfg80211_remain_on_channel()
307 priv->roc_cfg.cookie = *cookie; in mwifiex_cfg80211_remain_on_channel()
308 priv->roc_cfg.chan = *chan; in mwifiex_cfg80211_remain_on_channel()
313 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_remain_on_channel()
327 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_cfg80211_cancel_remain_on_channel()
330 if (cookie != priv->roc_cfg.cookie) in mwifiex_cfg80211_cancel_remain_on_channel()
331 return -ENOENT; in mwifiex_cfg80211_cancel_remain_on_channel()
334 &priv->roc_cfg.chan, 0); in mwifiex_cfg80211_cancel_remain_on_channel()
338 &priv->roc_cfg.chan, in mwifiex_cfg80211_cancel_remain_on_channel()
341 memset(&priv->roc_cfg, 0, sizeof(struct mwifiex_roc_cfg)); in mwifiex_cfg80211_cancel_remain_on_channel()
343 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_cancel_remain_on_channel()
403 *dbm = priv->tx_power_level; in mwifiex_cfg80211_get_tx_power()
415 struct net_device *dev, in mwifiex_cfg80211_set_power_mgmt() argument
418 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_set_power_mgmt()
422 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_set_power_mgmt()
441 if (!priv->sec_info.wep_enabled) in mwifiex_cfg80211_set_default_key()
444 if (priv->bss_type == MWIFIEX_BSS_TYPE_UAP) { in mwifiex_cfg80211_set_default_key()
445 priv->wep_key_curr_index = key_index; in mwifiex_cfg80211_set_default_key()
448 mwifiex_dbg(priv->adapter, ERROR, "set default Tx key index\n"); in mwifiex_cfg80211_set_default_key()
449 return -EFAULT; in mwifiex_cfg80211_set_default_key()
469 (params->cipher == WLAN_CIPHER_SUITE_WEP40 || in mwifiex_cfg80211_add_key()
470 params->cipher == WLAN_CIPHER_SUITE_WEP104)) { in mwifiex_cfg80211_add_key()
471 if (params->key && params->key_len) { in mwifiex_cfg80211_add_key()
472 wep_key = &priv->wep_key[key_index]; in mwifiex_cfg80211_add_key()
474 memcpy(wep_key->key_material, params->key, in mwifiex_cfg80211_add_key()
475 params->key_len); in mwifiex_cfg80211_add_key()
476 wep_key->key_index = key_index; in mwifiex_cfg80211_add_key()
477 wep_key->key_length = params->key_len; in mwifiex_cfg80211_add_key()
478 priv->sec_info.wep_enabled = 1; in mwifiex_cfg80211_add_key()
483 if (mwifiex_set_encode(priv, params, params->key, params->key_len, in mwifiex_cfg80211_add_key()
485 mwifiex_dbg(priv->adapter, ERROR, "crypto keys added\n"); in mwifiex_cfg80211_add_key()
486 return -EFAULT; in mwifiex_cfg80211_add_key()
514 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_set_default_mgmt_key()
516 return -1; in mwifiex_cfg80211_set_default_mgmt_key()
525 * The following information are passed to the firmware -
526 * - Country codes
527 * - Sub bands (first channel, number of channels, maximum Tx power)
541 struct mwifiex_802_11d_domain_reg *domain_info = &adapter->domain_reg; in mwifiex_send_domain_info_cmd_fw()
544 domain_info->country_code[0] = adapter->country_code[0]; in mwifiex_send_domain_info_cmd_fw()
545 domain_info->country_code[1] = adapter->country_code[1]; in mwifiex_send_domain_info_cmd_fw()
546 domain_info->country_code[2] = ' '; in mwifiex_send_domain_info_cmd_fw()
548 band = mwifiex_band_to_radio_type(adapter->config_bands); in mwifiex_send_domain_info_cmd_fw()
549 if (!wiphy->bands[band]) { in mwifiex_send_domain_info_cmd_fw()
552 return -1; in mwifiex_send_domain_info_cmd_fw()
555 sband = wiphy->bands[band]; in mwifiex_send_domain_info_cmd_fw()
557 for (i = 0; i < sband->n_channels ; i++) { in mwifiex_send_domain_info_cmd_fw()
558 ch = &sband->channels[i]; in mwifiex_send_domain_info_cmd_fw()
559 if (ch->flags & IEEE80211_CHAN_DISABLED) in mwifiex_send_domain_info_cmd_fw()
564 first_chan = (u32) ch->hw_value; in mwifiex_send_domain_info_cmd_fw()
566 max_pwr = ch->max_power; in mwifiex_send_domain_info_cmd_fw()
571 if (ch->hw_value == next_chan + 1 && in mwifiex_send_domain_info_cmd_fw()
572 ch->max_power == max_pwr) { in mwifiex_send_domain_info_cmd_fw()
576 t = &domain_info->triplet[no_of_triplet]; in mwifiex_send_domain_info_cmd_fw()
577 t->chans.first_channel = first_chan; in mwifiex_send_domain_info_cmd_fw()
578 t->chans.num_channels = no_of_parsed_chan; in mwifiex_send_domain_info_cmd_fw()
579 t->chans.max_power = max_pwr; in mwifiex_send_domain_info_cmd_fw()
581 first_chan = (u32) ch->hw_value; in mwifiex_send_domain_info_cmd_fw()
583 max_pwr = ch->max_power; in mwifiex_send_domain_info_cmd_fw()
589 t = &domain_info->triplet[no_of_triplet]; in mwifiex_send_domain_info_cmd_fw()
590 t->chans.first_channel = first_chan; in mwifiex_send_domain_info_cmd_fw()
591 t->chans.num_channels = no_of_parsed_chan; in mwifiex_send_domain_info_cmd_fw()
592 t->chans.max_power = max_pwr; in mwifiex_send_domain_info_cmd_fw()
596 domain_info->no_of_triplet = no_of_triplet; in mwifiex_send_domain_info_cmd_fw()
604 return -1; in mwifiex_send_domain_info_cmd_fw()
616 if (!wiphy->bands[NL80211_BAND_5GHZ]) in mwifiex_reg_apply_radar_flags()
618 sband = wiphy->bands[NL80211_BAND_5GHZ]; in mwifiex_reg_apply_radar_flags()
620 for (i = 0; i < sband->n_channels; i++) { in mwifiex_reg_apply_radar_flags()
621 chan = &sband->channels[i]; in mwifiex_reg_apply_radar_flags()
622 if ((!(chan->flags & IEEE80211_CHAN_DISABLED)) && in mwifiex_reg_apply_radar_flags()
623 (chan->flags & IEEE80211_CHAN_RADAR)) in mwifiex_reg_apply_radar_flags()
624 chan->flags |= IEEE80211_CHAN_NO_IR; in mwifiex_reg_apply_radar_flags()
632 * following reasons -
633 * - Set by driver
634 * - Set by system core
635 * - Set by user
636 * - Set bt Country IE
646 request->alpha2[0], request->alpha2[1]); in mwifiex_reg_notifier()
649 switch (request->initiator) { in mwifiex_reg_notifier()
658 request->initiator); in mwifiex_reg_notifier()
663 if (strncmp(request->alpha2, "00", 2) && in mwifiex_reg_notifier()
664 strncmp(request->alpha2, adapter->country_code, in mwifiex_reg_notifier()
665 sizeof(request->alpha2))) { in mwifiex_reg_notifier()
666 memcpy(adapter->country_code, request->alpha2, in mwifiex_reg_notifier()
667 sizeof(request->alpha2)); in mwifiex_reg_notifier()
724 switch (priv->bss_role) { in mwifiex_cfg80211_set_wiphy_params()
726 if (priv->bss_started) { in mwifiex_cfg80211_set_wiphy_params()
729 return -EINVAL; in mwifiex_cfg80211_set_wiphy_params()
734 return -ENOMEM; in mwifiex_cfg80211_set_wiphy_params()
739 bss_cfg->rts_threshold = wiphy->rts_threshold; in mwifiex_cfg80211_set_wiphy_params()
741 bss_cfg->frag_threshold = wiphy->frag_threshold; in mwifiex_cfg80211_set_wiphy_params()
743 bss_cfg->retry_limit = wiphy->retry_long; in mwifiex_cfg80211_set_wiphy_params()
759 if (priv->media_connected) { in mwifiex_cfg80211_set_wiphy_params()
762 return -EINVAL; in mwifiex_cfg80211_set_wiphy_params()
766 wiphy->rts_threshold); in mwifiex_cfg80211_set_wiphy_params()
772 wiphy->frag_threshold); in mwifiex_cfg80211_set_wiphy_params()
789 return -1; in mwifiex_cfg80211_deinit_p2p()
797 * disable -> device -> client
805 return -1; in mwifiex_cfg80211_init_p2p_client()
810 return -1; in mwifiex_cfg80211_init_p2p_client()
815 return -1; in mwifiex_cfg80211_init_p2p_client()
823 * disable -> device -> GO
831 return -1; in mwifiex_cfg80211_init_p2p_go()
836 return -1; in mwifiex_cfg80211_init_p2p_go()
841 return -1; in mwifiex_cfg80211_init_p2p_go()
848 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_deinit_priv_params()
851 priv->mgmt_frame_mask = 0; in mwifiex_deinit_priv_params()
854 &priv->mgmt_frame_mask, false)) { in mwifiex_deinit_priv_params()
857 return -1; in mwifiex_deinit_priv_params()
862 spin_lock_irqsave(&adapter->main_proc_lock, flags); in mwifiex_deinit_priv_params()
863 adapter->main_locked = true; in mwifiex_deinit_priv_params()
864 if (adapter->mwifiex_processing) { in mwifiex_deinit_priv_params()
865 spin_unlock_irqrestore(&adapter->main_proc_lock, flags); in mwifiex_deinit_priv_params()
866 flush_workqueue(adapter->workqueue); in mwifiex_deinit_priv_params()
868 spin_unlock_irqrestore(&adapter->main_proc_lock, flags); in mwifiex_deinit_priv_params()
871 spin_lock_bh(&adapter->rx_proc_lock); in mwifiex_deinit_priv_params()
872 adapter->rx_locked = true; in mwifiex_deinit_priv_params()
873 if (adapter->rx_processing) { in mwifiex_deinit_priv_params()
874 spin_unlock_bh(&adapter->rx_proc_lock); in mwifiex_deinit_priv_params()
875 flush_workqueue(adapter->rx_workqueue); in mwifiex_deinit_priv_params()
877 spin_unlock_bh(&adapter->rx_proc_lock); in mwifiex_deinit_priv_params()
881 priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_deinit_priv_params()
882 priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_deinit_priv_params()
883 priv->sec_info.authentication_mode = NL80211_AUTHTYPE_OPEN_SYSTEM; in mwifiex_deinit_priv_params()
890 struct net_device *dev, in mwifiex_init_new_priv_params() argument
893 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_init_new_priv_params()
898 priv->bss_mode = type; in mwifiex_init_new_priv_params()
899 priv->wdev.iftype = type; in mwifiex_init_new_priv_params()
901 mwifiex_init_priv_params(priv, priv->netdev); in mwifiex_init_new_priv_params()
902 priv->bss_started = 0; in mwifiex_init_new_priv_params()
907 priv->bss_role = MWIFIEX_BSS_ROLE_STA; in mwifiex_init_new_priv_params()
908 priv->bss_type = MWIFIEX_BSS_TYPE_STA; in mwifiex_init_new_priv_params()
911 priv->bss_role = MWIFIEX_BSS_ROLE_STA; in mwifiex_init_new_priv_params()
912 priv->bss_type = MWIFIEX_BSS_TYPE_P2P; in mwifiex_init_new_priv_params()
915 priv->bss_role = MWIFIEX_BSS_ROLE_UAP; in mwifiex_init_new_priv_params()
916 priv->bss_type = MWIFIEX_BSS_TYPE_P2P; in mwifiex_init_new_priv_params()
919 priv->bss_role = MWIFIEX_BSS_ROLE_UAP; in mwifiex_init_new_priv_params()
920 priv->bss_type = MWIFIEX_BSS_TYPE_UAP; in mwifiex_init_new_priv_params()
925 dev->name, type); in mwifiex_init_new_priv_params()
926 return -EOPNOTSUPP; in mwifiex_init_new_priv_params()
929 priv->bss_num = mwifiex_get_unused_bss_num(adapter, priv->bss_type); in mwifiex_init_new_priv_params()
931 spin_lock_irqsave(&adapter->main_proc_lock, flags); in mwifiex_init_new_priv_params()
932 adapter->main_locked = false; in mwifiex_init_new_priv_params()
933 spin_unlock_irqrestore(&adapter->main_proc_lock, flags); in mwifiex_init_new_priv_params()
935 spin_lock_bh(&adapter->rx_proc_lock); in mwifiex_init_new_priv_params()
936 adapter->rx_locked = false; in mwifiex_init_new_priv_params()
937 spin_unlock_bh(&adapter->rx_proc_lock); in mwifiex_init_new_priv_params()
939 mwifiex_set_mac_address(priv, dev, false, NULL); in mwifiex_init_new_priv_params()
956 return adapter->curr_iface_comb.p2p_intf != in is_vif_type_change_allowed()
957 adapter->iface_limit.p2p_intf; in is_vif_type_change_allowed()
959 return adapter->curr_iface_comb.uap_intf != in is_vif_type_change_allowed()
960 adapter->iface_limit.uap_intf; in is_vif_type_change_allowed()
971 return adapter->curr_iface_comb.p2p_intf != in is_vif_type_change_allowed()
972 adapter->iface_limit.p2p_intf; in is_vif_type_change_allowed()
974 return adapter->curr_iface_comb.uap_intf != in is_vif_type_change_allowed()
975 adapter->iface_limit.uap_intf; in is_vif_type_change_allowed()
984 return adapter->curr_iface_comb.sta_intf != in is_vif_type_change_allowed()
985 adapter->iface_limit.sta_intf; in is_vif_type_change_allowed()
988 return adapter->curr_iface_comb.p2p_intf != in is_vif_type_change_allowed()
989 adapter->iface_limit.p2p_intf; in is_vif_type_change_allowed()
1002 return adapter->curr_iface_comb.uap_intf != in is_vif_type_change_allowed()
1003 adapter->iface_limit.uap_intf; in is_vif_type_change_allowed()
1016 return adapter->curr_iface_comb.uap_intf != in is_vif_type_change_allowed()
1017 adapter->iface_limit.uap_intf; in is_vif_type_change_allowed()
1038 adapter->curr_iface_comb.sta_intf += change; in update_vif_type_counter()
1041 adapter->curr_iface_comb.uap_intf += change; in update_vif_type_counter()
1045 adapter->curr_iface_comb.p2p_intf += change; in update_vif_type_counter()
1056 mwifiex_change_vif_to_p2p(struct net_device *dev, in mwifiex_change_vif_to_p2p() argument
1064 priv = mwifiex_netdev_get_priv(dev); in mwifiex_change_vif_to_p2p()
1067 return -1; in mwifiex_change_vif_to_p2p()
1069 adapter = priv->adapter; in mwifiex_change_vif_to_p2p()
1072 "%s: changing role to p2p\n", dev->name); in mwifiex_change_vif_to_p2p()
1075 return -1; in mwifiex_change_vif_to_p2p()
1076 if (mwifiex_init_new_priv_params(priv, dev, type)) in mwifiex_change_vif_to_p2p()
1077 return -1; in mwifiex_change_vif_to_p2p()
1079 update_vif_type_counter(adapter, curr_iftype, -1); in mwifiex_change_vif_to_p2p()
1081 dev->ieee80211_ptr->iftype = type; in mwifiex_change_vif_to_p2p()
1086 return -EFAULT; in mwifiex_change_vif_to_p2p()
1090 return -EFAULT; in mwifiex_change_vif_to_p2p()
1095 dev->name, type); in mwifiex_change_vif_to_p2p()
1096 return -EOPNOTSUPP; in mwifiex_change_vif_to_p2p()
1101 return -1; in mwifiex_change_vif_to_p2p()
1104 return -1; in mwifiex_change_vif_to_p2p()
1110 mwifiex_change_vif_to_sta_adhoc(struct net_device *dev, in mwifiex_change_vif_to_sta_adhoc() argument
1118 priv = mwifiex_netdev_get_priv(dev); in mwifiex_change_vif_to_sta_adhoc()
1121 return -1; in mwifiex_change_vif_to_sta_adhoc()
1123 adapter = priv->adapter; in mwifiex_change_vif_to_sta_adhoc()
1127 "%s: changing role to station\n", dev->name); in mwifiex_change_vif_to_sta_adhoc()
1130 "%s: changing role to adhoc\n", dev->name); in mwifiex_change_vif_to_sta_adhoc()
1133 return -1; in mwifiex_change_vif_to_sta_adhoc()
1134 if (mwifiex_init_new_priv_params(priv, dev, type)) in mwifiex_change_vif_to_sta_adhoc()
1135 return -1; in mwifiex_change_vif_to_sta_adhoc()
1137 update_vif_type_counter(adapter, curr_iftype, -1); in mwifiex_change_vif_to_sta_adhoc()
1139 dev->ieee80211_ptr->iftype = type; in mwifiex_change_vif_to_sta_adhoc()
1143 return -1; in mwifiex_change_vif_to_sta_adhoc()
1145 return -1; in mwifiex_change_vif_to_sta_adhoc()
1151 mwifiex_change_vif_to_ap(struct net_device *dev, in mwifiex_change_vif_to_ap() argument
1159 priv = mwifiex_netdev_get_priv(dev); in mwifiex_change_vif_to_ap()
1162 return -1; in mwifiex_change_vif_to_ap()
1164 adapter = priv->adapter; in mwifiex_change_vif_to_ap()
1167 "%s: changing role to AP\n", dev->name); in mwifiex_change_vif_to_ap()
1170 return -1; in mwifiex_change_vif_to_ap()
1171 if (mwifiex_init_new_priv_params(priv, dev, type)) in mwifiex_change_vif_to_ap()
1172 return -1; in mwifiex_change_vif_to_ap()
1174 update_vif_type_counter(adapter, curr_iftype, -1); in mwifiex_change_vif_to_ap()
1176 dev->ieee80211_ptr->iftype = type; in mwifiex_change_vif_to_ap()
1180 return -1; in mwifiex_change_vif_to_ap()
1182 return -1; in mwifiex_change_vif_to_ap()
1191 struct net_device *dev, in mwifiex_cfg80211_change_virtual_intf() argument
1195 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_change_virtual_intf()
1196 enum nl80211_iftype curr_iftype = dev->ieee80211_ptr->iftype; in mwifiex_cfg80211_change_virtual_intf()
1198 if (priv->scan_request) { in mwifiex_cfg80211_change_virtual_intf()
1199 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_virtual_intf()
1201 return -EBUSY; in mwifiex_cfg80211_change_virtual_intf()
1205 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_change_virtual_intf()
1207 dev->name, curr_iftype); in mwifiex_cfg80211_change_virtual_intf()
1212 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_change_virtual_intf()
1214 dev->name, curr_iftype); in mwifiex_cfg80211_change_virtual_intf()
1218 if (!is_vif_type_change_allowed(priv->adapter, curr_iftype, type)) { in mwifiex_cfg80211_change_virtual_intf()
1219 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_virtual_intf()
1221 dev->name, curr_iftype, type); in mwifiex_cfg80211_change_virtual_intf()
1222 return -EOPNOTSUPP; in mwifiex_cfg80211_change_virtual_intf()
1229 priv->bss_mode = type; in mwifiex_cfg80211_change_virtual_intf()
1230 priv->sec_info.authentication_mode = in mwifiex_cfg80211_change_virtual_intf()
1232 dev->ieee80211_ptr->iftype = type; in mwifiex_cfg80211_change_virtual_intf()
1239 return mwifiex_change_vif_to_p2p(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1242 return mwifiex_change_vif_to_ap(dev, curr_iftype, type, in mwifiex_cfg80211_change_virtual_intf()
1251 priv->bss_mode = type; in mwifiex_cfg80211_change_virtual_intf()
1252 priv->sec_info.authentication_mode = in mwifiex_cfg80211_change_virtual_intf()
1254 dev->ieee80211_ptr->iftype = type; in mwifiex_cfg80211_change_virtual_intf()
1261 return mwifiex_change_vif_to_p2p(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1264 return mwifiex_change_vif_to_ap(dev, curr_iftype, type, in mwifiex_cfg80211_change_virtual_intf()
1274 return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1279 return mwifiex_change_vif_to_p2p(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1287 return -EFAULT; in mwifiex_cfg80211_change_virtual_intf()
1292 return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1295 return mwifiex_change_vif_to_p2p(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1298 return mwifiex_change_vif_to_ap(dev, curr_iftype, type, in mwifiex_cfg80211_change_virtual_intf()
1306 return -EFAULT; in mwifiex_cfg80211_change_virtual_intf()
1311 return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1314 return mwifiex_change_vif_to_p2p(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1317 return mwifiex_change_vif_to_ap(dev, curr_iftype, type, in mwifiex_cfg80211_change_virtual_intf()
1331 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_virtual_intf()
1334 return -EOPNOTSUPP; in mwifiex_cfg80211_change_virtual_intf()
1341 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_parse_htinfo()
1343 if (adapter->is_hw_11ac_capable) { in mwifiex_parse_htinfo()
1344 /* bit[1-0]: 00=LG 01=HT 10=VHT */ in mwifiex_parse_htinfo()
1347 rate->mcs = rateinfo; in mwifiex_parse_htinfo()
1348 rate->flags |= RATE_INFO_FLAGS_MCS; in mwifiex_parse_htinfo()
1352 rate->mcs = rateinfo & 0x0F; in mwifiex_parse_htinfo()
1353 rate->flags |= RATE_INFO_FLAGS_VHT_MCS; in mwifiex_parse_htinfo()
1360 rate->bw = RATE_INFO_BW_20; in mwifiex_parse_htinfo()
1363 rate->bw = RATE_INFO_BW_40; in mwifiex_parse_htinfo()
1366 rate->bw = RATE_INFO_BW_80; in mwifiex_parse_htinfo()
1369 rate->bw = RATE_INFO_BW_160; in mwifiex_parse_htinfo()
1374 rate->flags |= RATE_INFO_FLAGS_SHORT_GI; in mwifiex_parse_htinfo()
1377 rate->nss = 2; in mwifiex_parse_htinfo()
1379 rate->nss = 1; in mwifiex_parse_htinfo()
1387 rate->mcs = rateinfo; in mwifiex_parse_htinfo()
1388 rate->flags |= RATE_INFO_FLAGS_MCS; in mwifiex_parse_htinfo()
1389 rate->bw = RATE_INFO_BW_20; in mwifiex_parse_htinfo()
1391 rate->bw = RATE_INFO_BW_40; in mwifiex_parse_htinfo()
1393 rate->flags |= RATE_INFO_FLAGS_SHORT_GI; in mwifiex_parse_htinfo()
1397 /* Decode legacy rates for non-HT. */ in mwifiex_parse_htinfo()
1416 rate->legacy = legacy_rates[rateinfo]; in mwifiex_parse_htinfo()
1423 * The following information are shown -
1424 * - Total bytes transmitted
1425 * - Total bytes received
1426 * - Total packets transmitted
1427 * - Total packets received
1428 * - Signal quality level
1429 * - Transmission rate
1438 sinfo->filled = BIT_ULL(NL80211_STA_INFO_RX_BYTES) | BIT_ULL(NL80211_STA_INFO_TX_BYTES) | in mwifiex_dump_station_info()
1445 return -ENOENT; in mwifiex_dump_station_info()
1447 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME) | in mwifiex_dump_station_info()
1449 sinfo->inactive_time = in mwifiex_dump_station_info()
1450 jiffies_to_msecs(jiffies - node->stats.last_rx); in mwifiex_dump_station_info()
1452 sinfo->signal = node->stats.rssi; in mwifiex_dump_station_info()
1453 sinfo->signal_avg = node->stats.rssi; in mwifiex_dump_station_info()
1454 sinfo->rx_bytes = node->stats.rx_bytes; in mwifiex_dump_station_info()
1455 sinfo->tx_bytes = node->stats.tx_bytes; in mwifiex_dump_station_info()
1456 sinfo->rx_packets = node->stats.rx_packets; in mwifiex_dump_station_info()
1457 sinfo->tx_packets = node->stats.tx_packets; in mwifiex_dump_station_info()
1458 sinfo->tx_failed = node->stats.tx_failed; in mwifiex_dump_station_info()
1460 mwifiex_parse_htinfo(priv, priv->tx_rate, in mwifiex_dump_station_info()
1461 node->stats.last_tx_htinfo, in mwifiex_dump_station_info()
1462 &sinfo->txrate); in mwifiex_dump_station_info()
1463 sinfo->txrate.legacy = node->stats.last_tx_rate * 5; in mwifiex_dump_station_info()
1471 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_dump_station_info()
1473 return -EFAULT; in mwifiex_dump_station_info()
1477 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_dump_station_info()
1479 return -EFAULT; in mwifiex_dump_station_info()
1485 &priv->dtim_period, true); in mwifiex_dump_station_info()
1487 mwifiex_parse_htinfo(priv, priv->tx_rate, priv->tx_htinfo, in mwifiex_dump_station_info()
1488 &sinfo->txrate); in mwifiex_dump_station_info()
1490 sinfo->signal_avg = priv->bcn_rssi_avg; in mwifiex_dump_station_info()
1491 sinfo->rx_bytes = priv->stats.rx_bytes; in mwifiex_dump_station_info()
1492 sinfo->tx_bytes = priv->stats.tx_bytes; in mwifiex_dump_station_info()
1493 sinfo->rx_packets = priv->stats.rx_packets; in mwifiex_dump_station_info()
1494 sinfo->tx_packets = priv->stats.tx_packets; in mwifiex_dump_station_info()
1495 sinfo->signal = priv->bcn_rssi_avg; in mwifiex_dump_station_info()
1497 sinfo->txrate.legacy = rate * 5; in mwifiex_dump_station_info()
1499 sinfo->filled |= BIT(NL80211_STA_INFO_RX_BITRATE); in mwifiex_dump_station_info()
1500 mwifiex_parse_htinfo(priv, priv->rxpd_rate, priv->rxpd_htinfo, in mwifiex_dump_station_info()
1501 &sinfo->rxrate); in mwifiex_dump_station_info()
1503 if (priv->bss_mode == NL80211_IFTYPE_STATION) { in mwifiex_dump_station_info()
1504 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BSS_PARAM); in mwifiex_dump_station_info()
1505 sinfo->bss_param.flags = 0; in mwifiex_dump_station_info()
1506 if (priv->curr_bss_params.bss_descriptor.cap_info_bitmap & in mwifiex_dump_station_info()
1508 sinfo->bss_param.flags |= in mwifiex_dump_station_info()
1510 if (priv->curr_bss_params.bss_descriptor.cap_info_bitmap & in mwifiex_dump_station_info()
1512 sinfo->bss_param.flags |= in mwifiex_dump_station_info()
1514 sinfo->bss_param.dtim_period = priv->dtim_period; in mwifiex_dump_station_info()
1515 sinfo->bss_param.beacon_interval = in mwifiex_dump_station_info()
1516 priv->curr_bss_params.bss_descriptor.beacon_period; in mwifiex_dump_station_info()
1529 mwifiex_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_get_station() argument
1532 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_get_station()
1534 if (!priv->media_connected) in mwifiex_cfg80211_get_station()
1535 return -ENOENT; in mwifiex_cfg80211_get_station()
1536 if (memcmp(mac, priv->cfg_bssid, ETH_ALEN)) in mwifiex_cfg80211_get_station()
1537 return -ENOENT; in mwifiex_cfg80211_get_station()
1546 mwifiex_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_dump_station() argument
1549 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_dump_station()
1554 priv->media_connected && idx == 0) { in mwifiex_cfg80211_dump_station()
1555 ether_addr_copy(mac, priv->cfg_bssid); in mwifiex_cfg80211_dump_station()
1562 list_for_each_entry(node, &priv->sta_list, list) { in mwifiex_cfg80211_dump_station()
1565 ether_addr_copy(mac, node->mac_addr); in mwifiex_cfg80211_dump_station()
1570 return -ENOENT; in mwifiex_cfg80211_dump_station()
1574 mwifiex_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_dump_survey() argument
1577 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_dump_survey()
1578 struct mwifiex_chan_stats *pchan_stats = priv->adapter->chan_stats; in mwifiex_cfg80211_dump_survey()
1581 mwifiex_dbg(priv->adapter, DUMP, "dump_survey idx=%d\n", idx); in mwifiex_cfg80211_dump_survey()
1586 priv->media_connected && idx == 0) { in mwifiex_cfg80211_dump_survey()
1587 u8 curr_bss_band = priv->curr_bss_params.band; in mwifiex_cfg80211_dump_survey()
1588 u32 chan = priv->curr_bss_params.bss_descriptor.channel; in mwifiex_cfg80211_dump_survey()
1591 survey->channel = ieee80211_get_channel(wiphy, in mwifiex_cfg80211_dump_survey()
1594 if (priv->bcn_nf_last) { in mwifiex_cfg80211_dump_survey()
1595 survey->filled = SURVEY_INFO_NOISE_DBM; in mwifiex_cfg80211_dump_survey()
1596 survey->noise = priv->bcn_nf_last; in mwifiex_cfg80211_dump_survey()
1601 if (idx >= priv->adapter->num_in_chan_stats) in mwifiex_cfg80211_dump_survey()
1602 return -ENOENT; in mwifiex_cfg80211_dump_survey()
1608 survey->channel = ieee80211_get_channel(wiphy, in mwifiex_cfg80211_dump_survey()
1610 survey->filled = SURVEY_INFO_NOISE_DBM | in mwifiex_cfg80211_dump_survey()
1613 survey->noise = pchan_stats[idx].noise; in mwifiex_cfg80211_dump_survey()
1614 survey->time = pchan_stats[idx].cca_scan_dur; in mwifiex_cfg80211_dump_survey()
1615 survey->time_busy = pchan_stats[idx].cca_busy_dur; in mwifiex_cfg80211_dump_survey()
1699 .n_bitrates = ARRAY_SIZE(mwifiex_rates) - 4,
1750 struct net_device *dev, in mwifiex_cfg80211_set_bitrate_mask() argument
1755 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_set_bitrate_mask()
1758 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_cfg80211_set_bitrate_mask()
1760 if (!priv->media_connected) { in mwifiex_cfg80211_set_bitrate_mask()
1763 return -EINVAL; in mwifiex_cfg80211_set_bitrate_mask()
1766 band = mwifiex_band_to_radio_type(priv->curr_bss_params.band); in mwifiex_cfg80211_set_bitrate_mask()
1772 bitmap_rates[0] = mask->control[band].legacy & 0x000f; in mwifiex_cfg80211_set_bitrate_mask()
1776 bitmap_rates[1] = (mask->control[band].legacy & 0x0ff0) >> 4; in mwifiex_cfg80211_set_bitrate_mask()
1778 bitmap_rates[1] = mask->control[band].legacy; in mwifiex_cfg80211_set_bitrate_mask()
1781 bitmap_rates[2] = mask->control[band].ht_mcs[0]; in mwifiex_cfg80211_set_bitrate_mask()
1782 if (adapter->hw_dev_mcs_support == HT_STREAM_2X2) in mwifiex_cfg80211_set_bitrate_mask()
1783 bitmap_rates[2] |= mask->control[band].ht_mcs[1] << 8; in mwifiex_cfg80211_set_bitrate_mask()
1786 if (adapter->fw_api_ver == MWIFIEX_FW_V15) { in mwifiex_cfg80211_set_bitrate_mask()
1787 bitmap_rates[10] = mask->control[band].vht_mcs[0]; in mwifiex_cfg80211_set_bitrate_mask()
1788 if (adapter->hw_dev_mcs_support == HT_STREAM_2X2) in mwifiex_cfg80211_set_bitrate_mask()
1789 bitmap_rates[11] = mask->control[band].vht_mcs[1]; in mwifiex_cfg80211_set_bitrate_mask()
1803 struct net_device *dev, in mwifiex_cfg80211_set_cqm_rssi_config() argument
1806 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_set_cqm_rssi_config()
1809 priv->cqm_rssi_thold = rssi_thold; in mwifiex_cfg80211_set_cqm_rssi_config()
1810 priv->cqm_rssi_hyst = rssi_hyst; in mwifiex_cfg80211_set_cqm_rssi_config()
1839 struct net_device *dev, in mwifiex_cfg80211_change_beacon() argument
1842 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_change_beacon()
1843 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_cfg80211_change_beacon()
1848 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_beacon()
1850 return -EINVAL; in mwifiex_cfg80211_change_beacon()
1853 if (!priv->bss_started) { in mwifiex_cfg80211_change_beacon()
1854 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_beacon()
1856 return -EINVAL; in mwifiex_cfg80211_change_beacon()
1860 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_beacon()
1862 return -EFAULT; in mwifiex_cfg80211_change_beacon()
1875 mwifiex_cfg80211_del_station(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_del_station() argument
1878 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_del_station()
1882 if (!priv->bss_started && priv->wdev.cac_started) { in mwifiex_cfg80211_del_station()
1883 mwifiex_dbg(priv->adapter, INFO, "%s: abort CAC!\n", __func__); in mwifiex_cfg80211_del_station()
1887 if (list_empty(&priv->sta_list) || !priv->bss_started) in mwifiex_cfg80211_del_station()
1890 if (!params->mac || is_broadcast_ether_addr(params->mac)) in mwifiex_cfg80211_del_station()
1893 mwifiex_dbg(priv->adapter, INFO, "%s: mac address %pM\n", in mwifiex_cfg80211_del_station()
1894 __func__, params->mac); in mwifiex_cfg80211_del_station()
1898 spin_lock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_del_station()
1899 sta_node = mwifiex_get_sta_entry(priv, params->mac); in mwifiex_cfg80211_del_station()
1901 ether_addr_copy(deauth_mac, params->mac); in mwifiex_cfg80211_del_station()
1902 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_del_station()
1908 return -1; in mwifiex_cfg80211_del_station()
1923 return -EOPNOTSUPP; in mwifiex_cfg80211_set_antenna()
1925 if (adapter->hw_dev_mcs_support != HT_STREAM_2X2) { in mwifiex_cfg80211_set_antenna()
1930 return -EOPNOTSUPP; in mwifiex_cfg80211_set_antenna()
1932 if ((tx_ant & (tx_ant - 1)) && in mwifiex_cfg80211_set_antenna()
1933 (tx_ant != BIT(adapter->number_of_antenna) - 1)) in mwifiex_cfg80211_set_antenna()
1934 return -EOPNOTSUPP; in mwifiex_cfg80211_set_antenna()
1936 if ((tx_ant == BIT(adapter->number_of_antenna) - 1) && in mwifiex_cfg80211_set_antenna()
1937 (priv->adapter->number_of_antenna > 1)) { in mwifiex_cfg80211_set_antenna()
1947 adapter->user_dev_mcs_support = HT_STREAM_1X1; in mwifiex_cfg80211_set_antenna()
1948 if (adapter->is_hw_11ac_capable) in mwifiex_cfg80211_set_antenna()
1949 adapter->usr_dot_11ac_mcs_support = in mwifiex_cfg80211_set_antenna()
1952 adapter->user_dev_mcs_support = HT_STREAM_2X2; in mwifiex_cfg80211_set_antenna()
1953 if (adapter->is_hw_11ac_capable) in mwifiex_cfg80211_set_antenna()
1954 adapter->usr_dot_11ac_mcs_support = in mwifiex_cfg80211_set_antenna()
1959 if (!adapter->wiphy->bands[band]) in mwifiex_cfg80211_set_antenna()
1962 ht_info = &adapter->wiphy->bands[band]->ht_cap; in mwifiex_cfg80211_set_antenna()
1964 GET_RXMCSSUPP(adapter->user_dev_mcs_support); in mwifiex_cfg80211_set_antenna()
1965 memset(&ht_info->mcs, 0, adapter->number_of_antenna); in mwifiex_cfg80211_set_antenna()
1966 memset(&ht_info->mcs, 0xff, rx_mcs_supp); in mwifiex_cfg80211_set_antenna()
1986 *tx_ant = priv->tx_ant; in mwifiex_cfg80211_get_antenna()
1987 *rx_ant = priv->rx_ant; in mwifiex_cfg80211_get_antenna()
1995 static int mwifiex_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_stop_ap() argument
1998 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_stop_ap()
2003 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_stop_ap()
2006 priv->ap_11n_enabled = 0; in mwifiex_cfg80211_stop_ap()
2007 memset(&priv->bss_cfg, 0, sizeof(priv->bss_cfg)); in mwifiex_cfg80211_stop_ap()
2011 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_stop_ap()
2013 return -1; in mwifiex_cfg80211_stop_ap()
2018 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_stop_ap()
2020 return -1; in mwifiex_cfg80211_stop_ap()
2023 if (netif_carrier_ok(priv->netdev)) in mwifiex_cfg80211_stop_ap()
2024 netif_carrier_off(priv->netdev); in mwifiex_cfg80211_stop_ap()
2025 mwifiex_stop_net_dev_queue(priv->netdev, priv->adapter); in mwifiex_cfg80211_stop_ap()
2036 struct net_device *dev, in mwifiex_cfg80211_start_ap() argument
2040 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_start_ap()
2043 return -1; in mwifiex_cfg80211_start_ap()
2047 return -ENOMEM; in mwifiex_cfg80211_start_ap()
2051 memcpy(bss_cfg->mac_addr, priv->curr_addr, ETH_ALEN); in mwifiex_cfg80211_start_ap()
2053 if (params->beacon_interval) in mwifiex_cfg80211_start_ap()
2054 bss_cfg->beacon_period = params->beacon_interval; in mwifiex_cfg80211_start_ap()
2055 if (params->dtim_period) in mwifiex_cfg80211_start_ap()
2056 bss_cfg->dtim_period = params->dtim_period; in mwifiex_cfg80211_start_ap()
2058 if (params->ssid && params->ssid_len) { in mwifiex_cfg80211_start_ap()
2059 memcpy(bss_cfg->ssid.ssid, params->ssid, params->ssid_len); in mwifiex_cfg80211_start_ap()
2060 bss_cfg->ssid.ssid_len = params->ssid_len; in mwifiex_cfg80211_start_ap()
2062 if (params->inactivity_timeout > 0) { in mwifiex_cfg80211_start_ap()
2064 bss_cfg->sta_ao_timer = 10 * params->inactivity_timeout; in mwifiex_cfg80211_start_ap()
2065 bss_cfg->ps_sta_ao_timer = 10 * params->inactivity_timeout; in mwifiex_cfg80211_start_ap()
2068 switch (params->hidden_ssid) { in mwifiex_cfg80211_start_ap()
2070 bss_cfg->bcast_ssid_ctl = 1; in mwifiex_cfg80211_start_ap()
2073 bss_cfg->bcast_ssid_ctl = 0; in mwifiex_cfg80211_start_ap()
2076 bss_cfg->bcast_ssid_ctl = 2; in mwifiex_cfg80211_start_ap()
2080 return -EINVAL; in mwifiex_cfg80211_start_ap()
2083 mwifiex_uap_set_channel(priv, bss_cfg, params->chandef); in mwifiex_cfg80211_start_ap()
2087 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_ap()
2094 if (priv->adapter->is_hw_11ac_capable) { in mwifiex_cfg80211_start_ap()
2096 mwifiex_set_vht_width(priv, params->chandef.width, in mwifiex_cfg80211_start_ap()
2097 priv->ap_11ac_enabled); in mwifiex_cfg80211_start_ap()
2100 if (priv->ap_11ac_enabled) in mwifiex_cfg80211_start_ap()
2111 !cfg80211_chandef_dfs_required(wiphy, ¶ms->chandef, in mwifiex_cfg80211_start_ap()
2112 priv->bss_mode)) { in mwifiex_cfg80211_start_ap()
2113 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_start_ap()
2116 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_ap()
2120 priv->state_11h.is_11h_active = false; in mwifiex_cfg80211_start_ap()
2123 mwifiex_config_uap_11d(priv, ¶ms->beacon); in mwifiex_cfg80211_start_ap()
2126 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_ap()
2131 if (mwifiex_set_mgmt_ies(priv, ¶ms->beacon)) in mwifiex_cfg80211_start_ap()
2134 if (!netif_carrier_ok(priv->netdev)) in mwifiex_cfg80211_start_ap()
2135 netif_carrier_on(priv->netdev); in mwifiex_cfg80211_start_ap()
2136 mwifiex_wake_up_net_dev_queue(priv->netdev, priv->adapter); in mwifiex_cfg80211_start_ap()
2138 memcpy(&priv->bss_cfg, bss_cfg, sizeof(priv->bss_cfg)); in mwifiex_cfg80211_start_ap()
2144 return -1; in mwifiex_cfg80211_start_ap()
2154 mwifiex_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_disconnect() argument
2157 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_disconnect()
2160 cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0); in mwifiex_cfg80211_disconnect()
2163 return -EFAULT; in mwifiex_cfg80211_disconnect()
2165 eth_zero_addr(priv->cfg_bssid); in mwifiex_cfg80211_disconnect()
2166 priv->hs2_enabled = false; in mwifiex_cfg80211_disconnect()
2177 * - SSID
2178 * - SSID length
2179 * - BSSID
2180 * - Channel
2192 return -1; in mwifiex_cfg80211_inform_ibss_bss()
2201 band = mwifiex_band_to_radio_type(priv->curr_bss_params.band); in mwifiex_cfg80211_inform_ibss_bss()
2202 chan = ieee80211_get_channel(priv->wdev.wiphy, in mwifiex_cfg80211_inform_ibss_bss()
2206 bss = cfg80211_inform_bss(priv->wdev.wiphy, chan, in mwifiex_cfg80211_inform_ibss_bss()
2211 cfg80211_put_bss(priv->wdev.wiphy, bss); in mwifiex_cfg80211_inform_ibss_bss()
2212 ether_addr_copy(priv->cfg_bssid, bss_info.bssid); in mwifiex_cfg80211_inform_ibss_bss()
2221 * This function handles both Infra and Ad-Hoc modes. It also performs
2228 * is not found in scan table. However, for Ad-Hoc mode, it can create
2248 mwifiex_dbg(priv->adapter, ERROR, "invalid SSID - aborting\n"); in mwifiex_cfg80211_assoc()
2249 return -EINVAL; in mwifiex_cfg80211_assoc()
2254 mwifiex_dbg(priv->adapter, ERROR, "invalid SSID - aborting\n"); in mwifiex_cfg80211_assoc()
2255 return -EINVAL; in mwifiex_cfg80211_assoc()
2260 priv->sec_info.wpa_enabled = false; in mwifiex_cfg80211_assoc()
2261 priv->sec_info.wpa2_enabled = false; in mwifiex_cfg80211_assoc()
2262 priv->wep_key_curr_index = 0; in mwifiex_cfg80211_assoc()
2263 priv->sec_info.encryption_mode = 0; in mwifiex_cfg80211_assoc()
2264 priv->sec_info.is_authtype_auto = 0; in mwifiex_cfg80211_assoc()
2278 /* "privacy" is set only for ad-hoc mode */ in mwifiex_cfg80211_assoc()
2286 priv->sec_info.encryption_mode = in mwifiex_cfg80211_assoc()
2288 priv->sec_info.authentication_mode = in mwifiex_cfg80211_assoc()
2296 if (sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC) { in mwifiex_cfg80211_assoc()
2298 priv->sec_info.is_authtype_auto = 1; in mwifiex_cfg80211_assoc()
2300 auth_type = sme->auth_type; in mwifiex_cfg80211_assoc()
2303 if (sme->crypto.n_ciphers_pairwise) { in mwifiex_cfg80211_assoc()
2304 priv->sec_info.encryption_mode = in mwifiex_cfg80211_assoc()
2305 sme->crypto.ciphers_pairwise[0]; in mwifiex_cfg80211_assoc()
2306 priv->sec_info.authentication_mode = auth_type; in mwifiex_cfg80211_assoc()
2309 if (sme->crypto.cipher_group) { in mwifiex_cfg80211_assoc()
2310 priv->sec_info.encryption_mode = sme->crypto.cipher_group; in mwifiex_cfg80211_assoc()
2311 priv->sec_info.authentication_mode = auth_type; in mwifiex_cfg80211_assoc()
2313 if (sme->ie) in mwifiex_cfg80211_assoc()
2314 ret = mwifiex_set_gen_ie(priv, sme->ie, sme->ie_len); in mwifiex_cfg80211_assoc()
2316 if (sme->key) { in mwifiex_cfg80211_assoc()
2317 if (mwifiex_is_alg_wep(priv->sec_info.encryption_mode)) { in mwifiex_cfg80211_assoc()
2318 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_assoc()
2320 "with key len %d\n", sme->key_len); in mwifiex_cfg80211_assoc()
2321 priv->wep_key_curr_index = sme->key_idx; in mwifiex_cfg80211_assoc()
2322 ret = mwifiex_set_encode(priv, NULL, sme->key, in mwifiex_cfg80211_assoc()
2323 sme->key_len, sme->key_idx, in mwifiex_cfg80211_assoc()
2337 mwifiex_dbg(priv->adapter, ERROR, "scan error\n"); in mwifiex_cfg80211_assoc()
2338 return -EFAULT; in mwifiex_cfg80211_assoc()
2344 bss = cfg80211_get_bss(priv->wdev.wiphy, channel, in mwifiex_cfg80211_assoc()
2349 bss = cfg80211_get_bss(priv->wdev.wiphy, channel, in mwifiex_cfg80211_assoc()
2356 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_assoc()
2357 "assoc: requested bss not found in scan results\n"); in mwifiex_cfg80211_assoc()
2362 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_assoc()
2364 bss->bssid); in mwifiex_cfg80211_assoc()
2365 memcpy(&priv->cfg_bssid, bss->bssid, ETH_ALEN); in mwifiex_cfg80211_assoc()
2371 cfg80211_ref_bss(priv->adapter->wiphy, bss); in mwifiex_cfg80211_assoc()
2379 * kernel will give a panic after successful assoc */ in mwifiex_cfg80211_assoc()
2381 ret = -EFAULT; in mwifiex_cfg80211_assoc()
2394 cfg80211_put_bss(priv->adapter->wiphy, bss); in mwifiex_cfg80211_assoc()
2401 * This function does not work when the current mode is set to Ad-Hoc, or
2406 mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_connect() argument
2409 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_connect()
2410 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_cfg80211_connect()
2416 "%s: reject infra assoc request in non-STA role\n", in mwifiex_cfg80211_connect()
2417 dev->name); in mwifiex_cfg80211_connect()
2418 return -EINVAL; in mwifiex_cfg80211_connect()
2421 if (priv->wdev.connected) { in mwifiex_cfg80211_connect()
2423 "%s: already connected\n", dev->name); in mwifiex_cfg80211_connect()
2424 return -EALREADY; in mwifiex_cfg80211_connect()
2427 if (priv->scan_block) in mwifiex_cfg80211_connect()
2428 priv->scan_block = false; in mwifiex_cfg80211_connect()
2430 if (test_bit(MWIFIEX_SURPRISE_REMOVED, &adapter->work_flags) || in mwifiex_cfg80211_connect()
2431 test_bit(MWIFIEX_IS_CMD_TIMEDOUT, &adapter->work_flags)) { in mwifiex_cfg80211_connect()
2435 dev->name); in mwifiex_cfg80211_connect()
2436 return -EFAULT; in mwifiex_cfg80211_connect()
2440 "info: Trying to associate to bssid %pM\n", sme->bssid); in mwifiex_cfg80211_connect()
2443 cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0); in mwifiex_cfg80211_connect()
2445 ret = mwifiex_cfg80211_assoc(priv, sme->ssid_len, sme->ssid, sme->bssid, in mwifiex_cfg80211_connect()
2446 priv->bss_mode, sme->channel, sme, 0, in mwifiex_cfg80211_connect()
2449 cfg80211_connect_bss(priv->netdev, priv->cfg_bssid, bss, NULL, in mwifiex_cfg80211_connect()
2452 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_connect()
2454 priv->cfg_bssid); in mwifiex_cfg80211_connect()
2455 if (ISSUPP_TDLS_ENABLED(priv->adapter->fw_cap_info) && in mwifiex_cfg80211_connect()
2456 priv->adapter->auto_tdls && in mwifiex_cfg80211_connect()
2457 priv->bss_type == MWIFIEX_BSS_TYPE_STA) in mwifiex_cfg80211_connect()
2460 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_connect()
2462 priv->cfg_bssid); in mwifiex_cfg80211_connect()
2463 eth_zero_addr(priv->cfg_bssid); in mwifiex_cfg80211_connect()
2466 cfg80211_connect_result(priv->netdev, priv->cfg_bssid, in mwifiex_cfg80211_connect()
2470 cfg80211_connect_result(priv->netdev, priv->cfg_bssid, in mwifiex_cfg80211_connect()
2481 * - channel
2482 * - start band
2483 * - 11n flag
2484 * - secondary channel offset
2489 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_set_ibss_params()
2493 if (params->chandef.chan->band == NL80211_BAND_2GHZ) { in mwifiex_set_ibss_params()
2494 if (!params->basic_rates) { in mwifiex_set_ibss_params()
2509 if (params->basic_rates < index) { in mwifiex_set_ibss_params()
2513 if (params->basic_rates % index) in mwifiex_set_ibss_params()
2518 if (cfg80211_get_chandef_type(¶ms->chandef) != in mwifiex_set_ibss_params()
2522 if (cfg80211_get_chandef_type(¶ms->chandef) == in mwifiex_set_ibss_params()
2529 if (!((config_bands | adapter->fw_bands) & ~adapter->fw_bands)) { in mwifiex_set_ibss_params()
2530 adapter->config_bands = config_bands; in mwifiex_set_ibss_params()
2531 adapter->adhoc_start_band = config_bands; in mwifiex_set_ibss_params()
2534 adapter->adhoc_11n_enabled = true; in mwifiex_set_ibss_params()
2536 adapter->adhoc_11n_enabled = false; in mwifiex_set_ibss_params()
2539 adapter->sec_chan_offset = in mwifiex_set_ibss_params()
2541 cfg80211_get_chandef_type(¶ms->chandef)); in mwifiex_set_ibss_params()
2542 priv->adhoc_channel = ieee80211_frequency_to_channel( in mwifiex_set_ibss_params()
2543 params->chandef.chan->center_freq); in mwifiex_set_ibss_params()
2547 config_bands, priv->adhoc_channel, in mwifiex_set_ibss_params()
2548 adapter->sec_chan_offset); in mwifiex_set_ibss_params()
2556 * This function does not work in any mode other than Ad-Hoc, or if
2560 mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_join_ibss() argument
2563 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_join_ibss()
2566 if (priv->bss_mode != NL80211_IFTYPE_ADHOC) { in mwifiex_cfg80211_join_ibss()
2567 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_join_ibss()
2573 mwifiex_dbg(priv->adapter, MSG, "info: trying to join to bssid %pM\n", in mwifiex_cfg80211_join_ibss()
2574 params->bssid); in mwifiex_cfg80211_join_ibss()
2578 ret = mwifiex_cfg80211_assoc(priv, params->ssid_len, params->ssid, in mwifiex_cfg80211_join_ibss()
2579 params->bssid, priv->bss_mode, in mwifiex_cfg80211_join_ibss()
2580 params->chandef.chan, NULL, in mwifiex_cfg80211_join_ibss()
2581 params->privacy, NULL); in mwifiex_cfg80211_join_ibss()
2584 cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid, in mwifiex_cfg80211_join_ibss()
2585 params->chandef.chan, GFP_KERNEL); in mwifiex_cfg80211_join_ibss()
2586 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_join_ibss()
2588 "%pM successfully\n", priv->cfg_bssid); in mwifiex_cfg80211_join_ibss()
2590 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_join_ibss()
2604 mwifiex_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev) in mwifiex_cfg80211_leave_ibss() argument
2606 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_leave_ibss()
2608 mwifiex_dbg(priv->adapter, MSG, "info: disconnecting from essid %pM\n", in mwifiex_cfg80211_leave_ibss()
2609 priv->cfg_bssid); in mwifiex_cfg80211_leave_ibss()
2611 return -EFAULT; in mwifiex_cfg80211_leave_ibss()
2613 eth_zero_addr(priv->cfg_bssid); in mwifiex_cfg80211_leave_ibss()
2629 struct net_device *dev = request->wdev->netdev; in mwifiex_cfg80211_scan() local
2630 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_scan()
2637 mwifiex_dbg(priv->adapter, CMD, in mwifiex_cfg80211_scan()
2638 "info: received scan request on %s\n", dev->name); in mwifiex_cfg80211_scan()
2643 if (priv->scan_request || priv->scan_aborting) { in mwifiex_cfg80211_scan()
2644 mwifiex_dbg(priv->adapter, WARN, in mwifiex_cfg80211_scan()
2646 return -EBUSY; in mwifiex_cfg80211_scan()
2649 if (!priv->wdev.connected && priv->scan_block) in mwifiex_cfg80211_scan()
2650 priv->scan_block = false; in mwifiex_cfg80211_scan()
2653 cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0); in mwifiex_cfg80211_scan()
2657 return -ENOMEM; in mwifiex_cfg80211_scan()
2659 priv->scan_request = request; in mwifiex_cfg80211_scan()
2661 if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { in mwifiex_cfg80211_scan()
2662 get_random_mask_addr(mac_addr, request->mac_addr, in mwifiex_cfg80211_scan()
2663 request->mac_addr_mask); in mwifiex_cfg80211_scan()
2664 ether_addr_copy(request->mac_addr, mac_addr); in mwifiex_cfg80211_scan()
2665 ether_addr_copy(user_scan_cfg->random_mac, mac_addr); in mwifiex_cfg80211_scan()
2668 user_scan_cfg->num_ssids = request->n_ssids; in mwifiex_cfg80211_scan()
2669 user_scan_cfg->ssid_list = request->ssids; in mwifiex_cfg80211_scan()
2671 if (request->ie && request->ie_len) { in mwifiex_cfg80211_scan()
2674 if (priv->vs_ie[i].mask != MWIFIEX_VSIE_MASK_CLEAR) in mwifiex_cfg80211_scan()
2676 priv->vs_ie[i].mask = MWIFIEX_VSIE_MASK_SCAN; in mwifiex_cfg80211_scan()
2677 ie = (struct ieee_types_header *)(request->ie + offset); in mwifiex_cfg80211_scan()
2678 memcpy(&priv->vs_ie[i].ie, ie, sizeof(*ie) + ie->len); in mwifiex_cfg80211_scan()
2679 offset += sizeof(*ie) + ie->len; in mwifiex_cfg80211_scan()
2681 if (offset >= request->ie_len) in mwifiex_cfg80211_scan()
2686 for (i = 0; i < min_t(u32, request->n_channels, in mwifiex_cfg80211_scan()
2688 chan = request->channels[i]; in mwifiex_cfg80211_scan()
2689 user_scan_cfg->chan_list[i].chan_number = chan->hw_value; in mwifiex_cfg80211_scan()
2690 user_scan_cfg->chan_list[i].radio_type = chan->band; in mwifiex_cfg80211_scan()
2692 if ((chan->flags & IEEE80211_CHAN_NO_IR) || !request->n_ssids) in mwifiex_cfg80211_scan()
2693 user_scan_cfg->chan_list[i].scan_type = in mwifiex_cfg80211_scan()
2696 user_scan_cfg->chan_list[i].scan_type = in mwifiex_cfg80211_scan()
2699 user_scan_cfg->chan_list[i].scan_time = 0; in mwifiex_cfg80211_scan()
2702 if (priv->adapter->scan_chan_gap_enabled && in mwifiex_cfg80211_scan()
2704 user_scan_cfg->scan_chan_gap = in mwifiex_cfg80211_scan()
2705 priv->adapter->scan_chan_gap_time; in mwifiex_cfg80211_scan()
2710 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_scan()
2712 priv->scan_aborting = false; in mwifiex_cfg80211_scan()
2713 priv->scan_request = NULL; in mwifiex_cfg80211_scan()
2717 if (request->ie && request->ie_len) { in mwifiex_cfg80211_scan()
2719 if (priv->vs_ie[i].mask == MWIFIEX_VSIE_MASK_SCAN) { in mwifiex_cfg80211_scan()
2720 priv->vs_ie[i].mask = MWIFIEX_VSIE_MASK_CLEAR; in mwifiex_cfg80211_scan()
2721 memset(&priv->vs_ie[i].ie, 0, in mwifiex_cfg80211_scan()
2738 struct net_device *dev, in mwifiex_cfg80211_sched_scan_start() argument
2741 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_sched_scan_start()
2747 if (!request || (!request->n_ssids && !request->n_match_sets)) { in mwifiex_cfg80211_sched_scan_start()
2750 return -EINVAL; in mwifiex_cfg80211_sched_scan_start()
2754 request->n_ssids, request->n_match_sets); in mwifiex_cfg80211_sched_scan_start()
2756 request->n_channels, request->scan_plans->interval, in mwifiex_cfg80211_sched_scan_start()
2757 (int)request->ie_len); in mwifiex_cfg80211_sched_scan_start()
2761 return -ENOMEM; in mwifiex_cfg80211_sched_scan_start()
2763 if (priv->scan_request || priv->scan_aborting) in mwifiex_cfg80211_sched_scan_start()
2764 bgscan_cfg->start_later = true; in mwifiex_cfg80211_sched_scan_start()
2766 bgscan_cfg->num_ssids = request->n_match_sets; in mwifiex_cfg80211_sched_scan_start()
2767 bgscan_cfg->ssid_list = request->match_sets; in mwifiex_cfg80211_sched_scan_start()
2769 if (request->ie && request->ie_len) { in mwifiex_cfg80211_sched_scan_start()
2772 if (priv->vs_ie[i].mask != MWIFIEX_VSIE_MASK_CLEAR) in mwifiex_cfg80211_sched_scan_start()
2774 priv->vs_ie[i].mask = MWIFIEX_VSIE_MASK_BGSCAN; in mwifiex_cfg80211_sched_scan_start()
2775 ie = (struct ieee_types_header *)(request->ie + offset); in mwifiex_cfg80211_sched_scan_start()
2776 memcpy(&priv->vs_ie[i].ie, ie, sizeof(*ie) + ie->len); in mwifiex_cfg80211_sched_scan_start()
2777 offset += sizeof(*ie) + ie->len; in mwifiex_cfg80211_sched_scan_start()
2779 if (offset >= request->ie_len) in mwifiex_cfg80211_sched_scan_start()
2784 for (i = 0; i < min_t(u32, request->n_channels, in mwifiex_cfg80211_sched_scan_start()
2786 chan = request->channels[i]; in mwifiex_cfg80211_sched_scan_start()
2787 bgscan_cfg->chan_list[i].chan_number = chan->hw_value; in mwifiex_cfg80211_sched_scan_start()
2788 bgscan_cfg->chan_list[i].radio_type = chan->band; in mwifiex_cfg80211_sched_scan_start()
2790 if ((chan->flags & IEEE80211_CHAN_NO_IR) || !request->n_ssids) in mwifiex_cfg80211_sched_scan_start()
2791 bgscan_cfg->chan_list[i].scan_type = in mwifiex_cfg80211_sched_scan_start()
2794 bgscan_cfg->chan_list[i].scan_type = in mwifiex_cfg80211_sched_scan_start()
2797 bgscan_cfg->chan_list[i].scan_time = 0; in mwifiex_cfg80211_sched_scan_start()
2800 bgscan_cfg->chan_per_scan = min_t(u32, request->n_channels, in mwifiex_cfg80211_sched_scan_start()
2804 bgscan_cfg->scan_interval = (request->scan_plans->interval > in mwifiex_cfg80211_sched_scan_start()
2806 request->scan_plans->interval : in mwifiex_cfg80211_sched_scan_start()
2809 bgscan_cfg->repeat_count = MWIFIEX_BGSCAN_REPEAT_COUNT; in mwifiex_cfg80211_sched_scan_start()
2810 bgscan_cfg->report_condition = MWIFIEX_BGSCAN_SSID_MATCH | in mwifiex_cfg80211_sched_scan_start()
2812 bgscan_cfg->bss_type = MWIFIEX_BSS_MODE_INFRA; in mwifiex_cfg80211_sched_scan_start()
2813 bgscan_cfg->action = MWIFIEX_BGSCAN_ACT_SET; in mwifiex_cfg80211_sched_scan_start()
2814 bgscan_cfg->enable = true; in mwifiex_cfg80211_sched_scan_start()
2815 if (request->min_rssi_thold != NL80211_SCAN_RSSI_THOLD_OFF) { in mwifiex_cfg80211_sched_scan_start()
2816 bgscan_cfg->report_condition |= MWIFIEX_BGSCAN_SSID_RSSI_MATCH; in mwifiex_cfg80211_sched_scan_start()
2817 bgscan_cfg->rssi_threshold = request->min_rssi_thold; in mwifiex_cfg80211_sched_scan_start()
2823 return -EFAULT; in mwifiex_cfg80211_sched_scan_start()
2826 priv->sched_scanning = true; in mwifiex_cfg80211_sched_scan_start()
2838 struct net_device *dev, u64 reqid) in mwifiex_cfg80211_sched_scan_stop() argument
2840 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_sched_scan_stop()
2851 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_setup_vht_caps()
2853 vht_info->vht_supported = true; in mwifiex_setup_vht_caps()
2855 vht_info->cap = adapter->hw_dot_11ac_dev_cap; in mwifiex_setup_vht_caps()
2857 vht_info->vht_mcs.rx_mcs_map = cpu_to_le16( in mwifiex_setup_vht_caps()
2858 adapter->hw_dot_11ac_mcs_support & 0xFFFF); in mwifiex_setup_vht_caps()
2859 vht_info->vht_mcs.rx_highest = 0; in mwifiex_setup_vht_caps()
2860 vht_info->vht_mcs.tx_mcs_map = cpu_to_le16( in mwifiex_setup_vht_caps()
2861 adapter->hw_dot_11ac_mcs_support >> 16); in mwifiex_setup_vht_caps()
2862 vht_info->vht_mcs.tx_highest = 0; in mwifiex_setup_vht_caps()
2869 * The following default values are set -
2870 * - HT Supported = True
2871 * - Maximum AMPDU length factor = IEEE80211_HT_MAX_AMPDU_64K
2872 * - Minimum AMPDU spacing = IEEE80211_HT_MPDU_DENSITY_NONE
2873 * - HT Capabilities supported by firmware
2874 * - MCS information, Rx mask = 0xff
2875 * - MCD information, Tx parameters = IEEE80211_HT_MCS_TX_DEFINED (0x01)
2884 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_setup_ht_caps()
2886 ht_info->ht_supported = true; in mwifiex_setup_ht_caps()
2887 ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; in mwifiex_setup_ht_caps()
2888 ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE; in mwifiex_setup_ht_caps()
2890 memset(&ht_info->mcs, 0, sizeof(ht_info->mcs)); in mwifiex_setup_ht_caps()
2893 if (ISSUPP_CHANWIDTH40(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2894 ht_info->cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; in mwifiex_setup_ht_caps()
2896 ht_info->cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; in mwifiex_setup_ht_caps()
2898 if (ISSUPP_SHORTGI20(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2899 ht_info->cap |= IEEE80211_HT_CAP_SGI_20; in mwifiex_setup_ht_caps()
2901 ht_info->cap &= ~IEEE80211_HT_CAP_SGI_20; in mwifiex_setup_ht_caps()
2903 if (ISSUPP_SHORTGI40(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2904 ht_info->cap |= IEEE80211_HT_CAP_SGI_40; in mwifiex_setup_ht_caps()
2906 ht_info->cap &= ~IEEE80211_HT_CAP_SGI_40; in mwifiex_setup_ht_caps()
2908 if (adapter->user_dev_mcs_support == HT_STREAM_2X2) in mwifiex_setup_ht_caps()
2909 ht_info->cap |= 2 << IEEE80211_HT_CAP_RX_STBC_SHIFT; in mwifiex_setup_ht_caps()
2911 ht_info->cap |= 1 << IEEE80211_HT_CAP_RX_STBC_SHIFT; in mwifiex_setup_ht_caps()
2913 if (ISSUPP_TXSTBC(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2914 ht_info->cap |= IEEE80211_HT_CAP_TX_STBC; in mwifiex_setup_ht_caps()
2916 ht_info->cap &= ~IEEE80211_HT_CAP_TX_STBC; in mwifiex_setup_ht_caps()
2918 if (ISSUPP_GREENFIELD(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2919 ht_info->cap |= IEEE80211_HT_CAP_GRN_FLD; in mwifiex_setup_ht_caps()
2921 ht_info->cap &= ~IEEE80211_HT_CAP_GRN_FLD; in mwifiex_setup_ht_caps()
2923 if (ISENABLED_40MHZ_INTOLERANT(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2924 ht_info->cap |= IEEE80211_HT_CAP_40MHZ_INTOLERANT; in mwifiex_setup_ht_caps()
2926 ht_info->cap &= ~IEEE80211_HT_CAP_40MHZ_INTOLERANT; in mwifiex_setup_ht_caps()
2928 if (ISSUPP_RXLDPC(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2929 ht_info->cap |= IEEE80211_HT_CAP_LDPC_CODING; in mwifiex_setup_ht_caps()
2931 ht_info->cap &= ~IEEE80211_HT_CAP_LDPC_CODING; in mwifiex_setup_ht_caps()
2933 ht_info->cap &= ~IEEE80211_HT_CAP_MAX_AMSDU; in mwifiex_setup_ht_caps()
2934 ht_info->cap |= IEEE80211_HT_CAP_SM_PS; in mwifiex_setup_ht_caps()
2936 rx_mcs_supp = GET_RXMCSSUPP(adapter->user_dev_mcs_support); in mwifiex_setup_ht_caps()
2941 sizeof(struct ieee80211_mcs_info) - rx_mcs_supp); in mwifiex_setup_ht_caps()
2942 if (priv->bss_mode == NL80211_IFTYPE_STATION || in mwifiex_setup_ht_caps()
2943 ISSUPP_CHANWIDTH40(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2944 /* Set MCS32 for infra mode or ad-hoc mode with 40MHz support */ in mwifiex_setup_ht_caps()
2947 memcpy((u8 *) &ht_info->mcs, mcs, sizeof(struct ieee80211_mcs_info)); in mwifiex_setup_ht_caps()
2949 ht_info->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; in mwifiex_setup_ht_caps()
2963 struct net_device *dev; in mwifiex_add_virtual_intf() local
2968 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
2974 if (adapter->curr_iface_comb.sta_intf == in mwifiex_add_virtual_intf()
2975 adapter->iface_limit.sta_intf) { in mwifiex_add_virtual_intf()
2978 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
2986 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
2989 priv->wdev.wiphy = wiphy; in mwifiex_add_virtual_intf()
2990 priv->wdev.iftype = NL80211_IFTYPE_STATION; in mwifiex_add_virtual_intf()
2993 priv->bss_mode = NL80211_IFTYPE_STATION; in mwifiex_add_virtual_intf()
2995 priv->bss_mode = type; in mwifiex_add_virtual_intf()
2997 priv->bss_type = MWIFIEX_BSS_TYPE_STA; in mwifiex_add_virtual_intf()
2998 priv->frame_type = MWIFIEX_DATA_FRAME_TYPE_ETH_II; in mwifiex_add_virtual_intf()
2999 priv->bss_priority = 0; in mwifiex_add_virtual_intf()
3000 priv->bss_role = MWIFIEX_BSS_ROLE_STA; in mwifiex_add_virtual_intf()
3004 if (adapter->curr_iface_comb.uap_intf == in mwifiex_add_virtual_intf()
3005 adapter->iface_limit.uap_intf) { in mwifiex_add_virtual_intf()
3008 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
3016 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
3019 priv->wdev.wiphy = wiphy; in mwifiex_add_virtual_intf()
3020 priv->wdev.iftype = NL80211_IFTYPE_AP; in mwifiex_add_virtual_intf()
3022 priv->bss_type = MWIFIEX_BSS_TYPE_UAP; in mwifiex_add_virtual_intf()
3023 priv->frame_type = MWIFIEX_DATA_FRAME_TYPE_ETH_II; in mwifiex_add_virtual_intf()
3024 priv->bss_priority = 0; in mwifiex_add_virtual_intf()
3025 priv->bss_role = MWIFIEX_BSS_ROLE_UAP; in mwifiex_add_virtual_intf()
3026 priv->bss_started = 0; in mwifiex_add_virtual_intf()
3027 priv->bss_mode = type; in mwifiex_add_virtual_intf()
3031 if (adapter->curr_iface_comb.p2p_intf == in mwifiex_add_virtual_intf()
3032 adapter->iface_limit.p2p_intf) { in mwifiex_add_virtual_intf()
3035 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
3043 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
3046 priv->wdev.wiphy = wiphy; in mwifiex_add_virtual_intf()
3047 /* At start-up, wpa_supplicant tries to change the interface in mwifiex_add_virtual_intf()
3050 priv->wdev.iftype = NL80211_IFTYPE_P2P_CLIENT; in mwifiex_add_virtual_intf()
3051 priv->bss_mode = NL80211_IFTYPE_P2P_CLIENT; in mwifiex_add_virtual_intf()
3057 priv->bss_type = MWIFIEX_BSS_TYPE_P2P; in mwifiex_add_virtual_intf()
3059 priv->frame_type = MWIFIEX_DATA_FRAME_TYPE_ETH_II; in mwifiex_add_virtual_intf()
3060 priv->bss_priority = 0; in mwifiex_add_virtual_intf()
3061 priv->bss_role = MWIFIEX_BSS_ROLE_STA; in mwifiex_add_virtual_intf()
3062 priv->bss_started = 0; in mwifiex_add_virtual_intf()
3065 memset(&priv->wdev, 0, sizeof(priv->wdev)); in mwifiex_add_virtual_intf()
3066 priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_add_virtual_intf()
3067 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
3073 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
3076 dev = alloc_netdev_mqs(sizeof(struct mwifiex_private *), name, in mwifiex_add_virtual_intf()
3079 if (!dev) { in mwifiex_add_virtual_intf()
3082 ret = -ENOMEM; in mwifiex_add_virtual_intf()
3086 mwifiex_init_priv_params(priv, dev); in mwifiex_add_virtual_intf()
3088 priv->netdev = dev; in mwifiex_add_virtual_intf()
3090 if (!adapter->mfg_mode) { in mwifiex_add_virtual_intf()
3091 mwifiex_set_mac_address(priv, dev, false, NULL); in mwifiex_add_virtual_intf()
3103 mwifiex_setup_ht_caps(&wiphy->bands[NL80211_BAND_2GHZ]->ht_cap, priv); in mwifiex_add_virtual_intf()
3104 if (adapter->is_hw_11ac_capable) in mwifiex_add_virtual_intf()
3106 &wiphy->bands[NL80211_BAND_2GHZ]->vht_cap, priv); in mwifiex_add_virtual_intf()
3108 if (adapter->config_bands & BAND_A) in mwifiex_add_virtual_intf()
3110 &wiphy->bands[NL80211_BAND_5GHZ]->ht_cap, priv); in mwifiex_add_virtual_intf()
3112 if ((adapter->config_bands & BAND_A) && adapter->is_hw_11ac_capable) in mwifiex_add_virtual_intf()
3114 &wiphy->bands[NL80211_BAND_5GHZ]->vht_cap, priv); in mwifiex_add_virtual_intf()
3116 dev_net_set(dev, wiphy_net(wiphy)); in mwifiex_add_virtual_intf()
3117 dev->ieee80211_ptr = &priv->wdev; in mwifiex_add_virtual_intf()
3118 dev->ieee80211_ptr->iftype = priv->bss_mode; in mwifiex_add_virtual_intf()
3119 SET_NETDEV_DEV(dev, wiphy_dev(wiphy)); in mwifiex_add_virtual_intf()
3121 dev->flags |= IFF_BROADCAST | IFF_MULTICAST; in mwifiex_add_virtual_intf()
3122 dev->watchdog_timeo = MWIFIEX_DEFAULT_WATCHDOG_TIMEOUT; in mwifiex_add_virtual_intf()
3123 dev->needed_headroom = MWIFIEX_MIN_DATA_HEADER_LEN; in mwifiex_add_virtual_intf()
3124 dev->ethtool_ops = &mwifiex_ethtool_ops; in mwifiex_add_virtual_intf()
3126 mdev_priv = netdev_priv(dev); in mwifiex_add_virtual_intf()
3129 SET_NETDEV_DEV(dev, adapter->dev); in mwifiex_add_virtual_intf()
3131 priv->dfs_cac_workqueue = alloc_workqueue("MWIFIEX_DFS_CAC%s", in mwifiex_add_virtual_intf()
3135 if (!priv->dfs_cac_workqueue) { in mwifiex_add_virtual_intf()
3137 ret = -ENOMEM; in mwifiex_add_virtual_intf()
3141 INIT_DELAYED_WORK(&priv->dfs_cac_work, mwifiex_dfs_cac_work_queue); in mwifiex_add_virtual_intf()
3143 priv->dfs_chan_sw_workqueue = alloc_workqueue("MWIFIEX_DFS_CHSW%s", in mwifiex_add_virtual_intf()
3146 if (!priv->dfs_chan_sw_workqueue) { in mwifiex_add_virtual_intf()
3148 ret = -ENOMEM; in mwifiex_add_virtual_intf()
3152 INIT_DELAYED_WORK(&priv->dfs_chan_sw_work, in mwifiex_add_virtual_intf()
3155 mutex_init(&priv->async_mutex); in mwifiex_add_virtual_intf()
3158 if (cfg80211_register_netdevice(dev)) { in mwifiex_add_virtual_intf()
3160 ret = -EFAULT; in mwifiex_add_virtual_intf()
3165 "info: %s: Marvell 802.11 Adapter\n", dev->name); in mwifiex_add_virtual_intf()
3173 return &priv->wdev; in mwifiex_add_virtual_intf()
3176 destroy_workqueue(priv->dfs_chan_sw_workqueue); in mwifiex_add_virtual_intf()
3177 priv->dfs_chan_sw_workqueue = NULL; in mwifiex_add_virtual_intf()
3179 destroy_workqueue(priv->dfs_cac_workqueue); in mwifiex_add_virtual_intf()
3180 priv->dfs_cac_workqueue = NULL; in mwifiex_add_virtual_intf()
3182 free_netdev(dev); in mwifiex_add_virtual_intf()
3183 priv->netdev = NULL; in mwifiex_add_virtual_intf()
3187 memset(&priv->wdev, 0, sizeof(priv->wdev)); in mwifiex_add_virtual_intf()
3188 priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_add_virtual_intf()
3189 priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_add_virtual_intf()
3195 * del_virtual_intf: remove the virtual interface determined by dev
3199 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_del_virtual_intf()
3200 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_del_virtual_intf()
3207 if (priv->sched_scanning) in mwifiex_del_virtual_intf()
3208 priv->sched_scanning = false; in mwifiex_del_virtual_intf()
3210 mwifiex_stop_net_dev_queue(priv->netdev, adapter); in mwifiex_del_virtual_intf()
3212 skb_queue_walk_safe(&priv->bypass_txq, skb, tmp) { in mwifiex_del_virtual_intf()
3213 skb_unlink(skb, &priv->bypass_txq); in mwifiex_del_virtual_intf()
3214 mwifiex_write_data_complete(priv->adapter, skb, 0, -1); in mwifiex_del_virtual_intf()
3217 if (netif_carrier_ok(priv->netdev)) in mwifiex_del_virtual_intf()
3218 netif_carrier_off(priv->netdev); in mwifiex_del_virtual_intf()
3220 if (wdev->netdev->reg_state == NETREG_REGISTERED) in mwifiex_del_virtual_intf()
3221 cfg80211_unregister_netdevice(wdev->netdev); in mwifiex_del_virtual_intf()
3223 if (priv->dfs_cac_workqueue) { in mwifiex_del_virtual_intf()
3224 destroy_workqueue(priv->dfs_cac_workqueue); in mwifiex_del_virtual_intf()
3225 priv->dfs_cac_workqueue = NULL; in mwifiex_del_virtual_intf()
3228 if (priv->dfs_chan_sw_workqueue) { in mwifiex_del_virtual_intf()
3229 destroy_workqueue(priv->dfs_chan_sw_workqueue); in mwifiex_del_virtual_intf()
3230 priv->dfs_chan_sw_workqueue = NULL; in mwifiex_del_virtual_intf()
3233 priv->netdev = NULL; in mwifiex_del_virtual_intf()
3235 update_vif_type_counter(adapter, priv->bss_mode, -1); in mwifiex_del_virtual_intf()
3237 priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_del_virtual_intf()
3241 kfree(priv->hist_data); in mwifiex_del_virtual_intf()
3254 for (j = 0; j < DIV_ROUND_UP(pat->pattern_len, 8); j++) { in mwifiex_is_pattern_supported()
3256 if (pat->mask[j] & 1 << k) { in mwifiex_is_pattern_supported()
3258 &pat->pattern[j * 8 + k], 1); in mwifiex_is_pattern_supported()
3271 pat->pkt_offset++; in mwifiex_is_pattern_supported()
3291 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_set_auto_arp_mef_entry()
3293 mef_entry->mode = MEF_MODE_HOST_SLEEP; in mwifiex_set_auto_arp_mef_entry()
3294 mef_entry->action = MEF_ACTION_AUTO_ARP; in mwifiex_set_auto_arp_mef_entry()
3299 if (adapter->priv[i]->netdev) { in mwifiex_set_auto_arp_mef_entry()
3300 in_dev = __in_dev_get_rtnl(adapter->priv[i]->netdev); in mwifiex_set_auto_arp_mef_entry()
3303 ifa = rtnl_dereference(in_dev->ifa_list); in mwifiex_set_auto_arp_mef_entry()
3304 if (!ifa || !ifa->ifa_local) in mwifiex_set_auto_arp_mef_entry()
3306 ips[i] = ifa->ifa_local; in mwifiex_set_auto_arp_mef_entry()
3314 mef_entry->filter[filt_num].repeat = 1; in mwifiex_set_auto_arp_mef_entry()
3315 memcpy(mef_entry->filter[filt_num].byte_seq, in mwifiex_set_auto_arp_mef_entry()
3317 mef_entry->filter[filt_num]. in mwifiex_set_auto_arp_mef_entry()
3320 mef_entry->filter[filt_num].offset = 46; in mwifiex_set_auto_arp_mef_entry()
3321 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_auto_arp_mef_entry()
3323 mef_entry->filter[filt_num].filt_action = in mwifiex_set_auto_arp_mef_entry()
3329 mef_entry->filter[filt_num].repeat = 1; in mwifiex_set_auto_arp_mef_entry()
3330 mef_entry->filter[filt_num].byte_seq[0] = 0x08; in mwifiex_set_auto_arp_mef_entry()
3331 mef_entry->filter[filt_num].byte_seq[1] = 0x06; in mwifiex_set_auto_arp_mef_entry()
3332 mef_entry->filter[filt_num].byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] = 2; in mwifiex_set_auto_arp_mef_entry()
3333 mef_entry->filter[filt_num].offset = 20; in mwifiex_set_auto_arp_mef_entry()
3334 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_auto_arp_mef_entry()
3335 mef_entry->filter[filt_num].filt_action = TYPE_AND; in mwifiex_set_auto_arp_mef_entry()
3349 mef_entry->mode = MEF_MODE_HOST_SLEEP; in mwifiex_set_wowlan_mef_entry()
3350 mef_entry->action = MEF_ACTION_ALLOW_AND_WAKEUP_HOST; in mwifiex_set_wowlan_mef_entry()
3352 for (i = 0; i < wowlan->n_patterns; i++) { in mwifiex_set_wowlan_mef_entry()
3354 if (!mwifiex_is_pattern_supported(&wowlan->patterns[i], in mwifiex_set_wowlan_mef_entry()
3357 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_set_wowlan_mef_entry()
3359 return -EOPNOTSUPP; in mwifiex_set_wowlan_mef_entry()
3362 if (!wowlan->patterns[i].pkt_offset) { in mwifiex_set_wowlan_mef_entry()
3365 mef_cfg->criteria |= MWIFIEX_CRITERIA_UNICAST; in mwifiex_set_wowlan_mef_entry()
3368 mef_cfg->criteria |= MWIFIEX_CRITERIA_BROADCAST; in mwifiex_set_wowlan_mef_entry()
3374 mef_cfg->criteria |= MWIFIEX_CRITERIA_MULTICAST; in mwifiex_set_wowlan_mef_entry()
3378 mef_entry->filter[filt_num].repeat = 1; in mwifiex_set_wowlan_mef_entry()
3379 mef_entry->filter[filt_num].offset = in mwifiex_set_wowlan_mef_entry()
3380 wowlan->patterns[i].pkt_offset; in mwifiex_set_wowlan_mef_entry()
3381 memcpy(mef_entry->filter[filt_num].byte_seq, byte_seq, in mwifiex_set_wowlan_mef_entry()
3383 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_wowlan_mef_entry()
3387 mwifiex_dbg(priv->adapter, INFO, "Wake on patterns\n"); in mwifiex_set_wowlan_mef_entry()
3389 mef_entry->filter[filt_num].filt_action = TYPE_AND; in mwifiex_set_wowlan_mef_entry()
3395 if (wowlan->magic_pkt) { in mwifiex_set_wowlan_mef_entry()
3396 mef_cfg->criteria |= MWIFIEX_CRITERIA_UNICAST; in mwifiex_set_wowlan_mef_entry()
3397 mef_entry->filter[filt_num].repeat = 16; in mwifiex_set_wowlan_mef_entry()
3398 memcpy(mef_entry->filter[filt_num].byte_seq, priv->curr_addr, in mwifiex_set_wowlan_mef_entry()
3400 mef_entry->filter[filt_num].byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] = in mwifiex_set_wowlan_mef_entry()
3402 mef_entry->filter[filt_num].offset = 28; in mwifiex_set_wowlan_mef_entry()
3403 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_wowlan_mef_entry()
3405 mef_entry->filter[filt_num].filt_action = TYPE_OR; in mwifiex_set_wowlan_mef_entry()
3408 mef_entry->filter[filt_num].repeat = 16; in mwifiex_set_wowlan_mef_entry()
3409 memcpy(mef_entry->filter[filt_num].byte_seq, priv->curr_addr, in mwifiex_set_wowlan_mef_entry()
3411 mef_entry->filter[filt_num].byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] = in mwifiex_set_wowlan_mef_entry()
3413 mef_entry->filter[filt_num].offset = 56; in mwifiex_set_wowlan_mef_entry()
3414 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_wowlan_mef_entry()
3415 mef_entry->filter[filt_num].filt_action = TYPE_OR; in mwifiex_set_wowlan_mef_entry()
3416 mwifiex_dbg(priv->adapter, INFO, "Wake on magic packet\n"); in mwifiex_set_wowlan_mef_entry()
3428 if (wowlan->n_patterns || wowlan->magic_pkt) in mwifiex_set_mef_filter()
3433 return -ENOMEM; in mwifiex_set_mef_filter()
3443 if (wowlan->n_patterns || wowlan->magic_pkt) { in mwifiex_set_mef_filter()
3474 sta_priv->scan_aborting = true; in mwifiex_cfg80211_suspend()
3475 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_cfg80211_suspend()
3476 priv = adapter->priv[i]; in mwifiex_cfg80211_suspend()
3482 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_cfg80211_suspend()
3483 priv = adapter->priv[i]; in mwifiex_cfg80211_suspend()
3484 if (priv && priv->netdev) in mwifiex_cfg80211_suspend()
3485 netif_device_detach(priv->netdev); in mwifiex_cfg80211_suspend()
3491 !skb_queue_empty(&adapter->tx_data_q)) in mwifiex_cfg80211_suspend()
3504 if (!sta_priv->media_connected && !wowlan->nd_config) { in mwifiex_cfg80211_suspend()
3518 hs_cfg.conditions = le32_to_cpu(adapter->hs_cfg.conditions); in mwifiex_cfg80211_suspend()
3520 if (wowlan->nd_config) { in mwifiex_cfg80211_suspend()
3523 mwifiex_cfg80211_sched_scan_start(wiphy, sta_priv->netdev, in mwifiex_cfg80211_suspend()
3524 wowlan->nd_config); in mwifiex_cfg80211_suspend()
3527 if (wowlan->disconnect) { in mwifiex_cfg80211_suspend()
3529 mwifiex_dbg(sta_priv->adapter, INFO, "Wake on device disconnect\n"); in mwifiex_cfg80211_suspend()
3533 hs_cfg.gpio = adapter->hs_cfg.gpio; in mwifiex_cfg80211_suspend()
3534 hs_cfg.gap = adapter->hs_cfg.gap; in mwifiex_cfg80211_suspend()
3541 sta_priv->scan_aborting = false; in mwifiex_cfg80211_suspend()
3554 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_cfg80211_resume()
3555 priv = adapter->priv[i]; in mwifiex_cfg80211_resume()
3556 if (priv && priv->netdev) in mwifiex_cfg80211_resume()
3557 netif_device_attach(priv->netdev); in mwifiex_cfg80211_resume()
3560 if (!wiphy->wowlan_config) in mwifiex_cfg80211_resume()
3568 wakeup_report.pattern_idx = -1; in mwifiex_cfg80211_resume()
3582 if (wiphy->wowlan_config->disconnect) in mwifiex_cfg80211_resume()
3584 if (wiphy->wowlan_config->nd_config) in mwifiex_cfg80211_resume()
3585 wakeup_report.net_detect = adapter->nd_info; in mwifiex_cfg80211_resume()
3590 if (wiphy->wowlan_config->magic_pkt) in mwifiex_cfg80211_resume()
3592 if (wiphy->wowlan_config->n_patterns) in mwifiex_cfg80211_resume()
3596 if (wiphy->wowlan_config->gtk_rekey_failure) in mwifiex_cfg80211_resume()
3605 cfg80211_report_wowlan_wakeup(&priv->wdev, &wakeup_report, in mwifiex_cfg80211_resume()
3609 if (adapter->nd_info) { in mwifiex_cfg80211_resume()
3610 for (i = 0 ; i < adapter->nd_info->n_matches ; i++) in mwifiex_cfg80211_resume()
3611 kfree(adapter->nd_info->matches[i]); in mwifiex_cfg80211_resume()
3612 kfree(adapter->nd_info); in mwifiex_cfg80211_resume()
3613 adapter->nd_info = NULL; in mwifiex_cfg80211_resume()
3624 device_set_wakeup_enable(adapter->dev, enabled); in mwifiex_cfg80211_set_wakeup()
3627 static int mwifiex_set_rekey_data(struct wiphy *wiphy, struct net_device *dev, in mwifiex_set_rekey_data() argument
3630 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_set_rekey_data()
3632 if (!ISSUPP_FIRMWARE_SUPPLICANT(priv->adapter->fw_cap_info)) in mwifiex_set_rekey_data()
3633 return -EOPNOTSUPP; in mwifiex_set_rekey_data()
3670 mrule->max_coalescing_delay = crule->delay; in mwifiex_fill_coalesce_rule_info()
3672 param = mrule->params; in mwifiex_fill_coalesce_rule_info()
3674 for (i = 0; i < crule->n_patterns; i++) { in mwifiex_fill_coalesce_rule_info()
3676 if (!mwifiex_is_pattern_supported(&crule->patterns[i], in mwifiex_fill_coalesce_rule_info()
3679 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_fill_coalesce_rule_info()
3681 return -EOPNOTSUPP; in mwifiex_fill_coalesce_rule_info()
3684 if (!crule->patterns[i].pkt_offset) { in mwifiex_fill_coalesce_rule_info()
3688 if (pkt_type && mrule->pkt_type) { in mwifiex_fill_coalesce_rule_info()
3689 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_fill_coalesce_rule_info()
3691 return -EOPNOTSUPP; in mwifiex_fill_coalesce_rule_info()
3693 mrule->pkt_type = pkt_type; in mwifiex_fill_coalesce_rule_info()
3698 if (crule->condition == NL80211_COALESCE_CONDITION_MATCH) in mwifiex_fill_coalesce_rule_info()
3699 param->operation = RECV_FILTER_MATCH_TYPE_EQ; in mwifiex_fill_coalesce_rule_info()
3701 param->operation = RECV_FILTER_MATCH_TYPE_NE; in mwifiex_fill_coalesce_rule_info()
3703 param->operand_len = byte_seq[MWIFIEX_COALESCE_MAX_BYTESEQ]; in mwifiex_fill_coalesce_rule_info()
3704 memcpy(param->operand_byte_stream, byte_seq, in mwifiex_fill_coalesce_rule_info()
3705 param->operand_len); in mwifiex_fill_coalesce_rule_info()
3706 param->offset = crule->patterns[i].pkt_offset; in mwifiex_fill_coalesce_rule_info()
3709 mrule->num_of_fields++; in mwifiex_fill_coalesce_rule_info()
3712 if (!mrule->pkt_type) { in mwifiex_fill_coalesce_rule_info()
3713 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_fill_coalesce_rule_info()
3715 return -EOPNOTSUPP; in mwifiex_fill_coalesce_rule_info()
3739 coalesce_cfg.num_of_rules = coalesce->n_rules; in mwifiex_cfg80211_set_coalesce()
3740 for (i = 0; i < coalesce->n_rules; i++) { in mwifiex_cfg80211_set_coalesce()
3741 ret = mwifiex_fill_coalesce_rule_info(priv, &coalesce->rules[i], in mwifiex_cfg80211_set_coalesce()
3759 mwifiex_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_tdls_mgmt() argument
3765 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_tdls_mgmt()
3768 if (!(wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS)) in mwifiex_cfg80211_tdls_mgmt()
3769 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_mgmt()
3772 if (!(priv->bss_type == MWIFIEX_BSS_TYPE_STA && priv->media_connected)) in mwifiex_cfg80211_tdls_mgmt()
3773 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_mgmt()
3777 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3787 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3795 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3803 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3810 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3817 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3824 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_mgmt()
3826 ret = -EINVAL; in mwifiex_cfg80211_tdls_mgmt()
3834 mwifiex_cfg80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_tdls_oper() argument
3837 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_tdls_oper()
3839 if (!(wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) || in mwifiex_cfg80211_tdls_oper()
3840 !(wiphy->flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) in mwifiex_cfg80211_tdls_oper()
3841 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_oper()
3844 if (!(priv->bss_type == MWIFIEX_BSS_TYPE_STA && priv->media_connected)) in mwifiex_cfg80211_tdls_oper()
3845 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_oper()
3847 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_oper()
3859 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_oper()
3861 return -EINVAL; in mwifiex_cfg80211_tdls_oper()
3864 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_oper()
3866 return -EINVAL; in mwifiex_cfg80211_tdls_oper()
3869 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_oper()
3871 return -EINVAL; in mwifiex_cfg80211_tdls_oper()
3873 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_oper()
3875 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_oper()
3882 mwifiex_cfg80211_tdls_chan_switch(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_tdls_chan_switch() argument
3889 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_tdls_chan_switch()
3891 spin_lock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3894 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3897 return -ENOENT; in mwifiex_cfg80211_tdls_chan_switch()
3900 if (!(sta_ptr->tdls_cap.extcap.ext_capab[3] & in mwifiex_cfg80211_tdls_chan_switch()
3902 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3903 wiphy_err(wiphy, "%pM do not support tdls cs\n", addr); in mwifiex_cfg80211_tdls_chan_switch()
3904 return -ENOENT; in mwifiex_cfg80211_tdls_chan_switch()
3907 if (sta_ptr->tdls_status == TDLS_CHAN_SWITCHING || in mwifiex_cfg80211_tdls_chan_switch()
3908 sta_ptr->tdls_status == TDLS_IN_OFF_CHAN) { in mwifiex_cfg80211_tdls_chan_switch()
3909 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3911 return -EALREADY; in mwifiex_cfg80211_tdls_chan_switch()
3913 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3915 chan = chandef->chan->hw_value; in mwifiex_cfg80211_tdls_chan_switch()
3917 band = chandef->chan->band; in mwifiex_cfg80211_tdls_chan_switch()
3925 struct net_device *dev, in mwifiex_cfg80211_tdls_cancel_chan_switch() argument
3929 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3931 spin_lock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3934 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3937 } else if (!(sta_ptr->tdls_status == TDLS_CHAN_SWITCHING || in mwifiex_cfg80211_tdls_cancel_chan_switch()
3938 sta_ptr->tdls_status == TDLS_IN_BASE_CHAN || in mwifiex_cfg80211_tdls_cancel_chan_switch()
3939 sta_ptr->tdls_status == TDLS_IN_OFF_CHAN)) { in mwifiex_cfg80211_tdls_cancel_chan_switch()
3940 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3944 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3950 mwifiex_cfg80211_add_station(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_add_station() argument
3953 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_add_station()
3955 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in mwifiex_cfg80211_add_station()
3956 return -EOPNOTSUPP; in mwifiex_cfg80211_add_station()
3959 if ((priv->bss_type != MWIFIEX_BSS_TYPE_STA) || !priv->media_connected) in mwifiex_cfg80211_add_station()
3960 return -EOPNOTSUPP; in mwifiex_cfg80211_add_station()
3966 mwifiex_cfg80211_channel_switch(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_channel_switch() argument
3972 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_channel_switch()
3974 if (priv->adapter->scan_processing) { in mwifiex_cfg80211_channel_switch()
3975 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_channel_switch()
3977 return -EBUSY; in mwifiex_cfg80211_channel_switch()
3980 if (priv->wdev.cac_started) in mwifiex_cfg80211_channel_switch()
3981 return -EBUSY; in mwifiex_cfg80211_channel_switch()
3983 if (cfg80211_chandef_identical(¶ms->chandef, in mwifiex_cfg80211_channel_switch()
3984 &priv->dfs_chandef)) in mwifiex_cfg80211_channel_switch()
3985 return -EINVAL; in mwifiex_cfg80211_channel_switch()
3988 params->beacon_csa.tail, in mwifiex_cfg80211_channel_switch()
3989 params->beacon_csa.tail_len); in mwifiex_cfg80211_channel_switch()
3991 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_channel_switch()
3993 return -EINVAL; in mwifiex_cfg80211_channel_switch()
3997 if (channel_sw->mode) { in mwifiex_cfg80211_channel_switch()
3998 if (netif_carrier_ok(priv->netdev)) in mwifiex_cfg80211_channel_switch()
3999 netif_carrier_off(priv->netdev); in mwifiex_cfg80211_channel_switch()
4000 mwifiex_stop_net_dev_queue(priv->netdev, priv->adapter); in mwifiex_cfg80211_channel_switch()
4004 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_channel_switch()
4007 if (mwifiex_set_mgmt_ies(priv, ¶ms->beacon_csa)) { in mwifiex_cfg80211_channel_switch()
4008 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_channel_switch()
4010 return -EFAULT; in mwifiex_cfg80211_channel_switch()
4013 memcpy(&priv->dfs_chandef, ¶ms->chandef, sizeof(priv->dfs_chandef)); in mwifiex_cfg80211_channel_switch()
4014 memcpy(&priv->beacon_after, ¶ms->beacon_after, in mwifiex_cfg80211_channel_switch()
4015 sizeof(priv->beacon_after)); in mwifiex_cfg80211_channel_switch()
4017 chsw_msec = max(channel_sw->count * priv->bss_cfg.beacon_period, 100); in mwifiex_cfg80211_channel_switch()
4018 queue_delayed_work(priv->dfs_chan_sw_workqueue, &priv->dfs_chan_sw_work, in mwifiex_cfg80211_channel_switch()
4028 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_cfg80211_get_channel()
4034 int ret = -ENODATA; in mwifiex_cfg80211_get_channel()
4037 cfg80211_chandef_valid(&priv->bss_chandef)) { in mwifiex_cfg80211_get_channel()
4038 *chandef = priv->bss_chandef; in mwifiex_cfg80211_get_channel()
4040 } else if (priv->media_connected) { in mwifiex_cfg80211_get_channel()
4041 curr_bss = &priv->curr_bss_params.bss_descriptor; in mwifiex_cfg80211_get_channel()
4042 band = mwifiex_band_to_radio_type(priv->curr_bss_params.band); in mwifiex_cfg80211_get_channel()
4043 freq = ieee80211_channel_to_frequency(curr_bss->channel, band); in mwifiex_cfg80211_get_channel()
4046 if (priv->ht_param_present) { in mwifiex_cfg80211_get_channel()
4068 MWIFIEX_TM_ATTR_MAX = __MWIFIEX_TM_ATTR_AFTER_LAST - 1,
4084 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_tm_cmd()
4091 return -EINVAL; in mwifiex_tm_cmd()
4099 return -EINVAL; in mwifiex_tm_cmd()
4104 return -EINVAL; in mwifiex_tm_cmd()
4108 return -ENOMEM; in mwifiex_tm_cmd()
4110 hostcmd->len = nla_len(tb[MWIFIEX_TM_ATTR_DATA]); in mwifiex_tm_cmd()
4111 memcpy(hostcmd->cmd, nla_data(tb[MWIFIEX_TM_ATTR_DATA]), in mwifiex_tm_cmd()
4112 hostcmd->len); in mwifiex_tm_cmd()
4115 dev_err(priv->adapter->dev, "Failed to process hostcmd\n"); in mwifiex_tm_cmd()
4117 return -EFAULT; in mwifiex_tm_cmd()
4121 skb = cfg80211_testmode_alloc_reply_skb(wiphy, hostcmd->len); in mwifiex_tm_cmd()
4124 return -ENOMEM; in mwifiex_tm_cmd()
4127 hostcmd->len, hostcmd->cmd); in mwifiex_tm_cmd()
4131 return -EMSGSIZE; in mwifiex_tm_cmd()
4138 return -EOPNOTSUPP; in mwifiex_tm_cmd()
4145 struct net_device *dev, in mwifiex_cfg80211_start_radar_detection() argument
4149 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_start_radar_detection()
4152 if (priv->adapter->scan_processing) { in mwifiex_cfg80211_start_radar_detection()
4153 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_radar_detection()
4155 return -EBUSY; in mwifiex_cfg80211_start_radar_detection()
4159 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_start_radar_detection()
4162 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_radar_detection()
4164 return -1; in mwifiex_cfg80211_start_radar_detection()
4166 priv->state_11h.is_11h_active = true; in mwifiex_cfg80211_start_radar_detection()
4173 memcpy(&priv->dfs_chandef, chandef, sizeof(priv->dfs_chandef)); in mwifiex_cfg80211_start_radar_detection()
4177 return -1; in mwifiex_cfg80211_start_radar_detection()
4179 queue_delayed_work(priv->dfs_cac_workqueue, &priv->dfs_cac_work, in mwifiex_cfg80211_start_radar_detection()
4185 mwifiex_cfg80211_change_station(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_change_station() argument
4190 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_change_station()
4193 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in mwifiex_cfg80211_change_station()
4194 return -EOPNOTSUPP; in mwifiex_cfg80211_change_station()
4197 if ((priv->bss_type != MWIFIEX_BSS_TYPE_STA) || !priv->media_connected) in mwifiex_cfg80211_change_station()
4198 return -EOPNOTSUPP; in mwifiex_cfg80211_change_station()
4200 priv->sta_params = params; in mwifiex_cfg80211_change_station()
4203 priv->sta_params = NULL; in mwifiex_cfg80211_change_station()
4312 if (adapter->config_bands & BAND_A) in mwifiex_init_channel_scan_gap()
4318 adapter->num_in_chan_stats = 2 * (n_channels_bg + n_channels_a); in mwifiex_init_channel_scan_gap()
4319 adapter->chan_stats = vmalloc(array_size(sizeof(*adapter->chan_stats), in mwifiex_init_channel_scan_gap()
4320 adapter->num_in_chan_stats)); in mwifiex_init_channel_scan_gap()
4322 if (!adapter->chan_stats) in mwifiex_init_channel_scan_gap()
4323 return -ENOMEM; in mwifiex_init_channel_scan_gap()
4341 struct mwifiex_private *priv = adapter->priv[MWIFIEX_BSS_TYPE_STA]; in mwifiex_register_cfg80211()
4351 return -ENOMEM; in mwifiex_register_cfg80211()
4353 wiphy->max_scan_ssids = MWIFIEX_MAX_SSID_LIST_LENGTH; in mwifiex_register_cfg80211()
4354 wiphy->max_scan_ie_len = MWIFIEX_MAX_VSIE_LEN; in mwifiex_register_cfg80211()
4355 wiphy->mgmt_stypes = mwifiex_mgmt_stypes; in mwifiex_register_cfg80211()
4356 wiphy->max_remain_on_channel_duration = 5000; in mwifiex_register_cfg80211()
4357 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in mwifiex_register_cfg80211()
4362 if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4363 wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in mwifiex_register_cfg80211()
4365 wiphy->bands[NL80211_BAND_2GHZ] = devm_kmemdup(adapter->dev, in mwifiex_register_cfg80211()
4369 if (!wiphy->bands[NL80211_BAND_2GHZ]) { in mwifiex_register_cfg80211()
4370 ret = -ENOMEM; in mwifiex_register_cfg80211()
4374 if (adapter->config_bands & BAND_A) { in mwifiex_register_cfg80211()
4375 wiphy->bands[NL80211_BAND_5GHZ] = devm_kmemdup(adapter->dev, in mwifiex_register_cfg80211()
4379 if (!wiphy->bands[NL80211_BAND_5GHZ]) { in mwifiex_register_cfg80211()
4380 ret = -ENOMEM; in mwifiex_register_cfg80211()
4384 wiphy->bands[NL80211_BAND_5GHZ] = NULL; in mwifiex_register_cfg80211()
4387 if (adapter->drcs_enabled && ISSUPP_DRCS_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4388 wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta_drcs; in mwifiex_register_cfg80211()
4389 else if (adapter->is_hw_11ac_capable) in mwifiex_register_cfg80211()
4390 wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta_vht; in mwifiex_register_cfg80211()
4392 wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta; in mwifiex_register_cfg80211()
4393 wiphy->n_iface_combinations = 1; in mwifiex_register_cfg80211()
4395 if (adapter->max_sta_conn > adapter->max_p2p_conn) in mwifiex_register_cfg80211()
4396 wiphy->max_ap_assoc_sta = adapter->max_sta_conn; in mwifiex_register_cfg80211()
4398 wiphy->max_ap_assoc_sta = adapter->max_p2p_conn; in mwifiex_register_cfg80211()
4401 wiphy->cipher_suites = mwifiex_cipher_suites; in mwifiex_register_cfg80211()
4402 wiphy->n_cipher_suites = ARRAY_SIZE(mwifiex_cipher_suites); in mwifiex_register_cfg80211()
4404 if (adapter->regd) { in mwifiex_register_cfg80211()
4405 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG | in mwifiex_register_cfg80211()
4408 wiphy_apply_custom_regulatory(wiphy, adapter->regd); in mwifiex_register_cfg80211()
4411 ether_addr_copy(wiphy->perm_addr, adapter->perm_addr); in mwifiex_register_cfg80211()
4412 wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; in mwifiex_register_cfg80211()
4413 wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME | in mwifiex_register_cfg80211()
4421 if (ISSUPP_TDLS_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4422 wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS | in mwifiex_register_cfg80211()
4426 if (ISSUPP_FIRMWARE_SUPPLICANT(priv->adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4427 wiphy->wowlan = &mwifiex_wowlan_support; in mwifiex_register_cfg80211()
4429 wiphy->wowlan = &mwifiex_wowlan_support_no_gtk; in mwifiex_register_cfg80211()
4432 wiphy->coalesce = &mwifiex_coalesce_support; in mwifiex_register_cfg80211()
4434 wiphy->probe_resp_offload = NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS | in mwifiex_register_cfg80211()
4438 wiphy->max_sched_scan_reqs = 1; in mwifiex_register_cfg80211()
4439 wiphy->max_sched_scan_ssids = MWIFIEX_MAX_SSID_LIST_LENGTH; in mwifiex_register_cfg80211()
4440 wiphy->max_sched_scan_ie_len = MWIFIEX_MAX_VSIE_LEN; in mwifiex_register_cfg80211()
4441 wiphy->max_match_sets = MWIFIEX_MAX_SSID_LIST_LENGTH; in mwifiex_register_cfg80211()
4443 wiphy->available_antennas_tx = BIT(adapter->number_of_antenna) - 1; in mwifiex_register_cfg80211()
4444 wiphy->available_antennas_rx = BIT(adapter->number_of_antenna) - 1; in mwifiex_register_cfg80211()
4446 wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER | in mwifiex_register_cfg80211()
4450 if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4451 wiphy->features |= NL80211_FEATURE_HT_IBSS; in mwifiex_register_cfg80211()
4453 if (ISSUPP_RANDOM_MAC(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4454 wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR | in mwifiex_register_cfg80211()
4458 if (ISSUPP_TDLS_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4459 wiphy->features |= NL80211_FEATURE_TDLS_CHANNEL_SWITCH; in mwifiex_register_cfg80211()
4461 if (adapter->fw_api_ver == MWIFIEX_FW_V15) in mwifiex_register_cfg80211()
4462 wiphy->features |= NL80211_FEATURE_SK_TX_STATUS; in mwifiex_register_cfg80211()
4465 wiphy->bss_priv_size = sizeof(struct mwifiex_bss_priv); in mwifiex_register_cfg80211()
4467 wiphy->reg_notifier = mwifiex_reg_notifier; in mwifiex_register_cfg80211()
4473 set_wiphy_dev(wiphy, priv->adapter->dev); in mwifiex_register_cfg80211()
4482 if (!adapter->regd) { in mwifiex_register_cfg80211()
4488 if (adapter->region_code == 0x00) { in mwifiex_register_cfg80211()
4492 wiphy->regulatory_flags |= in mwifiex_register_cfg80211()
4497 adapter->region_code); in mwifiex_register_cfg80211()
4500 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_register_cfg80211()
4508 wiphy->frag_threshold = thr; in mwifiex_register_cfg80211()
4511 wiphy->rts_threshold = thr; in mwifiex_register_cfg80211()
4514 wiphy->retry_short = (u8) retry; in mwifiex_register_cfg80211()
4517 wiphy->retry_long = (u8) retry; in mwifiex_register_cfg80211()
4519 adapter->wiphy = wiphy; in mwifiex_register_cfg80211()