usbohci, usbehci, usbxhci: save mmio base address in ctlr, cant PADDR() on 386...
This commit is contained in:
parent
48352be825
commit
5f23d78f06
|
@ -170,6 +170,7 @@ struct Ctlr
|
|||
Lock; /* for ilock. qh lists and basic ctlr I/O */
|
||||
QLock portlck; /* for port resets/enable... (and doorbell) */
|
||||
int active; /* in use or not */
|
||||
uintptr base;
|
||||
Pcidev* pcidev;
|
||||
Ecapio* capio; /* Capability i/o regs */
|
||||
Eopio* opio; /* Operational i/o regs */
|
||||
|
|
|
@ -175,11 +175,9 @@ scanpci(void)
|
|||
default:
|
||||
continue;
|
||||
}
|
||||
if(io == 0){
|
||||
print("usbehci: %x %x: failed to map registers\n",
|
||||
p->vid, p->did);
|
||||
if(io == 0)
|
||||
continue;
|
||||
}
|
||||
|
||||
print("usbehci: %#x %#x: port %#p size %#x irq %d\n",
|
||||
p->vid, p->did, io, p->mem[0].size, p->intl);
|
||||
|
||||
|
@ -189,6 +187,7 @@ scanpci(void)
|
|||
continue;
|
||||
}
|
||||
ctlr->pcidev = p;
|
||||
ctlr->base = io;
|
||||
capio = ctlr->capio = vmap(io, p->mem[0].size);
|
||||
ctlr->opio = (Eopio*)((uintptr)capio + (capio->cap & 0xff));
|
||||
pcisetbme(p);
|
||||
|
@ -239,7 +238,7 @@ reset(Hci *hp)
|
|||
for(i = 0; i < Nhcis && ctlrs[i] != nil; i++){
|
||||
ctlr = ctlrs[i];
|
||||
if(ctlr->active == 0)
|
||||
if(hp->port == 0 || hp->port == PADDR(ctlr->capio)){
|
||||
if(hp->port == 0 || hp->port == ctlr->base){
|
||||
ctlr->active = 1;
|
||||
break;
|
||||
}
|
||||
|
@ -250,7 +249,7 @@ reset(Hci *hp)
|
|||
|
||||
p = ctlr->pcidev;
|
||||
hp->aux = ctlr;
|
||||
hp->port = PADDR(ctlr->capio);
|
||||
hp->port = ctlr->base;
|
||||
hp->irq = p->intl;
|
||||
hp->tbdf = p->tbdf;
|
||||
|
||||
|
|
|
@ -350,6 +350,7 @@ struct Ctlr
|
|||
Qtree* tree; /* tree for t Ep i/o */
|
||||
int ntree; /* number of dummy Eds in tree */
|
||||
Pcidev* pcidev;
|
||||
uintptr base;
|
||||
};
|
||||
|
||||
#define dqprint if(debug || io && io->debug)print
|
||||
|
@ -2378,7 +2379,7 @@ init(Hci *hp)
|
|||
static void
|
||||
scanpci(void)
|
||||
{
|
||||
ulong mem;
|
||||
uintptr io;
|
||||
Ctlr *ctlr;
|
||||
Pcidev *p;
|
||||
int i;
|
||||
|
@ -2392,24 +2393,21 @@ scanpci(void)
|
|||
/*
|
||||
* Find Ohci controllers (Programming Interface = 0x10).
|
||||
*/
|
||||
if(p->ccrb != Pcibcserial || p->ccru != Pciscusb ||
|
||||
p->ccrp != 0x10)
|
||||
if(p->ccrb != Pcibcserial || p->ccru != Pciscusb || p->ccrp != 0x10)
|
||||
continue;
|
||||
mem = p->mem[0].bar & ~0x0F;
|
||||
dprint("ohci: %x/%x port 0x%lux size 0x%x irq %d\n",
|
||||
p->vid, p->did, mem, p->mem[0].size, p->intl);
|
||||
if(mem == 0){
|
||||
print("ohci: failed to map registers\n");
|
||||
io = p->mem[0].bar & ~0x0F;
|
||||
if(io == 0)
|
||||
continue;
|
||||
}
|
||||
|
||||
print("usbohci: %#x %#x: port %#p size %#x irq %d\n",
|
||||
p->vid, p->did, io, p->mem[0].size, p->intl);
|
||||
ctlr = malloc(sizeof(Ctlr));
|
||||
if(ctlr == nil){
|
||||
print("ohci: no memory\n");
|
||||
continue;
|
||||
}
|
||||
ctlr->pcidev = p;
|
||||
ctlr->ohci = vmap(mem, p->mem[0].size);
|
||||
ctlr->base = io;
|
||||
ctlr->ohci = vmap(io, p->mem[0].size);
|
||||
dprint("scanpci: ctlr %#p, ohci %#p\n", ctlr, ctlr->ohci);
|
||||
pcisetbme(p);
|
||||
pcisetpms(p, 0);
|
||||
|
@ -2571,7 +2569,7 @@ reset(Hci *hp)
|
|||
for(i = 0; i < Nhcis && ctlrs[i] != nil; i++){
|
||||
ctlr = ctlrs[i];
|
||||
if(ctlr->active == 0)
|
||||
if(hp->port == 0 || hp->port == PADDR(ctlr->ohci)){
|
||||
if(hp->port == 0 || hp->port == ctlr->base){
|
||||
ctlr->active = 1;
|
||||
break;
|
||||
}
|
||||
|
@ -2585,7 +2583,7 @@ reset(Hci *hp)
|
|||
|
||||
p = ctlr->pcidev;
|
||||
hp->aux = ctlr;
|
||||
hp->port = PADDR(ctlr->ohci);
|
||||
hp->port = ctlr->base;
|
||||
hp->irq = p->intl;
|
||||
hp->tbdf = p->tbdf;
|
||||
ctlr->nports = hp->nports = ctlr->ohci->rhdesca & 0xff;
|
||||
|
|
|
@ -238,6 +238,7 @@ struct Ctlr
|
|||
void (*setrptr)(u32int*, u64int);
|
||||
|
||||
void *active;
|
||||
uintptr base;
|
||||
};
|
||||
|
||||
struct Epio
|
||||
|
@ -1437,6 +1438,8 @@ scanpci(void)
|
|||
io = p->mem[0].bar & ~0x0f;
|
||||
if(io == 0)
|
||||
continue;
|
||||
print("usbxhci: %#x %#x: port %#p size %#x irq %d\n",
|
||||
p->vid, p->did, io, p->mem[0].size, p->intl);
|
||||
mmio = vmap(io, p->mem[0].size);
|
||||
if(mmio == nil){
|
||||
print("usbxhci: cannot map registers\n");
|
||||
|
@ -1448,8 +1451,7 @@ scanpci(void)
|
|||
vunmap(mmio, p->mem[0].size);
|
||||
continue;
|
||||
}
|
||||
print("usbxhci: %#x %#x: port %#p size %#x irq %d\n",
|
||||
p->vid, p->did, io, p->mem[0].size, p->intl);
|
||||
ctlr->base = io;
|
||||
ctlr->active = nil;
|
||||
ctlr->pcidev = p;
|
||||
ctlr->mmio = mmio;
|
||||
|
@ -1481,7 +1483,7 @@ reset(Hci *hp)
|
|||
for(i = 0; i < nelem(ctlrs) && ctlrs[i] != nil; i++){
|
||||
ctlr = ctlrs[i];
|
||||
if(ctlr->active == nil)
|
||||
if(hp->port == 0 || hp->port == PADDR(ctlr->mmio)){
|
||||
if(hp->port == 0 || hp->port == ctlr->base){
|
||||
ctlr->active = hp;
|
||||
goto Found;
|
||||
}
|
||||
|
@ -1490,7 +1492,7 @@ reset(Hci *hp)
|
|||
|
||||
Found:
|
||||
hp->aux = ctlr;
|
||||
hp->port = PADDR(ctlr->mmio);
|
||||
hp->port = ctlr->base;
|
||||
hp->irq = ctlr->pcidev->intl;
|
||||
hp->tbdf = ctlr->pcidev->tbdf;
|
||||
|
||||
|
|
Loading…
Reference in a new issue