diff options
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_cfg.h | 10 | ||||
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_hostapd.h | 6 | ||||
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_ipa.h | 4 | ||||
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_main.h | 4 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_assoc.c | 2 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg.c | 14 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg80211.c | 2 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_early_suspend.c | 47 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_hostapd.c | 122 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_ipa.c | 39 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_main.c | 49 |
11 files changed, 233 insertions, 66 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h index 40dd9bff46c0..bfcb520d3b9c 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/CORE/HDD/inc/wlan_hdd_cfg.h @@ -4155,10 +4155,10 @@ FG_BTC_BT_INTERVAL_PAGE_P2P_STA_DEFAULT #define CFG_TGT_GTX_USR_CFG_MAX (32) #define CFG_TGT_GTX_USR_CFG_DEFAULT (32) -#define CFG_CH_AVOID_SAP_RESTART_NAME "sap_ch_avoid_restart" -#define CFG_CH_AVOID_SAP_RESTART_MIN (0) -#define CFG_CH_AVOID_SAP_RESTART_MAX (1) -#define CFG_CH_AVOID_SAP_RESTART_DEFAULT (0) +#define CFG_SAP_INTERNAL_RESTART_NAME "gEnableSapInternalRestart" +#define CFG_SAP_INTERNAL_RESTART_MIN (0) +#define CFG_SAP_INTERNAL_RESTART_MAX (1) +#define CFG_SAP_INTERNAL_RESTART_DEFAULT (0) /* * This parameter will help to debug ssr reinit failure issues @@ -5298,7 +5298,7 @@ struct hdd_config { /* parameter to control GTX */ uint32_t tgt_gtx_usr_cfg; - bool sap_restrt_ch_avoid; + bool sap_internal_restart; bool bug_on_reinit_failure; /* parameter to force sap into 11n */ bool sap_force_11n_for_11ac; diff --git a/CORE/HDD/inc/wlan_hdd_hostapd.h b/CORE/HDD/inc/wlan_hdd_hostapd.h index a8e521264323..bfc64a7a316f 100644 --- a/CORE/HDD/inc/wlan_hdd_hostapd.h +++ b/CORE/HDD/inc/wlan_hdd_hostapd.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -92,11 +92,13 @@ int hdd_softap_unpackIE( tHalHandle halHandle, u_int8_t *gen_ie ); VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCallback); -VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ); +VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter, bool reinit); void hdd_set_ap_ops( struct net_device *pWlanHostapdDev ); int hdd_hostapd_stop (struct net_device *dev); void hdd_hostapd_channel_wakelock_init(hdd_context_t *pHddCtx); void hdd_hostapd_channel_wakelock_deinit(hdd_context_t *pHddCtx); +void hdd_sap_indicate_disconnect_for_sta(hdd_adapter_t *adapter); +void hdd_sap_destroy_events(hdd_adapter_t *adapter); #ifdef FEATURE_WLAN_FORCE_SAP_SCC void hdd_restart_softap (hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter); #endif /* FEATURE_WLAN_FORCE_SAP_SCC */ diff --git a/CORE/HDD/inc/wlan_hdd_ipa.h b/CORE/HDD/inc/wlan_hdd_ipa.h index eaddd31abc25..17a88412faef 100644 --- a/CORE/HDD/inc/wlan_hdd_ipa.h +++ b/CORE/HDD/inc/wlan_hdd_ipa.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -72,7 +72,7 @@ int hdd_ipa_send_mcc_scc_msg(hdd_context_t *hdd_ctx, bool mcc_mode); #ifdef IPA_UC_OFFLOAD void hdd_ipa_uc_force_pipe_shutdown(hdd_context_t *hdd_ctx); -int hdd_ipa_uc_ssr_reinit(void); +int hdd_ipa_uc_ssr_reinit(hdd_context_t *hdd_ctx); int hdd_ipa_uc_ssr_deinit(void); void hdd_ipa_uc_stat_query(hdd_context_t *pHddCtx, uint32_t *ipa_tx_diff, uint32_t *ipa_rx_diff); diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h index 02a6b6803857..a5601e1a0589 100644 --- a/CORE/HDD/inc/wlan_hdd_main.h +++ b/CORE/HDD/inc/wlan_hdd_main.h @@ -2253,10 +2253,10 @@ VOS_STATUS wlan_hdd_check_custom_con_channel_rules(hdd_adapter_t *sta_adapter, bool *concurrent_chnl_same); #ifdef WLAN_FEATURE_MBSSID void wlan_hdd_stop_sap(hdd_adapter_t *ap_adapter); -void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter); +void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter, bool reinit); #else static inline void wlan_hdd_stop_sap(hdd_adapter_t *ap_adapter) {} -static inline void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter) {} +static inline void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter, bool reinit) {} #endif int wlan_hdd_get_link_speed(hdd_adapter_t *sta_adapter, uint32_t *link_speed); int hdd_wlan_go_set_mcc_p2p_quota(hdd_adapter_t *hostapd_adapter, diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index 4fb300446b56..2fd7c399fe0d 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -1685,7 +1685,7 @@ void hdd_sap_restart_handle(struct work_struct *work) wlan_hdd_restart_sap(sap_adapter); hdd_change_ch_avoidance_status(hdd_ctx, false); } else { - wlan_hdd_start_sap(sap_adapter); + wlan_hdd_start_sap(sap_adapter, false); hdd_change_sap_restart_required_status(hdd_ctx, false); } vos_ssr_unprotect(__func__); diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index c57cde12a13f..c827dc38466b 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -4744,12 +4744,12 @@ REG_TABLE_ENTRY g_registry_table[] = CFG_TGT_GTX_USR_CFG_MIN, CFG_TGT_GTX_USR_CFG_MAX), - REG_VARIABLE(CFG_CH_AVOID_SAP_RESTART_NAME, WLAN_PARAM_Integer, - hdd_config_t, sap_restrt_ch_avoid, + REG_VARIABLE(CFG_SAP_INTERNAL_RESTART_NAME, WLAN_PARAM_Integer, + hdd_config_t, sap_internal_restart, VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, - CFG_CH_AVOID_SAP_RESTART_DEFAULT, - CFG_CH_AVOID_SAP_RESTART_MIN, - CFG_CH_AVOID_SAP_RESTART_MAX), + CFG_SAP_INTERNAL_RESTART_DEFAULT, + CFG_SAP_INTERNAL_RESTART_MIN, + CFG_SAP_INTERNAL_RESTART_MAX), REG_VARIABLE(CFG_BUG_ON_REINIT_FAILURE_NAME, WLAN_PARAM_Integer, hdd_config_t, bug_on_reinit_failure, @@ -5835,8 +5835,8 @@ void print_hdd_cfg(hdd_context_t *pHddCtx) pHddCtx->cfg_ini->tgt_gtx_usr_cfg); hddLog(LOG2, "Name = [%s] Value = [%u]", - CFG_CH_AVOID_SAP_RESTART_NAME, - pHddCtx->cfg_ini->sap_restrt_ch_avoid); + CFG_SAP_INTERNAL_RESTART_NAME, + pHddCtx->cfg_ini->sap_internal_restart); hddLog(LOG2, "Name = [%s] Value = [%u]", CFG_SAP_FORCE_11N_FOR_11AC_NAME, diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index 04498e1d364d..d267d45dd9a3 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -17586,7 +17586,7 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy, } } - vstatus = hdd_init_ap_mode(pAdapter); + vstatus = hdd_init_ap_mode(pAdapter, false); if (vstatus != VOS_STATUS_SUCCESS) { hddLog(LOGP, FL("Error initializing the ap mode")); return -EINVAL; diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c index 5d23dc62aa8a..6fc1158af487 100644 --- a/CORE/HDD/src/wlan_hdd_early_suspend.c +++ b/CORE/HDD/src/wlan_hdd_early_suspend.c @@ -2181,7 +2181,34 @@ VOS_STATUS hdd_wlan_shutdown(void) return VOS_STATUS_SUCCESS; } +/** + * hdd_ssr_restart_sap() - restart sap on SSR + * @hdd_ctx: hdd context + * + * Return: nothing + */ +static void hdd_ssr_restart_sap(hdd_context_t *hdd_ctx) +{ + VOS_STATUS status; + hdd_adapter_list_node_t *adapter_node = NULL, *next = NULL; + hdd_adapter_t *adapter; + ENTER(); + + status = hdd_get_front_adapter (hdd_ctx, &adapter_node); + while (NULL != adapter_node && VOS_STATUS_SUCCESS == status) { + adapter = adapter_node->pAdapter; + if (adapter && adapter->device_mode == WLAN_HDD_SOFTAP) { + hddLog(VOS_TRACE_LEVEL_INFO, FL("in sap mode %p"), + adapter); + wlan_hdd_start_sap(adapter, true); + } + status = hdd_get_next_adapter ( hdd_ctx, adapter_node, &next ); + adapter_node = next; + } + + EXIT(); +} /* the HDD interface to WLAN driver re-init. * This is called to initialize/start WLAN driver after a shutdown. @@ -2193,7 +2220,6 @@ VOS_STATUS hdd_wlan_re_init(void *hif_sc) hdd_context_t *pHddCtx = NULL; eHalStatus halStatus; bool bug_on_reinit_failure = 0; - hdd_adapter_t *pAdapter; int i; hdd_prevent_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_REINIT); @@ -2226,7 +2252,8 @@ VOS_STATUS hdd_wlan_re_init(void *hif_sc) ((VosContextType*)pVosContext)->pHIFContext = hif_sc; /* The driver should always be initialized in STA mode after SSR */ - hdd_set_conparam(0); + if (VOS_STA_SAP_MODE != hdd_get_conparam()) + hdd_set_conparam(0); /* Re-open VOSS, it is a re-open b'se control transport was never closed. */ vosStatus = vos_open(&pVosContext, 0); @@ -2293,6 +2320,15 @@ VOS_STATUS hdd_wlan_re_init(void *hif_sc) goto err_vosclose; } + /* + * Invoke ipa reinit before vos_start so that doorbell registers are + * updated + */ +#ifdef IPA_UC_OFFLOAD + if (hdd_ipa_uc_ssr_reinit(pHddCtx)) + hddLog(LOGE, "%s: HDD IPA UC reinit failed", __func__); +#endif + /* Start VOSS which starts up the SME/MAC/HAL modules and everything else Note: Firmware image will be read and downloaded inside vos_start API */ vosStatus = vos_start( pVosContext ); @@ -2301,11 +2337,6 @@ VOS_STATUS hdd_wlan_re_init(void *hif_sc) hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_start failed",__func__); goto err_vosclose; } -#ifdef IPA_UC_OFFLOAD - if (hdd_ipa_uc_ssr_reinit()) - hddLog(LOGE, "%s: HDD IPA UC reinit failed", __func__); -#endif - vosStatus = hdd_post_voss_start_config( pHddCtx ); if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) ) @@ -2471,6 +2502,8 @@ err_re_init: hdd_wlan_wakelock_destroy(); return -EPERM; success: + if (pHddCtx->cfg_ini->sap_internal_restart) + hdd_ssr_restart_sap(pHddCtx); pHddCtx->isLogpInProgress = FALSE; hdd_ssr_timer_del(); return VOS_STATUS_SUCCESS; diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c index 693c0c95d879..56003d99c6c9 100644 --- a/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/CORE/HDD/src/wlan_hdd_hostapd.c @@ -2453,7 +2453,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa return VOS_STATUS_E_FAILURE; } #ifdef IPA_OFFLOAD - if (hdd_ipa_is_enabled(pHddCtx)) + if (!pHddCtx->isLogpInProgress && hdd_ipa_is_enabled(pHddCtx)) { status = hdd_ipa_wlan_evt(pHostapdAdapter, staId, WLAN_CLIENT_DISCONNECT, pSapEvent->sapevt.sapStationDisassocCompleteEvent.staMac.bytes); @@ -7163,7 +7163,7 @@ void hdd_set_ap_ops( struct net_device *pWlanHostapdDev ) pWlanHostapdDev->netdev_ops = &net_ops_struct; } -VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) +VOS_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter, bool reinit) { hdd_hostapd_state_t * phostapdBuf; struct net_device *dev = pAdapter->dev; @@ -7189,20 +7189,27 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) __func__, ret); } + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, + FL("SSR in progress: %d"), reinit); #ifdef WLAN_FEATURE_MBSSID - sapContext = WLANSAP_Open(pVosContext); - if (sapContext == NULL) - { - VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: WLANSAP_Open failed!!")); - return VOS_STATUS_E_FAULT; - } - - pAdapter->sessionCtx.ap.sapContext = sapContext; - pAdapter->sessionCtx.ap.sapConfig.channel = pHddCtx->acs_policy.acs_channel; - mode = pHddCtx->acs_policy.acs_dfs_mode; - pAdapter->sessionCtx.ap.sapConfig.acs_dfs_mode = - wlan_hdd_get_dfs_mode(mode); + if (reinit) { + sapContext = pAdapter->sessionCtx.ap.sapContext; + } else { + sapContext = WLANSAP_Open(pVosContext); + if (sapContext == NULL) + { + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, + FL("ERROR: WLANSAP_Open failed!!")); + return VOS_STATUS_E_FAULT; + } + pAdapter->sessionCtx.ap.sapContext = sapContext; + pAdapter->sessionCtx.ap.sapConfig.channel = + pHddCtx->acs_policy.acs_channel; + mode = pHddCtx->acs_policy.acs_dfs_mode; + pAdapter->sessionCtx.ap.sapConfig.acs_dfs_mode = + wlan_hdd_get_dfs_mode(mode); + } if (pAdapter->device_mode == WLAN_HDD_P2P_GO) { device_mode = VOS_P2P_GO_MODE; @@ -7316,10 +7323,12 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) __func__, ret); } - pAdapter->sessionCtx.ap.sapConfig.acs_cfg.acs_mode = false; - vos_mem_free(pAdapter->sessionCtx.ap.sapConfig.acs_cfg.ch_list); - vos_mem_zero(&pAdapter->sessionCtx.ap.sapConfig.acs_cfg, - sizeof(struct sap_acs_cfg)); + if (!reinit) { + pAdapter->sessionCtx.ap.sapConfig.acs_cfg.acs_mode = false; + vos_mem_free(pAdapter->sessionCtx.ap.sapConfig.acs_cfg.ch_list); + vos_mem_zero(&pAdapter->sessionCtx.ap.sapConfig.acs_cfg, + sizeof(struct sap_acs_cfg)); + } return status; error_wmm_init: @@ -7490,3 +7499,80 @@ VOS_STATUS hdd_unregister_hostapd(hdd_adapter_t *pAdapter, bool rtnl_held) EXIT(); return 0; } + +/** + * hdd_sap_indicate_disconnect_for_sta() - Indicate disconnect indication + * to supplicant, if there any clients connected to SAP interface. + * @adapter: sap adapter context + * + * Return: nothing + */ +void hdd_sap_indicate_disconnect_for_sta(hdd_adapter_t *adapter) +{ + tSap_Event sap_event; + int staId; + ptSapContext sap_ctx = WLAN_HDD_GET_SAP_CTX_PTR(adapter); + + ENTER(); + + if (!sap_ctx) { + hddLog(LOGE, FL("invalid sap context")); + return; + } + + for (staId = 0; staId < WLAN_MAX_STA_COUNT; staId++) { + if (adapter->aStaInfo[staId].isUsed) { + hddLog(LOG1, FL("staId: %d isUsed: %d %p"), + staId, adapter->aStaInfo[staId].isUsed, + sap_ctx); + + if (vos_is_macaddr_broadcast( + &adapter->aStaInfo[staId].macAddrSTA)) + continue; + + sap_event.sapHddEventCode = eSAP_STA_DISASSOC_EVENT; + vos_mem_copy( + &sap_event.sapevt. + sapStationDisassocCompleteEvent.staMac, + &adapter->aStaInfo[staId].macAddrSTA, + sizeof(v_MACADDR_t)); + sap_event.sapevt.sapStationDisassocCompleteEvent. + reason = + eSAP_MAC_INITATED_DISASSOC; + sap_event.sapevt.sapStationDisassocCompleteEvent. + statusCode = + eSIR_SME_RESOURCES_UNAVAILABLE; + hdd_hostapd_SAPEventCB(&sap_event, + sap_ctx->pUsrContext); + } + } + + clear_bit(SOFTAP_BSS_STARTED, &adapter->event_flags); + + EXIT(); +} + +/** + * hdd_sap_destroy_events() - Destroy sap evets + * @adapter: sap adapter context + * + * Return: nothing + */ +void hdd_sap_destroy_events(hdd_adapter_t *adapter) +{ + ptSapContext sap_ctx = WLAN_HDD_GET_SAP_CTX_PTR(adapter); + + if (!sap_ctx) { + hddLog(LOGE, FL("invalid sap context")); + return; + } + + if (!VOS_IS_STATUS_SUCCESS(vos_lock_destroy(&sap_ctx->SapGlobalLock))) + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + FL("WLANSAP_Stop failed destroy lock")); + + if (!VOS_IS_STATUS_SUCCESS(vos_event_destroy( + &sap_ctx->sap_session_opened_evt))) + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + FL("failed to destroy session open event")); +} diff --git a/CORE/HDD/src/wlan_hdd_ipa.c b/CORE/HDD/src/wlan_hdd_ipa.c index 2c3b486cf9f4..11e7104e6716 100644 --- a/CORE/HDD/src/wlan_hdd_ipa.c +++ b/CORE/HDD/src/wlan_hdd_ipa.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -2039,8 +2039,11 @@ static VOS_STATUS hdd_ipa_uc_ol_init(hdd_context_t *hdd_ctx) vos_mem_zero(&pipe_out, sizeof(struct ipa_wdi_out_params)); vos_list_init(&ipa_ctxt->pending_event); - vos_lock_init(&ipa_ctxt->event_lock); - vos_lock_init(&ipa_ctxt->ipa_lock); + + if (!hdd_ctx->isLogpInProgress) { + vos_lock_init(&ipa_ctxt->event_lock); + vos_lock_init(&ipa_ctxt->ipa_lock); + } /* TX PIPE */ pipe_in.sys.ipa_ep_cfg.nat.nat_en = IPA_BYPASS_NAT; @@ -2364,12 +2367,13 @@ int hdd_ipa_uc_ssr_deinit() struct hdd_ipa_priv *hdd_ipa = ghdd_ipa; int idx; struct hdd_ipa_iface_context *iface_context; + hdd_context_t *hdd_ctx = hdd_ipa->hdd_ctx; if (!hdd_ipa_uc_is_enabled(hdd_ipa)) return 0; /* send disconnect to ipa driver */ - hdd_ipa_uc_disconnect(hdd_ipa->hdd_ctx); + hdd_ipa_uc_disconnect(hdd_ctx); /* Clean up HDD IPA interfaces */ for (idx = 0; (hdd_ipa->num_iface > 0) && @@ -2393,6 +2397,22 @@ int hdd_ipa_uc_ssr_deinit() } vos_lock_release(&hdd_ipa->ipa_lock); + /* + * Do WDI pipes disconnect here. During reinit new WDI pipes + * will be created. + */ + /* In MDM case pipes will be disconnected as part of ipa cleanup */ + if (hdd_ctx->cfg_ini->sap_internal_restart) { + HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, + "%s: Disconnect TX PIPE tx_pipe_handle=0x%x", + __func__, hdd_ipa->tx_pipe_handle); + ipa_disconnect_wdi_pipe(hdd_ipa->tx_pipe_handle); + HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, + "%s: Disconnect RX PIPE rx_pipe_handle=0x%x", + __func__, hdd_ipa->rx_pipe_handle); + ipa_disconnect_wdi_pipe(hdd_ipa->rx_pipe_handle); + } + if (hdd_ipa_uc_sta_is_enabled(hdd_ipa)) { hdd_ipa_uc_sta_reset_sta_connected(hdd_ipa); } @@ -2411,19 +2431,16 @@ int hdd_ipa_uc_ssr_deinit() * * Return: 0 - Success */ -int hdd_ipa_uc_ssr_reinit() +int hdd_ipa_uc_ssr_reinit(hdd_context_t *hdd_ctx) { struct hdd_ipa_priv *hdd_ipa = ghdd_ipa; if (!hdd_ipa_uc_is_enabled(hdd_ipa)) return 0; - /* After SSR is complete, IPA UC can resume operation. But now wlan - * driver will be unloaded and reloaded, which takes care of IPA cleanup - * and initialization. - * This is a placeholder func if IPA has to resume operations without - * driver reload. - */ + if (hdd_ctx->cfg_ini->sap_internal_restart) + hdd_ipa_uc_ol_init(hdd_ctx); + return 0; } #else diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 4e1c0a464119..8e98564295fa 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -11168,7 +11168,7 @@ hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type, pAdapter->device_mode = session_type; hdd_initialize_adapter_common(pAdapter); - status = hdd_init_ap_mode(pAdapter); + status = hdd_init_ap_mode(pAdapter, false); if( VOS_STATUS_SUCCESS != status ) goto err_free_netdev; @@ -11868,10 +11868,24 @@ VOS_STATUS hdd_reset_all_adapters( hdd_context_t *pHddCtx ) while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status ) { pAdapter = pAdapterNode->pAdapter; + hddLog(LOG1, FL("Disabling queues")); - wlan_hdd_netif_queue_control(pAdapter, - WLAN_NETIF_TX_DISABLE_N_CARRIER, - WLAN_CONTROL_PATH); + + if (pHddCtx->cfg_ini->sap_internal_restart && + pAdapter->device_mode == WLAN_HDD_SOFTAP) { + hddLog(LOG1, FL("driver supports sap restart")); + vos_flush_work(&pHddCtx->sap_start_work); + wlan_hdd_netif_queue_control(pAdapter, + WLAN_NETIF_TX_DISABLE, + WLAN_CONTROL_PATH); + hdd_sap_indicate_disconnect_for_sta(pAdapter); + hdd_cleanup_actionframe(pHddCtx, pAdapter); + hdd_sap_destroy_events(pAdapter); + + } else + wlan_hdd_netif_queue_control(pAdapter, + WLAN_NETIF_TX_DISABLE_N_CARRIER, + WLAN_CONTROL_PATH); pAdapter->sessionCtx.station.hdd_ReassocScenario = VOS_FALSE; @@ -12132,7 +12146,17 @@ VOS_STATUS hdd_start_all_adapters( hdd_context_t *pHddCtx ) break; case WLAN_HDD_SOFTAP: - /* softAP can handle SSR */ + if (pHddCtx->cfg_ini->sap_internal_restart) { + hdd_init_ap_mode(pAdapter, true); + +#ifdef QCA_LL_TX_FLOW_CT + WLANTL_RegisterTXFlowControl(pHddCtx->pvosContext, + hdd_softap_tx_resume_cb, + pAdapter->sessionId, + (void *)pAdapter); +#endif + + } break; case WLAN_HDD_P2P_GO: @@ -17216,8 +17240,8 @@ void hdd_unsafe_channel_restart_sap(hdd_context_t *hdd_ctx) 0); hddLog(LOG1, FL("driver to start sap: %d"), - hdd_ctx->cfg_ini->sap_restrt_ch_avoid); - if (hdd_ctx->cfg_ini->sap_restrt_ch_avoid) { + hdd_ctx->cfg_ini->sap_internal_restart); + if (hdd_ctx->cfg_ini->sap_internal_restart) { wlan_hdd_netif_queue_control(adapter, WLAN_NETIF_TX_DISABLE, WLAN_CONTROL_PATH); @@ -18134,7 +18158,7 @@ void wlan_hdd_stop_sap(hdd_adapter_t *ap_adapter) * * Return: void. */ -void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter) +void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter, bool reinit) { hdd_ap_ctx_t *hdd_ap_ctx; hdd_hostapd_state_t *hostapd_state; @@ -18153,8 +18177,13 @@ void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter) hostapd_state = WLAN_HDD_GET_HOSTAP_STATE_PTR(ap_adapter); pConfig = &ap_adapter->sessionCtx.ap.sapConfig; - if (0 != wlan_hdd_validate_context(hdd_ctx)) - return; + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, + FL("ssr in progress %d"), reinit); + + if (!reinit) { + if (0 != wlan_hdd_validate_context(hdd_ctx)) + return; + } mutex_lock(&hdd_ctx->sap_lock); if (test_bit(SOFTAP_BSS_STARTED, &ap_adapter->event_flags)) |
