From 62e12bb630a3696cfd707e193be8d292e8f92eee Mon Sep 17 00:00:00 2001 From: Poul-Henning Kamp Date: Wed, 1 Nov 2000 22:04:15 +0000 Subject: Make internal clock sourcing work right by tying the NCO to the Xtal reference instead of the CLADI input. In unframed E1 mode, tie SIGFRZ low so that the mysycc doesn't get confused. Don't mask errors with OOF. Don't ignore OOF errors. Stop the channel before freeing mbufs in disconnect. I still have no T1 devices to test with, so the T1 code is non-existent. --- sys/dev/musycc/musycc.c | 55 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/sys/dev/musycc/musycc.c b/sys/dev/musycc/musycc.c index 7370def72749..2184965b4b63 100644 --- a/sys/dev/musycc/musycc.c +++ b/sys/dev/musycc/musycc.c @@ -395,7 +395,9 @@ init_ctrl(struct softc *sc) else sc->ram->grcd |= 0x00000000; /* !OOFABT */ +#if 0 sc->ram->grcd |= 0x00000010; /* MSKOOF */ +#endif sc->ram->grcd |= 0x00000020; /* MSKCOFA */ sc->ram->grcd |= 0x00000400; /* POLLTH=1 */ @@ -500,7 +502,10 @@ init_8370(struct softc *sc) DELAY(20); p[0x001] = 0x00; /* CR0 - E1, RFRAME: FAS only */ DELAY(20); - p[0x002] = 0x00; /* JAT_CR - XXX */ + if (sc->clocksource == INT) + p[0x002] = 0x40; /* JAT_CR - XXX */ + else + p[0x002] = 0x00; /* JAT_CR - XXX */ p[0x00D] = 0x01; /* IER6 - ONESEC */ p[0x014] = 0x00; /* LOOP - */ p[0x015] = 0x00; /* DL3_TS - */ @@ -557,10 +562,11 @@ init_8370(struct softc *sc) p[0x090] = 0x05; /* CLAD_CR - XXX */ p[0x091] = 0x01; /* CSEL - 2048kHz */ - if (sc->framing == E1U || sc->framing == T1U) + if (sc->framing == E1U || sc->framing == T1U) { p[0x0a0] = 0x00; - if (sc->framing == E1U || sc->framing == T1U) p[0x0a6] = 0x00; + p[0x0b1] = 0x00; + } p[0x0d0] = 0x46; /* SBI_CR - SBI=6 */ p[0x0d1] = 0x70; /* RSB_CR - XXX */ @@ -569,7 +575,10 @@ init_8370(struct softc *sc) p[0x0d4] = 0x30; /* TSB_CR - XXX */ p[0x0d5] = 0x00; /* TSYNC_BIT - 0 */ p[0x0d6] = 0x00; /* TSYNC_TS - 0 */ - p[0x0d7] = 0x01; /* RSIG_CR - 0 */ + if (sc->framing == E1U || sc->framing == T1U) + p[0x0d7] = 0x05; /* RSIG_CR - 0 | FRZ_OFF*/ + else + p[0x0d7] = 0x01; /* RSIG_CR - 0 */ p[0x0d8] = 0x00; /* RSIG_FRM - 0 */ for (i = 0; i < 32; i ++) { p[0x0e0 + i] = 0x0d; /* SBC$i - RINDO|TINDO|ASSIGN */ @@ -594,7 +603,6 @@ musycc_intr0_tx_eom(struct softc *sc, int ch) if (sch == NULL || sch->state != UP) { /* XXX: this should not happen once the driver is done */ printf("Xmit packet on uninitialized channel %d\n", ch); - return; } if (sc->mdt[ch] == NULL) return; /* XXX: can this happen ? */ @@ -649,8 +657,10 @@ musycc_intr0_rx_eom(struct softc *sc, int ch) m = md->m; m->m_len = m->m_pkthdr.len = status & 0x3fff; error = (status >> 16) & 0xf; +#if 0 if (error == 8 && (sc->framing == E1U || sc->framing == T1U)) error = 0; +#endif if (error == 0) { MGETHDR(m2, M_DONTWAIT, MT_DATA); if (m2 != NULL) { @@ -678,6 +688,10 @@ musycc_intr0_rx_eom(struct softc *sc, int ch) */ sch->rx_drop++; } + } else if (error == 9) { + printf("FCS\n"); + } else if (error == 10) { + printf("ALIGN\n"); } else { /* Receive error, print some useful info */ printf("%s %s: RX 0x%08x ", sch->sc->nodename, @@ -686,6 +700,7 @@ musycc_intr0_rx_eom(struct softc *sc, int ch) if (m->m_len > 16) m->m_len = m->m_pkthdr.len = 16; m_print(m); + printf("\n"); } md->status = 1600; /* XXX: MTU */ /* Check next mdesc in the ring */ @@ -747,12 +762,18 @@ musycc_intr0(void *arg) musycc_intr0_rx_eom(sc, ch); break; case 0: - if (er == 2) /* COFA */ +#if 1 + if (er == 2) { /* COFA */ break; - else if (er == 3) { /* ONR */ + } else if (er == 3) { /* ONR */ musycc_intr0_tx_eom(sc, ch); musycc_intr0_rx_eom(sc, ch); + } else if (er == 13) { /* SHT */ + musycc_intr0_tx_eom(sc, ch); + musycc_intr0_rx_eom(sc, ch); + break; } +#endif default: #if 1 printf("huh ? %08x %d", u1, g); @@ -867,10 +888,10 @@ musycc_config(node_p node, char *set, char *ret) init_ctrl(sc); return; } - if (!strcmp(set, "clock int")) { + if (!strcmp(set, "clock source internal")) { sc->clocksource = INT; init_ctrl(sc); - } else if (!strcmp(set, "clock ext")) { + } else if (!strcmp(set, "clock source line")) { sc->clocksource = EXT; init_ctrl(sc); } else if (!strcmp(set, "show 8370 0")) { @@ -900,9 +921,9 @@ musycc_config(node_p node, char *set, char *ret) else if (sc->framing == E1U) strcat(ret, "line e1u\n"); if (sc->clocksource == INT) - strcat(ret, "clock int\n"); + strcat(ret, "clock source internal\n"); else - strcat(ret, "clock ext\n"); + strcat(ret, "clock source line\n"); return; barf: strcpy(ret, "Syntax Error\n"); @@ -1212,6 +1233,12 @@ musycc_disconnect(hook_p hook) while (csc->state != C_RUNNING) tsleep(&csc->state, PZERO + PCATCH, "crun", hz/10); + /* Deactivate the channel */ + sc->reg->srd = sc->last = 0x0900 + sch->chan; + tsleep(&sc->last, PZERO + PCATCH, "con3", hz); + sc->reg->srd = sc->last = 0x0920 + sch->chan; + tsleep(&sc->last, PZERO + PCATCH, "con4", hz); + if (sch->state == DOWN) return (0); sch->state = DOWN; @@ -1231,12 +1258,6 @@ musycc_disconnect(hook_p hook) FREE(sc->mdr[ch], M_MUSYCC); sc->mdr[ch] = NULL; - /* Deactivate the channel */ - sc->reg->srd = sc->last = 0x0900 + sch->chan; - tsleep(&sc->last, PZERO + PCATCH, "con3", hz); - sc->reg->srd = sc->last = 0x0920 + sch->chan; - tsleep(&sc->last, PZERO + PCATCH, "con4", hz); - for (i = 0; i < 32; i++) { if (sch->ts & (1 << i)) { sc->ram->rtsm[i] = 0; -- cgit v1.3