nusb: fix enumarate bug, rename startdev/rmdev

This commit is contained in:
cinap_lenrek 2011-07-31 10:46:03 +02:00
parent 9f4184892c
commit d1b98305de
3 changed files with 46 additions and 41 deletions

View file

@ -1,4 +1,4 @@
int startdev(Port*); int attachdev(Port*);
int removedev(Port*); void detachdev(Port*);
void work(void); void work(void);
Hub* newhub(char *, Dev *); Hub* newhub(char *, Dev *);

View file

@ -620,10 +620,11 @@ enumhub(Hub *h, int p)
} }
if((pp->sts & PSpresent) == 0 && (sts & PSpresent) != 0){ if((pp->sts & PSpresent) == 0 && (sts & PSpresent) != 0){
if(portattach(h, p, sts) != nil) if(portattach(h, p, sts) != nil)
if(startdev(pp) < 0) if(attachdev(pp) < 0)
portdetach(h, p); portdetach(h, p);
}else if(portgone(pp, sts)){ }else if(portgone(pp, sts)){
removedev(pp); if(pp->dev)
detachdev(pp);
portdetach(h, p); portdetach(h, p);
}else if(portresetwanted(h, p)) }else if(portresetwanted(h, p))
portreset(h, p); portreset(h, p);

View file

@ -65,6 +65,20 @@ initevent(void)
evlast = emallocz(sizeof(Event), 1); evlast = emallocz(sizeof(Event), 1);
} }
static Event*
putevent(Event *e)
{
Event *ee;
ee = e->link;
if(e->ref || e->prev)
return ee;
ee->prev--;
free(e->data);
free(e);
return ee;
}
static void static void
readevent(Req *req) readevent(Req *req)
{ {
@ -80,11 +94,8 @@ readevent(Req *req)
fulfill(req, e); fulfill(req, e);
req->fid->aux = e->link; req->fid->aux = e->link;
e->link->ref++; e->link->ref++;
if(--e->ref == 0 && e->prev == 0){ e->ref--;
e->link->prev--; putevent(e);
free(e->data);
free(e);
}
qunlock(&evlock); qunlock(&evlock);
respond(req, nil); respond(req, nil);
} }
@ -112,11 +123,7 @@ pushevent(char *data)
fulfill(r, e); fulfill(r, e);
respond(r, nil); respond(r, nil);
} }
if(e->ref == 0 && e->prev == 0){ putevent(e);
ee->prev--;
free(e->data);
free(e);
}
reqfirst = nil; reqfirst = nil;
reqlast = nil; reqlast = nil;
qunlock(&evlock); qunlock(&evlock);
@ -214,13 +221,17 @@ formatdev(Dev *d, int type)
static void static void
enumerate(Event **l) enumerate(Event **l)
{ {
extern Hub *hubs;
Event *e; Event *e;
Hub *h; Hub *h;
Port *p; Port *p;
extern Hub *hubs; int i;
for(h = hubs; h != nil; h = h->next){ for(h = hubs; h != nil; h = h->next){
for(p = h->port; p < h->port + h->nport; p++){ for(i = 1; i <= h->nport; i++){
p = &h->port[i];
if(p->dev == nil || p->dev->usb == nil || p->hub != nil) if(p->dev == nil || p->dev->usb == nil || p->hub != nil)
continue; continue;
e = emallocz(sizeof(Event), 1); e = emallocz(sizeof(Event), 1);
@ -229,6 +240,7 @@ enumerate(Event **l)
e->prev = 1; e->prev = 1;
*l = e; *l = e;
l = &e->link; l = &e->link;
} }
} }
*l = evlast; *l = evlast;
@ -241,11 +253,16 @@ usbdopen(Req *req)
extern QLock hublock; extern QLock hublock;
if(req->fid->qid.path == Qusbevent){ if(req->fid->qid.path == Qusbevent){
Event *e;
qlock(&hublock); qlock(&hublock);
qlock(&evlock); qlock(&evlock);
enumerate(&req->fid->aux); enumerate(&req->fid->aux);
((Event *)req->fid->aux)->ref++; e = req->fid->aux;
((Event *)req->fid->aux)->prev--; e->ref++;
e->prev--;
qunlock(&evlock); qunlock(&evlock);
qunlock(&hublock); qunlock(&hublock);
} }
@ -255,20 +272,14 @@ usbdopen(Req *req)
static void static void
usbddestroyfid(Fid *fid) usbddestroyfid(Fid *fid)
{ {
Event *e, *ee; Event *e;
if(fid->qid.path == Qusbevent && fid->aux != nil){ if(fid->qid.path == Qusbevent && fid->aux != nil){
qlock(&evlock); qlock(&evlock);
e = fid->aux; e = fid->aux;
if(--e->ref == 0 && e->prev == 0){ if(--e->ref == 0 && e->prev == 0)
while(e->ref == 0 && e->prev == 0 && e != evlast){ while(e->ref == 0 && e->prev == 0 && e != evlast)
ee = e->link; e = putevent(e);
ee->prev--;
free(e->data);
free(e);
e = ee;
}
}
qunlock(&evlock); qunlock(&evlock);
} }
} }
@ -302,14 +313,10 @@ Srv usbdsrv = {
}; };
int int
startdev(Port *p) attachdev(Port *p)
{ {
Dev *d; Dev *d = p->dev;
if((d = p->dev) == nil || p->dev->usb == nil){
fprint(2, "okay what?\n");
return -1;
}
if(d->usb->class == Clhub){ if(d->usb->class == Clhub){
/* /*
* Hubs are handled directly by this process avoiding * Hubs are handled directly by this process avoiding
@ -321,20 +328,17 @@ startdev(Port *p)
return -1; return -1;
return 0; return 0;
} }
close(d->dfd); close(d->dfd);
d->dfd = -1; d->dfd = -1;
pushevent(formatdev(d, 0)); pushevent(formatdev(d, 0));
return 0; return 0;
} }
int void
removedev(Port *p) detachdev(Port *p)
{ {
Dev *d; pushevent(formatdev(p->dev, 1));
if((d = p->dev) == nil || p->dev->usb == nil)
return -1;
pushevent(formatdev(d, 1));
return 0;
} }
void void