|
@@ -372,130 +372,6 @@ static struct wma_target_req *wma_find_remove_req_msgtype(tp_wma_handle wma,
|
|
|
return req_msg;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * wma_find_vdev_req_on_timer_expiry() - find target request by address
|
|
|
- * @wma: wma handle
|
|
|
- * @req: pointer to the target request
|
|
|
- *
|
|
|
- * On timer expiry, the pointer to the req message is received from the
|
|
|
- * timer callback. Lookup the vdev_resp_queue for the request with the
|
|
|
- * same address and return success if found.
|
|
|
- *
|
|
|
- * Return: QDF_STATUS
|
|
|
- */
|
|
|
-static
|
|
|
-QDF_STATUS wma_find_vdev_req_on_timer_expiry(tp_wma_handle wma,
|
|
|
- struct wma_target_req *req)
|
|
|
-{
|
|
|
- struct wma_target_req *req_msg = NULL;
|
|
|
- bool found = false;
|
|
|
- qdf_list_node_t *cur_node = NULL, *next_node = NULL;
|
|
|
- QDF_STATUS status;
|
|
|
-
|
|
|
- qdf_spin_lock_bh(&wma->vdev_respq_lock);
|
|
|
- if (QDF_STATUS_SUCCESS != qdf_list_peek_front(&wma->vdev_resp_queue,
|
|
|
- &next_node)) {
|
|
|
- qdf_spin_unlock_bh(&wma->vdev_respq_lock);
|
|
|
- WMA_LOGD(FL("unable to find req from vdev resp queue for %pK"),
|
|
|
- req);
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
-
|
|
|
- do {
|
|
|
- cur_node = next_node;
|
|
|
- req_msg = qdf_container_of(cur_node, struct wma_target_req,
|
|
|
- node);
|
|
|
- if (req_msg != req)
|
|
|
- continue;
|
|
|
-
|
|
|
- found = true;
|
|
|
- status = qdf_list_remove_node(&wma->vdev_resp_queue,
|
|
|
- cur_node);
|
|
|
- if (QDF_STATUS_SUCCESS != status) {
|
|
|
- qdf_spin_unlock_bh(&wma->vdev_respq_lock);
|
|
|
- WMA_LOGD(FL("Failed to target req for %pK"), req);
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
- break;
|
|
|
- } while (QDF_STATUS_SUCCESS ==
|
|
|
- qdf_list_peek_next(&wma->vdev_resp_queue,
|
|
|
- cur_node, &next_node));
|
|
|
-
|
|
|
- qdf_spin_unlock_bh(&wma->vdev_respq_lock);
|
|
|
- if (!found) {
|
|
|
- WMA_LOGD(FL("target request not found for req %pK"),
|
|
|
- req);
|
|
|
- return QDF_STATUS_E_INVAL;
|
|
|
- }
|
|
|
-
|
|
|
- WMA_LOGD(FL("target request found for vdev id: %d type %d msg %d"),
|
|
|
- req_msg->vdev_id, req_msg->type, req_msg->msg_type);
|
|
|
- return QDF_STATUS_SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * wma_find_vdev_req() - find target request for vdev id
|
|
|
- * @wma: wma handle
|
|
|
- * @vdev_id: vdev id
|
|
|
- * @type: request type
|
|
|
- * @remove_req_from_list: flag to indicate remove req or not.
|
|
|
- *
|
|
|
- * Return: return target request if found or NULL.
|
|
|
- */
|
|
|
-static struct wma_target_req *wma_find_vdev_req(tp_wma_handle wma,
|
|
|
- uint8_t vdev_id, uint8_t type,
|
|
|
- bool remove_req_from_list)
|
|
|
-{
|
|
|
- struct wma_target_req *req_msg = NULL;
|
|
|
- bool found = false;
|
|
|
- qdf_list_node_t *node1 = NULL, *node2 = NULL;
|
|
|
- QDF_STATUS status;
|
|
|
-
|
|
|
- qdf_spin_lock_bh(&wma->vdev_respq_lock);
|
|
|
- if (QDF_STATUS_SUCCESS != qdf_list_peek_front(&wma->vdev_resp_queue,
|
|
|
- &node2)) {
|
|
|
- qdf_spin_unlock_bh(&wma->vdev_respq_lock);
|
|
|
- WMA_LOGD(FL("unable to get target req from vdev resp queue vdev_id: %d type: %d"),
|
|
|
- vdev_id, type);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
-
|
|
|
- do {
|
|
|
- node1 = node2;
|
|
|
- req_msg = qdf_container_of(node1, struct wma_target_req, node);
|
|
|
- if (req_msg->vdev_id != vdev_id)
|
|
|
- continue;
|
|
|
- if (req_msg->type != type)
|
|
|
- continue;
|
|
|
-
|
|
|
- found = true;
|
|
|
- if (remove_req_from_list) {
|
|
|
- status = qdf_list_remove_node(&wma->vdev_resp_queue,
|
|
|
- node1);
|
|
|
- if (QDF_STATUS_SUCCESS != status) {
|
|
|
- qdf_spin_unlock_bh(&wma->vdev_respq_lock);
|
|
|
- WMA_LOGD(FL(
|
|
|
- "Failed to target req for vdev_id %d type %d"),
|
|
|
- vdev_id, type);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- } while (QDF_STATUS_SUCCESS ==
|
|
|
- qdf_list_peek_next(&wma->vdev_resp_queue,
|
|
|
- node1, &node2));
|
|
|
-
|
|
|
- qdf_spin_unlock_bh(&wma->vdev_respq_lock);
|
|
|
- if (!found) {
|
|
|
- WMA_LOGD(FL("target request not found for vdev_id %d type %d"),
|
|
|
- vdev_id, type);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- WMA_LOGD(FL("target request found for vdev id: %d type %d msg %d"),
|
|
|
- vdev_id, type, req_msg->msg_type);
|
|
|
- return req_msg;
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* wma_send_vdev_del_resp() - send vdev del resp to Upper layer
|
|
|
* @param: params of del vdev response
|
|
@@ -1975,23 +1851,6 @@ err:
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * wma_cleanup_target_req_param() - free param memory of target request
|
|
|
- * @tgt_req: target request params
|
|
|
- *
|
|
|
- * Return: none
|
|
|
- */
|
|
|
-static void wma_cleanup_target_req_param(struct wma_target_req *tgt_req)
|
|
|
-{
|
|
|
- WMA_LOGE("%s: Free target req user_data msg_type:%d", __func__,
|
|
|
- tgt_req->msg_type);
|
|
|
- if (tgt_req->msg_type == WMA_CHNL_SWITCH_REQ ||
|
|
|
- tgt_req->msg_type == WMA_ADD_BSS_REQ) {
|
|
|
- qdf_mem_free(tgt_req->user_data);
|
|
|
- tgt_req->user_data = NULL;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* wma_remove_bss_peer() - remove BSS peer
|
|
|
* @wma: pointer to WMA handle
|
|
@@ -3523,198 +3382,6 @@ void wma_remove_req(tp_wma_handle wma, uint8_t vdev_id,
|
|
|
qdf_mem_free(req_msg);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * wma_handle_channel_switch_req_timeout() - handle channel switch req timeout
|
|
|
- * @wma: wma handler
|
|
|
- * @tgt_req: target req
|
|
|
- *
|
|
|
- * Return: none
|
|
|
- */
|
|
|
-static void
|
|
|
-wma_handle_channel_switch_req_timeout(tp_wma_handle wma,
|
|
|
- struct wma_target_req *req)
|
|
|
-{
|
|
|
- struct wma_txrx_node *iface;
|
|
|
- tpSwitchChannelParams params = (tpSwitchChannelParams)req->user_data;
|
|
|
-
|
|
|
- params->status = QDF_STATUS_E_TIMEOUT;
|
|
|
- WMA_LOGA("%s: WMA_SWITCH_CHANNEL_REQ timedout", __func__);
|
|
|
-
|
|
|
- /*
|
|
|
- * Trigger host crash if the flag is set or if the timeout
|
|
|
- * is not due to fw down
|
|
|
- */
|
|
|
- if (wma_crash_on_fw_timeout(wma->fw_timeout_crash))
|
|
|
- wma_trigger_recovery_assert_on_fw_timeout(
|
|
|
- WMA_CHNL_SWITCH_REQ);
|
|
|
-
|
|
|
- iface = &wma->interfaces[req->vdev_id];
|
|
|
- mlme_set_chan_switch_in_progress(iface->vdev, false);
|
|
|
-
|
|
|
- wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP,
|
|
|
- (void *)params, 0);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * wma_handle_cadd_bss_req_timeout() - handle add bss req timeout
|
|
|
- * @wma: wma handler
|
|
|
- * @req: target req
|
|
|
- *
|
|
|
- * Return: none
|
|
|
- */
|
|
|
-static void
|
|
|
-wma_handle_add_bss_req_timeout(tp_wma_handle wma, struct wma_target_req *req)
|
|
|
-{
|
|
|
- struct wma_txrx_node *iface;
|
|
|
- struct bss_params *params = (struct bss_params *)req->user_data;
|
|
|
-
|
|
|
- params->status = QDF_STATUS_E_TIMEOUT;
|
|
|
- WMA_LOGA("%s: WMA_ADD_BSS_REQ timedout", __func__);
|
|
|
- WMA_LOGD("%s: bssid %pM vdev_id %d", __func__, params->bssId,
|
|
|
- req->vdev_id);
|
|
|
-
|
|
|
- if (wma_crash_on_fw_timeout(wma->fw_timeout_crash))
|
|
|
- wma_trigger_recovery_assert_on_fw_timeout(WMA_ADD_BSS_REQ);
|
|
|
-
|
|
|
- iface = &wma->interfaces[req->vdev_id];
|
|
|
- wlan_vdev_mlme_sm_deliver_evt(iface->vdev,
|
|
|
- WLAN_VDEV_SM_EV_DOWN,
|
|
|
- sizeof(*params), params);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * wma_vdev_resp_timer() - wma response timeout function
|
|
|
- * @data: target request params
|
|
|
- *
|
|
|
- * Return: none
|
|
|
- */
|
|
|
-void wma_vdev_resp_timer(void *data)
|
|
|
-{
|
|
|
- tp_wma_handle wma;
|
|
|
- struct wma_target_req *tgt_req = (struct wma_target_req *)data;
|
|
|
- struct cdp_pdev *pdev;
|
|
|
- QDF_STATUS qdf_status;
|
|
|
-#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
|
|
|
- struct mac_context *mac_ctx;
|
|
|
-#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
|
|
|
-
|
|
|
- wma = cds_get_context(QDF_MODULE_ID_WMA);
|
|
|
-
|
|
|
- if (!wma) {
|
|
|
- WMA_LOGE("%s: Failed to get wma", __func__);
|
|
|
- wma_cleanup_target_req_param(tgt_req);
|
|
|
- goto free_tgt_req;
|
|
|
- }
|
|
|
-
|
|
|
- qdf_status = wma_find_vdev_req_on_timer_expiry(wma, tgt_req);
|
|
|
-
|
|
|
- if (QDF_IS_STATUS_ERROR(qdf_status)) {
|
|
|
- /*
|
|
|
- * if find request failed, then firmware rsp should have
|
|
|
- * consumed the buffer. Do not free.
|
|
|
- */
|
|
|
- WMA_LOGD("%s: Failed to lookup request message - %pK",
|
|
|
- __func__, tgt_req);
|
|
|
- return;
|
|
|
- }
|
|
|
- WMA_LOGA("%s: request %d is timed out for vdev_id - %d", __func__,
|
|
|
- tgt_req->msg_type, tgt_req->vdev_id);
|
|
|
-
|
|
|
- pdev = cds_get_context(QDF_MODULE_ID_TXRX);
|
|
|
-
|
|
|
- if (!pdev) {
|
|
|
- WMA_LOGE("%s: Failed to get pdev", __func__);
|
|
|
- wma_cleanup_target_req_param(tgt_req);
|
|
|
- qdf_mc_timer_stop(&tgt_req->event_timeout);
|
|
|
- goto free_tgt_req;
|
|
|
- }
|
|
|
-
|
|
|
-#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
|
|
|
- mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
|
|
|
- if (!mac_ctx) {
|
|
|
- WMA_LOGE("%s: Failed to get mac_ctx", __func__);
|
|
|
- wma_cleanup_target_req_param(tgt_req);
|
|
|
- goto free_tgt_req;
|
|
|
- }
|
|
|
-#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
|
|
|
-
|
|
|
- if (tgt_req->msg_type == WMA_CHNL_SWITCH_REQ) {
|
|
|
-
|
|
|
- wma_handle_channel_switch_req_timeout(wma, tgt_req);
|
|
|
- } else if (tgt_req->msg_type == WMA_ADD_BSS_REQ) {
|
|
|
-
|
|
|
- wma_handle_add_bss_req_timeout(wma, tgt_req);
|
|
|
- }
|
|
|
-free_tgt_req:
|
|
|
- qdf_mc_timer_destroy(&tgt_req->event_timeout);
|
|
|
- qdf_mem_free(tgt_req);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * wma_fill_vdev_req() - fill vdev request
|
|
|
- * @wma: wma handle
|
|
|
- * @msg_type: message type
|
|
|
- * @type: request type
|
|
|
- * @params: request params
|
|
|
- * @timeout: timeout value
|
|
|
- *
|
|
|
- * Return: wma_target_req ptr
|
|
|
- */
|
|
|
-struct wma_target_req *wma_fill_vdev_req(tp_wma_handle wma,
|
|
|
- uint8_t vdev_id,
|
|
|
- uint32_t msg_type, uint8_t type,
|
|
|
- void *params, uint32_t timeout)
|
|
|
-{
|
|
|
- struct wma_target_req *req;
|
|
|
- QDF_STATUS status;
|
|
|
-
|
|
|
- req = qdf_mem_malloc(sizeof(*req));
|
|
|
- if (!req)
|
|
|
- return NULL;
|
|
|
-
|
|
|
- WMA_LOGD("%s: vdev_id %d msg %d", __func__, vdev_id, msg_type);
|
|
|
- qdf_spin_lock_bh(&wma->vdev_respq_lock);
|
|
|
- req->vdev_id = vdev_id;
|
|
|
- req->msg_type = msg_type;
|
|
|
- req->type = type;
|
|
|
- req->user_data = params;
|
|
|
- status = qdf_list_insert_back(&wma->vdev_resp_queue, &req->node);
|
|
|
- if (QDF_STATUS_SUCCESS != status) {
|
|
|
- qdf_spin_unlock_bh(&wma->vdev_respq_lock);
|
|
|
- WMA_LOGE(FL("Failed add request in queue for vdev_id %d type %d"),
|
|
|
- vdev_id, type);
|
|
|
- qdf_mem_free(req);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- qdf_spin_unlock_bh(&wma->vdev_respq_lock);
|
|
|
- qdf_mc_timer_init(&req->event_timeout, QDF_TIMER_TYPE_SW,
|
|
|
- wma_vdev_resp_timer, req);
|
|
|
- qdf_mc_timer_start(&req->event_timeout, timeout);
|
|
|
- return req;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * wma_remove_vdev_req() - remove vdev request
|
|
|
- * @wma: wma handle
|
|
|
- * @vdev_id: vdev id
|
|
|
- * @type: type
|
|
|
- *
|
|
|
- * Return: none
|
|
|
- */
|
|
|
-void wma_remove_vdev_req(tp_wma_handle wma, uint8_t vdev_id,
|
|
|
- uint8_t type)
|
|
|
-{
|
|
|
- struct wma_target_req *req_msg;
|
|
|
-
|
|
|
- req_msg = wma_find_vdev_req(wma, vdev_id, type, true);
|
|
|
- if (!req_msg)
|
|
|
- return;
|
|
|
-
|
|
|
- qdf_mc_timer_stop(&req_msg->event_timeout);
|
|
|
- qdf_mc_timer_destroy(&req_msg->event_timeout);
|
|
|
- qdf_mem_free(req_msg);
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* wma_vdev_set_bss_params() - BSS set params functions
|
|
|
* @wma: wma handle
|