}
 
 static inline
-void wil_get_next_rx_status_msg(struct wil_status_ring *sring, void *msg)
+void wil_get_next_rx_status_msg(struct wil_status_ring *sring, u8 *dr_bit,
+                               void *msg)
 {
-       memcpy(msg, (void *)(sring->va + (sring->elem_size * sring->swhead)),
-              sring->elem_size);
+       struct wil_rx_status_compressed *_msg;
+
+       _msg = (struct wil_rx_status_compressed *)
+               (sring->va + (sring->elem_size * sring->swhead));
+       *dr_bit = WIL_GET_BITS(_msg->d0, 31, 31);
+       /* make sure dr_bit is read before the rest of status msg */
+       rmb();
+       memcpy(msg, (void *)_msg, sring->elem_size);
 }
 
 static inline void wil_sring_advance_swhead(struct wil_status_ring *sring)
                if (!sring->va)
                        continue;
 
-               wil_get_next_rx_status_msg(sring, msg);
-               dr_bit = wil_rx_status_get_desc_rdy_bit(msg);
+               wil_get_next_rx_status_msg(sring, &dr_bit, msg);
 
                /* Check if there are unhandled RX status messages */
                if (dr_bit == sring->desc_rdy_pol)
        BUILD_BUG_ON(sizeof(struct wil_rx_status_extended) > sizeof(skb->cb));
 
 again:
-       wil_get_next_rx_status_msg(sring, msg);
-       dr_bit = wil_rx_status_get_desc_rdy_bit(msg);
+       wil_get_next_rx_status_msg(sring, &dr_bit, msg);
 
        /* Completed handling all the ready status messages */
        if (dr_bit != sring->desc_rdy_pol)
 }
 
 static inline void
-wil_get_next_tx_status_msg(struct wil_status_ring *sring,
+wil_get_next_tx_status_msg(struct wil_status_ring *sring, u8 *dr_bit,
                           struct wil_ring_tx_status *msg)
 {
        struct wil_ring_tx_status *_msg = (struct wil_ring_tx_status *)
                (sring->va + (sring->elem_size * sring->swhead));
 
+       *dr_bit = _msg->desc_ready >> TX_STATUS_DESC_READY_POS;
+       /* make sure dr_bit is read before the rest of status msg */
+       rmb();
        *msg = *_msg;
 }
 
        int used_before_complete;
        int used_new;
 
-       wil_get_next_tx_status_msg(sring, &msg);
-       dr_bit = msg.desc_ready >> TX_STATUS_DESC_READY_POS;
+       wil_get_next_tx_status_msg(sring, &dr_bit, &msg);
 
        /* Process completion messages while DR bit has the expected polarity */
        while (dr_bit == sring->desc_rdy_pol) {
 
                wil_sring_advance_swhead(sring);
 
-               wil_get_next_tx_status_msg(sring, &msg);
-               dr_bit = msg.desc_ready >> TX_STATUS_DESC_READY_POS;
+               wil_get_next_tx_status_msg(sring, &dr_bit, &msg);
        }
 
        /* shall we wake net queues? */