Module Name: src Committed By: martin Date: Tue Nov 30 11:48:29 UTC 2021
Modified Files: src/sys/dev/pci [netbsd-8]: piixpm.c Log Message: Apply patch, requested by msaitoh in ticket #1709: sys/dev/pci/piixpm.c patch Fix a bug that I2C access panics on old AMD chipset (e.g SB600). Fixes PR kern/56525. To generate a diff of this commit: cvs rdiff -u -r1.52.6.2 -r1.52.6.3 src/sys/dev/pci/piixpm.c 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/pci/piixpm.c diff -u src/sys/dev/pci/piixpm.c:1.52.6.2 src/sys/dev/pci/piixpm.c:1.52.6.3 --- src/sys/dev/pci/piixpm.c:1.52.6.2 Wed Aug 5 16:11:56 2020 +++ src/sys/dev/pci/piixpm.c Tue Nov 30 11:48:29 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: piixpm.c,v 1.52.6.2 2020/08/05 16:11:56 martin Exp $ */ +/* $NetBSD: piixpm.c,v 1.52.6.3 2021/11/30 11:48:29 martin Exp $ */ /* $OpenBSD: piixpm.c,v 1.39 2013/10/01 20:06:02 sf Exp $ */ /* @@ -22,7 +22,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: piixpm.c,v 1.52.6.2 2020/08/05 16:11:56 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: piixpm.c,v 1.52.6.3 2021/11/30 11:48:29 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -123,6 +123,8 @@ static bool piixpm_resume(device_t, cons static int piixpm_sb800_init(struct piixpm_softc *); static void piixpm_csb5_reset(void *); +static int piixpm_i2c_sb600_acquire_bus(void *, int); +static void piixpm_i2c_sb600_release_bus(void *, int); static int piixpm_i2c_sb800_acquire_bus(void *, int); static void piixpm_i2c_sb800_release_bus(void *, int); static int piixpm_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, @@ -338,8 +340,8 @@ piixpm_rescan(device_t self, const char tag->ic_acquire_bus = piixpm_i2c_sb800_acquire_bus; tag->ic_release_bus = piixpm_i2c_sb800_release_bus; } else { - tag->ic_acquire_bus = NULL; - tag->ic_release_bus = NULL; + tag->ic_acquire_bus = piixpm_i2c_sb600_acquire_bus; + tag->ic_release_bus = piixpm_i2c_sb600_release_bus; } tag->ic_exec = piixpm_i2c_exec; memset(&iba, 0, sizeof(iba)); @@ -487,6 +489,28 @@ piixpm_csb5_reset(void *arg) } static int +piixpm_i2c_sb600_acquire_bus(void *cookie, int flags) +{ + struct piixpm_smbus *smbus = cookie; + struct piixpm_softc *sc = smbus->softc; + + if (!cold) + mutex_enter(&sc->sc_i2c_mutex); + + return 0; +} + +static void +piixpm_i2c_sb600_release_bus(void *cookie, int flags) +{ + struct piixpm_smbus *smbus = cookie; + struct piixpm_softc *sc = smbus->softc; + + if (!cold) + mutex_exit(&sc->sc_i2c_mutex); +} + +static int piixpm_i2c_sb800_acquire_bus(void *cookie, int flags) { struct piixpm_smbus *smbus = cookie;