return -EINVAL;
 }
 
+/* The destination ring processing is stuck if the destination is not
+ * moving while status ring moves 16 PPDU. The destination ring processing
+ * skips this destination ring PPDU as a workaround.
+ */
+#define MON_DEST_RING_STUCK_MAX_CNT 16
+
 static void ath11k_dp_rx_mon_dest_process(struct ath11k *ar, int mac_id,
                                          u32 quota, struct napi_struct *napi)
 {
        u32 ring_id;
        struct ath11k_pdev_mon_stats *rx_mon_stats;
        u32      npackets = 0;
+       u32 mpdu_rx_bufs_used;
 
        if (ar->ab->hw_params.rxdma1_enable)
                ring_id = dp->rxdma_mon_dst_ring.ring_id;
                head_msdu = NULL;
                tail_msdu = NULL;
 
-               rx_bufs_used += ath11k_dp_rx_mon_mpdu_pop(ar, mac_id, ring_entry,
-                                                         &head_msdu,
-                                                         &tail_msdu,
-                                                         &npackets, &ppdu_id);
+               mpdu_rx_bufs_used = ath11k_dp_rx_mon_mpdu_pop(ar, mac_id, ring_entry,
+                                                             &head_msdu,
+                                                             &tail_msdu,
+                                                             &npackets, &ppdu_id);
+
+               rx_bufs_used += mpdu_rx_bufs_used;
+
+               if (mpdu_rx_bufs_used) {
+                       dp->mon_dest_ring_stuck_cnt = 0;
+               } else {
+                       dp->mon_dest_ring_stuck_cnt++;
+                       rx_mon_stats->dest_mon_not_reaped++;
+               }
+
+               if (dp->mon_dest_ring_stuck_cnt > MON_DEST_RING_STUCK_MAX_CNT) {
+                       rx_mon_stats->dest_mon_stuck++;
+                       ath11k_dbg(ar->ab, ATH11K_DBG_DATA,
+                                  "status ring ppdu_id=%d dest ring ppdu_id=%d mon_dest_ring_stuck_cnt=%d dest_mon_not_reaped=%u dest_mon_stuck=%u\n",
+                                  pmon->mon_ppdu_info.ppdu_id, ppdu_id,
+                                  dp->mon_dest_ring_stuck_cnt,
+                                  rx_mon_stats->dest_mon_not_reaped,
+                                  rx_mon_stats->dest_mon_stuck);
+                       pmon->mon_ppdu_info.ppdu_id = ppdu_id;
+                       continue;
+               }
 
                if (ppdu_id != pmon->mon_ppdu_info.ppdu_id) {
                        pmon->mon_ppdu_status = DP_PPDU_STATUS_START;
                        ath11k_dbg(ar->ab, ATH11K_DBG_DATA,
-                                  "dest_rx: new ppdu_id %x != status ppdu_id %x",
-                                  ppdu_id, pmon->mon_ppdu_info.ppdu_id);
+                                  "dest_rx: new ppdu_id %x != status ppdu_id %x dest_mon_not_reaped = %u dest_mon_stuck = %u\n",
+                                  ppdu_id, pmon->mon_ppdu_info.ppdu_id,
+                                  rx_mon_stats->dest_mon_not_reaped,
+                                  rx_mon_stats->dest_mon_stuck);
                        break;
                }
                if (head_msdu && tail_msdu) {