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, &params->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, &params->beacon); in mwifiex_cfg80211_start_ap()
2066 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_ap()
2071 if (mwifiex_set_mgmt_ies(priv, &params->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_rtnl(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
2187 mwifiex_dbg(priv->adapter, ERROR, "invalid SSID - aborting\n"); in mwifiex_cfg80211_assoc()
2188 return -EINVAL; in mwifiex_cfg80211_assoc()
2193 mwifiex_dbg(priv->adapter, ERROR, "invalid SSID - aborting\n"); in mwifiex_cfg80211_assoc()
2194 return -EINVAL; in mwifiex_cfg80211_assoc()
2199 priv->sec_info.wpa_enabled = false; in mwifiex_cfg80211_assoc()
2200 priv->sec_info.wpa2_enabled = false; in mwifiex_cfg80211_assoc()
2201 priv->wep_key_curr_index = 0; in mwifiex_cfg80211_assoc()
2202 priv->sec_info.encryption_mode = 0; in mwifiex_cfg80211_assoc()
2203 priv->sec_info.is_authtype_auto = 0; in mwifiex_cfg80211_assoc()
2217 /* "privacy" is set only for ad-hoc mode */ in mwifiex_cfg80211_assoc()
2225 priv->sec_info.encryption_mode = in mwifiex_cfg80211_assoc()
2227 priv->sec_info.authentication_mode = in mwifiex_cfg80211_assoc()
2235 if (sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC) { in mwifiex_cfg80211_assoc()
2237 priv->sec_info.is_authtype_auto = 1; in mwifiex_cfg80211_assoc()
2239 auth_type = sme->auth_type; in mwifiex_cfg80211_assoc()
2242 if (sme->crypto.n_ciphers_pairwise) { in mwifiex_cfg80211_assoc()
2243 priv->sec_info.encryption_mode = in mwifiex_cfg80211_assoc()
2244 sme->crypto.ciphers_pairwise[0]; in mwifiex_cfg80211_assoc()
2245 priv->sec_info.authentication_mode = auth_type; in mwifiex_cfg80211_assoc()
2248 if (sme->crypto.cipher_group) { in mwifiex_cfg80211_assoc()
2249 priv->sec_info.encryption_mode = sme->crypto.cipher_group; in mwifiex_cfg80211_assoc()
2250 priv->sec_info.authentication_mode = auth_type; in mwifiex_cfg80211_assoc()
2252 if (sme->ie) in mwifiex_cfg80211_assoc()
2253 ret = mwifiex_set_gen_ie(priv, sme->ie, sme->ie_len); in mwifiex_cfg80211_assoc()
2255 if (sme->key) { in mwifiex_cfg80211_assoc()
2256 if (mwifiex_is_alg_wep(priv->sec_info.encryption_mode)) { in mwifiex_cfg80211_assoc()
2257 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_assoc()
2259 "with key len %d\n", sme->key_len); in mwifiex_cfg80211_assoc()
2260 priv->wep_key_curr_index = sme->key_idx; in mwifiex_cfg80211_assoc()
2261 ret = mwifiex_set_encode(priv, NULL, sme->key, in mwifiex_cfg80211_assoc()
2262 sme->key_len, sme->key_idx, in mwifiex_cfg80211_assoc()
2276 mwifiex_dbg(priv->adapter, ERROR, "scan error\n"); in mwifiex_cfg80211_assoc()
2277 return -EFAULT; in mwifiex_cfg80211_assoc()
2283 bss = cfg80211_get_bss(priv->wdev.wiphy, channel, in mwifiex_cfg80211_assoc()
2288 bss = cfg80211_get_bss(priv->wdev.wiphy, channel, in mwifiex_cfg80211_assoc()
2295 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_assoc()
2296 "assoc: requested bss not found in scan results\n"); in mwifiex_cfg80211_assoc()
2301 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()
2316 * kernel will give a panic after successful assoc */ in mwifiex_cfg80211_assoc()
2318 return -EFAULT; in mwifiex_cfg80211_assoc()
2327 * This function does not work when the current mode is set to Ad-Hoc, or
2332 mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_connect() argument
2335 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_connect()
2336 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_cfg80211_connect()
2341 "%s: reject infra assoc request in non-STA role\n", in mwifiex_cfg80211_connect()
2342 dev->name); in mwifiex_cfg80211_connect()
2343 return -EINVAL; in mwifiex_cfg80211_connect()
2346 if (priv->wdev.current_bss) { in mwifiex_cfg80211_connect()
2348 "%s: already connected\n", dev->name); in mwifiex_cfg80211_connect()
2349 return -EALREADY; in mwifiex_cfg80211_connect()
2352 if (priv->scan_block) in mwifiex_cfg80211_connect()
2353 priv->scan_block = false; in mwifiex_cfg80211_connect()
2355 if (test_bit(MWIFIEX_SURPRISE_REMOVED, &adapter->work_flags) || in mwifiex_cfg80211_connect()
2356 test_bit(MWIFIEX_IS_CMD_TIMEDOUT, &adapter->work_flags)) { in mwifiex_cfg80211_connect()
2360 dev->name); in mwifiex_cfg80211_connect()
2361 return -EFAULT; in mwifiex_cfg80211_connect()
2366 (int)sme->ssid_len, (char *)sme->ssid, sme->bssid); in mwifiex_cfg80211_connect()
2369 cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy, 0); in mwifiex_cfg80211_connect()
2371 ret = mwifiex_cfg80211_assoc(priv, sme->ssid_len, sme->ssid, sme->bssid, in mwifiex_cfg80211_connect()
2372 priv->bss_mode, sme->channel, sme, 0); in mwifiex_cfg80211_connect()
2374 cfg80211_connect_result(priv->netdev, priv->cfg_bssid, NULL, 0, in mwifiex_cfg80211_connect()
2377 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_connect()
2379 priv->cfg_bssid); in mwifiex_cfg80211_connect()
2380 if (ISSUPP_TDLS_ENABLED(priv->adapter->fw_cap_info) && in mwifiex_cfg80211_connect()
2381 priv->adapter->auto_tdls && in mwifiex_cfg80211_connect()
2382 priv->bss_type == MWIFIEX_BSS_TYPE_STA) in mwifiex_cfg80211_connect()
2385 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_connect()
2387 priv->cfg_bssid); in mwifiex_cfg80211_connect()
2388 eth_zero_addr(priv->cfg_bssid); in mwifiex_cfg80211_connect()
2391 cfg80211_connect_result(priv->netdev, priv->cfg_bssid, in mwifiex_cfg80211_connect()
2395 cfg80211_connect_result(priv->netdev, priv->cfg_bssid, in mwifiex_cfg80211_connect()
2406 * - channel
2407 * - start band
2408 * - 11n flag
2409 * - secondary channel offset
2414 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_set_ibss_params()
2418 if (params->chandef.chan->band == NL80211_BAND_2GHZ) { in mwifiex_set_ibss_params()
2419 if (!params->basic_rates) { in mwifiex_set_ibss_params()
2434 if (params->basic_rates < index) { in mwifiex_set_ibss_params()
2438 if (params->basic_rates % index) in mwifiex_set_ibss_params()
2443 if (cfg80211_get_chandef_type(&params->chandef) != in mwifiex_set_ibss_params()
2447 if (cfg80211_get_chandef_type(&params->chandef) == in mwifiex_set_ibss_params()
2454 if (!((config_bands | adapter->fw_bands) & ~adapter->fw_bands)) { in mwifiex_set_ibss_params()
2455 adapter->config_bands = config_bands; in mwifiex_set_ibss_params()
2456 adapter->adhoc_start_band = config_bands; in mwifiex_set_ibss_params()
2459 adapter->adhoc_11n_enabled = true; in mwifiex_set_ibss_params()
2461 adapter->adhoc_11n_enabled = false; in mwifiex_set_ibss_params()
2464 adapter->sec_chan_offset = in mwifiex_set_ibss_params()
2466 cfg80211_get_chandef_type(&params->chandef)); in mwifiex_set_ibss_params()
2467 priv->adhoc_channel = ieee80211_frequency_to_channel( in mwifiex_set_ibss_params()
2468 params->chandef.chan->center_freq); in mwifiex_set_ibss_params()
2472 config_bands, priv->adhoc_channel, in mwifiex_set_ibss_params()
2473 adapter->sec_chan_offset); in mwifiex_set_ibss_params()
2481 * This function does not work in any mode other than Ad-Hoc, or if
2485 mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_join_ibss() argument
2488 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_join_ibss()
2491 if (priv->bss_mode != NL80211_IFTYPE_ADHOC) { in mwifiex_cfg80211_join_ibss()
2492 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_join_ibss()
2498 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_join_ibss()
2500 params->ssid_len, (char *)params->ssid, params->bssid); in mwifiex_cfg80211_join_ibss()
2504 ret = mwifiex_cfg80211_assoc(priv, params->ssid_len, params->ssid, in mwifiex_cfg80211_join_ibss()
2505 params->bssid, priv->bss_mode, in mwifiex_cfg80211_join_ibss()
2506 params->chandef.chan, NULL, in mwifiex_cfg80211_join_ibss()
2507 params->privacy); in mwifiex_cfg80211_join_ibss()
2510 cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid, in mwifiex_cfg80211_join_ibss()
2511 params->chandef.chan, GFP_KERNEL); in mwifiex_cfg80211_join_ibss()
2512 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_join_ibss()
2514 "%pM successfully\n", priv->cfg_bssid); in mwifiex_cfg80211_join_ibss()
2516 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_join_ibss()
2530 mwifiex_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev) in mwifiex_cfg80211_leave_ibss() argument
2532 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_leave_ibss()
2534 mwifiex_dbg(priv->adapter, MSG, "info: disconnecting from essid %pM\n", in mwifiex_cfg80211_leave_ibss()
2535 priv->cfg_bssid); in mwifiex_cfg80211_leave_ibss()
2537 return -EFAULT; in mwifiex_cfg80211_leave_ibss()
2539 eth_zero_addr(priv->cfg_bssid); in mwifiex_cfg80211_leave_ibss()
2555 struct net_device *dev = request->wdev->netdev; in mwifiex_cfg80211_scan() local
2556 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_scan()
2563 mwifiex_dbg(priv->adapter, CMD, in mwifiex_cfg80211_scan()
2564 "info: received scan request on %s\n", dev->name); in mwifiex_cfg80211_scan()
2569 if (priv->scan_request || priv->scan_aborting) { in mwifiex_cfg80211_scan()
2570 mwifiex_dbg(priv->adapter, WARN, in mwifiex_cfg80211_scan()
2572 return -EBUSY; in mwifiex_cfg80211_scan()
2575 if (!priv->wdev.current_bss && priv->scan_block) in mwifiex_cfg80211_scan()
2576 priv->scan_block = false; in mwifiex_cfg80211_scan()
2579 cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy, 0); in mwifiex_cfg80211_scan()
2583 return -ENOMEM; in mwifiex_cfg80211_scan()
2585 priv->scan_request = request; in mwifiex_cfg80211_scan()
2587 if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { in mwifiex_cfg80211_scan()
2588 get_random_mask_addr(mac_addr, request->mac_addr, in mwifiex_cfg80211_scan()
2589 request->mac_addr_mask); in mwifiex_cfg80211_scan()
2590 ether_addr_copy(request->mac_addr, mac_addr); in mwifiex_cfg80211_scan()
2591 ether_addr_copy(user_scan_cfg->random_mac, mac_addr); in mwifiex_cfg80211_scan()
2594 user_scan_cfg->num_ssids = request->n_ssids; in mwifiex_cfg80211_scan()
2595 user_scan_cfg->ssid_list = request->ssids; in mwifiex_cfg80211_scan()
2597 if (request->ie && request->ie_len) { in mwifiex_cfg80211_scan()
2600 if (priv->vs_ie[i].mask != MWIFIEX_VSIE_MASK_CLEAR) in mwifiex_cfg80211_scan()
2602 priv->vs_ie[i].mask = MWIFIEX_VSIE_MASK_SCAN; in mwifiex_cfg80211_scan()
2603 ie = (struct ieee_types_header *)(request->ie + offset); in mwifiex_cfg80211_scan()
2604 memcpy(&priv->vs_ie[i].ie, ie, sizeof(*ie) + ie->len); in mwifiex_cfg80211_scan()
2605 offset += sizeof(*ie) + ie->len; in mwifiex_cfg80211_scan()
2607 if (offset >= request->ie_len) in mwifiex_cfg80211_scan()
2612 for (i = 0; i < min_t(u32, request->n_channels, in mwifiex_cfg80211_scan()
2614 chan = request->channels[i]; in mwifiex_cfg80211_scan()
2615 user_scan_cfg->chan_list[i].chan_number = chan->hw_value; in mwifiex_cfg80211_scan()
2616 user_scan_cfg->chan_list[i].radio_type = chan->band; in mwifiex_cfg80211_scan()
2618 if ((chan->flags & IEEE80211_CHAN_NO_IR) || !request->n_ssids) in mwifiex_cfg80211_scan()
2619 user_scan_cfg->chan_list[i].scan_type = in mwifiex_cfg80211_scan()
2622 user_scan_cfg->chan_list[i].scan_type = in mwifiex_cfg80211_scan()
2625 user_scan_cfg->chan_list[i].scan_time = 0; in mwifiex_cfg80211_scan()
2628 if (priv->adapter->scan_chan_gap_enabled && in mwifiex_cfg80211_scan()
2630 user_scan_cfg->scan_chan_gap = in mwifiex_cfg80211_scan()
2631 priv->adapter->scan_chan_gap_time; in mwifiex_cfg80211_scan()
2636 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_scan()
2638 priv->scan_aborting = false; in mwifiex_cfg80211_scan()
2639 priv->scan_request = NULL; in mwifiex_cfg80211_scan()
2643 if (request->ie && request->ie_len) { in mwifiex_cfg80211_scan()
2645 if (priv->vs_ie[i].mask == MWIFIEX_VSIE_MASK_SCAN) { in mwifiex_cfg80211_scan()
2646 priv->vs_ie[i].mask = MWIFIEX_VSIE_MASK_CLEAR; in mwifiex_cfg80211_scan()
2647 memset(&priv->vs_ie[i].ie, 0, in mwifiex_cfg80211_scan()
2664 struct net_device *dev, in mwifiex_cfg80211_sched_scan_start() argument
2667 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_sched_scan_start()
2673 if (!request || (!request->n_ssids && !request->n_match_sets)) { in mwifiex_cfg80211_sched_scan_start()
2676 return -EINVAL; in mwifiex_cfg80211_sched_scan_start()
2680 request->n_ssids, request->n_match_sets); in mwifiex_cfg80211_sched_scan_start()
2682 request->n_channels, request->scan_plans->interval, in mwifiex_cfg80211_sched_scan_start()
2683 (int)request->ie_len); in mwifiex_cfg80211_sched_scan_start()
2687 return -ENOMEM; in mwifiex_cfg80211_sched_scan_start()
2689 if (priv->scan_request || priv->scan_aborting) in mwifiex_cfg80211_sched_scan_start()
2690 bgscan_cfg->start_later = true; in mwifiex_cfg80211_sched_scan_start()
2692 bgscan_cfg->num_ssids = request->n_match_sets; in mwifiex_cfg80211_sched_scan_start()
2693 bgscan_cfg->ssid_list = request->match_sets; in mwifiex_cfg80211_sched_scan_start()
2695 if (request->ie && request->ie_len) { in mwifiex_cfg80211_sched_scan_start()
2698 if (priv->vs_ie[i].mask != MWIFIEX_VSIE_MASK_CLEAR) in mwifiex_cfg80211_sched_scan_start()
2700 priv->vs_ie[i].mask = MWIFIEX_VSIE_MASK_BGSCAN; in mwifiex_cfg80211_sched_scan_start()
2701 ie = (struct ieee_types_header *)(request->ie + offset); in mwifiex_cfg80211_sched_scan_start()
2702 memcpy(&priv->vs_ie[i].ie, ie, sizeof(*ie) + ie->len); in mwifiex_cfg80211_sched_scan_start()
2703 offset += sizeof(*ie) + ie->len; in mwifiex_cfg80211_sched_scan_start()
2705 if (offset >= request->ie_len) in mwifiex_cfg80211_sched_scan_start()
2710 for (i = 0; i < min_t(u32, request->n_channels, in mwifiex_cfg80211_sched_scan_start()
2712 chan = request->channels[i]; in mwifiex_cfg80211_sched_scan_start()
2713 bgscan_cfg->chan_list[i].chan_number = chan->hw_value; in mwifiex_cfg80211_sched_scan_start()
2714 bgscan_cfg->chan_list[i].radio_type = chan->band; in mwifiex_cfg80211_sched_scan_start()
2716 if ((chan->flags & IEEE80211_CHAN_NO_IR) || !request->n_ssids) in mwifiex_cfg80211_sched_scan_start()
2717 bgscan_cfg->chan_list[i].scan_type = in mwifiex_cfg80211_sched_scan_start()
2720 bgscan_cfg->chan_list[i].scan_type = in mwifiex_cfg80211_sched_scan_start()
2723 bgscan_cfg->chan_list[i].scan_time = 0; in mwifiex_cfg80211_sched_scan_start()
2726 bgscan_cfg->chan_per_scan = min_t(u32, request->n_channels, in mwifiex_cfg80211_sched_scan_start()
2730 bgscan_cfg->scan_interval = (request->scan_plans->interval > in mwifiex_cfg80211_sched_scan_start()
2732 request->scan_plans->interval : in mwifiex_cfg80211_sched_scan_start()
2735 bgscan_cfg->repeat_count = MWIFIEX_BGSCAN_REPEAT_COUNT; in mwifiex_cfg80211_sched_scan_start()
2736 bgscan_cfg->report_condition = MWIFIEX_BGSCAN_SSID_MATCH | in mwifiex_cfg80211_sched_scan_start()
2738 bgscan_cfg->bss_type = MWIFIEX_BSS_MODE_INFRA; in mwifiex_cfg80211_sched_scan_start()
2739 bgscan_cfg->action = MWIFIEX_BGSCAN_ACT_SET; in mwifiex_cfg80211_sched_scan_start()
2740 bgscan_cfg->enable = true; in mwifiex_cfg80211_sched_scan_start()
2741 if (request->min_rssi_thold != NL80211_SCAN_RSSI_THOLD_OFF) { in mwifiex_cfg80211_sched_scan_start()
2742 bgscan_cfg->report_condition |= MWIFIEX_BGSCAN_SSID_RSSI_MATCH; in mwifiex_cfg80211_sched_scan_start()
2743 bgscan_cfg->rssi_threshold = request->min_rssi_thold; in mwifiex_cfg80211_sched_scan_start()
2749 return -EFAULT; in mwifiex_cfg80211_sched_scan_start()
2752 priv->sched_scanning = true; in mwifiex_cfg80211_sched_scan_start()
2764 struct net_device *dev, u64 reqid) in mwifiex_cfg80211_sched_scan_stop() argument
2766 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_sched_scan_stop()
2777 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_setup_vht_caps()
2779 vht_info->vht_supported = true; in mwifiex_setup_vht_caps()
2781 vht_info->cap = adapter->hw_dot_11ac_dev_cap; in mwifiex_setup_vht_caps()
2783 vht_info->vht_mcs.rx_mcs_map = cpu_to_le16( in mwifiex_setup_vht_caps()
2784 adapter->hw_dot_11ac_mcs_support & 0xFFFF); in mwifiex_setup_vht_caps()
2785 vht_info->vht_mcs.rx_highest = 0; in mwifiex_setup_vht_caps()
2786 vht_info->vht_mcs.tx_mcs_map = cpu_to_le16( in mwifiex_setup_vht_caps()
2787 adapter->hw_dot_11ac_mcs_support >> 16); in mwifiex_setup_vht_caps()
2788 vht_info->vht_mcs.tx_highest = 0; in mwifiex_setup_vht_caps()
2795 * The following default values are set -
2796 * - HT Supported = True
2797 * - Maximum AMPDU length factor = IEEE80211_HT_MAX_AMPDU_64K
2798 * - Minimum AMPDU spacing = IEEE80211_HT_MPDU_DENSITY_NONE
2799 * - HT Capabilities supported by firmware
2800 * - MCS information, Rx mask = 0xff
2801 * - MCD information, Tx parameters = IEEE80211_HT_MCS_TX_DEFINED (0x01)
2810 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_setup_ht_caps()
2812 ht_info->ht_supported = true; in mwifiex_setup_ht_caps()
2813 ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; in mwifiex_setup_ht_caps()
2814 ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE; in mwifiex_setup_ht_caps()
2816 memset(&ht_info->mcs, 0, sizeof(ht_info->mcs)); in mwifiex_setup_ht_caps()
2819 if (ISSUPP_CHANWIDTH40(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2820 ht_info->cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; in mwifiex_setup_ht_caps()
2822 ht_info->cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; in mwifiex_setup_ht_caps()
2824 if (ISSUPP_SHORTGI20(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2825 ht_info->cap |= IEEE80211_HT_CAP_SGI_20; in mwifiex_setup_ht_caps()
2827 ht_info->cap &= ~IEEE80211_HT_CAP_SGI_20; in mwifiex_setup_ht_caps()
2829 if (ISSUPP_SHORTGI40(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2830 ht_info->cap |= IEEE80211_HT_CAP_SGI_40; in mwifiex_setup_ht_caps()
2832 ht_info->cap &= ~IEEE80211_HT_CAP_SGI_40; in mwifiex_setup_ht_caps()
2834 if (adapter->user_dev_mcs_support == HT_STREAM_2X2) in mwifiex_setup_ht_caps()
2835 ht_info->cap |= 2 << IEEE80211_HT_CAP_RX_STBC_SHIFT; in mwifiex_setup_ht_caps()
2837 ht_info->cap |= 1 << IEEE80211_HT_CAP_RX_STBC_SHIFT; in mwifiex_setup_ht_caps()
2839 if (ISSUPP_TXSTBC(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2840 ht_info->cap |= IEEE80211_HT_CAP_TX_STBC; in mwifiex_setup_ht_caps()
2842 ht_info->cap &= ~IEEE80211_HT_CAP_TX_STBC; in mwifiex_setup_ht_caps()
2844 if (ISSUPP_GREENFIELD(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2845 ht_info->cap |= IEEE80211_HT_CAP_GRN_FLD; in mwifiex_setup_ht_caps()
2847 ht_info->cap &= ~IEEE80211_HT_CAP_GRN_FLD; in mwifiex_setup_ht_caps()
2849 if (ISENABLED_40MHZ_INTOLERANT(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2850 ht_info->cap |= IEEE80211_HT_CAP_40MHZ_INTOLERANT; in mwifiex_setup_ht_caps()
2852 ht_info->cap &= ~IEEE80211_HT_CAP_40MHZ_INTOLERANT; in mwifiex_setup_ht_caps()
2854 if (ISSUPP_RXLDPC(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2855 ht_info->cap |= IEEE80211_HT_CAP_LDPC_CODING; in mwifiex_setup_ht_caps()
2857 ht_info->cap &= ~IEEE80211_HT_CAP_LDPC_CODING; in mwifiex_setup_ht_caps()
2859 ht_info->cap &= ~IEEE80211_HT_CAP_MAX_AMSDU; in mwifiex_setup_ht_caps()
2860 ht_info->cap |= IEEE80211_HT_CAP_SM_PS; in mwifiex_setup_ht_caps()
2862 rx_mcs_supp = GET_RXMCSSUPP(adapter->user_dev_mcs_support); in mwifiex_setup_ht_caps()
2867 sizeof(struct ieee80211_mcs_info) - rx_mcs_supp); in mwifiex_setup_ht_caps()
2868 if (priv->bss_mode == NL80211_IFTYPE_STATION || in mwifiex_setup_ht_caps()
2869 ISSUPP_CHANWIDTH40(adapter->hw_dot_11n_dev_cap)) in mwifiex_setup_ht_caps()
2870 /* Set MCS32 for infra mode or ad-hoc mode with 40MHz support */ in mwifiex_setup_ht_caps()
2873 memcpy((u8 *) &ht_info->mcs, mcs, sizeof(struct ieee80211_mcs_info)); in mwifiex_setup_ht_caps()
2875 ht_info->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; in mwifiex_setup_ht_caps()
2889 struct net_device *dev; in mwifiex_add_virtual_intf() local
2894 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
2900 if (adapter->curr_iface_comb.sta_intf == in mwifiex_add_virtual_intf()
2901 adapter->iface_limit.sta_intf) { in mwifiex_add_virtual_intf()
2904 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
2912 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
2915 priv->wdev.wiphy = wiphy; in mwifiex_add_virtual_intf()
2916 priv->wdev.iftype = NL80211_IFTYPE_STATION; in mwifiex_add_virtual_intf()
2919 priv->bss_mode = NL80211_IFTYPE_STATION; in mwifiex_add_virtual_intf()
2921 priv->bss_mode = type; in mwifiex_add_virtual_intf()
2923 priv->bss_type = MWIFIEX_BSS_TYPE_STA; in mwifiex_add_virtual_intf()
2924 priv->frame_type = MWIFIEX_DATA_FRAME_TYPE_ETH_II; in mwifiex_add_virtual_intf()
2925 priv->bss_priority = 0; in mwifiex_add_virtual_intf()
2926 priv->bss_role = MWIFIEX_BSS_ROLE_STA; in mwifiex_add_virtual_intf()
2930 if (adapter->curr_iface_comb.uap_intf == in mwifiex_add_virtual_intf()
2931 adapter->iface_limit.uap_intf) { in mwifiex_add_virtual_intf()
2934 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
2942 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
2945 priv->wdev.wiphy = wiphy; in mwifiex_add_virtual_intf()
2946 priv->wdev.iftype = NL80211_IFTYPE_AP; in mwifiex_add_virtual_intf()
2948 priv->bss_type = MWIFIEX_BSS_TYPE_UAP; in mwifiex_add_virtual_intf()
2949 priv->frame_type = MWIFIEX_DATA_FRAME_TYPE_ETH_II; in mwifiex_add_virtual_intf()
2950 priv->bss_priority = 0; in mwifiex_add_virtual_intf()
2951 priv->bss_role = MWIFIEX_BSS_ROLE_UAP; in mwifiex_add_virtual_intf()
2952 priv->bss_started = 0; in mwifiex_add_virtual_intf()
2953 priv->bss_mode = type; in mwifiex_add_virtual_intf()
2957 if (adapter->curr_iface_comb.p2p_intf == in mwifiex_add_virtual_intf()
2958 adapter->iface_limit.p2p_intf) { in mwifiex_add_virtual_intf()
2961 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
2969 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
2972 priv->wdev.wiphy = wiphy; in mwifiex_add_virtual_intf()
2973 /* At start-up, wpa_supplicant tries to change the interface in mwifiex_add_virtual_intf()
2976 priv->wdev.iftype = NL80211_IFTYPE_P2P_CLIENT; in mwifiex_add_virtual_intf()
2977 priv->bss_mode = NL80211_IFTYPE_P2P_CLIENT; in mwifiex_add_virtual_intf()
2983 priv->bss_type = MWIFIEX_BSS_TYPE_P2P; in mwifiex_add_virtual_intf()
2985 priv->frame_type = MWIFIEX_DATA_FRAME_TYPE_ETH_II; in mwifiex_add_virtual_intf()
2986 priv->bss_priority = MWIFIEX_BSS_ROLE_STA; in mwifiex_add_virtual_intf()
2987 priv->bss_role = MWIFIEX_BSS_ROLE_STA; in mwifiex_add_virtual_intf()
2988 priv->bss_started = 0; in mwifiex_add_virtual_intf()
2991 memset(&priv->wdev, 0, sizeof(priv->wdev)); in mwifiex_add_virtual_intf()
2992 priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_add_virtual_intf()
2993 return ERR_PTR(-EFAULT); in mwifiex_add_virtual_intf()
2999 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
3002 dev = alloc_netdev_mqs(sizeof(struct mwifiex_private *), name, in mwifiex_add_virtual_intf()
3005 if (!dev) { in mwifiex_add_virtual_intf()
3008 ret = -ENOMEM; in mwifiex_add_virtual_intf()
3012 mwifiex_init_priv_params(priv, dev); in mwifiex_add_virtual_intf()
3014 priv->netdev = dev; in mwifiex_add_virtual_intf()
3016 if (!adapter->mfg_mode) { in mwifiex_add_virtual_intf()
3017 mwifiex_set_mac_address(priv, dev, false, NULL); in mwifiex_add_virtual_intf()
3029 mwifiex_setup_ht_caps(&wiphy->bands[NL80211_BAND_2GHZ]->ht_cap, priv); in mwifiex_add_virtual_intf()
3030 if (adapter->is_hw_11ac_capable) in mwifiex_add_virtual_intf()
3032 &wiphy->bands[NL80211_BAND_2GHZ]->vht_cap, priv); in mwifiex_add_virtual_intf()
3034 if (adapter->config_bands & BAND_A) in mwifiex_add_virtual_intf()
3036 &wiphy->bands[NL80211_BAND_5GHZ]->ht_cap, priv); in mwifiex_add_virtual_intf()
3038 if ((adapter->config_bands & BAND_A) && adapter->is_hw_11ac_capable) in mwifiex_add_virtual_intf()
3040 &wiphy->bands[NL80211_BAND_5GHZ]->vht_cap, priv); in mwifiex_add_virtual_intf()
3042 dev_net_set(dev, wiphy_net(wiphy)); in mwifiex_add_virtual_intf()
3043 dev->ieee80211_ptr = &priv->wdev; in mwifiex_add_virtual_intf()
3044 dev->ieee80211_ptr->iftype = priv->bss_mode; in mwifiex_add_virtual_intf()
3045 SET_NETDEV_DEV(dev, wiphy_dev(wiphy)); in mwifiex_add_virtual_intf()
3047 dev->flags |= IFF_BROADCAST | IFF_MULTICAST; in mwifiex_add_virtual_intf()
3048 dev->watchdog_timeo = MWIFIEX_DEFAULT_WATCHDOG_TIMEOUT; in mwifiex_add_virtual_intf()
3049 dev->needed_headroom = MWIFIEX_MIN_DATA_HEADER_LEN; in mwifiex_add_virtual_intf()
3050 dev->ethtool_ops = &mwifiex_ethtool_ops; in mwifiex_add_virtual_intf()
3052 mdev_priv = netdev_priv(dev); in mwifiex_add_virtual_intf()
3055 SET_NETDEV_DEV(dev, adapter->dev); in mwifiex_add_virtual_intf()
3057 priv->dfs_cac_workqueue = alloc_workqueue("MWIFIEX_DFS_CAC%s", in mwifiex_add_virtual_intf()
3061 if (!priv->dfs_cac_workqueue) { in mwifiex_add_virtual_intf()
3063 ret = -ENOMEM; in mwifiex_add_virtual_intf()
3067 INIT_DELAYED_WORK(&priv->dfs_cac_work, mwifiex_dfs_cac_work_queue); in mwifiex_add_virtual_intf()
3069 priv->dfs_chan_sw_workqueue = alloc_workqueue("MWIFIEX_DFS_CHSW%s", in mwifiex_add_virtual_intf()
3072 if (!priv->dfs_chan_sw_workqueue) { in mwifiex_add_virtual_intf()
3074 ret = -ENOMEM; in mwifiex_add_virtual_intf()
3078 INIT_DELAYED_WORK(&priv->dfs_chan_sw_work, in mwifiex_add_virtual_intf()
3081 mutex_init(&priv->async_mutex); in mwifiex_add_virtual_intf()
3084 if (register_netdevice(dev)) { in mwifiex_add_virtual_intf()
3086 ret = -EFAULT; in mwifiex_add_virtual_intf()
3091 "info: %s: Marvell 802.11 Adapter\n", dev->name); in mwifiex_add_virtual_intf()
3101 adapter->curr_iface_comb.sta_intf++; in mwifiex_add_virtual_intf()
3104 adapter->curr_iface_comb.uap_intf++; in mwifiex_add_virtual_intf()
3107 adapter->curr_iface_comb.p2p_intf++; in mwifiex_add_virtual_intf()
3112 return ERR_PTR(-EINVAL); in mwifiex_add_virtual_intf()
3115 return &priv->wdev; in mwifiex_add_virtual_intf()
3118 destroy_workqueue(priv->dfs_chan_sw_workqueue); in mwifiex_add_virtual_intf()
3119 priv->dfs_chan_sw_workqueue = NULL; in mwifiex_add_virtual_intf()
3121 destroy_workqueue(priv->dfs_cac_workqueue); in mwifiex_add_virtual_intf()
3122 priv->dfs_cac_workqueue = NULL; in mwifiex_add_virtual_intf()
3124 free_netdev(dev); in mwifiex_add_virtual_intf()
3125 priv->netdev = NULL; in mwifiex_add_virtual_intf()
3129 memset(&priv->wdev, 0, sizeof(priv->wdev)); in mwifiex_add_virtual_intf()
3130 priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_add_virtual_intf()
3131 priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_add_virtual_intf()
3137 * del_virtual_intf: remove the virtual interface determined by dev
3141 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_del_virtual_intf()
3142 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_del_virtual_intf()
3149 if (priv->sched_scanning) in mwifiex_del_virtual_intf()
3150 priv->sched_scanning = false; in mwifiex_del_virtual_intf()
3152 mwifiex_stop_net_dev_queue(priv->netdev, adapter); in mwifiex_del_virtual_intf()
3154 skb_queue_walk_safe(&priv->bypass_txq, skb, tmp) { in mwifiex_del_virtual_intf()
3155 skb_unlink(skb, &priv->bypass_txq); in mwifiex_del_virtual_intf()
3156 mwifiex_write_data_complete(priv->adapter, skb, 0, -1); in mwifiex_del_virtual_intf()
3159 if (netif_carrier_ok(priv->netdev)) in mwifiex_del_virtual_intf()
3160 netif_carrier_off(priv->netdev); in mwifiex_del_virtual_intf()
3162 if (wdev->netdev->reg_state == NETREG_REGISTERED) in mwifiex_del_virtual_intf()
3163 unregister_netdevice(wdev->netdev); in mwifiex_del_virtual_intf()
3165 if (priv->dfs_cac_workqueue) { in mwifiex_del_virtual_intf()
3166 flush_workqueue(priv->dfs_cac_workqueue); in mwifiex_del_virtual_intf()
3167 destroy_workqueue(priv->dfs_cac_workqueue); in mwifiex_del_virtual_intf()
3168 priv->dfs_cac_workqueue = NULL; in mwifiex_del_virtual_intf()
3171 if (priv->dfs_chan_sw_workqueue) { in mwifiex_del_virtual_intf()
3172 flush_workqueue(priv->dfs_chan_sw_workqueue); in mwifiex_del_virtual_intf()
3173 destroy_workqueue(priv->dfs_chan_sw_workqueue); in mwifiex_del_virtual_intf()
3174 priv->dfs_chan_sw_workqueue = NULL; in mwifiex_del_virtual_intf()
3177 priv->netdev = NULL; in mwifiex_del_virtual_intf()
3179 switch (priv->bss_mode) { in mwifiex_del_virtual_intf()
3183 adapter->curr_iface_comb.sta_intf--; in mwifiex_del_virtual_intf()
3186 adapter->curr_iface_comb.uap_intf--; in mwifiex_del_virtual_intf()
3190 adapter->curr_iface_comb.p2p_intf--; in mwifiex_del_virtual_intf()
3198 priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED; in mwifiex_del_virtual_intf()
3202 kfree(priv->hist_data); in mwifiex_del_virtual_intf()
3215 for (j = 0; j < DIV_ROUND_UP(pat->pattern_len, 8); j++) { in mwifiex_is_pattern_supported()
3217 if (pat->mask[j] & 1 << k) { in mwifiex_is_pattern_supported()
3219 &pat->pattern[j * 8 + k], 1); in mwifiex_is_pattern_supported()
3232 pat->pkt_offset++; in mwifiex_is_pattern_supported()
3252 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_set_auto_arp_mef_entry()
3254 mef_entry->mode = MEF_MODE_HOST_SLEEP; in mwifiex_set_auto_arp_mef_entry()
3255 mef_entry->action = MEF_ACTION_AUTO_ARP; in mwifiex_set_auto_arp_mef_entry()
3260 if (adapter->priv[i]->netdev) { in mwifiex_set_auto_arp_mef_entry()
3261 in_dev = __in_dev_get_rtnl(adapter->priv[i]->netdev); in mwifiex_set_auto_arp_mef_entry()
3264 ifa = rtnl_dereference(in_dev->ifa_list); in mwifiex_set_auto_arp_mef_entry()
3265 if (!ifa || !ifa->ifa_local) in mwifiex_set_auto_arp_mef_entry()
3267 ips[i] = ifa->ifa_local; in mwifiex_set_auto_arp_mef_entry()
3275 mef_entry->filter[filt_num].repeat = 1; in mwifiex_set_auto_arp_mef_entry()
3276 memcpy(mef_entry->filter[filt_num].byte_seq, in mwifiex_set_auto_arp_mef_entry()
3278 mef_entry->filter[filt_num]. in mwifiex_set_auto_arp_mef_entry()
3281 mef_entry->filter[filt_num].offset = 46; in mwifiex_set_auto_arp_mef_entry()
3282 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_auto_arp_mef_entry()
3284 mef_entry->filter[filt_num].filt_action = in mwifiex_set_auto_arp_mef_entry()
3290 mef_entry->filter[filt_num].repeat = 1; in mwifiex_set_auto_arp_mef_entry()
3291 mef_entry->filter[filt_num].byte_seq[0] = 0x08; in mwifiex_set_auto_arp_mef_entry()
3292 mef_entry->filter[filt_num].byte_seq[1] = 0x06; in mwifiex_set_auto_arp_mef_entry()
3293 mef_entry->filter[filt_num].byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] = 2; in mwifiex_set_auto_arp_mef_entry()
3294 mef_entry->filter[filt_num].offset = 20; in mwifiex_set_auto_arp_mef_entry()
3295 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_auto_arp_mef_entry()
3296 mef_entry->filter[filt_num].filt_action = TYPE_AND; in mwifiex_set_auto_arp_mef_entry()
3310 mef_entry->mode = MEF_MODE_HOST_SLEEP; in mwifiex_set_wowlan_mef_entry()
3311 mef_entry->action = MEF_ACTION_ALLOW_AND_WAKEUP_HOST; in mwifiex_set_wowlan_mef_entry()
3313 for (i = 0; i < wowlan->n_patterns; i++) { in mwifiex_set_wowlan_mef_entry()
3315 if (!mwifiex_is_pattern_supported(&wowlan->patterns[i], in mwifiex_set_wowlan_mef_entry()
3318 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_set_wowlan_mef_entry()
3320 return -EOPNOTSUPP; in mwifiex_set_wowlan_mef_entry()
3323 if (!wowlan->patterns[i].pkt_offset) { in mwifiex_set_wowlan_mef_entry()
3326 mef_cfg->criteria |= MWIFIEX_CRITERIA_UNICAST; in mwifiex_set_wowlan_mef_entry()
3329 mef_cfg->criteria |= MWIFIEX_CRITERIA_BROADCAST; in mwifiex_set_wowlan_mef_entry()
3335 mef_cfg->criteria |= MWIFIEX_CRITERIA_MULTICAST; in mwifiex_set_wowlan_mef_entry()
3339 mef_entry->filter[filt_num].repeat = 1; in mwifiex_set_wowlan_mef_entry()
3340 mef_entry->filter[filt_num].offset = in mwifiex_set_wowlan_mef_entry()
3341 wowlan->patterns[i].pkt_offset; in mwifiex_set_wowlan_mef_entry()
3342 memcpy(mef_entry->filter[filt_num].byte_seq, byte_seq, in mwifiex_set_wowlan_mef_entry()
3344 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_wowlan_mef_entry()
3348 mwifiex_dbg(priv->adapter, INFO, "Wake on patterns\n"); in mwifiex_set_wowlan_mef_entry()
3350 mef_entry->filter[filt_num].filt_action = TYPE_AND; in mwifiex_set_wowlan_mef_entry()
3356 if (wowlan->magic_pkt) { in mwifiex_set_wowlan_mef_entry()
3357 mef_cfg->criteria |= MWIFIEX_CRITERIA_UNICAST; in mwifiex_set_wowlan_mef_entry()
3358 mef_entry->filter[filt_num].repeat = 16; in mwifiex_set_wowlan_mef_entry()
3359 memcpy(mef_entry->filter[filt_num].byte_seq, priv->curr_addr, in mwifiex_set_wowlan_mef_entry()
3361 mef_entry->filter[filt_num].byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] = in mwifiex_set_wowlan_mef_entry()
3363 mef_entry->filter[filt_num].offset = 28; in mwifiex_set_wowlan_mef_entry()
3364 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_wowlan_mef_entry()
3366 mef_entry->filter[filt_num].filt_action = TYPE_OR; in mwifiex_set_wowlan_mef_entry()
3369 mef_entry->filter[filt_num].repeat = 16; in mwifiex_set_wowlan_mef_entry()
3370 memcpy(mef_entry->filter[filt_num].byte_seq, priv->curr_addr, in mwifiex_set_wowlan_mef_entry()
3372 mef_entry->filter[filt_num].byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] = in mwifiex_set_wowlan_mef_entry()
3374 mef_entry->filter[filt_num].offset = 56; in mwifiex_set_wowlan_mef_entry()
3375 mef_entry->filter[filt_num].filt_type = TYPE_EQ; in mwifiex_set_wowlan_mef_entry()
3376 mef_entry->filter[filt_num].filt_action = TYPE_OR; in mwifiex_set_wowlan_mef_entry()
3377 mwifiex_dbg(priv->adapter, INFO, "Wake on magic packet\n"); in mwifiex_set_wowlan_mef_entry()
3389 if (wowlan->n_patterns || wowlan->magic_pkt) in mwifiex_set_mef_filter()
3394 return -ENOMEM; in mwifiex_set_mef_filter()
3404 if (wowlan->n_patterns || wowlan->magic_pkt) { in mwifiex_set_mef_filter()
3435 sta_priv->scan_aborting = true; in mwifiex_cfg80211_suspend()
3436 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_cfg80211_suspend()
3437 priv = adapter->priv[i]; in mwifiex_cfg80211_suspend()
3443 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_cfg80211_suspend()
3444 priv = adapter->priv[i]; in mwifiex_cfg80211_suspend()
3445 if (priv && priv->netdev) in mwifiex_cfg80211_suspend()
3446 netif_device_detach(priv->netdev); in mwifiex_cfg80211_suspend()
3452 !skb_queue_empty(&adapter->tx_data_q)) in mwifiex_cfg80211_suspend()
3465 if (!sta_priv->media_connected && !wowlan->nd_config) { in mwifiex_cfg80211_suspend()
3479 hs_cfg.conditions = le32_to_cpu(adapter->hs_cfg.conditions); in mwifiex_cfg80211_suspend()
3481 if (wowlan->nd_config) { in mwifiex_cfg80211_suspend()
3484 mwifiex_cfg80211_sched_scan_start(wiphy, sta_priv->netdev, in mwifiex_cfg80211_suspend()
3485 wowlan->nd_config); in mwifiex_cfg80211_suspend()
3488 if (wowlan->disconnect) { in mwifiex_cfg80211_suspend()
3490 mwifiex_dbg(sta_priv->adapter, INFO, "Wake on device disconnect\n"); in mwifiex_cfg80211_suspend()
3494 hs_cfg.gpio = adapter->hs_cfg.gpio; in mwifiex_cfg80211_suspend()
3495 hs_cfg.gap = adapter->hs_cfg.gap; in mwifiex_cfg80211_suspend()
3502 sta_priv->scan_aborting = false; in mwifiex_cfg80211_suspend()
3515 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_cfg80211_resume()
3516 priv = adapter->priv[i]; in mwifiex_cfg80211_resume()
3517 if (priv && priv->netdev) in mwifiex_cfg80211_resume()
3518 netif_device_attach(priv->netdev); in mwifiex_cfg80211_resume()
3521 if (!wiphy->wowlan_config) in mwifiex_cfg80211_resume()
3529 wakeup_report.pattern_idx = -1; in mwifiex_cfg80211_resume()
3543 if (wiphy->wowlan_config->disconnect) in mwifiex_cfg80211_resume()
3545 if (wiphy->wowlan_config->nd_config) in mwifiex_cfg80211_resume()
3546 wakeup_report.net_detect = adapter->nd_info; in mwifiex_cfg80211_resume()
3551 if (wiphy->wowlan_config->magic_pkt) in mwifiex_cfg80211_resume()
3553 if (wiphy->wowlan_config->n_patterns) in mwifiex_cfg80211_resume()
3557 if (wiphy->wowlan_config->gtk_rekey_failure) in mwifiex_cfg80211_resume()
3566 cfg80211_report_wowlan_wakeup(&priv->wdev, &wakeup_report, in mwifiex_cfg80211_resume()
3570 if (adapter->nd_info) { in mwifiex_cfg80211_resume()
3571 for (i = 0 ; i < adapter->nd_info->n_matches ; i++) in mwifiex_cfg80211_resume()
3572 kfree(adapter->nd_info->matches[i]); in mwifiex_cfg80211_resume()
3573 kfree(adapter->nd_info); in mwifiex_cfg80211_resume()
3574 adapter->nd_info = NULL; in mwifiex_cfg80211_resume()
3585 device_set_wakeup_enable(adapter->dev, enabled); in mwifiex_cfg80211_set_wakeup()
3588 static int mwifiex_set_rekey_data(struct wiphy *wiphy, struct net_device *dev, in mwifiex_set_rekey_data() argument
3591 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_set_rekey_data()
3593 if (!ISSUPP_FIRMWARE_SUPPLICANT(priv->adapter->fw_cap_info)) in mwifiex_set_rekey_data()
3594 return -EOPNOTSUPP; in mwifiex_set_rekey_data()
3631 mrule->max_coalescing_delay = crule->delay; in mwifiex_fill_coalesce_rule_info()
3633 param = mrule->params; in mwifiex_fill_coalesce_rule_info()
3635 for (i = 0; i < crule->n_patterns; i++) { in mwifiex_fill_coalesce_rule_info()
3637 if (!mwifiex_is_pattern_supported(&crule->patterns[i], in mwifiex_fill_coalesce_rule_info()
3640 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_fill_coalesce_rule_info()
3642 return -EOPNOTSUPP; in mwifiex_fill_coalesce_rule_info()
3645 if (!crule->patterns[i].pkt_offset) { in mwifiex_fill_coalesce_rule_info()
3649 if (pkt_type && mrule->pkt_type) { in mwifiex_fill_coalesce_rule_info()
3650 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_fill_coalesce_rule_info()
3652 return -EOPNOTSUPP; in mwifiex_fill_coalesce_rule_info()
3654 mrule->pkt_type = pkt_type; in mwifiex_fill_coalesce_rule_info()
3659 if (crule->condition == NL80211_COALESCE_CONDITION_MATCH) in mwifiex_fill_coalesce_rule_info()
3660 param->operation = RECV_FILTER_MATCH_TYPE_EQ; in mwifiex_fill_coalesce_rule_info()
3662 param->operation = RECV_FILTER_MATCH_TYPE_NE; in mwifiex_fill_coalesce_rule_info()
3664 param->operand_len = byte_seq[MWIFIEX_COALESCE_MAX_BYTESEQ]; in mwifiex_fill_coalesce_rule_info()
3665 memcpy(param->operand_byte_stream, byte_seq, in mwifiex_fill_coalesce_rule_info()
3666 param->operand_len); in mwifiex_fill_coalesce_rule_info()
3667 param->offset = crule->patterns[i].pkt_offset; in mwifiex_fill_coalesce_rule_info()
3670 mrule->num_of_fields++; in mwifiex_fill_coalesce_rule_info()
3673 if (!mrule->pkt_type) { in mwifiex_fill_coalesce_rule_info()
3674 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_fill_coalesce_rule_info()
3676 return -EOPNOTSUPP; in mwifiex_fill_coalesce_rule_info()
3700 coalesce_cfg.num_of_rules = coalesce->n_rules; in mwifiex_cfg80211_set_coalesce()
3701 for (i = 0; i < coalesce->n_rules; i++) { in mwifiex_cfg80211_set_coalesce()
3702 ret = mwifiex_fill_coalesce_rule_info(priv, &coalesce->rules[i], in mwifiex_cfg80211_set_coalesce()
3720 mwifiex_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_tdls_mgmt() argument
3726 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_tdls_mgmt()
3729 if (!(wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS)) in mwifiex_cfg80211_tdls_mgmt()
3730 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_mgmt()
3733 if (!(priv->bss_type == MWIFIEX_BSS_TYPE_STA && priv->media_connected)) in mwifiex_cfg80211_tdls_mgmt()
3734 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_mgmt()
3738 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3748 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3756 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3764 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_mgmt()
3771 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, ERROR, in mwifiex_cfg80211_tdls_mgmt()
3787 ret = -EINVAL; in mwifiex_cfg80211_tdls_mgmt()
3795 mwifiex_cfg80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_tdls_oper() argument
3798 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_tdls_oper()
3800 if (!(wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) || in mwifiex_cfg80211_tdls_oper()
3801 !(wiphy->flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) in mwifiex_cfg80211_tdls_oper()
3802 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_oper()
3805 if (!(priv->bss_type == MWIFIEX_BSS_TYPE_STA && priv->media_connected)) in mwifiex_cfg80211_tdls_oper()
3806 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_oper()
3808 mwifiex_dbg(priv->adapter, MSG, in mwifiex_cfg80211_tdls_oper()
3820 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_oper()
3822 return -EINVAL; in mwifiex_cfg80211_tdls_oper()
3825 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_oper()
3827 return -EINVAL; in mwifiex_cfg80211_tdls_oper()
3830 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_oper()
3832 return -EINVAL; in mwifiex_cfg80211_tdls_oper()
3834 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_tdls_oper()
3836 return -EOPNOTSUPP; in mwifiex_cfg80211_tdls_oper()
3843 mwifiex_cfg80211_tdls_chan_switch(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_tdls_chan_switch() argument
3850 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_tdls_chan_switch()
3852 spin_lock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3855 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3858 return -ENOENT; in mwifiex_cfg80211_tdls_chan_switch()
3861 if (!(sta_ptr->tdls_cap.extcap.ext_capab[3] & in mwifiex_cfg80211_tdls_chan_switch()
3863 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3864 wiphy_err(wiphy, "%pM do not support tdls cs\n", addr); in mwifiex_cfg80211_tdls_chan_switch()
3865 return -ENOENT; in mwifiex_cfg80211_tdls_chan_switch()
3868 if (sta_ptr->tdls_status == TDLS_CHAN_SWITCHING || in mwifiex_cfg80211_tdls_chan_switch()
3869 sta_ptr->tdls_status == TDLS_IN_OFF_CHAN) { in mwifiex_cfg80211_tdls_chan_switch()
3870 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3872 return -EALREADY; in mwifiex_cfg80211_tdls_chan_switch()
3874 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_chan_switch()
3876 chan = chandef->chan->hw_value; in mwifiex_cfg80211_tdls_chan_switch()
3878 band = chandef->chan->band; in mwifiex_cfg80211_tdls_chan_switch()
3886 struct net_device *dev, in mwifiex_cfg80211_tdls_cancel_chan_switch() argument
3890 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3892 spin_lock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3895 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3898 } else if (!(sta_ptr->tdls_status == TDLS_CHAN_SWITCHING || in mwifiex_cfg80211_tdls_cancel_chan_switch()
3899 sta_ptr->tdls_status == TDLS_IN_BASE_CHAN || in mwifiex_cfg80211_tdls_cancel_chan_switch()
3900 sta_ptr->tdls_status == TDLS_IN_OFF_CHAN)) { in mwifiex_cfg80211_tdls_cancel_chan_switch()
3901 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3905 spin_unlock_bh(&priv->sta_list_spinlock); in mwifiex_cfg80211_tdls_cancel_chan_switch()
3911 mwifiex_cfg80211_add_station(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_add_station() argument
3914 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_add_station()
3916 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in mwifiex_cfg80211_add_station()
3917 return -EOPNOTSUPP; in mwifiex_cfg80211_add_station()
3920 if ((priv->bss_type != MWIFIEX_BSS_TYPE_STA) || !priv->media_connected) in mwifiex_cfg80211_add_station()
3921 return -EOPNOTSUPP; in mwifiex_cfg80211_add_station()
3927 mwifiex_cfg80211_channel_switch(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_channel_switch() argument
3933 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_channel_switch()
3935 if (priv->adapter->scan_processing) { in mwifiex_cfg80211_channel_switch()
3936 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_channel_switch()
3938 return -EBUSY; in mwifiex_cfg80211_channel_switch()
3941 if (priv->wdev.cac_started) in mwifiex_cfg80211_channel_switch()
3942 return -EBUSY; in mwifiex_cfg80211_channel_switch()
3944 if (cfg80211_chandef_identical(&params->chandef, in mwifiex_cfg80211_channel_switch()
3945 &priv->dfs_chandef)) in mwifiex_cfg80211_channel_switch()
3946 return -EINVAL; in mwifiex_cfg80211_channel_switch()
3949 params->beacon_csa.tail, in mwifiex_cfg80211_channel_switch()
3950 params->beacon_csa.tail_len); in mwifiex_cfg80211_channel_switch()
3952 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_channel_switch()
3954 return -EINVAL; in mwifiex_cfg80211_channel_switch()
3958 if (channel_sw->mode) { in mwifiex_cfg80211_channel_switch()
3959 if (netif_carrier_ok(priv->netdev)) in mwifiex_cfg80211_channel_switch()
3960 netif_carrier_off(priv->netdev); in mwifiex_cfg80211_channel_switch()
3961 mwifiex_stop_net_dev_queue(priv->netdev, priv->adapter); in mwifiex_cfg80211_channel_switch()
3965 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_channel_switch()
3968 if (mwifiex_set_mgmt_ies(priv, &params->beacon_csa)) { in mwifiex_cfg80211_channel_switch()
3969 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_channel_switch()
3971 return -EFAULT; in mwifiex_cfg80211_channel_switch()
3974 memcpy(&priv->dfs_chandef, &params->chandef, sizeof(priv->dfs_chandef)); in mwifiex_cfg80211_channel_switch()
3975 memcpy(&priv->beacon_after, &params->beacon_after, in mwifiex_cfg80211_channel_switch()
3976 sizeof(priv->beacon_after)); in mwifiex_cfg80211_channel_switch()
3978 chsw_msec = max(channel_sw->count * priv->bss_cfg.beacon_period, 100); in mwifiex_cfg80211_channel_switch()
3979 queue_delayed_work(priv->dfs_chan_sw_workqueue, &priv->dfs_chan_sw_work, in mwifiex_cfg80211_channel_switch()
3988 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_cfg80211_get_channel()
3994 int ret = -ENODATA; in mwifiex_cfg80211_get_channel()
3997 cfg80211_chandef_valid(&priv->bss_chandef)) { in mwifiex_cfg80211_get_channel()
3998 *chandef = priv->bss_chandef; in mwifiex_cfg80211_get_channel()
4000 } else if (priv->media_connected) { in mwifiex_cfg80211_get_channel()
4001 curr_bss = &priv->curr_bss_params.bss_descriptor; in mwifiex_cfg80211_get_channel()
4002 band = mwifiex_band_to_radio_type(priv->curr_bss_params.band); in mwifiex_cfg80211_get_channel()
4003 freq = ieee80211_channel_to_frequency(curr_bss->channel, band); in mwifiex_cfg80211_get_channel()
4006 if (priv->ht_param_present) { in mwifiex_cfg80211_get_channel()
4028 MWIFIEX_TM_ATTR_MAX = __MWIFIEX_TM_ATTR_AFTER_LAST - 1,
4044 struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); in mwifiex_tm_cmd()
4051 return -EINVAL; in mwifiex_tm_cmd()
4059 return -EINVAL; in mwifiex_tm_cmd()
4064 return -EINVAL; in mwifiex_tm_cmd()
4068 return -ENOMEM; in mwifiex_tm_cmd()
4070 hostcmd->len = nla_len(tb[MWIFIEX_TM_ATTR_DATA]); in mwifiex_tm_cmd()
4071 memcpy(hostcmd->cmd, nla_data(tb[MWIFIEX_TM_ATTR_DATA]), in mwifiex_tm_cmd()
4072 hostcmd->len); in mwifiex_tm_cmd()
4075 dev_err(priv->adapter->dev, "Failed to process hostcmd\n"); in mwifiex_tm_cmd()
4077 return -EFAULT; in mwifiex_tm_cmd()
4081 skb = cfg80211_testmode_alloc_reply_skb(wiphy, hostcmd->len); in mwifiex_tm_cmd()
4084 return -ENOMEM; in mwifiex_tm_cmd()
4087 hostcmd->len, hostcmd->cmd); in mwifiex_tm_cmd()
4091 return -EMSGSIZE; in mwifiex_tm_cmd()
4098 return -EOPNOTSUPP; in mwifiex_tm_cmd()
4105 struct net_device *dev, in mwifiex_cfg80211_start_radar_detection() argument
4109 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_start_radar_detection()
4112 if (priv->adapter->scan_processing) { in mwifiex_cfg80211_start_radar_detection()
4113 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_radar_detection()
4115 return -EBUSY; in mwifiex_cfg80211_start_radar_detection()
4119 mwifiex_dbg(priv->adapter, INFO, in mwifiex_cfg80211_start_radar_detection()
4122 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_cfg80211_start_radar_detection()
4124 return -1; in mwifiex_cfg80211_start_radar_detection()
4126 priv->state_11h.is_11h_active = true; in mwifiex_cfg80211_start_radar_detection()
4133 memcpy(&priv->dfs_chandef, chandef, sizeof(priv->dfs_chandef)); in mwifiex_cfg80211_start_radar_detection()
4137 return -1; in mwifiex_cfg80211_start_radar_detection()
4139 queue_delayed_work(priv->dfs_cac_workqueue, &priv->dfs_cac_work, in mwifiex_cfg80211_start_radar_detection()
4145 mwifiex_cfg80211_change_station(struct wiphy *wiphy, struct net_device *dev, in mwifiex_cfg80211_change_station() argument
4150 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); in mwifiex_cfg80211_change_station()
4153 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in mwifiex_cfg80211_change_station()
4154 return -EOPNOTSUPP; in mwifiex_cfg80211_change_station()
4157 if ((priv->bss_type != MWIFIEX_BSS_TYPE_STA) || !priv->media_connected) in mwifiex_cfg80211_change_station()
4158 return -EOPNOTSUPP; in mwifiex_cfg80211_change_station()
4160 priv->sta_params = params; in mwifiex_cfg80211_change_station()
4163 priv->sta_params = NULL; in mwifiex_cfg80211_change_station()
4272 if (adapter->config_bands & BAND_A) in mwifiex_init_channel_scan_gap()
4278 adapter->num_in_chan_stats = 2 * (n_channels_bg + n_channels_a); in mwifiex_init_channel_scan_gap()
4279 adapter->chan_stats = vmalloc(array_size(sizeof(*adapter->chan_stats), in mwifiex_init_channel_scan_gap()
4280 adapter->num_in_chan_stats)); in mwifiex_init_channel_scan_gap()
4282 if (!adapter->chan_stats) in mwifiex_init_channel_scan_gap()
4283 return -ENOMEM; in mwifiex_init_channel_scan_gap()
4301 struct mwifiex_private *priv = adapter->priv[MWIFIEX_BSS_TYPE_STA]; in mwifiex_register_cfg80211()
4311 return -ENOMEM; in mwifiex_register_cfg80211()
4313 wiphy->max_scan_ssids = MWIFIEX_MAX_SSID_LIST_LENGTH; in mwifiex_register_cfg80211()
4314 wiphy->max_scan_ie_len = MWIFIEX_MAX_VSIE_LEN; in mwifiex_register_cfg80211()
4315 wiphy->mgmt_stypes = mwifiex_mgmt_stypes; in mwifiex_register_cfg80211()
4316 wiphy->max_remain_on_channel_duration = 5000; in mwifiex_register_cfg80211()
4317 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | in mwifiex_register_cfg80211()
4322 if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4323 wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC); in mwifiex_register_cfg80211()
4325 wiphy->bands[NL80211_BAND_2GHZ] = &mwifiex_band_2ghz; in mwifiex_register_cfg80211()
4326 if (adapter->config_bands & BAND_A) in mwifiex_register_cfg80211()
4327 wiphy->bands[NL80211_BAND_5GHZ] = &mwifiex_band_5ghz; in mwifiex_register_cfg80211()
4329 wiphy->bands[NL80211_BAND_5GHZ] = NULL; in mwifiex_register_cfg80211()
4331 if (adapter->drcs_enabled && ISSUPP_DRCS_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4332 wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta_drcs; in mwifiex_register_cfg80211()
4333 else if (adapter->is_hw_11ac_capable) in mwifiex_register_cfg80211()
4334 wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta_vht; in mwifiex_register_cfg80211()
4336 wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta; in mwifiex_register_cfg80211()
4337 wiphy->n_iface_combinations = 1; in mwifiex_register_cfg80211()
4339 if (adapter->max_sta_conn > adapter->max_p2p_conn) in mwifiex_register_cfg80211()
4340 wiphy->max_ap_assoc_sta = adapter->max_sta_conn; in mwifiex_register_cfg80211()
4342 wiphy->max_ap_assoc_sta = adapter->max_p2p_conn; in mwifiex_register_cfg80211()
4345 wiphy->cipher_suites = mwifiex_cipher_suites; in mwifiex_register_cfg80211()
4346 wiphy->n_cipher_suites = ARRAY_SIZE(mwifiex_cipher_suites); in mwifiex_register_cfg80211()
4348 if (adapter->regd) { in mwifiex_register_cfg80211()
4349 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG | in mwifiex_register_cfg80211()
4352 wiphy_apply_custom_regulatory(wiphy, adapter->regd); in mwifiex_register_cfg80211()
4355 ether_addr_copy(wiphy->perm_addr, adapter->perm_addr); in mwifiex_register_cfg80211()
4356 wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; in mwifiex_register_cfg80211()
4357 wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME | in mwifiex_register_cfg80211()
4364 if (ISSUPP_TDLS_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4365 wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS | in mwifiex_register_cfg80211()
4369 if (ISSUPP_FIRMWARE_SUPPLICANT(priv->adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4370 wiphy->wowlan = &mwifiex_wowlan_support; in mwifiex_register_cfg80211()
4372 wiphy->wowlan = &mwifiex_wowlan_support_no_gtk; in mwifiex_register_cfg80211()
4375 wiphy->coalesce = &mwifiex_coalesce_support; in mwifiex_register_cfg80211()
4377 wiphy->probe_resp_offload = NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS | in mwifiex_register_cfg80211()
4381 wiphy->max_sched_scan_reqs = 1; in mwifiex_register_cfg80211()
4382 wiphy->max_sched_scan_ssids = MWIFIEX_MAX_SSID_LIST_LENGTH; in mwifiex_register_cfg80211()
4383 wiphy->max_sched_scan_ie_len = MWIFIEX_MAX_VSIE_LEN; in mwifiex_register_cfg80211()
4384 wiphy->max_match_sets = MWIFIEX_MAX_SSID_LIST_LENGTH; in mwifiex_register_cfg80211()
4386 wiphy->available_antennas_tx = BIT(adapter->number_of_antenna) - 1; in mwifiex_register_cfg80211()
4387 wiphy->available_antennas_rx = BIT(adapter->number_of_antenna) - 1; in mwifiex_register_cfg80211()
4389 wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER | in mwifiex_register_cfg80211()
4393 if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4394 wiphy->features |= NL80211_FEATURE_HT_IBSS; in mwifiex_register_cfg80211()
4396 if (ISSUPP_RANDOM_MAC(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4397 wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR | in mwifiex_register_cfg80211()
4401 if (ISSUPP_TDLS_ENABLED(adapter->fw_cap_info)) in mwifiex_register_cfg80211()
4402 wiphy->features |= NL80211_FEATURE_TDLS_CHANNEL_SWITCH; in mwifiex_register_cfg80211()
4404 if (adapter->fw_api_ver == MWIFIEX_FW_V15) in mwifiex_register_cfg80211()
4405 wiphy->features |= NL80211_FEATURE_SK_TX_STATUS; in mwifiex_register_cfg80211()
4408 wiphy->bss_priv_size = sizeof(struct mwifiex_bss_priv); in mwifiex_register_cfg80211()
4410 wiphy->reg_notifier = mwifiex_reg_notifier; in mwifiex_register_cfg80211()
4416 set_wiphy_dev(wiphy, priv->adapter->dev); in mwifiex_register_cfg80211()
4426 if (!adapter->regd) { in mwifiex_register_cfg80211()
4432 if (adapter->region_code == 0x00) { in mwifiex_register_cfg80211()
4436 wiphy->regulatory_flags |= in mwifiex_register_cfg80211()
4441 adapter->region_code); in mwifiex_register_cfg80211()
4444 mwifiex_dbg(priv->adapter, ERROR, in mwifiex_register_cfg80211()
4452 wiphy->frag_threshold = thr; in mwifiex_register_cfg80211()
4455 wiphy->rts_threshold = thr; in mwifiex_register_cfg80211()
4458 wiphy->retry_short = (u8) retry; in mwifiex_register_cfg80211()
4461 wiphy->retry_long = (u8) retry; in mwifiex_register_cfg80211()
4463 adapter->wiphy = wiphy; in mwifiex_register_cfg80211()