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;
}