qcacmn: Fix delay req queue not update to date issue

Delay write of SRNG regs may happen on different CPUs.
Sometimes wmb may not sufficient to protect the update
in sequence. Change is aimed to buy more time for the
update of different CPUs.

Change-Id: I4149decf5a29ea213aa38abd2bef062f25d7858d
CRs-Fixed: 3591457
Цей коміт міститься в:
Yu Tian
2023-07-21 00:44:11 -07:00
зафіксовано Rahul Choudhary
джерело d187eb44e0
коміт 667450308d
2 змінених файлів з 17 додано та 0 видалено

Переглянути файл

@@ -835,6 +835,20 @@ static void hal_reg_write_work(void *arg)
if (!q_elem->valid)
break;
qdf_rmb();
/* buy some more time to make sure all fields
* in q_elem is updated per different CPUs, in
* case wmb/rmb is not taken effect
*/
if (qdf_unlikely(!q_elem->srng ||
(qdf_atomic_read(&q_elem->ring_id) !=
q_elem->srng->ring_id))) {
hal_err_rl("q_elem fields not up to date %d %d",
q_elem->srng->ring_id,
qdf_atomic_read(&q_elem->ring_id));
qdf_assert_always(0);
}
q_elem->dequeue_time = qdf_get_log_timestamp();
ring_id = q_elem->srng->ring_id;
addr = q_elem->addr;
@@ -934,6 +948,7 @@ static void hal_reg_write_enqueue(struct hal_soc *hal_soc,
q_elem->srng = srng;
q_elem->addr = addr;
qdf_atomic_set(&q_elem->ring_id, srng->ring_id);
q_elem->enqueue_val = value;
q_elem->enqueue_time = qdf_get_log_timestamp();