static int rsi_process_pkt(struct rsi_common *common)
 {
        struct rsi_hw *adapter = common->priv;
+       struct rsi_91x_sdiodev *dev =
+               (struct rsi_91x_sdiodev *)adapter->rsi_dev;
        u8 num_blks = 0;
        u32 rcv_pkt_len = 0;
        int status = 0;
+       u8 value = 0;
 
-       status = rsi_sdio_read_register(adapter,
-                                       SDIO_RX_NUM_BLOCKS_REG,
-                                       &num_blks);
+       num_blks = ((adapter->interrupt_status & 1) |
+                       ((adapter->interrupt_status >> RECV_NUM_BLOCKS) << 1));
 
-       if (status) {
-               rsi_dbg(ERR_ZONE,
-                       "%s: Failed to read pkt length from the card:\n",
-                       __func__);
-               return status;
+       if (!num_blks) {
+               status = rsi_sdio_read_register(adapter,
+                                               SDIO_RX_NUM_BLOCKS_REG,
+                                               &value);
+               if (status) {
+                       rsi_dbg(ERR_ZONE,
+                               "%s: Failed to read pkt length from the card:\n",
+                               __func__);
+                       return status;
+               }
+               num_blks = value & 0x1f;
        }
+
+       if (dev->write_fail == 2)
+               rsi_sdio_ack_intr(common->priv, (1 << MSDU_PKT_PENDING));
+
+       if (unlikely(!num_blks)) {
+               dev->write_fail = 2;
+               return -1;
+       }
+
        rcv_pkt_len = (num_blks * 256);
 
        common->rx_data_pkt = kmalloc(rcv_pkt_len, GFP_KERNEL);
                        mutex_unlock(&common->tx_rxlock);
                        return;
                }
+               adapter->interrupt_status = isr_status;
 
                if (isr_status == 0) {
                        rsi_set_event(&common->tx_thread.event);
 
 #define PKT_BUFF_FULL                           1
 #define PKT_MGMT_BUFF_FULL                      2
 #define MSDU_PKT_PENDING                        3
+#define RECV_NUM_BLOCKS                         4
 /* Interrupt Bit Related Macros */
 #define PKT_BUFF_AVAILABLE                      1
 #define FW_ASSERT_IND                           2