void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
                                    u16 *n_items)
 {
-       void *ret_addr;
-
        if (commonring->cr_update_wptr)
                commonring->cr_update_wptr(commonring->cr_ctx);
 
        if (*n_items == 0)
                return NULL;
 
-       ret_addr = commonring->buf_addr +
-                  (commonring->r_ptr * commonring->item_len);
-
-       commonring->r_ptr += *n_items;
-       if (commonring->r_ptr == commonring->depth)
-               commonring->r_ptr = 0;
-
-       return ret_addr;
+       return commonring->buf_addr +
+              (commonring->r_ptr * commonring->item_len);
 }
 
 
-int brcmf_commonring_read_complete(struct brcmf_commonring *commonring)
+int brcmf_commonring_read_complete(struct brcmf_commonring *commonring,
+                                  u16 n_items)
 {
+       commonring->r_ptr += n_items;
+       if (commonring->r_ptr == commonring->depth)
+               commonring->r_ptr = 0;
+
        if (commonring->cr_write_rptr)
                return commonring->cr_write_rptr(commonring->cr_ctx);
 
 
                                   u16 n_items);
 void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
                                    u16 *n_items);
-int brcmf_commonring_read_complete(struct brcmf_commonring *commonring);
+int brcmf_commonring_read_complete(struct brcmf_commonring *commonring,
+                                  u16 n_items);
 
 #define brcmf_commonring_n_items(commonring) (commonring->depth)
 #define brcmf_commonring_len_item(commonring) (commonring->item_len)
 
 
 #define BRCMF_MSGBUF_DELAY_TXWORKER_THRS       96
 #define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS     32
+#define BRCMF_MSGBUF_UPDATE_RX_PTR_THRS                48
+
 
 struct msgbuf_common_hdr {
        u8                              msgtype;
 {
        void *buf;
        u16 count;
+       u16 processed;
 
 again:
        buf = brcmf_commonring_get_read_ptr(commonring, &count);
        if (buf == NULL)
                return;
 
+       processed = 0;
        while (count) {
                brcmf_msgbuf_process_msgtype(msgbuf,
                                             buf + msgbuf->rx_dataoffset);
                buf += brcmf_commonring_len_item(commonring);
+               processed++;
+               if (processed == BRCMF_MSGBUF_UPDATE_RX_PTR_THRS) {
+                       brcmf_commonring_read_complete(commonring, processed);
+                       processed = 0;
+               }
                count--;
        }
-       brcmf_commonring_read_complete(commonring);
+       if (processed)
+               brcmf_commonring_read_complete(commonring, processed);
 
        if (commonring->r_ptr == 0)
                goto again;