summaryrefslogtreecommitdiffstats
path: root/sys/dev/musycc
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2000-11-01 22:04:15 +0000
committerphk <phk@FreeBSD.org>2000-11-01 22:04:15 +0000
commit58beb59c8099dfb2d3fa677c29acf501cf78ce09 (patch)
tree0ce38761c1f4683953be6974ebfe62f18013b152 /sys/dev/musycc
parentc7a7ecd8c550ba975d68eaf9ad5d7e25434b8684 (diff)
downloadFreeBSD-src-58beb59c8099dfb2d3fa677c29acf501cf78ce09.zip
FreeBSD-src-58beb59c8099dfb2d3fa677c29acf501cf78ce09.tar.gz
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.
Diffstat (limited to 'sys/dev/musycc')
-rw-r--r--sys/dev/musycc/musycc.c55
1 files changed, 38 insertions, 17 deletions
diff --git a/sys/dev/musycc/musycc.c b/sys/dev/musycc/musycc.c
index 7370def..2184965 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;
OpenPOWER on IntegriCloud