From nobody Wed May 25 08:05:08 2022 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 535C11B420A8; Wed, 25 May 2022 08:05:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4L7NsJ1rhBz3qXY; Wed, 25 May 2022 08:05:08 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1653465908; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=+2S7heFiYx4AoPLSIao2eNKYvMZJ8sCsBEBSstnM+Bc=; b=o511tn++A9RmziQy7bxvkbs02k94GJOiOx9evY7X3ekvvnXhkBAaziPfxPSR4JE/QCbaAG l/G1eUdU4SRl0leVl+RJwa6ZC20g+DusTmGrjLTtrgjP6dQIuxJLbXuEGXYOSZ8bBr2y6m i5AmgmtHeM34PZQng1fe4EfJFWrTIhhtVGSks1GcNflNZD7n/HxP64iDCtg+ILb6jNMkxb wtKaWPayOmGqCaRUtydS0dJRBp827G6e63ZDzpiTdFCVcQ8ch2s5EGo/lFX2WgcNhMJiqc Qp0Gv6rW7Oh4Omkh/ob/1Glr5jtjqAP/BL47dDcBBsSW0xT1MeVtzM1K9EI6eg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 1FCDE158B6; Wed, 25 May 2022 08:05:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 24P858kq039213; Wed, 25 May 2022 08:05:08 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 24P8585J039212; Wed, 25 May 2022 08:05:08 GMT (envelope-from git) Date: Wed, 25 May 2022 08:05:08 GMT Message-Id: <202205250805.24P8585J039212@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Emmanuel Vadot Subject: git: 25d21a845223 - main - linuxkpi: Rework detach function List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: manu X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 25d21a845223ffad189fd2a7831ebf5e298b628a Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1653465908; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=+2S7heFiYx4AoPLSIao2eNKYvMZJ8sCsBEBSstnM+Bc=; b=C+CFjYn/8fN62kfrJokcMfenGbXYUSpZNxtI75nEKPtoQNhQsRx3TVsVUWLQyJJ+1B7UZ6 6u7FLYXS8+AB+hbMO0iS6i0Hhk+ewoldMnmamtyq1CjWx3ekG/GdsK9ilBGhDzp0XqgLM/ kH9XFzNOckFhXeLRX64Cokylw+53nM4/fV3q4F7z3nayoR6KUguD7aaC+d+oZZJLx2gMif vSLoVC0Nf9lRBRQlX0t7O75FiYQvtvFJnVRVuZLO8iqm4R8cWC2ivdHGe9UCugANmMESMF FArQ4at0Npjb0xfH5mHwiDeQzCmsCTn7u4qJCNOqhg+l3MXugetp8oCKQO16bA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1653465908; a=rsa-sha256; cv=none; b=f4C3vK7bhXr8S2QJePWt3ZtOR8Dipr1Z2PEbg5j7tdsXsjCBAhDliYV12hK5AjwoQdUvKL tYF/HVOLho/w5EC/X0cbPvvvCLGjOSaCPXzvbPLx/2cmesgxfnqX0T39kGL+r/Ya413tE0 S+7i2k6qKMs5xJcWjI77Vx2fs7LxQ7rSAIe+pcSPEImnqn+djAbmknxldWRy3n0ToWDlMi nVSCsEld387nXCIOFOXPUutb5/JHQdrvsdBNezr6hsqZxcPK67qlCrBD3w1EN5m8qzNMpv TKNepqMGGgeYOtjsne+i8cPGhW0VYJvd2gKilCztclfr9DYk9zai9X/TAc4olA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by manu: URL: https://cgit.FreeBSD.org/src/commit/?id=25d21a845223ffad189fd2a7831ebf5e298b628a commit 25d21a845223ffad189fd2a7831ebf5e298b628a Author: Emmanuel Vadot AuthorDate: 2022-05-13 11:56:36 +0000 Commit: Emmanuel Vadot CommitDate: 2022-05-25 07:57:10 +0000 linuxkpi: Rework detach function We need to detach the matching i2c adapter so look for the right one. While here add some locks to protect multiple add/del at the same time. Fixes: 1961a14a47 ("linuxkpi: Add i2c support") Sponsored by: Beckhoff Automation GmbH & Co. KG --- sys/compat/linuxkpi/common/src/linux_i2c.c | 70 ++++++++++++++++++++++++---- sys/compat/linuxkpi/common/src/linux_i2cbb.c | 10 ++++ sys/compat/linuxkpi/common/src/lkpi_iic_if.m | 4 ++ 3 files changed, 76 insertions(+), 8 deletions(-) diff --git a/sys/compat/linuxkpi/common/src/linux_i2c.c b/sys/compat/linuxkpi/common/src/linux_i2c.c index 2b19aec8ad16..c2c4977eb9ba 100644 --- a/sys/compat/linuxkpi/common/src/linux_i2c.c +++ b/sys/compat/linuxkpi/common/src/linux_i2c.c @@ -53,6 +53,27 @@ struct lkpi_iic_softc { struct i2c_adapter *adapter; }; +static struct sx lkpi_sx_i2c; + +static void +lkpi_sysinit_i2c(void *arg __unused) +{ + + sx_init(&lkpi_sx_i2c, "lkpi-i2c"); +} + +static void +lkpi_sysuninit_i2c(void *arg __unused) +{ + + sx_destroy(&lkpi_sx_i2c); +} + +SYSINIT(lkpi_i2c, SI_SUB_DRIVERS, SI_ORDER_ANY, + lkpi_sysinit_i2c, NULL); +SYSUNINIT(lkpi_i2c, SI_SUB_DRIVERS, SI_ORDER_ANY, + lkpi_sysuninit_i2c, NULL); + static int lkpi_iic_probe(device_t dev) { @@ -98,6 +119,15 @@ lkpi_iic_add_adapter(device_t dev, struct i2c_adapter *adapter) return (0); } +static struct i2c_adapter * +lkpi_iic_get_adapter(device_t dev) +{ + struct lkpi_iic_softc *sc; + + sc = device_get_softc(dev); + return (sc->adapter); +} + static device_method_t lkpi_iic_methods[] = { /* device interface */ DEVMETHOD(device_probe, lkpi_iic_probe), @@ -113,6 +143,7 @@ static device_method_t lkpi_iic_methods[] = { /* lkpi_iic interface */ DEVMETHOD(lkpi_iic_add_adapter, lkpi_iic_add_adapter), + DEVMETHOD(lkpi_iic_get_adapter, lkpi_iic_get_adapter), DEVMETHOD_END }; @@ -177,12 +208,16 @@ lkpi_i2c_add_adapter(struct i2c_adapter *adapter) device_t lkpi_iic; int error; + if (adapter->name[0] == '\0') + return (-EINVAL); if (bootverbose) device_printf(adapter->dev.parent->bsddev, "Adding i2c adapter %s\n", adapter->name); + sx_xlock(&lkpi_sx_i2c); lkpi_iic = device_add_child(adapter->dev.parent->bsddev, "lkpi_iic", -1); if (lkpi_iic == NULL) { device_printf(adapter->dev.parent->bsddev, "Couldn't add lkpi_iic\n"); + sx_xunlock(&lkpi_sx_i2c); return (ENXIO); } @@ -190,9 +225,11 @@ lkpi_i2c_add_adapter(struct i2c_adapter *adapter) if (error) { device_printf(adapter->dev.parent->bsddev, "failed to attach child: error %d\n", error); + sx_xunlock(&lkpi_sx_i2c); return (ENXIO); } LKPI_IIC_ADD_ADAPTER(lkpi_iic, adapter); + sx_xunlock(&lkpi_sx_i2c); return (0); } @@ -200,18 +237,35 @@ int lkpi_i2c_del_adapter(struct i2c_adapter *adapter) { device_t child; + int unit, rv; + if (adapter == NULL) + return (-EINVAL); if (bootverbose) device_printf(adapter->dev.parent->bsddev, "Removing i2c adapter %s\n", adapter->name); + sx_xlock(&lkpi_sx_i2c); + unit = 0; + while ((child = device_find_child(adapter->dev.parent->bsddev, "lkpi_iic", unit++)) != NULL) { + + if (adapter == LKPI_IIC_GET_ADAPTER(child)) { + device_delete_child(adapter->dev.parent->bsddev, child); + rv = 0; + goto out; + } + } - child = device_find_child(adapter->dev.parent->bsddev, "lkpi_iic", -1); - if (child != NULL) - device_delete_child(adapter->dev.parent->bsddev, child); - - child = device_find_child(adapter->dev.parent->bsddev, "lkpi_iicbb", -1); - if (child != NULL) - device_delete_child(adapter->dev.parent->bsddev, child); + unit = 0; + while ((child = device_find_child(adapter->dev.parent->bsddev, "lkpi_iicbb", unit++)) != NULL) { - return (0); + if (adapter == LKPI_IIC_GET_ADAPTER(child)) { + device_delete_child(adapter->dev.parent->bsddev, child); + rv = 0; + goto out; + } + } + rv = -EINVAL; +out: + sx_xunlock(&lkpi_sx_i2c); + return (rv); } diff --git a/sys/compat/linuxkpi/common/src/linux_i2cbb.c b/sys/compat/linuxkpi/common/src/linux_i2cbb.c index 47756a25db3f..c4bfdf32e562 100644 --- a/sys/compat/linuxkpi/common/src/linux_i2cbb.c +++ b/sys/compat/linuxkpi/common/src/linux_i2cbb.c @@ -100,6 +100,15 @@ lkpi_iicbb_add_adapter(device_t dev, struct i2c_adapter *adapter) return (0); } +static struct i2c_adapter * +lkpi_iicbb_get_adapter(device_t dev) +{ + struct lkpi_iicbb_softc *sc; + + sc = device_get_softc(dev); + return (sc->adapter); +} + static device_method_t lkpi_iicbb_methods[] = { /* device interface */ DEVMETHOD(device_probe, lkpi_iicbb_probe), @@ -117,6 +126,7 @@ static device_method_t lkpi_iicbb_methods[] = { /* lkpi_iicbb interface */ DEVMETHOD(lkpi_iic_add_adapter, lkpi_iicbb_add_adapter), + DEVMETHOD(lkpi_iic_get_adapter, lkpi_iicbb_get_adapter), DEVMETHOD_END }; diff --git a/sys/compat/linuxkpi/common/src/lkpi_iic_if.m b/sys/compat/linuxkpi/common/src/lkpi_iic_if.m index 2379182c409b..c1b4abd79084 100644 --- a/sys/compat/linuxkpi/common/src/lkpi_iic_if.m +++ b/sys/compat/linuxkpi/common/src/lkpi_iic_if.m @@ -35,3 +35,7 @@ METHOD int add_adapter { device_t dev; struct i2c_adapter *adapter; }; + +METHOD struct i2c_adapter * get_adapter { + device_t dev; +};