isr_status = cdns_i2c_readreg(CDNS_I2C_ISR_OFFSET);
        cdns_i2c_writereg(isr_status, CDNS_I2C_ISR_OFFSET);
+       id->err_status = 0;
 
        /* Handling nack and arbitration lost interrupt */
        if (isr_status & (CDNS_I2C_IXR_NACK | CDNS_I2C_IXR_ARB_LOST)) {
                            !id->bus_hold_flag)
                                cdns_i2c_clear_bus_hold(id);
 
-                       *(id->p_recv_buf)++ =
-                               cdns_i2c_readreg(CDNS_I2C_DATA_OFFSET);
-                       id->recv_count--;
-                       id->curr_recv_count--;
+                       if (id->recv_count > 0) {
+                               *(id->p_recv_buf)++ =
+                                       cdns_i2c_readreg(CDNS_I2C_DATA_OFFSET);
+                               id->recv_count--;
+                               id->curr_recv_count--;
+                       } else {
+                               dev_err(id->adap.dev.parent,
+                                       "xfer_size reg rollover. xfer aborted!\n");
+                               id->err_status |= CDNS_I2C_IXR_TO;
+                               break;
+                       }
 
                        if (cdns_is_holdquirk(id, hold_quirk))
                                break;
        }
 
        /* Update the status for errors */
-       id->err_status = isr_status & CDNS_I2C_IXR_ERR_INTR_MASK;
+       id->err_status |= isr_status & CDNS_I2C_IXR_ERR_INTR_MASK;
        if (id->err_status)
                status = IRQ_HANDLED;