nusb: fix enumarate bug, rename startdev/rmdev
This commit is contained in:
parent
9f4184892c
commit
d1b98305de
3 changed files with 46 additions and 41 deletions
|
@ -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 *);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue