ref: fb500d60415597c276cbf418d3f7ca2cae94d259
parent: 19ef151c50242ec11608fbe2a793fd6205978c42
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));
}
--
⑨