return ab->hal_rx_ops->rx_desc_get_msdu_src_link_id(desc);
 }
 
+static void ath12k_dp_clean_up_skb_list(struct sk_buff_head *skb_list)
+{
+       struct sk_buff *skb;
+
+       while ((skb = __skb_dequeue(skb_list)))
+               dev_kfree_skb_any(skb);
+}
+
 static int ath12k_dp_purge_mon_ring(struct ath12k_base *ab)
 {
        int i, reaped = 0;
        struct hal_rx_wbm_rel_info err_info;
        struct hal_srng *srng;
        struct sk_buff *msdu;
-       struct sk_buff_head msdu_list;
+       struct sk_buff_head msdu_list, scatter_msdu_list;
        struct ath12k_skb_rxcb *rxcb;
        void *rx_desc;
        u8 mac_id;
        int num_buffs_reaped = 0;
        struct ath12k_rx_desc_info *desc_info;
        int ret, pdev_id;
+       struct hal_rx_desc *msdu_data;
 
        __skb_queue_head_init(&msdu_list);
+       __skb_queue_head_init(&scatter_msdu_list);
 
        srng = &ab->hal.srng_list[dp->rx_rel_ring.ring_id];
        rx_ring = &dp->rx_refill_buf_ring;
-
        spin_lock_bh(&srng->lock);
 
        ath12k_hal_srng_access_begin(ab, srng);
                        continue;
                }
 
+               msdu_data = (struct hal_rx_desc *)msdu->data;
                rxcb->err_rel_src = err_info.err_rel_src;
                rxcb->err_code = err_info.err_code;
-               rxcb->rx_desc = (struct hal_rx_desc *)msdu->data;
-
-               __skb_queue_tail(&msdu_list, msdu);
-
                rxcb->is_first_msdu = err_info.first_msdu;
                rxcb->is_last_msdu = err_info.last_msdu;
                rxcb->is_continuation = err_info.continuation;
+               rxcb->rx_desc = msdu_data;
+
+               if (err_info.continuation) {
+                       __skb_queue_tail(&scatter_msdu_list, msdu);
+                       continue;
+               }
+
+               mac_id = ath12k_dp_rx_get_msdu_src_link(ab,
+                                                       msdu_data);
+               if (mac_id >= MAX_RADIOS) {
+                       dev_kfree_skb_any(msdu);
+
+                       /* In any case continuation bit is set
+                        * in the previous record, cleanup scatter_msdu_list
+                        */
+                       ath12k_dp_clean_up_skb_list(&scatter_msdu_list);
+                       continue;
+               }
+
+               if (!skb_queue_empty(&scatter_msdu_list)) {
+                       struct sk_buff *msdu;
+
+                       skb_queue_walk(&scatter_msdu_list, msdu) {
+                               rxcb = ATH12K_SKB_RXCB(msdu);
+                               rxcb->mac_id = mac_id;
+                       }
+
+                       skb_queue_splice_tail_init(&scatter_msdu_list,
+                                                  &msdu_list);
+               }
+
+               rxcb = ATH12K_SKB_RXCB(msdu);
+               rxcb->mac_id = mac_id;
+               __skb_queue_tail(&msdu_list, msdu);
        }
 
+       /* In any case continuation bit is set in the
+        * last record, cleanup scatter_msdu_list
+        */
+       ath12k_dp_clean_up_skb_list(&scatter_msdu_list);
+
        ath12k_hal_srng_access_end(ab, srng);
 
        spin_unlock_bh(&srng->lock);
 
        rcu_read_lock();
        while ((msdu = __skb_dequeue(&msdu_list))) {
-               mac_id = ath12k_dp_rx_get_msdu_src_link(ab,
-                                                       (struct hal_rx_desc *)msdu->data);
+               rxcb = ATH12K_SKB_RXCB(msdu);
+               mac_id = rxcb->mac_id;
+
                pdev_id = ath12k_hw_mac_id_to_pdev_id(ab->hw_params, mac_id);
                ar = ab->pdevs[pdev_id].ar;