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

View file

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

View file

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

View file

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