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: [RFT,1/2] xhci: Fix leaking USB3 shared_hcd at xhci removal From: Jack Pham Message-Id: <20180928181212.GD17520@jackp-linux.qualcomm.com> Date: Fri, 28 Sep 2018 11:12:12 -0700 To: Mathias Nyman Cc: peter.chen@nxp.com, linux-imx@nxp.com, linux-usb@vger.kernel.org, jun.li@nxp.com, joel@jms.id.au, mrana@codeaurora.org, Chunfeng Yun , Thierry Reding , Jianguo Sun , stable@vger.kernel.org List-ID: T24gVGh1LCBTZXAgMjcsIDIwMTggYXQgMDc6MjY6MjZQTSArMDMwMCwgTWF0aGlhcyBOeW1hbiB3 cm90ZToKPiBFbnN1cmUgdGhhdCB0aGUgc2hhcmVkX2hjZCBwb2ludGVyIGlzIHZhbGlkIHdoZW4g Y2FsbGluZyB1c2JfcHV0X2hjZCgpCj4gCj4gVGhlIHNoYXJlZF9oY2QgaXMgcmVtb3ZlZCBhbmQg ZnJlZWQgaW4geGhjaSBieSBmaXJzdCBjYWxsaW5nCj4gdXNiX3JlbW92ZV9oY2QoeGhjaS0+c2hh cmVkX2hjZCksIGFuZCBsYXRlcgo+IHVzYl9wdXRfaGNkKHhoY2ktPnNoYXJlZF9oY2QpCj4gCj4g QWZlciBjb21taXQgZmUxOTBlZDBkNjAyICgieGhjaTogRG8gbm90IGhhbHQgdGhlIGhvc3QgdW50 aWwgYm90aCBIQ0QgaGF2ZQo+IGRpc2Nvbm5lY3RlZCB0aGVpciBkZXZpY2VzLiIpIHRoZSBzaGFy ZWRfaGNkIHdhcyBuZXZlciBwcm9wZXJseSBwdXQgYXMKPiB4aGNpLT5zaGFyZWRfaGNkIHdhcyBz ZXQgdG8gTlVMTCBiZWZvcmUgdXNiX3B1dF9oY2QoeGhjaS0+c2hhcmVkX2hjZCkgd2FzCj4gY2Fs bGVkLgo+IAo+IHNoYXJlZF9oY2QgKFVTQjMpIGlzIHJlbW92ZWQgYmVmb3JlIHByaW1hcnkgaGNk IChVU0IyKS4KPiBXaGlsZSByZW1vdmluZyB0aGUgcHJpbWFyeSBoY2Qgd2UgbWlnaHQgbmVlZCB0 byBoYW5kbGUgeGhjaSBpbnRlcnJ1cHRzCj4gdG8gY2xlYW5seSByZW1vdmUgbGFzdCBVU0IyIGRl dmljZXMsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIHNldAo+IHhoY2ktPnNoYXJlZF9oY2QgdG8gTlVM TCBiZWZvcmUgcmVtb3ZpbmcgdGhlIHByaW1hcnkgaGNkIHRvIGxldCB4aGNpCj4gaW50ZXJydXB0 IGhhbmRsZXIga25vdyBzaGFyZWRfaGNkIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCj4gCj4geGhj aS1wbGF0LmMsIHhoY2ktaGlzdGIuYyBhbmQgeGhjaS1tdGsgZmlyc3QgY3JlYXRlIGJvdGggdGhl aXIgaGNkJ3MgYmVmb3JlCj4gYWRkaW5nIHRoZW0uIHNvIHRvIGtlZXAgdGhlIGNvcnJlY3QgcmV2 ZXJzZSByZW1vdmFsIG9yZGVyIHVzZSBhIHRlbXBvcmFyeQo+IHNoYXJlZF9oY2QgdmFyaWFibGUg Zm9yIHRoZW0uCj4gRm9yIG1vcmUgZGV0YWlscyBzZWUgY29tbWl0IDRhYzUzMDg3ZDZkNCAoInVz YjogeGhjaTogcGxhdDogQ3JlYXRlIGJvdGgKPiBIQ0RzIGJlZm9yZSBhZGRpbmcgdGhlbSIpCj4g Cj4gRml4ZXM6IGZlMTkwZWQwZDYwMiAoInhoY2k6IERvIG5vdCBoYWx0IHRoZSBob3N0IHVudGls IGJvdGggSENEIGhhdmUgZGlzY29ubmVjdGVkIHRoZWlyIGRldmljZXMuIikKPiBDYzogSm9lbCBT dGFubGV5IDxqb2VsQGptcy5pZC5hdT4KPiBDYzogQ2h1bmZlbmcgWXVuIDxjaHVuZmVuZy55dW5A bWVkaWF0ZWsuY29tPgo+IENjOiBUaGllcnJ5IFJlZGluZyA8dHJlZGluZ0BudmlkaWEuY29tPgo+ IENjOiBKaWFuZ3VvIFN1biA8c3Vuamlhbmd1bzFAaHVhd2VpLmNvbT4KPiBDYzogPHN0YWJsZUB2 Z2VyLmtlcm5lbC5vcmc+Cj4gUmVwb3J0ZWQtYnk6IEphY2sgUGhhbSA8amFja3BAY29kZWF1cm9y YS5vcmc+Cj4gU2lnbmVkLW9mZi1ieTogTWF0aGlhcyBOeW1hbiA8bWF0aGlhcy5ueW1hbkBsaW51 eC5pbnRlbC5jb20+Cj4gLS0tCj4gIGRyaXZlcnMvdXNiL2hvc3QveGhjaS1oaXN0Yi5jIHwgNiAr KysrLS0KPiAgZHJpdmVycy91c2IvaG9zdC94aGNpLW10ay5jICAgfCA2ICsrKystLQo+ICBkcml2 ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMgICB8IDEgKwo+ICBkcml2ZXJzL3VzYi9ob3N0L3hoY2kt cGxhdC5jICB8IDYgKysrKy0tCj4gIGRyaXZlcnMvdXNiL2hvc3QveGhjaS10ZWdyYS5jIHwgMSAr Cj4gIGRyaXZlcnMvdXNiL2hvc3QveGhjaS5jICAgICAgIHwgMiAtLQo+ICA2IGZpbGVzIGNoYW5n ZWQsIDE0IGluc2VydGlvbnMoKyksIDggZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdXNiL2hvc3QveGhjaS1oaXN0Yi5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWhpc3Ri LmMKPiBpbmRleCAyN2YwMDE2Li4zYzRhYmI1IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvdXNiL2hv c3QveGhjaS1oaXN0Yi5jCj4gKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWhpc3RiLmMKPiBA QCAtMzI1LDE0ICszMjUsMTYgQEAgc3RhdGljIGludCB4aGNpX2hpc3RiX3JlbW92ZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpkZXYpCj4gIAlzdHJ1Y3QgeGhjaV9oY2RfaGlzdGIgKmhpc3RiID0g cGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKPiAgCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBoaXN0 Yi0+aGNkOwo+ICAJc3RydWN0IHhoY2lfaGNkCSp4aGNpID0gaGNkX3RvX3hoY2koaGNkKTsKPiAr CXN0cnVjdCB1c2JfaGNkICpzaGFyZWRfaGNkID0geGhjaS0+c2hhcmVkX2hjZDsKPiAgCj4gIAl4 aGNpLT54aGNfc3RhdGUgfD0gWEhDSV9TVEFURV9SRU1PVklORzsKPiAgCj4gLQl1c2JfcmVtb3Zl X2hjZCh4aGNpLT5zaGFyZWRfaGNkKTsKPiArCXVzYl9yZW1vdmVfaGNkKHNoYXJlZF9oY2QpOwo+ ICsJeGhjaS0+c2hhcmVkX2hjZCA9IE5VTEw7Cj4gIAlkZXZpY2Vfd2FrZXVwX2Rpc2FibGUoJmRl di0+ZGV2KTsKPiAgCj4gIAl1c2JfcmVtb3ZlX2hjZChoY2QpOwo+IC0JdXNiX3B1dF9oY2QoeGhj aS0+c2hhcmVkX2hjZCk7Cj4gKwl1c2JfcHV0X2hjZChzaGFyZWRfaGNkKTsKPiAgCj4gIAl4aGNp X2hpc3RiX2hvc3RfZGlzYWJsZShoaXN0Yik7Cj4gIAl1c2JfcHV0X2hjZChoY2QpOwo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbXRrLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3ho Y2ktbXRrLmMKPiBpbmRleCA3MWQwZDMzLi42MDk4N2M3IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv dXNiL2hvc3QveGhjaS1tdGsuYwo+ICsrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tdGsuYwo+ IEBAIC01OTAsMTIgKzU5MCwxNCBAQCBzdGF0aWMgaW50IHhoY2lfbXRrX3JlbW92ZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpkZXYpCj4gIAlzdHJ1Y3QgeGhjaV9oY2RfbXRrICptdGsgPSBwbGF0 Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwo+ICAJc3RydWN0IHVzYl9oY2QJKmhjZCA9IG10ay0+aGNk Owo+ICAJc3RydWN0IHhoY2lfaGNkCSp4aGNpID0gaGNkX3RvX3hoY2koaGNkKTsKPiArCXN0cnVj dCB1c2JfaGNkICAqc2hhcmVkX2hjZCA9IHhoY2ktPnNoYXJlZF9oY2Q7Cj4gIAo+IC0JdXNiX3Jl bW92ZV9oY2QoeGhjaS0+c2hhcmVkX2hjZCk7Cj4gKwl1c2JfcmVtb3ZlX2hjZChzaGFyZWRfaGNk KTsKPiArCXhoY2ktPnNoYXJlZF9oY2QgPSBOVUxMOwo+ICAJZGV2aWNlX2luaXRfd2FrZXVwKCZk ZXYtPmRldiwgZmFsc2UpOwo+ICAKPiAgCXVzYl9yZW1vdmVfaGNkKGhjZCk7Cj4gLQl1c2JfcHV0 X2hjZCh4aGNpLT5zaGFyZWRfaGNkKTsKPiArCXVzYl9wdXRfaGNkKHNoYXJlZF9oY2QpOwo+ICAJ dXNiX3B1dF9oY2QoaGNkKTsKPiAgCXhoY2lfbXRrX3NjaF9leGl0KG10ayk7Cj4gIAl4aGNpX210 a19jbGtzX2Rpc2FibGUobXRrKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNp LXBjaS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCj4gaW5kZXggNTFkZDhlMC4uOTJm ZDZiNiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKPiArKysgYi9k cml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKPiBAQCAtMzU2LDYgKzM1Niw3IEBAIHN0YXRpYyB2 b2lkIHhoY2lfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQo+ICAJaWYgKHhoY2ktPnNo YXJlZF9oY2QpIHsKPiAgCQl1c2JfcmVtb3ZlX2hjZCh4aGNpLT5zaGFyZWRfaGNkKTsKPiAgCQl1 c2JfcHV0X2hjZCh4aGNpLT5zaGFyZWRfaGNkKTsKPiArCQl4aGNpLT5zaGFyZWRfaGNkID0gTlVM TDsKPiAgCX0KPiAgCj4gIAkvKiBXb3JrYXJvdW5kIGZvciBzcHVyaW91cyB3YWtldXBzIGF0IHNo dXRkb3duIHdpdGggSFNXICovCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1w bGF0LmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGxhdC5jCj4gaW5kZXggOTRlOTM5Mi4uZTVk YThjZSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGxhdC5jCj4gKysrIGIv ZHJpdmVycy91c2IvaG9zdC94aGNpLXBsYXQuYwo+IEBAIC0zNTksMTQgKzM1OSwxNiBAQCBzdGF0 aWMgaW50IHhoY2lfcGxhdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQo+ICAJ c3RydWN0IHhoY2lfaGNkCSp4aGNpID0gaGNkX3RvX3hoY2koaGNkKTsKPiAgCXN0cnVjdCBjbGsg KmNsayA9IHhoY2ktPmNsazsKPiAgCXN0cnVjdCBjbGsgKnJlZ19jbGsgPSB4aGNpLT5yZWdfY2xr Owo+ICsJc3RydWN0IHVzYl9oY2QgKnNoYXJlZF9oY2QgPSB4aGNpLT5zaGFyZWRfaGNkOwo+ICAK PiAgCXhoY2ktPnhoY19zdGF0ZSB8PSBYSENJX1NUQVRFX1JFTU9WSU5HOwo+ICAKPiAtCXVzYl9y ZW1vdmVfaGNkKHhoY2ktPnNoYXJlZF9oY2QpOwo+ICsJdXNiX3JlbW92ZV9oY2Qoc2hhcmVkX2hj ZCk7Cj4gKwl4aGNpLT5zaGFyZWRfaGNkID0gTlVMTDsKPiAgCXVzYl9waHlfc2h1dGRvd24oaGNk LT51c2JfcGh5KTsKPiAgCj4gIAl1c2JfcmVtb3ZlX2hjZChoY2QpOwo+IC0JdXNiX3B1dF9oY2Qo eGhjaS0+c2hhcmVkX2hjZCk7Cj4gKwl1c2JfcHV0X2hjZChzaGFyZWRfaGNkKTsKPiAgCj4gIAlj bGtfZGlzYWJsZV91bnByZXBhcmUoY2xrKTsKPiAgCWNsa19kaXNhYmxlX3VucHJlcGFyZShyZWdf Y2xrKTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXRlZ3JhLmMgYi9kcml2 ZXJzL3VzYi9ob3N0L3hoY2ktdGVncmEuYwo+IGluZGV4IDRiNDYzZTUuLmIxY2NlOTggMTAwNjQ0 Cj4gLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXRlZ3JhLmMKPiArKysgYi9kcml2ZXJzL3Vz Yi9ob3N0L3hoY2ktdGVncmEuYwo+IEBAIC0xMjQwLDYgKzEyNDAsNyBAQCBzdGF0aWMgaW50IHRl Z3JhX3h1c2JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gIAo+ICAJdXNi X3JlbW92ZV9oY2QoeGhjaS0+c2hhcmVkX2hjZCk7Cj4gIAl1c2JfcHV0X2hjZCh4aGNpLT5zaGFy ZWRfaGNkKTsKPiArCXhoY2ktPnNoYXJlZF9oY2QgPSBOVUxMOwo+ICAJdXNiX3JlbW92ZV9oY2Qo dGVncmEtPmhjZCk7Cj4gIAl1c2JfcHV0X2hjZCh0ZWdyYS0+aGNkKTsKPiAgCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKPiBp bmRleCAwNDIwZWVmLi5jOTI4ZGJiIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhj aS5jCj4gKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKPiBAQCAtNzE5LDggKzcxOSw2IEBA IHN0YXRpYyB2b2lkIHhoY2lfc3RvcChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQo+ICAKPiAgCS8qIE9u bHkgaGFsdCBob3N0IGFuZCBmcmVlIG1lbW9yeSBhZnRlciBib3RoIGhjZHMgYXJlIHJlbW92ZWQg Ki8KPiAgCWlmICghdXNiX2hjZF9pc19wcmltYXJ5X2hjZChoY2QpKSB7Cj4gLQkJLyogdXNiIGNv cmUgd2lsbCBmcmVlIHRoaXMgaGNkIHNob3J0bHksIHVuc2V0IHBvaW50ZXIgKi8KPiAtCQl4aGNp LT5zaGFyZWRfaGNkID0gTlVMTDsKPiAgCQltdXRleF91bmxvY2soJnhoY2ktPm11dGV4KTsKPiAg CQlyZXR1cm47Cj4gIAl9CgpUZXN0ZWQtYnk6IEphY2sgUGhhbSA8amFja3BAY29kZWF1cm9yYS5v cmc+Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.codeaurora.org ([198.145.29.96]:57806 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726165AbeI2AhZ (ORCPT ); Fri, 28 Sep 2018 20:37:25 -0400 Date: Fri, 28 Sep 2018 11:12:12 -0700 From: Jack Pham To: Mathias Nyman Cc: peter.chen@nxp.com, linux-imx@nxp.com, linux-usb@vger.kernel.org, jun.li@nxp.com, joel@jms.id.au, mrana@codeaurora.org, Chunfeng Yun , Thierry Reding , Jianguo Sun , stable@vger.kernel.org Subject: Re: [RFT PATCH 1/2] xhci: Fix leaking USB3 shared_hcd at xhci removal Message-ID: <20180928181212.GD17520@jackp-linux.qualcomm.com> References: <20180927013948.GB17520@jackp-linux.qualcomm.com> <1538065587-22997-1-git-send-email-mathias.nyman@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1538065587-22997-1-git-send-email-mathias.nyman@linux.intel.com> Sender: stable-owner@vger.kernel.org List-ID: On Thu, Sep 27, 2018 at 07:26:26PM +0300, Mathias Nyman wrote: > Ensure that the shared_hcd pointer is valid when calling usb_put_hcd() > > The shared_hcd is removed and freed in xhci by first calling > usb_remove_hcd(xhci->shared_hcd), and later > usb_put_hcd(xhci->shared_hcd) > > Afer commit fe190ed0d602 ("xhci: Do not halt the host until both HCD have > disconnected their devices.") the shared_hcd was never properly put as > xhci->shared_hcd was set to NULL before usb_put_hcd(xhci->shared_hcd) was > called. > > shared_hcd (USB3) is removed before primary hcd (USB2). > While removing the primary hcd we might need to handle xhci interrupts > to cleanly remove last USB2 devices, therefore we need to set > xhci->shared_hcd to NULL before removing the primary hcd to let xhci > interrupt handler know shared_hcd is no longer available. > > xhci-plat.c, xhci-histb.c and xhci-mtk first create both their hcd's before > adding them. so to keep the correct reverse removal order use a temporary > shared_hcd variable for them. > For more details see commit 4ac53087d6d4 ("usb: xhci: plat: Create both > HCDs before adding them") > > Fixes: fe190ed0d602 ("xhci: Do not halt the host until both HCD have disconnected their devices.") > Cc: Joel Stanley > Cc: Chunfeng Yun > Cc: Thierry Reding > Cc: Jianguo Sun > Cc: > Reported-by: Jack Pham > Signed-off-by: Mathias Nyman > --- > drivers/usb/host/xhci-histb.c | 6 ++++-- > drivers/usb/host/xhci-mtk.c | 6 ++++-- > drivers/usb/host/xhci-pci.c | 1 + > drivers/usb/host/xhci-plat.c | 6 ++++-- > drivers/usb/host/xhci-tegra.c | 1 + > drivers/usb/host/xhci.c | 2 -- > 6 files changed, 14 insertions(+), 8 deletions(-) > > diff --git a/drivers/usb/host/xhci-histb.c b/drivers/usb/host/xhci-histb.c > index 27f0016..3c4abb5 100644 > --- a/drivers/usb/host/xhci-histb.c > +++ b/drivers/usb/host/xhci-histb.c > @@ -325,14 +325,16 @@ static int xhci_histb_remove(struct platform_device *dev) > struct xhci_hcd_histb *histb = platform_get_drvdata(dev); > struct usb_hcd *hcd = histb->hcd; > struct xhci_hcd *xhci = hcd_to_xhci(hcd); > + struct usb_hcd *shared_hcd = xhci->shared_hcd; > > xhci->xhc_state |= XHCI_STATE_REMOVING; > > - usb_remove_hcd(xhci->shared_hcd); > + usb_remove_hcd(shared_hcd); > + xhci->shared_hcd = NULL; > device_wakeup_disable(&dev->dev); > > usb_remove_hcd(hcd); > - usb_put_hcd(xhci->shared_hcd); > + usb_put_hcd(shared_hcd); > > xhci_histb_host_disable(histb); > usb_put_hcd(hcd); > diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c > index 71d0d33..60987c7 100644 > --- a/drivers/usb/host/xhci-mtk.c > +++ b/drivers/usb/host/xhci-mtk.c > @@ -590,12 +590,14 @@ static int xhci_mtk_remove(struct platform_device *dev) > struct xhci_hcd_mtk *mtk = platform_get_drvdata(dev); > struct usb_hcd *hcd = mtk->hcd; > struct xhci_hcd *xhci = hcd_to_xhci(hcd); > + struct usb_hcd *shared_hcd = xhci->shared_hcd; > > - usb_remove_hcd(xhci->shared_hcd); > + usb_remove_hcd(shared_hcd); > + xhci->shared_hcd = NULL; > device_init_wakeup(&dev->dev, false); > > usb_remove_hcd(hcd); > - usb_put_hcd(xhci->shared_hcd); > + usb_put_hcd(shared_hcd); > usb_put_hcd(hcd); > xhci_mtk_sch_exit(mtk); > xhci_mtk_clks_disable(mtk); > diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c > index 51dd8e0..92fd6b6 100644 > --- a/drivers/usb/host/xhci-pci.c > +++ b/drivers/usb/host/xhci-pci.c > @@ -356,6 +356,7 @@ static void xhci_pci_remove(struct pci_dev *dev) > if (xhci->shared_hcd) { > usb_remove_hcd(xhci->shared_hcd); > usb_put_hcd(xhci->shared_hcd); > + xhci->shared_hcd = NULL; > } > > /* Workaround for spurious wakeups at shutdown with HSW */ > diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c > index 94e9392..e5da8ce 100644 > --- a/drivers/usb/host/xhci-plat.c > +++ b/drivers/usb/host/xhci-plat.c > @@ -359,14 +359,16 @@ static int xhci_plat_remove(struct platform_device *dev) > struct xhci_hcd *xhci = hcd_to_xhci(hcd); > struct clk *clk = xhci->clk; > struct clk *reg_clk = xhci->reg_clk; > + struct usb_hcd *shared_hcd = xhci->shared_hcd; > > xhci->xhc_state |= XHCI_STATE_REMOVING; > > - usb_remove_hcd(xhci->shared_hcd); > + usb_remove_hcd(shared_hcd); > + xhci->shared_hcd = NULL; > usb_phy_shutdown(hcd->usb_phy); > > usb_remove_hcd(hcd); > - usb_put_hcd(xhci->shared_hcd); > + usb_put_hcd(shared_hcd); > > clk_disable_unprepare(clk); > clk_disable_unprepare(reg_clk); > diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c > index 4b463e5..b1cce98 100644 > --- a/drivers/usb/host/xhci-tegra.c > +++ b/drivers/usb/host/xhci-tegra.c > @@ -1240,6 +1240,7 @@ static int tegra_xusb_remove(struct platform_device *pdev) > > usb_remove_hcd(xhci->shared_hcd); > usb_put_hcd(xhci->shared_hcd); > + xhci->shared_hcd = NULL; > usb_remove_hcd(tegra->hcd); > usb_put_hcd(tegra->hcd); > > diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c > index 0420eef..c928dbb 100644 > --- a/drivers/usb/host/xhci.c > +++ b/drivers/usb/host/xhci.c > @@ -719,8 +719,6 @@ static void xhci_stop(struct usb_hcd *hcd) > > /* Only halt host and free memory after both hcds are removed */ > if (!usb_hcd_is_primary_hcd(hcd)) { > - /* usb core will free this hcd shortly, unset pointer */ > - xhci->shared_hcd = NULL; > mutex_unlock(&xhci->mutex); > return; > } Tested-by: Jack Pham