Received: by 2002:a05:6358:45e:b0:b5:b6eb:e1f9 with SMTP id 30csp680360rwe; Fri, 26 Aug 2022 12:11:19 -0700 (PDT) X-Google-Smtp-Source: AA6agR5u8y0SX17QHdgB9fEmN1LsPsGUe+UHQazb72doDMKiWIkhWlndA6lESXwGQe3EPyKPuzMy X-Received: by 2002:aa7:d7c1:0:b0:447:d3ec:69cb with SMTP id e1-20020aa7d7c1000000b00447d3ec69cbmr4667907eds.105.1661541079651; Fri, 26 Aug 2022 12:11:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1661541079; cv=none; d=google.com; s=arc-20160816; b=AzLsqtOb9b6PvQjOfVeCKOEAtbh7Chk2OD8wlOuHIwDII34cuj0KZ+69RIRqGO07xP fwxsfC1ki3YbAiPIckTwltucV+mJ2+DRz444ZLrwjF0PxtRVwFQHM3276t6TFl8UqtL3 249lAhhGy+qq9BEb/+ImGj9FKju/hxQvWohfJCdJiHoKUZnAYwvWB5TTDm4oxXQxB715 CZpLtkLHSjXWUuG+WsVsFsPRMdSJmJi207tENVm9HlKBsFL1xZIOEtmudOSq5bImnBZh 2CududReP6GmOc6Q3W0sxUPv0x+oVWI/v/PBhkdWe4yds+qtn8Uyd+vuDQTKa7xDiQEx X0sQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date; bh=F1fsK1tHeLj2R9VgG2vCVvhtkIaFNgoxX7aLvMwhFLc=; b=vS6HjFjqvjBSA7BkMfLOhtmGgb99tDjvM7TXUJX3CyU8yI5hV/KpWm44te/4TA/Ife ++hq6AL9AUMQ8P8Nz9PzIgz5lMQyZbUmHXyl53soCt+FQnscAjFwKs8Z7wE0uanlaUE9 71s6jHIi2IaPCCA2Pdlm/E6TyPVz/lynP2sf0ZYs510VZ/XKx6DON/GxWvVKY/Q7lp6g Xi2Pr1w89Ig6HHE/Cv/OCosEZYAW2yw0fTeiEG0fQglkMJok2p/Iz0FYvFs7n3ccB8gG tX2I3VexXUmpaBL7ZWFf2Fz28k/99M8letNWtsO4XNROnnFfZ7VSJSYvaKQIPzF3rCHs 1UiQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id cb27-20020a0564020b7b00b00446984e6dc2si1618521edb.60.2022.08.26.12.10.53; Fri, 26 Aug 2022 12:11:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231643AbiHZTDA (ORCPT + 99 others); Fri, 26 Aug 2022 15:03:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38380 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231639AbiHZTC6 (ORCPT ); Fri, 26 Aug 2022 15:02:58 -0400 Received: from netrider.rowland.org (netrider.rowland.org [192.131.102.5]) by lindbergh.monkeyblade.net (Postfix) with SMTP id 65FAEA3D09 for ; Fri, 26 Aug 2022 12:02:56 -0700 (PDT) Received: (qmail 47706 invoked by uid 1000); 26 Aug 2022 15:02:55 -0400 Date: Fri, 26 Aug 2022 15:02:55 -0400 From: Alan Stern To: Ray Chi Cc: Greg KH , mathias.nyman@linux.intel.com, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Albert Wang , Badhri Jagan Sridharan , Puma Hsu Subject: Re: [PATCH] usb: core: stop USB enumeration if too many retries Message-ID: References: <20220826075839.292615-1-raychi@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, Aug 27, 2022 at 01:53:45AM +0800, Ray Chi wrote: > On Fri, Aug 26, 2022 at 10:55 PM Alan Stern wrote: > > > > On Fri, Aug 26, 2022 at 03:58:39PM +0800, Ray Chi wrote: > > > If a broken accessory connected to a USB host, usbcore might > > > keep doing enumeration retries and it will take a long time to > > > cause system unstable. > > > > > > This patch provides a quirk to specific USB ports of the hub to > > > stop USB enumeration if needed. > > > > Why only to specific ports? > > The specific port means it is connected to a broken accessory. Then this patch should be about connections to broken accessories, not too many retries. The quirk should make the hub driver permanently ignore the port; whether the power is on or off doesn't matter. Also, you might want to check whether the port connection is fixed rather than hot-unpluggable. If the broken accessory can be unplugged from the port then you don't want to disable the port. > > > Signed-off-by: Ray Chi > > > --- > > > drivers/usb/core/hub.c | 33 +++++++++++++++++++++++++++++++++ > > > include/linux/usb.h | 3 +++ > > > 2 files changed, 36 insertions(+) > > > > > > diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c > > > index 2633acde7ac1..0f4097440ffb 100644 > > > --- a/drivers/usb/core/hub.c > > > +++ b/drivers/usb/core/hub.c > > > @@ -3081,6 +3081,28 @@ static int hub_port_reset(struct usb_hub *hub, int port1, > > > return status; > > > } > > > > > > +/* Stop enumerate if the port met errors and quirk is set */ > > > +static bool hub_port_stop_enumerate(struct usb_hub *hub, int port1, int retries) > > > +{ > > > + struct usb_port *port_dev = hub->ports[port1 - 1]; > > > + struct usb_device *hdev = hub->hdev; > > > + > > > + if (retries < (PORT_INIT_TRIES - 1) / 2) > > > + return false; > > > + > > > + /* > > > + * Some USB hosts can't take a long time to keep doing enumeration > > > + * retry. After doing half of the retries, we would turn off the port > > > + * power to stop enumeration if the quirk is set. > > > + */ > > > + if (port_dev->quirks & USB_PORT_QUIRK_STOP_ENUM) { > > > + usb_hub_set_port_power(hdev, hub, port1, false); > > > > Why turn the port power off? Aren't there better ways to stop the > > enumeration attempts? When will the power ever get turned back on? > > > > Because the broken accessory is still connected to the port. Even if we stop > the enumeration attempts, the port change event will issue a new port > initialization. If you know the accessory is broken then there's no reason to pay attention to the port change events in the first place. You can simply make port_event() avoid calling hub_port_connect_change() if the quirk is set. Alan Stern > The implementation is used for dual-role devices, the port power could > be turned on > when the host mode restarts again. > > > Why not use the initial_descriptor_timeout module parameter for this > > purpose? That's the sort of thing it was meant for. > > > > As I mentioned above, the usbcore driver will keep doing enumeration attempts if > the broken accessory is still connected. It never stops. This is why I > want to turn > off the port to stop enumeration. > > > Alan Stern > > Thanks, > Ray