svn commit: r273329 - head/sys/arm/broadcom/bcm2835

Luiz Otavio O Souza loos at FreeBSD.org
Mon Oct 20 13:36:53 UTC 2014


Author: loos
Date: Mon Oct 20 13:36:52 2014
New Revision: 273329
URL: https://svnweb.freebsd.org/changeset/base/273329

Log:
  Add another wakeup() after actually set the bus as free.
  
  This fix a race where the threads waiting for the bus would wake up early
  and still see bus as busy.
  
  While here, give a better description to wmesg for the two use cases we
  have (bus and io waiting).
  
  MFC after:	1 week

Modified:
  head/sys/arm/broadcom/bcm2835/bcm2835_bsc.c

Modified: head/sys/arm/broadcom/bcm2835/bcm2835_bsc.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2835_bsc.c	Mon Oct 20 13:18:52 2014	(r273328)
+++ head/sys/arm/broadcom/bcm2835/bcm2835_bsc.c	Mon Oct 20 13:36:52 2014	(r273329)
@@ -395,7 +395,7 @@ bcm_bsc_transfer(device_t dev, struct ii
 
 	/* If the controller is busy wait until it is available. */
 	while (sc->sc_flags & BCM_I2C_BUSY)
-		mtx_sleep(dev, &sc->sc_mtx, 0, "bcm_bsc", 0);
+		mtx_sleep(dev, &sc->sc_mtx, 0, "bscbusw", 0);
 
 	/* Now we have control over the BSC controller. */
 	sc->sc_flags = BCM_I2C_BUSY;
@@ -439,7 +439,7 @@ bcm_bsc_transfer(device_t dev, struct ii
 		    BCM_BSC_CTRL_ST | read | intr);
 
 		/* Wait for the transaction to complete. */
-		err = mtx_sleep(dev, &sc->sc_mtx, 0, "bcm_bsc", hz);
+		err = mtx_sleep(dev, &sc->sc_mtx, 0, "bsciow", hz);
 
 		/* Check if we have a timeout or an I2C error. */
 		if ((sc->sc_flags & BCM_I2C_ERROR) || err == EWOULDBLOCK) {
@@ -452,6 +452,9 @@ bcm_bsc_transfer(device_t dev, struct ii
 	/* Clean the controller flags. */
 	sc->sc_flags = 0;
 
+	/* Wake up the threads waiting for bus. */
+	wakeup(dev);
+
 	BCM_BSC_UNLOCK(sc);
 
 	return (err);


More information about the svn-src-head mailing list