Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
[cascardo/linux.git] / drivers / net / wireless / ath / ath10k / ce.c
index 9fb8d74..0b4d796 100644 (file)
@@ -39,7 +39,7 @@
  * chooses what to send (buffer address, length). The destination
  * side keeps a supply of "anonymous receive buffers" available and
  * it handles incoming data as it arrives (when the destination
- * recieves an interrupt).
+ * receives an interrupt).
  *
  * The sender may send a simple buffer (address/length) or it may
  * send a small list of buffers.  When a small list is sent, hardware
@@ -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);
@@ -840,7 +847,7 @@ static int ath10k_ce_init_src_ring(struct ath10k *ar,
        ath10k_ce_src_ring_highmark_set(ar, ctrl_addr, nentries);
 
        ath10k_dbg(ar, ATH10K_DBG_BOOT,
-                  "boot init ce src ring id %d entries %d base_addr %p\n",
+                  "boot init ce src ring id %d entries %d base_addr %pK\n",
                   ce_id, nentries, src_ring->base_addr_owner_space);
 
        return 0;
@@ -874,7 +881,7 @@ static int ath10k_ce_init_dest_ring(struct ath10k *ar,
        ath10k_ce_dest_ring_highmark_set(ar, ctrl_addr, nentries);
 
        ath10k_dbg(ar, ATH10K_DBG_BOOT,
-                  "boot ce dest ring id %d entries %d base_addr %p\n",
+                  "boot ce dest ring id %d entries %d base_addr %pK\n",
                   ce_id, nentries, dest_ring->base_addr_owner_space);
 
        return 0;