Annotation of sys/dev/pci/bt8370.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: bt8370.c,v 1.7 2006/01/31 16:51:13 claudio Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2004,2005 Internet Business Solutions AG, Zurich, Switzerland
! 5: * Written by: Andre Oppermann <oppermann@accoom.net>
! 6: *
! 7: * Permission to use, copy, modify, and distribute this software for any
! 8: * purpose with or without fee is hereby granted, provided that the above
! 9: * copyright notice and this permission notice appear in all copies.
! 10: *
! 11: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 12: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 13: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 14: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 15: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 16: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
! 17: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 18: */
! 19: #include <sys/param.h>
! 20: #include <sys/types.h>
! 21:
! 22: #include <sys/device.h>
! 23: #include <sys/systm.h>
! 24: #include <sys/socket.h>
! 25: #include <sys/sockio.h>
! 26: #include <sys/syslog.h>
! 27:
! 28: #include <net/if.h>
! 29: #include <net/if_media.h>
! 30: #include <net/if_types.h>
! 31: #include <net/if_sppp.h>
! 32:
! 33: #include <netinet/in.h>
! 34: #include <netinet/if_ether.h>
! 35:
! 36: #include <machine/cpu.h>
! 37: #include <machine/bus.h>
! 38:
! 39: #include "musyccreg.h"
! 40: #include "musyccvar.h"
! 41: #include "if_art.h"
! 42: #include "bt8370reg.h"
! 43:
! 44: #define FRAMER_LIU_E1_120 1
! 45: #define FRAMER_LIU_T1_133 2
! 46:
! 47: void bt8370_set_sbi_clock_mode(struct art_softc *, enum art_sbi_type,
! 48: u_int, int);
! 49: void bt8370_set_bus_mode(struct art_softc *, enum art_sbi_mode, int);
! 50: void bt8370_set_line_buildout(struct art_softc *, int);
! 51: void bt8370_set_loopback_mode(struct art_softc *, enum art_loopback);
! 52: void bt8370_set_bop_mode(struct art_softc *ac, int);
! 53: void bt8370_set_dl_1_mode(struct art_softc *, int);
! 54: void bt8370_set_dl_2_mode(struct art_softc *, int);
! 55: void bt8370_intr_enable(struct art_softc *ac, int);
! 56:
! 57: #ifndef ACCOOM_DEBUG
! 58: #define bt8370_print_status(x)
! 59: #define bt8370_print_counters(x)
! 60: #define bt8370_dump_registers(x)
! 61: #else
! 62: void bt8370_print_status(struct art_softc *);
! 63: void bt8370_print_counters(struct art_softc *);
! 64: void bt8370_dump_registers(struct art_softc *);
! 65: #endif
! 66:
! 67: int
! 68: bt8370_reset(struct art_softc *ac)
! 69: {
! 70: u_int8_t cr0;
! 71:
! 72: ebus_write(&ac->art_ebus, Bt8370_CR0, 0x00);
! 73: DELAY(10); /* 10 microseconds */
! 74: ebus_write(&ac->art_ebus, Bt8370_CR0, CR0_RESET);
! 75: DELAY(20); /* 20 microseconds */
! 76: ebus_write(&ac->art_ebus, Bt8370_CR0, 0x00);
! 77: cr0 = ebus_read(&ac->art_ebus, Bt8370_CR0);
! 78: if (cr0 != 0x0) {
! 79: log(LOG_ERR, "%s: reset not successful\n",
! 80: ac->art_dev.dv_xname);
! 81: return (-1);
! 82: }
! 83: return (0);
! 84: }
! 85:
! 86: int
! 87: bt8370_set_frame_mode(struct art_softc *ac, enum art_sbi_type type, u_int mode,
! 88: u_int clockmode)
! 89: {
! 90: int channels;
! 91:
! 92: /* Get into a clean state */
! 93: bt8370_reset(ac);
! 94:
! 95: /* Disable all interrupts to be sure */
! 96: bt8370_intr_enable(ac, 0);
! 97:
! 98: switch (mode) {
! 99: case IFM_TDM_E1: /* 32 payload channels, bit transparent */
! 100: channels = 32;
! 101:
! 102: /* Global Config */
! 103: ebus_write(&ac->art_ebus, Bt8370_CR0, CR0_E1_FAS);
! 104:
! 105: /* Primary Config */
! 106: bt8370_set_loopback_mode(ac, ART_NOLOOP);
! 107: ebus_write(&ac->art_ebus, Bt8370_DL3_TS, 0x00);
! 108:
! 109: /* Timing and Clock Config */
! 110: bt8370_set_sbi_clock_mode(ac, type, clockmode, channels);
! 111:
! 112: /* Receiver RLIU, RCVR */
! 113: bt8370_set_line_buildout(ac, FRAMER_LIU_E1_120);
! 114: /* This one is critical */
! 115: ebus_write(&ac->art_ebus, Bt8370_RCR0, RCR0_HDB3 |
! 116: RCR0_RABORT | RCR0_LFA_FAS | RCR0_RZCS_NBPV);
! 117: ebus_write(&ac->art_ebus, Bt8370_RALM, 0x00);
! 118: ebus_write(&ac->art_ebus, Bt8370_LATCH, LATCH_STOPCNT);
! 119:
! 120: /* Transmitter TLIU, XMTR */
! 121: ebus_write(&ac->art_ebus, Bt8370_TCR0, TCR0_FAS);
! 122: ebus_write(&ac->art_ebus, Bt8370_TCR1, TCR1_TABORT |
! 123: TCR1_HDB3);
! 124: ebus_write(&ac->art_ebus, Bt8370_TFRM, 0x00);
! 125: ebus_write(&ac->art_ebus, Bt8370_TMAN, 0x00);
! 126: ebus_write(&ac->art_ebus, Bt8370_TALM, 0x00);
! 127: ebus_write(&ac->art_ebus, Bt8370_TPATT, 0x00);
! 128: ebus_write(&ac->art_ebus, Bt8370_TLB, 0x00);
! 129: ebus_write(&ac->art_ebus, Bt8370_TSA4, 0xFF);
! 130: ebus_write(&ac->art_ebus, Bt8370_TSA5, 0xFF);
! 131: ebus_write(&ac->art_ebus, Bt8370_TSA6, 0xFF);
! 132: ebus_write(&ac->art_ebus, Bt8370_TSA7, 0xFF);
! 133: ebus_write(&ac->art_ebus, Bt8370_TSA8, 0xFF);
! 134:
! 135: /* Bit Oriented Protocol Transceiver BOP disabled */
! 136: bt8370_set_bop_mode(ac, 0);
! 137:
! 138: /* Data Link #1 disabled */
! 139: bt8370_set_dl_1_mode(ac, 0);
! 140:
! 141: /* Data Link #2 disabled */
! 142: bt8370_set_dl_2_mode(ac, 0);
! 143:
! 144: ACCOOM_PRINTF(1, ("%s: set to E1 G.703 unframed, HDB3\n",
! 145: ac->art_dev.dv_xname));
! 146: break;
! 147: case IFM_TDM_E1_G704: /* 31 payload channels, byte aligned */
! 148: channels = 32;
! 149:
! 150: /* Global Config */
! 151: ebus_write(&ac->art_ebus, Bt8370_CR0, CR0_E1_FAS);
! 152:
! 153: /* Primary Config */
! 154: bt8370_set_loopback_mode(ac, ART_NOLOOP);
! 155: ebus_write(&ac->art_ebus, Bt8370_DL3_TS, 0x00);
! 156:
! 157: /* Timing and Clock Config */
! 158: bt8370_set_sbi_clock_mode(ac, type, clockmode, channels);
! 159:
! 160: /* Receiver RLIU, RCVR */
! 161: bt8370_set_line_buildout(ac, FRAMER_LIU_E1_120);
! 162: /* This one is critical */
! 163: ebus_write(&ac->art_ebus, Bt8370_RCR0, RCR0_RFORCE |
! 164: RCR0_HDB3 | RCR0_LFA_FAS | RCR0_RZCS_NBPV);
! 165: ebus_write(&ac->art_ebus, Bt8370_RALM, RALM_FSNFAS);
! 166: ebus_write(&ac->art_ebus, Bt8370_LATCH, LATCH_STOPCNT);
! 167:
! 168: /* Transmitter TLIU, XMTR */
! 169: ebus_write(&ac->art_ebus, Bt8370_TCR0, TCR0_FAS);
! 170: /* This one is critical */
! 171: ebus_write(&ac->art_ebus, Bt8370_TCR1, TCR1_TABORT |
! 172: TCR1_3FAS | TCR1_HDB3);
! 173: ebus_write(&ac->art_ebus, Bt8370_TFRM, TFRM_YEL |
! 174: TFRM_FBIT);
! 175: ebus_write(&ac->art_ebus, Bt8370_TMAN, TMAN_MALL);
! 176: ebus_write(&ac->art_ebus, Bt8370_TALM, TALM_AYEL);
! 177: ebus_write(&ac->art_ebus, Bt8370_TPATT, 0x00);
! 178: ebus_write(&ac->art_ebus, Bt8370_TLB, 0x00);
! 179: ebus_write(&ac->art_ebus, Bt8370_TSA4, 0xFF);
! 180: ebus_write(&ac->art_ebus, Bt8370_TSA5, 0xFF);
! 181: ebus_write(&ac->art_ebus, Bt8370_TSA6, 0xFF);
! 182: ebus_write(&ac->art_ebus, Bt8370_TSA7, 0xFF);
! 183: ebus_write(&ac->art_ebus, Bt8370_TSA8, 0xFF);
! 184:
! 185: /* Bit Oriented Protocol Transceiver BOP disabled */
! 186: bt8370_set_bop_mode(ac, 0);
! 187:
! 188: /* Data Link #1 disabled */
! 189: bt8370_set_dl_1_mode(ac, 0);
! 190:
! 191: /* Data Link #2 disabled */
! 192: bt8370_set_dl_2_mode(ac, 0);
! 193:
! 194: ACCOOM_PRINTF(1, ("%s: set to E1 G.704, HDB3\n",
! 195: ac->art_dev.dv_xname));
! 196: break;
! 197: case IFM_TDM_E1_G704_CRC4: /* 31 payload channels, byte aligned */
! 198: channels = 32;
! 199:
! 200: /*
! 201: * Over normal G.704 the following registers need changes:
! 202: * CR0 = +CRC
! 203: * TFRM = +INS_CRC
! 204: */
! 205:
! 206: /* Global Config */
! 207: ebus_write(&ac->art_ebus, Bt8370_CR0, CR0_E1_FAS_CRC);
! 208:
! 209: /* Primary Config */
! 210: bt8370_set_loopback_mode(ac, ART_NOLOOP);
! 211: ebus_write(&ac->art_ebus, Bt8370_DL3_TS, 0x00);
! 212:
! 213: /* Timing and Clock Config */
! 214: bt8370_set_sbi_clock_mode(ac, type, clockmode, channels);
! 215:
! 216: /* Receiver RLIU, RCVR */
! 217: bt8370_set_line_buildout(ac, FRAMER_LIU_E1_120);
! 218: /* This one is critical */
! 219: ebus_write(&ac->art_ebus, Bt8370_RCR0, RCR0_RFORCE |
! 220: RCR0_HDB3 | RCR0_LFA_FASCRC | RCR0_RZCS_NBPV);
! 221: ebus_write(&ac->art_ebus, Bt8370_RALM, RALM_FSNFAS);
! 222: ebus_write(&ac->art_ebus, Bt8370_LATCH, LATCH_STOPCNT);
! 223:
! 224: /* Transmitter TLIU, XMTR */
! 225: ebus_write(&ac->art_ebus, Bt8370_TCR0, TCR0_MFAS);
! 226: /* This one is critical */
! 227: ebus_write(&ac->art_ebus, Bt8370_TCR1, TCR1_TABORT |
! 228: TCR1_3FAS | TCR1_HDB3);
! 229: ebus_write(&ac->art_ebus, Bt8370_TFRM, TFRM_YEL |
! 230: TFRM_MF | TFRM_FE | TFRM_CRC | TFRM_FBIT);
! 231: ebus_write(&ac->art_ebus, Bt8370_TMAN, TMAN_MALL);
! 232: ebus_write(&ac->art_ebus, Bt8370_TALM, TALM_AYEL | TALM_AAIS);
! 233: ebus_write(&ac->art_ebus, Bt8370_TPATT, 0x00);
! 234: ebus_write(&ac->art_ebus, Bt8370_TLB, 0x00);
! 235: ebus_write(&ac->art_ebus, Bt8370_TSA4, 0xFF);
! 236: ebus_write(&ac->art_ebus, Bt8370_TSA5, 0xFF);
! 237: ebus_write(&ac->art_ebus, Bt8370_TSA6, 0xFF);
! 238: ebus_write(&ac->art_ebus, Bt8370_TSA7, 0xFF);
! 239: ebus_write(&ac->art_ebus, Bt8370_TSA8, 0xFF);
! 240:
! 241: /* Bit Oriented Protocol Transceiver BOP disabled */
! 242: bt8370_set_bop_mode(ac, 0);
! 243:
! 244: /* Data Link #1 disabled */
! 245: bt8370_set_dl_1_mode(ac, 0);
! 246:
! 247: /* Data Link #2 disabled */
! 248: bt8370_set_dl_2_mode(ac, 0);
! 249:
! 250: ACCOOM_PRINTF(1, ("%s: set to E1 G.704 CRC4, HDB3\n",
! 251: ac->art_dev.dv_xname));
! 252: break;
! 253: case IFM_TDM_T1_AMI: /* 24 payload channels, byte aligned */
! 254: channels = 25; /* zero is ignored for T1 */
! 255:
! 256: /* Global Config */
! 257: ebus_write(&ac->art_ebus, Bt8370_CR0, CR0_T1_SF);
! 258:
! 259: /* Primary Config */
! 260: bt8370_set_loopback_mode(ac, ART_NOLOOP);
! 261: ebus_write(&ac->art_ebus, Bt8370_DL3_TS, 0x00);
! 262:
! 263: /* Timing and Clock Config */
! 264: bt8370_set_sbi_clock_mode(ac, type, clockmode, channels);
! 265:
! 266: /* Receiver RLIU, RCVR */
! 267: bt8370_set_line_buildout(ac, FRAMER_LIU_T1_133);
! 268: /* This one is critical */
! 269: ebus_write(&ac->art_ebus, Bt8370_RCR0, RCR0_RFORCE |
! 270: RCR0_AMI | RCR0_LFA_26F | RCR0_RZCS_NBPV);
! 271: ebus_write(&ac->art_ebus, Bt8370_RALM, RALM_FSNFAS);
! 272: ebus_write(&ac->art_ebus, Bt8370_LATCH, LATCH_STOPCNT);
! 273:
! 274: /* Transmitter TLIU, XMTR */
! 275: ebus_write(&ac->art_ebus, Bt8370_TCR0, TCR0_SF);
! 276: /* This one is critical */
! 277: ebus_write(&ac->art_ebus, Bt8370_TCR1, TCR1_TABORT |
! 278: TCR1_26F | TCR1_AMI);
! 279: ebus_write(&ac->art_ebus, Bt8370_TFRM, TFRM_YEL |
! 280: TFRM_MF | TFRM_FBIT);
! 281: ebus_write(&ac->art_ebus, Bt8370_TMAN, 0x00);
! 282: ebus_write(&ac->art_ebus, Bt8370_TALM, TALM_AYEL);
! 283: ebus_write(&ac->art_ebus, Bt8370_TPATT, 0x00);
! 284: ebus_write(&ac->art_ebus, Bt8370_TLB, 0x00);
! 285: ebus_write(&ac->art_ebus, Bt8370_TSA4, 0xFF);
! 286: ebus_write(&ac->art_ebus, Bt8370_TSA5, 0xFF);
! 287: ebus_write(&ac->art_ebus, Bt8370_TSA6, 0xFF);
! 288: ebus_write(&ac->art_ebus, Bt8370_TSA7, 0xFF);
! 289: ebus_write(&ac->art_ebus, Bt8370_TSA8, 0xFF);
! 290:
! 291: /* Bit Oriented Protocol Transceiver BOP disabled */
! 292: bt8370_set_bop_mode(ac, 0);
! 293:
! 294: /* Data Link #1 disabled */
! 295: bt8370_set_dl_1_mode(ac, 0);
! 296:
! 297: /* Data Link #2 disabled */
! 298: bt8370_set_dl_2_mode(ac, 0);
! 299:
! 300: ACCOOM_PRINTF(1, ("%s: set to T1 SF, AMI\n",
! 301: ac->art_dev.dv_xname));
! 302: break;
! 303: case IFM_TDM_T1: /* 24 payload channels, byte aligned */
! 304: channels = 25; /* zero is ignored for T1 */
! 305:
! 306: /* Global Config */
! 307: ebus_write(&ac->art_ebus, Bt8370_CR0, CR0_T1_ESF);
! 308:
! 309: /* Primary Config */
! 310: bt8370_set_loopback_mode(ac, ART_NOLOOP);
! 311: ebus_write(&ac->art_ebus, Bt8370_DL3_TS, 0x00);
! 312:
! 313: /* Timing and Clock Config */
! 314: bt8370_set_sbi_clock_mode(ac, type, clockmode, channels);
! 315:
! 316: /* Receiver RLIU, RCVR */
! 317: bt8370_set_line_buildout(ac, FRAMER_LIU_T1_133);
! 318: /* This one is critical */
! 319: ebus_write(&ac->art_ebus, Bt8370_RCR0, RCR0_RFORCE |
! 320: RCR0_B8ZS | RCR0_LFA_26F | RCR0_RZCS_NBPV);
! 321: ebus_write(&ac->art_ebus, Bt8370_RLB, 0x09);
! 322: ebus_write(&ac->art_ebus, Bt8370_LBA, 0x08);
! 323: ebus_write(&ac->art_ebus, Bt8370_LBD, 0x24);
! 324: ebus_write(&ac->art_ebus, Bt8370_RALM, 0x00);
! 325: ebus_write(&ac->art_ebus, Bt8370_LATCH, LATCH_STOPCNT);
! 326:
! 327: /* Transmitter TLIU, XMTR */
! 328: ebus_write(&ac->art_ebus, Bt8370_TCR0, TCR0_ESFCRC);
! 329: /* This one is critical */
! 330: ebus_write(&ac->art_ebus, Bt8370_TCR1, TCR1_TABORT |
! 331: TCR1_26F | TCR1_B8ZS);
! 332: ebus_write(&ac->art_ebus, Bt8370_TFRM, TFRM_CRC |
! 333: TFRM_FBIT);
! 334: ebus_write(&ac->art_ebus, Bt8370_TMAN, 0x00);
! 335: ebus_write(&ac->art_ebus, Bt8370_TALM, TALM_AYEL);
! 336: ebus_write(&ac->art_ebus, Bt8370_TPATT, 0x00);
! 337: ebus_write(&ac->art_ebus, Bt8370_TLB, 0x00);
! 338: ebus_write(&ac->art_ebus, Bt8370_TSA4, 0xFF);
! 339: ebus_write(&ac->art_ebus, Bt8370_TSA5, 0xFF);
! 340: ebus_write(&ac->art_ebus, Bt8370_TSA6, 0xFF);
! 341: ebus_write(&ac->art_ebus, Bt8370_TSA7, 0xFF);
! 342: ebus_write(&ac->art_ebus, Bt8370_TSA8, 0xFF);
! 343:
! 344: /* Bit Oriented Protocol Transceiver BOP setup */
! 345: bt8370_set_bop_mode(ac, ART_BOP_ESF);
! 346:
! 347: /* Data Link #1 set to BOP mode for FDL */
! 348: bt8370_set_dl_1_mode(ac, ART_DL1_BOP);
! 349:
! 350: /* Data Link #2 disabled */
! 351: bt8370_set_dl_2_mode(ac, 0);
! 352:
! 353: ACCOOM_PRINTF(1, ("%s: set to T1 ESF CRC6, B8ZS\n",
! 354: ac->art_dev.dv_xname));
! 355: break;
! 356: /*
! 357: * case FAS_BSLIP:
! 358: * case FAS_CRC_BSLIP:
! 359: * case FAS_CAS:
! 360: * case FAS_CAS_BSLIP:
! 361: * case FAS_CRC_CAS:
! 362: * case FAS_CRC_CAS_BSLIP:
! 363: * case FT:
! 364: * case ESF_NOCRC:
! 365: * case SF_JYEL:
! 366: * case SF_T1DM:
! 367: * case SLC_FSLOF:
! 368: * case SLC:
! 369: * case ESF_xx (MimicCRC, ForceCRC?)
! 370: *
! 371: * are not yet implemented.
! 372: * If you need one of them please contact us.
! 373: */
! 374: default:
! 375: return (-1);
! 376: }
! 377: return (0);
! 378: }
! 379:
! 380: void
! 381: bt8370_set_sbi_clock_mode(struct art_softc *ac, enum art_sbi_type mode,
! 382: u_int linemode, int channels)
! 383: {
! 384: u_int8_t cmux, jatcr;
! 385:
! 386: /*
! 387: * mode is either master or slave.
! 388: * linemode is either T1 (1544) or E1 (2048) external or internal.
! 389: */
! 390: switch (mode) {
! 391: case ART_SBI_MASTER:
! 392: ACCOOM_PRINTF(1, ("%s: set to MASTER\n",
! 393: ac->art_dev.dv_xname));
! 394: /*
! 395: * ONESEC pulse output,
! 396: * RDL/TDL/INDY ignored,
! 397: * RFSYNC Receive Frame Sync output,
! 398: * RMSYNC Reveice MultiFrame Sync output,
! 399: * TFYNC Transmit Frame Sync output,
! 400: * TMSYNC Transmit MultiFrame Sync output.
! 401: */
! 402: ebus_write(&ac->art_ebus, Bt8370_PIO, PIO_ONESEC_IO |
! 403: PIO_TDL_IO | PIO_RFSYNC_IO | PIO_RMSYNC_IO |
! 404: PIO_TFSYNC_IO | PIO_TMSYNC_IO);
! 405: /*
! 406: * TDL/RDL/INDY/TCKO three-stated.
! 407: * CLADO enabled, drives SBI bus RCLK, TCLK and
! 408: * is connected to own TSBCKI and TSBCKI on slave.
! 409: * RCKO enabled, is connected to TCKI on slave.
! 410: */
! 411: ebus_write(&ac->art_ebus, Bt8370_POE, POE_TDL_OE |
! 412: POE_RDL_OE | POE_INDY_OE | POE_TCKO_OE);
! 413: /*
! 414: * We are the SBI bus master and take clock from our own
! 415: * CLADO. The TCKI source depends on line or internal
! 416: * clocking.
! 417: */
! 418: cmux = CMUX_RSBCKI_CLADO | CMUX_TSBCKI_CLADO |
! 419: CMUX_CLADI_CLADI;
! 420: break;
! 421: case ART_SBI_SLAVE:
! 422: ACCOOM_PRINTF(1, ("%s: set to SLAVE\n",
! 423: ac->art_dev.dv_xname));
! 424: /*
! 425: * ONESEC pulse input,
! 426: * RDL/TDL/INDY ignored,
! 427: * RFSYNC Receive Frame Sync input,
! 428: * RMSYNC Reveice MultiFrame Sync input,
! 429: * TFYNC Transmit Frame Sync input,
! 430: * TMSYNC Transmit MultiFrame Sync input.
! 431: */
! 432: ebus_write(&ac->art_ebus, Bt8370_PIO, PIO_TDL_IO);
! 433: /*
! 434: * TDL/RDL/INDY/TCKO three-stated.
! 435: * CLADO enabled, is connected to own ACKI and
! 436: * RSBCKI, ACKI on master.
! 437: * RCKO enabled, is connected to TCKI on master.
! 438: */
! 439: ebus_write(&ac->art_ebus, Bt8370_POE, POE_TDL_OE |
! 440: POE_RDL_OE | POE_INDY_OE | POE_TCKO_OE);
! 441: /*
! 442: * We are the SBI bus slave and take clock from TSBCKI.
! 443: * The TCKI source depends on line or internal clocking.
! 444: */
! 445: cmux = CMUX_RSBCKI_TSBCKI | CMUX_TSBCKI_TSBCKI |
! 446: CMUX_CLADI_CLADI;
! 447: break;
! 448: case ART_SBI_SINGLE:
! 449: ACCOOM_PRINTF(1, ("%s: set to SINGLE\n",
! 450: ac->art_dev.dv_xname));
! 451: /*
! 452: * ONESEC pulse output,
! 453: * RDL/TDL/INDY ignored,
! 454: * RFSYNC Receive Frame Sync output,
! 455: * RMSYNC Reveice MultiFrame Sync output,
! 456: * TFSYNC Transmit Frame Sync output,
! 457: * TMSYNC Transmit MultiFrame Sync output.
! 458: */
! 459: ebus_write(&ac->art_ebus, Bt8370_PIO, PIO_ONESEC_IO |
! 460: PIO_TDL_IO | PIO_RFSYNC_IO | PIO_RMSYNC_IO |
! 461: PIO_TFSYNC_IO | PIO_TMSYNC_IO);
! 462: /*
! 463: * TDL/RDL/INDY/TCKO three-stated, CLADO/RCKO enabled.
! 464: */
! 465: ebus_write(&ac->art_ebus, Bt8370_POE, POE_TDL_OE |
! 466: POE_RDL_OE | POE_INDY_OE | POE_RCKO_OE);
! 467: /*
! 468: * We are the SBI bus master and take clock from our own
! 469: * CLADO. The TCKI source is always CLADO (jitter attenuated
! 470: * if receive clock).
! 471: */
! 472: cmux = CMUX_RSBCKI_CLADO | CMUX_TSBCKI_CLADO |
! 473: CMUX_CLADI_RCKO;
! 474: break;
! 475: }
! 476:
! 477: /* Transmit clock from where? */
! 478: switch (linemode) {
! 479: case IFM_TDM_MASTER:
! 480: ACCOOM_PRINTF(1, ("%s: clock MASTER\n",
! 481: ac->art_dev.dv_xname));
! 482: if (mode == ART_SBI_MASTER)
! 483: cmux |= CMUX_TCKI_RSBCKI;
! 484: else
! 485: cmux |= CMUX_TCKI_CLADO;
! 486: jatcr = JAT_CR_JFREE;
! 487: break;
! 488: /* case ART_CLOCK_EXTREF: */
! 489: default:
! 490: ACCOOM_PRINTF(1, ("%s: clock LINE\n",
! 491: ac->art_dev.dv_xname));
! 492: cmux |= CMUX_TCKI_RCKO;
! 493: jatcr = JAT_CR_JEN | JAT_CR_JDIR_RX | JAT_CR_JSIZE32;
! 494: break;
! 495: }
! 496:
! 497: ebus_write(&ac->art_ebus, Bt8370_CMUX, cmux);
! 498: ebus_write(&ac->art_ebus, Bt8370_JAT_CR, jatcr);
! 499:
! 500: /* Set up the SBI (System Bus Interface) and clock source. */
! 501: switch (mode) {
! 502: case ART_SBI_MASTER:
! 503: ebus_write(&ac->art_ebus, Bt8370_CSEL, CSEL_VSEL_4096 |
! 504: CSEL_OSEL_4096);
! 505: bt8370_set_bus_mode(ac, SBI_MODE_4096_A, channels);
! 506: /* no need to set musycc port mode */
! 507: break;
! 508: case ART_SBI_SLAVE:
! 509: /*
! 510: * On the slave the CLADO depends on the line type
! 511: * of the master.
! 512: */
! 513: bt8370_set_bus_mode(ac, SBI_MODE_4096_B, channels);
! 514: /* no need to set musycc port mode */
! 515: break;
! 516: case ART_SBI_SINGLE:
! 517: if (channels == 25) {
! 518: ACCOOM_PRINTF(1, ("%s: SINGLE T1\n",
! 519: ac->art_dev.dv_xname));
! 520: ebus_write(&ac->art_ebus, Bt8370_CSEL, CSEL_VSEL_1544 |
! 521: CSEL_OSEL_1544);
! 522: bt8370_set_bus_mode(ac, SBI_MODE_1544, channels);
! 523: musycc_set_port(ac->art_channel->cc_group,
! 524: MUSYCC_PORT_MODE_T1);
! 525: } else {
! 526: ACCOOM_PRINTF(1, ("%s: SINGLE E1\n",
! 527: ac->art_dev.dv_xname));
! 528: ebus_write(&ac->art_ebus, Bt8370_CSEL, CSEL_VSEL_2048 |
! 529: CSEL_OSEL_2048);
! 530: bt8370_set_bus_mode(ac, SBI_MODE_2048, channels);
! 531: musycc_set_port(ac->art_channel->cc_group,
! 532: MUSYCC_PORT_MODE_E1);
! 533: }
! 534: break;
! 535: }
! 536: ebus_write(&ac->art_ebus, Bt8370_CLAD_CR, CLAD_CR_LFGAIN);
! 537: }
! 538:
! 539: void
! 540: bt8370_set_bus_mode(struct art_softc *ac, enum art_sbi_mode mode, int nchannels)
! 541: {
! 542: bus_size_t channel;
! 543:
! 544: /*
! 545: * Be aware that on the CN847x 'TSYNC_EDGE' has to be set to
! 546: * 'raising edge' in the port config for this to work correctly.
! 547: * All others (including RSYNC) are on 'falling edge'.
! 548: */
! 549: ebus_write(&ac->art_ebus, Bt8370_RSB_CR, RSB_CR_BUS_RSB |
! 550: RSB_CR_SIG_OFF | RSB_CR_RPCM_NEG | RSB_CR_RSYN_NEG |
! 551: RSB_CR_RSB_CTR | TSB_CR_TSB_NORMAL);
! 552: ebus_write(&ac->art_ebus, Bt8370_RSYNC_BIT, 0x00);
! 553: ebus_write(&ac->art_ebus, Bt8370_RSYNC_TS, 0x00);
! 554: ebus_write(&ac->art_ebus, Bt8370_TSB_CR, TSB_CR_BUS_TSB |
! 555: TSB_CR_TPCM_NEG | TSB_CR_TSYN_NEG | TSB_CR_TSB_CTR |
! 556: TSB_CR_TSB_NORMAL);
! 557: ebus_write(&ac->art_ebus, Bt8370_TSYNC_BIT, 0x00);
! 558: ebus_write(&ac->art_ebus, Bt8370_TSYNC_TS, 0x00);
! 559: ebus_write(&ac->art_ebus, Bt8370_RSIG_CR, 0x00);
! 560: ebus_write(&ac->art_ebus, Bt8370_RSYNC_FRM, 0x00);
! 561:
! 562: /* Mode dependent */
! 563: switch (mode) {
! 564: case SBI_MODE_1536:
! 565: ebus_write(&ac->art_ebus, Bt8370_SBI_CR, SBI_CR_SBI_OE |
! 566: SBI_CR_1536);
! 567: break;
! 568: case SBI_MODE_1544:
! 569: ebus_write(&ac->art_ebus, Bt8370_SBI_CR, SBI_CR_SBI_OE |
! 570: SBI_CR_1544);
! 571: break;
! 572: case SBI_MODE_2048:
! 573: ebus_write(&ac->art_ebus, Bt8370_SBI_CR, SBI_CR_SBI_OE |
! 574: SBI_CR_2048);
! 575: break;
! 576: case SBI_MODE_4096_A:
! 577: ebus_write(&ac->art_ebus, Bt8370_SBI_CR, SBI_CR_SBI_OE |
! 578: SBI_CR_4096_A);
! 579: break;
! 580: case SBI_MODE_4096_B:
! 581: ebus_write(&ac->art_ebus, Bt8370_SBI_CR, SBI_CR_SBI_OE |
! 582: SBI_CR_4096_B);
! 583: break;
! 584: case SBI_MODE_8192_A:
! 585: ebus_write(&ac->art_ebus, Bt8370_SBI_CR, SBI_CR_SBI_OE |
! 586: SBI_CR_8192_A);
! 587: break;
! 588: case SBI_MODE_8192_B:
! 589: ebus_write(&ac->art_ebus, Bt8370_SBI_CR, SBI_CR_SBI_OE |
! 590: SBI_CR_8192_B);
! 591: break;
! 592: case SBI_MODE_8192_C:
! 593: ebus_write(&ac->art_ebus, Bt8370_SBI_CR, SBI_CR_SBI_OE |
! 594: SBI_CR_8192_C);
! 595: break;
! 596: case SBI_MODE_8192_D:
! 597: ebus_write(&ac->art_ebus, Bt8370_SBI_CR, SBI_CR_SBI_OE |
! 598: SBI_CR_8192_D);
! 599: break;
! 600: }
! 601:
! 602: /* Initialize and reset all channels */
! 603: for (channel = 0; channel < 32; channel++) {
! 604: ebus_write(&ac->art_ebus, Bt8370_SBCn + channel, 0x00);
! 605: ebus_write(&ac->art_ebus, Bt8370_TPCn + channel, 0x00);
! 606: ebus_write(&ac->art_ebus, Bt8370_TSIGn + channel, 0x00);
! 607: ebus_write(&ac->art_ebus, Bt8370_TSLIP_LOn + channel, 0x7e);
! 608: ebus_write(&ac->art_ebus, Bt8370_RSLIP_LOn + channel, 0x7e);
! 609: ebus_write(&ac->art_ebus, Bt8370_RPCn + channel, 0x00);
! 610: }
! 611:
! 612: /* Configure used channels */
! 613: for (channel = Bt8370_SBCn; channel < Bt8370_SBCn +
! 614: nchannels; channel++) {
! 615: ebus_write(&ac->art_ebus, channel, SBCn_RINDO |
! 616: SBCn_TINDO | SBCn_ASSIGN);
! 617: /* In T1 mode timeslot 0 must not be used. */
! 618: if (nchannels == 25 && channel == Bt8370_SBCn)
! 619: ebus_write(&ac->art_ebus, channel, 0x00);
! 620: }
! 621: for (channel = Bt8370_TPCn; channel < Bt8370_TPCn +
! 622: nchannels; channel++) {
! 623: ebus_write(&ac->art_ebus, channel, TPCn_CLEAR);
! 624: }
! 625: for (channel = Bt8370_RPCn; channel < Bt8370_RPCn +
! 626: nchannels; channel++) {
! 627: ebus_write(&ac->art_ebus, channel, RPCn_CLEAR);
! 628: }
! 629: }
! 630:
! 631: void
! 632: bt8370_set_line_buildout(struct art_softc *ac, int mode)
! 633: {
! 634: /*
! 635: * LIU Stuff: Send and Reveive side
! 636: * T1: 0-133, 133-266, 266-399, 399-533, 533-655,
! 637: * Long-Haul FCC Part 68.
! 638: * E1: ITU-T G.703 120 Ohm Twisted Pair.
! 639: */
! 640:
! 641: ebus_write(&ac->art_ebus, Bt8370_RLIU_CR, RLIU_CR_FRZ_SHORT |
! 642: RLIU_CR_AGC2048 | RLIU_CR_LONG_EYE);
! 643:
! 644: switch (mode) {
! 645: case FRAMER_LIU_T1_133:
! 646: /* Short haul */
! 647: ebus_write(&ac->art_ebus, Bt8370_VGA_MAX, 0x1F);
! 648: /* Force EQ off */
! 649: ebus_write(&ac->art_ebus, Bt8370_PRE_EQ, 0xA6);
! 650:
! 651: ebus_write(&ac->art_ebus, Bt8370_TLIU_CR, TLIU_CR_100);
! 652: break;
! 653: #if 0
! 654: case FRAMER_LIU_T1_266:
! 655: case FRAMER_LIU_T1_399:
! 656: case FRAMER_LIU_T1_533:
! 657: case FRAMER_LIU_T1_655:
! 658: case FRAMER_LIU_T1_LH68:
! 659: #endif
! 660: case FRAMER_LIU_E1_120:
! 661: /* Short haul */
! 662: ebus_write(&ac->art_ebus, Bt8370_VGA_MAX, 0x1F);
! 663: /* Force EQ off */
! 664: ebus_write(&ac->art_ebus, Bt8370_PRE_EQ, 0xA6);
! 665:
! 666: ebus_write(&ac->art_ebus, Bt8370_TLIU_CR, TLIU_CR_120);
! 667: break;
! 668: }
! 669:
! 670: /*
! 671: * Run this last. The RLIU reset causes the values written above
! 672: * to be activated.
! 673: */
! 674: ebus_write(&ac->art_ebus, Bt8370_LIU_CR, LIU_CR_MAGIC |
! 675: LIU_CR_SQUELCH | LIU_CR_RST_LIU);
! 676: }
! 677:
! 678: void
! 679: bt8370_set_loopback_mode(struct art_softc *ac, enum art_loopback mode)
! 680: {
! 681: switch (mode) {
! 682: case ART_RLOOP_PAYLOAD: /* Remote digital payload loopback */
! 683: ebus_write(&ac->art_ebus, Bt8370_LOOP, LOOP_PLOOP);
! 684: break;
! 685: case ART_RLOOP_LINE: /* Remote analog line signal loopback */
! 686: ebus_write(&ac->art_ebus, Bt8370_LOOP, LOOP_LLOOP);
! 687: break;
! 688: case ART_LLOOP_PAYLOAD: /* Local digital payload loopback */
! 689: ebus_write(&ac->art_ebus, Bt8370_LOOP, LOOP_FLOOP);
! 690: break;
! 691: case ART_LLOOP_LINE: /* Local analog line signal loopback */
! 692: ebus_write(&ac->art_ebus, Bt8370_LOOP, LOOP_ALOOP);
! 693: break;
! 694: case ART_NOLOOP: /* Disable all loopbacks */
! 695: ebus_write(&ac->art_ebus, Bt8370_LOOP, 0x00);
! 696: break;
! 697: }
! 698: }
! 699:
! 700: void
! 701: bt8370_set_bop_mode(struct art_softc *ac, int mode)
! 702: {
! 703: /* disabled or ESF mode */
! 704: switch (mode) {
! 705: case ART_BOP_ESF:
! 706: ebus_write(&ac->art_ebus, Bt8370_BOP, 0x9A);
! 707: break;
! 708: default:
! 709: ebus_write(&ac->art_ebus, Bt8370_BOP, 0x00);
! 710: break;
! 711: }
! 712: }
! 713:
! 714: void
! 715: bt8370_set_dl_1_mode(struct art_softc *ac, int mode)
! 716: {
! 717: /*
! 718: * We don't support the builtin HDLC controllers,
! 719: * however some DL1 registers are used for the BOP
! 720: * in ESF mode.
! 721: */
! 722: switch (mode) {
! 723: case ART_DL1_BOP:
! 724: ebus_write(&ac->art_ebus, Bt8370_DL1_TS, 0x40);
! 725: ebus_write(&ac->art_ebus, Bt8370_DL1_CTL, 0x03);
! 726: ebus_write(&ac->art_ebus, Bt8370_RDL1_FFC, 0x0A);
! 727: ebus_write(&ac->art_ebus, Bt8370_PRM1, 0x80);
! 728: ebus_write(&ac->art_ebus, Bt8370_TDL1_FEC, 0x0A);
! 729: break;
! 730: default:
! 731: ebus_write(&ac->art_ebus, Bt8370_RDL1_FFC, 0x0A);
! 732: ebus_write(&ac->art_ebus, Bt8370_TDL1, 0x00);
! 733: break;
! 734: }
! 735: }
! 736:
! 737: void
! 738: bt8370_set_dl_2_mode(struct art_softc *ac, int mode)
! 739: {
! 740: /* We don't support the builtin HDLC controllers. */
! 741: ebus_write(&ac->art_ebus, Bt8370_RDL2_FFC, 0x0A);
! 742: ebus_write(&ac->art_ebus, Bt8370_TDL2, 0x00);
! 743: }
! 744:
! 745: void
! 746: bt8370_intr_enable(struct art_softc *ac, int intr)
! 747: {
! 748: switch (intr) {
! 749: default:
! 750: /* Disable all interrupts */
! 751: ebus_write(&ac->art_ebus, Bt8370_IER7, 0x00);
! 752: ebus_write(&ac->art_ebus, Bt8370_IER6, 0x00);
! 753: ebus_write(&ac->art_ebus, Bt8370_IER5, 0x00);
! 754: ebus_write(&ac->art_ebus, Bt8370_IER4, 0x00);
! 755: ebus_write(&ac->art_ebus, Bt8370_IER3, 0x00);
! 756: ebus_write(&ac->art_ebus, Bt8370_IER2, 0x00);
! 757: ebus_write(&ac->art_ebus, Bt8370_IER1, 0x00);
! 758: ebus_write(&ac->art_ebus, Bt8370_IER0, 0x00);
! 759: break;
! 760: }
! 761: return;
! 762: }
! 763:
! 764: void
! 765: bt8370_intr(struct art_softc *ac)
! 766: {
! 767: u_int8_t irr, alrm;
! 768:
! 769: /* IRR tells us which interrupt class fired. */
! 770: irr = ebus_read(&ac->art_ebus, Bt8370_IRR);
! 771: /* If it wasn't us don't waste time. */
! 772: if (irr == 0x00)
! 773: return;
! 774:
! 775: /* Reding the interrupt service registers clears them. */
! 776: alrm = ebus_read(&ac->art_ebus, Bt8370_ISR7);
! 777: alrm = ebus_read(&ac->art_ebus, Bt8370_ISR6);
! 778: alrm = ebus_read(&ac->art_ebus, Bt8370_ISR5);
! 779: alrm = ebus_read(&ac->art_ebus, Bt8370_ISR4);
! 780: alrm = ebus_read(&ac->art_ebus, Bt8370_ISR3);
! 781: alrm = ebus_read(&ac->art_ebus, Bt8370_ISR2);
! 782: alrm = ebus_read(&ac->art_ebus, Bt8370_ISR1);
! 783: alrm = ebus_read(&ac->art_ebus, Bt8370_ISR0);
! 784:
! 785: /* IRR should be zero now or something went wrong. */
! 786: irr = ebus_read(&ac->art_ebus, Bt8370_IRR);
! 787: if (irr != 0x00)
! 788: ACCOOM_PRINTF(0, ("%s: Interrupts did not clear properly\n",
! 789: ac->art_dev.dv_xname));
! 790: return;
! 791: }
! 792:
! 793: int
! 794: bt8370_link_status(struct art_softc *ac)
! 795: {
! 796: u_int8_t rstat, alm1, alm2, alm3, alm1mask;
! 797: int status = 1;
! 798:
! 799: /*
! 800: * 1 everything fine
! 801: * 0 framing problems but link detected
! 802: * -1 no link detected
! 803: */
! 804:
! 805: alm1mask = ALM1_RYEL | ALM1_RAIS | ALM1_RALOS | ALM1_RLOF;
! 806: /*
! 807: * XXX don't check RYEL in T1 mode it toggles more or less
! 808: * regular.
! 809: */
! 810: if (IFM_SUBTYPE(ac->art_media) == IFM_TDM_T1)
! 811: alm1mask &= ~ALM1_RYEL;
! 812:
! 813: rstat = ebus_read(&ac->art_ebus, Bt8370_RSTAT);
! 814: alm1 = ebus_read(&ac->art_ebus, Bt8370_ALM1);
! 815: alm2 = ebus_read(&ac->art_ebus, Bt8370_ALM2);
! 816: alm3 = ebus_read(&ac->art_ebus, Bt8370_ALM3);
! 817:
! 818: if ((rstat & (RSTAT_EXZ | RSTAT_BPV)) ||
! 819: (alm1 & alm1mask) || (alm3 & (ALM3_SEF)))
! 820: status = 0;
! 821:
! 822: if ((alm1 & (ALM1_RLOS)) ||
! 823: (alm2 & (ALM2_TSHORT)))
! 824: status = -1;
! 825:
! 826: return (status);
! 827: }
! 828:
! 829: #ifdef ACCOOM_DEBUG
! 830: void
! 831: bt8370_print_status(struct art_softc *ac)
! 832: {
! 833: u_int8_t fstat, rstat, vga, alm1, alm2, alm3, sstat, loop;
! 834:
! 835: /* FSTAT Register. */
! 836: fstat = ebus_read(&ac->art_ebus, Bt8370_FSTAT);
! 837: printf("%s: Current FSTAT:\n", ac->art_dev.dv_xname);
! 838: if (fstat & FSTAT_ACTIVE) {
! 839: printf("\tOffline Framer active ");
! 840: if (fstat & FSTAT_RXTXN)
! 841: printf("in Receive direction\n");
! 842: else
! 843: printf("in Transmit direction\n");
! 844: if (fstat & FSTAT_INVALID)
! 845: printf("\tNo Candidate found\n");
! 846: if (fstat & FSTAT_FOUND)
! 847: printf("\tFrame Alignment found\n");
! 848: if (fstat & FSTAT_TIMEOUT)
! 849: printf("\tFramer Search timeout\n");
! 850: } else
! 851: printf("\tOffline inactive\n");
! 852:
! 853: /* RSTAT and VGA Register. */
! 854: rstat = ebus_read(&ac->art_ebus, Bt8370_RSTAT);
! 855: printf("%s: Current RSTAT:\n", ac->art_dev.dv_xname);
! 856: if (rstat & RSTAT_CPDERR)
! 857: printf("\tCLAD phase detector lost lock to CLADI reference\n");
! 858: if (rstat & RSTAT_ZCSUB)
! 859: printf("\tHDB3/B8ZS pattern detected\n");
! 860: if (rstat & RSTAT_EXZ)
! 861: printf("\tExcessive zeros detected\n");
! 862: if (rstat & RSTAT_BPV)
! 863: printf("\tBipolar violations\n");
! 864: if (rstat & RSTAT_EYEOPEN)
! 865: printf("\tReceived signal valid and RPLL locked\n");
! 866: else
! 867: printf("\tReceived signal invalid\n");
! 868: if (rstat & RSTAT_PRE_EQ)
! 869: printf("\tPre-Equalizer is ON\n");
! 870: else
! 871: printf("\tPre-Equalizer is OFF\n");
! 872: /* Need to write something to cause internal update. */
! 873: ebus_write(&ac->art_ebus, Bt8370_VGA, 0x00);
! 874: vga = ebus_read(&ac->art_ebus, Bt8370_VGA);
! 875: printf("\t%i dB Gain\n", vga);
! 876:
! 877: /* Alarm 1 Status. */
! 878: alm1 = ebus_read(&ac->art_ebus, Bt8370_ALM1);
! 879: printf("%s: Current ALM1:\n", ac->art_dev.dv_xname);
! 880: if (alm1 & ALM1_RMYEL)
! 881: printf("\tMultiframe Yellow Alarm [MYEL]\n");
! 882: if (alm1 & ALM1_RYEL)
! 883: printf("\tYellow Alarm [YEL]\n");
! 884: if (alm1 & ALM1_RAIS)
! 885: printf("\tRemote Alarm Indication [RAIS]\n");
! 886: if (alm1 & ALM1_RALOS)
! 887: printf("\tAnalog Loss of Signal or RCKI Loss of Clock [RALOS]\n");
! 888: if (alm1 & ALM1_RLOS)
! 889: printf("\tLoss of Signal [RLOS]\n");
! 890: if (alm1 & ALM1_RLOF)
! 891: printf("\tLoss of Frame Alignment [RLOF]\n");
! 892: if (alm1 & ALM1_SIGFRZ)
! 893: printf("\tSignalling Freeze\n");
! 894:
! 895: /* Alarm 2 Status. */
! 896: alm2 = ebus_read(&ac->art_ebus, Bt8370_ALM2);
! 897: printf("%s: Current ALM2:\n", ac->art_dev.dv_xname);
! 898: if (alm2 & ALM2_LOOPDN)
! 899: printf("\tLOOPDN code detected\n");
! 900: if (alm2 & ALM2_LOOPUP)
! 901: printf("\tLOOPUP code detected\n");
! 902: if (alm2 & ALM2_TSHORT)
! 903: printf("\tTransmitter short circuit\n");
! 904: if (alm2 & ALM2_TLOC)
! 905: printf("\tTransmit loss of clock (relative to ACKI)\n");
! 906: if (alm2 & ALM2_TLOF)
! 907: printf("\tTransmit loss of frame alignment (ignored)\n");
! 908:
! 909: /* Alarm 3 Status. */
! 910: alm3 = ebus_read(&ac->art_ebus, Bt8370_ALM3);
! 911: printf("%s: Current ALM3:\n", ac->art_dev.dv_xname);
! 912: if (alm3 & ALM3_RMAIS)
! 913: printf("\tRMAIS TS16 Alarm Indication Signal\n");
! 914: if (alm3 & ALM3_SEF)
! 915: printf("\tSeverely Errored Frame encountered\n");
! 916: if (alm3 & ALM3_SRED)
! 917: printf("\tLoss of CAS Alignment\n");
! 918: if (alm3 & ALM3_MRED)
! 919: printf("\tLoss of MFAS Alignment\n");
! 920: if (alm3 & ALM3_FRED)
! 921: printf("\tLoss of T1/FAS Alignment\n");
! 922: /* LOF omitted */
! 923:
! 924: /* Slip Buffer Status. */
! 925: sstat = ebus_read(&ac->art_ebus, Bt8370_SSTAT);
! 926: printf("%s: Current SSTAT:\n", ac->art_dev.dv_xname);
! 927: if (sstat & SSTAT_TFSLIP) {
! 928: if (sstat & SSTAT_TUSLIP)
! 929: printf("\tControlled Transmit Slip, ");
! 930: else
! 931: printf("\tUncontrolled Transmit Slip, ");
! 932: if (sstat & SSTAT_TSDIR)
! 933: printf("repeated one frame\n");
! 934: else
! 935: printf("deleted one frame\n");
! 936: } else if (sstat & SSTAT_RFSLIP) {
! 937: if (sstat & SSTAT_RUSLIP)
! 938: printf("\tControlled Receive Slip, ");
! 939: else
! 940: printf("\tUncontrolled Receive Slip, ");
! 941: if (sstat & SSTAT_RSDIR)
! 942: printf("repeated one frame\n");
! 943: else
! 944: printf("deleted one frame\n");
! 945: }
! 946:
! 947: /* Loopback Status. */
! 948: loop = ebus_read(&ac->art_ebus, Bt8370_LOOP);
! 949: printf("%s: Current LOOP:\n", ac->art_dev.dv_xname);
! 950: if (loop & LOOP_PLOOP)
! 951: printf("\tRemote Payload Loopback\n");
! 952: if (loop & LOOP_LLOOP)
! 953: printf("\tRemote Line Loopback\n");
! 954: if (loop & LOOP_FLOOP)
! 955: printf("\tLocal Payload Loopback\n");
! 956: if (loop & LOOP_ALOOP)
! 957: printf("\tLocal Line Loopback\n");
! 958: if (loop & 0x00)
! 959: printf("\tNo active Loopbacks\n");
! 960: }
! 961:
! 962: void
! 963: bt8370_print_counters(struct art_softc *ac)
! 964: {
! 965: u_int16_t counters[5];
! 966: u_int16_t hi, lo;
! 967: int i;
! 968:
! 969: for (i = 0; i < 5; i++) {
! 970: lo = ebus_read(&ac->art_ebus, Bt8370_FERR_LSB + i);
! 971: hi = ebus_read(&ac->art_ebus, Bt8370_FERR_LSB + i + 1);
! 972:
! 973: counters[i] = lo | (hi << 8);
! 974: }
! 975:
! 976: printf("%s: %hu framing bit errors, %hu CRC errors, ",
! 977: ac->art_dev.dv_xname, counters[0], counters[1]);
! 978: printf("%hu line code violations\n", counters[2]);
! 979: printf("%s: %hu Far End Errors %hu PRBS bit errors\n",
! 980: ac->art_dev.dv_xname, counters[3], counters[4]);
! 981: }
! 982: void
! 983: bt8370_dump_registers(struct art_softc *ac)
! 984: {
! 985: int i;
! 986:
! 987: printf("%s: dummping registers", ac->art_dev.dv_xname);
! 988: for (i = 0; i < 0x200; i++) {
! 989: if (i % 16 == 0)
! 990: printf("\n%03x:", i);
! 991: printf("%s%02x%s", i % 2 ? "" : " ",
! 992: ebus_read(&ac->art_ebus, i),
! 993: i % 8 == 7 ? " " : "");
! 994: }
! 995: printf("\n");
! 996: }
! 997:
! 998: #endif
CVSweb