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

Annotation of sys/dev/pci/if_san_te1.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: if_san_te1.c,v 1.9 2005/07/07 20:58:50 canacar Exp $  */
        !             2:
        !             3: /*-
        !             4:  * Copyright (c) 2001-2004 Sangoma Technologies (SAN)
        !             5:  * All rights reserved.  www.sangoma.com
        !             6:  *
        !             7:  * This code is written by Alex Feldman <al.feldman@sangoma.com> for SAN.
        !             8:  *
        !             9:  * Redistribution and use in source and binary forms, with or without
        !            10:  * modification, are permitted provided that the following conditions
        !            11:  * are met:
        !            12:  * 1. Redistributions of source code must retain the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer.
        !            14:  * 2. Redistributions in binary form must reproduce the above
        !            15:  *    copyright notice, this list of conditions and the following disclaimer
        !            16:  *    in the documentation and/or other materials provided with the
        !            17:  *    distribution.
        !            18:  * 3. Neither the name of Sangoma Technologies nor the names of its
        !            19:  *    contributors may be used to endorse or promote products derived
        !            20:  *    from this software without specific prior written permission.
        !            21:  *
        !            22:  * THIS SOFTWARE IS PROVIDED BY SANGOMA TECHNOLOGIES AND CONTRIBUTORS
        !            23:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
        !            24:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        !            25:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
        !            26:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            27:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        !            28:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        !            29:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        !            30:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        !            31:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
        !            32:  * THE POSSIBILITY OF SUCH DAMAGE.
        !            33:  */
        !            34:
        !            35: #include <sys/types.h>
        !            36: #include <sys/param.h>
        !            37: #include <sys/systm.h>
        !            38: #include <sys/syslog.h>
        !            39: #include <sys/ioccom.h>
        !            40: #include <sys/malloc.h>
        !            41: #include <sys/errno.h>
        !            42: #include <sys/mbuf.h>
        !            43: #include <sys/socket.h>
        !            44: #include <sys/sockio.h>
        !            45: #include <sys/kernel.h>
        !            46: #include <sys/time.h>
        !            47: #include <sys/timeout.h>
        !            48:
        !            49: #include <net/if.h>
        !            50: #include <net/if_media.h>
        !            51: #include <net/if_sppp.h>
        !            52: #include <netinet/in_systm.h>
        !            53: #include <netinet/in.h>
        !            54: #include <netinet/in_var.h>
        !            55: #include <netinet/udp.h>
        !            56: #include <netinet/ip.h>
        !            57:
        !            58: #include <dev/pci/if_san_common.h>
        !            59: #include <dev/pci/if_san_obsd.h>
        !            60:
        !            61:
        !            62:
        !            63: #define FIRST_SAMPLE   0
        !            64: #define LAST_SAMPLE    23
        !            65: #define FIRST_UI       0
        !            66: #define LAST_UI                4
        !            67:
        !            68: #define MAX_BUSY_READ  0x05
        !            69:
        !            70: /* Enabling/Disabling register debugging */
        !            71: #undef WAN_DEBUG_TE1_REG
        !            72: #ifdef WAN_DEBUG_TE1_REG
        !            73:
        !            74: #define TEST_REG(reg,value)                                            \
        !            75: {                                                                      \
        !            76:        unsigned char test_value = READ_REG(reg);                       \
        !            77:        if (test_value != value) {                                      \
        !            78:                log(LOG_INFO, "%s:%d: Test failed!\n",                  \
        !            79:                                __FILE__,__LINE__);                     \
        !            80:                log(LOG_INFO, "%s:%d: Reg=%02x, Val=%02x\n",            \
        !            81:                                __FILE__,__LINE__,reg, value);          \
        !            82:        }                                                               \
        !            83: }
        !            84:
        !            85: #define TEST_RPSC_REG(card,reg,channel,value)                          \
        !            86: {                                                                      \
        !            87:        unsigned char test_value = ReadRPSCReg(card,channel,reg);       \
        !            88:        if (test_value != value) {                                      \
        !            89:                log(LOG_INFO, "%s:%d: RPSC REG Test failed!\n",         \
        !            90:                        __FILE__,__LINE__);                             \
        !            91:                log(LOG_INFO, "%s:%d: Reg=%02x,Channel=%d,Val=%02x!\n", \
        !            92:                        __FILE__, __LINE__, reg, channel, value);       \
        !            93:        }                                                               \
        !            94: }
        !            95:
        !            96: #define TEST_TPSC_REG(card,reg,channel,value)                          \
        !            97: {                                                                      \
        !            98:        unsigned char test_value = ReadTPSCReg(card,channel,reg);       \
        !            99:        if (test_value != value) {                                      \
        !           100:                log(LOG_INFO, "%s:%d: TPSC REG Test failed!\n",         \
        !           101:                        __FILE__,__LINE__);                             \
        !           102:                log(LOG_INFO, "%s:%d: Reg=%02x,Channel=%d,Val=%02x)!\n",\
        !           103:                        __FILE__, __LINE__, reg, channel, value);       \
        !           104:        }                                                               \
        !           105: }
        !           106:
        !           107: #else
        !           108:
        !           109: #define TEST_REG(reg,value)
        !           110: #define TEST_RPSC_REG(card,reg,channel,value)
        !           111: #define TEST_TPSC_REG(card,reg,channel,value)
        !           112:
        !           113: #endif
        !           114:
        !           115: #define READ_RPSC_REG(reg,channel)     ReadRPSCReg(card,reg,channel)
        !           116: #define READ_TPSC_REG(reg,channel)     ReadTPSCReg(card,reg,channel)
        !           117: #define READ_SIGX_REG(reg,channel)     ReadSIGXReg(card,reg,channel)
        !           118: #define WRITE_RPSC_REG(reg,channel,value)                              \
        !           119:        {                                                               \
        !           120:                WriteRPSCReg(card,reg,channel,(unsigned char)value);    \
        !           121:                TEST_RPSC_REG(card,reg,channel,(unsigned char)value);   \
        !           122:        }
        !           123:
        !           124: #define WRITE_TPSC_REG(reg,channel,value)                              \
        !           125:        {                                                               \
        !           126:                WriteTPSCReg(card,reg,channel,(unsigned char)value);    \
        !           127:                TEST_TPSC_REG(card,reg,channe,(unsigned char)value);    \
        !           128:        }
        !           129:
        !           130: #if 0
        !           131: #define WRITE_SIGX_REG(reg,channel,value)                              \
        !           132:        {                                                               \
        !           133:                WriteSIGXReg(card,reg,channel,(unsigned char)value);    \
        !           134:                TEST_SIGX_REG(card,reg,channel,(unsigned char)value);   \
        !           135:        }
        !           136: #endif
        !           137:
        !           138: #define IS_T1_ALARM(alarm)             ((alarm) &                      \
        !           139:                                                (                       \
        !           140:                                                 BIT_RED_ALARM |        \
        !           141:                                                 BIT_AIS_ALARM |        \
        !           142:                                                 BIT_YEL_ALARM          \
        !           143:                                                 ))
        !           144:
        !           145: #define IS_E1_ALARM(alarm)             ((alarm) &                      \
        !           146:                                                (                       \
        !           147:                                                 BIT_RED_ALARM  |       \
        !           148:                                                 BIT_AIS_ALARM  |       \
        !           149:                                                 BIT_ALOS_ALARM         \
        !           150:                                                 ))
        !           151:
        !           152:
        !           153: typedef
        !           154: unsigned char TX_WAVEFORM[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1];
        !           155:
        !           156: typedef struct RLPS_EQUALIZER_RAM_T {
        !           157:        /*unsigned char address;*/
        !           158:        unsigned char byte1;
        !           159:        unsigned char byte2;
        !           160:        unsigned char byte3;
        !           161:        unsigned char byte4;
        !           162: } RLPS_EQUALIZER_RAM;
        !           163:
        !           164:
        !           165:
        !           166: /* Transmit Waveform Values for T1 Long Haul (LBO 0db)
        !           167: ** unsigned char t1_tx_waveform_lh_0db
        !           168: **             [LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] = */
        !           169: TX_WAVEFORM t1_tx_waveform_lh_0db =
        !           170: {
        !           171:        { 0x00, 0x44, 0x00, 0x00, 0x00 },
        !           172:        { 0x0A, 0x44, 0x00, 0x00, 0x00 },
        !           173:        { 0x20, 0x43, 0x00, 0x00, 0x00 },
        !           174:        { 0x32, 0x43, 0x00, 0x00, 0x00 },
        !           175:        { 0x3E, 0x42, 0x00, 0x00, 0x00 },
        !           176:        { 0x3D, 0x42, 0x00, 0x00, 0x00 },
        !           177:        { 0x3C, 0x41, 0x00, 0x00, 0x00 },
        !           178:        { 0x3B, 0x41, 0x00, 0x00, 0x00 },
        !           179:        { 0x3A, 0x00, 0x00, 0x00, 0x00 },
        !           180:        { 0x39, 0x00, 0x00, 0x00, 0x00 },
        !           181:        { 0x39, 0x00, 0x00, 0x00, 0x00 },
        !           182:        { 0x38, 0x00, 0x00, 0x00, 0x00 },
        !           183:        { 0x37, 0x00, 0x00, 0x00, 0x00 },
        !           184:        { 0x36, 0x00, 0x00, 0x00, 0x00 },
        !           185:        { 0x34, 0x00, 0x00, 0x00, 0x00 },
        !           186:        { 0x29, 0x00, 0x00, 0x00, 0x00 },
        !           187:        { 0x4F, 0x00, 0x00, 0x00, 0x00 },
        !           188:        { 0x4C, 0x00, 0x00, 0x00, 0x00 },
        !           189:        { 0x4A, 0x00, 0x00, 0x00, 0x00 },
        !           190:        { 0x49, 0x00, 0x00, 0x00, 0x00 },
        !           191:        { 0x47, 0x00, 0x00, 0x00, 0x00 },
        !           192:        { 0x47, 0x00, 0x00, 0x00, 0x00 },
        !           193:        { 0x46, 0x00, 0x00, 0x00, 0x00 },
        !           194:        { 0x46, 0x00, 0x00, 0x00, 0x00 }
        !           195: };
        !           196:
        !           197: /* Transmit Waveform Values for T1 Long Haul (LBO 7.5 dB):
        !           198: ** unsigned char t1_tx_waveform_lh_75db
        !           199: **             [LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] = */
        !           200: TX_WAVEFORM t1_tx_waveform_lh_75db =
        !           201: {
        !           202:     { 0x00, 0x10, 0x00, 0x00, 0x00 },
        !           203:     { 0x01, 0x0E, 0x00, 0x00, 0x00 },
        !           204:     { 0x02, 0x0C, 0x00, 0x00, 0x00 },
        !           205:     { 0x04, 0x0A, 0x00, 0x00, 0x00 },
        !           206:     { 0x08, 0x08, 0x00, 0x00, 0x00 },
        !           207:     { 0x0C, 0x06, 0x00, 0x00, 0x00 },
        !           208:     { 0x10, 0x04, 0x00, 0x00, 0x00 },
        !           209:     { 0x16, 0x02, 0x00, 0x00, 0x00 },
        !           210:     { 0x1A, 0x01, 0x00, 0x00, 0x00 },
        !           211:     { 0x1E, 0x00, 0x00, 0x00, 0x00 },
        !           212:     { 0x22, 0x00, 0x00, 0x00, 0x00 },
        !           213:     { 0x26, 0x00, 0x00, 0x00, 0x00 },
        !           214:     { 0x2A, 0x00, 0x00, 0x00, 0x00 },
        !           215:     { 0x2B, 0x00, 0x00, 0x00, 0x00 },
        !           216:     { 0x2C, 0x00, 0x00, 0x00, 0x00 },
        !           217:     { 0x2D, 0x00, 0x00, 0x00, 0x00 },
        !           218:     { 0x2C, 0x00, 0x00, 0x00, 0x00 },
        !           219:     { 0x28, 0x00, 0x00, 0x00, 0x00 },
        !           220:     { 0x24, 0x00, 0x00, 0x00, 0x00 },
        !           221:     { 0x20, 0x00, 0x00, 0x00, 0x00 },
        !           222:     { 0x1C, 0x00, 0x00, 0x00, 0x00 },
        !           223:     { 0x18, 0x00, 0x00, 0x00, 0x00 },
        !           224:     { 0x14, 0x00, 0x00, 0x00, 0x00 },
        !           225:     { 0x12, 0x00, 0x00, 0x00, 0x00 }
        !           226: };
        !           227:
        !           228:
        !           229: /* Transmit Waveform Values for T1 Long Haul (LBO 15 dB)
        !           230: ** unsigned char t1_tx_waveform_lh_15db
        !           231: **             [LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] = */
        !           232: TX_WAVEFORM t1_tx_waveform_lh_15db =
        !           233: {
        !           234:     { 0x00, 0x2A, 0x09, 0x01, 0x00 },
        !           235:     { 0x00, 0x28, 0x08, 0x01, 0x00 },
        !           236:     { 0x00, 0x26, 0x08, 0x01, 0x00 },
        !           237:     { 0x00, 0x24, 0x07, 0x01, 0x00 },
        !           238:     { 0x01, 0x22, 0x07, 0x01, 0x00 },
        !           239:     { 0x02, 0x20, 0x06, 0x01, 0x00 },
        !           240:     { 0x04, 0x1E, 0x06, 0x01, 0x00 },
        !           241:     { 0x07, 0x1C, 0x05, 0x00, 0x00 },
        !           242:     { 0x0A, 0x1B, 0x05, 0x00, 0x00 },
        !           243:     { 0x0D, 0x19, 0x05, 0x00, 0x00 },
        !           244:     { 0x10, 0x18, 0x04, 0x00, 0x00 },
        !           245:     { 0x14, 0x16, 0x04, 0x00, 0x00 },
        !           246:     { 0x18, 0x15, 0x04, 0x00, 0x00 },
        !           247:     { 0x1B, 0x13, 0x03, 0x00, 0x00 },
        !           248:     { 0x1E, 0x12, 0x03, 0x00, 0x00 },
        !           249:     { 0x21, 0x10, 0x03, 0x00, 0x00 },
        !           250:     { 0x24, 0x0F, 0x03, 0x00, 0x00 },
        !           251:     { 0x27, 0x0D, 0x03, 0x00, 0x00 },
        !           252:     { 0x2A, 0x0D, 0x02, 0x00, 0x00 },
        !           253:     { 0x2D, 0x0B, 0x02, 0x00, 0x00 },
        !           254:     { 0x30, 0x0B, 0x02, 0x00, 0x00 },
        !           255:     { 0x30, 0x0A, 0x02, 0x00, 0x00 },
        !           256:     { 0x2E, 0x0A, 0x02, 0x00, 0x00 },
        !           257:     { 0x2C, 0x09, 0x02, 0x00, 0x00 }
        !           258: };
        !           259:
        !           260:
        !           261: /* Transmit Waveform Values for T1 Long Haul (LBO 22.5 dB)
        !           262: ** unsigned char t1_tx_waveform_lh_225db
        !           263: **             [LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] = */
        !           264: TX_WAVEFORM t1_tx_waveform_lh_225db =
        !           265: {
        !           266:     { 0x00, 0x1F, 0x16, 0x06, 0x01 },
        !           267:     { 0x00, 0x20, 0x15, 0x05, 0x01 },
        !           268:     { 0x00, 0x21, 0x15, 0x05, 0x01 },
        !           269:     { 0x00, 0x22, 0x14, 0x05, 0x01 },
        !           270:     { 0x00, 0x22, 0x13, 0x04, 0x00 },
        !           271:     { 0x00, 0x23, 0x12, 0x04, 0x00 },
        !           272:     { 0x01, 0x23, 0x12, 0x04, 0x00 },
        !           273:     { 0x01, 0x24, 0x11, 0x03, 0x00 },
        !           274:     { 0x01, 0x23, 0x10, 0x03, 0x00 },
        !           275:     { 0x02, 0x23, 0x10, 0x03, 0x00 },
        !           276:     { 0x03, 0x22, 0x0F, 0x03, 0x00 },
        !           277:     { 0x05, 0x22, 0x0E, 0x03, 0x00 },
        !           278:     { 0x07, 0x21, 0x0E, 0x02, 0x00 },
        !           279:     { 0x09, 0x20, 0x0D, 0x02, 0x00 },
        !           280:     { 0x0B, 0x1E, 0x0C, 0x02, 0x00 },
        !           281:     { 0x0E, 0x1D, 0x0C, 0x02, 0x00 },
        !           282:     { 0x10, 0x1B, 0x0B, 0x02, 0x00 },
        !           283:     { 0x13, 0x1B, 0x0A, 0x02, 0x00 },
        !           284:     { 0x15, 0x1A, 0x0A, 0x02, 0x00 },
        !           285:     { 0x17, 0x19, 0x09, 0x01, 0x00 },
        !           286:     { 0x19, 0x19, 0x08, 0x01, 0x00 },
        !           287:     { 0x1B, 0x18, 0x08, 0x01, 0x00 },
        !           288:     { 0x1D, 0x17, 0x07, 0x01, 0x00 },
        !           289:     { 0x1E, 0x17, 0x06, 0x01, 0x00 }
        !           290: };
        !           291:
        !           292:
        !           293: /* Transmit Waveform Values for T1 Short Haul (0 - 110 ft.)
        !           294: ** unsigned char t1_tx_waveform_sh_110ft
        !           295: **             [LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] = */
        !           296: TX_WAVEFORM t1_tx_waveform_sh_110ft =
        !           297: {
        !           298:     { 0x00, 0x45, 0x00, 0x00, 0x00 },
        !           299:     { 0x0A, 0x44, 0x00, 0x00, 0x00 },
        !           300:     { 0x20, 0x43, 0x00, 0x00, 0x00 },
        !           301:     { 0x3F, 0x43, 0x00, 0x00, 0x00 },
        !           302:     { 0x3F, 0x42, 0x00, 0x00, 0x00 },
        !           303:     { 0x3F, 0x42, 0x00, 0x00, 0x00 },
        !           304:     { 0x3C, 0x41, 0x00, 0x00, 0x00 },
        !           305:     { 0x3B, 0x41, 0x00, 0x00, 0x00 },
        !           306:     { 0x3A, 0x00, 0x00, 0x00, 0x00 },
        !           307:     { 0x39, 0x00, 0x00, 0x00, 0x00 },
        !           308:     { 0x39, 0x00, 0x00, 0x00, 0x00 },
        !           309:     { 0x38, 0x00, 0x00, 0x00, 0x00 },
        !           310:     { 0x37, 0x00, 0x00, 0x00, 0x00 },
        !           311:     { 0x36, 0x00, 0x00, 0x00, 0x00 },
        !           312:     { 0x34, 0x00, 0x00, 0x00, 0x00 },
        !           313:     { 0x29, 0x00, 0x00, 0x00, 0x00 },
        !           314:     { 0x59, 0x00, 0x00, 0x00, 0x00 },
        !           315:     { 0x55, 0x00, 0x00, 0x00, 0x00 },
        !           316:     { 0x50, 0x00, 0x00, 0x00, 0x00 },
        !           317:     { 0x4D, 0x00, 0x00, 0x00, 0x00 },
        !           318:     { 0x4A, 0x00, 0x00, 0x00, 0x00 },
        !           319:     { 0x48, 0x00, 0x00, 0x00, 0x00 },
        !           320:     { 0x46, 0x00, 0x00, 0x00, 0x00 },
        !           321:     { 0x46, 0x00, 0x00, 0x00, 0x00 }
        !           322: };
        !           323:
        !           324:
        !           325: /* Transmit Waveform Values for T1 Short Haul (110 - 220 ft.)
        !           326: ** unsigned char t1_tx_waveform_sh_220ft
        !           327: **             [LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] = */
        !           328: TX_WAVEFORM t1_tx_waveform_sh_220ft =
        !           329: {
        !           330:     { 0x00, 0x44, 0x00, 0x00, 0x00 },
        !           331:     { 0x0A, 0x44, 0x00, 0x00, 0x00 },
        !           332:     { 0x3F, 0x43, 0x00, 0x00, 0x00 },
        !           333:     { 0x3F, 0x43, 0x00, 0x00, 0x00 },
        !           334:     { 0x36, 0x42, 0x00, 0x00, 0x00 },
        !           335:     { 0x34, 0x42, 0x00, 0x00, 0x00 },
        !           336:     { 0x30, 0x41, 0x00, 0x00, 0x00 },
        !           337:     { 0x2F, 0x41, 0x00, 0x00, 0x00 },
        !           338:     { 0x2E, 0x00, 0x00, 0x00, 0x00 },
        !           339:     { 0x2D, 0x00, 0x00, 0x00, 0x00 },
        !           340:     { 0x2C, 0x00, 0x00, 0x00, 0x00 },
        !           341:     { 0x2B, 0x00, 0x00, 0x00, 0x00 },
        !           342:     { 0x2A, 0x00, 0x00, 0x00, 0x00 },
        !           343:     { 0x28, 0x00, 0x00, 0x00, 0x00 },
        !           344:     { 0x26, 0x00, 0x00, 0x00, 0x00 },
        !           345:     { 0x4A, 0x00, 0x00, 0x00, 0x00 },
        !           346:     { 0x68, 0x00, 0x00, 0x00, 0x00 },
        !           347:     { 0x54, 0x00, 0x00, 0x00, 0x00 },
        !           348:     { 0x4F, 0x00, 0x00, 0x00, 0x00 },
        !           349:     { 0x4A, 0x00, 0x00, 0x00, 0x00 },
        !           350:     { 0x49, 0x00, 0x00, 0x00, 0x00 },
        !           351:     { 0x47, 0x00, 0x00, 0x00, 0x00 },
        !           352:     { 0x47, 0x00, 0x00, 0x00, 0x00 },
        !           353:     { 0x46, 0x00, 0x00, 0x00, 0x00 }
        !           354: };
        !           355:
        !           356:
        !           357: /* Transmit Waveform Values for T1 Short Haul (220 - 330 ft.)
        !           358: ** unsigned char t1_tx_waveform_sh_330ft
        !           359: **             [LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] = */
        !           360: TX_WAVEFORM t1_tx_waveform_sh_330ft =
        !           361: {
        !           362:     { 0x00, 0x44, 0x00, 0x00, 0x00 },
        !           363:     { 0x0A, 0x44, 0x00, 0x00, 0x00 },
        !           364:     { 0x3F, 0x43, 0x00, 0x00, 0x00 },
        !           365:     { 0x3A, 0x43, 0x00, 0x00, 0x00 },
        !           366:     { 0x3A, 0x42, 0x00, 0x00, 0x00 },
        !           367:     { 0x38, 0x42, 0x00, 0x00, 0x00 },
        !           368:     { 0x30, 0x41, 0x00, 0x00, 0x00 },
        !           369:     { 0x2F, 0x41, 0x00, 0x00, 0x00 },
        !           370:     { 0x2E, 0x00, 0x00, 0x00, 0x00 },
        !           371:     { 0x2D, 0x00, 0x00, 0x00, 0x00 },
        !           372:     { 0x2C, 0x00, 0x00, 0x00, 0x00 },
        !           373:     { 0x2B, 0x00, 0x00, 0x00, 0x00 },
        !           374:     { 0x2A, 0x00, 0x00, 0x00, 0x00 },
        !           375:     { 0x29, 0x00, 0x00, 0x00, 0x00 },
        !           376:     { 0x23, 0x00, 0x00, 0x00, 0x00 },
        !           377:     { 0x4A, 0x00, 0x00, 0x00, 0x00 },
        !           378:     { 0x6C, 0x00, 0x00, 0x00, 0x00 },
        !           379:     { 0x60, 0x00, 0x00, 0x00, 0x00 },
        !           380:     { 0x4F, 0x00, 0x00, 0x00, 0x00 },
        !           381:     { 0x4A, 0x00, 0x00, 0x00, 0x00 },
        !           382:     { 0x49, 0x00, 0x00, 0x00, 0x00 },
        !           383:     { 0x47, 0x00, 0x00, 0x00, 0x00 },
        !           384:     { 0x47, 0x00, 0x00, 0x00, 0x00 },
        !           385:     { 0x46, 0x00, 0x00, 0x00, 0x00 }
        !           386: };
        !           387:
        !           388:
        !           389: /* Transmit Waveform Values for T1 Short Haul (330 - 440 ft.)
        !           390: ** unsigned char t1_tx_waveform_sh_440ft
        !           391: **             [LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] = */
        !           392: TX_WAVEFORM t1_tx_waveform_sh_440ft =
        !           393: {
        !           394:     { 0x00, 0x44, 0x00, 0x00, 0x00 },
        !           395:     { 0x0A, 0x44, 0x00, 0x00, 0x00 },
        !           396:     { 0x3F, 0x43, 0x00, 0x00, 0x00 },
        !           397:     { 0x3F, 0x43, 0x00, 0x00, 0x00 },
        !           398:     { 0x3F, 0x42, 0x00, 0x00, 0x00 },
        !           399:     { 0x3F, 0x42, 0x00, 0x00, 0x00 },
        !           400:     { 0x2F, 0x41, 0x00, 0x00, 0x00 },
        !           401:     { 0x2E, 0x41, 0x00, 0x00, 0x00 },
        !           402:     { 0x2D, 0x00, 0x00, 0x00, 0x00 },
        !           403:     { 0x2C, 0x00, 0x00, 0x00, 0x00 },
        !           404:     { 0x2B, 0x00, 0x00, 0x00, 0x00 },
        !           405:     { 0x2A, 0x00, 0x00, 0x00, 0x00 },
        !           406:     { 0x29, 0x00, 0x00, 0x00, 0x00 },
        !           407:     { 0x28, 0x00, 0x00, 0x00, 0x00 },
        !           408:     { 0x19, 0x00, 0x00, 0x00, 0x00 },
        !           409:     { 0x4A, 0x00, 0x00, 0x00, 0x00 },
        !           410:     { 0x7F, 0x00, 0x00, 0x00, 0x00 },
        !           411:     { 0x60, 0x00, 0x00, 0x00, 0x00 },
        !           412:     { 0x4F, 0x00, 0x00, 0x00, 0x00 },
        !           413:     { 0x4A, 0x00, 0x00, 0x00, 0x00 },
        !           414:     { 0x49, 0x00, 0x00, 0x00, 0x00 },
        !           415:     { 0x47, 0x00, 0x00, 0x00, 0x00 },
        !           416:     { 0x47, 0x00, 0x00, 0x00, 0x00 },
        !           417:     { 0x46, 0x00, 0x00, 0x00, 0x00 }
        !           418: };
        !           419:
        !           420:
        !           421: /* Transmit Waveform Values for T1 Short Haul (440 - 550 ft.)
        !           422: ** unsigned char t1_tx_waveform_sh_550ft
        !           423: **             [LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] = */
        !           424: TX_WAVEFORM t1_tx_waveform_sh_550ft =
        !           425: {
        !           426:     { 0x00, 0x44, 0x00, 0x00, 0x00 },
        !           427:     { 0x0A, 0x44, 0x00, 0x00, 0x00 },
        !           428:     { 0x3F, 0x43, 0x00, 0x00, 0x00 },
        !           429:     { 0x3F, 0x43, 0x00, 0x00, 0x00 },
        !           430:     { 0x3F, 0x42, 0x00, 0x00, 0x00 },
        !           431:     { 0x3F, 0x42, 0x00, 0x00, 0x00 },
        !           432:     { 0x30, 0x41, 0x00, 0x00, 0x00 },
        !           433:     { 0x2B, 0x41, 0x00, 0x00, 0x00 },
        !           434:     { 0x2A, 0x00, 0x00, 0x00, 0x00 },
        !           435:     { 0x29, 0x00, 0x00, 0x00, 0x00 },
        !           436:     { 0x28, 0x00, 0x00, 0x00, 0x00 },
        !           437:     { 0x27, 0x00, 0x00, 0x00, 0x00 },
        !           438:     { 0x26, 0x00, 0x00, 0x00, 0x00 },
        !           439:     { 0x26, 0x00, 0x00, 0x00, 0x00 },
        !           440:     { 0x24, 0x00, 0x00, 0x00, 0x00 },
        !           441:     { 0x4A, 0x00, 0x00, 0x00, 0x00 },
        !           442:     { 0x7F, 0x00, 0x00, 0x00, 0x00 },
        !           443:     { 0x7F, 0x00, 0x00, 0x00, 0x00 },
        !           444:     { 0x4F, 0x00, 0x00, 0x00, 0x00 },
        !           445:     { 0x4A, 0x00, 0x00, 0x00, 0x00 },
        !           446:     { 0x49, 0x00, 0x00, 0x00, 0x00 },
        !           447:     { 0x47, 0x00, 0x00, 0x00, 0x00 },
        !           448:     { 0x47, 0x00, 0x00, 0x00, 0x00 },
        !           449:     { 0x46, 0x00, 0x00, 0x00, 0x00 }
        !           450: };
        !           451:
        !           452:
        !           453: /* Transmit Waveform Values for T1 Short Haul (550 - 660 ft.)
        !           454: ** unsigned char t1_tx_waveform_sh_660ft
        !           455: **             [LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] = */
        !           456: TX_WAVEFORM t1_tx_waveform_sh_660ft =
        !           457: {
        !           458:     { 0x00, 0x44, 0x00, 0x00, 0x00 },
        !           459:     { 0x0A, 0x44, 0x00, 0x00, 0x00 },
        !           460:     { 0x3F, 0x43, 0x00, 0x00, 0x00 },
        !           461:     { 0x3F, 0x43, 0x00, 0x00, 0x00 },
        !           462:     { 0x3F, 0x42, 0x00, 0x00, 0x00 },
        !           463:     { 0x3F, 0x42, 0x00, 0x00, 0x00 },
        !           464:     { 0x3F, 0x41, 0x00, 0x00, 0x00 },
        !           465:     { 0x30, 0x41, 0x00, 0x00, 0x00 },
        !           466:     { 0x2A, 0x00, 0x00, 0x00, 0x00 },
        !           467:     { 0x29, 0x00, 0x00, 0x00, 0x00 },
        !           468:     { 0x28, 0x00, 0x00, 0x00, 0x00 },
        !           469:     { 0x27, 0x00, 0x00, 0x00, 0x00 },
        !           470:     { 0x26, 0x00, 0x00, 0x00, 0x00 },
        !           471:     { 0x25, 0x00, 0x00, 0x00, 0x00 },
        !           472:     { 0x24, 0x00, 0x00, 0x00, 0x00 },
        !           473:     { 0x4A, 0x00, 0x00, 0x00, 0x00 },
        !           474:     { 0x7F, 0x00, 0x00, 0x00, 0x00 },
        !           475:     { 0x7F, 0x00, 0x00, 0x00, 0x00 },
        !           476:     { 0x5F, 0x00, 0x00, 0x00, 0x00 },
        !           477:     { 0x50, 0x00, 0x00, 0x00, 0x00 },
        !           478:     { 0x49, 0x00, 0x00, 0x00, 0x00 },
        !           479:     { 0x47, 0x00, 0x00, 0x00, 0x00 },
        !           480:     { 0x47, 0x00, 0x00, 0x00, 0x00 },
        !           481:     { 0x46, 0x00, 0x00, 0x00, 0x00 }
        !           482: };
        !           483:
        !           484:
        !           485: /* Transmit Waveform Values for E1 120 Ohm
        !           486: ** unsigned char e1_tx_waveform_120
        !           487: **             [LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] = */
        !           488: TX_WAVEFORM e1_tx_waveform_120 =
        !           489: {
        !           490:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           491:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           492:     { 0x0A, 0x00, 0x00, 0x00, 0x00 },
        !           493:     { 0x3F, 0x00, 0x00, 0x00, 0x00 },
        !           494:     { 0x3F, 0x00, 0x00, 0x00, 0x00 },
        !           495:     { 0x39, 0x00, 0x00, 0x00, 0x00 },
        !           496:     { 0x38, 0x00, 0x00, 0x00, 0x00 },
        !           497:     { 0x36, 0x00, 0x00, 0x00, 0x00 },
        !           498:     { 0x36, 0x00, 0x00, 0x00, 0x00 },
        !           499:     { 0x35, 0x00, 0x00, 0x00, 0x00 },
        !           500:     { 0x35, 0x00, 0x00, 0x00, 0x00 },
        !           501:     { 0x35, 0x00, 0x00, 0x00, 0x00 },
        !           502:     { 0x35, 0x00, 0x00, 0x00, 0x00 },
        !           503:     { 0x35, 0x00, 0x00, 0x00, 0x00 },
        !           504:     { 0x35, 0x00, 0x00, 0x00, 0x00 },
        !           505:     { 0x2D, 0x00, 0x00, 0x00, 0x00 },
        !           506:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           507:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           508:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           509:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           510:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           511:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           512:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           513:     { 0x00, 0x00, 0x00, 0x00, 0x00 }
        !           514: };
        !           515:
        !           516:
        !           517: /* Transmit Waveform Values for E1 75 Ohm
        !           518: ** unsigned char e1_tx_waveform_75
        !           519: **             [LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] = */
        !           520: TX_WAVEFORM e1_tx_waveform_75 =
        !           521: {
        !           522:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           523:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           524:     { 0x0A, 0x00, 0x00, 0x00, 0x00 },
        !           525:     { 0x28, 0x00, 0x00, 0x00, 0x00 },
        !           526:     { 0x3A, 0x00, 0x00, 0x00, 0x00 },
        !           527:     { 0x3A, 0x00, 0x00, 0x00, 0x00 },
        !           528:     { 0x3A, 0x00, 0x00, 0x00, 0x00 },
        !           529:     { 0x3A, 0x00, 0x00, 0x00, 0x00 },
        !           530:     { 0x3A, 0x00, 0x00, 0x00, 0x00 },
        !           531:     { 0x3A, 0x00, 0x00, 0x00, 0x00 },
        !           532:     { 0x3A, 0x00, 0x00, 0x00, 0x00 },
        !           533:     { 0x3A, 0x00, 0x00, 0x00, 0x00 },
        !           534:     { 0x3A, 0x00, 0x00, 0x00, 0x00 },
        !           535:     { 0x3A, 0x00, 0x00, 0x00, 0x00 },
        !           536:     { 0x32, 0x00, 0x00, 0x00, 0x00 },
        !           537:     { 0x14, 0x00, 0x00, 0x00, 0x00 },
        !           538:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           539:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           540:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           541:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           542:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           543:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           544:     { 0x00, 0x00, 0x00, 0x00, 0x00 },
        !           545:     { 0x00, 0x00, 0x00, 0x00, 0x00 }
        !           546: };
        !           547:
        !           548:
        !           549: RLPS_EQUALIZER_RAM t1_rlps_ram_table[] =
        !           550: {
        !           551:     { 0x03, 0xFE, 0x18, 0x40 },
        !           552:     { 0x03, 0xF6, 0x18, 0x40 },
        !           553:     { 0x03, 0xEE, 0x18, 0x40 },
        !           554:     { 0x03, 0xE6, 0x18, 0x40 },
        !           555:     { 0x03, 0xDE, 0x18, 0x40 },
        !           556:     { 0x03, 0xD6, 0x18, 0x40 },
        !           557:     { 0x03, 0xD6, 0x18, 0x40 },
        !           558:     { 0x03, 0xD6, 0x18, 0x40 },
        !           559:     { 0x03, 0xCE, 0x18, 0x40 },
        !           560:     { 0x03, 0xCE, 0x18, 0x40 },
        !           561:     { 0x03, 0xCE, 0x18, 0x40 },
        !           562:     { 0x03, 0xCE, 0x18, 0x40 },
        !           563:     { 0x03, 0xC6, 0x18, 0x40 },
        !           564:     { 0x03, 0xC6, 0x18, 0x40 },
        !           565:     { 0x03, 0xC6, 0x18, 0x40 },
        !           566:     { 0x0B, 0xBE, 0x18, 0x40 },
        !           567:     { 0x0B, 0xBE, 0x18, 0x40 },
        !           568:     { 0x0B, 0xBE, 0x18, 0x40 },
        !           569:     { 0x0B, 0xBE, 0x18, 0x40 },
        !           570:     { 0x0B, 0xB6, 0x18, 0x40 },
        !           571:     { 0x0B, 0xB6, 0x18, 0x40 },
        !           572:     { 0x0B, 0xB6, 0x18, 0x40 },
        !           573:     { 0x0B, 0xB6, 0x18, 0x40 },
        !           574:     { 0x13, 0xAE, 0x18, 0x38 },
        !           575:     { 0x13, 0xAE, 0x18, 0x3C },
        !           576:     { 0x13, 0xAE, 0x18, 0x40 },
        !           577:     { 0x13, 0xAE, 0x18, 0x40 },
        !           578:     { 0x13, 0xAE, 0x18, 0x40 },
        !           579:     { 0x13, 0xAE, 0x18, 0x40 },
        !           580:     { 0x1B, 0xB6, 0x18, 0xB8 },
        !           581:     { 0x1B, 0xAE, 0x18, 0xB8 },
        !           582:     { 0x1B, 0xAE, 0x18, 0xBC },
        !           583:     { 0x1B, 0xAE, 0x18, 0xC0 },
        !           584:     { 0x1B, 0xAE, 0x18, 0xC0 },
        !           585:     { 0x23, 0xA6, 0x18, 0xC0 },
        !           586:     { 0x23, 0xA6, 0x18, 0xC0 },
        !           587:     { 0x23, 0xA6, 0x18, 0xC0 },
        !           588:     { 0x23, 0xA6, 0x18, 0xC0 },
        !           589:     { 0x23, 0xA6, 0x18, 0xC0 },
        !           590:     { 0x23, 0x9E, 0x18, 0xC0 },
        !           591:     { 0x23, 0x9E, 0x18, 0xC0 },
        !           592:     { 0x23, 0x9E, 0x18, 0xC0 },
        !           593:     { 0x23, 0x9E, 0x18, 0xC0 },
        !           594:     { 0x23, 0x9E, 0x18, 0xC0 },
        !           595:     { 0x2B, 0x96, 0x18, 0xC0 },
        !           596:     { 0x2B, 0x96, 0x18, 0xC0 },
        !           597:     { 0x2B, 0x96, 0x18, 0xC0 },
        !           598:     { 0x33, 0x96, 0x19, 0x40 },
        !           599:     { 0x37, 0x96, 0x19, 0x40 },
        !           600:     { 0x37, 0x96, 0x19, 0x40 },
        !           601:     { 0x37, 0x96, 0x19, 0x40 },
        !           602:     { 0x3F, 0x9E, 0x19, 0xC0 },
        !           603:     { 0x3F, 0x9E, 0x19, 0xC0 },
        !           604:     { 0x3F, 0x9E, 0x19, 0xC0 },
        !           605:     { 0x3F, 0xA6, 0x1A, 0x40 },
        !           606:     { 0x3F, 0xA6, 0x1A, 0x40 },
        !           607:     { 0x3F, 0xA6, 0x1A, 0x40 },
        !           608:     { 0x3F, 0xA6, 0x1A, 0x40 },
        !           609:     { 0x3F, 0x96, 0x19, 0xC0 },
        !           610:     { 0x3F, 0x96, 0x19, 0xC0 },
        !           611:     { 0x3F, 0x96, 0x19, 0xC0 },
        !           612:     { 0x3F, 0x96, 0x19, 0xC0 },
        !           613:     { 0x47, 0x9E, 0x1A, 0x40 },
        !           614:     { 0x47, 0x9E, 0x1A, 0x40 },
        !           615:     { 0x47, 0x9E, 0x1A, 0x40 },
        !           616:     { 0x47, 0x96, 0x1A, 0x40 },
        !           617:     { 0x47, 0x96, 0x1A, 0x40 },
        !           618:     { 0x47, 0x96, 0x1A, 0x40 },
        !           619:     { 0x47, 0x96, 0x1A, 0x40 },
        !           620:     { 0x4F, 0x8E, 0x1A, 0x40 },
        !           621:     { 0x4F, 0x8E, 0x1A, 0x40 },
        !           622:     { 0x4F, 0x8E, 0x1A, 0x40 },
        !           623:     { 0x4F, 0x8E, 0x1A, 0x40 },
        !           624:     { 0x4F, 0x8E, 0x1A, 0x40 },
        !           625:     { 0x57, 0x86, 0x1A, 0x40 },
        !           626:     { 0x57, 0x86, 0x1A, 0x40 },
        !           627:     { 0x57, 0x86, 0x1A, 0x40 },
        !           628:     { 0x57, 0x86, 0x1A, 0x40 },
        !           629:     { 0x57, 0x86, 0x1A, 0x40 },
        !           630:     { 0x5F, 0x86, 0x1A, 0xC0 },
        !           631:     { 0x5F, 0x86, 0x1A, 0xC0 },
        !           632:     { 0x5F, 0x86, 0x1A, 0xC0 },
        !           633:     { 0x5F, 0x86, 0x1A, 0xC0 },
        !           634:     { 0x5F, 0x86, 0x1A, 0xC0 },
        !           635:     { 0x5F, 0x86, 0x1A, 0xC0 },
        !           636:     { 0x5F, 0x7E, 0x1A, 0xC0 },
        !           637:     { 0x5F, 0x7E, 0x1A, 0xC0 },
        !           638:     { 0x5F, 0x7E, 0x1A, 0xC0 },
        !           639:     { 0x5F, 0x7E, 0x1A, 0xC0 },
        !           640:     { 0x5F, 0x7E, 0x1A, 0xC0 },
        !           641:     { 0x67, 0x7E, 0x2A, 0xC0 },
        !           642:     { 0x67, 0x7E, 0x2A, 0xC0 },
        !           643:     { 0x67, 0x7E, 0x2A, 0xC0 },
        !           644:     { 0x67, 0x7E, 0x2A, 0xC0 },
        !           645:     { 0x67, 0x76, 0x2A, 0xC0 },
        !           646:     { 0x67, 0x76, 0x2A, 0xC0 },
        !           647:     { 0x67, 0x76, 0x2A, 0xC0 },
        !           648:     { 0x67, 0x76, 0x2A, 0xC0 },
        !           649:     { 0x67, 0x76, 0x2A, 0xC0 },
        !           650:     { 0x6F, 0x6E, 0x2A, 0xC0 },
        !           651:     { 0x6F, 0x6E, 0x2A, 0xC0 },
        !           652:     { 0x6F, 0x6E, 0x2A, 0xC0 },
        !           653:     { 0x6F, 0x6E, 0x2A, 0xC0 },
        !           654:     { 0x77, 0x6E, 0x3A, 0xC0 },
        !           655:     { 0x77, 0x6E, 0x3A, 0xC0 },
        !           656:     { 0x77, 0x6E, 0x3A, 0xC0 },
        !           657:     { 0x77, 0x6E, 0x3A, 0xC0 },
        !           658:     { 0x7F, 0x66, 0x3A, 0xC0 },
        !           659:     { 0x7F, 0x66, 0x3A, 0xC0 },
        !           660:     { 0x7F, 0x66, 0x4A, 0xC0 },
        !           661:     { 0x7F, 0x66, 0x4A, 0xC0 },
        !           662:     { 0x7F, 0x66, 0x4A, 0xC0 },
        !           663:     { 0x7F, 0x66, 0x4A, 0xC0 },
        !           664:     { 0x87, 0x66, 0x5A, 0xC0 },
        !           665:     { 0x87, 0x66, 0x5A, 0xC0 },
        !           666:     { 0x87, 0x66, 0x5A, 0xC0 },
        !           667:     { 0x87, 0x66, 0x5A, 0xC0 },
        !           668:     { 0x87, 0x66, 0x5A, 0xC0 },
        !           669:     { 0x87, 0x5E, 0x5A, 0xC0 },
        !           670:     { 0x87, 0x5E, 0x5A, 0xC0 },
        !           671:     { 0x87, 0x5E, 0x5A, 0xC0 },
        !           672:     { 0x87, 0x5E, 0x5A, 0xC0 },
        !           673:     { 0x87, 0x5E, 0x5A, 0xC0 },
        !           674:     { 0x8F, 0x5E, 0x6A, 0xC0 },
        !           675:     { 0x8F, 0x5E, 0x6A, 0xC0 },
        !           676:     { 0x8F, 0x5E, 0x6A, 0xC0 },
        !           677:     { 0x8F, 0x5E, 0x6A, 0xC0 },
        !           678:     { 0x97, 0x5E, 0x7A, 0xC0 },
        !           679:     { 0x97, 0x5E, 0x7A, 0xC0 },
        !           680:     { 0x97, 0x5E, 0x7A, 0xC0 },
        !           681:     { 0x97, 0x5E, 0x7A, 0xC0 },
        !           682:     { 0x9F, 0x5E, 0x8A, 0xC0 },
        !           683:     { 0x9F, 0x5E, 0x8A, 0xC0 },
        !           684:     { 0x9F, 0x5E, 0x8A, 0xC0 },
        !           685:     { 0x9F, 0x5E, 0x8A, 0xC0 },
        !           686:     { 0x9F, 0x5E, 0x8A, 0xC0 },
        !           687:     { 0xA7, 0x56, 0x9A, 0xC0 },
        !           688:     { 0xA7, 0x56, 0x9A, 0xC0 },
        !           689:     { 0xA7, 0x56, 0x9A, 0xC0 },
        !           690:     { 0xA7, 0x56, 0x9A, 0xC0 },
        !           691:     { 0xA7, 0x56, 0xAA, 0xC0 },
        !           692:     { 0xA7, 0x56, 0xAA, 0xC0 },
        !           693:     { 0xA7, 0x56, 0xAA, 0xC0 },
        !           694:     { 0xAF, 0x4E, 0xAA, 0xC0 },
        !           695:     { 0xAF, 0x4E, 0xAA, 0xC0 },
        !           696:     { 0xAF, 0x4E, 0xAA, 0xC0 },
        !           697:     { 0xAF, 0x4E, 0xAA, 0xC0 },
        !           698:     { 0xAF, 0x4E, 0xAA, 0xC0 },
        !           699:     { 0xB7, 0x46, 0xAA, 0xC0 },
        !           700:     { 0xB7, 0x46, 0xAA, 0xC0 },
        !           701:     { 0xB7, 0x46, 0xAA, 0xC0 },
        !           702:     { 0xB7, 0x46, 0xAA, 0xC0 },
        !           703:     { 0xB7, 0x46, 0xAA, 0xC0 },
        !           704:     { 0xB7, 0x46, 0xAA, 0xC0 },
        !           705:     { 0xB7, 0x46, 0xAA, 0xC0 },
        !           706:     { 0xB7, 0x46, 0xBA, 0xC0 },
        !           707:     { 0xB7, 0x46, 0xBA, 0xC0 },
        !           708:     { 0xB7, 0x46, 0xBA, 0xC0 },
        !           709:     { 0xBF, 0x4E, 0xBB, 0x40 },
        !           710:     { 0xBF, 0x4E, 0xBB, 0x40 },
        !           711:     { 0xBF, 0x4E, 0xBB, 0x40 },
        !           712:     { 0xBF, 0x4E, 0xBB, 0x40 },
        !           713:     { 0xBF, 0x4E, 0xBB, 0x40 },
        !           714:     { 0xBF, 0x4E, 0xBB, 0x40 },
        !           715:     { 0xBF, 0x4E, 0xBB, 0x40 },
        !           716:     { 0xBF, 0x4E, 0xBB, 0x40 },
        !           717:     { 0xBF, 0x4E, 0xBB, 0x40 },
        !           718:     { 0xBE, 0x46, 0xCB, 0x40 },
        !           719:     { 0xBE, 0x46, 0xCB, 0x40 },
        !           720:     { 0xBE, 0x46, 0xCB, 0x40 },
        !           721:     { 0xBE, 0x46, 0xCB, 0x40 },
        !           722:     { 0xBE, 0x46, 0xCB, 0x40 },
        !           723:     { 0xBE, 0x46, 0xCB, 0x40 },
        !           724:     { 0xBE, 0x46, 0xDB, 0x40 },
        !           725:     { 0xBE, 0x46, 0xDB, 0x40 },
        !           726:     { 0xBE, 0x46, 0xDB, 0x40 },
        !           727:     { 0xC6, 0x3E, 0xCB, 0x40 },
        !           728:     { 0xC6, 0x3E, 0xCB, 0x40 },
        !           729:     { 0xC6, 0x3E, 0xDB, 0x40 },
        !           730:     { 0xC6, 0x3E, 0xDB, 0x40 },
        !           731:     { 0xC6, 0x3E, 0xDB, 0x40 },
        !           732:     { 0xC6, 0x44, 0xDB, 0x40 },
        !           733:     { 0xC6, 0x44, 0xDB, 0x40 },
        !           734:     { 0xC6, 0x44, 0xDB, 0x40 },
        !           735:     { 0xC6, 0x44, 0xDB, 0x40 },
        !           736:     { 0xC6, 0x3C, 0xDB, 0x40 },
        !           737:     { 0xC6, 0x3C, 0xDB, 0x40 },
        !           738:     { 0xC6, 0x3C, 0xDB, 0x40 },
        !           739:     { 0xC6, 0x3C, 0xDB, 0x40 },
        !           740:     { 0xD6, 0x34, 0xDB, 0x40 },
        !           741:     { 0xD6, 0x34, 0xDB, 0x40 },
        !           742:     { 0xD6, 0x34, 0xDB, 0x40 },
        !           743:     { 0xD6, 0x34, 0xDB, 0x40 },
        !           744:     { 0xD6, 0x34, 0xDB, 0x40 },
        !           745:     { 0xDE, 0x2C, 0xDB, 0x3C },
        !           746:     { 0xDE, 0x2C, 0xDB, 0x3C },
        !           747:     { 0xDE, 0x2C, 0xDB, 0x3C },
        !           748:     { 0xE6, 0x2C, 0xDB, 0x40 },
        !           749:     { 0xE6, 0x2C, 0xDB, 0x40 },
        !           750:     { 0xE6, 0x2C, 0xDB, 0x40 },
        !           751:     { 0xE6, 0x2C, 0xDB, 0x40 },
        !           752:     { 0xE6, 0x2C, 0xDB, 0x40 },
        !           753:     { 0xE6, 0x2C, 0xEB, 0x40 },
        !           754:     { 0xE6, 0x2C, 0xEB, 0x40 },
        !           755:     { 0xE6, 0x2C, 0xEB, 0x40 },
        !           756:     { 0xEE, 0x2C, 0xFB, 0x40 },
        !           757:     { 0xEE, 0x2C, 0xFB, 0x40 },
        !           758:     { 0xEE, 0x2C, 0xFB, 0x40 },
        !           759:     { 0xEE, 0x2D, 0x0B, 0x40 },
        !           760:     { 0xEE, 0x2D, 0x0B, 0x40 },
        !           761:     { 0xEE, 0x2D, 0x0B, 0x40 },
        !           762:     { 0xEE, 0x2D, 0x0B, 0x40 },
        !           763:     { 0xEE, 0x2D, 0x0B, 0x40 },
        !           764:     { 0xF5, 0x25, 0x0B, 0x38 },
        !           765:     { 0xF5, 0x25, 0x0B, 0x3C },
        !           766:     { 0xF5, 0x25, 0x0B, 0x40 },
        !           767:     { 0xF5, 0x25, 0x1B, 0x40 },
        !           768:     { 0xF5, 0x25, 0x1B, 0x40 },
        !           769:     { 0xF5, 0x25, 0x1B, 0x40 },
        !           770:     { 0xF5, 0x25, 0x1B, 0x40 },
        !           771:     { 0xF5, 0x25, 0x1B, 0x40 },
        !           772:     { 0xFD, 0x25, 0x2B, 0x40 },
        !           773:     { 0xFD, 0x25, 0x2B, 0x40 },
        !           774:     { 0xFD, 0x25, 0x2B, 0x40 },
        !           775:     { 0xFD, 0x25, 0x2B, 0x40 },
        !           776:     { 0xFD, 0x25, 0x27, 0x40 },
        !           777:     { 0xFD, 0x25, 0x27, 0x40 },
        !           778:     { 0xFD, 0x25, 0x27, 0x40 },
        !           779:     { 0xFD, 0x25, 0x23, 0x40 },
        !           780:     { 0xFD, 0x25, 0x23, 0x40 },
        !           781:     { 0xFD, 0x25, 0x23, 0x40 },
        !           782:     { 0xFD, 0x25, 0x33, 0x40 },
        !           783:     { 0xFD, 0x25, 0x33, 0x40 },
        !           784:     { 0xFD, 0x25, 0x33, 0x40 },
        !           785:     { 0xFD, 0x25, 0x33, 0x40 },
        !           786:     { 0xFD, 0x25, 0x33, 0x40 },
        !           787:     { 0xFD, 0x25, 0x33, 0x40 },
        !           788:     { 0xFC, 0x25, 0x33, 0x40 },
        !           789:     { 0xFC, 0x25, 0x33, 0x40 },
        !           790:     { 0xFC, 0x25, 0x43, 0x40 },
        !           791:     { 0xFC, 0x25, 0x43, 0x40 },
        !           792:     { 0xFC, 0x25, 0x43, 0x40 },
        !           793:     { 0xFC, 0x25, 0x43, 0x44 },
        !           794:     { 0xFC, 0x25, 0x43, 0x48 },
        !           795:     { 0xFC, 0x25, 0x43, 0x4C },
        !           796:     { 0xFC, 0x25, 0x43, 0xBC },
        !           797:     { 0xFC, 0x25, 0x43, 0xC0 },
        !           798:     { 0xFC, 0x25, 0x43, 0xC0 },
        !           799:     { 0xFC, 0x23, 0x43, 0xC0 },
        !           800:     { 0xFC, 0x23, 0x43, 0xC0 },
        !           801:     { 0xFC, 0x23, 0x43, 0xC0 },
        !           802:     { 0xFC, 0x21, 0x43, 0xC0 },
        !           803:     { 0xFC, 0x21, 0x43, 0xC0 },
        !           804:     { 0xFC, 0x21, 0x53, 0xC0 },
        !           805:     { 0xFC, 0x21, 0x53, 0xC0 },
        !           806:     { 0xFC, 0x21, 0x53, 0xC0 }
        !           807: };
        !           808:
        !           809: RLPS_EQUALIZER_RAM t1_rlps_perf_mode_ram_table[] =
        !           810: {
        !           811:        { 0x03, 0xFE, 0x18, 0x40 },
        !           812:        { 0x03, 0xFE, 0x18, 0x40 },
        !           813:        { 0x03, 0xFE, 0x18, 0x40 },
        !           814:        { 0x03, 0xFE, 0x18, 0x40 },
        !           815:        { 0x03, 0xFE, 0x18, 0x40 },
        !           816:        { 0x03, 0xFE, 0x18, 0x40 },
        !           817:        { 0x03, 0xFE, 0x18, 0x40 },
        !           818:        { 0x03, 0xFE, 0x18, 0x40 },
        !           819:        { 0x03, 0xF6, 0x18, 0x40 },
        !           820:        { 0x03, 0xF6, 0x18, 0x40 },
        !           821:        { 0x03, 0xF6, 0x18, 0x40 },
        !           822:        { 0x03, 0xF6, 0x18, 0x40 },
        !           823:        { 0x03, 0xF6, 0x18, 0x40 },
        !           824:        { 0x03, 0xF6, 0x18, 0x40 },
        !           825:        { 0x03, 0xF6, 0x18, 0x40 },
        !           826:        { 0x03, 0xF6, 0x18, 0x40 },
        !           827:        { 0x03, 0xEE, 0x18, 0x40 },
        !           828:        { 0x03, 0xEE, 0x18, 0x40 },
        !           829:        { 0x03, 0xEE, 0x18, 0x40 },
        !           830:        { 0x03, 0xEE, 0x18, 0x40 },
        !           831:        { 0x03, 0xEE, 0x18, 0x40 },
        !           832:        { 0x03, 0xEE, 0x18, 0x40 },
        !           833:        { 0x03, 0xEE, 0x18, 0x40 },
        !           834:        { 0x03, 0xEE, 0x18, 0x40 },
        !           835:        { 0x03, 0xE6, 0x18, 0x40 },
        !           836:        { 0x03, 0xE6, 0x18, 0x40 },
        !           837:        { 0x03, 0xE6, 0x18, 0x40 },
        !           838:        { 0x03, 0xE6, 0x18, 0x40 },
        !           839:        { 0x03, 0xE6, 0x18, 0x40 },
        !           840:        { 0x03, 0xE6, 0x18, 0x40 },
        !           841:        { 0x03, 0xE6, 0x18, 0x40 },
        !           842:        { 0x03, 0xE6, 0x18, 0x40 },
        !           843:        { 0x03, 0xDE, 0x18, 0x40 },
        !           844:        { 0x03, 0xDE, 0x18, 0x40 },
        !           845:        { 0x03, 0xDE, 0x18, 0x40 },
        !           846:        { 0x03, 0xDE, 0x18, 0x40 },
        !           847:        { 0x03, 0xDE, 0x18, 0x40 },
        !           848:        { 0x03, 0xDE, 0x18, 0x40 },
        !           849:        { 0x03, 0xDE, 0x18, 0x40 },
        !           850:        { 0x03, 0xDE, 0x18, 0x40 },
        !           851:        { 0x03, 0xD6, 0x18, 0x40 },
        !           852:        { 0x03, 0xD6, 0x18, 0x40 },
        !           853:        { 0x03, 0xD6, 0x18, 0x40 },
        !           854:        { 0x03, 0xD6, 0x18, 0x40 },
        !           855:        { 0x03, 0xD6, 0x18, 0x40 },
        !           856:        { 0x03, 0xD6, 0x18, 0x40 },
        !           857:        { 0x03, 0xD6, 0x18, 0x40 },
        !           858:        { 0x03, 0xD6, 0x18, 0x40 },
        !           859:        { 0x03, 0xCE, 0x18, 0x40 },
        !           860:        { 0x03, 0xCE, 0x18, 0x40 },
        !           861:        { 0x03, 0xCE, 0x18, 0x40 },
        !           862:        { 0x03, 0xCE, 0x18, 0x40 },
        !           863:        { 0x03, 0xCE, 0x18, 0x40 },
        !           864:        { 0x03, 0xCE, 0x18, 0x40 },
        !           865:        { 0x03, 0xCE, 0x18, 0x40 },
        !           866:        { 0x03, 0xCE, 0x18, 0x40 },
        !           867:        { 0x03, 0xC6, 0x18, 0x40 },
        !           868:        { 0x03, 0xC6, 0x18, 0x40 },
        !           869:        { 0x03, 0xC6, 0x18, 0x40 },
        !           870:        { 0x03, 0xC6, 0x18, 0x40 },
        !           871:        { 0x03, 0xC6, 0x18, 0x40 },
        !           872:        { 0x03, 0xC6, 0x18, 0x40 },
        !           873:        { 0x03, 0xC6, 0x18, 0x40 },
        !           874:        { 0x03, 0xC6, 0x18, 0x40 },
        !           875:        { 0x03, 0xBE, 0x18, 0x40 },
        !           876:        { 0x03, 0xBE, 0x18, 0x40 },
        !           877:        { 0x03, 0xBE, 0x18, 0x40 },
        !           878:        { 0x03, 0xBE, 0x18, 0x40 },
        !           879:        { 0x03, 0xBE, 0x18, 0x40 },
        !           880:        { 0x03, 0xBE, 0x18, 0x40 },
        !           881:        { 0x03, 0xBE, 0x18, 0x40 },
        !           882:        { 0x03, 0xBE, 0x18, 0x40 },
        !           883:        { 0x03, 0xB6, 0x18, 0x40 },
        !           884:        { 0x03, 0xB6, 0x18, 0x40 },
        !           885:        { 0x03, 0xB6, 0x18, 0x40 },
        !           886:        { 0x03, 0xB6, 0x18, 0x40 },
        !           887:        { 0x03, 0xB6, 0x18, 0x40 },
        !           888:        { 0x03, 0xB6, 0x18, 0x40 },
        !           889:        { 0x03, 0xB6, 0x18, 0x40 },
        !           890:        { 0x03, 0xB6, 0x18, 0x40 },
        !           891:        { 0x03, 0xA6, 0x18, 0x40 },
        !           892:        { 0x03, 0xA6, 0x18, 0x40 },
        !           893:        { 0x03, 0xA6, 0x18, 0x40 },
        !           894:        { 0x03, 0xA6, 0x18, 0x40 },
        !           895:        { 0x03, 0xA6, 0x18, 0x40 },
        !           896:        { 0x03, 0xA6, 0x18, 0x40 },
        !           897:        { 0x03, 0xA6, 0x18, 0x40 },
        !           898:        { 0x03, 0xA6, 0x18, 0x40 },
        !           899:        { 0x03, 0x9E, 0x18, 0x40 },
        !           900:        { 0x03, 0x9E, 0x18, 0x40 },
        !           901:        { 0x03, 0x9E, 0x18, 0x40 },
        !           902:        { 0x03, 0x9E, 0x18, 0x40 },
        !           903:        { 0x03, 0x9E, 0x18, 0x40 },
        !           904:        { 0x03, 0x9E, 0x18, 0x40 },
        !           905:        { 0x03, 0x9E, 0x18, 0x40 },
        !           906:        { 0x03, 0x9E, 0x18, 0x40 },
        !           907:        { 0x03, 0x96, 0x18, 0x40 },
        !           908:        { 0x03, 0x96, 0x18, 0x40 },
        !           909:        { 0x03, 0x96, 0x18, 0x40 },
        !           910:        { 0x03, 0x96, 0x18, 0x40 },
        !           911:        { 0x03, 0x96, 0x18, 0x40 },
        !           912:        { 0x03, 0x96, 0x18, 0x40 },
        !           913:        { 0x03, 0x96, 0x18, 0x40 },
        !           914:        { 0x03, 0x96, 0x18, 0x40 },
        !           915:        { 0x03, 0x8E, 0x18, 0x40 },
        !           916:        { 0x03, 0x8E, 0x18, 0x40 },
        !           917:        { 0x03, 0x8E, 0x18, 0x40 },
        !           918:        { 0x03, 0x8E, 0x18, 0x40 },
        !           919:        { 0x03, 0x8E, 0x18, 0x40 },
        !           920:        { 0x03, 0x8E, 0x18, 0x40 },
        !           921:        { 0x03, 0x8E, 0x18, 0x40 },
        !           922:        { 0x03, 0x8E, 0x18, 0x40 },
        !           923:        { 0x03, 0x86, 0x18, 0x40 },
        !           924:        { 0x03, 0x86, 0x18, 0x40 },
        !           925:        { 0x03, 0x86, 0x18, 0x40 },
        !           926:        { 0x03, 0x86, 0x18, 0x40 },
        !           927:        { 0x03, 0x86, 0x18, 0x40 },
        !           928:        { 0x03, 0x86, 0x18, 0x40 },
        !           929:        { 0x03, 0x86, 0x18, 0x40 },
        !           930:        { 0x03, 0x86, 0x18, 0x40 },
        !           931:        { 0x03, 0x7E, 0x18, 0x40 },
        !           932:        { 0x03, 0x7E, 0x18, 0x40 },
        !           933:        { 0x03, 0x7E, 0x18, 0x40 },
        !           934:        { 0x03, 0x7E, 0x18, 0x40 },
        !           935:        { 0x03, 0x7E, 0x18, 0x40 },
        !           936:        { 0x03, 0x7E, 0x18, 0x40 },
        !           937:        { 0x03, 0x7E, 0x18, 0x40 },
        !           938:        { 0x03, 0x7E, 0x18, 0x40 },
        !           939:        { 0x03, 0x76, 0x18, 0x40 },
        !           940:        { 0x03, 0x76, 0x18, 0x40 },
        !           941:        { 0x03, 0x76, 0x18, 0x40 },
        !           942:        { 0x03, 0x76, 0x18, 0x40 },
        !           943:        { 0x03, 0x76, 0x18, 0x40 },
        !           944:        { 0x03, 0x76, 0x18, 0x40 },
        !           945:        { 0x03, 0x76, 0x18, 0x40 },
        !           946:        { 0x03, 0x76, 0x18, 0x40 },
        !           947:        { 0x03, 0x6E, 0x18, 0x40 },
        !           948:        { 0x03, 0x6E, 0x18, 0x40 },
        !           949:        { 0x03, 0x6E, 0x18, 0x40 },
        !           950:        { 0x03, 0x6E, 0x18, 0x40 },
        !           951:        { 0x03, 0x6E, 0x18, 0x40 },
        !           952:        { 0x03, 0x6E, 0x18, 0x40 },
        !           953:        { 0x03, 0x6E, 0x18, 0x40 },
        !           954:        { 0x03, 0x6E, 0x18, 0x40 },
        !           955:        { 0x03, 0x66, 0x18, 0x40 },
        !           956:        { 0x03, 0x66, 0x18, 0x40 },
        !           957:        { 0x03, 0x66, 0x18, 0x40 },
        !           958:        { 0x03, 0x66, 0x18, 0x40 },
        !           959:        { 0x03, 0x66, 0x18, 0x40 },
        !           960:        { 0x03, 0x66, 0x18, 0x40 },
        !           961:        { 0x03, 0x66, 0x18, 0x40 },
        !           962:        { 0x03, 0x66, 0x18, 0x40 },
        !           963:        { 0x03, 0x5E, 0x18, 0x40 },
        !           964:        { 0x03, 0x5E, 0x18, 0x40 },
        !           965:        { 0x03, 0x5E, 0x18, 0x40 },
        !           966:        { 0x03, 0x5E, 0x18, 0x40 },
        !           967:        { 0x03, 0x5E, 0x18, 0x40 },
        !           968:        { 0x03, 0x5E, 0x18, 0x40 },
        !           969:        { 0x03, 0x5E, 0x18, 0x40 },
        !           970:        { 0x03, 0x5E, 0x18, 0x40 },
        !           971:        { 0x03, 0x56, 0x18, 0x40 },
        !           972:        { 0x03, 0x56, 0x18, 0x40 },
        !           973:        { 0x03, 0x56, 0x18, 0x40 },
        !           974:        { 0x03, 0x56, 0x18, 0x40 },
        !           975:        { 0x03, 0x56, 0x18, 0x40 },
        !           976:        { 0x03, 0x56, 0x18, 0x40 },
        !           977:        { 0x03, 0x56, 0x18, 0x40 },
        !           978:        { 0x03, 0x56, 0x18, 0x40 },
        !           979:        { 0x03, 0x4E, 0x18, 0x40 },
        !           980:        { 0x03, 0x4E, 0x18, 0x40 },
        !           981:        { 0x03, 0x4E, 0x18, 0x40 },
        !           982:        { 0x03, 0x4E, 0x18, 0x40 },
        !           983:        { 0x03, 0x4E, 0x18, 0x40 },
        !           984:        { 0x03, 0x4E, 0x18, 0x40 },
        !           985:        { 0x03, 0x4E, 0x18, 0x40 },
        !           986:        { 0x03, 0x4E, 0x18, 0x40 },
        !           987:        { 0x03, 0x46, 0x18, 0x40 },
        !           988:        { 0x03, 0x46, 0x18, 0x40 },
        !           989:        { 0x03, 0x46, 0x18, 0x40 },
        !           990:        { 0x03, 0x46, 0x18, 0x40 },
        !           991:        { 0x03, 0x46, 0x18, 0x40 },
        !           992:        { 0x03, 0x46, 0x18, 0x40 },
        !           993:        { 0x03, 0x46, 0x18, 0x40 },
        !           994:        { 0x03, 0x46, 0x18, 0x40 },
        !           995:        { 0x03, 0x3E, 0x18, 0x40 },
        !           996:        { 0x03, 0x3E, 0x18, 0x40 },
        !           997:        { 0x03, 0x3E, 0x18, 0x40 },
        !           998:        { 0x03, 0x3E, 0x18, 0x40 },
        !           999:        { 0x03, 0x3E, 0x18, 0x40 },
        !          1000:        { 0x03, 0x3E, 0x18, 0x40 },
        !          1001:        { 0x03, 0x3E, 0x18, 0x40 },
        !          1002:        { 0x03, 0x3E, 0x18, 0x40 },
        !          1003:        { 0x03, 0x36, 0x18, 0x40 },
        !          1004:        { 0x03, 0x36, 0x18, 0x40 },
        !          1005:        { 0x03, 0x36, 0x18, 0x40 },
        !          1006:        { 0x03, 0x36, 0x18, 0x40 },
        !          1007:        { 0x03, 0x36, 0x18, 0x40 },
        !          1008:        { 0x03, 0x36, 0x18, 0x40 },
        !          1009:        { 0x03, 0x36, 0x18, 0x40 },
        !          1010:        { 0x03, 0x36, 0x18, 0x40 },
        !          1011:        { 0x03, 0x2E, 0x18, 0x40 },
        !          1012:        { 0x03, 0x2E, 0x18, 0x40 },
        !          1013:        { 0x03, 0x2E, 0x18, 0x40 },
        !          1014:        { 0x03, 0x2E, 0x18, 0x40 },
        !          1015:        { 0x03, 0x2E, 0x18, 0x40 },
        !          1016:        { 0x03, 0x2E, 0x18, 0x40 },
        !          1017:        { 0x03, 0x2E, 0x18, 0x40 },
        !          1018:        { 0x03, 0x2E, 0x18, 0x40 },
        !          1019:        { 0x03, 0x26, 0x18, 0x40 },
        !          1020:        { 0x03, 0x26, 0x18, 0x40 },
        !          1021:        { 0x03, 0x26, 0x18, 0x40 },
        !          1022:        { 0x03, 0x26, 0x18, 0x40 },
        !          1023:        { 0x03, 0x26, 0x18, 0x40 },
        !          1024:        { 0x03, 0x26, 0x18, 0x40 },
        !          1025:        { 0x03, 0x26, 0x18, 0x40 },
        !          1026:        { 0x03, 0x26, 0x18, 0x40 },
        !          1027:        { 0x03, 0x1E, 0x18, 0x40 },
        !          1028:        { 0x03, 0x1E, 0x18, 0x40 },
        !          1029:        { 0x03, 0x1E, 0x18, 0x40 },
        !          1030:        { 0x03, 0x1E, 0x18, 0x40 },
        !          1031:        { 0x03, 0x1E, 0x18, 0x40 },
        !          1032:        { 0x03, 0x1E, 0x18, 0x40 },
        !          1033:        { 0x03, 0x1E, 0x18, 0x40 },
        !          1034:        { 0x03, 0x1E, 0x18, 0x40 },
        !          1035:        { 0x03, 0x16, 0x18, 0x40 },
        !          1036:        { 0x03, 0x16, 0x18, 0x40 },
        !          1037:        { 0x03, 0x16, 0x18, 0x40 },
        !          1038:        { 0x03, 0x16, 0x18, 0x40 },
        !          1039:        { 0x03, 0x16, 0x18, 0x40 },
        !          1040:        { 0x03, 0x16, 0x18, 0x40 },
        !          1041:        { 0x03, 0x16, 0x18, 0x40 },
        !          1042:        { 0x03, 0x16, 0x18, 0x40 },
        !          1043:        { 0x03, 0x0E, 0x18, 0x40 },
        !          1044:        { 0x03, 0x0E, 0x18, 0x40 },
        !          1045:        { 0x03, 0x0E, 0x18, 0x40 },
        !          1046:        { 0x03, 0x0E, 0x18, 0x40 },
        !          1047:        { 0x03, 0x0E, 0x18, 0x40 },
        !          1048:        { 0x03, 0x0E, 0x18, 0x40 },
        !          1049:        { 0x03, 0x0E, 0x18, 0x40 },
        !          1050:        { 0x03, 0x0E, 0x18, 0x40 },
        !          1051:        { 0x03, 0x0E, 0x18, 0x40 },
        !          1052:        { 0x03, 0x06, 0x18, 0x40 },
        !          1053:        { 0x03, 0x06, 0x18, 0x40 },
        !          1054:        { 0x03, 0x06, 0x18, 0x40 },
        !          1055:        { 0x03, 0x06, 0x18, 0x40 },
        !          1056:        { 0x03, 0x06, 0x18, 0x40 },
        !          1057:        { 0x03, 0x06, 0x18, 0x40 },
        !          1058:        { 0x03, 0x06, 0x18, 0x40 },
        !          1059:        { 0x03, 0x06, 0x18, 0x40 },
        !          1060:        { 0x03, 0x06, 0x18, 0x40 },
        !          1061:        { 0x03, 0x06, 0x18, 0x40 },
        !          1062:        { 0x03, 0x06, 0x18, 0x40 },
        !          1063:        { 0x03, 0x06, 0x18, 0x40 },
        !          1064:        { 0x03, 0x06, 0x18, 0x40 },
        !          1065:        { 0x03, 0x06, 0x18, 0x40 },
        !          1066:        { 0x03, 0x06, 0x18, 0x40 }
        !          1067: };
        !          1068:
        !          1069: RLPS_EQUALIZER_RAM e1_rlps_ram_table[] =
        !          1070: {
        !          1071:     { 0x07, 0xDE, 0x18, 0x2C },
        !          1072:     { 0x07, 0xDE, 0x18, 0x2C },
        !          1073:     { 0x07, 0xD6, 0x18, 0x2C },
        !          1074:     { 0x07, 0xD6, 0x18, 0x2C },
        !          1075:     { 0x07, 0xD6, 0x18, 0x2C },
        !          1076:     { 0x07, 0xCE, 0x18, 0x2C },
        !          1077:     { 0x07, 0xCE, 0x18, 0x2C },
        !          1078:     { 0x07, 0xCE, 0x18, 0x2C },
        !          1079:     { 0x07, 0xC6, 0x18, 0x2C },
        !          1080:     { 0x07, 0xC6, 0x18, 0x2C },
        !          1081:     { 0x07, 0xC6, 0x18, 0x2C },
        !          1082:     { 0x07, 0xBE, 0x18, 0x2C },
        !          1083:     { 0x07, 0xBE, 0x18, 0x2C },
        !          1084:     { 0x07, 0xBE, 0x18, 0x2C },
        !          1085:     { 0x07, 0xBE, 0x18, 0x2C },
        !          1086:     { 0x07, 0xBE, 0x18, 0x2C },
        !          1087:     { 0x07, 0xB6, 0x18, 0x2C },
        !          1088:     { 0x07, 0xB6, 0x18, 0x2C },
        !          1089:     { 0x07, 0xB6, 0x18, 0x2C },
        !          1090:     { 0x07, 0xB6, 0x18, 0x2C },
        !          1091:     { 0x07, 0xB6, 0x18, 0x2C },
        !          1092:     { 0x07, 0xAE, 0x18, 0x2C },
        !          1093:     { 0x07, 0xAE, 0x18, 0x2C },
        !          1094:     { 0x07, 0xAE, 0x18, 0x2C },
        !          1095:     { 0x07, 0xAE, 0x18, 0x2C },
        !          1096:     { 0x07, 0xAE, 0x18, 0x2C },
        !          1097:     { 0x07, 0xB6, 0x18, 0xAC },
        !          1098:     { 0x07, 0xAE, 0x18, 0xAC },
        !          1099:     { 0x07, 0xAE, 0x18, 0xAC },
        !          1100:     { 0x07, 0xAE, 0x18, 0xAC },
        !          1101:     { 0x07, 0xAE, 0x18, 0xAC },
        !          1102:     { 0x07, 0xA6, 0x18, 0xAC },
        !          1103:     { 0x07, 0xA6, 0x18, 0xAC },
        !          1104:     { 0x07, 0xA6, 0x18, 0xAC },
        !          1105:     { 0x07, 0xA6, 0x18, 0xAC },
        !          1106:     { 0x07, 0x9E, 0x18, 0xAC },
        !          1107:     { 0x07, 0xA6, 0x19, 0x2C },
        !          1108:     { 0x07, 0xA6, 0x19, 0x2C },
        !          1109:     { 0x07, 0xA6, 0x19, 0x2C },
        !          1110:     { 0x0F, 0xA6, 0x19, 0x2C },
        !          1111:     { 0x0F, 0xA6, 0x19, 0x2C },
        !          1112:     { 0x0F, 0x9E, 0x19, 0x2C },
        !          1113:     { 0x0F, 0x9E, 0x19, 0x2C },
        !          1114:     { 0x0F, 0x9E, 0x19, 0x2C },
        !          1115:     { 0x17, 0x9E, 0x19, 0x2C },
        !          1116:     { 0x17, 0xA6, 0x19, 0xAC },
        !          1117:     { 0x17, 0x9E, 0x19, 0xAC },
        !          1118:     { 0x17, 0x9E, 0x19, 0xAC },
        !          1119:     { 0x17, 0x96, 0x19, 0xAC },
        !          1120:     { 0x1F, 0x96, 0x19, 0xAC },
        !          1121:     { 0x1F, 0x96, 0x19, 0xAC },
        !          1122:     { 0x1F, 0x8E, 0x19, 0xAC },
        !          1123:     { 0x1F, 0x8E, 0x19, 0xAC },
        !          1124:     { 0x1F, 0x8E, 0x19, 0xAC },
        !          1125:     { 0x27, 0x8E, 0x19, 0xAC },
        !          1126:     { 0x27, 0x8E, 0x1A, 0x2C },
        !          1127:     { 0x27, 0x8E, 0x1A, 0x2C },
        !          1128:     { 0x27, 0x8E, 0x1A, 0x2C },
        !          1129:     { 0x27, 0x8E, 0x1A, 0x2C },
        !          1130:     { 0x2F, 0x86, 0x1A, 0x2C },
        !          1131:     { 0x2F, 0x86, 0x1A, 0x2C },
        !          1132:     { 0x2F, 0x86, 0x1A, 0x2C },
        !          1133:     { 0x2F, 0x7E, 0x1A, 0x2C },
        !          1134:     { 0x2F, 0x7E, 0x1A, 0x2C },
        !          1135:     { 0x2F, 0x7E, 0x1A, 0x2C },
        !          1136:     { 0x37, 0x7E, 0x1A, 0x2C },
        !          1137:     { 0x37, 0x7E, 0x1A, 0xAC },
        !          1138:     { 0x37, 0x7E, 0x1A, 0xAC },
        !          1139:     { 0x37, 0x7E, 0x1A, 0xAC },
        !          1140:     { 0x37, 0x7E, 0x1A, 0xAC },
        !          1141:     { 0x3F, 0x7E, 0x2A, 0xAC },
        !          1142:     { 0x3F, 0x7E, 0x2A, 0xAC },
        !          1143:     { 0x3F, 0x76, 0x2A, 0xAC },
        !          1144:     { 0x3F, 0x86, 0x2B, 0x2C },
        !          1145:     { 0x3F, 0x7E, 0x2B, 0x2C },
        !          1146:     { 0x47, 0x7E, 0x2B, 0x2C },
        !          1147:     { 0x47, 0x7E, 0x2F, 0x2C },
        !          1148:     { 0x47, 0x7E, 0x2F, 0x2C },
        !          1149:     { 0x47, 0x7E, 0x2F, 0x2C },
        !          1150:     { 0x47, 0x76, 0x2F, 0x2C },
        !          1151:     { 0x4F, 0x76, 0x2F, 0x2C },
        !          1152:     { 0x4F, 0x76, 0x2F, 0x2C },
        !          1153:     { 0x4F, 0x6E, 0x2F, 0x2C },
        !          1154:     { 0x4F, 0x6E, 0x2F, 0x2C },
        !          1155:     { 0x4F, 0x6E, 0x2F, 0x2C },
        !          1156:     { 0x57, 0x6E, 0x2F, 0x2C },
        !          1157:     { 0x57, 0x6E, 0x2F, 0x2C },
        !          1158:     { 0x57, 0x6E, 0x3F, 0x2C },
        !          1159:     { 0x57, 0x6E, 0x3F, 0x2C },
        !          1160:     { 0x57, 0x6E, 0x3F, 0x2C },
        !          1161:     { 0x5F, 0x6E, 0x3F, 0x2C },
        !          1162:     { 0x5F, 0x6E, 0x4F, 0x2C },
        !          1163:     { 0x5F, 0x6E, 0x4F, 0x2C },
        !          1164:     { 0x5F, 0x6E, 0x4F, 0x2C },
        !          1165:     { 0x5F, 0x66, 0x4F, 0x2C },
        !          1166:     { 0x67, 0x66, 0x4F, 0x2C },
        !          1167:     { 0x67, 0x66, 0x4F, 0x2C },
        !          1168:     { 0x67, 0x5E, 0x4F, 0x2C },
        !          1169:     { 0x67, 0x5E, 0x4F, 0x2C },
        !          1170:     { 0x67, 0x66, 0x4F, 0x2C },
        !          1171:     { 0x67, 0x66, 0x4F, 0x2C },
        !          1172:     { 0x67, 0x66, 0x5F, 0x2C },
        !          1173:     { 0x6F, 0x6E, 0x5F, 0x2C },
        !          1174:     { 0x6F, 0x6E, 0x6F, 0x2C },
        !          1175:     { 0x6F, 0x6E, 0x6F, 0x2C },
        !          1176:     { 0x6F, 0x6E, 0x7F, 0x2C },
        !          1177:     { 0x6F, 0x6E, 0x7F, 0x2C },
        !          1178:     { 0x6F, 0x6E, 0x7F, 0x2C },
        !          1179:     { 0x77, 0x66, 0x7F, 0x2C },
        !          1180:     { 0x77, 0x66, 0x7F, 0x2C },
        !          1181:     { 0x77, 0x5E, 0x6F, 0x2C },
        !          1182:     { 0x77, 0x5E, 0x7F, 0x2C },
        !          1183:     { 0x77, 0x5E, 0x7F, 0x2C },
        !          1184:     { 0x7F, 0x5E, 0x7F, 0x2C },
        !          1185:     { 0x7F, 0x5E, 0x8F, 0x2C },
        !          1186:     { 0x7F, 0x5E, 0x8F, 0x2C },
        !          1187:     { 0x7F, 0x5E, 0x8F, 0x2C },
        !          1188:     { 0x87, 0x56, 0x8F, 0x2C },
        !          1189:     { 0x87, 0x56, 0x8F, 0x2C },
        !          1190:     { 0x87, 0x56, 0x8F, 0x2C },
        !          1191:     { 0x87, 0x4E, 0x8F, 0x2C },
        !          1192:     { 0x87, 0x4E, 0x8F, 0x2C },
        !          1193:     { 0x87, 0x4E, 0x8F, 0x2C },
        !          1194:     { 0x8F, 0x4E, 0x9F, 0x2C },
        !          1195:     { 0x8F, 0x4E, 0x9F, 0x2C },
        !          1196:     { 0x8F, 0x4E, 0xAF, 0x2C },
        !          1197:     { 0x8F, 0x4E, 0xAF, 0x2C },
        !          1198:     { 0x8F, 0x4E, 0xAF, 0x2C },
        !          1199:     { 0x97, 0x4E, 0xAF, 0x2C },
        !          1200:     { 0x97, 0x4E, 0xAF, 0x2C },
        !          1201:     { 0x97, 0x4E, 0xAB, 0x2C },
        !          1202:     { 0x97, 0x4E, 0xAB, 0x2C },
        !          1203:     { 0x97, 0x4E, 0xAB, 0x2C },
        !          1204:     { 0x9F, 0x4E, 0xAB, 0x2C },
        !          1205:     { 0x9F, 0x4E, 0xBB, 0x2C },
        !          1206:     { 0x9F, 0x4E, 0xBB, 0x2C },
        !          1207:     { 0x9F, 0x4E, 0xBB, 0x2C },
        !          1208:     { 0x9F, 0x4E, 0xCB, 0x2C },
        !          1209:     { 0xA7, 0x4E, 0xCB, 0x2C },
        !          1210:     { 0xA7, 0x4E, 0xCB, 0x2C },
        !          1211:     { 0xA7, 0x46, 0xCB, 0x2C },
        !          1212:     { 0xA7, 0x46, 0xCB, 0x2C },
        !          1213:     { 0xA7, 0x46, 0xCB, 0x2C },
        !          1214:     { 0xA7, 0x46, 0xDB, 0x2C },
        !          1215:     { 0xAF, 0x46, 0xDB, 0x2C },
        !          1216:     { 0xAF, 0x46, 0xEB, 0x2C },
        !          1217:     { 0xAF, 0x46, 0xEB, 0x2C },
        !          1218:     { 0xAF, 0x4E, 0xEB, 0x2C },
        !          1219:     { 0xAE, 0x4E, 0xEB, 0x2C },
        !          1220:     { 0xAE, 0x4E, 0xEB, 0x2C },
        !          1221:     { 0xB5, 0x46, 0xFB, 0x2C },
        !          1222:     { 0xB5, 0x54, 0xFB, 0x2C },
        !          1223:     { 0xB5, 0x4C, 0xFB, 0x2C },
        !          1224:     { 0xB5, 0x54, 0xFB, 0x2C },
        !          1225:     { 0xB5, 0x54, 0xFB, 0x2C },
        !          1226:     { 0xBD, 0x54, 0xFB, 0x2C },
        !          1227:     { 0xBD, 0x4C, 0xFB, 0x2C },
        !          1228:     { 0xBD, 0x4C, 0xFB, 0x2C },
        !          1229:     { 0xBD, 0x4C, 0xFB, 0x2C },
        !          1230:     { 0xBD, 0x44, 0xEB, 0x2C },
        !          1231:     { 0xC5, 0x44, 0xFB, 0x2C },
        !          1232:     { 0xC5, 0x44, 0xFB, 0x2C },
        !          1233:     { 0xC5, 0x44, 0xFB, 0x2C },
        !          1234:     { 0xC5, 0x45, 0x0B, 0x2C },
        !          1235:     { 0xC5, 0x45, 0x0B, 0x2C },
        !          1236:     { 0xC5, 0x45, 0x0B, 0x2C },
        !          1237:     { 0xCD, 0x45, 0x0B, 0x2C },
        !          1238:     { 0xCD, 0x45, 0x0B, 0x2C },
        !          1239:     { 0xCD, 0x3D, 0x0B, 0x2C },
        !          1240:     { 0xCD, 0x3D, 0x0B, 0x2C },
        !          1241:     { 0xCD, 0x3D, 0x0B, 0x2C },
        !          1242:     { 0xD5, 0x3D, 0x0B, 0x2C },
        !          1243:     { 0xD5, 0x3D, 0x0B, 0x2C },
        !          1244:     { 0xD5, 0x3D, 0x1B, 0x2C },
        !          1245:     { 0xD5, 0x3D, 0x1B, 0x2C },
        !          1246:     { 0xD5, 0x3D, 0x1B, 0x2C },
        !          1247:     { 0xDD, 0x3D, 0x1B, 0x2C },
        !          1248:     { 0xDD, 0x3D, 0x1B, 0x2C },
        !          1249:     { 0xDD, 0x35, 0x1B, 0x2C },
        !          1250:     { 0xDD, 0x35, 0x1B, 0x2C },
        !          1251:     { 0xDD, 0x35, 0x1B, 0x2C },
        !          1252:     { 0xE5, 0x35, 0x1B, 0x2C },
        !          1253:     { 0xE5, 0x35, 0x1B, 0x2C },
        !          1254:     { 0xE5, 0x2D, 0x1B, 0x2C },
        !          1255:     { 0xE5, 0x2D, 0x1B, 0x2C },
        !          1256:     { 0xE5, 0x2D, 0x3B, 0x2C },
        !          1257:     { 0xED, 0x2D, 0x4B, 0x2C },
        !          1258:     { 0xED, 0x2D, 0x1B, 0xA8 },
        !          1259:     { 0xED, 0x2D, 0x1B, 0xAC },
        !          1260:     { 0xED, 0x2D, 0x17, 0xAC },
        !          1261:     { 0xED, 0x2D, 0x17, 0xAC },
        !          1262:     { 0xED, 0x2D, 0x27, 0xAC },
        !          1263:     { 0xF5, 0x2D, 0x27, 0xAC },
        !          1264:     { 0xF5, 0x2D, 0x27, 0xAC },
        !          1265:     { 0xF5, 0x2D, 0x2B, 0xAC },
        !          1266:     { 0xF5, 0x2D, 0x2B, 0xAC },
        !          1267:     { 0xF5, 0x2D, 0x2B, 0xAC },
        !          1268:     { 0xFD, 0x2D, 0x2B, 0xAC },
        !          1269:     { 0xFD, 0x2B, 0x2B, 0xAC },
        !          1270:     { 0xFD, 0x2B, 0x2B, 0xAC },
        !          1271:     { 0xFD, 0x2B, 0x2B, 0xAC },
        !          1272:     { 0xFD, 0x2B, 0x2B, 0xAC },
        !          1273:     { 0xFD, 0x23, 0x2B, 0xAC },
        !          1274:     { 0xFD, 0x23, 0x2B, 0xAC },
        !          1275:     { 0xFD, 0x23, 0x2B, 0xAC },
        !          1276:     { 0xFD, 0x21, 0x2B, 0xAC },
        !          1277:     { 0xFD, 0x21, 0x2B, 0xAC },
        !          1278:     { 0xFD, 0x29, 0x2B, 0xAC },
        !          1279:     { 0xFD, 0x29, 0x2B, 0xAC },
        !          1280:     { 0xFD, 0x29, 0x27, 0xAC },
        !          1281:     { 0xFD, 0x29, 0x37, 0xAC },
        !          1282:     { 0xFD, 0x29, 0x23, 0xAC },
        !          1283:     { 0xFD, 0x29, 0x23, 0xAC },
        !          1284:     { 0xFD, 0x29, 0x23, 0xAC },
        !          1285:     { 0xFD, 0x29, 0x23, 0xAC },
        !          1286:     { 0xFD, 0x21, 0x23, 0xAC },
        !          1287:     { 0xFD, 0x21, 0x23, 0xAC },
        !          1288:     { 0xFD, 0x21, 0x23, 0xAC },
        !          1289:     { 0xFD, 0x21, 0x33, 0xAC },
        !          1290:     { 0xFD, 0x21, 0x33, 0xAC },
        !          1291:     { 0xFD, 0x21, 0x33, 0xAC },
        !          1292:     { 0xFD, 0x21, 0x43, 0xAC },
        !          1293:     { 0xFD, 0x21, 0x43, 0xAC },
        !          1294:     { 0xFD, 0x21, 0x43, 0xAC },
        !          1295:     { 0xFC, 0x21, 0x43, 0xAC },
        !          1296:     { 0xFC, 0x21, 0x43, 0xAC },
        !          1297:     { 0xFC, 0x19, 0x43, 0xAC },
        !          1298:     { 0xFC, 0x19, 0x43, 0xAC },
        !          1299:     { 0xFC, 0x19, 0x43, 0xAC },
        !          1300:     { 0xFC, 0x19, 0x43, 0xAC },
        !          1301:     { 0xFC, 0x19, 0x53, 0xAC },
        !          1302:     { 0xFC, 0x19, 0x53, 0xAC },
        !          1303:     { 0xFC, 0x19, 0x53, 0xAC },
        !          1304:     { 0xFC, 0x19, 0x53, 0xAC },
        !          1305:     { 0xFC, 0x19, 0x63, 0xAC },
        !          1306:     { 0xFC, 0x19, 0x63, 0xAC },
        !          1307:     { 0xFC, 0x19, 0x63, 0xAC },
        !          1308:     { 0xFC, 0x19, 0x73, 0xAC },
        !          1309:     { 0xFC, 0x19, 0x73, 0xAC },
        !          1310:     { 0xFC, 0x19, 0x73, 0xAC },
        !          1311:     { 0xFC, 0x19, 0x73, 0xAC },
        !          1312:     { 0xFC, 0x19, 0x73, 0xAC },
        !          1313:     { 0xFC, 0x19, 0x83, 0xAC },
        !          1314:     { 0xFC, 0x19, 0x83, 0xAC },
        !          1315:     { 0xFC, 0x19, 0x83, 0xAC },
        !          1316:     { 0xFC, 0x19, 0x83, 0xAC },
        !          1317:     { 0xFC, 0x19, 0x83, 0xAC },
        !          1318:     { 0xFC, 0x19, 0x93, 0xAC },
        !          1319:     { 0xFC, 0x19, 0x93, 0xAC },
        !          1320:     { 0xFC, 0x19, 0x93, 0xAC },
        !          1321:     { 0xFC, 0x19, 0xA3, 0xAC },
        !          1322:     { 0xFC, 0x19, 0xA3, 0xAC },
        !          1323:     { 0xFC, 0x19, 0xB3, 0xAC },
        !          1324:     { 0xFC, 0x19, 0xB3, 0xAC },
        !          1325:     { 0xFC, 0x19, 0xB3, 0xAC },
        !          1326:     { 0xFC, 0x19, 0xB3, 0xAC }
        !          1327: };
        !          1328:
        !          1329:
        !          1330: static void ClearTemplate(sdla_t *);
        !          1331: static unsigned char InitTemplate(sdla_t *);
        !          1332: static void InitLineReceiver(sdla_t *);
        !          1333:
        !          1334: static void ClearTPSCReg(sdla_t *);
        !          1335: static void ClearRPSCReg(sdla_t *);
        !          1336:
        !          1337: static int WriteTPSCReg(sdla_t *, int, int, unsigned char);
        !          1338: static unsigned char ReadTPSCReg(sdla_t *, int, int);
        !          1339:
        !          1340: static int WriteRPSCReg(sdla_t *, int, int, unsigned char);
        !          1341: static unsigned char ReadRPSCReg(sdla_t *, int, int);
        !          1342:
        !          1343: static void DisableAllChannels(sdla_t *);
        !          1344: static void EnableAllChannels(sdla_t *);
        !          1345: static int DisableTxChannel(sdla_t *, int);
        !          1346: static int DisableRxChannel(sdla_t *, int);
        !          1347: static int EnableTxChannel(sdla_t *, int);
        !          1348: static int EnableRxChannel(sdla_t *, int);
        !          1349:
        !          1350: static void sdla_te_set_intr(sdla_t *);
        !          1351: static void sdla_te_tx_intr(sdla_t *);
        !          1352: static void sdla_te_rx_intr(sdla_t *);
        !          1353: static void sdla_t1_rx_intr(sdla_t *);
        !          1354: static void sdla_e1_rx_intr(sdla_t *);
        !          1355:
        !          1356: static void sdla_te_set_status(sdla_t *, unsigned long);
        !          1357: static void sdla_te_enable_timer(sdla_t *, unsigned long);
        !          1358:
        !          1359: static int sdla_te_linelb(sdla_t *, unsigned char);
        !          1360: static int sdla_te_paylb(sdla_t *, unsigned char);
        !          1361: static int sdla_te_ddlb(sdla_t *, unsigned char);
        !          1362: static int sdla_te_lb(sdla_t *, unsigned char);
        !          1363:
        !          1364:
        !          1365: static void
        !          1366: ClearTemplate(sdla_t *card)
        !          1367: {
        !          1368:        int i = 0, j = 0;
        !          1369:        unsigned int indirect_addr = 0x00;
        !          1370:
        !          1371:        for (i = FIRST_UI; i <= LAST_UI; i++) {
        !          1372:                for (j = FIRST_SAMPLE; j <= LAST_SAMPLE; j++) {
        !          1373:                        indirect_addr = (j << 3) | i;
        !          1374:                        /* Set up the indirect address */
        !          1375:                        WRITE_REG(REG_XLPG_WAVEFORM_ADDR, indirect_addr);
        !          1376:                        WRITE_REG(REG_XLPG_WAVEFORM_DATA, 0x00);
        !          1377:                }
        !          1378:        }
        !          1379: }
        !          1380:
        !          1381: static unsigned char
        !          1382: InitTemplate(sdla_t *card)
        !          1383: {
        !          1384:        sdla_te_cfg_t* te_cfg = &card->fe_te.te_cfg;
        !          1385:        int i = 0, j = 0;
        !          1386:        unsigned char indirect_addr = 0x00, xlpg_scale = 0x00;
        !          1387:        TX_WAVEFORM* tx_waveform = NULL;
        !          1388:
        !          1389:        if (IS_T1(&card->fe_te.te_cfg)) {
        !          1390:                switch (te_cfg->lbo) {
        !          1391:                case WAN_T1_LBO_0_DB:
        !          1392:                        tx_waveform = &t1_tx_waveform_lh_0db;
        !          1393:                        xlpg_scale = 0x0C;
        !          1394:                        break;
        !          1395:                case WAN_T1_LBO_75_DB:
        !          1396:                        tx_waveform = &t1_tx_waveform_lh_75db;
        !          1397:                        xlpg_scale = 0x07;
        !          1398:                        break;
        !          1399:                case WAN_T1_LBO_15_DB:
        !          1400:                        tx_waveform = &t1_tx_waveform_lh_15db;
        !          1401:                        xlpg_scale = 0x03;
        !          1402:                        break;
        !          1403:                case WAN_T1_LBO_225_DB:
        !          1404:                        tx_waveform = &t1_tx_waveform_lh_225db;
        !          1405:                        xlpg_scale = 0x02;
        !          1406:                        break;
        !          1407:                case WAN_T1_0_110:
        !          1408:                        tx_waveform = &t1_tx_waveform_sh_110ft;
        !          1409:                        xlpg_scale = 0x0C;
        !          1410:                        break;
        !          1411:                case WAN_T1_110_220:
        !          1412:                        tx_waveform = &t1_tx_waveform_sh_220ft;
        !          1413:                        xlpg_scale = 0x10;
        !          1414:                        break;
        !          1415:                case WAN_T1_220_330:
        !          1416:                        tx_waveform = &t1_tx_waveform_sh_330ft;
        !          1417:                        xlpg_scale = 0x11;
        !          1418:                        break;
        !          1419:                case WAN_T1_330_440:
        !          1420:                        tx_waveform = &t1_tx_waveform_sh_440ft;
        !          1421:                        xlpg_scale = 0x12;
        !          1422:                        break;
        !          1423:                case WAN_T1_440_550:
        !          1424:                        tx_waveform = &t1_tx_waveform_sh_550ft;
        !          1425:                        xlpg_scale = 0x14;
        !          1426:                        break;
        !          1427:                case WAN_T1_550_660:
        !          1428:                        tx_waveform = &t1_tx_waveform_sh_660ft;
        !          1429:                        xlpg_scale = 0x15;
        !          1430:                        break;
        !          1431:                default:
        !          1432:                        /* Use 0DB as a default value */
        !          1433:                        tx_waveform = &t1_tx_waveform_lh_0db;
        !          1434:                        xlpg_scale = 0x0C;
        !          1435:                        break;
        !          1436:                }
        !          1437:        } else {
        !          1438:                tx_waveform = &e1_tx_waveform_120;
        !          1439:                xlpg_scale = 0x0C;
        !          1440:                /*xlpg_scale = 0x0B; */
        !          1441:        }
        !          1442:
        !          1443:        for (i = FIRST_UI; i <= LAST_UI; i++) {
        !          1444:                for (j = FIRST_SAMPLE; j <= LAST_SAMPLE; j++) {
        !          1445:                        indirect_addr = (j << 3) | i;
        !          1446:                        /* Set up the indirect address */
        !          1447:                        WRITE_REG(REG_XLPG_WAVEFORM_ADDR, indirect_addr);
        !          1448:                        WRITE_REG(REG_XLPG_WAVEFORM_DATA, (*tx_waveform)[j][i]);
        !          1449:                }
        !          1450:        }
        !          1451:        return xlpg_scale;
        !          1452: }
        !          1453:
        !          1454:
        !          1455: static void
        !          1456: InitLineReceiver(sdla_t *card)
        !          1457: {
        !          1458:        int                     ram_addr = 0x00;
        !          1459:        RLPS_EQUALIZER_RAM      *rlps_ram_table = NULL;
        !          1460:
        !          1461:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          1462:                rlps_ram_table = e1_rlps_ram_table;
        !          1463:        } else {
        !          1464:                if (card->fe_te.te_cfg.high_impedance_mode == WAN_YES) {
        !          1465:                        log(LOG_INFO, "%s: Setting to High-Impedance Mode!\n",
        !          1466:                                        card->devname);
        !          1467:                        rlps_ram_table = t1_rlps_perf_mode_ram_table;
        !          1468:                } else {
        !          1469:                        rlps_ram_table = t1_rlps_ram_table;
        !          1470:                }
        !          1471:        }
        !          1472:        for (ram_addr = 0; ram_addr <= 255; ram_addr++) {
        !          1473: /* ERRATA VVV  */
        !          1474:                /* Configure a write into the RAM address */
        !          1475:                WRITE_REG(REG_RLPS_EQ_RWB, BIT_RLPS_EQ_RWB);
        !          1476:                /* Initiate write into the specified RAM address */
        !          1477:                WRITE_REG(REG_RLPS_EQ_ADDR, (unsigned char)ram_addr);
        !          1478:                DELAY(100);
        !          1479: /* ERRATA ^^^  */
        !          1480:                /* Write 1st value from conten column */
        !          1481:                WRITE_REG(REG_RLPS_IND_DATA_1, rlps_ram_table[ram_addr].byte1);
        !          1482:                /* Write 2st value from conten column */
        !          1483:                WRITE_REG(REG_RLPS_IND_DATA_2, rlps_ram_table[ram_addr].byte2);
        !          1484:                /* Write 3st value from conten column */
        !          1485:                WRITE_REG(REG_RLPS_IND_DATA_3, rlps_ram_table[ram_addr].byte3);
        !          1486:                /* Write 4st value from conten column */
        !          1487:                WRITE_REG(REG_RLPS_IND_DATA_4, rlps_ram_table[ram_addr].byte4);
        !          1488:                /* Configure a write into the RAM address */
        !          1489:                WRITE_REG(REG_RLPS_EQ_RWB, 0x00);
        !          1490:                /* Initiate write into the specified RAM address */
        !          1491:                WRITE_REG(REG_RLPS_EQ_ADDR, (unsigned char)ram_addr);
        !          1492: /* ERRATA VVV  */
        !          1493:                DELAY(100);
        !          1494: /* ERRATA ^^^  */
        !          1495:        }
        !          1496: }
        !          1497:
        !          1498: static void
        !          1499: ClearTPSCReg(sdla_t *card)
        !          1500: {
        !          1501:        int channel = 0;
        !          1502:        int start_channel = 0, stop_channel = 0;
        !          1503:
        !          1504:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          1505:                start_channel = 0;
        !          1506:                stop_channel = NUM_OF_E1_TIMESLOTS + 1;
        !          1507:        } else {
        !          1508:                start_channel = 1;
        !          1509:                stop_channel = NUM_OF_T1_CHANNELS;
        !          1510:        }
        !          1511:
        !          1512:        for (channel = start_channel; channel <= stop_channel; channel++) {
        !          1513:                WRITE_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel, 0x00);
        !          1514:                WRITE_TPSC_REG(REG_TPSC_IDLE_CODE_BYTE, channel, 0x00);
        !          1515:                WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel, 0x00);
        !          1516:        }
        !          1517:        return;
        !          1518: }
        !          1519:
        !          1520: static void
        !          1521: ClearRPSCReg(sdla_t *card)
        !          1522: {
        !          1523:        int channel = 0;
        !          1524:        int start_channel = 0, stop_channel = 0;
        !          1525:
        !          1526:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          1527:                start_channel = 0;
        !          1528:                stop_channel = NUM_OF_E1_TIMESLOTS + 1;
        !          1529:        } else {
        !          1530:                start_channel = 1;
        !          1531:                stop_channel = NUM_OF_T1_CHANNELS;
        !          1532:        }
        !          1533:
        !          1534:        for (channel = start_channel; channel <= stop_channel; channel++) {
        !          1535:                WRITE_RPSC_REG(REG_RPSC_DATA_CTRL_BYTE, channel, 0x00);
        !          1536:                WRITE_RPSC_REG(REG_RPSC_DATA_COND_BYTE, channel, 0x00);
        !          1537:                WRITE_RPSC_REG(REG_RPSC_SIGNALING_BYTE, channel, 0x00);
        !          1538:        }
        !          1539:        return;
        !          1540: }
        !          1541:
        !          1542: /*
        !          1543:  * Write value to TPSC indirect register.
        !          1544:  * Arguments:   card   - Pointer to the card structure
        !          1545:  *             reg     - Offset in TPSC indirect space.
        !          1546:  *             channel - Channel number.
        !          1547:  *             value   - New PMC register value.
        !          1548:  * Returns:    0 - success, otherwise - error
        !          1549:  */
        !          1550: static int
        !          1551: WriteTPSCReg(sdla_t *card, int reg, int channel, unsigned char value)
        !          1552: {
        !          1553:        unsigned char   temp = 0x00;
        !          1554:        int             i = 0, busy_flag = 0;
        !          1555:        int             err = 0;
        !          1556:
        !          1557:        reg += channel;
        !          1558:        /* Set IND bit to 1 in TPSC to enable indirect access to
        !          1559:        ** TPSC register */
        !          1560:        WRITE_REG(REG_TPSC_CFG, BIT_TPSC_IND);
        !          1561:        busy_flag = 1;
        !          1562:        for (i = 0; i < MAX_BUSY_READ; i++) {
        !          1563:                temp = READ_REG(REG_TPSC_MICRO_ACCESS_STATUS);
        !          1564:                if ((temp & BIT_TPSC_BUSY) == 0x0) {
        !          1565:                        busy_flag = 0;
        !          1566:                        break;
        !          1567:                }
        !          1568:        }
        !          1569:        if (busy_flag == 1) {
        !          1570:                log(LOG_INFO, "%s: Failed to write to TPSC Reg[%02x]<-%02x!\n",
        !          1571:                                        card->devname, reg, value);
        !          1572:                err = EBUSY;
        !          1573:                goto write_tpsc_done;
        !          1574:        }
        !          1575:
        !          1576:        WRITE_REG(REG_TPSC_CHANNEL_INDIRECT_DATA_BUFFER,
        !          1577:                                (unsigned char)value);
        !          1578:        WRITE_REG(REG_TPSC_CHANNEL_INDIRECT_ADDRESS_CONTROL,
        !          1579:                                (unsigned char)(reg & 0x7F));
        !          1580:
        !          1581:        for (i = 0; i < MAX_BUSY_READ; i++) {
        !          1582:                temp = READ_REG(REG_TPSC_MICRO_ACCESS_STATUS);
        !          1583:                if ((temp & BIT_TPSC_BUSY) == 0x0) {
        !          1584:                        err = EBUSY;
        !          1585:                        goto write_tpsc_done;
        !          1586:                }
        !          1587:        }
        !          1588:        log(LOG_INFO, "%s: Failed to write value to TPSC Reg=%02x, val=%02x.\n",
        !          1589:                                card->devname, reg, value);
        !          1590: write_tpsc_done:
        !          1591:        /* Set PCCE bit to 1 in TPSC to enable modifing the TPSC register */
        !          1592:        WRITE_REG(REG_TPSC_CFG, BIT_TPSC_IND | BIT_TPSC_PCCE);
        !          1593:        return err;
        !          1594: }
        !          1595:
        !          1596: /*
        !          1597:  * Read value from TPSC indirect register.
        !          1598:  *
        !          1599:  * Arguments:   card   - Pointer to the card structure
        !          1600:  *             reg     - Offset in TPSC indirect space.
        !          1601:  *             channel - Channel number.
        !          1602:  * Returns:    Returns register value.
        !          1603:  */
        !          1604: static unsigned char
        !          1605: ReadTPSCReg(sdla_t *card, int reg, int channel)
        !          1606: {
        !          1607:        unsigned char   tmp = 0x00, value = 0x00;
        !          1608:        int             i = 0, busy_flag = 0;
        !          1609:
        !          1610:        reg += channel;
        !          1611:        /* Set IND bit to 1 in TPSC to enable indirect access to
        !          1612:        ** TPSC register */
        !          1613:        WRITE_REG(REG_TPSC_CFG, BIT_TPSC_IND);
        !          1614:        busy_flag = 1;
        !          1615:        for (i = 0; i < MAX_BUSY_READ; i++) {
        !          1616:                tmp = READ_REG(REG_TPSC_MICRO_ACCESS_STATUS);
        !          1617:                if ((tmp & BIT_TPSC_BUSY) == 0x0) {
        !          1618:                        busy_flag = 0;
        !          1619:                        break;
        !          1620:                }
        !          1621:        }
        !          1622:        if (busy_flag == 1) {
        !          1623:                log(LOG_INFO, "%s: Failed to read value to TPSC Reg=%02x!\n",
        !          1624:                                        card->devname, reg);
        !          1625:                goto read_tpsc_done;
        !          1626:        }
        !          1627:
        !          1628:        WRITE_REG(REG_TPSC_CHANNEL_INDIRECT_ADDRESS_CONTROL,
        !          1629:                                        (unsigned char)(reg | 0x80));
        !          1630:
        !          1631:        for (i = 0; i < MAX_BUSY_READ; i++) {
        !          1632:                tmp = READ_REG(REG_TPSC_MICRO_ACCESS_STATUS);
        !          1633:                if ((tmp & BIT_TPSC_BUSY) == 0x0) {
        !          1634:                        value = READ_REG(REG_TPSC_CHANNEL_INDIRECT_DATA_BUFFER);
        !          1635:                        goto read_tpsc_done;
        !          1636:                }
        !          1637:        }
        !          1638:        log(LOG_INFO, "%s: Failed to read value to TPSC Reg=%02x.\n",
        !          1639:                                        card->devname, reg);
        !          1640: read_tpsc_done:
        !          1641:        /* Set PCCE bit to 1 in TPSC to enable modifing the TPSC register */
        !          1642:        WRITE_REG(REG_TPSC_CFG, BIT_TPSC_IND | BIT_TPSC_PCCE);
        !          1643:        return value;
        !          1644: }
        !          1645:
        !          1646: /*
        !          1647:  * Write value to RPSC indirect register.
        !          1648:  *
        !          1649:  * Arguments:   card   - Pointer to the card structure
        !          1650:  *             reg     - Offset in RPSC indirect space.
        !          1651:  *             channel - Channel number.
        !          1652:  *             value - New PMC register value.
        !          1653:  * Returns:    0-success, otherwise - error
        !          1654:  */
        !          1655: static int
        !          1656: WriteRPSCReg(sdla_t* card, int reg, int channel, unsigned char value)
        !          1657: {
        !          1658:        unsigned char   temp = 0x00;
        !          1659:        int             i = 0, busy_flag = 0;
        !          1660:        int             err = 0;
        !          1661:
        !          1662:        reg += channel;
        !          1663:        /* Set IND bit to 1 in RPSC to enable indirect access to
        !          1664:        ** RPSC register*/
        !          1665:        WRITE_REG(REG_RPSC_CFG, BIT_RPSC_IND);
        !          1666:        busy_flag = 1;
        !          1667:        for (i = 0; i < MAX_BUSY_READ; i++) {
        !          1668:                temp = READ_REG(REG_RPSC_MICRO_ACCESS_STATUS);
        !          1669:                if ((temp & BIT_RPSC_BUSY) == 0x0) {
        !          1670:                        busy_flag = 0;
        !          1671:                        break;
        !          1672:                }
        !          1673:        }
        !          1674:        if (busy_flag == 1) {
        !          1675:                log(LOG_INFO, "%s: Failed to write to RPSC Reg[%02x]<-%02x!\n",
        !          1676:                    card->devname, reg, value);
        !          1677:                err = EBUSY;
        !          1678:                goto write_rpsc_done;
        !          1679:        }
        !          1680:
        !          1681:        WRITE_REG(REG_RPSC_CHANNEL_INDIRECT_DATA_BUFFER, (unsigned char)value);
        !          1682:        WRITE_REG(REG_RPSC_CHANNEL_INDIRECT_ADDRESS_CONTROL,
        !          1683:            (unsigned char)(reg & 0x7F));
        !          1684:
        !          1685:        for (i = 0; i < MAX_BUSY_READ; i++) {
        !          1686:                temp = READ_REG(REG_RPSC_MICRO_ACCESS_STATUS);
        !          1687:                if ((temp & BIT_RPSC_BUSY) == 0x0) {
        !          1688:                        err = EBUSY;
        !          1689:                        goto write_rpsc_done;
        !          1690:                }
        !          1691:        }
        !          1692:        log(LOG_INFO, "%s: Failed to write value to RPSC Reg=%02x, val=%02x.\n",
        !          1693:            card->devname, reg, value);
        !          1694: write_rpsc_done:
        !          1695:        /* Set PCCE bit to 1 in RPSC to enable modifing the RPSC register */
        !          1696:        WRITE_REG(REG_RPSC_CFG, BIT_RPSC_IND | BIT_RPSC_PCCE);
        !          1697:        return err;
        !          1698: }
        !          1699:
        !          1700: /*
        !          1701:  * Read value from RPSC indirect register.
        !          1702:  * Arguments:   card   - Pointer to the card structure
        !          1703:  *             reg     - Offset in RPSC indirect space.
        !          1704:  *             channel - Channel number
        !          1705:  * Returns:    Returns register value.
        !          1706:  */
        !          1707: static unsigned char ReadRPSCReg(sdla_t* card, int reg, int channel)
        !          1708: {
        !          1709:        unsigned char   tmp = 0x00, value = 0x00;
        !          1710:        int             i = 0,busy_flag = 0;
        !          1711:
        !          1712:        reg += channel;
        !          1713:        /* Set IND bit to 1 in RPSC to enable indirect access to
        !          1714:        ** RPSC register*/
        !          1715:        WRITE_REG(REG_RPSC_CFG, BIT_RPSC_IND);
        !          1716:        busy_flag = 1;
        !          1717:        for (i = 0; i < MAX_BUSY_READ; i++) {
        !          1718:                tmp = READ_REG(REG_RPSC_MICRO_ACCESS_STATUS);
        !          1719:                if ((tmp & BIT_RPSC_BUSY) == 0x0) {
        !          1720:                        busy_flag = 0;
        !          1721:                        break;
        !          1722:                }
        !          1723:        }
        !          1724:        if (busy_flag == 1) {
        !          1725:                log(LOG_INFO, "%s: Failed to read value to RPSC Reg=%02x!\n",
        !          1726:                                                card->devname, reg);
        !          1727:                goto read_rpsc_done;
        !          1728:        }
        !          1729:
        !          1730:        WRITE_REG(REG_RPSC_CHANNEL_INDIRECT_ADDRESS_CONTROL,
        !          1731:                                        (unsigned char)(reg | 0x80));
        !          1732:
        !          1733:        for (i = 0; i < MAX_BUSY_READ; i++) {
        !          1734:                tmp = READ_REG(REG_RPSC_MICRO_ACCESS_STATUS);
        !          1735:                if ((tmp & BIT_RPSC_BUSY) == 0x0) {
        !          1736:                        value = READ_REG(REG_RPSC_CHANNEL_INDIRECT_DATA_BUFFER);
        !          1737:                goto read_rpsc_done;
        !          1738:                }
        !          1739:        }
        !          1740:        log(LOG_INFO, "%s: Failed to read value to RPSC Reg=%02x.\n",
        !          1741:                                                card->devname, reg);
        !          1742: read_rpsc_done:
        !          1743:        /* Set PCCE bit to 1 in RPSC to enable modifing the RPSC register */
        !          1744:        WRITE_REG(REG_RPSC_CFG, BIT_RPSC_IND | BIT_RPSC_PCCE);
        !          1745:        return value;
        !          1746: }
        !          1747:
        !          1748:
        !          1749: /*
        !          1750:  * Description: Disable All channels for RX/TX
        !          1751:  * Arguments:  card - Pointer to the card structure.
        !          1752:  * Returns:    none
        !          1753:  */
        !          1754: static void DisableAllChannels(sdla_t* card)
        !          1755: {
        !          1756:        int i = 0;
        !          1757:
        !          1758:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          1759:                DisableTxChannel(card, E1_FRAMING_TIMESLOT);
        !          1760:                DisableRxChannel(card, E1_FRAMING_TIMESLOT);
        !          1761:                for (i = 1; i <= NUM_OF_E1_TIMESLOTS; i++) {
        !          1762:                        DisableTxChannel(card, i);
        !          1763:                        DisableRxChannel(card, i);
        !          1764:                }
        !          1765:        } else {
        !          1766:                for (i = 1; i <= NUM_OF_T1_CHANNELS; i++) {
        !          1767:                        DisableTxChannel(card, i);
        !          1768:                        DisableRxChannel(card, i);
        !          1769:                }
        !          1770:        }
        !          1771: }
        !          1772:
        !          1773: /*
        !          1774:  * Description: Enable All channels.
        !          1775:  * Arguments:  card - Pointer to the card structure.
        !          1776:  * Returns:    none
        !          1777:  */
        !          1778: static void EnableAllChannels(sdla_t* card)
        !          1779: {
        !          1780:        int i = 0;
        !          1781:
        !          1782:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          1783:                int first_ts =
        !          1784:                        (card->fe_te.te_cfg.frame == WAN_FR_UNFRAMED) ?
        !          1785:                                        0 : 1;
        !          1786:
        !          1787:                DisableTxChannel(card, E1_FRAMING_TIMESLOT);
        !          1788:                DisableRxChannel(card, E1_FRAMING_TIMESLOT);
        !          1789:                for (i = first_ts; i <= NUM_OF_E1_TIMESLOTS; i++) {
        !          1790:                        EnableTxChannel(card, i);
        !          1791:                        EnableRxChannel(card, i);
        !          1792:                }
        !          1793:        } else {
        !          1794:                for (i = 1; i <= NUM_OF_T1_CHANNELS; i++) {
        !          1795:                        EnableTxChannel(card, i);
        !          1796:                        EnableRxChannel(card, i);
        !          1797:                }
        !          1798:        }
        !          1799: }
        !          1800:
        !          1801: /*
        !          1802:  * Description: Enable Tx for specific channel
        !          1803:  * Arguments:  card    - pointer to the card structure
        !          1804:  *             channel - channel number
        !          1805:  * Returns:    0-success, otherwise-error
        !          1806:  */
        !          1807: static int EnableTxChannel(sdla_t* card, int channel)
        !          1808: {
        !          1809:        sdla_te_cfg_t*  te_cfg = &card->fe_te.te_cfg;
        !          1810:
        !          1811:        if (te_cfg->lcode == WAN_LC_AMI) {
        !          1812:                /* ZCs=1 AMI*/
        !          1813:                WRITE_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel,
        !          1814:                    (((READ_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel) &
        !          1815:                    MASK_TPSC_DATA_CTRL_BYTE) &
        !          1816:                    ~BIT_TPSC_DATA_CTRL_BYTE_IDLE_DS0) |
        !          1817:                    BIT_TPSC_DATA_CTRL_BYTE_ZCS1));
        !          1818:        } else {
        !          1819:                WRITE_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel,
        !          1820:                    ((READ_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel) &
        !          1821:                    MASK_TPSC_DATA_CTRL_BYTE) &
        !          1822:                    ~(BIT_TPSC_DATA_CTRL_BYTE_IDLE_DS0 |
        !          1823:                    BIT_TPSC_DATA_CTRL_BYTE_ZCS1 |
        !          1824:                    BIT_TPSC_DATA_CTRL_BYTE_ZCS0)));
        !          1825:        }
        !          1826:
        !          1827:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          1828:                /* Set SUBS=DS[0]=DS[1]=0x0 - no change to PCM timeslot data */
        !          1829:                WRITE_TPSC_REG(REG_TPSC_E1_CTRL_BYTE, channel,
        !          1830:                    (READ_TPSC_REG(REG_TPSC_E1_CTRL_BYTE, channel) &
        !          1831:                    ~(BIT_TPSC_E1_CTRL_BYTE_SUBS |
        !          1832:                    BIT_TPSC_E1_CTRL_BYTE_DS0 |
        !          1833:                    BIT_TPSC_E1_CTRL_BYTE_DS1)));
        !          1834:        } else {
        !          1835:                WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel, 0x00);
        !          1836:        }
        !          1837:
        !          1838:        /* Erase contents of IDLE code byte */
        !          1839:        WRITE_TPSC_REG(REG_TPSC_IDLE_CODE_BYTE, channel, 0x00);
        !          1840:
        !          1841:        return 0;
        !          1842: }
        !          1843: /*
        !          1844:  * Description: Enable Rx for specific channel
        !          1845:  * Arguments:  card    - pointer to the card structure
        !          1846:  *             channel - channel number
        !          1847:  * Returns:    0-success, otherwise-error
        !          1848:  */
        !          1849: static int EnableRxChannel(sdla_t* card, int channel)
        !          1850: {
        !          1851:        /* Set DTRPC bit to 0 in RPSC */
        !          1852:        WRITE_RPSC_REG(REG_RPSC_DATA_CTRL_BYTE, channel,
        !          1853:                ((READ_RPSC_REG(REG_RPSC_DATA_CTRL_BYTE, channel) &
        !          1854:                        MASK_RPSC_DATA_CTRL_BYTE) &
        !          1855:                                ~BIT_RPSC_DATA_CTRL_BYTE_DTRKC));
        !          1856:        return 0;
        !          1857: }
        !          1858:
        !          1859: /*
        !          1860:  * Description: Disable Tx for specific channel
        !          1861:  * Arguments:  card    - pointer to the card structure
        !          1862:  *             channel - channel number
        !          1863:  * Returns:    0-success, otherwise-error
        !          1864:  */
        !          1865: static int DisableTxChannel(sdla_t* card, int channel)
        !          1866: {
        !          1867:        /* Set IDLE_DS0 to 1 for an IDLE code byte will insert and
        !          1868:         * BTCLK will suppressed
        !          1869:         */
        !          1870:        WRITE_TPSC_REG(REG_RPSC_DATA_CTRL_BYTE, channel,
        !          1871:            ((READ_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel) &
        !          1872:            MASK_TPSC_DATA_CTRL_BYTE) | BIT_TPSC_DATA_CTRL_BYTE_IDLE_DS0));
        !          1873:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          1874:                /* Set SUBS=1, DS0=0 - data substitution on - IDLE code
        !          1875:                ** replaces BTPCM timeslot data */
        !          1876:                WRITE_TPSC_REG(REG_TPSC_E1_CTRL_BYTE, channel,
        !          1877:                    ((READ_TPSC_REG(REG_TPSC_E1_CTRL_BYTE, channel) &
        !          1878:                    ~BIT_TPSC_E1_CTRL_BYTE_DS0) | BIT_TPSC_E1_CTRL_BYTE_SUBS));
        !          1879:        } else {
        !          1880:                WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel, 0x00);
        !          1881:        }
        !          1882:        /* Erase contents of IDLE code byte */
        !          1883:        WRITE_TPSC_REG(REG_TPSC_IDLE_CODE_BYTE, channel, 0x55);
        !          1884:        return 0;
        !          1885: }
        !          1886:
        !          1887: /*
        !          1888:  * Description: Disable Rx for specific channel
        !          1889:  * Arguments:  card    - pointer to the card structure
        !          1890:  *             channel - channel number
        !          1891:  * Returns:    0-success, otherwise-error
        !          1892:  */
        !          1893: static int DisableRxChannel(sdla_t* card, int channel)
        !          1894: {
        !          1895:        /* Set DTRPC bit to 1 in RPSC to hold low for the duration of
        !          1896:        ** the channel */
        !          1897:        WRITE_RPSC_REG(REG_RPSC_DATA_CTRL_BYTE, channel,
        !          1898:            ((READ_RPSC_REG(REG_RPSC_DATA_CTRL_BYTE, channel) &
        !          1899:            MASK_RPSC_DATA_CTRL_BYTE) | BIT_RPSC_DATA_CTRL_BYTE_DTRKC));
        !          1900:        return 0;
        !          1901: }
        !          1902:
        !          1903: /*
        !          1904:  * Set default T1 configuration
        !          1905:  */
        !          1906: int
        !          1907: sdla_te_defcfg(void *pte_cfg)
        !          1908: {
        !          1909:        sdla_te_cfg_t   *te_cfg = (sdla_te_cfg_t*)pte_cfg;
        !          1910:
        !          1911:        te_cfg->media = WAN_MEDIA_T1;
        !          1912:        te_cfg->lcode = WAN_LC_B8ZS;
        !          1913:        te_cfg->frame = WAN_FR_ESF;
        !          1914:        te_cfg->lbo = WAN_T1_LBO_0_DB;
        !          1915:        te_cfg->te_clock = WAN_NORMAL_CLK;
        !          1916:        te_cfg->active_ch = ENABLE_ALL_CHANNELS;
        !          1917:        te_cfg->high_impedance_mode = WAN_NO;
        !          1918:        return 0;
        !          1919: }
        !          1920:
        !          1921:
        !          1922: int
        !          1923: sdla_te_setcfg(struct ifnet *ifp, struct ifmedia *ifm)
        !          1924: {
        !          1925:        struct ifreq             ifr;
        !          1926:        struct if_settings       ifs;
        !          1927:
        !          1928:        wanpipe_common_t        *common = (wanpipe_common_t *)ifp->if_softc;
        !          1929:        sdla_t                  *card = (sdla_t*)common->card;
        !          1930:        sdla_te_cfg_t           *te_cfg = (sdla_te_cfg_t*)&card->fe_te.te_cfg;
        !          1931:        int                      ret;
        !          1932:
        !          1933:        if (IFM_TYPE(ifm->ifm_media) != IFM_TDM)
        !          1934:                return (EINVAL);
        !          1935:
        !          1936:        bcopy(ifp->if_xname, ifr.ifr_name, sizeof(ifr.ifr_name));
        !          1937:        bzero(&ifs, sizeof(ifs));
        !          1938:        ifr.ifr_data = (caddr_t) &ifs;
        !          1939:
        !          1940:        if ((ifm->ifm_media & IFM_OMASK) == IFM_TDM_PPP)
        !          1941:               ifs.type = IF_PROTO_PPP;
        !          1942:        else if ((ifm->ifm_media & IFM_OMASK) == 0)
        !          1943:                ifs.type = IF_PROTO_CISCO;
        !          1944:        else {
        !          1945:                log(LOG_INFO, "%s: Unsupported ifmedia options\n",
        !          1946:                    card->devname);
        !          1947:                return (EINVAL);
        !          1948:        }
        !          1949:
        !          1950:        ret = wp_lite_set_proto(ifp, &ifr);
        !          1951:        if (ret != 0)
        !          1952:                return (ret);
        !          1953:
        !          1954:        switch (IFM_SUBTYPE(ifm->ifm_media)) {
        !          1955:        case IFM_TDM_T1:
        !          1956: #ifdef DEBUG_INIT
        !          1957:                log(LOG_INFO, "%s: Setting T1 media type!\n",
        !          1958:                                card->devname);
        !          1959: #endif /* DEBUG_INIT */
        !          1960:                te_cfg->media = WAN_MEDIA_T1;
        !          1961:                te_cfg->lcode = WAN_LC_B8ZS;
        !          1962:                te_cfg->frame = WAN_FR_ESF;
        !          1963:                break;
        !          1964:        case IFM_TDM_T1_AMI:
        !          1965: #ifdef DEBUG_INIT
        !          1966:                log(LOG_INFO, "%s: Setting T1 AMI media type!\n",
        !          1967:                                card->devname);
        !          1968: #endif /* DEBUG_INIT */
        !          1969:                te_cfg->media = WAN_MEDIA_T1;
        !          1970:                te_cfg->lcode = WAN_LC_AMI;
        !          1971:                te_cfg->frame = WAN_FR_ESF;
        !          1972:                break;
        !          1973:        case IFM_TDM_E1:
        !          1974: #ifdef DEBUG_INIT
        !          1975:                log(LOG_INFO, "%s: Setting E1 media type!\n",
        !          1976:                                card->devname);
        !          1977: #endif /* DEBUG_INIT */
        !          1978:                te_cfg->media = WAN_MEDIA_E1;
        !          1979:                te_cfg->lcode = WAN_LC_HDB3;
        !          1980:                te_cfg->frame = WAN_FR_NCRC4;
        !          1981:                break;
        !          1982:        case IFM_TDM_E1_AMI:
        !          1983: #ifdef DEBUG_INIT
        !          1984:                log(LOG_INFO, "%s: Setting E1 AMI media type!\n",
        !          1985:                                card->devname);
        !          1986: #endif /* DEBUG_INIT */
        !          1987:                te_cfg->media = WAN_MEDIA_E1;
        !          1988:                te_cfg->lcode = WAN_LC_AMI;
        !          1989:                te_cfg->frame = WAN_FR_NCRC4;
        !          1990:                break;
        !          1991:        default:
        !          1992:                log(LOG_INFO, "%s: Unsupported ifmedia type (%04X)\n",
        !          1993:                    card->devname, ifm->ifm_media);
        !          1994:                return (EINVAL);
        !          1995:        }
        !          1996:
        !          1997:        return (0);
        !          1998: }
        !          1999:
        !          2000: /*
        !          2001:  * Set timeslot map
        !          2002:  */
        !          2003: void
        !          2004: sdla_te_settimeslot(void* pcard, unsigned long ts_map)
        !          2005: {
        !          2006:        sdla_t  *card = (sdla_t*)pcard;
        !          2007:
        !          2008: #ifdef DEBUG_INIT
        !          2009:        log(LOG_INFO, "%s: Setting timeslot map to %08lX\n",
        !          2010:                        card->devname, ts_map);
        !          2011: #endif /* DEBUG_INIT */
        !          2012:        if (IS_T1(&card->fe_te.te_cfg)) {
        !          2013:                /* For T1, Shift timeslot map left by 1, because bit 0
        !          2014:                ** is not been used by T1 timeslot map (bit 1 is used for
        !          2015:                ** channel 1, bit 2 is used for channel 2 and so on). */
        !          2016:                ts_map = ts_map >> 1;
        !          2017:        }
        !          2018:        card->fe_te.te_cfg.active_ch = ts_map;
        !          2019:        return;
        !          2020: }
        !          2021:
        !          2022: unsigned long
        !          2023: sdla_te_gettimeslot(void* pcard)
        !          2024: {
        !          2025:        sdla_t          *card = (sdla_t*)pcard;
        !          2026:        unsigned long   ts_map = card->fe_te.te_cfg.active_ch;
        !          2027:
        !          2028:        if (IS_T1(&card->fe_te.te_cfg)) {
        !          2029:                /* See explaination before. */
        !          2030:                ts_map = ts_map << 1;
        !          2031:        }
        !          2032:        return ts_map;
        !          2033: }
        !          2034:
        !          2035: /*
        !          2036:  * Configure Sangoma TE1 board
        !          2037:  *
        !          2038:  * Arguments:
        !          2039:  * Returns:    0 - TE1 configred successfully, otherwise EINVAL.
        !          2040:  */
        !          2041: short
        !          2042: sdla_te_config(void* card_id)
        !          2043: {
        !          2044:        sdla_t          *card = (sdla_t*)card_id;
        !          2045:        sdla_te_cfg_t   *te_cfg = &card->fe_te.te_cfg;
        !          2046:        u_int16_t        adapter_type;
        !          2047:        unsigned char    value = 0x00, xlpg_scale = 0x00;
        !          2048:        int              channel_range = (IS_T1(&card->fe_te.te_cfg)) ?
        !          2049:                                NUM_OF_T1_CHANNELS : NUM_OF_E1_TIMESLOTS;
        !          2050:        int i = 0;
        !          2051:
        !          2052:        WAN_ASSERT(card == NULL);
        !          2053:        WAN_ASSERT(card->write_front_end_reg == NULL);
        !          2054:        WAN_ASSERT(card->read_front_end_reg == NULL);
        !          2055:        sdla_getcfg(card->hw, SDLA_ADAPTERTYPE, &adapter_type);
        !          2056:
        !          2057: #ifdef DEBUG_INIT
        !          2058:        log(LOG_INFO, "%s: Setting %s configuration!\n",
        !          2059:                        card->devname,
        !          2060:                        IS_T1(&card->fe_te.te_cfg) ? "T1" : "E1");
        !          2061:        if (IS_T1(&card->fe_te.te_cfg)) {
        !          2062:                log(LOG_DEBUG, "%s: Line decoding %s\n",
        !          2063:                        card->devname,
        !          2064:                        (te_cfg->lcode == WAN_LC_AMI) ? "AMI" : "B8ZS");
        !          2065:                log(LOG_DEBUG, "%s: Frame type %s\n",
        !          2066:                        card->devname,
        !          2067:                        (te_cfg->frame == WAN_FR_ESF) ? "ESF" :
        !          2068:                        (te_cfg->frame == WAN_FR_D4) ? "D4" : "Unframed");
        !          2069:                switch (te_cfg->lbo) {
        !          2070:                case WAN_T1_LBO_0_DB:
        !          2071:                        log(LOG_DEBUG, "%s: LBO 0 dB\n", card->devname);
        !          2072:                        break;
        !          2073:                case WAN_T1_LBO_75_DB:
        !          2074:                        log(LOG_DEBUG, "%s: LBO 7.5 dB\n", card->devname);
        !          2075:                        break;
        !          2076:                case WAN_T1_LBO_15_DB:
        !          2077:                        log(LOG_DEBUG, "%s: LBO 15 dB\n", card->devname);
        !          2078:                        break;
        !          2079:                case WAN_T1_LBO_225_DB:
        !          2080:                        log(LOG_DEBUG, "%s: LBO 22.5 dB\n", card->devname);
        !          2081:                        break;
        !          2082:                case WAN_T1_0_110:
        !          2083:                        log(LOG_DEBUG, "%s: LBO 0-110 ft.\n", card->devname);
        !          2084:                        break;
        !          2085:                case WAN_T1_110_220:
        !          2086:                        log(LOG_DEBUG, "%s: LBO 110-220 ft.\n", card->devname);
        !          2087:                        break;
        !          2088:                case WAN_T1_220_330:
        !          2089:                        log(LOG_DEBUG, "%s: LBO 220-330 ft.\n", card->devname);
        !          2090:                        break;
        !          2091:                case WAN_T1_330_440:
        !          2092:                        log(LOG_DEBUG, "%s: LBO 330-440 ft.\n", card->devname);
        !          2093:                        break;
        !          2094:                case WAN_T1_440_550:
        !          2095:                        log(LOG_DEBUG, "%s: LBO 440-550 ft.\n", card->devname);
        !          2096:                        break;
        !          2097:                case WAN_T1_550_660:
        !          2098:                        log(LOG_DEBUG, "%s: LBO 550-660 ft.\n",
        !          2099:                                        card->devname);
        !          2100:                        break;
        !          2101:                }
        !          2102:        } else {
        !          2103:                log(LOG_DEBUG, "%s: Line decoding %s\n", card->devname,
        !          2104:                    (te_cfg->lcode == WAN_LC_AMI) ? "AMI" : "HDB3");
        !          2105:                log(LOG_DEBUG, "%s: Frame type %s\n", card->devname,
        !          2106:                    (te_cfg->frame == WAN_FR_CRC4) ? "CRC4" :
        !          2107:                    (te_cfg->frame == WAN_FR_NCRC4) ? "non-CRC3" :
        !          2108:                    "Unframed");
        !          2109:        }
        !          2110:        log(LOG_DEBUG, "%s: Clock mode %s\n", card->devname,
        !          2111:            (te_cfg->te_clock == WAN_NORMAL_CLK) ? "Normal" : "Master");
        !          2112: #endif /* DEBUG_INIT */
        !          2113:
        !          2114:        /* 1. Initiate software reset of the COMET */
        !          2115:        /* Set RESET=1 to place COMET into RESET */
        !          2116:        WRITE_REG(REG_RESET, BIT_RESET);
        !          2117:
        !          2118:        /* Set RESET=0, disable software reset. COMET in default mode. */
        !          2119:        WRITE_REG(REG_RESET, 0x0/*~BIT_RESET*/);
        !          2120:
        !          2121:        /* 2.Setup the XLPG(Transmit pulse template) to clear the pulse
        !          2122:        ** template */
        !          2123:        ClearTemplate(card);
        !          2124:        xlpg_scale = InitTemplate(card);
        !          2125:
        !          2126:        /* Program PMC for T1/E1 mode (Reg 0x00) */
        !          2127:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          2128:                if (adapter_type & A101_ADPTR_T1E1_MASK) {
        !          2129:                        WRITE_REG(REG_GLOBAL_CFG,
        !          2130:                                        BIT_GLOBAL_TRKEN | BIT_GLOBAL_PIO_OE |
        !          2131:                                        BIT_GLOBAL_E1);
        !          2132:                } else {
        !          2133:                        WRITE_REG(REG_GLOBAL_CFG,
        !          2134:                                        BIT_GLOBAL_PIO_OE | BIT_GLOBAL_E1);
        !          2135:                }
        !          2136:        } else {
        !          2137:                if (adapter_type & A101_ADPTR_T1E1_MASK) {
        !          2138:                        WRITE_REG(REG_GLOBAL_CFG,
        !          2139:                                        BIT_GLOBAL_TRKEN | BIT_GLOBAL_PIO_OE);
        !          2140:                }
        !          2141:        }
        !          2142:
        !          2143:        /* Set SCALE[4-0] value in XLPG Line driver Configuration (Reg. 0xF0) */
        !          2144:        WRITE_REG(REG_XLPG_LINE_CFG, xlpg_scale);
        !          2145:
        !          2146:        /* Set system clock and XCLK (Reg 0xD6) */
        !          2147:        if (IS_T1(&card->fe_te.te_cfg)) {
        !          2148:                WRITE_REG(REG_CSU_CFG, BIT_CSU_MODE0);
        !          2149:                /*WRITE_REG(REG_CSU_CFG,
        !          2150:                **      BIT_CSU_MODE2 | BIT_CSU_MODE1 | BIT_CSU_MODE0); */
        !          2151:        } else {
        !          2152:                WRITE_REG(REG_CSU_CFG, 0x00);
        !          2153:        }
        !          2154:
        !          2155:        /* Set Line decoding (Reg. 0x10) */
        !          2156:        if (te_cfg->lcode == WAN_LC_AMI) {
        !          2157:                WRITE_REG(REG_CDRC_CFG, BIT_CDRC_CFG_AMI);
        !          2158:        } else {
        !          2159:                WRITE_REG(REG_CDRC_CFG, 0x00);
        !          2160:        }
        !          2161:
        !          2162:        /* Program the RX-ELST/TX-ELST for the appropriate mode
        !          2163:        ** (Reg 0x1C, 0x20)*/
        !          2164:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          2165:                WRITE_REG(REG_RX_ELST_CFG, BIT_RX_ELST_IR | BIT_RX_ELST_OR);
        !          2166:                WRITE_REG(REG_TX_ELST_CFG, BIT_TX_ELST_IR | BIT_RX_ELST_OR);
        !          2167:        } else {
        !          2168:                WRITE_REG(REG_RX_ELST_CFG, 0x00);
        !          2169:                WRITE_REG(REG_TX_ELST_CFG, 0x00);
        !          2170:        }
        !          2171:
        !          2172:        value = 0x00;
        !          2173:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          2174:                /* Program the trasmitter framing and line decoding
        !          2175:                ** (Reg. 0x80) */
        !          2176:                if (te_cfg->lcode == WAN_LC_AMI) {
        !          2177:                        value |= BIT_E1_TRAN_AMI;
        !          2178:                }
        !          2179:                if (te_cfg->frame == WAN_FR_CRC4) {
        !          2180:                        value |= BIT_E1_TRAN_GENCRC;
        !          2181:                } else if (te_cfg->frame == WAN_FR_UNFRAMED) {
        !          2182:                        value |= BIT_E1_TRAN_FDIS;
        !          2183:                }
        !          2184:                /* E1 TRAN Configuration (Reg 0x80) */
        !          2185:                WRITE_REG(REG_E1_TRAN_CFG, value);
        !          2186:                /* Configure the receive framer (Reg 0x90) */
        !          2187:                value = 0x00;
        !          2188:                if (te_cfg->frame == WAN_FR_CRC4) {
        !          2189:                        value |=
        !          2190:                                (BIT_E1_FRMR_CRCEN |
        !          2191:                                BIT_E1_FRMR_CASDIS |
        !          2192:                                BIT_E1_FRMR_REFCRCEN);
        !          2193:                } else if (te_cfg->frame == WAN_FR_NCRC4) {
        !          2194:                        value |= BIT_E1_FRMR_CASDIS;
        !          2195:                }
        !          2196:                WRITE_REG(REG_E1_FRMR_CFG, value);
        !          2197:        } else {
        !          2198:                /* Set framing format & line decoding for transmitter
        !          2199:                ** (Reg 0x54) */
        !          2200:                if (te_cfg->lcode == WAN_LC_B8ZS) {
        !          2201:                        value |= BIT_T1_XBAS_B8ZS;
        !          2202:                } else {
        !          2203:                        value |= BIT_T1_XBAS_ZCS0;
        !          2204:                }
        !          2205:                if (te_cfg->frame == WAN_FR_ESF) {
        !          2206:                        value |= BIT_T1_XBAS_ESF;
        !          2207:                }
        !          2208:                WRITE_REG(REG_T1_XBAS_CFG, value);
        !          2209:
        !          2210:                /* Program framing format for receiving (Reg. 0x48) */
        !          2211:                value = 0x00;
        !          2212:                if (te_cfg->frame == WAN_FR_ESF) {
        !          2213:                        value = BIT_T1_FRMR_ESF | BIT_T1_FRMR_ESFFA;
        !          2214:                }
        !          2215:                WRITE_REG(REG_T1_FRMR_CFG, value);
        !          2216:
        !          2217:                /* Program the transmitter framing format and line deconding
        !          2218:                ** (Reg. 0x60) */
        !          2219:                value = 0x00;
        !          2220:                if (te_cfg->frame == WAN_FR_ESF) {
        !          2221:                        value = BIT_T1_ALMI_CFG_ESF;
        !          2222:                }
        !          2223:                WRITE_REG(REG_T1_ALMI_CFG, value);
        !          2224:        }
        !          2225:
        !          2226:        /* Configure the SIGX configuration register */
        !          2227:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          2228:                WRITE_REG(REG_SIGX_CFG, 0x00);
        !          2229:        } else {
        !          2230:                value = READ_REG(REG_SIGX_CFG);
        !          2231:                if (te_cfg->frame == WAN_FR_ESF) {
        !          2232:                        value |= BIT_SIGX_ESF;
        !          2233:                }
        !          2234:                WRITE_REG(REG_SIGX_CFG, value);
        !          2235:        }
        !          2236:        /* Program the BTIF for the frame pulse mode */
        !          2237:        value = 0x00;
        !          2238:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          2239:                value |= BIT_BTIF_RATE0;
        !          2240:        }
        !          2241:        if (te_cfg->lcode == WAN_LC_AMI) {
        !          2242:                value |= BIT_BTIF_NXDS0_0;
        !          2243:        } else if (te_cfg->frame != WAN_FR_UNFRAMED) {
        !          2244:                value |= BIT_BTIF_NXDS0_1;
        !          2245:        }
        !          2246:
        !          2247:        if (adapter_type & A101_ADPTR_T1E1_MASK) {
        !          2248:                value |= (BIT_BTIF_CMODE | BIT_BTIF_DE | BIT_BTIF_FE);
        !          2249:        }
        !          2250:        WRITE_REG(REG_BTIF_CFG, value);
        !          2251:        /* Set the type of frame pulse on the backplane */
        !          2252:        value = 0x00;
        !          2253:
        !          2254:        if (adapter_type & A101_ADPTR_T1E1_MASK) {
        !          2255:                value = BIT_BTIF_FPMODE;
        !          2256:        }
        !          2257:        WRITE_REG(REG_BTIF_FR_PULSE_CFG, value);
        !          2258:
        !          2259:        /* Program the BRIF for the frame pulse mode */
        !          2260:        value = 0x00;
        !          2261:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          2262:                value |= BIT_BRIF_RATE0;
        !          2263:        }
        !          2264:        if (te_cfg->lcode == WAN_LC_AMI) {
        !          2265:                value |= BIT_BRIF_NXDS0_0;
        !          2266:        } else if (te_cfg->frame != WAN_FR_UNFRAMED) {
        !          2267:                value |= BIT_BRIF_NXDS0_1;
        !          2268:        }
        !          2269:        if (adapter_type & A101_ADPTR_T1E1_MASK) {
        !          2270:                value |= BIT_BRIF_CMODE;
        !          2271:        }
        !          2272:        WRITE_REG(REG_BRIF_CFG, value);
        !          2273:        /* Set the type of frame pulse on the backplane */
        !          2274:        value = 0x00;
        !          2275:
        !          2276:        if (adapter_type & A101_ADPTR_T1E1_MASK) {
        !          2277:                value = BIT_BRIF_FPMODE;
        !          2278:        }
        !          2279:        WRITE_REG(REG_BRIF_FR_PULSE_CFG, value);
        !          2280:        /* Program the data integraty checking on the BRIF */
        !          2281:        WRITE_REG(REG_BRIF_DATA_CFG, BIT_BRIF_DATA_TRI_0);
        !          2282:
        !          2283:        /* Set TJAT FIFO output clock signal (Reg 0x06) */
        !          2284:        if (te_cfg->te_clock == WAN_NORMAL_CLK) {
        !          2285:                WRITE_REG(REG_TX_TIMING_OPT, BIT_TX_PLLREF1 | BIT_TX_TXELSTBYP);
        !          2286:        } else {
        !          2287:                WRITE_REG(REG_TX_TIMING_OPT,
        !          2288:                        BIT_TX_PLLREF1 | BIT_TX_PLLREF0 | BIT_TX_TXELSTBYP);
        !          2289:        }
        !          2290:
        !          2291:        /* Set long or short and enable the equalizer (Reg 0xF8) */
        !          2292:        WRITE_REG(REG_RLPS_CFG_STATUS, BIT_RLPS_CFG_STATUS_LONGE);
        !          2293:
        !          2294:        /* Select ALOS Detection and Clearance Thresholds (Reg 0xF9) */
        !          2295:        /* NC: Aug 20 2003:
        !          2296:         *     Set the correct ALSO Detection/Clearance tresholds
        !          2297:         *     for T1/E1 lines, to get rid of false ALOS alarms.
        !          2298:         *
        !          2299:         *     Original incorrect value set was 0x00, for both T1/E1 */
        !          2300:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          2301:                WRITE_REG(REG_RLPS_ALOS_DET_CLR_THR,
        !          2302:                                BIT_RLPS_ALOS_DET_THR_2|
        !          2303:                                BIT_RLPS_ALOS_DET_THR_1|
        !          2304:                                BIT_RLPS_ALOS_DET_THR_0);
        !          2305:        } else {
        !          2306:                WRITE_REG(REG_RLPS_ALOS_DET_CLR_THR,
        !          2307:                                BIT_RLPS_ALOS_CLR_THR_2|
        !          2308:                                BIT_RLPS_ALOS_CLR_THR_0|
        !          2309:                                BIT_RLPS_ALOS_DET_THR_2|
        !          2310:                                BIT_RLPS_ALOS_DET_THR_0);
        !          2311:        }
        !          2312:
        !          2313:        /* Select ALOS Detection period to set the ALOS alarm (Reg 0xFA) */
        !          2314:        WRITE_REG(REG_RLPS_ALOS_DET_PER, REG_RLPS_ALOS_DET_PER_0);
        !          2315:        /* Select ALOS Clearance period to clear the ALOS alarm (Reg 0xFB) */
        !          2316:        WRITE_REG(REG_RLPS_ALOS_CLR_PER, BIT_RLPS_ALOS_CLR_PER_0);
        !          2317:        /* Program to 0x00 to initiate a microprocessor access to RAM
        !          2318:        ** (Reg 0xFC) */
        !          2319: /* ERRATA      WRITE_REG(REG_RLPS_EQ_ADDR, 0x00); */
        !          2320:        /* Write the value 0x80 to this register to select a write to the RAM
        !          2321:        ** (Reg 0xFD) */
        !          2322: /* ERRATA      WRITE_REG(REG_RLPS_EQ_RWB, BIT_RLPS_EQ_RWB); */
        !          2323:        /* Program this register to 0x00 to reset the pointer to the RAM
        !          2324:        ** (Reg 0xFE) */
        !          2325:        WRITE_REG(REG_RLPS_EQ_STATUS, 0x00);
        !          2326:        /* Configure the Recive line Equalizer (Reg 0xFF) */
        !          2327:        WRITE_REG(REG_RLPS_EQ_CFG,
        !          2328:                BIT_RLPS_EQ_RESERVED | BIT_RLPS_EQ_FREQ_1 | BIT_RLPS_EQ_FREQ_0);
        !          2329:
        !          2330:        /* Configure the TJAT FIFO (Reg 0x1B) */
        !          2331:        WRITE_REG(REG_TJAT_CFG, BIT_TJAT_CENT);
        !          2332:
        !          2333:        /* Configure the RJAT FIFO (Reg 0x17) */
        !          2334:        WRITE_REG(REG_RJAT_CFG, BIT_RJAT_CENT);
        !          2335:        /* Program Receive Options (Reg 0x02) */
        !          2336:        if (te_cfg->frame == WAN_FR_UNFRAMED) {
        !          2337:                WRITE_REG(REG_RECEIVE_OPT, BIT_RECEIVE_OPT_UNF);
        !          2338:        } else {
        !          2339:                WRITE_REG(REG_RECEIVE_OPT, 0x00);
        !          2340:        }
        !          2341:
        !          2342:        /* Configure XLPG Analog Test Positive control (Reg 0xF4) */
        !          2343:        WRITE_REG(REG_XLPG_TPC, BIT_XLPG_TPC_0);
        !          2344:        /* Configure XLPG Analog Test Negative control (Reg 0xF5) */
        !          2345:        WRITE_REG(REG_XLPG_TNC, BIT_XLPG_TNC_0);
        !          2346:
        !          2347:        /* Program the RLPS Equalizer Voltage (Reg 0xDC) */
        !          2348:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          2349:                WRITE_REG(REG_EQ_VREF, 0x34);
        !          2350:        } else {
        !          2351:                WRITE_REG(REG_EQ_VREF, 0x2C);
        !          2352:        }
        !          2353:        WRITE_REG(REG_RLPS_FUSE_CTRL_STAT, 0x00);
        !          2354:
        !          2355: /* ERRATA WRITE_REG(REG_RLPS_FUSE_CTRL_STAT, 0x00);*/
        !          2356: /* ERRAT VVV */
        !          2357:        WRITE_REG(0xF4, 0x01);
        !          2358:        WRITE_REG(0xF4, 0x01);
        !          2359:        value = READ_REG(0xF4) & 0xFE;
        !          2360:        WRITE_REG(0xF4, value);
        !          2361:
        !          2362:        WRITE_REG(0xF5, 0x01);
        !          2363:        WRITE_REG(0xF5, 0x01);
        !          2364:        value = READ_REG(0xF5) & 0xFE;
        !          2365:        WRITE_REG(0xF5, value);
        !          2366:
        !          2367:        WRITE_REG(0xF6, 0x01);
        !          2368: /* ERRATA ^^^ */
        !          2369:
        !          2370:        InitLineReceiver(card);
        !          2371:
        !          2372:        ClearRPSCReg(card);
        !          2373:        ClearTPSCReg(card);
        !          2374:
        !          2375:
        !          2376:        DisableAllChannels(card);
        !          2377:        if (te_cfg->active_ch == ENABLE_ALL_CHANNELS) {
        !          2378: #ifdef DEBUG_INIT
        !          2379:                log(LOG_DEBUG, "%s: All channels enabled\n", card->devname);
        !          2380: #endif /* DEBUG_INIT */
        !          2381:                EnableAllChannels(card);
        !          2382:        } else {
        !          2383:                for (i = 1; i <= channel_range; i++) {
        !          2384:                        if (te_cfg->active_ch & (1 << (i-1))) {
        !          2385: #ifdef DEBUG_INIT
        !          2386:                                log(LOG_DEBUG, "%s: Enable channel %d\n",
        !          2387:                                                card->devname, i);
        !          2388: #endif /* DEBUG_INIT */
        !          2389:                                EnableTxChannel(card, i);
        !          2390:                                EnableRxChannel(card, i);
        !          2391:                        }
        !          2392:                }
        !          2393:        }
        !          2394:
        !          2395:        /* Initialize and start T1/E1 timer */
        !          2396:        card->fe_te.te_timer_cmd = TE_SET_INTR;
        !          2397:        bit_clear((u_int8_t*)&card->fe_te.te_critical,TE_TIMER_KILL);
        !          2398:        timeout_set(&card->fe_te.te_timer, sdla_te_timer, (void*)card);
        !          2399:        sdla_te_enable_timer(card, INTR_TE1_TIMER);
        !          2400:
        !          2401:        bit_set((u_int8_t*)&card->fe_te.te_critical, TE_CONFIGURED);
        !          2402:
        !          2403:        return 0;
        !          2404: }
        !          2405:
        !          2406: /*
        !          2407:  * Enable T1/E1 interrupts.
        !          2408:  */
        !          2409: static void
        !          2410: sdla_te_set_intr(sdla_t* card)
        !          2411: {
        !          2412:
        !          2413:        /* Enable LOS interrupt */
        !          2414:        /* WRITE_REG(REG_CDRC_INT_EN, BIT_CDRC_INT_EN_LOSE);*/
        !          2415:        /* Enable ALOS interrupt */
        !          2416:        WRITE_REG(REG_RLPS_CFG_STATUS,
        !          2417:                READ_REG(REG_RLPS_CFG_STATUS) | BIT_RLPS_CFG_STATUS_ALOSE);
        !          2418:        if (IS_T1(&card->fe_te.te_cfg)) {
        !          2419:                /* Enable RBOC interrupt */
        !          2420:                WRITE_REG(REG_T1_RBOC_ENABLE,
        !          2421:                                BIT_T1_RBOC_ENABLE_IDLE |
        !          2422:                                BIT_T1_RBOC_ENABLE_BOCE);
        !          2423:                /* Enable interrupt on RED, AIS, YEL alarms */
        !          2424:                WRITE_REG(REG_T1_ALMI_INT_EN,
        !          2425:                                BIT_T1_ALMI_INT_EN_REDE |
        !          2426:                                BIT_T1_ALMI_INT_EN_AISE |
        !          2427:                                BIT_T1_ALMI_INT_EN_YELE);
        !          2428:                /* Enable interrupt on OOF alarm */
        !          2429:                /*WRITE_REG(REG_T1_FRMR_INT_EN, BIT_T1_FRMR_INT_EN_INFRE);*/
        !          2430:        } else {
        !          2431:                /* Enable interrupt on RED, AIS alarms */
        !          2432:                WRITE_REG(REG_E1_FRMR_M_A_INT_EN,
        !          2433:                                BIT_E1_FRMR_M_A_INT_EN_REDE |
        !          2434:                                BIT_E1_FRMR_M_A_INT_EN_AISE);
        !          2435:                /* Enable OOF Interrupt */
        !          2436:                /*WRITE_REG(REG_E1_FRMR_FRM_STAT_INT_EN,
        !          2437:                                BIT_E1_FRMR_FRM_STAT_INT_EN_OOFE);*/
        !          2438:        }
        !          2439:
        !          2440: #if 0
        !          2441:        if (card->te_signaling_config == NULL) {
        !          2442:                /* Enable SIGE and COSS */
        !          2443:                /* log(LOG_INFO,"%s: Enable SIGX interrupt\n",card->devname);*/
        !          2444:                WRITE_REG(REG_SIGX_CFG,
        !          2445:                        READ_REG(REG_SIGX_CFG) | BIT_SIGX_SIGE);
        !          2446:                WRITE_REG(REG_SIGX_CFG,
        !          2447:                        READ_REG(REG_SIGX_CFG) | BIT_SIGX_COSS);
        !          2448:        }
        !          2449: #endif
        !          2450:        /* Initialize T1/E1 timer */
        !          2451:        bit_clear((u_int8_t*)&card->fe_te.te_critical,TE_TIMER_KILL);
        !          2452:        /* Start T1/E1 timer */
        !          2453:        card->fe_te.te_timer_cmd = TE_LINKDOWN_TIMER;
        !          2454:        sdla_te_enable_timer(card, POLLING_TE1_TIMER);
        !          2455:        return;
        !          2456: }
        !          2457:
        !          2458: /*
        !          2459:  * T1/E1 unconfig.
        !          2460:  */
        !          2461: void sdla_te_unconfig(void* card_id)
        !          2462: {
        !          2463:        sdla_t* card = (sdla_t*)card_id;
        !          2464:
        !          2465:        if (!bit_test((u_int8_t*)&card->fe_te.te_critical, TE_CONFIGURED)) {
        !          2466:                return;
        !          2467:        }
        !          2468:
        !          2469:        bit_clear((u_int8_t*)&card->fe_te.te_critical, TE_CONFIGURED);
        !          2470:        bit_set((u_int8_t*)&card->fe_te.te_critical, TE_TIMER_KILL);
        !          2471:
        !          2472:        timeout_del(&card->fe_te.te_timer);
        !          2473:        return;
        !          2474: }
        !          2475:
        !          2476: /*
        !          2477:  * Set T1/E1 status. Enable OOF and LCV interrupt
        !          2478:  * if status changed to disconnected.
        !          2479:  */
        !          2480: static void
        !          2481: sdla_te_set_status(sdla_t *card, unsigned long alarms)
        !          2482: {
        !          2483:
        !          2484:        if (IS_T1(&card->fe_te.te_cfg)) {
        !          2485:                if (IS_T1_ALARM(alarms)) {
        !          2486:                        if (card->front_end_status != FE_DISCONNECTED) {
        !          2487:                                log(LOG_INFO, "%s: T1 disconnected!\n",
        !          2488:                                    card->devname);
        !          2489:                                card->front_end_status = FE_DISCONNECTED;
        !          2490:                        }
        !          2491:                } else {
        !          2492:                        if (card->front_end_status != FE_CONNECTED) {
        !          2493:                                log(LOG_INFO, "%s: T1 connected!\n",
        !          2494:                                    card->devname);
        !          2495:                                card->front_end_status = FE_CONNECTED;
        !          2496:                        }
        !          2497:                }
        !          2498:        } else {
        !          2499:                if (IS_E1_ALARM(alarms)) {
        !          2500:                        if (!bit_test((u_int8_t*)&card->fe_te.te_critical,
        !          2501:                            TE_TIMER_RUNNING)) {
        !          2502:                                card->fe_te.te_timer_cmd = TE_LINKDOWN_TIMER;
        !          2503:                                sdla_te_enable_timer(card, POLLING_TE1_TIMER);
        !          2504:                        }
        !          2505:                        if (card->front_end_status != FE_DISCONNECTED) {
        !          2506:                                log(LOG_INFO, "%s: E1 disconnected!\n",
        !          2507:                                    card->devname);
        !          2508:                                card->front_end_status = FE_DISCONNECTED;
        !          2509:                        }
        !          2510:                } else {
        !          2511:                        if (card->front_end_status != FE_CONNECTED) {
        !          2512:                                log(LOG_INFO, "%s: E1 connected!\n",
        !          2513:                                                        card->devname);
        !          2514:                                card->front_end_status = FE_CONNECTED;
        !          2515:                        }
        !          2516:                }
        !          2517:        }
        !          2518: #if 0
        !          2519:        if (card->te_report_alarms) {
        !          2520:                card->te_report_alarms(card, alarms);
        !          2521:        }
        !          2522: #endif
        !          2523:
        !          2524: #if 0
        !          2525:        if (card->front_end_status == FE_CONNECTED) {
        !          2526:                WRITE_REG(REG_CDRC_INT_EN,
        !          2527:                        (READ_REG(REG_CDRC_INT_EN) | BIT_CDRC_INT_EN_LOSE));
        !          2528:        } else {
        !          2529:                WRITE_REG(REG_CDRC_INT_EN,
        !          2530:                        (READ_REG(REG_CDRC_INT_EN) & ~BIT_CDRC_INT_EN_LOSE));
        !          2531:        }
        !          2532: #endif
        !          2533:
        !          2534:        return;
        !          2535: }
        !          2536:
        !          2537: /*
        !          2538:  * Read Alram Status for T1/E1 modes.
        !          2539:  *
        !          2540:  * Arguments:
        !          2541:  * Returns:            bit 0 - ALOS    (E1/T1)
        !          2542:  *                     bit 1 - LOS     (E1/T1)
        !          2543:  *                     bit 2 - ALTLOS  (E1/T1)
        !          2544:  *                     bit 3 - OOF     (E1/T1)
        !          2545:  *                     bit 4 - RED     (E1/T1)
        !          2546:  *                     bit 5 - AIS     (E1/T1)
        !          2547:  *                     bit 6 - OOSMF   (E1)
        !          2548:  *                     bit 7 - OOCMF   (E1)
        !          2549:  *                     bit 8 - OOOF    (E1)
        !          2550:  *                     bit 9 - RAI     (E1)
        !          2551:  *                     bit A - YEL     (T1)
        !          2552:  */
        !          2553: unsigned long
        !          2554: sdla_te_alarm(void *card_id, int manual_update)
        !          2555: {
        !          2556:        sdla_t *card = (sdla_t*)card_id;
        !          2557:        unsigned long status = 0x00;
        !          2558:
        !          2559:        WAN_ASSERT(card->write_front_end_reg == NULL);
        !          2560:        WAN_ASSERT(card->read_front_end_reg == NULL);
        !          2561:        /* Check common alarm for E1 and T1 configuration
        !          2562:         * 1. ALOS alarm
        !          2563:         * Reg 0xFA
        !          2564:         * Reg 0xF8 (ALOSI = 1)
        !          2565:         */
        !          2566:        if (READ_REG(REG_RLPS_ALOS_DET_PER) &&
        !          2567:            (READ_REG(REG_RLPS_CFG_STATUS) & BIT_RLPS_CFG_STATUS_ALOSV)) {
        !          2568:                status |= BIT_ALOS_ALARM;
        !          2569:        }
        !          2570:
        !          2571:        /* 2. LOS alarm
        !          2572:         * Reg 0x10
        !          2573:         * Reg 0xF8 (ALOSI = 1)
        !          2574:         */
        !          2575:        if ((READ_REG(REG_CDRC_CFG) & (BIT_CDRC_CFG_LOS0|BIT_CDRC_CFG_LOS1)) &&
        !          2576:                (READ_REG(REG_CDRC_INT_STATUS) & BIT_CDRC_INT_STATUS_LOSV)) {
        !          2577:                status |= BIT_LOS_ALARM;
        !          2578:        }
        !          2579:
        !          2580:        /* 3. ALTLOS alarm ??????????????????
        !          2581:         * Reg 0x13
        !          2582:         */
        !          2583:        if (READ_REG(REG_ALTLOS_STATUS) & BIT_ALTLOS_STATUS_ALTLOS) {
        !          2584:                status |= BIT_ALTLOS_ALARM;
        !          2585:        }
        !          2586:
        !          2587:        /* Check specific E1 and T1 alarms */
        !          2588:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          2589:                /* 4. OOF alarm */
        !          2590:                if (READ_REG(REG_E1_FRMR_FR_STATUS) &
        !          2591:                    BIT_E1_FRMR_FR_STATUS_OOFV) {
        !          2592:                        status |= BIT_OOF_ALARM;
        !          2593:                }
        !          2594:                /* 5. OOSMF alarm */
        !          2595:                if (READ_REG(REG_E1_FRMR_FR_STATUS) &
        !          2596:                    BIT_E1_FRMR_FR_STATUS_OOSMFV) {
        !          2597:                        status |= BIT_OOSMF_ALARM;
        !          2598:                }
        !          2599:                /* 6. OOCMF alarm */
        !          2600:                if (READ_REG(REG_E1_FRMR_FR_STATUS) &
        !          2601:                    BIT_E1_FRMR_FR_STATUS_OOCMFV) {
        !          2602:                        status |= BIT_OOCMF_ALARM;
        !          2603:                }
        !          2604:                /* 7. OOOF alarm */
        !          2605:                if (READ_REG(REG_E1_FRMR_FR_STATUS) &
        !          2606:                    BIT_E1_FRMR_FR_STATUS_OOOFV) {
        !          2607:                        status |= BIT_OOOF_ALARM;
        !          2608:                }
        !          2609:                /* 8. RAI alarm */
        !          2610:                if (READ_REG(REG_E1_FRMR_MAINT_STATUS) &
        !          2611:                    BIT_E1_FRMR_MAINT_STATUS_RAIV) {
        !          2612:                        status |= BIT_RAI_ALARM;
        !          2613:                }
        !          2614:                /* 9. RED alarm
        !          2615:                 * Reg 0x97 (REDD)
        !          2616:                 */
        !          2617:                if (READ_REG(REG_E1_FRMR_MAINT_STATUS) &
        !          2618:                     BIT_E1_FRMR_MAINT_STATUS_RED) {
        !          2619:                        status |= BIT_RED_ALARM;
        !          2620:                }
        !          2621:                /* 10. AIS alarm
        !          2622:                 * Reg 0x91 (AISC)
        !          2623:                 * Reg 0x97 (AIS)
        !          2624:                 */
        !          2625:                if ((READ_REG(REG_E1_FRMR_MAINT_OPT) &
        !          2626:                    BIT_E1_FRMR_MAINT_OPT_AISC) &&
        !          2627:                    (READ_REG(REG_E1_FRMR_MAINT_STATUS) &
        !          2628:                    BIT_E1_FRMR_MAINT_STATUS_AIS)) {
        !          2629:                        status |= BIT_AIS_ALARM;
        !          2630:                }
        !          2631:        } else {
        !          2632:                /* 4. OOF alarm
        !          2633:                 * Reg 0x4A (INFR=0 T1 mode)
        !          2634:                 */
        !          2635:                if (!(READ_REG(REG_T1_FRMR_INT_STATUS) &
        !          2636:                    BIT_T1_FRMR_INT_STATUS_INFR)) {
        !          2637:                        status |= BIT_OOF_ALARM;
        !          2638:                }
        !          2639:                /* 5. AIS alarm
        !          2640:                 * Reg 0x62 (AIS)
        !          2641:                 * Reg 0x63 (AISD)
        !          2642:                 */
        !          2643:                if ((READ_REG(REG_T1_ALMI_INT_STATUS) &
        !          2644:                    BIT_T1_ALMI_INT_STATUS_AIS) &&
        !          2645:                    (READ_REG(REG_T1_ALMI_DET_STATUS) &
        !          2646:                    BIT_T1_ALMI_DET_STATUS_AISD)) {
        !          2647:                        status |= BIT_AIS_ALARM;
        !          2648:                }
        !          2649:                /* 6. RED alarm
        !          2650:                 * Reg 0x63 (REDD)
        !          2651:                 */
        !          2652:                if (READ_REG(REG_T1_ALMI_DET_STATUS) &
        !          2653:                    BIT_T1_ALMI_DET_STATUS_REDD) {
        !          2654:                        status |= BIT_RED_ALARM;
        !          2655:                }
        !          2656:                /* 7. YEL alarm
        !          2657:                 * Reg 0x62 (YEL)
        !          2658:                 * Reg 0x63 (YELD)
        !          2659:                 */
        !          2660:                if ((READ_REG(REG_T1_ALMI_INT_STATUS) &
        !          2661:                    BIT_T1_ALMI_INT_STATUS_YEL) &&
        !          2662:                    (READ_REG(REG_T1_ALMI_DET_STATUS) &
        !          2663:                    BIT_T1_ALMI_DET_STATUS_YELD)) {
        !          2664:                        status |= BIT_YEL_ALARM;
        !          2665:                }
        !          2666:        }
        !          2667:        if (manual_update) {
        !          2668:                sdla_te_set_status(card, status);
        !          2669:        }
        !          2670:        return status;
        !          2671: }
        !          2672:
        !          2673:
        !          2674: /*
        !          2675:  * Read PMC performance monitoring counters
        !          2676:  */
        !          2677: void
        !          2678: sdla_te_pmon(void *card_id)
        !          2679: {
        !          2680:        sdla_t *card = (sdla_t*)card_id;
        !          2681:        pmc_pmon_t *pmon = &card->fe_te.te_pmon;
        !          2682:
        !          2683:        WAN_ASSERT1(card->write_front_end_reg == NULL);
        !          2684:        WAN_ASSERT1(card->read_front_end_reg == NULL);
        !          2685:        /* Update PMON counters */
        !          2686:        WRITE_REG(REG_PMON_BIT_ERROR, 0x00);
        !          2687:        /* Framing bit for E1/T1 */
        !          2688:        pmon->frm_bit_error +=
        !          2689:            READ_REG(REG_PMON_BIT_ERROR) & BITS_PMON_BIT_ERROR;
        !          2690:
        !          2691:        /* OOF Error for T1 or Far End Block Error for E1 */
        !          2692:        pmon->oof_errors +=
        !          2693:            ((READ_REG(REG_PMON_OOF_FEB_MSB_ERROR) &
        !          2694:            BITS_PMON_OOF_FEB_MSB_ERROR) << 8) |
        !          2695:            READ_REG(REG_PMON_OOF_FEB_LSB_ERROR);
        !          2696:
        !          2697:        /* Bit Error for T1 or CRC Error for E1 */
        !          2698:        pmon->bit_errors +=
        !          2699:            ((READ_REG(REG_PMON_BIT_CRC_MSB_ERROR) &
        !          2700:            BITS_PMON_BIT_CRC_MSB_ERROR) << 8) |
        !          2701:            READ_REG(REG_PMON_BIT_CRC_LSB_ERROR);
        !          2702:
        !          2703:        /* LCV Error for E1/T1 */
        !          2704:        pmon->lcv += ((READ_REG(REG_PMON_LCV_MSB_COUNT) &
        !          2705:            BITS_PMON_LCV_MSB_COUNT) << 8) | READ_REG(REG_PMON_LCV_LSB_COUNT);
        !          2706:        return;
        !          2707: }
        !          2708:
        !          2709: /*
        !          2710:  * Flush PMC performance monitoring counters
        !          2711:  */
        !          2712: void
        !          2713: sdla_flush_te1_pmon(void *card_id)
        !          2714: {
        !          2715:        sdla_t *card = (sdla_t*)card_id;
        !          2716:        pmc_pmon_t *pmon = &card->fe_te.te_pmon;
        !          2717:
        !          2718:        pmon->pmon1 = 0;
        !          2719:        pmon->pmon2 = 0;
        !          2720:        pmon->pmon3 = 0;
        !          2721:        pmon->pmon4 = 0;
        !          2722:
        !          2723:        return;
        !          2724: }
        !          2725:
        !          2726: static int
        !          2727: SetLoopBackChannel(sdla_t *card, int channel, unsigned char mode)
        !          2728: {
        !          2729:        /* Set IND bit to 1 in TPSC to enable indirect access to TPSC
        !          2730:        ** register */
        !          2731:        WRITE_REG(REG_TPSC_CFG, BIT_TPSC_IND);
        !          2732:
        !          2733:        /* Set LOOP to 1 for an IDLE code byte (the transmit data is
        !          2734:         * overwritten with the corresponding channel data from the receive
        !          2735:         * line. */
        !          2736:        if (mode == LINELB_ACTIVATE_CODE) {
        !          2737:                WRITE_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel,
        !          2738:                        ((READ_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel) &
        !          2739:                                MASK_TPSC_DATA_CTRL_BYTE) |
        !          2740:                                BIT_TPSC_DATA_CTRL_BYTE_LOOP));
        !          2741:        } else {
        !          2742:                WRITE_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel,
        !          2743:                        ((READ_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel) &
        !          2744:                                MASK_TPSC_DATA_CTRL_BYTE) &
        !          2745:                                ~BIT_TPSC_DATA_CTRL_BYTE_LOOP));
        !          2746:        }
        !          2747:
        !          2748:        /* Set PCCE bit to 1 in TPSC to enable modifing the TPSC register */
        !          2749:        WRITE_REG(REG_TPSC_CFG,
        !          2750:                ((READ_REG(REG_TPSC_CFG) & MASK_TPSC_CFG) | BIT_TPSC_PCCE));
        !          2751:
        !          2752:        return 0;
        !          2753: }
        !          2754:
        !          2755: /*
        !          2756:  * Check interrupt type.
        !          2757:  * Arguments:  card - pointer to device structure.
        !          2758:  * Returns:    None.
        !          2759:  */
        !          2760: void
        !          2761: sdla_te_intr(void *arg)
        !          2762: {
        !          2763:        sdla_t *card = (sdla_t*)arg;
        !          2764:
        !          2765:        WAN_ASSERT1(card->write_front_end_reg == NULL);
        !          2766:        WAN_ASSERT1(card->read_front_end_reg == NULL);
        !          2767:        sdla_te_tx_intr(card);
        !          2768:        sdla_te_rx_intr(card);
        !          2769:        sdla_te_set_status(card, card->fe_te.te_alarm);
        !          2770: }
        !          2771:
        !          2772: /*
        !          2773:  * Read tx interrupt.
        !          2774:  *
        !          2775:  * Arguments: card             - pointer to device structure.
        !          2776:  * Returns: None.
        !          2777:  */
        !          2778: static void
        !          2779: sdla_te_tx_intr(sdla_t *card)
        !          2780: {
        !          2781:        unsigned char intr_src1 = 0x00, intr_src2 = 0x00, intr_src3 = 0x00;
        !          2782:
        !          2783:        intr_src1 = READ_REG(REG_INT_SRC_1);
        !          2784:        intr_src2 = READ_REG(REG_INT_SRC_2);
        !          2785:        intr_src3 = READ_REG(REG_INT_SRC_3);
        !          2786:
        !          2787:        if (intr_src1 == 0 && intr_src2 == 0 && intr_src3 == 0) {
        !          2788:                log(LOG_DEBUG, "%s: Unknown %s interrupt!\n",
        !          2789:                                card->devname,
        !          2790:                                IS_T1(&card->fe_te.te_cfg) ? "T1" : "E1");
        !          2791:        }
        !          2792:        if (!(intr_src1 & BITS_TX_INT_SRC_1 ||
        !          2793:                intr_src2 & BITS_TX_INT_SRC_2 ||
        !          2794:                intr_src3 & BITS_TX_INT_SRC_3)) {
        !          2795:                return;
        !          2796:        }
        !          2797:
        !          2798: #if 0
        !          2799:        if (intr_src1 & BIT_INT_SRC_1_TJAT) {
        !          2800:        }
        !          2801:        if (intr_src1 & BIT_INT_SRC_1_APRM) {
        !          2802:        }
        !          2803:        if (intr_src2 & BIT_INT_SRC_2_TX_ELST) {
        !          2804:        }
        !          2805:        if (intr_src2 & BIT_INT_SRC_2_TDPR_1) {
        !          2806:        }
        !          2807:        if (intr_src2 & BIT_INT_SRC_2_TDPR_2) {
        !          2808:        }
        !          2809:        if (intr_src2 & BIT_INT_SRC_2_TDPR_3) {
        !          2810:        }
        !          2811:        if (intr_src3 & BIT_INT_SRC_3_TRAN) {
        !          2812:        }
        !          2813:        if (intr_src3 & BIT_INT_SRC_3_XPDE) {
        !          2814:        }
        !          2815:        if (intr_src3 & BIT_INT_SRC_3_BTIF) {
        !          2816:        }
        !          2817: #endif
        !          2818:        return;
        !          2819: }
        !          2820:
        !          2821:
        !          2822: /*
        !          2823:  * Read rx interrupt.
        !          2824:  *
        !          2825:  * Arguments: card             - pointer to device structure.
        !          2826:  * Returns: None.
        !          2827:  */
        !          2828: static void
        !          2829: sdla_te_rx_intr(sdla_t *card)
        !          2830: {
        !          2831:        if (IS_T1(&card->fe_te.te_cfg)) {
        !          2832:                sdla_t1_rx_intr(card);
        !          2833:        } else {
        !          2834:                sdla_e1_rx_intr(card);
        !          2835:        }
        !          2836:        return;
        !          2837: }
        !          2838:
        !          2839: /*
        !          2840:  * Read tx interrupt.
        !          2841:  *
        !          2842:  * Arguments: card             - pointer to device structure.
        !          2843:  * Returns: None.
        !          2844:  */
        !          2845: static void
        !          2846: sdla_t1_rx_intr(sdla_t *card)
        !          2847: {
        !          2848:        unsigned char intr_src1 = 0x00, intr_src2 = 0x00, intr_src3 = 0x00;
        !          2849:        unsigned char status = 0x00;
        !          2850:
        !          2851:        intr_src1 = READ_REG(REG_INT_SRC_1);
        !          2852:        intr_src2 = READ_REG(REG_INT_SRC_2);
        !          2853:        intr_src3 = READ_REG(REG_INT_SRC_3);
        !          2854:
        !          2855:        if (!(intr_src1 & BITS_RX_INT_SRC_1 ||
        !          2856:                intr_src2 & BITS_RX_INT_SRC_2 ||
        !          2857:                intr_src3 & BITS_RX_INT_SRC_3)) {
        !          2858:                return;
        !          2859:        }
        !          2860:
        !          2861:        /* 3. PDVD */
        !          2862:        if (intr_src3 & BIT_INT_SRC_3_PDVD) {
        !          2863:                status = READ_REG(REG_PDVD_INT_EN_STATUS);
        !          2864:                if ((status & BIT_PDVD_INT_EN_STATUS_PDVE) &&
        !          2865:                    (status & BIT_PDVD_INT_EN_STATUS_PDVI)) {
        !          2866:                        if (status & BIT_PDVD_INT_EN_STATUS_PDV) {
        !          2867:                                log(LOG_INFO, "%s: T1 pulse density "
        !          2868:                                    "violation detected!\n", card->devname);
        !          2869:                        }
        !          2870:                }
        !          2871:                if ((status & BIT_PDVD_INT_EN_STATUS_Z16DE) &&
        !          2872:                    (status & BIT_PDVD_INT_EN_STATUS_Z16DI)) {
        !          2873:                        log(LOG_INFO, "%s: T1 16 consecutive zeros detected!\n",
        !          2874:                            card->devname);
        !          2875:                }
        !          2876:        }
        !          2877:
        !          2878:        /* 6. ALMI */
        !          2879:        if (intr_src3 & BIT_INT_SRC_3_ALMI) {
        !          2880:                status = READ_REG(REG_T1_ALMI_INT_STATUS);
        !          2881:                if (status & BIT_T1_ALMI_INT_STATUS_YELI) {
        !          2882:                        if (status & BIT_T1_ALMI_INT_STATUS_YEL) {
        !          2883:                                if (!(card->fe_te.te_alarm & BIT_YEL_ALARM)) {
        !          2884:                                        log(LOG_INFO, "%s: T1 YELLOW ON\n",
        !          2885:                                            card->devname);
        !          2886:                                        card->fe_te.te_alarm |= BIT_YEL_ALARM;
        !          2887:                                }
        !          2888:                        } else {
        !          2889:                                if (card->fe_te.te_alarm & BIT_YEL_ALARM) {
        !          2890:                                        log(LOG_INFO, "%s: T1 YELLOW OFF\n",
        !          2891:                                            card->devname);
        !          2892:                                        card->fe_te.te_alarm &= ~BIT_YEL_ALARM;
        !          2893:                                }
        !          2894:                        }
        !          2895:                }
        !          2896:                if (status & BIT_T1_ALMI_INT_STATUS_REDI) {
        !          2897:                        if (status & BIT_T1_ALMI_INT_STATUS_RED) {
        !          2898:                                if (!(card->fe_te.te_alarm & BIT_RED_ALARM)) {
        !          2899:                                        log(LOG_INFO, "%s: T1 RED ON\n",
        !          2900:                                            card->devname);
        !          2901:                                        card->fe_te.te_alarm |= BIT_RED_ALARM;
        !          2902:                                }
        !          2903:                        } else {
        !          2904:                                if (card->fe_te.te_alarm & BIT_RED_ALARM) {
        !          2905:                                        log(LOG_INFO, "%s: T1 RED OFF\n",
        !          2906:                                            card->devname);
        !          2907:                                        card->fe_te.te_alarm &= ~BIT_RED_ALARM;
        !          2908:                                }
        !          2909:                        }
        !          2910:                }
        !          2911:                if (status & BIT_T1_ALMI_INT_STATUS_AISI) {
        !          2912:                        if (status & BIT_T1_ALMI_INT_STATUS_AIS) {
        !          2913:                                if (!(card->fe_te.te_alarm & BIT_AIS_ALARM)) {
        !          2914:                                        log(LOG_INFO, "%s: T1 AIS ON\n",
        !          2915:                                            card->devname);
        !          2916:                                        card->fe_te.te_alarm |= BIT_AIS_ALARM;
        !          2917:                                }
        !          2918:                        } else {
        !          2919:                                if (card->fe_te.te_alarm & BIT_AIS_ALARM) {
        !          2920:                                        log(LOG_INFO, "%s: T1 AIS OFF\n",
        !          2921:                                            card->devname);
        !          2922:                                        card->fe_te.te_alarm &= ~BIT_AIS_ALARM;
        !          2923:                                }
        !          2924:                        }
        !          2925:                }
        !          2926:
        !          2927: #if 0
        !          2928:                if (status &
        !          2929:                        (BIT_T1_ALMI_INT_STATUS_YELI |
        !          2930:                         BIT_T1_ALMI_INT_STATUS_REDI |
        !          2931:                         BIT_T1_ALMI_INT_STATUS_AISI)) {
        !          2932:                        if (status & (BIT_T1_ALMI_INT_STATUS_YEL |
        !          2933:                                        BIT_T1_ALMI_INT_STATUS_RED |
        !          2934:                                        BIT_T1_ALMI_INT_STATUS_AIS)) {
        !          2935:
        !          2936:                                /* Update T1/E1 alarm status */
        !          2937:                                if (!(card->fe_te.te_alarm & BIT_YEL_ALARM) &&
        !          2938:                                    (status & BIT_T1_ALMI_INT_STATUS_YEL)) {
        !          2939:                                        log(LOG_INFO, "%s: T1 YELLOW ON\n",
        !          2940:                                            card->devname);
        !          2941:                                        card->fe_te.te_alarm |= BIT_YEL_ALARM;
        !          2942:                                }
        !          2943:                                if (!(card->fe_te.te_alarm & BIT_RED_ALARM) &&
        !          2944:                                    (status & BIT_T1_ALMI_INT_STATUS_RED)) {
        !          2945:                                        log(LOG_INFO, "%s: T1 RED ON\n",
        !          2946:                                            card->devname);
        !          2947:                                        card->fe_te.te_alarm |= BIT_RED_ALARM;
        !          2948:                                }
        !          2949:                                if (!(card->fe_te.te_alarm & BIT_AIS_ALARM) &&
        !          2950:                                    (status & BIT_T1_ALMI_INT_STATUS_AIS)) {
        !          2951:                                        log(LOG_INFO, "%s: T1 AIS ON\n",
        !          2952:                                            card->devname);
        !          2953:                                        card->fe_te.te_alarm |= BIT_AIS_ALARM;
        !          2954:                                }
        !          2955:                        } else {
        !          2956:                                /* Update T1/E1 alarm status */
        !          2957:                                if ((card->fe_te.te_alarm & BIT_YEL_ALARM) &&
        !          2958:                                    !(status & BIT_T1_ALMI_INT_STATUS_YEL)) {
        !          2959:                                        log(LOG_INFO, "%s: T1 YELLOW OFF\n",
        !          2960:                                            card->devname);
        !          2961:                                        card->fe_te.te_alarm &= ~BIT_YEL_ALARM;
        !          2962:                                }
        !          2963:                                if ((card->fe_te.te_alarm & BIT_RED_ALARM) &&
        !          2964:                                    !(status & BIT_T1_ALMI_INT_STATUS_RED)) {
        !          2965:                                        log(LOG_INFO, "%s: T1 RED OFF\n",
        !          2966:                                            card->devname);
        !          2967:                                        card->fe_te.te_alarm &= ~BIT_RED_ALARM;
        !          2968:                                }
        !          2969:                                if ((card->fe_te.te_alarm & BIT_AIS_ALARM) &&
        !          2970:                                    !(status & BIT_T1_ALMI_INT_STATUS_AIS)) {
        !          2971:                                        log(LOG_INFO, "%s: T1 ALMI OFF\n",
        !          2972:                                            card->devname);
        !          2973:                                        card->fe_te.te_alarm &= ~BIT_AIS_ALARM;
        !          2974:                                }
        !          2975:                        }
        !          2976:                }
        !          2977: #endif
        !          2978:        }
        !          2979:
        !          2980:        /* 8. RBOC */
        !          2981:        if (intr_src3 & BIT_INT_SRC_3_RBOC) {
        !          2982:                status = READ_REG(REG_T1_RBOC_CODE_STATUS);
        !          2983:                if (status & BIT_T1_RBOC_CODE_STATUS_BOCI) {
        !          2984:                        struct timeval  tv;
        !          2985:                        unsigned long   time;
        !          2986:
        !          2987:                        microtime(&tv);
        !          2988:                        time = tv.tv_sec / 1000;
        !          2989:                        status &= MASK_T1_RBOC_CODE_STATUS;
        !          2990:                        switch (status) {
        !          2991:                        case LINELB_ACTIVATE_CODE:
        !          2992:                        case LINELB_DEACTIVATE_CODE:
        !          2993:                                if (bit_test((u_int8_t *)
        !          2994:                                    &card->fe_te.te_critical, LINELB_WAITING) &&
        !          2995:                                    bit_test((u_int8_t *)
        !          2996:                                    &card->fe_te.te_critical,
        !          2997:                                    LINELB_CODE_BIT)) {
        !          2998:                                        bit_clear((u_int8_t *)
        !          2999:                                        &card->fe_te.te_critical,
        !          3000:                                        LINELB_CODE_BIT);
        !          3001:                                        break;
        !          3002:                                }
        !          3003:
        !          3004:                                log(LOG_DEBUG, "%s: T1 LB %s code received.\n",
        !          3005:                                    card->devname,
        !          3006:                                    (status == LINELB_ACTIVATE_CODE) ?
        !          3007:                                    "activation" : "deactivation");
        !          3008:                                card->fe_te.te_rx_lb_cmd = status;
        !          3009:                                card->fe_te.te_rx_lb_time = time;
        !          3010:                                break;
        !          3011:
        !          3012:                        case LINELB_DS1LINE_ALL:
        !          3013:                                if (bit_test(
        !          3014:                                    (u_int8_t *)&card->fe_te.te_critical,
        !          3015:                                    LINELB_WAITING) &&
        !          3016:                                    bit_test(
        !          3017:                                    (u_int8_t *)&card->fe_te.te_critical,
        !          3018:                                    LINELB_CHANNEL_BIT)) {
        !          3019:                                        bit_clear((u_int8_t *)
        !          3020:                                            &card->fe_te.te_critical,
        !          3021:                                            LINELB_CHANNEL_BIT);
        !          3022:                                        bit_clear((u_int8_t*)
        !          3023:                                            &card->fe_te.te_critical,
        !          3024:                                            LINELB_WAITING);
        !          3025:                                        break;
        !          3026:                                }
        !          3027:                                if (!card->fe_te.te_rx_lb_cmd)
        !          3028:                                        break;
        !          3029:                                if ((time - card->fe_te.te_rx_lb_time) <
        !          3030:                                    LINELB_TE1_TIMER) {
        !          3031:                                        log(LOG_INFO, "%s: T1 LB %s cancel!\n",
        !          3032:                                                card->devname,
        !          3033:                                                (card->fe_te.te_rx_lb_cmd ==
        !          3034:                                                LINELB_ACTIVATE_CODE)?
        !          3035:                                                "activatation":
        !          3036:                                                "deactivation");
        !          3037:                                } else {
        !          3038:                                        unsigned char   reg;
        !          3039:                                        if (card->fe_te.te_rx_lb_cmd ==
        !          3040:                                            LINELB_ACTIVATE_CODE) {
        !          3041:                                                log(LOG_INFO,
        !          3042:                                                    "%s: T1 LB activated.\n",
        !          3043:                                                    card->devname);
        !          3044:                                                reg=READ_REG(REG_MASTER_DIAG);
        !          3045:                                                reg|=BIT_MASTER_DIAG_LINELB;
        !          3046:                                                WRITE_REG(REG_MASTER_DIAG,reg);
        !          3047:                                        } else {
        !          3048:                                                log(LOG_INFO,
        !          3049:                                                    "%s: T1 LB deactivated.\n",
        !          3050:                                                    card->devname);
        !          3051:                                                reg=READ_REG(REG_MASTER_DIAG);
        !          3052:                                                reg&=~BIT_MASTER_DIAG_LINELB;
        !          3053:                                                WRITE_REG(REG_MASTER_DIAG,reg);
        !          3054:                                        }
        !          3055:                                }
        !          3056:                                card->fe_te.te_rx_lb_cmd = 0x00;
        !          3057:                                card->fe_te.te_rx_lb_time = 0x00;
        !          3058:                                break;
        !          3059:
        !          3060:                        case LINELB_DS3LINE:
        !          3061:                                break;
        !          3062:
        !          3063:                        case LINELB_DS1LINE_1:
        !          3064:                        case LINELB_DS1LINE_2:
        !          3065:                        case LINELB_DS1LINE_3:
        !          3066:                        case LINELB_DS1LINE_4:
        !          3067:                        case LINELB_DS1LINE_5:
        !          3068:                        case LINELB_DS1LINE_6:
        !          3069:                        case LINELB_DS1LINE_7:
        !          3070:                        case LINELB_DS1LINE_8:
        !          3071:                        case LINELB_DS1LINE_9:
        !          3072:                        case LINELB_DS1LINE_10:
        !          3073:                        case LINELB_DS1LINE_11:
        !          3074:                        case LINELB_DS1LINE_12:
        !          3075:                        case LINELB_DS1LINE_13:
        !          3076:                        case LINELB_DS1LINE_14:
        !          3077:                        case LINELB_DS1LINE_15:
        !          3078:                        case LINELB_DS1LINE_16:
        !          3079:                        case LINELB_DS1LINE_17:
        !          3080:                        case LINELB_DS1LINE_18:
        !          3081:                        case LINELB_DS1LINE_19:
        !          3082:                        case LINELB_DS1LINE_20:
        !          3083:                        case LINELB_DS1LINE_21:
        !          3084:                        case LINELB_DS1LINE_22:
        !          3085:                        case LINELB_DS1LINE_23:
        !          3086:                        case LINELB_DS1LINE_24:
        !          3087:                        case LINELB_DS1LINE_25:
        !          3088:                        case LINELB_DS1LINE_26:
        !          3089:                        case LINELB_DS1LINE_27:
        !          3090:                        case LINELB_DS1LINE_28:
        !          3091:                                if (!card->fe_te.te_rx_lb_cmd)
        !          3092:                                        break;
        !          3093:                                if ((time - card->fe_te.te_rx_lb_time) <
        !          3094:                                    LINELB_TE1_TIMER) {
        !          3095:                                        log(LOG_DEBUG, "%s: T1 LB %s cancel!\n",
        !          3096:                                            card->devname,
        !          3097:                                            (card->fe_te.te_rx_lb_cmd ==
        !          3098:                                            LINELB_ACTIVATE_CODE) ?
        !          3099:                                            "activatation": "deactivation");
        !          3100:                                } else {
        !          3101:                                        int channel;
        !          3102:
        !          3103:                                        channel = status & LINELB_DS1LINE_MASK;
        !          3104:                                        log(LOG_INFO, "%s: T1 LB %s ts %d\n",
        !          3105:                                            card->devname,
        !          3106:                                            (card->fe_te.te_rx_lb_cmd ==
        !          3107:                                            LINELB_ACTIVATE_CODE) ?
        !          3108:                                            "activated" : "deactivated",
        !          3109:                                                channel);
        !          3110:                                        SetLoopBackChannel(card, channel,
        !          3111:                                                card->fe_te.te_rx_lb_cmd);
        !          3112:                                }
        !          3113:                                card->fe_te.te_rx_lb_cmd = 0x00;
        !          3114:                                card->fe_te.te_rx_lb_time = 0x00;
        !          3115:                                break;
        !          3116:
        !          3117:                        default:
        !          3118:                                log(LOG_DEBUG, "%s: Unknown signal (%02x).\n",
        !          3119:                                    card->devname, status);
        !          3120:                                break;
        !          3121:                        }
        !          3122:                }
        !          3123:        }
        !          3124:
        !          3125:        /* 7. FRMR */
        !          3126:        if (intr_src1 & BIT_INT_SRC_1_FRMR) {
        !          3127:                status = READ_REG(REG_T1_FRMR_INT_STATUS);
        !          3128:                if ((READ_REG(REG_T1_FRMR_INT_EN) & BIT_T1_FRMR_INT_EN_INFRE) &&
        !          3129:                    (status & BIT_T1_FRMR_INT_STATUS_INFRI)) {
        !          3130:                        if (status & BIT_T1_FRMR_INT_STATUS_INFR) {
        !          3131:                                if (!(card->fe_te.te_alarm & BIT_OOF_ALARM)) {
        !          3132:                                        log(LOG_INFO, "%s: T1 OOF ON!\n",
        !          3133:                                            card->devname);
        !          3134:                                        card->fe_te.te_alarm |= BIT_OOF_ALARM;
        !          3135:                                }
        !          3136:                        } else {
        !          3137:                                if (card->fe_te.te_alarm & BIT_OOF_ALARM) {
        !          3138:                                        log(LOG_INFO, "%s: T1 OOF OFF!\n",
        !          3139:                                            card->devname);
        !          3140:                                        card->fe_te.te_alarm &= ~BIT_OOF_ALARM;
        !          3141:                                }
        !          3142:                        }
        !          3143:                }
        !          3144:        }
        !          3145:
        !          3146:        /* 1. RLPS */
        !          3147:        if (intr_src3 & BIT_INT_SRC_3_RLPS) {
        !          3148:                status = READ_REG(REG_RLPS_CFG_STATUS);
        !          3149:                if ((status & BIT_RLPS_CFG_STATUS_ALOSE) &&
        !          3150:                    (status & BIT_RLPS_CFG_STATUS_ALOSI)) {
        !          3151:                        if (status & BIT_RLPS_CFG_STATUS_ALOSV) {
        !          3152:                                if (!(card->fe_te.te_alarm & BIT_ALOS_ALARM)) {
        !          3153:                                        log(LOG_INFO, "%s: T1 ALOS ON\n",
        !          3154:                                            card->devname);
        !          3155:                                        card->fe_te.te_alarm |= BIT_ALOS_ALARM;
        !          3156:                                }
        !          3157:                        } else {
        !          3158:                                if (card->fe_te.te_alarm & BIT_ALOS_ALARM) {
        !          3159:                                        log(LOG_INFO, "%s: T1 ALOS OFF\n",
        !          3160:                                            card->devname);
        !          3161:                                        card->fe_te.te_alarm &= ~BIT_ALOS_ALARM;
        !          3162:                                }
        !          3163:                        }
        !          3164:                }
        !          3165:        }
        !          3166:
        !          3167:        /* 2. CDRC */
        !          3168:        if (intr_src1 & BIT_INT_SRC_1_CDRC) {
        !          3169:                status = READ_REG(REG_CDRC_INT_STATUS);
        !          3170:                if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_LOSE) &&
        !          3171:                    (status & BIT_CDRC_INT_STATUS_LOSI)) {
        !          3172:                        if (status & BIT_CDRC_INT_STATUS_LOSV) {
        !          3173:                                if (!(card->fe_te.te_alarm & BIT_LOS_ALARM)) {
        !          3174:                                        log(LOG_INFO, "%s: T1 LOS ON\n",
        !          3175:                                            card->devname);
        !          3176:                                        card->fe_te.te_alarm |= BIT_LOS_ALARM;
        !          3177:                                }
        !          3178:                        } else {
        !          3179:                                if (card->fe_te.te_alarm & BIT_LOS_ALARM) {
        !          3180:                                        log(LOG_INFO, "%s: T1 LOS OFF\n",
        !          3181:                                            card->devname);
        !          3182:                                        card->fe_te.te_alarm &= ~BIT_LOS_ALARM;
        !          3183:                                }
        !          3184:                        }
        !          3185:                }
        !          3186:                if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_LCVE) &&
        !          3187:                    (status & BIT_CDRC_INT_STATUS_LCVI)) {
        !          3188:                        log(LOG_INFO, "%s: T1 line code violation!\n",
        !          3189:                            card->devname);
        !          3190:                }
        !          3191:                if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_LCSDE) &&
        !          3192:                    (status & BIT_CDRC_INT_STATUS_LCSDI)) {
        !          3193:                        log(LOG_INFO, "%s: T1 line code signature detected!\n",
        !          3194:                            card->devname);
        !          3195:                }
        !          3196:                if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_ZNDE) &&
        !          3197:                    (status & BIT_CDRC_INT_STATUS_ZNDI)) {
        !          3198:                        log(LOG_INFO, "%s: T1 consecutive zeros detected!\n",
        !          3199:                            card->devname);
        !          3200:                }
        !          3201:                status = READ_REG(REG_ALTLOS_STATUS);
        !          3202:                if ((status & BIT_ALTLOS_STATUS_ALTLOSI) &&
        !          3203:                    (status & BIT_ALTLOS_STATUS_ALTLOSE)) {
        !          3204:                        if (status & BIT_ALTLOS_STATUS_ALTLOS) {
        !          3205:                                if (!(card->fe_te.te_alarm &
        !          3206:                                    BIT_ALTLOS_ALARM)) {
        !          3207:                                        log(LOG_INFO, "%s: T1 ALTLOS ON\n",
        !          3208:                                                        card->devname);
        !          3209:                                        card->fe_te.te_alarm |=
        !          3210:                                                        BIT_ALTLOS_ALARM;
        !          3211:                                }
        !          3212:                        } else {
        !          3213:                                if (card->fe_te.te_alarm & BIT_ALTLOS_ALARM) {
        !          3214:                                        log(LOG_INFO, "%s: T1 ALTLOS OFF\n",
        !          3215:                                            card->devname);
        !          3216:                                        card->fe_te.te_alarm &=
        !          3217:                                            ~BIT_ALTLOS_ALARM;
        !          3218:                                }
        !          3219:                        }
        !          3220:                }
        !          3221:        }
        !          3222:
        !          3223:        /* 14. PMON */
        !          3224:        if (intr_src1 & BIT_INT_SRC_1_PMON) {
        !          3225:                status = READ_REG(REG_PMON_INT_EN_STATUS);
        !          3226:                if (status & BIT_PMON_INT_EN_STATUS_XFER) {
        !          3227:                        log(LOG_DEBUG, "%s: T1 Updating PMON counters...\n",
        !          3228:                            card->devname);
        !          3229:                        sdla_te_pmon(card);
        !          3230:                }
        !          3231:        }
        !          3232:
        !          3233:        /* 9. SIGX */
        !          3234:        if (intr_src1 & BIT_INT_SRC_1_SIGX) {
        !          3235:                unsigned char SIGX_chg_30_25;
        !          3236:                unsigned char SIGX_chg_24_17;
        !          3237:                unsigned char SIGX_chg_16_9;
        !          3238:                unsigned char SIGX_chg_8_1;
        !          3239:
        !          3240:                SIGX_chg_30_25 = READ_REG(REG_SIGX_CFG);
        !          3241:                SIGX_chg_24_17= READ_REG(REG_SIGX_TIMESLOT_IND_STATUS);
        !          3242:                SIGX_chg_16_9 = READ_REG(REG_SIGX_TIMESLOT_IND_ACCESS);
        !          3243:                SIGX_chg_8_1 = READ_REG(REG_SIGX_TIMESLOT_IND_DATA_BUFFER);
        !          3244:
        !          3245:        }
        !          3246:
        !          3247:        /* 5. IBCD */
        !          3248:        card->fe_te.te_alarm &= ~(BIT_LOOPUP_CODE|BIT_LOOPDOWN_CODE);
        !          3249:        if (intr_src3 & BIT_INT_SRC_3_IBCD) {
        !          3250:                status = READ_REG(REG_IBCD_INT_EN_STATUS);
        !          3251:                if (status & BIT_IBCD_INT_EN_STATUS_LBAI) {
        !          3252:                        card->fe_te.te_alarm |= BIT_LOOPUP_CODE;
        !          3253:                }
        !          3254:                if (status & BIT_IBCD_INT_EN_STATUS_LBDI) {
        !          3255:                        card->fe_te.te_alarm |= BIT_LOOPDOWN_CODE;
        !          3256:                }
        !          3257:        }
        !          3258: #if 0
        !          3259:        /* 4. RJAT */
        !          3260:        if (intr_src1 & BIT_INT_SRC_1_RJAT) {
        !          3261:        }
        !          3262:        /* 10. RX-ELST */
        !          3263:        if (intr_src2 & BIT_INT_SRC_2_RX_ELST) {
        !          3264:        }
        !          3265:        /* 11. RDLC-1 */
        !          3266:        if (intr_src2 & BIT_INT_SRC_2_RDLC_1) {
        !          3267:        }
        !          3268:        /* 12. RDLC-2 */
        !          3269:        if (intr_src2 & BIT_INT_SRC_2_RDLC_2) {
        !          3270:        }
        !          3271:        /* 13. RDLC-3 */
        !          3272:        if (intr_src2 & BIT_INT_SRC_2_RDLC_3) {
        !          3273:        }
        !          3274: #endif
        !          3275:
        !          3276:        return;
        !          3277: }
        !          3278:
        !          3279:
        !          3280: /*
        !          3281:  * Read tx interrupt.
        !          3282:  *
        !          3283:  * Arguments:  card            - pointer to device structure.
        !          3284:  * Returns: None.
        !          3285:  */
        !          3286: static void
        !          3287: sdla_e1_rx_intr(sdla_t *card)
        !          3288: {
        !          3289:        unsigned char intr_src1 = 0x00, intr_src2 = 0x00, intr_src3 = 0x00;
        !          3290:        unsigned char int_status = 0x00, status = 0x00;
        !          3291:
        !          3292:        intr_src1 = READ_REG(REG_INT_SRC_1);
        !          3293:        intr_src2 = READ_REG(REG_INT_SRC_2);
        !          3294:        intr_src3 = READ_REG(REG_INT_SRC_3);
        !          3295:        if (!(intr_src1 & BITS_RX_INT_SRC_1 ||
        !          3296:                intr_src2 & BITS_RX_INT_SRC_2 ||
        !          3297:                intr_src3 & BITS_RX_INT_SRC_3))
        !          3298:                return;
        !          3299:
        !          3300:        /* 4. FRMR */
        !          3301:        if (intr_src1 & BIT_INT_SRC_1_FRMR) {
        !          3302:                /* Register 0x94h E1 FRMR */
        !          3303:                int_status = READ_REG(REG_E1_FRMR_FRM_STAT_INT_IND);
        !          3304:                /* Register 0x96h E1 FRMR Status */
        !          3305:                status = READ_REG(REG_E1_FRMR_FR_STATUS);
        !          3306:                if ((READ_REG(REG_E1_FRMR_FRM_STAT_INT_EN) &
        !          3307:                    BIT_E1_FRMR_FRM_STAT_INT_EN_OOFE) &&
        !          3308:                    (int_status & BIT_E1_FRMR_FRM_STAT_INT_IND_OOFI)) {
        !          3309:                        if (status & BIT_E1_FRMR_FR_STATUS_OOFV) {
        !          3310:                                if (!(card->fe_te.te_alarm & BIT_OOF_ALARM)) {
        !          3311:                                        log(LOG_INFO, "%s: E1 OOF ON\n",
        !          3312:                                            card->devname);
        !          3313:                                        card->fe_te.te_alarm |= BIT_OOF_ALARM;
        !          3314:                                }
        !          3315:                        } else {
        !          3316:                                if (card->fe_te.te_alarm & BIT_OOF_ALARM) {
        !          3317:                                        log(LOG_INFO, "%s: E1 OOF OFF\n",
        !          3318:                                            card->devname);
        !          3319:                                        card->fe_te.te_alarm &= ~BIT_OOF_ALARM;
        !          3320:                                }
        !          3321:                        }
        !          3322:                }
        !          3323:
        !          3324:                if ((READ_REG(REG_E1_FRMR_FRM_STAT_INT_EN) &
        !          3325:                    BIT_E1_FRMR_FRM_STAT_INT_EN_OOSMFE) &&
        !          3326:                    (int_status & BIT_E1_FRMR_FRM_STAT_INT_IND_OOSMFI)) {
        !          3327:                        if (status & BIT_E1_FRMR_FR_STATUS_OOSMFV) {
        !          3328:                                log(LOG_INFO, "%s: E1 OOSMF ON\n",
        !          3329:                                    card->devname);
        !          3330:                                card->fe_te.te_alarm |= BIT_OOSMF_ALARM;
        !          3331:                        } else {
        !          3332:                                log(LOG_INFO, "%s: E1 OOSMF OFF\n",
        !          3333:                                    card->devname);
        !          3334:                                card->fe_te.te_alarm &= ~BIT_OOSMF_ALARM;
        !          3335:                        }
        !          3336:                }
        !          3337:
        !          3338:                if ((READ_REG(REG_E1_FRMR_FRM_STAT_INT_EN) &
        !          3339:                    BIT_E1_FRMR_FRM_STAT_INT_EN_OOCMFE) &&
        !          3340:                    (int_status & BIT_E1_FRMR_FRM_STAT_INT_IND_OOCMFI)) {
        !          3341:                        if (status & BIT_E1_FRMR_FR_STATUS_OOCMFV) {
        !          3342:                                log(LOG_INFO, "%s: E1 OOCMF ON\n",
        !          3343:                                    card->devname);
        !          3344:                                card->fe_te.te_alarm |= BIT_OOCMF_ALARM;
        !          3345:                        } else {
        !          3346:                                log(LOG_INFO, "%s: E1 OOCMF OFF\n",
        !          3347:                                    card->devname);
        !          3348:                                card->fe_te.te_alarm &= ~BIT_OOCMF_ALARM;
        !          3349:                        }
        !          3350:                }
        !          3351:
        !          3352:                /* Register 0x9Fh E1 FRMR */
        !          3353:                status = READ_REG(REG_E1_FRMR_P_A_INT_STAT);
        !          3354:                if ((READ_REG(REG_E1_FRMR_P_A_INT_EN) &
        !          3355:                    BIT_E1_FRMR_P_A_INT_EN_OOOFE) &&
        !          3356:                    (status & BIT_E1_FRMR_P_A_INT_STAT_OOOFI)) {
        !          3357:                        if (READ_REG(REG_E1_FRMR_FR_STATUS) &
        !          3358:                            BIT_E1_FRMR_FR_STATUS_OOOFV) {
        !          3359:                                log(LOG_INFO, "%s: E1 OOOF ON\n",
        !          3360:                                    card->devname);
        !          3361:                                card->fe_te.te_alarm |= BIT_OOOF_ALARM;
        !          3362:                        } else {
        !          3363:                                log(LOG_INFO, "%s: E1 OOOF OFF\n",
        !          3364:                                    card->devname);
        !          3365:                                card->fe_te.te_alarm &= ~BIT_OOOF_ALARM;
        !          3366:                        }
        !          3367:                }
        !          3368:
        !          3369:                /* Register 0x95h E1 FRMR */
        !          3370:                int_status = READ_REG(REG_E1_FRMR_M_A_INT_IND);
        !          3371:                if (int_status & (BIT_E1_FRMR_M_A_INT_IND_REDI |
        !          3372:                    BIT_E1_FRMR_M_A_INT_IND_AISI)) {
        !          3373:                        status = READ_REG(REG_E1_FRMR_MAINT_STATUS);
        !          3374:                        if ((READ_REG(REG_E1_FRMR_M_A_INT_EN) &
        !          3375:                            BIT_E1_FRMR_M_A_INT_EN_REDE) &&
        !          3376:                            (int_status & BIT_E1_FRMR_M_A_INT_IND_REDI)) {
        !          3377:                                if (status & BIT_E1_FRMR_MAINT_STATUS_RED) {
        !          3378:                                        log(LOG_INFO, "%s: E1 RED ON\n",
        !          3379:                                            card->devname);
        !          3380:                                        card->fe_te.te_alarm |= BIT_RED_ALARM;
        !          3381:                                } else {
        !          3382:                                        log(LOG_INFO, "%s: E1 RED OFF\n",
        !          3383:                                            card->devname);
        !          3384:                                        card->fe_te.te_alarm &= ~BIT_RED_ALARM;
        !          3385:                                }
        !          3386:                        }
        !          3387:                        if ((READ_REG(REG_E1_FRMR_M_A_INT_EN) &
        !          3388:                            BIT_E1_FRMR_M_A_INT_EN_AISE) &&
        !          3389:                            (int_status & BIT_E1_FRMR_M_A_INT_IND_AISI)) {
        !          3390:                                if (status & BIT_E1_FRMR_MAINT_STATUS_AIS) {
        !          3391:                                        log(LOG_INFO, "%s: E1 AIS ON\n",
        !          3392:                                            card->devname);
        !          3393:                                        card->fe_te.te_alarm |= BIT_AIS_ALARM;
        !          3394:                                } else {
        !          3395:                                        log(LOG_INFO, "%s: E1 AIS OFF\n",
        !          3396:                                            card->devname);
        !          3397:                                        card->fe_te.te_alarm &= ~BIT_AIS_ALARM;
        !          3398:                                }
        !          3399:                        }
        !          3400:                        if ((READ_REG(REG_E1_FRMR_M_A_INT_EN) &
        !          3401:                            BIT_E1_FRMR_M_A_INT_EN_RAIE) &&
        !          3402:                            (int_status & BIT_E1_FRMR_M_A_INT_IND_RAII)) {
        !          3403:                                if (status & BIT_E1_FRMR_MAINT_STATUS_RAIV) {
        !          3404:                                        log(LOG_INFO, "%s: E1 RAI ON\n",
        !          3405:                                            card->devname);
        !          3406:                                        card->fe_te.te_alarm |= BIT_RAI_ALARM;
        !          3407:                                } else {
        !          3408:                                        log(LOG_INFO, "%s: E1 RAI OFF\n",
        !          3409:                                            card->devname);
        !          3410:                                        card->fe_te.te_alarm &= ~BIT_RAI_ALARM;
        !          3411:                                }
        !          3412:                        }
        !          3413:                }
        !          3414:        }
        !          3415:
        !          3416:        /* 1. RLPS */
        !          3417:        if (intr_src3 & BIT_INT_SRC_3_RLPS) {
        !          3418:                status = READ_REG(REG_RLPS_CFG_STATUS);
        !          3419:                if ((status & BIT_RLPS_CFG_STATUS_ALOSE) &&
        !          3420:                    (status & BIT_RLPS_CFG_STATUS_ALOSI)) {
        !          3421:                        if (status & BIT_RLPS_CFG_STATUS_ALOSV) {
        !          3422:                                if (!(card->fe_te.te_alarm & BIT_ALOS_ALARM)) {
        !          3423:                                        log(LOG_INFO, "%s: E1 ALOS ON\n",
        !          3424:                                            card->devname);
        !          3425:                                        card->fe_te.te_alarm |= BIT_ALOS_ALARM;
        !          3426:                                }
        !          3427:                        } else {
        !          3428:                                if (card->fe_te.te_alarm & BIT_ALOS_ALARM) {
        !          3429:                                        log(LOG_INFO, "%s: E1 ALOS is OFF\n",
        !          3430:                                            card->devname);
        !          3431:                                        card->fe_te.te_alarm &=
        !          3432:                                                        ~BIT_ALOS_ALARM;
        !          3433:                                }
        !          3434:                        }
        !          3435:                }
        !          3436:        }
        !          3437:
        !          3438:        /* 2. CDRC */
        !          3439:        if (intr_src1 & BIT_INT_SRC_1_CDRC) {
        !          3440:                status = READ_REG(REG_CDRC_INT_STATUS);
        !          3441:                if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_LOSE) &&
        !          3442:                    (status & BIT_CDRC_INT_STATUS_LOSI)) {
        !          3443:                        if (status & BIT_CDRC_INT_STATUS_LOSV) {
        !          3444:                                if (!(card->fe_te.te_alarm & BIT_LOS_ALARM)) {
        !          3445:                                        log(LOG_INFO, "%s: E1 LOS is ON\n",
        !          3446:                                            card->devname);
        !          3447:                                        card->fe_te.te_alarm |= BIT_LOS_ALARM;
        !          3448:                                }
        !          3449:                        } else {
        !          3450:                                if (card->fe_te.te_alarm & BIT_LOS_ALARM) {
        !          3451:                                        log(LOG_INFO, "%s: E1 LOS is OFF\n",
        !          3452:                                            card->devname);
        !          3453:                                        card->fe_te.te_alarm &= ~BIT_LOS_ALARM;
        !          3454:                                }
        !          3455:                        }
        !          3456:                }
        !          3457:                if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_LCVE) &&
        !          3458:                    (status & BIT_CDRC_INT_STATUS_LCVI)) {
        !          3459:                        log(LOG_INFO, "%s: E1 line code violation!\n",
        !          3460:                            card->devname);
        !          3461:                }
        !          3462:                if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_LCSDE) &&
        !          3463:                    (status & BIT_CDRC_INT_STATUS_LCSDI)) {
        !          3464:                        log(LOG_INFO, "%s: E1 line code signature detected!\n",
        !          3465:                            card->devname);
        !          3466:                }
        !          3467:                if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_ZNDE) &&
        !          3468:                    (status & BIT_CDRC_INT_STATUS_ZNDI)) {
        !          3469:                        log(LOG_INFO, "%s: E1 consecutive zeros detected!\n",
        !          3470:                            card->devname);
        !          3471:                }
        !          3472:                status = READ_REG(REG_ALTLOS_STATUS);
        !          3473:                if ((status & BIT_ALTLOS_STATUS_ALTLOSI) &&
        !          3474:                    (status & BIT_ALTLOS_STATUS_ALTLOSE)) {
        !          3475:                        if (status & BIT_ALTLOS_STATUS_ALTLOS) {
        !          3476:                                if (!(card->fe_te.te_alarm &
        !          3477:                                    BIT_ALTLOS_ALARM)) {
        !          3478:                                        log(LOG_INFO, "%s: E1 ALTLOS is ON\n",
        !          3479:                                            card->devname);
        !          3480:                                        card->fe_te.te_alarm |=
        !          3481:                                            BIT_ALTLOS_ALARM;
        !          3482:                                }
        !          3483:                        } else {
        !          3484:                                if (card->fe_te.te_alarm & BIT_ALTLOS_ALARM) {
        !          3485:                                        log(LOG_INFO, "%s: E1 ALTLOS is OFF\n",
        !          3486:                                            card->devname);
        !          3487:                                        card->fe_te.te_alarm &=
        !          3488:                                            ~BIT_ALTLOS_ALARM;
        !          3489:                                }
        !          3490:                        }
        !          3491:                }
        !          3492:        }
        !          3493:        /* 11. PMON */
        !          3494:        if (intr_src1 & BIT_INT_SRC_1_PMON) {
        !          3495:                status = READ_REG(REG_PMON_INT_EN_STATUS);
        !          3496:                if (status & BIT_PMON_INT_EN_STATUS_XFER) {
        !          3497:                        sdla_te_pmon(card);
        !          3498:                }
        !          3499:        }
        !          3500: #if 0
        !          3501:        /* 3. RJAT */
        !          3502:        if (intr_src1 & BIT_INT_SRC_1_RJAT) {
        !          3503:        }
        !          3504:        /* 5. SIGX */
        !          3505:        if (intr_src1 & BIT_INT_SRC_1_SIGX) {
        !          3506:        }
        !          3507:        /* 6. RX-ELST */
        !          3508:        if (intr_src2 & BIT_INT_SRC_2_RX_ELST) {
        !          3509:        }
        !          3510:        /* 7. PRGD */
        !          3511:        if (intr_src1 & BIT_INT_SRC_1_PRGD) {
        !          3512:        }
        !          3513:        /* 8. RDLC-1 */
        !          3514:        if (intr_src2 & BIT_INT_SRC_2_RDLC_1) {
        !          3515:        }
        !          3516:        /* 9. RDLC-2 */
        !          3517:        if (intr_src2 & BIT_INT_SRC_2_RDLC_2) {
        !          3518:        }
        !          3519:        /* 10. RDLC-3 */
        !          3520:        if (intr_src2 & BIT_INT_SRC_2_RDLC_3) {
        !          3521:        }
        !          3522: #endif
        !          3523:        if (!(READ_REG(REG_RLPS_CFG_STATUS) & BIT_RLPS_CFG_STATUS_ALOSV)) {
        !          3524:                card->fe_te.te_alarm &= ~BIT_ALOS_ALARM;
        !          3525:        }
        !          3526:        return;
        !          3527: }
        !          3528:
        !          3529: /*
        !          3530:  * Set T1/E1 loopback modes.
        !          3531:  */
        !          3532: int
        !          3533: sdla_set_te1_lb_modes(void *arg, unsigned char type, unsigned char mode)
        !          3534: {
        !          3535:        sdla_t *card = (sdla_t*)arg;
        !          3536:        int     err = 1;
        !          3537:
        !          3538:        WAN_ASSERT(card->write_front_end_reg == NULL);
        !          3539:        WAN_ASSERT(card->read_front_end_reg == NULL);
        !          3540:        switch (type) {
        !          3541:        case WAN_TE1_LINELB_MODE:
        !          3542:                err = sdla_te_linelb(card, mode);
        !          3543:                break;
        !          3544:        case WAN_TE1_PAYLB_MODE:
        !          3545:                err = sdla_te_paylb(card, mode);
        !          3546:                break;
        !          3547:        case WAN_TE1_DDLB_MODE:
        !          3548:                err = sdla_te_ddlb(card, mode);
        !          3549:                break;
        !          3550:        case WAN_TE1_TX_LB_MODE:
        !          3551:                err = sdla_te_lb(card, mode);
        !          3552:                break;
        !          3553:        }
        !          3554:
        !          3555:        return err;
        !          3556: }
        !          3557:
        !          3558: /*
        !          3559:  * Activate/Deactivate Line Loopback mode.
        !          3560:  */
        !          3561: static int
        !          3562: sdla_te_linelb(sdla_t *card, unsigned char mode)
        !          3563: {
        !          3564:        WAN_ASSERT(card->write_front_end_reg == NULL);
        !          3565:        WAN_ASSERT(card->read_front_end_reg == NULL);
        !          3566:        if (mode == WAN_TE1_ACTIVATE_LB) {
        !          3567:                log(LOG_INFO, "%s: %s Line Loopback mode activated.\n",
        !          3568:                        card->devname,
        !          3569:                        (IS_T1(&card->fe_te.te_cfg) ? "T1" : "E1"));
        !          3570:                WRITE_REG(REG_MASTER_DIAG,
        !          3571:                        READ_REG(REG_MASTER_DIAG) | BIT_MASTER_DIAG_LINELB);
        !          3572:        } else {
        !          3573:                log(LOG_INFO, "%s: %s Line Loopback mode deactivated.\n",
        !          3574:                        card->devname,
        !          3575:                        (IS_T1(&card->fe_te.te_cfg) ? "T1" : "E1"));
        !          3576:                WRITE_REG(REG_MASTER_DIAG,
        !          3577:                        READ_REG(REG_MASTER_DIAG) & ~BIT_MASTER_DIAG_LINELB);
        !          3578:        }
        !          3579:        return 0;
        !          3580: }
        !          3581:
        !          3582: /*
        !          3583:  * Activate/Deactivate Payload loopback mode.
        !          3584:  */
        !          3585: static int
        !          3586: sdla_te_paylb(sdla_t *card, unsigned char mode)
        !          3587: {
        !          3588:        WAN_ASSERT(card->write_front_end_reg == NULL);
        !          3589:        WAN_ASSERT(card->read_front_end_reg == NULL);
        !          3590:        if (mode == WAN_TE1_ACTIVATE_LB) {
        !          3591:                log(LOG_INFO, "%s: %s Payload Loopback mode activated.\n",
        !          3592:                    card->devname, (IS_T1(&card->fe_te.te_cfg) ? "T1" : "E1"));
        !          3593:                WRITE_REG(REG_MASTER_DIAG,
        !          3594:                        READ_REG(REG_MASTER_DIAG) | BIT_MASTER_DIAG_PAYLB);
        !          3595:        } else {
        !          3596:                log(LOG_INFO, "%s: %s Payload Loopback mode deactivated.\n",
        !          3597:                    card->devname, (IS_T1(&card->fe_te.te_cfg) ? "T1" : "E1"));
        !          3598:                WRITE_REG(REG_MASTER_DIAG,
        !          3599:                    READ_REG(REG_MASTER_DIAG) & ~BIT_MASTER_DIAG_PAYLB);
        !          3600:        }
        !          3601:        return 0;
        !          3602: }
        !          3603:
        !          3604: /*
        !          3605:  * Description: Activate/Deactivate Diagnostic Digital loopback mode.
        !          3606:  */
        !          3607: static int
        !          3608: sdla_te_ddlb(sdla_t *card, unsigned char mode)
        !          3609: {
        !          3610:        WAN_ASSERT(card->write_front_end_reg == NULL);
        !          3611:        WAN_ASSERT(card->read_front_end_reg == NULL);
        !          3612:        if (mode == WAN_TE1_ACTIVATE_LB) {
        !          3613:                log(LOG_INFO, "%s: %s Diagnostic Dig. LB mode activated.\n",
        !          3614:                    card->devname, (IS_T1(&card->fe_te.te_cfg) ? "T1" : "E1"));
        !          3615:                WRITE_REG(REG_MASTER_DIAG,
        !          3616:                        READ_REG(REG_MASTER_DIAG) | BIT_MASTER_DIAG_DDLB);
        !          3617:        } else {
        !          3618:                log(LOG_INFO, "%s: %s Diagnostic Dig. LB mode deactivated.\n",
        !          3619:                    card->devname, (IS_T1(&card->fe_te.te_cfg) ? "T1" : "E1"));
        !          3620:                WRITE_REG(REG_MASTER_DIAG,
        !          3621:                    READ_REG(REG_MASTER_DIAG) & ~BIT_MASTER_DIAG_DDLB);
        !          3622:        }
        !          3623:        return 0;
        !          3624: }
        !          3625:
        !          3626: void
        !          3627: sdla_te_timer(void *card_id)
        !          3628: {
        !          3629:        sdla_t *card = (sdla_t*)card_id;
        !          3630:
        !          3631:        if (bit_test((u_int8_t*)&card->fe_te.te_critical,TE_TIMER_KILL)) {
        !          3632:                bit_clear((u_int8_t*)&card->fe_te.te_critical,TE_TIMER_RUNNING);
        !          3633:                return;
        !          3634:        }
        !          3635:        /*WAN_ASSERT1(card->te_enable_timer == NULL); */
        !          3636:        /* Enable hardware interrupt for TE1 */
        !          3637:        if (card->te_enable_timer) {
        !          3638:                card->te_enable_timer(card);
        !          3639:        } else {
        !          3640:                sdla_te_polling(card);
        !          3641:        }
        !          3642:
        !          3643:        return;
        !          3644: }
        !          3645:
        !          3646: /*
        !          3647:  * Enable software timer interrupt in delay ms.
        !          3648:  */
        !          3649: static void
        !          3650: sdla_te_enable_timer(sdla_t *card, unsigned long delay)
        !          3651: {
        !          3652:
        !          3653:        WAN_ASSERT1(card == NULL);
        !          3654:        if (bit_test((u_int8_t*)&card->fe_te.te_critical, TE_TIMER_KILL)) {
        !          3655:                bit_clear((u_int8_t*)&card->fe_te.te_critical,
        !          3656:                                        TE_TIMER_RUNNING);
        !          3657:                return;
        !          3658:        }
        !          3659:        bit_set((u_int8_t*)&card->fe_te.te_critical, TE_TIMER_RUNNING);
        !          3660:
        !          3661:        timeout_add(&card->fe_te.te_timer, delay * hz / 1000);
        !          3662:        return;
        !          3663: }
        !          3664:
        !          3665: /*
        !          3666:  * Description: Process T1/E1 polling function.
        !          3667:  */
        !          3668: void
        !          3669: sdla_te_polling(void *card_id)
        !          3670: {
        !          3671:        sdla_t*         card = (sdla_t*)card_id;
        !          3672:
        !          3673:        WAN_ASSERT1(card->write_front_end_reg == NULL);
        !          3674:        WAN_ASSERT1(card->read_front_end_reg == NULL);
        !          3675:        bit_clear((u_int8_t*)&card->fe_te.te_critical, TE_TIMER_RUNNING);
        !          3676:        switch (card->fe_te.te_timer_cmd) {
        !          3677:        case TE_LINELB_TIMER:
        !          3678:                if (IS_T1(&card->fe_te.te_cfg)) {
        !          3679:                        /* Sending T1 activation/deactivation LB signal */
        !          3680:                        if (card->fe_te.te_tx_lb_cnt > 10) {
        !          3681:                                WRITE_REG(REG_T1_XBOC_CODE,
        !          3682:                                        (card->fe_te.te_tx_lb_cmd ==
        !          3683:                                                WAN_TE1_ACTIVATE_LB) ?
        !          3684:                                                LINELB_ACTIVATE_CODE :
        !          3685:                                                LINELB_DEACTIVATE_CODE);
        !          3686:                        } else {
        !          3687:                                WRITE_REG(REG_T1_XBOC_CODE,
        !          3688:                                                LINELB_DS1LINE_ALL);
        !          3689:                        }
        !          3690:                        if (--card->fe_te.te_tx_lb_cnt) {
        !          3691:                                sdla_te_enable_timer(card, LINELB_TE1_TIMER);
        !          3692:                        } else {
        !          3693:                                log(LOG_DEBUG, "%s: TX T1 LB %s signal.\n",
        !          3694:                                    card->devname,
        !          3695:                                    (card->fe_te.te_tx_lb_cmd ==
        !          3696:                                    WAN_TE1_ACTIVATE_LB) ?
        !          3697:                                    "activation" : "deactivation");
        !          3698:                                card->fe_te.te_tx_lb_cmd = 0x00;
        !          3699:                                bit_clear((u_int8_t*)&card->fe_te.te_critical,
        !          3700:                                    TE_TIMER_RUNNING);
        !          3701:                        }
        !          3702:                }
        !          3703:                break;
        !          3704:
        !          3705:        case TE_SET_INTR:
        !          3706:                sdla_te_set_intr(card);
        !          3707:                break;
        !          3708:
        !          3709:        case TE_LINKDOWN_TIMER:
        !          3710:                if ((READ_REG(REG_RLPS_ALOS_DET_PER) &&
        !          3711:                    (READ_REG(REG_RLPS_CFG_STATUS) &
        !          3712:                    BIT_RLPS_CFG_STATUS_ALOSV)) ||
        !          3713:                    (IS_E1(&card->fe_te.te_cfg) &&
        !          3714:                    (READ_REG(REG_E1_FRMR_FR_STATUS) &
        !          3715:                    BIT_E1_FRMR_FR_STATUS_OOFV)) ||
        !          3716:                    (IS_T1(&card->fe_te.te_cfg) &&
        !          3717:                    (READ_REG(REG_T1_FRMR_INT_STATUS) &
        !          3718:                    ~BIT_T1_FRMR_INT_STATUS_INFR))) {
        !          3719:                        sdla_te_enable_timer(card, POLLING_TE1_TIMER);
        !          3720:                } else {
        !          3721:                        /* All other interrupt reports status changed
        !          3722:                         * through interrupts, we don't need to read
        !          3723:                         * these values here */
        !          3724:                        sdla_te_set_status(card, card->fe_te.te_alarm);
        !          3725:                        if (card->front_end_status == FE_CONNECTED) {
        !          3726:                                card->fe_te.te_timer_cmd = TE_LINKUP_TIMER;
        !          3727:                                sdla_te_enable_timer(card, POLLING_TE1_TIMER);
        !          3728:                        }
        !          3729:                }
        !          3730:                break;
        !          3731:
        !          3732:        case TE_LINKUP_TIMER:
        !          3733:                /* ALEX:
        !          3734:                 * Do not update protocol front end state from
        !          3735:                 * TE_LINKDOWN_TIMER because it cause to stay
        !          3736:                 * more longer in interrupt handler (critical for XILINX
        !          3737:                 * code) */
        !          3738:                if (card->te_link_state) {
        !          3739:                        card->te_link_state(card);
        !          3740:                }
        !          3741:                break;
        !          3742:        }
        !          3743:        return;
        !          3744: }
        !          3745:
        !          3746: /*
        !          3747:  * Description: Transmit loopback signal to remote side.
        !          3748:  */
        !          3749: static int
        !          3750: sdla_te_lb(sdla_t *card, unsigned char mode)
        !          3751: {
        !          3752:        WAN_ASSERT(card->write_front_end_reg == NULL);
        !          3753:        WAN_ASSERT(card->read_front_end_reg == NULL);
        !          3754:
        !          3755:        if (!IS_T1(&card->fe_te.te_cfg)) {
        !          3756:                return 1;
        !          3757:        }
        !          3758:        if (card->front_end_status != FE_CONNECTED) {
        !          3759:                return 1;
        !          3760:        }
        !          3761:        if (bit_test((u_int8_t*)&card->fe_te.te_critical,TE_TIMER_RUNNING))
        !          3762:                return 1;
        !          3763:        if (bit_test((u_int8_t*)&card->fe_te.te_critical,LINELB_WAITING)) {
        !          3764:                log(LOG_DEBUG, "%s: Waiting for loopback signal!\n",
        !          3765:                    card->devname);
        !          3766:        }
        !          3767:        log(LOG_DEBUG, "%s: Sending %s loopback %s signal...\n",
        !          3768:            card->devname, (IS_T1(&card->fe_te.te_cfg) ? "T1" : "E1"),
        !          3769:            (mode == WAN_TE1_ACTIVATE_LB) ?  "activation" : "deactivation");
        !          3770:        card->fe_te.te_tx_lb_cmd = mode;
        !          3771:        card->fe_te.te_tx_lb_cnt = LINELB_CODE_CNT + LINELB_CHANNEL_CNT;
        !          3772:        card->fe_te.te_timer_cmd = TE_LINELB_TIMER;
        !          3773:        bit_set((u_int8_t*)&card->fe_te.te_critical, LINELB_WAITING);
        !          3774:        bit_set((u_int8_t*)&card->fe_te.te_critical, LINELB_CODE_BIT);
        !          3775:        bit_set((u_int8_t*)&card->fe_te.te_critical, LINELB_CHANNEL_BIT);
        !          3776:        sdla_te_enable_timer(card, LINELB_TE1_TIMER);
        !          3777:
        !          3778:        return 0;
        !          3779: }
        !          3780:
        !          3781: int
        !          3782: sdla_te_udp(void *card_id, void *cmd, unsigned char *data)
        !          3783: {
        !          3784:        sdla_t          *card = (sdla_t*)card_id;
        !          3785:        wan_cmd_t       *udp_cmd = (wan_cmd_t*)cmd;
        !          3786:        int     err = 0;
        !          3787:
        !          3788:        switch (udp_cmd->wan_cmd_command) {
        !          3789:        case WAN_GET_MEDIA_TYPE:
        !          3790:                data[0] =
        !          3791:                    IS_T1(&card->fe_te.te_cfg) ? WAN_MEDIA_T1 :
        !          3792:                    IS_E1(&card->fe_te.te_cfg) ? WAN_MEDIA_E1 :
        !          3793:                    WAN_MEDIA_NONE;
        !          3794:                udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
        !          3795:                udp_cmd->wan_cmd_data_len = sizeof(unsigned char);
        !          3796:                break;
        !          3797:
        !          3798:        case WAN_FE_SET_LB_MODE:
        !          3799:                /* Activate/Deactivate Line Loopback modes */
        !          3800:                err = sdla_set_te1_lb_modes(card, data[0], data[1]);
        !          3801:                udp_cmd->wan_cmd_return_code =
        !          3802:                    (!err) ? WAN_CMD_OK : WAN_UDP_FAILED_CMD;
        !          3803:                udp_cmd->wan_cmd_data_len = 0x00;
        !          3804:                break;
        !          3805:
        !          3806:        case WAN_FE_GET_STAT:
        !          3807:                /* TE1_56K Read T1/E1/56K alarms */
        !          3808:                *(unsigned long *)&data[0] = sdla_te_alarm(card, 0);
        !          3809:                /* TE1 Update T1/E1 perfomance counters */
        !          3810:                sdla_te_pmon(card);
        !          3811:                memcpy(&data[sizeof(unsigned long)],
        !          3812:                    &card->fe_te.te_pmon, sizeof(pmc_pmon_t));
        !          3813:                udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
        !          3814:                udp_cmd->wan_cmd_data_len =
        !          3815:                        sizeof(unsigned long) + sizeof(pmc_pmon_t);
        !          3816:
        !          3817:                break;
        !          3818:
        !          3819:        case WAN_FE_FLUSH_PMON:
        !          3820:                /* TE1 Flush T1/E1 pmon counters */
        !          3821:                sdla_flush_te1_pmon(card);
        !          3822:                udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
        !          3823:                break;
        !          3824:
        !          3825:        case WAN_FE_GET_CFG:
        !          3826:                /* Read T1/E1 configuration */
        !          3827:                memcpy(&data[0], &card->fe_te.te_cfg, sizeof(sdla_te_cfg_t));
        !          3828:                udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
        !          3829:                udp_cmd->wan_cmd_data_len = sizeof(sdla_te_cfg_t);
        !          3830:                break;
        !          3831:
        !          3832:        default:
        !          3833:                udp_cmd->wan_cmd_return_code = WAN_UDP_INVALID_CMD;
        !          3834:                udp_cmd->wan_cmd_data_len = 0;
        !          3835:                break;
        !          3836:        }
        !          3837:        return 0;
        !          3838: }
        !          3839:
        !          3840:
        !          3841: void
        !          3842: aft_green_led_ctrl(void *card_id, int mode)
        !          3843: {
        !          3844:        sdla_t *card = (sdla_t*)card_id;
        !          3845:        unsigned char led;
        !          3846:
        !          3847:        if (!card->read_front_end_reg ||
        !          3848:            !card->write_front_end_reg) {
        !          3849:                return;
        !          3850:        }
        !          3851:
        !          3852:        led= READ_REG(REG_GLOBAL_CFG);
        !          3853:
        !          3854:        if (mode == AFT_LED_ON) {
        !          3855:                led&=~(BIT_GLOBAL_PIO);
        !          3856:        } else if (mode == AFT_LED_OFF) {
        !          3857:                led|=BIT_GLOBAL_PIO;
        !          3858:        } else {
        !          3859:                if (led&BIT_GLOBAL_PIO) {
        !          3860:                        led&=~(BIT_GLOBAL_PIO);
        !          3861:                } else {
        !          3862:                        led|=BIT_GLOBAL_PIO;
        !          3863:                }
        !          3864:        }
        !          3865:
        !          3866:        WRITE_REG(REG_GLOBAL_CFG,led);
        !          3867: }

CVSweb