ath11k: remove stale monitor status descriptor
authorMiles Hu <milehu@codeaurora.org>
Fri, 8 May 2020 02:54:57 +0000 (05:54 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 11 May 2020 12:27:12 +0000 (15:27 +0300)
The driver is not handling monitor status descriptor whenever
the done bit of status descriptor is not set by hardware. This leave
a stale entry in monitor status ring and flooding warning message.
Fix that by removing the descriptor and move forward to next one
in monitor status ring.

Co-developed-by: Rajkumar Manoharan <rmanohar@codeaurora.org>
Signed-off-by: Rajkumar Manoharan <rmanohar@codeaurora.org>
Signed-off-by: Miles Hu <milehu@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1588642063-6950-1-git-send-email-rmanohar@codeaurora.org
drivers/net/wireless/ath/ath11k/dp_rx.c

index 85670608c3e280fc7c6c00777e279dbb028ac16b..a54610d75c40a2073c6e1fa692981e35036fed59 100644 (file)
@@ -2728,7 +2728,7 @@ static int ath11k_dp_rx_reap_mon_status_ring(struct ath11k_base *ab, int mac_id,
                                ath11k_warn(ab, "rx monitor status with invalid buf_id %d\n",
                                            buf_id);
                                spin_unlock_bh(&rx_ring->idr_lock);
-                               continue;
+                               goto move_next;
                        }
 
                        idr_remove(&rx_ring->bufs_idr, buf_id);
@@ -2747,13 +2747,16 @@ static int ath11k_dp_rx_reap_mon_status_ring(struct ath11k_base *ab, int mac_id,
                        tlv = (struct hal_tlv_hdr *)skb->data;
                        if (FIELD_GET(HAL_TLV_HDR_TAG, tlv->tl) !=
                                        HAL_RX_STATUS_BUFFER_DONE) {
-                               ath11k_hal_srng_src_get_next_entry(ab, srng);
-                               continue;
+                               ath11k_warn(ab, "mon status DONE not set %lx\n",
+                                           FIELD_GET(HAL_TLV_HDR_TAG,
+                                                     tlv->tl));
+                               dev_kfree_skb_any(skb);
+                               goto move_next;
                        }
 
                        __skb_queue_tail(skb_list, skb);
                }
-
+move_next:
                skb = ath11k_dp_rx_alloc_mon_status_buf(ab, rx_ring,
                                                        &buf_id, GFP_ATOMIC);