summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSandeep Puligilla <spuligil@codeaurora.org>2016-11-10 16:14:40 -0800
committerqcabuildsw <qcabuildsw@localhost>2016-11-11 17:40:13 -0800
commite50e4ce53d9531fee9984362644a3f3689dc8c92 (patch)
treeda26f44f23cba6ab3fb9b97b92fc4e486e85c672
parentcad574665cb2355d1871add4c3e4418f2fc4e2bf (diff)
qcacld-3.0: Add vdev stop response for set link
As part of join request failure scenario, lim sets the link state to eSIR_LINK_DOWN_STATE and WMA sends vdev stop to firmware but firmware also expects vdev down. Added vdev down message handling in vdev stop response handler and generation of WMA set link response also moved to moved vdev response handler. Change-Id: Ib5229c43677c36c1abc51a53f5ab44a666d0ab4d CRs-Fixed: 1088356
-rw-r--r--core/wma/src/wma_data.c34
-rw-r--r--core/wma/src/wma_dev_if.c39
2 files changed, 62 insertions, 11 deletions
diff --git a/core/wma/src/wma_data.c b/core/wma/src/wma_data.c
index 8f8a4d9d1c0e..0b2f12ed87d5 100644
--- a/core/wma/src/wma_data.c
+++ b/core/wma/src/wma_data.c
@@ -1165,10 +1165,10 @@ void wma_set_linkstate(tp_wma_handle wma, tpLinkStateParams params)
{
ol_txrx_pdev_handle pdev;
ol_txrx_vdev_handle vdev;
- ol_txrx_peer_handle peer;
- uint8_t vdev_id, peer_id;
+ uint8_t vdev_id;
bool roam_synch_in_progress = false;
QDF_STATUS status;
+ struct wma_target_req *msg;
params->status = true;
WMA_LOGD("%s: state %d selfmac %pM", __func__,
@@ -1215,16 +1215,28 @@ void wma_set_linkstate(tp_wma_handle wma, tpLinkStateParams params)
ol_txrx_vdev_pause(wma->interfaces[vdev_id].handle,
OL_TXQ_PAUSE_REASON_VDEV_STOP);
wma->interfaces[vdev_id].pause_bitmap |= (1 << PAUSE_TYPE_HOST);
- if (wmi_unified_vdev_stop_send(wma->wmi_handle, vdev_id)) {
- WMA_LOGP("%s: %d Failed to send vdev stop",
- __func__, __LINE__);
+
+ msg = wma_fill_vdev_req(wma, vdev_id,
+ WMA_SET_LINK_STATE,
+ WMA_TARGET_REQ_TYPE_VDEV_STOP, params,
+ WMA_VDEV_STOP_REQUEST_TIMEOUT);
+ if (!msg) {
+ WMA_LOGP(FL("Failed to fill vdev request for vdev_id %d"),
+ vdev_id);
+ status = QDF_STATUS_E_NOMEM;
}
- peer = ol_txrx_find_peer_by_addr(pdev, params->bssid, &peer_id);
- if (peer) {
- WMA_LOGP("%s: Deleting peer %pM vdev id %d",
- __func__, params->bssid, vdev_id);
- wma_remove_peer(wma, params->bssid, vdev_id, peer,
- roam_synch_in_progress);
+ if (wmi_unified_vdev_stop_send(wma->wmi_handle, vdev_id)) {
+ WMA_LOGP("%s: %d Failed to send vdev stop vdev %d",
+ __func__, __LINE__, vdev_id);
+ } else {
+ WMA_LOGP("%s: %d vdev stop sent vdev %d",
+ __func__, __LINE__, vdev_id);
+ /*
+ * Remove peer, Vdev down and sending set link
+ * response will be handled in vdev stop response
+ * handler
+ */
+ return;
}
}
out:
diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c
index 138958cf6a0d..ed4b923d9e64 100644
--- a/core/wma/src/wma_dev_if.c
+++ b/core/wma/src/wma_dev_if.c
@@ -1499,6 +1499,24 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
resp_event->vdev_id);
wma_vdev_detach(wma, iface->del_staself_req, 1);
}
+ } else if (req_msg->msg_type == WMA_SET_LINK_STATE) {
+ tpLinkStateParams params =
+ (tpLinkStateParams) req_msg->user_data;
+
+ peer = ol_txrx_find_peer_by_addr(pdev, params->bssid, &peer_id);
+ if (peer) {
+ WMA_LOGP(FL("Deleting peer %pM vdev id %d"),
+ params->bssid, req_msg->vdev_id);
+ wma_remove_peer(wma, params->bssid, req_msg->vdev_id,
+ peer, false);
+ }
+ if (wmi_unified_vdev_down_send(wma->wmi_handle,
+ req_msg->vdev_id) !=
+ QDF_STATUS_SUCCESS) {
+ WMA_LOGE("Failed to send vdev down cmd: vdev %d",
+ req_msg->vdev_id);
+ }
+ wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
}
free_req_msg:
qdf_mc_timer_destroy(&req_msg->event_timeout);
@@ -2596,6 +2614,27 @@ void wma_vdev_resp_timer(void *data)
} else if (tgt_req->msg_type == WMA_HIDDEN_SSID_VDEV_RESTART) {
WMA_LOGE("Hidden ssid vdev restart Timed Out; vdev_id: %d, type = %d",
tgt_req->vdev_id, tgt_req->type);
+ } else if (tgt_req->msg_type == WMA_SET_LINK_STATE) {
+ tpLinkStateParams params =
+ (tpLinkStateParams) tgt_req->user_data;
+
+ peer = ol_txrx_find_peer_by_addr(pdev, params->bssid, &peer_id);
+ if (peer) {
+ WMA_LOGP(FL("Deleting peer %pM vdev id %d"),
+ params->bssid, tgt_req->vdev_id);
+ wma_remove_peer(wma, params->bssid, tgt_req->vdev_id,
+ peer, false);
+ }
+ if (wmi_unified_vdev_down_send(wma->wmi_handle,
+ tgt_req->vdev_id) !=
+ QDF_STATUS_SUCCESS) {
+ WMA_LOGE("Failed to send vdev down cmd: vdev %d",
+ tgt_req->vdev_id);
+ }
+ params->status = QDF_STATUS_E_TIMEOUT;
+ WMA_LOGA("%s: WMA_SET_LINK_STATE timedout vdev %d", __func__,
+ tgt_req->vdev_id);
+ wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
}
free_tgt_req:
qdf_mc_timer_destroy(&tgt_req->event_timeout);