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