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