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