Module Name: src Committed By: martin Date: Tue Aug 11 19:13:43 UTC 2020
Modified Files: src/sys/arch/arm/broadcom [netbsd-9]: bcm2835_spi.c src/sys/dev/spi [netbsd-9]: spi.c spivar.h Log Message: Pull up following revision(s) (requested by 1043): sys/dev/spi/spivar.h: revision 1.10 sys/arch/arm/broadcom/bcm2835_spi.c: revision 1.7 sys/dev/spi/spi.c: revision 1.15 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.5 -r1.5.8.1 src/sys/arch/arm/broadcom/bcm2835_spi.c cvs rdiff -u -r1.11 -r1.11.4.1 src/sys/dev/spi/spi.c cvs rdiff -u -r1.7 -r1.7.4.1 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.5 src/sys/arch/arm/broadcom/bcm2835_spi.c:1.5.8.1 --- src/sys/arch/arm/broadcom/bcm2835_spi.c:1.5 Sun Dec 10 21:38:26 2017 +++ src/sys/arch/arm/broadcom/bcm2835_spi.c Tue Aug 11 19:13:43 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_spi.c,v 1.5 2017/12/10 21:38:26 skrll Exp $ */ +/* $NetBSD: bcm2835_spi.c,v 1.5.8.1 2020/08/11 19:13:43 martin Exp $ */ /* * Copyright (c) 2012 Jonathan A. Kollasch @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bcm2835_spi.c,v 1.5 2017/12/10 21:38:26 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_spi.c,v 1.5.8.1 2020/08/11 19:13:43 martin 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; @@ -188,14 +190,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; } @@ -225,13 +226,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; @@ -290,6 +291,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) { @@ -313,5 +315,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.11 src/sys/dev/spi/spi.c:1.11.4.1 --- src/sys/dev/spi/spi.c:1.11 Sat Mar 9 07:53:12 2019 +++ src/sys/dev/spi/spi.c Tue Aug 11 19:13:43 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: spi.c,v 1.11 2019/03/09 07:53:12 mlelstv Exp $ */ +/* $NetBSD: spi.c,v 1.11.4.1 2020/08/11 19:13:43 martin 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.11 2019/03/09 07:53:12 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: spi.c,v 1.11.4.1 2020/08/11 19:13:43 martin Exp $"); #include "locators.h" @@ -175,7 +175,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; @@ -349,7 +349,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.7 src/sys/dev/spi/spivar.h:1.7.4.1 --- src/sys/dev/spi/spivar.h:1.7 Sat Feb 23 10:43:25 2019 +++ src/sys/dev/spi/spivar.h Tue Aug 11 19:13:43 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: spivar.h,v 1.7 2019/02/23 10:43:25 mlelstv Exp $ */ +/* $NetBSD: spivar.h,v 1.7.4.1 2020/08/11 19:13:43 martin Exp $ */ /*- * Copyright (c) 2006 Urbana-Champaign Independent Media Center. @@ -103,7 +103,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;