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;