shithub: riscv

Download patch

ref: 6498ce3bf29b5350975a0cd22bca8bcac19c4377
parent: d3512f60df5d7a2ea5c4cad3cdef797f1f95a182
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Apr 4 11:47:50 EDT 2020

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.

--- a/sys/src/9/pc/ether8003.c
+++ b/sys/src/9/pc/ether8003.c
@@ -88,7 +88,7 @@
 	 */
 	if(memcmp(&ea[1], &ic[1], 5) == 0){
 		memset(ic, 0, sizeof(ic));
-		ic[Msr] = (((ulong)ether->mem)>>13) & 0x3F;
+		ic[Msr] = (ether->mem>>13) & 0x3F;
 	}
 	else{
 		/*
@@ -100,7 +100,7 @@
 		inb(port+Msr);				/* wiggle bus */
 		if(inb(port+Gp2) != 0xAA){
 			memset(ic, 0, sizeof(ic));
-			ic[Msr] = (((ulong)ether->mem)>>13) & 0x3F;
+			ic[Msr] = (ether->mem>>13) & 0x3F;
 		}
 		else
 			ether->irq = irq8003[((ic[Irr]>>5) & 0x3)|(ic[Icr] & 0x4)];
@@ -122,7 +122,7 @@
 			ctlr->width = 1;
 	}
 
-	ether->mem = (ulong)KADDR((ic[Msr] & 0x3F)<<13);
+	ether->mem = (ic[Msr] & 0x3F)<<13;
 	if(ctlr->width == 2)
 		ether->mem |= (ic[Laar] & 0x1F)<<19;
 	else
@@ -163,7 +163,7 @@
 	irq = inb(port+0x0D);
 	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->irq = irq8216[((irq>>4) & 0x04)|((irq>>2) & 0x03)];
 
@@ -262,9 +262,8 @@
 	}
 	dp8390setea(ether);
 
-	if(umbrwmalloc(PADDR(ether->mem), ether->size, 0) == 0)
-		print("ether8003: warning - 0x%luX unavailable\n",
-			PADDR(ether->mem));
+	if(umbrwmalloc(ether->mem, ether->size, 0) == 0)
+		print("ether8003: warning - 0x%luX unavailable\n", ether->mem);
 
 	return 0;
 }
--- a/sys/src/9/pc/ether8390.c
+++ b/sys/src/9/pc/ether8390.c
@@ -377,7 +377,7 @@
 	for(curr = getcurr(ctlr); ctlr->nxtpkt != curr; curr = getcurr(ctlr)){
 		data = ctlr->nxtpkt*Dp8390BufSz;
 		if(ctlr->ram)
-			memmove(&hdr, (void*)(ether->mem+data), sizeof(Hdr));
+			memmove(&hdr, (uchar*)KADDR(ether->mem) + data, sizeof(Hdr));
 		else
 			_dp8390read(ctlr, &hdr, data, sizeof(Hdr));
 
@@ -422,7 +422,7 @@
 			if((data+len) >= ctlr->pstop*Dp8390BufSz){
 				count = ctlr->pstop*Dp8390BufSz - data;
 				if(ctlr->ram)
-					memmove(p, (void*)(ether->mem+data), count);
+					memmove(p, (uchar*)KADDR(ether->mem) + data, count);
 				else
 					_dp8390read(ctlr, p, data, count);
 				p += count;
@@ -431,7 +431,7 @@
 			}
 			if(len){
 				if(ctlr->ram)
-					memmove(p, (void*)(ether->mem+data), len);
+					memmove(p, (uchar*)KADDR(ether->mem) + data, len);
 				else
 					_dp8390read(ctlr, p, data, len);
 			}
@@ -476,21 +476,13 @@
 		return;
 
 	/*
-	 * Make sure the packet is of minimum length;
 	 * copy it to the card's memory by the appropriate means;
 	 * start the transmission.
 	 */
 	len = BLEN(bp);
 	rp = bp->rp;
-	if(len < ETHERMINTU){
-		rp = minpkt;
-		memmove(rp, bp->rp, len);
-		memset(rp+len, 0, ETHERMINTU-len);
-		len = ETHERMINTU;
-	}
-
 	if(ctlr->ram)
-		memmove((void*)(ether->mem+ctlr->tstart*Dp8390BufSz), rp, len);
+		memmove((uchar*)KADDR(ether->mem) + ctlr->tstart*Dp8390BufSz, rp, len);
 	else
 		dp8390write(ctlr, ctlr->tstart*Dp8390BufSz, rp, len);
 	freeb(bp);