Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752653AbdG1Sdo (ORCPT ); Fri, 28 Jul 2017 14:33:44 -0400 Received: from netrider.rowland.org ([192.131.102.5]:42651 "HELO netrider.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1752450AbdG1Sdn (ORCPT ); Fri, 28 Jul 2017 14:33:43 -0400 Date: Fri, 28 Jul 2017 14:33:42 -0400 (EDT) From: Alan Stern X-X-Sender: stern@netrider.rowland.org To: Zdenek Kabelac cc: USB list , LKML , , , Subject: Re: USB disk speed regression WD Elements - with bisect result 22547c4cc4fe20698a6a85a55b8788859134b8e4 In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1671 Lines: 51 On Thu, 27 Jul 2017, Zdenek Kabelac wrote: > > Zdenek, you check this explanation by commenting out these last two > > lines at the end of hub_port_connect() in drivers/usb/core/hub.c: > > > > if (hcd->driver->relinquish_port && !hub->hdev->parent) > > hcd->driver->relinquish_port(hcd, port1); > > > > That should prevent the connection from being handed over to the UHCI > > companion, allowing the device to operate at high speed. > > > > Hi > > Yep - seems this helped - I've dropped revert and commented those 2 lines > and I've used the very same kernel - and speed was all good: > > usb 2-2: new high-speed USB device number 2 using ehci-pci > usb 2-2: new high-speed USB device number 3 using ehci-pci > usb 2-2: New USB device found, idVendor=1058, idProduct=10a8 > usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 > > > So while I'm not sure if this is final fix for USB - this solution surely > solved my WD Element disk attachment issue. Great! Here's a real patch to test; I think this will be acceptable if it fixes your problem. Alan Stern Index: usb-4.x/drivers/usb/core/hub.c =================================================================== --- usb-4.x.orig/drivers/usb/core/hub.c +++ usb-4.x/drivers/usb/core/hub.c @@ -4934,9 +4934,10 @@ loop: done: hub_port_disable(hub, port1, 1); - if (hcd->driver->relinquish_port && !hub->hdev->parent) - hcd->driver->relinquish_port(hcd, port1); - + if (hcd->driver->relinquish_port && !hub->hdev->parent) { + if (status != -ENOTCONN && status != -ENODEV) + hcd->driver->relinquish_port(hcd, port1); + } } /* Handle physical or logical connection change events.