summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h10
-rw-r--r--CORE/HDD/inc/wlan_hdd_hostapd.h6
-rw-r--r--CORE/HDD/inc/wlan_hdd_ipa.h4
-rw-r--r--CORE/HDD/inc/wlan_hdd_main.h4
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c2
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c14
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c2
-rw-r--r--CORE/HDD/src/wlan_hdd_early_suspend.c47
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c122
-rw-r--r--CORE/HDD/src/wlan_hdd_ipa.c39
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c49
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))