Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3933030imu; Sat, 24 Nov 2018 14:18:15 -0800 (PST) X-Google-Smtp-Source: AFSGD/WUtUDqaAqvy5k5//uBdjdSxs8TN992sR30n9PWltXC9c3Ijg/l+HDaAY7G8JdxZ62FW39b X-Received: by 2002:a63:9b11:: with SMTP id r17mr19302494pgd.416.1543097895597; Sat, 24 Nov 2018 14:18:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543097895; cv=none; d=google.com; s=arc-20160816; b=ufI/4xIAIhm68i+3xDzeBqgxW2sZJv/YgQymBNKvrdR91wgQHM60UdBK+GChlDhdTC GcmbCwjeAuakrxmDtd1nyFrA9/5ArNr9SelBfj/USAkS0fthStlT4W4WuhlFQEjNNX73 guMEyrxxEk4c0GFndMv23jStMrlFCAV3ZOwuAQXhu4hj30mSDoEv/rT397STu/wwigCn NsYSlFhryKynZdLQ2Spu86PdXm+MR5QjAkzkiNbRXqy4H7J6yXry1VXb6j4o+qo5K15z DZou3Xz1zG7cV8vcqRvAOFi4+kdrYKnluq/qqb9A7f4TDdRqYRcaxc9OTTCT718+n43O Fb1A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=yl02TICnz3X7i7mhO5XlljHCe4oEPQ7D/7E4byZhnKo=; b=Gak9KnpvO3h42KuFNvHNfc1PSQlVI2WhDcTKXAX/7s1+aHCyNOO5UWVI5iGLmSjmYt 4HuB0M07gHlfgyfsaRHwTpIP6a9G6B7442uCn1Z9qQ4kRICgbl0B1bLwr9GSa0/Veirg asDeL9AYE0O0ET+Vz/UBZvILwHeho4VF3TpFWVYSt5h/I2fxOvDUJZK/DpBjjg9HOskt oO3JTNvxc0dvJFE088eeDEAXhMUT3lJaMDlE7x7PdeP74wrrc+5xzQPLNV2YdNTlaD9/ r+Tg1K7bn9zy3mi7sr/ENT5ul+koQt8RaSQPiJwwatWxba0gj2uJ3MboY1DqWwMaAgy3 /p4g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=iki.fi Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i11si58123021pgh.406.2018.11.24.14.18.01; Sat, 24 Nov 2018 14:18:15 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=iki.fi Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726825AbeKYJGo (ORCPT + 99 others); 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