shithub: riscv

Download patch

ref: 96e9f3707cdc0b76e019f444c24869fecc7b5a21
parent: 30417c12fdedc608f75eeba0d18454d6d81833a3
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Oct 18 13:01:50 EDT 2020

etherbcm: handle 64-bit host addresses, use PCIWADDR() instead of PADDR()

--- a/sys/src/9/pc/etherbcm.c
+++ b/sys/src/9/pc/etherbcm.c
@@ -372,6 +372,7 @@
 	ulong *next;
 	ulong incr, idx;
 	Block *bp;
+	u64int pa;
 
 	idx = ctlr->recvprodi;
 	incr = (idx + 1) & (RecvProdRingLen - 1);
@@ -385,7 +386,9 @@
 	ctlr->recvs[idx] = bp;
 	next = ctlr->recvprod + idx * 8;
 	memset(next, 0, 32);
-	next[1] = PADDR(bp->rp);
+	pa = PCIWADDR(bp->rp);
+	next[0] = pa >> 32;
+	next[1] = pa;
 	next[2] = Rbsz;
 	next[7] = idx;
 	coherence();
@@ -444,6 +447,7 @@
 	Block *bp;
 	ulong *next;
 	ulong incr;
+	u64int pa;
 	
 	ctlr = edev->ctlr;
 	ilock(&ctlr->txlock);
@@ -456,8 +460,9 @@
 		bp = qget(edev->oq);
 		if(bp == nil) break;
 		next = ctlr->sendr + ctlr->sendri * 4;
-		next[0] = 0;
-		next[1] = PADDR(bp->rp);
+		pa = PCIWADDR(bp->rp);
+		next[0] = pa >> 32;
+		next[1] = pa;
 		next[2] = (BLEN(bp) << 16) | PacketEnd;
 		next[3] = 0;
 		if(ctlr->sends[ctlr->sendri] != 0)
@@ -525,6 +530,7 @@
 {
 	ulong i, j;
 	Ctlr *ctlr;
+	u64int pa;
 	
 	ctlr = edev->ctlr;
 	print("bcm: reset\n");
@@ -590,21 +596,24 @@
 		iprint("bcm: ftq failed to reset\n");
 		return -1;
 	}
-	csr32(ctlr, ReceiveBDHostAddr) = 0;
-	csr32(ctlr, ReceiveBDHostAddr + 4) = PADDR(ctlr->recvprod);
+	pa = PCIWADDR(ctlr->recvprod);
+	csr32(ctlr, ReceiveBDHostAddr + 0) = pa >> 32;
+	csr32(ctlr, ReceiveBDHostAddr + 4) = pa;
 	csr32(ctlr, ReceiveBDFlags) = RecvProdRingLen << 16;
 	csr32(ctlr, ReceiveBDNIC) = 0x6000;
 	csr32(ctlr, ReceiveBDRepl) = 25;
 	csr32(ctlr, SendBDRingHostIndex) = 0;
 	csr32(ctlr, SendBDRingHostIndex+4) = 0;
-	mem32(ctlr, SendRCB) = 0;
-	mem32(ctlr, SendRCB + 4) = PADDR(ctlr->sendr);
+	pa = PCIWADDR(ctlr->sendr);
+	mem32(ctlr, SendRCB + 0) = pa >> 32;
+	mem32(ctlr, SendRCB + 4) = pa;
 	mem32(ctlr, SendRCB + 8) = SendRingLen << 16;
 	mem32(ctlr, SendRCB + 12) = 0x4000;
 	for(i=1;i<4;i++)
 		mem32(ctlr, RecvRetRCB + i * 0x10 + 8) = 2;
-	mem32(ctlr, RecvRetRCB) = 0;
-	mem32(ctlr, RecvRetRCB + 4) = PADDR(ctlr->recvret);
+	pa = PCIWADDR(ctlr->recvret);
+	mem32(ctlr, RecvRetRCB + 0) = pa >> 32;
+	mem32(ctlr, RecvRetRCB + 4) = pa;
 	mem32(ctlr, RecvRetRCB + 8) = RecvRetRingLen << 16;
 	csr32(ctlr, RecvProdBDRingIndex) = 0;
 	csr32(ctlr, RecvProdBDRingIndex+4) = 0;
@@ -639,8 +648,9 @@
 	csr32(ctlr, SendMaxCoalescedFrames) = 10;
 	csr32(ctlr, RecvMaxCoalescedFramesInt) = 0;
 	csr32(ctlr, SendMaxCoalescedFramesInt) = 0;
-	csr32(ctlr, StatusBlockHostAddr) = 0;
-	csr32(ctlr, StatusBlockHostAddr + 4) = PADDR(ctlr->status);
+	pa = PCIWADDR(ctlr->status);
+	csr32(ctlr, StatusBlockHostAddr + 0) = pa >> 32;
+	csr32(ctlr, StatusBlockHostAddr + 4) = pa;
 	csr32(ctlr, HostCoalescingMode) |= Enable;
 	csr32(ctlr, ReceiveBDCompletionMode) |= Enable | Attn;
 	csr32(ctlr, ReceiveListPlacementMode) |= Enable;