9front - general discussion about 9front
 help / color / mirror / Atom feed
* [9front] [PATCH] bcm: medium to low quality 5717 series support.
@ 2022-09-04 19:54 james palmer
  0 siblings, 0 replies; only message in thread
From: james palmer @ 2022-09-04 19:54 UTC (permalink / raw)
  To: 9front

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:

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-09-04 21:01 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-04 19:54 [9front] [PATCH] bcm: medium to low quality 5717 series support james palmer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).