ref: 93063b3db02b3e8b446c56bd28fc3317a3ccf804
parent: 0c52215ae32c86751942c3c8c3f784f4a1514731
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Tue Sep 4 20:06:20 EDT 2012
nusbd: properly handle port detach on hub disconnect
--- a/sys/src/cmd/nusb/usbd/hub.c
+++ b/sys/src/cmd/nusb/usbd/hub.c
@@ -481,6 +481,8 @@
putdevnb(pp->devmaskp, pp->devnb);
pp->devmaskp = nil;
if(pp->dev != nil){+ detachdev(pp);
+
devctl(pp->dev, "detach");
closedev(pp->dev);
pp->dev = nil;
@@ -562,8 +564,10 @@
if(usbcmd(nd, Rh2d|Rstd|Rdev, Rsetconf, 1, 0, nil, 0) < 0)
goto Fail;
}
- if(nd->dfd >= 0)
+ if(nd->dfd >= 0){close(nd->dfd);
+ nd->dfd = -1;
+ }
return;
Fail:
pp->state = Pdisabled;
@@ -623,8 +627,6 @@
if(attachdev(pp) < 0)
portdetach(h, p);
}else if(portgone(pp, sts)){- if(pp->dev)
- detachdev(pp);
portdetach(h, p);
}else if(portresetwanted(h, p))
portreset(h, p);
--- a/sys/src/cmd/nusb/usbd/usbd.c
+++ b/sys/src/cmd/nusb/usbd/usbd.c
@@ -338,6 +338,8 @@
void
detachdev(Port *p)
{+ if(p->dev->usb->class == Clhub)
+ return;
pushevent(formatdev(p->dev, 1));
}
--
⑨