Module Name:    src
Committed By:   phx
Date:           Sun Mar 27 19:09:43 UTC 2011

Modified Files:
        src/sys/arch/sandpoint/stand/altboot: rge.c

Log Message:
Fixed PHY access.
Support 8169SC/8110SC (as found on QNAP V200 boards).
Make frame receiving work (FRAMELEN <-> FRAMESIZE).
Driver works now, but not the first time after cold start.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/sandpoint/stand/altboot/rge.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/sandpoint/stand/altboot/rge.c
diff -u src/sys/arch/sandpoint/stand/altboot/rge.c:1.2 src/sys/arch/sandpoint/stand/altboot/rge.c:1.3
--- src/sys/arch/sandpoint/stand/altboot/rge.c:1.2	Thu Jan 27 17:38:04 2011
+++ src/sys/arch/sandpoint/stand/altboot/rge.c	Sun Mar 27 19:09:43 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: rge.c,v 1.2 2011/01/27 17:38:04 phx Exp $ */
+/* $NetBSD: rge.c,v 1.3 2011/03/27 19:09:43 phx Exp $ */
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -133,6 +133,7 @@
 
 	v = pcicfgread(tag, PCI_ID_REG);
 	switch (v) {
+	case PCI_DEVICE(0x10ec, 0x8167):
 	case PCI_DEVICE(0x10ec, 0x8169):
 		return 1;
 	}
@@ -199,7 +200,7 @@
 	l->rcr = (07 << 13) | (07 << 8) | RCR_APM;
 	CSR_WRITE_1(l, RGE_CR, CR_TXEN | CR_RXEN);
 	CSR_WRITE_1(l, RGE_ETTHR, 0x3f);
-	CSR_WRITE_2(l, RGE_RMS, FRAMELEN);
+	CSR_WRITE_2(l, RGE_RMS, FRAMESIZE);
 	CSR_WRITE_4(l, RGE_TCR, l->tcr);
 	CSR_WRITE_4(l, RGE_RCR, l->rcr);
 	CSR_WRITE_4(l, RGE_TNPDS, VTOPHYS(txd));
@@ -208,7 +209,6 @@
 	CSR_WRITE_4(l, RGE_RDSAR + 4, 0); 
 	CSR_WRITE_2(l, RGE_ISR, ~0);
 	CSR_WRITE_2(l, RGE_IMR, 0);
-
 	return l;
 }
 
@@ -287,15 +287,16 @@
 static int
 mii_read(struct local *l, int phy, int reg)
 {
-	unsigned v, loop;
+	unsigned v;
 
 	v = reg << 16;
 	CSR_WRITE_4(l, RGE_PHYAR, v);
-	loop = 100;
+	DELAY(1000);
 	do {
+		DELAY(100);
 		v = CSR_READ_4(l, RGE_PHYAR);
 	} while ((v & (1U << 31)) == 0); /* wait for 0 -> 1 */
-	return v;
+	return v & 0xffff;
 }
 
 static void
@@ -305,7 +306,9 @@
 
 	v = (reg << 16) | (data & 0xffff) | (1U << 31);
 	CSR_WRITE_4(l, RGE_PHYAR, v);
+	DELAY(1000);
 	do {
+		DELAY(100);
 		v = CSR_READ_4(l, RGE_PHYAR);
 	} while (v & (1U << 31)); /* wait for 1 -> 0 */
 }
@@ -337,17 +340,9 @@
 static void
 mii_initphy(struct local *l)
 {
-	int phy, ctl, sts, bound;
+	int bound, ctl, phy, sts;
 
-	for (phy = 0; phy < 32; phy++) {
-		ctl = mii_read(l, phy, MII_BMCR);
-		sts = mii_read(l, phy, MII_BMSR);
-		if (ctl != 0xffff && sts != 0xffff)
-			goto found;
-	}
-	printf("MII: no PHY found\n");
-	return;
-  found:
+	phy = 7;	/* internal rgephy, always at 7 */
 	ctl = mii_read(l, phy, MII_BMCR);
 	mii_write(l, phy, MII_BMCR, ctl | BMCR_RESET);
 	bound = 100;

Reply via email to