[BACK]Return to bt8370.c CVS log [TXT][DIR] Up to [local] / sys / dev / pci

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