ether8003: use physical addresses for ISAConfig ether->mem

Fix the inconsistent use of ether->mem. Always use physical
addresses. Let ether8390 convert to virtual addresses using
KADDR() when we have to copy data in/out.
This commit is contained in:
cinap_lenrek 2020-04-04 15:47:50 +02:00
parent d3512f60df
commit 6498ce3bf2
2 changed files with 10 additions and 19 deletions

View file

@ -88,7 +88,7 @@ reset8003(Ether* ether, uchar ea[Eaddrlen], uchar ic[8])
*/ */
if(memcmp(&ea[1], &ic[1], 5) == 0){ if(memcmp(&ea[1], &ic[1], 5) == 0){
memset(ic, 0, sizeof(ic)); memset(ic, 0, sizeof(ic));
ic[Msr] = (((ulong)ether->mem)>>13) & 0x3F; ic[Msr] = (ether->mem>>13) & 0x3F;
} }
else{ else{
/* /*
@ -100,7 +100,7 @@ reset8003(Ether* ether, uchar ea[Eaddrlen], uchar ic[8])
inb(port+Msr); /* wiggle bus */ inb(port+Msr); /* wiggle bus */
if(inb(port+Gp2) != 0xAA){ if(inb(port+Gp2) != 0xAA){
memset(ic, 0, sizeof(ic)); memset(ic, 0, sizeof(ic));
ic[Msr] = (((ulong)ether->mem)>>13) & 0x3F; ic[Msr] = (ether->mem>>13) & 0x3F;
} }
else else
ether->irq = irq8003[((ic[Irr]>>5) & 0x3)|(ic[Icr] & 0x4)]; ether->irq = irq8003[((ic[Irr]>>5) & 0x3)|(ic[Icr] & 0x4)];
@ -122,7 +122,7 @@ reset8003(Ether* ether, uchar ea[Eaddrlen], uchar ic[8])
ctlr->width = 1; ctlr->width = 1;
} }
ether->mem = (ulong)KADDR((ic[Msr] & 0x3F)<<13); ether->mem = (ic[Msr] & 0x3F)<<13;
if(ctlr->width == 2) if(ctlr->width == 2)
ether->mem |= (ic[Laar] & 0x1F)<<19; ether->mem |= (ic[Laar] & 0x1F)<<19;
else else
@ -163,7 +163,7 @@ reset8216(Ether* ether, uchar[8])
irq = inb(port+0x0D); irq = inb(port+0x0D);
outb(port+Hcr, hcr); outb(port+Hcr, hcr);
ether->mem = (ulong)KADDR(0xC0000+((((addr>>2) & 0x30)|(addr & 0x0F))<<13)); ether->mem = 0xC0000+((((addr>>2) & 0x30)|(addr & 0x0F))<<13);
ether->size = 8192*(1<<((addr>>4) & 0x03)); ether->size = 8192*(1<<((addr>>4) & 0x03));
ether->irq = irq8216[((irq>>4) & 0x04)|((irq>>2) & 0x03)]; ether->irq = irq8216[((irq>>4) & 0x04)|((irq>>2) & 0x03)];
@ -262,9 +262,8 @@ reset(Ether* ether)
} }
dp8390setea(ether); dp8390setea(ether);
if(umbrwmalloc(PADDR(ether->mem), ether->size, 0) == 0) if(umbrwmalloc(ether->mem, ether->size, 0) == 0)
print("ether8003: warning - 0x%luX unavailable\n", print("ether8003: warning - 0x%luX unavailable\n", ether->mem);
PADDR(ether->mem));
return 0; return 0;
} }

View file

@ -377,7 +377,7 @@ receive(Ether* ether)
for(curr = getcurr(ctlr); ctlr->nxtpkt != curr; curr = getcurr(ctlr)){ for(curr = getcurr(ctlr); ctlr->nxtpkt != curr; curr = getcurr(ctlr)){
data = ctlr->nxtpkt*Dp8390BufSz; data = ctlr->nxtpkt*Dp8390BufSz;
if(ctlr->ram) if(ctlr->ram)
memmove(&hdr, (void*)(ether->mem+data), sizeof(Hdr)); memmove(&hdr, (uchar*)KADDR(ether->mem) + data, sizeof(Hdr));
else else
_dp8390read(ctlr, &hdr, data, sizeof(Hdr)); _dp8390read(ctlr, &hdr, data, sizeof(Hdr));
@ -422,7 +422,7 @@ receive(Ether* ether)
if((data+len) >= ctlr->pstop*Dp8390BufSz){ if((data+len) >= ctlr->pstop*Dp8390BufSz){
count = ctlr->pstop*Dp8390BufSz - data; count = ctlr->pstop*Dp8390BufSz - data;
if(ctlr->ram) if(ctlr->ram)
memmove(p, (void*)(ether->mem+data), count); memmove(p, (uchar*)KADDR(ether->mem) + data, count);
else else
_dp8390read(ctlr, p, data, count); _dp8390read(ctlr, p, data, count);
p += count; p += count;
@ -431,7 +431,7 @@ receive(Ether* ether)
} }
if(len){ if(len){
if(ctlr->ram) if(ctlr->ram)
memmove(p, (void*)(ether->mem+data), len); memmove(p, (uchar*)KADDR(ether->mem) + data, len);
else else
_dp8390read(ctlr, p, data, len); _dp8390read(ctlr, p, data, len);
} }
@ -476,21 +476,13 @@ txstart(Ether* ether)
return; return;
/* /*
* Make sure the packet is of minimum length;
* copy it to the card's memory by the appropriate means; * copy it to the card's memory by the appropriate means;
* start the transmission. * start the transmission.
*/ */
len = BLEN(bp); len = BLEN(bp);
rp = bp->rp; rp = bp->rp;
if(len < ETHERMINTU){
rp = minpkt;
memmove(rp, bp->rp, len);
memset(rp+len, 0, ETHERMINTU-len);
len = ETHERMINTU;
}
if(ctlr->ram) if(ctlr->ram)
memmove((void*)(ether->mem+ctlr->tstart*Dp8390BufSz), rp, len); memmove((uchar*)KADDR(ether->mem) + ctlr->tstart*Dp8390BufSz, rp, len);
else else
dp8390write(ctlr, ctlr->tstart*Dp8390BufSz, rp, len); dp8390write(ctlr, ctlr->tstart*Dp8390BufSz, rp, len);
freeb(bp); freeb(bp);