diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-04-05 03:05:06 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-04-05 03:05:06 +0200 |
commit | ecba7822e316d6cb8370eec97862215402811e82 (patch) | |
tree | 494dc254651a6d72810f31e2ee0c6c21c4854faa | |
parent | 315f20b9f46671ca1fd323b22de0722c7c561f97 (diff) |
nusb/usbd: fix portreset error handling
error handling in portreset() was wrong. we called closedev()
on the device without changing the reference.
just call portdetach() when the reset fails.
-rw-r--r-- | sys/src/cmd/nusb/usbd/hub.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/sys/src/cmd/nusb/usbd/hub.c b/sys/src/cmd/nusb/usbd/hub.c index b6d1a915b..1a484625d 100644 --- a/sys/src/cmd/nusb/usbd/hub.c +++ b/sys/src/cmd/nusb/usbd/hub.c @@ -543,7 +543,6 @@ portreset(Hub *h, int p) d = h->dev; pp = &h->port[p]; - nd = pp->dev; dprint(2, "%s: %s: port %d: resetting\n", argv0, d->dir, p); if(hubfeature(h, p, Fportreset, 1) < 0){ dprint(2, "%s: %s: port %d: reset: %r\n", argv0, d->dir, p); @@ -557,7 +556,8 @@ portreset(Hub *h, int p) dprint(2, "%s: %s: port %d: not enabled?\n", argv0, d->dir, p); goto Fail; } - nd = pp->dev; + if((nd = pp->dev) == nil) + return; opendevdata(nd, ORDWR); if(usbcmd(nd, Rh2d|Rstd|Rdev, Rsetaddress, nd->id, 0, nil, 0) < 0){ dprint(2, "%s: %s: port %d: setaddress: %r\n", argv0, d->dir, p); @@ -579,15 +579,10 @@ portreset(Hub *h, int p) } return; Fail: - pp->state = Pdisabled; pp->sts = 0; - if(pp->hub != nil) - pp->hub = nil; /* hub closed by enumhub */ - if(!h->dev->isusb3) + portdetach(h, p); + if(!d->isusb3) hubfeature(h, p, Fportenable, 0); - if(nd != nil) - devctl(nd, "detach"); - closedev(nd); } static int |