usbohci, usbehci, usbxhci: save mmio base address in ctlr, cant PADDR() on 386...

This commit is contained in:
cinap_lenrek 2017-07-31 17:36:56 +02:00
parent 48352be825
commit 5f23d78f06
4 changed files with 23 additions and 23 deletions

View file

@ -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 */

View file

@ -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;

View file

@ -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;

View file

@ -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;