Lines Matching refs:cfg
193 #define WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(cfg) \ argument
195 if (wl_get_drv_status(cfg, CONNECTED, bcmcfg_to_prmry_ndev(cfg)) || \
196 wl_get_drv_status(cfg, CONNECTING, bcmcfg_to_prmry_ndev(cfg))) { \
202 #define WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(cfg) argument
444 static void wl_cfg80211_wbtext_update_rcc(struct bcm_cfg80211 *cfg, struct net_device *dev);
445 static bool wl_cfg80211_wbtext_check_bssid_list(struct bcm_cfg80211 *cfg, struct ether_addr *ea);
446 static bool wl_cfg80211_wbtext_add_bssid_list(struct bcm_cfg80211 *cfg, struct ether_addr *ea);
447 static void wl_cfg80211_wbtext_clear_bssid_list(struct bcm_cfg80211 *cfg);
448 static bool wl_cfg80211_wbtext_send_nbr_req(struct bcm_cfg80211 *cfg, struct net_device *dev,
450 static bool wl_cfg80211_wbtext_send_btm_query(struct bcm_cfg80211 *cfg, struct net_device *dev,
452 static void wl_cfg80211_wbtext_set_wnm_maxidle(struct bcm_cfg80211 *cfg, struct net_device *dev);
457 static s32 wl_cfg80211_rtt_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
461 static s32 wl_cfg80211_bssload_report_event_handler(struct bcm_cfg80211 *cfg,
506 static int wl_vndr_ies_get_vendor_oui(struct bcm_cfg80211 *cfg,
508 static void wl_vndr_ies_clear_vendor_oui_list(struct bcm_cfg80211 *cfg);
540 static s32 wl_frame_get_mgmt(struct bcm_cfg80211 *cfg, u16 fc,
661 static s32 wl_cfg80211_set_ap_role(struct bcm_cfg80211 *cfg, struct net_device *dev);
669 s32 wl_cfg80211_interface_ops(struct bcm_cfg80211 *cfg,
672 s32 wl_cfg80211_add_del_bss(struct bcm_cfg80211 *cfg,
686 static void wl_cfg80211_wait_for_disconnection(struct bcm_cfg80211 *cfg, struct net_device *dev);
708 static s32 wl_create_event_handler(struct bcm_cfg80211 *cfg);
709 static void wl_destroy_event_handler(struct bcm_cfg80211 *cfg);
711 static void wl_init_eq(struct bcm_cfg80211 *cfg);
712 static void wl_flush_eq(struct bcm_cfg80211 *cfg);
713 static unsigned long wl_lock_eq(struct bcm_cfg80211 *cfg);
714 static void wl_unlock_eq(struct bcm_cfg80211 *cfg, unsigned long flags);
715 static void wl_init_eq_lock(struct bcm_cfg80211 *cfg);
716 static void wl_init_event_handler(struct bcm_cfg80211 *cfg);
717 static struct wl_event_q *wl_deq_event(struct bcm_cfg80211 *cfg);
718 static s32 wl_enq_event(struct bcm_cfg80211 *cfg, struct net_device *ndev, u32 type,
720 static void wl_put_event(struct bcm_cfg80211 *cfg, struct wl_event_q *e);
721 static s32 wl_notify_connect_status_ap(struct bcm_cfg80211 *cfg, struct net_device *ndev,
723 static s32 wl_notify_connect_status(struct bcm_cfg80211 *cfg,
725 static s32 wl_notify_roaming_status(struct bcm_cfg80211 *cfg,
727 static s32 wl_bss_connect_done(struct bcm_cfg80211 *cfg, struct net_device *ndev,
729 static s32 wl_bss_roaming_done(struct bcm_cfg80211 *cfg, struct net_device *ndev,
731 static s32 wl_notify_mic_status(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
734 static s32 wl_notify_bt_wifi_handover_req(struct bcm_cfg80211 *cfg,
745 static s32 wl_notifier_change_state(struct bcm_cfg80211 *cfg, struct net_info *_net_info,
748 static s32 wl_check_pmstatus(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
752 static s32 wl_notify_roam_prep_status(struct bcm_cfg80211 *cfg,
756 static void wl_del_roam_timeout(struct bcm_cfg80211 *cfg);
759 static void wl_del_csa_timeout(struct bcm_cfg80211 *cfg);
764 wl_mbo_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
769 wl_notify_dos_status(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
773 wl_notify_extauth_req_event(struct bcm_cfg80211 *cfg,
776 wl_notify_mgmt_frame_tx_complete(struct bcm_cfg80211 *cfg,
781 static s32 wl_cfg80211_hogsqs_notify(struct bcm_cfg80211 *cfg,
803 static s32 wl_update_prof(struct bcm_cfg80211 *cfg, struct net_device *ndev,
805 static void wl_init_prof(struct bcm_cfg80211 *cfg, struct net_device *ndev);
832 static s32 wl_get_assoc_ies(struct bcm_cfg80211 *cfg, struct net_device *ndev);
835 void wl_cfg80211_clear_security(struct bcm_cfg80211 *cfg);
840 static void wl_rst_ie(struct bcm_cfg80211 *cfg);
841 static __used s32 wl_add_ie(struct bcm_cfg80211 *cfg, u8 t, u8 l, u8 *v);
844 static s32 wl_mrg_ie(struct bcm_cfg80211 *cfg, u8 *ie_stream, u16 ie_size);
845 static s32 wl_cp_ie(struct bcm_cfg80211 *cfg, u8 *dst, u16 dst_size);
846 static u32 wl_get_ielen(struct bcm_cfg80211 *cfg);
852 static void wl_free_wdev(struct bcm_cfg80211 *cfg);
854 static s32 wl_inform_single_bss(struct bcm_cfg80211 *cfg, wl_bss_info_t *bi, bool update_ssid);
855 static s32 wl_update_bss_info(struct bcm_cfg80211 *cfg, struct net_device *ndev, bool update_ssid);
876 static s32 wl_init_priv_mem(struct bcm_cfg80211 *cfg);
877 static void wl_deinit_priv_mem(struct bcm_cfg80211 *cfg);
884 static bool wl_is_ibssmode(struct bcm_cfg80211 *cfg, struct net_device *ndev);
885 static __used bool wl_is_ibssstarter(struct bcm_cfg80211 *cfg);
890 static s32 __wl_cfg80211_up(struct bcm_cfg80211 *cfg);
891 static s32 __wl_cfg80211_down(struct bcm_cfg80211 *cfg);
892 static bool wl_is_linkdown(struct bcm_cfg80211 *cfg, const wl_event_msg_t *e);
894 static bool wl_is_linkup(struct bcm_cfg80211 *cfg, const wl_event_msg_t *e,
896 static bool wl_is_nonetwork(struct bcm_cfg80211 *cfg, const wl_event_msg_t *e);
897 static void wl_link_up(struct bcm_cfg80211 *cfg);
898 static void wl_link_down(struct bcm_cfg80211 *cfg);
899 static s32 wl_config_infra(struct bcm_cfg80211 *cfg, struct net_device *ndev, u16 iftype);
911 static int wl_setup_rfkill(struct bcm_cfg80211 *cfg, bool setup);
914 static s32 wl_setup_debugfs(struct bcm_cfg80211 *cfg);
915 static s32 wl_free_debugfs(struct bcm_cfg80211 *cfg);
917 static bool check_dev_role_integrity(struct bcm_cfg80211 *cfg, s32 mode, u32 dev_role);
940 void reset_roam_cache(struct bcm_cfg80211 *cfg);
941 void add_roam_cache(struct bcm_cfg80211 *cfg, wl_bss_info_t *bi);
948 int init_roam_cache(struct bcm_cfg80211 *cfg, int ioctl_ver);
949 void print_roam_cache(struct bcm_cfg80211 *cfg);
950 void update_roam_cache(struct bcm_cfg80211 *cfg, int ioctl_ver);
954 s32 wl_cfg80211_p2plo_deinit(struct bcm_cfg80211 *cfg);
967 static void wl_cfg80211_set_cac(struct bcm_cfg80211 *cfg, int enable);
970 static int wl_cfg80211_delayed_roam(struct bcm_cfg80211 *cfg, struct net_device *ndev,
972 static s32 __wl_update_wiphybands(struct bcm_cfg80211 *cfg, bool notify);
975 static void wl_init_wps_reauth_sm(struct bcm_cfg80211 *cfg);
976 static void wl_deinit_wps_reauth_sm(struct bcm_cfg80211 *cfg);
978 static s32 wl_get_free_wps_inst(struct bcm_cfg80211 *cfg);
979 static s32 wl_get_wps_inst_match(struct bcm_cfg80211 *cfg, struct net_device *ndev);
991 static s32 wl_bcnrecv_aborted_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
996 static s32 wl_cfg80211_cac_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
1001 static s32 wl_bssid_prune_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
1096 wl_ap_start_ind(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
1099 wl_csa_complete_ind(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
1355 static void wl_add_remove_pm_enable_work(struct bcm_cfg80211 *cfg, argument
1363 if (cfg == NULL)
1367 dhd = (dhd_pub_t *)(cfg->pub);
1370 mutex_lock(&cfg->pm_sync);
1376 if (delayed_work_pending(&cfg->pm_enable_work)) {
1377 cancel_delayed_work(&cfg->pm_enable_work);
1379 DHD_PM_WAKE_UNLOCK(cfg->pub);
1395 if (schedule_delayed_work(&cfg->pm_enable_work,
1398 DHD_PM_WAKE_LOCK_TIMEOUT(cfg->pub, wq_duration);
1404 mutex_unlock(&cfg->pm_sync);
1494 bool wl_cfg80211_is_hal_started(struct bcm_cfg80211 *cfg) argument
1496 return cfg->hal_started;
1793 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
1814 sizeof(txpwrqdbm), cfg->ioctl_buf, WLC_IOCTL_SMLEN, 0,
1815 &cfg->ioctl_buf_sync);
1850 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
1851 struct net_device *dev = bcmcfg_to_prmry_ndev(cfg);
1874 buf = (char *)MALLOCZ(cfg->osh, WL_EXTRA_BUF_MAX);
1893 MFREE(cfg->osh, buf, WL_EXTRA_BUF_MAX);
1898 wl_wlfc_enable(struct bcm_cfg80211 *cfg, bool enable) argument
1905 struct net_device *primary_ndev = bcmcfg_to_prmry_ndev(cfg);
1907 dhd = (dhd_pub_t *)(cfg->pub);
1913 if (!cfg->wlfc_on && !disable_proptx) {
1922 cfg->wlfc_on = true;
1923 WL_DBG(("wlfc_on:%d \n", cfg->wlfc_on));
1927 if (wlfc_enabled && cfg->wlfc_on && dhd->op_mode != DHD_FLAG_HOSTAP_MODE &&
1930 cfg->wlfc_on = false;
1938 wl_cfg80211_p2p_if_add(struct bcm_cfg80211 *cfg, argument
1949 struct wiphy *wiphy = bcmcfg_to_wiphy(cfg);
1956 if (!cfg->p2p) {
1964 cfg->down_disc_if = FALSE;
1965 return wl_cfgp2p_add_p2p_disc_if(cfg);
1970 is_mp2p_supported = DHD_OPMODE_SUPPORTED(cfg->pub, DHD_FLAG_MP2P_MODE);
1986 ((cfg->p2p->p2p_go_count > 0) && (wl_iftype == WL_IF_TYPE_P2P_GO))) {
1991 if (!cfg->p2p->on) {
1992 p2p_on(cfg) = true;
1993 wl_cfgp2p_set_firm_p2p(cfg);
1994 wl_cfgp2p_init_discovery(cfg);
1997 strlcpy(cfg->p2p->vir_ifname, name, sizeof(cfg->p2p->vir_ifname));
2007 wl_set_p2p_status(cfg, IF_ADDING);
2008 bzero(&cfg->if_event_info, sizeof(cfg->if_event_info));
2009 cfg_type = wl_cfgp2p_get_conn_idx(cfg);
2011 wl_clr_p2p_status(cfg, IF_ADDING);
2016 p2p_addr = wl_to_p2p_bss_macaddr(cfg, cfg_type);
2019 err = wl_cfgp2p_ifadd(cfg, p2p_addr,
2022 wl_clr_p2p_status(cfg, IF_ADDING);
2028 timeout = wait_event_interruptible_timeout(cfg->netif_change_event,
2029 ((wl_get_p2p_status(cfg, IF_ADDING) == false) &&
2030 (cfg->if_event_info.valid)),
2032 if (timeout > 0 && !wl_get_p2p_status(cfg, IF_ADDING) && cfg->if_event_info.valid) {
2033 wl_if_event_info *event = &cfg->if_event_info;
2034 new_ndev = wl_cfg80211_post_ifcreate(bcmcfg_to_prmry_ndev(cfg), event,
2035 event->mac, cfg->p2p->vir_ifname, false);
2041 cfg->p2p->p2p_go_count++;
2044 wl_to_p2p_bss_ndev(cfg, cfg_type) = new_ndev;
2045 wl_to_p2p_bss_bssidx(cfg, cfg_type) = event->bssidx;
2048 "created net attach done\n", cfg->p2p->vir_ifname));
2051 DNGL_FUNC(dhd_cfg80211_set_p2p_info, (cfg, dhd_mode));
2054 INIT_COMPLETION(cfg->iface_disable);
2056 init_completion(&cfg->iface_disable);
2069 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
2070 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
2074 nan_enabled = cfg->nan_enable;
2077 if (nan_enabled || (wl_cfgp2p_vif_created(cfg)) ||
2080 __FUNCTION__, nan_enabled, wl_cfgp2p_vif_created(cfg),
2094 struct bcm_cfg80211 *cfg; local
2117 cfg = wiphy_priv(wdev->wiphy);
2120 dhd = (dhd_pub_t *)(cfg->pub);
2123 bssidx = wl_get_bssidx_by_wdev(cfg, wdev);
2135 wl_cfg80211_scan_abort(cfg);
2138 wl_cfg80211_tdls_config(cfg, TDLS_STATE_IF_CREATE, false);
2145 if (wl_get_drv_status(cfg, SCANNING, ndev)) {
2147 wl_cfg80211_cancel_scan(cfg);
2156 wl_add_remove_pm_enable_work(cfg, WL_PM_WORKQ_DEL);
2174 wl_cfg80211_tdls_config(cfg, TDLS_STATE_IF_DELETE, false);
2176 wl_wlfc_enable(cfg, false);
2180 wl_cfg80211_clear_per_bss_ies(cfg, wdev);
2183 wl_wlfc_enable(cfg, true);
2199 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
2206 if (unlikely(!wl_get_drv_status(cfg, READY, bcmcfg_to_prmry_ndev(cfg)))) {
2213 return wl_cfgp2p_del_p2p_disc_if(wdev, cfg);
2218 bssidx = wl_get_bssidx_by_wdev(cfg, wdev);
2223 if (wl_cfgp2p_find_type(cfg, bssidx, &cfg_type) != BCME_OK) {
2230 wl_clr_p2p_status(cfg, GO_NEG_PHASE);
2231 wl_clr_p2p_status(cfg, IF_ADDING);
2234 if (wl_get_mode_by_netdev(cfg, ndev) == WL_MODE_AP) {
2236 cfg->p2p->p2p_go_count--;
2238 err = wl_cfgp2p_ifdisable(cfg, wl_to_p2p_bss_macaddr(cfg, cfg_type));
2244 wait_for_completion_timeout(&cfg->iface_disable,
2251 if (wl_get_drv_status(cfg, DISCONNECTING, ndev)) {
2254 (&cfg->iface_disable, msecs_to_jiffies(500));
2258 bzero(&cfg->if_event_info, sizeof(cfg->if_event_info));
2259 wl_set_p2p_status(cfg, IF_DELETING);
2260 DNGL_FUNC(dhd_cfg80211_clean_p2p_info, (cfg));
2262 err = wl_cfgp2p_ifdel(cfg, wl_to_p2p_bss_macaddr(cfg, cfg_type));
2268 timeout = wait_event_interruptible_timeout(cfg->netif_change_event,
2269 ((wl_get_p2p_status(cfg, IF_DELETING) == false) &&
2270 (cfg->if_event_info.valid)),
2272 if (timeout > 0 && !wl_get_p2p_status(cfg, IF_DELETING) &&
2273 cfg->if_event_info.valid) {
2287 bzero(cfg->p2p->vir_ifname, IFNAMSIZ);
2288 wl_to_p2p_bss_bssidx(cfg, cfg_type) = -1;
2289 wl_to_p2p_bss_ndev(cfg, cfg_type) = NULL;
2290 wl_clr_drv_status(cfg, CONNECTED, wl_to_p2p_bss_ndev(cfg, cfg_type));
2292 if (cfg->if_event_info.ifidx) {
2294 wl_cfg80211_remove_if(cfg, cfg->if_event_info.ifidx, ndev, FALSE);
2303 wl_cfg80211_is_policy_config_allowed(struct bcm_cfg80211 *cfg) argument
2310 mutex_lock(&cfg->if_sync);
2312 sta_assoc_state = (wl_get_drv_status(cfg, CONNECTED, bcmcfg_to_prmry_ndev(cfg)) ||
2313 wl_get_drv_status(cfg, CONNECTING, bcmcfg_to_prmry_ndev(cfg)));
2314 active_sec_iface = wl_cfg80211_get_sec_iface(cfg);
2315 p2p_disc_on = wl_get_p2p_status(cfg, SCANNING);
2318 (cfg->nan_init_state == TRUE) ||
2322 sta_assoc_state, p2p_disc_on, cfg->nan_init_state,
2326 mutex_unlock(&cfg->if_sync);
2335 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
2336 if (!cfg) {
2341 if (wl_cfg80211_is_policy_config_allowed(cfg) != BCME_OK) {
2347 cfg->conc_disc |= arg_val;
2349 cfg->conc_disc &= ~arg_val;
2357 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
2358 if (!cfg) {
2362 return cfg->conc_disc;
2374 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
2375 if (!cfg) {
2380 if (wl_cfg80211_is_policy_config_allowed(cfg) != BCME_OK) {
2396 bzero(&cfg->iface_data, sizeof(iface_mgmt_data_t));
2397 ret = memcpy_s(&cfg->iface_data, sizeof(iface_mgmt_data_t), arg, len);
2403 if (cfg->iface_data.policy == WL_IF_POLICY_ROLE_PRIORITY) {
2406 wl_iftype_to_str(i), cfg->iface_data.priority[i]));
2417 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
2418 if (!cfg) {
2423 return cfg->iface_data.policy;
2431 wl_cfg80211_get_sec_iface(struct bcm_cfg80211 *cfg) argument
2434 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
2438 p2p_ndev = wl_to_p2p_bss_ndev(cfg,
2442 if (IS_CFG80211_STATIC_IF_ACTIVE(cfg)) {
2443 if (IS_AP_IFACE(cfg->static_ndev->ieee80211_ptr)) {
2464 if (wl_cfgnan_is_dp_active(bcmcfg_to_prmry_ndev(cfg))) {
2477 wl_cfg80211_data_if_mgmt(struct bcm_cfg80211 *cfg, argument
2482 wl_iftype_t sec_wl_if_type = wl_cfg80211_get_sec_iface(cfg);
2499 switch (cfg->iface_data.policy) {
2526 cfg->iface_data.priority[sec_wl_if_type],
2528 cfg->iface_data.priority[new_wl_iftype]));
2529 if (cfg->iface_data.priority[new_wl_iftype] >
2530 cfg->iface_data.priority[sec_wl_if_type]) {
2541 cfg->iface_data.policy));
2546 ret = wl_cfg80211_delete_iface(cfg, sec_wl_if_type);
2553 wl_cfg80211_disc_if_mgmt(struct bcm_cfg80211 *cfg, argument
2558 wl_cfg80211_get_sec_iface(cfg);
2574 switch (cfg->iface_data.policy) {
2606 ret = wl_cfg80211_delete_iface(cfg, sec_wl_if_type);
2620 ret = wl_cfg80211_delete_iface(cfg,
2627 cfg->iface_data.priority[sec_wl_if_type],
2629 cfg->iface_data.priority[new_wl_iftype]));
2630 if (cfg->iface_data.priority[new_wl_iftype] >
2631 cfg->iface_data.priority[sec_wl_if_type]) {
2633 ret = wl_cfg80211_delete_iface(cfg,
2653 if ((cfg->iface_data.policy == WL_IF_POLICY_CUSTOM) &&
2689 wl_cfg80211_is_associated_discovery(struct bcm_cfg80211 *cfg, argument
2693 p2p_ndev = wl_to_p2p_bss_ndev(cfg, P2PAPI_BSSCFG_CONNECTION1);
2702 (wl_cfgnan_is_dp_active(bcmcfg_to_prmry_ndev(cfg)))) {
2711 wl_cfg80211_handle_discovery_config(struct bcm_cfg80211 *cfg, argument
2719 wl_cfg80211_get_sec_iface(cfg);
2723 if (wl_cfg80211_is_associated_discovery(cfg,
2731 ret = wl_cfg80211_disc_if_mgmt(cfg, new_wl_iftype,
2740 if ((cfg->nan_p2p_supported == TRUE) &&
2741 (cfg->conc_disc == WL_NANP2P_CONC_SUPPORT)) {
2752 ret = wl_cfgnan_disable(cfg, NAN_CONCURRENCY_CONFLICT);
2762 ret = wl_cfg80211_deinit_p2p_discovery(cfg);
2777 wl_cfg80211_handle_if_role_conflict(struct bcm_cfg80211 *cfg, argument
2786 if (wl_cfg80211_get_sec_iface(cfg) != WL_IFACE_NOT_PRESENT) {
2788 ret = wl_cfg80211_data_if_mgmt(cfg, new_wl_iftype);
2796 ret = wl_cfg80211_handle_discovery_config(cfg, new_wl_iftype);
2843 wl_release_vif_macaddr(struct bcm_cfg80211 *cfg, u8 *mac_addr, u16 wl_iftype) argument
2845 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
2877 if (toggled_bit & cfg->vif_macaddr_mask) {
2881 cfg->vif_macaddr_mask &= ~toggled_bit;
2883 MAC2STRDBG(mac_addr), toggled_bit, cfg->vif_macaddr_mask));
2887 toggled_bit, cfg->vif_macaddr_mask));
2895 wl_get_vif_macaddr(struct bcm_cfg80211 *cfg, u16 wl_iftype, u8 *mac_addr) argument
2897 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
2937 toggle_mask = cfg->vif_macaddr_mask;
2945 cfg->vif_macaddr_mask |= toggle_bit;
2947 toggle_bit, toggle_bytes, cfg->vif_macaddr_mask));
2970 _wl_cfg80211_check_axi_error(struct bcm_cfg80211 *cfg) argument
2973 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
3036 net_os_send_hang_message(bcmcfg_to_prmry_ndev(cfg));
3046 wl_cfg80211_add_if(struct bcm_cfg80211 *cfg, argument
3063 if (!cfg || !primary_ndev || !name) {
3067 if (wl_cfg80211_get_wdev_from_ifname(cfg, name)) {
3072 wiphy = bcmcfg_to_wiphy(cfg);
3073 dhd = (dhd_pub_t *)(cfg->pub);
3081 mutex_lock(&cfg->if_sync);
3092 if ((err = wl_cfg80211_handle_if_role_conflict(cfg, wl_iftype)) < 0) {
3093 mutex_unlock(&cfg->if_sync);
3099 if ((err = _wl_cfg80211_check_axi_error(cfg)) < 0) {
3100 mutex_unlock(&cfg->if_sync);
3147 } else if ((wl_get_vif_macaddr(cfg, macaddr_iftype, mac_addr) != BCME_OK)) {
3163 if (cfg->iface_cnt >= (IFACE_MAX_CNT - 1)) {
3165 cfg->iface_cnt));
3170 wdev = wl_cfg80211_create_iface(cfg->wdev->wiphy,
3173 wdev = wl_cfg80211_create_iface(cfg->wdev->wiphy,
3180 if (cfg->p2p_supported) {
3181 wdev = wl_cfg80211_p2p_if_add(cfg, wl_iftype,
3204 cfg->vif_count++;
3212 wdev->iftype, cfg->vif_count));
3213 mutex_unlock(&cfg->if_sync);
3241 net_os_send_hang_message(bcmcfg_to_prmry_ndev(cfg));
3245 mutex_unlock(&cfg->if_sync);
3268 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
3272 if (!cfg) {
3277 primary_ndev = bcmcfg_to_prmry_ndev(cfg);
3278 if (unlikely(!wl_get_drv_status(cfg, READY, primary_ndev))) {
3292 wdev = wl_cfg80211_add_if(cfg, primary_ndev, wl_iftype, name, NULL);
3314 wl_cfg80211_del_if(struct bcm_cfg80211 *cfg, struct net_device *primary_ndev, argument
3318 mutex_lock(&cfg->if_sync);
3319 ret = _wl_cfg80211_del_if(cfg, primary_ndev, wdev, ifname);
3320 mutex_unlock(&cfg->if_sync);
3325 _wl_cfg80211_del_if(struct bcm_cfg80211 *cfg, struct net_device *primary_ndev, argument
3337 if (!cfg) {
3341 dhd = (dhd_pub_t *)(cfg->pub);
3347 wdev = wl_cfg80211_get_wdev_from_ifname(cfg, ifname);
3371 if (cfg->vif_count) {
3372 cfg->vif_count--;
3379 if ((netinfo = wl_get_netinfo_by_wdev(cfg, wdev)) == NULL) {
3421 if (cfg->vif_count) {
3422 cfg->vif_count--;
3427 if (!((cfg->nancfg.mac_rand) && (wl_iftype == WL_IF_TYPE_NAN)))
3430 wl_release_vif_macaddr(cfg, wdev->netdev->dev_addr, wl_iftype);
3432 WL_INFORM_MEM(("vif deleted. vif_count:%d\n", cfg->vif_count));
3444 if (wl_get_drv_status(cfg, READY, bcmcfg_to_prmry_ndev(cfg))) {
3467 net_os_send_hang_message(bcmcfg_to_prmry_ndev(cfg));
3478 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
3485 if (!cfg) {
3489 primary_ndev = bcmcfg_to_prmry_ndev(cfg);
3502 if ((ret = wl_cfg80211_del_if(cfg, primary_ndev,
3519 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
3520 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
3527 if (!cfg->p2p || !wl_cfgp2p_vif_created(cfg)) {
3538 wl_cfg80211_cancel_scan(cfg);
3540 index = wl_get_bssidx_by_wdev(cfg, ndev->ieee80211_ptr);
3545 if (wl_cfgp2p_find_type(cfg, index, &conn_idx) != BCME_OK) {
3550 is_mp2p_supported = DHD_OPMODE_SUPPORTED(cfg->pub, DHD_FLAG_MP2P_MODE);
3566 (cfg->p2p->p2p_go_count > 0) && (type == NL80211_IFTYPE_P2P_GO)) {
3577 if (wl_get_mode_by_netdev(cfg, ndev) == WL_MODE_AP) {
3580 cfg->p2p->p2p_go_count--;
3582 err = wl_cfgp2p_ifdisable(cfg, wl_to_p2p_bss_macaddr(cfg, conn_idx));
3588 wait_for_completion_timeout(&cfg->iface_disable,
3596 wl_set_p2p_status(cfg, IF_CHANGING);
3597 wl_clr_p2p_status(cfg, IF_CHANGED);
3598 wl_cfgp2p_ifchange(cfg, wl_to_p2p_bss_macaddr(cfg, conn_idx),
3600 wait_event_interruptible_timeout(cfg->netif_change_event,
3601 (wl_get_p2p_status(cfg, IF_CHANGED) == true),
3604 wl_clr_p2p_status(cfg, IF_CHANGING);
3605 wl_clr_p2p_status(cfg, IF_CHANGED);
3608 wl_set_drv_status(cfg, CONNECTED, ndev);
3626 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
3628 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
3636 primary_ndev = bcmcfg_to_prmry_ndev(cfg);
3643 mutex_lock(&cfg->if_sync);
3644 netinfo = wl_get_netinfo_by_wdev(cfg, ndev->ieee80211_ptr);
3647 if (is_static_iface(cfg, ndev)) {
3682 if ((err = wl_cfg80211_add_del_bss(cfg, ndev,
3693 if (!wl_get_drv_status(cfg, AP_CREATED, ndev)) {
3695 err = wl_cfg80211_set_ap_role(cfg, ndev);
3739 mutex_unlock(&cfg->if_sync);
3748 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
3754 if (wl_get_p2p_status(cfg, IF_CHANGING))
3758 if (wl_get_p2p_status(cfg, IF_ADDING)) {
3760 wl_clr_p2p_status(cfg, IF_ADDING);
3761 } else if (cfg->bss_pending_op) {
3767 wl_if_event_info *if_event_info = &cfg->if_event_info;
3780 cfg->bss_pending_op = FALSE;
3785 wake_up_interruptible(&cfg->netif_change_event);
3796 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
3797 wl_if_event_info *if_event_info = &cfg->if_event_info;
3800 if (wl_get_p2p_status(cfg, IF_DELETING)) {
3802 wl_clr_p2p_status(cfg, IF_DELETING);
3803 } else if (cfg->bss_pending_op) {
3814 cfg->bss_pending_op = FALSE;
3818 wake_up_interruptible(&cfg->netif_change_event);
3829 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
3831 if (wl_get_p2p_status(cfg, IF_CHANGING)) {
3832 wl_set_p2p_status(cfg, IF_CHANGED);
3834 wake_up_interruptible(&cfg->netif_change_event);
3889 struct bcm_cfg80211 *cfg = (struct bcm_cfg80211 *)wiphy_priv(wiphy); local
3890 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
3893 RETURN_EIO_IF_NOT_UP(cfg);
3896 (cfg->conf->rts_threshold != wiphy->rts_threshold)) {
3897 cfg->conf->rts_threshold = wiphy->rts_threshold;
3898 err = wl_set_rts(ndev, cfg->conf->rts_threshold);
3903 (cfg->conf->frag_threshold != wiphy->frag_threshold)) {
3904 cfg->conf->frag_threshold = wiphy->frag_threshold;
3905 err = wl_set_frag(ndev, cfg->conf->frag_threshold);
3910 (cfg->conf->retry_long != wiphy->retry_long)) {
3911 cfg->conf->retry_long = wiphy->retry_long;
3912 err = wl_set_retry(ndev, cfg->conf->retry_long, true);
3917 (cfg->conf->retry_short != wiphy->retry_short)) {
3918 cfg->conf->retry_short = wiphy->retry_short;
3919 err = wl_set_retry(ndev, cfg->conf->retry_short, false);
3930 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
3940 buf = (u8 *)MALLOC(cfg->osh, LOCAL_BUF_SIZE);
3947 0, buf, LOCAL_BUF_SIZE, 0, &cfg->ioctl_buf_sync);
3979 MFREE(cfg->osh, buf, LOCAL_BUF_SIZE);
3990 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
3992 if (cfg != NULL && ibss_vsie != NULL) {
3993 if (cfg->ibss_vsie != NULL) {
3994 MFREE(cfg->osh, cfg->ibss_vsie, cfg->ibss_vsie_len);
3996 cfg->ibss_vsie = ibss_vsie;
3997 cfg->ibss_vsie_len = ibss_vsie_len;
4002 wl_cfg80211_ibss_vsie_free(struct bcm_cfg80211 *cfg) argument
4005 if (cfg->ibss_vsie != NULL) {
4006 MFREE(cfg->osh, cfg->ibss_vsie, cfg->ibss_vsie_len);
4007 cfg->ibss_vsie_len = 0;
4014 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
4018 if (cfg != NULL && cfg->ibss_vsie != NULL) {
4019 ioctl_buf = (char *)MALLOC(cfg->osh, WLC_IOCTL_MEDLEN);
4024 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
4030 strlcpy(cfg->ibss_vsie->cmd, "del", sizeof(cfg->ibss_vsie->cmd));
4033 cfg->ibss_vsie, cfg->ibss_vsie_len,
4039 MFREE(cfg->osh, cfg->ibss_vsie, cfg->ibss_vsie_len);
4040 cfg->ibss_vsie_len = 0;
4044 MFREE(cfg->osh, ioctl_buf, WLC_IOCTL_MEDLEN);
4056 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
4064 if (cfg->ibss_cfgdev != NULL) {
4070 primary_ndev = bcmcfg_to_prmry_ndev(cfg);
4072 get_primary_mac(cfg, &cfg->ibss_if_addr);
4073 cfg->ibss_if_addr.octet[4] ^= 0x40;
4075 memcpy(&aibss_if.addr, &cfg->ibss_if_addr, sizeof(aibss_if.addr));
4079 cfg->bss_pending_op = TRUE;
4080 bzero(&cfg->if_event_info, sizeof(cfg->if_event_info));
4082 sizeof(aibss_if), cfg->ioctl_buf, WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
4087 timeout = wait_event_interruptible_timeout(cfg->netif_change_event,
4088 !cfg->bss_pending_op, msecs_to_jiffies(MAX_WAIT_TIME));
4089 if (timeout <= 0 || cfg->bss_pending_op)
4092 event = &cfg->if_event_info;
4099 new_ndev = wl_cfg80211_allocate_if(cfg, event->ifidx, event->name,
4103 wdev = (struct wireless_dev *)MALLOCZ(cfg->osh, sizeof(*wdev));
4116 if (wl_cfg80211_register_if(cfg, event->ifidx, new_ndev, FALSE) != BCME_OK)
4119 wl_alloc_netinfo(cfg, new_ndev, wdev, WL_IF_TYPE_IBSS,
4121 cfg->ibss_cfgdev = ndev_to_cfgdev(new_ndev);
4123 return cfg->ibss_cfgdev;
4127 cfg->bss_pending_op = FALSE;
4129 wl_cfg80211_remove_if(cfg, event->ifidx, new_ndev, FALSE);
4131 MFREE(cfg->osh, wdev, sizeof(*wdev));
4140 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
4145 if (!cfgdev || cfg->ibss_cfgdev != cfgdev || ETHER_ISNULLADDR(&cfg->ibss_if_addr.octet))
4147 ndev = (struct net_device *)cfgdev_to_ndev(cfg->ibss_cfgdev);
4148 primary_ndev = bcmcfg_to_prmry_ndev(cfg);
4150 cfg->bss_pending_op = TRUE;
4151 bzero(&cfg->if_event_info, sizeof(cfg->if_event_info));
4152 err = wldev_iovar_setbuf(primary_ndev, "aibss_ifdel", &cfg->ibss_if_addr,
4153 sizeof(cfg->ibss_if_addr), cfg->ioctl_buf, WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
4158 timeout = wait_event_interruptible_timeout(cfg->netif_change_event,
4159 !cfg->bss_pending_op, msecs_to_jiffies(MAX_WAIT_TIME));
4160 if (timeout <= 0 || cfg->bss_pending_op) {
4165 wl_cfg80211_remove_if(cfg, cfg->if_event_info.ifidx, ndev, FALSE);
4166 cfg->ibss_cfgdev = NULL;
4170 cfg->bss_pending_op = FALSE;
4213 wl_cfg80211_interface_ops(struct bcm_cfg80211 *cfg, argument
4308 wl_customer6_legacy_chip_check(struct bcm_cfg80211 *cfg, argument
4352 wl_bss_iovar_war(struct bcm_cfg80211 *cfg, argument
4355 if (wl_customer6_legacy_chip_check(cfg, ndev)) {
4373 wl_cfg80211_add_del_bss(struct bcm_cfg80211 *cfg, argument
4381 s32 cfg; member
4406 bss_setbuf.cfg = htod32(bsscfg_idx);
4415 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
4423 wl_cfg80211_bss_up(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 bsscfg_idx, s32 bss_up) argument
4429 s32 cfg; member
4433 bss_setbuf.cfg = htod32(bsscfg_idx);
4438 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
4598 struct bcm_cfg80211 *cfg; local
4616 cfg = wl_get_cfg(ndev);
4617 if (!cfg) {
4649 primary_ndev = bcmcfg_to_prmry_ndev(cfg);
4657 if (is_static_iface_name(name, cfg)) {
4658 new_ndev = wl_cfg80211_post_static_ifcreate(cfg, event, addr, iface_type, name);
4667 new_ndev = wl_cfg80211_allocate_if(cfg, event->ifidx,
4677 wdev = (struct wireless_dev *)MALLOCZ(cfg->osh, sizeof(*wdev));
4680 wl_cfg80211_remove_if(cfg, event->ifidx, new_ndev, rtnl_lock_reqd);
4684 wdev->wiphy = bcmcfg_to_wiphy(cfg);
4691 if (wl_cfg80211_register_if(cfg, event->ifidx, new_ndev, rtnl_lock_reqd)
4697 MFREE(cfg->osh, wdev, sizeof(*wdev));
4698 wl_cfg80211_remove_if(cfg, event->ifidx, new_ndev, rtnl_lock_reqd);
4704 ret = wl_alloc_netinfo(cfg, new_ndev, wdev, wl_iftype,
4712 if ((ret = wl_config_infra(cfg, new_ndev, wl_iftype)) < 0) {
4718 wl_set_drv_status(cfg, AP_CREATING, new_ndev);
4726 wl_cfg80211_set_cac(cfg, 0);
4734 if ((iface_num = get_iface_num(name, cfg)) >= 0) {
4735 cfg->static_ndev_state[iface_num] = NDEV_STATE_FW_IF_FAILED;
4736 wl_cfg80211_update_iflist_info(cfg, new_ndev, (DHD_MAX_IFS + iface_num), addr,
4742 wl_cfg80211_remove_if(cfg, event->ifidx, new_ndev, rtnl_lock_reqd);
4749 wl_cfg80211_delete_iface(struct bcm_cfg80211 *cfg, argument
4765 primary_ndev = bcmcfg_to_prmry_ndev(cfg);
4769 for_each_ndev(cfg, iter, next) {
4778 ret = _wl_cfg80211_del_if(cfg,
4784 if (cfg->nan_enable == false) {
4788 ret = wl_cfgnan_delete_ndp(cfg, iter->ndev);
4797 if (is_static_iface(cfg, iter->ndev)) {
4803 ret = _wl_cfg80211_del_if(cfg, iter->ndev,
4821 wl_cfg80211_cleanup_virtual_ifaces(struct bcm_cfg80211 *cfg, bool rtnl_lock_reqd) argument
4831 primary_ndev = bcmcfg_to_prmry_ndev(cfg);
4834 for_each_ndev(cfg, iter, next) {
4840 if (!is_static_iface(cfg, iter->ndev))
4855 struct bcm_cfg80211 *cfg; local
4864 cfg = wl_get_cfg(ndev);
4865 if (!cfg) {
4873 ifidx = dhd_net2idx(((struct dhd_pub *)(cfg->pub))->info, ndev);
4882 if ((netinfo = wl_get_netinfo_by_wdev(cfg, ndev_to_wdev(ndev))) == NULL) {
4889 if (is_static_iface(cfg, ndev)) {
4890 ret = wl_cfg80211_post_static_ifdel(cfg, ndev);
4895 ndev->name, ifidx, cfg->vif_count));
4896 wl_cfg80211_remove_if(cfg, ifidx, ndev, rtnl_lock_reqd);
4897 cfg->bss_pending_op = FALSE;
4901 wl_cfg80211_set_cac(cfg, 1);
4908 wl_cfg80211_deinit_p2p_discovery(struct bcm_cfg80211 *cfg) argument
4913 if (cfg->p2p) {
4917 cfgdev = bcmcfg_to_p2p_wdev(cfg);
4919 cfgdev = cfg->p2p_net;
4922 ret = wl_cfg80211_scan_stop(cfg, cfgdev);
4928 wl_cfgp2p_disable_discovery(cfg);
4929 wl_to_p2p_bss_bssidx(cfg, P2PAPI_BSSCFG_DEVICE) = 0;
4930 p2p_on(cfg) = false;
4942 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
4959 for_each_ndev(cfg, iter, next) {
4969 primary_ndev = bcmcfg_to_prmry_ndev(cfg);
4981 cfg->bss_pending_op = TRUE;
4982 bzero(&cfg->if_event_info, sizeof(cfg->if_event_info));
4988 ret = wl_cfg80211_interface_ops(cfg, primary_ndev, bsscfg_idx,
4994 if ((ret = wl_cfg80211_add_del_bss(cfg, primary_ndev,
5011 timeout = wait_event_interruptible_timeout(cfg->netif_change_event,
5012 !cfg->bss_pending_op, msecs_to_jiffies(MAX_WAIT_TIME));
5013 if (timeout <= 0 || cfg->bss_pending_op) {
5015 timeout, cfg->bss_pending_op));
5022 event = &cfg->if_event_info;
5036 cfg->bss_pending_op = FALSE;
5043 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
5054 if (wl_get_drv_status_all(cfg, SCANNING)) {
5056 wl_cfg80211_cancel_scan(cfg);
5059 bsscfg_idx = wl_get_bssidx_by_wdev(cfg, wdev);
5070 wl_cfg80211_set_cac(cfg, 1);
5081 memset(&cfg->if_event_info, 0, sizeof(cfg->if_event_info));
5093 if (wl_cfg80211_get_bus_state(cfg)) {
5099 cfg->bss_pending_op = true;
5100 ret = wl_cfg80211_interface_ops(cfg, ndev, bsscfg_idx,
5103 if ((ret = wl_cfg80211_add_del_bss(cfg, ndev,
5121 timeout = wait_event_interruptible_timeout(cfg->netif_change_event,
5122 !cfg->bss_pending_op, msecs_to_jiffies(MAX_WAIT_TIME));
5123 if (timeout <= 0 || cfg->bss_pending_op) {
5134 if (is_static_iface(cfg, ndev)) {
5140 wl_cfg80211_post_static_ifdel(cfg, ndev);
5144 ret = wl_cfg80211_post_ifdel(ndev, false, cfg->if_event_info.ifidx);
5150 cfg->bss_pending_op = false;
5158 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
5172 RETURN_EIO_IF_NOT_UP(cfg);
5185 cfg->channel = ieee80211_frequency_to_channel(chan->center_freq);
5186 if (wl_get_drv_status(cfg, CONNECTED, dev)) {
5187 struct wlc_ssid *lssid = (struct wlc_ssid *)wl_read_prof(cfg, dev, WL_PROF_SSID);
5188 u8 *bssid = (u8 *)wl_read_prof(cfg, dev, WL_PROF_BSSID);
5189 u32 *channel = (u32 *)wl_read_prof(cfg, dev, WL_PROF_CHAN);
5192 (*channel == cfg->channel))) {
5194 MAC2STRDBG((u8 *)wl_read_prof(cfg, dev, WL_PROF_BSSID))));
5233 cfg->ibss_starter = false;
5236 cfg->ibss_starter = true;
5254 chanspec = channel_to_chanspec(wiphy, dev, cfg->channel, bw_cap);
5312 wl_update_prof(cfg, dev, NULL, &join_params.ssid, WL_PROF_SSID);
5313 wl_update_prof(cfg, dev, NULL, &cfg->channel, WL_PROF_CHAN);
5315 cfg->aibss_txfail_seq = 0; /* initialize the sequence */
5318 cfg->rmc_event_seq = 0; /* initialize rmcfail sequence */
5325 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
5330 RETURN_EIO_IF_NOT_UP(cfg);
5331 wl_link_down(cfg);
5334 curbssid = wl_read_prof(cfg, dev, WL_PROF_BSSID);
5335 wl_set_drv_status(cfg, DISCONNECTING, dev);
5341 wl_clr_drv_status(cfg, DISCONNECTING, dev);
5410 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
5416 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
5460 sec = wl_read_prof(cfg, dev, WL_PROF_SEC);
5469 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
5474 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
5480 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &cfg->ioctl_buf_sync);
5493 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
5499 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
5549 sec = wl_read_prof(cfg, dev, WL_PROF_SEC);
5596 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
5611 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
5660 if ((cfg->wdev->wiphy->features & NL80211_FEATURE_FW_4WAY_HANDSHAKE) &&
5733 sec = wl_read_prof(cfg, dev, WL_PROF_SEC);
5742 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
5753 if (!cfg) {
5756 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
5761 buf = MALLOCZ(cfg->osh, sizeof(wl_wsec_info_t) + sizeof(tlv_data));
5784 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &cfg->ioctl_buf_sync);
5786 MFREE(cfg->osh, buf, sizeof(wl_wsec_info_t) + sizeof(tlv_data));
5792 wl_cfg80211_set_mfp(struct bcm_cfg80211 *cfg, argument
5886 group_mgmt_cs, WPA_SUITE_LEN, cfg->ioctl_buf,
5887 WLC_IOCTL_SMLEN, &cfg->ioctl_buf_sync);
5895 if (wl_customer6_legacy_chip_check(cfg,
5896 bcmcfg_to_prmry_ndev(cfg))) {
5918 wl_flush_fw_log_buffer(bcmcfg_to_prmry_ndev(cfg),
5950 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
5977 iov_buf = MALLOCZ(cfg->osh, WLC_IOCTL_SMLEN);
6025 sizeof(uint16), cfg->ioctl_buf, WLC_IOCTL_SMLEN, &cfg->ioctl_buf_sync);
6039 MFREE(cfg->osh, iov_buf, WLC_IOCTL_SMLEN);
6066 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
6068 if (WPA2_AUTH_IS_FILS(auth_type) && !cfg->fils_info.fils_roam_disabled) {
6069 err = wl_get_bcn_timeout(dev, &cfg->fils_info.fils_bcn_timeout_cache);
6074 cfg->fils_info.fils_roam_disabled = true;
6076 } else if (cfg->fils_info.fils_roam_disabled) {
6078 wl_dongle_roam(dev, WL_ROAM_ENABLE, cfg->fils_info.fils_bcn_timeout_cache);
6079 cfg->fils_info.fils_roam_disabled = false;
6123 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
6127 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
6135 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
6166 if (wl_customer6_legacy_chip_check(cfg, dev)) {
6173 if (wl_customer6_legacy_chip_check(cfg, dev)) {
6265 if ((err = wl_cfg80211_set_mfp(cfg, dev, sme)) < 0) {
6278 sec = wl_read_prof(cfg, dev, WL_PROF_SEC);
6288 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
6295 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
6302 sec = wl_read_prof(cfg, dev, WL_PROF_SEC);
6336 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &cfg->ioctl_buf_sync);
6377 int wl_cfg80211_cleanup_mismatch_status(struct net_device *dev, struct bcm_cfg80211 *cfg, argument
6385 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
6390 wl_set_drv_status(cfg, DISCONNECTING, dev);
6397 wl_clr_drv_status(cfg, DISCONNECTING, dev);
6405 if (wl_get_drv_status(cfg, DISCONNECTING, dev)) {
6406 wl_clr_drv_status(cfg, DISCONNECTING, dev);
6410 while (wl_get_drv_status(cfg, DISCONNECTING, dev) && wait_cnt) {
6422 wl_clr_drv_status(cfg, DISCONNECTING, dev);
6430 wl_fils_add_hlp_container(struct bcm_cfg80211 *cfg, struct net_device *dev, argument
6453 iov_buf = MALLOCZ(cfg->osh, iov_buf_len);
6473 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
6480 MFREE(cfg->osh, iov_buf, iov_buf_len);
6594 wl_notify_extauth_req_event(struct bcm_cfg80211 *cfg, argument
6672 wl_notify_mgmt_frame_tx_complete(struct bcm_cfg80211 *cfg, argument
6683 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
6684 _net_info = wl_get_netinfo_by_netdev(cfg, ndev);
6720 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
6725 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
6758 wl_set_drv_status(cfg, CFG80211_CONNECT, dev);
6765 if (cfg->scanmac_enabled) {
6808 RETURN_EIO_IF_NOT_UP(cfg);
6812 if (cfg->scan_request) {
6814 wl_cfg80211_scan_abort(cfg);
6816 while (wl_get_drv_status(cfg, SCANNING, dev) && wait_cnt) {
6821 if (wl_get_drv_status(cfg, SCANNING, dev)) {
6822 wl_cfg80211_cancel_scan(cfg);
6829 if (cfg->sched_scan_req) {
6831 wl_cfg80211_sched_scan_stop(wiphy, bcmcfg_to_prmry_ndev(cfg),
6832 cfg->sched_scan_req->reqid);
6834 wl_cfg80211_sched_scan_stop(wiphy, bcmcfg_to_prmry_ndev(cfg));
6840 cfg->block_gon_req_tx_count = 0;
6841 cfg->block_gon_req_rx_count = 0;
6853 if (wl_get_drv_status(cfg, CONNECTING, dev) || wl_get_drv_status(cfg, CONNECTED, dev)) {
6855 wl_set_drv_status(cfg, NESTED_CONNECT, dev);
6857 err = wl_cfg80211_cleanup_mismatch_status(dev, cfg, TRUE);
6858 } else if (wl_get_drv_status(cfg, DISCONNECTING, dev)) {
6860 err = wl_cfg80211_cleanup_mismatch_status(dev, cfg, false);
6861 } else if (!wl_get_drv_status(cfg, CONNECTED, dev)) {
6865 wl_set_drv_status(cfg, NESTED_CONNECT, dev);
6866 err = wl_cfg80211_cleanup_mismatch_status(dev, cfg, true);
6871 wl_update_prof(cfg, dev, NULL, sme->bssid, WL_PROF_LATEST_BSSID);
6873 wl_update_prof(cfg, dev, NULL, ðer_bcast, WL_PROF_LATEST_BSSID);
6877 wl_set_drv_status(cfg, CONNECTING, dev);
6879 wl_clr_drv_status(cfg, NESTED_CONNECT, dev);
6883 if (!wl_get_drv_status(cfg, DISCONNECTING, dev))
6884 wl_update_prof(cfg, dev, NULL, (void *)&bssid, WL_PROF_BSSID);
6886 if (p2p_is_on(cfg) && (dev != bcmcfg_to_prmry_ndev(cfg))) {
6888 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
6894 wl_cfg80211_set_mgmt_vndr_ies(cfg, ndev_to_cfgdev(dev), bssidx,
6896 } else if (dev == bcmcfg_to_prmry_ndev(cfg)) {
6897 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
6925 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
6932 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
6938 err = wl_cfg80211_set_mgmt_vndr_ies(cfg, ndev_to_cfgdev(dev), bssidx,
6974 cfg->channel = ieee80211_frequency_to_channel(chan->center_freq);
6976 WL_DBG(("channel (%d), center_req (%d), %d channels\n", cfg->channel,
6980 cfg->channel = 0;
6994 if (cfg->rcc_enabled || cfg->channel == 0)
7006 chan_cnt = get_roam_channel_list(cfg->channel, chanspec_list,
7034 err = wl_fils_add_hlp_container(cfg, dev, sme->ie, sme->ie_len);
7072 ext_join_params = (wl_extjoin_params_t *)MALLOCZ(cfg->osh, join_params_size);
7075 wl_clr_drv_status(cfg, CONNECTING, dev);
7081 wl_update_prof(cfg, dev, NULL, &ext_join_params->ssid, WL_PROF_SSID);
7100 if (chan_cnt && !cfg->rcc_enabled) {
7101 if (cfg->channel) {
7107 channel = cfg->channel;
7115 MFREE(cfg->osh, ext_join_params, join_params_size);
7140 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
7142 MFREE(cfg->osh, ext_join_params, join_params_size);
7147 if (dev == bcmcfg_to_prmry_ndev(cfg)) {
7150 (uint8 *)(&ext_join_params->assoc.bssid), cfg->channel);
7155 wl_cfg80211_tdls_config(cfg, TDLS_STATE_CONNECT, false);
7158 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &cfg->ioctl_buf_sync);
7159 if (cfg->rcc_enabled) {
7172 ext_join_params->ssid.SSID, ext_join_params->ssid.SSID_len, cfg->channel));
7176 "*****", ext_join_params->ssid.SSID_len, cfg->channel));
7181 ext_join_params->ssid.SSID, cfg->channel, cfg->rcc_enabled));
7182 MFREE(cfg->osh, ext_join_params, join_params_size);
7184 wl_clr_drv_status(cfg, CONNECTING, dev);
7212 wl_update_prof(cfg, dev, NULL, &join_params.ssid, WL_PROF_SSID);
7218 if (wl_ch_to_chanspec(dev, cfg->channel, &join_params, &join_params_size) < 0) {
7233 wl_clr_drv_status(cfg, CONNECTING, dev);
7237 wl_cfg80211_tdls_config(cfg, TDLS_STATE_DISCONNECT, false);
7241 if ((dev == bcmcfg_to_prmry_ndev(cfg)) && !err) {
7248 static void wl_cfg80211_disconnect_state_sync(struct bcm_cfg80211 *cfg, struct net_device *dev) argument
7275 static void wl_cfg80211_wait_for_disconnection(struct bcm_cfg80211 *cfg, struct net_device *dev) argument
7281 while ((status = wl_get_drv_status(cfg, DISCONNECTING, dev)) && wait_cnt) {
7288 if (!wait_cnt && wl_get_drv_status(cfg, DISCONNECTING, dev)) {
7296 wl_clr_drv_status(cfg, DISCONNECTING, dev);
7305 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
7312 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
7314 RETURN_EIO_IF_NOT_UP(cfg);
7315 act = *(bool *) wl_read_prof(cfg, dev, WL_PROF_ACT);
7316 curbssid = wl_read_prof(cfg, dev, WL_PROF_BSSID);
7326 if (wl_get_drv_status(cfg, CONNECTING, dev)) {
7346 if (dev == bcmcfg_to_prmry_ndev(cfg)) {
7354 if (cfg->scan_request) {
7356 wl_cfg80211_cancel_scan(cfg);
7359 wl_set_drv_status(cfg, DISCONNECTING, dev);
7360 if (wl_get_drv_status(cfg, CONNECTING, dev) ||
7361 wl_get_drv_status(cfg, CONNECTED, dev)) {
7369 wl_clr_drv_status(cfg, DISCONNECTING, dev);
7382 wl_clr_drv_status(cfg, DISCONNECTING, dev);
7385 wl_cfg80211_wait_for_disconnection(cfg, dev);
7396 if (dev == bcmcfg_to_prmry_ndev(cfg)) {
7403 cfg->rssi = 0; /* reset backup of rssi */
7407 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
7413 err = wl_cfg80211_set_mgmt_vndr_ies(cfg,
7430 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
7431 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
7440 RETURN_EIO_IF_NOT_UP(cfg);
7464 cfg->conf->tx_power = dbm;
7476 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
7477 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
7480 RETURN_EIO_IF_NOT_UP(cfg);
7492 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
7498 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
7504 RETURN_EIO_IF_NOT_UP(cfg);
7527 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
7531 s32 mode = wl_get_mode_by_netdev(cfg, dev);
7534 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
7550 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &cfg->ioctl_buf_sync);
7590 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &cfg->ioctl_buf_sync);
7605 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
7607 if (dev != bcmcfg_to_prmry_ndev(cfg)) {
7624 err = wl_cfg80211_apply_eventbuffer(dev, cfg, &ev_buf);
7626 cfg->roam_offload = enable;
7632 wl_cfg80211_get_wdev_from_ifname(struct bcm_cfg80211 *cfg, const char *name) argument
7642 for_each_ndev(cfg, iter, next) {
7659 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
7660 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
7671 if (!wl_get_drv_status(cfg, CONNECTED, dev)) {
7709 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
7710 s32 mode = wl_get_mode_by_netdev(cfg, dev);
7722 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
7725 RETURN_EIO_IF_NOT_UP(cfg);
7727 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
7744 bzero(&cfg->wep_key, sizeof(struct wl_wsec_key));
7783 sec = wl_read_prof(cfg, dev, WL_PROF_SEC);
7849 memcpy(&cfg->wep_key, &key, sizeof(struct wl_wsec_key));
7851 err = wldev_iovar_setbuf_bsscfg(dev, "wsec_key", &key, sizeof(key), cfg->ioctl_buf,
7852 WLC_IOCTL_MAXLEN, bssidx, &cfg->ioctl_buf_sync);
7884 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
7887 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
7889 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
7900 RETURN_EIO_IF_NOT_UP(cfg);
7912 err = wldev_iovar_setbuf_bsscfg(dev, "wsec_key", &key, sizeof(key), cfg->ioctl_buf,
7913 WLC_IOCTL_MAXLEN, bssidx, &cfg->ioctl_buf_sync);
7936 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
7942 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
7947 RETURN_EIO_IF_NOT_UP(cfg);
7962 sec = wl_read_prof(cfg, dev, WL_PROF_SEC);
8014 wl_check_assoc_state(struct bcm_cfg80211 *cfg, struct net_device *dev) argument
8021 NULL, 0, cfg->ioctl_buf, WLC_IOCTL_MEDLEN, 0, &cfg->ioctl_buf_sync);
8026 memcpy(&asinfo, cfg->ioctl_buf, sizeof(wl_assoc_info_t));
8035 wl_cfg80211_get_rssi(struct net_device *dev, struct bcm_cfg80211 *cfg, s32 *rssi) argument
8043 if (dev == NULL || cfg == NULL) {
8062 cfg->rssi_sum_report = TRUE;
8070 if (cfg->rssi_sum_report == FALSE) {
8084 DHD_OS_WAKE_LOCK((dhd_pub_t *)(cfg->pub));
8085 if (wl_get_drv_status(cfg, CONNECTED, dev) && wl_check_assoc_state(cfg, dev)) {
8086 *rssi = cfg->rssi; /* use previous RSSI */
8087 WL_DBG(("use previous RSSI %d dBm\n", cfg->rssi));
8091 DHD_OS_WAKE_UNLOCK((dhd_pub_t *)(cfg->pub));
8094 cfg->rssi = *rssi;
8132 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
8133 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
8211 bsscfg_idx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr);
8216 &cfg->ioctl_buf_sync);
8288 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
8302 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
8307 RETURN_EIO_IF_NOT_UP(cfg);
8313 buf = MALLOC(cfg->osh, MAX(sizeof(wl_if_stats_t), WLC_IOCTL_SMLEN));
8322 if (cfg->roam_offload) {
8331 err = wl_cfg80211_delayed_roam(cfg, dev, &bssid);
8339 dhd_assoc_state = wl_get_drv_status(cfg, CONNECTED, dev);
8344 if (wl_check_assoc_state(cfg, dev)) {
8385 curmacp = wl_read_prof(cfg, dev, WL_PROF_BSSID);
8394 if ((err = wl_cfg80211_get_rssi(dev, cfg, &rssi)) != BCME_OK) {
8424 (char*)&maxrxpktglom, 4, cfg->ioctl_buf,
8425 WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
8481 wl_clr_drv_status(cfg, CONNECTED, dev);
8485 wl_link_down(cfg);
8520 WL_ERR(("Invalid device mode %d\n", wl_get_mode_by_netdev(cfg, dev)));
8524 MFREE(cfg->osh, buf, MAX(sizeof(wl_if_stats_t), WLC_IOCTL_SMLEN));
8536 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
8537 struct net_info *_net_info = wl_get_netinfo_by_netdev(cfg, dev);
8540 dhd_pub_t *dhd = cfg->pub;
8543 RETURN_EIO_IF_NOT_UP(cfg);
8546 mode = wl_get_mode_by_netdev(cfg, dev);
8547 if (cfg->p2p_net == dev || _net_info == NULL ||
8548 !wl_get_drv_status(cfg, CONNECTED, dev) ||
8555 wl_add_remove_pm_enable_work(cfg, WL_PM_WORKQ_LONG);
8624 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
8625 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
8632 if (unlikely(!wl_get_drv_status(cfg, READY, ndev))) {
8642 sizeof(pkt_filter_id), cfg->ioctl_buf, WLC_IOCTL_SMLEN,
8643 &cfg->ioctl_buf_sync);
8666 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
8667 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
8686 pkt_filterp = (wl_pkt_filter_t *)MALLOCZ(cfg->osh, max_buf_size);
8742 cfg->ioctl_buf, WLC_IOCTL_MEDLEN, &cfg->ioctl_buf_sync);
8754 cfg->ioctl_buf, WLC_IOCTL_SMLEN, &cfg->ioctl_buf_sync);
8767 MFREE(cfg->osh, pkt_filterp, max_buf_size);
8782 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
8784 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
8786 if (unlikely(!wl_get_drv_status(cfg, READY, ndev))) {
8788 (int)cfg->status));
8791 for_each_ndev(cfg, iter, next) {
8794 wl_set_drv_status(cfg, SCAN_ABORTING, iter->ndev);
8796 WL_CFG_DRV_LOCK(&cfg->cfgdrv_lock, flags);
8797 if (cfg->scan_request) {
8798 cfg80211_scan_done(cfg->scan_request, true);
8799 cfg->scan_request = NULL;
8801 for_each_ndev(cfg, iter, next) {
8803 wl_clr_drv_status(cfg, SCANNING, iter->ndev);
8804 wl_clr_drv_status(cfg, SCAN_ABORTING, iter->ndev);
8807 WL_CFG_DRV_UNLOCK(&cfg->cfgdrv_lock, flags);
8808 for_each_ndev(cfg, iter, next) {
8810 if (wl_get_drv_status(cfg, CONNECTING, iter->ndev)) {
8811 wl_bss_connect_done(cfg, iter->ndev, NULL, NULL, false);
8830 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
8831 struct net_device *primary_dev = bcmcfg_to_prmry_ndev(cfg);
8832 int npmkids = cfg->pmk_list->pmkids.count;
8834 ASSERT(cfg->pmk_list->pmkids.length >= (sizeof(u16)*2));
8856 if (cfg->wlc_ver.wlc_ver_major >= MIN_PMKID_LIST_V3_FW_MAJOR) {
8859 sizeof(*pmk_list), cfg->ioctl_buf,
8860 WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
8862 else if (cfg->wlc_ver.wlc_ver_major == MIN_PMKID_LIST_V2_FW_MAJOR) {
8864 pmkid_list_v2_t *pmkid_v2_list = (pmkid_list_v2_t *)MALLOCZ(cfg->osh, v2_list_size);
8912 v2_list_size, cfg->ioctl_buf,
8913 WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
8918 MFREE(cfg->osh, pmkid_v2_list, v2_list_size);
8922 pmkid_list_v1_t *pmkid_v1_list = (pmkid_list_v1_t *)MALLOCZ(cfg->osh, v1_list_size);
8938 v1_list_size, cfg->ioctl_buf,
8939 WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
8944 MFREE(cfg->osh, pmkid_v1_list, v1_list_size);
8956 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
8959 int npmkids = cfg->pmk_list->pmkids.count;
8960 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
8962 RETURN_EIO_IF_NOT_UP(cfg);
8968 if (!memcmp(pmksa->bssid, &cfg->pmk_list->pmkids.pmkid[i].bssid,
8974 if (!memcmp(pmksa->ssid, &cfg->pmk_list->pmkids.pmkid[i].ssid,
8982 memcpy(&cfg->pmk_list->pmkids.pmkid[i].bssid, pmksa->bssid,
8987 cfg->pmk_list->pmkids.pmkid[i].ssid_len = pmksa->ssid_len;
8988 memcpy(&cfg->pmk_list->pmkids.pmkid[i].ssid, pmksa->ssid,
8990 memcpy(&cfg->pmk_list->pmkids.pmkid[i].fils_cache_id, pmksa->cache_id,
8996 if (memcpy_s(&cfg->pmk_list->pmkids.pmkid[i].pmk, PMK_LEN_MAX, pmksa->pmk,
9000 cfg->pmk_list->pmkids.pmkid[i].pmk_len = pmksa->pmk_len;
9005 (void)memcpy_s(cfg->pmk_list->pmkids.pmkid[i].pmkid, WPA2_PMKID_LEN, pmksa->pmkid,
9007 cfg->pmk_list->pmkids.pmkid[i].pmkid_len = WPA2_PMKID_LEN;
9014 cfg->pmk_list->pmkids.pmkid[i].time_left = KEY_PERM_PMK;
9016 cfg->pmk_list->pmkids.length += sizeof(pmkid_v3_t);
9017 cfg->pmk_list->pmkids.count++;
9026 &cfg->pmk_list->pmkids.pmkid[npmkids - 1].bssid));
9030 cfg->pmk_list->pmkids.pmkid[npmkids - 1].
9035 err = wl_update_pmklist(dev, cfg->pmk_list, err);
9049 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
9054 RETURN_EIO_IF_NOT_UP(cfg);
9056 if (cfg->wlc_ver.wlc_ver_major < MIN_PMKID_LIST_V3_FW_MAJOR) {
9057 WL_ERR(("wlc_ver_major not supported:%d\n", cfg->wlc_ver.wlc_ver_major));
9062 pmk_list = (pmkid_list_v3_t *)MALLOCZ(cfg->osh, alloc_len);
9116 alloc_len, cfg->ioctl_buf,
9117 WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
9121 MFREE(cfg->osh, pmk_list, alloc_len);
9133 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
9136 int npmkids = cfg->pmk_list->pmkids.count;
9137 RETURN_EIO_IF_NOT_UP(cfg);
9173 (pmksa->bssid, &cfg->pmk_list->pmkids.pmkid[i].bssid,
9181 (pmksa->ssid, &cfg->pmk_list->pmkids.pmkid[i].ssid,
9189 bzero(&cfg->pmk_list->pmkids.pmkid[i], sizeof(pmkid_v3_t));
9191 (void)memcpy_s(&cfg->pmk_list->pmkids.pmkid[i],
9193 &cfg->pmk_list->pmkids.pmkid[i + 1],
9197 cfg->pmk_list->pmkids.length -= sizeof(pmkid_v3_t);
9198 cfg->pmk_list->pmkids.count--;
9213 err = wl_update_pmklist(dev, cfg->pmk_list, err);
9225 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
9227 RETURN_EIO_IF_NOT_UP(cfg);
9228 bzero(cfg->pmk_list, sizeof(*cfg->pmk_list));
9229 cfg->pmk_list->pmkids.length = OFFSETOF(pmkid_list_v3_t, pmkid);
9230 cfg->pmk_list->pmkids.count = 0;
9231 cfg->pmk_list->pmkids.version = PMKID_LIST_VER_3;
9232 err = wl_update_pmklist(dev, cfg->pmk_list, err);
9253 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
9256 RETURN_EIO_IF_NOT_UP(cfg);
9261 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
9269 wl_set_dpp_listen_by_netdev(cfg, ndev_dpp_listen, 1);
9271 mutex_lock(&cfg->usr_sync);
9274 duration, (wl_get_drv_status(cfg, SCANNING, ndev)) ? "YES":"NO"));
9276 if (!cfg->p2p) {
9283 if (wl_get_p2p_status(cfg, DISC_IN_PROGRESS)) {
9291 if (wl_get_drv_status_all(cfg, SCANNING)) {
9292 wl_cfg80211_cancel_scan(cfg);
9297 memcpy(&cfg->remain_on_chan, channel, sizeof(struct ieee80211_channel));
9299 cfg->remain_on_chan_type = channel_type;
9301 id = ++cfg->last_roc_id;
9303 id = ++cfg->last_roc_id;
9307 if (wl_get_drv_status(cfg, SCANNING, ndev)) {
9312 wl_cfg80211_scan_abort(cfg);
9314 wl_set_drv_status(cfg, FAKE_REMAINING_ON_CHANNEL, ndev);
9316 if (timer_pending(&cfg->p2p->listen_timer)) {
9318 del_timer_sync(&cfg->p2p->listen_timer);
9321 _timer = &cfg->p2p->listen_timer;
9322 wl_clr_p2p_status(cfg, LISTEN_EXPIRED);
9337 if (wl_get_drv_status_all(cfg, WAITING_NEXT_ACT_FRM_LISTEN)) {
9342 wl_set_drv_status(cfg, FAKE_REMAINING_ON_CHANNEL, ndev);
9344 wl_set_drv_status(cfg, REMAINING_ON_CHANNEL, ndev);
9349 if (cfg->p2p && !cfg->p2p->on) {
9353 get_primary_mac(cfg, &primary_mac);
9354 wl_cfgp2p_generate_bss_mac(cfg, &primary_mac);
9355 p2p_on(cfg) = true;
9358 if (p2p_is_on(cfg)) {
9359 err = wl_cfgp2p_enable_discovery(cfg, ndev, NULL, 0);
9364 wl_set_drv_status(cfg, REMAINING_ON_CHANNEL, ndev);
9366 err = wl_cfgp2p_discover_listen(cfg, target_channel, duration);
9370 wl_set_drv_status(cfg, REMAINING_ON_CHANNEL, ndev);
9375 wl_set_drv_status(cfg, FAKE_REMAINING_ON_CHANNEL, ndev);
9402 mutex_unlock(&cfg->usr_sync);
9412 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
9418 RETURN_EIO_IF_NOT_UP(cfg);
9433 if (cfg && cfg->p2p_resp_apchn_status) {
9434 dev = bcmcfg_to_prmry_ndev(cfg);
9436 cfg->p2p_resp_apchn_status = false;
9441 if (cfg->last_roc_id == cookie) {
9442 wl_cfgp2p_set_p2p_mode(cfg, WL_P2P_DISC_ST_SCAN, 0, 0,
9443 wl_to_p2p_bss_bssidx(cfg, P2PAPI_BSSCFG_DEVICE));
9447 cookie, cfg->last_roc_id));
9457 struct bcm_cfg80211 *cfg; local
9462 cfg = wl_get_cfg(afx_instance->dev);
9463 if (cfg != NULL && cfg->afx_hdl->is_active) {
9464 if (cfg->afx_hdl->is_listen && cfg->afx_hdl->my_listen_chan) {
9465 ret = wl_cfgp2p_discover_listen(cfg, cfg->afx_hdl->my_listen_chan,
9468 ret = wl_cfgp2p_act_frm_search(cfg, cfg->afx_hdl->dev,
9469 cfg->afx_hdl->bssidx, cfg->afx_hdl->peer_listen_chan,
9474 if (wl_get_drv_status_all(cfg, FINDING_COMMON_CHANNEL))
9475 complete(&cfg->act_frm_scan);
9482 wl_cfg80211_af_searching_channel(struct bcm_cfg80211 *cfg, struct net_device *dev) argument
9492 wl_set_drv_status(cfg, FINDING_COMMON_CHANNEL, dev);
9493 cfg->afx_hdl->is_active = TRUE;
9495 if (cfg->afx_hdl->pending_tx_act_frm) {
9497 action_frame = &(cfg->afx_hdl->pending_tx_act_frm->action_frame);
9505 while ((cfg->afx_hdl->retry < max_retry) &&
9506 (cfg->afx_hdl->peer_chan == WL_INVALID)) {
9507 cfg->afx_hdl->is_listen = FALSE;
9508 wl_set_drv_status(cfg, SCANNING, dev);
9510 cfg->afx_hdl->retry));
9512 schedule_work(&cfg->afx_hdl->work);
9513 wait_for_completion_timeout(&cfg->act_frm_scan,
9516 if ((cfg->afx_hdl->peer_chan != WL_INVALID) ||
9517 !(wl_get_drv_status(cfg, FINDING_COMMON_CHANNEL, dev)))
9523 if (cfg->afx_hdl->my_listen_chan) {
9525 cfg->afx_hdl->my_listen_chan));
9527 cfg->afx_hdl->is_listen = TRUE;
9528 schedule_work(&cfg->afx_hdl->work);
9529 wait_for_completion_timeout(&cfg->act_frm_scan,
9532 if ((cfg->afx_hdl->peer_chan != WL_INVALID) ||
9533 !(wl_get_drv_status(cfg, FINDING_COMMON_CHANNEL, dev)))
9536 cfg->afx_hdl->retry++;
9538 WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(cfg);
9541 cfg->afx_hdl->is_active = FALSE;
9543 wl_clr_drv_status(cfg, SCANNING, dev);
9544 wl_clr_drv_status(cfg, FINDING_COMMON_CHANNEL, dev);
9546 return (cfg->afx_hdl->peer_chan);
9571 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
9592 ndev = wl_to_p2p_bss_ndev(cfg, P2PAPI_BSSCFG_CONNECTION1);
9594 wl_get_bssidx_by_wdev(cfg, ndev->ieee80211_ptr)) < 0) {
9599 err = wl_cfg80211_set_he_mode(ndev, cfg, bssidx,
9621 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
9634 cfg->next_af_subtype = P2P_PAF_SUBTYPE_INVALID;
9643 wl_set_p2p_status(cfg, GO_NEG_PHASE);
9646 cfg->next_af_subtype = act_frm->subtype + 1;
9657 cfg->next_af_subtype = act_frm->subtype + 1;
9665 wl_clr_p2p_status(cfg, GO_NEG_PHASE);
9672 cfg->block_gon_req_tx_count = 0;
9673 cfg->block_gon_req_rx_count = 0;
9682 cfg->next_af_subtype = act_frm->subtype + 1;
9701 cfg->next_af_subtype = act_frm->subtype + 1;
9719 cfg->next_af_subtype = act_frm->subtype + 1;
9725 cfg->next_af_subtype = P2P_PAF_GON_REQ;
9742 wl_cfg80211_check_DFS_channel(struct bcm_cfg80211 *cfg, wl_af_params_t *af_params, argument
9755 bss_list = cfg->bss_list;
9796 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
9807 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
9830 cfg->next_af_subtype = P2P_PAF_SUBTYPE_INVALID;
9853 if (cfg->block_gon_req_tx_count) {
9856 cfg->block_gon_req_tx_count));
9870 cfg->next_af_subtype = action + 1;
9899 wl_clr_drv_status(cfg, SENDING_ACT_FRM, dev);
9904 netinfo = wl_get_netinfo_by_wdev(cfg, cfgdev_to_wdev(cfgdev));
9913 if (ndev == bcmcfg_to_prmry_ndev(cfg))
9919 if (wl_get_drv_status(cfg, CONNECTING, bcmcfg_to_prmry_ndev(cfg))) {
9925 if (wl_get_drv_status_all(cfg, SCANNING)) {
9926 wl_cfg80211_cancel_scan(cfg);
9930 if (discover_cfgdev(cfgdev, cfg)) {
9931 if (cfg->p2p_supported && cfg->p2p) {
9932 wl_cfgp2p_set_p2p_mode(cfg, WL_P2P_DISC_ST_SCAN, 0, 0,
9933 wl_to_p2p_bss_bssidx(cfg, P2PAPI_BSSCFG_DEVICE));
9939 if (!wl_cfg80211_check_DFS_channel(cfg, af_params, action_frame->data, action_frame->len)) {
9945 if (cfg->next_af_subtype != P2P_PAF_SUBTYPE_INVALID) {
9947 wl_set_drv_status(cfg, WAITING_NEXT_ACT_FRM, dev);
9949 wl_set_drv_status(cfg, SENDING_ACT_FRM, dev);
9950 memcpy(cfg->afx_hdl->tx_dst_addr.octet,
9952 sizeof(cfg->afx_hdl->tx_dst_addr.octet));
9955 cfg->afx_hdl->pending_tx_act_frm = af_params;
9966 if ((cfg->afx_hdl->bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
9970 cfg->afx_hdl->dev = dev;
9971 cfg->afx_hdl->retry = 0;
9972 cfg->afx_hdl->peer_chan = WL_INVALID;
9974 if (wl_cfg80211_af_searching_channel(cfg, dev) == WL_INVALID) {
9987 wl_clr_drv_status(cfg, SCANNING, cfg->afx_hdl->dev);
9993 wl_cfg80211_cancel_scan(cfg);
9997 if ((wl_cfgp2p_discover_enable_search(cfg, false)) < 0) {
10003 if (cfg->afx_hdl->peer_chan != WL_INVALID) {
10004 af_params->channel = cfg->afx_hdl->peer_chan;
10006 cfg->afx_hdl->peer_chan));
10019 wl_cfgp2p_need_wait_actfrmae(cfg, action_frame->data, action_frame->len, true);
10023 ack = wl_cfgp2p_tx_action_frame(cfg, dev, af_params, bssidx) ? false : true;
10033 WL_AF_TX_KEEP_PRI_CONNECTION_VSDB(cfg);
10039 ack = wl_cfgp2p_tx_action_frame(cfg, dev, af_params, bssidx) ?
10050 wl_clr_drv_status(cfg, SENDING_ACT_FRM, dev);
10059 !cfg->block_gon_req_tx_count &&
10061 wl_get_drv_status_all(cfg, WAITING_NEXT_ACT_FRM) &&
10062 cfg->af_sent_channel == cfg->afx_hdl->my_listen_chan) {
10066 jiffies_to_msecs(jiffies - cfg->af_tx_sent_jiffies);
10069 wl_set_drv_status(cfg, WAITING_NEXT_ACT_FRM_LISTEN, dev);
10073 if (wl_cfgp2p_discover_listen(cfg, cfg->af_sent_channel,
10075 wait_for_completion_timeout(&cfg->wait_next_af,
10078 wl_clr_drv_status(cfg, WAITING_NEXT_ACT_FRM_LISTEN, dev);
10082 wl_clr_drv_status(cfg, WAITING_NEXT_ACT_FRM, dev);
10084 cfg->afx_hdl->pending_tx_act_frm = NULL;
10088 cfg->afx_hdl->my_listen_chan));
10091 cfg->afx_hdl->my_listen_chan));
10095 if (cfg->block_gon_req_tx_count) {
10096 cfg->block_gon_req_tx_count--;
10138 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
10165 dev = cfgdev_to_wlc_ndev(cfgdev, cfg);
10173 if (discover_cfgdev(cfgdev, cfg)) {
10174 if (!cfg->p2p_supported || !cfg->p2p) {
10178 bssidx = wl_to_p2p_bss_bssidx(cfg, P2PAPI_BSSCFG_DEVICE);
10181 if ((bssidx = wl_get_bssidx_by_wdev(cfg, cfgdev_to_wdev(cfgdev))) < 0) {
10189 if (p2p_is_on(cfg)) {
10193 if ((err = wl_cfgp2p_discover_enable_search(cfg, false)) < 0) {
10199 id = cfg->send_action_id++;
10201 id = cfg->send_action_id++;
10208 if ((dev == bcmcfg_to_prmry_ndev(cfg)) && cfg->p2p) {
10209 bssidx = wl_to_p2p_bss_bssidx(cfg, P2PAPI_BSSCFG_DEVICE);
10211 wl_cfg80211_set_mgmt_vndr_ies(cfg, ndev_to_cfgdev(dev), bssidx,
10215 if (!cfg->p2p_prb_noti) {
10216 cfg->p2p_prb_noti = true;
10266 wl_cfg80211_cancel_scan(cfg);
10271 netinfo = wl_get_netinfo_by_wdev(cfg, cfgdev_to_wdev(cfgdev));
10280 mf_params = (wl_mf_params_t *)MALLOCZ(cfg->osh, mf_params_len);
10315 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &cfg->ioctl_buf_sync);
10335 MFREE(cfg->osh, mf_params, mf_params_len);
10349 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, bssidx, &cfg->ioctl_buf_sync);
10366 af_params = (wl_af_params_t *)MALLOCZ(cfg->osh, WL_WIFI_AF_PARAMS_SIZE);
10391 cfg->afx_hdl->peer_listen_chan = af_params->channel;
10392 WL_DBG(("channel from upper layer %d\n", cfg->afx_hdl->peer_listen_chan));
10406 MFREE(cfg->osh, af_params, WL_WIFI_AF_PARAMS_SIZE);
10435 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
10436 dhd = (dhd_pub_t *)(cfg->pub);
10438 if (cfg->p2p_net == dev)
10439 dev = bcmcfg_to_prmry_ndev(cfg);
10495 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
10499 channel_width = wl_get_chanwidth_by_netdev(cfg, ndev);
10506 wl_set_chanwidth_by_netdev(cfg, ndev, 0);
10556 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
10558 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
10561 dev = ndev_to_wlc_ndev(dev, cfg);
10567 if (wl_get_mode_by_netdev(cfg, dev) == WL_MODE_AP &&
10569 wl_get_drv_status(cfg, CONNECTED, bcmcfg_to_prmry_ndev(cfg))) {
10570 u32 *sta_chan = (u32 *)wl_read_prof(cfg,
10571 bcmcfg_to_prmry_ndev(cfg), WL_PROF_CHAN);
10615 if (wl_get_mode_by_netdev(cfg, dev) == WL_MODE_AP &&
10616 DHD_OPMODE_SUPPORTED(cfg->pub, DHD_FLAG_HOSTAP_MODE) &&
10618 !wl_get_drv_status(cfg, CONNECTED,
10619 bcmcfg_to_prmry_ndev(cfg))) {
10622 wl_cfg80211_set_frameburst(cfg, FALSE);
10649 dev != bcmcfg_to_prmry_ndev(cfg)) {
10660 if (!err && (wl_get_mode_by_netdev(cfg, dev) == WL_MODE_AP)) {
10662 cfg->ap_oper_channel = ieee80211_frequency_to_channel(chan->center_freq);
10665 wl_flush_fw_log_buffer(bcmcfg_to_prmry_ndev(cfg),
10673 wl_cfg80211_get_remain_on_channel_ndev(struct bcm_cfg80211 *cfg) argument
10677 list_for_each_entry_safe(_net_info, next, &cfg->net_list, list) {
10766 struct bcm_cfg80211 *cfg = NULL; local
10776 cfg = wl_get_cfg(dev);
10777 if (!cfg) {
10783 iov_buf = MALLOCZ(cfg->osh, iov_buf_size);
10801 cfg->ioctl_buf, WLC_IOCTL_SMLEN, &cfg->ioctl_buf_sync);
10813 MFREE(cfg->osh, iov_buf, iov_buf_size);
10835 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
11000 cfg->bip_pos =
11003 cfg->bip_pos = NULL;
11022 cfg->mfp_mode = mfp;
11433 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
11434 wl_cfgbss_t *bss = wl_get_cfgbss_by_wdev(cfg, dev->ieee80211_ptr);
11476 MFREE(cfg->osh, bss->rsn_ie, bss->rsn_ie[1]
11481 MFREE(cfg->osh, bss->wpa_ie, bss->wpa_ie[1]
11486 MFREE(cfg->osh, bss->wps_ie, bss->wps_ie[1] + 2);
11490 MFREE(cfg->osh, bss->fils_ind_ie, bss->fils_ind_ie[1]
11496 bss->wpa_ie = MALLOCZ(cfg->osh,
11507 bss->rsn_ie = MALLOCZ(cfg->osh,
11518 bss->fils_ind_ie = MALLOCZ(cfg->osh,
11537 bss->wps_ie = MALLOCZ(cfg->osh, ies->wps_ie_len);
11554 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
11581 bzero(cfg->hostapd_ssid.SSID, DOT11_MAX_SSID_LEN);
11582 memcpy(cfg->hostapd_ssid.SSID, info->ssid, info->ssid_len);
11583 cfg->hostapd_ssid.SSID_len = (uint32)info->ssid_len;
11586 bzero(cfg->p2p->ssid.SSID, DOT11_MAX_SSID_LEN);
11587 memcpy(cfg->p2p->ssid.SSID, info->ssid, info->ssid_len);
11588 cfg->p2p->ssid.SSID_len = (uint32)info->ssid_len;
11636 struct bcm_cfg80211 *cfg, argument
11646 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
11653 if ((err = wl_cfg80211_add_del_bss(cfg, dev, bssidx,
11683 if (wl_get_drv_status_all(cfg, CONNECTED) > 0) {
11721 wl_set_drv_status(cfg, AP_CREATING, dev);
11733 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
11748 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
11753 is_rsdb_supported = DHD_OPMODE_SUPPORTED(cfg->pub, DHD_FLAG_RSDB_MODE);
11760 wl_clr_drv_status(cfg, AP_CREATED, dev);
11770 wl_cfg80211_scan_abort(cfg);
11780 err = wldev_iovar_setbuf_bsscfg(dev, "ssid", &cfg->p2p->ssid,
11781 sizeof(cfg->p2p->ssid), cfg->ioctl_buf, WLC_IOCTL_MAXLEN,
11782 bssidx, &cfg->ioctl_buf_sync);
11789 err = wldev_iovar_setint_bsscfg(dev, "mfp", cfg->mfp_mode, bssidx);
11799 if ((err = wl_cfg80211_bss_up(cfg, dev, bssidx, 1)) < 0) {
11807 if (!wl_get_drv_status(cfg, AP_CREATING, dev)) {
11809 err = wl_cfg80211_set_ap_role(cfg, dev);
11819 wl_clr_drv_status(cfg, AP_CREATING, dev);
11838 err = wl_cfg80211_set_he_mode(dev, cfg, bssidx, WL_IF_TYPE_AP, FALSE);
11846 cfg->ioctl_buf, WLC_IOCTL_SMLEN, bssidx, &cfg->ioctl_buf_sync);
11859 if (cfg->bip_pos) {
11861 (const void *)(cfg->bip_pos), WPA_SUITE_LEN, cfg->ioctl_buf,
11862 WLC_IOCTL_SMLEN, bssidx, &cfg->ioctl_buf_sync);
11866 if (wl_customer6_legacy_chip_check(cfg,
11867 bcmcfg_to_prmry_ndev(cfg))) {
11889 if ((wsec == WEP_ENABLED) && cfg->wep_key.len) {
11891 err = wldev_iovar_setbuf_bsscfg(dev, "wsec_key", &cfg->wep_key,
11892 sizeof(struct wl_wsec_key), cfg->ioctl_buf,
11893 WLC_IOCTL_MAXLEN, bssidx, &cfg->ioctl_buf_sync);
11895 bzero(&cfg->wep_key, sizeof(struct wl_wsec_key));
11906 err = wldev_iovar_setint_bsscfg(dev, "mfp", cfg->mfp_mode, bssidx);
11919 join_params.ssid.SSID_len = MIN(cfg->hostapd_ssid.SSID_len,
11921 memcpy(join_params.ssid.SSID, cfg->hostapd_ssid.SSID,
11934 if ((err = wl_cfg80211_bss_up(cfg, dev, bssidx, 1)) < 0) {
11945 timeout = wait_event_interruptible_timeout(cfg->netif_change_event,
11946 wl_get_drv_status(cfg, AP_CREATED, dev), msecs_to_jiffies(MAX_AP_LINK_WAIT_TIME));
11947 if (timeout <= 0 || !wl_get_drv_status(cfg, AP_CREATED, dev)) {
11971 if (cfg->wep_key.len) {
11972 bzero(&cfg->wep_key, sizeof(struct wl_wsec_key));
11976 if (cfg->mfp_mode) {
11977 cfg->mfp_mode = 0;
11980 if (cfg->bip_pos) {
11981 cfg->bip_pos = NULL;
11999 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
12000 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
12042 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
12043 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
12049 if ((err = wl_cfg80211_set_mgmt_vndr_ies(cfg, ndev_to_cfgdev(dev), bssidx,
12072 if ((err = wl_cfg80211_set_mgmt_vndr_ies(cfg, ndev_to_cfgdev(dev), bssidx,
12083 if ((err = wl_cfg80211_set_mgmt_vndr_ies(cfg, ndev_to_cfgdev(dev), bssidx,
12100 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
12101 wl_cfgbss_t *bss = wl_get_cfgbss_by_wdev(cfg, dev->ieee80211_ptr);
12112 MFREE(cfg->osh, bss->wps_ie, bss->wps_ie[1] + 2);
12113 bss->wps_ie = MALLOCZ(cfg->osh, ies->wps_ie_len);
12119 bss->wps_ie = MALLOCZ(cfg->osh, ies->wps_ie_len);
12131 bss->wpa_ie = MALLOCZ(cfg->osh,
12137 bss->rsn_ie = MALLOCZ(cfg->osh,
12149 MFREE(cfg->osh, bss->wpa_ie,
12152 bss->wpa_ie = MALLOCZ(cfg->osh,
12164 bss->wpa_ie = MALLOCZ(cfg->osh,
12177 MFREE(cfg->osh, bss->rsn_ie,
12179 bss->rsn_ie = MALLOCZ(cfg->osh,
12191 bss->rsn_ie = MALLOCZ(cfg->osh,
12204 wl_cfg80211_bss_up(cfg, dev, bssidx, 0);
12209 wl_cfg80211_bss_up(cfg, dev, bssidx, 1);
12220 bss->wpa_ie = MALLOCZ(cfg->osh,
12229 bss->rsn_ie = MALLOCZ(cfg->osh,
12242 MFREE(cfg->osh, bss->rsn_ie,
12244 bss->wpa_ie = MALLOCZ(cfg->osh,
12256 MFREE(cfg->osh, bss->rsn_ie,
12258 bss->rsn_ie = MALLOCZ(cfg->osh,
12271 wl_cfg80211_bss_up(cfg, dev, bssidx, 0);
12276 wl_cfg80211_bss_up(cfg, dev, bssidx, 1);
12307 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
12328 dev = ndev_to_wlc_ndev(ndev, cfg);
12330 if (p2p_is_on(cfg)) {
12334 if ((wl_cfgp2p_discover_enable_search(cfg, false)) < 0) {
12412 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
12414 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
12421 if ((wl_get_mode_by_netdev(cfg, dev) == WL_MODE_BSS) &&
12422 !(wl_get_drv_status(cfg, CONNECTED, dev))) {
12456 wl_del_roam_timeout(cfg);
12464 wl_cfg80211_wbtext_update_rcc(cfg, dev);
12474 struct bcm_cfg80211 *cfg, argument
12487 sizeof(wl_scb_probe_t), cfg->ioctl_buf, WLC_IOCTL_SMLEN,
12488 &cfg->ioctl_buf_sync);
12532 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
12537 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
12550 if (cfg->scanmac_enabled) {
12555 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
12560 if (p2p_is_on(cfg) && (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO)) {
12596 wl_cfg80211_tdls_config(cfg, TDLS_STATE_AP_CREATE, false);
12600 if (!check_dev_role_integrity(cfg, wl_get_mode_by_netdev(cfg, dev), dev_role)) {
12658 if ((err = wl_cfg80211_set_scb_timings(cfg, dev))) {
12663 wl_set_drv_status(cfg, CONNECTED, dev);
12674 wl_get_iwdata_by_netdev(cfg, dev, iw_ie, &iw_ie_len);
12678 err = wl_cfg80211_add_iw_ie(cfg, dev, bssidx,
12686 wl_cfg80211_clear_iw_ie(cfg, dev, bssidx);
12690 wl_clear_iwdata_by_netdev(cfg, dev);
12692 cfg->wl11u = FALSE;
12720 wl_cfg80211_init_ap_rps(cfg);
12767 wl_cfg80211_set_frameburst(cfg, TRUE);
12773 wl_cfg80211_tdls_config(cfg, TDLS_STATE_AP_DELETE, false);
12791 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
12793 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
12797 if (wl_cfg80211_get_bus_state(cfg)) {
12802 is_rsdb_supported = DHD_OPMODE_SUPPORTED(cfg->pub, DHD_FLAG_RSDB_MODE);
12806 wl_clr_drv_status(cfg, AP_CREATING, dev);
12807 wl_clr_drv_status(cfg, AP_CREATED, dev);
12808 cfg->ap_oper_channel = 0;
12816 cfg->ap_bs = 1;
12817 cfg->p2p_bs = 1;
12819 bcmcfg_to_prmry_ndev(cfg), cfg->ap_bs, cfg->p2p_bs);
12828 cfg->ap_bs = 1;
12829 cfg->p2p_bs = 1;
12831 bcmcfg_to_prmry_ndev(cfg), cfg->ap_bs, cfg->p2p_bs);
12839 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
12844 if (!check_dev_role_integrity(cfg, wl_get_mode_by_netdev(cfg, dev), dev_role)) {
12854 wl_clr_drv_status(cfg, CONNECTED, dev);
12855 if ((err = wl_cfg80211_bss_up(cfg, dev, bssidx, 0)) < 0) {
12861 wl_cfg80211_set_frameburst(cfg, TRUE);
12889 if (wl_cfg80211_set_he_mode(dev, cfg, bssidx, WL_IF_TYPE_AP, TRUE) != BCME_OK) {
12894 wl_cfg80211_clear_per_bss_ies(cfg, dev->ieee80211_ptr);
12897 wl_cfg80211_init_ap_rps(cfg);
12905 DHD_OS_WAKE_LOCK_CTRL_TIMEOUT_ENABLE((dhd_pub_t *)(cfg->pub),
12907 DHD_OS_WAKE_LOCK_TIMEOUT((dhd_pub_t *)(cfg->pub));
12914 wl_clear_iwdata_by_netdev(cfg, dev);
12924 wl_cfg80211_tdls_config(cfg, TDLS_STATE_AP_DELETE, false);
12942 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
12955 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
12969 if (!check_dev_role_integrity(cfg, wl_get_mode_by_netdev(cfg, dev), dev_role)) {
12974 if ((dev_role == NL80211_IFTYPE_P2P_GO) && (cfg->p2p_wdev == NULL)) {
12987 wl_get_iwdata_by_netdev(cfg, dev, iw_ie, &iw_ie_len);
12991 err = wl_cfg80211_add_iw_ie(cfg, dev, bssidx,
12999 wl_cfg80211_clear_iw_ie(cfg, dev, bssidx);
13004 wl_clear_iwdata_by_netdev(cfg, dev);
13005 cfg->wl11u = FALSE;
13046 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
13055 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
13060 if (dev == bcmcfg_to_prmry_ndev(cfg)) {
13064 else if (dev == cfg->p2p_net) {
13066 dev = bcmcfg_to_prmry_ndev(cfg);
13071 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
13082 if (!check_dev_role_integrity(cfg, wl_get_mode_by_netdev(cfg, dev), dev_role)) {
13087 if ((dev_role == NL80211_IFTYPE_P2P_GO) && (cfg->p2p_wdev == NULL)) {
13100 bzero(&cfg->hostapd_ssid.SSID[0], DOT11_MAX_SSID_LEN);
13101 cfg->hostapd_ssid.SSID_len = MIN(ssid_ie->len, DOT11_MAX_SSID_LEN);
13102 memcpy(&cfg->hostapd_ssid.SSID[0], ssid_ie->data,
13103 cfg->hostapd_ssid.SSID_len);
13106 bzero(&cfg->p2p->ssid.SSID[0], DOT11_MAX_SSID_LEN);
13107 cfg->p2p->ssid.SSID_len = MIN(ssid_ie->len, DOT11_MAX_SSID_LEN);
13108 memcpy(cfg->p2p->ssid.SSID, ssid_ie->data,
13109 cfg->p2p->ssid.SSID_len);
13120 if ((err = wl_cfg80211_set_mgmt_vndr_ies(cfg, ndev_to_cfgdev(dev), bssidx,
13130 if ((err = wl_cfg80211_set_mgmt_vndr_ies(cfg, ndev_to_cfgdev(dev), bssidx,
13180 if ((err = wl_cfg80211_set_scb_timings(cfg, dev))) {
13185 if (wl_get_drv_status(cfg, AP_CREATED, dev)) {
13203 wl_set_drv_status(cfg, CONNECTED, dev);
13224 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
13225 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
13238 wl_clr_drv_status(cfg, AP_CREATING, dev);
13239 wl_clr_drv_status(cfg, AP_CREATED, dev);
13242 wl_clr_drv_status(cfg, CONNECTED, dev);
13244 cfg->ap_oper_channel = 0;
13246 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
13252 if ((err = wl_cfg80211_bss_up(cfg, dev, bssidx, 0)) < 0) {
13261 wl_cfg80211_clear_per_bss_ies(cfg, dev->ieee80211_ptr);
13334 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
13336 buf = (char *)MALLOCZ(cfg->osh, sizeof(char) * WLC_IOCTL_MAXLEN);
13361 MFREE(cfg->osh, buf, sizeof(char) * WLC_IOCTL_MAXLEN);
13365 MFREE(cfg->osh, buf, sizeof(char) * WLC_IOCTL_MAXLEN);
13372 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
13379 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
13431 survey = (struct wl_dump_survey *)MALLOCZ(cfg->osh,
13467 MFREE(cfg->osh, survey, sizeof(struct wl_dump_survey));
13471 MFREE(cfg->osh, survey, sizeof(struct wl_dump_survey));
13593 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
13594 if (cfg->nan_enable) {
13595 mutex_lock(&cfg->if_sync);
13596 ret = wl_cfgnan_disable(cfg, NAN_COUNTRY_CODE_CHANGE);
13597 mutex_unlock(&cfg->if_sync);
13894 static void wl_free_wdev(struct bcm_cfg80211 *cfg) argument
13896 struct wireless_dev *wdev = cfg->wdev;
13918 wl_delete_all_netinfo(cfg);
13920 MFREE(cfg->osh, wdev, sizeof(*wdev));
13929 s32 wl_inform_bss(struct bcm_cfg80211 *cfg) argument
13936 bss_list = cfg->bss_list;
13939 reset_roam_cache(cfg);
13945 add_roam_cache(cfg, bi);
13947 err = wl_inform_single_bss(cfg, bi, false);
13956 update_roam_cache(cfg, ioctl_version);
13961 static s32 wl_inform_single_bss(struct bcm_cfg80211 *cfg, wl_bss_info_t *bi, bool update_ssid) argument
13963 struct wiphy *wiphy = bcmcfg_to_wiphy(cfg);
13968 struct wl_scan_req *sr = wl_to_sr(cfg);
13971 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
13994 notif_bss_info = (struct wl_cfg80211_bss_info *)MALLOCZ(cfg->osh,
14010 MFREE(cfg->osh, notif_bss_info, sizeof(*notif_bss_info)
14016 mgmt_type = cfg->active_scan ?
14021 beacon_proberesp = cfg->active_scan ?
14027 wl_rst_ie(cfg);
14029 wl_mrg_ie(cfg, ((u8 *) bi) + bi->ie_offset, bi->ie_length);
14030 wl_cp_ie(cfg, beacon_proberesp->variable, WL_BSS_INFO_MAX -
14033 u.beacon.variable) + wl_get_ielen(cfg);
14042 MFREE(cfg->osh, notif_bss_info, sizeof(*notif_bss_info)
14049 MFREE(cfg->osh, notif_bss_info, sizeof(*notif_bss_info)
14088 (cfg->sched_scan_req && !cfg->scan_request)) {
14098 event_data->tlvs = (tlv_log *)MALLOCZ(cfg->osh, tlv_len);
14138 MFREE(cfg->osh, notif_bss_info, sizeof(*notif_bss_info)
14143 static bool wl_is_linkup(struct bcm_cfg80211 *cfg, const wl_event_msg_t *e, struct net_device *ndev) argument
14150 dhd = (dhd_pub_t *)(cfg->pub);
14187 if (!wl_is_ibssmode(cfg, ndev))
14199 static bool wl_is_linkdown(struct bcm_cfg80211 *cfg, const wl_event_msg_t *e) argument
14220 static bool wl_is_nonetwork(struct bcm_cfg80211 *cfg, const wl_event_msg_t *e) argument
14237 wl_cfg80211_event_sae_key(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
14242 struct wiphy *wiphy = bcmcfg_to_wiphy(cfg);
14273 wl_bss_handle_sae_auth(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
14310 err = wl_cfg80211_event_sae_key(cfg, ndev, &sae_key);
14323 wl_get_auth_assoc_status(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
14331 struct wl_security *sec = wl_read_prof(cfg, ndev, WL_PROF_SEC);
14335 (void)memcpy_s(&cfg->event_auth_assoc, sizeof(wl_event_msg_t),
14338 ntoh32(cfg->event_auth_assoc.event_type),
14339 ntoh32(cfg->event_auth_assoc.status),
14340 ntoh32(cfg->event_auth_assoc.reason)));
14351 wl_bss_handle_sae_auth(cfg, ndev, e, data);
14366 wl_notify_connect_status_ap_rx_mgmt(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
14385 struct wiphy *wiphy = bcmcfg_to_wiphy(cfg);
14403 if (wl_get_mode_by_netdev(cfg, ndev) == WL_INVALID) {
14411 NULL, 0, cfg->ioctl_buf, WLC_IOCTL_SMLEN, bsscfgidx, &cfg->ioctl_buf_sync);
14412 memcpy(da.octet, cfg->ioctl_buf, ETHER_ADDR_LEN);
14458 err = wl_frame_get_mgmt(cfg, fc, &da, &e->addr, &bssid,
14492 wl_notify_connect_status_ap(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
14507 wl_get_auth_assoc_status(cfg, ndev, e, data);
14512 wl_get_p2p_status(cfg, IF_DELETING) && (ndev != bcmcfg_to_prmry_ndev(cfg))) {
14515 complete(&cfg->iface_disable);
14521 (wl_get_mode_by_netdev(cfg, ndev) == WL_MODE_AP)) {
14522 if (!wl_get_drv_status(cfg, AP_CREATED, ndev)) {
14525 wl_set_drv_status(cfg, AP_CREATED, ndev);
14527 wake_up_interruptible(&cfg->netif_change_event);
14529 wl_ap_stainfo_init(cfg);
14548 dhdp = (dhd_pub_t *)(cfg->pub);
14550 dhd_schedule_gather_ap_stadata(cfg, ndev, e);
14557 return wl_notify_connect_status_ap_rx_mgmt(cfg, ndev, e, data);
14590 err = wl_notify_connect_status_ap_rx_mgmt(cfg, ndev, e, data);
14615 int wl_get_connect_failed_status(struct bcm_cfg80211 *cfg, const wl_event_msg_t *e) argument
14619 cfg->assoc_reject_status = 0;
14623 ntoh32(cfg->event_auth_assoc.event_type),
14624 (int)ntoh32(cfg->event_auth_assoc.status),
14625 (int)ntoh32(cfg->event_auth_assoc.reason)));
14627 switch ((int)ntoh32(cfg->event_auth_assoc.status)) {
14629 cfg->assoc_reject_status = BIGDATA_ASSOC_REJECT_NO_ACK;
14632 cfg->assoc_reject_status = BIGDATA_ASSOC_REJECT_FAIL;
14635 cfg->assoc_reject_status = BIGDATA_ASSOC_REJECT_UNSOLICITED;
14638 cfg->assoc_reject_status = BIGDATA_ASSOC_REJECT_TIMEOUT;
14641 cfg->assoc_reject_status = BIGDATA_ASSOC_REJECT_ABORT;
14645 cfg->assoc_reject_status =
14650 cfg->assoc_reject_status = BIGDATA_ASSOC_REJECT_MAX;
14653 if (cfg->assoc_reject_status) {
14654 if (ntoh32(cfg->event_auth_assoc.event_type) == WLC_E_ASSOC) {
14655 cfg->assoc_reject_status += BIGDATA_ASSOC_REJECT_MAX;
14660 WL_ERR(("assoc_reject_status %d \n", cfg->assoc_reject_status));
14667 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
14670 if (cfg == NULL) {
14674 cfg->assoc_reject_status);
14681 wl_notify_connect_status_ibss(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
14691 struct wiphy *wiphy = bcmcfg_to_wiphy(cfg);
14715 if (wl_get_drv_status(cfg, CONNECTED, ndev)) {
14717 u8 *cur_bssid = wl_read_prof(cfg, ndev, WL_PROF_BSSID);
14726 wl_get_assoc_ies(cfg, ndev);
14727 wl_update_prof(cfg, ndev, NULL, (const void *)&e->addr, WL_PROF_BSSID);
14728 wl_update_bss_info(cfg, ndev, false);
14739 wl_link_up(cfg);
14740 wl_get_assoc_ies(cfg, ndev);
14741 wl_update_prof(cfg, ndev, NULL, (const void *)&e->addr, WL_PROF_BSSID);
14742 wl_update_bss_info(cfg, ndev, false);
14748 wl_set_drv_status(cfg, CONNECTED, ndev);
14750 wl_update_prof(cfg, ndev, NULL, (const void *)&active, WL_PROF_ACT);
14754 wl_clr_drv_status(cfg, CONNECTED, ndev);
14755 wl_link_down(cfg);
14756 wl_init_prof(cfg, ndev);
14861 int wl_get_bss_info(struct bcm_cfg80211 *cfg, struct net_device *dev, struct ether_addr const *mac) argument
14885 strlcpy(cfg->bss_info, "x x x x x x x x x x x x x x x", sizeof(cfg->bss_info));
14887 *(u32 *) cfg->extra_buf = htod32(WL_EXTRA_BUF_MAX);
14889 err = wldev_ioctl_get(dev, WLC_GET_BSS_INFO, cfg->extra_buf, WL_EXTRA_BUF_MAX);
14892 cfg->roam_count = 0;
14898 cfg->roam_count = 0;
14904 bi = (wl_bss_info_v109_1_t *)(cfg->extra_buf + 4);
14984 wiphy = bcmcfg_to_wiphy(cfg);
15076 if (cfg->roam_offload) {
15079 snprintf(roam_count_str, sizeof(roam_count_str), "%d", cfg->roam_count);
15081 cfg->roam_count = 0;
15093 snprintf(cfg->bss_info, GET_BSS_INFO_LEN,
15101 snprintf(cfg->bss_info, GET_BSS_INFO_LEN,
15115 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
15117 if (cfg == NULL) {
15127 memcpy(cmd, cfg->bss_info, GET_BSS_INFO_LEN);
15139 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
15140 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
15142 BCM_REFERENCE(cfg);
15157 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
15165 dev = ndev_to_wlc_ndev(ndev, cfg);
15167 if (p2p_is_on(cfg)) {
15171 if ((wl_cfgp2p_discover_enable_search(cfg, false)) < 0) {
15204 wl_cfg80211_handle_deauth_ind(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
15225 wl_cfg80211_del_pmksa(cfg->wdev->wiphy, ndev, &pmksa);
15233 wl_cache_assoc_resp_ies(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
15236 struct wl_connect_info *conn_info = wl_to_conn(cfg);
15257 wl_notify_connect_status(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
15287 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
15289 sec = wl_read_prof(cfg, ndev, WL_PROF_SEC);
15291 dhdp = (dhd_pub_t *)(cfg->pub);
15294 mode = wl_get_mode_by_netdev(cfg, ndev);
15300 err = wl_notify_connect_status_ap(cfg, ndev, e, data);
15302 err = wl_notify_connect_status_ibss(cfg, ndev, e, data);
15308 if (!wl_get_drv_status(cfg, CFG80211_CONNECT, ndev)) {
15319 wl_get_auth_assoc_status(cfg, ndev, e, data);
15324 wl_cache_assoc_resp_ies(cfg, ndev, e, data);
15330 DHD_DISABLE_RUNTIME_PM((dhd_pub_t *)cfg->pub);
15332 if (wl_is_linkup(cfg, e, ndev)) {
15333 wl_link_up(cfg);
15335 if (!wl_get_drv_status(cfg, DISCONNECTING, ndev)) {
15340 !wl_get_drv_status(cfg, CONNECTED, ndev) &&
15341 !wl_get_drv_status(cfg, CONNECTING, ndev)) {
15351 !wl_get_drv_status(cfg, CONNECTED, ndev)) {
15358 if (event == WLC_E_LINK && ndev == bcmcfg_to_prmry_ndev(cfg)) {
15363 !cfg->roam_offload &&
15365 wl_get_drv_status(cfg, CONNECTED, ndev)) {
15376 !cfg->roam_offload &&
15378 wl_get_drv_status(cfg, CONNECTED, ndev))
15379 wl_bss_roaming_done(cfg, ndev, e, data);
15382 wl_update_prof(cfg, ndev, e, &act, WL_PROF_ACT);
15383 wl_bss_connect_done(cfg, ndev, e, data, true);
15384 if (ndev == bcmcfg_to_prmry_ndev(cfg)) {
15385 vndr_oui_num = wl_vndr_ies_get_vendor_oui(cfg,
15394 ((struct wlc_ssid *)wl_read_prof(cfg, ndev,
15400 wl_cfg80211_wbtext_set_wnm_maxidle(cfg, ndev);
15404 wl_update_prof(cfg, ndev, e, &act, WL_PROF_ACT);
15405 wl_update_prof(cfg, ndev, NULL, (const void *)&e->addr, WL_PROF_BSSID);
15407 } else if (wl_is_linkdown(cfg, e)) {
15413 } else if (wl_is_linkdown(cfg, e) ||
15416 (wl_get_drv_status(cfg, CONNECTED, ndev)))) {
15418 if (wl_is_linkdown(cfg, e)) {
15420 if ((bssidx = wl_get_bssidx_by_wdev(cfg,
15425 if ((err = wl_cfg80211_set_mgmt_vndr_ies(cfg,
15434 wl_get_drv_status(cfg, CONNECTING, ndev),
15435 wl_get_drv_status(cfg, CONNECTED, ndev),
15436 wl_get_drv_status(cfg, DISCONNECTING, ndev),
15437 wl_get_drv_status(cfg, NESTED_CONNECT, ndev)));
15457 if (wl_get_drv_status(cfg, DISCONNECTING, ndev) &&
15458 (wl_get_drv_status(cfg, NESTED_CONNECT, ndev) ||
15459 wl_get_drv_status(cfg, CONNECTING, ndev))) {
15466 wl_clr_drv_status(cfg, NESTED_CONNECT, ndev);
15467 wl_clr_drv_status(cfg, DISCONNECTING, ndev);
15469 wl_clr_drv_status(cfg, CONNECTED, ndev);
15473 if (wl_get_drv_status(cfg, CONNECTED, ndev)) {
15474 wl_flush_fw_log_buffer(bcmcfg_to_prmry_ndev(cfg),
15478 wl_del_roam_timeout(cfg);
15481 if (ndev == bcmcfg_to_prmry_ndev(cfg)) {
15483 cfg->p2p_resp_apchn_status = false;
15487 wl_cfg80211_cancel_scan(cfg);
15490 if (wl_get_drv_status(cfg, CONNECTED, ndev)) {
15491 wl_get_bss_info(cfg, ndev, &e->addr);
15495 wiphy = bcmcfg_to_wiphy(cfg);
15496 ssid = (struct wlc_ssid *)wl_read_prof(cfg, ndev, WL_PROF_SSID);
15497 bssid = (u8 *)wl_read_prof(cfg, ndev, WL_PROF_BSSID);
15507 if (wl_get_drv_status(cfg, CONNECTED, ndev)) {
15509 u8 *curbssid = wl_read_prof(cfg, ndev, WL_PROF_BSSID);
15521 wl_cfg80211_handle_deauth_ind(cfg, ndev, e, data);
15531 if (cfg->roam_offload) {
15544 dhd_pub_t *dhd = (dhd_pub_t *)cfg->pub;
15562 if (ndev == bcmcfg_to_prmry_ndev(cfg)) {
15568 dhd_dev_set_rssi_monitor_cfg(bcmcfg_to_prmry_ndev(cfg),
15571 wl_clr_drv_status(cfg, CONNECTED, ndev);
15573 if (!wl_get_drv_status(cfg, DISCONNECTING, ndev)) {
15591 if (wl_get_drv_status(cfg, DISCONNECTING, ndev)) {
15627 wl_cfg80211_wbtext_clear_bssid_list(cfg);
15691 wl_cfg80211_disconnect_state_sync(cfg, ndev);
15692 wl_link_down(cfg);
15693 wl_init_prof(cfg, ndev);
15695 else if (wl_get_drv_status(cfg, CONNECTING, ndev)) {
15725 wl_bss_connect_done(cfg, ndev, e, data, false);
15728 wl_clr_drv_status(cfg, DISCONNECTING, ndev);
15731 if (ndev != bcmcfg_to_prmry_ndev(cfg))
15732 complete(&cfg->iface_disable);
15734 ((dhd_pub_t *)cfg->pub)->aifsn_reverse = FALSE;
15740 wl_cfg80211_tdls_config(cfg, TDLS_STATE_DISCONNECT, false);
15742 } else if (wl_is_nonetwork(cfg, e)) {
15754 wl_get_connect_failed_status(cfg, e);
15761 wl_cfg80211_cancel_scan(cfg);
15763 if (wl_get_drv_status(cfg, CONNECTING, ndev)) {
15764 if (!wl_get_drv_status(cfg, DISCONNECTING, ndev)) {
15773 wl_clr_drv_status(cfg, DISCONNECTING, ndev);
15775 wl_bss_connect_done(cfg, ndev, e, data, false);
15776 wl_clr_drv_status(cfg, CONNECTING, ndev);
15783 DHD_ENABLE_RUNTIME_PM((dhd_pub_t *)cfg->pub);
15786 WL_ERR(("Invalid ndev status %d\n", wl_get_mode_by_netdev(cfg, ndev)));
15794 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
15796 cfg->rmc_event_pid = pid;
15804 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
15806 cfg->aibss_txfail_pid = pid;
15811 wl_notify_aibss_txfail(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
15817 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
15820 if (cfg->aibss_txfail_pid != 0) {
15836 ret = wl_netlink_send_msg(cfg->aibss_txfail_pid, AIBSS_EVENT_TXFAIL,
15837 cfg->aibss_txfail_seq++, &e->addr, ETHER_ADDR_LEN);
15841 evt, cfg->aibss_txfail_pid, ret, CONST_ETHERP_TO_MACF(&e->addr)));
15847 wl_notify_rmc_status(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
15857 if (cfg->rmc_event_pid != 0) {
15858 ret = wl_netlink_send_msg(cfg->rmc_event_pid,
15860 cfg->rmc_event_seq++, NULL, 0);
15866 WL_DBG(("rmcevent : evt=%d, pid=%d, ret=%d\n", evt, cfg->rmc_event_pid, ret));
15873 wl_handle_roam_exp_event(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
15884 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
15890 wl_update_prof(cfg, ndev, NULL, ssid, WL_PROF_SSID);
15904 static s32 wl_handle_rssi_monitor_event(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
15910 struct net_device *ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
15911 struct wiphy *wiphy = bcmcfg_to_wiphy(cfg);
15934 wl_notify_roaming_status(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
15946 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
15950 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
15952 if ((!cfg->disable_roam_event) && (event == WLC_E_BSSID)) {
15954 cfg->disable_roam_event = TRUE;
15957 if ((cfg->disable_roam_event) && (event == WLC_E_ROAM))
15961 if (wl_get_drv_status(cfg, CONNECTED, ndev)) {
15963 sec = wl_read_prof(cfg, ndev, WL_PROF_SEC);
15970 wl_bss_roaming_done(cfg, ndev, e, data);
15978 wl_del_roam_timeout(cfg);
15982 wl_bss_roaming_done(cfg, ndev, e, data);
15988 wl_cfg80211_wbtext_set_wnm_maxidle(cfg, ndev);
16001 wl_cfg80211_wbtext_update_rcc(cfg, ndev);
16006 wl_bss_connect_done(cfg, ndev, e, data, true);
16009 wl_update_prof(cfg, ndev, e, &act, WL_PROF_ACT);
16010 wl_update_prof(cfg, ndev, NULL, (const void *)&e->addr, WL_PROF_BSSID);
16012 if (ndev == bcmcfg_to_prmry_ndev(cfg)) {
16013 wl_vndr_ies_get_vendor_oui(cfg, ndev, NULL, 0);
16018 wl_del_roam_timeout(cfg);
16030 wl_check_pmstatus(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
16037 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
16042 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
16044 pbuf = (u8 *)MALLOCZ(cfg->osh, WLC_IOCTL_MEDLEN);
16052 0, &cfg->ioctl_buf_sync);
16061 MFREE(cfg->osh, pbuf, WLC_IOCTL_MEDLEN);
16129 struct bcm_cfg80211 *cfg; local
16133 cfg = wl_get_cfg(ndev);
16134 if (cfg)
16135 return (uint8 *)(cfg->up_table);
16144 wl_notify_roam_prep_status(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
16149 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
16165 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
16168 if (ndev == bcmcfg_to_prmry_ndev(cfg)) {
16174 sec = wl_read_prof(cfg, ndev, WL_PROF_SEC);
16188 mod_timer(&cfg->roam_timeout, jiffies + msecs_to_jiffies(WL_ROAM_TIMEOUT_MS));
16196 wl_notify_roam_start_status(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
16200 struct net_device *ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
16201 struct wiphy *wiphy = bcmcfg_to_wiphy(cfg);
16214 wl_cfg80211_hogsqs_notify(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
16222 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
16229 mutex_lock(&cfg->usr_sync);
16233 mutex_unlock(&cfg->usr_sync);
16241 mutex_unlock(&cfg->usr_sync);
16249 schedule_delayed_work(&cfg->hogsqs_eventwork,
16256 static s32 wl_get_assoc_ies(struct bcm_cfg80211 *cfg, struct net_device *ndev) argument
16259 struct wl_connect_info *conn_info = wl_to_conn(cfg);
16266 err = wldev_iovar_getbuf(ndev, "assoc_info", NULL, 0, cfg->extra_buf,
16272 memcpy(&assoc_info, cfg->extra_buf, sizeof(wl_assoc_info_t));
16286 err = wldev_iovar_getbuf(ndev, "assoc_req_ies", NULL, 0, cfg->extra_buf,
16303 memcpy(conn_info->req_ie, cfg->extra_buf, conn_info->req_ie_len);
16314 err = wldev_iovar_getbuf(ndev, "assoc_resp_ies", NULL, 0, cfg->extra_buf,
16328 memcpy(conn_info->resp_ie, cfg->extra_buf, conn_info->resp_ie_len);
16340 if (!cfg->up_table) {
16341 cfg->up_table = (uint8 *)MALLOC(cfg->osh, UP_TABLE_MAX);
16343 wl_set_up_table(cfg->up_table, qos_map_ie);
16345 MFREE(cfg->osh, cfg->up_table, UP_TABLE_MAX);
16354 DHD_REVERSE_AIFSN(cfg->pub, ndev);
16363 struct bcm_cfg80211 *cfg = local
16366 if ((ch != 0) && (cfg && !cfg->rcc_enabled)) {
16415 static s32 wl_update_bss_info(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
16433 wiphy = bcmcfg_to_wiphy(cfg);
16435 ssid = (struct wlc_ssid *)wl_read_prof(cfg, ndev, WL_PROF_SSID);
16436 curbssid = wl_read_prof(cfg, ndev, WL_PROF_BSSID);
16439 buf = (char *)MALLOCZ(cfg->osh, WL_EXTRA_BUF_MAX);
16444 mutex_lock(&cfg->usr_sync);
16453 wl_update_prof(cfg, ndev, NULL, &channel, WL_PROF_CHAN);
16462 err = wl_inform_single_bss(cfg, bi, update_ssid);
16508 wl_update_prof(cfg, ndev, NULL, &beacon_interval, WL_PROF_BEACONINT);
16509 wl_update_prof(cfg, ndev, NULL, &dtim_period, WL_PROF_DTIMPERIOD);
16516 MFREE(cfg->osh, buf, WL_EXTRA_BUF_MAX);
16517 mutex_unlock(&cfg->usr_sync);
16522 wl_bss_roaming_done(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
16525 struct wl_connect_info *conn_info = wl_to_conn(cfg);
16531 struct wiphy *wiphy = bcmcfg_to_wiphy(cfg);
16546 struct wl_fils_info *fils_info = wl_to_fils_info(cfg);
16547 struct wl_security *sec = wl_read_prof(cfg, ndev, WL_PROF_SEC);
16549 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
16560 curbssid = wl_read_prof(cfg, ndev, WL_PROF_BSSID);
16561 channel = (u32 *)wl_read_prof(cfg, ndev, WL_PROF_CHAN);
16578 ETHER_ADDR_LEN) == 0) || (memcmp(&cfg->last_roamed_addr,
16587 if ((err = wl_get_assoc_ies(cfg, ndev)) != BCME_OK) {
16606 wl_update_prof(cfg, ndev, NULL, (const void *)(e->addr.octet), WL_PROF_BSSID);
16607 curbssid = wl_read_prof(cfg, ndev, WL_PROF_BSSID);
16608 if ((err = wl_update_bss_info(cfg, ndev, true)) != BCME_OK) {
16612 wl_update_pmklist(ndev, cfg->pmk_list, err);
16614 channel = (u32 *)wl_read_prof(cfg, ndev, WL_PROF_CHAN);
16630 memcpy(cfg->fbt_key, data, FBT_KEYLEN);
16675 memcpy(&cfg->last_roamed_addr, &e->addr, ETHER_ADDR_LEN);
16676 wl_set_drv_status(cfg, CONNECTED, ndev);
16679 cfg->roam_count++;
16682 if (wl_adps_bad_ap_check(cfg, &e->addr)) {
16683 if (wl_adps_enabled(cfg, ndev)) {
16684 wl_adps_set_suspend(cfg, ndev, ADPS_SUSPEND);
16703 wl_del_roam_timeout(cfg);
16709 wl_cfg80211_verify_bss(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
16719 wiphy = bcmcfg_to_wiphy(cfg);
16720 ssid = (struct wlc_ssid *)wl_read_prof(cfg, ndev, WL_PROF_SSID);
16721 curbssid = wl_read_prof(cfg, ndev, WL_PROF_BSSID);
16761 wl_get_fils_connect_params(struct bcm_cfg80211 *cfg, struct net_device *ndev) argument
16764 struct wl_fils_info *fils_info = wl_to_fils_info(cfg);
16771 iov_buf_in = MALLOCZ(cfg->osh, WLC_IOCTL_SMLEN);
16780 iov_buf_in, WLC_IOCTL_SMLEN, &cfg->ioctl_buf_sync);
16830 MFREE(cfg->osh, iov_buf_in, WLC_IOCTL_SMLEN);
16836 wl_bss_connect_done(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
16839 struct wl_connect_info *conn_info = wl_to_conn(cfg);
16840 struct wl_security *sec = wl_read_prof(cfg, ndev, WL_PROF_SEC);
16849 u8 *curbssid = wl_read_prof(cfg, ndev, WL_PROF_BSSID);
16853 dhdp = (dhd_pub_t *)(cfg->pub);
16862 if (wl_get_drv_status(cfg, CONNECTED, ndev)) {
16876 if (cfg->scan_request) {
16877 wl_cfg80211_cancel_scan(cfg);
16880 if (wl_get_drv_status(cfg, CONNECTING, ndev)) {
16881 wl_cfg80211_scan_abort(cfg);
16883 wl_get_assoc_ies(cfg, ndev);
16884 wl_update_prof(cfg, ndev, NULL, (const void *)(e->addr.octet),
16886 curbssid = wl_read_prof(cfg, ndev, WL_PROF_BSSID);
16892 wl_update_bss_info(cfg, ndev, true);
16893 wl_update_pmklist(ndev, cfg->pmk_list, err);
16894 wl_set_drv_status(cfg, CONNECTED, ndev);
16900 if (ndev != bcmcfg_to_prmry_ndev(cfg)) {
16902 init_completion(&cfg->iface_disable);
16905 INIT_COMPLETION(cfg->iface_disable);
16910 if (ndev == bcmcfg_to_prmry_ndev(cfg))
16922 bzero(&cfg->last_roamed_addr, ETHER_ADDR_LEN);
16924 wl_clr_drv_status(cfg, CONNECTING, ndev);
16926 if (completed && (wl_cfg80211_verify_bss(cfg, ndev, &bss) != true)) {
16937 wl_get_fils_connect_params(cfg, ndev);
16938 fils_info = wl_to_fils_info(cfg);
16939 ssid = (struct wlc_ssid *)wl_read_prof(cfg, ndev, WL_PROF_SSID);
16940 wiphy = bcmcfg_to_wiphy(cfg);
16991 if (wl_adps_bad_ap_check(cfg, &e->addr)) {
16992 if (wl_adps_enabled(cfg, ndev)) {
16993 wl_adps_set_suspend(cfg, ndev, ADPS_SUSPEND);
17002 ndev->name, event_type, wl_get_drv_status(cfg, CONNECTING, ndev),
17003 wl_get_drv_status(cfg, CONNECTED, ndev)));
17016 wl_notify_mic_status(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
17023 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
17027 mutex_lock(&cfg->usr_sync);
17036 mutex_unlock(&cfg->usr_sync);
17043 wl_notify_bt_wifi_handover_req(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
17052 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
17060 wl_frame_get_mgmt(struct bcm_cfg80211 *cfg, u16 fc, argument
17083 *pheader = (u8 *)MALLOCZ(cfg->osh, totlen);
17104 wl_gon_req_collision(struct bcm_cfg80211 *cfg, wl_action_frame_t *tx_act_frm, argument
17108 if (cfg->afx_hdl->pending_tx_act_frm == NULL)
17133 cfg->block_gon_req_tx_count = BLOCK_GON_REQ_MAX_NUM;
17139 if (wl_get_drv_status_all(cfg, FINDING_COMMON_CHANNEL)) {
17140 wl_clr_drv_status(cfg, FINDING_COMMON_CHANNEL, ndev);
17141 complete(&cfg->act_frm_scan);
17146 cfg->block_gon_req_rx_count = BLOCK_GON_REQ_MAX_NUM;
17154 wl_stop_wait_next_action_frame(struct bcm_cfg80211 *cfg, struct net_device *ndev, u8 bsscfgidx) argument
17158 if (wl_get_drv_status_all(cfg, FINDING_COMMON_CHANNEL)) {
17159 if (timer_pending(&cfg->p2p->listen_timer)) {
17160 del_timer_sync(&cfg->p2p->listen_timer);
17162 if (cfg->afx_hdl != NULL) {
17163 if (cfg->afx_hdl->dev != NULL) {
17164 wl_clr_drv_status(cfg, SCANNING, cfg->afx_hdl->dev);
17165 wl_clr_drv_status(cfg, FINDING_COMMON_CHANNEL, cfg->afx_hdl->dev);
17167 cfg->afx_hdl->peer_chan = WL_INVALID;
17169 complete(&cfg->act_frm_scan);
17171 } else if (wl_get_drv_status_all(cfg, SENDING_ACT_FRM)) {
17172 if (!(wl_get_p2p_status(cfg, ACTION_TX_COMPLETED) ||
17173 wl_get_p2p_status(cfg, ACTION_TX_NOACK)))
17174 wl_set_p2p_status(cfg, ACTION_TX_COMPLETED);
17184 if (cfg->af_sent_channel) {
17188 wl_cfg80211_scan_abort(cfg);
17196 else if (wl_get_drv_status_all(cfg, WAITING_NEXT_ACT_FRM_LISTEN)) {
17199 wl_cfg80211_scan_abort(cfg);
17275 wl_notify_rx_mgmt_frame(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
17279 struct wiphy *wiphy = bcmcfg_to_wiphy(cfg);
17296 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
17312 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
17317 for_each_ndev(cfg, iter, next) {
17356 err = wl_frame_get_mgmt(cfg, FC_ACTION, &da, &e->addr, &bssid,
17379 if (sd_act_frm && wl_get_drv_status_all(cfg, WAITING_NEXT_ACT_FRM)) {
17380 if (cfg->next_af_subtype == sd_act_frm->action) {
17383 wl_clr_drv_status(cfg, WAITING_NEXT_ACT_FRM, ndev);
17386 wl_stop_wait_next_action_frame(cfg, ndev, bsscfgidx);
17406 cfg->tdls_mgmt_frame = mgmt_frame;
17407 cfg->tdls_mgmt_frame_len = mgmt_frame_len;
17408 cfg->tdls_mgmt_freq = freq;
17421 if (!cfg->up_table) {
17422 cfg->up_table = (uint8 *)MALLOC(cfg->osh, UP_TABLE_MAX);
17424 wl_set_up_table(cfg->up_table, qos_map_ie);
17426 MFREE(cfg->osh, cfg->up_table, UP_TABLE_MAX);
17458 if (cfg->next_af_subtype != P2P_PAF_SUBTYPE_INVALID) {
17463 } else if (cfg->next_af_subtype == action) {
17466 wl_clr_drv_status(cfg, WAITING_NEXT_ACT_FRM, ndev);
17469 wl_stop_wait_next_action_frame(cfg, ndev, bsscfgidx);
17477 wl_gon_req_collision(cfg,
17478 &cfg->afx_hdl->pending_tx_act_frm->action_frame,
17481 if (cfg->block_gon_req_rx_count) {
17483 cfg->block_gon_req_rx_count));
17484 cfg->block_gon_req_rx_count--;
17489 cfg->block_gon_req_tx_count = 0;
17490 cfg->block_gon_req_rx_count = 0;
17494 if (wl_get_drv_status_all(cfg, WAITING_NEXT_ACT_FRM)) {
17495 if (cfg->next_af_subtype == act_frm->subtype) {
17498 wl_clr_drv_status(cfg, WAITING_NEXT_ACT_FRM, ndev);
17500 if (cfg->next_af_subtype == P2P_PAF_GON_CONF) {
17505 wl_stop_wait_next_action_frame(cfg, ndev, bsscfgidx);
17506 } else if ((cfg->next_af_subtype == P2P_PAF_GON_RSP) &&
17522 wl_clr_p2p_status(cfg, GO_NEG_PHASE);
17589 err = wl_frame_get_mgmt(cfg, FC_AUTH, &da, &e->addr, &bssid,
17611 if (WL_DRV_STATUS_SENDING_AF_FRM_EXT(cfg) &&
17612 !memcmp(cfg->afx_hdl->tx_dst_addr.octet, e->addr.octet,
17614 if (cfg->afx_hdl->pending_tx_act_frm &&
17615 wl_get_drv_status_all(cfg, FINDING_COMMON_CHANNEL)) {
17619 cfg->afx_hdl->peer_chan = channel;
17620 complete(&cfg->act_frm_scan);
17628 if (cfg->p2p &&
17630 cfg->p2p_prb_noti &&
17632 wl_get_p2p_status(cfg, GO_NEG_PHASE)) {
17640 if (discover_cfgdev(cfgdev, cfg))
17659 MFREE(cfg->osh, mgmt_frame, mgmt_frame_len);
17674 static void wl_init_prof(struct bcm_cfg80211 *cfg, struct net_device *ndev) argument
17677 struct wl_profile *profile = wl_get_profile_by_netdev(cfg, ndev);
17684 WL_CFG_DRV_LOCK(&cfg->cfgdrv_lock, flags);
17686 WL_CFG_DRV_UNLOCK(&cfg->cfgdrv_lock, flags);
17689 static void wl_init_event_handler(struct bcm_cfg80211 *cfg) argument
17691 bzero(cfg->evt_handler, sizeof(cfg->evt_handler));
17693 cfg->evt_handler[WLC_E_SCAN_COMPLETE] = wl_notify_scan_status;
17694 cfg->evt_handler[WLC_E_AUTH] = wl_notify_connect_status;
17695 cfg->evt_handler[WLC_E_ASSOC] = wl_notify_connect_status;
17696 cfg->evt_handler[WLC_E_LINK] = wl_notify_connect_status;
17697 cfg->evt_handler[WLC_E_DEAUTH_IND] = wl_notify_connect_status;
17698 cfg->evt_handler[WLC_E_DEAUTH] = wl_notify_connect_status;
17699 cfg->evt_handler[WLC_E_DISASSOC_IND] = wl_notify_connect_status;
17700 cfg->evt_handler[WLC_E_ASSOC_IND] = wl_notify_connect_status;
17701 cfg->evt_handler[WLC_E_REASSOC_IND] = wl_notify_connect_status;
17702 cfg->evt_handler[WLC_E_ROAM] = wl_notify_roaming_status;
17703 cfg->evt_handler[WLC_E_MIC_ERROR] = wl_notify_mic_status;
17704 cfg->evt_handler[WLC_E_SET_SSID] = wl_notify_connect_status;
17705 cfg->evt_handler[WLC_E_ACTION_FRAME_RX] = wl_notify_rx_mgmt_frame;
17706 cfg->evt_handler[WLC_E_PROBREQ_MSG] = wl_notify_rx_mgmt_frame;
17707 cfg->evt_handler[WLC_E_P2P_PROBREQ_MSG] = wl_notify_rx_mgmt_frame;
17708 cfg->evt_handler[WLC_E_P2P_DISC_LISTEN_COMPLETE] = wl_cfgp2p_listen_complete;
17709 cfg->evt_handler[WLC_E_ACTION_FRAME_COMPLETE] = wl_cfgp2p_action_tx_complete;
17710 cfg->evt_handler[WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE] = wl_cfgp2p_action_tx_complete;
17711 cfg->evt_handler[WLC_E_JOIN] = wl_notify_connect_status;
17712 cfg->evt_handler[WLC_E_START] = wl_notify_connect_status;
17713 cfg->evt_handler[WLC_E_AUTH_IND] = wl_notify_connect_status;
17714 cfg->evt_handler[WLC_E_ASSOC_RESP_IE] = wl_notify_connect_status;
17716 cfg->evt_handler[WLC_E_PFN_NET_FOUND] = wl_notify_pfn_status;
17719 cfg->evt_handler[WLC_E_PFN_BEST_BATCHING] = wl_notify_gscan_event;
17720 cfg->evt_handler[WLC_E_PFN_SCAN_COMPLETE] = wl_notify_gscan_event;
17721 cfg->evt_handler[WLC_E_PFN_GSCAN_FULL_RESULT] = wl_notify_gscan_event;
17722 cfg->evt_handler[WLC_E_PFN_BSSID_NET_FOUND] = wl_notify_gscan_event;
17723 cfg->evt_handler[WLC_E_PFN_BSSID_NET_LOST] = wl_notify_gscan_event;
17724 cfg->evt_handler[WLC_E_PFN_SSID_EXT] = wl_notify_gscan_event;
17725 cfg->evt_handler[WLC_E_GAS_FRAGMENT_RX] = wl_notify_gscan_event;
17726 cfg->evt_handler[WLC_E_ROAM_EXP_EVENT] = wl_handle_roam_exp_event;
17729 cfg->evt_handler[WLC_E_RSSI_LQM] = wl_handle_rssi_monitor_event;
17732 cfg->evt_handler[WLC_E_TDLS_PEER_EVENT] = wl_tdls_event_handler;
17734 cfg->evt_handler[WLC_E_BSSID] = wl_notify_roaming_status;
17736 cfg->evt_handler[WLC_E_AIBSS_TXFAIL] = wl_notify_aibss_txfail;
17739 cfg->evt_handler[WLC_E_RMC_EVENT] = wl_notify_rmc_status;
17742 cfg->evt_handler[WLC_E_BT_WIFI_HANDOVER_REQ] = wl_notify_bt_wifi_handover_req;
17745 cfg->evt_handler[WLC_E_NAN_CRITICAL] = wl_cfgnan_notify_nan_status;
17746 cfg->evt_handler[WLC_E_NAN_NON_CRITICAL] = wl_cfgnan_notify_nan_status;
17748 cfg->evt_handler[WLC_E_CSA_COMPLETE_IND] = wl_csa_complete_ind;
17749 cfg->evt_handler[WLC_E_AP_STARTED] = wl_ap_start_ind;
17751 cfg->evt_handler[WLC_E_EXCESS_PM_WAKE_EVENT] = wl_check_pmstatus;
17754 cfg->evt_handler[WLC_E_ROAM_PREP] = wl_notify_roam_prep_status;
17756 cfg->evt_handler[WLC_E_ROAM_START] = wl_notify_roam_start_status;
17758 cfg->evt_handler[WLC_E_ADPS] = wl_adps_event_handler;
17760 cfg->evt_handler[WLC_E_PSK_SUP] = wl_cfg80211_sup_event_handler;
17762 cfg->evt_handler[WLC_E_BCNRECV_ABORTED] = wl_bcnrecv_aborted_event_handler;
17765 cfg->evt_handler[WLC_E_MBO] = wl_mbo_event_handler;
17768 cfg->evt_handler[WLC_E_ADDTS_IND] = wl_cfg80211_cac_event_handler;
17769 cfg->evt_handler[WLC_E_DELTS_IND] = wl_cfg80211_cac_event_handler;
17772 cfg->evt_handler[WLC_E_PRUNE] = wl_bssid_prune_event_handler;
17775 cfg->evt_handler[WLC_E_PROXD] = wl_cfg80211_rtt_event_handler;
17778 cfg->evt_handler[WLC_E_BSS_LOAD] = wl_cfg80211_bssload_report_event_handler;
17780 cfg->evt_handler[WLC_E_IND_DOS_STATUS] = wl_notify_dos_status;
17782 cfg->evt_handler[WLC_E_EXT_AUTH_REQ] = wl_notify_extauth_req_event;
17783 cfg->evt_handler[WLC_E_EXT_AUTH_FRAME_RX] = wl_notify_rx_mgmt_frame;
17784 cfg->evt_handler[WLC_E_MGMT_FRAME_TXSTATUS] = wl_notify_mgmt_frame_tx_complete;
17785 cfg->evt_handler[WLC_E_MGMT_FRAME_OFF_CHAN_COMPLETE] = wl_notify_mgmt_frame_tx_complete;
17788 cfg->evt_handler[WLC_E_LDF_HOGGER] = wl_cfg80211_hogsqs_notify;
17795 wl_init_escan_result_buf(struct bcm_cfg80211 *cfg) argument
17798 cfg->escan_info.escan_buf[0] = DHD_OS_PREALLOC(cfg->pub,
17800 if (cfg->escan_info.escan_buf[0] == NULL) {
17805 cfg->escan_info.escan_buf[1] = DHD_OS_PREALLOC(cfg->pub,
17807 if (cfg->escan_info.escan_buf[1] == NULL) {
17812 bzero(cfg->escan_info.escan_buf[0], ESCAN_BUF_SIZE);
17813 bzero(cfg->escan_info.escan_buf[1], ESCAN_BUF_SIZE);
17814 cfg->escan_info.escan_type[0] = 0;
17815 cfg->escan_info.escan_type[1] = 0;
17817 cfg->escan_info.escan_buf = DHD_OS_PREALLOC(cfg->pub,
17819 if (cfg->escan_info.escan_buf == NULL) {
17823 bzero(cfg->escan_info.escan_buf, ESCAN_BUF_SIZE);
17830 wl_deinit_escan_result_buf(struct bcm_cfg80211 *cfg) argument
17833 if (cfg->escan_info.escan_buf[0] != NULL) {
17834 cfg->escan_info.escan_buf[0] = NULL;
17835 cfg->escan_info.escan_type[0] = 0;
17838 if (cfg->escan_info.escan_buf[1] != NULL) {
17839 cfg->escan_info.escan_buf[1] = NULL;
17840 cfg->escan_info.escan_type[1] = 0;
17843 if (cfg->escan_info.escan_buf != NULL) {
17844 cfg->escan_info.escan_buf = NULL;
17850 static s32 wl_init_priv_mem(struct bcm_cfg80211 *cfg) argument
17854 cfg->scan_results = (struct wl_scan_results *)MALLOCZ(cfg->osh,
17856 if (unlikely(!cfg->scan_results)) {
17860 cfg->conf = (struct wl_conf *)MALLOCZ(cfg->osh, sizeof(*cfg->conf));
17861 if (unlikely(!cfg->conf)) {
17865 cfg->scan_req_int = (void *)MALLOCZ(cfg->osh,
17866 sizeof(*cfg->scan_req_int));
17867 if (unlikely(!cfg->scan_req_int)) {
17871 cfg->ioctl_buf = (u8 *)MALLOCZ(cfg->osh, WLC_IOCTL_MAXLEN);
17872 if (unlikely(!cfg->ioctl_buf)) {
17876 cfg->escan_ioctl_buf = (void *)MALLOCZ(cfg->osh, WLC_IOCTL_MAXLEN);
17877 if (unlikely(!cfg->escan_ioctl_buf)) {
17881 cfg->extra_buf = (void *)MALLOCZ(cfg->osh, WL_EXTRA_BUF_MAX);
17882 if (unlikely(!cfg->extra_buf)) {
17886 cfg->pmk_list = (void *)MALLOCZ(cfg->osh, sizeof(*cfg->pmk_list));
17887 if (unlikely(!cfg->pmk_list)) {
17892 cfg->conn_info = (void *)MALLOCZ(cfg->osh, sizeof(*cfg->conn_info));
17893 if (unlikely(!cfg->conn_info)) {
17897 cfg->ie = (void *)MALLOC(cfg->osh, sizeof(*cfg->ie));
17898 if (unlikely(!cfg->ie)) {
17902 if (unlikely(wl_init_escan_result_buf(cfg))) {
17907 cfg->afx_hdl = (void *)MALLOCZ(cfg->osh, sizeof(*cfg->afx_hdl));
17908 if (unlikely(!cfg->afx_hdl)) {
17912 init_completion(&cfg->act_frm_scan);
17913 init_completion(&cfg->wait_next_af);
17915 INIT_WORK(&cfg->afx_hdl->work, wl_cfg80211_afx_handler);
17918 if (cfg->tdls_mgmt_frame) {
17919 MFREE(cfg->osh, cfg->tdls_mgmt_frame, cfg->tdls_mgmt_frame_len);
17920 cfg->tdls_mgmt_frame = NULL;
17921 cfg->tdls_mgmt_frame_len = 0;
17927 wl_deinit_priv_mem(cfg);
17932 static void wl_deinit_priv_mem(struct bcm_cfg80211 *cfg) argument
17934 MFREE(cfg->osh, cfg->scan_results, WL_SCAN_BUF_MAX);
17935 MFREE(cfg->osh, cfg->conf, sizeof(*cfg->conf));
17936 MFREE(cfg->osh, cfg->scan_req_int, sizeof(*cfg->scan_req_int));
17937 MFREE(cfg->osh, cfg->ioctl_buf, WLC_IOCTL_MAXLEN);
17938 MFREE(cfg->osh, cfg->escan_ioctl_buf, WLC_IOCTL_MAXLEN);
17939 MFREE(cfg->osh, cfg->extra_buf, WL_EXTRA_BUF_MAX);
17940 MFREE(cfg->osh, cfg->pmk_list, sizeof(*cfg->pmk_list));
17942 MFREE(cfg->osh, cfg->conn_info, sizeof(*cfg->conn_info));
17943 MFREE(cfg->osh, cfg->ie, sizeof(*cfg->ie));
17944 wl_deinit_escan_result_buf(cfg);
17946 if (cfg->afx_hdl) {
17947 cancel_work_sync(&cfg->afx_hdl->work);
17948 MFREE(cfg->osh, cfg->afx_hdl, sizeof(*cfg->afx_hdl));
17953 static s32 wl_create_event_handler(struct bcm_cfg80211 *cfg) argument
17960 if (!cfg->event_workq) {
17961 cfg->event_workq = alloc_workqueue("dhd_eventd",
17965 if (!cfg->event_workq) {
17968 INIT_WORK(&cfg->event_work, wl_event_handler);
17971 INIT_WORK(&cfg->event_work, wl_event_handler);
17972 cfg->event_workq_init = true;
17977 static void wl_destroy_event_handler(struct bcm_cfg80211 *cfg) argument
17980 if (cfg && cfg->event_workq) {
17981 cancel_work_sync(&cfg->event_work);
17982 destroy_workqueue(cfg->event_workq);
17983 cfg->event_workq = NULL;
17986 if (cfg && cfg->event_workq_init) {
17987 cancel_work_sync(&cfg->event_work);
17988 cfg->event_workq_init = false;
17995 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
17997 if (cfg) {
17998 wl_destroy_event_handler(cfg);
17999 wl_flush_eq(cfg);
18004 static void wl_del_roam_timeout(struct bcm_cfg80211 *cfg) argument
18006 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
18010 if (timer_pending(&cfg->roam_timeout)) {
18011 del_timer_sync(&cfg->roam_timeout);
18018 struct bcm_cfg80211 *cfg = (struct bcm_cfg80211 *)data; local
18019 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
18129 static void wl_del_csa_timeout(struct bcm_cfg80211 *cfg) argument
18131 if (cfg) {
18132 if (timer_pending(&cfg->csa_timeout)) {
18133 del_timer_sync(&cfg->csa_timeout);
18140 struct bcm_cfg80211 *cfg = (struct bcm_cfg80211 *)data; local
18142 if (cfg->in_csa)
18143 cfg->in_csa = FALSE;
18157 struct bcm_cfg80211 *cfg = NULL; local
18171 cfg = (struct bcm_cfg80211 *)wiphy_priv(wdev->wiphy);
18172 if (!cfg || (cfg != wl_cfg80211_get_bcmcfg())) {
18174 WL_ERR(("wrong cfg ptr (%p)\n", cfg));
18178 if (dev == bcmcfg_to_prmry_ndev(cfg)) {
18220 wl_cfg80211_clear_per_bss_ies(cfg, wdev);
18222 wl_dealloc_netinfo_by_wdev(cfg, wdev);
18231 if (wl_get_drv_status(cfg, SCANNING, dev))
18232 wl_cfg80211_cancel_scan(cfg);
18248 static void wl_cfg80211_concurrent_roam(struct bcm_cfg80211 *cfg, int enable) argument
18250 u32 connected_cnt = wl_get_drv_status_all(cfg, CONNECTED);
18251 bool p2p_connected = wl_cfgp2p_vif_created(cfg);
18254 if (!(cfg->roam_flags & WL_ROAM_OFF_ON_CONCURRENT))
18263 cfg->roam_flags |= WL_ROAM_REVERT_STATUS;
18265 for_each_ndev(cfg, iter, next) {
18279 else if (!enable && (cfg->roam_flags & WL_ROAM_REVERT_STATUS)) {
18280 cfg->roam_flags &= ~WL_ROAM_REVERT_STATUS;
18282 for_each_ndev(cfg, iter, next) {
18302 static void wl_cfg80211_determine_vsdb_mode(struct bcm_cfg80211 *cfg) argument
18308 u32 connected_cnt = wl_get_drv_status_all(cfg, CONNECTED);
18309 cfg->vsdb_mode = false;
18315 for_each_ndev(cfg, iter, next) {
18321 if (wl_get_drv_status(cfg, CONNECTED, iter->ndev)) {
18326 wl_update_prof(cfg, iter->ndev, NULL,
18329 if (!cfg->vsdb_mode) {
18333 cfg->vsdb_mode = true;
18339 WL_ERR(("%s concurrency is enabled\n", cfg->vsdb_mode ? "Multi Channel" : "Same Channel"));
18344 wl_cfg80211_determine_p2p_rsdb_mode(struct bcm_cfg80211 *cfg) argument
18353 is_rsdb_supported = DHD_OPMODE_SUPPORTED(cfg->pub, DHD_FLAG_RSDB_MODE);
18360 for_each_ndev(cfg, iter, next) {
18366 if (wl_get_drv_status(cfg, CONNECTED, iter->ndev)) {
18386 static s32 wl_notifier_change_state(struct bcm_cfg80211 *cfg, struct net_info *_net_info, argument
18393 struct net_device *primary_dev = bcmcfg_to_prmry_ndev(cfg);
18394 dhd_pub_t *dhd = cfg->pub;
18407 mode = wl_get_mode_by_netdev(cfg, _net_info->ndev);
18409 wl_cfg80211_concurrent_roam(cfg, 1);
18410 wl_cfg80211_determine_vsdb_mode(cfg);
18427 wl_add_remove_pm_enable_work(cfg, WL_PM_WORKQ_SHORT);
18435 if (!DHD_OPMODE_SUPPORTED(cfg->pub, DHD_FLAG_HOSTAP_MODE) &&
18437 !wl_cfg80211_determine_p2p_rsdb_mode(cfg)) {
18438 wl_cfg80211_set_frameburst(cfg, FALSE);
18443 wl_get_drv_status(cfg, CONNECTED, bcmcfg_to_prmry_ndev(cfg))) {
18447 wl_cfg80211_set_frameburst(cfg, TRUE);
18453 wl_update_prof(cfg, _net_info->ndev, NULL, &chan, WL_PROF_CHAN);
18454 wl_cfg80211_determine_vsdb_mode(cfg);
18473 wl_cfg80211_concurrent_roam(cfg, 0);
18481 if (!DHD_OPMODE_SUPPORTED(cfg->pub, DHD_FLAG_HOSTAP_MODE)) {
18482 wl_cfg80211_set_frameburst(cfg, TRUE);
18487 (cfg->ap_oper_channel <= CH_MAX_2G_CHANNEL)) {
18489 wl_cfg80211_set_frameburst(cfg, FALSE);
18497 static s32 wl_init_roam_timeout(struct bcm_cfg80211 *cfg) argument
18502 init_timer_compat(&cfg->roam_timeout, wl_roam_timeout, cfg);
18509 static s32 wl_init_csa_timeout(struct bcm_cfg80211 *cfg) argument
18512 init_timer_compat(&cfg->csa_timeout, wl_csa_timeout, cfg);
18517 static s32 wl_init_priv(struct bcm_cfg80211 *cfg) argument
18519 struct wiphy *wiphy = bcmcfg_to_wiphy(cfg);
18520 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
18523 cfg->scan_request = NULL;
18524 cfg->pwr_save = !!(wiphy->flags & WIPHY_FLAG_PS_ON_BY_DEFAULT);
18526 cfg->roam_on = false;
18528 cfg->roam_on = true;
18530 cfg->active_scan = true;
18531 cfg->rf_blocked = false;
18532 cfg->vsdb_mode = false;
18534 cfg->wlfc_on = false;
18536 cfg->roam_flags |= WL_ROAM_OFF_ON_CONCURRENT;
18537 cfg->disable_roam_event = false;
18539 set_bit(WL_STATUS_CONNECTED, &cfg->interrested_state);
18540 spin_lock_init(&cfg->cfgdrv_lock);
18541 mutex_init(&cfg->ioctl_buf_sync);
18542 init_waitqueue_head(&cfg->netif_change_event);
18543 init_completion(&cfg->send_af_done);
18544 init_completion(&cfg->iface_disable);
18545 wl_init_eq(cfg);
18546 err = wl_init_priv_mem(cfg);
18549 if (wl_create_event_handler(cfg))
18551 wl_init_event_handler(cfg);
18552 mutex_init(&cfg->usr_sync);
18553 mutex_init(&cfg->event_sync);
18554 mutex_init(&cfg->if_sync);
18555 mutex_init(&cfg->scan_sync);
18557 mutex_init(&cfg->tdls_sync);
18560 mutex_init(&cfg->bcn_sync);
18563 wl_init_wps_reauth_sm(cfg);
18565 err = wl_init_scan(cfg);
18569 err = wl_init_roam_timeout(cfg);
18575 err = wl_init_csa_timeout(cfg);
18580 wl_init_conf(cfg->conf);
18581 wl_init_prof(cfg, ndev);
18582 wl_link_down(cfg);
18583 DNGL_FUNC(dhd_cfg80211_init, (cfg));
18585 cfg->nan_dp_state = NAN_DP_STATE_DISABLED;
18586 init_waitqueue_head(&cfg->ndp_if_change_event);
18588 cfg->pmk_list->pmkids.length = OFFSETOF(pmkid_list_v3_t, pmkid);
18589 cfg->pmk_list->pmkids.count = 0;
18590 cfg->pmk_list->pmkids.version = PMKID_LIST_VER_3;
18594 static void wl_deinit_priv(struct bcm_cfg80211 *cfg) argument
18596 DNGL_FUNC(dhd_cfg80211_deinit, (cfg));
18597 wl_destroy_event_handler(cfg);
18598 wl_flush_eq(cfg);
18599 wl_link_down(cfg);
18600 del_timer_sync(&cfg->scan_timeout);
18602 del_timer_sync(&cfg->roam_timeout);
18605 del_timer_sync(&cfg->csa_timeout);
18607 wl_deinit_priv_mem(cfg);
18615 static s32 wl_cfg80211_attach_p2p(struct bcm_cfg80211 *cfg) argument
18619 if (wl_cfgp2p_register_ndev(cfg) < 0) {
18627 static s32 wl_cfg80211_detach_p2p(struct bcm_cfg80211 *cfg) argument
18634 if (!cfg) {
18640 wdev = cfg->p2p_wdev;
18648 wl_cfgp2p_unregister_ndev(cfg);
18650 cfg->p2p_wdev = NULL;
18651 cfg->p2p_net = NULL;
18654 MFREE(cfg->osh, wdev, sizeof(*wdev));
18663 struct bcm_cfg80211 * cfg; local
18671 cfg = wl_get_cfg(ndev);
18672 if (unlikely(!cfg)) {
18676 if (!wl_get_drv_status(cfg, READY, ndev)) {
18677 if (cfg->wdev) {
18678 ret = wl_cfgp2p_supported(cfg, ndev);
18681 cfg->wdev->wiphy->interface_modes |=
18685 if ((err = wl_cfgp2p_init_priv(cfg)) != 0)
18689 if (cfg->p2p_net) {
18691 memcpy(cfg->p2p_net->dev_addr, ndev->dev_addr, ETH_ALEN);
18692 cfg->p2p_net->dev_addr[0] |= 0x02;
18694 cfg->p2p_net->name,
18695 MAC2STRDBG(cfg->p2p_net->dev_addr)));
18702 cfg->p2p_supported = true;
18704 if ((err = wl_cfgp2p_init_priv(cfg)) != 0)
18713 wl_set_drv_status(cfg, READY, ndev);
18731 struct bcm_cfg80211 *cfg = wl_get_cfg(primary_ndev); local
18737 if (!cfg) {
18745 if (wl_cfg80211_register_static_if(cfg, NL80211_IFTYPE_STATION,
18758 struct bcm_cfg80211 *cfg; local
18784 cfg = wiphy_priv(wdev->wiphy);
18785 cfg->wdev = wdev;
18786 cfg->pub = context;
18787 cfg->osh = dhd->osh;
18788 INIT_LIST_HEAD(&cfg->net_list);
18790 INIT_LIST_HEAD(&cfg->wbtext_bssid_list);
18792 INIT_LIST_HEAD(&cfg->vndr_oui_list);
18793 spin_lock_init(&cfg->vndr_oui_sync);
18794 spin_lock_init(&cfg->net_list_sync);
18798 cfg->state_notifier = wl_notifier_change_state;
18799 err = wl_alloc_netinfo(cfg, ndev, wdev, WL_IF_TYPE_STA, PM_ENABLE, bssidx, ifidx);
18804 err = wl_init_priv(cfg);
18810 err = wl_setup_rfkill(cfg, TRUE);
18816 err = wl_setup_debugfs(cfg);
18832 cfg->btcoex_info = wl_cfg80211_btcoex_init(cfg->wdev->netdev);
18833 if (!cfg->btcoex_info)
18837 cfg->random_mac_enabled = FALSE;
18841 err = wl_cfg80211_attach_p2p(cfg);
18846 INIT_DELAYED_WORK(&cfg->pm_enable_work, wl_cfg80211_work_handler);
18847 mutex_init(&cfg->pm_sync);
18849 mutex_init(&cfg->nancfg.nan_sync);
18850 init_waitqueue_head(&cfg->nancfg.nan_event_wait);
18852 cfg->rssi_sum_report = FALSE;
18854 wl_bad_ap_mngr_init(cfg);
18857 wl_attach_ap_stainfo(cfg);
18860 INIT_DELAYED_WORK(&cfg->hogsqs_eventwork,
18867 wl_setup_rfkill(cfg, FALSE);
18868 wl_free_wdev(cfg);
18872 void wl_cfg80211_detach(struct bcm_cfg80211 *cfg) argument
18875 if (!cfg) {
18878 wl_add_remove_pm_enable_work(cfg, WL_PM_WORKQ_DEL);
18881 cancel_delayed_work_sync(&cfg->hogsqs_eventwork);
18886 cfg->btcoex_info = NULL;
18889 wl_setup_rfkill(cfg, FALSE);
18891 wl_free_debugfs(cfg);
18893 if (cfg->p2p_supported) {
18894 if (timer_pending(&cfg->p2p->listen_timer))
18895 del_timer_sync(&cfg->p2p->listen_timer);
18896 wl_cfgp2p_deinit_priv(cfg);
18900 wl_deinit_wps_reauth_sm(cfg);
18903 if (timer_pending(&cfg->scan_timeout))
18904 del_timer_sync(&cfg->scan_timeout);
18906 if (timer_pending(&cfg->roam_timeout)) {
18907 del_timer_sync(&cfg->roam_timeout);
18912 wl_cfg80211_unregister_static_if(cfg);
18915 if (timer_pending(&cfg->csa_timeout)) {
18916 del_timer_sync(&cfg->csa_timeout);
18920 if (cfg->p2p_wdev)
18921 wl_cfgp2p_del_p2p_disc_if(cfg->p2p_wdev, cfg);
18924 wl_cfg80211_detach_p2p(cfg);
18927 wl_bad_ap_mngr_deinit(cfg);
18930 wl_detach_ap_stainfo(cfg);
18932 wl_cfg80211_ibss_vsie_free(cfg);
18933 wl_dealloc_netinfo_by_wdev(cfg, cfg->wdev);
18935 wl_deinit_priv(cfg);
18937 wl_free_wdev(cfg);
18970 static void wl_print_event_data(struct bcm_cfg80211 *cfg, argument
19006 struct bcm_cfg80211 *cfg = NULL; local
19011 BCM_SET_CONTAINER_OF(cfg, work_data, struct bcm_cfg80211, event_work);
19012 cfg->wl_evt_hdlr_entry_time = OSL_LOCALTIME_NS();
19013 DHD_EVENT_WAKE_LOCK(cfg->pub);
19014 while ((e = wl_deq_event(cfg))) {
19020 cfg->wl_evt_deq_time = OSL_LOCALTIME_NS();
19022 cfg->scan_deq_time = OSL_LOCALTIME_NS();
19025 wl_print_event_data(cfg, e->etype, &e->emsg);
19033 mutex_lock(&cfg->if_sync);
19034 if (!(wdev = wl_get_wdev_by_fw_idx(cfg,
19040 } else if (e->etype < WLC_E_LAST && cfg->evt_handler[e->etype]) {
19041 dhd_pub_t *dhd = (struct dhd_pub *)(cfg->pub);
19049 cfg->evt_handler[e->etype](cfg, wdev_to_cfgdev(wdev),
19052 cfg->scan_hdlr_cmplt_time = OSL_LOCALTIME_NS();
19058 mutex_unlock(&cfg->if_sync);
19060 wl_put_event(cfg, e);
19062 cfg->scan_cmplt_time = OSL_LOCALTIME_NS();
19064 cfg->wl_evt_hdlr_exit_time = OSL_LOCALTIME_NS();
19066 DHD_EVENT_WAKE_UNLOCK(cfg->pub);
19074 wl_cfg80211_handle_critical_events(struct bcm_cfg80211 *cfg, argument
19091 cfg->nancfg.nan_event_recvd = true;
19093 wake_up(&cfg->nancfg.nan_event_wait);
19110 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
19115 if ((cfg == NULL) || (cfg->p2p_supported && cfg->p2p == NULL)) {
19121 if (cfg->event_workq == NULL) {
19126 if (!cfg->event_workq_init) {
19137 netinfo = wl_get_netinfo_by_fw_idx(cfg, e->bsscfgidx, e->ifidx);
19148 if (wl_cfg80211_handle_critical_events(cfg, e) == BCME_OK) {
19159 if (likely(!wl_enq_event(cfg, ndev, event_type, e, data))) {
19161 queue_work(cfg->event_workq, &cfg->event_work);
19163 schedule_work(&cfg->event_work);
19170 cfg->scan_enq_time = OSL_LOCALTIME_NS();
19172 status, work_busy(&cfg->event_work)));
19176 static void wl_init_eq(struct bcm_cfg80211 *cfg) argument
19178 wl_init_eq_lock(cfg);
19179 INIT_LIST_HEAD(&cfg->eq_list);
19182 static void wl_flush_eq(struct bcm_cfg80211 *cfg) argument
19187 flags = wl_lock_eq(cfg);
19188 while (!list_empty_careful(&cfg->eq_list)) {
19189 BCM_SET_LIST_FIRST_ENTRY(e, &cfg->eq_list, struct wl_event_q, eq_list);
19191 MFREE(cfg->osh, e, e->datalen + sizeof(struct wl_event_q));
19193 wl_unlock_eq(cfg, flags);
19200 static struct wl_event_q *wl_deq_event(struct bcm_cfg80211 *cfg) argument
19205 flags = wl_lock_eq(cfg);
19206 if (likely(!list_empty(&cfg->eq_list))) {
19207 BCM_SET_LIST_FIRST_ENTRY(e, &cfg->eq_list, struct wl_event_q, eq_list);
19210 wl_unlock_eq(cfg, flags);
19220 wl_enq_event(struct bcm_cfg80211 *cfg, struct net_device *ndev, u32 event, argument
19233 e = (struct wl_event_q *)MALLOCZ(cfg->osh, evtq_size);
19243 flags = wl_lock_eq(cfg);
19244 list_add_tail(&e->eq_list, &cfg->eq_list);
19245 wl_unlock_eq(cfg, flags);
19250 static void wl_put_event(struct bcm_cfg80211 *cfg, struct wl_event_q *e) argument
19252 MFREE(cfg->osh, e, e->datalen + sizeof(struct wl_event_q));
19255 static s32 wl_config_infra(struct bcm_cfg80211 *cfg, struct net_device *ndev, u16 iftype) argument
19312 struct bcm_cfg80211 *cfg, argument
19322 mutex_lock(&cfg->event_sync);
19348 mutex_unlock(&cfg->event_sync);
19357 struct bcm_cfg80211 *cfg; local
19362 cfg = wl_get_cfg(ndev);
19363 if (!cfg)
19366 mutex_lock(&cfg->event_sync);
19388 mutex_unlock(&cfg->event_sync);
19392 static void wl_get_bwcap(struct bcm_cfg80211 *cfg, u32 bw_cap[]) argument
19396 struct net_device *dev = bcmcfg_to_prmry_ndev(cfg);
19457 static void wl_update_vht_cap(struct bcm_cfg80211 *cfg, struct ieee80211_supported_band *band, argument
19460 struct net_device *dev = bcmcfg_to_prmry_ndev(cfg);
19604 struct bcm_cfg80211 *cfg = NULL; local
19609 cfg = wl_get_cfg(ndev);
19610 if (!cfg)
19660 static int wl_construct_reginfo(struct bcm_cfg80211 *cfg, s32 bw_cap[]) argument
19662 struct net_device *dev = bcmcfg_to_prmry_ndev(cfg);
19675 pbuf = (u8 *)MALLOCZ(cfg->osh, LOCAL_BUF_LEN);
19682 0, pbuf, LOCAL_BUF_LEN, 0, &cfg->ioctl_buf_sync);
19685 MFREE(cfg->osh, pbuf, LOCAL_BUF_LEN);
19805 MFREE(cfg->osh, pbuf, LOCAL_BUF_LEN);
19811 static s32 __wl_update_wiphybands(struct bcm_cfg80211 *cfg, bool notify) argument
19814 struct net_device *dev = bcmcfg_to_prmry_ndev(cfg);
19827 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
19865 wl_get_bwcap(cfg, bw_cap);
19878 err = wl_construct_reginfo(cfg, bw_cap);
19885 wiphy = bcmcfg_to_wiphy(cfg);
19895 wl_update_vht_cap(cfg, bands[index], bw_cap[index]);
19928 s32 wl_update_wiphybands(struct bcm_cfg80211 *cfg, bool notify) argument
19932 mutex_lock(&cfg->usr_sync);
19933 err = __wl_update_wiphybands(cfg, notify);
19934 mutex_unlock(&cfg->usr_sync);
19939 static s32 __wl_cfg80211_up(struct bcm_cfg80211 *cfg) argument
19946 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
19949 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
19961 cfg->vif_macaddr_mask = 0x8000;
19963 err = dhd_config_dongle(cfg);
19972 netinfo = wl_get_netinfo_by_wdev(cfg, wdev);
19983 err = wl_config_infra(cfg, ndev, wl_iftype);
19991 err = __wl_update_wiphybands(cfg, true);
20000 err = wl_create_event_handler(cfg);
20005 wl_init_event_handler(cfg);
20007 err = wl_init_scan(cfg);
20013 &cfg->wlc_ver, sizeof(wl_wlc_version_t), NULL);
20016 cfg->wlc_ver.wlc_ver_major));
20017 if ((cfg->wlc_ver.wlc_ver_major >= MIN_ESCAN_PARAM_V2_FW_MAJOR) &&
20022 cfg->scan_params_v2 = true;
20034 if (timer_pending(&cfg->roam_timeout)) {
20035 del_timer_sync(&cfg->roam_timeout);
20039 err = dhd_monitor_init(cfg->pub);
20065 wl_cfg80211_wbtext_clear_bssid_list(cfg);
20072 cfg->tdls_supported = true;
20077 cfg->iface_data.policy = CUSTOM_IF_MGMT_POLICY;
20079 cfg->iface_data.policy = WL_IF_POLICY_DEFAULT;
20086 cfg->conc_disc = WL_NANP2P_CONC_SUPPORT;
20088 cfg->nan_p2p_supported = true;
20093 INIT_DELAYED_WORK(&cfg->pm_enable_work, wl_cfg80211_work_handler);
20094 wl_set_drv_status(cfg, READY, ndev);
20098 static s32 __wl_cfg80211_down(struct bcm_cfg80211 *cfg) argument
20102 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
20105 struct net_device *p2p_net = cfg->p2p_net;
20107 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
20111 if (!wl_get_drv_status(cfg, READY, ndev)) {
20122 wl_vndr_ies_clear_vendor_oui_list(cfg);
20125 wl_add_remove_pm_enable_work(cfg, WL_PM_WORKQ_DEL);
20127 if (cfg->p2p_supported) {
20128 wl_clr_p2p_status(cfg, GO_NEG_PHASE);
20131 if (wl_cfgp2p_vif_created(cfg)) {
20134 if (enabled && cfg->wlfc_on && dhd->op_mode != DHD_FLAG_HOSTAP_MODE &&
20137 cfg->wlfc_on = false;
20145 mutex_lock(&cfg->if_sync);
20146 wl_cfgnan_disable(cfg, NAN_BUS_IS_DOWN);
20147 mutex_unlock(&cfg->if_sync);
20155 wl_cfg80211_cleanup_virtual_ifaces(cfg, false);
20158 cfg->vif_macaddr_mask = 0;
20164 if (wl_cfg80211_bss_up(cfg, ndev, 0, 0) < 0)
20169 wl_cfg80211_clear_security(cfg);
20173 for_each_ndev(cfg, iter, next) {
20176 wl_set_drv_status(cfg, SCAN_ABORTING, iter->ndev);
20180 wl_cfg80211_p2plo_deinit(cfg);
20184 wl_cfg80211_cancel_scan(cfg);
20186 for_each_ndev(cfg, iter, next) {
20194 wl_get_drv_status(cfg, CONNECTING, iter->ndev),
20195 wl_get_drv_status(cfg, CONNECTED, iter->ndev),
20196 wl_get_drv_status(cfg, DISCONNECTING, iter->ndev),
20197 wl_get_drv_status(cfg, NESTED_CONNECT, iter->ndev),
20202 wl_get_drv_status(cfg, CONNECTED, iter->ndev)) {
20208 wl_get_drv_status(cfg, CONNECTING, iter->ndev)) {
20210 u8 *latest_bssid = wl_read_prof(cfg, ndev, WL_PROF_LATEST_BSSID);
20211 struct wiphy *wiphy = bcmcfg_to_wiphy(cfg);
20224 wl_clr_drv_status(cfg, READY, iter->ndev);
20225 wl_clr_drv_status(cfg, SCANNING, iter->ndev);
20226 wl_clr_drv_status(cfg, SCAN_ABORTING, iter->ndev);
20227 wl_clr_drv_status(cfg, CONNECTING, iter->ndev);
20228 wl_clr_drv_status(cfg, CONNECTED, iter->ndev);
20229 wl_clr_drv_status(cfg, DISCONNECTING, iter->ndev);
20230 wl_clr_drv_status(cfg, AP_CREATED, iter->ndev);
20231 wl_clr_drv_status(cfg, AP_CREATING, iter->ndev);
20232 wl_clr_drv_status(cfg, NESTED_CONNECT, iter->ndev);
20233 wl_clr_drv_status(cfg, CFG80211_CONNECT, iter->ndev);
20235 bcmcfg_to_prmry_ndev(cfg)->ieee80211_ptr->iftype =
20248 mutex_unlock(&cfg->usr_sync);
20249 wl_destroy_event_handler(cfg);
20250 mutex_lock(&cfg->usr_sync);
20253 wl_flush_eq(cfg);
20254 wl_link_down(cfg);
20255 if (cfg->p2p_supported) {
20256 if (timer_pending(&cfg->p2p->listen_timer))
20257 del_timer_sync(&cfg->p2p->listen_timer);
20258 wl_cfgp2p_down(cfg);
20261 if (timer_pending(&cfg->scan_timeout)) {
20262 del_timer_sync(&cfg->scan_timeout);
20265 wl_cfg80211_clear_mgmt_vndr_ies(cfg);
20267 DHD_OS_SCAN_WAKE_UNLOCK((dhd_pub_t *)(cfg->pub));
20272 bcm_cfg80211_del_ibss_if(cfg->wdev->wiphy, cfg->ibss_cfgdev);
20277 if (cfg->wl11u) {
20278 wl_clear_iwdata(cfg);
20279 cfg->wl11u = FALSE;
20289 cfg->disable_roam_event = false;
20291 DNGL_FUNC(dhd_cfg80211_down, (cfg));
20295 wl_probe_wdev_all(cfg);
20307 get_iface_num(const char *name, struct bcm_cfg80211 *cfg) argument
20311 if (strcmp(name, cfg->static_ndev[i]->name) == 0) {
20320 is_static_iface(struct bcm_cfg80211 *cfg, struct net_device *net) argument
20324 if ((cfg && (cfg->static_ndev[i] == net))) {
20335 is_static_iface_name(const char *name, struct bcm_cfg80211 *cfg) argument
20338 inum = get_iface_num(name, cfg);
20347 static_if_ndev_get_state(struct bcm_cfg80211 *cfg, struct net_device *net) argument
20351 if ((cfg && (cfg->static_ndev[i] == net))) {
20352 return cfg->static_ndev_state[i];
20360 struct bcm_cfg80211 *cfg; local
20371 cfg = wl_get_cfg(net);
20373 if ((err = wldev_ioctl_get(bcmcfg_to_prmry_ndev(cfg), WLC_GET_VERSION, &val,
20387 mutex_lock(&cfg->usr_sync);
20388 dhd = (dhd_pub_t *)(cfg->pub);
20390 err = wl_cfg80211_attach_post(bcmcfg_to_prmry_ndev(cfg));
20392 mutex_unlock(&cfg->usr_sync);
20403 cfg->wdev->wiphy->features |= NL80211_FEATURE_FW_4WAY_HANDSHAKE;
20406 err = __wl_cfg80211_up(cfg);
20411 if (init_roam_cache(cfg, ioctl_version) == 0) {
20413 cfg->rcc_enabled = true;
20423 sizeof(iovbuf), &cfg->ioctl_buf_sync);
20437 mutex_unlock(&cfg->usr_sync);
20440 bcm_cfg80211_add_ibss_if(cfg->wdev->wiphy, IBSS_IF_NAME);
20448 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
20454 if (!cfg) {
20458 RETURN_EIO_IF_NOT_UP(cfg);
20460 dhd = (dhd_pub_t *)(cfg->pub);
20480 wl_add_remove_pm_enable_work(cfg, WL_PM_WORKQ_DEL);
20496 if (cfg != NULL) {
20497 wl_link_down(cfg);
20504 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
20509 if (cfg) {
20510 mutex_lock(&cfg->usr_sync);
20511 err = __wl_cfg80211_down(cfg);
20512 mutex_unlock(&cfg->usr_sync);
20521 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
20525 if (cfg) {
20527 wl_cfg80211_cancel_scan(cfg);
20530 wl_get_drv_status(cfg, CONNECTED, dev)) {
20537 void *wl_read_prof(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 item) argument
20541 struct wl_profile *profile = wl_get_profile_by_netdev(cfg, ndev);
20545 WL_CFG_DRV_LOCK(&cfg->cfgdrv_lock, flags);
20566 WL_CFG_DRV_UNLOCK(&cfg->cfgdrv_lock, flags);
20573 wl_update_prof(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
20579 struct wl_profile *profile = wl_get_profile_by_netdev(cfg, ndev);
20583 WL_CFG_DRV_LOCK(&cfg->cfgdrv_lock, flags);
20626 WL_CFG_DRV_UNLOCK(&cfg->cfgdrv_lock, flags);
20645 static bool wl_is_ibssmode(struct bcm_cfg80211 *cfg, struct net_device *ndev) argument
20647 return wl_get_mode_by_netdev(cfg, ndev) == WL_MODE_IBSS;
20650 static __used bool wl_is_ibssstarter(struct bcm_cfg80211 *cfg) argument
20652 return cfg->ibss_starter;
20655 static void wl_rst_ie(struct bcm_cfg80211 *cfg) argument
20657 struct wl_ie *ie = wl_to_ie(cfg);
20663 static __used s32 wl_add_ie(struct bcm_cfg80211 *cfg, u8 t, u8 l, u8 *v) argument
20665 struct wl_ie *ie = wl_to_ie(cfg);
20740 static s32 wl_mrg_ie(struct bcm_cfg80211 *cfg, u8 *ie_stream, u16 ie_size) argument
20742 struct wl_ie *ie = wl_to_ie(cfg);
20755 static s32 wl_cp_ie(struct bcm_cfg80211 *cfg, u8 *dst, u16 dst_size) argument
20757 struct wl_ie *ie = wl_to_ie(cfg);
20769 static u32 wl_get_ielen(struct bcm_cfg80211 *cfg) argument
20771 struct wl_ie *ie = wl_to_ie(cfg);
20776 static void wl_link_up(struct bcm_cfg80211 *cfg) argument
20778 cfg->link_up = true;
20781 static void wl_link_down(struct bcm_cfg80211 *cfg) argument
20783 struct wl_connect_info *conn_info = wl_to_conn(cfg);
20786 cfg->link_up = false;
20791 static unsigned long wl_lock_eq(struct bcm_cfg80211 *cfg) argument
20795 WL_CFG_EQ_LOCK(&cfg->eq_lock, flags);
20799 static void wl_unlock_eq(struct bcm_cfg80211 *cfg, unsigned long flags) argument
20801 WL_CFG_EQ_UNLOCK(&cfg->eq_lock, flags);
20804 static void wl_init_eq_lock(struct bcm_cfg80211 *cfg) argument
20806 spin_lock_init(&cfg->eq_lock);
20820 struct bcm_cfg80211 *cfg = wl_get_cfg(net); local
20822 if (!cfg->p2p)
20824 if (!p2p_is_on(cfg)) {
20825 get_primary_mac(cfg, &primary_mac);
20826 wl_cfgp2p_generate_bss_mac(cfg, &primary_mac);
20829 memcpy(p2pdev_addr->octet, wl_to_p2p_bss_macaddr(cfg, P2PAPI_BSSCFG_DEVICE).octet,
20837 struct bcm_cfg80211 *cfg = wl_get_cfg(net); local
20839 return wl_cfgp2p_set_p2p_noa(cfg, net, buf, len);
20844 struct bcm_cfg80211 *cfg = wl_get_cfg(net); local
20846 return wl_cfgp2p_get_p2p_noa(cfg, net, buf, len);
20851 struct bcm_cfg80211 *cfg = wl_get_cfg(net); local
20853 return wl_cfgp2p_set_p2p_ps(cfg, net, buf, len);
20858 struct bcm_cfg80211 *cfg = wl_get_cfg(net); local
20860 return wl_cfgp2p_set_p2p_ecsa(cfg, net, buf, len);
20865 struct bcm_cfg80211 *cfg = wl_get_cfg(net); local
20867 return wl_cfgp2p_increase_p2p_bw(cfg, net, buf, len);
20907 wl_tdls_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
20914 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
20921 if (cfg->tdls_mgmt_frame) {
20923 cfg80211_rx_mgmt(cfgdev, cfg->tdls_mgmt_freq, 0,
20924 cfg->tdls_mgmt_frame, cfg->tdls_mgmt_frame_len, 0);
20926 cfg80211_rx_mgmt(cfgdev, cfg->tdls_mgmt_freq, 0,
20927 cfg->tdls_mgmt_frame, cfg->tdls_mgmt_frame_len, 0,
20931 cfg80211_rx_mgmt(cfgdev, cfg->tdls_mgmt_freq, 0,
20932 cfg->tdls_mgmt_frame, cfg->tdls_mgmt_frame_len,
20935 cfg80211_rx_mgmt(cfgdev, cfg->tdls_mgmt_freq,
20936 cfg->tdls_mgmt_frame, cfg->tdls_mgmt_frame_len, GFP_ATOMIC);
20943 wl_cfg80211_set_cac(cfg, 0);
20947 if (cfg->tdls_mgmt_frame) {
20948 MFREE(cfg->osh, cfg->tdls_mgmt_frame, cfg->tdls_mgmt_frame_len);
20949 cfg->tdls_mgmt_frame_len = 0;
20950 cfg->tdls_mgmt_freq = 0;
20955 wl_cfg80211_set_cac(cfg, 1);
20961 (bcmcfg_to_prmry_ndev(cfg) == ndev) ? "primary" : "secondary"));
20993 struct bcm_cfg80211 *cfg; local
20996 cfg = wl_get_cfg(dev);
21031 dhd_tdls_set_mode((dhd_pub_t *)(cfg->pub), true);
21035 dhd_tdls_set_mode((dhd_pub_t *)(cfg->pub), false);
21042 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
21065 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
21069 dhdp = (dhd_pub_t *)(cfg->pub);
21093 ret = wl_cfg80211_tdls_config(cfg, TDLS_STATE_TEARDOWN, tdls_auto_mode);
21109 ret = wl_cfg80211_tdls_config(cfg, TDLS_STATE_SETUP, tdls_auto_mode);
21115 cfg->ioctl_buf, WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
21133 struct bcm_cfg80211 *cfg; local
21138 cfg = wl_get_cfg(ndev);
21140 if (wl_get_drv_status(cfg, AP_CREATING, ndev)) {
21146 } else if (ndev == bcmcfg_to_prmry_ndev(cfg)) {
21148 if (wl_get_drv_status(cfg, AP_CREATED, ndev)) {
21153 if (!cfg->p2p) {
21159 if (!cfg->p2p->on) {
21161 get_primary_mac(cfg, &primary_mac);
21162 wl_cfgp2p_generate_bss_mac(cfg, &primary_mac);
21163 p2p_on(cfg) = true;
21164 ret = wl_cfgp2p_enable_discovery(cfg, ndev, NULL, 0);
21171 ndev = wl_to_p2p_bss_ndev(cfg, P2PAPI_BSSCFG_PRIMARY);
21172 bssidx = wl_to_p2p_bss_bssidx(cfg, P2PAPI_BSSCFG_DEVICE);
21177 bssidx = wl_get_bssidx_by_wdev(cfg, ndev->ieee80211_ptr);
21193 ret = wl_cfg80211_set_mgmt_vndr_ies(cfg,
21207 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
21218 wl_set_drv_status(cfg, SCANNING, ndev);
21219 if (cfg->escan_info.ndev == NULL) {
21224 wl_cfg80211_cancel_scan(cfg);
21272 struct bcm_cfg80211 *cfg = NULL; local
21275 cfg = wl_get_cfg(ndev);
21283 sizeof(chanspec), buf, buflen, 0, &cfg->ioctl_buf_sync);
21298 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
21308 sizeof(chanspec), buf, buflen, 0, &cfg->ioctl_buf_sync);
21387 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
21389 wl_clr_drv_status(cfg, SCANNING, ndev);
21401 struct bcm_cfg80211 *cfg = NULL; local
21405 cfg = wl_get_cfg(dev);
21407 buf = (u8 *)MALLOC(cfg->osh, CHANSPEC_BUF_SIZE);
21417 ndev = bcmcfg_to_prmry_ndev(cfg);
21480 MFREE(cfg->osh, buf, CHANSPEC_BUF_SIZE);
21499 struct bcm_cfg80211 *cfg = (struct bcm_cfg80211 *)data; local
21504 if (!cfg)
21507 cfg->rf_blocked = blocked;
21512 static int wl_setup_rfkill(struct bcm_cfg80211 *cfg, bool setup) argument
21517 if (!cfg)
21520 cfg->rfkill = rfkill_alloc("brcmfmac-wifi",
21522 RFKILL_TYPE_WLAN, &wl_rfkill_ops, (void *)cfg);
21524 if (!cfg->rfkill) {
21529 err = rfkill_register(cfg->rfkill);
21532 rfkill_destroy(cfg->rfkill);
21534 if (!cfg->rfkill) {
21539 rfkill_unregister(cfg->rfkill);
21540 rfkill_destroy(cfg->rfkill);
21636 static s32 wl_setup_debugfs(struct bcm_cfg80211 *cfg) argument
21640 if (!cfg)
21642 cfg->debugfs = debugfs_create_dir(KBUILD_MODNAME, NULL);
21643 if (!cfg->debugfs || IS_ERR(cfg->debugfs)) {
21644 if (cfg->debugfs == ERR_PTR(-ENODEV))
21648 cfg->debugfs = NULL;
21653 cfg->debugfs, cfg, &fops_debuglevel);
21656 wl_free_debugfs(cfg);
21661 static s32 wl_free_debugfs(struct bcm_cfg80211 *cfg) argument
21663 if (!cfg)
21665 if (cfg->debugfs)
21666 debugfs_remove_recursive(cfg->debugfs);
21667 cfg->debugfs = NULL;
21677 void wl_cfg80211_set_bcmcfg(struct bcm_cfg80211 *cfg) argument
21679 g_bcmcfg = cfg;
21697 void get_primary_mac(struct bcm_cfg80211 *cfg, struct ether_addr *mac) argument
21701 if (wldev_iovar_getbuf_bsscfg(bcmcfg_to_prmry_ndev(cfg),
21709 static bool check_dev_role_integrity(struct bcm_cfg80211 *cfg, s32 mode, u32 dev_role) argument
21711 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
21723 struct bcm_cfg80211 *cfg = *(struct bcm_cfg80211 **)netdev_priv(net); local
21725 if (!cfg || !cfg->wdev)
21728 if (dhd_do_driver_init(cfg->wdev->netdev) < 0)
21761 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
21777 cfg->curr_band = band;
21786 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
21794 if (wl_get_drv_status(cfg, CONNECTED, ndev)) {
21795 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
21809 while (wl_get_drv_status(cfg, CONNECTED, ndev) && wait_cnt) {
21911 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
21912 if ((cfg) && (wl_get_drv_status_all(cfg, CONNECTED) > 1)) {
21921 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
21923 return cfg->pub;
21928 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
21929 return (cfg && cfg->p2p);
21934 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
21935 return (cfg && cfg->roam_offload);
21942 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
21944 if (!cfg) {
21950 curbssid = wl_read_prof(cfg, dev, WL_PROF_BSSID);
21960 struct bcm_cfg80211 *cfg = NULL; local
21964 BCM_SET_CONTAINER_OF(cfg, work, struct bcm_cfg80211, pm_enable_work.work);
21967 for_each_ndev(cfg, iter, next) {
21971 if (!wl_get_drv_status(cfg, CONNECTED, iter->ndev) ||
21972 (wl_get_mode_by_netdev(cfg, iter->ndev) != WL_MODE_BSS &&
21973 wl_get_mode_by_netdev(cfg, iter->ndev) != WL_MODE_IBSS))
21990 DHD_PM_WAKE_UNLOCK(cfg->pub);
21997 struct bcm_cfg80211 *cfg = NULL; local
21999 BCM_SET_CONTAINER_OF(cfg, work, struct bcm_cfg80211,
22002 ndev = bcmcfg_to_prmry_ndev(cfg);
22040 struct bcm_cfg80211 * cfg = wl_get_cfg(dev); local
22047 if (cfg) {
22048 memcpy(key, cfg->fbt_key, FBT_KEYLEN);
22061 wl_cfg80211_delayed_roam(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
22071 err = wl_notify_roaming_status(cfg, ndev_to_cfgdev(ndev), &e, NULL);
22167 wl_vndr_ies_check_duplicate_vndr_oui(struct bcm_cfg80211 *cfg, argument
22173 WL_CFG_VNDR_OUI_SYNC_LOCK(&cfg->vndr_oui_sync, flags);
22175 list_for_each_entry(oui_entry, &cfg->vndr_oui_list, list) {
22178 WL_CFG_VNDR_OUI_SYNC_UNLOCK(&cfg->vndr_oui_sync, flags);
22182 WL_CFG_VNDR_OUI_SYNC_UNLOCK(&cfg->vndr_oui_sync, flags);
22187 wl_vndr_ies_add_vendor_oui_list(struct bcm_cfg80211 *cfg, argument
22202 WL_CFG_VNDR_OUI_SYNC_LOCK(&cfg->vndr_oui_sync, flags);
22203 list_add_tail(&oui_entry->list, &cfg->vndr_oui_list);
22204 WL_CFG_VNDR_OUI_SYNC_UNLOCK(&cfg->vndr_oui_sync, flags);
22210 wl_vndr_ies_clear_vendor_oui_list(struct bcm_cfg80211 *cfg) argument
22215 WL_CFG_VNDR_OUI_SYNC_LOCK(&cfg->vndr_oui_sync, flags);
22216 while (!list_empty(&cfg->vndr_oui_list)) {
22218 oui_entry = list_entry(cfg->vndr_oui_list.next, wl_vndr_oui_entry_t, list);
22225 WL_CFG_VNDR_OUI_SYNC_UNLOCK(&cfg->vndr_oui_sync, flags);
22229 wl_vndr_ies_get_vendor_oui(struct bcm_cfg80211 *cfg, struct net_device *ndev, argument
22235 struct wl_connect_info *conn_info = wl_to_conn(cfg);
22248 wl_vndr_ies_clear_vendor_oui_list(cfg);
22258 if (wl_vndr_ies_check_duplicate_vndr_oui(cfg, vndr_info)) {
22262 wl_vndr_ies_add_vendor_oui_list(cfg, vndr_info);
22268 WL_CFG_VNDR_OUI_SYNC_LOCK(&cfg->vndr_oui_sync, flags);
22270 list_for_each_entry(oui_entry, &cfg->vndr_oui_list, list) {
22273 WL_CFG_VNDR_OUI_SYNC_UNLOCK(&cfg->vndr_oui_sync, flags);
22280 WL_CFG_VNDR_OUI_SYNC_UNLOCK(&cfg->vndr_oui_sync, flags);
22287 wl_cfg80211_clear_p2p_disc_ies(struct bcm_cfg80211 *cfg) argument
22302 ndev = wl_to_p2p_bss_ndev(cfg, P2PAPI_BSSCFG_PRIMARY);
22303 bssidx = wl_to_p2p_bss_bssidx(cfg, P2PAPI_BSSCFG_DEVICE);
22310 if ((ret = wl_cfg80211_set_mgmt_vndr_ies(cfg, ndev_to_cfgdev(ndev),
22318 if (cfg->p2p_wdev && (ndev->ieee80211_ptr != cfg->p2p_wdev)) {
22320 wl_cfg80211_clear_per_bss_ies(cfg, cfg->p2p_wdev);
22325 wl_cfg80211_clear_per_bss_ies(struct bcm_cfg80211 *cfg, struct wireless_dev *wdev) argument
22333 netinfo = wl_get_netinfo_by_wdev(cfg, wdev);
22342 if ((ret = wl_cfg80211_set_mgmt_vndr_ies(cfg, wdev_to_cfgdev(netinfo->wdev),
22353 wl_cfg80211_clear_mgmt_vndr_ies(struct bcm_cfg80211 *cfg) argument
22359 for_each_ndev(cfg, iter, next) {
22361 wl_cfg80211_clear_per_bss_ies(cfg, iter->wdev);
22369 wl_cfg80211_set_mgmt_vndr_ies(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
22390 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
22398 netinfo = wl_get_netinfo_by_wdev(cfg, wdev);
22524 del_add_ie_buf_len = wl_cfgp2p_vndr_ie(cfg, curr_ie_buf,
22573 del_add_ie_buf_len = wl_cfgp2p_vndr_ie(cfg, curr_ie_buf,
22601 if (total_ie_buf_len && cfg->ioctl_buf != NULL) {
22603 total_ie_buf_len, cfg->ioctl_buf, WLC_IOCTL_MAXLEN,
22604 bssidx, &cfg->ioctl_buf_sync);
22624 struct bcm_cfg80211 *cfg = wl_get_cfg(cfgdev); local
22651 list = (struct maclist *)MALLOC(cfg->osh, sizeof(int) +
22667 MFREE(cfg->osh, list, sizeof(int) +
22779 struct bcm_cfg80211 *cfg = NULL; local
22796 cfg = wl_get_cfg(dev);
22797 if (cfg->in_csa) {
22798 cfg->in_csa = FALSE;
22799 wl_del_csa_timeout(cfg);
22829 wl_ap_channel_ind(struct bcm_cfg80211 *cfg, argument
22837 if (cfg->ap_oper_channel && (cfg->ap_oper_channel != channel)) {
22843 wl_cfg80211_ch_switch_notify(ndev, chanspec, bcmcfg_to_wiphy(cfg));
22845 cfg->ap_oper_channel = channel;
22850 wl_ap_start_ind(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
22867 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
22871 if (wl_get_mode_by_netdev(cfg, ndev) == WL_MODE_AP) {
22873 wl_ap_channel_ind(cfg, ndev, chanspec);
22882 wl_csa_complete_ind(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
22897 ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
22899 if (!((wl_get_mode_by_netdev(cfg, ndev)) == WL_MODE_AP)) {
22915 if (wl_get_mode_by_netdev(cfg, ndev) == WL_MODE_AP) {
22917 wl_ap_channel_ind(cfg, ndev, chanspec);
22920 if (!wl_get_drv_status(cfg, CONNECTED, ndev)) {
22925 wl_cfg80211_ch_switch_notify(ndev, chanspec, bcmcfg_to_wiphy(cfg));
22934 void wl_cfg80211_clear_security(struct bcm_cfg80211 *cfg) argument
22936 struct net_device *dev = bcmcfg_to_prmry_ndev(cfg);
22957 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
22961 if (!cfg) {
22965 wdev = cfg->p2p_wdev;
22968 if (wdev && cfg->down_disc_if) {
22969 wl_cfgp2p_del_p2p_disc_if(wdev, cfg);
22970 cfg->down_disc_if = FALSE;
22981 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
22986 if (data == NULL || cfg->p2p_net == dev) {
22999 cfg->ioctl_buf, WLC_IOCTL_SMLEN, &cfg->ioctl_buf_sync)) < 0) {
23015 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
23031 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) < 0) {
23037 sec = wl_read_prof(cfg, dev, WL_PROF_SEC);
23041 cfg->ioctl_buf, WLC_IOCTL_SMLEN, bssidx, &cfg->ioctl_buf_sync);
23107 wl_cfg80211_get_sta_channel(struct bcm_cfg80211 *cfg) argument
23111 if (wl_get_drv_status(cfg, CONNECTED, bcmcfg_to_prmry_ndev(cfg))) {
23112 channel = cfg->channel;
23119 wl_cfg80211_get_new_roc_id(struct bcm_cfg80211 *cfg) argument
23122 id = ++cfg->last_roc_id;
23125 id = ++cfg->last_roc_id;
23129 id = ++cfg->last_roc_id;
23135 wl_cfg80211_tdls_config(struct bcm_cfg80211 *cfg, enum wl_tdls_config state, bool auto_mode) argument
23137 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
23143 dhdp = (dhd_pub_t *)(cfg->pub);
23151 if (!cfg->tdls_supported) {
23157 mutex_lock(&cfg->tdls_sync);
23169 if (wl_get_drv_status_all(cfg,
23186 if (wl_get_drv_status_all(cfg,
23191 } else if (wl_get_drv_status_all(cfg,
23198 for_each_ndev(cfg, iter, next) {
23200 if ((iter->ndev) && (wl_get_drv_status(cfg, CONNECTED, ndev)) &&
23256 mutex_unlock(&cfg->tdls_sync);
23261 struct net_device* wl_get_ap_netdev(struct bcm_cfg80211 *cfg, char *ifname) argument
23267 for_each_ndev(cfg, iter, next) {
23283 wl_get_netdev_by_name(struct bcm_cfg80211 *cfg, char *ifname) argument
23289 for_each_ndev(cfg, iter, next) {
23308 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
23314 dhdp = (dhd_pub_t *)(cfg->pub);
23321 ndev = wl_get_ap_netdev(cfg, ifname);
23366 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
23373 dhdp = (dhd_pub_t *)(cfg->pub);
23380 ndev = wl_get_ap_netdev(cfg, ifname);
23423 struct bcm_cfg80211 *cfg = NULL; local
23430 cfg = wl_get_cfg(dev);
23439 iovar.param->level = cfg->ap_rps_info.level;
23440 iovar.param->stas_assoc_check = cfg->ap_rps_info.sta_assoc_check;
23441 iovar.param->pps = cfg->ap_rps_info.pps;
23442 iovar.param->quiet_time = cfg->ap_rps_info.quiet_time;
23456 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
23469 dhdp = (dhd_pub_t *)(cfg->pub);
23482 ndev = wl_get_ap_netdev(cfg, ifname);
23543 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
23550 dhdp = (dhd_pub_t *)(cfg->pub);
23563 ndev = wl_get_ap_netdev(cfg, ifname);
23571 if (cfg->ap_rps_info.enable != enable) {
23572 cfg->ap_rps_info.enable = enable;
23595 cfg->ap_rps_info.enable = enable;
23604 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
23608 dhdp = (dhd_pub_t *)(cfg->pub);
23618 ndev = wl_get_ap_netdev(cfg, ifname);
23642 cfg->ap_rps_info.pps = rps->pps;
23643 cfg->ap_rps_info.level = rps->level;
23644 cfg->ap_rps_info.quiet_time = rps->quiet_time;
23645 cfg->ap_rps_info.sta_assoc_check = rps->sta_assoc_check;
23647 if (cfg->ap_rps_info.enable) {
23658 wl_cfg80211_init_ap_rps(struct bcm_cfg80211 *cfg) argument
23660 cfg->ap_rps_info.enable = FALSE;
23661 cfg->ap_rps_info.sta_assoc_check = RADIO_PWRSAVE_STAS_ASSOC_CHECK;
23662 cfg->ap_rps_info.pps = RADIO_PWRSAVE_PPS;
23663 cfg->ap_rps_info.quiet_time = RADIO_PWRSAVE_QUIET_TIME;
23664 cfg->ap_rps_info.level = RADIO_PWRSAVE_LEVEL;
23671 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
23679 for_each_ndev(cfg, iter, next) {
23689 static bool wl_cfg80211_wbtext_check_bssid_list(struct bcm_cfg80211 *cfg, struct ether_addr *ea) argument
23694 list_for_each_entry(bssid, &cfg->wbtext_bssid_list, list) {
23704 static bool wl_cfg80211_wbtext_add_bssid_list(struct bcm_cfg80211 *cfg, struct ether_addr *ea) argument
23709 bssid = (wl_wbtext_bssid_t *)MALLOC(cfg->osh, sizeof(wl_wbtext_bssid_t));
23718 list_add_tail(&bssid->list, &cfg->wbtext_bssid_list);
23725 static void wl_cfg80211_wbtext_clear_bssid_list(struct bcm_cfg80211 *cfg) argument
23730 while (!list_empty(&cfg->wbtext_bssid_list)) {
23732 bssid = list_entry(cfg->wbtext_bssid_list.next, wl_wbtext_bssid_t, list);
23737 MFREE(cfg->osh, bssid, sizeof(wl_wbtext_bssid_t));
23742 static void wl_cfg80211_wbtext_update_rcc(struct bcm_cfg80211 *cfg, struct net_device *dev) argument
23744 struct wl_connect_info *conn_info = wl_to_conn(cfg);
23751 profile = wl_get_profile_by_netdev(cfg, dev);
23757 if (wl_cfg80211_wbtext_check_bssid_list(cfg,
23768 req_sent = wl_cfg80211_wbtext_send_nbr_req(cfg, dev, profile);
23779 wl_cfg80211_wbtext_send_btm_query(cfg, dev, profile);
23785 static bool wl_cfg80211_wbtext_send_nbr_req(struct bcm_cfg80211 *cfg, struct net_device *dev, argument
23790 struct wl_connect_info *conn_info = wl_to_conn(cfg);
23806 smbuf = (char *)MALLOCZ(cfg->osh, WLC_IOCTL_MAXLEN);
23812 ssid = (wlc_ssid_t *)MALLOCZ(cfg->osh, sizeof(wlc_ssid_t));
23824 ret = wl_cfg80211_wbtext_add_bssid_list(cfg,
23832 MFREE(cfg->osh, ssid, sizeof(wlc_ssid_t));
23836 MFREE(cfg->osh, smbuf, WLC_IOCTL_MAXLEN);
23841 static bool wl_cfg80211_wbtext_send_btm_query(struct bcm_cfg80211 *cfg, struct net_device *dev, argument
23855 sizeof(btq), cfg->ioctl_buf, WLC_IOCTL_SMLEN, &cfg->ioctl_buf_sync);
23857 ret = wl_cfg80211_wbtext_add_bssid_list(cfg,
23866 static void wl_cfg80211_wbtext_set_wnm_maxidle(struct bcm_cfg80211 *cfg, struct net_device *dev) argument
23871 struct wl_connect_info *conn_info = wl_to_conn(cfg);
23889 if ((bssidx = wl_get_bssidx_by_wdev(cfg, dev->ieee80211_ptr)) >= 0) {
23891 sizeof(keepalives_max_idle_t), cfg->ioctl_buf, WLC_IOCTL_SMLEN,
23892 bssidx, &cfg->ioctl_buf_sync);
23974 wl_cfg80211_set_cac(struct bcm_cfg80211 *cfg, int enable) argument
23977 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
23998 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
24009 ifdev = wl_get_netdev_by_name(cfg, ifname);
24019 set_param = (rssi_ant_param_t *)MALLOCZ(cfg->osh, sizeof(rssi_ant_param_t));
24048 MFREE(cfg->osh, set_param, sizeof(rssi_ant_param_t));
24077 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
24082 sizeof(*set_param), cfg->ioctl_buf, WLC_IOCTL_SMLEN,
24083 &cfg->ioctl_buf_sync);
24097 struct bcm_cfg80211 *cfg = wl_get_cfg(dev); local
24098 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
24126 wl_cfg80211_set_frameburst(struct bcm_cfg80211 *cfg, bool enable) argument
24139 ret = wldev_ioctl_set(bcmcfg_to_prmry_ndev(cfg), WLC_SET_FAKEFRAG, &val, sizeof(val));
24229 uint8 wl_cfg80211_get_bus_state(struct bcm_cfg80211 *cfg) argument
24231 dhd_pub_t *dhd = (dhd_pub_t *)(cfg->pub);
24241 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24245 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24246 inst = wl_get_wps_inst_match(cfg, ndev);
24249 ndev->name, inst, cfg->wps_session[inst].state));
24250 if (cfg->wps_session[inst].state == WPS_STATE_REAUTH_WAIT) {
24257 cfg->wps_session[inst].state = WPS_STATE_IDLE;
24258 cfg->wps_session[inst].in_use = false;
24261 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24264 static void wl_init_wps_reauth_sm(struct bcm_cfg80211 *cfg) argument
24270 struct net_device *pdev = bcmcfg_to_prmry_ndev(cfg);
24272 spin_lock_init(&cfg->wps_sync);
24275 init_timer_compat(&cfg->wps_session[i].timer, wl_wps_reauth_timeout, pdev);
24276 cfg->wps_session[i].in_use = false;
24277 cfg->wps_session[i].state = WPS_STATE_IDLE;
24281 static void wl_deinit_wps_reauth_sm(struct bcm_cfg80211 *cfg) argument
24286 cfg->wps_session[i].in_use = false;
24287 cfg->wps_session[i].state = WPS_STATE_IDLE;
24288 if (timer_pending(&cfg->wps_session[i].timer)) {
24289 del_timer_sync(&cfg->wps_session[i].timer);
24296 wl_get_free_wps_inst(struct bcm_cfg80211 *cfg) argument
24301 if (!cfg->wps_session[i].in_use) {
24309 wl_get_wps_inst_match(struct bcm_cfg80211 *cfg, struct net_device *ndev) argument
24314 if ((cfg->wps_session[i].in_use) &&
24315 (ndev == cfg->wps_session[i].ndev)) {
24327 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24330 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24332 inst = wl_get_free_wps_inst(cfg);
24335 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24338 cfg->wps_session[inst].in_use = true;
24339 cfg->wps_session[inst].state = WPS_STATE_STARTED;
24340 cfg->wps_session[inst].ndev = ndev;
24341 cfg->wps_session[inst].mode = mode;
24343 (void)memcpy_s(cfg->wps_session[inst].peer_mac, ETH_ALEN, mac_addr, ETH_ALEN);
24344 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24355 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24359 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24362 inst = wl_get_wps_inst_match(cfg, ndev);
24365 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24369 cur_state = cfg->wps_session[inst].state;
24372 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24377 cfg->wps_session[inst].in_use = false;
24378 cfg->wps_session[inst].state = WPS_STATE_IDLE;
24379 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24382 if (timer_pending(&cfg->wps_session[inst].timer)) {
24383 del_timer_sync(&cfg->wps_session[inst].timer);
24392 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24397 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24398 inst = wl_get_wps_inst_match(cfg, ndev);
24401 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24404 cur_state = cfg->wps_session[inst].state;
24405 cfg->wps_session[inst].state = WPS_STATE_DONE;
24406 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24417 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24422 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24423 cur_state = cfg->wps_session[inst].state;
24425 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24426 wl_clr_drv_status(cfg, CONNECTED, ndev);
24427 wl_clr_drv_status(cfg, DISCONNECTING, ndev);
24433 cfg->wps_session[inst].state = WPS_STATE_DONE;
24441 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24452 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24458 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24459 cur_state = cfg->wps_session[inst].state;
24470 if (memcmp(cfg->wps_session[inst].peer_mac, peer_mac, ETH_ALEN)) {
24485 cfg->wps_session[inst].state = WPS_STATE_DONE;
24498 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24508 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24514 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24515 cur_state = cfg->wps_session[inst].state;
24518 cfg->wps_session[inst].state = WPS_STATE_DONE;
24527 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24537 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24542 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24543 cur_state = cfg->wps_session[inst].state;
24547 memcmp(cfg->wps_session[inst].peer_mac, peer_mac, ETH_ALEN)) {
24549 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24563 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24571 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24577 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24578 cur_state = cfg->wps_session[inst].state;
24582 memcmp(cfg->wps_session[inst].peer_mac, peer_mac, ETH_ALEN)) {
24584 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24591 cfg->wps_session[inst].state = WPS_STATE_DONE;
24601 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24611 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24617 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24618 cur_state = cfg->wps_session[inst].state;
24619 mode = cfg->wps_session[inst].mode;
24624 cfg->wps_session[inst].state = WPS_STATE_REAUTH_WAIT;
24626 timer_set_private(&cfg->wps_session[inst].timer, ndev);
24627 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24628 mod_timer(&cfg->wps_session[inst].timer,
24637 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24644 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24649 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24650 cur_state = cfg->wps_session[inst].state;
24669 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24676 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24682 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24683 cur_state = cfg->wps_session[inst].state;
24688 cfg->wps_session[inst].state = WPS_STATE_DONE;
24693 } else if (!(memcmp(cfg->wps_session[inst].peer_mac,
24701 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24711 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24716 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24717 cur_state = cfg->wps_session[inst].state;
24719 cfg->wps_session[inst].state = WPS_STATE_DONE;
24720 wl_clr_drv_status(cfg, CONNECTED, ndev);
24728 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24738 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24743 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24744 cur_state = cfg->wps_session[inst].state;
24748 cfg->wps_session[inst].state = WPS_STATE_M8_SENT;
24749 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24755 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24764 struct bcm_cfg80211 *cfg = wl_get_cfg(ndev); local
24768 WL_CFG_WPS_SYNC_LOCK(&cfg->wps_sync, flags);
24770 inst = wl_get_wps_inst_match(cfg, ndev);
24774 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24777 mode = cfg->wps_session[inst].mode;
24778 WL_CFG_WPS_SYNC_UNLOCK(&cfg->wps_sync, flags);
24833 if (!memcmp(cfg->wps_session[inst].peer_mac, peer_mac, ETH_ALEN)) {
24845 if (!memcmp(cfg->wps_session[inst].peer_mac, peer_mac, ETH_ALEN)) {
24882 if (!memcmp(cfg->wps_session[inst].peer_mac, peer_mac, ETH_ALEN)) {
25026 wl_cfg80211_sup_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
25031 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
25038 cfg80211_port_authorized(ndev, (u8 *)wl_read_prof(cfg, ndev, WL_PROF_BSSID),
25043 err = wl_cfgvendor_send_async_event(bcmcfg_to_wiphy(cfg), ndev,
25060 wl_bcnrecv_aborted_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
25064 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
25077 wl_mbo_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
25111 wl_cfg80211_cac_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
25141 wl_bssid_prune_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
25178 wl_cfg80211_rtt_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
25181 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
25191 wl_notify_dos_status(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
25222 wl_print_verinfo(struct bcm_cfg80211 *cfg) argument
25227 if (!cfg) {
25232 ver_ptr = (char *)MALLOCZ(cfg->osh, alloc_len);
25238 if (!dhd_os_get_version(bcmcfg_to_prmry_ndev(cfg),
25243 if (!dhd_os_get_version(bcmcfg_to_prmry_ndev(cfg),
25248 MFREE(cfg->osh, ver_ptr, alloc_len);
25294 int wl_cfg80211_set_he_mode(struct net_device *dev, struct bcm_cfg80211 *cfg, argument
25308 cfg->ioctl_buf, WLC_IOCTL_SMLEN, bssidx, NULL);
25316 he_feature = *(int*)cfg->ioctl_buf;
25346 cfg->ioctl_buf, WLC_IOCTL_SMLEN, bssidx, &cfg->ioctl_buf_sync);
25357 int wl_cfg80211_get_concurrency_mode(struct bcm_cfg80211 *cfg) argument
25367 connected_cnt = wl_get_drv_status_all(cfg, CONNECTED);
25372 for_each_ndev(cfg, iter, next) {
25374 if (wl_get_drv_status(cfg, CONNECTED, iter->ndev)) {
25409 wl_cfg80211_bssload_report_event_handler(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, argument
25418 struct net_device *ndev = bcmcfg_to_prmry_ndev(cfg);
25422 struct wiphy *wiphy = bcmcfg_to_wiphy(cfg);
25477 struct bcm_cfg80211 *cfg; local
25483 cfg = wl_get_cfg(ndev);
25484 if (!cfg) {
25499 sizeof(wl_bssload_cfg_t), cfg->ioctl_buf, WLC_IOCTL_SMLEN, &cfg->ioctl_buf_sync);
25514 struct bcm_cfg80211 *cfg; local
25520 cfg = wl_get_cfg(ndev);
25521 if (!cfg) {
25525 mutex_lock(&cfg->event_sync);
25554 mutex_unlock(&cfg->event_sync);
25570 struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); local
25572 dev = ndev_to_wlc_ndev(dev, cfg);
25580 if (wl_get_mode_by_netdev(cfg, dev) != WL_MODE_AP) {
25586 if (chan == cfg->ap_oper_channel) {
25599 err = wl_get_bandwidth_cap(bcmcfg_to_prmry_ndev(cfg),
25608 dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
25609 u32 *sta_chan = (u32 *)wl_read_prof(cfg,
25610 bcmcfg_to_prmry_ndev(cfg), WL_PROF_CHAN);
25617 wl_get_drv_status(cfg, CONNECTED,
25618 bcmcfg_to_prmry_ndev(cfg)) && sta_chan &&
25647 cfg->ioctl_buf, WLC_IOCTL_SMLEN, &cfg->ioctl_buf_sync);
25664 struct bcm_cfg80211 *cfg; local
25668 cfg = wl_cfg80211_get_bcmcfg();
25669 if (!cfg || !cfg->wdev) {
25674 ndev = bcmcfg_to_prmry_ndev(cfg);
25675 wiphy = bcmcfg_to_wiphy(cfg);