Module Name: src Committed By: kardel Date: Tue Aug 4 13:20:45 UTC 2020
Modified Files: src/sys/arch/arm/broadcom: bcm2835_spi.c src/sys/dev/spi: spi.c spivar.h Log Message: Use mutex for lwp/interrupt coordination. using splX() simply does not work on multiprocessor systems. fixes PR kern/55506 To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/broadcom/bcm2835_spi.c cvs rdiff -u -r1.14 -r1.15 src/sys/dev/spi/spi.c cvs rdiff -u -r1.9 -r1.10 src/sys/dev/spi/spivar.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/arch/arm/broadcom/bcm2835_spi.c diff -u src/sys/arch/arm/broadcom/bcm2835_spi.c:1.6 src/sys/arch/arm/broadcom/bcm2835_spi.c:1.7 --- src/sys/arch/arm/broadcom/bcm2835_spi.c:1.6 Tue Aug 13 17:03:10 2019 +++ src/sys/arch/arm/broadcom/bcm2835_spi.c Tue Aug 4 13:20:45 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_spi.c,v 1.6 2019/08/13 17:03:10 tnn Exp $ */ +/* $NetBSD: bcm2835_spi.c,v 1.7 2020/08/04 13:20:45 kardel Exp $ */ /* * Copyright (c) 2012 Jonathan A. Kollasch @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bcm2835_spi.c,v 1.6 2019/08/13 17:03:10 tnn Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_spi.c,v 1.7 2020/08/04 13:20:45 kardel Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -53,6 +53,7 @@ struct bcmspi_softc { bus_space_handle_t sc_ioh; void *sc_intrh; struct spi_controller sc_spi; + kmutex_t sc_mutex; SIMPLEQ_HEAD(,spi_transfer) sc_q; struct spi_transfer *sc_transfer; struct spi_chunk *sc_wchunk; @@ -131,6 +132,7 @@ bcmspi_attach(device_t parent, device_t aprint_normal_dev(self, "interrupting on %s\n", intrstr); sc->sc_spi.sct_cookie = sc; + mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_VM); sc->sc_spi.sct_configure = bcmspi_configure; sc->sc_spi.sct_transfer = bcmspi_transfer; sc->sc_spi.sct_nslaves = 3; @@ -189,14 +191,13 @@ static int bcmspi_transfer(void *cookie, struct spi_transfer *st) { struct bcmspi_softc * const sc = cookie; - int s; - s = splbio(); + mutex_enter(&sc->sc_mutex); spi_transq_enqueue(&sc->sc_q, st); if (sc->sc_running == false) { bcmspi_start(sc); } - splx(s); + mutex_exit(&sc->sc_mutex); return 0; } @@ -226,13 +227,13 @@ bcmspi_start(struct bcmspi_softc * const if (!cold) return; - int s = splbio(); for (;;) { + mutex_exit(&sc->sc_mutex); bcmspi_intr(sc); + mutex_enter(&sc->sc_mutex); if (ISSET(st->st_flags, SPI_F_DONE)) break; } - splx(s); } sc->sc_running = false; @@ -291,6 +292,7 @@ bcmspi_intr(void *cookie) struct spi_transfer *st; uint32_t cs; + mutex_enter(&sc->sc_mutex); cs = bus_space_read_4(sc->sc_iot, sc->sc_ioh, SPI_CS); if (ISSET(cs, SPI_CS_DONE)) { if (sc->sc_wchunk != NULL) { @@ -314,5 +316,6 @@ bcmspi_intr(void *cookie) } end: + mutex_exit(&sc->sc_mutex); return ISSET(cs, SPI_CS_DONE|SPI_CS_RXR); } Index: src/sys/dev/spi/spi.c diff -u src/sys/dev/spi/spi.c:1.14 src/sys/dev/spi/spi.c:1.15 --- src/sys/dev/spi/spi.c:1.14 Thu Jun 11 02:39:30 2020 +++ src/sys/dev/spi/spi.c Tue Aug 4 13:20:45 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: spi.c,v 1.14 2020/06/11 02:39:30 thorpej Exp $ */ +/* $NetBSD: spi.c,v 1.15 2020/08/04 13:20:45 kardel Exp $ */ /*- * Copyright (c) 2006 Urbana-Champaign Independent Media Center. @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: spi.c,v 1.14 2020/06/11 02:39:30 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: spi.c,v 1.15 2020/08/04 13:20:45 kardel Exp $"); #include "locators.h" @@ -287,7 +287,7 @@ spi_attach(device_t parent, device_t sel aprint_naive(": SPI bus\n"); aprint_normal(": SPI bus\n"); - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_BIO); + mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_VM); cv_init(&sc->sc_cv, "spictl"); sc->sc_controller = *sba->sba_controller; @@ -463,7 +463,7 @@ void spi_transfer_init(struct spi_transfer *st) { - mutex_init(&st->st_lock, MUTEX_DEFAULT, IPL_BIO); + mutex_init(&st->st_lock, MUTEX_DEFAULT, IPL_VM); cv_init(&st->st_cv, "spixfr"); st->st_flags = 0; Index: src/sys/dev/spi/spivar.h diff -u src/sys/dev/spi/spivar.h:1.9 src/sys/dev/spi/spivar.h:1.10 --- src/sys/dev/spi/spivar.h:1.9 Wed Nov 27 07:26:08 2019 +++ src/sys/dev/spi/spivar.h Tue Aug 4 13:20:45 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: spivar.h,v 1.9 2019/11/27 07:26:08 hkenken Exp $ */ +/* $NetBSD: spivar.h,v 1.10 2020/08/04 13:20:45 kardel Exp $ */ /*- * Copyright (c) 2006 Urbana-Champaign Independent Media Center. @@ -111,7 +111,7 @@ struct spi_chunk { struct spi_transfer { struct spi_chunk *st_chunks; /* chained bufs */ SIMPLEQ_ENTRY(spi_transfer) st_chain; /* chain of submitted jobs */ - int st_flags; + volatile int st_flags; int st_errno; int st_slave; void *st_private;