summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/HDD/inc/wlan_hdd_main.h5
-rw-r--r--CORE/HDD/src/wlan_hdd_p2p.c17
2 files changed, 21 insertions, 1 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 7e3a85a3b86c..e5cdec427b15 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -683,6 +683,11 @@ typedef struct hdd_cfg80211_state_s
hdd_remain_on_chan_ctx_t* remain_on_chan_ctx;
struct mutex remain_on_chan_ctx_lock;
eP2PActionFrameState actionFrmState;
+ /* is_go_neg_ack_received flag is set to 1 when
+ * the pending ack for GO negotiation req is
+ * received.
+ */
+ v_BOOL_t is_go_neg_ack_received;
}hdd_cfg80211_state_t;
diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c
index e51d57f302d2..1e81402e67bd 100644
--- a/CORE/HDD/src/wlan_hdd_p2p.c
+++ b/CORE/HDD/src/wlan_hdd_p2p.c
@@ -1865,11 +1865,25 @@ void hdd_sendActionCnf( hdd_adapter_t *pAdapter, tANI_BOOLEAN actionSendSuccess
cfgState->actionFrmState = HDD_IDLE;
- hddLog( LOG1, "Send Action cnf, actionSendSuccess %d", actionSendSuccess);
if( NULL == cfgState->buf )
{
return;
}
+ if (cfgState->is_go_neg_ack_received) {
+
+ cfgState->is_go_neg_ack_received = 0 ;
+ /* Sometimes its possible that host may receive the ack for GO
+ * negotiation req after sending go negotaition confirmation,
+ * in such case drop the ack received for the go negotiation
+ * request, so that supplicant waits for the confirmation ack
+ * from firmware.
+ */
+ hddLog( LOG1, FL("Drop the pending ack received in cfgState->actionFrmState %d"),
+ cfgState->actionFrmState);
+ return;
+ }
+
+ hddLog( LOG1, "Send Action cnf, actionSendSuccess %d", actionSendSuccess);
/*
* buf is the same pointer it passed us to send. Since we are sending
@@ -2635,6 +2649,7 @@ void __hdd_indicate_mgmt_frame(hdd_adapter_t *pAdapter,
{
hddLog(LOG1, "%s: ACK_PENDING and But received RESP for Action frame ",
__func__);
+ cfgState->is_go_neg_ack_received = 1;
hdd_sendActionCnf(pAdapter, TRUE);
}
}