git: 9front

Download patch

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));
 }
 
--