Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2642434pxj; Mon, 14 Jun 2021 03:50:34 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxCpqYsWGsVBWmCBXKJjmKWakUTF7gYNZBlETJ1is6ZDfIKLPF2nVWp7Yn1btxGVANQ5iLZ X-Received: by 2002:a17:906:2892:: with SMTP id o18mr14162634ejd.124.1623667834056; Mon, 14 Jun 2021 03:50:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623667834; cv=none; d=google.com; s=arc-20160816; b=Zy9XM1J5THLhJ/+lEWwumWw55n3XbXvQqMQzsBEseLMcElw9IzPdcUJCXKaF3l7YZN eH4Ikl5JOVShA5pG/0JY2qGS3AKCVAK9vHWeifI7vcwjHi+DdVMcuzcv7ypaoC4KHkAS ONtgAmN9b++7r8aQKrBTRgkZbsI8UNVqIFsngg9Hf4iI9o1zfhnyMIzdv3OgTkE8OTWO oXuRlMkUDHiJCS4iPiupCmqGswn5vRenMsZSiGtHy3pHRSO7cePxWXkvv68MqTLlNNn5 B7sBA7MCu67LPKMrYpsLD+Y1u7g2eAWpoWB3WCAQtxxtmiWjj78KWc7mabzLnAidzOk1 gmRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=m0nEeDMkb2SqYhUur+siCzdBrkZmuhLGZQ40jWuhgL8=; b=mi5TiUsH7znloYbyMRK9zOYLJKK+I4osvbEPtVGFxWmWMHXX1kRsZqDKdfB2Wn2nxu GctT3Dbwwin1VK/b39XmLzpK6UPr2d+0cFDJCSQpCZo9bxc/y+ILF6V3mUwO+q4j/tmG wgkRrp7IZiXkWmuNwYgrEO06F+xgbNawg2Qw2SJshKLKr2mmikPQyTMwMoiKPqesHX4i 5xA7SF2MBAV0WZvT8nT0RBeW8BgnMpn7bOiOms8bH4NVurO3K4aJq9uOSJMxRbZWDa/v Zvq4RTMROZe4vb8CVWFpPPOuuHlC6MHlt9csw7ctfKJzGda0ahDkPpx2mrsj9MUKA5Fe rXFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=XxWEdP6G; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y12si10529332eje.174.2021.06.14.03.50.10; Mon, 14 Jun 2021 03:50:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=XxWEdP6G; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233927AbhFNKuz (ORCPT + 99 others); Mon, 14 Jun 2021 06:50:55 -0400 Received: from mail.kernel.org ([198.145.29.99]:46840 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234042AbhFNKnm (ORCPT ); Mon, 14 Jun 2021 06:43:42 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id AD9D46143E; Mon, 14 Jun 2021 10:36:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1623666964; bh=SuggtihpMsh9fAJvUMIoF5EAElH+Je4DslMuUDnCI9Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XxWEdP6GNce62y3UbyCfKR3CBj1zrpAbuTX8tS/KNHCQenbOWgEglIRc4k9BMpYBg gmEqC0mPSH70/9uxFRE0F509vLxsWn2+vlQ0BcbzAJCwJfQvdfQ7lGbGddcepy1z6r NDPm5MStQMHTvGTFdDYoiUspNwrS3/BdpXE426Qs= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Peter Chen , Jack Pham Subject: [PATCH 4.19 38/67] usb: dwc3: debugfs: Add and remove endpoint dirs dynamically Date: Mon, 14 Jun 2021 12:27:21 +0200 Message-Id: <20210614102645.069216678@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210614102643.797691914@linuxfoundation.org> References: <20210614102643.797691914@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jack Pham commit 8d396bb0a5b62b326f6be7594d8bd46b088296bd upstream. The DWC3 DebugFS directory and files are currently created once during probe. This includes creation of subdirectories for each of the gadget's endpoints. This works fine for peripheral-only controllers, as dwc3_core_init_mode() calls dwc3_gadget_init() just prior to calling dwc3_debugfs_init(). However, for dual-role controllers, dwc3_core_init_mode() will instead call dwc3_drd_init() which is problematic in a few ways. First, the initial state must be determined, then dwc3_set_mode() will have to schedule drd_work and by then dwc3_debugfs_init() could have already been invoked. Even if the initial mode is peripheral, dwc3_gadget_init() happens after the DebugFS files are created, and worse so if the initial state is host and the controller switches to peripheral much later. And secondly, even if the gadget endpoints' debug entries were successfully created, if the controller exits peripheral mode, its dwc3_eps are freed so the debug files would now hold stale references. So it is best if the DebugFS endpoint entries are created and removed dynamically at the same time the underlying dwc3_eps are. Do this by calling dwc3_debugfs_create_endpoint_dir() as each endpoint is created, and conversely remove the DebugFS entry when the endpoint is freed. Fixes: 41ce1456e1db ("usb: dwc3: core: make dwc3_set_mode() work properly") Cc: stable Reviewed-by: Peter Chen Signed-off-by: Jack Pham Link: https://lore.kernel.org/r/20210529192932.22912-1-jackp@codeaurora.org Signed-off-by: Greg Kroah-Hartman --- drivers/usb/dwc3/debug.h | 3 +++ drivers/usb/dwc3/debugfs.c | 21 ++------------------- drivers/usb/dwc3/gadget.c | 3 +++ 3 files changed, 8 insertions(+), 19 deletions(-) --- a/drivers/usb/dwc3/debug.h +++ b/drivers/usb/dwc3/debug.h @@ -653,9 +653,12 @@ static inline const char *dwc3_gadget_ge #ifdef CONFIG_DEBUG_FS +extern void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep); extern void dwc3_debugfs_init(struct dwc3 *); extern void dwc3_debugfs_exit(struct dwc3 *); #else +static inline void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep) +{ } static inline void dwc3_debugfs_init(struct dwc3 *d) { } static inline void dwc3_debugfs_exit(struct dwc3 *d) --- a/drivers/usb/dwc3/debugfs.c +++ b/drivers/usb/dwc3/debugfs.c @@ -725,30 +725,14 @@ static void dwc3_debugfs_create_endpoint } } -static void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep, - struct dentry *parent) +void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep) { struct dentry *dir; - dir = debugfs_create_dir(dep->name, parent); + dir = debugfs_create_dir(dep->name, dep->dwc->root); dwc3_debugfs_create_endpoint_files(dep, dir); } -static void dwc3_debugfs_create_endpoint_dirs(struct dwc3 *dwc, - struct dentry *parent) -{ - int i; - - for (i = 0; i < dwc->num_eps; i++) { - struct dwc3_ep *dep = dwc->eps[i]; - - if (!dep) - continue; - - dwc3_debugfs_create_endpoint_dir(dep, parent); - } -} - void dwc3_debugfs_init(struct dwc3 *dwc) { struct dentry *root; @@ -777,7 +761,6 @@ void dwc3_debugfs_init(struct dwc3 *dwc) &dwc3_testmode_fops); debugfs_create_file("link_state", S_IRUGO | S_IWUSR, root, dwc, &dwc3_link_state_fops); - dwc3_debugfs_create_endpoint_dirs(dwc, root); } } --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2255,6 +2255,8 @@ static int dwc3_gadget_init_endpoint(str INIT_LIST_HEAD(&dep->started_list); INIT_LIST_HEAD(&dep->cancelled_list); + dwc3_debugfs_create_endpoint_dir(dep); + return 0; } @@ -2298,6 +2300,7 @@ static void dwc3_gadget_free_endpoints(s list_del(&dep->endpoint.ep_list); } + debugfs_remove_recursive(debugfs_lookup(dep->name, dwc->root)); kfree(dep); } }