|
@@ -652,94 +652,89 @@ QDF_STATUS p2p_restart_roc_timer(struct p2p_roc_context *roc_ctx)
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
-QDF_STATUS p2p_cleanup_roc_queue(struct p2p_soc_priv_obj *p2p_soc_obj)
|
|
|
+QDF_STATUS p2p_cleanup_roc_sync(
|
|
|
+ struct p2p_soc_priv_obj *p2p_soc_obj,
|
|
|
+ struct wlan_objmgr_vdev *vdev)
|
|
|
{
|
|
|
- struct p2p_roc_context *roc_ctx;
|
|
|
- qdf_list_node_t *p_node;
|
|
|
- QDF_STATUS status, ret;
|
|
|
-
|
|
|
- p2p_debug("clean up idle roc request, roc queue size:%d",
|
|
|
- qdf_list_size(&p2p_soc_obj->roc_q));
|
|
|
-
|
|
|
- status = qdf_list_peek_front(&p2p_soc_obj->roc_q, &p_node);
|
|
|
- while (QDF_IS_STATUS_SUCCESS(status)) {
|
|
|
- roc_ctx = qdf_container_of(p_node,
|
|
|
- struct p2p_roc_context, node);
|
|
|
+ struct scheduler_msg msg = {0};
|
|
|
+ struct p2p_cleanup_param *param;
|
|
|
+ QDF_STATUS status;
|
|
|
+ uint32_t vdev_id;
|
|
|
|
|
|
- p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, tx ctx:%pK, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
|
|
- roc_ctx->p2p_soc_obj, roc_ctx,
|
|
|
- roc_ctx->vdev_id, roc_ctx->scan_id,
|
|
|
- roc_ctx->tx_ctx, roc_ctx->chan,
|
|
|
- roc_ctx->phy_mode, roc_ctx->duration,
|
|
|
- roc_ctx->roc_type, roc_ctx->roc_state);
|
|
|
- status = qdf_list_peek_next(&p2p_soc_obj->roc_q,
|
|
|
- p_node, &p_node);
|
|
|
- if (roc_ctx->roc_state == ROC_STATE_IDLE) {
|
|
|
- ret = qdf_list_remove_node(
|
|
|
- &p2p_soc_obj->roc_q,
|
|
|
- (qdf_list_node_t *)roc_ctx);
|
|
|
- if (ret == QDF_STATUS_SUCCESS)
|
|
|
- p2p_destroy_roc_ctx(roc_ctx,
|
|
|
- true, false);
|
|
|
- else
|
|
|
- p2p_err("Failed to remove roc ctx from queue");
|
|
|
- }
|
|
|
+ if (!p2p_soc_obj) {
|
|
|
+ p2p_err("p2p soc context is NULL");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
}
|
|
|
|
|
|
- p2p_debug("clean up started roc request, roc queue size:%d",
|
|
|
- qdf_list_size(&p2p_soc_obj->roc_q));
|
|
|
- status = qdf_list_peek_front(&p2p_soc_obj->roc_q, &p_node);
|
|
|
- while (QDF_IS_STATUS_SUCCESS(status)) {
|
|
|
- roc_ctx = qdf_container_of(p_node,
|
|
|
- struct p2p_roc_context, node);
|
|
|
+ p2p_debug("p2p_soc_obj:%pK, vdev:%pK", p2p_soc_obj, vdev);
|
|
|
+ param = qdf_mem_malloc(sizeof(*param));
|
|
|
+ if (!param) {
|
|
|
+ p2p_err("failed to allocate cleanup param");
|
|
|
+ return QDF_STATUS_E_NOMEM;
|
|
|
+ }
|
|
|
|
|
|
- p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, tx_ctx:%pK, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
|
|
- roc_ctx->p2p_soc_obj, roc_ctx, roc_ctx->vdev_id,
|
|
|
- roc_ctx->scan_id, roc_ctx->tx_ctx, roc_ctx->chan,
|
|
|
- roc_ctx->phy_mode, roc_ctx->duration,
|
|
|
- roc_ctx->roc_type, roc_ctx->roc_state);
|
|
|
+ param->p2p_soc_obj = p2p_soc_obj;
|
|
|
+ if (vdev)
|
|
|
+ vdev_id = (uint32_t)wlan_vdev_get_id(vdev);
|
|
|
+ else
|
|
|
+ vdev_id = P2P_INVALID_VDEV_ID;
|
|
|
+ param->vdev_id = vdev_id;
|
|
|
+ qdf_event_reset(&p2p_soc_obj->cleanup_roc_done);
|
|
|
+ msg.type = P2P_CLEANUP_ROC;
|
|
|
+ msg.bodyptr = param;
|
|
|
+ msg.callback = p2p_process_cmd;
|
|
|
+ status = scheduler_post_msg(QDF_MODULE_ID_OS_IF, &msg);
|
|
|
+ if (status != QDF_STATUS_SUCCESS) {
|
|
|
+ p2p_err("failed to post message");
|
|
|
+ qdf_mem_free(param);
|
|
|
+ return status;
|
|
|
+ }
|
|
|
|
|
|
- status = qdf_list_peek_next(&p2p_soc_obj->roc_q,
|
|
|
- p_node, &p_node);
|
|
|
- if (roc_ctx->roc_state != ROC_STATE_IDLE) {
|
|
|
- if (roc_ctx->roc_state !=
|
|
|
- ROC_STATE_CANCEL_IN_PROG)
|
|
|
- p2p_execute_cancel_roc_req(roc_ctx);
|
|
|
+ status = qdf_wait_single_event(
|
|
|
+ &p2p_soc_obj->cleanup_roc_done,
|
|
|
+ P2P_WAIT_CLEANUP_ROC);
|
|
|
|
|
|
- ret = qdf_wait_single_event(
|
|
|
- &p2p_soc_obj->cancel_roc_done,
|
|
|
- P2P_WAIT_CANCEL_ROC);
|
|
|
- p2p_debug("roc cancellation done, return:%d", ret);
|
|
|
- }
|
|
|
- }
|
|
|
+ if (status != QDF_STATUS_SUCCESS)
|
|
|
+ p2p_err("wait for cleanup roc timeout, %d", status);
|
|
|
|
|
|
- return QDF_STATUS_SUCCESS;
|
|
|
+ return status;
|
|
|
}
|
|
|
|
|
|
-QDF_STATUS p2p_cleanup_roc_by_vdev(
|
|
|
- struct p2p_soc_priv_obj *p2p_soc_obj, uint32_t vdev_id)
|
|
|
+QDF_STATUS p2p_process_cleanup_roc_queue(
|
|
|
+ struct p2p_cleanup_param *param)
|
|
|
{
|
|
|
+ uint32_t vdev_id;
|
|
|
QDF_STATUS status, ret;
|
|
|
struct p2p_roc_context *roc_ctx;
|
|
|
qdf_list_node_t *p_node;
|
|
|
+ struct p2p_soc_priv_obj *p2p_soc_obj;
|
|
|
+
|
|
|
+ if (!param || !(param->p2p_soc_obj)) {
|
|
|
+ p2p_err("Invalid cleanup param");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ p2p_soc_obj = param->p2p_soc_obj;
|
|
|
+ vdev_id = param->vdev_id;
|
|
|
|
|
|
- p2p_info("clean up idle roc request, roc queue size:%d, vdev id:%d",
|
|
|
- qdf_list_size(&p2p_soc_obj->roc_q), vdev_id);
|
|
|
+ p2p_debug("clean up idle roc request, roc queue size:%d, vdev id:%d",
|
|
|
+ qdf_list_size(&p2p_soc_obj->roc_q), vdev_id);
|
|
|
status = qdf_list_peek_front(&p2p_soc_obj->roc_q, &p_node);
|
|
|
while (QDF_IS_STATUS_SUCCESS(status)) {
|
|
|
roc_ctx = qdf_container_of(p_node,
|
|
|
struct p2p_roc_context, node);
|
|
|
|
|
|
- p2p_info("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, tx ctx:%pK, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
|
|
- roc_ctx->p2p_soc_obj, roc_ctx,
|
|
|
- roc_ctx->vdev_id, roc_ctx->scan_id,
|
|
|
- roc_ctx->tx_ctx, roc_ctx->chan,
|
|
|
- roc_ctx->phy_mode, roc_ctx->duration,
|
|
|
- roc_ctx->roc_type, roc_ctx->roc_state);
|
|
|
+ p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, tx ctx:%pK, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
|
|
+ roc_ctx->p2p_soc_obj, roc_ctx,
|
|
|
+ roc_ctx->vdev_id, roc_ctx->scan_id,
|
|
|
+ roc_ctx->tx_ctx, roc_ctx->chan,
|
|
|
+ roc_ctx->phy_mode, roc_ctx->duration,
|
|
|
+ roc_ctx->roc_type, roc_ctx->roc_state);
|
|
|
status = qdf_list_peek_next(&p2p_soc_obj->roc_q,
|
|
|
p_node, &p_node);
|
|
|
- if (roc_ctx->roc_state == ROC_STATE_IDLE &&
|
|
|
- roc_ctx->vdev_id == vdev_id) {
|
|
|
+ if ((roc_ctx->roc_state == ROC_STATE_IDLE) &&
|
|
|
+ ((vdev_id == P2P_INVALID_VDEV_ID) ||
|
|
|
+ (vdev_id == roc_ctx->vdev_id))) {
|
|
|
ret = qdf_list_remove_node(
|
|
|
&p2p_soc_obj->roc_q,
|
|
|
(qdf_list_node_t *)roc_ctx);
|
|
@@ -750,23 +745,24 @@ QDF_STATUS p2p_cleanup_roc_by_vdev(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- p2p_info("clean up started roc request, roc queue size:%d",
|
|
|
- qdf_list_size(&p2p_soc_obj->roc_q));
|
|
|
+ p2p_debug("clean up started roc request, roc queue size:%d",
|
|
|
+ qdf_list_size(&p2p_soc_obj->roc_q));
|
|
|
status = qdf_list_peek_front(&p2p_soc_obj->roc_q, &p_node);
|
|
|
while (QDF_IS_STATUS_SUCCESS(status)) {
|
|
|
roc_ctx = qdf_container_of(p_node,
|
|
|
struct p2p_roc_context, node);
|
|
|
|
|
|
- p2p_info("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, tx ctx:%pK, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
|
|
- roc_ctx->p2p_soc_obj, roc_ctx, roc_ctx->vdev_id,
|
|
|
- roc_ctx->scan_id, roc_ctx->tx_ctx, roc_ctx->chan,
|
|
|
- roc_ctx->phy_mode, roc_ctx->duration,
|
|
|
- roc_ctx->roc_type, roc_ctx->roc_state);
|
|
|
+ p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, tx ctx:%pK, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
|
|
+ roc_ctx->p2p_soc_obj, roc_ctx, roc_ctx->vdev_id,
|
|
|
+ roc_ctx->scan_id, roc_ctx->tx_ctx, roc_ctx->chan,
|
|
|
+ roc_ctx->phy_mode, roc_ctx->duration,
|
|
|
+ roc_ctx->roc_type, roc_ctx->roc_state);
|
|
|
|
|
|
status = qdf_list_peek_next(&p2p_soc_obj->roc_q,
|
|
|
p_node, &p_node);
|
|
|
- if (roc_ctx->roc_state != ROC_STATE_IDLE &&
|
|
|
- roc_ctx->vdev_id == vdev_id) {
|
|
|
+ if ((roc_ctx->roc_state != ROC_STATE_IDLE) &&
|
|
|
+ ((vdev_id == P2P_INVALID_VDEV_ID) ||
|
|
|
+ (vdev_id == roc_ctx->vdev_id))) {
|
|
|
if (roc_ctx->roc_state !=
|
|
|
ROC_STATE_CANCEL_IN_PROG)
|
|
|
p2p_execute_cancel_roc_req(roc_ctx);
|
|
@@ -778,6 +774,8 @@ QDF_STATUS p2p_cleanup_roc_by_vdev(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ qdf_event_set(&p2p_soc_obj->cleanup_roc_done);
|
|
|
+
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|