/*
                 * Because we don't know the buffer length in the
-                * I2C_FUNC_SMBUS_BLOCK_DATA case, we can't stop
-                * the transaction here.
+                * I2C_FUNC_SMBUS_BLOCK_DATA case, we can't stop the
+                * transaction here. Also disable the TX_EMPTY IRQ
+                * while waiting for the data length byte to avoid the
+                * bogus interrupts flood.
                 */
-               if (buf_len > 0 || flags & I2C_M_RECV_LEN) {
+               if (flags & I2C_M_RECV_LEN) {
+                       dev->status |= STATUS_WRITE_IN_PROGRESS;
+                       intr_mask &= ~DW_IC_INTR_TX_EMPTY;
+                       break;
+               } else if (buf_len > 0) {
                        /* more bytes to be written */
                        dev->status |= STATUS_WRITE_IN_PROGRESS;
                        break;
        msgs[dev->msg_read_idx].len = len;
        msgs[dev->msg_read_idx].flags &= ~I2C_M_RECV_LEN;
 
+       /*
+        * Received buffer length, re-enable TX_EMPTY interrupt
+        * to resume the SMBUS transaction.
+        */
+       regmap_update_bits(dev->map, DW_IC_INTR_MASK, DW_IC_INTR_TX_EMPTY,
+                          DW_IC_INTR_TX_EMPTY);
+
        return len;
 }