enum testunit_flags {
        TU_FLAG_IN_PROCESS,
+       TU_FLAG_NACK,
 };
 
 struct testunit_data {
 
        switch (event) {
        case I2C_SLAVE_WRITE_REQUESTED:
-               if (test_bit(TU_FLAG_IN_PROCESS, &tu->flags))
-                       return -EBUSY;
+               if (test_bit(TU_FLAG_IN_PROCESS | TU_FLAG_NACK, &tu->flags)) {
+                       ret = -EBUSY;
+                       break;
+               }
 
                memset(tu->regs, 0, TU_NUM_REGS);
                tu->reg_idx = 0;
                break;
 
        case I2C_SLAVE_WRITE_RECEIVED:
-               if (test_bit(TU_FLAG_IN_PROCESS, &tu->flags))
-                       return -EBUSY;
+               if (test_bit(TU_FLAG_IN_PROCESS | TU_FLAG_NACK, &tu->flags)) {
+                       ret = -EBUSY;
+                       break;
+               }
 
                if (tu->reg_idx < TU_NUM_REGS)
                        tu->regs[tu->reg_idx] = *val;
                 * here because we still need them in the workqueue!
                 */
                tu->reg_idx = 0;
+
+               clear_bit(TU_FLAG_NACK, &tu->flags);
                break;
 
        case I2C_SLAVE_READ_PROCESSED:
                break;
        }
 
+       /* If an error occurred somewhen, we NACK everything until next STOP */
+       if (ret)
+               set_bit(TU_FLAG_NACK, &tu->flags);
+
        return ret;
 }