count--;
                        temp++;
                        wrcount++;
-               } else { /* arbitration or no acknowledge */
-                       dev_err(&i2c_adap->dev, "sendbytes: error - bailout.\n");
-                       return (retval<0)? retval : -EFAULT;
-                               /* got a better one ?? */
+
+               /* A slave NAKing the master means the slave didn't like
+                * something about the data it saw.  For example, maybe
+                * the SMBus PEC was wrong.
+                */
+               } else if (retval == 0) {
+                       dev_err(&i2c_adap->dev, "sendbytes: NAK bailout.\n");
+                       return -EIO;
+
+               /* Timeout; or (someday) lost arbitration
+                *
+                * FIXME Lost ARB implies retrying the transaction from
+                * the first message, after the "winning" master issues
+                * its STOP.  As a rule, upper layer code has no reason
+                * to know or care about this ... it is *NOT* an error.
+                */
+               } else {
+                       dev_err(&i2c_adap->dev, "sendbytes: error %d\n",
+                                       retval);
+                       return retval;
                }
        }
        return wrcount;