static void _wil6210_disconnect(struct wil6210_priv *wil, void *bssid) { uint i; struct net_device *ndev = wil_to_ndev(wil); struct wireless_dev *wdev = wil->wdev; wil_dbg_misc(wil, "%s()\n", __func__); wil_link_off(wil); clear_bit(wil_status_fwconnected, &wil->status); switch (wdev->sme_state) { case CFG80211_SME_CONNECTED: cfg80211_disconnected(ndev, WLAN_STATUS_UNSPECIFIED_FAILURE, NULL, 0, GFP_KERNEL); break; case CFG80211_SME_CONNECTING: cfg80211_connect_result(ndev, bssid, NULL, 0, NULL, 0, WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_KERNEL); break; default: break; } for (i = 0; i < ARRAY_SIZE(wil->vring_tx); i++) wil_vring_fini_tx(wil, i); clear_bit(wil_status_dontscan, &wil->status); }
static int qtnf_event_handle_bss_leave(struct qtnf_vif *vif, const struct qlink_event_bss_leave *leave_info, u16 len) { if (unlikely(len < sizeof(*leave_info))) { pr_err("VIF%u.%u: payload is too short (%u < %zu)\n", vif->mac->macid, vif->vifid, len, sizeof(struct qlink_event_bss_leave)); return -EINVAL; } if (vif->wdev.iftype != NL80211_IFTYPE_STATION) { pr_err("VIF%u.%u: BSS_LEAVE event when not in STA mode\n", vif->mac->macid, vif->vifid); return -EPROTO; } pr_debug("VIF%u.%u: disconnected\n", vif->mac->macid, vif->vifid); cfg80211_disconnected(vif->netdev, le16_to_cpu(leave_info->reason), NULL, 0, 0, GFP_KERNEL); netif_carrier_off(vif->netdev); return 0; }
VOID kalP2PGCIndicateConnectionStatus(IN P_GLUE_INFO_T prGlueInfo, IN UINT_8 ucRoleIndex, IN P_P2P_CONNECTION_REQ_INFO_T prP2pConnInfo, IN PUINT_8 pucRxIEBuf, IN UINT_16 u2RxIELen, IN UINT_16 u2StatusReason) { P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T) NULL; do { if (prGlueInfo == NULL) { ASSERT(FALSE); break; } prGlueP2pInfo = prGlueInfo->prP2PInfo; if (prP2pConnInfo) { cfg80211_connect_result(prGlueP2pInfo->aprRoleHandler[ucRoleIndex], /* struct net_device * dev, */ prP2pConnInfo->aucBssid, prP2pConnInfo->aucIEBuf, prP2pConnInfo->u4BufLength, pucRxIEBuf, u2RxIELen, u2StatusReason, GFP_KERNEL); /* gfp_t gfp *//* allocation flags */ prP2pConnInfo->eConnRequest = P2P_CONNECTION_TYPE_IDLE; } else { /* Disconnect, what if u2StatusReason == 0? */ cfg80211_disconnected(prGlueP2pInfo->aprRoleHandler[ucRoleIndex], /* struct net_device * dev, */ u2StatusReason, pucRxIEBuf, u2RxIELen, GFP_KERNEL); } } while (FALSE); } /* kalP2PGCIndicateConnectionStatus */
void qtnf_virtual_intf_cleanup(struct net_device *ndev) { struct qtnf_vif *vif = qtnf_netdev_get_priv(ndev); struct qtnf_wmac *mac = wiphy_priv(vif->wdev.wiphy); if (vif->wdev.iftype == NL80211_IFTYPE_STATION) { switch (vif->sta_state) { case QTNF_STA_DISCONNECTED: break; case QTNF_STA_CONNECTING: cfg80211_connect_result(vif->netdev, vif->bss_cfg.bssid, NULL, 0, NULL, 0, WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_KERNEL); qtnf_disconnect(vif->wdev.wiphy, ndev, WLAN_REASON_DEAUTH_LEAVING); break; case QTNF_STA_CONNECTED: cfg80211_disconnected(vif->netdev, WLAN_REASON_DEAUTH_LEAVING, NULL, 0, 1, GFP_KERNEL); qtnf_disconnect(vif->wdev.wiphy, ndev, WLAN_REASON_DEAUTH_LEAVING); break; } vif->sta_state = QTNF_STA_DISCONNECTED; qtnf_scan_done(mac, true); } }
/* * This function deauthenticates/disconnects from a BSS. * * In case of infra made, it sends deauthentication request, and * in case of ad-hoc mode, a stop network request is sent to the firmware. * In AP mode, a command to stop bss is sent to firmware. */ int mwifiex_deauthenticate(struct mwifiex_private *priv, u8 *mac) { int ret = 0; if (!priv->media_connected) return 0; switch (priv->bss_mode) { case NL80211_IFTYPE_STATION: case NL80211_IFTYPE_P2P_CLIENT: ret = mwifiex_deauthenticate_infra(priv, mac); if (ret) cfg80211_disconnected(priv->netdev, 0, NULL, 0, GFP_KERNEL); break; case NL80211_IFTYPE_ADHOC: return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_AD_HOC_STOP, HostCmd_ACT_GEN_SET, 0, NULL); case NL80211_IFTYPE_AP: return mwifiex_send_cmd_sync(priv, HostCmd_CMD_UAP_BSS_STOP, HostCmd_ACT_GEN_SET, 0, NULL); default: break; } return ret; }
void ath6kl_cfg80211_disconnect_event(struct ath6kl *ar, u8 reason, u8 *bssid, u8 assoc_resp_len, u8 *assoc_info, u16 proto_reason) { if (ar->scan_req) { cfg80211_scan_done(ar->scan_req, true); ar->scan_req = NULL; } if (ar->nw_type & ADHOC_NETWORK) { if (ar->wdev->iftype != NL80211_IFTYPE_ADHOC) { ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: ath6k not in ibss mode\n", __func__); return; } memset(bssid, 0, ETH_ALEN); cfg80211_ibss_joined(ar->net_dev, bssid, GFP_KERNEL); return; } if (ar->nw_type & INFRA_NETWORK) { if (ar->wdev->iftype != NL80211_IFTYPE_STATION && ar->wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) { ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: ath6k not in station mode\n", __func__); return; } } /* * Send a disconnect command to target when a disconnect event is * received with reason code other than 3 (DISCONNECT_CMD - disconnect * request from host) to make the firmware stop trying to connect even * after giving disconnect event. There will be one more disconnect * event for this disconnect command with reason code DISCONNECT_CMD * which will be notified to cfg80211. */ if (reason != DISCONNECT_CMD) { ath6kl_wmi_disconnect_cmd(ar->wmi); return; } clear_bit(CONNECT_PEND, &ar->flag); if (ar->sme_state == SME_CONNECTING) { cfg80211_connect_result(ar->net_dev, bssid, NULL, 0, NULL, 0, WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_KERNEL); } else if (ar->sme_state == SME_CONNECTED) { cfg80211_disconnected(ar->net_dev, reason, NULL, 0, GFP_KERNEL); } ar->sme_state = SME_DISCONNECTED; }
VOID RTMP_CFG80211_VirtualIF_Remove( IN VOID *pAdSrc, IN PNET_DEV dev_p, IN UINT32 DevType) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; BOOLEAN isGoOn = FALSE; struct wifi_dev *wdev; if (dev_p) { RTMP_CFG80211_RemoveVifEntry(pAd, dev_p); RTMP_OS_NETDEV_STOP_QUEUE(dev_p); #ifdef RT_CFG80211_P2P_SUPPORT pAd->cfg80211_ctrl.Cfg80211VifDevSet.isGoingOn = FALSE; isGoOn = RTMP_CFG80211_VIF_P2P_GO_ON(pAd); if (isGoOn) { RtmpOSNetDevDetach(dev_p); pAd->ApCfg.MBSSID[MAIN_MBSSID].MSSIDDev = NULL; } else if (pAd->flg_apcli_init) { wdev = &pAd->ApCfg.ApCliTab[MAIN_MBSSID].wdev; OPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); cfg80211_disconnected(dev_p, 0, NULL, 0, GFP_KERNEL); NdisZeroMemory(pAd->ApCfg.ApCliTab[MAIN_MBSSID].CfgApCliBssid, MAC_ADDR_LEN); RtmpOSNetDevDetach(dev_p); rtmp_wdev_idx_unreg(pAd, wdev); pAd->flg_apcli_init = FALSE; wdev->if_dev = NULL; } else #endif /* RT_CFG80211_P2P_SUPPORT */ { /* Never Opened When New Netdevice on */ RtmpOSNetDevDetach(dev_p); } if (dev_p->ieee80211_ptr) { kfree(dev_p->ieee80211_ptr); dev_p->ieee80211_ptr = NULL; } } }
static void _wil6210_disconnect(struct wil6210_priv *wil, const u8 *bssid) { int cid = -ENOENT; struct net_device *ndev = wil_to_ndev(wil); struct wireless_dev *wdev = wil->wdev; might_sleep(); if (bssid) { cid = wil_find_cid(wil, bssid); wil_dbg_misc(wil, "%s(%pM, CID %d)\n", __func__, bssid, cid); } else { wil_dbg_misc(wil, "%s(all)\n", __func__); } if (cid >= 0) /* disconnect 1 peer */ wil_disconnect_cid(wil, cid); else /* disconnect all */ for (cid = 0; cid < WIL6210_MAX_CID; cid++) wil_disconnect_cid(wil, cid); /* link state */ switch (wdev->iftype) { case NL80211_IFTYPE_STATION: case NL80211_IFTYPE_P2P_CLIENT: wil_link_off(wil); if (test_bit(wil_status_fwconnected, &wil->status)) { clear_bit(wil_status_fwconnected, &wil->status); cfg80211_disconnected(ndev, WLAN_STATUS_UNSPECIFIED_FAILURE, NULL, 0, GFP_KERNEL); } else if (test_bit(wil_status_fwconnecting, &wil->status)) { cfg80211_connect_result(ndev, bssid, NULL, 0, NULL, 0, WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_KERNEL); } clear_bit(wil_status_fwconnecting, &wil->status); break; default: break; } }
static void r92su_bss_free_connected(struct r92su *r92su, bool locally_generated) { struct cfg80211_bss *old_bss; if (r92su_is_connected(r92su)) r92su_set_state(r92su, R92SU_OPEN); rcu_read_lock(); old_bss = rcu_dereference(r92su->connect_bss); rcu_assign_pointer(r92su->connect_bss, NULL); if (old_bss) { switch (r92su->wdev.iftype) { case NL80211_IFTYPE_STATION: /* cfg80211 doesn't like it when cfg80211_disconnected * is called without reason. So check if we were really * connected. */ cfg80211_disconnected(r92su->wdev.netdev, WLAN_STATUS_UNSPECIFIED_FAILURE, NULL, 0, locally_generated, GFP_ATOMIC); break; case NL80211_IFTYPE_ADHOC: cfg80211_unlink_bss(r92su->wdev.wiphy, old_bss); break; default: WARN(1, "unsupported network type %d\n", r92su->wdev.iftype); break; } r92su_bss_free(r92su, old_bss); } rcu_read_unlock(); }
void qtnf_cfg80211_vif_reset(struct qtnf_vif *vif) { if (vif->wdev.iftype == NL80211_IFTYPE_STATION) { switch (vif->sta_state) { case QTNF_STA_CONNECTING: cfg80211_connect_result(vif->netdev, vif->bss_cfg.bssid, NULL, 0, NULL, 0, WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_KERNEL); break; case QTNF_STA_CONNECTED: cfg80211_disconnected(vif->netdev, WLAN_REASON_DEAUTH_LEAVING, NULL, 0, 1, GFP_KERNEL); break; case QTNF_STA_DISCONNECTED: break; } } cfg80211_shutdown_all_interfaces(vif->wdev.wiphy); vif->sta_state = QTNF_STA_DISCONNECTED; }
/* * This function resets the connection state. * * The function is invoked after receiving a disconnect event from firmware, * and performs the following actions - * - Set media status to disconnected * - Clean up Tx and Rx packets * - Resets SNR/NF/RSSI value in driver * - Resets security configurations in driver * - Enables auto data rate * - Saves the previous SSID and BSSID so that they can * be used for re-association, if required * - Erases current SSID and BSSID information * - Sends a disconnect event to upper layers/applications. */ void mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason_code, bool from_ap) { struct mwifiex_adapter *adapter = priv->adapter; if (!priv->media_connected) return; mwifiex_dbg(adapter, INFO, "info: handles disconnect event\n"); priv->media_connected = false; priv->scan_block = false; priv->port_open = false; if ((GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA) && ISSUPP_TDLS_ENABLED(priv->adapter->fw_cap_info)) { mwifiex_disable_all_tdls_links(priv); if (priv->adapter->auto_tdls) mwifiex_clean_auto_tdls(priv); } /* Free Tx and Rx packets, report disconnect to upper layer */ mwifiex_clean_txrx(priv); /* Reset SNR/NF/RSSI values */ priv->data_rssi_last = 0; priv->data_nf_last = 0; priv->data_rssi_avg = 0; priv->data_nf_avg = 0; priv->bcn_rssi_last = 0; priv->bcn_nf_last = 0; priv->bcn_rssi_avg = 0; priv->bcn_nf_avg = 0; priv->rxpd_rate = 0; priv->rxpd_htinfo = 0; priv->sec_info.wpa_enabled = false; priv->sec_info.wpa2_enabled = false; priv->wpa_ie_len = 0; priv->sec_info.wapi_enabled = false; priv->wapi_ie_len = 0; priv->sec_info.wapi_key_on = false; priv->sec_info.encryption_mode = 0; /* Enable auto data rate */ priv->is_data_rate_auto = true; priv->data_rate = 0; priv->assoc_resp_ht_param = 0; priv->ht_param_present = false; if ((GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA || GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP) && priv->hist_data) mwifiex_hist_data_reset(priv); if (priv->bss_mode == NL80211_IFTYPE_ADHOC) { priv->adhoc_state = ADHOC_IDLE; priv->adhoc_is_link_sensed = false; } /* * Memorize the previous SSID and BSSID so * it could be used for re-assoc */ mwifiex_dbg(adapter, INFO, "info: previous SSID=%s, SSID len=%u\n", priv->prev_ssid.ssid, priv->prev_ssid.ssid_len); mwifiex_dbg(adapter, INFO, "info: current SSID=%s, SSID len=%u\n", priv->curr_bss_params.bss_descriptor.ssid.ssid, priv->curr_bss_params.bss_descriptor.ssid.ssid_len); memcpy(&priv->prev_ssid, &priv->curr_bss_params.bss_descriptor.ssid, sizeof(struct cfg80211_ssid)); memcpy(priv->prev_bssid, priv->curr_bss_params.bss_descriptor.mac_address, ETH_ALEN); /* Need to erase the current SSID and BSSID info */ memset(&priv->curr_bss_params, 0x00, sizeof(priv->curr_bss_params)); adapter->tx_lock_flag = false; adapter->pps_uapsd_mode = false; if (test_bit(MWIFIEX_IS_CMD_TIMEDOUT, &adapter->work_flags) && adapter->curr_cmd) return; priv->media_connected = false; mwifiex_dbg(adapter, MSG, "info: successfully disconnected from %pM: reason code %d\n", priv->cfg_bssid, reason_code); if (priv->bss_mode == NL80211_IFTYPE_STATION || priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) { cfg80211_disconnected(priv->netdev, reason_code, NULL, 0, !from_ap, GFP_KERNEL); } eth_zero_addr(priv->cfg_bssid); mwifiex_stop_net_dev_queue(priv->netdev, adapter); if (netif_carrier_ok(priv->netdev)) netif_carrier_off(priv->netdev); if (!ISSUPP_FIRMWARE_SUPPLICANT(priv->adapter->fw_cap_info)) return; mwifiex_send_cmd(priv, HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG, HostCmd_ACT_GEN_REMOVE, 0, NULL, false); }
/* * This function resets the connection state. * * The function is invoked after receiving a disconnect event from firmware, * and performs the following actions - * - Set media status to disconnected * - Clean up Tx and Rx packets * - Resets SNR/NF/RSSI value in driver * - Resets security configurations in driver * - Enables auto data rate * - Saves the previous SSID and BSSID so that they can * be used for re-association, if required * - Erases current SSID and BSSID information * - Sends a disconnect event to upper layers/applications. */ void mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason_code) { struct mwifiex_adapter *adapter = priv->adapter; if (!priv->media_connected) return; dev_dbg(adapter->dev, "info: handles disconnect event\n"); priv->media_connected = false; priv->scan_block = false; if ((GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA) && ISSUPP_TDLS_ENABLED(priv->adapter->fw_cap_info)) mwifiex_disable_all_tdls_links(priv); /* Free Tx and Rx packets, report disconnect to upper layer */ mwifiex_clean_txrx(priv); /* Reset SNR/NF/RSSI values */ priv->data_rssi_last = 0; priv->data_nf_last = 0; priv->data_rssi_avg = 0; priv->data_nf_avg = 0; priv->bcn_rssi_last = 0; priv->bcn_nf_last = 0; priv->bcn_rssi_avg = 0; priv->bcn_nf_avg = 0; priv->rxpd_rate = 0; priv->rxpd_htinfo = 0; priv->sec_info.wpa_enabled = false; priv->sec_info.wpa2_enabled = false; priv->wpa_ie_len = 0; priv->sec_info.wapi_enabled = false; priv->wapi_ie_len = 0; priv->sec_info.wapi_key_on = false; priv->sec_info.encryption_mode = 0; /* Enable auto data rate */ priv->is_data_rate_auto = true; priv->data_rate = 0; if (priv->bss_mode == NL80211_IFTYPE_ADHOC) { priv->adhoc_state = ADHOC_IDLE; priv->adhoc_is_link_sensed = false; } /* * Memorize the previous SSID and BSSID so * it could be used for re-assoc */ dev_dbg(adapter->dev, "info: previous SSID=%s, SSID len=%u\n", priv->prev_ssid.ssid, priv->prev_ssid.ssid_len); dev_dbg(adapter->dev, "info: current SSID=%s, SSID len=%u\n", priv->curr_bss_params.bss_descriptor.ssid.ssid, priv->curr_bss_params.bss_descriptor.ssid.ssid_len); memcpy(&priv->prev_ssid, &priv->curr_bss_params.bss_descriptor.ssid, sizeof(struct cfg80211_ssid)); memcpy(priv->prev_bssid, priv->curr_bss_params.bss_descriptor.mac_address, ETH_ALEN); /* Need to erase the current SSID and BSSID info */ memset(&priv->curr_bss_params, 0x00, sizeof(priv->curr_bss_params)); adapter->tx_lock_flag = false; adapter->pps_uapsd_mode = false; if (adapter->is_cmd_timedout && adapter->curr_cmd) return; priv->media_connected = false; dev_dbg(adapter->dev, "info: successfully disconnected from %pM: reason code %d\n", priv->cfg_bssid, reason_code); if (priv->bss_mode == NL80211_IFTYPE_STATION || priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) { cfg80211_disconnected(priv->netdev, reason_code, NULL, 0, GFP_KERNEL); } memset(priv->cfg_bssid, 0, ETH_ALEN); mwifiex_stop_net_dev_queue(priv->netdev, adapter); if (netif_carrier_ok(priv->netdev)) netif_carrier_off(priv->netdev); }
void prism2_disconnected(struct wlandevice *wlandev) { cfg80211_disconnected(wlandev->netdev, 0, NULL, 0, false, GFP_KERNEL); }
static void _wil6210_disconnect(struct wil6210_priv *wil, void *bssid) { int cid = -ENOENT; struct net_device *ndev = wil_to_ndev(wil); struct wireless_dev *wdev = wil->wdev; might_sleep(); if (bssid) { cid = wil_find_cid(wil, bssid); wil_dbg_misc(wil, "%s(%pM, CID %d)\n", __func__, bssid, cid); } else { wil_dbg_misc(wil, "%s(all)\n", __func__); } if (cid >= 0) /* disconnect 1 peer */ wil_disconnect_cid(wil, cid); else {/* disconnect all */ /* * BUG FIX: Disconnect single sta only * We may get to here few times * with BSSID address */ if(ndev->dev_addr && bssid) { if(ether_addr_equal(ndev->dev_addr, bssid) ) { for (cid = 0; cid < WIL6210_MAX_CID; cid++) wil_disconnect_cid(wil, cid); } } } /* link state */ switch (wdev->iftype) { case NL80211_IFTYPE_STATION: case NL80211_IFTYPE_P2P_CLIENT: wil_link_off(wil); clear_bit(wil_status_fwconnected, &wil->status); switch (wdev->sme_state) { case CFG80211_SME_CONNECTED: cfg80211_disconnected(ndev, WLAN_STATUS_UNSPECIFIED_FAILURE, NULL, 0, GFP_KERNEL); break; case CFG80211_SME_CONNECTING: cfg80211_connect_result(ndev, bssid, NULL, 0, NULL, 0, WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_KERNEL); break; default: break; } wil_dbg_misc(wil, "clear_bit(wil_status_dontscan)\n"); clear_bit(wil_status_dontscan, &wil->status); break; default: /* AP-like interface and monitor: * never scan, always connected */ if (bssid) cfg80211_del_sta(ndev, bssid, GFP_KERNEL); break; } }
VOID RTMP_CFG80211_VirtualIF_Remove( IN VOID *pAdSrc, IN PNET_DEV dev_p, IN UINT32 DevType) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; BOOLEAN isGoOn = FALSE; struct wifi_dev *wdev; #ifdef RT_CFG80211_P2P_SUPPORT UINT apidx = CFG_GO_BSSID_IDX; #else UINT apidx = MAIN_MBSSID; #endif /*RT_CFG80211_P2P_SUPPORT*/ if (dev_p) { pAd->cfg80211_ctrl.Cfg80211VifDevSet.isGoingOn = FALSE; RTMP_CFG80211_RemoveVifEntry(pAd, dev_p); RTMP_OS_NETDEV_STOP_QUEUE(dev_p); #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE isGoOn = RTMP_CFG80211_VIF_P2P_GO_ON(pAd); if (isGoOn) { wdev = &pAd->ApCfg.MBSSID[apidx].wdev; BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[CFG_GO_BSSID_IDX]; struct wifi_dev *pwdev = &pMbss->wdev; if (pAd->Mlme.bStartScc == TRUE) { pAd->Mlme.bStartScc = FALSE; AsicSwitchChannel(pAd, pAd->StaCfg.wdev.CentralChannel, FALSE); AsicLockChannel(pAd, pAd->StaCfg.wdev.CentralChannel); bbp_set_bw(pAd, pAd->StaCfg.wdev.bw); } pwdev->channel = 0; pwdev->CentralChannel= 0; pwdev->bw = 0; pwdev->extcha = EXTCHA_NONE; /*after p2p cli connect , neet to change to default configure*/ pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW; pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40; pAd->CommonCfg.HT_Disable = 0; SetCommonHT(pAd); wdev_bcn_buf_deinit(pAd, &pAd->ApCfg.MBSSID[apidx].bcn_buf); RtmpOSNetDevDetach(dev_p); rtmp_wdev_idx_unreg(pAd, wdev); wdev->if_dev = NULL; } else #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ if (pAd->flg_apcli_init) { wdev = &pAd->ApCfg.ApCliTab[MAIN_MBSSID].wdev; //actually not mcc still need to check this! if (pAd->Mlme.bStartScc == TRUE) { printk("GC remove & switch to Infra BW = %d pAd->StaCfg.wdev.CentralChannel %d \n",pAd->StaCfg.wdev.bw,pAd->StaCfg.wdev.CentralChannel); pAd->Mlme.bStartScc = FALSE; AsicSwitchChannel(pAd, pAd->StaCfg.wdev.CentralChannel, FALSE); AsicLockChannel(pAd, pAd->StaCfg.wdev.CentralChannel); bbp_set_bw(pAd, pAd->StaCfg.wdev.bw); } wdev->CentralChannel = 0; wdev->channel= 0; wdev->bw = HT_BW_20; wdev->extcha = EXTCHA_NONE; OPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); cfg80211_disconnected(dev_p, 0, NULL, 0, GFP_KERNEL); NdisZeroMemory(pAd->ApCfg.ApCliTab[MAIN_MBSSID].CfgApCliBssid, MAC_ADDR_LEN); RtmpOSNetDevDetach(dev_p); rtmp_wdev_idx_unreg(pAd, wdev); pAd->flg_apcli_init = FALSE; wdev->if_dev = NULL; } else /* Never Opened When New Netdevice on */ { RtmpOSNetDevDetach(dev_p); } if (dev_p->ieee80211_ptr) { kfree(dev_p->ieee80211_ptr); dev_p->ieee80211_ptr = NULL; } } }
static INT CFG80211_DummyP2pIf_Close( IN PNET_DEV dev_p) { struct wireless_dev *wdev = dev_p->ieee80211_ptr; #ifdef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE VOID *pAdSrc; pAdSrc = RTMP_OS_NETDEV_GET_PRIV(dev_p); ASSERT(pAdSrc); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; BOOLEAN isGoOn = FALSE; UINT apidx = 1; struct wifi_dev *Wdev; #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ if (!wdev) return -EINVAL; #ifdef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE if (pAd->flg_apcli_init) { DBGPRINT(RT_DEBUG_TRACE, ("ApCli_Close\n")); CFG80211OS_ScanEnd(pAd->pCfg80211_CB, TRUE); // RT_MOD_DEC_USE_COUNT(); ApCli_Close(pAd, dev_p); } DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); RTMP_OS_NETDEV_STOP_QUEUE(dev_p); if (INFRA_ON(pAd)) AsicEnableBssSync(pAd,100); else if (ADHOC_ON(pAd)) AsicEnableIbssSync(pAd); else AsicDisableSync(pAd); //VIRTUAL_IF_DOWN(pAd); if (cfg80211_ctrl->dummy_p2p_net_dev) { //iverson if (isGoOn) { Wdev = &pAd->ApCfg.MBSSID[apidx].wdev; wdev_bcn_buf_deinit(pAd, &pAd->ApCfg.MBSSID[apidx].bcn_buf); rtmp_wdev_idx_unreg(pAd, Wdev); Wdev->if_dev = NULL; } else if (pAd->flg_apcli_init) { Wdev = &pAd->ApCfg.ApCliTab[MAIN_MBSSID].wdev; OPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); cfg80211_disconnected(dev_p, 0, NULL, 0, GFP_KERNEL); CFG80211OS_ScanEnd(pAd->pCfg80211_CB, TRUE); NdisZeroMemory(pAd->ApCfg.ApCliTab[MAIN_MBSSID].CfgApCliBssid, MAC_ADDR_LEN); // RtmpOSNetDevDetach(dev_p); rtmp_wdev_idx_unreg(pAd, Wdev); pAd->flg_apcli_init = FALSE; // Wdev->if_dev = NULL; } } AsicSetBssid(pAd, pAd->cfg80211_ctrl.P2PCurrentAddress, 0x1); AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ wdev->wiphy->interface_modes = (wdev->wiphy->interface_modes) & (~(BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)) | BIT(RT_CMD_80211_IFTYPE_P2P_DEVICE) #endif /* LINUX_VERSION_CODE: 3.7.0 */ )); #ifdef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE RT_MOD_DEC_USE_COUNT(); #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ return 0; }
void prism2_disconnected(wlandevice_t *wlandev) { cfg80211_disconnected(wlandev->netdev, 0, NULL, 0, GFP_KERNEL); }
/* * This function resets the connection state. * * The function is invoked after receiving a disconnect event from firmware, * and performs the following actions - * - Set media status to disconnected * - Clean up Tx and Rx packets * - Resets SNR/NF/RSSI value in driver * - Resets security configurations in driver * - Enables auto data rate * - Saves the previous SSID and BSSID so that they can * be used for re-association, if required * - Erases current SSID and BSSID information * - Sends a disconnect event to upper layers/applications. */ void mwifiex_reset_connect_state(struct mwifiex_private *priv) { struct mwifiex_adapter *adapter = priv->adapter; if (!priv->media_connected) return; dev_dbg(adapter->dev, "info: handles disconnect event\n"); priv->media_connected = false; priv->scan_block = false; /* Free Tx and Rx packets, report disconnect to upper layer */ mwifiex_clean_txrx(priv); /* Reset SNR/NF/RSSI values */ priv->data_rssi_last = 0; priv->data_nf_last = 0; priv->data_rssi_avg = 0; priv->data_nf_avg = 0; priv->bcn_rssi_last = 0; priv->bcn_nf_last = 0; priv->bcn_rssi_avg = 0; priv->bcn_nf_avg = 0; priv->rxpd_rate = 0; priv->rxpd_htinfo = 0; priv->sec_info.wpa_enabled = false; priv->sec_info.wpa2_enabled = false; priv->wpa_ie_len = 0; priv->sec_info.wapi_enabled = false; priv->wapi_ie_len = 0; priv->sec_info.wapi_key_on = false; priv->sec_info.encryption_mode = 0; /* Enable auto data rate */ priv->is_data_rate_auto = true; priv->data_rate = 0; if (priv->bss_mode == NL80211_IFTYPE_ADHOC) { priv->adhoc_state = ADHOC_IDLE; priv->adhoc_is_link_sensed = false; } /* * Memorize the previous SSID and BSSID so * it could be used for re-assoc */ dev_dbg(adapter->dev, "info: previous SSID=%s, SSID len=%u\n", priv->prev_ssid.ssid, priv->prev_ssid.ssid_len); dev_dbg(adapter->dev, "info: current SSID=%s, SSID len=%u\n", priv->curr_bss_params.bss_descriptor.ssid.ssid, priv->curr_bss_params.bss_descriptor.ssid.ssid_len); memcpy(&priv->prev_ssid, &priv->curr_bss_params.bss_descriptor.ssid, sizeof(struct mwifiex_802_11_ssid)); memcpy(priv->prev_bssid, priv->curr_bss_params.bss_descriptor.mac_address, ETH_ALEN); /* Need to erase the current SSID and BSSID info */ memset(&priv->curr_bss_params, 0x00, sizeof(priv->curr_bss_params)); adapter->tx_lock_flag = false; adapter->pps_uapsd_mode = false; if (adapter->num_cmd_timeout && adapter->curr_cmd) return; priv->media_connected = false; dev_dbg(adapter->dev, "info: successfully disconnected from" " %pM: reason code %d\n", priv->cfg_bssid, WLAN_REASON_DEAUTH_LEAVING); if (priv->bss_mode == NL80211_IFTYPE_STATION) { cfg80211_disconnected(priv->netdev, WLAN_REASON_DEAUTH_LEAVING, NULL, 0, GFP_KERNEL); } memset(priv->cfg_bssid, 0, ETH_ALEN); if (!netif_queue_stopped(priv->netdev)) mwifiex_stop_net_dev_queue(priv->netdev, adapter); if (netif_carrier_ok(priv->netdev)) netif_carrier_off(priv->netdev); /* Reset wireless stats signal info */ priv->qual_level = 0; priv->qual_noise = 0; }