|
@@ -1457,10 +1457,12 @@ int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp,
|
|
|
return 0;
|
|
|
|
|
|
if (e->event_code == BRCMF_E_ACTION_FRAME_COMPLETE) {
|
|
|
- if (e->status == BRCMF_E_STATUS_SUCCESS)
|
|
|
+ if (e->status == BRCMF_E_STATUS_SUCCESS) {
|
|
|
set_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED,
|
|
|
&p2p->status);
|
|
|
- else {
|
|
|
+ if (!p2p->wait_for_offchan_complete)
|
|
|
+ complete(&p2p->send_af_done);
|
|
|
+ } else {
|
|
|
set_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status);
|
|
|
/* If there is no ack, we don't need to wait for
|
|
|
* WLC_E_ACTION_FRAME_OFFCHAN_COMPLETE event
|
|
@@ -1511,6 +1513,17 @@ static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p,
|
|
|
p2p->af_sent_channel = le32_to_cpu(af_params->channel);
|
|
|
p2p->af_tx_sent_jiffies = jiffies;
|
|
|
|
|
|
+ if (test_bit(BRCMF_P2P_STATUS_DISCOVER_LISTEN, &p2p->status) &&
|
|
|
+ p2p->af_sent_channel ==
|
|
|
+ ieee80211_frequency_to_channel(p2p->remain_on_channel.center_freq))
|
|
|
+ p2p->wait_for_offchan_complete = false;
|
|
|
+ else
|
|
|
+ p2p->wait_for_offchan_complete = true;
|
|
|
+
|
|
|
+ brcmf_dbg(TRACE, "Waiting for %s tx completion event\n",
|
|
|
+ (p2p->wait_for_offchan_complete) ?
|
|
|
+ "off-channel" : "on-channel");
|
|
|
+
|
|
|
timeout = wait_for_completion_timeout(&p2p->send_af_done,
|
|
|
P2P_AF_MAX_WAIT_TIME);
|
|
|
|