dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n",
                                __func__, (long)jiffies, ISR, ICR, IBMR);
 
-               if ((ISR & (ISR_UB|ISR_IBB|ISR_SAD)) == ISR_SAD ||
+               if ((ISR & (ISR_UB|ISR_IBB)) == 0 ||
+                   (ISR & ISR_SAD) != 0 ||
                    (ICR & ICR_SCLE) == 0) {
                        if (i2c_debug > 1)
                                dev_dbg(&i2c->adap.dev, "%s: done\n", __func__);
        if (isr & ISR_BED) {
                /* what should we do here? */
        } else {
-               int ret = i2c->slave->read(i2c->slave->data);
+               int ret = 0;
+
+               if (i2c->slave != NULL)
+                       ret = i2c->slave->read(i2c->slave->data);
 
                IDBR = ret;
                ICR |= ICR_TB;   /* allow next byte */