From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 835B2C43610 for ; Sat, 24 Nov 2018 22:17:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4AEEF20868 for ; Sat, 24 Nov 2018 22:17:19 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4AEEF20868 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=iki.fi Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726841AbeKYJGo (ORCPT ); Sun, 25 Nov 2018 04:06:44 -0500 Received: from emh01.mail.saunalahti.fi ([62.142.5.107]:43964 "EHLO emh01.mail.saunalahti.fi" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726530AbeKYJGm (ORCPT ); Sun, 25 Nov 2018 04:06:42 -0500 Received: from localhost.localdomain (85-76-84-147-nat.elisa-mobile.fi [85.76.84.147]) by emh01.mail.saunalahti.fi (Postfix) with ESMTP id 0B7E1200D0; Sun, 25 Nov 2018 00:17:14 +0200 (EET) From: Aaro Koskinen To: Felipe Balbi , linux-usb@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org, Tony Lindgren , Aaro Koskinen Subject: [PATCH v2 2/5] USB: omap_udc: fix crashes on probe error and module removal Date: Sun, 25 Nov 2018 00:17:05 +0200 Message-Id: <20181124221708.31003-3-aaro.koskinen@iki.fi> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20181124221708.31003-1-aaro.koskinen@iki.fi> References: <20181124221708.31003-1-aaro.koskinen@iki.fi> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We currently crash if usb_add_gadget_udc_release() fails, since the udc->done is not initialized until in the remove function. Furthermore, on module removal the udc data is accessed although the release function is already triggered by usb_del_gadget_udc() early in the function. Fix by rewriting the release and remove functions, basically moving all the cleanup into the release function, and doing the completion only in the module removal case. The patch fixes omap_udc module probe with a failing gadged, and also allows the removal of omap_udc. Tested by running "modprobe omap_udc; modprobe -r omap_udc" in a loop. Signed-off-by: Aaro Koskinen --- drivers/usb/gadget/udc/omap_udc.c | 50 ++++++++++++------------------- 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/drivers/usb/gadget/udc/omap_udc.c b/drivers/usb/gadget/udc/omap_udc.c index 1c77218c82af..240ccba44592 100644 --- a/drivers/usb/gadget/udc/omap_udc.c +++ b/drivers/usb/gadget/udc/omap_udc.c @@ -2593,9 +2593,22 @@ omap_ep_setup(char *name, u8 addr, u8 type, static void omap_udc_release(struct device *dev) { - complete(udc->done); + pullup_disable(udc); + if (!IS_ERR_OR_NULL(udc->transceiver)) { + usb_put_phy(udc->transceiver); + udc->transceiver = NULL; + } + omap_writew(0, UDC_SYSCON1); + remove_proc_file(); + if (udc->dc_clk) { + if (udc->clk_requested) + omap_udc_enable_clock(0); + clk_put(udc->hhc_clk); + clk_put(udc->dc_clk); + } + if (udc->done) + complete(udc->done); kfree(udc); - udc = NULL; } static int @@ -2900,12 +2913,8 @@ static int omap_udc_probe(struct platform_device *pdev) } create_proc_file(); - status = usb_add_gadget_udc_release(&pdev->dev, &udc->gadget, - omap_udc_release); - if (!status) - return 0; - - remove_proc_file(); + return usb_add_gadget_udc_release(&pdev->dev, &udc->gadget, + omap_udc_release); cleanup1: kfree(udc); @@ -2932,36 +2941,15 @@ static int omap_udc_remove(struct platform_device *pdev) { DECLARE_COMPLETION_ONSTACK(done); - if (!udc) - return -ENODEV; - - usb_del_gadget_udc(&udc->gadget); - if (udc->driver) - return -EBUSY; - udc->done = &done; - pullup_disable(udc); - if (!IS_ERR_OR_NULL(udc->transceiver)) { - usb_put_phy(udc->transceiver); - udc->transceiver = NULL; - } - omap_writew(0, UDC_SYSCON1); - - remove_proc_file(); + usb_del_gadget_udc(&udc->gadget); - if (udc->dc_clk) { - if (udc->clk_requested) - omap_udc_enable_clock(0); - clk_put(udc->hhc_clk); - clk_put(udc->dc_clk); - } + wait_for_completion(&done); release_mem_region(pdev->resource[0].start, pdev->resource[0].end - pdev->resource[0].start + 1); - wait_for_completion(&done); - return 0; } -- 2.17.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v2,2/5] USB: omap_udc: fix crashes on probe error and module removal From: Aaro Koskinen Message-Id: <20181124221708.31003-3-aaro.koskinen@iki.fi> Date: Sun, 25 Nov 2018 00:17:05 +0200 To: Felipe Balbi , linux-usb@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org, Tony Lindgren , Aaro Koskinen List-ID: V2UgY3VycmVudGx5IGNyYXNoIGlmIHVzYl9hZGRfZ2FkZ2V0X3VkY19yZWxlYXNlKCkgZmFpbHMs IHNpbmNlIHRoZQp1ZGMtPmRvbmUgaXMgbm90IGluaXRpYWxpemVkIHVudGlsIGluIHRoZSByZW1v dmUgZnVuY3Rpb24uCkZ1cnRoZXJtb3JlLCBvbiBtb2R1bGUgcmVtb3ZhbCB0aGUgdWRjIGRhdGEg aXMgYWNjZXNzZWQgYWx0aG91Z2gKdGhlIHJlbGVhc2UgZnVuY3Rpb24gaXMgYWxyZWFkeSB0cmln Z2VyZWQgYnkgdXNiX2RlbF9nYWRnZXRfdWRjKCkKZWFybHkgaW4gdGhlIGZ1bmN0aW9uLgoKRml4 IGJ5IHJld3JpdGluZyB0aGUgcmVsZWFzZSBhbmQgcmVtb3ZlIGZ1bmN0aW9ucywgYmFzaWNhbGx5 IG1vdmluZwphbGwgdGhlIGNsZWFudXAgaW50byB0aGUgcmVsZWFzZSBmdW5jdGlvbiwgYW5kIGRv aW5nIHRoZSBjb21wbGV0aW9uCm9ubHkgaW4gdGhlIG1vZHVsZSByZW1vdmFsIGNhc2UuCgpUaGUg cGF0Y2ggZml4ZXMgb21hcF91ZGMgbW9kdWxlIHByb2JlIHdpdGggYSBmYWlsaW5nIGdhZGdlZCwg YW5kIGFsc28KYWxsb3dzIHRoZSByZW1vdmFsIG9mIG9tYXBfdWRjLiBUZXN0ZWQgYnkgcnVubmlu ZyAibW9kcHJvYmUgb21hcF91ZGM7Cm1vZHByb2JlIC1yIG9tYXBfdWRjIiBpbiBhIGxvb3AuCgpT aWduZWQtb2ZmLWJ5OiBBYXJvIEtvc2tpbmVuIDxhYXJvLmtvc2tpbmVuQGlraS5maT4KLS0tCiBk cml2ZXJzL3VzYi9nYWRnZXQvdWRjL29tYXBfdWRjLmMgfCA1MCArKysrKysrKysrKystLS0tLS0t LS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMTkgaW5zZXJ0aW9ucygrKSwgMzEgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9vbWFwX3VkYy5jIGIv ZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9vbWFwX3VkYy5jCmluZGV4IDFjNzcyMThjODJhZi4uMjQw Y2NiYTQ0NTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL29tYXBfdWRjLmMK KysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9vbWFwX3VkYy5jCkBAIC0yNTkzLDkgKzI1OTMs MjIgQEAgb21hcF9lcF9zZXR1cChjaGFyICpuYW1lLCB1OCBhZGRyLCB1OCB0eXBlLAogCiBzdGF0 aWMgdm9pZCBvbWFwX3VkY19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQljb21wbGV0 ZSh1ZGMtPmRvbmUpOworCXB1bGx1cF9kaXNhYmxlKHVkYyk7CisJaWYgKCFJU19FUlJfT1JfTlVM TCh1ZGMtPnRyYW5zY2VpdmVyKSkgeworCQl1c2JfcHV0X3BoeSh1ZGMtPnRyYW5zY2VpdmVyKTsK KwkJdWRjLT50cmFuc2NlaXZlciA9IE5VTEw7CisJfQorCW9tYXBfd3JpdGV3KDAsIFVEQ19TWVND T04xKTsKKwlyZW1vdmVfcHJvY19maWxlKCk7CisJaWYgKHVkYy0+ZGNfY2xrKSB7CisJCWlmICh1 ZGMtPmNsa19yZXF1ZXN0ZWQpCisJCQlvbWFwX3VkY19lbmFibGVfY2xvY2soMCk7CisJCWNsa19w dXQodWRjLT5oaGNfY2xrKTsKKwkJY2xrX3B1dCh1ZGMtPmRjX2Nsayk7CisJfQorCWlmICh1ZGMt PmRvbmUpCisJCWNvbXBsZXRlKHVkYy0+ZG9uZSk7CiAJa2ZyZWUodWRjKTsKLQl1ZGMgPSBOVUxM OwogfQogCiBzdGF0aWMgaW50CkBAIC0yOTAwLDEyICsyOTEzLDggQEAgc3RhdGljIGludCBvbWFw X3VkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCX0KIAogCWNyZWF0ZV9w cm9jX2ZpbGUoKTsKLQlzdGF0dXMgPSB1c2JfYWRkX2dhZGdldF91ZGNfcmVsZWFzZSgmcGRldi0+ ZGV2LCAmdWRjLT5nYWRnZXQsCi0JCQlvbWFwX3VkY19yZWxlYXNlKTsKLQlpZiAoIXN0YXR1cykK LQkJcmV0dXJuIDA7Ci0KLQlyZW1vdmVfcHJvY19maWxlKCk7CisJcmV0dXJuIHVzYl9hZGRfZ2Fk Z2V0X3VkY19yZWxlYXNlKCZwZGV2LT5kZXYsICZ1ZGMtPmdhZGdldCwKKwkJCQkJICBvbWFwX3Vk Y19yZWxlYXNlKTsKIAogY2xlYW51cDE6CiAJa2ZyZWUodWRjKTsKQEAgLTI5MzIsMzYgKzI5NDEs MTUgQEAgc3RhdGljIGludCBvbWFwX3VkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikKIHsKIAlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhkb25lKTsKIAotCWlmICghdWRj KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXVzYl9kZWxfZ2FkZ2V0X3VkYygmdWRjLT5nYWRnZXQp OwotCWlmICh1ZGMtPmRyaXZlcikKLQkJcmV0dXJuIC1FQlVTWTsKLQogCXVkYy0+ZG9uZSA9ICZk b25lOwogCi0JcHVsbHVwX2Rpc2FibGUodWRjKTsKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKHVkYy0+ dHJhbnNjZWl2ZXIpKSB7Ci0JCXVzYl9wdXRfcGh5KHVkYy0+dHJhbnNjZWl2ZXIpOwotCQl1ZGMt PnRyYW5zY2VpdmVyID0gTlVMTDsKLQl9Ci0Jb21hcF93cml0ZXcoMCwgVURDX1NZU0NPTjEpOwot Ci0JcmVtb3ZlX3Byb2NfZmlsZSgpOworCXVzYl9kZWxfZ2FkZ2V0X3VkYygmdWRjLT5nYWRnZXQp OwogCi0JaWYgKHVkYy0+ZGNfY2xrKSB7Ci0JCWlmICh1ZGMtPmNsa19yZXF1ZXN0ZWQpCi0JCQlv bWFwX3VkY19lbmFibGVfY2xvY2soMCk7Ci0JCWNsa19wdXQodWRjLT5oaGNfY2xrKTsKLQkJY2xr X3B1dCh1ZGMtPmRjX2Nsayk7Ci0JfQorCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRvbmUpOwogCiAJ cmVsZWFzZV9tZW1fcmVnaW9uKHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0LAogCQkJcGRldi0+cmVz b3VyY2VbMF0uZW5kIC0gcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQgKyAxKTsKIAotCXdhaXRfZm9y X2NvbXBsZXRpb24oJmRvbmUpOwotCiAJcmV0dXJuIDA7CiB9CiAK