Author: ian
Date: Fri Oct  9 21:34:46 2015
New Revision: 289084
URL: https://svnweb.freebsd.org/changeset/base/289084

Log:
  Bugfix: Exit the transfer loop if any read or write operation fails.  Also,
  perform a stop operation on the bus if there was an error, otherwise the
  bus will remain hung forever.  Consistantly use 'if (error != 0)' style in
  the function.

Modified:
  head/sys/dev/iicbus/iiconf.c

Modified: head/sys/dev/iicbus/iiconf.c
==============================================================================
--- head/sys/dev/iicbus/iiconf.c        Fri Oct  9 21:27:30 2015        
(r289083)
+++ head/sys/dev/iicbus/iiconf.c        Fri Oct  9 21:34:46 2015        
(r289084)
@@ -397,8 +397,7 @@ iicbus_transfer_gen(device_t dev, struct
                        else
                                error = iicbus_start(bus, addr, 0);
                }
-
-               if (error)
+               if (error != 0)
                        break;
 
                if (msgs[i].flags & IIC_M_RD)
@@ -407,6 +406,8 @@ iicbus_transfer_gen(device_t dev, struct
                else
                        error = iicbus_write(bus, msgs[i].buf, msgs[i].len,
                            &lenwrote, 0);
+               if (error != 0)
+                       break;
 
                if ((msgs[i].flags & IIC_M_NOSTOP) != 0 ||
                    (nostop && i + 1 < nmsgs)) {
@@ -416,5 +417,7 @@ iicbus_transfer_gen(device_t dev, struct
                        iicbus_stop(bus);
                }
        }
+       if (error != 0 && !nostop)
+               iicbus_stop(bus);
        return (error);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to