|
@@ -433,6 +433,13 @@ void ath10k_ce_rx_update_write_idx(struct ath10k_ce_pipe *pipe, u32 nentries)
|
|
|
unsigned int nentries_mask = dest_ring->nentries_mask;
|
|
|
unsigned int write_index = dest_ring->write_index;
|
|
|
u32 ctrl_addr = pipe->ctrl_addr;
|
|
|
+ u32 cur_write_idx = ath10k_ce_dest_ring_write_index_get(ar, ctrl_addr);
|
|
|
+
|
|
|
+ /* Prevent CE ring stuck issue that will occur when ring is full.
|
|
|
+ * Make sure that write index is 1 less than read index.
|
|
|
+ */
|
|
|
+ if ((cur_write_idx + nentries) == dest_ring->sw_index)
|
|
|
+ nentries -= 1;
|
|
|
|
|
|
write_index = CE_RING_IDX_ADD(nentries_mask, write_index, nentries);
|
|
|
ath10k_ce_dest_ring_write_index_set(ar, ctrl_addr, write_index);
|