|
@@ -14115,6 +14115,7 @@ static int wlan_hdd_disconnect(hdd_adapter_t *pAdapter, u16 reason)
|
|
|
unsigned long rc;
|
|
|
hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
|
|
|
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
|
|
|
+ eConnectionState prev_conn_state;
|
|
|
|
|
|
ENTER();
|
|
|
|
|
@@ -14123,6 +14124,8 @@ static int wlan_hdd_disconnect(hdd_adapter_t *pAdapter, u16 reason)
|
|
|
if (0 != status)
|
|
|
return status;
|
|
|
|
|
|
+ prev_conn_state = pHddStaCtx->conn_info.connState;
|
|
|
+
|
|
|
/*stop tx queues */
|
|
|
hdd_notice("Disabling queues");
|
|
|
wlan_hdd_netif_queue_control(pAdapter, WLAN_NETIF_TX_DISABLE_N_CARRIER,
|
|
@@ -14135,13 +14138,18 @@ static int wlan_hdd_disconnect(hdd_adapter_t *pAdapter, u16 reason)
|
|
|
|
|
|
status = sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(pAdapter),
|
|
|
pAdapter->sessionId, reason);
|
|
|
- /*
|
|
|
- * Wait here instead of returning directly, this will block the next
|
|
|
- * connect command and allow processing of the scan for ssid and
|
|
|
- * the previous connect command in CSR. Else we might hit some
|
|
|
- * race conditions leading to SME and HDD out of sync.
|
|
|
- */
|
|
|
- if (QDF_STATUS_CMD_NOT_QUEUED == status) {
|
|
|
+ if ((QDF_STATUS_CMD_NOT_QUEUED == status) &&
|
|
|
+ prev_conn_state != eConnectionState_Connecting) {
|
|
|
+ hdd_notice("status = %d, already disconnected", status);
|
|
|
+ result = 0;
|
|
|
+ goto disconnected;
|
|
|
+ } else if (QDF_STATUS_CMD_NOT_QUEUED == status) {
|
|
|
+ /*
|
|
|
+ * Wait here instead of returning directly, this will block the
|
|
|
+ * next connect command and allow processing of the scan for
|
|
|
+ * ssid and the previous connect command in CSR. Else we might
|
|
|
+ * hit some race conditions leading to SME and HDD out of sync.
|
|
|
+ */
|
|
|
hdd_info("Already disconnected or connect was in sme/roam pending list and removed by disconnect");
|
|
|
} else if (0 != status) {
|
|
|
hdd_err("csr_roam_disconnect failure, returned %d",
|