|
@@ -402,15 +402,19 @@ static struct p2p_roc_context *p2p_find_roc_ctx(
|
|
|
struct p2p_soc_priv_obj *p2p_soc_obj, uint64_t cookie)
|
|
|
{
|
|
|
struct p2p_roc_context *curr_roc_ctx;
|
|
|
- qdf_list_node_t *tmp, *pos;
|
|
|
+ qdf_list_node_t *p_node;
|
|
|
+ QDF_STATUS status;
|
|
|
|
|
|
p2p_debug("p2p soc obj:%pK, cookie:%llx", p2p_soc_obj, cookie);
|
|
|
|
|
|
- list_for_each_safe(pos, tmp, &p2p_soc_obj->roc_q.anchor) {
|
|
|
- curr_roc_ctx = list_entry(pos, struct p2p_roc_context,
|
|
|
- node);
|
|
|
+ status = qdf_list_peek_front(&p2p_soc_obj->roc_q, &p_node);
|
|
|
+ while (QDF_IS_STATUS_SUCCESS(status)) {
|
|
|
+ curr_roc_ctx = qdf_container_of(p_node,
|
|
|
+ struct p2p_roc_context, node);
|
|
|
if ((uintptr_t) curr_roc_ctx == cookie)
|
|
|
return curr_roc_ctx;
|
|
|
+ status = qdf_list_peek_next(&p2p_soc_obj->roc_q,
|
|
|
+ p_node, &p_node);
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
@@ -569,11 +573,13 @@ struct p2p_roc_context *p2p_find_current_roc_ctx(
|
|
|
struct p2p_soc_priv_obj *p2p_soc_obj)
|
|
|
{
|
|
|
struct p2p_roc_context *roc_ctx;
|
|
|
- qdf_list_node_t *tmp, *pos;
|
|
|
+ qdf_list_node_t *p_node;
|
|
|
+ QDF_STATUS status;
|
|
|
|
|
|
- list_for_each_safe(pos, tmp, &p2p_soc_obj->roc_q.anchor) {
|
|
|
- roc_ctx = list_entry(pos, struct p2p_roc_context,
|
|
|
- node);
|
|
|
+ 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);
|
|
|
if (roc_ctx->roc_state != ROC_STATE_IDLE) {
|
|
|
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id"
|
|
|
":%d, scan_id:%d, cookie:%llx, chan:"
|
|
@@ -587,6 +593,8 @@ struct p2p_roc_context *p2p_find_current_roc_ctx(
|
|
|
|
|
|
return roc_ctx;
|
|
|
}
|
|
|
+ status = qdf_list_peek_next(&p2p_soc_obj->roc_q,
|
|
|
+ p_node, &p_node);
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
@@ -616,15 +624,17 @@ QDF_STATUS p2p_restart_roc_timer(struct p2p_roc_context *roc_ctx)
|
|
|
|
|
|
QDF_STATUS p2p_cleanup_roc_queue(struct p2p_soc_priv_obj *p2p_soc_obj)
|
|
|
{
|
|
|
- QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
struct p2p_roc_context *roc_ctx;
|
|
|
- qdf_list_node_t *tmp, *pos;
|
|
|
+ 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));
|
|
|
- list_for_each_safe(pos, tmp, &p2p_soc_obj->roc_q.anchor) {
|
|
|
- roc_ctx = list_entry(pos, struct p2p_roc_context,
|
|
|
- node);
|
|
|
+
|
|
|
+ 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, roc ctx:%pK, vdev_id:%d, scan_id:%d, cookie:%llx, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
|
|
roc_ctx->p2p_soc_obj, roc_ctx,
|
|
@@ -632,12 +642,13 @@ QDF_STATUS p2p_cleanup_roc_queue(struct p2p_soc_priv_obj *p2p_soc_obj)
|
|
|
roc_ctx->cookie, 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) {
|
|
|
- status = qdf_list_remove_node(
|
|
|
+ ret = qdf_list_remove_node(
|
|
|
&p2p_soc_obj->roc_q,
|
|
|
(qdf_list_node_t *)roc_ctx);
|
|
|
- if (status == QDF_STATUS_SUCCESS)
|
|
|
+ if (ret == QDF_STATUS_SUCCESS)
|
|
|
p2p_destroy_roc_ctx(roc_ctx,
|
|
|
true, false);
|
|
|
else
|
|
@@ -647,9 +658,10 @@ QDF_STATUS p2p_cleanup_roc_queue(struct p2p_soc_priv_obj *p2p_soc_obj)
|
|
|
|
|
|
p2p_debug("clean up started roc request, roc queue size:%d",
|
|
|
qdf_list_size(&p2p_soc_obj->roc_q));
|
|
|
- list_for_each_safe(pos, tmp, &p2p_soc_obj->roc_q.anchor) {
|
|
|
- roc_ctx = list_entry(pos, struct p2p_roc_context,
|
|
|
- node);
|
|
|
+ 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, roc ctx:%pK, vdev_id:%d, scan_id:%d, cookie:%llx, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
|
|
roc_ctx->p2p_soc_obj, roc_ctx, roc_ctx->vdev_id,
|
|
@@ -657,33 +669,36 @@ QDF_STATUS p2p_cleanup_roc_queue(struct p2p_soc_priv_obj *p2p_soc_obj)
|
|
|
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) {
|
|
|
if (roc_ctx->roc_state !=
|
|
|
ROC_STATE_CANCEL_IN_PROG)
|
|
|
p2p_execute_cancel_roc_req(roc_ctx);
|
|
|
|
|
|
- status = qdf_wait_single_event(
|
|
|
+ ret = qdf_wait_single_event(
|
|
|
&p2p_soc_obj->cancel_roc_done,
|
|
|
P2P_WAIT_CANCEL_ROC);
|
|
|
- p2p_debug("roc cancellation done, status:%d", status);
|
|
|
+ p2p_debug("roc cancellation done, return:%d", ret);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return status;
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
QDF_STATUS p2p_cleanup_roc_by_vdev(
|
|
|
struct p2p_soc_priv_obj *p2p_soc_obj, uint32_t vdev_id)
|
|
|
{
|
|
|
- QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
+ QDF_STATUS status, ret;
|
|
|
struct p2p_roc_context *roc_ctx;
|
|
|
- qdf_list_node_t *tmp, *pos;
|
|
|
+ qdf_list_node_t *p_node;
|
|
|
|
|
|
p2p_debug("clean up idle roc request, roc queue size:%d, vdev id:%d",
|
|
|
qdf_list_size(&p2p_soc_obj->roc_q), vdev_id);
|
|
|
- list_for_each_safe(pos, tmp, &p2p_soc_obj->roc_q.anchor) {
|
|
|
- roc_ctx = list_entry(pos, struct p2p_roc_context,
|
|
|
- node);
|
|
|
+ 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, roc ctx:%pK, vdev_id:%d, scan_id:%d, cookie:%llx, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
|
|
roc_ctx->p2p_soc_obj, roc_ctx,
|
|
@@ -691,13 +706,14 @@ QDF_STATUS p2p_cleanup_roc_by_vdev(
|
|
|
roc_ctx->cookie, 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) {
|
|
|
- status = qdf_list_remove_node(
|
|
|
+ ret = qdf_list_remove_node(
|
|
|
&p2p_soc_obj->roc_q,
|
|
|
(qdf_list_node_t *)roc_ctx);
|
|
|
- if (status == QDF_STATUS_SUCCESS)
|
|
|
+ if (ret == QDF_STATUS_SUCCESS)
|
|
|
qdf_mem_free(roc_ctx);
|
|
|
else
|
|
|
p2p_err("Failed to remove roc ctx from queue");
|
|
@@ -706,30 +722,33 @@ QDF_STATUS p2p_cleanup_roc_by_vdev(
|
|
|
|
|
|
p2p_debug("clean up started roc request, roc queue size:%d",
|
|
|
qdf_list_size(&p2p_soc_obj->roc_q));
|
|
|
- list_for_each_safe(pos, tmp, &p2p_soc_obj->roc_q.anchor) {
|
|
|
- roc_ctx = list_entry(pos, struct p2p_roc_context,
|
|
|
- node);
|
|
|
+ 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, roc ctx:%pK, vdev_id:%d, scan_id:%d, cookie:%llx, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
|
|
+ p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, cookie:%llx, 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->cookie, 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_CANCEL_IN_PROG)
|
|
|
p2p_execute_cancel_roc_req(roc_ctx);
|
|
|
|
|
|
- status = qdf_wait_single_event(
|
|
|
+ ret = qdf_wait_single_event(
|
|
|
&p2p_soc_obj->cancel_roc_done,
|
|
|
P2P_WAIT_CANCEL_ROC);
|
|
|
- p2p_debug("RoC cancellation done, status:%d", status);
|
|
|
+ p2p_debug("RoC cancellation done, return:%d", ret);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return status;
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
QDF_STATUS p2p_process_roc_req(struct p2p_roc_context *roc_ctx)
|