diff options
| author | Hanumanth Reddy Pothula <c_hpothu@codeaurora.org> | 2017-01-10 20:53:32 +0530 |
|---|---|---|
| committer | c_manjee <manjee@codeaurora.org> | 2017-01-31 12:11:38 +0530 |
| commit | 9c4830d75264d63c5b0d400d628f2f2eb67f64b3 (patch) | |
| tree | 2d1ca70f9cdf9ef64e9ab54281c82299e828734a | |
| parent | 124b686ccdb82d6e20b9c523213521dacfffb68a (diff) | |
qcacld-2.0: Add support in driver to do sap restart during SSR
Presently, during subsystem restart Host is sending sap restart
indication to framework(via carrier off) to do SAP unload/load.
But SAP restart functionality is removed in framework when the
carrier off event is received, leading SAP fails to come-up
after subsystem restart.
Add support in driver to do SAP restart internally without sending
restart indication to framework, during subsystem restart.
This feature is controlled by ini param 'gEnableSapInternalRestart'
and by default it's disabled.
Change-Id: I76cb73c1887d4d8124cd9a1c29b9aac47642072a
CRs-Fixed: 1105651
| -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)) |
