summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorService qcabuildsw <qcabuildsw@localhost>2016-12-22 09:36:35 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2016-12-22 09:36:35 -0800
commit6e5996f4905c3ecb870585c115cbabd6f6db6192 (patch)
tree3ba88bf1ac4d27d4b7c1630bed1c6b2aebe20938
parent1aec0c09dafb229501f319a8ce03764d1f821692 (diff)
parentce814700fd9def56d960e67d3dce78a25bc3f0d9 (diff)
Merge "qcacld-3.0: Fix to handle error conditions when pre-cac adapter fails" into wlan-cld3.driver.lnx.1.1-dev
-rw-r--r--core/cds/src/cds_concurrency.c5
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.c53
-rw-r--r--core/hdd/src/wlan_hdd_hostapd.c10
-rw-r--r--core/hdd/src/wlan_hdd_main.c3
-rw-r--r--core/mac/src/pe/lim/lim_process_sme_req_messages.c49
5 files changed, 69 insertions, 51 deletions
diff --git a/core/cds/src/cds_concurrency.c b/core/cds/src/cds_concurrency.c
index 4c41547c3247..5cca3b62bbc2 100644
--- a/core/cds/src/cds_concurrency.c
+++ b/core/cds/src/cds_concurrency.c
@@ -7913,8 +7913,9 @@ void cds_restart_sap(hdd_adapter_t *ap_adapter)
}
cds_err("SAP Start Success");
set_bit(SOFTAP_BSS_STARTED, &ap_adapter->event_flags);
- cds_incr_active_session(ap_adapter->device_mode,
- ap_adapter->sessionId);
+ if (hostapd_state->bssState == BSS_START)
+ cds_incr_active_session(ap_adapter->device_mode,
+ ap_adapter->sessionId);
hostapd_state->bCommit = true;
}
end:
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 2228dba875fe..4eea18845bd2 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -6851,7 +6851,7 @@ static int wlan_hdd_validate_and_get_pre_cac_ch(hdd_context_t *hdd_ctx,
*/
int wlan_hdd_request_pre_cac(uint8_t channel)
{
- uint8_t pre_cac_chan = 0;
+ uint8_t pre_cac_chan = 0, *mac_addr;
hdd_context_t *hdd_ctx;
int ret;
hdd_adapter_t *ap_adapter, *pre_cac_adapter;
@@ -6911,23 +6911,19 @@ int wlan_hdd_request_pre_cac(uint8_t channel)
return -EINVAL;
}
+ mac_addr = wlan_hdd_get_intf_addr(hdd_ctx);
+ if (!mac_addr) {
+ hdd_err("can't add virtual intf: Not getting valid mac addr");
+ return -EINVAL;
+ }
+
hdd_info("channel:%d", channel);
ret = wlan_hdd_validate_and_get_pre_cac_ch(hdd_ctx, ap_adapter, channel,
&pre_cac_chan);
- if (ret != 0)
- return ret;
-
- /* Since current SAP is in 2.4GHz and pre CAC channel is in 5GHz, this
- * connection update should result in DBS mode
- */
- status = cds_update_and_wait_for_connection_update(
- ap_adapter->sessionId,
- pre_cac_chan,
- SIR_UPDATE_REASON_PRE_CAC);
- if (QDF_IS_STATUS_ERROR(status)) {
- hdd_err("error in moving to DBS mode");
- return -EINVAL;
+ if (ret != 0) {
+ hdd_err("can't validate pre-cac channel");
+ goto release_intf_addr_and_return_failure;
}
hdd_debug("starting pre cac SAP adapter");
@@ -6950,11 +6946,10 @@ int wlan_hdd_request_pre_cac(uint8_t channel)
* from user space.
*/
pre_cac_adapter = hdd_open_adapter(hdd_ctx, QDF_SAP_MODE, "precac%d",
- wlan_hdd_get_intf_addr(hdd_ctx),
- NET_NAME_UNKNOWN, true);
+ mac_addr, NET_NAME_UNKNOWN, true);
if (!pre_cac_adapter) {
hdd_err("error opening the pre cac adapter");
- return -EINVAL;
+ goto release_intf_addr_and_return_failure;
}
/*
@@ -7022,6 +7017,22 @@ int wlan_hdd_request_pre_cac(uint8_t channel)
hdd_debug("orig width:%d channel_type:%d freq:%d",
ap_adapter->sessionCtx.ap.sapConfig.ch_width_orig,
channel_type, freq);
+ /*
+ * Doing update after opening and starting pre-cac adapter will make
+ * sure that driver won't do hardware mode change if there are any
+ * initial hick-ups or issues in pre-cac adapter's configuration.
+ * Since current SAP is in 2.4GHz and pre CAC channel is in 5GHz, this
+ * connection update should result in DBS mode
+ */
+ status = cds_update_and_wait_for_connection_update(
+ ap_adapter->sessionId,
+ pre_cac_chan,
+ SIR_UPDATE_REASON_PRE_CAC);
+ if (QDF_IS_STATUS_ERROR(status)) {
+ hdd_err("error in moving to DBS mode");
+ goto stop_close_pre_cac_adapter;
+ }
+
ret = wlan_hdd_set_channel(wiphy, dev, &chandef, channel_type);
if (0 != ret) {
@@ -7065,6 +7076,14 @@ stop_close_pre_cac_adapter:
pre_cac_adapter->sessionCtx.ap.beacon = NULL;
close_pre_cac_adapter:
hdd_close_adapter(hdd_ctx, pre_cac_adapter, false);
+release_intf_addr_and_return_failure:
+ /*
+ * Release the interface address as the adapter
+ * failed to start, if you don't release then next
+ * adapter which is trying to come wouldn't get valid
+ * mac address. Remember we have limited pool of mac addresses
+ */
+ wlan_hdd_release_intf_addr(hdd_ctx, mac_addr);
return -EINVAL;
}
diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c
index 25ea48ad9530..fc26dab8bfe0 100644
--- a/core/hdd/src/wlan_hdd_hostapd.c
+++ b/core/hdd/src/wlan_hdd_hostapd.c
@@ -905,6 +905,8 @@ void wlan_hdd_sap_pre_cac_failure(void *data)
}
cds_ssr_protect(__func__);
+ wlan_hdd_release_intf_addr(hdd_ctx,
+ pHostapdAdapter->macAddressCurrent.bytes);
hdd_stop_adapter(hdd_ctx, pHostapdAdapter, true);
hdd_close_adapter(hdd_ctx, pHostapdAdapter, false);
cds_ssr_unprotect(__func__);
@@ -1134,6 +1136,7 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
* wait till 10 secs and no other connection will
* go through before that.
*/
+ pHostapdState->bssState = BSS_STOP;
qdf_event_set(&pHostapdState->qdf_event);
goto stopbss;
} else {
@@ -2092,6 +2095,8 @@ stopbss:
we_custom_event_generic = we_custom_event;
wireless_send_event(dev, we_event, &wrqu,
(char *)we_custom_event_generic);
+ cds_decr_session_set_pcl(pHostapdAdapter->device_mode,
+ pHostapdAdapter->sessionId);
cds_dump_concurrency_info();
/* Send SCC/MCC Switching event to IPA */
hdd_ipa_send_mcc_scc_msg(pHddCtx, pHddCtx->mcc_mode);
@@ -7721,8 +7726,9 @@ int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
set_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
/* Initialize WMM configuation */
hdd_wmm_init(pHostapdAdapter);
- cds_incr_active_session(pHostapdAdapter->device_mode,
- pHostapdAdapter->sessionId);
+ if (pHostapdState->bssState == BSS_START)
+ cds_incr_active_session(pHostapdAdapter->device_mode,
+ pHostapdAdapter->sessionId);
#ifdef DHCP_SERVER_OFFLOAD
if (iniConfig->enableDHCPServerOffload)
wlan_hdd_set_dhcp_server_offload(pHostapdAdapter);
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index 353131be138a..ea5cfd11a0e8 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -9102,7 +9102,8 @@ void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter)
}
hdd_info("SAP Start Success");
set_bit(SOFTAP_BSS_STARTED, &ap_adapter->event_flags);
- cds_incr_active_session(ap_adapter->device_mode,
+ if (hostapd_state->bssState == BSS_START)
+ cds_incr_active_session(ap_adapter->device_mode,
ap_adapter->sessionId);
hostapd_state->bCommit = true;
diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
index d8de662a5611..f89695e19af3 100644
--- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c
+++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
@@ -637,8 +637,8 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
uint32_t auto_gen_bssid = false;
uint8_t session_id;
tpPESession session = NULL;
- uint8_t sme_session_id = 0;
- uint16_t sme_transaction_id = 0;
+ uint8_t sme_session_id = 0xFF;
+ uint16_t sme_transaction_id = 0xFF;
uint32_t chanwidth;
struct vdev_type_nss *vdev_type_nss;
tSirRetStatus cfg_get_wmi_dfs_master_param = eSIR_SUCCESS;
@@ -654,26 +654,21 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
#endif /* FEATURE_WLAN_DIAG_SUPPORT */
lim_log(mac_ctx, LOG1, FL("Received START_BSS_REQ"));
+ size = sizeof(tSirSmeStartBssReq);
+ sme_start_bss_req = qdf_mem_malloc(size);
+ if (NULL == sme_start_bss_req) {
+ lim_log(mac_ctx, LOGE,
+ FL("Allocate Memory fail for LimStartBssReq"));
+ /* Send failure response to host */
+ ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
+ goto free;
+ }
+ qdf_mem_copy(sme_start_bss_req, msg_buf, sizeof(tSirSmeStartBssReq));
+ sme_session_id = sme_start_bss_req->sessionId;
+ sme_transaction_id = sme_start_bss_req->transactionId;
- /*
- * Global Sme state and mlm states are not defined yet,
- * for BT-AMP Suppoprt . TO BE DONE
- */
if ((mac_ctx->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE) ||
(mac_ctx->lim.gLimSmeState == eLIM_SME_IDLE_STATE)) {
- size = sizeof(tSirSmeStartBssReq);
-
- sme_start_bss_req = qdf_mem_malloc(size);
- if (NULL == sme_start_bss_req) {
- lim_log(mac_ctx, LOGE,
- FL("Allocate Memory fail for LimStartBssReq"));
- /* Send failure response to host */
- ret_code = eSIR_SME_RESOURCES_UNAVAILABLE;
- goto end;
- }
-
- qdf_mem_copy(sme_start_bss_req, msg_buf,
- sizeof(tSirSmeStartBssReq));
if (!lim_is_sme_start_bss_req_valid(mac_ctx,
sme_start_bss_req)) {
lim_log(mac_ctx, LOGW,
@@ -1141,22 +1136,18 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
FL("Received unexpected START_BSS_REQ, in state %X"),
mac_ctx->lim.gLimSmeState);
ret_code = eSIR_SME_BSS_ALREADY_STARTED_OR_JOINED;
- goto end;
+ goto free;
} /* if (mac_ctx->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE) */
free:
if ((session != NULL) &&
- (session->pLimStartBssReq == sme_start_bss_req)) {
+ (session->pLimStartBssReq == sme_start_bss_req)) {
session->pLimStartBssReq = NULL;
}
- qdf_mem_free(sme_start_bss_req);
- qdf_mem_free(mlm_start_req);
-
-end:
- if (sme_start_bss_req != NULL) {
- sme_session_id = sme_start_bss_req->sessionId;
- sme_transaction_id = sme_start_bss_req->transactionId;
- }
+ if (NULL != sme_start_bss_req)
+ qdf_mem_free(sme_start_bss_req);
+ if (NULL != mlm_start_req)
+ qdf_mem_free(mlm_start_req);
if (NULL != session) {
pe_delete_session(mac_ctx, session);
session = NULL;