From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 10080 invoked from network); 4 Sep 2022 21:01:29 -0000 Received: from 9front.inri.net (168.235.81.73) by inbox.vuxu.org with ESMTPUTF8; 4 Sep 2022 21:01:29 -0000 Received: from navi.tachibana-labs.org ([78.141.237.76]) by 9front; Sun Sep 4 16:59:44 -0400 2022 Message-ID: To: 9front@9front.org From: james palmer Date: Sun, 04 Sep 2022 19:54:41 +0000 MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: core-based JSON over ORM metadata markup Subject: [9front] [PATCH] bcm: medium to low quality 5717 series support. Reply-To: 9front@9front.org Precedence: bulk introduces support for the first port on 5717 series cards. turns out broadcom stuck a maximum rx frame size field into the rx return ring control block, with a default of 0. an attempt was made at getting the other ports to talk to the right phy, but it is not yet successful. --- diff a87619ffb1719c4ed2d1eae6a8c60d06bddd6272 0b25e6516af7de8de981668efacbbb0bee885455 --- a/sys/src/9/pc/etherbcm.c Sun Sep 4 16:02:48 2022 +++ b/sys/src/9/pc/etherbcm.c Sun Sep 4 20:54:41 2022 @@ -143,6 +143,8 @@ ReadDMAMode = 0x4800, ReadDMAStatus = 0x4804, + ReadDMALsoCrptenCtrl = 0x4910, /* no clue, for rdma workaround on 57[19, 20] */ + ReadDMALength = 0x4be0, WriteDMAMode = 0x4C00, WriteDMAStatus = 0x4C04, @@ -218,13 +220,14 @@ BCM5705_2 = 0x1654, BCM5717 = 0x1655, BCM5718 = 0x1656, - BCM5720 = 0x1658, + BCM5719 = 0x1657, BCM5721 = 0x1659, BCM5722 = 0x165a, BCM5723 = 0x165b, BCM5724 = 0x165c, BCM5705M = 0x165d, - BCM5705M_2 = 0x165e, + BCM5705M_2 = 0x165e, + BCM5720 = 0x165f, BCM5714 = 0x1668, BCM5780 = 0x166a, BCM5780S = 0x166b, @@ -289,11 +292,28 @@ return x; } +static uint +phyno(Ctlr *ctlr) +{ + uint pa; + + pa = 1; + switch(ctlr->pdev->did) { + case BCM5717: + case BCM5718: + case BCM5719: + case BCM5720: + pa = BUSFNO(ctlr->pdev->tbdf); + } + + return pa; +} + static int miir(Ctlr *ctlr, int ra) { while(csr32(ctlr, MIComm) & (1<<29)); - csr32(ctlr, MIComm) = (ra << 16) | (1 << 21) | (1 << 27) | (1 << 29); + csr32(ctlr, MIComm) = (ra << 16) | (phyno(ctlr) << 21) | (1 << 27) | (1 << 29); while(csr32(ctlr, MIComm) & (1<<29)); if(csr32(ctlr, MIComm) & (1<<28)) return -1; return csr32(ctlr, MIComm) & 0xFFFF; @@ -303,7 +323,7 @@ miiw(Ctlr *ctlr, int ra, int value) { while(csr32(ctlr, MIComm) & (1<<29)); - csr32(ctlr, MIComm) = (value & 0xFFFF) | (ra << 16) | (1 << 21) | (1 << 27) | (1 << 29); + csr32(ctlr, MIComm) = (value & 0xFFFF) | (ra << 16) | (phyno(ctlr) << 21) | (1 << 26) | (1 << 29); while(csr32(ctlr, MIComm) & (1<<29)); return 0; } @@ -547,6 +567,9 @@ csr32(ctlr, MiscHostCtl) |= IndirectAccessEnable | EnablePCIStateRegister | EnableClockControlRegister; csr32(ctlr, MiscHostCtl) = (csr32(ctlr, MiscHostCtl) & ~(ByteSwap|WordSwap)) | WordSwap; csr32(ctlr, ModeControl) |= ByteWordSwap; + if(ctlr->pdev->did == BCM5720) + csr32(ctlr, ModeControl) |= (1<<6) | (1<<7) | (1<<15)| (1<<18); + csr32(ctlr, MemoryWindow) = 0; mem32(ctlr, 0xB50) = 0x4B657654; /* magic number bullshit */ csr32(ctlr, MiscConfiguration) |= GPHYPowerDownOverride | DisableGRCResetOnPCIE; @@ -599,8 +622,23 @@ pa = PCIWADDR(ctlr->recvprod); csr32(ctlr, ReceiveBDHostAddr + 0) = pa >> 32; csr32(ctlr, ReceiveBDHostAddr + 4) = pa; - csr32(ctlr, ReceiveBDFlags) = RecvProdRingLen << 16; - csr32(ctlr, ReceiveBDNIC) = 0x6000; + switch(ctlr->pdev->did) { + case BCM5717: + case BCM5718: + case BCM5719: + case BCM5720: + /* 5717 series cards have a different nic addr, + * and have a max frame length in bits 2 to 15 */ + csr32(ctlr, ReceiveBDFlags) = RecvProdRingLen << 16 | 1536 << 2; + csr32(ctlr, ReceiveBDNIC) = 0x40000; + break; + + default: + csr32(ctlr, ReceiveBDFlags) = RecvProdRingLen << 16; + csr32(ctlr, ReceiveBDNIC) = 0x6000; + break; + } + csr32(ctlr, ReceiveBDRepl) = 25; csr32(ctlr, SendBDRingHostIndex) = 0; csr32(ctlr, SendBDRingHostIndex+4) = 0; @@ -619,10 +657,10 @@ csr32(ctlr, RecvProdBDRingIndex+4) = 0; /* this delay is not in the datasheet, but necessary; Broadcom is fucking with us */ microdelay(1000); - i = csr32(ctlr, 0x410); + i = csr32(ctlr, MACAddress + BUSFNO(ctlr->pdev->tbdf) * 8); j = edev->ea[0] = i >> 8; j += edev->ea[1] = i; - i = csr32(ctlr, MACAddress + 4); + i = csr32(ctlr, MACAddress + BUSFNO(ctlr->pdev->tbdf) * 8 + 4); j += edev->ea[2] = i >> 24; j += edev->ea[3] = i >> 16; j += edev->ea[4] = i >> 8; @@ -659,6 +697,28 @@ csr32(ctlr, InterruptMailbox) = 0; csr32(ctlr, WriteDMAMode) |= 0x200003fe; /* pulled out of my nose */ csr32(ctlr, ReadDMAMode) |= 0x3fe; + + /* workaround for broken rdma on the 5719 and 5720 */ + microdelay(40); + switch(ctlr->pdev->did) { + case BCM5719: + case BCM5720: + for(i = 0; i < 2; i++) { + j = csr32(ctlr, ReadDMALength + i * 4); + if((j & 0xffff) > ETHERMAXTU + 2) /* max ether mtu with crc */ + break; + if(((j >> 16) & 0xffff) > ETHERMAXTU + 2) + break; + } + + if(i != 2) { + if(ctlr->pdev->did == BCM5719) + csr32(ctlr, ReadDMALsoCrptenCtrl) |= 0x2000000; + else + csr32(ctlr, ReadDMALsoCrptenCtrl) |= 0x200000; + } + } + csr32(ctlr, ReceiveDataCompletionMode) |= Enable | Attn; csr32(ctlr, SendDataCompletionMode) |= Enable; csr32(ctlr, SendBDCompletionMode) |= Enable | Attn; @@ -675,7 +735,7 @@ csr32(ctlr, MIStatus) |= 1<<0; csr32(ctlr, MACEventEnable) = 0; csr32(ctlr, MACEventStatus) |= (1<<12); - csr32(ctlr, MIMode) = 0xC0000; + csr32(ctlr, MIMode) = 0xC0000 | (phyno(ctlr) << 5); microdelay(40); miiw(ctlr, PhyControl, 1<<15); for(i = 0; i < 1000 && miir(ctlr, PhyControl) & (1<<15); i++) @@ -694,7 +754,7 @@ csr32(ctlr, MACHash+4) = -1; csr32(ctlr, MACHash+8) = -1; csr32(ctlr, MACHash+12) = -1; - for(i = 0; i < 8; i++) csr32(ctlr, ReceiveRules + 8 * i) = 0; + for(i = 0; i < 16; i++) csr32(ctlr, ReceiveRules + 8 * i) = 0; csr32(ctlr, ReceiveRulesConfiguration) = 1 << 3; csr32(ctlr, MSIMode) |= Enable; csr32(ctlr, MiscHostCtl) &= ~(MaskPCIInt | ClearIntA); @@ -743,13 +803,14 @@ case BCM5705_2: case BCM5717: case BCM5718: - case BCM5720: + case BCM5719: case BCM5721: case BCM5722: case BCM5723: case BCM5724: case BCM5705M: case BCM5705M_2: + case BCM5720: case BCM5714: case BCM5780: case BCM5780S: