|
@@ -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();
|
|
|
|