/* set if host-fw communication goes haywire
         * used to avoid further failures */
        bool rx_confused;
-       struct tasklet_struct rx_replenish_task;
        atomic_t num_mpdus_ready;
 
        /* This is used to group tx/rx completions separately and process them
 
 /* Refill a bunch of RX buffers for each refill round so that FW/HW can handle
  * aggregated traffic more nicely. */
-#define ATH10K_HTT_MAX_NUM_REFILL 16
+#define ATH10K_HTT_MAX_NUM_REFILL 100
 
 /*
  * DMA_MAP expects the buffer to be an integral number of cache lines.
 
 /* when under memory pressure rx ring refill may fail and needs a retry */
 #define HTT_RX_RING_REFILL_RETRY_MS 50
 
+#define HTT_RX_RING_REFILL_RESCHED_MS 5
+
 static int ath10k_htt_rx_get_csum_state(struct sk_buff *skb);
 static void ath10k_htt_txrx_compl_task(unsigned long ptr);
 
                mod_timer(&htt->rx_ring.refill_retry_timer, jiffies +
                          msecs_to_jiffies(HTT_RX_RING_REFILL_RETRY_MS));
        } else if (num_deficit > 0) {
-               tasklet_schedule(&htt->rx_replenish_task);
+               mod_timer(&htt->rx_ring.refill_retry_timer, jiffies +
+                         msecs_to_jiffies(HTT_RX_RING_REFILL_RESCHED_MS));
        }
        spin_unlock_bh(&htt->rx_ring.lock);
 }
 void ath10k_htt_rx_free(struct ath10k_htt *htt)
 {
        del_timer_sync(&htt->rx_ring.refill_retry_timer);
-       tasklet_kill(&htt->rx_replenish_task);
        tasklet_kill(&htt->txrx_compl_task);
 
        skb_queue_purge(&htt->rx_compl_q);
        return msdu_chaining;
 }
 
-static void ath10k_htt_rx_replenish_task(unsigned long ptr)
-{
-       struct ath10k_htt *htt = (struct ath10k_htt *)ptr;
-
-       ath10k_htt_rx_msdu_buff_replenish(htt);
-}
-
 static struct sk_buff *ath10k_htt_rx_pop_paddr(struct ath10k_htt *htt,
                                               u32 paddr)
 {
        htt->rx_ring.sw_rd_idx.msdu_payld = 0;
        hash_init(htt->rx_ring.skb_table);
 
-       tasklet_init(&htt->rx_replenish_task, ath10k_htt_rx_replenish_task,
-                    (unsigned long)htt);
-
        skb_queue_head_init(&htt->rx_compl_q);
        skb_queue_head_init(&htt->rx_in_ord_compl_q);
        skb_queue_head_init(&htt->tx_fetch_ind_q);
                        return;
                }
        }
-
-       tasklet_schedule(&htt->rx_replenish_task);
+       ath10k_htt_rx_msdu_buff_replenish(htt);
 }
 
 static void ath10k_htt_rx_tx_fetch_resp_id_confirm(struct ath10k *ar,
                dev_kfree_skb_any(skb);
        }
 
-       tasklet_schedule(&htt->rx_replenish_task);
+       ath10k_htt_rx_msdu_buff_replenish(htt);
 }