+++ /dev/null
-From 0628467f97b5227755428bac10a68257322f7e34 Mon Sep 17 00:00:00 2001
-From: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
-Date: Wed, 21 Sep 2016 16:28:06 +0530
-Subject: ath10k: fix copy engine 5 destination ring stuck
-
-From: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
-
-commit 0628467f97b5227755428bac10a68257322f7e34 upstream.
-
-Firmware is running watchdog timer for tracking copy engine ring index
-and write index. Whenever both indices are stuck at same location for
-given duration, watchdog will be trigger to assert target. While
-updating copy engine destination ring write index, driver ensures that
-write index will not be same as read index by finding delta between these
-two indices (CE_RING_DELTA).
-
-HTT target to host copy engine (CE5) is special case where ring buffers
-will be reused and delta check is not applied while updating write index.
-In rare scenario, whenever CE5 ring is full, both indices will be referring
-same location and this is causing CE ring stuck issue as explained
-above. This issue is originally reported on IPQ4019 during long hour stress
-testing and during veriwave max clients testsuites. The same issue is
-also observed in other chips as well. Fix this by ensuring that write
-index is one less than read index which means that full ring is
-available for receiving data.
-
-Tested-by: Tamizh chelvam <c_traja@qti.qualcomm.com>
-Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
-Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- drivers/net/wireless/ath/ath10k/ce.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
---- a/drivers/net/wireless/ath/ath10k/ce.c
-+++ b/drivers/net/wireless/ath/ath10k/ce.c
-@@ -408,6 +408,13 @@ int __ath10k_ce_rx_post_buf(struct ath10
- struct ce_desc *base = dest_ring->base_addr_owner_space;
- struct ce_desc *desc = CE_DEST_RING_TO_DESC(base, 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;
-
- lockdep_assert_held(&ar_pci->ce_lock);
-