}
 
 static int
-do_address(struct i2c_au1550_data *adap, unsigned int addr, int rd)
+do_address(struct i2c_au1550_data *adap, unsigned int addr, int rd, int q)
 {
        volatile psc_smb_t      *sp;
        u32                     stat;
        if (rd)
                addr |= 1;
 
+       /* zero-byte xfers stop immediately */
+       if (q)
+               addr |= PSC_SMBTXRX_STP;
+
        /* Put byte into fifo, start up master.
        */
        sp->psc_smbtxrx = addr;
        au_sync();
        if (wait_ack(adap))
                return -EIO;
-       return 0;
+       return (q) ? wait_master_done(adap) : 0;
 }
 
 static u32
 
        for (i = 0; !err && i < num; i++) {
                p = &msgs[i];
-               err = do_address(adap, p->addr, p->flags & I2C_M_RD);
+               err = do_address(adap, p->addr, p->flags & I2C_M_RD,
+                                (p->len == 0));
                if (err || !p->len)
                        continue;
                if (p->flags & I2C_M_RD)