etherbcm: handle 64-bit host addresses, use PCIWADDR() instead of PADDR()
This commit is contained in:
parent
30417c12fd
commit
96e9f3707c
1 changed files with 21 additions and 11 deletions
|
@ -372,6 +372,7 @@ replenish(Ctlr *ctlr)
|
||||||
ulong *next;
|
ulong *next;
|
||||||
ulong incr, idx;
|
ulong incr, idx;
|
||||||
Block *bp;
|
Block *bp;
|
||||||
|
u64int pa;
|
||||||
|
|
||||||
idx = ctlr->recvprodi;
|
idx = ctlr->recvprodi;
|
||||||
incr = (idx + 1) & (RecvProdRingLen - 1);
|
incr = (idx + 1) & (RecvProdRingLen - 1);
|
||||||
|
@ -385,7 +386,9 @@ replenish(Ctlr *ctlr)
|
||||||
ctlr->recvs[idx] = bp;
|
ctlr->recvs[idx] = bp;
|
||||||
next = ctlr->recvprod + idx * 8;
|
next = ctlr->recvprod + idx * 8;
|
||||||
memset(next, 0, 32);
|
memset(next, 0, 32);
|
||||||
next[1] = PADDR(bp->rp);
|
pa = PCIWADDR(bp->rp);
|
||||||
|
next[0] = pa >> 32;
|
||||||
|
next[1] = pa;
|
||||||
next[2] = Rbsz;
|
next[2] = Rbsz;
|
||||||
next[7] = idx;
|
next[7] = idx;
|
||||||
coherence();
|
coherence();
|
||||||
|
@ -444,6 +447,7 @@ bcmtransmit(Ether *edev)
|
||||||
Block *bp;
|
Block *bp;
|
||||||
ulong *next;
|
ulong *next;
|
||||||
ulong incr;
|
ulong incr;
|
||||||
|
u64int pa;
|
||||||
|
|
||||||
ctlr = edev->ctlr;
|
ctlr = edev->ctlr;
|
||||||
ilock(&ctlr->txlock);
|
ilock(&ctlr->txlock);
|
||||||
|
@ -456,8 +460,9 @@ bcmtransmit(Ether *edev)
|
||||||
bp = qget(edev->oq);
|
bp = qget(edev->oq);
|
||||||
if(bp == nil) break;
|
if(bp == nil) break;
|
||||||
next = ctlr->sendr + ctlr->sendri * 4;
|
next = ctlr->sendr + ctlr->sendri * 4;
|
||||||
next[0] = 0;
|
pa = PCIWADDR(bp->rp);
|
||||||
next[1] = PADDR(bp->rp);
|
next[0] = pa >> 32;
|
||||||
|
next[1] = pa;
|
||||||
next[2] = (BLEN(bp) << 16) | PacketEnd;
|
next[2] = (BLEN(bp) << 16) | PacketEnd;
|
||||||
next[3] = 0;
|
next[3] = 0;
|
||||||
if(ctlr->sends[ctlr->sendri] != 0)
|
if(ctlr->sends[ctlr->sendri] != 0)
|
||||||
|
@ -525,6 +530,7 @@ bcminit(Ether *edev)
|
||||||
{
|
{
|
||||||
ulong i, j;
|
ulong i, j;
|
||||||
Ctlr *ctlr;
|
Ctlr *ctlr;
|
||||||
|
u64int pa;
|
||||||
|
|
||||||
ctlr = edev->ctlr;
|
ctlr = edev->ctlr;
|
||||||
print("bcm: reset\n");
|
print("bcm: reset\n");
|
||||||
|
@ -590,21 +596,24 @@ bcminit(Ether *edev)
|
||||||
iprint("bcm: ftq failed to reset\n");
|
iprint("bcm: ftq failed to reset\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
csr32(ctlr, ReceiveBDHostAddr) = 0;
|
pa = PCIWADDR(ctlr->recvprod);
|
||||||
csr32(ctlr, ReceiveBDHostAddr + 4) = PADDR(ctlr->recvprod);
|
csr32(ctlr, ReceiveBDHostAddr + 0) = pa >> 32;
|
||||||
|
csr32(ctlr, ReceiveBDHostAddr + 4) = pa;
|
||||||
csr32(ctlr, ReceiveBDFlags) = RecvProdRingLen << 16;
|
csr32(ctlr, ReceiveBDFlags) = RecvProdRingLen << 16;
|
||||||
csr32(ctlr, ReceiveBDNIC) = 0x6000;
|
csr32(ctlr, ReceiveBDNIC) = 0x6000;
|
||||||
csr32(ctlr, ReceiveBDRepl) = 25;
|
csr32(ctlr, ReceiveBDRepl) = 25;
|
||||||
csr32(ctlr, SendBDRingHostIndex) = 0;
|
csr32(ctlr, SendBDRingHostIndex) = 0;
|
||||||
csr32(ctlr, SendBDRingHostIndex+4) = 0;
|
csr32(ctlr, SendBDRingHostIndex+4) = 0;
|
||||||
mem32(ctlr, SendRCB) = 0;
|
pa = PCIWADDR(ctlr->sendr);
|
||||||
mem32(ctlr, SendRCB + 4) = PADDR(ctlr->sendr);
|
mem32(ctlr, SendRCB + 0) = pa >> 32;
|
||||||
|
mem32(ctlr, SendRCB + 4) = pa;
|
||||||
mem32(ctlr, SendRCB + 8) = SendRingLen << 16;
|
mem32(ctlr, SendRCB + 8) = SendRingLen << 16;
|
||||||
mem32(ctlr, SendRCB + 12) = 0x4000;
|
mem32(ctlr, SendRCB + 12) = 0x4000;
|
||||||
for(i=1;i<4;i++)
|
for(i=1;i<4;i++)
|
||||||
mem32(ctlr, RecvRetRCB + i * 0x10 + 8) = 2;
|
mem32(ctlr, RecvRetRCB + i * 0x10 + 8) = 2;
|
||||||
mem32(ctlr, RecvRetRCB) = 0;
|
pa = PCIWADDR(ctlr->recvret);
|
||||||
mem32(ctlr, RecvRetRCB + 4) = PADDR(ctlr->recvret);
|
mem32(ctlr, RecvRetRCB + 0) = pa >> 32;
|
||||||
|
mem32(ctlr, RecvRetRCB + 4) = pa;
|
||||||
mem32(ctlr, RecvRetRCB + 8) = RecvRetRingLen << 16;
|
mem32(ctlr, RecvRetRCB + 8) = RecvRetRingLen << 16;
|
||||||
csr32(ctlr, RecvProdBDRingIndex) = 0;
|
csr32(ctlr, RecvProdBDRingIndex) = 0;
|
||||||
csr32(ctlr, RecvProdBDRingIndex+4) = 0;
|
csr32(ctlr, RecvProdBDRingIndex+4) = 0;
|
||||||
|
@ -639,8 +648,9 @@ bcminit(Ether *edev)
|
||||||
csr32(ctlr, SendMaxCoalescedFrames) = 10;
|
csr32(ctlr, SendMaxCoalescedFrames) = 10;
|
||||||
csr32(ctlr, RecvMaxCoalescedFramesInt) = 0;
|
csr32(ctlr, RecvMaxCoalescedFramesInt) = 0;
|
||||||
csr32(ctlr, SendMaxCoalescedFramesInt) = 0;
|
csr32(ctlr, SendMaxCoalescedFramesInt) = 0;
|
||||||
csr32(ctlr, StatusBlockHostAddr) = 0;
|
pa = PCIWADDR(ctlr->status);
|
||||||
csr32(ctlr, StatusBlockHostAddr + 4) = PADDR(ctlr->status);
|
csr32(ctlr, StatusBlockHostAddr + 0) = pa >> 32;
|
||||||
|
csr32(ctlr, StatusBlockHostAddr + 4) = pa;
|
||||||
csr32(ctlr, HostCoalescingMode) |= Enable;
|
csr32(ctlr, HostCoalescingMode) |= Enable;
|
||||||
csr32(ctlr, ReceiveBDCompletionMode) |= Enable | Attn;
|
csr32(ctlr, ReceiveBDCompletionMode) |= Enable | Attn;
|
||||||
csr32(ctlr, ReceiveListPlacementMode) |= Enable;
|
csr32(ctlr, ReceiveListPlacementMode) |= Enable;
|
||||||
|
|
Loading…
Reference in a new issue