cvs diff: Diffing sys/arch/sandpoint/stand/altboot
Index: sys/arch/sandpoint/stand/altboot/skg.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sandpoint/stand/altboot/skg.c,v
retrieving revision 1.4
diff -u -r1.4 skg.c
--- sys/arch/sandpoint/stand/altboot/skg.c	30 Oct 2011 21:08:33 -0000	1.4
+++ sys/arch/sandpoint/stand/altboot/skg.c	31 Dec 2013 13:29:52 -0000
@@ -38,6 +38,11 @@
 
 #include "globals.h"
 
+/* XXX
+#undef DPRINTF
+#define DPRINTF(x)      printf x
+*/
+
 /*
  * - reverse endian access every CSR.
  * - no vtophys() translation, vaddr_t == paddr_t.
@@ -149,10 +154,17 @@
 #define  LINK_RESET_SET		0x0001
 
 #define YUKON_GPCR		0x2804
+#define  YU_RCR_UFLEN		0x8000
+#define  YU_RCR_MUFLEN		0x4000
+#define YUKON_RCR		0x280c
 #define  GPCR_TXEN		0x1000
 #define  GPCR_RXEN		0x0800
 #define YUKON_SA1		0x281c
 #define YUKON_SA2		0x2828
+#define YUKON_MC1		0x2834
+#define YUKON_MC2		0x2838
+#define YUKON_MC3		0x283c
+#define YUKON_MC4		0x2840
 #define YUKON_SMICR		0x2880
 #define  SMICR_PHYAD(x)		(((x) & 0x1f) << 11)
 #define  SMICR_REGAD(x)		(((x) & 0x1f) << 6)
@@ -173,11 +185,13 @@
 
 #define FRAMESIZE	1536
 
+#define NUM_TXDESC	2
+#define NUM_RXDESC	8
 struct local {
-	struct desc txd[2];
-	struct desc rxd[2];
-	uint8_t rxstore[2][FRAMESIZE];
-	unsigned csr, rx, tx, phy;
+	struct desc txd[NUM_TXDESC];
+	struct desc rxd[NUM_RXDESC];
+	uint8_t rxstore[NUM_RXDESC][FRAMESIZE];
+	unsigned csr, tx, phy;
 	uint16_t pssr, anlpar;
 };
 
@@ -246,6 +260,17 @@
 		CSR_WRITE_2(l, YUKON_SA1 + i * 4,
 		    (en[i * 2] << 8) | en[i * 2 + 1]);
 
+	/* zero multicast filters */
+/*
+	CSR_WRITE_2(l, YUKON_MC1, 0);
+	CSR_WRITE_2(l, YUKON_MC2, 0);
+	CSR_WRITE_2(l, YUKON_MC3, 0);
+	CSR_WRITE_2(l, YUKON_MC4, 0);
+*/
+
+	/* Enable the multicast filter */
+	CSR_WRITE_2(l, YUKON_RCR, YU_RCR_MUFLEN);
+
 	/* configure RX and TX MAC FIFO */
 	CSR_WRITE_1(l, SK_RXMF1_CTRL_TEST, RFCTL_RESET_CLEAR);
 	CSR_WRITE_4(l, SK_RXMF1_CTRL_TEST, RFCTL_OPERATION_ON);
@@ -274,29 +299,32 @@
 	CSR_WRITE_4(l, SK_RXRB1_START, 0);
 	CSR_WRITE_4(l, SK_RXRB1_WR_PTR, 0);
 	CSR_WRITE_4(l, SK_RXRB1_RD_PTR, 0);
-	CSR_WRITE_4(l, SK_RXRB1_END, 0xfff);
+	CSR_WRITE_4(l, SK_RXRB1_END, 0x3fff);
 	CSR_WRITE_4(l, SK_RXRB1_CTLTST, RBCTL_ON);
 	CSR_WRITE_4(l, SK_TXRBS1_CTLTST, RBCTL_UNRESET);
 	CSR_WRITE_4(l, SK_TXRBS1_CTLTST, RBCTL_STORENFWD_ON);
-	CSR_WRITE_4(l, SK_TXRBS1_START, 0x1000);
-	CSR_WRITE_4(l, SK_TXRBS1_WR_PTR, 0x1000);
-	CSR_WRITE_4(l, SK_TXRBS1_RD_PTR, 0x1000);
-	CSR_WRITE_4(l, SK_TXRBS1_END, 0x1fff);
+	CSR_WRITE_4(l, SK_TXRBS1_START, 0x4000);
+	CSR_WRITE_4(l, SK_TXRBS1_WR_PTR, 0x4000);
+	CSR_WRITE_4(l, SK_TXRBS1_RD_PTR, 0x4000);
+	CSR_WRITE_4(l, SK_TXRBS1_END, 0x4fff);
 	CSR_WRITE_4(l, SK_TXRBS1_CTLTST, RBCTL_ON);
 
 	/* setup descriptors and BMU */
 	CSR_WRITE_1(l, SK_TXAR1_COUNTERCTL, TXARCTL_ON|TXARCTL_FSYNC_ON);
 
 	txd = &l->txd[0];
-	txd[0].xd1 = htole32(VTOPHYS(&txd[1]));
-	txd[1].xd1 = htole32(VTOPHYS(&txd[0]));
+	for (i = 0; i < NUM_TXDESC; i ++)
+		txd[i].xd1 = htole32(VTOPHYS(&txd[(i + 1) & ~NUM_TXDESC]));
+        l->tx = 0;
+	
 	rxd = &l->rxd[0];
-	rxd[0].xd0 = htole32(FRAMESIZE|CTL_DEFOPC|CTL_LS|CTL_FS|CTL_OWN);
-	rxd[0].xd1 = htole32(VTOPHYS(&rxd[1]));
-	rxd[0].xd2 = htole32(VTOPHYS(l->rxstore[0]));
-	rxd[1].xd0 = htole32(FRAMESIZE|CTL_DEFOPC|CTL_LS|CTL_FS|CTL_OWN);
-	rxd[1].xd1 = htole32(VTOPHYS(&rxd[0]));
-	rxd[1].xd2 = htole32(VTOPHYS(l->rxstore[1]));
+	for (i = 0; i < NUM_RXDESC; i ++) {
+		rxd[i].xd0 =
+		    htole32(FRAMESIZE|CTL_DEFOPC|CTL_LS|CTL_FS|CTL_OWN);
+		rxd[i].xd1 = htole32(VTOPHYS(&rxd[(i + 1) & ~NUM_RXDESC]));
+		rxd[i].xd2 =
+		    htole32(VTOPHYS(l->rxstore[i]));
+	}
 	wbinv(l, sizeof(struct local));
 
 	CSR_WRITE_4(l, SK_RXQ1_BMU_CSR,
@@ -331,6 +359,13 @@
 	volatile struct desc *txd;
 	unsigned loop;
 
+	DPRINTF(("sending\n"));
+	DPRINTF((">> "));
+	for (loop = 0; loop < 14; loop++) {
+		DPRINTF(("%02x ", buf[loop]));
+	}
+	DPRINTF(("\n"));
+
 	wbinv(buf, len);
 	txd = &l->txd[l->tx];
 	txd->xd2 = htole32(VTOPHYS(buf));
@@ -347,7 +382,9 @@
 	printf("xmit failed\n");
 	return -1;
   done:
-	l->tx ^= 1;
+	l->tx++;
+	if (l->tx == NUM_TXDESC)
+		l->tx = 0;
 	return len;
 }
 
@@ -356,41 +393,46 @@
 {
 	struct local *l = dev;
 	volatile struct desc *rxd;
-	unsigned bound, ctl, rxstat, len;
+	unsigned loop, bound, ctl, rxstat, len;
 	uint8_t *ptr;
 
 	bound = 1000 * timo;
-#if 0
-printf("recving with %u sec. timeout\n", timo);
-#endif
+	DPRINTF(("recving with %u sec. timeout\n", timo));
   again:
-	rxd = &l->rxd[l->rx];
 	do {
-		inv(rxd, sizeof(struct desc));
-		ctl = le32toh(rxd->xd0);
-		if ((ctl & CTL_OWN) == 0)
-			goto gotone;
+		for (loop = 0; loop < NUM_RXDESC; loop++) {
+			rxd = &l->rxd[loop];
+			inv(rxd, sizeof(struct desc));
+			ctl = le32toh(rxd->xd0);
+			if ((ctl & CTL_OWN) == 0)
+				goto gotone;
+		}
 		DELAY(1000);	/* 1 milli second */
 	} while (--bound > 0);
 	errno = 0;
 	return -1;
   gotone:
   	rxstat = le32toh(rxd->xd4);
+	DPRINTF(("Got one rxd[%d] : rxstat = %08x\n", loop, rxstat));
 	if ((rxstat & RXSTAT_RXOK) == 0) {
 		rxd->xd0 = htole32(FRAMESIZE|CTL_DEFOPC|CTL_LS|CTL_FS|CTL_OWN);
 		wbinv(rxd, sizeof(struct desc));
-		l->rx ^= 1;
 		goto again;
 	}
+	DPRINTF(("Parsing : ctl = %08x\n", ctl));
 	len = ctl & FRAMEMASK;
 	if (len > maxlen)
 		len = maxlen;
-	ptr = l->rxstore[l->rx];
+	ptr = l->rxstore[loop];
 	inv(ptr, len);
 	memcpy(buf, ptr, len);
+	DPRINTF((">> "));
+	for (loop = 0; loop < 14; loop++) {
+		DPRINTF(("%02x ", buf[loop]));
+	}
+	DPRINTF(("\n"));
 	rxd->xd0 = htole32(FRAMESIZE|CTL_DEFOPC|CTL_LS|CTL_FS|CTL_OWN);
 	wbinv(rxd, sizeof(struct desc));
-	l->rx ^= 1;
 	return len;
 }
 
