root/dev/pci/if_san_te1.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. FIRST_UI
  2. RLPS_EQUALIZER_RAM
  3. ClearTemplate
  4. InitTemplate
  5. InitLineReceiver
  6. ClearTPSCReg
  7. ClearRPSCReg
  8. WriteTPSCReg
  9. ReadTPSCReg
  10. WriteRPSCReg
  11. ReadRPSCReg
  12. DisableAllChannels
  13. EnableAllChannels
  14. EnableTxChannel
  15. EnableRxChannel
  16. DisableTxChannel
  17. DisableRxChannel
  18. sdla_te_defcfg
  19. sdla_te_setcfg
  20. sdla_te_settimeslot
  21. sdla_te_gettimeslot
  22. sdla_te_config
  23. sdla_te_set_intr
  24. sdla_te_unconfig
  25. sdla_te_set_status
  26. sdla_te_alarm
  27. sdla_te_pmon
  28. sdla_flush_te1_pmon
  29. SetLoopBackChannel
  30. sdla_te_intr
  31. sdla_te_tx_intr
  32. sdla_te_rx_intr
  33. sdla_t1_rx_intr
  34. sdla_e1_rx_intr
  35. sdla_set_te1_lb_modes
  36. sdla_te_linelb
  37. sdla_te_paylb
  38. sdla_te_ddlb
  39. sdla_te_timer
  40. sdla_te_enable_timer
  41. sdla_te_polling
  42. sdla_te_lb
  43. sdla_te_udp
  44. aft_green_led_ctrl

    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 }

/* [<][>][^][v][top][bottom][index][help] */