Module Name:    src
Committed By:   jmcneill
Date:           Mon May  7 15:03:19 UTC 2018

Modified Files:
        src/sys/dev/i2c: gttwsi_core.c gttwsivar.h

Log Message:
Don't sleep with IPL_VM lock held.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/i2c/gttwsi_core.c
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/i2c/gttwsivar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/i2c/gttwsi_core.c
diff -u src/sys/dev/i2c/gttwsi_core.c:1.4 src/sys/dev/i2c/gttwsi_core.c:1.5
--- src/sys/dev/i2c/gttwsi_core.c:1.4	Thu May  3 02:08:52 2018
+++ src/sys/dev/i2c/gttwsi_core.c	Mon May  7 15:03:19 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: gttwsi_core.c,v 1.4 2018/05/03 02:08:52 jmcneill Exp $	*/
+/*	$NetBSD: gttwsi_core.c,v 1.5 2018/05/07 15:03:19 jmcneill Exp $	*/
 /*
  * Copyright (c) 2008 Eiji Kawauchi.
  * All rights reserved.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gttwsi_core.c,v 1.4 2018/05/03 02:08:52 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gttwsi_core.c,v 1.5 2018/05/07 15:03:19 jmcneill Exp $");
 #include "locators.h"
 
 #include <sys/param.h>
@@ -195,7 +195,7 @@ gttwsi_intr(void *arg)
 	if (val & CONTROL_IFLG) {
 		gttwsi_write_4(sc, TWSI_CONTROL, val & ~CONTROL_INTEN);
 		mutex_enter(&sc->sc_mtx);
-		cv_signal(&sc->sc_cv);
+		cv_broadcast(&sc->sc_cv);
 		mutex_exit(&sc->sc_mtx);
 
 		return 1;	/* handled */
@@ -210,6 +210,11 @@ gttwsi_acquire_bus(void *arg, int flags)
 	struct gttwsi_softc *sc = arg;
 
 	mutex_enter(&sc->sc_buslock);
+	while (sc->sc_inuse)
+		cv_wait(&sc->sc_cv, &sc->sc_buslock);
+	sc->sc_inuse = true;
+	mutex_exit(&sc->sc_buslock);
+
 	return 0;
 }
 
@@ -219,6 +224,9 @@ gttwsi_release_bus(void *arg, int flags)
 {
 	struct gttwsi_softc *sc = arg;
 
+	mutex_enter(&sc->sc_buslock);
+	sc->sc_inuse = false;
+	cv_broadcast(&sc->sc_cv);
 	mutex_exit(&sc->sc_buslock);
 }
 
@@ -228,7 +236,7 @@ gttwsi_send_start(void *v, int flags)
 	struct gttwsi_softc *sc = v;
 	int expect;
 
-	KASSERT(mutex_owned(&sc->sc_buslock));
+	KASSERT(sc->sc_inuse);
 
 	if (sc->sc_started)
 		expect = STAT_RSCT;
@@ -245,7 +253,7 @@ gttwsi_send_stop(void *v, int flags)
 	int retry = TWSI_RETRY_COUNT;
 	uint32_t control;
 
-	KASSERT(mutex_owned(&sc->sc_buslock));
+	KASSERT(sc->sc_inuse);
 
 	sc->sc_started = false;
 
@@ -272,7 +280,7 @@ gttwsi_initiate_xfer(void *v, i2c_addr_t
 	uint32_t data, expect;
 	int error, read;
 
-	KASSERT(mutex_owned(&sc->sc_buslock));
+	KASSERT(sc->sc_inuse);
 
 	gttwsi_send_start(v, flags);
 
@@ -318,7 +326,7 @@ gttwsi_read_byte(void *v, uint8_t *valp,
 	struct gttwsi_softc *sc = v;
 	int error;
 
-	KASSERT(mutex_owned(&sc->sc_buslock));
+	KASSERT(sc->sc_inuse);
 
 	if (flags & I2C_F_LAST)
 		error = gttwsi_wait(sc, 0, STAT_MRRD_ANT, flags);
@@ -337,7 +345,7 @@ gttwsi_write_byte(void *v, uint8_t val, 
 	struct gttwsi_softc *sc = v;
 	int error;
 
-	KASSERT(mutex_owned(&sc->sc_buslock));
+	KASSERT(sc->sc_inuse);
 
 	gttwsi_write_4(sc, TWSI_DATA, val);
 	error = gttwsi_wait(sc, 0, STAT_MTDB_AR, flags);
@@ -353,7 +361,7 @@ gttwsi_wait(struct gttwsi_softc *sc, uin
 	uint32_t status;
 	int timo, error = 0;
 
-	KASSERT(mutex_owned(&sc->sc_buslock));
+	KASSERT(sc->sc_inuse);
 
 	DELAY(5);
 	if (!(flags & I2C_F_POLL))

Index: src/sys/dev/i2c/gttwsivar.h
diff -u src/sys/dev/i2c/gttwsivar.h:1.3 src/sys/dev/i2c/gttwsivar.h:1.4
--- src/sys/dev/i2c/gttwsivar.h:1.3	Sun Oct 29 14:59:05 2017
+++ src/sys/dev/i2c/gttwsivar.h	Mon May  7 15:03:19 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: gttwsivar.h,v 1.3 2017/10/29 14:59:05 jmcneill Exp $	*/
+/*	$NetBSD: gttwsivar.h,v 1.4 2018/05/07 15:03:19 jmcneill Exp $	*/
 /*
  * Copyright (c) 2008 Eiji Kawauchi.
  * All rights reserved.
@@ -86,6 +86,7 @@ struct gttwsi_softc {
 	struct i2c_controller sc_i2c;
 	kmutex_t sc_buslock;
 	kmutex_t sc_mtx;
+	bool sc_inuse;
 	kcondvar_t sc_cv;
 
 	bool sc_iflg_rwc;

Reply via email to