Lines Matching +full:cs +full:- +full:dev +full:- +full:assoc
4 * Copyright 2011-2020 NXP
11 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
12 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
14 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
75 * The mapping is as follows -
76 * NL80211_CHAN_NO_HT -> IEEE80211_HT_PARAM_CHA_SEC_NONE
77 * NL80211_CHAN_HT20 -> IEEE80211_HT_PARAM_CHA_SEC_NONE
78 * NL80211_CHAN_HT40PLUS -> IEEE80211_HT_PARAM_CHA_SEC_ABOVE
79 * NL80211_CHAN_HT40MINUS -> IEEE80211_HT_PARAM_CHA_SEC_BELOW
80 * Others -> IEEE80211_HT_PARAM_CHA_SEC_NONE
164 mwifiex_dbg(priv->adapter, ERROR, "deleting the crypto keys\n"); in mwifiex_cfg80211_del_key()
165 return -EFAULT; in mwifiex_cfg80211_del_key()
168 mwifiex_dbg(priv->adapter, INFO, "info: crypto keys deleted\n"); in mwifiex_cfg80211_del_key()
197 len - sizeof(struct ieee80211_hdr_3addr)); in mwifiex_form_mgmt_frame()
199 skb->priority = LOW_PRIO_TID; in mwifiex_form_mgmt_frame()
212 const u8 *buf = params->buf; in mwifiex_cfg80211_mgmt_tx()
213 size_t len = params->len; in mwifiex_cfg80211_mgmt_tx()
218 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_cfg80211_mgmt_tx()
221 mwifiex_dbg(priv->adapter, ERROR, "invalid buffer and length\n"); in mwifiex_cfg80211_mgmt_tx()
222 return -EFAULT; in mwifiex_cfg80211_mgmt_tx()
227 ieee80211_is_probe_resp(mgmt->frame_control)) { in mwifiex_cfg80211_mgmt_tx()
230 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_mgmt_tx()
241 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_mgmt_tx()
243 return -ENOMEM; in mwifiex_cfg80211_mgmt_tx()
248 tx_info->bss_num = priv->bss_num; in mwifiex_cfg80211_mgmt_tx()
249 tx_info->bss_type = priv->bss_type; in mwifiex_cfg80211_mgmt_tx()
250 tx_info->pkt_len = pkt_len; in mwifiex_cfg80211_mgmt_tx()
255 if (ieee80211_is_action(mgmt->frame_control)) in mwifiex_cfg80211_mgmt_tx()
265 mwifiex_dbg(priv->adapter, INFO, "info: management frame transmitted\n"); in mwifiex_cfg80211_mgmt_tx()
277 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_cfg80211_update_mgmt_frame_registrations()
278 u32 mask = upd->interface_stypes; in mwifiex_cfg80211_update_mgmt_frame_registrations()
280 if (mask != priv->mgmt_frame_mask) { in mwifiex_cfg80211_update_mgmt_frame_registrations()
281 priv->mgmt_frame_mask = mask; in mwifiex_cfg80211_update_mgmt_frame_registrations()
284 &priv->mgmt_frame_mask, false); in mwifiex_cfg80211_update_mgmt_frame_registrations()
285 mwifiex_dbg(priv->adapter, INFO, "info: mgmt frame registered\n"); in mwifiex_cfg80211_update_mgmt_frame_registrations()
298 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_cfg80211_remain_on_channel()
302 mwifiex_dbg(priv->adapter, ERROR, "Invalid parameter for ROC\n"); in mwifiex_cfg80211_remain_on_channel()
303 return -EINVAL; in mwifiex_cfg80211_remain_on_channel()
306 if (priv->roc_cfg.cookie) { in mwifiex_cfg80211_remain_on_channel()
307 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_remain_on_channel()
309 priv->roc_cfg.cookie); in mwifiex_cfg80211_remain_on_channel()
310 return -EBUSY; in mwifiex_cfg80211_remain_on_channel()
318 priv->roc_cfg.cookie = *cookie; in mwifiex_cfg80211_remain_on_channel()
319 priv->roc_cfg.chan = *chan; in mwifiex_cfg80211_remain_on_channel()
324 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_remain_on_channel()
338 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_cfg80211_cancel_remain_on_channel()
341 if (cookie != priv->roc_cfg.cookie) in mwifiex_cfg80211_cancel_remain_on_channel()
342 return -ENOENT; in mwifiex_cfg80211_cancel_remain_on_channel()
345 &priv->roc_cfg.chan, 0); in mwifiex_cfg80211_cancel_remain_on_channel()
349 &priv->roc_cfg.chan, in mwifiex_cfg80211_cancel_remain_on_channel()
352 memset(&priv->roc_cfg, 0, sizeof(struct mwifiex_roc_cfg)); in mwifiex_cfg80211_cancel_remain_on_channel()
354 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_cancel_remain_on_channel()
414 *dbm = priv->tx_power_level; in mwifiex_cfg80211_get_tx_power()
426 struct net_device *dev, in mwifiex_cfg80211_set_power_mgmt() argument
429 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_set_power_mgmt()
433 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_set_power_mgmt()
452 if (!priv->sec_info.wep_enabled) in mwifiex_cfg80211_set_default_key()
455 if (priv->bss_type == MWIFIEX_BSS_TYPE_UAP) { in mwifiex_cfg80211_set_default_key()
456 priv->wep_key_curr_index = key_index; in mwifiex_cfg80211_set_default_key()
459 mwifiex_dbg(priv->adapter, ERROR, "set default Tx key index\n"); in mwifiex_cfg80211_set_default_key()
460 return -EFAULT; in mwifiex_cfg80211_set_default_key()
480 (params->cipher == WLAN_CIPHER_SUITE_WEP40 || in mwifiex_cfg80211_add_key()
481 params->cipher == WLAN_CIPHER_SUITE_WEP104)) { in mwifiex_cfg80211_add_key()
482 if (params->key && params->key_len) { in mwifiex_cfg80211_add_key()
483 wep_key = &priv->wep_key[key_index]; in mwifiex_cfg80211_add_key()
485 memcpy(wep_key->key_material, params->key, in mwifiex_cfg80211_add_key()
486 params->key_len); in mwifiex_cfg80211_add_key()
487 wep_key->key_index = key_index; in mwifiex_cfg80211_add_key()
488 wep_key->key_length = params->key_len; in mwifiex_cfg80211_add_key()
489 priv->sec_info.wep_enabled = 1; in mwifiex_cfg80211_add_key()
494 if (mwifiex_set_encode(priv, params, params->key, params->key_len, in mwifiex_cfg80211_add_key()
496 mwifiex_dbg(priv->adapter, ERROR, "crypto keys added\n"); in mwifiex_cfg80211_add_key()
497 return -EFAULT; in mwifiex_cfg80211_add_key()
529 * The following information are passed to the firmware -
530 * - Country codes
531 * - Sub bands (first channel, number of channels, maximum Tx power)
545 struct mwifiex_802_11d_domain_reg *domain_info = &adapter->domain_reg; in mwifiex_send_domain_info_cmd_fw()
548 domain_info->country_code[0] = adapter->country_code[0]; in mwifiex_send_domain_info_cmd_fw()
549 domain_info->country_code[1] = adapter->country_code[1]; in mwifiex_send_domain_info_cmd_fw()
550 domain_info->country_code[2] = ' '; in mwifiex_send_domain_info_cmd_fw()
552 band = mwifiex_band_to_radio_type(adapter->config_bands); in mwifiex_send_domain_info_cmd_fw()
553 if (!wiphy->bands[band]) { in mwifiex_send_domain_info_cmd_fw()
556 return -1; in mwifiex_send_domain_info_cmd_fw()
559 sband = wiphy->bands[band]; in mwifiex_send_domain_info_cmd_fw()
561 for (i = 0; i < sband->n_channels ; i++) { in mwifiex_send_domain_info_cmd_fw()
562 ch = &sband->channels[i]; in mwifiex_send_domain_info_cmd_fw()
563 if (ch->flags & IEEE80211_CHAN_DISABLED) in mwifiex_send_domain_info_cmd_fw()
568 first_chan = (u32) ch->hw_value; in mwifiex_send_domain_info_cmd_fw()
570 max_pwr = ch->max_power; in mwifiex_send_domain_info_cmd_fw()
575 if (ch->hw_value == next_chan + 1 && in mwifiex_send_domain_info_cmd_fw()
576 ch->max_power == max_pwr) { in mwifiex_send_domain_info_cmd_fw()
580 t = &domain_info->triplet[no_of_triplet]; in mwifiex_send_domain_info_cmd_fw()
581 t->chans.first_channel = first_chan; in mwifiex_send_domain_info_cmd_fw()
582 t->chans.num_channels = no_of_parsed_chan; in mwifiex_send_domain_info_cmd_fw()
583 t->chans.max_power = max_pwr; in mwifiex_send_domain_info_cmd_fw()
585 first_chan = (u32) ch->hw_value; in mwifiex_send_domain_info_cmd_fw()
587 max_pwr = ch->max_power; in mwifiex_send_domain_info_cmd_fw()
593 t = &domain_info->triplet[no_of_triplet]; in mwifiex_send_domain_info_cmd_fw()
594 t->chans.first_channel = first_chan; in mwifiex_send_domain_info_cmd_fw()
595 t->chans.num_channels = no_of_parsed_chan; in mwifiex_send_domain_info_cmd_fw()
596 t->chans.max_power = max_pwr; in mwifiex_send_domain_info_cmd_fw()
600 domain_info->no_of_triplet = no_of_triplet; in mwifiex_send_domain_info_cmd_fw()
608 return -1; in mwifiex_send_domain_info_cmd_fw()
620 if (!wiphy->bands[NL80211_BAND_5GHZ]) in mwifiex_reg_apply_radar_flags()
622 sband = wiphy->bands[NL80211_BAND_5GHZ]; in mwifiex_reg_apply_radar_flags()
624 for (i = 0; i < sband->n_channels; i++) { in mwifiex_reg_apply_radar_flags()
625 chan = &sband->channels[i]; in mwifiex_reg_apply_radar_flags()
626 if ((!(chan->flags & IEEE80211_CHAN_DISABLED)) && in mwifiex_reg_apply_radar_flags()
627 (chan->flags & IEEE80211_CHAN_RADAR)) in mwifiex_reg_apply_radar_flags()
628 chan->flags |= IEEE80211_CHAN_NO_IR; in mwifiex_reg_apply_radar_flags()
636 * following reasons -
637 * - Set by driver
638 * - Set by system core
639 * - Set by user
640 * - Set bt Country IE
650 request->alpha2[0], request->alpha2[1]); in mwifiex_reg_notifier()
653 switch (request->initiator) { in mwifiex_reg_notifier()
662 request->initiator); in mwifiex_reg_notifier()
667 if (strncmp(request->alpha2, "00", 2) && in mwifiex_reg_notifier()
668 strncmp(request->alpha2, adapter->country_code, in mwifiex_reg_notifier()
669 sizeof(request->alpha2))) { in mwifiex_reg_notifier()
670 memcpy(adapter->country_code, request->alpha2, in mwifiex_reg_notifier()
671 sizeof(request->alpha2)); in mwifiex_reg_notifier()
728 switch (priv->bss_role) { in mwifiex_cfg80211_set_wiphy_params()
730 if (priv->bss_started) { in mwifiex_cfg80211_set_wiphy_params()
733 return -EINVAL; in mwifiex_cfg80211_set_wiphy_params()
738 return -ENOMEM; in mwifiex_cfg80211_set_wiphy_params()
743 bss_cfg->rts_threshold = wiphy->rts_threshold; in mwifiex_cfg80211_set_wiphy_params()
745 bss_cfg->frag_threshold = wiphy->frag_threshold; in mwifiex_cfg80211_set_wiphy_params()
747 bss_cfg->retry_limit = wiphy->retry_long; in mwifiex_cfg80211_set_wiphy_params()
763 if (priv->media_connected) { in mwifiex_cfg80211_set_wiphy_params()
766 return -EINVAL; in mwifiex_cfg80211_set_wiphy_params()
770 wiphy->rts_threshold); in mwifiex_cfg80211_set_wiphy_params()
776 wiphy->frag_threshold); in mwifiex_cfg80211_set_wiphy_params()
793 return -1; in mwifiex_cfg80211_deinit_p2p()
801 * disable -> device -> client
809 return -1; in mwifiex_cfg80211_init_p2p_client()
814 return -1; in mwifiex_cfg80211_init_p2p_client()
819 return -1; in mwifiex_cfg80211_init_p2p_client()
827 * disable -> device -> GO
835 return -1; in mwifiex_cfg80211_init_p2p_go()
840 return -1; in mwifiex_cfg80211_init_p2p_go()
845 return -1; in mwifiex_cfg80211_init_p2p_go()
852 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_deinit_priv_params()
855 priv->mgmt_frame_mask = 0; in mwifiex_deinit_priv_params()
858 &priv->mgmt_frame_mask, false)) { in mwifiex_deinit_priv_params()
861 return -1; in mwifiex_deinit_priv_params()
866 spin_lock_irqsave(&adapter->main_proc_lock, flags); in mwifiex_deinit_priv_params()
867 adapter->main_locked = true; in mwifiex_deinit_priv_params()
868 if (adapter->mwifiex_processing) { in mwifiex_deinit_priv_params()
869 spin_unlock_irqrestore(&adapter->main_proc_lock, flags); in mwifiex_deinit_priv_params()
870 flush_workqueue(adapter->workqueue); in mwifiex_deinit_priv_params()
872 spin_unlock_irqrestore(&adapter->main_proc_lock, flags); in mwifiex_deinit_priv_params()
875 spin_lock_bh(&adapter->rx_proc_lock); in mwifiex_deinit_priv_params()
876 adapter->rx_locked = true; in mwifiex_deinit_priv_params()
877 if (adapter->rx_processing) { in mwifiex_deinit_priv_params()
878 spin_unlock_bh(&adapter->rx_proc_lock); in mwifiex_deinit_priv_params()
879 flush_workqueue(adapter->rx_workqueue); in mwifiex_deinit_priv_params()
881 spin_unlock_bh(&adapter->rx_proc_lock); in mwifiex_deinit_priv_params()
885 priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_deinit_priv_params()
886 priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_deinit_priv_params()
887 priv->sec_info.authentication_mode = NL80211_AUTHTYPE_OPEN_SYSTEM; in mwifiex_deinit_priv_params()
894 struct net_device *dev, in mwifiex_init_new_priv_params() argument
897 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_init_new_priv_params()
902 priv->bss_mode = type; in mwifiex_init_new_priv_params()
903 priv->wdev.iftype = type; in mwifiex_init_new_priv_params()
905 mwifiex_init_priv_params(priv, priv->netdev); in mwifiex_init_new_priv_params()
906 priv->bss_started = 0; in mwifiex_init_new_priv_params()
911 priv->bss_role = MWIFIEX_BSS_ROLE_STA; in mwifiex_init_new_priv_params()
914 priv->bss_role = MWIFIEX_BSS_ROLE_STA; in mwifiex_init_new_priv_params()
917 priv->bss_role = MWIFIEX_BSS_ROLE_UAP; in mwifiex_init_new_priv_params()
920 priv->bss_role = MWIFIEX_BSS_ROLE_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 spin_lock_irqsave(&adapter->main_proc_lock, flags); in mwifiex_init_new_priv_params()
930 adapter->main_locked = false; in mwifiex_init_new_priv_params()
931 spin_unlock_irqrestore(&adapter->main_proc_lock, flags); in mwifiex_init_new_priv_params()
933 spin_lock_bh(&adapter->rx_proc_lock); in mwifiex_init_new_priv_params()
934 adapter->rx_locked = false; in mwifiex_init_new_priv_params()
935 spin_unlock_bh(&adapter->rx_proc_lock); in mwifiex_init_new_priv_params()
937 mwifiex_set_mac_address(priv, dev, false, NULL); in mwifiex_init_new_priv_params()
943 mwifiex_change_vif_to_p2p(struct net_device *dev, in mwifiex_change_vif_to_p2p() argument
951 priv = mwifiex_netdev_get_priv(dev); in mwifiex_change_vif_to_p2p()
954 return -1; in mwifiex_change_vif_to_p2p()
956 adapter = priv->adapter; in mwifiex_change_vif_to_p2p()
958 if (adapter->curr_iface_comb.p2p_intf == in mwifiex_change_vif_to_p2p()
959 adapter->iface_limit.p2p_intf) { in mwifiex_change_vif_to_p2p()
962 return -1; in mwifiex_change_vif_to_p2p()
966 "%s: changing role to p2p\n", dev->name); in mwifiex_change_vif_to_p2p()
969 return -1; in mwifiex_change_vif_to_p2p()
970 if (mwifiex_init_new_priv_params(priv, dev, type)) in mwifiex_change_vif_to_p2p()
971 return -1; in mwifiex_change_vif_to_p2p()
976 return -EFAULT; in mwifiex_change_vif_to_p2p()
980 return -EFAULT; in mwifiex_change_vif_to_p2p()
985 dev->name, type); in mwifiex_change_vif_to_p2p()
986 return -EOPNOTSUPP; in mwifiex_change_vif_to_p2p()
991 return -1; in mwifiex_change_vif_to_p2p()
994 return -1; in mwifiex_change_vif_to_p2p()
999 adapter->curr_iface_comb.sta_intf--; in mwifiex_change_vif_to_p2p()
1002 adapter->curr_iface_comb.uap_intf--; in mwifiex_change_vif_to_p2p()
1008 adapter->curr_iface_comb.p2p_intf++; in mwifiex_change_vif_to_p2p()
1009 dev->ieee80211_ptr->iftype = type; in mwifiex_change_vif_to_p2p()
1015 mwifiex_change_vif_to_sta_adhoc(struct net_device *dev, in mwifiex_change_vif_to_sta_adhoc() argument
1023 priv = mwifiex_netdev_get_priv(dev); in mwifiex_change_vif_to_sta_adhoc()
1026 return -1; in mwifiex_change_vif_to_sta_adhoc()
1028 adapter = priv->adapter; in mwifiex_change_vif_to_sta_adhoc()
1032 (adapter->curr_iface_comb.sta_intf == in mwifiex_change_vif_to_sta_adhoc()
1033 adapter->iface_limit.sta_intf)) { in mwifiex_change_vif_to_sta_adhoc()
1036 return -1; in mwifiex_change_vif_to_sta_adhoc()
1041 "%s: changing role to station\n", dev->name); in mwifiex_change_vif_to_sta_adhoc()
1044 "%s: changing role to adhoc\n", dev->name); in mwifiex_change_vif_to_sta_adhoc()
1047 return -1; in mwifiex_change_vif_to_sta_adhoc()
1048 if (mwifiex_init_new_priv_params(priv, dev, type)) in mwifiex_change_vif_to_sta_adhoc()
1049 return -1; in mwifiex_change_vif_to_sta_adhoc()
1052 return -1; in mwifiex_change_vif_to_sta_adhoc()
1054 return -1; in mwifiex_change_vif_to_sta_adhoc()
1059 adapter->curr_iface_comb.p2p_intf--; in mwifiex_change_vif_to_sta_adhoc()
1062 adapter->curr_iface_comb.uap_intf--; in mwifiex_change_vif_to_sta_adhoc()
1068 adapter->curr_iface_comb.sta_intf++; in mwifiex_change_vif_to_sta_adhoc()
1069 dev->ieee80211_ptr->iftype = type; in mwifiex_change_vif_to_sta_adhoc()
1074 mwifiex_change_vif_to_ap(struct net_device *dev, in mwifiex_change_vif_to_ap() argument
1082 priv = mwifiex_netdev_get_priv(dev); in mwifiex_change_vif_to_ap()
1085 return -1; in mwifiex_change_vif_to_ap()
1087 adapter = priv->adapter; in mwifiex_change_vif_to_ap()
1089 if (adapter->curr_iface_comb.uap_intf == in mwifiex_change_vif_to_ap()
1090 adapter->iface_limit.uap_intf) { in mwifiex_change_vif_to_ap()
1093 return -1; in mwifiex_change_vif_to_ap()
1097 "%s: changing role to AP\n", dev->name); in mwifiex_change_vif_to_ap()
1100 return -1; in mwifiex_change_vif_to_ap()
1101 if (mwifiex_init_new_priv_params(priv, dev, type)) in mwifiex_change_vif_to_ap()
1102 return -1; in mwifiex_change_vif_to_ap()
1105 return -1; in mwifiex_change_vif_to_ap()
1107 return -1; in mwifiex_change_vif_to_ap()
1112 adapter->curr_iface_comb.p2p_intf--; in mwifiex_change_vif_to_ap()
1116 adapter->curr_iface_comb.sta_intf--; in mwifiex_change_vif_to_ap()
1122 adapter->curr_iface_comb.uap_intf++; in mwifiex_change_vif_to_ap()
1123 dev->ieee80211_ptr->iftype = type; in mwifiex_change_vif_to_ap()
1131 struct net_device *dev, in mwifiex_cfg80211_change_virtual_intf() argument
1135 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_change_virtual_intf()
1136 enum nl80211_iftype curr_iftype = dev->ieee80211_ptr->iftype; in mwifiex_cfg80211_change_virtual_intf()
1138 if (priv->scan_request) { in mwifiex_cfg80211_change_virtual_intf()
1139 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_virtual_intf()
1141 return -EBUSY; in mwifiex_cfg80211_change_virtual_intf()
1148 priv->bss_mode = type; in mwifiex_cfg80211_change_virtual_intf()
1149 priv->sec_info.authentication_mode = in mwifiex_cfg80211_change_virtual_intf()
1151 dev->ieee80211_ptr->iftype = type; in mwifiex_cfg80211_change_virtual_intf()
1158 return mwifiex_change_vif_to_p2p(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1161 return mwifiex_change_vif_to_ap(dev, curr_iftype, type, in mwifiex_cfg80211_change_virtual_intf()
1164 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_change_virtual_intf()
1165 "%s: kept type as IBSS\n", dev->name); in mwifiex_cfg80211_change_virtual_intf()
1170 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_virtual_intf()
1172 dev->name, type); in mwifiex_cfg80211_change_virtual_intf()
1173 return -EOPNOTSUPP; in mwifiex_cfg80211_change_virtual_intf()
1179 priv->bss_mode = type; in mwifiex_cfg80211_change_virtual_intf()
1180 priv->sec_info.authentication_mode = in mwifiex_cfg80211_change_virtual_intf()
1182 dev->ieee80211_ptr->iftype = type; in mwifiex_cfg80211_change_virtual_intf()
1189 return mwifiex_change_vif_to_p2p(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1192 return mwifiex_change_vif_to_ap(dev, curr_iftype, type, in mwifiex_cfg80211_change_virtual_intf()
1195 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_change_virtual_intf()
1196 "%s: kept type as STA\n", dev->name); in mwifiex_cfg80211_change_virtual_intf()
1201 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_virtual_intf()
1203 dev->name, type); in mwifiex_cfg80211_change_virtual_intf()
1204 return -EOPNOTSUPP; in mwifiex_cfg80211_change_virtual_intf()
1210 return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1215 return mwifiex_change_vif_to_p2p(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1218 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_change_virtual_intf()
1219 "%s: kept type as AP\n", dev->name); in mwifiex_cfg80211_change_virtual_intf()
1224 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_virtual_intf()
1226 dev->name, type); in mwifiex_cfg80211_change_virtual_intf()
1227 return -EOPNOTSUPP; in mwifiex_cfg80211_change_virtual_intf()
1235 return -EFAULT; in mwifiex_cfg80211_change_virtual_intf()
1236 priv->adapter->curr_iface_comb.p2p_intf--; in mwifiex_cfg80211_change_virtual_intf()
1237 priv->adapter->curr_iface_comb.sta_intf++; in mwifiex_cfg80211_change_virtual_intf()
1238 dev->ieee80211_ptr->iftype = type; in mwifiex_cfg80211_change_virtual_intf()
1240 return -1; in mwifiex_cfg80211_change_virtual_intf()
1241 if (mwifiex_init_new_priv_params(priv, dev, type)) in mwifiex_cfg80211_change_virtual_intf()
1242 return -1; in mwifiex_cfg80211_change_virtual_intf()
1244 return -1; in mwifiex_cfg80211_change_virtual_intf()
1248 return -EFAULT; in mwifiex_cfg80211_change_virtual_intf()
1249 return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype, in mwifiex_cfg80211_change_virtual_intf()
1254 return -EFAULT; in mwifiex_cfg80211_change_virtual_intf()
1255 return mwifiex_change_vif_to_ap(dev, curr_iftype, type, in mwifiex_cfg80211_change_virtual_intf()
1258 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_change_virtual_intf()
1259 "%s: kept type as P2P\n", dev->name); in mwifiex_cfg80211_change_virtual_intf()
1265 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_virtual_intf()
1267 dev->name, type); in mwifiex_cfg80211_change_virtual_intf()
1268 return -EOPNOTSUPP; in mwifiex_cfg80211_change_virtual_intf()
1272 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_virtual_intf()
1274 dev->name, dev->ieee80211_ptr->iftype); in mwifiex_cfg80211_change_virtual_intf()
1275 return -EOPNOTSUPP; in mwifiex_cfg80211_change_virtual_intf()
1286 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_parse_htinfo()
1288 if (adapter->is_hw_11ac_capable) { in mwifiex_parse_htinfo()
1289 /* bit[1-0]: 00=LG 01=HT 10=VHT */ in mwifiex_parse_htinfo()
1292 rate->mcs = rateinfo; in mwifiex_parse_htinfo()
1293 rate->flags |= RATE_INFO_FLAGS_MCS; in mwifiex_parse_htinfo()
1297 rate->mcs = rateinfo & 0x0F; in mwifiex_parse_htinfo()
1298 rate->flags |= RATE_INFO_FLAGS_VHT_MCS; in mwifiex_parse_htinfo()
1305 rate->bw = RATE_INFO_BW_20; in mwifiex_parse_htinfo()
1308 rate->bw = RATE_INFO_BW_40; in mwifiex_parse_htinfo()
1311 rate->bw = RATE_INFO_BW_80; in mwifiex_parse_htinfo()
1314 rate->bw = RATE_INFO_BW_160; in mwifiex_parse_htinfo()
1319 rate->flags |= RATE_INFO_FLAGS_SHORT_GI; in mwifiex_parse_htinfo()
1322 rate->nss = 2; in mwifiex_parse_htinfo()
1324 rate->nss = 1; in mwifiex_parse_htinfo()
1332 rate->mcs = rateinfo; in mwifiex_parse_htinfo()
1333 rate->flags |= RATE_INFO_FLAGS_MCS; in mwifiex_parse_htinfo()
1334 rate->bw = RATE_INFO_BW_20; in mwifiex_parse_htinfo()
1336 rate->bw = RATE_INFO_BW_40; in mwifiex_parse_htinfo()
1338 rate->flags |= RATE_INFO_FLAGS_SHORT_GI; in mwifiex_parse_htinfo()
1342 /* Decode legacy rates for non-HT. */ in mwifiex_parse_htinfo()
1361 rate->legacy = legacy_rates[rateinfo]; in mwifiex_parse_htinfo()
1368 * The following information are shown -
1369 * - Total bytes transmitted
1370 * - Total bytes received
1371 * - Total packets transmitted
1372 * - Total packets received
1373 * - Signal quality level
1374 * - Transmission rate
1383 sinfo->filled = BIT_ULL(NL80211_STA_INFO_RX_BYTES) | BIT_ULL(NL80211_STA_INFO_TX_BYTES) | in mwifiex_dump_station_info()
1390 return -ENOENT; in mwifiex_dump_station_info()
1392 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME) | in mwifiex_dump_station_info()
1394 sinfo->inactive_time = in mwifiex_dump_station_info()
1395 jiffies_to_msecs(jiffies - node->stats.last_rx); in mwifiex_dump_station_info()
1397 sinfo->signal = node->stats.rssi; in mwifiex_dump_station_info()
1398 sinfo->signal_avg = node->stats.rssi; in mwifiex_dump_station_info()
1399 sinfo->rx_bytes = node->stats.rx_bytes; in mwifiex_dump_station_info()
1400 sinfo->tx_bytes = node->stats.tx_bytes; in mwifiex_dump_station_info()
1401 sinfo->rx_packets = node->stats.rx_packets; in mwifiex_dump_station_info()
1402 sinfo->tx_packets = node->stats.tx_packets; in mwifiex_dump_station_info()
1403 sinfo->tx_failed = node->stats.tx_failed; in mwifiex_dump_station_info()
1405 mwifiex_parse_htinfo(priv, priv->tx_rate, in mwifiex_dump_station_info()
1406 node->stats.last_tx_htinfo, in mwifiex_dump_station_info()
1407 &sinfo->txrate); in mwifiex_dump_station_info()
1408 sinfo->txrate.legacy = node->stats.last_tx_rate * 5; in mwifiex_dump_station_info()
1416 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_dump_station_info()
1418 return -EFAULT; in mwifiex_dump_station_info()
1422 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_dump_station_info()
1424 return -EFAULT; in mwifiex_dump_station_info()
1430 &priv->dtim_period, true); in mwifiex_dump_station_info()
1432 mwifiex_parse_htinfo(priv, priv->tx_rate, priv->tx_htinfo, in mwifiex_dump_station_info()
1433 &sinfo->txrate); in mwifiex_dump_station_info()
1435 sinfo->signal_avg = priv->bcn_rssi_avg; in mwifiex_dump_station_info()
1436 sinfo->rx_bytes = priv->stats.rx_bytes; in mwifiex_dump_station_info()
1437 sinfo->tx_bytes = priv->stats.tx_bytes; in mwifiex_dump_station_info()
1438 sinfo->rx_packets = priv->stats.rx_packets; in mwifiex_dump_station_info()
1439 sinfo->tx_packets = priv->stats.tx_packets; in mwifiex_dump_station_info()
1440 sinfo->signal = priv->bcn_rssi_avg; in mwifiex_dump_station_info()
1442 sinfo->txrate.legacy = rate * 5; in mwifiex_dump_station_info()
1444 sinfo->filled |= BIT(NL80211_STA_INFO_RX_BITRATE); in mwifiex_dump_station_info()
1445 mwifiex_parse_htinfo(priv, priv->rxpd_rate, priv->rxpd_htinfo, in mwifiex_dump_station_info()
1446 &sinfo->rxrate); in mwifiex_dump_station_info()
1448 if (priv->bss_mode == NL80211_IFTYPE_STATION) { in mwifiex_dump_station_info()
1449 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BSS_PARAM); in mwifiex_dump_station_info()
1450 sinfo->bss_param.flags = 0; in mwifiex_dump_station_info()
1451 if (priv->curr_bss_params.bss_descriptor.cap_info_bitmap & in mwifiex_dump_station_info()
1453 sinfo->bss_param.flags |= in mwifiex_dump_station_info()
1455 if (priv->curr_bss_params.bss_descriptor.cap_info_bitmap & in mwifiex_dump_station_info()
1457 sinfo->bss_param.flags |= in mwifiex_dump_station_info()
1459 sinfo->bss_param.dtim_period = priv->dtim_period; in mwifiex_dump_station_info()
1460 sinfo->bss_param.beacon_interval = in mwifiex_dump_station_info()
1461 priv->curr_bss_params.bss_descriptor.beacon_period; in mwifiex_dump_station_info()
1474 mwifiex_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_get_station() argument
1477 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_get_station()
1479 if (!priv->media_connected) in mwifiex_cfg80211_get_station()
1480 return -ENOENT; in mwifiex_cfg80211_get_station()
1481 if (memcmp(mac, priv->cfg_bssid, ETH_ALEN)) in mwifiex_cfg80211_get_station()
1482 return -ENOENT; in mwifiex_cfg80211_get_station()
1491 mwifiex_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_dump_station() argument
1494 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_dump_station()
1499 priv->media_connected && idx == 0) { in mwifiex_cfg80211_dump_station()
1500 ether_addr_copy(mac, priv->cfg_bssid); in mwifiex_cfg80211_dump_station()
1507 list_for_each_entry(node, &priv->sta_list, list) { in mwifiex_cfg80211_dump_station()
1510 ether_addr_copy(mac, node->mac_addr); in mwifiex_cfg80211_dump_station()
1515 return -ENOENT; in mwifiex_cfg80211_dump_station()
1519 mwifiex_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_dump_survey() argument
1522 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_dump_survey()
1523 struct mwifiex_chan_stats *pchan_stats = priv->adapter->chan_stats; in mwifiex_cfg80211_dump_survey()
1526 mwifiex_dbg(priv->adapter, DUMP, "dump_survey idx=%d\n", idx); in mwifiex_cfg80211_dump_survey()
1531 priv->media_connected && idx == 0) { in mwifiex_cfg80211_dump_survey()
1532 u8 curr_bss_band = priv->curr_bss_params.band; in mwifiex_cfg80211_dump_survey()
1533 u32 chan = priv->curr_bss_params.bss_descriptor.channel; in mwifiex_cfg80211_dump_survey()
1536 survey->channel = ieee80211_get_channel(wiphy, in mwifiex_cfg80211_dump_survey()
1539 if (priv->bcn_nf_last) { in mwifiex_cfg80211_dump_survey()
1540 survey->filled = SURVEY_INFO_NOISE_DBM; in mwifiex_cfg80211_dump_survey()
1541 survey->noise = priv->bcn_nf_last; in mwifiex_cfg80211_dump_survey()
1546 if (idx >= priv->adapter->num_in_chan_stats) in mwifiex_cfg80211_dump_survey()
1547 return -ENOENT; in mwifiex_cfg80211_dump_survey()
1553 survey->channel = ieee80211_get_channel(wiphy, in mwifiex_cfg80211_dump_survey()
1555 survey->filled = SURVEY_INFO_NOISE_DBM | in mwifiex_cfg80211_dump_survey()
1558 survey->noise = pchan_stats[idx].noise; in mwifiex_cfg80211_dump_survey()
1559 survey->time = pchan_stats[idx].cca_scan_dur; in mwifiex_cfg80211_dump_survey()
1560 survey->time_busy = pchan_stats[idx].cca_busy_dur; in mwifiex_cfg80211_dump_survey()
1644 .n_bitrates = ARRAY_SIZE(mwifiex_rates) - 4,
1694 struct net_device *dev, in mwifiex_cfg80211_set_bitrate_mask() argument
1698 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_set_bitrate_mask()
1701 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_cfg80211_set_bitrate_mask()
1703 if (!priv->media_connected) { in mwifiex_cfg80211_set_bitrate_mask()
1706 return -EINVAL; in mwifiex_cfg80211_set_bitrate_mask()
1709 band = mwifiex_band_to_radio_type(priv->curr_bss_params.band); in mwifiex_cfg80211_set_bitrate_mask()
1715 bitmap_rates[0] = mask->control[band].legacy & 0x000f; in mwifiex_cfg80211_set_bitrate_mask()
1719 bitmap_rates[1] = (mask->control[band].legacy & 0x0ff0) >> 4; in mwifiex_cfg80211_set_bitrate_mask()
1721 bitmap_rates[1] = mask->control[band].legacy; in mwifiex_cfg80211_set_bitrate_mask()
1724 bitmap_rates[2] = mask->control[band].ht_mcs[0]; in mwifiex_cfg80211_set_bitrate_mask()
1725 if (adapter->hw_dev_mcs_support == HT_STREAM_2X2) in mwifiex_cfg80211_set_bitrate_mask()
1726 bitmap_rates[2] |= mask->control[band].ht_mcs[1] << 8; in mwifiex_cfg80211_set_bitrate_mask()
1729 if (adapter->fw_api_ver == MWIFIEX_FW_V15) { in mwifiex_cfg80211_set_bitrate_mask()
1730 bitmap_rates[10] = mask->control[band].vht_mcs[0]; in mwifiex_cfg80211_set_bitrate_mask()
1731 if (adapter->hw_dev_mcs_support == HT_STREAM_2X2) in mwifiex_cfg80211_set_bitrate_mask()
1732 bitmap_rates[11] = mask->control[band].vht_mcs[1]; in mwifiex_cfg80211_set_bitrate_mask()
1746 struct net_device *dev, in mwifiex_cfg80211_set_cqm_rssi_config() argument
1749 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_set_cqm_rssi_config()
1752 priv->cqm_rssi_thold = rssi_thold; in mwifiex_cfg80211_set_cqm_rssi_config()
1753 priv->cqm_rssi_hyst = rssi_hyst; in mwifiex_cfg80211_set_cqm_rssi_config()
1782 struct net_device *dev, in mwifiex_cfg80211_change_beacon() argument
1785 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_change_beacon()
1786 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_cfg80211_change_beacon()
1791 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_beacon()
1793 return -EINVAL; in mwifiex_cfg80211_change_beacon()
1796 if (!priv->bss_started) { in mwifiex_cfg80211_change_beacon()
1797 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_beacon()
1799 return -EINVAL; in mwifiex_cfg80211_change_beacon()
1803 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_change_beacon()
1805 return -EFAULT; in mwifiex_cfg80211_change_beacon()
1818 mwifiex_cfg80211_del_station(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_del_station() argument
1821 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_del_station()
1825 if (!priv->bss_started && priv->wdev.cac_started) { in mwifiex_cfg80211_del_station()
1826 mwifiex_dbg(priv->adapter, INFO, "%s: abort CAC!\n", __func__); in mwifiex_cfg80211_del_station()
1830 if (list_empty(&priv->sta_list) || !priv->bss_started) in mwifiex_cfg80211_del_station()
1833 if (!params->mac || is_broadcast_ether_addr(params->mac)) in mwifiex_cfg80211_del_station()
1836 mwifiex_dbg(priv->adapter, INFO, "%s: mac address %pM\n", in mwifiex_cfg80211_del_station()
1837 __func__, params->mac); in mwifiex_cfg80211_del_station()
1841 spin_lock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_del_station()
1842 sta_node = mwifiex_get_sta_entry(priv, params->mac); in mwifiex_cfg80211_del_station()
1844 ether_addr_copy(deauth_mac, params->mac); in mwifiex_cfg80211_del_station()
1845 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_del_station()
1851 return -1; in mwifiex_cfg80211_del_station()
1866 return -EOPNOTSUPP; in mwifiex_cfg80211_set_antenna()
1868 if (adapter->hw_dev_mcs_support != HT_STREAM_2X2) { in mwifiex_cfg80211_set_antenna()
1873 return -EOPNOTSUPP; in mwifiex_cfg80211_set_antenna()
1875 if ((tx_ant & (tx_ant - 1)) && in mwifiex_cfg80211_set_antenna()
1876 (tx_ant != BIT(adapter->number_of_antenna) - 1)) in mwifiex_cfg80211_set_antenna()
1877 return -EOPNOTSUPP; in mwifiex_cfg80211_set_antenna()
1879 if ((tx_ant == BIT(adapter->number_of_antenna) - 1) && in mwifiex_cfg80211_set_antenna()
1880 (priv->adapter->number_of_antenna > 1)) { in mwifiex_cfg80211_set_antenna()
1890 adapter->user_dev_mcs_support = HT_STREAM_1X1; in mwifiex_cfg80211_set_antenna()
1891 if (adapter->is_hw_11ac_capable) in mwifiex_cfg80211_set_antenna()
1892 adapter->usr_dot_11ac_mcs_support = in mwifiex_cfg80211_set_antenna()
1895 adapter->user_dev_mcs_support = HT_STREAM_2X2; in mwifiex_cfg80211_set_antenna()
1896 if (adapter->is_hw_11ac_capable) in mwifiex_cfg80211_set_antenna()
1897 adapter->usr_dot_11ac_mcs_support = in mwifiex_cfg80211_set_antenna()
1902 if (!adapter->wiphy->bands[band]) in mwifiex_cfg80211_set_antenna()
1905 ht_info = &adapter->wiphy->bands[band]->ht_cap; in mwifiex_cfg80211_set_antenna()
1907 GET_RXMCSSUPP(adapter->user_dev_mcs_support); in mwifiex_cfg80211_set_antenna()
1908 memset(&ht_info->mcs, 0, adapter->number_of_antenna); in mwifiex_cfg80211_set_antenna()
1909 memset(&ht_info->mcs, 0xff, rx_mcs_supp); in mwifiex_cfg80211_set_antenna()
1929 *tx_ant = priv->tx_ant; in mwifiex_cfg80211_get_antenna()
1930 *rx_ant = priv->rx_ant; in mwifiex_cfg80211_get_antenna()
1938 static int mwifiex_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) in mwifiex_cfg80211_stop_ap() argument
1940 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_stop_ap()
1945 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_stop_ap()
1948 priv->ap_11n_enabled = 0; in mwifiex_cfg80211_stop_ap()
1949 memset(&priv->bss_cfg, 0, sizeof(priv->bss_cfg)); in mwifiex_cfg80211_stop_ap()
1953 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_stop_ap()
1955 return -1; in mwifiex_cfg80211_stop_ap()
1960 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_stop_ap()
1962 return -1; in mwifiex_cfg80211_stop_ap()
1965 if (netif_carrier_ok(priv->netdev)) in mwifiex_cfg80211_stop_ap()
1966 netif_carrier_off(priv->netdev); in mwifiex_cfg80211_stop_ap()
1967 mwifiex_stop_net_dev_queue(priv->netdev, priv->adapter); in mwifiex_cfg80211_stop_ap()
1978 struct net_device *dev, in mwifiex_cfg80211_start_ap() argument
1982 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_start_ap()
1985 return -1; in mwifiex_cfg80211_start_ap()
1989 return -ENOMEM; in mwifiex_cfg80211_start_ap()
1993 if (params->beacon_interval) in mwifiex_cfg80211_start_ap()
1994 bss_cfg->beacon_period = params->beacon_interval; in mwifiex_cfg80211_start_ap()
1995 if (params->dtim_period) in mwifiex_cfg80211_start_ap()
1996 bss_cfg->dtim_period = params->dtim_period; in mwifiex_cfg80211_start_ap()
1998 if (params->ssid && params->ssid_len) { in mwifiex_cfg80211_start_ap()
1999 memcpy(bss_cfg->ssid.ssid, params->ssid, params->ssid_len); in mwifiex_cfg80211_start_ap()
2000 bss_cfg->ssid.ssid_len = params->ssid_len; in mwifiex_cfg80211_start_ap()
2002 if (params->inactivity_timeout > 0) { in mwifiex_cfg80211_start_ap()
2004 bss_cfg->sta_ao_timer = 10 * params->inactivity_timeout; in mwifiex_cfg80211_start_ap()
2005 bss_cfg->ps_sta_ao_timer = 10 * params->inactivity_timeout; in mwifiex_cfg80211_start_ap()
2008 switch (params->hidden_ssid) { in mwifiex_cfg80211_start_ap()
2010 bss_cfg->bcast_ssid_ctl = 1; in mwifiex_cfg80211_start_ap()
2013 bss_cfg->bcast_ssid_ctl = 0; in mwifiex_cfg80211_start_ap()
2016 bss_cfg->bcast_ssid_ctl = 2; in mwifiex_cfg80211_start_ap()
2020 return -EINVAL; in mwifiex_cfg80211_start_ap()
2023 mwifiex_uap_set_channel(priv, bss_cfg, params->chandef); in mwifiex_cfg80211_start_ap()
2027 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_ap()
2034 if (priv->adapter->is_hw_11ac_capable) { in mwifiex_cfg80211_start_ap()
2036 mwifiex_set_vht_width(priv, params->chandef.width, in mwifiex_cfg80211_start_ap()
2037 priv->ap_11ac_enabled); in mwifiex_cfg80211_start_ap()
2040 if (priv->ap_11ac_enabled) in mwifiex_cfg80211_start_ap()
2051 !cfg80211_chandef_dfs_required(wiphy, ¶ms->chandef, in mwifiex_cfg80211_start_ap()
2052 priv->bss_mode)) { in mwifiex_cfg80211_start_ap()
2053 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_start_ap()
2056 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_ap()
2060 priv->state_11h.is_11h_active = false; in mwifiex_cfg80211_start_ap()
2063 mwifiex_config_uap_11d(priv, ¶ms->beacon); in mwifiex_cfg80211_start_ap()
2066 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_ap()
2071 if (mwifiex_set_mgmt_ies(priv, ¶ms->beacon)) in mwifiex_cfg80211_start_ap()
2074 if (!netif_carrier_ok(priv->netdev)) in mwifiex_cfg80211_start_ap()
2075 netif_carrier_on(priv->netdev); in mwifiex_cfg80211_start_ap()
2076 mwifiex_wake_up_net_dev_queue(priv->netdev, priv->adapter); in mwifiex_cfg80211_start_ap()
2078 memcpy(&priv->bss_cfg, bss_cfg, sizeof(priv->bss_cfg)); in mwifiex_cfg80211_start_ap()
2084 return -1; in mwifiex_cfg80211_start_ap()
2094 mwifiex_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_disconnect() argument
2097 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_disconnect()
2100 cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0); in mwifiex_cfg80211_disconnect()
2103 return -EFAULT; in mwifiex_cfg80211_disconnect()
2105 eth_zero_addr(priv->cfg_bssid); in mwifiex_cfg80211_disconnect()
2106 priv->hs2_enabled = false; in mwifiex_cfg80211_disconnect()
2117 * - SSID
2118 * - SSID length
2119 * - BSSID
2120 * - Channel
2132 return -1; in mwifiex_cfg80211_inform_ibss_bss()
2141 band = mwifiex_band_to_radio_type(priv->curr_bss_params.band); in mwifiex_cfg80211_inform_ibss_bss()
2142 chan = ieee80211_get_channel(priv->wdev.wiphy, in mwifiex_cfg80211_inform_ibss_bss()
2146 bss = cfg80211_inform_bss(priv->wdev.wiphy, chan, in mwifiex_cfg80211_inform_ibss_bss()
2151 cfg80211_put_bss(priv->wdev.wiphy, bss); in mwifiex_cfg80211_inform_ibss_bss()
2152 ether_addr_copy(priv->cfg_bssid, bss_info.bssid); in mwifiex_cfg80211_inform_ibss_bss()
2161 * This function handles both Infra and Ad-Hoc modes. It also performs
2168 * is not found in scan table. However, for Ad-Hoc mode, it can create
2188 mwifiex_dbg(priv->adapter, ERROR, "invalid SSID - aborting\n"); in mwifiex_cfg80211_assoc()
2189 return -EINVAL; in mwifiex_cfg80211_assoc()
2194 mwifiex_dbg(priv->adapter, ERROR, "invalid SSID - aborting\n"); in mwifiex_cfg80211_assoc()
2195 return -EINVAL; in mwifiex_cfg80211_assoc()
2200 priv->sec_info.wpa_enabled = false; in mwifiex_cfg80211_assoc()
2201 priv->sec_info.wpa2_enabled = false; in mwifiex_cfg80211_assoc()
2202 priv->wep_key_curr_index = 0; in mwifiex_cfg80211_assoc()
2203 priv->sec_info.encryption_mode = 0; in mwifiex_cfg80211_assoc()
2204 priv->sec_info.is_authtype_auto = 0; in mwifiex_cfg80211_assoc()
2218 /* "privacy" is set only for ad-hoc mode */ in mwifiex_cfg80211_assoc()
2226 priv->sec_info.encryption_mode = in mwifiex_cfg80211_assoc()
2228 priv->sec_info.authentication_mode = in mwifiex_cfg80211_assoc()
2236 if (sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC) { in mwifiex_cfg80211_assoc()
2238 priv->sec_info.is_authtype_auto = 1; in mwifiex_cfg80211_assoc()
2240 auth_type = sme->auth_type; in mwifiex_cfg80211_assoc()
2243 if (sme->crypto.n_ciphers_pairwise) { in mwifiex_cfg80211_assoc()
2244 priv->sec_info.encryption_mode = in mwifiex_cfg80211_assoc()
2245 sme->crypto.ciphers_pairwise[0]; in mwifiex_cfg80211_assoc()
2246 priv->sec_info.authentication_mode = auth_type; in mwifiex_cfg80211_assoc()
2249 if (sme->crypto.cipher_group) { in mwifiex_cfg80211_assoc()
2250 priv->sec_info.encryption_mode = sme->crypto.cipher_group; in mwifiex_cfg80211_assoc()
2251 priv->sec_info.authentication_mode = auth_type; in mwifiex_cfg80211_assoc()
2253 if (sme->ie) in mwifiex_cfg80211_assoc()
2254 ret = mwifiex_set_gen_ie(priv, sme->ie, sme->ie_len); in mwifiex_cfg80211_assoc()
2256 if (sme->key) { in mwifiex_cfg80211_assoc()
2257 if (mwifiex_is_alg_wep(priv->sec_info.encryption_mode)) { in mwifiex_cfg80211_assoc()
2258 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_assoc()
2260 "with key len %d\n", sme->key_len); in mwifiex_cfg80211_assoc()
2261 priv->wep_key_curr_index = sme->key_idx; in mwifiex_cfg80211_assoc()
2262 ret = mwifiex_set_encode(priv, NULL, sme->key, in mwifiex_cfg80211_assoc()
2263 sme->key_len, sme->key_idx, in mwifiex_cfg80211_assoc()
2277 mwifiex_dbg(priv->adapter, ERROR, "scan error\n"); in mwifiex_cfg80211_assoc()
2278 return -EFAULT; in mwifiex_cfg80211_assoc()
2284 bss = cfg80211_get_bss(priv->wdev.wiphy, channel, in mwifiex_cfg80211_assoc()
2289 bss = cfg80211_get_bss(priv->wdev.wiphy, channel, in mwifiex_cfg80211_assoc()
2296 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_assoc()
2297 "assoc: requested bss not found in scan results\n"); in mwifiex_cfg80211_assoc()
2302 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_assoc()
2304 bss->bssid); in mwifiex_cfg80211_assoc()
2305 memcpy(&priv->cfg_bssid, bss->bssid, ETH_ALEN); in mwifiex_cfg80211_assoc()
2311 cfg80211_ref_bss(priv->adapter->wiphy, bss); in mwifiex_cfg80211_assoc()
2319 * kernel will give a panic after successful assoc */ in mwifiex_cfg80211_assoc()
2321 ret = -EFAULT; in mwifiex_cfg80211_assoc()
2334 cfg80211_put_bss(priv->adapter->wiphy, bss); in mwifiex_cfg80211_assoc()
2341 * This function does not work when the current mode is set to Ad-Hoc, or
2346 mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_connect() argument
2349 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_connect()
2350 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_cfg80211_connect()
2356 "%s: reject infra assoc request in non-STA role\n", in mwifiex_cfg80211_connect()
2357 dev->name); in mwifiex_cfg80211_connect()
2358 return -EINVAL; in mwifiex_cfg80211_connect()
2361 if (priv->wdev.current_bss) { in mwifiex_cfg80211_connect()
2363 "%s: already connected\n", dev->name); in mwifiex_cfg80211_connect()
2364 return -EALREADY; in mwifiex_cfg80211_connect()
2367 if (priv->scan_block) in mwifiex_cfg80211_connect()
2368 priv->scan_block = false; in mwifiex_cfg80211_connect()
2370 if (test_bit(MWIFIEX_SURPRISE_REMOVED, &adapter->work_flags) || in mwifiex_cfg80211_connect()
2371 test_bit(MWIFIEX_IS_CMD_TIMEDOUT, &adapter->work_flags)) { in mwifiex_cfg80211_connect()
2375 dev->name); in mwifiex_cfg80211_connect()
2376 return -EFAULT; in mwifiex_cfg80211_connect()
2380 "info: Trying to associate to bssid %pM\n", sme->bssid); in mwifiex_cfg80211_connect()
2383 cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0); in mwifiex_cfg80211_connect()
2385 ret = mwifiex_cfg80211_assoc(priv, sme->ssid_len, sme->ssid, sme->bssid, in mwifiex_cfg80211_connect()
2386 priv->bss_mode, sme->channel, sme, 0, in mwifiex_cfg80211_connect()
2389 cfg80211_connect_bss(priv->netdev, priv->cfg_bssid, bss, NULL, in mwifiex_cfg80211_connect()
2392 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_connect()
2394 priv->cfg_bssid); in mwifiex_cfg80211_connect()
2395 if (ISSUPP_TDLS_ENABLED(priv->adapter->fw_cap_info) && in mwifiex_cfg80211_connect()
2396 priv->adapter->auto_tdls && in mwifiex_cfg80211_connect()
2397 priv->bss_type == MWIFIEX_BSS_TYPE_STA) in mwifiex_cfg80211_connect()
2400 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_connect()
2402 priv->cfg_bssid); in mwifiex_cfg80211_connect()
2403 eth_zero_addr(priv->cfg_bssid); in mwifiex_cfg80211_connect()
2406 cfg80211_connect_result(priv->netdev, priv->cfg_bssid, in mwifiex_cfg80211_connect()
2410 cfg80211_connect_result(priv->netdev, priv->cfg_bssid, in mwifiex_cfg80211_connect()
2421 * - channel
2422 * - start band
2423 * - 11n flag
2424 * - secondary channel offset
2429 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_set_ibss_params()
2433 if (params->chandef.chan->band == NL80211_BAND_2GHZ) { in mwifiex_set_ibss_params()
2434 if (!params->basic_rates) { in mwifiex_set_ibss_params()
2449 if (params->basic_rates < index) { in mwifiex_set_ibss_params()
2453 if (params->basic_rates % index) in mwifiex_set_ibss_params()
2458 if (cfg80211_get_chandef_type(¶ms->chandef) != in mwifiex_set_ibss_params()
2462 if (cfg80211_get_chandef_type(¶ms->chandef) == in mwifiex_set_ibss_params()
2469 if (!((config_bands | adapter->fw_bands) & ~adapter->fw_bands)) { in mwifiex_set_ibss_params()
2470 adapter->config_bands = config_bands; in mwifiex_set_ibss_params()
2471 adapter->adhoc_start_band = config_bands; in mwifiex_set_ibss_params()
2474 adapter->adhoc_11n_enabled = true; in mwifiex_set_ibss_params()
2476 adapter->adhoc_11n_enabled = false; in mwifiex_set_ibss_params()
2479 adapter->sec_chan_offset = in mwifiex_set_ibss_params()
2481 cfg80211_get_chandef_type(¶ms->chandef)); in mwifiex_set_ibss_params()
2482 priv->adhoc_channel = ieee80211_frequency_to_channel( in mwifiex_set_ibss_params()
2483 params->chandef.chan->center_freq); in mwifiex_set_ibss_params()
2487 config_bands, priv->adhoc_channel, in mwifiex_set_ibss_params()
2488 adapter->sec_chan_offset); in mwifiex_set_ibss_params()
2496 * This function does not work in any mode other than Ad-Hoc, or if
2500 mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_join_ibss() argument
2503 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_join_ibss()
2506 if (priv->bss_mode != NL80211_IFTYPE_ADHOC) { in mwifiex_cfg80211_join_ibss()
2507 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_join_ibss()
2513 mwifiex_dbg(priv->adapter, MSG, "info: trying to join to bssid %pM\n", in mwifiex_cfg80211_join_ibss()
2514 params->bssid); in mwifiex_cfg80211_join_ibss()
2518 ret = mwifiex_cfg80211_assoc(priv, params->ssid_len, params->ssid, in mwifiex_cfg80211_join_ibss()
2519 params->bssid, priv->bss_mode, in mwifiex_cfg80211_join_ibss()
2520 params->chandef.chan, NULL, in mwifiex_cfg80211_join_ibss()
2521 params->privacy, NULL); in mwifiex_cfg80211_join_ibss()
2524 cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid, in mwifiex_cfg80211_join_ibss()
2525 params->chandef.chan, GFP_KERNEL); in mwifiex_cfg80211_join_ibss()
2526 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_join_ibss()
2528 "%pM successfully\n", priv->cfg_bssid); in mwifiex_cfg80211_join_ibss()
2530 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_join_ibss()
2544 mwifiex_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev) in mwifiex_cfg80211_leave_ibss() argument
2546 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_leave_ibss()
2548 mwifiex_dbg(priv->adapter, MSG, "info: disconnecting from essid %pM\n", in mwifiex_cfg80211_leave_ibss()
2549 priv->cfg_bssid); in mwifiex_cfg80211_leave_ibss()
2551 return -EFAULT; in mwifiex_cfg80211_leave_ibss()
2553 eth_zero_addr(priv->cfg_bssid); in mwifiex_cfg80211_leave_ibss()
2569 struct net_device *dev = request->wdev->netdev; in mwifiex_cfg80211_scan() local
2570 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_scan()
2577 mwifiex_dbg(priv->adapter, CMD, in mwifiex_cfg80211_scan()
2578 "info: received scan request on %s\n", dev->name); in mwifiex_cfg80211_scan()
2583 if (priv->scan_request || priv->scan_aborting) { in mwifiex_cfg80211_scan()
2584 mwifiex_dbg(priv->adapter, WARN, in mwifiex_cfg80211_scan()
2586 return -EBUSY; in mwifiex_cfg80211_scan()
2589 if (!priv->wdev.current_bss && priv->scan_block) in mwifiex_cfg80211_scan()
2590 priv->scan_block = false; in mwifiex_cfg80211_scan()
2593 cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0); in mwifiex_cfg80211_scan()
2597 return -ENOMEM; in mwifiex_cfg80211_scan()
2599 priv->scan_request = request; in mwifiex_cfg80211_scan()
2601 if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { in mwifiex_cfg80211_scan()
2602 get_random_mask_addr(mac_addr, request->mac_addr, in mwifiex_cfg80211_scan()
2603 request->mac_addr_mask); in mwifiex_cfg80211_scan()
2604 ether_addr_copy(request->mac_addr, mac_addr); in mwifiex_cfg80211_scan()
2605 ether_addr_copy(user_scan_cfg->random_mac, mac_addr); in mwifiex_cfg80211_scan()
2608 user_scan_cfg->num_ssids = request->n_ssids; in mwifiex_cfg80211_scan()
2609 user_scan_cfg->ssid_list = request->ssids; in mwifiex_cfg80211_scan()
2611 if (request->ie && request->ie_len) { in mwifiex_cfg80211_scan()
2614 if (priv->vs_ie[i].mask != MWIFIEX_VSIE_MASK_CLEAR) in mwifiex_cfg80211_scan()
2616 priv->vs_ie[i].mask = MWIFIEX_VSIE_MASK_SCAN; in mwifiex_cfg80211_scan()
2617 ie = (struct ieee_types_header *)(request->ie + offset); in mwifiex_cfg80211_scan()
2618 memcpy(&priv->vs_ie[i].ie, ie, sizeof(*ie) + ie->len); in mwifiex_cfg80211_scan()
2619 offset += sizeof(*ie) + ie->len; in mwifiex_cfg80211_scan()
2621 if (offset >= request->ie_len) in mwifiex_cfg80211_scan()
2626 for (i = 0; i < min_t(u32, request->n_channels, in mwifiex_cfg80211_scan()
2628 chan = request->channels[i]; in mwifiex_cfg80211_scan()
2629 user_scan_cfg->chan_list[i].chan_number = chan->hw_value; in mwifiex_cfg80211_scan()
2630 user_scan_cfg->chan_list[i].radio_type = chan->band; in mwifiex_cfg80211_scan()
2632 if ((chan->flags & IEEE80211_CHAN_NO_IR) || !request->n_ssids) in mwifiex_cfg80211_scan()
2633 user_scan_cfg->chan_list[i].scan_type = in mwifiex_cfg80211_scan()
2636 user_scan_cfg->chan_list[i].scan_type = in mwifiex_cfg80211_scan()
2639 user_scan_cfg->chan_list[i].scan_time = 0; in mwifiex_cfg80211_scan()
2642 if (priv->adapter->scan_chan_gap_enabled && in mwifiex_cfg80211_scan()
2644 user_scan_cfg->scan_chan_gap = in mwifiex_cfg80211_scan()
2645 priv->adapter->scan_chan_gap_time; in mwifiex_cfg80211_scan()
2650 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_scan()
2652 priv->scan_aborting = false; in mwifiex_cfg80211_scan()
2653 priv->scan_request = NULL; in mwifiex_cfg80211_scan()
2657 if (request->ie && request->ie_len) { in mwifiex_cfg80211_scan()
2659 if (priv->vs_ie[i].mask == MWIFIEX_VSIE_MASK_SCAN) { in mwifiex_cfg80211_scan()
2660 priv->vs_ie[i].mask = MWIFIEX_VSIE_MASK_CLEAR; in mwifiex_cfg80211_scan()
2661 memset(&priv->vs_ie[i].ie, 0, in mwifiex_cfg80211_scan()
2678 struct net_device *dev, in mwifiex_cfg80211_sched_scan_start() argument
2681 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_sched_scan_start()
2687 if (!request || (!request->n_ssids && !request->n_match_sets)) { in mwifiex_cfg80211_sched_scan_start()
2690 return -EINVAL; in mwifiex_cfg80211_sched_scan_start()
2694 request->n_ssids, request->n_match_sets); in mwifiex_cfg80211_sched_scan_start()
2696 request->n_channels, request->scan_plans->interval, in mwifiex_cfg80211_sched_scan_start()
2697 (int)request->ie_len); in mwifiex_cfg80211_sched_scan_start()
2701 return -ENOMEM; in mwifiex_cfg80211_sched_scan_start()
2703 if (priv->scan_request || priv->scan_aborting) in mwifiex_cfg80211_sched_scan_start()
2704 bgscan_cfg->start_later = true; in mwifiex_cfg80211_sched_scan_start()
2706 bgscan_cfg->num_ssids = request->n_match_sets; in mwifiex_cfg80211_sched_scan_start()
2707 bgscan_cfg->ssid_list = request->match_sets; in mwifiex_cfg80211_sched_scan_start()
2709 if (request->ie && request->ie_len) { in mwifiex_cfg80211_sched_scan_start()
2712 if (priv->vs_ie[i].mask != MWIFIEX_VSIE_MASK_CLEAR) in mwifiex_cfg80211_sched_scan_start()
2714 priv->vs_ie[i].mask = MWIFIEX_VSIE_MASK_BGSCAN; in mwifiex_cfg80211_sched_scan_start()
2715 ie = (struct ieee_types_header *)(request->ie + offset); in mwifiex_cfg80211_sched_scan_start()
2716 memcpy(&priv->vs_ie[i].ie, ie, sizeof(*ie) + ie->len); in mwifiex_cfg80211_sched_scan_start()
2717 offset += sizeof(*ie) + ie->len; in mwifiex_cfg80211_sched_scan_start()
2719 if (offset >= request->ie_len) in mwifiex_cfg80211_sched_scan_start()
2724 for (i = 0; i < min_t(u32, request->n_channels, in mwifiex_cfg80211_sched_scan_start()
2726 chan = request->channels[i]; in mwifiex_cfg80211_sched_scan_start()
2727 bgscan_cfg->chan_list[i].chan_number = chan->hw_value; in mwifiex_cfg80211_sched_scan_start()
2728 bgscan_cfg->chan_list[i].radio_type = chan->band; in mwifiex_cfg80211_sched_scan_start()
2730 if ((chan->flags & IEEE80211_CHAN_NO_IR) || !request->n_ssids) in mwifiex_cfg80211_sched_scan_start()
2731 bgscan_cfg->chan_list[i].scan_type = in mwifiex_cfg80211_sched_scan_start()
2734 bgscan_cfg->chan_list[i].scan_type = in mwifiex_cfg80211_sched_scan_start()
2737 bgscan_cfg->chan_list[i].scan_time = 0; in mwifiex_cfg80211_sched_scan_start()
2740 bgscan_cfg->chan_per_scan = min_t(u32, request->n_channels, in mwifiex_cfg80211_sched_scan_start()
2744 bgscan_cfg->scan_interval = (request->scan_plans->interval > in mwifiex_cfg80211_sched_scan_start()
2746 request->scan_plans->interval : in mwifiex_cfg80211_sched_scan_start()
2749 bgscan_cfg->repeat_count = MWIFIEX_BGSCAN_REPEAT_COUNT; in mwifiex_cfg80211_sched_scan_start()
2750 bgscan_cfg->report_condition = MWIFIEX_BGSCAN_SSID_MATCH | in mwifiex_cfg80211_sched_scan_start()
2752 bgscan_cfg->bss_type = MWIFIEX_BSS_MODE_INFRA; in mwifiex_cfg80211_sched_scan_start()
2753 bgscan_cfg->action = MWIFIEX_BGSCAN_ACT_SET; in mwifiex_cfg80211_sched_scan_start()
2754 bgscan_cfg->enable = true; in mwifiex_cfg80211_sched_scan_start()
2755 if (request->min_rssi_thold != NL80211_SCAN_RSSI_THOLD_OFF) { in mwifiex_cfg80211_sched_scan_start()
2756 bgscan_cfg->report_condition |= MWIFIEX_BGSCAN_SSID_RSSI_MATCH; in mwifiex_cfg80211_sched_scan_start()
2757 bgscan_cfg->rssi_threshold = request->min_rssi_thold; in mwifiex_cfg80211_sched_scan_start()
2763 return -EFAULT; in mwifiex_cfg80211_sched_scan_start()
2766 priv->sched_scanning = true; in mwifiex_cfg80211_sched_scan_start()
2778 struct net_device *dev, u64 reqid) in mwifiex_cfg80211_sched_scan_stop() argument
2780 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_sched_scan_stop()
2791 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_setup_vht_caps()
2793 vht_info->vht_supported = true; in mwifiex_setup_vht_caps()
2795 vht_info->cap = adapter->hw_dot_11ac_dev_cap; in mwifiex_setup_vht_caps()
2797 vht_info->vht_mcs.rx_mcs_map = cpu_to_le16( in mwifiex_setup_vht_caps()
2798 adapter->hw_dot_11ac_mcs_support & 0xFFFF); in mwifiex_setup_vht_caps()
2799 vht_info->vht_mcs.rx_highest = 0; in mwifiex_setup_vht_caps()
2800 vht_info->vht_mcs.tx_mcs_map = cpu_to_le16( in mwifiex_setup_vht_caps()
2801 adapter->hw_dot_11ac_mcs_support >> 16); in mwifiex_setup_vht_caps()
2802 vht_info->vht_mcs.tx_highest = 0; in mwifiex_setup_vht_caps()
2809 * The following default values are set -
2810 * - HT Supported = True
2811 * - Maximum AMPDU length factor = IEEE80211_HT_MAX_AMPDU_64K
2812 * - Minimum AMPDU spacing = IEEE80211_HT_MPDU_DENSITY_NONE
2813 * - HT Capabilities supported by firmware
2814 * - MCS information, Rx mask = 0xff
2815 * - MCD information, Tx parameters = IEEE80211_HT_MCS_TX_DEFINED (0x01)
2824 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_setup_ht_caps()
2826 ht_info->ht_supported = true; in mwifiex_setup_ht_caps()
2827 ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; in mwifiex_setup_ht_caps()
2828 ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE; in mwifiex_setup_ht_caps()
2830 memset(&ht_info->mcs, 0, sizeof(ht_info->mcs)); in mwifiex_setup_ht_caps()
2833 if (ISSUPP_CHANWIDTH40(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2834 ht_info->cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; in mwifiex_setup_ht_caps()
2836 ht_info->cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; in mwifiex_setup_ht_caps()
2838 if (ISSUPP_SHORTGI20(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2839 ht_info->cap |= IEEE80211_HT_CAP_SGI_20; in mwifiex_setup_ht_caps()
2841 ht_info->cap &= ~IEEE80211_HT_CAP_SGI_20; in mwifiex_setup_ht_caps()
2843 if (ISSUPP_SHORTGI40(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2844 ht_info->cap |= IEEE80211_HT_CAP_SGI_40; in mwifiex_setup_ht_caps()
2846 ht_info->cap &= ~IEEE80211_HT_CAP_SGI_40; in mwifiex_setup_ht_caps()
2848 if (adapter->user_dev_mcs_support == HT_STREAM_2X2) in mwifiex_setup_ht_caps()
2849 ht_info->cap |= 2 << IEEE80211_HT_CAP_RX_STBC_SHIFT; in mwifiex_setup_ht_caps()
2851 ht_info->cap |= 1 << IEEE80211_HT_CAP_RX_STBC_SHIFT; in mwifiex_setup_ht_caps()
2853 if (ISSUPP_TXSTBC(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2854 ht_info->cap |= IEEE80211_HT_CAP_TX_STBC; in mwifiex_setup_ht_caps()
2856 ht_info->cap &= ~IEEE80211_HT_CAP_TX_STBC; in mwifiex_setup_ht_caps()
2858 if (ISSUPP_GREENFIELD(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2859 ht_info->cap |= IEEE80211_HT_CAP_GRN_FLD; in mwifiex_setup_ht_caps()
2861 ht_info->cap &= ~IEEE80211_HT_CAP_GRN_FLD; in mwifiex_setup_ht_caps()
2863 if (ISENABLED_40MHZ_INTOLERANT(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2864 ht_info->cap |= IEEE80211_HT_CAP_40MHZ_INTOLERANT; in mwifiex_setup_ht_caps()
2866 ht_info->cap &= ~IEEE80211_HT_CAP_40MHZ_INTOLERANT; in mwifiex_setup_ht_caps()
2868 if (ISSUPP_RXLDPC(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2869 ht_info->cap |= IEEE80211_HT_CAP_LDPC_CODING; in mwifiex_setup_ht_caps()
2871 ht_info->cap &= ~IEEE80211_HT_CAP_LDPC_CODING; in mwifiex_setup_ht_caps()
2873 ht_info->cap &= ~IEEE80211_HT_CAP_MAX_AMSDU; in mwifiex_setup_ht_caps()
2874 ht_info->cap |= IEEE80211_HT_CAP_SM_PS; in mwifiex_setup_ht_caps()
2876 rx_mcs_supp = GET_RXMCSSUPP(adapter->user_dev_mcs_support); in mwifiex_setup_ht_caps()
2881 sizeof(struct ieee80211_mcs_info) - rx_mcs_supp); in mwifiex_setup_ht_caps()
2882 if (priv->bss_mode == NL80211_IFTYPE_STATION || in mwifiex_setup_ht_caps()
2883 ISSUPP_CHANWIDTH40(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2884 /* Set MCS32 for infra mode or ad-hoc mode with 40MHz support */ in mwifiex_setup_ht_caps()
2887 memcpy((u8 *) &ht_info->mcs, mcs, sizeof(struct ieee80211_mcs_info)); in mwifiex_setup_ht_caps()
2889 ht_info->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; in mwifiex_setup_ht_caps()
2903 struct net_device *dev; in mwifiex_add_virtual_intf() local
2908 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
2914 if (adapter->curr_iface_comb.sta_intf == in mwifiex_add_virtual_intf()
2915 adapter->iface_limit.sta_intf) { in mwifiex_add_virtual_intf()
2918 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
2926 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
2929 priv->wdev.wiphy = wiphy; in mwifiex_add_virtual_intf()
2930 priv->wdev.iftype = NL80211_IFTYPE_STATION; in mwifiex_add_virtual_intf()
2933 priv->bss_mode = NL80211_IFTYPE_STATION; in mwifiex_add_virtual_intf()
2935 priv->bss_mode = type; in mwifiex_add_virtual_intf()
2937 priv->bss_type = MWIFIEX_BSS_TYPE_STA; in mwifiex_add_virtual_intf()
2938 priv->frame_type = MWIFIEX_DATA_FRAME_TYPE_ETH_II; in mwifiex_add_virtual_intf()
2939 priv->bss_priority = 0; in mwifiex_add_virtual_intf()
2940 priv->bss_role = MWIFIEX_BSS_ROLE_STA; in mwifiex_add_virtual_intf()
2944 if (adapter->curr_iface_comb.uap_intf == in mwifiex_add_virtual_intf()
2945 adapter->iface_limit.uap_intf) { in mwifiex_add_virtual_intf()
2948 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
2956 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
2959 priv->wdev.wiphy = wiphy; in mwifiex_add_virtual_intf()
2960 priv->wdev.iftype = NL80211_IFTYPE_AP; in mwifiex_add_virtual_intf()
2962 priv->bss_type = MWIFIEX_BSS_TYPE_UAP; in mwifiex_add_virtual_intf()
2963 priv->frame_type = MWIFIEX_DATA_FRAME_TYPE_ETH_II; in mwifiex_add_virtual_intf()
2964 priv->bss_priority = 0; in mwifiex_add_virtual_intf()
2965 priv->bss_role = MWIFIEX_BSS_ROLE_UAP; in mwifiex_add_virtual_intf()
2966 priv->bss_started = 0; in mwifiex_add_virtual_intf()
2967 priv->bss_mode = type; in mwifiex_add_virtual_intf()
2971 if (adapter->curr_iface_comb.p2p_intf == in mwifiex_add_virtual_intf()
2972 adapter->iface_limit.p2p_intf) { in mwifiex_add_virtual_intf()
2975 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
2983 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
2986 priv->wdev.wiphy = wiphy; in mwifiex_add_virtual_intf()
2987 /* At start-up, wpa_supplicant tries to change the interface in mwifiex_add_virtual_intf()
2990 priv->wdev.iftype = NL80211_IFTYPE_P2P_CLIENT; in mwifiex_add_virtual_intf()
2991 priv->bss_mode = NL80211_IFTYPE_P2P_CLIENT; in mwifiex_add_virtual_intf()
2997 priv->bss_type = MWIFIEX_BSS_TYPE_P2P; in mwifiex_add_virtual_intf()
2999 priv->frame_type = MWIFIEX_DATA_FRAME_TYPE_ETH_II; in mwifiex_add_virtual_intf()
3000 priv->bss_priority = MWIFIEX_BSS_ROLE_STA; in mwifiex_add_virtual_intf()
3001 priv->bss_role = MWIFIEX_BSS_ROLE_STA; in mwifiex_add_virtual_intf()
3002 priv->bss_started = 0; in mwifiex_add_virtual_intf()
3005 memset(&priv->wdev, 0, sizeof(priv->wdev)); in mwifiex_add_virtual_intf()
3006 priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_add_virtual_intf()
3007 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
3013 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
3016 dev = alloc_netdev_mqs(sizeof(struct mwifiex_private *), name, in mwifiex_add_virtual_intf()
3019 if (!dev) { in mwifiex_add_virtual_intf()
3022 ret = -ENOMEM; in mwifiex_add_virtual_intf()
3026 mwifiex_init_priv_params(priv, dev); in mwifiex_add_virtual_intf()
3028 priv->netdev = dev; in mwifiex_add_virtual_intf()
3030 if (!adapter->mfg_mode) { in mwifiex_add_virtual_intf()
3031 mwifiex_set_mac_address(priv, dev, false, NULL); in mwifiex_add_virtual_intf()
3043 mwifiex_setup_ht_caps(&wiphy->bands[NL80211_BAND_2GHZ]->ht_cap, priv); in mwifiex_add_virtual_intf()
3044 if (adapter->is_hw_11ac_capable) in mwifiex_add_virtual_intf()
3046 &wiphy->bands[NL80211_BAND_2GHZ]->vht_cap, priv); in mwifiex_add_virtual_intf()
3048 if (adapter->config_bands & BAND_A) in mwifiex_add_virtual_intf()
3050 &wiphy->bands[NL80211_BAND_5GHZ]->ht_cap, priv); in mwifiex_add_virtual_intf()
3052 if ((adapter->config_bands & BAND_A) && adapter->is_hw_11ac_capable) in mwifiex_add_virtual_intf()
3054 &wiphy->bands[NL80211_BAND_5GHZ]->vht_cap, priv); in mwifiex_add_virtual_intf()
3056 dev_net_set(dev, wiphy_net(wiphy)); in mwifiex_add_virtual_intf()
3057 dev->ieee80211_ptr = &priv->wdev; in mwifiex_add_virtual_intf()
3058 dev->ieee80211_ptr->iftype = priv->bss_mode; in mwifiex_add_virtual_intf()
3059 SET_NETDEV_DEV(dev, wiphy_dev(wiphy)); in mwifiex_add_virtual_intf()
3061 dev->flags |= IFF_BROADCAST | IFF_MULTICAST; in mwifiex_add_virtual_intf()
3062 dev->watchdog_timeo = MWIFIEX_DEFAULT_WATCHDOG_TIMEOUT; in mwifiex_add_virtual_intf()
3063 dev->needed_headroom = MWIFIEX_MIN_DATA_HEADER_LEN; in mwifiex_add_virtual_intf()
3064 dev->ethtool_ops = &mwifiex_ethtool_ops; in mwifiex_add_virtual_intf()
3066 mdev_priv = netdev_priv(dev); in mwifiex_add_virtual_intf()
3069 SET_NETDEV_DEV(dev, adapter->dev); in mwifiex_add_virtual_intf()
3071 priv->dfs_cac_workqueue = alloc_workqueue("MWIFIEX_DFS_CAC%s", in mwifiex_add_virtual_intf()
3075 if (!priv->dfs_cac_workqueue) { in mwifiex_add_virtual_intf()
3077 ret = -ENOMEM; in mwifiex_add_virtual_intf()
3081 INIT_DELAYED_WORK(&priv->dfs_cac_work, mwifiex_dfs_cac_work_queue); in mwifiex_add_virtual_intf()
3083 priv->dfs_chan_sw_workqueue = alloc_workqueue("MWIFIEX_DFS_CHSW%s", in mwifiex_add_virtual_intf()
3086 if (!priv->dfs_chan_sw_workqueue) { in mwifiex_add_virtual_intf()
3088 ret = -ENOMEM; in mwifiex_add_virtual_intf()
3092 INIT_DELAYED_WORK(&priv->dfs_chan_sw_work, in mwifiex_add_virtual_intf()
3095 mutex_init(&priv->async_mutex); in mwifiex_add_virtual_intf()
3098 if (cfg80211_register_netdevice(dev)) { in mwifiex_add_virtual_intf()
3100 ret = -EFAULT; in mwifiex_add_virtual_intf()
3105 "info: %s: Marvell 802.11 Adapter\n", dev->name); in mwifiex_add_virtual_intf()
3115 adapter->curr_iface_comb.sta_intf++; in mwifiex_add_virtual_intf()
3118 adapter->curr_iface_comb.uap_intf++; in mwifiex_add_virtual_intf()
3121 adapter->curr_iface_comb.p2p_intf++; in mwifiex_add_virtual_intf()
3126 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
3129 return &priv->wdev; in mwifiex_add_virtual_intf()
3132 destroy_workqueue(priv->dfs_chan_sw_workqueue); in mwifiex_add_virtual_intf()
3133 priv->dfs_chan_sw_workqueue = NULL; in mwifiex_add_virtual_intf()
3135 destroy_workqueue(priv->dfs_cac_workqueue); in mwifiex_add_virtual_intf()
3136 priv->dfs_cac_workqueue = NULL; in mwifiex_add_virtual_intf()
3138 free_netdev(dev); in mwifiex_add_virtual_intf()
3139 priv->netdev = NULL; in mwifiex_add_virtual_intf()
3143 memset(&priv->wdev, 0, sizeof(priv->wdev)); in mwifiex_add_virtual_intf()
3144 priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_add_virtual_intf()
3145 priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_add_virtual_intf()
3151 * del_virtual_intf: remove the virtual interface determined by dev
3155 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_del_virtual_intf()
3156 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_del_virtual_intf()
3163 if (priv->sched_scanning) in mwifiex_del_virtual_intf()
3164 priv->sched_scanning = false; in mwifiex_del_virtual_intf()
3166 mwifiex_stop_net_dev_queue(priv->netdev, adapter); in mwifiex_del_virtual_intf()
3168 skb_queue_walk_safe(&priv->bypass_txq, skb, tmp) { in mwifiex_del_virtual_intf()
3169 skb_unlink(skb, &priv->bypass_txq); in mwifiex_del_virtual_intf()
3170 mwifiex_write_data_complete(priv->adapter, skb, 0, -1); in mwifiex_del_virtual_intf()
3173 if (netif_carrier_ok(priv->netdev)) in mwifiex_del_virtual_intf()
3174 netif_carrier_off(priv->netdev); in mwifiex_del_virtual_intf()
3176 if (wdev->netdev->reg_state == NETREG_REGISTERED) in mwifiex_del_virtual_intf()
3177 cfg80211_unregister_netdevice(wdev->netdev); in mwifiex_del_virtual_intf()
3179 if (priv->dfs_cac_workqueue) { in mwifiex_del_virtual_intf()
3180 flush_workqueue(priv->dfs_cac_workqueue); in mwifiex_del_virtual_intf()
3181 destroy_workqueue(priv->dfs_cac_workqueue); in mwifiex_del_virtual_intf()
3182 priv->dfs_cac_workqueue = NULL; in mwifiex_del_virtual_intf()
3185 if (priv->dfs_chan_sw_workqueue) { in mwifiex_del_virtual_intf()
3186 flush_workqueue(priv->dfs_chan_sw_workqueue); in mwifiex_del_virtual_intf()
3187 destroy_workqueue(priv->dfs_chan_sw_workqueue); in mwifiex_del_virtual_intf()
3188 priv->dfs_chan_sw_workqueue = NULL; in mwifiex_del_virtual_intf()
3191 priv->netdev = NULL; in mwifiex_del_virtual_intf()
3193 switch (priv->bss_mode) { in mwifiex_del_virtual_intf()
3197 adapter->curr_iface_comb.sta_intf--; in mwifiex_del_virtual_intf()
3200 adapter->curr_iface_comb.uap_intf--; in mwifiex_del_virtual_intf()
3204 adapter->curr_iface_comb.p2p_intf--; in mwifiex_del_virtual_intf()
3212 priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_del_virtual_intf()
3216 kfree(priv->hist_data); in mwifiex_del_virtual_intf()
3229 for (j = 0; j < DIV_ROUND_UP(pat->pattern_len, 8); j++) { in mwifiex_is_pattern_supported()
3231 if (pat->mask[j] & 1 << k) { in mwifiex_is_pattern_supported()
3233 &pat->pattern[j * 8 + k], 1); in mwifiex_is_pattern_supported()
3246 pat->pkt_offset++; in mwifiex_is_pattern_supported()
3266 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_set_auto_arp_mef_entry()
3268 mef_entry->mode = MEF_MODE_HOST_SLEEP; in mwifiex_set_auto_arp_mef_entry()
3269 mef_entry->action = MEF_ACTION_AUTO_ARP; in mwifiex_set_auto_arp_mef_entry()
3274 if (adapter->priv[i]->netdev) { in mwifiex_set_auto_arp_mef_entry()
3275 in_dev = __in_dev_get_rtnl(adapter->priv[i]->netdev); in mwifiex_set_auto_arp_mef_entry()
3278 ifa = rtnl_dereference(in_dev->ifa_list); in mwifiex_set_auto_arp_mef_entry()
3279 if (!ifa || !ifa->ifa_local) in mwifiex_set_auto_arp_mef_entry()
3281 ips[i] = ifa->ifa_local; in mwifiex_set_auto_arp_mef_entry()
3289 mef_entry->filter[filt_num].repeat = 1; in mwifiex_set_auto_arp_mef_entry()
3290 memcpy(mef_entry->filter[filt_num].byte_seq, in mwifiex_set_auto_arp_mef_entry()
3292 mef_entry->filter[filt_num]. in mwifiex_set_auto_arp_mef_entry()
3295 mef_entry->filter[filt_num].offset = 46; in mwifiex_set_auto_arp_mef_entry()
3296 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_auto_arp_mef_entry()
3298 mef_entry->filter[filt_num].filt_action = in mwifiex_set_auto_arp_mef_entry()
3304 mef_entry->filter[filt_num].repeat = 1; in mwifiex_set_auto_arp_mef_entry()
3305 mef_entry->filter[filt_num].byte_seq[0] = 0x08; in mwifiex_set_auto_arp_mef_entry()
3306 mef_entry->filter[filt_num].byte_seq[1] = 0x06; in mwifiex_set_auto_arp_mef_entry()
3307 mef_entry->filter[filt_num].byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] = 2; in mwifiex_set_auto_arp_mef_entry()
3308 mef_entry->filter[filt_num].offset = 20; in mwifiex_set_auto_arp_mef_entry()
3309 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_auto_arp_mef_entry()
3310 mef_entry->filter[filt_num].filt_action = TYPE_AND; in mwifiex_set_auto_arp_mef_entry()
3324 mef_entry->mode = MEF_MODE_HOST_SLEEP; in mwifiex_set_wowlan_mef_entry()
3325 mef_entry->action = MEF_ACTION_ALLOW_AND_WAKEUP_HOST; in mwifiex_set_wowlan_mef_entry()
3327 for (i = 0; i < wowlan->n_patterns; i++) { in mwifiex_set_wowlan_mef_entry()
3329 if (!mwifiex_is_pattern_supported(&wowlan->patterns[i], in mwifiex_set_wowlan_mef_entry()
3332 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_set_wowlan_mef_entry()
3334 return -EOPNOTSUPP; in mwifiex_set_wowlan_mef_entry()
3337 if (!wowlan->patterns[i].pkt_offset) { in mwifiex_set_wowlan_mef_entry()
3340 mef_cfg->criteria |= MWIFIEX_CRITERIA_UNICAST; in mwifiex_set_wowlan_mef_entry()
3343 mef_cfg->criteria |= MWIFIEX_CRITERIA_BROADCAST; in mwifiex_set_wowlan_mef_entry()
3349 mef_cfg->criteria |= MWIFIEX_CRITERIA_MULTICAST; in mwifiex_set_wowlan_mef_entry()
3353 mef_entry->filter[filt_num].repeat = 1; in mwifiex_set_wowlan_mef_entry()
3354 mef_entry->filter[filt_num].offset = in mwifiex_set_wowlan_mef_entry()
3355 wowlan->patterns[i].pkt_offset; in mwifiex_set_wowlan_mef_entry()
3356 memcpy(mef_entry->filter[filt_num].byte_seq, byte_seq, in mwifiex_set_wowlan_mef_entry()
3358 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_wowlan_mef_entry()
3362 mwifiex_dbg(priv->adapter, INFO, "Wake on patterns\n"); in mwifiex_set_wowlan_mef_entry()
3364 mef_entry->filter[filt_num].filt_action = TYPE_AND; in mwifiex_set_wowlan_mef_entry()
3370 if (wowlan->magic_pkt) { in mwifiex_set_wowlan_mef_entry()
3371 mef_cfg->criteria |= MWIFIEX_CRITERIA_UNICAST; in mwifiex_set_wowlan_mef_entry()
3372 mef_entry->filter[filt_num].repeat = 16; in mwifiex_set_wowlan_mef_entry()
3373 memcpy(mef_entry->filter[filt_num].byte_seq, priv->curr_addr, in mwifiex_set_wowlan_mef_entry()
3375 mef_entry->filter[filt_num].byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] = in mwifiex_set_wowlan_mef_entry()
3377 mef_entry->filter[filt_num].offset = 28; in mwifiex_set_wowlan_mef_entry()
3378 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_wowlan_mef_entry()
3380 mef_entry->filter[filt_num].filt_action = TYPE_OR; in mwifiex_set_wowlan_mef_entry()
3383 mef_entry->filter[filt_num].repeat = 16; in mwifiex_set_wowlan_mef_entry()
3384 memcpy(mef_entry->filter[filt_num].byte_seq, priv->curr_addr, in mwifiex_set_wowlan_mef_entry()
3386 mef_entry->filter[filt_num].byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] = in mwifiex_set_wowlan_mef_entry()
3388 mef_entry->filter[filt_num].offset = 56; in mwifiex_set_wowlan_mef_entry()
3389 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_wowlan_mef_entry()
3390 mef_entry->filter[filt_num].filt_action = TYPE_OR; in mwifiex_set_wowlan_mef_entry()
3391 mwifiex_dbg(priv->adapter, INFO, "Wake on magic packet\n"); in mwifiex_set_wowlan_mef_entry()
3403 if (wowlan->n_patterns || wowlan->magic_pkt) in mwifiex_set_mef_filter()
3408 return -ENOMEM; in mwifiex_set_mef_filter()
3418 if (wowlan->n_patterns || wowlan->magic_pkt) { in mwifiex_set_mef_filter()
3449 sta_priv->scan_aborting = true; in mwifiex_cfg80211_suspend()
3450 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_cfg80211_suspend()
3451 priv = adapter->priv[i]; in mwifiex_cfg80211_suspend()
3457 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_cfg80211_suspend()
3458 priv = adapter->priv[i]; in mwifiex_cfg80211_suspend()
3459 if (priv && priv->netdev) in mwifiex_cfg80211_suspend()
3460 netif_device_detach(priv->netdev); in mwifiex_cfg80211_suspend()
3466 !skb_queue_empty(&adapter->tx_data_q)) in mwifiex_cfg80211_suspend()
3479 if (!sta_priv->media_connected && !wowlan->nd_config) { in mwifiex_cfg80211_suspend()
3493 hs_cfg.conditions = le32_to_cpu(adapter->hs_cfg.conditions); in mwifiex_cfg80211_suspend()
3495 if (wowlan->nd_config) { in mwifiex_cfg80211_suspend()
3498 mwifiex_cfg80211_sched_scan_start(wiphy, sta_priv->netdev, in mwifiex_cfg80211_suspend()
3499 wowlan->nd_config); in mwifiex_cfg80211_suspend()
3502 if (wowlan->disconnect) { in mwifiex_cfg80211_suspend()
3504 mwifiex_dbg(sta_priv->adapter, INFO, "Wake on device disconnect\n"); in mwifiex_cfg80211_suspend()
3508 hs_cfg.gpio = adapter->hs_cfg.gpio; in mwifiex_cfg80211_suspend()
3509 hs_cfg.gap = adapter->hs_cfg.gap; in mwifiex_cfg80211_suspend()
3516 sta_priv->scan_aborting = false; in mwifiex_cfg80211_suspend()
3529 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_cfg80211_resume()
3530 priv = adapter->priv[i]; in mwifiex_cfg80211_resume()
3531 if (priv && priv->netdev) in mwifiex_cfg80211_resume()
3532 netif_device_attach(priv->netdev); in mwifiex_cfg80211_resume()
3535 if (!wiphy->wowlan_config) in mwifiex_cfg80211_resume()
3543 wakeup_report.pattern_idx = -1; in mwifiex_cfg80211_resume()
3557 if (wiphy->wowlan_config->disconnect) in mwifiex_cfg80211_resume()
3559 if (wiphy->wowlan_config->nd_config) in mwifiex_cfg80211_resume()
3560 wakeup_report.net_detect = adapter->nd_info; in mwifiex_cfg80211_resume()
3565 if (wiphy->wowlan_config->magic_pkt) in mwifiex_cfg80211_resume()
3567 if (wiphy->wowlan_config->n_patterns) in mwifiex_cfg80211_resume()
3571 if (wiphy->wowlan_config->gtk_rekey_failure) in mwifiex_cfg80211_resume()
3580 cfg80211_report_wowlan_wakeup(&priv->wdev, &wakeup_report, in mwifiex_cfg80211_resume()
3584 if (adapter->nd_info) { in mwifiex_cfg80211_resume()
3585 for (i = 0 ; i < adapter->nd_info->n_matches ; i++) in mwifiex_cfg80211_resume()
3586 kfree(adapter->nd_info->matches[i]); in mwifiex_cfg80211_resume()
3587 kfree(adapter->nd_info); in mwifiex_cfg80211_resume()
3588 adapter->nd_info = NULL; in mwifiex_cfg80211_resume()
3599 device_set_wakeup_enable(adapter->dev, enabled); in mwifiex_cfg80211_set_wakeup()
3602 static int mwifiex_set_rekey_data(struct wiphy *wiphy, struct net_device *dev, in mwifiex_set_rekey_data() argument
3605 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_set_rekey_data()
3607 if (!ISSUPP_FIRMWARE_SUPPLICANT(priv->adapter->fw_cap_info)) in mwifiex_set_rekey_data()
3608 return -EOPNOTSUPP; in mwifiex_set_rekey_data()
3645 mrule->max_coalescing_delay = crule->delay; in mwifiex_fill_coalesce_rule_info()
3647 param = mrule->params; in mwifiex_fill_coalesce_rule_info()
3649 for (i = 0; i < crule->n_patterns; i++) { in mwifiex_fill_coalesce_rule_info()
3651 if (!mwifiex_is_pattern_supported(&crule->patterns[i], in mwifiex_fill_coalesce_rule_info()
3654 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_fill_coalesce_rule_info()
3656 return -EOPNOTSUPP; in mwifiex_fill_coalesce_rule_info()
3659 if (!crule->patterns[i].pkt_offset) { in mwifiex_fill_coalesce_rule_info()
3663 if (pkt_type && mrule->pkt_type) { in mwifiex_fill_coalesce_rule_info()
3664 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_fill_coalesce_rule_info()
3666 return -EOPNOTSUPP; in mwifiex_fill_coalesce_rule_info()
3668 mrule->pkt_type = pkt_type; in mwifiex_fill_coalesce_rule_info()
3673 if (crule->condition == NL80211_COALESCE_CONDITION_MATCH) in mwifiex_fill_coalesce_rule_info()
3674 param->operation = RECV_FILTER_MATCH_TYPE_EQ; in mwifiex_fill_coalesce_rule_info()
3676 param->operation = RECV_FILTER_MATCH_TYPE_NE; in mwifiex_fill_coalesce_rule_info()
3678 param->operand_len = byte_seq[MWIFIEX_COALESCE_MAX_BYTESEQ]; in mwifiex_fill_coalesce_rule_info()
3679 memcpy(param->operand_byte_stream, byte_seq, in mwifiex_fill_coalesce_rule_info()
3680 param->operand_len); in mwifiex_fill_coalesce_rule_info()
3681 param->offset = crule->patterns[i].pkt_offset; in mwifiex_fill_coalesce_rule_info()
3684 mrule->num_of_fields++; in mwifiex_fill_coalesce_rule_info()
3687 if (!mrule->pkt_type) { in mwifiex_fill_coalesce_rule_info()
3688 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_fill_coalesce_rule_info()
3690 return -EOPNOTSUPP; in mwifiex_fill_coalesce_rule_info()
3714 coalesce_cfg.num_of_rules = coalesce->n_rules; in mwifiex_cfg80211_set_coalesce()
3715 for (i = 0; i < coalesce->n_rules; i++) { in mwifiex_cfg80211_set_coalesce()
3716 ret = mwifiex_fill_coalesce_rule_info(priv, &coalesce->rules[i], in mwifiex_cfg80211_set_coalesce()
3734 mwifiex_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_tdls_mgmt() argument
3740 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_tdls_mgmt()
3743 if (!(wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS)) in mwifiex_cfg80211_tdls_mgmt()
3744 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_mgmt()
3747 if (!(priv->bss_type == MWIFIEX_BSS_TYPE_STA && priv->media_connected)) in mwifiex_cfg80211_tdls_mgmt()
3748 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_mgmt()
3752 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3762 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3770 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3778 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3785 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3792 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3799 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_mgmt()
3801 ret = -EINVAL; in mwifiex_cfg80211_tdls_mgmt()
3809 mwifiex_cfg80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_tdls_oper() argument
3812 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_tdls_oper()
3814 if (!(wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) || in mwifiex_cfg80211_tdls_oper()
3815 !(wiphy->flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) in mwifiex_cfg80211_tdls_oper()
3816 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_oper()
3819 if (!(priv->bss_type == MWIFIEX_BSS_TYPE_STA && priv->media_connected)) in mwifiex_cfg80211_tdls_oper()
3820 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_oper()
3822 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_oper()
3834 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_oper()
3836 return -EINVAL; in mwifiex_cfg80211_tdls_oper()
3839 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_oper()
3841 return -EINVAL; in mwifiex_cfg80211_tdls_oper()
3844 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_oper()
3846 return -EINVAL; in mwifiex_cfg80211_tdls_oper()
3848 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_oper()
3850 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_oper()
3857 mwifiex_cfg80211_tdls_chan_switch(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_tdls_chan_switch() argument
3864 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_tdls_chan_switch()
3866 spin_lock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3869 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3872 return -ENOENT; in mwifiex_cfg80211_tdls_chan_switch()
3875 if (!(sta_ptr->tdls_cap.extcap.ext_capab[3] & in mwifiex_cfg80211_tdls_chan_switch()
3877 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3878 wiphy_err(wiphy, "%pM do not support tdls cs\n", addr); in mwifiex_cfg80211_tdls_chan_switch()
3879 return -ENOENT; in mwifiex_cfg80211_tdls_chan_switch()
3882 if (sta_ptr->tdls_status == TDLS_CHAN_SWITCHING || in mwifiex_cfg80211_tdls_chan_switch()
3883 sta_ptr->tdls_status == TDLS_IN_OFF_CHAN) { in mwifiex_cfg80211_tdls_chan_switch()
3884 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3886 return -EALREADY; in mwifiex_cfg80211_tdls_chan_switch()
3888 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3890 chan = chandef->chan->hw_value; in mwifiex_cfg80211_tdls_chan_switch()
3892 band = chandef->chan->band; in mwifiex_cfg80211_tdls_chan_switch()
3900 struct net_device *dev, in mwifiex_cfg80211_tdls_cancel_chan_switch() argument
3904 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3906 spin_lock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3909 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3912 } else if (!(sta_ptr->tdls_status == TDLS_CHAN_SWITCHING || in mwifiex_cfg80211_tdls_cancel_chan_switch()
3913 sta_ptr->tdls_status == TDLS_IN_BASE_CHAN || in mwifiex_cfg80211_tdls_cancel_chan_switch()
3914 sta_ptr->tdls_status == TDLS_IN_OFF_CHAN)) { in mwifiex_cfg80211_tdls_cancel_chan_switch()
3915 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3919 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3925 mwifiex_cfg80211_add_station(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_add_station() argument
3928 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_add_station()
3930 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in mwifiex_cfg80211_add_station()
3931 return -EOPNOTSUPP; in mwifiex_cfg80211_add_station()
3934 if ((priv->bss_type != MWIFIEX_BSS_TYPE_STA) || !priv->media_connected) in mwifiex_cfg80211_add_station()
3935 return -EOPNOTSUPP; in mwifiex_cfg80211_add_station()
3941 mwifiex_cfg80211_channel_switch(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_channel_switch() argument
3947 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_channel_switch()
3949 if (priv->adapter->scan_processing) { in mwifiex_cfg80211_channel_switch()
3950 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_channel_switch()
3952 return -EBUSY; in mwifiex_cfg80211_channel_switch()
3955 if (priv->wdev.cac_started) in mwifiex_cfg80211_channel_switch()
3956 return -EBUSY; in mwifiex_cfg80211_channel_switch()
3958 if (cfg80211_chandef_identical(¶ms->chandef, in mwifiex_cfg80211_channel_switch()
3959 &priv->dfs_chandef)) in mwifiex_cfg80211_channel_switch()
3960 return -EINVAL; in mwifiex_cfg80211_channel_switch()
3963 params->beacon_csa.tail, in mwifiex_cfg80211_channel_switch()
3964 params->beacon_csa.tail_len); in mwifiex_cfg80211_channel_switch()
3966 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_channel_switch()
3968 return -EINVAL; in mwifiex_cfg80211_channel_switch()
3972 if (channel_sw->mode) { in mwifiex_cfg80211_channel_switch()
3973 if (netif_carrier_ok(priv->netdev)) in mwifiex_cfg80211_channel_switch()
3974 netif_carrier_off(priv->netdev); in mwifiex_cfg80211_channel_switch()
3975 mwifiex_stop_net_dev_queue(priv->netdev, priv->adapter); in mwifiex_cfg80211_channel_switch()
3979 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_channel_switch()
3982 if (mwifiex_set_mgmt_ies(priv, ¶ms->beacon_csa)) { in mwifiex_cfg80211_channel_switch()
3983 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_channel_switch()
3985 return -EFAULT; in mwifiex_cfg80211_channel_switch()
3988 memcpy(&priv->dfs_chandef, ¶ms->chandef, sizeof(priv->dfs_chandef)); in mwifiex_cfg80211_channel_switch()
3989 memcpy(&priv->beacon_after, ¶ms->beacon_after, in mwifiex_cfg80211_channel_switch()
3990 sizeof(priv->beacon_after)); in mwifiex_cfg80211_channel_switch()
3992 chsw_msec = max(channel_sw->count * priv->bss_cfg.beacon_period, 100); in mwifiex_cfg80211_channel_switch()
3993 queue_delayed_work(priv->dfs_chan_sw_workqueue, &priv->dfs_chan_sw_work, in mwifiex_cfg80211_channel_switch()
4002 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_cfg80211_get_channel()
4008 int ret = -ENODATA; in mwifiex_cfg80211_get_channel()
4011 cfg80211_chandef_valid(&priv->bss_chandef)) { in mwifiex_cfg80211_get_channel()
4012 *chandef = priv->bss_chandef; in mwifiex_cfg80211_get_channel()
4014 } else if (priv->media_connected) { in mwifiex_cfg80211_get_channel()
4015 curr_bss = &priv->curr_bss_params.bss_descriptor; in mwifiex_cfg80211_get_channel()
4016 band = mwifiex_band_to_radio_type(priv->curr_bss_params.band); in mwifiex_cfg80211_get_channel()
4017 freq = ieee80211_channel_to_frequency(curr_bss->channel, band); in mwifiex_cfg80211_get_channel()
4020 if (priv->ht_param_present) { in mwifiex_cfg80211_get_channel()
4042 MWIFIEX_TM_ATTR_MAX = __MWIFIEX_TM_ATTR_AFTER_LAST - 1,
4058 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_tm_cmd()
4065 return -EINVAL; in mwifiex_tm_cmd()
4073 return -EINVAL; in mwifiex_tm_cmd()
4078 return -EINVAL; in mwifiex_tm_cmd()
4082 return -ENOMEM; in mwifiex_tm_cmd()
4084 hostcmd->len = nla_len(tb[MWIFIEX_TM_ATTR_DATA]); in mwifiex_tm_cmd()
4085 memcpy(hostcmd->cmd, nla_data(tb[MWIFIEX_TM_ATTR_DATA]), in mwifiex_tm_cmd()
4086 hostcmd->len); in mwifiex_tm_cmd()
4089 dev_err(priv->adapter->dev, "Failed to process hostcmd\n"); in mwifiex_tm_cmd()
4091 return -EFAULT; in mwifiex_tm_cmd()
4095 skb = cfg80211_testmode_alloc_reply_skb(wiphy, hostcmd->len); in mwifiex_tm_cmd()
4098 return -ENOMEM; in mwifiex_tm_cmd()
4101 hostcmd->len, hostcmd->cmd); in mwifiex_tm_cmd()
4105 return -EMSGSIZE; in mwifiex_tm_cmd()
4112 return -EOPNOTSUPP; in mwifiex_tm_cmd()
4119 struct net_device *dev, in mwifiex_cfg80211_start_radar_detection() argument
4123 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_start_radar_detection()
4126 if (priv->adapter->scan_processing) { in mwifiex_cfg80211_start_radar_detection()
4127 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_radar_detection()
4129 return -EBUSY; in mwifiex_cfg80211_start_radar_detection()
4133 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_start_radar_detection()
4136 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_radar_detection()
4138 return -1; in mwifiex_cfg80211_start_radar_detection()
4140 priv->state_11h.is_11h_active = true; in mwifiex_cfg80211_start_radar_detection()
4147 memcpy(&priv->dfs_chandef, chandef, sizeof(priv->dfs_chandef)); in mwifiex_cfg80211_start_radar_detection()
4151 return -1; in mwifiex_cfg80211_start_radar_detection()
4153 queue_delayed_work(priv->dfs_cac_workqueue, &priv->dfs_cac_work, in mwifiex_cfg80211_start_radar_detection()
4159 mwifiex_cfg80211_change_station(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_change_station() argument
4164 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_change_station()
4167 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in mwifiex_cfg80211_change_station()
4168 return -EOPNOTSUPP; in mwifiex_cfg80211_change_station()
4171 if ((priv->bss_type != MWIFIEX_BSS_TYPE_STA) || !priv->media_connected) in mwifiex_cfg80211_change_station()
4172 return -EOPNOTSUPP; in mwifiex_cfg80211_change_station()
4174 priv->sta_params = params; in mwifiex_cfg80211_change_station()
4177 priv->sta_params = NULL; in mwifiex_cfg80211_change_station()
4286 if (adapter->config_bands & BAND_A) in mwifiex_init_channel_scan_gap()
4292 adapter->num_in_chan_stats = 2 * (n_channels_bg + n_channels_a); in mwifiex_init_channel_scan_gap()
4293 adapter->chan_stats = vmalloc(array_size(sizeof(*adapter->chan_stats), in mwifiex_init_channel_scan_gap()
4294 adapter->num_in_chan_stats)); in mwifiex_init_channel_scan_gap()
4296 if (!adapter->chan_stats) in mwifiex_init_channel_scan_gap()
4297 return -ENOMEM; in mwifiex_init_channel_scan_gap()
4315 struct mwifiex_private *priv = adapter->priv[MWIFIEX_BSS_TYPE_STA]; in mwifiex_register_cfg80211()
4325 return -ENOMEM; in mwifiex_register_cfg80211()
4327 wiphy->max_scan_ssids = MWIFIEX_MAX_SSID_LIST_LENGTH; in mwifiex_register_cfg80211()
4328 wiphy->max_scan_ie_len = MWIFIEX_MAX_VSIE_LEN; in mwifiex_register_cfg80211()
4329 wiphy->mgmt_stypes = mwifiex_mgmt_stypes; in mwifiex_register_cfg80211()
4330 wiphy->max_remain_on_channel_duration = 5000; in mwifiex_register_cfg80211()
4331 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in mwifiex_register_cfg80211()
4336 if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4337 wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in mwifiex_register_cfg80211()
4339 wiphy->bands[NL80211_BAND_2GHZ] = &mwifiex_band_2ghz; in mwifiex_register_cfg80211()
4340 if (adapter->config_bands & BAND_A) in mwifiex_register_cfg80211()
4341 wiphy->bands[NL80211_BAND_5GHZ] = &mwifiex_band_5ghz; in mwifiex_register_cfg80211()
4343 wiphy->bands[NL80211_BAND_5GHZ] = NULL; in mwifiex_register_cfg80211()
4345 if (adapter->drcs_enabled && ISSUPP_DRCS_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4346 wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta_drcs; in mwifiex_register_cfg80211()
4347 else if (adapter->is_hw_11ac_capable) in mwifiex_register_cfg80211()
4348 wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta_vht; in mwifiex_register_cfg80211()
4350 wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta; in mwifiex_register_cfg80211()
4351 wiphy->n_iface_combinations = 1; in mwifiex_register_cfg80211()
4353 if (adapter->max_sta_conn > adapter->max_p2p_conn) in mwifiex_register_cfg80211()
4354 wiphy->max_ap_assoc_sta = adapter->max_sta_conn; in mwifiex_register_cfg80211()
4356 wiphy->max_ap_assoc_sta = adapter->max_p2p_conn; in mwifiex_register_cfg80211()
4359 wiphy->cipher_suites = mwifiex_cipher_suites; in mwifiex_register_cfg80211()
4360 wiphy->n_cipher_suites = ARRAY_SIZE(mwifiex_cipher_suites); in mwifiex_register_cfg80211()
4362 if (adapter->regd) { in mwifiex_register_cfg80211()
4363 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG | in mwifiex_register_cfg80211()
4366 wiphy_apply_custom_regulatory(wiphy, adapter->regd); in mwifiex_register_cfg80211()
4369 ether_addr_copy(wiphy->perm_addr, adapter->perm_addr); in mwifiex_register_cfg80211()
4370 wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; in mwifiex_register_cfg80211()
4371 wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME | in mwifiex_register_cfg80211()
4378 if (ISSUPP_TDLS_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4379 wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS | in mwifiex_register_cfg80211()
4383 if (ISSUPP_FIRMWARE_SUPPLICANT(priv->adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4384 wiphy->wowlan = &mwifiex_wowlan_support; in mwifiex_register_cfg80211()
4386 wiphy->wowlan = &mwifiex_wowlan_support_no_gtk; in mwifiex_register_cfg80211()
4389 wiphy->coalesce = &mwifiex_coalesce_support; in mwifiex_register_cfg80211()
4391 wiphy->probe_resp_offload = NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS | in mwifiex_register_cfg80211()
4395 wiphy->max_sched_scan_reqs = 1; in mwifiex_register_cfg80211()
4396 wiphy->max_sched_scan_ssids = MWIFIEX_MAX_SSID_LIST_LENGTH; in mwifiex_register_cfg80211()
4397 wiphy->max_sched_scan_ie_len = MWIFIEX_MAX_VSIE_LEN; in mwifiex_register_cfg80211()
4398 wiphy->max_match_sets = MWIFIEX_MAX_SSID_LIST_LENGTH; in mwifiex_register_cfg80211()
4400 wiphy->available_antennas_tx = BIT(adapter->number_of_antenna) - 1; in mwifiex_register_cfg80211()
4401 wiphy->available_antennas_rx = BIT(adapter->number_of_antenna) - 1; in mwifiex_register_cfg80211()
4403 wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER | in mwifiex_register_cfg80211()
4407 if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4408 wiphy->features |= NL80211_FEATURE_HT_IBSS; in mwifiex_register_cfg80211()
4410 if (ISSUPP_RANDOM_MAC(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4411 wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR | in mwifiex_register_cfg80211()
4415 if (ISSUPP_TDLS_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4416 wiphy->features |= NL80211_FEATURE_TDLS_CHANNEL_SWITCH; in mwifiex_register_cfg80211()
4418 if (adapter->fw_api_ver == MWIFIEX_FW_V15) in mwifiex_register_cfg80211()
4419 wiphy->features |= NL80211_FEATURE_SK_TX_STATUS; in mwifiex_register_cfg80211()
4422 wiphy->bss_priv_size = sizeof(struct mwifiex_bss_priv); in mwifiex_register_cfg80211()
4424 wiphy->reg_notifier = mwifiex_reg_notifier; in mwifiex_register_cfg80211()
4430 set_wiphy_dev(wiphy, priv->adapter->dev); in mwifiex_register_cfg80211()
4440 if (!adapter->regd) { in mwifiex_register_cfg80211()
4446 if (adapter->region_code == 0x00) { in mwifiex_register_cfg80211()
4450 wiphy->regulatory_flags |= in mwifiex_register_cfg80211()
4455 adapter->region_code); in mwifiex_register_cfg80211()
4458 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_register_cfg80211()
4466 wiphy->frag_threshold = thr; in mwifiex_register_cfg80211()
4469 wiphy->rts_threshold = thr; in mwifiex_register_cfg80211()
4472 wiphy->retry_short = (u8) retry; in mwifiex_register_cfg80211()
4475 wiphy->retry_long = (u8) retry; in mwifiex_register_cfg80211()
4477 adapter->wiphy = wiphy; in mwifiex_register_cfg80211()