wanpipe/patches/kdrivers/src/net/sdla_te1.c

7733 lines
233 KiB
C

/*
* Copyright (c) 2001
* Alex Feldman <al.feldman@sangoma.com>. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Alex Feldman.
* 4. Neither the name of the author nor the names of any co-contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY Alex Feldman AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL Alex Feldman OR THE VOICES IN HIS HEAD
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: sdla_te1.c,v 1.287 2008-03-28 13:49:53 sangoma Exp $
*/
/*
*******************************************************************************
** sdla_te1.c WANPIPE(tm) Multiprotocol WAN Link Driver.
** T1/E1 board configuration.
**
** Author: Alex Feldman <al.feldman@sangoma.com>
**
** ============================================================================
** Aprl 29, 2001 Alex Feldman Initial version.
** Mar 7, 2007 Alex Feldman Remove Squence option. Some equipment
** doesn't like it.
** Nov 16, 2007 Alex Feldman Enable SQUELCHE bit in RLPS register.
** In some cases, LOS/ALOS is going crazy
** while cable doesn't have termination.
** (specialy for A102 old cards)
** Nov 21, 2007 Alex Feldman Add LOS Alarm for link state verification
** in Unframed mode.
******************************************************************************/
/******************************************************************************
* INCLUDE FILES
******************************************************************************/
# include "wanpipe_includes.h"
# include "wanpipe_defines.h"
# include "wanpipe_debug.h"
# include "wanproc.h"
# if !defined(CONFIG_PRODUCT_WANPIPE_GENERIC)
# include "wanpipe_snmp.h"
# endif
# include "sdla_te1_pmc.h"
# include "wanpipe.h" /* WANPIPE common user API definitions */
/******************************************************************************
* DEFINES AND MACROS
******************************************************************************/
#define WAN_TE1_IGNORE_RLPS_ALOS
#if 0
# define FE_ALOS_ENABLE
# define FE_LOS_ENABLE
# define FE_OOF_PRINT
# define FE_LOS_PRINT
# define FE_ALOS_PRINT
#endif
#define FIRST_SAMPLE 0
#define LAST_SAMPLE 23
#define FIRST_UI 0
#define LAST_UI 4
#define MAX_BUSY_READ 0x05
/* Read/Write to front-end register */
static int te_reg_verify = 0;
#define WRITE_REG(reg,val) \
if (te_reg_verify){\
unsigned char current_val;\
current_val=fe->read_fe_reg( \
((sdla_t*)fe->card)->hw, \
(int)(((sdla_t*)fe->card)->wandev.state==WAN_CONNECTED), \
(int)fe->fe_cfg.line_no, \
(int)((reg) + (fe->fe_cfg.line_no*PMC4_LINE_DELTA)));\
DEBUG_EVENT("%s: Writing Reg:%02X=%02X (%02X)\n", \
fe->name,(unsigned char)(reg),(unsigned char)(val),current_val);\
}\
fe->write_fe_reg( \
((sdla_t*)fe->card)->hw, \
(int)(((sdla_t*)fe->card)->wandev.state==WAN_CONNECTED), \
(int)fe->fe_cfg.line_no, \
(int)((reg) + (fe->fe_cfg.line_no*PMC4_LINE_DELTA)), \
(int)(val))
#define WRITE_REG_LINE(fe_line_no, reg,val) \
fe->write_fe_reg( \
((sdla_t*)fe->card)->hw, \
(int)(((sdla_t*)fe->card)->wandev.state==WAN_CONNECTED), \
(int)fe_line_no, \
(int)((reg) + (fe_line_no)*PMC4_LINE_DELTA), \
(int)(val))
#define READ_REG(reg) \
fe->read_fe_reg( \
((sdla_t*)fe->card)->hw, \
(int)(((sdla_t*)fe->card)->wandev.state==WAN_CONNECTED), \
(int)fe->fe_cfg.line_no, \
(int)((reg) + (fe->fe_cfg.line_no*PMC4_LINE_DELTA)))
#define READ_REG_LINE(fe_line_no, reg) \
fe->read_fe_reg( \
((sdla_t*)fe->card)->hw, \
(int)(((sdla_t*)fe->card)->wandev.state==WAN_CONNECTED), \
(int)fe_line_no, \
(int)((reg) + (fe_line_no)*PMC4_LINE_DELTA))
/* Enabling/Disabling register debugging */
#undef WAN_DEBUG_TE1_REG
#ifdef WAN_DEBUG_TE1_REG
# define TEST_REG(reg,value){ \
unsigned char test_value = READ_REG(reg); \
if (test_value != value){ \
DEBUG_EVENT("%s:%d: Test Failed\n", \
__FILE__,__LINE__); \
DEBUG_EVENT("%s:%d: (Reg=%02x, Val=%02x)\n", \
reg, value); \
} \
}
# define TEST_RPSC_REG(fe,reg,channel,value){ \
unsigned char test_value = ReadRPSCReg(fe,channel,reg); \
if (test_value != value){ \
DEBUG_EVENT("%s:%d: RPSC Test Failed\n", \
__FILE__, __LINE__); \
DEBUG_EVENT("%s:%d: (Reg=%02x,Channel=%d,Val=%02x)\n", \
reg, channel, value); \
} \
}
# define TEST_TPSC_REG(fe,reg,channel,value){ \
unsigned char test_value = ReadTPSCReg(fe,channel,reg); \
if (test_value != value){ \
DEBUG_EVENT("%s:%d: TPSC Test Failed\n", \
__FILE__, __LINE__); \
DEBUG_EVENT("%s:%d: (Reg=%02x,Channel=%d,Val=%02x)\n", \
reg, channel, value); \
} \
}
#else
# define TEST_REG(reg,value)
# define TEST_RPSC_REG(fe,reg,channel,value)
# define TEST_TPSC_REG(fe,reg,channel,value)
#endif
#define READ_RPSC_REG(reg,channel) ReadRPSCReg(fe,reg,channel)
#define READ_TPSC_REG(reg,channel) ReadTPSCReg(fe,reg,channel)
#define READ_SIGX_REG(reg,channel) ReadSIGXReg(fe,reg,channel)
#define WRITE_RPSC_REG(reg,channel,value) \
{ \
WriteRPSCReg(fe,reg,channel,(unsigned char)value); \
TEST_RPSC_REG(fe,reg,channel,(unsigned char)value); \
}
#define WRITE_TPSC_REG(reg,channel,value) \
{ \
WriteTPSCReg(fe,reg,channel,(unsigned char)value); \
TEST_TPSC_REG(fe,reg,channe,(unsigned char)value); \
}
#if 0
#define WRITE_SIGX_REG(reg,channel,value) \
{ \
WriteSIGXReg(fe,reg,channel,(unsigned char)value); \
TEST_SIGX_REG(fe,reg,channel,(unsigned char)value); \
}
#endif
#define WAN_TE1_FRAMED_ALARMS (WAN_TE_BIT_ALARM_RED | WAN_TE_BIT_ALARM_LOF)
/* Nov 21, 2007 AF */
#define WAN_TE1_UNFRAMED_ALARMS (WAN_TE_BIT_ALARM_RED|WAN_TE_BIT_ALARM_LOS)
#if 0
#define TE1_FRAME_ALARM (\
WAN_TE_BIT_ALARM_RED | \
WAN_TE_BIT_ALARM_AIS | \
WAN_TE_BIT_ALARM_OOF | \
WAN_TE_BIT_ALARM_LOS)
#define TE1_UNFRAME_ALARM (\
WAN_TE_BIT_ALARM_RED | \
WAN_TE_BIT_ALARM_AIS | \
WAN_TE_BIT_ALARM_LOS)
#endif
/******************************************************************************
* STRUCTURES AND TYPEDEFS
******************************************************************************/
typedef unsigned char TX_WAVEFORM[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1];
typedef struct RLPS_EQUALIZER_RAM_T {
/*unsigned char address;*/
unsigned char byte1;
unsigned char byte2;
unsigned char byte3;
unsigned char byte4;
} RLPS_EQUALIZER_RAM;
/*
******************************************************************************
GLOBAL VARIABLES
******************************************************************************
*/
/* Transmit Waveform Values for T1 Long Haul (LBO 0db)
* unsigned char t1_tx_waveform_lh_0db[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] =
*/
TX_WAVEFORM pmc_t1_tx_waveform_lh_0db =
{
{ 0x00, 0x44, 0x00, 0x00, 0x00 },
{ 0x0A, 0x44, 0x00, 0x00, 0x00 },
{ 0x20, 0x43, 0x00, 0x00, 0x00 },
{ 0x32, 0x43, 0x00, 0x00, 0x00 },
{ 0x3E, 0x42, 0x00, 0x00, 0x00 },
{ 0x3D, 0x42, 0x00, 0x00, 0x00 },
{ 0x3C, 0x41, 0x00, 0x00, 0x00 },
{ 0x3B, 0x41, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x39, 0x00, 0x00, 0x00, 0x00 },
{ 0x39, 0x00, 0x00, 0x00, 0x00 },
{ 0x38, 0x00, 0x00, 0x00, 0x00 },
{ 0x37, 0x00, 0x00, 0x00, 0x00 },
{ 0x36, 0x00, 0x00, 0x00, 0x00 },
{ 0x34, 0x00, 0x00, 0x00, 0x00 },
{ 0x29, 0x00, 0x00, 0x00, 0x00 },
{ 0x4F, 0x00, 0x00, 0x00, 0x00 },
{ 0x4C, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x49, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 },
{ 0x46, 0x00, 0x00, 0x00, 0x00 },
{ 0x46, 0x00, 0x00, 0x00, 0x00 }
};
TX_WAVEFORM pmc4_t1_tx_waveform_lh_0db =
{
{ 0x00, 0x46, 0x00, 0x00, 0x00 },
{ 0x0A, 0x45, 0x00, 0x00, 0x00 },
{ 0x20, 0x43, 0x00, 0x00, 0x00 },
{ 0x32, 0x41, 0x00, 0x00, 0x00 },
{ 0x3E, 0x40, 0x00, 0x00, 0x00 },
{ 0x3D, 0x40, 0x00, 0x00, 0x00 },
{ 0x3C, 0x00, 0x00, 0x00, 0x00 },
{ 0x3B, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x39, 0x00, 0x00, 0x00, 0x00 },
{ 0x39, 0x00, 0x00, 0x00, 0x00 },
{ 0x38, 0x00, 0x00, 0x00, 0x00 },
{ 0x37, 0x00, 0x00, 0x00, 0x00 },
{ 0x36, 0x00, 0x00, 0x00, 0x00 },
{ 0x30, 0x00, 0x00, 0x00, 0x00 },
{ 0x10, 0x00, 0x00, 0x00, 0x00 },
{ 0x49, 0x00, 0x00, 0x00, 0x00 },
{ 0x51, 0x00, 0x00, 0x00, 0x00 },
{ 0x50, 0x00, 0x00, 0x00, 0x00 },
{ 0x4E, 0x00, 0x00, 0x00, 0x00 },
{ 0x4C, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x48, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 }
};
/* Transmit Waveform Values for T1 Long Haul (LBO 7.5 dB):
* unsigned char t1_tx_waveform_lh_75db[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] =
*/
TX_WAVEFORM pmc_t1_tx_waveform_lh_75db =
{
{ 0x00, 0x10, 0x00, 0x00, 0x00 },
{ 0x01, 0x0E, 0x00, 0x00, 0x00 },
{ 0x02, 0x0C, 0x00, 0x00, 0x00 },
{ 0x04, 0x0A, 0x00, 0x00, 0x00 },
{ 0x08, 0x08, 0x00, 0x00, 0x00 },
{ 0x0C, 0x06, 0x00, 0x00, 0x00 },
{ 0x10, 0x04, 0x00, 0x00, 0x00 },
{ 0x16, 0x02, 0x00, 0x00, 0x00 },
{ 0x1A, 0x01, 0x00, 0x00, 0x00 },
{ 0x1E, 0x00, 0x00, 0x00, 0x00 },
{ 0x22, 0x00, 0x00, 0x00, 0x00 },
{ 0x26, 0x00, 0x00, 0x00, 0x00 },
{ 0x2A, 0x00, 0x00, 0x00, 0x00 },
{ 0x2B, 0x00, 0x00, 0x00, 0x00 },
{ 0x2C, 0x00, 0x00, 0x00, 0x00 },
{ 0x2D, 0x00, 0x00, 0x00, 0x00 },
{ 0x2C, 0x00, 0x00, 0x00, 0x00 },
{ 0x28, 0x00, 0x00, 0x00, 0x00 },
{ 0x24, 0x00, 0x00, 0x00, 0x00 },
{ 0x20, 0x00, 0x00, 0x00, 0x00 },
{ 0x1C, 0x00, 0x00, 0x00, 0x00 },
{ 0x18, 0x00, 0x00, 0x00, 0x00 },
{ 0x14, 0x00, 0x00, 0x00, 0x00 },
{ 0x12, 0x00, 0x00, 0x00, 0x00 }
};
TX_WAVEFORM pmc4_t1_tx_waveform_lh_75db =
{
{ 0x00, 0x10, 0x00, 0x00, 0x00 },
{ 0x01, 0x0E, 0x00, 0x00, 0x00 },
{ 0x02, 0x0C, 0x00, 0x00, 0x00 },
{ 0x04, 0x0A, 0x00, 0x00, 0x00 },
{ 0x08, 0x08, 0x00, 0x00, 0x00 },
{ 0x0C, 0x06, 0x00, 0x00, 0x00 },
{ 0x10, 0x04, 0x00, 0x00, 0x00 },
{ 0x16, 0x02, 0x00, 0x00, 0x00 },
{ 0x1A, 0x01, 0x00, 0x00, 0x00 },
{ 0x1E, 0x00, 0x00, 0x00, 0x00 },
{ 0x22, 0x00, 0x00, 0x00, 0x00 },
{ 0x26, 0x00, 0x00, 0x00, 0x00 },
{ 0x2A, 0x00, 0x00, 0x00, 0x00 },
{ 0x2B, 0x00, 0x00, 0x00, 0x00 },
{ 0x2C, 0x00, 0x00, 0x00, 0x00 },
{ 0x2D, 0x00, 0x00, 0x00, 0x00 },
{ 0x2C, 0x00, 0x00, 0x00, 0x00 },
{ 0x28, 0x00, 0x00, 0x00, 0x00 },
{ 0x24, 0x00, 0x00, 0x00, 0x00 },
{ 0x20, 0x00, 0x00, 0x00, 0x00 },
{ 0x1C, 0x00, 0x00, 0x00, 0x00 },
{ 0x18, 0x00, 0x00, 0x00, 0x00 },
{ 0x14, 0x00, 0x00, 0x00, 0x00 },
{ 0x12, 0x00, 0x00, 0x00, 0x00 }
};
/* Transmit Waveform Values for T1 Long Haul (LBO 15 dB)
* unsigned char t1_tx_waveform_lh_15db[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] =
*/
TX_WAVEFORM pmc_t1_tx_waveform_lh_15db =
{
{ 0x00, 0x2A, 0x09, 0x01, 0x00 },
{ 0x00, 0x28, 0x08, 0x01, 0x00 },
{ 0x00, 0x26, 0x08, 0x01, 0x00 },
{ 0x00, 0x24, 0x07, 0x01, 0x00 },
{ 0x01, 0x22, 0x07, 0x01, 0x00 },
{ 0x02, 0x20, 0x06, 0x01, 0x00 },
{ 0x04, 0x1E, 0x06, 0x01, 0x00 },
{ 0x07, 0x1C, 0x05, 0x00, 0x00 },
{ 0x0A, 0x1B, 0x05, 0x00, 0x00 },
{ 0x0D, 0x19, 0x05, 0x00, 0x00 },
{ 0x10, 0x18, 0x04, 0x00, 0x00 },
{ 0x14, 0x16, 0x04, 0x00, 0x00 },
{ 0x18, 0x15, 0x04, 0x00, 0x00 },
{ 0x1B, 0x13, 0x03, 0x00, 0x00 },
{ 0x1E, 0x12, 0x03, 0x00, 0x00 },
{ 0x21, 0x10, 0x03, 0x00, 0x00 },
{ 0x24, 0x0F, 0x03, 0x00, 0x00 },
{ 0x27, 0x0D, 0x03, 0x00, 0x00 },
{ 0x2A, 0x0D, 0x02, 0x00, 0x00 },
{ 0x2D, 0x0B, 0x02, 0x00, 0x00 },
{ 0x30, 0x0B, 0x02, 0x00, 0x00 },
{ 0x30, 0x0A, 0x02, 0x00, 0x00 },
{ 0x2E, 0x0A, 0x02, 0x00, 0x00 },
{ 0x2C, 0x09, 0x02, 0x00, 0x00 }
};
TX_WAVEFORM pmc4_t1_tx_waveform_lh_15db =
{
{ 0x00, 0x2A, 0x09, 0x01, 0x00 },
{ 0x00, 0x28, 0x08, 0x01, 0x00 },
{ 0x00, 0x26, 0x08, 0x01, 0x00 },
{ 0x00, 0x24, 0x07, 0x01, 0x00 },
{ 0x01, 0x22, 0x07, 0x01, 0x00 },
{ 0x02, 0x20, 0x06, 0x01, 0x00 },
{ 0x04, 0x1E, 0x06, 0x01, 0x00 },
{ 0x07, 0x1C, 0x05, 0x00, 0x00 },
{ 0x0A, 0x1B, 0x05, 0x00, 0x00 },
{ 0x0D, 0x19, 0x05, 0x00, 0x00 },
{ 0x10, 0x18, 0x04, 0x00, 0x00 },
{ 0x14, 0x16, 0x04, 0x00, 0x00 },
{ 0x18, 0x15, 0x04, 0x00, 0x00 },
{ 0x1B, 0x13, 0x03, 0x00, 0x00 },
{ 0x1E, 0x12, 0x03, 0x00, 0x00 },
{ 0x21, 0x10, 0x03, 0x00, 0x00 },
{ 0x24, 0x0F, 0x03, 0x00, 0x00 },
{ 0x27, 0x0D, 0x03, 0x00, 0x00 },
{ 0x2A, 0x0D, 0x02, 0x00, 0x00 },
{ 0x2D, 0x0B, 0x02, 0x00, 0x00 },
{ 0x30, 0x0B, 0x02, 0x00, 0x00 },
{ 0x30, 0x0A, 0x02, 0x00, 0x00 },
{ 0x2E, 0x0A, 0x02, 0x00, 0x00 },
{ 0x2C, 0x09, 0x02, 0x00, 0x00 }
};
/* Transmit Waveform Values for T1 Long Haul (LBO 22.5 dB)
* unsigned char t1_tx_waveform_lh_225db[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] =
*/
TX_WAVEFORM pmc_t1_tx_waveform_lh_225db =
{
{ 0x00, 0x1F, 0x16, 0x06, 0x01 },
{ 0x00, 0x20, 0x15, 0x05, 0x01 },
{ 0x00, 0x21, 0x15, 0x05, 0x01 },
{ 0x00, 0x22, 0x14, 0x05, 0x01 },
{ 0x00, 0x22, 0x13, 0x04, 0x00 },
{ 0x00, 0x23, 0x12, 0x04, 0x00 },
{ 0x01, 0x23, 0x12, 0x04, 0x00 },
{ 0x01, 0x24, 0x11, 0x03, 0x00 },
{ 0x01, 0x23, 0x10, 0x03, 0x00 },
{ 0x02, 0x23, 0x10, 0x03, 0x00 },
{ 0x03, 0x22, 0x0F, 0x03, 0x00 },
{ 0x05, 0x22, 0x0E, 0x03, 0x00 },
{ 0x07, 0x21, 0x0E, 0x02, 0x00 },
{ 0x09, 0x20, 0x0D, 0x02, 0x00 },
{ 0x0B, 0x1E, 0x0C, 0x02, 0x00 },
{ 0x0E, 0x1D, 0x0C, 0x02, 0x00 },
{ 0x10, 0x1B, 0x0B, 0x02, 0x00 },
{ 0x13, 0x1B, 0x0A, 0x02, 0x00 },
{ 0x15, 0x1A, 0x0A, 0x02, 0x00 },
{ 0x17, 0x19, 0x09, 0x01, 0x00 },
{ 0x19, 0x19, 0x08, 0x01, 0x00 },
{ 0x1B, 0x18, 0x08, 0x01, 0x00 },
{ 0x1D, 0x17, 0x07, 0x01, 0x00 },
{ 0x1E, 0x17, 0x06, 0x01, 0x00 }
};
TX_WAVEFORM pmc4_t1_tx_waveform_lh_225db =
{
{ 0x00, 0x1F, 0x16, 0x06, 0x01 },
{ 0x00, 0x20, 0x15, 0x05, 0x01 },
{ 0x00, 0x21, 0x15, 0x05, 0x01 },
{ 0x00, 0x22, 0x14, 0x05, 0x01 },
{ 0x00, 0x22, 0x13, 0x04, 0x00 },
{ 0x00, 0x23, 0x12, 0x04, 0x00 },
{ 0x01, 0x23, 0x12, 0x04, 0x00 },
{ 0x01, 0x24, 0x11, 0x03, 0x00 },
{ 0x01, 0x23, 0x10, 0x03, 0x00 },
{ 0x02, 0x23, 0x10, 0x03, 0x00 },
{ 0x03, 0x22, 0x0F, 0x03, 0x00 },
{ 0x05, 0x22, 0x0E, 0x03, 0x00 },
{ 0x07, 0x21, 0x0E, 0x02, 0x00 },
{ 0x09, 0x20, 0x0D, 0x02, 0x00 },
{ 0x0B, 0x1E, 0x0C, 0x02, 0x00 },
{ 0x0E, 0x1D, 0x0C, 0x02, 0x00 },
{ 0x10, 0x1B, 0x0B, 0x02, 0x00 },
{ 0x13, 0x1B, 0x0A, 0x02, 0x00 },
{ 0x15, 0x1A, 0x0A, 0x02, 0x00 },
{ 0x17, 0x19, 0x09, 0x01, 0x00 },
{ 0x19, 0x19, 0x08, 0x01, 0x00 },
{ 0x1B, 0x18, 0x08, 0x01, 0x00 },
{ 0x1D, 0x17, 0x07, 0x01, 0x00 },
{ 0x1E, 0x17, 0x06, 0x01, 0x00 }
};
/* Transmit Waveform Values for T1 Short Haul (0 - 110 ft.)
* unsigned char t1_tx_waveform_sh_110ft[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] =
*/
TX_WAVEFORM pmc_t1_tx_waveform_sh_110ft =
{
{ 0x00, 0x45, 0x00, 0x00, 0x00 },
{ 0x0A, 0x44, 0x00, 0x00, 0x00 },
{ 0x20, 0x43, 0x00, 0x00, 0x00 },
{ 0x3F, 0x43, 0x00, 0x00, 0x00 },
{ 0x3F, 0x42, 0x00, 0x00, 0x00 },
{ 0x3F, 0x42, 0x00, 0x00, 0x00 },
{ 0x3C, 0x41, 0x00, 0x00, 0x00 },
{ 0x3B, 0x41, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x39, 0x00, 0x00, 0x00, 0x00 },
{ 0x39, 0x00, 0x00, 0x00, 0x00 },
{ 0x38, 0x00, 0x00, 0x00, 0x00 },
{ 0x37, 0x00, 0x00, 0x00, 0x00 },
{ 0x36, 0x00, 0x00, 0x00, 0x00 },
{ 0x34, 0x00, 0x00, 0x00, 0x00 },
{ 0x29, 0x00, 0x00, 0x00, 0x00 },
{ 0x59, 0x00, 0x00, 0x00, 0x00 },
{ 0x55, 0x00, 0x00, 0x00, 0x00 },
{ 0x50, 0x00, 0x00, 0x00, 0x00 },
{ 0x4D, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x48, 0x00, 0x00, 0x00, 0x00 },
{ 0x46, 0x00, 0x00, 0x00, 0x00 },
{ 0x46, 0x00, 0x00, 0x00, 0x00 }
};
TX_WAVEFORM pmc4_t1_tx_waveform_sh_110ft =
{
{ 0x00, 0x46, 0x00, 0x00, 0x00 },
{ 0x0A, 0x45, 0x00, 0x00, 0x00 },
{ 0x20, 0x43, 0x00, 0x00, 0x00 },
{ 0x3D, 0x41, 0x00, 0x00, 0x00 },
{ 0x3D, 0x40, 0x00, 0x00, 0x00 },
{ 0x3C, 0x40, 0x00, 0x00, 0x00 },
{ 0x3C, 0x00, 0x00, 0x00, 0x00 },
{ 0x3B, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x39, 0x00, 0x00, 0x00, 0x00 },
{ 0x39, 0x00, 0x00, 0x00, 0x00 },
{ 0x38, 0x00, 0x00, 0x00, 0x00 },
{ 0x37, 0x00, 0x00, 0x00, 0x00 },
{ 0x36, 0x00, 0x00, 0x00, 0x00 },
{ 0x30, 0x00, 0x00, 0x00, 0x00 },
{ 0x10, 0x00, 0x00, 0x00, 0x00 },
{ 0x58, 0x00, 0x00, 0x00, 0x00 },
{ 0x53, 0x00, 0x00, 0x00, 0x00 },
{ 0x50, 0x00, 0x00, 0x00, 0x00 },
{ 0x4E, 0x00, 0x00, 0x00, 0x00 },
{ 0x4C, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x48, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 }
};
/* Transmit Waveform Values for T1 Short Haul (110 - 220 ft.)
* unsigned char t1_tx_waveform_sh_220ft[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] =
*/
TX_WAVEFORM pmc_t1_tx_waveform_sh_220ft =
{
{ 0x00, 0x44, 0x00, 0x00, 0x00 },
{ 0x0A, 0x44, 0x00, 0x00, 0x00 },
{ 0x3F, 0x43, 0x00, 0x00, 0x00 },
{ 0x3F, 0x43, 0x00, 0x00, 0x00 },
{ 0x36, 0x42, 0x00, 0x00, 0x00 },
{ 0x34, 0x42, 0x00, 0x00, 0x00 },
{ 0x30, 0x41, 0x00, 0x00, 0x00 },
{ 0x2F, 0x41, 0x00, 0x00, 0x00 },
{ 0x2E, 0x00, 0x00, 0x00, 0x00 },
{ 0x2D, 0x00, 0x00, 0x00, 0x00 },
{ 0x2C, 0x00, 0x00, 0x00, 0x00 },
{ 0x2B, 0x00, 0x00, 0x00, 0x00 },
{ 0x2A, 0x00, 0x00, 0x00, 0x00 },
{ 0x28, 0x00, 0x00, 0x00, 0x00 },
{ 0x26, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x68, 0x00, 0x00, 0x00, 0x00 },
{ 0x54, 0x00, 0x00, 0x00, 0x00 },
{ 0x4F, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x49, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 },
{ 0x46, 0x00, 0x00, 0x00, 0x00 }
};
TX_WAVEFORM pmc4_t1_tx_waveform_sh_220ft =
{
{ 0x00, 0x45, 0x00, 0x00, 0x00 },
{ 0x0A, 0x44, 0x00, 0x00, 0x00 },
{ 0x33, 0x42, 0x00, 0x00, 0x00 },
{ 0x33, 0x41, 0x00, 0x00, 0x00 },
{ 0x33, 0x40, 0x00, 0x00, 0x00 },
{ 0x33, 0x40, 0x00, 0x00, 0x00 },
{ 0x30, 0x00, 0x00, 0x00, 0x00 },
{ 0x2F, 0x00, 0x00, 0x00, 0x00 },
{ 0x2E, 0x00, 0x00, 0x00, 0x00 },
{ 0x2D, 0x00, 0x00, 0x00, 0x00 },
{ 0x2C, 0x00, 0x00, 0x00, 0x00 },
{ 0x2B, 0x00, 0x00, 0x00, 0x00 },
{ 0x2A, 0x00, 0x00, 0x00, 0x00 },
{ 0x29, 0x00, 0x00, 0x00, 0x00 },
{ 0x19, 0x00, 0x00, 0x00, 0x00 },
{ 0x5A, 0x00, 0x00, 0x00, 0x00 },
{ 0x54, 0x00, 0x00, 0x00, 0x00 },
{ 0x50, 0x00, 0x00, 0x00, 0x00 },
{ 0x4E, 0x00, 0x00, 0x00, 0x00 },
{ 0x4C, 0x00, 0x00, 0x00, 0x00 },
{ 0x4B, 0x00, 0x00, 0x00, 0x00 },
{ 0x48, 0x00, 0x00, 0x00, 0x00 },
{ 0x48, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 }
};
/* Transmit Waveform Values for T1 Short Haul (220 - 330 ft.)
* unsigned char t1_tx_waveform_sh_330ft[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] =
*/
TX_WAVEFORM pmc_t1_tx_waveform_sh_330ft =
{
{ 0x00, 0x44, 0x00, 0x00, 0x00 },
{ 0x0A, 0x44, 0x00, 0x00, 0x00 },
{ 0x3F, 0x43, 0x00, 0x00, 0x00 },
{ 0x3A, 0x43, 0x00, 0x00, 0x00 },
{ 0x3A, 0x42, 0x00, 0x00, 0x00 },
{ 0x38, 0x42, 0x00, 0x00, 0x00 },
{ 0x30, 0x41, 0x00, 0x00, 0x00 },
{ 0x2F, 0x41, 0x00, 0x00, 0x00 },
{ 0x2E, 0x00, 0x00, 0x00, 0x00 },
{ 0x2D, 0x00, 0x00, 0x00, 0x00 },
{ 0x2C, 0x00, 0x00, 0x00, 0x00 },
{ 0x2B, 0x00, 0x00, 0x00, 0x00 },
{ 0x2A, 0x00, 0x00, 0x00, 0x00 },
{ 0x29, 0x00, 0x00, 0x00, 0x00 },
{ 0x23, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x6C, 0x00, 0x00, 0x00, 0x00 },
{ 0x60, 0x00, 0x00, 0x00, 0x00 },
{ 0x4F, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x49, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 },
{ 0x46, 0x00, 0x00, 0x00, 0x00 }
};
TX_WAVEFORM pmc4_t1_tx_waveform_sh_330ft =
{
{ 0x00, 0x45, 0x00, 0x00, 0x00 },
{ 0x0A, 0x44, 0x00, 0x00, 0x00 },
{ 0x36, 0x43, 0x00, 0x00, 0x00 },
{ 0x36, 0x41, 0x00, 0x00, 0x00 },
{ 0x34, 0x40, 0x00, 0x00, 0x00 },
{ 0x34, 0x40, 0x00, 0x00, 0x00 },
{ 0x30, 0x00, 0x00, 0x00, 0x00 },
{ 0x2F, 0x00, 0x00, 0x00, 0x00 },
{ 0x2E, 0x00, 0x00, 0x00, 0x00 },
{ 0x2D, 0x00, 0x00, 0x00, 0x00 },
{ 0x2C, 0x00, 0x00, 0x00, 0x00 },
{ 0x2B, 0x00, 0x00, 0x00, 0x00 },
{ 0x2A, 0x00, 0x00, 0x00, 0x00 },
{ 0x29, 0x00, 0x00, 0x00, 0x00 },
{ 0x23, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x60, 0x00, 0x00, 0x00, 0x00 },
{ 0x55, 0x00, 0x00, 0x00, 0x00 },
{ 0x53, 0x00, 0x00, 0x00, 0x00 },
{ 0x50, 0x00, 0x00, 0x00, 0x00 },
{ 0x4E, 0x00, 0x00, 0x00, 0x00 },
{ 0x4C, 0x00, 0x00, 0x00, 0x00 },
{ 0x48, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 }
};
/* Transmit Waveform Values for T1 Short Haul (330 - 440 ft.)
* unsigned char t1_tx_waveform_sh_440ft[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] =
*/
TX_WAVEFORM pmc_t1_tx_waveform_sh_440ft =
{
{ 0x00, 0x44, 0x00, 0x00, 0x00 },
{ 0x0A, 0x44, 0x00, 0x00, 0x00 },
{ 0x3F, 0x43, 0x00, 0x00, 0x00 },
{ 0x3F, 0x43, 0x00, 0x00, 0x00 },
{ 0x3F, 0x42, 0x00, 0x00, 0x00 },
{ 0x3F, 0x42, 0x00, 0x00, 0x00 },
{ 0x2F, 0x41, 0x00, 0x00, 0x00 },
{ 0x2E, 0x41, 0x00, 0x00, 0x00 },
{ 0x2D, 0x00, 0x00, 0x00, 0x00 },
{ 0x2C, 0x00, 0x00, 0x00, 0x00 },
{ 0x2B, 0x00, 0x00, 0x00, 0x00 },
{ 0x2A, 0x00, 0x00, 0x00, 0x00 },
{ 0x29, 0x00, 0x00, 0x00, 0x00 },
{ 0x28, 0x00, 0x00, 0x00, 0x00 },
{ 0x19, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x7F, 0x00, 0x00, 0x00, 0x00 },
{ 0x60, 0x00, 0x00, 0x00, 0x00 },
{ 0x4F, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x49, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 },
{ 0x46, 0x00, 0x00, 0x00, 0x00 }
};
TX_WAVEFORM pmc4_t1_tx_waveform_sh_440ft =
{
{ 0x00, 0x46, 0x00, 0x00, 0x00 },
{ 0x0A, 0x45, 0x00, 0x00, 0x00 },
{ 0x3A, 0x43, 0x00, 0x00, 0x00 },
{ 0x3A, 0x41, 0x00, 0x00, 0x00 },
{ 0x37, 0x40, 0x00, 0x00, 0x00 },
{ 0x37, 0x40, 0x00, 0x00, 0x00 },
{ 0x2F, 0x00, 0x00, 0x00, 0x00 },
{ 0x2E, 0x00, 0x00, 0x00, 0x00 },
{ 0x2D, 0x00, 0x00, 0x00, 0x00 },
{ 0x2C, 0x00, 0x00, 0x00, 0x00 },
{ 0x2B, 0x00, 0x00, 0x00, 0x00 },
{ 0x2A, 0x00, 0x00, 0x00, 0x00 },
{ 0x29, 0x00, 0x00, 0x00, 0x00 },
{ 0x28, 0x00, 0x00, 0x00, 0x00 },
{ 0x19, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x64, 0x00, 0x00, 0x00, 0x00 },
{ 0x57, 0x00, 0x00, 0x00, 0x00 },
{ 0x53, 0x00, 0x00, 0x00, 0x00 },
{ 0x4F, 0x00, 0x00, 0x00, 0x00 },
{ 0x4C, 0x00, 0x00, 0x00, 0x00 },
{ 0x4B, 0x00, 0x00, 0x00, 0x00 },
{ 0x48, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 }
};
/* Transmit Waveform Values for T1 Short Haul (440 - 550 ft.)
* unsigned char t1_tx_waveform_sh_550ft[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] =
*/
TX_WAVEFORM pmc_t1_tx_waveform_sh_550ft =
{
{ 0x00, 0x44, 0x00, 0x00, 0x00 },
{ 0x0A, 0x44, 0x00, 0x00, 0x00 },
{ 0x3F, 0x43, 0x00, 0x00, 0x00 },
{ 0x3F, 0x43, 0x00, 0x00, 0x00 },
{ 0x3F, 0x42, 0x00, 0x00, 0x00 },
{ 0x3F, 0x42, 0x00, 0x00, 0x00 },
{ 0x30, 0x41, 0x00, 0x00, 0x00 },
{ 0x2B, 0x41, 0x00, 0x00, 0x00 },
{ 0x2A, 0x00, 0x00, 0x00, 0x00 },
{ 0x29, 0x00, 0x00, 0x00, 0x00 },
{ 0x28, 0x00, 0x00, 0x00, 0x00 },
{ 0x27, 0x00, 0x00, 0x00, 0x00 },
{ 0x26, 0x00, 0x00, 0x00, 0x00 },
{ 0x26, 0x00, 0x00, 0x00, 0x00 },
{ 0x24, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x7F, 0x00, 0x00, 0x00, 0x00 },
{ 0x7F, 0x00, 0x00, 0x00, 0x00 },
{ 0x4F, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x49, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 },
{ 0x46, 0x00, 0x00, 0x00, 0x00 }
};
TX_WAVEFORM pmc4_t1_tx_waveform_sh_550ft =
{
{ 0x00, 0x46, 0x00, 0x00, 0x00 },
{ 0x0A, 0x45, 0x00, 0x00, 0x00 },
{ 0x3E, 0x43, 0x00, 0x00, 0x00 },
{ 0x3E, 0x41, 0x00, 0x00, 0x00 },
{ 0x3E, 0x40, 0x00, 0x00, 0x00 },
{ 0x30, 0x40, 0x00, 0x00, 0x00 },
{ 0x30, 0x00, 0x00, 0x00, 0x00 },
{ 0x2B, 0x00, 0x00, 0x00, 0x00 },
{ 0x2A, 0x00, 0x00, 0x00, 0x00 },
{ 0x29, 0x00, 0x00, 0x00, 0x00 },
{ 0x28, 0x00, 0x00, 0x00, 0x00 },
{ 0x27, 0x00, 0x00, 0x00, 0x00 },
{ 0x26, 0x00, 0x00, 0x00, 0x00 },
{ 0x24, 0x00, 0x00, 0x00, 0x00 },
{ 0x19, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x78, 0x00, 0x00, 0x00, 0x00 },
{ 0x57, 0x00, 0x00, 0x00, 0x00 },
{ 0x53, 0x00, 0x00, 0x00, 0x00 },
{ 0x4F, 0x00, 0x00, 0x00, 0x00 },
{ 0x4C, 0x00, 0x00, 0x00, 0x00 },
{ 0x4B, 0x00, 0x00, 0x00, 0x00 },
{ 0x48, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 }
};
/* Transmit Waveform Values for T1 Short Haul (550 - 660 ft.)
* unsigned char t1_tx_waveform_sh_660ft[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] =
*/
TX_WAVEFORM pmc_t1_tx_waveform_sh_660ft =
{
{ 0x00, 0x44, 0x00, 0x00, 0x00 },
{ 0x0A, 0x44, 0x00, 0x00, 0x00 },
{ 0x3F, 0x43, 0x00, 0x00, 0x00 },
{ 0x3F, 0x43, 0x00, 0x00, 0x00 },
{ 0x3F, 0x42, 0x00, 0x00, 0x00 },
{ 0x3F, 0x42, 0x00, 0x00, 0x00 },
{ 0x3F, 0x41, 0x00, 0x00, 0x00 },
{ 0x30, 0x41, 0x00, 0x00, 0x00 },
{ 0x2A, 0x00, 0x00, 0x00, 0x00 },
{ 0x29, 0x00, 0x00, 0x00, 0x00 },
{ 0x28, 0x00, 0x00, 0x00, 0x00 },
{ 0x27, 0x00, 0x00, 0x00, 0x00 },
{ 0x26, 0x00, 0x00, 0x00, 0x00 },
{ 0x25, 0x00, 0x00, 0x00, 0x00 },
{ 0x24, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x7F, 0x00, 0x00, 0x00, 0x00 },
{ 0x7F, 0x00, 0x00, 0x00, 0x00 },
{ 0x5F, 0x00, 0x00, 0x00, 0x00 },
{ 0x50, 0x00, 0x00, 0x00, 0x00 },
{ 0x49, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 },
{ 0x46, 0x00, 0x00, 0x00, 0x00 }
};
TX_WAVEFORM pmc4_t1_tx_waveform_sh_660ft =
{
{ 0x00, 0x46, 0x00, 0x00, 0x00 },
{ 0x0A, 0x45, 0x00, 0x00, 0x00 },
{ 0x3F, 0x43, 0x00, 0x00, 0x00 },
{ 0x3F, 0x41, 0x00, 0x00, 0x00 },
{ 0x3F, 0x40, 0x00, 0x00, 0x00 },
{ 0x3F, 0x40, 0x00, 0x00, 0x00 },
{ 0x2E, 0x00, 0x00, 0x00, 0x00 },
{ 0x2E, 0x00, 0x00, 0x00, 0x00 },
{ 0x2A, 0x00, 0x00, 0x00, 0x00 },
{ 0x29, 0x00, 0x00, 0x00, 0x00 },
{ 0x28, 0x00, 0x00, 0x00, 0x00 },
{ 0x27, 0x00, 0x00, 0x00, 0x00 },
{ 0x26, 0x00, 0x00, 0x00, 0x00 },
{ 0x25, 0x00, 0x00, 0x00, 0x00 },
{ 0x24, 0x00, 0x00, 0x00, 0x00 },
{ 0x4A, 0x00, 0x00, 0x00, 0x00 },
{ 0x7F, 0x00, 0x00, 0x00, 0x00 },
{ 0x63, 0x00, 0x00, 0x00, 0x00 },
{ 0x53, 0x00, 0x00, 0x00, 0x00 },
{ 0x51, 0x00, 0x00, 0x00, 0x00 },
{ 0x4C, 0x00, 0x00, 0x00, 0x00 },
{ 0x4B, 0x00, 0x00, 0x00, 0x00 },
{ 0x48, 0x00, 0x00, 0x00, 0x00 },
{ 0x47, 0x00, 0x00, 0x00, 0x00 }
};
/* Transmit Waveform Values for E1 120 Ohm
* unsigned char e1_tx_waveform_120[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] =
*/
TX_WAVEFORM pmc_e1_tx_waveform_120 =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x0A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3F, 0x00, 0x00, 0x00, 0x00 },
{ 0x3F, 0x00, 0x00, 0x00, 0x00 },
{ 0x39, 0x00, 0x00, 0x00, 0x00 },
{ 0x38, 0x00, 0x00, 0x00, 0x00 },
{ 0x36, 0x00, 0x00, 0x00, 0x00 },
{ 0x36, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x2D, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 }
};
TX_WAVEFORM pmc4_e1_tx_waveform_120 =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x0A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3F, 0x00, 0x00, 0x00, 0x00 },
{ 0x3F, 0x00, 0x00, 0x00, 0x00 },
{ 0x39, 0x00, 0x00, 0x00, 0x00 },
{ 0x38, 0x00, 0x00, 0x00, 0x00 },
{ 0x36, 0x00, 0x00, 0x00, 0x00 },
{ 0x36, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x2D, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 }
};
/* Transmit Waveform Values for E1 75 Ohm
* unsigned char e1_tx_waveform_75[LAST_SAMPLE-FIRST_SAMPLE+1][LAST_UI-FIRST_UI+1] =
*/
TX_WAVEFORM pmc_e1_tx_waveform_75 =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x0A, 0x00, 0x00, 0x00, 0x00 },
{ 0x28, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x32, 0x00, 0x00, 0x00, 0x00 },
{ 0x14, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 }
};
TX_WAVEFORM pmc4_e1_tx_waveform_75 =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x0A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3E, 0x00, 0x00, 0x00, 0x00 },
{ 0x3E, 0x00, 0x00, 0x00, 0x00 },
{ 0x3E, 0x00, 0x00, 0x00, 0x00 },
{ 0x3C, 0x00, 0x00, 0x00, 0x00 },
{ 0x3C, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x3A, 0x00, 0x00, 0x00, 0x00 },
{ 0x35, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00 }
};
RLPS_EQUALIZER_RAM pmc_t1_rlps_ram_table[] =
{
{ 0x03, 0xFE, 0x18, 0x40 }, /* 0d */
{ 0x03, 0xF6, 0x18, 0x40 }, /* 1d */
{ 0x03, 0xEE, 0x18, 0x40 }, /* 2d */
{ 0x03, 0xE6, 0x18, 0x40 }, /* 3d */
{ 0x03, 0xDE, 0x18, 0x40 }, /* 4d */
{ 0x03, 0xD6, 0x18, 0x40 }, /* 5d */
{ 0x03, 0xD6, 0x18, 0x40 }, /* 6d */
{ 0x03, 0xD6, 0x18, 0x40 }, /* 7d */
{ 0x03, 0xCE, 0x18, 0x40 }, /* 8d */
{ 0x03, 0xCE, 0x18, 0x40 }, /* 9d */
{ 0x03, 0xCE, 0x18, 0x40 }, /* 10d */
{ 0x03, 0xCE, 0x18, 0x40 }, /* 11d */
{ 0x03, 0xC6, 0x18, 0x40 }, /* 12d */
{ 0x03, 0xC6, 0x18, 0x40 }, /* 13d */
{ 0x03, 0xC6, 0x18, 0x40 }, /* 14d */
{ 0x0B, 0xBE, 0x18, 0x40 }, /* 15d */
{ 0x0B, 0xBE, 0x18, 0x40 }, /* 16d */
{ 0x0B, 0xBE, 0x18, 0x40 }, /* 17d */
{ 0x0B, 0xBE, 0x18, 0x40 }, /* 18d */
{ 0x0B, 0xB6, 0x18, 0x40 }, /* 19d */
{ 0x0B, 0xB6, 0x18, 0x40 }, /* 20d */
{ 0x0B, 0xB6, 0x18, 0x40 }, /* 21d */
{ 0x0B, 0xB6, 0x18, 0x40 }, /* 22d */
{ 0x13, 0xAE, 0x18, 0x38 }, /* 23d */
{ 0x13, 0xAE, 0x18, 0x3C }, /* 24d */
{ 0x13, 0xAE, 0x18, 0x40 }, /* 25d */
{ 0x13, 0xAE, 0x18, 0x40 }, /* 26d */
{ 0x13, 0xAE, 0x18, 0x40 }, /* 27d */
{ 0x13, 0xAE, 0x18, 0x40 }, /* 28d */
{ 0x1B, 0xB6, 0x18, 0xB8 }, /* 29d */
{ 0x1B, 0xAE, 0x18, 0xB8 }, /* 30d */
{ 0x1B, 0xAE, 0x18, 0xBC }, /* 31d */
{ 0x1B, 0xAE, 0x18, 0xC0 }, /* 32d */
{ 0x1B, 0xAE, 0x18, 0xC0 }, /* 33d */
{ 0x23, 0xA6, 0x18, 0xC0 }, /* 34d */
{ 0x23, 0xA6, 0x18, 0xC0 }, /* 35d */
{ 0x23, 0xA6, 0x18, 0xC0 }, /* 36d */
{ 0x23, 0xA6, 0x18, 0xC0 }, /* 37d */
{ 0x23, 0xA6, 0x18, 0xC0 }, /* 38d */
{ 0x23, 0x9E, 0x18, 0xC0 }, /* 39d */
{ 0x23, 0x9E, 0x18, 0xC0 }, /* 40d */
{ 0x23, 0x9E, 0x18, 0xC0 }, /* 41d */
{ 0x23, 0x9E, 0x18, 0xC0 }, /* 42d */
{ 0x23, 0x9E, 0x18, 0xC0 }, /* 43d */
{ 0x2B, 0x96, 0x18, 0xC0 }, /* 44d */
{ 0x2B, 0x96, 0x18, 0xC0 }, /* 45d */
{ 0x2B, 0x96, 0x18, 0xC0 }, /* 46d */
{ 0x33, 0x96, 0x19, 0x40 }, /* 47d */
{ 0x37, 0x96, 0x19, 0x40 }, /* 48d */
{ 0x37, 0x96, 0x19, 0x40 }, /* 49d */
{ 0x37, 0x96, 0x19, 0x40 }, /* 50d */
{ 0x3F, 0x9E, 0x19, 0xC0 }, /* 51d */
{ 0x3F, 0x9E, 0x19, 0xC0 }, /* 52d */
{ 0x3F, 0x9E, 0x19, 0xC0 }, /* 53d */
{ 0x3F, 0xA6, 0x1A, 0x40 }, /* 54d */
{ 0x3F, 0xA6, 0x1A, 0x40 }, /* 55d */
{ 0x3F, 0xA6, 0x1A, 0x40 }, /* 56d */
{ 0x3F, 0xA6, 0x1A, 0x40 }, /* 57d */
{ 0x3F, 0x96, 0x19, 0xC0 }, /* 58d */
{ 0x3F, 0x96, 0x19, 0xC0 }, /* 59d */
{ 0x3F, 0x96, 0x19, 0xC0 }, /* 60d */
{ 0x3F, 0x96, 0x19, 0xC0 }, /* 61d */
{ 0x47, 0x9E, 0x1A, 0x40 }, /* 62d */
{ 0x47, 0x9E, 0x1A, 0x40 }, /* 63d */
{ 0x47, 0x9E, 0x1A, 0x40 }, /* 64d */
{ 0x47, 0x96, 0x1A, 0x40 }, /* 65d */
{ 0x47, 0x96, 0x1A, 0x40 }, /* 66d */
{ 0x47, 0x96, 0x1A, 0x40 }, /* 67d */
{ 0x47, 0x96, 0x1A, 0x40 }, /* 68d */
{ 0x4F, 0x8E, 0x1A, 0x40 }, /* 69d */
{ 0x4F, 0x8E, 0x1A, 0x40 }, /* 70d */
{ 0x4F, 0x8E, 0x1A, 0x40 }, /* 71d */
{ 0x4F, 0x8E, 0x1A, 0x40 }, /* 72d */
{ 0x4F, 0x8E, 0x1A, 0x40 }, /* 73d */
{ 0x57, 0x86, 0x1A, 0x40 }, /* 74d */
{ 0x57, 0x86, 0x1A, 0x40 }, /* 75d */
{ 0x57, 0x86, 0x1A, 0x40 }, /* 76d */
{ 0x57, 0x86, 0x1A, 0x40 }, /* 77d */
{ 0x57, 0x86, 0x1A, 0x40 }, /* 78d */
{ 0x5F, 0x86, 0x1A, 0xC0 }, /* 79d */
{ 0x5F, 0x86, 0x1A, 0xC0 }, /* 80d */
{ 0x5F, 0x86, 0x1A, 0xC0 }, /* 81d */
{ 0x5F, 0x86, 0x1A, 0xC0 }, /* 82d */
{ 0x5F, 0x86, 0x1A, 0xC0 }, /* 83d */
{ 0x5F, 0x86, 0x1A, 0xC0 }, /* 84d */
{ 0x5F, 0x7E, 0x1A, 0xC0 }, /* 85d */
{ 0x5F, 0x7E, 0x1A, 0xC0 }, /* 86d */
{ 0x5F, 0x7E, 0x1A, 0xC0 }, /* 87d */
{ 0x5F, 0x7E, 0x1A, 0xC0 }, /* 88d */
{ 0x5F, 0x7E, 0x1A, 0xC0 }, /* 89d */
{ 0x67, 0x7E, 0x2A, 0xC0 }, /* 90d */
{ 0x67, 0x7E, 0x2A, 0xC0 }, /* 91d */
{ 0x67, 0x7E, 0x2A, 0xC0 }, /* 92d */
{ 0x67, 0x7E, 0x2A, 0xC0 }, /* 93d */
{ 0x67, 0x76, 0x2A, 0xC0 }, /* 94d */
{ 0x67, 0x76, 0x2A, 0xC0 }, /* 95d */
{ 0x67, 0x76, 0x2A, 0xC0 }, /* 96d */
{ 0x67, 0x76, 0x2A, 0xC0 }, /* 97d */
{ 0x67, 0x76, 0x2A, 0xC0 }, /* 98d */
{ 0x6F, 0x6E, 0x2A, 0xC0 }, /* 99d */
{ 0x6F, 0x6E, 0x2A, 0xC0 }, /* 100d */
{ 0x6F, 0x6E, 0x2A, 0xC0 }, /* 101d */
{ 0x6F, 0x6E, 0x2A, 0xC0 }, /* 102d */
{ 0x77, 0x6E, 0x3A, 0xC0 }, /* 103d */
{ 0x77, 0x6E, 0x3A, 0xC0 }, /* 104d */
{ 0x77, 0x6E, 0x3A, 0xC0 }, /* 105d */
{ 0x77, 0x6E, 0x3A, 0xC0 }, /* 106d */
{ 0x7F, 0x66, 0x3A, 0xC0 }, /* 107d */
{ 0x7F, 0x66, 0x3A, 0xC0 }, /* 108d */
{ 0x7F, 0x66, 0x4A, 0xC0 }, /* 109d */
{ 0x7F, 0x66, 0x4A, 0xC0 }, /* 110d */
{ 0x7F, 0x66, 0x4A, 0xC0 }, /* 111d */
{ 0x7F, 0x66, 0x4A, 0xC0 }, /* 112d */
{ 0x87, 0x66, 0x5A, 0xC0 }, /* 113d */
{ 0x87, 0x66, 0x5A, 0xC0 }, /* 114d */
{ 0x87, 0x66, 0x5A, 0xC0 }, /* 115d */
{ 0x87, 0x66, 0x5A, 0xC0 }, /* 116d */
{ 0x87, 0x66, 0x5A, 0xC0 }, /* 117d */
{ 0x87, 0x5E, 0x5A, 0xC0 }, /* 118d */
{ 0x87, 0x5E, 0x5A, 0xC0 }, /* 119d */
{ 0x87, 0x5E, 0x5A, 0xC0 }, /* 120d */
{ 0x87, 0x5E, 0x5A, 0xC0 }, /* 121d */
{ 0x87, 0x5E, 0x5A, 0xC0 }, /* 122d */
{ 0x8F, 0x5E, 0x6A, 0xC0 }, /* 123d */
{ 0x8F, 0x5E, 0x6A, 0xC0 }, /* 124d */
{ 0x8F, 0x5E, 0x6A, 0xC0 }, /* 125d */
{ 0x8F, 0x5E, 0x6A, 0xC0 }, /* 126d */
{ 0x97, 0x5E, 0x7A, 0xC0 }, /* 127d */
{ 0x97, 0x5E, 0x7A, 0xC0 }, /* 128d */
{ 0x97, 0x5E, 0x7A, 0xC0 }, /* 129d */
{ 0x97, 0x5E, 0x7A, 0xC0 }, /* 130d */
{ 0x9F, 0x5E, 0x8A, 0xC0 }, /* 131d */
{ 0x9F, 0x5E, 0x8A, 0xC0 }, /* 132d */
{ 0x9F, 0x5E, 0x8A, 0xC0 }, /* 133d */
{ 0x9F, 0x5E, 0x8A, 0xC0 }, /* 134d */
{ 0x9F, 0x5E, 0x8A, 0xC0 }, /* 135d */
{ 0xA7, 0x56, 0x9A, 0xC0 }, /* 136d */
{ 0xA7, 0x56, 0x9A, 0xC0 }, /* 137d */
{ 0xA7, 0x56, 0x9A, 0xC0 }, /* 138d */
{ 0xA7, 0x56, 0x9A, 0xC0 }, /* 139d */
{ 0xA7, 0x56, 0xAA, 0xC0 }, /* 140d */
{ 0xA7, 0x56, 0xAA, 0xC0 }, /* 141d */
{ 0xA7, 0x56, 0xAA, 0xC0 }, /* 142d */
{ 0xAF, 0x4E, 0xAA, 0xC0 }, /* 143d */
{ 0xAF, 0x4E, 0xAA, 0xC0 }, /* 144d */
{ 0xAF, 0x4E, 0xAA, 0xC0 }, /* 145d */
{ 0xAF, 0x4E, 0xAA, 0xC0 }, /* 146d */
{ 0xAF, 0x4E, 0xAA, 0xC0 }, /* 147d */
{ 0xB7, 0x46, 0xAA, 0xC0 }, /* 148d */
{ 0xB7, 0x46, 0xAA, 0xC0 }, /* 149d */
{ 0xB7, 0x46, 0xAA, 0xC0 }, /* 150d */
{ 0xB7, 0x46, 0xAA, 0xC0 }, /* 151d */
{ 0xB7, 0x46, 0xAA, 0xC0 }, /* 152d */
{ 0xB7, 0x46, 0xAA, 0xC0 }, /* 153d */
{ 0xB7, 0x46, 0xAA, 0xC0 }, /* 154d */
{ 0xB7, 0x46, 0xBA, 0xC0 }, /* 155d */
{ 0xB7, 0x46, 0xBA, 0xC0 }, /* 156d */
{ 0xB7, 0x46, 0xBA, 0xC0 }, /* 157d */
{ 0xBF, 0x4E, 0xBB, 0x40 }, /* 158d */
{ 0xBF, 0x4E, 0xBB, 0x40 }, /* 159d */
{ 0xBF, 0x4E, 0xBB, 0x40 }, /* 160d */
{ 0xBF, 0x4E, 0xBB, 0x40 }, /* 161d */
{ 0xBF, 0x4E, 0xBB, 0x40 }, /* 162d */
{ 0xBF, 0x4E, 0xBB, 0x40 }, /* 163d */
{ 0xBF, 0x4E, 0xBB, 0x40 }, /* 164d */
{ 0xBF, 0x4E, 0xBB, 0x40 }, /* 165d */
{ 0xBF, 0x4E, 0xBB, 0x40 }, /* 166d */
{ 0xBE, 0x46, 0xCB, 0x40 }, /* 167d */
{ 0xBE, 0x46, 0xCB, 0x40 }, /* 168d */
{ 0xBE, 0x46, 0xCB, 0x40 }, /* 169d */
{ 0xBE, 0x46, 0xCB, 0x40 }, /* 170d */
{ 0xBE, 0x46, 0xCB, 0x40 }, /* 171d */
{ 0xBE, 0x46, 0xCB, 0x40 }, /* 172d */
{ 0xBE, 0x46, 0xDB, 0x40 }, /* 173d */
{ 0xBE, 0x46, 0xDB, 0x40 }, /* 174d */
{ 0xBE, 0x46, 0xDB, 0x40 }, /* 175d */
{ 0xC6, 0x3E, 0xCB, 0x40 }, /* 176d */
{ 0xC6, 0x3E, 0xCB, 0x40 }, /* 177d */
{ 0xC6, 0x3E, 0xDB, 0x40 }, /* 178d */
{ 0xC6, 0x3E, 0xDB, 0x40 }, /* 179d */
{ 0xC6, 0x3E, 0xDB, 0x40 }, /* 180d */
{ 0xC6, 0x44, 0xDB, 0x40 }, /* 181d */
{ 0xC6, 0x44, 0xDB, 0x40 }, /* 182d */
{ 0xC6, 0x44, 0xDB, 0x40 }, /* 183d */
{ 0xC6, 0x44, 0xDB, 0x40 }, /* 184d */
{ 0xC6, 0x3C, 0xDB, 0x40 }, /* 185d */
{ 0xC6, 0x3C, 0xDB, 0x40 }, /* 186d */
{ 0xC6, 0x3C, 0xDB, 0x40 }, /* 187d */
{ 0xC6, 0x3C, 0xDB, 0x40 }, /* 188d */
{ 0xD6, 0x34, 0xDB, 0x40 }, /* 189d */
{ 0xD6, 0x34, 0xDB, 0x40 }, /* 190d */
{ 0xD6, 0x34, 0xDB, 0x40 }, /* 191d */
{ 0xD6, 0x34, 0xDB, 0x40 }, /* 192d */
{ 0xD6, 0x34, 0xDB, 0x40 }, /* 193d */
{ 0xDE, 0x2C, 0xDB, 0x3C }, /* 194d */
{ 0xDE, 0x2C, 0xDB, 0x3C }, /* 195d */
{ 0xDE, 0x2C, 0xDB, 0x3C }, /* 196d */
{ 0xE6, 0x2C, 0xDB, 0x40 }, /* 197d */
{ 0xE6, 0x2C, 0xDB, 0x40 }, /* 198d */
{ 0xE6, 0x2C, 0xDB, 0x40 }, /* 199d */
{ 0xE6, 0x2C, 0xDB, 0x40 }, /* 200d */
{ 0xE6, 0x2C, 0xDB, 0x40 }, /* 201d */
{ 0xE6, 0x2C, 0xEB, 0x40 }, /* 202d */
{ 0xE6, 0x2C, 0xEB, 0x40 }, /* 203d */
{ 0xE6, 0x2C, 0xEB, 0x40 }, /* 204d */
{ 0xEE, 0x2C, 0xFB, 0x40 }, /* 205d */
{ 0xEE, 0x2C, 0xFB, 0x40 }, /* 206d */
{ 0xEE, 0x2C, 0xFB, 0x40 }, /* 207d */
{ 0xEE, 0x2D, 0x0B, 0x40 }, /* 208d */
{ 0xEE, 0x2D, 0x0B, 0x40 }, /* 209d */
{ 0xEE, 0x2D, 0x0B, 0x40 }, /* 210d */
{ 0xEE, 0x2D, 0x0B, 0x40 }, /* 211d */
{ 0xEE, 0x2D, 0x0B, 0x40 }, /* 212d */
{ 0xF5, 0x25, 0x0B, 0x38 }, /* 213d */
{ 0xF5, 0x25, 0x0B, 0x3C }, /* 214d */
{ 0xF5, 0x25, 0x0B, 0x40 }, /* 215d */
{ 0xF5, 0x25, 0x1B, 0x40 }, /* 216d */
{ 0xF5, 0x25, 0x1B, 0x40 }, /* 217d */
{ 0xF5, 0x25, 0x1B, 0x40 }, /* 218d */
{ 0xF5, 0x25, 0x1B, 0x40 }, /* 219d */
{ 0xF5, 0x25, 0x1B, 0x40 }, /* 220d */
{ 0xFD, 0x25, 0x2B, 0x40 }, /* 221d */
{ 0xFD, 0x25, 0x2B, 0x40 }, /* 222d */
{ 0xFD, 0x25, 0x2B, 0x40 }, /* 223d */
{ 0xFD, 0x25, 0x2B, 0x40 }, /* 224d */
{ 0xFD, 0x25, 0x27, 0x40 }, /* 225d */
{ 0xFD, 0x25, 0x27, 0x40 }, /* 226d */
{ 0xFD, 0x25, 0x27, 0x40 }, /* 227d */
{ 0xFD, 0x25, 0x23, 0x40 }, /* 228d */
{ 0xFD, 0x25, 0x23, 0x40 }, /* 229d */
{ 0xFD, 0x25, 0x23, 0x40 }, /* 230d */
{ 0xFD, 0x25, 0x33, 0x40 }, /* 231d */
{ 0xFD, 0x25, 0x33, 0x40 }, /* 232d */
{ 0xFD, 0x25, 0x33, 0x40 }, /* 233d */
{ 0xFD, 0x25, 0x33, 0x40 }, /* 234d */
{ 0xFD, 0x25, 0x33, 0x40 }, /* 235d */
{ 0xFD, 0x25, 0x33, 0x40 }, /* 236d */
{ 0xFC, 0x25, 0x33, 0x40 }, /* 237d */
{ 0xFC, 0x25, 0x33, 0x40 }, /* 238d */
{ 0xFC, 0x25, 0x43, 0x40 }, /* 239d */
{ 0xFC, 0x25, 0x43, 0x40 }, /* 240d */
{ 0xFC, 0x25, 0x43, 0x40 }, /* 241d */
{ 0xFC, 0x25, 0x43, 0x44 }, /* 242d */
{ 0xFC, 0x25, 0x43, 0x48 }, /* 243d */
{ 0xFC, 0x25, 0x43, 0x4C }, /* 244d */
{ 0xFC, 0x25, 0x43, 0xBC }, /* 245d */
{ 0xFC, 0x25, 0x43, 0xC0 }, /* 246d */
{ 0xFC, 0x25, 0x43, 0xC0 }, /* 247d */
{ 0xFC, 0x23, 0x43, 0xC0 }, /* 248d */
{ 0xFC, 0x23, 0x43, 0xC0 }, /* 249d */
{ 0xFC, 0x23, 0x43, 0xC0 }, /* 250d */
{ 0xFC, 0x21, 0x43, 0xC0 }, /* 251d */
{ 0xFC, 0x21, 0x43, 0xC0 }, /* 252d */
{ 0xFC, 0x21, 0x53, 0xC0 }, /* 253d */
{ 0xFC, 0x21, 0x53, 0xC0 }, /* 254d */
{ 0xFC, 0x21, 0x53, 0xC0 } /* 255d */
};
RLPS_EQUALIZER_RAM pmc4_t1_rlps_ram_table[] =
{
{ 0x03, 0xFE, 0x18, 0x40 }, /* 0d */
{ 0x03, 0xFE, 0x18, 0x40 }, /* 1d */
{ 0x03, 0xF6, 0x18, 0x40 }, /* 2d */
{ 0x03, 0xF6, 0x18, 0x40 }, /* 3d */
{ 0x03, 0xEE, 0x18, 0x40 }, /* 4d */
{ 0x03, 0xEE, 0x18, 0x40 }, /* 5d */
{ 0x03, 0xE6, 0x18, 0x40 }, /* 6d */
{ 0x03, 0xE6, 0x18, 0x40 }, /* 7d */
{ 0x03, 0xDE, 0x18, 0x40 }, /* 8d */
{ 0x0B, 0xDE, 0x18, 0x40 }, /* 9d */
{ 0x0B, 0xD6, 0x18, 0x40 }, /* 10d */
{ 0x0B, 0xD6, 0x18, 0x40 }, /* 11d */
{ 0x0B, 0xCE, 0x18, 0x40 }, /* 12d */
{ 0x0B, 0xCE, 0x18, 0x40 }, /* 13d */
{ 0x0B, 0xC6, 0x18, 0x40 }, /* 14d */
{ 0x0B, 0xC6, 0x18, 0x40 }, /* 15d */
{ 0x0B, 0xBE, 0x18, 0x40 }, /* 16d */
{ 0x0B, 0xBE, 0x18, 0x40 }, /* 17d */
{ 0x0B, 0xB6, 0x18, 0x40 }, /* 18d */
{ 0x0B, 0xB6, 0x18, 0x40 }, /* 19d */
{ 0x0B, 0xAE, 0x18, 0x40 }, /* 20d */
{ 0x0B, 0xAE, 0x18, 0x40 }, /* 21d */
{ 0x13, 0xAE, 0x18, 0x40 }, /* 22d */
{ 0x13, 0xAE, 0x18, 0x40 }, /* 23d */
{ 0x13, 0xA6, 0x18, 0x40 }, /* 24d */
{ 0x13, 0xA6, 0x28, 0x40 }, /* 25d */
{ 0x13, 0xA6, 0x28, 0x40 }, /* 26d */
{ 0x13, 0xA6, 0x28, 0x40 }, /* 27d */
{ 0x1B, 0xA6, 0x28, 0x40 }, /* 28d */
{ 0x1B, 0xA6, 0x28, 0x40 }, /* 29d */
{ 0x1B, 0x9E, 0x28, 0x40 }, /* 30d */
{ 0x1B, 0x9E, 0x38, 0x40 }, /* 31d */
{ 0x1B, 0x9E, 0x38, 0x40 }, /* 32d */
{ 0x1B, 0x9E, 0x38, 0x40 }, /* 33d */
{ 0x23, 0x96, 0x38, 0x40 }, /* 34d */
{ 0x23, 0x96, 0x38, 0x40 }, /* 35d */
{ 0x23, 0x96, 0x38, 0x40 }, /* 36d */
{ 0x23, 0x96, 0x48, 0x40 }, /* 37d */
{ 0x23, 0x96, 0x48, 0x40 }, /* 38d */
{ 0x23, 0x96, 0x48, 0x40 }, /* 39d */
{ 0x23, 0x96, 0x58, 0x40 }, /* 40d */
{ 0x23, 0x96, 0x58, 0x40 }, /* 41d */
{ 0x23, 0x96, 0x58, 0x40 }, /* 42d */
{ 0x2B, 0x96, 0x38, 0xC0 }, /* 43d */
{ 0x2B, 0x96, 0x38, 0xC0 }, /* 44d */
{ 0x2B, 0x96, 0x38, 0xC0 }, /* 45d */
{ 0x33, 0x8E, 0x38, 0xC0 }, /* 46d */
{ 0x33, 0x8E, 0x38, 0xC0 }, /* 47d */
{ 0x33, 0x8E, 0x38, 0xC0 }, /* 48d */
{ 0x37, 0x8E, 0x48, 0xC0 }, /* 49d */
{ 0x37, 0x8E, 0x48, 0xC0 }, /* 50d */
{ 0x37, 0x86, 0x48, 0xC0 }, /* 51d */
{ 0x37, 0x86, 0x48, 0xC0 }, /* 52d */
{ 0x37, 0x86, 0x58, 0xC0 }, /* 53d */
{ 0x37, 0x86, 0x58, 0xC0 }, /* 54d */
{ 0x3F, 0x86, 0x54, 0xC0 }, /* 55d */
{ 0x3F, 0x86, 0x54, 0xC0 }, /* 56d */
{ 0x3F, 0x7E, 0x54, 0xC0 }, /* 57d */
{ 0x47, 0x7E, 0x54, 0xC0 }, /* 58d */
{ 0x47, 0x7E, 0x54, 0xC0 }, /* 59d */
{ 0x47, 0x76, 0x54, 0xC0 }, /* 60d */
{ 0x47, 0x76, 0x64, 0xC0 }, /* 61d */
{ 0x47, 0x76, 0x64, 0xC0 }, /* 62d */
{ 0x47, 0x76, 0x64, 0xC0 }, /* 63d */
{ 0x47, 0x76, 0x74, 0xC0 }, /* 64d */
{ 0x47, 0x76, 0x74, 0xC0 }, /* 65d */
{ 0x47, 0x76, 0x74, 0xC0 }, /* 66d */
{ 0x47, 0x76, 0x74, 0xC0 }, /* 67d */
{ 0x47, 0x76, 0x74, 0xC0 }, /* 68d */
{ 0x47, 0x76, 0x74, 0xC0 }, /* 69d */
{ 0x4F, 0x76, 0x65, 0x40 }, /* 70d */
{ 0x4F, 0x76, 0x65, 0x40 }, /* 71d */
{ 0x4F, 0x76, 0x65, 0x40 }, /* 72d */
{ 0x57, 0x76, 0x75, 0x40 }, /* 73d */
{ 0x57, 0x76, 0x75, 0x40 }, /* 74d */
{ 0x5F, 0x6E, 0x75, 0x40 }, /* 75d */
{ 0x5F, 0x6E, 0x75, 0x40 }, /* 76d */
{ 0x67, 0x6E, 0x85, 0x40 }, /* 77d */
{ 0x67, 0x6E, 0x85, 0x40 }, /* 78d */
{ 0x67, 0x6E, 0x85, 0x40 }, /* 79d */
{ 0x67, 0x6E, 0x95, 0x40 }, /* 80d */
{ 0x67, 0x6E, 0x95, 0x40 }, /* 81d */
{ 0x67, 0x6E, 0x95, 0x40 }, /* 82d */
{ 0x67, 0x66, 0x95, 0x40 }, /* 83d */
{ 0x67, 0x66, 0x95, 0x40 }, /* 84d */
{ 0x67, 0x66, 0xA5, 0x40 }, /* 85d */
{ 0x67, 0x66, 0xA5, 0x40 }, /* 86d */
{ 0x67, 0x5E, 0x95, 0x40 }, /* 87d */
{ 0x67, 0x5E, 0x95, 0x40 }, /* 88d */
{ 0x77, 0x5E, 0x75, 0xC0 }, /* 89d */
{ 0x77, 0x5E, 0x75, 0xC0 }, /* 90d */
{ 0x77, 0x5E, 0x85, 0xC0 }, /* 91d */
{ 0x77, 0x5E, 0x85, 0xC0 }, /* 92d */
{ 0x77, 0x5E, 0x95, 0xC0 }, /* 93d */
{ 0x77, 0x5E, 0x95, 0xC0 }, /* 94d */
{ 0x77, 0x5E, 0xA5, 0xC0 }, /* 95d */
{ 0x77, 0x5E, 0xA5, 0xC0 }, /* 96d */
{ 0x77, 0x5E, 0xB5, 0xC0 }, /* 97d */
{ 0x7F, 0x5E, 0xB5, 0xC0 }, /* 98d */
{ 0x7F, 0x5E, 0xC5, 0xC0 }, /* 99d */
{ 0x7F, 0x5E, 0xC5, 0xC0 }, /* 100d */
{ 0x7F, 0x5C, 0xA9, 0xC0 }, /* 101d */
{ 0x7F, 0x5C, 0xA9, 0xC0 }, /* 102d */
{ 0x7F, 0x5C, 0xA9, 0xC0 }, /* 103d */
{ 0x7F, 0x5C, 0xB9, 0xC0 }, /* 104d */
{ 0x7F, 0x5C, 0xB9, 0xC0 }, /* 105d */
{ 0x7F, 0x5C, 0xB9, 0xC0 }, /* 106d */
{ 0x7F, 0x5C, 0xA5, 0xC0 }, /* 107d */
{ 0x7F, 0x5C, 0xA5, 0xC0 }, /* 108d */
{ 0x7F, 0x5C, 0xA5, 0xC0 }, /* 109d */
{ 0x7F, 0x5C, 0xB5, 0xC0 }, /* 110d */
{ 0x7F, 0x54, 0xA5, 0xC0 }, /* 111d */
{ 0x7F, 0x54, 0xB5, 0xC0 }, /* 112d */
{ 0x7F, 0x54, 0xC5, 0xC0 }, /* 113d */
{ 0x7F, 0x54, 0xC5, 0xC0 }, /* 114d */
{ 0x7F, 0x54, 0xC5, 0xC0 }, /* 115d */
{ 0x7F, 0x54, 0xB1, 0xC0 }, /* 116d */
{ 0x7F, 0x54, 0xB1, 0xC0 }, /* 117d */
{ 0x7F, 0x54, 0xB1, 0xC0 }, /* 118d */
{ 0x7F, 0x54, 0xB1, 0xC0 }, /* 119d */
{ 0x7F, 0x54, 0xB1, 0xC0 }, /* 120d */
{ 0x86, 0x54, 0xD1, 0xC0 }, /* 121d */
{ 0x86, 0x54, 0xD1, 0xC0 }, /* 122d */
{ 0x86, 0x54, 0xD1, 0xC0 }, /* 123d */
{ 0x86, 0x54, 0xD1, 0xC0 }, /* 124d */
{ 0x86, 0x54, 0xD1, 0xC0 }, /* 125d */
{ 0x86, 0x4C, 0xC1, 0xC0 }, /* 126d */
{ 0x86, 0x4C, 0xC1, 0xC0 }, /* 127d */
{ 0x86, 0x4C, 0xD1, 0xC0 }, /* 128d */
{ 0x86, 0x4C, 0xD1, 0xC0 }, /* 129d */
{ 0x86, 0x4C, 0xD1, 0xC0 }, /* 130d */
{ 0x8E, 0x4C, 0xB2, 0x40 }, /* 131d */
{ 0x8E, 0x4C, 0xB2, 0x40 }, /* 132d */
{ 0x8E, 0x4C, 0xB2, 0x40 }, /* 133d */
{ 0x8E, 0x4C, 0xB2, 0x40 }, /* 134d */
{ 0x8E, 0x4C, 0xB2, 0x40 }, /* 135d */
{ 0x8E, 0x4C, 0xB2, 0x40 }, /* 136d */
{ 0x96, 0x4C, 0xC2, 0x40 }, /* 137d */
{ 0x96, 0x4C, 0xC2, 0x40 }, /* 138d */
{ 0x96, 0x4C, 0xC2, 0x40 }, /* 139d */
{ 0x9E, 0x4C, 0xD2, 0x40 }, /* 140d */
{ 0x9E, 0x4C, 0xD2, 0x40 }, /* 141d */
{ 0x9E, 0x4C, 0xD2, 0x40 }, /* 142d */
{ 0xA6, 0x4C, 0xD2, 0x40 }, /* 143d */
{ 0xA6, 0x4C, 0xD2, 0x40 }, /* 144d */
{ 0xA6, 0x4C, 0xD2, 0x40 }, /* 145d */
{ 0xA6, 0x4C, 0xE2, 0x40 }, /* 146d */
{ 0xA6, 0x4C, 0xE2, 0x40 }, /* 147d */
{ 0xA6, 0x4C, 0xE2, 0x40 }, /* 148d */
{ 0xA6, 0x4C, 0xF2, 0x40 }, /* 149d */
{ 0xA6, 0x4C, 0xF2, 0x40 }, /* 150d */
{ 0xA6, 0x4C, 0xF2, 0x40 }, /* 151d */
{ 0xA6, 0x4C, 0xF2, 0x40 }, /* 152d */
{ 0xA6, 0x4C, 0xF2, 0x40 }, /* 153d */
{ 0xA6, 0x4C, 0xF2, 0x40 }, /* 154d */
{ 0xB6, 0x4C, 0xE2, 0xC0 }, /* 155d */
{ 0xB6, 0x4C, 0xE2, 0xC0 }, /* 156d */
{ 0xB6, 0x4C, 0xE2, 0xC0 }, /* 157d */
{ 0xBE, 0x4C, 0xF2, 0xC0 }, /* 158d */
{ 0xBE, 0x4C, 0xF2, 0xC0 }, /* 159d */
{ 0xBE, 0x4C, 0xF2, 0xC0 }, /* 160d */
{ 0xBE, 0x4D, 0x02, 0xC0 }, /* 161d */
{ 0xBE, 0x4D, 0x02, 0xC0 }, /* 162d */
{ 0xBE, 0x4D, 0x02, 0xC0 }, /* 163d */
{ 0xBE, 0x4D, 0x12, 0xC0 }, /* 164d */
{ 0xBE, 0x4D, 0x12, 0xC0 }, /* 165d */
{ 0xBE, 0x4D, 0x12, 0xC0 }, /* 166d */
{ 0xC6, 0x4D, 0x12, 0xC0 }, /* 167d */
{ 0xC6, 0x4D, 0x12, 0xC0 }, /* 168d */
{ 0xC6, 0x4D, 0x12, 0xC0 }, /* 169d */
{ 0xC6, 0x4D, 0x12, 0xC0 }, /* 170d */
{ 0xC6, 0x4D, 0x12, 0xC0 }, /* 171d */
{ 0xC6, 0x4D, 0x12, 0xC0 }, /* 172d */
{ 0xCE, 0x4D, 0x22, 0xC0 }, /* 173d */
{ 0xCE, 0x4D, 0x22, 0xC0 }, /* 174d */
{ 0xCE, 0x4D, 0x22, 0xC0 }, /* 175d */
{ 0xCE, 0x4D, 0x22, 0xC0 }, /* 176d */
{ 0xCE, 0x4D, 0x22, 0xC0 }, /* 177d */
{ 0xCE, 0x4D, 0x22, 0xC0 }, /* 178d */
{ 0xCE, 0x4D, 0x22, 0xC0 }, /* 179d */
{ 0xCE, 0x4D, 0x22, 0xC0 }, /* 180d */
{ 0xCE, 0x4D, 0x22, 0xC0 }, /* 181d */
{ 0xCE, 0x4D, 0x32, 0xC0 }, /* 182d */
{ 0xCE, 0x4D, 0x32, 0xC0 }, /* 183d */
{ 0xCE, 0x4D, 0x32, 0xC0 }, /* 184d */
{ 0xCD, 0x4D, 0x22, 0xC0 }, /* 185d */
{ 0xCD, 0x4D, 0x22, 0xC0 }, /* 186d */
{ 0xCD, 0x4D, 0x22, 0xC0 }, /* 187d */
{ 0xD5, 0x4C, 0xE3, 0x40 }, /* 188d */
{ 0xD5, 0x4C, 0xE3, 0x40 }, /* 189d */
{ 0xD5, 0x4C, 0xF3, 0x40 }, /* 190d */
{ 0xD5, 0x4C, 0xF3, 0x40 }, /* 191d */
{ 0xD5, 0x4D, 0x03, 0x40 }, /* 192d */
{ 0xD5, 0x4D, 0x03, 0x40 }, /* 193d */
{ 0xD5, 0x4D, 0x13, 0x40 }, /* 194d */
{ 0xD5, 0x4D, 0x13, 0x40 }, /* 195d */
{ 0xD5, 0x4D, 0x23, 0x40 }, /* 196d */
{ 0xD5, 0x4D, 0x23, 0x40 }, /* 197d */
{ 0xD5, 0x4D, 0x33, 0x40 }, /* 198d */
{ 0xD5, 0x4D, 0x33, 0x40 }, /* 199d */
{ 0xDD, 0x45, 0x13, 0x40 }, /* 200d */
{ 0xDD, 0x45, 0x13, 0x40 }, /* 201d */
{ 0xDD, 0x45, 0x13, 0x40 }, /* 202d */
{ 0xDD, 0x45, 0x23, 0x40 }, /* 203d */
{ 0xDD, 0x45, 0x23, 0x40 }, /* 204d */
{ 0xDD, 0x45, 0x23, 0x40 }, /* 205d */
{ 0xDD, 0x45, 0x33, 0x40 }, /* 206d */
{ 0xDD, 0x45, 0x33, 0x40 }, /* 207d */
{ 0xDD, 0x45, 0x33, 0x40 }, /* 208d */
{ 0xE5, 0x3D, 0x23, 0x40 }, /* 209d */
{ 0xE5, 0x3D, 0x23, 0x40 }, /* 210d */
{ 0xE5, 0x3D, 0x23, 0x40 }, /* 211d */
{ 0xE5, 0x3D, 0x33, 0x40 }, /* 212d */
{ 0xE5, 0x3D, 0x33, 0x40 }, /* 213d */
{ 0xE5, 0x3D, 0x33, 0x40 }, /* 214d */
{ 0xE5, 0x3D, 0x43, 0x40 }, /* 215d */
{ 0xE5, 0x3D, 0x43, 0x40 }, /* 216d */
{ 0xE5, 0x3D, 0x43, 0x40 }, /* 217d */
{ 0xE5, 0x3D, 0x53, 0x40 }, /* 218d */
{ 0xE5, 0x3D, 0x53, 0x40 }, /* 219d */
{ 0xE5, 0x3D, 0x53, 0x40 }, /* 220d */
{ 0xEC, 0x35, 0x23, 0x40 }, /* 221d */
{ 0xEC, 0x35, 0x33, 0x40 }, /* 222d */
{ 0xEC, 0x35, 0x33, 0x40 }, /* 223d */
{ 0xEC, 0x35, 0x43, 0x40 }, /* 224d */
{ 0xEC, 0x35, 0x43, 0x40 }, /* 225d */
{ 0xEC, 0x35, 0x43, 0x40 }, /* 226d */
{ 0xEC, 0x35, 0x53, 0x40 }, /* 227d */
{ 0xEC, 0x35, 0x53, 0x40 }, /* 228d */
{ 0xEC, 0x35, 0x53, 0x40 }, /* 229d */
{ 0xEC, 0x35, 0x63, 0x40 }, /* 230d */
{ 0xEC, 0x35, 0x63, 0x40 }, /* 231d */
{ 0xEC, 0x35, 0x63, 0x40 }, /* 232d */
{ 0xEC, 0x35, 0x73, 0x40 }, /* 233d */
{ 0xEC, 0x35, 0x73, 0x40 }, /* 234d */
{ 0xEC, 0x35, 0x73, 0x40 }, /* 235d */
{ 0xEC, 0x2D, 0x53, 0x40 }, /* 236d */
{ 0xEC, 0x2D, 0x53, 0x40 }, /* 237d */
{ 0xEC, 0x2D, 0x53, 0x40 }, /* 238d */
{ 0xF4, 0x2D, 0x23, 0xC0 }, /* 239d */
{ 0xF4, 0x2D, 0x23, 0xC0 }, /* 240d */
{ 0xF4, 0x2D, 0x33, 0xC0 }, /* 241d */
{ 0xFC, 0x2D, 0x33, 0xC0 }, /* 242d */
{ 0xFC, 0x2D, 0x43, 0xC0 }, /* 243d */
{ 0xFC, 0x2D, 0x43, 0xC0 }, /* 244d */
{ 0xFC, 0x25, 0x43, 0xC0 }, /* 245d */
{ 0xFC, 0x25, 0x43, 0xC0 }, /* 246d */
{ 0xFC, 0x25, 0x43, 0xC0 }, /* 247d */
{ 0xFC, 0x25, 0x43, 0xC0 }, /* 248d */
{ 0xFC, 0x1D, 0x43, 0xC0 }, /* 249d */
{ 0xFC, 0x1D, 0x43, 0xC0 }, /* 250d */
{ 0xFC, 0x1D, 0x43, 0xC0 }, /* 251d */
{ 0xFC, 0x1D, 0x43, 0xC0 }, /* 252d */
{ 0xFC, 0x1D, 0x43, 0xC0 }, /* 253d */
{ 0xFC, 0x1D, 0x43, 0xC0 }, /* 254d */
{ 0xFC, 0x1D, 0x43, 0xC0 } /* 255d */
};
RLPS_EQUALIZER_RAM pmc_t1_rlps_perf_mode_ram_table[] =
{
{ 0x03, 0xFE, 0x18, 0x40 },
{ 0x03, 0xFE, 0x18, 0x40 },
{ 0x03, 0xFE, 0x18, 0x40 },
{ 0x03, 0xFE, 0x18, 0x40 },
{ 0x03, 0xFE, 0x18, 0x40 },
{ 0x03, 0xFE, 0x18, 0x40 },
{ 0x03, 0xFE, 0x18, 0x40 },
{ 0x03, 0xFE, 0x18, 0x40 },
{ 0x03, 0xF6, 0x18, 0x40 },
{ 0x03, 0xF6, 0x18, 0x40 },
{ 0x03, 0xF6, 0x18, 0x40 },
{ 0x03, 0xF6, 0x18, 0x40 },
{ 0x03, 0xF6, 0x18, 0x40 },
{ 0x03, 0xF6, 0x18, 0x40 },
{ 0x03, 0xF6, 0x18, 0x40 },
{ 0x03, 0xF6, 0x18, 0x40 },
{ 0x03, 0xEE, 0x18, 0x40 },
{ 0x03, 0xEE, 0x18, 0x40 },
{ 0x03, 0xEE, 0x18, 0x40 },
{ 0x03, 0xEE, 0x18, 0x40 },
{ 0x03, 0xEE, 0x18, 0x40 },
{ 0x03, 0xEE, 0x18, 0x40 },
{ 0x03, 0xEE, 0x18, 0x40 },
{ 0x03, 0xEE, 0x18, 0x40 },
{ 0x03, 0xE6, 0x18, 0x40 },
{ 0x03, 0xE6, 0x18, 0x40 },
{ 0x03, 0xE6, 0x18, 0x40 },
{ 0x03, 0xE6, 0x18, 0x40 },
{ 0x03, 0xE6, 0x18, 0x40 },
{ 0x03, 0xE6, 0x18, 0x40 },
{ 0x03, 0xE6, 0x18, 0x40 },
{ 0x03, 0xE6, 0x18, 0x40 },
{ 0x03, 0xDE, 0x18, 0x40 },
{ 0x03, 0xDE, 0x18, 0x40 },
{ 0x03, 0xDE, 0x18, 0x40 },
{ 0x03, 0xDE, 0x18, 0x40 },
{ 0x03, 0xDE, 0x18, 0x40 },
{ 0x03, 0xDE, 0x18, 0x40 },
{ 0x03, 0xDE, 0x18, 0x40 },
{ 0x03, 0xDE, 0x18, 0x40 },
{ 0x03, 0xD6, 0x18, 0x40 },
{ 0x03, 0xD6, 0x18, 0x40 },
{ 0x03, 0xD6, 0x18, 0x40 },
{ 0x03, 0xD6, 0x18, 0x40 },
{ 0x03, 0xD6, 0x18, 0x40 },
{ 0x03, 0xD6, 0x18, 0x40 },
{ 0x03, 0xD6, 0x18, 0x40 },
{ 0x03, 0xD6, 0x18, 0x40 },
{ 0x03, 0xCE, 0x18, 0x40 },
{ 0x03, 0xCE, 0x18, 0x40 },
{ 0x03, 0xCE, 0x18, 0x40 },
{ 0x03, 0xCE, 0x18, 0x40 },
{ 0x03, 0xCE, 0x18, 0x40 },
{ 0x03, 0xCE, 0x18, 0x40 },
{ 0x03, 0xCE, 0x18, 0x40 },
{ 0x03, 0xCE, 0x18, 0x40 },
{ 0x03, 0xC6, 0x18, 0x40 },
{ 0x03, 0xC6, 0x18, 0x40 },
{ 0x03, 0xC6, 0x18, 0x40 },
{ 0x03, 0xC6, 0x18, 0x40 },
{ 0x03, 0xC6, 0x18, 0x40 },
{ 0x03, 0xC6, 0x18, 0x40 },
{ 0x03, 0xC6, 0x18, 0x40 },
{ 0x03, 0xC6, 0x18, 0x40 },
{ 0x03, 0xBE, 0x18, 0x40 },
{ 0x03, 0xBE, 0x18, 0x40 },
{ 0x03, 0xBE, 0x18, 0x40 },
{ 0x03, 0xBE, 0x18, 0x40 },
{ 0x03, 0xBE, 0x18, 0x40 },
{ 0x03, 0xBE, 0x18, 0x40 },
{ 0x03, 0xBE, 0x18, 0x40 },
{ 0x03, 0xBE, 0x18, 0x40 },
{ 0x03, 0xB6, 0x18, 0x40 },
{ 0x03, 0xB6, 0x18, 0x40 },
{ 0x03, 0xB6, 0x18, 0x40 },
{ 0x03, 0xB6, 0x18, 0x40 },
{ 0x03, 0xB6, 0x18, 0x40 },
{ 0x03, 0xB6, 0x18, 0x40 },
{ 0x03, 0xB6, 0x18, 0x40 },
{ 0x03, 0xB6, 0x18, 0x40 },
{ 0x03, 0xA6, 0x18, 0x40 },
{ 0x03, 0xA6, 0x18, 0x40 },
{ 0x03, 0xA6, 0x18, 0x40 },
{ 0x03, 0xA6, 0x18, 0x40 },
{ 0x03, 0xA6, 0x18, 0x40 },
{ 0x03, 0xA6, 0x18, 0x40 },
{ 0x03, 0xA6, 0x18, 0x40 },
{ 0x03, 0xA6, 0x18, 0x40 },
{ 0x03, 0x9E, 0x18, 0x40 },
{ 0x03, 0x9E, 0x18, 0x40 },
{ 0x03, 0x9E, 0x18, 0x40 },
{ 0x03, 0x9E, 0x18, 0x40 },
{ 0x03, 0x9E, 0x18, 0x40 },
{ 0x03, 0x9E, 0x18, 0x40 },
{ 0x03, 0x9E, 0x18, 0x40 },
{ 0x03, 0x9E, 0x18, 0x40 },
{ 0x03, 0x96, 0x18, 0x40 },
{ 0x03, 0x96, 0x18, 0x40 },
{ 0x03, 0x96, 0x18, 0x40 },
{ 0x03, 0x96, 0x18, 0x40 },
{ 0x03, 0x96, 0x18, 0x40 },
{ 0x03, 0x96, 0x18, 0x40 },
{ 0x03, 0x96, 0x18, 0x40 },
{ 0x03, 0x96, 0x18, 0x40 },
{ 0x03, 0x8E, 0x18, 0x40 },
{ 0x03, 0x8E, 0x18, 0x40 },
{ 0x03, 0x8E, 0x18, 0x40 },
{ 0x03, 0x8E, 0x18, 0x40 },
{ 0x03, 0x8E, 0x18, 0x40 },
{ 0x03, 0x8E, 0x18, 0x40 },
{ 0x03, 0x8E, 0x18, 0x40 },
{ 0x03, 0x8E, 0x18, 0x40 },
{ 0x03, 0x86, 0x18, 0x40 },
{ 0x03, 0x86, 0x18, 0x40 },
{ 0x03, 0x86, 0x18, 0x40 },
{ 0x03, 0x86, 0x18, 0x40 },
{ 0x03, 0x86, 0x18, 0x40 },
{ 0x03, 0x86, 0x18, 0x40 },
{ 0x03, 0x86, 0x18, 0x40 },
{ 0x03, 0x86, 0x18, 0x40 },
{ 0x03, 0x7E, 0x18, 0x40 },
{ 0x03, 0x7E, 0x18, 0x40 },
{ 0x03, 0x7E, 0x18, 0x40 },
{ 0x03, 0x7E, 0x18, 0x40 },
{ 0x03, 0x7E, 0x18, 0x40 },
{ 0x03, 0x7E, 0x18, 0x40 },
{ 0x03, 0x7E, 0x18, 0x40 },
{ 0x03, 0x7E, 0x18, 0x40 },
{ 0x03, 0x76, 0x18, 0x40 },
{ 0x03, 0x76, 0x18, 0x40 },
{ 0x03, 0x76, 0x18, 0x40 },
{ 0x03, 0x76, 0x18, 0x40 },
{ 0x03, 0x76, 0x18, 0x40 },
{ 0x03, 0x76, 0x18, 0x40 },
{ 0x03, 0x76, 0x18, 0x40 },
{ 0x03, 0x76, 0x18, 0x40 },
{ 0x03, 0x6E, 0x18, 0x40 },
{ 0x03, 0x6E, 0x18, 0x40 },
{ 0x03, 0x6E, 0x18, 0x40 },
{ 0x03, 0x6E, 0x18, 0x40 },
{ 0x03, 0x6E, 0x18, 0x40 },
{ 0x03, 0x6E, 0x18, 0x40 },
{ 0x03, 0x6E, 0x18, 0x40 },
{ 0x03, 0x6E, 0x18, 0x40 },
{ 0x03, 0x66, 0x18, 0x40 },
{ 0x03, 0x66, 0x18, 0x40 },
{ 0x03, 0x66, 0x18, 0x40 },
{ 0x03, 0x66, 0x18, 0x40 },
{ 0x03, 0x66, 0x18, 0x40 },
{ 0x03, 0x66, 0x18, 0x40 },
{ 0x03, 0x66, 0x18, 0x40 },
{ 0x03, 0x66, 0x18, 0x40 },
{ 0x03, 0x5E, 0x18, 0x40 },
{ 0x03, 0x5E, 0x18, 0x40 },
{ 0x03, 0x5E, 0x18, 0x40 },
{ 0x03, 0x5E, 0x18, 0x40 },
{ 0x03, 0x5E, 0x18, 0x40 },
{ 0x03, 0x5E, 0x18, 0x40 },
{ 0x03, 0x5E, 0x18, 0x40 },
{ 0x03, 0x5E, 0x18, 0x40 },
{ 0x03, 0x56, 0x18, 0x40 },
{ 0x03, 0x56, 0x18, 0x40 },
{ 0x03, 0x56, 0x18, 0x40 },
{ 0x03, 0x56, 0x18, 0x40 },
{ 0x03, 0x56, 0x18, 0x40 },
{ 0x03, 0x56, 0x18, 0x40 },
{ 0x03, 0x56, 0x18, 0x40 },
{ 0x03, 0x56, 0x18, 0x40 },
{ 0x03, 0x4E, 0x18, 0x40 },
{ 0x03, 0x4E, 0x18, 0x40 },
{ 0x03, 0x4E, 0x18, 0x40 },
{ 0x03, 0x4E, 0x18, 0x40 },
{ 0x03, 0x4E, 0x18, 0x40 },
{ 0x03, 0x4E, 0x18, 0x40 },
{ 0x03, 0x4E, 0x18, 0x40 },
{ 0x03, 0x4E, 0x18, 0x40 },
{ 0x03, 0x46, 0x18, 0x40 },
{ 0x03, 0x46, 0x18, 0x40 },
{ 0x03, 0x46, 0x18, 0x40 },
{ 0x03, 0x46, 0x18, 0x40 },
{ 0x03, 0x46, 0x18, 0x40 },
{ 0x03, 0x46, 0x18, 0x40 },
{ 0x03, 0x46, 0x18, 0x40 },
{ 0x03, 0x46, 0x18, 0x40 },
{ 0x03, 0x3E, 0x18, 0x40 },
{ 0x03, 0x3E, 0x18, 0x40 },
{ 0x03, 0x3E, 0x18, 0x40 },
{ 0x03, 0x3E, 0x18, 0x40 },
{ 0x03, 0x3E, 0x18, 0x40 },
{ 0x03, 0x3E, 0x18, 0x40 },
{ 0x03, 0x3E, 0x18, 0x40 },
{ 0x03, 0x3E, 0x18, 0x40 },
{ 0x03, 0x36, 0x18, 0x40 },
{ 0x03, 0x36, 0x18, 0x40 },
{ 0x03, 0x36, 0x18, 0x40 },
{ 0x03, 0x36, 0x18, 0x40 },
{ 0x03, 0x36, 0x18, 0x40 },
{ 0x03, 0x36, 0x18, 0x40 },
{ 0x03, 0x36, 0x18, 0x40 },
{ 0x03, 0x36, 0x18, 0x40 },
{ 0x03, 0x2E, 0x18, 0x40 },
{ 0x03, 0x2E, 0x18, 0x40 },
{ 0x03, 0x2E, 0x18, 0x40 },
{ 0x03, 0x2E, 0x18, 0x40 },
{ 0x03, 0x2E, 0x18, 0x40 },
{ 0x03, 0x2E, 0x18, 0x40 },
{ 0x03, 0x2E, 0x18, 0x40 },
{ 0x03, 0x2E, 0x18, 0x40 },
{ 0x03, 0x26, 0x18, 0x40 },
{ 0x03, 0x26, 0x18, 0x40 },
{ 0x03, 0x26, 0x18, 0x40 },
{ 0x03, 0x26, 0x18, 0x40 },
{ 0x03, 0x26, 0x18, 0x40 },
{ 0x03, 0x26, 0x18, 0x40 },
{ 0x03, 0x26, 0x18, 0x40 },
{ 0x03, 0x26, 0x18, 0x40 },
{ 0x03, 0x1E, 0x18, 0x40 },
{ 0x03, 0x1E, 0x18, 0x40 },
{ 0x03, 0x1E, 0x18, 0x40 },
{ 0x03, 0x1E, 0x18, 0x40 },
{ 0x03, 0x1E, 0x18, 0x40 },
{ 0x03, 0x1E, 0x18, 0x40 },
{ 0x03, 0x1E, 0x18, 0x40 },
{ 0x03, 0x1E, 0x18, 0x40 },
{ 0x03, 0x16, 0x18, 0x40 },
{ 0x03, 0x16, 0x18, 0x40 },
{ 0x03, 0x16, 0x18, 0x40 },
{ 0x03, 0x16, 0x18, 0x40 },
{ 0x03, 0x16, 0x18, 0x40 },
{ 0x03, 0x16, 0x18, 0x40 },
{ 0x03, 0x16, 0x18, 0x40 },
{ 0x03, 0x16, 0x18, 0x40 },
{ 0x03, 0x0E, 0x18, 0x40 },
{ 0x03, 0x0E, 0x18, 0x40 },
{ 0x03, 0x0E, 0x18, 0x40 },
{ 0x03, 0x0E, 0x18, 0x40 },
{ 0x03, 0x0E, 0x18, 0x40 },
{ 0x03, 0x0E, 0x18, 0x40 },
{ 0x03, 0x0E, 0x18, 0x40 },
{ 0x03, 0x0E, 0x18, 0x40 },
{ 0x03, 0x0E, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 },
{ 0x03, 0x06, 0x18, 0x40 }
};
RLPS_EQUALIZER_RAM pmc_e1_rlps_ram_table[] =
{
{ 0x07, 0xDE, 0x18, 0x2C },
{ 0x07, 0xDE, 0x18, 0x2C },
{ 0x07, 0xD6, 0x18, 0x2C },
{ 0x07, 0xD6, 0x18, 0x2C },
{ 0x07, 0xD6, 0x18, 0x2C },
{ 0x07, 0xCE, 0x18, 0x2C },
{ 0x07, 0xCE, 0x18, 0x2C },
{ 0x07, 0xCE, 0x18, 0x2C },
{ 0x07, 0xC6, 0x18, 0x2C },
{ 0x07, 0xC6, 0x18, 0x2C },
{ 0x07, 0xC6, 0x18, 0x2C },
{ 0x07, 0xBE, 0x18, 0x2C },
{ 0x07, 0xBE, 0x18, 0x2C },
{ 0x07, 0xBE, 0x18, 0x2C },
{ 0x07, 0xBE, 0x18, 0x2C },
{ 0x07, 0xBE, 0x18, 0x2C },
{ 0x07, 0xB6, 0x18, 0x2C },
{ 0x07, 0xB6, 0x18, 0x2C },
{ 0x07, 0xB6, 0x18, 0x2C },
{ 0x07, 0xB6, 0x18, 0x2C },
{ 0x07, 0xB6, 0x18, 0x2C },
{ 0x07, 0xAE, 0x18, 0x2C },
{ 0x07, 0xAE, 0x18, 0x2C },
{ 0x07, 0xAE, 0x18, 0x2C },
{ 0x07, 0xAE, 0x18, 0x2C },
{ 0x07, 0xAE, 0x18, 0x2C },
{ 0x07, 0xB6, 0x18, 0xAC },
{ 0x07, 0xAE, 0x18, 0xAC },
{ 0x07, 0xAE, 0x18, 0xAC },
{ 0x07, 0xAE, 0x18, 0xAC },
{ 0x07, 0xAE, 0x18, 0xAC },
{ 0x07, 0xA6, 0x18, 0xAC },
{ 0x07, 0xA6, 0x18, 0xAC },
{ 0x07, 0xA6, 0x18, 0xAC },
{ 0x07, 0xA6, 0x18, 0xAC },
{ 0x07, 0x9E, 0x18, 0xAC },
{ 0x07, 0xA6, 0x19, 0x2C },
{ 0x07, 0xA6, 0x19, 0x2C },
{ 0x07, 0xA6, 0x19, 0x2C },
{ 0x0F, 0xA6, 0x19, 0x2C },
{ 0x0F, 0xA6, 0x19, 0x2C },
{ 0x0F, 0x9E, 0x19, 0x2C },
{ 0x0F, 0x9E, 0x19, 0x2C },
{ 0x0F, 0x9E, 0x19, 0x2C },
{ 0x17, 0x9E, 0x19, 0x2C },
{ 0x17, 0xA6, 0x19, 0xAC },
{ 0x17, 0x9E, 0x19, 0xAC },
{ 0x17, 0x9E, 0x19, 0xAC },
{ 0x17, 0x96, 0x19, 0xAC },
{ 0x1F, 0x96, 0x19, 0xAC },
{ 0x1F, 0x96, 0x19, 0xAC },
{ 0x1F, 0x8E, 0x19, 0xAC },
{ 0x1F, 0x8E, 0x19, 0xAC },
{ 0x1F, 0x8E, 0x19, 0xAC },
{ 0x27, 0x8E, 0x19, 0xAC },
{ 0x27, 0x8E, 0x1A, 0x2C },
{ 0x27, 0x8E, 0x1A, 0x2C },
{ 0x27, 0x8E, 0x1A, 0x2C },
{ 0x27, 0x8E, 0x1A, 0x2C },
{ 0x2F, 0x86, 0x1A, 0x2C },
{ 0x2F, 0x86, 0x1A, 0x2C },
{ 0x2F, 0x86, 0x1A, 0x2C },
{ 0x2F, 0x7E, 0x1A, 0x2C },
{ 0x2F, 0x7E, 0x1A, 0x2C },
{ 0x2F, 0x7E, 0x1A, 0x2C },
{ 0x37, 0x7E, 0x1A, 0x2C },
{ 0x37, 0x7E, 0x1A, 0xAC },
{ 0x37, 0x7E, 0x1A, 0xAC },
{ 0x37, 0x7E, 0x1A, 0xAC },
{ 0x37, 0x7E, 0x1A, 0xAC },
{ 0x3F, 0x7E, 0x2A, 0xAC },
{ 0x3F, 0x7E, 0x2A, 0xAC },
{ 0x3F, 0x76, 0x2A, 0xAC },
{ 0x3F, 0x86, 0x2B, 0x2C },
{ 0x3F, 0x7E, 0x2B, 0x2C },
{ 0x47, 0x7E, 0x2B, 0x2C },
{ 0x47, 0x7E, 0x2F, 0x2C },
{ 0x47, 0x7E, 0x2F, 0x2C },
{ 0x47, 0x7E, 0x2F, 0x2C },
{ 0x47, 0x76, 0x2F, 0x2C },
{ 0x4F, 0x76, 0x2F, 0x2C },
{ 0x4F, 0x76, 0x2F, 0x2C },
{ 0x4F, 0x6E, 0x2F, 0x2C },
{ 0x4F, 0x6E, 0x2F, 0x2C },
{ 0x4F, 0x6E, 0x2F, 0x2C },
{ 0x57, 0x6E, 0x2F, 0x2C },
{ 0x57, 0x6E, 0x2F, 0x2C },
{ 0x57, 0x6E, 0x3F, 0x2C },
{ 0x57, 0x6E, 0x3F, 0x2C },
{ 0x57, 0x6E, 0x3F, 0x2C },
{ 0x5F, 0x6E, 0x3F, 0x2C },
{ 0x5F, 0x6E, 0x4F, 0x2C },
{ 0x5F, 0x6E, 0x4F, 0x2C },
{ 0x5F, 0x6E, 0x4F, 0x2C },
{ 0x5F, 0x66, 0x4F, 0x2C },
{ 0x67, 0x66, 0x4F, 0x2C },
{ 0x67, 0x66, 0x4F, 0x2C },
{ 0x67, 0x5E, 0x4F, 0x2C },
{ 0x67, 0x5E, 0x4F, 0x2C },
{ 0x67, 0x66, 0x4F, 0x2C },
{ 0x67, 0x66, 0x4F, 0x2C },
{ 0x67, 0x66, 0x5F, 0x2C },
{ 0x6F, 0x6E, 0x5F, 0x2C },
{ 0x6F, 0x6E, 0x6F, 0x2C },
{ 0x6F, 0x6E, 0x6F, 0x2C },
{ 0x6F, 0x6E, 0x7F, 0x2C },
{ 0x6F, 0x6E, 0x7F, 0x2C },
{ 0x6F, 0x6E, 0x7F, 0x2C },
{ 0x77, 0x66, 0x7F, 0x2C },
{ 0x77, 0x66, 0x7F, 0x2C },
{ 0x77, 0x5E, 0x6F, 0x2C },
{ 0x77, 0x5E, 0x7F, 0x2C },
{ 0x77, 0x5E, 0x7F, 0x2C },
{ 0x7F, 0x5E, 0x7F, 0x2C },
{ 0x7F, 0x5E, 0x8F, 0x2C },
{ 0x7F, 0x5E, 0x8F, 0x2C },
{ 0x7F, 0x5E, 0x8F, 0x2C },
{ 0x87, 0x56, 0x8F, 0x2C },
{ 0x87, 0x56, 0x8F, 0x2C },
{ 0x87, 0x56, 0x8F, 0x2C },
{ 0x87, 0x4E, 0x8F, 0x2C },
{ 0x87, 0x4E, 0x8F, 0x2C },
{ 0x87, 0x4E, 0x8F, 0x2C },
{ 0x8F, 0x4E, 0x9F, 0x2C },
{ 0x8F, 0x4E, 0x9F, 0x2C },
{ 0x8F, 0x4E, 0xAF, 0x2C },
{ 0x8F, 0x4E, 0xAF, 0x2C },
{ 0x8F, 0x4E, 0xAF, 0x2C },
{ 0x97, 0x4E, 0xAF, 0x2C },
{ 0x97, 0x4E, 0xAF, 0x2C },
{ 0x97, 0x4E, 0xAB, 0x2C },
{ 0x97, 0x4E, 0xAB, 0x2C },
{ 0x97, 0x4E, 0xAB, 0x2C },
{ 0x9F, 0x4E, 0xAB, 0x2C },
{ 0x9F, 0x4E, 0xBB, 0x2C },
{ 0x9F, 0x4E, 0xBB, 0x2C },
{ 0x9F, 0x4E, 0xBB, 0x2C },
{ 0x9F, 0x4E, 0xCB, 0x2C },
{ 0xA7, 0x4E, 0xCB, 0x2C },
{ 0xA7, 0x4E, 0xCB, 0x2C },
{ 0xA7, 0x46, 0xCB, 0x2C },
{ 0xA7, 0x46, 0xCB, 0x2C },
{ 0xA7, 0x46, 0xCB, 0x2C },
{ 0xA7, 0x46, 0xDB, 0x2C },
{ 0xAF, 0x46, 0xDB, 0x2C },
{ 0xAF, 0x46, 0xEB, 0x2C },
{ 0xAF, 0x46, 0xEB, 0x2C },
{ 0xAF, 0x4E, 0xEB, 0x2C },
{ 0xAE, 0x4E, 0xEB, 0x2C },
{ 0xAE, 0x4E, 0xEB, 0x2C },
{ 0xB5, 0x46, 0xFB, 0x2C },
{ 0xB5, 0x54, 0xFB, 0x2C },
{ 0xB5, 0x4C, 0xFB, 0x2C },
{ 0xB5, 0x54, 0xFB, 0x2C },
{ 0xB5, 0x54, 0xFB, 0x2C },
{ 0xBD, 0x54, 0xFB, 0x2C },
{ 0xBD, 0x4C, 0xFB, 0x2C },
{ 0xBD, 0x4C, 0xFB, 0x2C },
{ 0xBD, 0x4C, 0xFB, 0x2C },
{ 0xBD, 0x44, 0xEB, 0x2C },
{ 0xC5, 0x44, 0xFB, 0x2C },
{ 0xC5, 0x44, 0xFB, 0x2C },
{ 0xC5, 0x44, 0xFB, 0x2C },
{ 0xC5, 0x45, 0x0B, 0x2C },
{ 0xC5, 0x45, 0x0B, 0x2C },
{ 0xC5, 0x45, 0x0B, 0x2C },
{ 0xCD, 0x45, 0x0B, 0x2C },
{ 0xCD, 0x45, 0x0B, 0x2C },
{ 0xCD, 0x3D, 0x0B, 0x2C },
{ 0xCD, 0x3D, 0x0B, 0x2C },
{ 0xCD, 0x3D, 0x0B, 0x2C },
{ 0xD5, 0x3D, 0x0B, 0x2C },
{ 0xD5, 0x3D, 0x0B, 0x2C },
{ 0xD5, 0x3D, 0x1B, 0x2C },
{ 0xD5, 0x3D, 0x1B, 0x2C },
{ 0xD5, 0x3D, 0x1B, 0x2C },
{ 0xDD, 0x3D, 0x1B, 0x2C },
{ 0xDD, 0x3D, 0x1B, 0x2C },
{ 0xDD, 0x35, 0x1B, 0x2C },
{ 0xDD, 0x35, 0x1B, 0x2C },
{ 0xDD, 0x35, 0x1B, 0x2C },
{ 0xE5, 0x35, 0x1B, 0x2C },
{ 0xE5, 0x35, 0x1B, 0x2C },
{ 0xE5, 0x2D, 0x1B, 0x2C },
{ 0xE5, 0x2D, 0x1B, 0x2C },
{ 0xE5, 0x2D, 0x3B, 0x2C },
{ 0xED, 0x2D, 0x4B, 0x2C },
{ 0xED, 0x2D, 0x1B, 0xA8 },
{ 0xED, 0x2D, 0x1B, 0xAC },
{ 0xED, 0x2D, 0x17, 0xAC },
{ 0xED, 0x2D, 0x17, 0xAC },
{ 0xED, 0x2D, 0x27, 0xAC },
{ 0xF5, 0x2D, 0x27, 0xAC },
{ 0xF5, 0x2D, 0x27, 0xAC },
{ 0xF5, 0x2D, 0x2B, 0xAC },
{ 0xF5, 0x2D, 0x2B, 0xAC },
{ 0xF5, 0x2D, 0x2B, 0xAC },
{ 0xFD, 0x2D, 0x2B, 0xAC },
{ 0xFD, 0x2B, 0x2B, 0xAC },
{ 0xFD, 0x2B, 0x2B, 0xAC },
{ 0xFD, 0x2B, 0x2B, 0xAC },
{ 0xFD, 0x2B, 0x2B, 0xAC },
{ 0xFD, 0x23, 0x2B, 0xAC },
{ 0xFD, 0x23, 0x2B, 0xAC },
{ 0xFD, 0x23, 0x2B, 0xAC },
{ 0xFD, 0x21, 0x2B, 0xAC },
{ 0xFD, 0x21, 0x2B, 0xAC },
{ 0xFD, 0x29, 0x2B, 0xAC },
{ 0xFD, 0x29, 0x2B, 0xAC },
{ 0xFD, 0x29, 0x27, 0xAC },
{ 0xFD, 0x29, 0x37, 0xAC },
{ 0xFD, 0x29, 0x23, 0xAC },
{ 0xFD, 0x29, 0x23, 0xAC },
{ 0xFD, 0x29, 0x23, 0xAC },
{ 0xFD, 0x29, 0x23, 0xAC },
{ 0xFD, 0x21, 0x23, 0xAC },
{ 0xFD, 0x21, 0x23, 0xAC },
{ 0xFD, 0x21, 0x23, 0xAC },
{ 0xFD, 0x21, 0x33, 0xAC },
{ 0xFD, 0x21, 0x33, 0xAC },
{ 0xFD, 0x21, 0x33, 0xAC },
{ 0xFD, 0x21, 0x43, 0xAC },
{ 0xFD, 0x21, 0x43, 0xAC },
{ 0xFD, 0x21, 0x43, 0xAC },
{ 0xFC, 0x21, 0x43, 0xAC },
{ 0xFC, 0x21, 0x43, 0xAC },
{ 0xFC, 0x19, 0x43, 0xAC },
{ 0xFC, 0x19, 0x43, 0xAC },
{ 0xFC, 0x19, 0x43, 0xAC },
{ 0xFC, 0x19, 0x43, 0xAC },
{ 0xFC, 0x19, 0x53, 0xAC },
{ 0xFC, 0x19, 0x53, 0xAC },
{ 0xFC, 0x19, 0x53, 0xAC },
{ 0xFC, 0x19, 0x53, 0xAC },
{ 0xFC, 0x19, 0x63, 0xAC },
{ 0xFC, 0x19, 0x63, 0xAC },
{ 0xFC, 0x19, 0x63, 0xAC },
{ 0xFC, 0x19, 0x73, 0xAC },
{ 0xFC, 0x19, 0x73, 0xAC },
{ 0xFC, 0x19, 0x73, 0xAC },
{ 0xFC, 0x19, 0x73, 0xAC },
{ 0xFC, 0x19, 0x73, 0xAC },
{ 0xFC, 0x19, 0x83, 0xAC },
{ 0xFC, 0x19, 0x83, 0xAC },
{ 0xFC, 0x19, 0x83, 0xAC },
{ 0xFC, 0x19, 0x83, 0xAC },
{ 0xFC, 0x19, 0x83, 0xAC },
{ 0xFC, 0x19, 0x93, 0xAC },
{ 0xFC, 0x19, 0x93, 0xAC },
{ 0xFC, 0x19, 0x93, 0xAC },
{ 0xFC, 0x19, 0xA3, 0xAC },
{ 0xFC, 0x19, 0xA3, 0xAC },
{ 0xFC, 0x19, 0xB3, 0xAC },
{ 0xFC, 0x19, 0xB3, 0xAC },
{ 0xFC, 0x19, 0xB3, 0xAC },
{ 0xFC, 0x19, 0xB3, 0xAC }
};
RLPS_EQUALIZER_RAM pmc4_e1_rlps_ram_table[] =
{
{ 0x0F, 0xD6, 0x1C, 0x2C }, /* 0d */
{ 0x0F, 0xD6, 0x1C, 0x2C }, /* 1d */
{ 0x0F, 0xD6, 0x2C, 0x2C }, /* 2d */
{ 0x0F, 0xD6, 0x2C, 0x2C }, /* 3d */
{ 0x0F, 0xD6, 0x3C, 0x2C }, /* 4d */
{ 0x0F, 0xD6, 0x3C, 0x2C }, /* 5d */
{ 0x0F, 0xCE, 0x3C, 0x2C }, /* 6d */
{ 0x0F, 0xCE, 0x3C, 0x2C }, /* 7d */
{ 0x0F, 0xCE, 0x3C, 0x2C }, /* 8d */
{ 0x17, 0xCE, 0x3C, 0x2C }, /* 9d */
{ 0x17, 0xCE, 0x3C, 0x2C }, /* 10d */
{ 0x17, 0xCE, 0x4C, 0x2C }, /* 11d */
{ 0x17, 0xCE, 0x4C, 0x2C }, /* 12d */
{ 0x17, 0xCE, 0x4C, 0x2C }, /* 13d */
{ 0x17, 0xCE, 0x4C, 0x2C }, /* 14d */
{ 0x17, 0xCE, 0x4C, 0x2C }, /* 15d */
{ 0x17, 0xCE, 0x4C, 0x2C }, /* 16d */
{ 0x1F, 0xC6, 0x4C, 0x2C }, /* 17d */
{ 0x1F, 0xC6, 0x4C, 0x2C }, /* 18d */
{ 0x1F, 0xC6, 0x4C, 0x2C }, /* 19d */
{ 0x1F, 0xC6, 0x4C, 0x2C }, /* 20d */
{ 0x1F, 0xC6, 0x4C, 0x2C }, /* 21d */
{ 0x1F, 0xC6, 0x5C, 0x2C }, /* 22d */
{ 0x1F, 0xC6, 0x5C, 0x2C }, /* 23d */
{ 0x1F, 0xC6, 0x5C, 0x2C }, /* 24d */
{ 0x1F, 0xC6, 0x5C, 0x2C }, /* 25d */
{ 0x27, 0xC6, 0x5C, 0x2C }, /* 26d */
{ 0x27, 0xC6, 0x5C, 0x2C }, /* 27d */
{ 0x27, 0xC6, 0x7C, 0x32 }, /* 28d */
{ 0x27, 0xC6, 0x8C, 0x32 }, /* 29d */
{ 0x27, 0xC6, 0x9C, 0x32 }, /* 30d */
{ 0x27, 0xC6, 0xAC, 0x32 }, /* 31d */
{ 0x27, 0xC6, 0xBC, 0x32 }, /* 32d */
{ 0x27, 0xC6, 0xCC, 0x32 }, /* 33d */
{ 0x2F, 0xC6, 0xDC, 0x32 }, /* 34d */
{ 0x2F, 0xC6, 0xEC, 0x32 }, /* 35d */
{ 0x2F, 0xC7, 0x0C, 0x32 }, /* 36d */
{ 0x2F, 0xC7, 0x2C, 0x32 }, /* 37d */
{ 0x2F, 0xBC, 0x68, 0x32 }, /* 38d */
{ 0x2F, 0xBC, 0x68, 0x2C }, /* 39d */
{ 0x2F, 0xB4, 0x68, 0x2C }, /* 40d */
{ 0x2F, 0xB4, 0x68, 0x2C }, /* 41d */
{ 0x37, 0xB4, 0x68, 0x2C }, /* 42d */
{ 0x37, 0xB4, 0x78, 0x2C }, /* 43d */
{ 0x37, 0xB4, 0x78, 0x2C }, /* 44d */
{ 0x37, 0xB4, 0x78, 0x2C }, /* 45d */
{ 0x37, 0xB4, 0x78, 0x2C }, /* 46d */
{ 0x37, 0xB4, 0x78, 0x2C }, /* 47d */
{ 0x37, 0xB4, 0x78, 0x2C }, /* 48d */
{ 0x37, 0xAC, 0x78, 0x2C }, /* 49d */
{ 0x37, 0xAC, 0x78, 0x2C }, /* 50d */
{ 0x3F, 0xAC, 0x78, 0x2C }, /* 51d */
{ 0x3F, 0xAC, 0x78, 0x2C }, /* 52d */
{ 0x3F, 0xAC, 0x78, 0x2C }, /* 53d */
{ 0x3F, 0xAC, 0x78, 0x2C }, /* 54d */
{ 0x3F, 0xAC, 0x78, 0x2C }, /* 55d */
{ 0x3F, 0xAC, 0x78, 0x2C }, /* 56d */
{ 0x3F, 0xAC, 0x78, 0x2C }, /* 57d */
{ 0x3F, 0xAC, 0x78, 0x2C }, /* 58d */
{ 0x47, 0xAC, 0x78, 0x2C }, /* 59d */
{ 0x47, 0xAC, 0x88, 0x2C }, /* 60d */
{ 0x47, 0xAC, 0x88, 0x2C }, /* 61d */
{ 0x47, 0xAC, 0x98, 0x2C }, /* 62d */
{ 0x47, 0xAC, 0x98, 0x2C }, /* 63d */
{ 0x47, 0xAC, 0x68, 0xAC }, /* 64d */
{ 0x47, 0xAC, 0x68, 0xAC }, /* 65d */
{ 0x47, 0xAC, 0x78, 0xAC }, /* 66d */
{ 0x4F, 0xAC, 0x78, 0xAC }, /* 67d */
{ 0x4F, 0xA4, 0x88, 0xAC }, /* 68d */
{ 0x4F, 0xA4, 0x88, 0xAC }, /* 69d */
{ 0x4F, 0xA4, 0x98, 0xAC }, /* 70d */
{ 0x4F, 0x9C, 0x98, 0xAC }, /* 71d */
{ 0x4F, 0x9C, 0x98, 0xAC }, /* 72d */
{ 0x4F, 0x9C, 0x98, 0xAC }, /* 73d */
{ 0x4F, 0x9C, 0x98, 0xAC }, /* 74d */
{ 0x4F, 0x9C, 0xA8, 0xAC }, /* 75d */
{ 0x57, 0x9C, 0xA8, 0xAC }, /* 76d */
{ 0x57, 0x9C, 0xA8, 0xAC }, /* 77d */
{ 0x57, 0x9C, 0xA8, 0xAC }, /* 78d */
{ 0x57, 0x9C, 0xA8, 0xAC }, /* 79d */
{ 0x57, 0x9C, 0xA8, 0xAC }, /* 80d */
{ 0x57, 0x9C, 0xA8, 0xAC }, /* 81d */
{ 0x57, 0x94, 0xA8, 0xAC }, /* 82d */
{ 0x57, 0x94, 0xA8, 0xAC }, /* 83d */
{ 0x5F, 0x94, 0xA8, 0xAC }, /* 84d */
{ 0x5F, 0x94, 0xA8, 0xAC }, /* 85d */
{ 0x5F, 0x94, 0xB8, 0xAC }, /* 86d */
{ 0x5F, 0x94, 0xB8, 0xAC }, /* 87d */
{ 0x5F, 0x94, 0xB8, 0xAC }, /* 88d */
{ 0x5F, 0x94, 0xB8, 0xAC }, /* 89d */
{ 0x5F, 0x94, 0xB8, 0xAC }, /* 90d */
{ 0x5F, 0x94, 0xB8, 0xAC }, /* 91d */
{ 0x67, 0x94, 0xB8, 0xAC }, /* 92d */
{ 0x67, 0x8C, 0xB8, 0xAC }, /* 93d */
{ 0x67, 0x8C, 0xB8, 0xAC }, /* 94d */
{ 0x67, 0x8C, 0xB8, 0xAC }, /* 95d */
{ 0x67, 0x8C, 0x99, 0x2C }, /* 96d */
{ 0x67, 0x8C, 0x99, 0x2C }, /* 97d */
{ 0x67, 0x8C, 0x99, 0x2C }, /* 98d */
{ 0x67, 0x8C, 0xA9, 0x2C }, /* 99d */
{ 0x67, 0x8C, 0xA9, 0x2C }, /* 100d */
{ 0x6F, 0x8C, 0xB9, 0x2C }, /* 101d */
{ 0x6F, 0x8C, 0xB9, 0x2C }, /* 102d */
{ 0x6F, 0x8C, 0xC9, 0x2C }, /* 103d */
{ 0x6F, 0x84, 0xC9, 0x2C }, /* 104d */
{ 0x6F, 0x84, 0xC9, 0x2C }, /* 105d */
{ 0x6F, 0x84, 0xE9, 0x2C }, /* 106d */
{ 0x6F, 0x85, 0x09, 0x2C }, /* 107d */
{ 0x6F, 0x85, 0x29, 0x2C }, /* 108d */
{ 0x77, 0x85, 0x09, 0x2C }, /* 109d */
{ 0x77, 0x84, 0xF5, 0x22 }, /* 110d */
{ 0x77, 0x84, 0xF5, 0x22 }, /* 111d */
{ 0x77, 0x84, 0xD5, 0xAC }, /* 112d */
{ 0x77, 0x84, 0xD5, 0xAC }, /* 113d */
{ 0x77, 0x7C, 0xD5, 0xAC }, /* 114d */
{ 0x77, 0x7C, 0xE5, 0xAC }, /* 115d */
{ 0x77, 0x7C, 0xF5, 0xAC }, /* 116d */
{ 0x77, 0x7D, 0x05, 0xAC }, /* 117d */
{ 0x7F, 0x7D, 0x15, 0xAC }, /* 118d */
{ 0x7F, 0x7D, 0x25, 0xAC }, /* 119d */
{ 0x7F, 0x72, 0xE5, 0xAC }, /* 120d */
{ 0x7F, 0x72, 0xE5, 0xAC }, /* 121d */
{ 0x7F, 0x72, 0xE5, 0xAC }, /* 122d */
{ 0x7F, 0x72, 0xE5, 0xAC }, /* 123d */
{ 0x7F, 0x72, 0xE5, 0xAC }, /* 124d */
{ 0x7F, 0x72, 0xE5, 0xAC }, /* 125d */
{ 0x87, 0x73, 0x05, 0xAC }, /* 126d */
{ 0x87, 0x73, 0x05, 0xAC }, /* 127d */
{ 0x87, 0x73, 0x05, 0xAC }, /* 128d */
{ 0x86, 0x72, 0xF6, 0x2C }, /* 129d */
{ 0x86, 0x72, 0xF6, 0x2C }, /* 130d */
{ 0x86, 0x72, 0xF6, 0x2C }, /* 131d */
{ 0x86, 0x72, 0xF6, 0x2C }, /* 132d */
{ 0x86, 0x72, 0xF6, 0x2C }, /* 133d */
{ 0x8E, 0x72, 0xF6, 0x2C }, /* 134d */
{ 0x8E, 0x72, 0xF6, 0x2C }, /* 135d */
{ 0x8E, 0x6A, 0xF6, 0x2C }, /* 136d */
{ 0x8E, 0x6A, 0xF6, 0x2C }, /* 137d */
{ 0x8E, 0x6A, 0xF6, 0x2C }, /* 138d */
{ 0x8E, 0x6B, 0x06, 0x2C }, /* 139d */
{ 0x8E, 0x6B, 0x06, 0x2C }, /* 140d */
{ 0x8E, 0x6B, 0x06, 0x2C }, /* 141d */
{ 0x8E, 0x6B, 0x06, 0x2C }, /* 142d */
{ 0x96, 0x6B, 0x06, 0x2C }, /* 143d */
{ 0x96, 0x6B, 0x06, 0xAC }, /* 144d */
{ 0x95, 0x6B, 0x06, 0xAC }, /* 145d */
{ 0x95, 0x6B, 0x06, 0xAC }, /* 146d */
{ 0x95, 0x63, 0x06, 0xAC }, /* 147d */
{ 0x95, 0x63, 0x06, 0xAC }, /* 148d */
{ 0x95, 0x63, 0x06, 0xAC }, /* 149d */
{ 0x95, 0x63, 0x16, 0xAC }, /* 150d */
{ 0x9D, 0x63, 0x16, 0xAC }, /* 151d */
{ 0x9D, 0x63, 0x16, 0xAC }, /* 152d */
{ 0x9D, 0x63, 0x16, 0xAC }, /* 153d */
{ 0x9D, 0x63, 0x16, 0xAC }, /* 154d */
{ 0x9D, 0x63, 0x16, 0xAC }, /* 155d */
{ 0x9D, 0x5B, 0x16, 0xAC }, /* 156d */
{ 0x9D, 0x5B, 0x16, 0xAC }, /* 157d */
{ 0x9D, 0x5B, 0x26, 0xAC }, /* 158d */
{ 0xA5, 0x5B, 0x26, 0xAC }, /* 159d */
{ 0xA5, 0x5A, 0xF7, 0x2C }, /* 160d */
{ 0xA5, 0x5A, 0xF7, 0x2C }, /* 161d */
{ 0xA5, 0x5B, 0x07, 0x2C }, /* 162d */
{ 0xA5, 0x5B, 0x07, 0x2C }, /* 163d */
{ 0xA5, 0x5B, 0x17, 0x2C }, /* 164d */
{ 0xA5, 0x5B, 0x17, 0x2C }, /* 165d */
{ 0xA5, 0x5B, 0x27, 0x2C }, /* 166d */
{ 0xA5, 0x5B, 0x27, 0x2C }, /* 167d */
{ 0xAD, 0x5B, 0x27, 0x2C }, /* 168d */
{ 0xAD, 0x53, 0x27, 0x2C }, /* 169d */
{ 0xAD, 0x53, 0x27, 0x2C }, /* 170d */
{ 0xAD, 0x53, 0x37, 0x2C }, /* 171d */
{ 0xAD, 0x53, 0x37, 0x2C }, /* 172d */
{ 0xAD, 0x53, 0x37, 0x2C }, /* 173d */
{ 0xAD, 0x53, 0x37, 0x2C }, /* 174d */
{ 0xAD, 0x53, 0x37, 0x2C }, /* 175d */
{ 0xB5, 0x53, 0x37, 0x2C }, /* 176d */
{ 0xB5, 0x53, 0x33, 0x2C }, /* 177d */
{ 0xB5, 0x53, 0x33, 0x2C }, /* 178d */
{ 0xB5, 0x53, 0x33, 0x2C }, /* 179d */
{ 0xB5, 0x53, 0x43, 0x2C }, /* 180d */
{ 0xB5, 0x53, 0x43, 0x2C }, /* 181d */
{ 0xB5, 0x53, 0x43, 0x2C }, /* 182d */
{ 0xB5, 0x49, 0x03, 0x2C }, /* 183d */
{ 0xBD, 0x49, 0x03, 0x2C }, /* 184d */
{ 0xBD, 0x49, 0x13, 0x2C }, /* 185d */
{ 0xBD, 0x49, 0x23, 0x2C }, /* 186d */
{ 0xBD, 0x49, 0x33, 0x2C }, /* 187d */
{ 0xBD, 0x49, 0x33, 0x2C }, /* 188d */
{ 0xBD, 0x49, 0x33, 0x2C }, /* 189d */
{ 0xBD, 0x49, 0x33, 0x2C }, /* 190d */
{ 0xBD, 0x49, 0x33, 0x2C }, /* 191d */
{ 0xBD, 0x49, 0x33, 0x2C }, /* 192d */
{ 0xC5, 0x49, 0x33, 0x2C }, /* 193d */
{ 0xC5, 0x49, 0x43, 0x2C }, /* 194d */
{ 0xC5, 0x49, 0x43, 0x2C }, /* 195d */
{ 0xC5, 0x49, 0x53, 0x2C }, /* 196d */
{ 0xC5, 0x41, 0x53, 0x2C }, /* 197d */
{ 0xC5, 0x41, 0x53, 0x2C }, /* 198d */
{ 0xC5, 0x41, 0x53, 0x2C }, /* 199d */
{ 0xC5, 0x41, 0x53, 0x2C }, /* 200d */
{ 0xCD, 0x39, 0x53, 0x2C }, /* 201d */
{ 0xCD, 0x39, 0x53, 0x2C }, /* 202d */
{ 0xCD, 0x39, 0x63, 0x2C }, /* 203d */
{ 0xCD, 0x39, 0x63, 0x2C }, /* 204d */
{ 0xCC, 0x39, 0x63, 0x2C }, /* 205d */
{ 0xCC, 0x39, 0x63, 0x2C }, /* 206d */
{ 0xCC, 0x39, 0x63, 0xAC }, /* 207d */
{ 0xCC, 0x39, 0x63, 0xAC }, /* 208d */
{ 0xCC, 0x39, 0x63, 0xAC }, /* 209d */
{ 0xD4, 0x39, 0x63, 0xAC }, /* 210d */
{ 0xD4, 0x39, 0x63, 0xAC }, /* 211d */
{ 0xD4, 0x31, 0x63, 0xAC }, /* 212d */
{ 0xD4, 0x31, 0x63, 0xAC }, /* 213d */
{ 0xD4, 0x31, 0x73, 0xAC }, /* 214d */
{ 0xD4, 0x31, 0x73, 0xAC }, /* 215d */
{ 0xD4, 0x31, 0x73, 0xAC }, /* 216d */
{ 0xD4, 0x31, 0x73, 0xAC }, /* 217d */
{ 0xDC, 0x31, 0x73, 0xAC }, /* 218d */
{ 0xDC, 0x31, 0x73, 0xAC }, /* 219d */
{ 0xDC, 0x31, 0x73, 0xAC }, /* 220d */
{ 0xDC, 0x31, 0x73, 0xAC }, /* 221d */
{ 0xDC, 0x31, 0x73, 0xAC }, /* 222d */
{ 0xDC, 0x29, 0x73, 0xAC }, /* 223d */
{ 0xDC, 0x29, 0x73, 0xAC }, /* 224d */
{ 0xDC, 0x29, 0x83, 0xAC }, /* 225d */
{ 0xE4, 0x29, 0x83, 0xAC }, /* 226d */
{ 0xE4, 0x29, 0x83, 0xAC }, /* 227d */
{ 0xE4, 0x29, 0x83, 0xAC }, /* 228d */
{ 0xE4, 0x29, 0x83, 0xAC }, /* 229d */
{ 0xE4, 0x29, 0x83, 0xAC }, /* 230d */
{ 0xE4, 0x29, 0x83, 0xAC }, /* 231d */
{ 0xE4, 0x29, 0x83, 0xAC }, /* 232d */
{ 0xE4, 0x29, 0x83, 0xAC }, /* 233d */
{ 0xE4, 0x21, 0x83, 0xAC }, /* 234d */
{ 0xEC, 0x21, 0x93, 0xAC }, /* 235d */
{ 0xEC, 0x21, 0x93, 0xAC }, /* 236d */
{ 0xEC, 0x21, 0x93, 0xAC }, /* 237d */
{ 0xEC, 0x21, 0x93, 0xAC }, /* 238d */
{ 0xEC, 0x21, 0x93, 0xAC }, /* 239d */
{ 0xEC, 0x21, 0x93, 0xAC }, /* 240d */
{ 0xEC, 0x21, 0x93, 0xAC }, /* 241d */
{ 0xEC, 0x21, 0x93, 0xAC }, /* 242d */
{ 0xF4, 0x21, 0x93, 0xAC }, /* 243d */
{ 0xF4, 0x21, 0x93, 0xAC }, /* 244d */
{ 0xF4, 0x19, 0x93, 0xAC }, /* 245d */
{ 0xF4, 0x19, 0xA3, 0xAC }, /* 246d */
{ 0xF4, 0x19, 0xA3, 0xAC }, /* 247d */
{ 0xF4, 0x19, 0xA3, 0xAC }, /* 248d */
{ 0xF4, 0x19, 0xA3, 0xAC }, /* 249d */
{ 0xF4, 0x19, 0xA3, 0xAC }, /* 250d */
{ 0xFC, 0x19, 0xA3, 0xAC }, /* 251d */
{ 0xFC, 0x19, 0xA3, 0xAC }, /* 252d */
{ 0xFC, 0x19, 0xA3, 0xAC }, /* 253d */
{ 0xFC, 0x19, 0xA3, 0xAC }, /* 254d */
{ 0xFC, 0x19, 0xA3, 0xAC } /* 255d */
};
/******************************************************************************
* FUNCTION PROTOTYPES
******************************************************************************/
static int sdla_te_reset(void* pfe, int port_no, int reset);
static int sdla_te_global_config(void* pfe);
static int sdla_te_global_unconfig(void* pfe);
static int sdla_te_config(void* pfe);
static int sdla_te_unconfig(void* pfe);
static int sdla_te_post_init(void *pfe);
static int sdla_te_post_unconfig(void* pfe);
static void ClearTemplate(sdla_fe_t* fe);
static unsigned char PrgTransmitTemplate(sdla_fe_t* fe);
static void InitLineReceiver(sdla_fe_t* fe, RLPS_EQUALIZER_RAM* rlps_table);
static void ClearTPSCReg(sdla_fe_t* fe);
static void ClearRPSCReg(sdla_fe_t* fe);
static int WriteTPSCReg(sdla_fe_t*, int reg, int channel, unsigned char value);
static unsigned char ReadTPSCReg(sdla_fe_t* fe, int reg, int channel);
static int WriteRPSCReg(sdla_fe_t*, int reg, int channel, unsigned char value);
static unsigned char ReadRPSCReg(sdla_fe_t* fe, int reg, int channel);
#if 0
static int WriteSIGXReg(sdla_fe_t*, int reg, int channel, unsigned char value);
#endif
static unsigned char ReadSIGXReg(sdla_fe_t* fe, int reg, int channel);
#if 0
static void sdla_channels(void*, unsigned long);
#endif
static void DisableAllChannels(sdla_fe_t* fe);
static void EnableChannels(sdla_fe_t* fe);
static int DisableTxChannel(sdla_fe_t* fe, int channel);
static int DisableRxChannel(sdla_fe_t* fe, int channel);
static int EnableTxChannel(sdla_fe_t* fe, int channel);
static int EnableRxChannel(sdla_fe_t* fe, int channel);
static int sdla_te_reconfig(sdla_fe_t* fe);
static void sdla_te_set_intr(sdla_fe_t* fe);
static void sdla_te_clear_intr(sdla_fe_t* fe);
static void sdla_te_tx_intr(sdla_fe_t*);
static void sdla_te_rx_intr(sdla_fe_t*);
static void sdla_t1_rx_intr(sdla_fe_t*);
static void sdla_e1_rx_intr(sdla_fe_t*);
static int sdla_te_disable_irq(void* pfe);
static int sdla_te_intr(sdla_fe_t *);
static int sdla_te_check_intr(sdla_fe_t *);
static int sdla_te_polling(sdla_fe_t*);
static int sdla_te_udp(sdla_fe_t*, void*, unsigned char*);
static void sdla_te_set_status(sdla_fe_t*, u_int32_t );
static int sdla_te_get_snmp_data(sdla_fe_t* fe, void* pdev, void* data);
static int sdla_te_set_lbmode(sdla_fe_t*, u_int8_t, u_int8_t, u_int32_t);
static int sdla_t1_boc(sdla_fe_t *fe, u_int8_t boc_status);
static int sdla_te_linelb(sdla_fe_t*, unsigned char);
static int sdla_te_paylb(sdla_fe_t*, unsigned char);
static int sdla_te_ddlb(sdla_fe_t*, unsigned char);
static int sdla_te_tx_lb(sdla_fe_t*, unsigned char, unsigned char);
static int sdla_te_txlbcode_done(sdla_fe_t *fe);
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
static void sdla_te_timer(void*);
#elif defined(__WINDOWS__)
static void sdla_te_timer(IN PKDPC,void*,void*,void*);
#elif defined(KERN_TIMER_SETUP) && KERN_TIMER_SETUP > 0
static void sdla_te_timer(struct timer_list *t);
#else
static void sdla_te_timer(unsigned long);
#endif
static int sdla_te_check_rbsbits(sdla_fe_t*, int, unsigned int, int);
static unsigned char sdla_te_read_rbsbits(sdla_fe_t*, int, int);
static int sdla_te_set_rbsbits(sdla_fe_t*, int, unsigned char);
static int sdla_te_rbs_report(sdla_fe_t* fe);
static int sdla_te_rbs_print(sdla_fe_t* fe, int);
#if 0
static void sdla_te_abcd_update(sdla_fe_t* fe);
#endif
static int sdla_te_pmon(sdla_fe_t *fe, int);
static int sdla_te_flush_pmon(sdla_fe_t *fe);
static u_int32_t sdla_te_read_alarms(sdla_fe_t *fe, int action);
static int sdla_te_print_alarms(sdla_fe_t* fe, unsigned int);
static char* sdla_te_print_channels(sdla_fe_t* fe);
static int sdla_te_set_alarms(sdla_fe_t* pfe, u_int32_t);
static int sdla_te_clear_alarms(sdla_fe_t* pfe, u_int32_t);
static int sdla_te_sigctrl(sdla_fe_t*, int, unsigned long, int);
static int sdla_te_add_event(sdla_fe_t*, sdla_fe_timer_event_t*);
static int sdla_te_add_timer(sdla_fe_t*, unsigned long);
static int sdla_te_update_alarm_info(sdla_fe_t*, struct seq_file*, int*);
static int sdla_te_update_pmon_info(sdla_fe_t*, struct seq_file*, int*);
static int sdla_te_led_ctrl(sdla_fe_t *fe, int mode);
/******************************************************************************
* FUNCTION DEFINITIONS
******************************************************************************/
/******************************************************************************
* sdla_te3_get_fe_status()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static char* sdla_te_get_fe_media_string(void)
{
return ("S514/AFT T1/E1");
}
/******************************************************************************
* sdla_te3_get_fe_status()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static unsigned char sdla_te_get_fe_media(sdla_fe_t *fe)
{
return fe->fe_cfg.media;
}
/******************************************************************************
*sdla_te_get_fe_status()
*
* Description : Get current FE line state - is it Connected or Disconnected
*
* Arguments : fe - pointer to Front End structure.
* status - pointer to location where the FE line state will
* be stored.
* notused - ignored
*
* Returns : always zero.
*******************************************************************************/
static int sdla_te_get_fe_status(sdla_fe_t *fe, unsigned char *status, int notused)
{
*status = fe->fe_status;
return 0;
}
/*
******************************************************************************
* ClearTemplate()
*
* Description:
* Arguments: None.
* Returns: None.
******************************************************************************
*/
static void ClearTemplate(sdla_fe_t* fe)
{
int i = 0, j = 0;
unsigned char indirect_addr = 0x00;
for(i = FIRST_UI; i <= LAST_UI; i++) {
for(j = FIRST_SAMPLE; j <= LAST_SAMPLE; j++) {
indirect_addr = (j << 3) | i;
/* Set up the indirect address */
WRITE_REG(REG_XLPG_WAVEFORM_ADDR, indirect_addr);
WRITE_REG(REG_XLPG_WAVEFORM_DATA, 0x00);
}
}
}
/*
******************************************************************************
* PrgTransmitTemplate()
*
* Description:
* Arguments: None.
* Returns: None.
******************************************************************************
*/
static unsigned char PrgTransmitTemplate(sdla_fe_t* fe)
{
int i = 0, j = 0;
unsigned char indirect_addr = 0x00, xlpg_scale = 0x00;
TX_WAVEFORM* tx_waveform = NULL;
if (IS_T1_FEMEDIA(fe)) {
switch(WAN_TE1_LBO(fe)) {
case WAN_T1_LBO_0_DB:
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
tx_waveform = &pmc4_t1_tx_waveform_lh_0db;
/* ALEX Jan 24, 2005
** XLPG scale value is change to 0x0D
** (certification). Original value is 0x0C. */
xlpg_scale = 0x0D;
}else{
tx_waveform = &pmc_t1_tx_waveform_lh_0db;
xlpg_scale = 0x0C;
}
break;
case WAN_T1_LBO_75_DB:
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
tx_waveform = &pmc4_t1_tx_waveform_lh_75db;
xlpg_scale = 0x08;
}else{
tx_waveform = &pmc_t1_tx_waveform_lh_75db;
xlpg_scale = 0x07;
}
break;
case WAN_T1_LBO_15_DB:
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
tx_waveform = &pmc4_t1_tx_waveform_lh_15db;
}else{
tx_waveform = &pmc4_t1_tx_waveform_lh_15db;
}
xlpg_scale = 0x03;
break;
case WAN_T1_LBO_225_DB:
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
tx_waveform = &pmc4_t1_tx_waveform_lh_225db;
}else{
tx_waveform = &pmc_t1_tx_waveform_lh_225db;
}
xlpg_scale = 0x02;
break;
case WAN_T1_0_110:
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
tx_waveform = &pmc4_t1_tx_waveform_sh_110ft;
xlpg_scale = 0x0D;
}else{
tx_waveform = &pmc_t1_tx_waveform_sh_110ft;
xlpg_scale = 0x0C;
}
break;
case WAN_T1_110_220:
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
tx_waveform = &pmc4_t1_tx_waveform_sh_220ft;
xlpg_scale = 0x11;
}else{
tx_waveform = &pmc_t1_tx_waveform_sh_220ft;
xlpg_scale = 0x10;
}
break;
case WAN_T1_220_330:
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
tx_waveform = &pmc4_t1_tx_waveform_sh_330ft;
xlpg_scale = 0x12;
}else{
tx_waveform = &pmc_t1_tx_waveform_sh_330ft;
xlpg_scale = 0x11;
}
break;
case WAN_T1_330_440:
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
tx_waveform = &pmc4_t1_tx_waveform_sh_440ft;
xlpg_scale = 0x13;
}else{
tx_waveform = &pmc_t1_tx_waveform_sh_440ft;
xlpg_scale = 0x12;
}
break;
case WAN_T1_440_550:
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
tx_waveform = &pmc4_t1_tx_waveform_sh_550ft;
xlpg_scale = 0x15;
}else{
tx_waveform = &pmc_t1_tx_waveform_sh_550ft;
xlpg_scale = 0x14;
}
break;
case WAN_T1_550_660:
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
tx_waveform = &pmc4_t1_tx_waveform_sh_660ft;
}else{
tx_waveform = &pmc_t1_tx_waveform_sh_660ft;
}
xlpg_scale = 0x15;
break;
default:
/* Use 0DB as a default value */
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
tx_waveform = &pmc4_t1_tx_waveform_lh_0db;
xlpg_scale = 0x0D;
}else{
tx_waveform = &pmc_t1_tx_waveform_lh_0db;
xlpg_scale = 0x0C;
}
break;
}
} else {
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
tx_waveform = &pmc4_e1_tx_waveform_120;
}else{
tx_waveform = &pmc_e1_tx_waveform_120;
}
xlpg_scale = 0x0C;
/*xlpg_scale = 0x0B; */
}
#if 0
/* By default, HIGHZ bit is set to 0 */
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
if (IS_FE_TXTRISTATE(fe)){
WRITE_REG(REG_XLPG_LINE_CFG, BIT_XLPG_LINE_CFG_HIGHZ);
}else{
WRITE_REG(REG_XLPG_LINE_CFG,
xlpg_scale | BIT_XLPG_LINE_CFG_HIGHZ);
}
}
#endif
for(i = FIRST_UI; i <= LAST_UI; i++){
for(j = FIRST_SAMPLE; j <= LAST_SAMPLE; j++){
indirect_addr = (j << 3) | i;
/* Set up the indirect address */
WRITE_REG(REG_XLPG_WAVEFORM_ADDR, indirect_addr);
WRITE_REG(REG_XLPG_WAVEFORM_DATA, (*tx_waveform)[j][i]);
}
}
return xlpg_scale;
}
/*
******************************************************************************
* FuseStabilizationProc()
*
* Description: Fuse stabilization procedure.
* Arguments:
* Returns: None.
******************************************************************************
*/
static void FuseStabilizationProc(sdla_fe_t* fe)
{
unsigned char value;
/* XLPG Analog Test Negative Control (0xF4) */
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
WRITE_REG(REG_XLPG_INIT, 0x00);
}
WRITE_REG(REG_XLPG_TNC, 0x01);
WRITE_REG(REG_XLPG_TNC, 0x01);
value = READ_REG(REG_XLPG_TNC) & 0xFE;
WRITE_REG(REG_XLPG_TNC, value);
/* XLPG Analog Test Positive Control (0xF5) */
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
WRITE_REG(REG_XLPG_INIT, 0x00);
}
WRITE_REG(REG_XLPG_TPC, 0x01);
WRITE_REG(REG_XLPG_TPC, 0x01);
value = READ_REG(REG_XLPG_TPC) & 0xFE;
WRITE_REG(REG_XLPG_TPC, value);
WRITE_REG(REG_XLPG_INIT, 0x01);
}
/*
******************************************************************************
* InitLineReceiver()
*
* Description:
* Arguments: is_e1 - WAN_TRUE for E1 connection, WAN_FALSE for T1 connection.
* Returns: None.
******************************************************************************
*/
static void InitLineReceiver(sdla_fe_t* fe, RLPS_EQUALIZER_RAM* rlps_table)
{
int ram_addr = 0x00;
if (IS_T1_FEMEDIA(fe)){
if (WAN_TE1_HI_MODE(fe) == WANOPT_YES){
DEBUG_EVENT("%s: Configure for High-Impedance Mode!\n",
fe->name);
rlps_table = pmc_t1_rlps_perf_mode_ram_table;
}
}
for(ram_addr = 0; ram_addr <= 255; ram_addr++) {
/* ERRATA VVV */
/* RLPS Equalizaton Read/WriteB Select (Reg. 0xQFD)
* Perform dummy read */
WRITE_REG(REG_RLPS_EQ_RWB, BIT_RLPS_EQ_RWB);
/* RLPS Eqialization Indirect Address (Reg. 0xQFC) */
WRITE_REG(REG_RLPS_EQ_ADDR, (unsigned char)ram_addr);
WP_DELAY(100);
/* ERRATA ^^^ */
/* RLPS Equalization Indirect Data MSB (Reg. 0xQD8) */
WRITE_REG(REG_RLPS_IND_DATA_1, rlps_table[ram_addr].byte1);
/* RLPS Equalization Indirect Data (Reg. 0xQD9) */
WRITE_REG(REG_RLPS_IND_DATA_2, rlps_table[ram_addr].byte2);
/* RLPS Equalization Indirect Data (Reg. 0xQDA) */
WRITE_REG(REG_RLPS_IND_DATA_3, rlps_table[ram_addr].byte3);
/* RLPS Equalization Indirect Data LSB (Reg. 0xQDB) */
WRITE_REG(REG_RLPS_IND_DATA_4, rlps_table[ram_addr].byte4);
/* RLPS Equalizaton Read/WriteB Select (Reg. 0xQFD) */
WRITE_REG(REG_RLPS_EQ_RWB, 0x00);
/* RLPS Eqialization Indirect Address (Reg. 0xQFC) */
WRITE_REG(REG_RLPS_EQ_ADDR, (unsigned char)ram_addr);
/* ERRATA VVV */
WP_DELAY(100);
/* ERRATA ^^^ */
}
}
/*
******************************************************************************
* ClearTPSCReg()
*
* Description: Clear all TPSC indirect register.
* Arguments: None.
* Returns: None
******************************************************************************
*/
static void ClearTPSCReg(sdla_fe_t* fe)
{
int channel = 0;
int start_channel = 0, stop_channel = 0;
if (IS_E1_FEMEDIA(fe)){
start_channel = 0;
stop_channel = NUM_OF_E1_TIMESLOTS + 1;
}else{
start_channel = 1;
stop_channel = NUM_OF_T1_CHANNELS;
}
for(channel = start_channel; channel <= stop_channel; channel++){
WRITE_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel, 0x00);
WRITE_TPSC_REG(REG_TPSC_IDLE_CODE_BYTE, channel, 0x00);
if (IS_T1_FEMEDIA(fe)){
if (fe->fe_cfg.cfg.te_cfg.te_rbs_ch & (1 << (channel -1))){
WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel,
BIT_TPSC_SIGBYTE_B|
BIT_TPSC_SIGBYTE_D|
BIT_TPSC_SIGBYTE_SIGC_0 |
BIT_TPSC_SIGBYTE_SIGC_1);
}else{
WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel, 0x00);
}
}else{
WRITE_TPSC_REG(REG_TPSC_E1_CTRL_BYTE, channel, 0x00);
}
/* Do not initialize Signalling Bits
** WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel, 0x00); */
}
return;
}
/*
******************************************************************************
* ClearRPSCReg()
*
* Description: Clear all RPSC indirect register.
* Arguments: None.
* Returns: None
******************************************************************************
*/
static void ClearRPSCReg(sdla_fe_t* fe)
{
int channel = 0;
int start_channel = 0, stop_channel = 0;
if (IS_E1_FEMEDIA(fe)){
start_channel = 0;
stop_channel = NUM_OF_E1_TIMESLOTS + 1;
}else{
start_channel = 1;
stop_channel = NUM_OF_T1_CHANNELS;
}
for(channel = start_channel; channel <= stop_channel; channel++){
WRITE_RPSC_REG(REG_RPSC_DATA_CTRL_BYTE, channel, 0x00);
WRITE_RPSC_REG(REG_RPSC_DATA_COND_BYTE, channel, 0x00);
WRITE_RPSC_REG(REG_RPSC_SIGBYTE, channel, 0x00);
}
return;
}
/*
******************************************************************************
* WriteTPSCReg()
*
* Description: Write value to TPSC indirect register.
* Arguments: reg - Offset in TPSC indirect space.
* value - New PMC register value.
* Returns: None
******************************************************************************
*/
static int
WriteTPSCReg(sdla_fe_t* fe, int reg, int channel, unsigned char value)
{
unsigned char temp = 0x00;
int i = 0, busy_flag = 0;
int err = WAN_FALSE;
reg += channel;
/* Set IND bit to 1 in TPSC to enable indirect access to TPSC register */
WRITE_REG(REG_TPSC_CFG, BIT_TPSC_IND);
busy_flag = 1;
for(i = 0; i < MAX_BUSY_READ; i++) {
temp = READ_REG(REG_TPSC_MICRO_ACCESS_STATUS);
if ((temp & BIT_TPSC_BUSY) == 0x0){
busy_flag = 0;
break;
}
}
if (busy_flag == 1){
DEBUG_EVENT("%s: Failed to write value to TPSC Reg=%02x, val=%02x!\n",
fe->name, reg, value);
goto write_tpsc_done;
}
WRITE_REG(REG_TPSC_CHANNEL_INDIRECT_DATA_BUFFER, (unsigned char)value);
WRITE_REG(REG_TPSC_CHANNEL_INDIRECT_ADDRESS_CONTROL, (unsigned char)(reg & 0x7F));
for(i = 0; i < MAX_BUSY_READ; i++) {
temp = READ_REG(REG_TPSC_MICRO_ACCESS_STATUS);
if ((temp & BIT_TPSC_BUSY) == 0x0){
err = WAN_TRUE;
goto write_tpsc_done;
}
}
DEBUG_EVENT("%s: Failed to write value to TPSC Reg=%02x, val=%02x.\n",
fe->name, reg, value);
write_tpsc_done:
/* Set PCCE bit to 1 in TPSC to enable modifing the TPSC register */
WRITE_REG(REG_TPSC_CFG, BIT_TPSC_IND | BIT_TPSC_PCCE);
return err;
}
/*
******************************************************************************
* ReadTPSCReg()
*
* Description: Read value from TPSC indirect register.
* Arguments: reg - Offset in TPSC indirect space.
* Returns: Returns register value.
******************************************************************************
*/
static unsigned char ReadTPSCReg(sdla_fe_t* fe, int reg, int channel)
{
unsigned char tmp = 0x00, value = 0x00;
int i = 0, busy_flag = 0;
reg += channel;
/* Set IND bit to 1 in TPSC to enable indirect access to TPSC register */
WRITE_REG(REG_TPSC_CFG, BIT_TPSC_IND);
busy_flag = 1;
for(i = 0; i < MAX_BUSY_READ; i++) {
tmp = READ_REG(REG_TPSC_MICRO_ACCESS_STATUS);
if ((tmp & BIT_TPSC_BUSY) == 0x0){
busy_flag = 0;
break;
}
}
if (busy_flag == 1){
DEBUG_EVENT("%s: Failed to read value to TPSC Reg=%02x!\n",
fe->name, reg);
goto read_tpsc_done;
}
WRITE_REG(REG_TPSC_CHANNEL_INDIRECT_ADDRESS_CONTROL,
(unsigned char)(reg | 0x80));
for(i = 0; i < MAX_BUSY_READ; i++) {
tmp = READ_REG(REG_TPSC_MICRO_ACCESS_STATUS);
if ((tmp & BIT_TPSC_BUSY) == 0x0){
value = READ_REG(REG_TPSC_CHANNEL_INDIRECT_DATA_BUFFER);
goto read_tpsc_done;
}
}
DEBUG_EVENT("%s: Failed to read value to TPSC Reg=%02x.\n",
fe->name, reg);
read_tpsc_done:
/* Set PCCE bit to 1 in TPSC to enable modifing the TPSC register */
WRITE_REG(REG_TPSC_CFG, BIT_TPSC_IND | BIT_TPSC_PCCE);
return value;
}
/*
******************************************************************************
* WriteRPSCReg()
*
* Description: Write value to RPSC indirect register.
* Arguments: reg - Offset in RPSC indirect space.
* value - New PMC register value.
* Returns: None
******************************************************************************
*/
static int
WriteRPSCReg(sdla_fe_t* fe, int reg, int channel, unsigned char value)
{
unsigned char temp = 0x00;
int i = 0, busy_flag = 0;
int err = WAN_FALSE;
reg += channel;
/* Set IND bit to 1 in RPSC to enable indirect access to RPSC register*/
WRITE_REG(REG_RPSC_CFG, BIT_RPSC_IND);
busy_flag = 1;
for(i = 0; i < MAX_BUSY_READ; i++) {
temp = READ_REG(REG_RPSC_MICRO_ACCESS_STATUS);
if ((temp & BIT_RPSC_BUSY) == 0x0){
busy_flag = 0;
break;
}
}
if (busy_flag == 1){
DEBUG_EVENT("%s: Failed to write value to RPSC Reg=%02x, val=%02x!\n",
fe->name, reg, value);
goto write_rpsc_done;
}
WRITE_REG(REG_RPSC_CHANNEL_INDIRECT_DATA_BUFFER, (unsigned char)value);
WRITE_REG(REG_RPSC_CHANNEL_INDIRECT_ADDRESS_CONTROL, (unsigned char)(reg & 0x7F));
for(i = 0; i < MAX_BUSY_READ; i++) {
temp = READ_REG(REG_RPSC_MICRO_ACCESS_STATUS);
if ((temp & BIT_RPSC_BUSY) == 0x0){
err = WAN_TRUE;
goto write_rpsc_done;
}
}
DEBUG_EVENT("%s: Failed to write value to RPSC Reg=%02x, val=%02x.\n",
fe->name, reg, value);
write_rpsc_done:
/* Set PCCE bit to 1 in RPSC to enable modifing the RPSC register */
WRITE_REG(REG_RPSC_CFG, BIT_RPSC_IND | BIT_RPSC_PCCE);
return err;
}
/*
******************************************************************************
* ReadRPSCReg()
*
* Description: Read value from RPSC indirect register.
* Arguments: reg - Offset in RPSC indirect space.
* Returns: Returns register value.
******************************************************************************
*/
static unsigned char ReadRPSCReg(sdla_fe_t* fe, int reg, int channel)
{
unsigned char tmp = 0x00, value = 0x00;
int i = 0, busy_flag = 0;
reg += channel;
/* Set IND bit to 1 in RPSC to enable indirect access to RPSC register*/
WRITE_REG(REG_RPSC_CFG, BIT_RPSC_IND);
busy_flag = 1;
for(i = 0; i < MAX_BUSY_READ; i++) {
tmp = READ_REG(REG_RPSC_MICRO_ACCESS_STATUS);
if ((tmp & BIT_RPSC_BUSY) == 0x0){
busy_flag = 0;
break;
}
}
if (busy_flag == 1){
DEBUG_EVENT("%s: Failed to read value to RPSC Reg=%02x!\n",
fe->name, reg);
goto read_rpsc_done;
}
WRITE_REG(REG_RPSC_CHANNEL_INDIRECT_ADDRESS_CONTROL,
(unsigned char)(reg | 0x80));
for(i = 0; i < MAX_BUSY_READ; i++) {
tmp = READ_REG(REG_RPSC_MICRO_ACCESS_STATUS);
if ((tmp & BIT_RPSC_BUSY) == 0x0){
value = READ_REG(REG_RPSC_CHANNEL_INDIRECT_DATA_BUFFER);
goto read_rpsc_done;
}
}
DEBUG_EVENT("%s: Failed to read value to RPSC Reg=%02x.\n",
fe->name, reg);
read_rpsc_done:
/* Set PCCE bit to 1 in RPSC to enable modifing the RPSC register */
WRITE_REG(REG_RPSC_CFG, BIT_RPSC_IND | BIT_RPSC_PCCE);
return value;
}
/*
******************************************************************************
* WriteSIGXReg()
*
* Description: Write value from SIGX indirect register.
* Arguments: reg - Offset in SIGX indirect space.
* value - New PMC register value.
* Returns: Returns register value.
******************************************************************************
*/
#if 0
static int WriteSIGXReg(sdla_fe_t* fe, int reg, int channel, unsigned char value)
{
unsigned char temp = 0x00;
int i = 0, busy_flag = 0;
int err = WAN_FALSE;
reg += (IS_T1_FEMEDIA(fe) ? (channel - 1) : channel);
temp = READ_REG(REG_SIGX_CFG);
WRITE_REG(REG_SIGX_CFG, (temp | BIT_SIGX_IND) & ~(BIT_SIGX_PCCE|BIT_SIGX_COSS));
busy_flag = 1;
for(i = 0; i < MAX_BUSY_READ; i++) {
temp = READ_REG(REG_SIGX_TIMESLOT_IND_STATUS);
if ((temp & BIT_SIGX_BUSY) == 0x0){
busy_flag = 0;
break;
}
}
if (busy_flag == 1){
DEBUG_EVENT("%s: Failed to write value to RPSC Reg=%02x, val=%02x!\n",
fe->name, reg, value);
goto write_sigx_done;
}
WRITE_REG(REG_SIGX_TIMESLOT_IND_DATA_BUFFER, (unsigned char)value);
WRITE_REG(REG_SIGX_TIMESLOT_IND_ACCESS, (unsigned char)(reg & 0x7F));
for(i = 0; i < MAX_BUSY_READ; i++) {
temp = READ_REG(REG_SIGX_TIMESLOT_IND_STATUS);
if ((temp & BIT_SIGX_BUSY) == 0x0){
err = WAN_TRUE;
goto write_sigx_done;
}
}
DEBUG_EVENT("%s: Failed to write value to RPSC Reg=%02x, val=%02x.\n",
fe->name, reg, value);
write_sigx_done:
/* Set PCCE bit to 1 in SIGX to enable modifing the SIGX register */
temp = READ_REG(REG_SIGX_CFG);
WRITE_REG(REG_SIGX_CFG, temp | BIT_SIGX_PCCE);
return err;
}
#endif
/*
******************************************************************************
* ReadSIGXReg()
*
* Description: Read value from SIGX indirect register.
* Arguments: reg - Offset in SIGX indirect space.
* Returns: Returns register value.
******************************************************************************
*/
static unsigned char ReadSIGXReg(sdla_fe_t* fe, int reg, int channel)
{
unsigned char sigx_cfg = 0x00, tmp = 0x00, value = 0x00;
int offset, i = 0, busy_flag = 0;
if (IS_E1_FEMEDIA(fe)){
if (channel == 0 || channel == 16){
return 0;
}
offset = (channel > 16) ? channel - 16 : channel;
}else{
offset = (channel > 16) ? channel - 17 : channel - 1;
}
reg += offset;
/* Enable indirect access to SIGX registers */
sigx_cfg = READ_REG(REG_SIGX_CFG);
WRITE_REG(REG_SIGX_CFG, READ_REG(REG_SIGX_CFG) & ~BIT_SIGX_COSS);
/* Set IND bit to 1 in SIGX Configuration Register to enable
* indirect access to SIGX register*/
WRITE_REG(REG_SIGX_CFG, READ_REG(REG_SIGX_CFG) | BIT_SIGX_IND);
busy_flag = 1;
for(i = 0; i < MAX_BUSY_READ; i++) {
tmp = READ_REG(REG_SIGX_TIMESLOT_IND_STATUS);
if ((tmp & BIT_SIGX_BUSY) == 0x0){
busy_flag = 0;
break;
}
}
if (busy_flag == 1){
DEBUG_EVENT("%s: Failed to read value from SIGX Reg=%02x!\n",
fe->name, reg);
goto read_sigx_done;
}
WRITE_REG(REG_SIGX_TIMESLOT_IND_ACCESS,
(unsigned char)(reg | BIT_SIGX_TS_IND_ACCESS_READ));
for(i = 0; i < MAX_BUSY_READ; i++) {
tmp = READ_REG(REG_SIGX_TIMESLOT_IND_STATUS);
if ((tmp & BIT_SIGX_BUSY) == 0x0){
value = READ_REG(REG_SIGX_TIMESLOT_IND_DATA_BUFFER);
goto read_sigx_done;
}
}
DEBUG_EVENT("%s: Failed to read value from SIGX Reg=%02x.\n",
fe->name, reg);
read_sigx_done:
#if 0
tmp = READ_REG(REG_SIGX_CFG);
WRITE_REG(REG_SIGX_CFG, (tmp | BIT_SIGX_PCCE));
#endif
#if 0
tmp = READ_REG(REG_SIGX_CFG);
WRITE_REG(REG_SIGX_CFG, tmp & ~BIT_SIGX_IND);
tmp = READ_REG(REG_SIGX_CFG);
/* Disable indirect access to SIGX registers */
WRITE_REG(REG_SIGX_CFG, tmp | BIT_SIGX_COSS);
#endif
WRITE_REG(REG_SIGX_CFG, sigx_cfg);
return value;
}
/*
******************************************************************************
* DisableAllChannels()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static void DisableAllChannels(sdla_fe_t* fe)
{
int i = 0;
if (IS_E1_FEMEDIA(fe)) {
DisableTxChannel(fe, E1_FRAMING_TIMESLOT);
DisableRxChannel(fe, E1_FRAMING_TIMESLOT);
for(i = 1; i <= NUM_OF_E1_TIMESLOTS; i++){
DisableTxChannel(fe, i);
DisableRxChannel(fe, i);
}
}else{
for(i = 1; i <= NUM_OF_T1_CHANNELS; i++){
DisableTxChannel(fe, i);
DisableRxChannel(fe, i);
}
}
}
/*
******************************************************************************
* EnableChannels()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static void EnableChannels(sdla_fe_t* fe)
{
int all_channels, i = 0;
all_channels = (WAN_TE1_ACTIVE_CH(fe) == ENABLE_ALL_CHANNELS);
if (IS_E1_FEMEDIA(fe)) {
int first_ts =
(WAN_FE_FRAME(fe) == WAN_FR_UNFRAMED) ? 0 : 1;
DisableTxChannel(fe, E1_FRAMING_TIMESLOT);
DisableRxChannel(fe, E1_FRAMING_TIMESLOT);
for(i = first_ts; i <= NUM_OF_E1_TIMESLOTS; i++){
if (all_channels || WAN_TE1_ACTIVE_CH(fe) & (1 << i)){
EnableTxChannel(fe, i);
EnableRxChannel(fe, i);
}
}
}else{
for(i = 1; i <= NUM_OF_T1_CHANNELS; i++){
if (all_channels || WAN_TE1_ACTIVE_CH(fe) & (1 << i)){
EnableTxChannel(fe, i);
EnableRxChannel(fe, i);
}
}
}
}
/*
******************************************************************************
* EnableTxChannel()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int EnableTxChannel(sdla_fe_t* fe, int channel)
{
DEBUG_TE1("%s: Enable Tx on channel %d\n", fe->name, channel);
if (WAN_FE_LCODE(fe) == WAN_LCODE_AMI){
/* ZCs=1 AMI*/
WRITE_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel,
(((READ_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel) & MASK_TPSC_DATA_CTRL_BYTE) &
~BIT_TPSC_DATA_CTRL_BYTE_IDLE_DS0) | BIT_TPSC_DATA_CTRL_BYTE_ZCS1));
}else{
WRITE_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel,
((READ_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel) & MASK_TPSC_DATA_CTRL_BYTE) &
~(BIT_TPSC_DATA_CTRL_BYTE_IDLE_DS0 | BIT_TPSC_DATA_CTRL_BYTE_ZCS1 | BIT_TPSC_DATA_CTRL_BYTE_ZCS0)));
}
if (IS_E1_FEMEDIA(fe)){
/* Set SUBS=DS[0]=DS[1]=0x0 - no change to PCM timeslot data */
WRITE_TPSC_REG(REG_TPSC_E1_CTRL_BYTE, channel,
(READ_TPSC_REG(REG_TPSC_E1_CTRL_BYTE, channel) &
~(BIT_TPSC_E1_CTRL_BYTE_SUBS | BIT_TPSC_E1_CTRL_BYTE_DS0 | BIT_TPSC_E1_CTRL_BYTE_DS1)));
}else{
if (fe->fe_cfg.cfg.te_cfg.te_rbs_ch & (1 << (channel -1))){
WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel,
BIT_TPSC_SIGBYTE_B|
BIT_TPSC_SIGBYTE_D|
BIT_TPSC_SIGBYTE_SIGC_0 |
BIT_TPSC_SIGBYTE_SIGC_1);
}else{
WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel, 0x00);
}
/* Do not initialize Signalling Bits
** WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel, 0x00); */
}
/* Erase contents of IDLE code byte */
WRITE_TPSC_REG(REG_TPSC_IDLE_CODE_BYTE, channel, 0x00);
return 0;
}
/*
******************************************************************************
* EnableRxChannel()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int EnableRxChannel(sdla_fe_t* fe, int channel)
{
DEBUG_TE1("%s: Enable Rx on channel %d\n", fe->name, channel);
/* Set DTRPC bit to 0 in RPSC */
WRITE_RPSC_REG(REG_RPSC_DATA_CTRL_BYTE, channel,
((READ_RPSC_REG(REG_RPSC_DATA_CTRL_BYTE, channel) & MASK_RPSC_DATA_CTRL_BYTE) &
~BIT_RPSC_DATA_CTRL_BYTE_DTRKC));
return 0;
}
/*
******************************************************************************
* DisableTxChannel()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int DisableTxChannel(sdla_fe_t* fe, int channel)
{
DEBUG_TE1("%s: Disable Tx on channel %d\n", fe->name, channel);
/* Set IDLE_DS0 to 1 for an IDLE code byte will insert and
* BTCLK will suppressed
*/
WRITE_TPSC_REG(REG_RPSC_DATA_CTRL_BYTE, channel,
((READ_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel) & MASK_TPSC_DATA_CTRL_BYTE) |
BIT_TPSC_DATA_CTRL_BYTE_IDLE_DS0));
if (IS_E1_FEMEDIA(fe)){
/* Set SUBS=1, DS0=0 - data substitution on - IDLE code replaces BTPCM timeslot data */
WRITE_TPSC_REG(REG_TPSC_E1_CTRL_BYTE, channel,
((READ_TPSC_REG(REG_TPSC_E1_CTRL_BYTE, channel) & ~BIT_TPSC_E1_CTRL_BYTE_DS0) |
BIT_TPSC_E1_CTRL_BYTE_SUBS));
}else{
if (fe->fe_cfg.cfg.te_cfg.te_rbs_ch & (1 << (channel -1))){
WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel,
BIT_TPSC_SIGBYTE_B|
BIT_TPSC_SIGBYTE_D|
BIT_TPSC_SIGBYTE_SIGC_0 |
BIT_TPSC_SIGBYTE_SIGC_1);
}else{
WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel, 0x00);
}
/* Do not initialize Signalling Bits
** WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel, 0x00); */
}
/* Erase contents of IDLE code byte */
WRITE_TPSC_REG(REG_TPSC_IDLE_CODE_BYTE, channel, 0x55);
return 0;
}
/*
******************************************************************************
* DisableRxChannel()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int DisableRxChannel(sdla_fe_t* fe, int channel)
{
DEBUG_TE1("%s: Disable Rx on channel %d\n", fe->name, channel);
/* Set DTRPC bit to 1 in RPSC to hold low for the duration of the channel */
WRITE_RPSC_REG(REG_RPSC_DATA_CTRL_BYTE, channel,
((READ_RPSC_REG(REG_RPSC_DATA_CTRL_BYTE, channel) & MASK_RPSC_DATA_CTRL_BYTE) |
BIT_RPSC_DATA_CTRL_BYTE_DTRKC));
return 0;
}
/*
******************************************************************************
* sdla_te_copycfg()
*
* Description: Copy T1/E1 configuration to card structure.
* Arguments:
* Returns:
******************************************************************************
*/
int sdla_te_default_cfg(void* pfe, void* pfe_cfg, int media)
{
sdla_fe_cfg_t *fe_cfg = (sdla_fe_cfg_t*)pfe_cfg;
/* Fill with the default values */
switch(media){
case WAN_MEDIA_E1:
fe_cfg->media = WAN_MEDIA_E1;
fe_cfg->lcode = WAN_LCODE_HDB3;
fe_cfg->frame = WAN_FR_NCRC4;
fe_cfg->cfg.te_cfg.lbo = WAN_E1_120;
fe_cfg->cfg.te_cfg.te_clock = WAN_NORMAL_CLK;
fe_cfg->cfg.te_cfg.active_ch = ENABLE_ALL_CHANNELS;
break;
case WAN_MEDIA_T1:
fe_cfg->media = WAN_MEDIA_T1;
fe_cfg->lcode = WAN_LCODE_B8ZS;
fe_cfg->frame = WAN_FR_ESF;
fe_cfg->cfg.te_cfg.lbo = WAN_T1_LBO_0_DB;
fe_cfg->cfg.te_cfg.te_clock = WAN_NORMAL_CLK;
fe_cfg->cfg.te_cfg.active_ch = ENABLE_ALL_CHANNELS;
fe_cfg->cfg.te_cfg.high_impedance_mode = WANOPT_NO;
break;
default:
return -EINVAL;
}
return 0;
}
/*
******************************************************************************
* sdla_te_iface_init()
*
* Description: Inialize Front-End interface functions.
* Arguments:
* Returns:
******************************************************************************
*/
int sdla_te_iface_init(void *p_fe, void *pfe_iface)
{
sdla_fe_t *fe = (sdla_fe_t*)p_fe;
sdla_fe_iface_t *fe_iface = (sdla_fe_iface_t*)pfe_iface;
fe_iface->reset = &sdla_te_reset;
fe_iface->global_config = &sdla_te_global_config;
fe_iface->global_unconfig = &sdla_te_global_unconfig;
fe_iface->config = &sdla_te_config;
fe_iface->post_init = &sdla_te_post_init;
fe_iface->reconfig = &sdla_te_reconfig;
fe_iface->unconfig = &sdla_te_unconfig;
fe_iface->post_unconfig = &sdla_te_post_unconfig;
fe_iface->isr = &sdla_te_intr;
fe_iface->disable_irq = &sdla_te_disable_irq;
fe_iface->check_isr = &sdla_te_check_intr;
fe_iface->polling = &sdla_te_polling;
fe_iface->process_udp = &sdla_te_udp;
fe_iface->print_fe_alarm = &sdla_te_print_alarms;
fe_iface->print_fe_act_channels = &sdla_te_print_channels;
fe_iface->set_fe_alarm = &sdla_te_set_alarms;
fe_iface->set_fe_sigctrl = &sdla_te_sigctrl;
fe_iface->read_alarm = &sdla_te_read_alarms;
fe_iface->read_pmon = &sdla_te_pmon;
fe_iface->flush_pmon = &sdla_te_flush_pmon;
fe_iface->get_fe_status = &sdla_te_get_fe_status;
fe_iface->get_fe_media = &sdla_te_get_fe_media;
fe_iface->set_fe_lbmode = &sdla_te_set_lbmode;
fe_iface->get_fe_media_string = &sdla_te_get_fe_media_string;
fe_iface->update_alarm_info = &sdla_te_update_alarm_info;
fe_iface->update_pmon_info = &sdla_te_update_pmon_info;
fe_iface->led_ctrl = &sdla_te_led_ctrl;
fe_iface->check_rbsbits = &sdla_te_check_rbsbits;
fe_iface->read_rbsbits = &sdla_te_read_rbsbits;
fe_iface->set_rbsbits = &sdla_te_set_rbsbits;
fe_iface->report_rbsbits = &sdla_te_rbs_report;
#if !defined(CONFIG_PRODUCT_WANPIPE_GENERIC)
fe_iface->get_snmp_data = &sdla_te_get_snmp_data;
#endif
/* Initial FE state */
fe->fe_status = FE_UNITIALIZED; /*FE_DISCONNECTED;*/
WAN_LIST_INIT(&fe->event);
wan_spin_lock_irq_init(&fe->lockirq, "wan_te1_lock");
return 0;
}
/*
******************************************************************************
* sdla_te_copycfg()
*
* Description: Copy T1/E1 configuration to card structure.
* Arguments:
* Returns:
******************************************************************************
*/
int sdla_te_copycfg(void* pfe, void* pfe_cfg)
{
sdla_fe_t *fe = (sdla_fe_t*)pfe;
sdla_fe_cfg_t *fe_cfg = (sdla_fe_cfg_t*)pfe_cfg;
if (fe_cfg){
memcpy(&fe->fe_cfg, fe_cfg, sizeof(sdla_fe_cfg_t));
}else{
/* Fill with the default values */
sdla_te_default_cfg(fe, &fe->fe_cfg, WAN_MEDIA_T1);
}
return 0;
}
/******************************************************************************
* sdla_te_reset()
*
* Description: Global configuration for Sangoma TE1 PMC board.
* Note: These register should be program only once for AFT-QUAD
* cards.
* Arguments:
* Returns: WANTRUE - TE1 configred successfully, otherwise WAN_FALSE.
******************************************************************************/
static int sdla_te_reset(void* pfe, int port_no, int reset)
{
return 0;
}
/*
******************************************************************************
* sdla_te_global_config()
*
* Description: Global configuration for Sangoma TE1 PMC board.
* Note: These register should be program only once for AFT-QUAD
* cards.
* Arguments:
* Returns: WANTRUE - TE1 configred successfully, otherwise WAN_FALSE.
******************************************************************************
*/
static int sdla_te_global_config(void* pfe)
{
sdla_fe_t *fe = (sdla_fe_t*)pfe;
unsigned char value = 0x00;
DEBUG_TE1("%s: %s Global Front End configuration\n",
fe->name, FE_MEDIA_DECODE(fe));
/* 1. Initiate software reset of the COMET */
/* Set RESET=1 to place COMET into RESET (Reg. 0xE) */
WRITE_REG_LINE(0, REG_RESET, BIT_RESET);
/* Set RESET=0, disable software reset. (Reg. 0xE)
* COMET in default mode. */
WRITE_REG_LINE(0, REG_RESET, 0x0/*~BIT_RESET*/);
/* Program PMC for T1/E1 mode (Reg 0x00) */
if (IS_E1_FEMEDIA(fe)){
value = BIT_GLOBAL_PIO_OE | BIT_GLOBAL_E1;
}else{
value = BIT_GLOBAL_PIO_OE;
}
WRITE_REG_LINE(0, REG_GLOBAL_CFG, value);
/* Set system clock and XCLK (Reg 0xD6) */
if (IS_T1_FEMEDIA(fe)){
WRITE_REG_LINE(0, REG_CSU_CFG, BIT_CSU_MODE0);
/* WRITE_REG(REG_CSU_CFG,
* BIT_CSU_MODE2 |
* BIT_CSU_MODE1 |
* BIT_CSU_MODE0); */
}else{
WRITE_REG_LINE(0, REG_CSU_CFG, 0x00);
}
/* 10 Jan 2004
** This delay let PMC make proper RESET. */
WP_DELAY(1000);
return 0;
}
/*
******************************************************************************
* sdla_pmc4351_te_config()
*
* Description: Configure Sangoma S5147/S5148/A101/A102 TE1 board
* Arguments:
* Returns: WANTRUE - TE1 configred successfully, otherwise WAN_FALSE.
******************************************************************************
*/
static int sdla_pmc4351_te_config(sdla_fe_t *fe, u16 adapter_type)
{
unsigned char value = 0x00;
/* Execute global chip configuration */
sdla_te_global_config(fe);
/* 2.Setup the XLPG(Transmit pulse template) to clear the pulse
** template */
ClearTemplate(fe);
fe->te_param.xlpg_scale = PrgTransmitTemplate(fe);
/* Global Configuration (Reg 0x00) */
value = READ_REG(REG_GLOBAL_CFG);
if (IS_E1_FEMEDIA(fe)){
if (adapter_type == A101_ADPTR_1TE1 || adapter_type == A101_ADPTR_2TE1){
value |= BIT_GLOBAL_TRKEN;
}
}else{
if (adapter_type == A101_ADPTR_1TE1 || adapter_type == A101_ADPTR_2TE1){
value |= BIT_GLOBAL_TRKEN;
}
}
WRITE_REG(REG_GLOBAL_CFG, value);
/* XLPG Line Driver Configuration (Reg. 0xF0) */
if (IS_FE_TXTRISTATE(fe)){
DEBUG_EVENT("%s: Disable TX (tri-state mode)\n",
fe->name);
WRITE_REG(REG_XLPG_LINE_CFG, BIT_XLPG_LINE_CFG_HIGHZ);
}else{
WRITE_REG(REG_XLPG_LINE_CFG, fe->te_param.xlpg_scale);
}
/* CDRC Configuration (Reg. 0x10) */
if (WAN_FE_LCODE(fe) == WAN_LCODE_AMI){
WRITE_REG(REG_CDRC_CFG, BIT_CDRC_CFG_AMI);
}else{
WRITE_REG(REG_CDRC_CFG, 0x00);
}
if (IS_E1_FEMEDIA(fe)) {
/* RX-ELST Configuration (Reg. 0x1C) */
WRITE_REG(REG_RX_ELST_CFG, BIT_RX_ELST_IR | BIT_RX_ELST_OR);
/* TX-ELST Configuration (Reg. 0x20) */
WRITE_REG(REG_TX_ELST_CFG, BIT_TX_ELST_IR | BIT_RX_ELST_OR);
}else{
/* RX-ELST Configuration (Reg. 0x1C) */
WRITE_REG(REG_RX_ELST_CFG, 0x00);
/* TX-ELST Configuration (Reg. 0x20) */
WRITE_REG(REG_TX_ELST_CFG, 0x00);
}
if (IS_E1_FEMEDIA(fe)){
/* E1-TRAN Configuration (Reg. 0x80) */
value = 0x00;
if (WAN_FE_LCODE(fe) == WAN_LCODE_AMI){
value |= BIT_E1_TRAN_AMI;
}
if (WAN_FE_FRAME(fe) == WAN_FR_CRC4){
value |= BIT_E1_TRAN_GENCRC;
}else if (WAN_FE_FRAME(fe) == WAN_FR_UNFRAMED){
value |= BIT_E1_TRAN_FDIS;
}
if (WAN_TE1_SIG_MODE(fe) == WAN_TE1_SIG_CAS){
value |= (BIT_E1_TRAN_SIGEN|BIT_E1_TRAN_DLEN);
}
WRITE_REG(REG_E1_TRAN_CFG, value);
/* E1-FRMR Frame Alignment Options (Reg 0x90) */
value = 0x00;
if (WAN_FE_FRAME(fe) == WAN_FR_CRC4){
value |= (BIT_E1_FRMR_CRCEN |
BIT_E1_FRMR_REFCRCEN);
}
if (WAN_TE1_SIG_MODE(fe) == WAN_TE1_SIG_CCS){
value |= BIT_E1_FRMR_CASDIS;
}
WRITE_REG(REG_E1_FRMR_CFG, value);
}else{
/* T1-XBAS Configuration (Reg 0x54) */
value = 0x00;
if (WAN_FE_LCODE(fe) == WAN_LCODE_B8ZS){
value |= BIT_T1_XBAS_B8ZS;
}else{
value |= BIT_T1_XBAS_ZCS0;
}
if (WAN_FE_FRAME(fe) == WAN_FR_ESF){
value |= BIT_T1_XBAS_ESF;
}else if (WAN_FE_FRAME(fe) == WAN_FR_SLC96){
value |= BIT_T1_XBAS_FMS1;
}
if (IS_J1_FEMEDIA(fe)){
value |= BIT_T1_XBAS_JPN;
}
WRITE_REG(REG_T1_XBAS_CFG, value);
/* T1-FRMR Configuration (Reg. 0x48) */
value = 0x00;
if (WAN_FE_FRAME(fe) == WAN_FR_ESF){
value = BIT_T1_FRMR_ESF | BIT_T1_FRMR_ESFFA;
}else if (WAN_FE_FRAME(fe) == WAN_FR_SLC96){
value = BIT_T1_FRMR_FMS1;
}
if (IS_J1_FEMEDIA(fe)){
value |= BIT_T1_FRMR_JPN;
}
WRITE_REG(REG_T1_FRMR_CFG, value);
/* T1 ALMI Configuration (Reg. 0x60) */
value = 0x00;
if (WAN_FE_FRAME(fe) == WAN_FR_ESF){
value = BIT_T1_ALMI_CFG_ESF;
}else if (WAN_FE_FRAME(fe) == WAN_FR_SLC96){
value |= BIT_T1_ALMI_CFG_FMS1;
}
WRITE_REG(REG_T1_ALMI_CFG, value);
}
/* SIGX Configuration Register (Reg. 0x50) */
value = 0x00;
if (IS_E1_FEMEDIA(fe)){
WRITE_REG(REG_SIGX_CFG, value);
}else{
if (WAN_FE_FRAME(fe) == WAN_FR_ESF){
value |= BIT_SIGX_ESF;
}
WRITE_REG(REG_SIGX_CFG, value);
}
/* BTIF Configuration (Reg. 0x40) */
value = 0x00;
if (IS_E1_FEMEDIA(fe)){
value |= BIT_BTIF_RATE0;
}
if (!(adapter_type == A101_ADPTR_1TE1 || adapter_type == A101_ADPTR_2TE1)){
if (WAN_FE_LCODE(fe) == WAN_LCODE_AMI){
value |= BIT_BTIF_NXDS0_0;
}
}
if (WAN_FE_FRAME(fe) != WAN_FR_UNFRAMED){
value |= BIT_BTIF_NXDS0_1;
}
if (adapter_type == A101_ADPTR_1TE1 || adapter_type == A101_ADPTR_2TE1){
value |= (BIT_BTIF_CMODE | BIT_BTIF_DE | BIT_BTIF_FE);
}
WRITE_REG(REG_BTIF_CFG, value);
/* BTIF_Frame Pulse Configuration (Reg. 0x41) */
WRITE_REG(REG_BTIF_FR_PULSE_CFG, BIT_BTIF_FPMODE);
/* BRIF Configuration (Reg. 0x30) */
value = 0x00;
if (IS_E1_FEMEDIA(fe)){
value |= BIT_BRIF_RATE0;
}
if (!(adapter_type == A101_ADPTR_1TE1 || adapter_type == A101_ADPTR_2TE1)){
if (WAN_FE_LCODE(fe) == WAN_LCODE_AMI){
value |= BIT_BRIF_NXDS0_0;
}
}
if (WAN_FE_FRAME(fe) != WAN_FR_UNFRAMED){
value |= BIT_BRIF_NXDS0_1;
}
if (adapter_type == A101_ADPTR_1TE1 || adapter_type == A101_ADPTR_2TE1){
value |= BIT_BRIF_CMODE;
}
WRITE_REG(REG_BRIF_CFG, value);
/* BRIF Frame Pulse Configuration (Reg. 0x31) */
value = 0x00;
if (adapter_type == A101_ADPTR_1TE1 || adapter_type == A101_ADPTR_2TE1){
value |= BIT_BRIF_FPMODE;
}
WRITE_REG(REG_BRIF_FR_PULSE_CFG, value);
/* BRIF Parity/F-bit Configuration (Reg. 0x32) */
WRITE_REG(REG_BRIF_DATA_CFG, BIT_BRIF_DATA_TRI_0);
/* Transmit Timing Options (Reg 0x06) */
if (WAN_TE1_CLK(fe) == WAN_NORMAL_CLK){
WRITE_REG(REG_TX_TIMING_OPT,
BIT_TX_PLLREF1 |
BIT_TX_TXELSTBYP);
}else{
WRITE_REG(REG_TX_TIMING_OPT,
BIT_TX_PLLREF1 |
BIT_TX_PLLREF0 |
BIT_TX_TXELSTBYP);
}
/* RLPS Configuration and Status (Reg 0xF8) */
/* AF Nov 16, 2007
** Set SQUELCHE to 1. This forces RLPS to stop sending pulses
** to CDRC during ALOS conditions */
#if defined (WAN_TE1_IGNORE_RLPS_ALOS)
WRITE_REG(REG_RLPS_CFG_STATUS,
BIT_RLPS_CFG_STATUS_LONGE |
BIT_RLPS_CFG_STATUS_SQUELCHE);
#else
WRITE_REG(REG_RLPS_CFG_STATUS,
BIT_RLPS_CFG_STATUS_LONGE);
#endif
/* RLPS ALOS Detection/Clearance Thresholds (Reg 0xF9) */
/* NC: Aug 20 2003:
* Set the correct ALSO Detection/Clearance tresholds
* for T1/E1 lines, to get rid of false ALOS alarms.
*
* Original incorrect value set was 0x00, for both T1/E1 */
if (IS_E1_FEMEDIA(fe)){
WRITE_REG(REG_RLPS_ALOS_DET_CLR_THR,
BIT_RLPS_ALOS_DET_THR_2|
BIT_RLPS_ALOS_DET_THR_1|
BIT_RLPS_ALOS_DET_THR_0);
}else{
WRITE_REG(REG_RLPS_ALOS_DET_CLR_THR,
BIT_RLPS_ALOS_CLR_THR_2|
BIT_RLPS_ALOS_CLR_THR_0|
BIT_RLPS_ALOS_DET_THR_2|
BIT_RLPS_ALOS_DET_THR_0);
}
/* RLPS ALOS Detection period (Reg 0xFA) */
WRITE_REG(REG_RLPS_ALOS_DET_PER, BIT_RLPS_ALOS_DET_PER_0);
/* RLPS ALOS Clearance period (Reg 0xFB) */
WRITE_REG(REG_RLPS_ALOS_CLR_PER, BIT_RLPS_ALOS_CLR_PER_0);
/* RLPS Equalizatopn Indirect Address (Reg. 0xFC) */
/* ERRATA WRITE_REG(REG_RLPS_EQ_ADDR, 0x00); */
/* RLPS Equalization Read/WriteB Select (Reg 0xFD) */
/* ERRATA WRITE_REG(REG_RLPS_EQ_RWB, BIT_RLPS_EQ_RWB); */
/* RLPS Equalizer Loop Status and Control (Reg 0xFE) */
WRITE_REG(REG_RLPS_EQ_STATUS, 0x00);
/* RLPS Equalizer Configuration (Reg 0xFF) */
WRITE_REG(REG_RLPS_EQ_CFG,
BIT_RLPS_EQ_RESERVED |
BIT_RLPS_EQ_FREQ_1 |
BIT_RLPS_EQ_FREQ_0);
/* TJAT Configuration (Reg 0x1B) */
WRITE_REG(REG_TJAT_CFG, BIT_TJAT_CENT);
/* RJAT Configuration (Reg 0x17) */
WRITE_REG(REG_RJAT_CFG, BIT_RJAT_CENT);
/* Receive Options (Reg 0x02) */
if (WAN_FE_FRAME(fe) == WAN_FR_UNFRAMED){
WRITE_REG(REG_RECEIVE_OPT, BIT_RECEIVE_OPT_UNF);
}else{
WRITE_REG(REG_RECEIVE_OPT, 0x00);
}
if (IS_E1_FEMEDIA(fe)){
WRITE_REG(REG_E1_TRAN_NATB_CODESEL,
BIT_E1_TRAN_NATB_CODESEL_Sa4);
WRITE_REG(REG_E1_TRAN_NATB_CODE, 0xFF);
WRITE_REG(REG_E1_TRAN_NATB_CODESEL,
BIT_E1_TRAN_NATB_CODESEL_Sa5);
WRITE_REG(REG_E1_TRAN_NATB_CODE, 0xFF);
WRITE_REG(REG_E1_TRAN_NATB_CODESEL,
BIT_E1_TRAN_NATB_CODESEL_Sa6);
WRITE_REG(REG_E1_TRAN_NATB_CODE, 0xFF);
WRITE_REG(REG_E1_TRAN_NATB_CODESEL,
BIT_E1_TRAN_NATB_CODESEL_Sa7);
WRITE_REG(REG_E1_TRAN_NATB_CODE, 0xFF);
WRITE_REG(REG_E1_TRAN_NATB_CODESEL,
BIT_E1_TRAN_NATB_CODESEL_Sa8);
WRITE_REG(REG_E1_TRAN_NATB_CODE, 0xFF);
}
/* XLPG Configuration #1 (Reg 0xF4) */
/* 13 Jan 2005 WRITE_REG(REG_XLPG_TNC, BIT_XLPG_TNC_1); */
/* XLPG Configuration #2 (Reg 0xF5) */
/* 13 Jan 2005 WRITE_REG(REG_XLPG_TPC, BIT_XLPG_TPC_1); */
/* RLPS Equalizer Voltage Reference (Reg 0xDC) */
if (IS_E1_FEMEDIA(fe)){
WRITE_REG(REG_EQ_VREF, 0x34);
}else{
WRITE_REG(REG_EQ_VREF, 0x2C);
}
WRITE_REG(REG_RLPS_FUSE_CTRL_STAT, 0x00);
/* ERRATA WRITE_REG(REG_RLPS_FUSE_CTRL_STAT, 0x00);*/
/* Call fuse stabilization procedure */
FuseStabilizationProc(fe);
/* Program Transmit pulse */
InitLineReceiver(fe,
(IS_E1_FEMEDIA(fe) ?
pmc_e1_rlps_ram_table:
pmc_t1_rlps_ram_table));
return 0;
}
/*
******************************************************************************
* sdla_pmc4354_te_config()
*
* Description: Configure Sangoma A104 TE1 board
* Arguments:
* Returns: WANTRUE - TE1 configred successfully, otherwise WAN_FALSE.
******************************************************************************
*/
static int sdla_pmc4354_te_config(sdla_fe_t *fe, u16 adapter_type)
{
unsigned char value = 0x00;
/* Global Configuration (Reg 0xQ00) */
value = READ_REG(REG_GLOBAL_CFG);
if (IS_E1_FEMEDIA(fe)){
value |= BIT_GLOBAL_TRKEN;
}else{
value |= BIT_GLOBAL_TRKEN;
}
WRITE_REG(REG_GLOBAL_CFG, value);
/* CDRC Configuration (Reg. 0xQ10) */
if (WAN_FE_LCODE(fe) == WAN_LCODE_AMI){
WRITE_REG(REG_CDRC_CFG, BIT_CDRC_CFG_AMI);
}else{
WRITE_REG(REG_CDRC_CFG, 0x00);
}
if (IS_E1_FEMEDIA(fe)) {
/* RX-ELST Configuration (Reg. 0xQ1C) */
WRITE_REG(REG_RX_ELST_CFG, BIT_RX_ELST_IR | BIT_RX_ELST_OR);
/* TX-ELST Configuration (Reg. 0xQ20) */
WRITE_REG(REG_TX_ELST_CFG, BIT_TX_ELST_IR | BIT_RX_ELST_OR);
}else{
/* RX-ELST Configuration (Reg. 0xQ1C) */
WRITE_REG(REG_RX_ELST_CFG, 0x00);
/* TX-ELST Configuration (Reg. 0xQ20) */
WRITE_REG(REG_TX_ELST_CFG, 0x00);
}
if (IS_E1_FEMEDIA(fe)){
/* E1-TRAN Configuration (Reg. 0xQ80) */
value = 0x00;
if (WAN_FE_LCODE(fe) == WAN_LCODE_AMI){
value |= BIT_E1_TRAN_AMI;
}
if (WAN_FE_FRAME(fe) == WAN_FR_CRC4){
value |= BIT_E1_TRAN_GENCRC;
}else if (WAN_FE_FRAME(fe) == WAN_FR_UNFRAMED){
value |= BIT_E1_TRAN_FDIS;
value |= BIT_E1_TRAN_INDIS; //today
}
if (WAN_TE1_SIG_MODE(fe) == WAN_TE1_SIG_CAS){
value |= (BIT_E1_TRAN_SIGEN|BIT_E1_TRAN_DLEN);
}
WRITE_REG(REG_E1_TRAN_CFG, value);
/* E1-FRMR Frame Alignment Options (Reg 0xQ90) */
value = 0x00;
if (WAN_FE_FRAME(fe) == WAN_FR_CRC4){
value |= (BIT_E1_FRMR_CRCEN |
BIT_E1_FRMR_REFCRCEN);
}
if (WAN_TE1_SIG_MODE(fe) == WAN_TE1_SIG_CCS){
value |= BIT_E1_FRMR_CASDIS;
}
WRITE_REG(REG_E1_FRMR_CFG, value);
}else{
/* T1-XBAS Configuration (Reg 0xQ54) */
value = 0x00;
if (WAN_FE_LCODE(fe) == WAN_LCODE_B8ZS){
value |= BIT_T1_XBAS_B8ZS;
}else{
value |= BIT_T1_XBAS_ZCS0;
}
if (WAN_FE_FRAME(fe) == WAN_FR_ESF){
value |= BIT_T1_XBAS_ESF;
//}else if (WAN_FE_FRAME(fe) == WAN_FR_SLC96){
// value |= BIT_T1_XBAS_FMS1;
}
if (IS_J1_FEMEDIA(fe)){
value |= BIT_T1_XBAS_JPN;
}
WRITE_REG(REG_T1_XBAS_CFG, value);
/* T1-FRMR Configuration (Reg. 0xQ48) */
value = 0x00;
if (WAN_FE_FRAME(fe) == WAN_FR_ESF){
value = BIT_T1_FRMR_ESF | BIT_T1_FRMR_ESFFA;
}else if (WAN_FE_FRAME(fe) == WAN_FR_SLC96){
value = BIT_T1_FRMR_FMS1;
}
if (IS_J1_FEMEDIA(fe)){
value |= BIT_T1_FRMR_JPN;
}
WRITE_REG(REG_T1_FRMR_CFG, value);
/* T1 ALMI Configuration (Reg. 0xQ60) */
value = 0x00;
if (WAN_FE_FRAME(fe) == WAN_FR_ESF){
value |= BIT_T1_ALMI_CFG_ESF;
}else if (WAN_FE_FRAME(fe) == WAN_FR_SLC96){
value |= BIT_T1_ALMI_CFG_FMS1;
}
WRITE_REG(REG_T1_ALMI_CFG, value);
}
/* SIGX Configuration Register (Reg. 0xQ50) */
value = 0x00;
if (IS_E1_FEMEDIA(fe)){
WRITE_REG(REG_SIGX_CFG, value);
}else{
if (WAN_FE_FRAME(fe) == WAN_FR_ESF){
value |= BIT_SIGX_ESF;
}
WRITE_REG(REG_SIGX_CFG, value);
}
/* BTIF Configuration (Reg. 0xQ40) */
value = 0x00;
if (IS_E1_FEMEDIA(fe)){
value |= BIT_BTIF_RATE0;
}
#if 0
/* If AMI is selected is only can be used for VOICE.
* In this case, we need to use FULL FRAME mode (no gaps). */
if (WAN_FE_LCODE(fe) == WAN_LCODE_AMI){
value |= BIT_BTIF_NXDS0_0;
}
#endif
value |= BIT_BTIF_DE;
if (WAN_TE1_CLK(fe) == WAN_MASTER_CLK &&
WAN_TE1_REFCLK(fe) != WAN_TE1_REFCLK_OSC){
/* Configure Transmit clock as input (slave) */
value |= BIT_BTIF_CMODE;
}
WRITE_REG(REG_BTIF_CFG, value);
/* BTIF_Frame Pulse Configuration (Reg. 0xQ41) */
if (WAN_TE1_CLK(fe) == WAN_MASTER_CLK &&
WAN_TE1_REFCLK(fe) != WAN_TE1_REFCLK_OSC){
/* Configure Transmit frame pulse as input (slave) */
WRITE_REG(REG_BTIF_FR_PULSE_CFG, BIT_BTIF_FPMODE);
}else{
WRITE_REG(REG_BTIF_FR_PULSE_CFG, 0x00);
}
/* BRIF Configuration (Reg. 0xQ30) */
value = 0x00;
if (IS_E1_FEMEDIA(fe)){
value |= BIT_BRIF_RATE0;
}
#if 0
/* If AMI is selected is only can be used for VOICE.
* In this case, we need to use FULL FRAME mode (no gaps). */
if (WAN_FE_LCODE(fe) == WAN_LCODE_AMI){
value |= BIT_BRIF_NXDS0_0;
}
#endif
value |= BIT_BRIF_FE;
// today: CMODe set to 1 only for FRAMED mode
//today if (WAN_FE_FRAME(fe) != WAN_FR_UNFRAMED){
value |= BIT_BRIF_CMODE;
//}
WRITE_REG(REG_BRIF_CFG, value);
/* BRIF Frame Pulse Configuration (Reg. 0xQ31) */
WRITE_REG(REG_BRIF_FR_PULSE_CFG, BIT_BRIF_FPMODE);
/* BRIF Parity/F-bit Configuration (Reg. 0xQ32) */
WRITE_REG(REG_BRIF_DATA_CFG, BIT_BRIF_DATA_TRI_0);
/* Transmit Timing Options (Reg 0xQ06) */
if (WAN_TE1_CLK(fe) == WAN_NORMAL_CLK){
/* 1. Set TJAT FIFO output clock signal
* 2. Receive recovered clock */
WRITE_REG(REG_TX_TIMING_OPT,
BIT_TX_PLLREF1 |
BIT_TX_TXELSTBYP);
}else{
if (WAN_TE1_CLK(fe) == WAN_MASTER_CLK &&
WAN_TE1_REFCLK(fe) != WAN_TE1_REFCLK_OSC){
/* In this case, we should set only PLLREF0 bit
** to 1 (firmware also been changed in order to
** solve this problem). Nov 1, 2005
** WRITE_REG(REG_TX_TIMING_OPT,
** BIT_TX_PLLREF1 |
** BIT_TX_PLLREF0); */
WRITE_REG(REG_TX_TIMING_OPT, BIT_TX_PLLREF0|BIT_TX_TXELSTBYP);
}else{
/* 1. Set TJAT FIFO output clock signal
* 2. CTCLK input */
WRITE_REG(REG_TX_TIMING_OPT,
BIT_TX_PLLREF1 |
BIT_TX_PLLREF0 |
BIT_TX_TXELSTBYP);
}
}
/* RLPS Configuration and Status (Reg 0xQF8) */
/* AF Nov 16, 2007
** Set SQUELCHE to 1. This forces RLPS to stop sending pulses
** to CDRC during ALOS conditions */
#if defined (WAN_TE1_IGNORE_RLPS_ALOS)
WRITE_REG(REG_RLPS_CFG_STATUS,
BIT_RLPS_CFG_STATUS_LONGE |
BIT_RLPS_CFG_STATUS_SQUELCHE);
#else
WRITE_REG(REG_RLPS_CFG_STATUS,
BIT_RLPS_CFG_STATUS_LONGE);
#endif
/* RLPS ALOS Detection/Clearance Thresholds (Reg 0xQF9) */
/* NC: Aug 20 2003:
* Set the correct ALSO Detection/Clearance tresholds
* for T1/E1 lines, to get rid of false ALOS alarms.
*
* Original incorrect value set was 0x00, for both T1/E1 */
if (IS_E1_FEMEDIA(fe)){
WRITE_REG(REG_RLPS_ALOS_DET_CLR_THR,
BIT_RLPS_ALOS_DET_THR_2|
BIT_RLPS_ALOS_DET_THR_1|
BIT_RLPS_ALOS_DET_THR_0);
}else{
WRITE_REG(REG_RLPS_ALOS_DET_CLR_THR,
BIT_RLPS_ALOS_CLR_THR_2|
BIT_RLPS_ALOS_CLR_THR_0|
BIT_RLPS_ALOS_DET_THR_2|
BIT_RLPS_ALOS_DET_THR_0);
}
/* RLPS ALOS Detection period (Reg 0xQFA) */
WRITE_REG(REG_RLPS_ALOS_DET_PER, BIT_RLPS_ALOS_DET_PER_0);
/* RLPS ALOS Clearance period (Reg 0xQFB) */
WRITE_REG(REG_RLPS_ALOS_CLR_PER, BIT_RLPS_ALOS_CLR_PER_0);
/* RLPS Equalizatopn Indirect Address (Reg. 0xQFC) */
/* ERRATA WRITE_REG(REG_RLPS_EQ_ADDR, 0x00); */
/* RLPS Equalization Read/WriteB Select (Reg 0xQFD) */
/* ERRATA WRITE_REG(REG_RLPS_EQ_RWB, BIT_RLPS_EQ_RWB); */
/* RLPS Equalizer Loop Status and Control (Reg 0xQFE) */
WRITE_REG(REG_RLPS_EQ_STATUS, 0x00);
/* TJAT Configuration (Reg 0xQ1B) */
WRITE_REG(REG_TJAT_CFG, BIT_TJAT_CENT);
/* RJAT Configuration (Reg 0xQ17) */
WRITE_REG(REG_RJAT_CFG, BIT_RJAT_CENT);
/* Receive Options (Reg 0xQ02) */
if (WAN_FE_FRAME(fe) == WAN_FR_UNFRAMED){
// today: add RXELSTBYP in clear channel mode
WRITE_REG(REG_RECEIVE_OPT, BIT_RECEIVE_OPT_UNF);
}else{
WRITE_REG(REG_RECEIVE_OPT, 0x00);
}
if (IS_E1_FEMEDIA(fe)){
WRITE_REG(REG_E1_TRAN_NATB_CODESEL,
BIT_E1_TRAN_NATB_CODESEL_Sa4);
WRITE_REG(REG_E1_TRAN_NATB_CODE, 0xFF);
WRITE_REG(REG_E1_TRAN_NATB_CODESEL,
BIT_E1_TRAN_NATB_CODESEL_Sa5);
WRITE_REG(REG_E1_TRAN_NATB_CODE, 0xFF);
WRITE_REG(REG_E1_TRAN_NATB_CODESEL,
BIT_E1_TRAN_NATB_CODESEL_Sa6);
WRITE_REG(REG_E1_TRAN_NATB_CODE, 0xFF);
WRITE_REG(REG_E1_TRAN_NATB_CODESEL,
BIT_E1_TRAN_NATB_CODESEL_Sa7);
WRITE_REG(REG_E1_TRAN_NATB_CODE, 0xFF);
WRITE_REG(REG_E1_TRAN_NATB_CODESEL,
BIT_E1_TRAN_NATB_CODESEL_Sa8);
WRITE_REG(REG_E1_TRAN_NATB_CODE, 0xFF);
}
/* XLPG Configuration #1 (Reg 0xQF4) */
/* 13 Jan 2005 WRITE_REG(REG_XLPG_TNC, BIT_XLPG_TNC_1); */
WRITE_REG(REG_XLPG_TNC, BIT_XLPG_TNC_1); /* ADEBUG */
/* XLPG Configuration #2 (Reg 0xQF5) */
/* 13 Jan 2005 WRITE_REG(REG_XLPG_TPC, BIT_XLPG_TPC_1); */
WRITE_REG(REG_XLPG_TPC, BIT_XLPG_TPC_1); /* ADEBUG */
/* RLPS Equalizer Voltage Reference (Reg 0xQDC) */
if (IS_E1_FEMEDIA(fe)){
WRITE_REG(REG_EQ_VREF, 0x3D); /* ADEBUG: original 0x34 */
}else{
WRITE_REG(REG_EQ_VREF, 0x2C);
}
/* ADEBUG: This register doesn't exist
* WRITE_REG(REG_RLPS_FUSE_CTRL_STAT, 0x00); */
/* Program Transmit pulse */
InitLineReceiver(fe,
(IS_E1_FEMEDIA(fe) ?
pmc4_e1_rlps_ram_table:
pmc4_t1_rlps_ram_table));
/* RLPS Equalizer Configuration (Reg 0xQFF) */
WRITE_REG(REG_RLPS_EQ_CFG,
BIT_RLPS_EQ_EQEN |
BIT_RLPS_EQ_RESERVED_1 |
BIT_RLPS_EQ_RESERVED_0);
/* Program Transmit pulse template */
fe->te_param.xlpg_scale = PrgTransmitTemplate(fe);
/* Call fuse stabilization procedure */
FuseStabilizationProc(fe);
/* XLPG Line Driver Configuration (Reg. 0xQF0) */
if (IS_FE_TXTRISTATE(fe)){
DEBUG_EVENT("%s: Disable TX (tri-state mode)\n",
fe->name);
WRITE_REG(REG_XLPG_LINE_CFG, BIT_XLPG_LINE_CFG_HIGHZ);
}else{
WRITE_REG(REG_XLPG_LINE_CFG, fe->te_param.xlpg_scale);
}
return 0;
}
/*
******************************************************************************
* sdla_pmc4354_rlps_optim()
*
* Description: PMC4354 COMET QUAD RLPS optimization routine.
*
* Arguments:
* Returns:
******************************************************************************
*/
static int sdla_pmc4354_rlps_optim(sdla_fe_t *fe)
{
/* RLPS Optimization routine */
WRITE_REG_LINE(0, 0x4D7, 0x00); /* 01 */
WRITE_REG_LINE(0, 0x4F1, 0x00); /* 02 */
WRITE_REG_LINE(0, 0x5F1, 0x00); /* 03 */
WRITE_REG_LINE(0, 0x6F1, 0x00); /* 04 */
WRITE_REG_LINE(0, 0x7F1, 0x00); /* 05 */
WRITE_REG_LINE(0, 0x4F9, 0x00); /* 06 */
WRITE_REG_LINE(0, 0x5F9, 0x00); /* 07 */
WRITE_REG_LINE(0, 0x6F9, 0x00); /* 08 */
WRITE_REG_LINE(0, 0x7F9, 0x00); /* 09 */
WRITE_REG_LINE(0, 0x4F9, 0x04); /* 10 */
WRITE_REG_LINE(0, 0x4FB, 0x09); /* 11 */
WRITE_REG_LINE(0, 0x00B, 0x20); /* 12 */
WP_DELAY(1);
WRITE_REG_LINE(0, 0x4F9, 0x00); /* 14 */
WRITE_REG_LINE(0, 0x00B, 0x00); /* 15 */
WRITE_REG_LINE(0, 0x5F9, 0x04); /* 16 */
WRITE_REG_LINE(0, 0x5FB, 0x09); /* 17 */
WRITE_REG_LINE(0, 0x00B, 0x20); /* 18 */
WP_DELAY(1);
WRITE_REG_LINE(0, 0x5F9, 0x00); /* 20 */
WRITE_REG_LINE(0, 0x00B, 0x00); /* 21 */
WRITE_REG_LINE(0, 0x6F9, 0x04); /* 22 */
WRITE_REG_LINE(0, 0x6FB, 0x09); /* 23 */
WRITE_REG_LINE(0, 0x00B, 0x20); /* 24 */
WP_DELAY(1);
WRITE_REG_LINE(0, 0x6F9, 0x00); /* 26 */
WRITE_REG_LINE(0, 0x00B, 0x00); /* 27 */
WRITE_REG_LINE(0, 0x7F9, 0x04); /* 28 */
WRITE_REG_LINE(0, 0x7FB, 0x09); /* 29 */
WRITE_REG_LINE(0, 0x00B, 0x20); /* 30 */
WP_DELAY(1);
WRITE_REG_LINE(0, 0x7F9, 0x00); /* 32 */
WRITE_REG_LINE(0, 0x00B, 0x00); /* 33 */
return 0;
}
/******************************************************************************
** sdla_t1_cfg_verify()
**
** Description: Verify T1 Front-End configuration
** Arguments:
** Returns: 0 - successfully, otherwise -EINVAL.
*******************************************************************************/
static int sdla_t1_cfg_verify(void* pfe)
{
sdla_fe_t *fe = (sdla_fe_t*)pfe;
/* Verify FE framing type */
switch(WAN_FE_FRAME(fe)){
case WAN_FR_D4: case WAN_FR_ESF: case WAN_FR_UNFRAMED:
break;
case WAN_FR_NONE:
DEBUG_EVENT("%s: Defaulting T1 Frame = ESF\n",
fe->name);
WAN_FE_FRAME(fe) = WAN_FR_ESF;
break;
default:
DEBUG_ERROR("%s: Error: Invalid %s FE Framing type (%X)\n",
fe->name,
FE_MEDIA_DECODE(fe),
WAN_FE_FRAME(fe));
return -EINVAL;
break;
}
/* Verify FE line code type */
switch(WAN_FE_LCODE(fe)){
case WAN_LCODE_B8ZS: case WAN_LCODE_AMI:
break;
case WAN_LCODE_NONE:
DEBUG_EVENT("%s: Defaulting T1 Line Code = B8ZS\n",
fe->name);
WAN_FE_LCODE(fe) = WAN_LCODE_B8ZS;
break;
default:
DEBUG_ERROR("%s: Error: Invalid %s FE Line code type (%X)\n",
fe->name,
FE_MEDIA_DECODE(fe),
WAN_FE_LCODE(fe));
return -EINVAL;
break;
}
/* Verify LBO */
switch(WAN_TE1_LBO(fe)) {
case WAN_T1_LBO_0_DB: case WAN_T1_LBO_75_DB:
case WAN_T1_LBO_15_DB: case WAN_T1_LBO_225_DB:
case WAN_T1_0_133: case WAN_T1_0_110:
case WAN_T1_133_266: case WAN_T1_110_220:
case WAN_T1_266_399: case WAN_T1_220_330:
case WAN_T1_399_533: case WAN_T1_330_440: case WAN_T1_440_550:
case WAN_T1_533_655: case WAN_T1_550_660:
break;
case WAN_T1_LBO_NONE:
DEBUG_EVENT("%s: Defaulting T1 LBO = 0 db\n",
fe->name);
WAN_TE1_LBO(fe) = WAN_T1_LBO_0_DB;
break;
default:
DEBUG_ERROR("%s: Error: Invalid %s LBO value (%X)\n",
fe->name,
FE_MEDIA_DECODE(fe),
WAN_TE1_LBO(fe));
return -EINVAL;
break;
}
return 0;
}
/******************************************************************************
** sdla_e1_cfg_verify()
**
** Description: Verify E1 Front-End configuration
** Arguments:
** Returns: 0 - successfully, otherwise -EINVAL.
*******************************************************************************/
static int sdla_e1_cfg_verify(void* pfe)
{
sdla_fe_t *fe = (sdla_fe_t*)pfe;
/* Verify FE framing type */
switch(WAN_FE_FRAME(fe)){
case WAN_FR_NCRC4: case WAN_FR_CRC4: case WAN_FR_UNFRAMED:
break;
case WAN_FR_NONE:
DEBUG_EVENT("%s: Defaulting E1 Frame = CRC4\n",
fe->name);
WAN_FE_FRAME(fe) = WAN_FR_CRC4;
break;
default:
DEBUG_ERROR("%s: Error: Invalid %s FE Framing type (%X)\n",
fe->name,
FE_MEDIA_DECODE(fe),
WAN_FE_FRAME(fe));
return -EINVAL;
break;
}
/* Verify FE line code type */
switch(WAN_FE_LCODE(fe)){
case WAN_LCODE_HDB3: case WAN_LCODE_AMI:
break;
case WAN_LCODE_NONE:
DEBUG_EVENT("%s: Defaulting E1 Line Code = HDB3\n",
fe->name);
WAN_FE_LCODE(fe) = WAN_LCODE_HDB3;
break;
default:
DEBUG_ERROR("%s: Error: Invalid %s FE Line code type (%X)\n",
fe->name,
FE_MEDIA_DECODE(fe),
WAN_FE_LCODE(fe));
return -EINVAL;
break;
}
/* Verify LBO */
switch(WAN_TE1_LBO(fe)) {
case WAN_E1_120: case WAN_E1_75:
break;
case WAN_T1_LBO_NONE:
DEBUG_EVENT("%s: Defaulting E1 LBO = 120 OH\n",
fe->name);
WAN_TE1_LBO(fe) = WAN_E1_120;
break;
default:
DEBUG_ERROR("%s: Error: Invalid %s LBO value (%X)\n",
fe->name,
FE_MEDIA_DECODE(fe),
WAN_TE1_LBO(fe));
return -EINVAL;
break;
}
switch(WAN_TE1_SIG_MODE(fe)){
case WAN_TE1_SIG_CAS: case WAN_TE1_SIG_CCS:
break;
case WAN_TE1_SIG_NONE:
DEBUG_EVENT("%s: Defaulting E1 Signalling = CCS\n",
fe->name);
WAN_TE1_SIG_MODE(fe) = WAN_TE1_SIG_CCS;
break;
default:
DEBUG_ERROR("%s: Error: Invalid E1 Signalling type (%X)\n",
fe->name,
WAN_TE1_SIG_MODE(fe));
return -EINVAL;
break;
}
return 0;
}
/*
******************************************************************************
** sdla_te_chip_config()
**
** Description: Configure Sangoma T1/E1 chip
** Arguments:
** Returns:
******************************************************************************/
static int sdla_te_chip_config(sdla_fe_t *fe)
{
sdla_t* card = (sdla_t*)fe->card;
u16 adapter_type;
WAN_ASSERT(fe->write_fe_reg == NULL);
WAN_ASSERT(fe->read_fe_reg == NULL);
card->hw_iface.getcfg(card->hw, SDLA_ADAPTERTYPE, &adapter_type);
fe->te_param.max_channels =
(IS_E1_FEMEDIA(fe)) ? NUM_OF_E1_TIMESLOTS: NUM_OF_T1_CHANNELS;
//fe->te_param.lb_rx_code = LINELB_DS1LINE_DISABLE;
switch(fe->fe_chip_id){
case CHIP_ID_COMET:
sdla_pmc4351_te_config(fe, adapter_type);
break;
case CHIP_ID_COMET_QUAD:
sdla_pmc4354_te_config(fe, adapter_type);
sdla_pmc4354_rlps_optim(fe);
break;
default:
DEBUG_ERROR("%s: ERROR: Unsupported T1/E1 CHIP (0x%02X)\n",
fe->name, (fe->fe_chip_id >> 5));
return -EINVAL;
}
ClearRPSCReg(fe);
ClearTPSCReg(fe);
DisableAllChannels(fe);
EnableChannels(fe);
#if 0
if (WAN_TE1_ACTIVE_CH(fe) == ENABLE_ALL_CHANNELS){
DEBUG_EVENT("%s: All channels enabled\n", fe->name);
EnableAllChannels(fe);
}else{
int channel_range = (IS_T1_FEMEDIA(fe)) ?
NUM_OF_T1_CHANNELS : NUM_OF_E1_CHANNELS;
//NUM_OF_T1_CHANNELS : NUM_OF_E1_TIMESLOTS;
int i = 0;
for(i = 1; i <= channel_range; i++){
if (WAN_TE1_ACTIVE_CH(fe) & (1 << (i - 1))){
DEBUG_EVENT("%s: Enable channel %d\n",
fe->name, i-1);
EnableTxChannel(fe, i-1);
EnableRxChannel(fe, i-1);
}
}
}
#endif
return 0;
}
/*
******************************************************************************
* sdla_te_config()
*
* Description: Configure Sangoma T1/E1 boards
* Arguments:
* Returns: WANTRUE - TE1 configred successfully, otherwise WAN_FALSE.
******************************************************************************
*/
static int sdla_te_config(void* pfe)
{
sdla_fe_t *fe = (sdla_fe_t*)pfe;
int err = 0;
unsigned char value;
WAN_ASSERT(fe->write_fe_reg == NULL);
WAN_ASSERT(fe->read_fe_reg == NULL);
memset(&fe->te_param, 0, sizeof(sdla_te_param_t));
/* Revision/Chip ID (Reg. 0x0D) */
value = READ_REG_LINE(0, REG_REVISION_CHIP_ID);
fe->fe_chip_id = value & MASK_CHIP_ID;
switch(fe->fe_chip_id){
case CHIP_ID_COMET:
fe->fe_cfg.line_no = 0;
break;
case CHIP_ID_COMET_QUAD:
if ((int)WAN_FE_LINENO(fe) < 0 || WAN_FE_LINENO(fe) > 3){
DEBUG_EVENT("%s: TE Config: Invalid Port selected %d (Min=1 Max=4)\n",
fe->name,
WAN_FE_LINENO(fe)+1);
return -EINVAL;
}
break;
default:
DEBUG_ERROR("%s: ERROR: Unsupported PMC %s CHIP (%02X)\n",
fe->name,
FE_MEDIA_DECODE(fe),
(fe->fe_chip_id >> 5));
return -EINVAL;
}
if (IS_T1_FEMEDIA(fe) || IS_J1_FEMEDIA(fe)){
err = sdla_t1_cfg_verify(fe);
}else if (IS_E1_FEMEDIA(fe)){
err = sdla_e1_cfg_verify(fe);
}else{
DEBUG_ERROR("%s: Error: Invalid FE Media type (%X)\n",
fe->name,
WAN_FE_MEDIA(fe));
err =-EINVAL;
}
if (err) return -EINVAL;
DEBUG_EVENT("%s: Configuring PMC %s %s FE\n",
fe->name,
DECODE_CHIPID(fe->fe_chip_id),
FE_MEDIA_DECODE(fe));
DEBUG_EVENT("%s: Port %d,%s,%s,%s\n",
fe->name,
WAN_FE_LINENO(fe)+1,
FE_LCODE_DECODE(fe),
FE_FRAME_DECODE(fe),
TE_LBO_DECODE(fe));
DEBUG_EVENT("%s: Clk %s:%d, Ch %X\n",
fe->name,
TE_CLK_DECODE(fe),
WAN_TE1_REFCLK(fe),
WAN_TE1_ACTIVE_CH(fe));
if (IS_E1_FEMEDIA(fe)){
DEBUG_EVENT("%s: Sig Mode %s\n",
fe->name,
WAN_TE1_SIG_DECODE(fe));
}
if (WAN_FE_FRAME(fe) == WAN_FR_UNFRAMED &&
WAN_TE1_ACTIVE_CH(fe) != ENABLE_ALL_CHANNELS){
DEBUG_EVENT(
"%s: ERROR: Invalid active channel list for Unframed mode (%X)!\n",
fe->name, WAN_TE1_ACTIVE_CH(fe));
return -EINVAL;
}
if (sdla_te_chip_config(fe)){
DEBUG_EVENT("%s: Failed to configure %s Front-End chip!\n",
fe->name,
FE_MEDIA_DECODE(fe));
return -EINVAL;
}
/* Read initial alarm status */
sdla_te_read_alarms(fe, WAN_FE_ALARM_READ|WAN_FE_ALARM_UPDATE);
sdla_te_pmon(fe, WAN_FE_PMON_UPDATE);
sdla_te_flush_pmon(fe);
wan_set_bit(TE_CONFIGURED,(void*)&fe->te_param.critical);
return 0;
}
/*
******************************************************************************
* sdla_te_reconfig()
*
* Description: T1/E1 post configuration.
* Arguments:
* Returns:
******************************************************************************
*/
static int sdla_te_reconfig(sdla_fe_t* fe)
{
unsigned char value;
if (IS_E1_FEMEDIA(fe)){
if (WAN_TE1_SIG_MODE(fe) == WAN_TE1_SIG_CAS){
DEBUG_EVENT("%s: Enable E1 CAS signalling mode!\n",
fe->name);
/* E1-TRAN Configuration (Reg. 0x80) */
value = READ_REG(REG_E1_TRAN_CFG);
value |= (BIT_E1_TRAN_SIGEN|BIT_E1_TRAN_DLEN);
WRITE_REG(REG_E1_TRAN_CFG, value);
/* E1-FRMR Frame Alignment Options (Reg 0x90) */
value = READ_REG(REG_E1_FRMR_CFG);
value &= ~BIT_E1_FRMR_CASDIS;
WRITE_REG(REG_E1_FRMR_CFG, value);
}else if (WAN_TE1_SIG_MODE(fe) == WAN_TE1_SIG_CCS){
DEBUG_EVENT("%s: Enable E1 CCS signalling mode!\n",
fe->name);
/* E1-TRAN Configuration (Reg. 0x80) */
value = READ_REG(REG_E1_TRAN_CFG);
value &= ~(BIT_E1_TRAN_SIGEN|BIT_E1_TRAN_DLEN);
WRITE_REG(REG_E1_TRAN_CFG, value);
/* E1-FRMR Frame Alignment Options (Reg 0x90) */
value = READ_REG(REG_E1_FRMR_CFG);
value |= BIT_E1_FRMR_CASDIS;
WRITE_REG(REG_E1_FRMR_CFG, value);
}
}
return 0;
}
/*
******************************************************************************
* sdla_te_post_init()
*
* Description: T1/E1 post initialization (should be called out of any lock).
* Arguments:
* Returns:
******************************************************************************
*/
static int sdla_te_post_init(void *pfe)
{
sdla_fe_t *fe = (sdla_fe_t*)pfe;
sdla_fe_timer_event_t fe_event;
/* Initialize and start T1/E1 timer */
wan_set_bit(TE_TIMER_KILL,(void*)&fe->te_param.critical);
wan_init_timer(
&fe->timer,
sdla_te_timer,
(wan_timer_arg_t)fe);
wan_clear_bit(TE_TIMER_KILL,(void*)&fe->te_param.critical);
wan_clear_bit(TE_TIMER_RUNNING,(void*)&fe->te_param.critical);
/* Jan 6, 2009 Always enable BOC detection */
WRITE_REG(REG_T1_RBOC_ENABLE, READ_REG(REG_T1_RBOC_ENABLE) | BIT_T1_RBOC_ENABLE_BOCE);
fe_event.type = TE_LINKDOWN_TIMER;
fe_event.delay = POLLING_TE1_TIMER;
sdla_te_add_event(fe, &fe_event);
sdla_te_add_timer(fe, POLLING_TE1_TIMER);
return 0;
}
/*
******************************************************************************
* sdla_te_post_unconfig()
*
* Description: T1/E1 pre release routines (not locked).
* Arguments:
* Returns:
******************************************************************************
*/
static int sdla_te_post_unconfig(void* pfe)
{
sdla_fe_t *fe = (sdla_fe_t*)pfe;
sdla_fe_timer_event_t *fe_event = NULL;
wan_smp_flag_t smp_flags;
int empty = 0;
/* Kill TE timer poll command */
wan_set_bit(TE_TIMER_KILL,(void*)&fe->te_param.critical);
if (wan_test_bit(TE_TIMER_RUNNING,(void*)&fe->te_param.critical)){
wan_del_timer(&fe->timer);
}
wan_clear_bit(TE_TIMER_RUNNING,(void*)&fe->te_param.critical);
do {
wan_spin_lock_irq(&fe->lockirq,&smp_flags);
if (!WAN_LIST_EMPTY(&fe->event)){
fe_event = WAN_LIST_FIRST(&fe->event);
WAN_LIST_REMOVE(fe_event, next);
}else{
empty = 1;
}
wan_spin_unlock_irq(&fe->lockirq,&smp_flags);
/* Free should be called not from spin_lock_irq (windows) !!!! */
if (fe_event) wan_free(fe_event);
fe_event = NULL;
}while(!empty);
return 0;
}
/*
******************************************************************************
* sdla_te_set_intr()
*
* Description: Enable T1/E1 interrupts.
* Arguments:
* Returns:
******************************************************************************
*/
static void sdla_te_set_intr(sdla_fe_t* fe)
{
DEBUG_EVENT("%s: Enable %s Interrupts \n",
fe->name,
FE_MEDIA_DECODE(fe));
#if defined(FE_LOS_ENABLE)
/* Enable LOS interrupt */
WRITE_REG(REG_CDRC_INT_EN, BIT_CDRC_INT_EN_LOSE);
#endif
#if defined(FE_ALOS_ENABLE)
/* Enable ALOS interrupt */
WRITE_REG(REG_RLPS_CFG_STATUS,
READ_REG(REG_RLPS_CFG_STATUS) | BIT_RLPS_CFG_STATUS_ALOSE);
#endif
if (IS_T1_FEMEDIA(fe)){
/* Enable RBOC interrupt */
WRITE_REG(REG_T1_RBOC_ENABLE,
BIT_T1_RBOC_ENABLE_IDLE |
BIT_T1_RBOC_ENABLE_BOCE);
/* Clear ALM status register */
READ_REG(REG_T1_ALMI_INT_STATUS);
/* Enable interrupt on RED, AIS, YEL alarms */
WRITE_REG(REG_T1_ALMI_INT_EN,
BIT_T1_ALMI_INT_EN_FASTD |
BIT_T1_ALMI_INT_EN_REDE |
BIT_T1_ALMI_INT_EN_AISE |
BIT_T1_ALMI_INT_EN_YELE);
/* Enable interrupt on OOF alarm */
/* WRITE_REG(REG_T1_FRMR_INT_EN, BIT_T1_FRMR_INT_EN_INFRE); */
}else{
/* Enable interrupt on RED, AIS alarms */
WRITE_REG(REG_E1_FRMR_M_A_INT_EN,
BIT_E1_FRMR_M_A_INT_EN_REDE |
BIT_E1_FRMR_M_A_INT_EN_AISE);
/* Enable OOF Interrupt */
/*WRITE_REG(REG_E1_FRMR_FRM_STAT_INT_EN,BIT_E1_FRMR_FRM_STAT_INT_EN_OOFE);*/
}
/* Enable PMON interrupt */
WRITE_REG(REG_PMON_INT_EN_STATUS,
READ_REG(REG_PMON_INT_EN_STATUS) | BIT_PMON_INT_EN_STATUS_INTE);
sdla_te_pmon(fe, WAN_FE_PMON_UPDATE); /* Update PMON registers */
return;
}
/*
******************************************************************************
* sdla_te_clear_intr()
*
* Description: Disable T1/E1 interrupts.
* Arguments:
* Returns:
******************************************************************************
*/
static void sdla_te_clear_intr(sdla_fe_t* fe)
{
DEBUG_EVENT("%s: Disable %s Interrupts\n",
fe->name,
FE_MEDIA_DECODE(fe));
/* Enable LOS interrupt */
WRITE_REG(REG_CDRC_INT_EN,
READ_REG(REG_CDRC_INT_EN) & ~BIT_CDRC_INT_EN_LOSE);
/* Enable ALOS interrupt */
WRITE_REG(REG_RLPS_CFG_STATUS,
READ_REG(REG_RLPS_CFG_STATUS) & ~BIT_RLPS_CFG_STATUS_ALOSE);
if (IS_T1_FEMEDIA(fe)){
/* Enable RBOC interrupt */
WRITE_REG(REG_T1_RBOC_ENABLE,
READ_REG(REG_T1_RBOC_ENABLE) &
~(BIT_T1_RBOC_ENABLE_IDLE/* |
BIT_T1_RBOC_ENABLE_BOCE*/));
/* Enable interrupt on RED, AIS, YEL alarms */
WRITE_REG(REG_T1_ALMI_INT_EN,
READ_REG(REG_T1_ALMI_INT_EN) &
~(BIT_T1_ALMI_INT_EN_REDE |
BIT_T1_ALMI_INT_EN_AISE |
BIT_T1_ALMI_INT_EN_YELE));
/* Enable interrupt on OOF alarm */
/* WRITE_REG(REG_T1_FRMR_INT_EN,
* BIT_T1_FRMR_INT_EN_INFRE);*/
}else{
/* Enable interrupt on RED, AIS alarms */
WRITE_REG(REG_E1_FRMR_M_A_INT_EN,
READ_REG(REG_E1_FRMR_M_A_INT_EN) &
~(BIT_E1_FRMR_M_A_INT_EN_REDE |
BIT_E1_FRMR_M_A_INT_EN_AISE));
/* Enable OOF Interrupt */
/* WRITE_REG(REG_E1_FRMR_FRM_STAT_INT_EN,
* BIT_E1_FRMR_FRM_STAT_INT_EN_OOFE);*/
}
/* Disable PMON interrupt */
WRITE_REG(REG_PMON_INT_EN_STATUS,
READ_REG(REG_PMON_INT_EN_STATUS) & ~BIT_PMON_INT_EN_STATUS_INTE);
sdla_te_pmon(fe, WAN_FE_PMON_UPDATE); /* Clean PMON registers */
return;
}
static int sdla_te_sigctrl(sdla_fe_t *fe, int sig_mode, unsigned long ch_map, int mode)
{
int err = 0;
if (sig_mode == WAN_TE_SIG_INTR){
/* Enable signaling interrupt in case if we are not
** using polling routines for reading signaling bits
** from PMC chip. te_signaling_config function pointer
** is used for S514x T1/E1 card only. All new AFT
** cards use Signaling interrupt for this
** (Aug 5, 2004) */
if (fe->fe_status == FE_CONNECTED){
/* Enable SIGE and COSS */
DEBUG_TEST("%s: Enable SIGX interrupt\n",
fe->name);
WRITE_REG(REG_SIGX_CFG,
READ_REG(REG_SIGX_CFG) & ~BIT_SIGX_COSS);
WRITE_REG(REG_SIGX_CFG,
READ_REG(REG_SIGX_CFG) | BIT_SIGX_SIGE);
}else{
DEBUG_TEST("%s: Disable SIGX interrupt\n",
fe->name);
WRITE_REG(REG_SIGX_CFG,
READ_REG(REG_SIGX_CFG) & ~BIT_SIGX_COSS);
WRITE_REG(REG_SIGX_CFG,
READ_REG(REG_SIGX_CFG) & ~BIT_SIGX_SIGE);
}
}
#if 0
/* Do not support RBS for the old cards */
if (card->wandev.te_signaling_config){
err=card->wandev.te_signaling_config(card,timeslot_map);
if (err) return err;
err=card->wandev.te_read_signaling_config(card);
if (err) return err;
}
#endif
return err;
}
/*
******************************************************************************
* sdla_te_global_unconfig()
*
* Description: Global configuration for Sangoma TE1 PMC board.
* Note: These register should be program only once for AFT-QUAD
* cards.
* Arguments:
* Returns: WANTRUE - TE1 configred successfully, otherwise WAN_FALSE.
******************************************************************************
*/
static int sdla_te_global_unconfig(void* pfe)
{
sdla_fe_t *fe = (sdla_fe_t*)pfe;
DEBUG_EVENT("%s: %s Global unconfiguration!\n",
fe->name,
FE_MEDIA_DECODE(fe));
/* 1. Initiate software reset of the COMET */
/* Set RESET=1 to place COMET into RESET */
WRITE_REG_LINE(0, REG_RESET, BIT_RESET);
/* Set RESET=0, disable software reset. COMET in default mode. */
WRITE_REG_LINE(0, REG_RESET, 0x0/*~BIT_RESET*/);
return 0;
}
/*
******************************************************************************
* sdla_te_unconfig()
*
* Description: T1/E1 unconfig.
* Arguments:
* Returns:
******************************************************************************
*/
static int sdla_te_unconfig(void* pfe)
{
sdla_fe_t *fe = (sdla_fe_t*)pfe;
wan_set_bit(TE_TIMER_KILL,(void*)&fe->te_param.critical);
if (!wan_test_bit(TE_CONFIGURED,(void*)&fe->te_param.critical)){
return -EINVAL;
}
/* Disable interrupts here */
sdla_te_clear_intr(fe);
/* Clear TE_CONFIGURED flag */
wan_clear_bit(TE_CONFIGURED,(void*)&fe->te_param.critical);
ClearTemplate(fe);
return 0;
}
/*
******************************************************************************
* sdla_te_disable_irq()
*
* Description: Disable irq for current port
* Arguments:
* Returns:
******************************************************************************
*/
static int sdla_te_disable_irq(void* pfe)
{
sdla_fe_t *fe = (sdla_fe_t*)pfe;
if (!wan_test_bit(TE_CONFIGURED,(void*)&fe->te_param.critical)){
return -EINVAL;
}
/* Disable interrupts here */
sdla_te_clear_intr(fe);
return 0;
}
/*****************************************************************************
** sdla_te_master_clock()
** sdla_te_normal_clock()
**
** Description: This function is called only if frond end clock is congirued
** originally to NORMAL (otherwise its never called). According
** specification, when the CE recieves AIS alarm, the CE shall
** transmit from it's internal clock. When AIS alarm is cleared
** transmit should change clock type to normal.
** Arguments:
** Returns:
******************************************************************************/
static int sdla_te_master_clock(sdla_fe_t *fe)
{
switch(fe->fe_chip_id){
case CHIP_ID_COMET:
WRITE_REG(REG_TX_TIMING_OPT,
BIT_TX_PLLREF1 |
BIT_TX_PLLREF0 |
BIT_TX_TXELSTBYP);
break;
case CHIP_ID_COMET_QUAD:
WRITE_REG(REG_TX_TIMING_OPT,
BIT_TX_PLLREF1 |
BIT_TX_PLLREF0);
break;
}
return 0;
}
static int sdla_te_normal_clock(sdla_fe_t *fe)
{
WRITE_REG(REG_TX_TIMING_OPT,
BIT_TX_PLLREF1 |
BIT_TX_TXELSTBYP);
return 0;
}
static u_int32_t sdla_te_is_t1_alarm(sdla_fe_t *fe, u_int32_t alarms)
{
u_int32_t alarm_mask = WAN_TE1_FRAMED_ALARMS;
if (fe->fe_cfg.cfg.te_cfg.ignore_yel_alarm == WANOPT_NO){
alarm_mask |= WAN_TE_BIT_ALARM_RAI;
}
return (alarms & alarm_mask);
}
static u_int32_t sdla_te_is_e1_alarm(sdla_fe_t *fe, u_int32_t alarms)
{
u_int32_t alarm_mask = 0x00;
if (WAN_FE_FRAME(fe) == WAN_FR_UNFRAMED){
alarm_mask = WAN_TE1_UNFRAMED_ALARMS;
}else{
alarm_mask = WAN_TE1_FRAMED_ALARMS;
}
return (alarms & alarm_mask);
}
/*
******************************************************************************
* sdla_te_set_status()
*
* Description: Set T1/E1 status. Enable OOF and LCV interrupt (if status
* changed to disconnected.
* Arguments:
* Returns:
******************************************************************************
*/
static void sdla_te_set_status(sdla_fe_t* fe, u_int32_t alarms)
{
sdla_t *card = (sdla_t*)fe->card;
u_int32_t valid_rx_alarms = 0x00;
unsigned char curr_fe_status = fe->fe_status;
if (IS_T1_FEMEDIA(fe)){
valid_rx_alarms = sdla_te_is_t1_alarm(fe, alarms);
}else if (IS_E1_FEMEDIA(fe)){
valid_rx_alarms = sdla_te_is_e1_alarm(fe, alarms);
}
if (valid_rx_alarms){
if (fe->fe_status != FE_DISCONNECTED){
if (!(valid_rx_alarms & WAN_TE_BIT_ALARM_RAI)){
sdla_te_set_alarms(fe, WAN_TE_BIT_ALARM_YEL);
}
fe->fe_status = FE_DISCONNECTED;
}else if (fe->te_param.tx_yel_alarm && valid_rx_alarms == WAN_TE_BIT_ALARM_RAI){
/* Special case for loopback */
sdla_te_clear_alarms(fe, WAN_TE_BIT_ALARM_YEL);
}
}else{
if (fe->fe_status != FE_CONNECTED){
if (fe->te_param.tx_yel_alarm){
sdla_te_clear_alarms(fe, WAN_TE_BIT_ALARM_YEL);
}
fe->fe_status = FE_CONNECTED;
}
}
if (curr_fe_status != fe->fe_status){
if (fe->fe_status == FE_CONNECTED){
DEBUG_EVENT("%s: %s connected!\n",
fe->name,
FE_MEDIA_DECODE(fe));
}else{
DEBUG_EVENT("%s: %s disconnected!\n",
fe->name,
FE_MEDIA_DECODE(fe));
}
if (card->wandev.te_report_alarms){
card->wandev.te_report_alarms(card, alarms);
}
}
return;
}
/*
******************************************************************************
* sdla_te_print_channels()
*
* Description: Print T1/E1 active channels.
* Arguments:
* Returns:
******************************************************************************
*/
static char* sdla_te_print_channels(sdla_fe_t* fe)
{
int channel_range = IS_T1_FEMEDIA(fe) ?
NUM_OF_T1_CHANNELS : NUM_OF_E1_TIMESLOTS;
static char channels[100];
int i = 0;
channels[0] = '\0';
if (WAN_TE1_ACTIVE_CH(fe) == ENABLE_ALL_CHANNELS){
memcpy(channels, "All channels", strlen("All channels"));
}else{
int start_channel = 0, first = 1;
for(i = 1; i <= channel_range; i++){
if (WAN_TE1_ACTIVE_CH(fe) & (1 << (i - 1))){
if (!start_channel){
start_channel = i;
}
}else{
if (start_channel){
if (start_channel + 1 == i){
if (!first){
sprintf(&channels[strlen(channels)], ",%d",
start_channel);
}else{
sprintf(&channels[strlen(channels)], "%d",
start_channel);
}
}else{
if (!first){
sprintf(&channels[strlen(channels)], ",%d-%d",
start_channel, i-1);
}else{
sprintf(&channels[strlen(channels)], "%d-%d",
start_channel, i-1);
}
}
first = 0;
start_channel = 0;
}
}
}
}
return channels;
}
/*
******************************************************************************
* sdla_channels()
*
* Description: Enable/Disable T1/E1 channels.
* Arguments:
* Returns:
******************************************************************************
*/
#if 0
static void sdla_channels(sdla_fe_t* fe, unsigned long active_ch)
{
sdla_fe_cfg_t* fe_cfg = &fe->fe_cfg;
int channel_range =
IS_T1_FEMEDIA(fe) ?
NUM_OF_T1_CHANNELS : NUM_OF_E1_TIMESLOTS;
int i = 0;
for(i = 1; i <= channel_range; i++){
if ((active_ch & (1 << (i - 1))) !=
(WAN_TE1_ACTIVE_CH(fe) & (1 << (i - 1)))){
if (active_ch & (1 << (i - 1))) {
/* Enable channel `i` */
EnableTxChannel(fe, i);
EnableRxChannel(fe, i);
}else{
/* Disable channel `i` */
DisableTxChannel(fe, i);
DisableRxChannel(fe, i);
}
}
}
return;
}
#endif
/*
******************************************************************************
* ReadAlarmStatus()
*
* Description: Read Alram Status for T1/E1 modes.
* Arguments:
* Returns: bit 0 - ALOS (E1/T1)
* bit 1 - LOS (E1/T1)
* bit 2 - ALTLOS (E1/T1)
* bit 3 - OOF (E1/T1)
* bit 4 - RED (E1/T1)
* bit 5 - AIS (E1/T1)
* bit 6 - OOSMF (E1)
* bit 7 - OOCMF (E1)
* bit 8 - OOOF (E1)
* bit 9 - RAI (E1)
* bit A - YEL (T1)
******************************************************************************
*/
static u_int32_t sdla_te_read_alarms(sdla_fe_t *fe, int action)
{
u_int32_t new_alarms = 0;
WAN_ASSERT(fe->write_fe_reg == NULL);
WAN_ASSERT(fe->read_fe_reg == NULL);
/* Always read it (compatable with previous cards */
if (IS_FE_ALARM_READ(action) || 1){
/* Check common alarm for E1 and T1 configuration
** 1. ALOS alarm
** Reg 0xFA
** Reg 0xF8 (ALOSI = 1) */
if (READ_REG(REG_RLPS_ALOS_DET_PER) &&
(READ_REG(REG_RLPS_CFG_STATUS) & BIT_RLPS_CFG_STATUS_ALOSV)){
new_alarms |= WAN_TE_BIT_ALARM_ALOS;
}
/* 2. LOS alarm
** Reg 0x12 */
if (READ_REG(REG_CDRC_INT_STATUS) & BIT_CDRC_INT_STATUS_LOSV){
new_alarms |= WAN_TE_BIT_ALARM_LOS;
}
/* 3. ALTLOS alarm ??????????????????
** Reg 0x13 */
if (READ_REG(REG_ALTLOS_STATUS) & BIT_ALTLOS_STATUS_ALTLOS){
new_alarms |= WAN_TE_BIT_ALARM_ALTLOS;
}
/* Check specific E1 and T1 alarms */
if (IS_E1_FEMEDIA(fe)){
u_int8_t e1_status, e1_mnt_status;
e1_status = READ_REG(REG_E1_FRMR_FR_STATUS);
e1_mnt_status = READ_REG(REG_E1_FRMR_MAINT_STATUS);
/* 4. OOF alarm */
if (WAN_FE_FRAME(fe) != WAN_FR_UNFRAMED){
if (e1_status & BIT_E1_FRMR_FR_STATUS_OOFV){
new_alarms |= WAN_TE_BIT_ALARM_OOF;
}
}
/* 5. OOSMF alarm */
if (e1_status & BIT_E1_FRMR_FR_STATUS_OOSMFV){
new_alarms |= WAN_TE_BIT_ALARM_OOSMF;
}
/* 6. OOCMF alarm */
if (e1_status & BIT_E1_FRMR_FR_STATUS_OOCMFV){
new_alarms |= WAN_TE_BIT_ALARM_OOCMF;
}
/* 7. OOOF alarm */
if (e1_status & BIT_E1_FRMR_FR_STATUS_OOOFV){
new_alarms |= WAN_TE_BIT_ALARM_OOOF;
}
/* 8. RAI alarm */
if (e1_mnt_status & BIT_E1_FRMR_MAINT_STATUS_RAIV){
new_alarms |= WAN_TE_BIT_ALARM_RAI;
}
/* 9. RED alarm
** Reg 0x97 (REDD) */
if (e1_mnt_status & BIT_E1_FRMR_MAINT_STATUS_RED){
new_alarms |= WAN_TE_BIT_ALARM_RED;
}
/* 10. AIS alarm
** Reg 0x91 (AISC)
** Reg 0x97 (AIS) */
if ((READ_REG(REG_E1_FRMR_MAINT_OPT) & BIT_E1_FRMR_MAINT_OPT_AISC) &&
(e1_mnt_status & BIT_E1_FRMR_MAINT_STATUS_AIS)){
new_alarms |= WAN_TE_BIT_ALARM_AIS;
}
} else {
u_int8_t t1_status = 0x00, t1_alm_status = 0x00;
/* 4. OOF alarm
** Reg 0x4A (INFR=0 T1 mode) */
if (!(READ_REG(REG_T1_FRMR_INT_STATUS) & BIT_T1_FRMR_INT_STATUS_INFR)){
new_alarms |= WAN_TE_BIT_ALARM_OOF;
}
t1_alm_status = READ_REG(REG_T1_ALMI_INT_STATUS);
t1_status = READ_REG(REG_T1_ALMI_DET_STATUS);
/* 5. AIS alarm
** Reg 0x62 (AIS)
** Reg 0x63 (AISD) */
if (t1_status & BIT_T1_ALMI_DET_STATUS_AISD){
new_alarms |= WAN_TE_BIT_ALARM_AIS;
}
/* 6. RED alarm
** Reg 0x63 (REDD) */
if ((t1_status & BIT_T1_ALMI_DET_STATUS_REDD) ||
(t1_alm_status & BIT_T1_ALMI_INT_STATUS_RED)){
new_alarms |= WAN_TE_BIT_ALARM_RED;
}
/* 7. YEL alarm
** Reg 0x62 (YEL)
** Reg 0x63 (YELD) */
if (t1_status & BIT_T1_ALMI_DET_STATUS_YELD){
new_alarms |= WAN_TE_BIT_ALARM_RAI; //WAN_TE_BIT_ALARM_YEL;
}
}
}
if (IS_FE_ALARM_UPDATE(action) || 1){
fe->fe_alarm = new_alarms;
}
if (IS_FE_ALARM_PRINT(action)){
sdla_te_print_alarms(fe, fe->fe_alarm);
}
return fe->fe_alarm;
}
/*
*******************************************************************************
** sdla_te_alaram_print()
**
** Description:
** Arguments:
** Returns:
*/
static int sdla_te_print_alarms(sdla_fe_t* fe, u_int32_t alarms)
{
if (!alarms){
alarms = fe->fe_alarm;
}
if (!alarms){
DEBUG_EVENT("%s: %s Alarms status: No alarms detected!\n",
fe->name,
FE_MEDIA_DECODE(fe));
return 0;
}
DEBUG_EVENT("%s: %s Alarms status:\n",
fe->name,
FE_MEDIA_DECODE(fe));
if (alarms & WAN_TE_BIT_ALARM_ALOS){
DEBUG_EVENT("%s: ALOS : ON\n", fe->name);
}
if (alarms & WAN_TE_BIT_ALARM_LOS){
DEBUG_EVENT("%s: LOS : ON\n", fe->name);
}
if (alarms & WAN_TE_BIT_ALARM_ALTLOS){
DEBUG_EVENT("%s: ALTLOS : ON\n", fe->name);
}
if (alarms & WAN_TE_BIT_ALARM_OOF){
DEBUG_EVENT("%s: OOF : ON\n", fe->name);
}
if (alarms & WAN_TE_BIT_ALARM_RAI){
DEBUG_EVENT("%s: RAI : ON\n", fe->name);
}
if (alarms & WAN_TE_BIT_ALARM_RED){
DEBUG_EVENT("%s: RED : ON\n", fe->name);
}
if (alarms & WAN_TE_BIT_ALARM_AIS){
DEBUG_EVENT("%s: AIS : ON\n", fe->name);
}
if (alarms & WAN_TE_BIT_ALARM_YEL){
DEBUG_EVENT("%s: YEL : ON\n", fe->name);
}
return 0;
}
/*
*******************************************************************************
** sdla_te_set_alarms()
**
** Description:
** Arguments:
** Returns:
*/
static int sdla_te_set_alarms(sdla_fe_t* fe, u_int32_t alarms)
{
unsigned char value = 0x00;
if (alarms & WAN_TE_BIT_ALARM_YEL){
if (IS_T1_FEMEDIA(fe)) {
value = READ_REG(REG_T1_XBAS_ALARM_TX);
if (!(value & BIT_T1_XBAS_ALARM_TX_XYEL)){
DEBUG_EVENT("%s: Set YELLOW alarm!\n",
fe->name);
WRITE_REG(REG_T1_XBAS_ALARM_TX, value | BIT_T1_XBAS_ALARM_TX_XYEL);
fe->te_param.tx_yel_alarm = 1;
}
}
}
return 0;
}
/*
*******************************************************************************
** sdla_te_clear_alarms()
**
** Description:
** Arguments:
** Returns:
*/
static int sdla_te_clear_alarms(sdla_fe_t* fe, u_int32_t alarms)
{
unsigned char value = 0x00;
if (alarms & WAN_TE_BIT_ALARM_YEL){
if (IS_T1_FEMEDIA(fe)) {
value = READ_REG(REG_T1_XBAS_ALARM_TX);
if (value & BIT_T1_XBAS_ALARM_TX_XYEL){
DEBUG_EVENT("%s: Clear YELLOW alarm!\n",
fe->name);
WRITE_REG(REG_T1_XBAS_ALARM_TX, value & ~BIT_T1_XBAS_ALARM_TX_XYEL);
fe->te_param.tx_yel_alarm = 0;
}
}
}
return 0;
}
/******************************************************************************
* sdla_te_pmon()
*
* Description: Read PMC performance monitoring counters
* Arguments:
* Returns:
******************************************************************************/
#define PMON_DEF_NUM 0x1FFF
static int sdla_te_pmon(sdla_fe_t *fe, int action)
{
sdla_te_pmon_t *pmon = &fe->fe_stats.te_pmon;
u16 pmon1, pmon2, pmon3, pmon4;
WAN_ASSERT(fe->write_fe_reg == NULL);
WAN_ASSERT(fe->read_fe_reg == NULL);
if (IS_FE_PMON_UPDATE(action)){
/* Update PMON counters */
//WRITE_REG(REG_PMON_BIT_ERROR, 0x00);
WRITE_REG(REG_REVISION_CHIP_ID, 0x00);
}
pmon->mask = 0x00;
/* Framing bit for E1/T1 */
pmon1 = READ_REG(REG_PMON_BIT_ERROR) & BITS_PMON_BIT_ERROR;
/* OOF Error for T1 or Far End Block Error for E1 */
pmon2 = ((READ_REG(REG_PMON_OOF_FEB_MSB_ERROR) & BITS_PMON_OOF_FEB_MSB_ERROR) << 8) |
READ_REG(REG_PMON_OOF_FEB_LSB_ERROR);
/* Bit Error for T1 or CRC Error for E1 */
pmon3 = ((READ_REG(REG_PMON_BIT_CRC_MSB_ERROR) & BITS_PMON_BIT_CRC_MSB_ERROR) << 8) |
READ_REG(REG_PMON_BIT_CRC_LSB_ERROR);
/* LCV Error for E1/T1 */
pmon4 = ((READ_REG(REG_PMON_LCV_MSB_COUNT) & BITS_PMON_LCV_MSB_COUNT) << 8) |
READ_REG(REG_PMON_LCV_LSB_COUNT);
pmon->mask |= WAN_TE_BIT_PMON_LCV;
if (pmon4 != PMON_DEF_NUM){
pmon->lcv_errors += pmon4;
}
if (IS_T1_FEMEDIA(fe)){
pmon->mask |= WAN_TE_BIT_PMON_FER;
pmon->fer_errors += pmon1;
pmon->mask |= WAN_TE_BIT_PMON_OOF;
pmon->oof_errors += pmon2;
pmon->mask |= WAN_TE_BIT_PMON_BEE;
pmon->bee_errors += pmon3;
}else{
pmon->mask |= WAN_TE_BIT_PMON_FAS;
pmon->fas_errors += pmon1;
pmon->mask |= WAN_TE_BIT_PMON_FEB;
pmon->feb_errors += pmon2;
pmon->mask |= WAN_TE_BIT_PMON_CRC4;
pmon->crc4_errors += pmon3;
}
return 0;
}
/******************************************************************************
* sdla_fe_flush_pmon()
*
* Description: Flush PMC performance monitoring counters
* Arguments:
* Returns:
******************************************************************************/
static int sdla_te_flush_pmon(sdla_fe_t *fe)
{
fe->fe_stats.te_pmon.lcv_errors = 0;
fe->fe_stats.te_pmon.fer_errors = 0;
fe->fe_stats.te_pmon.oof_errors = 0;
fe->fe_stats.te_pmon.bee_errors = 0;
fe->fe_stats.te_pmon.fas_errors = 0;
fe->fe_stats.te_pmon.feb_errors = 0;
fe->fe_stats.te_pmon.crc4_errors = 0;
return 0;
}
#if 0
/* NC: Function not being used.
TODO: confirm that its still needed */
/*
******************************************************************************
* SetLoopBackChannel()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int SetLoopBackChannel(sdla_fe_t* fe, int channel, unsigned char mode)
{
/* Set IND bit to 1 in TPSC to enable indirect access to TPSC register */
WRITE_REG(REG_TPSC_CFG, BIT_TPSC_IND);
/* Set LOOP to 1 for an IDLE code byte (the transmit data is overwritten
* with the corresponding channel data from the receive line.
*/
if (mode == LINELB_ACTIVATE_CODE){
WRITE_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel,
((READ_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel) & MASK_TPSC_DATA_CTRL_BYTE) |
BIT_TPSC_DATA_CTRL_BYTE_LOOP));
}else{
WRITE_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel,
((READ_TPSC_REG(REG_TPSC_DATA_CTRL_BYTE, channel) & MASK_TPSC_DATA_CTRL_BYTE) &
~BIT_TPSC_DATA_CTRL_BYTE_LOOP));
}
/* Set PCCE bit to 1 in TPSC to enable modifing the TPSC register */
WRITE_REG(REG_TPSC_CFG,
((READ_REG(REG_TPSC_CFG) & MASK_TPSC_CFG) | BIT_TPSC_PCCE));
return WAN_TRUE;
}
#endif
/*
******************************************************************************
* sdla_te_intr()
*
* Description: Check interrupt type.
* Arguments: card - pointer to device structure.
* write_register - write register function.
* read_register - read register function.
* Returns: None.
******************************************************************************
*/
static int sdla_te_check_intr(sdla_fe_t *fe)
{
unsigned char val;
WAN_ASSERT(fe->write_fe_reg == NULL);
WAN_ASSERT(fe->read_fe_reg == NULL);
if (!wan_test_bit(TE_CONFIGURED,(void*)&fe->te_param.critical)){
return 0;
}
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
val = READ_REG_LINE(0, REG_COMET_QUAD_MASTER_INTR);
val &= BITS_COMET_QUAD_MASTER_INTR;
if (!(val & (1 << WAN_FE_LINENO(fe)))){
DEBUG_ISR("%s: This interrupt not for this port %d\n",
fe->name,
WAN_FE_LINENO(fe)+1);
return 0;
}
}
return 1;
}
static int sdla_te_intr(sdla_fe_t *fe)
{
unsigned char status = fe->fe_status;
unsigned char val;
WAN_ASSERT(fe->write_fe_reg == NULL);
WAN_ASSERT(fe->read_fe_reg == NULL);
if (fe->fe_chip_id == CHIP_ID_COMET_QUAD){
val = READ_REG_LINE(0, REG_COMET_QUAD_MASTER_INTR);
val &= BITS_COMET_QUAD_MASTER_INTR;
if (!(val & (1 << WAN_FE_LINENO(fe)))){
DEBUG_ISR("%s: This interrupt not for this port %d\n",
fe->name,
WAN_FE_LINENO(fe)+1);
return 0;
}
}
fe->te_param.intr_src1 = READ_REG(REG_INT_SRC_1);
fe->te_param.intr_src2 = READ_REG(REG_INT_SRC_2);
fe->te_param.intr_src3 = READ_REG(REG_INT_SRC_3);
DEBUG_ISR("%s: %s: INTR SRC1=0x%X SRC2=0x%X SRC3=0x%X\n",
__FUNCTION__,
fe->name,
fe->te_param.intr_src1,
fe->te_param.intr_src2,
fe->te_param.intr_src3);
if (fe->te_param.intr_src1 == 0 &&
fe->te_param.intr_src2 == 0 &&
fe->te_param.intr_src3 == 0){
DEBUG_ISR("%s: Unknown %s interrupt!\n",
fe->name,
FE_MEDIA_DECODE(fe));
return 0;
}
sdla_te_tx_intr(fe);
sdla_te_rx_intr(fe);
DEBUG_ISR("%s: FE Interrupt Alarms=0x%X\n",
fe->name,fe->fe_alarm);
sdla_te_set_status(fe, fe->fe_alarm);
if (status != fe->fe_status){
if (fe->fe_status != FE_CONNECTED){
sdla_fe_timer_event_t fe_event;
/* AL: March 1, 2006: Disable FE intr */
sdla_te_clear_intr(fe);
/* Start T1/E1 timer (5 sec) */
fe_event.type = TE_LINKDOWN_TIMER;
fe_event.delay = POLLING_TE1_TIMER * 5;
sdla_te_add_event(fe, &fe_event);
}
}
#if 0
/*NCDEBUG*/
if (fe->fe_status==FE_CONNECTED){
/* Interrupt may not work for all alarms. Thus
* as soon as we have an interrupt we should
* do a poll just in case */
/*NCDEBUG*/
DEBUG_EVENT("%s: FE Interrupt triggering poll!\n",fe->name);
sdla_te_enable_timer(fe, TE_LINKDOWN_TIMER, POLLING_TE1_TIMER);
}
#endif
return 0;
}
/*
******************************************************************************
* sdla_te_tx_intr()
*
* Description: Read tx interrupt.
* Arguments: card - pointer to device structure.
* write_register - write register function.
* read_register - read register function.
* Returns: None.
******************************************************************************
*/
static void sdla_te_tx_intr(sdla_fe_t* fe)
{
if (!(fe->te_param.intr_src1 & BITS_TX_INT_SRC_1 ||
fe->te_param.intr_src2 & BITS_TX_INT_SRC_2 ||
fe->te_param.intr_src3 & BITS_TX_INT_SRC_3)){
return;
}
#if 0
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_TJAT){
}
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_APRM){
}
if (fe->te_param.intr_src2 & BIT_INT_SRC_2_TX_ELST){
}
if (fe->te_param.intr_src2 & BIT_INT_SRC_2_TDPR_1){
}
if (fe->te_param.intr_src2 & BIT_INT_SRC_2_TDPR_2){
}
if (fe->te_param.intr_src2 & BIT_INT_SRC_2_TDPR_3){
}
if (fe->te_param.intr_src3 & BIT_INT_SRC_3_TRAN){
}
if (fe->te_param.intr_src3 & BIT_INT_SRC_3_XPDE){
}
if (fe->te_param.intr_src3 & BIT_INT_SRC_3_BTIF){
}
#endif
return;
}
/*
******************************************************************************
* sdla_te_rx_intr()
*
* Description: Read rx interrupt.
* Arguments: card - pointer to device structure.
* write_register - write register function.
* read_register - read register function.
* Returns: None.
******************************************************************************
*/
static void sdla_te_rx_intr(sdla_fe_t* fe)
{
if (IS_T1_FEMEDIA(fe)){
sdla_t1_rx_intr(fe);
}else{
sdla_e1_rx_intr(fe);
}
return;
}
/*
******************************************************************************
* sdla_t1_rx_intr()
*
* Description: Read tx interrupt.
* Arguments: card - pointer to device structure.
* write_register - write register function.
* read_register - read register function.
* Returns: None.
******************************************************************************
*/
static void sdla_t1_rx_intr(sdla_fe_t* fe)
{
unsigned char status = 0x00;
if (!(fe->te_param.intr_src1 & BITS_RX_INT_SRC_1 ||
fe->te_param.intr_src2 & BITS_RX_INT_SRC_2 ||
fe->te_param.intr_src3 & BITS_RX_INT_SRC_3)){
return;
}
/* 3. PDVD */
if (fe->te_param.intr_src3 & BIT_INT_SRC_3_PDVD){
status = READ_REG(REG_PDVD_INT_EN_STATUS);
if ((status & BIT_PDVD_INT_EN_STATUS_PDVE) &&
(status & BIT_PDVD_INT_EN_STATUS_PDVI)){
if (status & BIT_PDVD_INT_EN_STATUS_PDV){
DEBUG_EVENT("%s: T1 pulse density violation detected!\n",
fe->name);
}
}
if ((status & BIT_PDVD_INT_EN_STATUS_Z16DE) &&
(status & BIT_PDVD_INT_EN_STATUS_Z16DI)){
DEBUG_EVENT("%s: T1 16 consecutive zeros detected!\n",
fe->name);
}
}
/* 6. ALMI */
if (fe->te_param.intr_src3 & BIT_INT_SRC_3_ALMI){
status = READ_REG(REG_T1_ALMI_INT_STATUS);
if (status & BIT_T1_ALMI_INT_STATUS_YELI){
if (status & BIT_T1_ALMI_INT_STATUS_YEL){
if (!(fe->fe_alarm & WAN_TE_BIT_ALARM_YEL)){
DEBUG_EVENT("%s: RAI alarm is ON\n",
fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_RAI; //WAN_TE_BIT_ALARM_YEL;
}
}else{
if (fe->fe_alarm & WAN_TE_BIT_ALARM_YEL){
DEBUG_EVENT("%s: RAI alarm is OFF\n",
fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_RAI; //~WAN_TE_BIT_ALARM_YEL;
}
}
}
if (status & BIT_T1_ALMI_INT_STATUS_REDI){
if (status & BIT_T1_ALMI_INT_STATUS_RED){
if (!(fe->fe_alarm & WAN_TE_BIT_ALARM_RED)){
DEBUG_EVENT("%s: RED alarm is ON\n",
fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_RED;
}
}else{
if (fe->fe_alarm & WAN_TE_BIT_ALARM_RED){
DEBUG_EVENT("%s: RED alarm is OFF\n",
fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_RED;
}
}
}
if (status & BIT_T1_ALMI_INT_STATUS_AISI){
if (status & BIT_T1_ALMI_INT_STATUS_AIS){
if (!(fe->fe_alarm & WAN_TE_BIT_ALARM_AIS)){
DEBUG_EVENT("%s: AIS alarm is ON\n",
fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_AIS;
}
}else{
if (fe->fe_alarm & WAN_TE_BIT_ALARM_AIS){
DEBUG_EVENT("%s: AIS alarm is OFF\n",
fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_AIS;
}
}
}
}
/* 8. RBOC */
if (fe->te_param.intr_src3 & BIT_INT_SRC_3_RBOC){
status = READ_REG(REG_T1_RBOC_CODE_STATUS);
if (status & BIT_T1_RBOC_CODE_STATUS_BOCI){
sdla_t1_boc(fe, status);
}
}
/* 7. FRMR */
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_FRMR){
status = READ_REG(REG_T1_FRMR_INT_STATUS);
if ((READ_REG(REG_T1_FRMR_INT_EN) & BIT_T1_FRMR_INT_EN_INFRE) &&
(status & BIT_T1_FRMR_INT_STATUS_INFRI)){
if (status & BIT_T1_FRMR_INT_STATUS_INFR){
if (!(fe->fe_alarm & WAN_TE_BIT_ALARM_OOF)){
DEBUG_EVENT("%s: OOF alarm is ON!\n",
fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_OOF;
}
}else{
if (fe->fe_alarm & WAN_TE_BIT_ALARM_OOF){
DEBUG_EVENT("%s: OOF alarm is OFF!\n",
fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_OOF;
}
}
}
}
/* 1. RLPS */
if (fe->te_param.intr_src3 & BIT_INT_SRC_3_RLPS){
status = READ_REG(REG_RLPS_CFG_STATUS);
if ((status & BIT_RLPS_CFG_STATUS_ALOSE) && (status & BIT_RLPS_CFG_STATUS_ALOSI)){
if (status & BIT_RLPS_CFG_STATUS_ALOSV){
if (!(fe->fe_alarm & WAN_TE_BIT_ALARM_ALOS)){
if (WAN_NET_RATELIMIT()){
DEBUG_EVENT("%s: ALOS alarm is ON\n",
fe->name);
}
fe->fe_alarm |= WAN_TE_BIT_ALARM_ALOS;
}
}else{
if (fe->fe_alarm & WAN_TE_BIT_ALARM_ALOS){
if (WAN_NET_RATELIMIT()){
DEBUG_EVENT("%s: ALOS alarm is OFF\n",
fe->name);
}
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_ALOS;
}
}
}
}
/* 2. CDRC */
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_CDRC){
status = READ_REG(REG_CDRC_INT_STATUS);
if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_LOSE) &&
(status & BIT_CDRC_INT_STATUS_LOSI)){
if (status & BIT_CDRC_INT_STATUS_LOSV){
if (!(fe->fe_alarm & WAN_TE_BIT_ALARM_LOS)){
if (WAN_NET_RATELIMIT()){
DEBUG_EVENT("%s: LOS alarm is ON\n",
fe->name);
}
fe->fe_alarm |= WAN_TE_BIT_ALARM_LOS;
}
}else{
if (fe->fe_alarm & WAN_TE_BIT_ALARM_LOS){
if (WAN_NET_RATELIMIT()){
DEBUG_EVENT("%s: LOS alarm is OFF\n",
fe->name);
}
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_LOS;
}
}
}
if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_LCVE) &&
(status & BIT_CDRC_INT_STATUS_LCVI)){
DEBUG_EVENT("%s: T1 line code violation!\n",
fe->name);
}
if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_LCSDE) &&
(status & BIT_CDRC_INT_STATUS_LCSDI)){
DEBUG_EVENT("%s: T1 line code signature detected!\n",
fe->name);
}
if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_ZNDE) &&
(status & BIT_CDRC_INT_STATUS_ZNDI)){
DEBUG_EVENT("%s: T1 consecutive zeros detected!\n",
fe->name);
}
status = READ_REG(REG_ALTLOS_STATUS);
if ((status & BIT_ALTLOS_STATUS_ALTLOSI) && (status & BIT_ALTLOS_STATUS_ALTLOSE)){
if (status & BIT_ALTLOS_STATUS_ALTLOS){
if (!(fe->fe_alarm & WAN_TE_BIT_ALARM_ALTLOS)){
DEBUG_EVENT("%s: ALTLOS alarm is ON\n",
fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_ALTLOS;
}
}else{
if (fe->fe_alarm & WAN_TE_BIT_ALARM_ALTLOS){
DEBUG_EVENT("%s: ALTLOS alarm is OFF\n",
fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_ALTLOS;
}
}
}
}
/* 14. PMON */
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_PMON){
status = READ_REG(REG_PMON_INT_EN_STATUS);
if (status & BIT_PMON_INT_EN_STATUS_XFER){
DEBUG_TE1("%s: T1 Updating PMON counters...\n",
fe->name);
sdla_te_pmon(fe, WAN_FE_PMON_READ);
}
}
/* 9. SIGX */
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_SIGX){
#if 0
unsigned char SIGX_chg_30_25;
unsigned char SIGX_chg_24_17;
unsigned char SIGX_chg_16_9;
unsigned char SIGX_chg_8_1;
SIGX_chg_30_25 = READ_REG(REG_SIGX_CFG);
SIGX_chg_24_17 = READ_REG(REG_SIGX_TIMESLOT_IND_STATUS);
SIGX_chg_16_9 = READ_REG(REG_SIGX_TIMESLOT_IND_ACCESS);
SIGX_chg_8_1 = READ_REG(REG_SIGX_TIMESLOT_IND_DATA_BUFFER);
#if 0
if(IS_E1_FEMEDIA(fe)) {
DEBUG_EVENT("%s: SIGX chg 30-25: 0x%02X\n",
fe->name, SIGX_chg_30_25);
}
DEBUG_EVENT("%s: SIGX chg 24-17: 0x%02X\n",
fe->name, SIGX_chg_24_17);
DEBUG_EVENT("%s: SIGX chg 16-9 : 0x%02X\n",
fe->name, SIGX_chg_16_9);
DEBUG_EVENT("%s: SIGX chg 8-1 : 0x%02X\n",
fe->name, SIGX_chg_8_1);
#endif
if (SIGX_chg_8_1){
sdla_te_check_rbsbits(fe, SIGX_chg_8_1, 1, 1);
/* status = READ_SIGX_REG(0x10);*/
/* printk(KERN_INFO "SIGX reg 0x10: 0x%02X\n", status);*/
}
if (SIGX_chg_16_9){
sdla_te_check_rbsbits(fe, SIGX_chg_16_9, 9, 1);
}
if (SIGX_chg_24_17){
sdla_te_check_rbsbits(fe, SIGX_chg_24_17, 17, 1);
}
if (SIGX_chg_30_25 && IS_E1_FEMEDIA(fe)){
sdla_te_check_rbsbits(fe, SIGX_chg_30_25, 25, 1);
}
#endif
sdla_te_check_rbsbits(fe, 1, ENABLE_ALL_CHANNELS, 1);
sdla_te_check_rbsbits(fe, 9, ENABLE_ALL_CHANNELS, 1);
sdla_te_check_rbsbits(fe, 17, ENABLE_ALL_CHANNELS, 1);
if (IS_E1_FEMEDIA(fe)){
sdla_te_check_rbsbits(fe, 25, ENABLE_ALL_CHANNELS, 1);
}
}
/* 5. IBCD */
fe->fe_alarm &= ~(WAN_TE_BIT_LOOPUP_CODE|WAN_TE_BIT_LOOPDOWN_CODE);
if (fe->te_param.intr_src3 & BIT_INT_SRC_3_IBCD){
status = READ_REG(REG_IBCD_INT_EN_STATUS);
if (status & BIT_IBCD_INT_EN_STATUS_LBAI){
fe->fe_alarm |= WAN_TE_BIT_LOOPUP_CODE;
}
if (status & BIT_IBCD_INT_EN_STATUS_LBDI){
fe->fe_alarm |= WAN_TE_BIT_LOOPDOWN_CODE;
}
}
#if 0
/* 4. RJAT */
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_RJAT){
}
/* 10. RX-ELST */
if (fe->te_param.intr_src2 & BIT_INT_SRC_2_RX_ELST){
}
/* 11. RDLC-1 */
if (fe->te_param.intr_src2 & BIT_INT_SRC_2_RDLC_1){
}
/* 12. RDLC-2 */
if (fe->te_param.intr_src2 & BIT_INT_SRC_2_RDLC_2){
}
/* 13. RDLC-3 */
if (fe->te_param.intr_src2 & BIT_INT_SRC_2_RDLC_3){
}
#endif
return;
}
/*
******************************************************************************
* sdla_e1_rx_intr()
*
* Description: Read tx interrupt.
* Arguments: card - pointer to device structure.
* write_register - write register function.
* read_register - read register function.
* Returns: None.
******************************************************************************
*/
static void sdla_e1_rx_intr(sdla_fe_t* fe)
{
unsigned char int_status = 0x00, status = 0x00;
if (!(fe->te_param.intr_src1 & BITS_RX_INT_SRC_1 ||
fe->te_param.intr_src2 & BITS_RX_INT_SRC_2 ||
fe->te_param.intr_src3 & BITS_RX_INT_SRC_3))
return;
/* 4. FRMR */
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_FRMR){
/* Register 0x92h E1 FRMR Framing Status Interrupt Enable */
unsigned char int_en = READ_REG(REG_E1_FRMR_FRM_STAT_INT_EN);
/* Register 0x94h E1 FRMR */
int_status = READ_REG(REG_E1_FRMR_FRM_STAT_INT_IND);
/* Register 0x96h E1 FRMR Status */
status = READ_REG(REG_E1_FRMR_FR_STATUS);
if ((int_en & BIT_E1_FRMR_FRM_STAT_INT_EN_OOFE) &&
(int_status & BIT_E1_FRMR_FRM_STAT_INT_IND_OOFI)){
/* Always ignore OOF alarm (even it is ON) */
if (WAN_FE_FRAME(fe) != WAN_FR_UNFRAMED){
if (status & BIT_E1_FRMR_FR_STATUS_OOFV){
if (!(fe->fe_alarm & WAN_TE_BIT_ALARM_OOF)){
DEBUG_EVENT("%s: OOF alarm is ON\n",
fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_OOF;
}
}else{
if (fe->fe_alarm & WAN_TE_BIT_ALARM_OOF){
DEBUG_EVENT("%s: OOF alarm is OFF\n",
fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_OOF;
}
}
}
}
if ((int_en & BIT_E1_FRMR_FRM_STAT_INT_EN_OOSMFE) &&
(int_status & BIT_E1_FRMR_FRM_STAT_INT_IND_OOSMFI)){
if (status & BIT_E1_FRMR_FR_STATUS_OOSMFV){
DEBUG_EVENT("%s: OOSMF alarm is ON\n",
fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_OOSMF;
}else{
DEBUG_EVENT("%s: OOSMF alarm is OFF\n",
fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_OOSMF;
}
}
if ((int_en & BIT_E1_FRMR_FRM_STAT_INT_EN_OOCMFE) &&
(int_status & BIT_E1_FRMR_FRM_STAT_INT_IND_OOCMFI)){
if (status & BIT_E1_FRMR_FR_STATUS_OOCMFV){
DEBUG_EVENT("%s: OOCMF alarm is ON\n",
fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_OOCMF;
}else{
DEBUG_EVENT("%s: OOCMF alarm is OFF\n",
fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_OOCMF;
}
}
/* Register 0x9Fh E1 FRMR */
status = READ_REG(REG_E1_FRMR_P_A_INT_STAT);
if ((READ_REG(REG_E1_FRMR_P_A_INT_EN) & BIT_E1_FRMR_P_A_INT_EN_OOOFE) &&
(status & BIT_E1_FRMR_P_A_INT_STAT_OOOFI)){
if (READ_REG(REG_E1_FRMR_FR_STATUS) & BIT_E1_FRMR_FR_STATUS_OOOFV){
DEBUG_EVENT("%s: OOOF alarm is ON\n",
fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_OOOF;
}else{
DEBUG_EVENT("%s: OOOF alarm is OFF\n",
fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_OOOF;
}
}
/* Register 0x95h E1 FRMR */
int_status = READ_REG(REG_E1_FRMR_M_A_INT_IND);
if (int_status & (BIT_E1_FRMR_M_A_INT_IND_REDI |
BIT_E1_FRMR_M_A_INT_IND_AISI |
BIT_E1_FRMR_M_A_INT_IND_RAII)){
unsigned char int_en = READ_REG(REG_E1_FRMR_M_A_INT_EN);
status = READ_REG(REG_E1_FRMR_MAINT_STATUS);
if ((int_en & BIT_E1_FRMR_M_A_INT_EN_REDE) &&
(int_status & BIT_E1_FRMR_M_A_INT_IND_REDI)){
if (status & BIT_E1_FRMR_MAINT_STATUS_RED){
DEBUG_EVENT("%s: RED alarm is ON\n", fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_RED;
}else{
DEBUG_EVENT("%s: RED alarm is OFF\n", fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_RED;
}
}
if ((int_en & BIT_E1_FRMR_M_A_INT_EN_AISE) &&
(int_status & BIT_E1_FRMR_M_A_INT_IND_AISI)){
if (status & BIT_E1_FRMR_MAINT_STATUS_AIS){
DEBUG_EVENT("%s: AIS alarm is ON\n", fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_AIS;
/* AS/ACIF S016 Clause 5.2.3 */
WRITE_REG(REG_E1_TRAN_TX_ALARM_CTRL,
READ_REG(REG_E1_TRAN_TX_ALARM_CTRL) |
BIT_E1_TRAN_TX_ALARM_RAI);
if (WAN_TE1_CLK(fe) == WAN_NORMAL_CLK){
sdla_te_master_clock(fe);
}
}else{
DEBUG_EVENT("%s: AIS alarm is OFF\n", fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_AIS;
/* AS/ACIF S016 Clause 5.2.3 */
WRITE_REG(REG_E1_TRAN_TX_ALARM_CTRL,
READ_REG(REG_E1_TRAN_TX_ALARM_CTRL) &
~BIT_E1_TRAN_TX_ALARM_RAI);
if (WAN_TE1_CLK(fe) == WAN_NORMAL_CLK){
sdla_te_normal_clock(fe);
}
}
}
if ((int_en & BIT_E1_FRMR_M_A_INT_EN_RAIE) &&
(int_status & BIT_E1_FRMR_M_A_INT_IND_RAII)){
if (status & BIT_E1_FRMR_MAINT_STATUS_RAIV){
DEBUG_EVENT("%s: RAI alarm is ON\n", fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_RAI;
}else{
DEBUG_EVENT("%s: RAI alarm is OFF\n", fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_RAI;
}
}
}
}
/* 1. RLPS */
if (fe->te_param.intr_src3 & BIT_INT_SRC_3_RLPS){
status = READ_REG(REG_RLPS_CFG_STATUS);
if ((status & BIT_RLPS_CFG_STATUS_ALOSE) &&
(status & BIT_RLPS_CFG_STATUS_ALOSI)){
if (status & BIT_RLPS_CFG_STATUS_ALOSV){
if (!(fe->fe_alarm & WAN_TE_BIT_ALARM_ALOS)){
DEBUG_EVENT("%s: ALOS alarm is ON\n",
fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_ALOS;
/* AS/ACIF S016 Clause 5.2.3 */
WRITE_REG(REG_E1_TRAN_TX_ALARM_CTRL,
READ_REG(REG_E1_TRAN_TX_ALARM_CTRL) |
BIT_E1_TRAN_TX_ALARM_RAI);
}
}else{
if (fe->fe_alarm & WAN_TE_BIT_ALARM_ALOS){
DEBUG_EVENT("%s: ALOS alarm is OFF\n",
fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_ALOS;
/* AS/ACIF S016 Clause 5.2.3 */
WRITE_REG(REG_E1_TRAN_TX_ALARM_CTRL,
READ_REG(REG_E1_TRAN_TX_ALARM_CTRL) &
~BIT_E1_TRAN_TX_ALARM_RAI);
}
}
}
}
/* 2. CDRC */
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_CDRC){
status = READ_REG(REG_CDRC_INT_STATUS);
if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_LOSE) &&
(status & BIT_CDRC_INT_STATUS_LOSI)){
if (status & BIT_CDRC_INT_STATUS_LOSV){
if (!(fe->fe_alarm & WAN_TE_BIT_ALARM_LOS)){
DEBUG_EVENT("%s: LOS alarm is ON\n", fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_LOS;
}
}else{
if (fe->fe_alarm & WAN_TE_BIT_ALARM_LOS){
DEBUG_EVENT("%s: LOS alarm is OFF\n", fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_LOS;
}
}
}
if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_LCVE) &&
(status & BIT_CDRC_INT_STATUS_LCVI)){
DEBUG_EVENT("%s: E1 line code violation!\n", fe->name);
}
if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_LCSDE) &&
(status & BIT_CDRC_INT_STATUS_LCSDI)){
DEBUG_EVENT("%s: E1 line code signature detected!\n", fe->name);
}
if ((READ_REG(REG_CDRC_INT_EN) & BIT_CDRC_INT_EN_ZNDE) &&
(status & BIT_CDRC_INT_STATUS_ZNDI)){
DEBUG_EVENT("%s: E1 consecutive zeros detected!\n", fe->name);
}
status = READ_REG(REG_ALTLOS_STATUS);
if ((status & BIT_ALTLOS_STATUS_ALTLOSI) &&
(status & BIT_ALTLOS_STATUS_ALTLOSE)){
if (status & BIT_ALTLOS_STATUS_ALTLOS){
if (!(fe->fe_alarm & WAN_TE_BIT_ALARM_ALTLOS)){
DEBUG_EVENT("%s: E1 Alternate Loss of Signal alarm is ON\n",
fe->name);
fe->fe_alarm |= WAN_TE_BIT_ALARM_ALTLOS;
}
}else{
if (fe->fe_alarm & WAN_TE_BIT_ALARM_ALTLOS){
DEBUG_EVENT("%s: E1 Alternate Loss of Signal alarm is OFF\n",
fe->name);
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_ALTLOS;
}
}
}
}
/* 11. PMON */
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_PMON){
status = READ_REG(REG_PMON_INT_EN_STATUS);
if (status & BIT_PMON_INT_EN_STATUS_XFER){
sdla_te_pmon(fe, WAN_FE_PMON_READ);
}
}
#if 0
/* 3. RJAT */
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_RJAT){
}
/* 5. SIGX */
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_SIGX){
}
/* 6. RX-ELST */
if (fe->te_param.intr_src2 & BIT_INT_SRC_2_RX_ELST){
}
/* 7. PRGD */
if (fe->te_param.intr_src1 & BIT_INT_SRC_1_PRGD){
}
/* 8. RDLC-1 */
if (fe->te_param.intr_src2 & BIT_INT_SRC_2_RDLC_1){
}
/* 9. RDLC-2 */
if (fe->te_param.intr_src2 & BIT_INT_SRC_2_RDLC_2){
}
/* 10. RDLC-3 */
if (fe->te_param.intr_src2 & BIT_INT_SRC_2_RDLC_3){
}
#endif
if (!(READ_REG(REG_RLPS_CFG_STATUS) & BIT_RLPS_CFG_STATUS_ALOSV)){
fe->fe_alarm &= ~WAN_TE_BIT_ALARM_ALOS;
}
return;
}
/******************************************************************************
* sdla_t1_boc()
*
* Description:
* Arguments:
* Returns:
******************************************************************************/
static int sdla_t1_boc(sdla_fe_t *fe, u_int8_t boc_value)
{
unsigned char lb_cmd, lb_mode;
boc_value &= MASK_T1_RBOC_CODE_STATUS;
DEBUG_TE1("%s: BOC Detect Event (BOC=%02X)!\n",
fe->name, boc_value);
switch(boc_value){
case RBOC_CODE_YEL:
if (WAN_NET_RATELIMIT()){
DEBUG_EVENT(
"%s: Received Yellow alarm condition!\n",
fe->name);
}
break;
case LINELB_ACTIVATE_CODE:
case LINELB_DEACTIVATE_CODE:
case PAYLB_ACTIVATE_CODE:
case PAYLB_DEACTIVATE_CODE:
if (wan_test_bit(LINELB_WAITING,(void*)&fe->te_param.critical) &&
wan_test_bit(LINELB_CODE_BIT,(void*)&fe->te_param.critical)){
wan_clear_bit(LINELB_CODE_BIT,(void*)&fe->te_param.critical);
break;
}
if (boc_value == LINELB_ACTIVATE_CODE || boc_value == LINELB_DEACTIVATE_CODE){
lb_mode = WAN_TE1_LINELB_MODE;
}else{
lb_mode = WAN_TE1_PAYLB_MODE;
}
if (boc_value == LINELB_ACTIVATE_CODE || boc_value == PAYLB_ACTIVATE_CODE){
lb_cmd = WAN_TE1_LB_ENABLE;
}else{
lb_cmd = WAN_TE1_LB_DISABLE;
}
DEBUG_TE1("%s: T1 loopback %s %s code received.\n",
fe->name,
WAN_TE1_LB_ACTION_DECODE(lb_cmd),
WAN_TE1_LB_MODE_DECODE(lb_mode));
sdla_te_set_lbmode(fe, lb_mode, lb_cmd, ENABLE_ALL_CHANNELS);
break;
case UNIVLB_DEACTIVATE_CODE:
DEBUG_TE1("%s: Received T1 %s code from far end.\n",
fe->name, WAN_TE1_BOC_LB_CODE_DECODE(boc_value));
sdla_te_set_lbmode(fe, WAN_TE1_LINELB_MODE, WAN_TE1_LB_DISABLE, ENABLE_ALL_CHANNELS);
sdla_te_set_lbmode(fe, WAN_TE1_PAYLB_MODE, WAN_TE1_LB_DISABLE, ENABLE_ALL_CHANNELS);
break;
case BITS_T1_XBOC_DISABLE:
DEBUG_EVENT("%s: T1 loopback mode deactivated.\n",
fe->name);
WRITE_REG(REG_MASTER_DIAG,
READ_REG(REG_MASTER_DIAG) &
~BIT_MASTER_DIAG_PAYLB);
break;
default:
if (WAN_NET_RATELIMIT()){
DEBUG_EVENT("%s: Received Reserved LoopBack code %02X!\n",
fe->name, boc_value);
}
break;
}
return 0;
}
/*
******************************************************************************
* sdla_te_set_lbmode()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int
sdla_te_set_lbmode(sdla_fe_t *fe, u_int8_t mode, u_int8_t enable, u_int32_t chan_map)
{
int err = 1;
WAN_ASSERT(fe->write_fe_reg == NULL);
WAN_ASSERT(fe->read_fe_reg == NULL);
switch(mode){
case WAN_TE1_LINELB_MODE:
err = sdla_te_linelb(fe, enable);
break;
case WAN_TE1_PAYLB_MODE:
err = sdla_te_paylb(fe, enable);
break;
case WAN_TE1_DDLB_MODE:
err = sdla_te_ddlb(fe, enable);
break;
case WAN_TE1_TX_LINELB_MODE:
case WAN_TE1_TX_PAYLB_MODE:
return sdla_te_tx_lb(fe, mode, enable);
break;
default:
DEBUG_EVENT("%s: Unsupported loopback mode (%s)!\n",
fe->name,
WAN_TE1_LB_MODE_DECODE(mode));
return -EINVAL;
}
DEBUG_EVENT("%s: %s %s mode... %s\n",
fe->name,
WAN_TE1_LB_ACTION_DECODE(enable),
WAN_TE1_LB_MODE_DECODE(mode),
(!err) ? "Done" : "Failed");
return err;
}
/*
******************************************************************************
* sdla_te_linelb()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int sdla_te_linelb(sdla_fe_t* fe, unsigned char mode)
{
WAN_ASSERT(fe->write_fe_reg == NULL);
WAN_ASSERT(fe->read_fe_reg == NULL);
if (mode == WAN_TE1_LB_ENABLE){
WRITE_REG(REG_MASTER_DIAG,
READ_REG(REG_MASTER_DIAG) | BIT_MASTER_DIAG_LINELB);
}else{
WRITE_REG(REG_MASTER_DIAG,
READ_REG(REG_MASTER_DIAG) & ~BIT_MASTER_DIAG_LINELB);
}
return 0;
}
/*
******************************************************************************
* sdla_te_paylb()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int sdla_te_paylb(sdla_fe_t* fe, unsigned char mode)
{
WAN_ASSERT(fe->write_fe_reg == NULL);
WAN_ASSERT(fe->read_fe_reg == NULL);
if (mode == WAN_TE1_LB_ENABLE){
WRITE_REG(REG_MASTER_DIAG,
READ_REG(REG_MASTER_DIAG) | BIT_MASTER_DIAG_PAYLB);
}else{
WRITE_REG(REG_MASTER_DIAG,
READ_REG(REG_MASTER_DIAG) & ~BIT_MASTER_DIAG_PAYLB);
}
return 0;
}
/*
******************************************************************************
* sdla_te_ddlb()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int sdla_te_ddlb(sdla_fe_t* fe, unsigned char mode)
{
WAN_ASSERT(fe->write_fe_reg == NULL);
WAN_ASSERT(fe->read_fe_reg == NULL);
if (mode == WAN_TE1_LB_ENABLE){
WRITE_REG(REG_MASTER_DIAG,
READ_REG(REG_MASTER_DIAG) | BIT_MASTER_DIAG_DDLB);
}else{
WRITE_REG(REG_MASTER_DIAG,
READ_REG(REG_MASTER_DIAG) & ~BIT_MASTER_DIAG_DDLB);
}
return 0;
}
/******************************************************************************
* sdla_te_get_lbmode()
*
* Description:
* Arguments:
* Returns:
*****************************************************************************/
static u32 sdla_te_get_lbmode(sdla_fe_t *fe)
{
u32 type_map = 0x00;
u8 master = 0x00;
WAN_ASSERT(fe->write_fe_reg == NULL);
WAN_ASSERT(fe->read_fe_reg == NULL);
master = READ_REG(REG_MASTER_DIAG);
if (master & BIT_MASTER_DIAG_LINELB){
wan_set_bit(WAN_TE1_LINELB_MODE, &type_map);
}
if (master & BIT_MASTER_DIAG_PAYLB){
wan_set_bit(WAN_TE1_PAYLB_MODE, &type_map);
}
if (master & BIT_MASTER_DIAG_DDLB){
wan_set_bit(WAN_TE1_DDLB_MODE, &type_map);
}
return type_map;
}
/*
******************************************************************************
* sdla_te_timer()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
static void sdla_te_timer(void* pfe)
#elif defined(__WINDOWS__)
static void sdla_te_timer(IN PKDPC Dpc, void* pfe, void* arg2, void* arg3)
#elif defined(KERN_TIMER_SETUP) && KERN_TIMER_SETUP > 0
static void sdla_te_timer(struct timer_list *t)
#else
static void sdla_te_timer(unsigned long pfe)
#endif
{
#if defined(KERN_TIMER_SETUP) && KERN_TIMER_SETUP > 0
sdla_fe_t *fe = from_timer(fe, t, timer.timer_info
);
#else
sdla_fe_t *fe = (sdla_fe_t*)pfe;
#endif
sdla_t *card = (sdla_t*)fe->card;
wan_device_t *wandev = &card->wandev;
wan_smp_flag_t smp_flags;
int empty = 1;
DEBUG_TIMER("%s: %s timer!\n",
fe->name,
FE_MEDIA_DECODE(fe));
DEBUG_TE1("%s(): line: %d\n", __FUNCTION__, __LINE__);
if (wan_test_bit(TE_TIMER_KILL,(void*)&fe->te_param.critical)){
wan_clear_bit(TE_TIMER_RUNNING,(void*)&fe->te_param.critical);
DEBUG_TE1("%s(): line: %d\n", __FUNCTION__, __LINE__);
return;
}
if (!wan_test_bit(TE_TIMER_RUNNING,(void*)&fe->te_param.critical)){
/* Somebody clear this bit */
DEBUG_EVENT("WARNING: %s: Timer bit is cleared (should never happened)!\n",
fe->name);
return;
}
wan_clear_bit(TE_TIMER_RUNNING,(void*)&fe->te_param.critical);
/* Enable hardware interrupt for TE1 */
wan_spin_lock_irq(&fe->lockirq,&smp_flags);
empty = WAN_LIST_EMPTY(&fe->event);
wan_spin_unlock_irq(&fe->lockirq,&smp_flags);
if (!empty){
if (wan_test_and_set_bit(TE_TIMER_EVENT_PENDING,(void*)&fe->te_param.critical)){
DEBUG_EVENT("%s: RM timer event is pending!\n", fe->name);
return;
}
if (wandev->fe_enable_timer){
wandev->fe_enable_timer(fe->card);
}else{
sdla_te_polling(fe);
}
}else{
sdla_te_add_timer(fe, POLLING_TE1_TIMER);
}
return;
}
/*
******************************************************************************
* sdla_te_add_event()
*
* Description: Enable software timer interrupt in delay ms.
* Arguments:
* Returns:
******************************************************************************
*/
static int
sdla_te_add_event(sdla_fe_t *fe, sdla_fe_timer_event_t *fe_event)
{
sdla_t *card = (sdla_t*)fe->card;
sdla_fe_timer_event_t *new_fe_event = NULL;
wan_smp_flag_t smp_flags;
WAN_ASSERT(card == NULL);
WAN_ASSERT(fe_event == NULL);
DEBUG_TE1("%s: Add new TE1 Event=0x%X\n",
fe->name, fe_event->type);
/* Creating event timer */
new_fe_event = wan_malloc(sizeof(sdla_fe_timer_event_t));
if (new_fe_event == NULL){
DEBUG_EVENT(
"%s: Failed to allocate memory for timer event!\n",
fe->name);
return -EINVAL;
}
memcpy(new_fe_event, fe_event, sizeof(sdla_fe_timer_event_t));
wan_spin_lock_irq(&fe->lockirq,&smp_flags);
if (WAN_LIST_EMPTY(&fe->event)){
WAN_LIST_INSERT_HEAD(&fe->event, new_fe_event, next);
}else{
sdla_fe_timer_event_t *tmp;
WAN_LIST_FOREACH(tmp, &fe->event, next){
if (!WAN_LIST_NEXT(tmp, next)) break;
}
if (tmp == NULL){
DEBUG_ERROR("%s: Internal Error!!!\n", fe->name);
wan_spin_unlock_irq(&fe->lockirq,&smp_flags);
return -EINVAL;
}
WAN_LIST_INSERT_AFTER(tmp, new_fe_event, next);
}
wan_spin_unlock_irq(&fe->lockirq,&smp_flags);
return 0;
}
/*
******************************************************************************
* sdla_ds_te1_add_timer()
*
* Description: Enable software timer interrupt.
* Arguments: delay - (in Seconds!!)
* Returns:
******************************************************************************
*/
static int sdla_te_add_timer(sdla_fe_t* fe, unsigned long delay)
{
int err=0;
if (wan_test_bit(TE_TIMER_KILL,(void*)&fe->te_param.critical) ||
wan_test_bit(TE_TIMER_RUNNING,(void*)&fe->te_param.critical)) {
return 0;
}
err = wan_add_timer(&fe->timer, delay * HZ);
if (err){
/* Failed to add timer */
return -EINVAL;
}
wan_set_bit(TE_TIMER_RUNNING,(void*)&fe->te_param.critical);
return 0;
}
/*
******************************************************************************
* sdla_te_polling()
*
* Description:
* Arguments:
* Returns: 0 - no action is required
* 1 - schedule front-end timer
* <0 - error
******************************************************************************
*/
static int sdla_te_polling(sdla_fe_t* fe)
{
sdla_t *card = (sdla_t*)fe->card;
sdla_fe_timer_event_t *fe_event;
u_int8_t pending = 0;
wan_smp_flag_t smp_flags;
WAN_ASSERT_RC(fe->write_fe_reg == NULL, 0);
WAN_ASSERT_RC(fe->read_fe_reg == NULL, 0);
wan_spin_lock_irq(&fe->lockirq,&smp_flags);
if (WAN_LIST_EMPTY(&fe->event)){
wan_spin_unlock_irq(&fe->lockirq,&smp_flags);
DEBUG_EVENT("%s: WARNING: No FE events in a queue!\n",
fe->name);
sdla_te_add_timer(fe, POLLING_TE1_TIMER);
return 0;
}
fe_event = WAN_LIST_FIRST(&fe->event);
WAN_LIST_REMOVE(fe_event, next);
wan_spin_unlock_irq(&fe->lockirq,&smp_flags);
DEBUG_TE1("%s: %s Polling State=%s Cmd=0x%X!\n",
fe->name, FE_MEDIA_DECODE(fe),
fe->fe_status==FE_CONNECTED?"Con":"Disconn",
fe_event->type);
switch(fe_event->type){
case TE_LINELB_TIMER:
if (IS_T1_FEMEDIA(fe)){
sdla_te_txlbcode_done(fe);
}
break;
case TE_SET_INTR:
sdla_te_set_intr(fe);
break;
case TE_LINKDOWN_TIMER:
sdla_te_read_alarms(fe, WAN_FE_ALARM_READ|WAN_FE_ALARM_UPDATE);
sdla_te_pmon(fe, WAN_FE_PMON_UPDATE);
sdla_te_set_status(fe, fe->fe_alarm);
if (fe->fe_status == FE_CONNECTED){
fe_event->type = TE_LINKUP_TIMER;
fe_event->delay = POLLING_TE1_TIMER;
pending = 1;
}else{
fe_event->type = TE_LINKDOWN_TIMER;
fe_event->delay = POLLING_TE1_TIMER;
pending = 1;
}
break;
case TE_LINKUP_TIMER:
/* ALEX:
** Do not update protocol front end state from TE_LINKDOWN_TIMER
** because it cause to stay longer in interrupt handler
** (critical for XILINX code) */
if (fe->fe_status == FE_CONNECTED){
if (card->wandev.te_link_state){
card->wandev.te_link_state(card);
}
/* AL: March 1, 2006: Enable FE INTR */
sdla_te_set_intr(fe);
}else{
fe_event->type = TE_LINKDOWN_TIMER;
fe_event->delay = POLLING_TE1_TIMER;
pending = 1;
}
break;
case TE_RBS_READ:
/* Physically read RBS status and print */
sdla_te_rbs_print(fe, 0);
break;
case TE_SET_RBS:
/* Set RBS bits */
sdla_te_set_rbsbits( fe,
fe_event->te_event.rbs_channel,
fe_event->te_event.rbs_abcd);
break;
case TE_POLL_CONFIG:
DEBUG_EVENT("%s: Re-configuring %s Front-End chip...\n",
fe->name, FE_MEDIA_DECODE(fe));
if (sdla_te_chip_config(fe)){
DEBUG_EVENT("%s: Failed to re-configuring Front-End chip!\n",
fe->name);
break;
}
fe_event->type = TE_LINKDOWN_TIMER;
fe_event->delay = POLLING_TE1_TIMER;
pending = 1;
break;
case TE_POLL_READ:
fe->te_param.reg_dbg_value = READ_REG(fe_event->te_event.reg);
DEBUG_TE1("%s: Read %s Front-End Reg:%04X=%02X\n",
fe->name, FE_MEDIA_DECODE(fe),
fe_event->te_event.reg,
fe->te_param.reg_dbg_value);
fe->te_param.reg_dbg_ready = 1;
break;
case TE_POLL_WRITE:
DEBUG_TE1("%s: Write %s Front-End Reg:%04X=%02X\n",
fe->name, FE_MEDIA_DECODE(fe),
fe_event->te_event.reg,
fe_event->te_event.value);
WRITE_REG(fe_event->te_event.reg, fe_event->te_event.value);
break;
}
/* Add new event */
if (pending){
sdla_te_add_event(fe, fe_event);
}
wan_clear_bit(TE_TIMER_EVENT_PENDING,(void*)&fe->te_param.critical);
if (fe_event) wan_free(fe_event);
/* Add fe timer */
fe_event = WAN_LIST_FIRST(&fe->event);
if (fe_event){
sdla_te_add_timer(fe, fe_event->delay);
}else{
sdla_te_add_timer(fe, POLLING_TE1_TIMER);
}
return 0;
}
/******************************************************************************
* sdla_te_txlbcode_done()
*
* Description:
* Arguments:
* Returns:
******************************************************************************/
static int sdla_te_txlbcode_done(sdla_fe_t *fe)
{
if (WAN_FE_FRAME(fe) != WAN_FR_ESF){
return -EINVAL;
}
WRITE_REG(REG_T1_XBOC_CODE, BITS_T1_XBOC_DISABLE);
DEBUG_EVENT("%s: T1 loopback %s %s code sent.\n",
fe->name,
WAN_TE1_LB_ACTION_DECODE(fe->te_param.lb_tx_cmd),
WAN_TE1_LB_MODE_DECODE(fe->te_param.lb_tx_mode));
wan_clear_bit(LINELB_WAITING,(void*)&fe->te_param.critical);
fe->te_param.lb_tx_cmd = 0x00;
return 0;
}
/*
******************************************************************************
* sdla_te_tx_lb()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int sdla_te_tx_lb(sdla_fe_t* fe, u_int8_t mode, u_int8_t cmd)
{
sdla_fe_timer_event_t fe_event;
int delay;
WAN_ASSERT(fe->write_fe_reg == NULL);
WAN_ASSERT(fe->read_fe_reg == NULL);
if (!IS_T1_FEMEDIA(fe)){
return -EINVAL;
}
if (fe->fe_status != FE_CONNECTED){
return -EINVAL;
}
if (WAN_FE_FRAME(fe) != WAN_FR_ESF){
DEBUG_ERROR("%s: ERROR: TX loopback code is available only for T1 ESF mode!\n",
fe->name);
return -EINVAL;
}
if (wan_test_bit(LINELB_WAITING,(void*)&fe->te_param.critical)){
DEBUG_TE1("%s: Still waiting for far end to send loopback signal back!\n",
fe->name);
}
fe->te_param.lb_tx_mode = mode;
fe->te_param.lb_tx_cmd = cmd;
if (mode == WAN_TE1_TX_LINELB_MODE){
if (cmd == WAN_TE1_LB_ENABLE){
fe->te_param.lb_tx_code = LINELB_ACTIVATE_CODE;
}else{
fe->te_param.lb_tx_code = LINELB_DEACTIVATE_CODE;
}
}else if (mode == WAN_TE1_TX_PAYLB_MODE){
if (cmd == WAN_TE1_LB_ENABLE){
fe->te_param.lb_tx_code = PAYLB_ACTIVATE_CODE;
}else{
fe->te_param.lb_tx_code = PAYLB_DEACTIVATE_CODE;
}
}
DEBUG_TE1("%s: Sending %s %s loopback code...\n",
fe->name,
FE_MEDIA_DECODE(fe),
WAN_TE1_BOC_LB_CODE_DECODE(fe->te_param.lb_tx_code));
WRITE_REG(REG_T1_XBOC_CODE,fe->te_param.lb_tx_code);
delay = (WAN_T1_FDL_MSG_TIME * (WAN_T1_ESF_LINELB_TX_CNT + 1)) / 1000;
wan_set_bit(LINELB_WAITING,(void*)&fe->te_param.critical);
wan_set_bit(LINELB_CODE_BIT,(void*)&fe->te_param.critical);
wan_set_bit(LINELB_CHANNEL_BIT,(void*)&fe->te_param.critical);
fe_event.type = TE_LINELB_TIMER;
fe_event.delay = delay + 1;
sdla_te_add_event(fe, &fe_event);
return 0;
}
/******************************************************************************
* sdla_te_udp_lbmode()
*
* Description:
* Arguments:
* Returns:
******************************************************************************/
static int sdla_te_udp_lbmode(sdla_fe_t *fe, unsigned char* data)
{
sdla_fe_lbmode_t *lbmode = (sdla_fe_lbmode_t*)data;
if (lbmode->cmd == WAN_FE_LBMODE_CMD_SET){
sdla_te_set_lbmode(fe, lbmode->type, lbmode->mode, ENABLE_ALL_CHANNELS);
}else if (lbmode->cmd == WAN_FE_LBMODE_CMD_GET){
lbmode->type_map = sdla_te_get_lbmode(fe);
}
return 0;
}
/*
******************************************************************************
* sdla_te_udp()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int sdla_te_udp(sdla_fe_t *fe, void* p_udp_cmd, unsigned char* data)
{
wan_cmd_t *udp_cmd = (wan_cmd_t*)p_udp_cmd;
wan_femedia_t *fe_media;
sdla_fe_debug_t *fe_debug;
sdla_fe_timer_event_t fe_event;
switch(udp_cmd->wan_cmd_command){
case WAN_GET_MEDIA_TYPE:
fe_media = (wan_femedia_t*)data;
memset(fe_media, 0, sizeof(wan_femedia_t));
fe_media->media = fe->fe_cfg.media;
fe_media->sub_media = fe->fe_cfg.sub_media;
fe_media->chip_id = WAN_TE_CHIP_PMC;
fe_media->max_ports = fe->fe_max_ports;
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
udp_cmd->wan_cmd_data_len = sizeof(wan_femedia_t);
break;
case WAN_FE_LB_MODE:
/* Activate/Deactivate Line Loopback modes */
sdla_te_udp_lbmode(fe, data);
udp_cmd->wan_cmd_data_len = sizeof(sdla_fe_lbmode_t);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
break;
case WAN_FE_GET_STAT:
/* TE1_56K Read T1/E1/56K alarms */
#if 0
*(unsigned long *)&data[0] = fe->fe_alarm;
#endif
sdla_te_pmon(fe, WAN_FE_PMON_READ);
memcpy(&data[0], &fe->fe_stats, sizeof(sdla_fe_stats_t));
if (udp_cmd->wan_cmd_fe_force){
sdla_fe_stats_t *fe_stats = (sdla_fe_stats_t*)&data[0];
/* force to read FE alarms */
DEBUG_EVENT("%s: Force to read Front-End alarms\n",
fe->name);
fe_stats->alarms =
sdla_te_read_alarms(fe, WAN_FE_ALARM_READ);
}
/* TE1 Update T1/E1 perfomance counters */
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
udp_cmd->wan_cmd_data_len = sizeof(sdla_fe_stats_t);
break;
case WAN_FE_FLUSH_PMON:
/* TE1 Flush T1/E1 pmon counters */
sdla_te_flush_pmon(fe);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
break;
case WAN_FE_GET_CFG:
/* Read T1/E1 configuration */
memcpy(&data[0],
&fe->fe_cfg,
sizeof(sdla_fe_cfg_t));
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
udp_cmd->wan_cmd_data_len = sizeof(sdla_fe_cfg_t);
break;
case WAN_FE_SET_DEBUG_MODE:
fe_debug = (sdla_fe_debug_t*)&data[0];
switch(fe_debug->type){
case WAN_FE_DEBUG_RBS:
if (fe_debug->mode == WAN_FE_DEBUG_RBS_READ){
DEBUG_EVENT("%s: Reading RBS status!\n",
fe->name);
fe_event.type = TE_RBS_READ;
fe_event.delay = POLLING_TE1_TIMER;
sdla_te_add_event(fe, &fe_event);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
}else if (fe_debug->mode == WAN_FE_DEBUG_RBS_PRINT){
sdla_te_rbs_print(fe, 1);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
}else if (fe_debug->mode == WAN_FE_DEBUG_RBS_RX_ENABLE){
/* Enable extra debugging */
DEBUG_EVENT("%s: Enable RBS RX DEBUG mode!\n",
fe->name);
fe->fe_debug |= WAN_FE_DEBUG_RBS_RX_ENABLE;
sdla_te_rbs_print(fe, 1);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
}else if (fe_debug->mode == WAN_FE_DEBUG_RBS_TX_ENABLE){
/* Enable extra debugging */
DEBUG_EVENT("%s: Enable RBS TX DEBUG mode!\n",
fe->name);
fe->fe_debug |= WAN_FE_DEBUG_RBS_TX_ENABLE;
sdla_te_rbs_print(fe, 1);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
}else if (fe_debug->mode == WAN_FE_DEBUG_RBS_RX_DISABLE){
/* Disable extra debugging */
DEBUG_EVENT("%s: Disable RBS RX DEBUG mode!\n",
fe->name);
fe->fe_debug &= ~WAN_FE_DEBUG_RBS_RX_ENABLE;
sdla_te_rbs_print(fe, 1);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
}else if (fe_debug->mode == WAN_FE_DEBUG_RBS_TX_DISABLE){
/* Disable extra debugging */
DEBUG_EVENT("%s: Disable RBS TX DEBUG mode!\n",
fe->name);
fe->fe_debug &= ~WAN_FE_DEBUG_RBS_TX_ENABLE;
sdla_te_rbs_print(fe, 1);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
}else if (fe_debug->mode == WAN_FE_DEBUG_RBS_SET){
/* Set RBS bits */
if (IS_T1_FEMEDIA(fe)){
if (fe_debug->fe_debug_rbs.channel < 1 ||
fe_debug->fe_debug_rbs.channel > 24){
DEBUG_EVENT(
"%s: Invalid channel number %d\n",
fe->name,
fe_debug->fe_debug_rbs.channel);
break;
}
}else{
if (fe_debug->fe_debug_rbs.channel < 0 ||
fe_debug->fe_debug_rbs.channel > 31){
DEBUG_EVENT(
"%s: Invalid channel number %d\n",
fe->name,
fe_debug->fe_debug_rbs.channel);
break;
}
}
fe_event.type = TE_SET_RBS;
fe_event.delay = POLLING_TE1_TIMER;
fe_event.te_event.rbs_channel = fe_debug->fe_debug_rbs.channel;
fe_event.te_event.rbs_abcd = fe_debug->fe_debug_rbs.abcd;
sdla_te_add_event(fe, &fe_event);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
}
break;
case WAN_FE_DEBUG_ALARM:
if (fe_debug->mode == WAN_FE_DEBUG_ALARM_AIS_ENABLE){
/* Enable TX AIS alarm */
DEBUG_EVENT("%s: Enable TX AIS alarm!\n",
fe->name);
WRITE_REG(REG_E1_TRAN_TX_ALARM_CTRL,
READ_REG(REG_E1_TRAN_TX_ALARM_CTRL) |
BIT_E1_TRAN_TX_ALARM_AIS);
WRITE_REG(REG_TX_LINE_CONF,
READ_REG(REG_TX_LINE_CONF) |
BIT_TX_LINE_CONF_TAISEN);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
}else if (fe_debug->mode == WAN_FE_DEBUG_ALARM_AIS_DISABLE){
/* Disable TX AIS alarm */
DEBUG_EVENT("%s: Disable TX AIS alarm!\n",
fe->name);
WRITE_REG(REG_E1_TRAN_TX_ALARM_CTRL,
READ_REG(REG_E1_TRAN_TX_ALARM_CTRL) &
~BIT_E1_TRAN_TX_ALARM_AIS);
WRITE_REG(REG_TX_LINE_CONF,
READ_REG(REG_TX_LINE_CONF) &
~BIT_TX_LINE_CONF_TAISEN);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
}
break;
case WAN_FE_DEBUG_RECONFIG:
fe_event.type = TE_POLL_CONFIG;
fe_event.delay = POLLING_TE1_TIMER;
sdla_te_add_event(fe, &fe_event);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
break;
case WAN_FE_DEBUG_REG:
if (fe->te_param.reg_dbg_busy){
if (fe_debug->fe_debug_reg.read == 2 && fe->te_param.reg_dbg_ready){
/* Poll the register value */
fe_debug->fe_debug_reg.value = fe->te_param.reg_dbg_value;
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
fe->te_param.reg_dbg_busy = 0;
}
break;
}
fe_event.type = (fe_debug->fe_debug_reg.read) ?
TE_POLL_READ : TE_POLL_WRITE;
fe_event.te_event.reg = (u_int16_t)fe_debug->fe_debug_reg.reg;
fe_event.te_event.value = fe_debug->fe_debug_reg.value;
fe_event.delay = POLLING_TE1_TIMER;
if (fe_debug->fe_debug_reg.read){
fe->te_param.reg_dbg_busy = 1;
fe->te_param.reg_dbg_ready = 0;
}
sdla_te_add_event(fe, &fe_event);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
break;
default:
udp_cmd->wan_cmd_return_code = WAN_UDP_INVALID_CMD;
break;
}
udp_cmd->wan_cmd_data_len = 0;
break;
case WAN_FE_TX_MODE:
fe_debug = (sdla_fe_debug_t*)&data[0];
switch(fe_debug->mode){
case WAN_FE_TXMODE_ENABLE:
DEBUG_EVENT("%s: Enable Transmitter!\n",
fe->name);
WRITE_REG(REG_XLPG_LINE_CFG, fe->te_param.xlpg_scale);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
break;
case WAN_FE_TXMODE_DISABLE:
DEBUG_EVENT("%s: Disable Transmitter (tx tri-state mode)!\n",
fe->name);
WRITE_REG(REG_XLPG_LINE_CFG, BIT_XLPG_LINE_CFG_HIGHZ);
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
break;
}
break;
default:
udp_cmd->wan_cmd_return_code = WAN_UDP_INVALID_CMD;
udp_cmd->wan_cmd_data_len = 0;
break;
}
return 0;
}
/*
******************************************************************************
* sdla_te_set_RBS()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int
sdla_te_set_rbsbits(sdla_fe_t *fe, int channel, unsigned char status)
{
sdla_t* card = (sdla_t*)fe->card;
unsigned char rbsbits = 0x00;
if ((unsigned int)channel > fe->te_param.max_channels){
DEBUG_EVENT("%s: Invalid channel number %d\n",
fe->name, channel);
return -EINVAL;
}
if (status & WAN_RBS_SIG_A) rbsbits |= BIT_TPSC_SIGBYTE_A;
if (status & WAN_RBS_SIG_B) rbsbits |= BIT_TPSC_SIGBYTE_B;
if (IS_T1_FEMEDIA(fe) && WAN_FE_FRAME(fe) == WAN_FR_D4){
if (status & WAN_RBS_SIG_A) rbsbits |= BIT_TPSC_SIGBYTE_C;
if (status & WAN_RBS_SIG_B) rbsbits |= BIT_TPSC_SIGBYTE_D;
}else{
if (status & WAN_RBS_SIG_C) rbsbits |= BIT_TPSC_SIGBYTE_C;
if (status & WAN_RBS_SIG_D) rbsbits |= BIT_TPSC_SIGBYTE_D;
}
if (fe->fe_debug & WAN_FE_DEBUG_RBS_TX_ENABLE){
DEBUG_EVENT("%s: %s:%-3d TX RBS A:%1d B:%1d C:%1d D:%1d\n",
fe->name,
FE_MEDIA_DECODE(fe),
channel,
(rbsbits & BIT_TPSC_SIGBYTE_A) ? 1 : 0,
(rbsbits & BIT_TPSC_SIGBYTE_B) ? 1 : 0,
(rbsbits & BIT_TPSC_SIGBYTE_C) ? 1 : 0,
(rbsbits & BIT_TPSC_SIGBYTE_D) ? 1 : 0);
}
if (rbsbits & BIT_TPSC_SIGBYTE_A){
wan_set_bit(channel,(unsigned long*)&fe->te_param.tx_rbs_A);
}else{
wan_clear_bit(channel,(unsigned long*)&fe->te_param.tx_rbs_A);
}
if (rbsbits & BIT_TPSC_SIGBYTE_B){
wan_set_bit(channel,(unsigned long*)&fe->te_param.tx_rbs_B);
}else{
wan_clear_bit(channel,(unsigned long*)&fe->te_param.tx_rbs_B);
}
if (rbsbits & BIT_TPSC_SIGBYTE_C){
wan_set_bit(channel,(unsigned long*)&fe->te_param.tx_rbs_C);
}else{
wan_clear_bit(channel,(unsigned long*)&fe->te_param.tx_rbs_C);
}
if (rbsbits & BIT_TPSC_SIGBYTE_D){
wan_set_bit(channel,(unsigned long*)&fe->te_param.tx_rbs_D);
}else{
wan_clear_bit(channel,(unsigned long*)&fe->te_param.tx_rbs_D);
}
if (fe->te_param.ptr_te_Tx_sig_off){
unsigned char tx_sig = TE_SET_TX_SIG_BITS | rbsbits;
card->hw_iface.poke(
card->hw,
fe->te_param.ptr_te_Tx_sig_off + channel - 1,
&tx_sig,
sizeof(tx_sig));
}else{
if (IS_T1_FEMEDIA(fe)){
WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel,
(rbsbits |
BIT_TPSC_SIGBYTE_SIGC_0 |
BIT_TPSC_SIGBYTE_SIGC_1));
}else{
WRITE_TPSC_REG(REG_TPSC_SIGNALING_BYTE, channel,
(rbsbits |
BIT_TPSC_SIGBYTE_SIGSRC));
}
}
return 0;
}
#if 0
static void sdla_te_abcd_update(sdla_fe_t* fe)
{
unsigned char sigx_cfg;
sigx_cfg = READ_REG(REG_SIGX_CFG);
WRITE_REG(REG_SIGX_CFG, READ_REG(REG_SIGX_CFG) | BIT_SIGX_COSS);
fe->te_param.SIGX_chg_30_25 =
READ_REG(REG_SIGX_CFG) & MASK_SIGX_COSS_30_25;
fe->te_param.SIGX_chg_24_17 =
READ_REG(REG_SIGX_TIMESLOT_IND_STATUS);
fe->te_param.SIGX_chg_16_9 =
READ_REG(REG_SIGX_TIMESLOT_IND_ACCESS);
fe->te_param.SIGX_chg_8_1 =
READ_REG(REG_SIGX_TIMESLOT_IND_DATA_BUFFER);
WRITE_REG(REG_SIGX_CFG, sigx_cfg);
if ((IS_E1_FEMEDIA(fe) &&
fe->te_param.SIGX_chg_30_25) ||
fe->te_param.SIGX_chg_24_17 ||
fe->te_param.SIGX_chg_16_9 ||
fe->te_param.SIGX_chg_8_1){
sdla_te_enable_timer(fe, TE_ABCD_UPDATE, 10);
}
return;
}
#endif
/*
******************************************************************************
* sdla_te_rbs_update()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int
sdla_te_rbs_update(sdla_fe_t* fe, int channo, unsigned char status)
{
if (fe->fe_debug & WAN_FE_DEBUG_RBS_RX_ENABLE &&
fe->te_param.rx_rbs[channo] != status){
DEBUG_EVENT(
"%s: %s:%-3d RX RBS A:%1d B:%1d C:%1d D:%1d\n",
fe->name,
FE_MEDIA_DECODE(fe),
channo,
(status & WAN_RBS_SIG_A) ? 1 : 0,
(status & WAN_RBS_SIG_B) ? 1 : 0,
(status & WAN_RBS_SIG_C) ? 1 : 0,
(status & WAN_RBS_SIG_D) ? 1 : 0);
}
/* Update rbs value in private structures */
wan_set_bit(channo, &fe->te_param.rx_rbs_status);
fe->te_param.rx_rbs[channo] = status;
if (status & WAN_RBS_SIG_A){
wan_set_bit(channo,
(unsigned long*)&fe->te_param.rx_rbs_A);
}else{
wan_clear_bit(channo,
(unsigned long*)&fe->te_param.rx_rbs_A);
}
if (status & WAN_RBS_SIG_B){
wan_set_bit(channo,
(unsigned long*)&fe->te_param.rx_rbs_B);
}else{
wan_clear_bit(channo,
(unsigned long*)&fe->te_param.rx_rbs_B);
}
if (status & WAN_RBS_SIG_C){
wan_set_bit(channo,
(unsigned long*)&fe->te_param.rx_rbs_C);
}else{
wan_clear_bit(channo,
(unsigned long*)&fe->te_param.rx_rbs_C);
}
if (status & WAN_RBS_SIG_D){
wan_set_bit(channo,
(unsigned long*)&fe->te_param.rx_rbs_D);
}else{
wan_clear_bit(channo,
(unsigned long*)&fe->te_param.rx_rbs_D);
}
return 0;
}
/*
******************************************************************************
* sdla_te_rbs_report()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int
sdla_te_rbs_report(sdla_fe_t* fe)
{
sdla_t* card = (sdla_t*)fe->card;
int ch = 1, max_channels;
max_channels = fe->te_param.max_channels;
ch = (IS_E1_FEMEDIA(fe)) ? 0 : 1;
for(; ch <= max_channels; ch++) {
if (wan_test_bit(ch, &fe->te_param.rx_rbs_status)){
if (card->wandev.te_report_rbsbits){
card->wandev.te_report_rbsbits(
card,
ch,
fe->te_param.rx_rbs[ch]);
}
wan_clear_bit(ch, &fe->te_param.rx_rbs_status);
}
}
return 0;
}
/*
******************************************************************************
* sdla_te_check_rbsbits()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int
sdla_te_check_rbsbits(sdla_fe_t* fe, int ch_base, unsigned int ts_map, int report)
{
unsigned char status = 0x0, rbsbits = 0x00;
unsigned char sigx_cfg = 0x00;
int i = 0, channel;
sigx_cfg = READ_REG(REG_SIGX_CFG);
WRITE_REG(REG_SIGX_CFG, sigx_cfg | BIT_SIGX_COSS);
switch(ch_base){
case 1:
status = READ_REG(REG_SIGX_CHG_8_1);
break;
case 9:
status = READ_REG(REG_SIGX_CHG_16_9);
break;
case 17:
status = READ_REG(REG_SIGX_CHG_24_17);
break;
case 25:
status = READ_REG(REG_SIGX_CHG_30_25) & MASK_SIGX_COSS_30_25;
break;
}
WRITE_REG(REG_SIGX_CFG, sigx_cfg);
if (status == 0x00){
return 0;
}
for(i = 0; i < 8; i ++) {
channel = ch_base + i;
if (IS_E1_FEMEDIA(fe)){
if (channel >= 16){
channel++;
}
if (channel > 31){
continue;
}
}
/* If this channel/timeslot is not selected, move to
* another channel/timeslot */
if (!wan_test_bit(channel-1, &ts_map)){
continue;
}
if(status & ((unsigned char)(0x01 << i))) {
unsigned char abcd_status = 0x00;
rbsbits = READ_SIGX_REG(REG_SIGX_CURRENT, channel);
if (channel > 16){
rbsbits &= 0x0F;
}else{
rbsbits = (rbsbits >> 4) & 0x0F;
}
if (rbsbits & BIT_SIGX_A) abcd_status |= WAN_RBS_SIG_A;
if (rbsbits & BIT_SIGX_B) abcd_status |= WAN_RBS_SIG_B;
if (rbsbits & BIT_SIGX_C) abcd_status |= WAN_RBS_SIG_C;
if (rbsbits & BIT_SIGX_D) abcd_status |= WAN_RBS_SIG_D;
sdla_te_rbs_update(fe, channel, abcd_status);
}
}
return 0;
}
/*
******************************************************************************
* sdla_te_read_rbsbits()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static unsigned char
sdla_te_read_rbsbits(sdla_fe_t* fe, int channo, int mode)
{
sdla_t* card = (sdla_t*)fe->card;
unsigned char rbsbits = 0x00, status = 0x00;
rbsbits = READ_SIGX_REG(REG_SIGX_CURRENT, channo);
if (channo <= 16){
rbsbits = (rbsbits >> 4) & 0x0F;
}else{
rbsbits &= 0xF;
}
if (rbsbits & BIT_SIGX_A) status |= WAN_RBS_SIG_A;
if (rbsbits & BIT_SIGX_B) status |= WAN_RBS_SIG_B;
if (rbsbits & BIT_SIGX_C) status |= WAN_RBS_SIG_C;
if (rbsbits & BIT_SIGX_D) status |= WAN_RBS_SIG_D;
if (mode & WAN_TE_RBS_UPDATE){
sdla_te_rbs_update(fe, channo, status);
}
if ((mode & WAN_TE_RBS_REPORT) && card->wandev.te_report_rbsbits){
card->wandev.te_report_rbsbits(
card,
channo,
status);
}
return status;
}
/*
******************************************************************************
* sdla_te_rbs_print_banner()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int
sdla_te_rbs_print_banner(sdla_fe_t* fe)
{
if (IS_T1_FEMEDIA(fe)){
DEBUG_EVENT("%s: 111111111122222\n",
fe->name);
DEBUG_EVENT("%s: 123456789012345678901234\n",
fe->name);
DEBUG_EVENT("%s: ------------------------\n",
fe->name);
}else{
DEBUG_EVENT("%s: 11111111112222222222333\n",
fe->name);
DEBUG_EVENT("%s: 12345678901234567890123456789012\n",
fe->name);
DEBUG_EVENT("%s: --------------------------------\n",
fe->name);
}
return 0;
}
/*
******************************************************************************
* sdla_te_rbs_print_bits()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int
sdla_te_rbs_print_bits(sdla_fe_t* fe, unsigned long bits, char *msg)
{
int i, max_channels = fe->te_param.max_channels;
int start_chan = 1;
if (IS_E1_FEMEDIA(fe)){
start_chan = 0;
}
_DEBUG_EVENT("%s: %s ", fe->name, msg);
for(i=start_chan; i <= max_channels; i++)
_DEBUG_EVENT("%01d",
wan_test_bit(i, &bits) ? 1 : 0);
_DEBUG_EVENT("\n");
return 0;
}
/*
******************************************************************************
* sdla_te_rbs_print()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
static int
sdla_te_rbs_print(sdla_fe_t* fe, int last_status)
{
unsigned long rx_a = 0x00;
unsigned long rx_b = 0x00;
unsigned long rx_c = 0x00;
unsigned long rx_d = 0x00;
if (last_status){
rx_a = fe->te_param.rx_rbs_A;
rx_b = fe->te_param.rx_rbs_B;
rx_c = fe->te_param.rx_rbs_C;
rx_d = fe->te_param.rx_rbs_D;
DEBUG_EVENT("%s: Last Status:\n",
fe->name);
sdla_te_rbs_print_banner(fe);
sdla_te_rbs_print_bits(fe, fe->te_param.tx_rbs_A, "TX A:");
sdla_te_rbs_print_bits(fe, fe->te_param.tx_rbs_B, "TX B:");
sdla_te_rbs_print_bits(fe, fe->te_param.tx_rbs_C, "TX C:");
sdla_te_rbs_print_bits(fe, fe->te_param.tx_rbs_D, "TX D:");
DEBUG_EVENT("%s:\n", fe->name);
}else{
unsigned int i, channo = 0;
unsigned char rbsbits = 0x00;
for(i = 0; i < fe->te_param.max_channels; i++) {
channo = (IS_T1_FEMEDIA(fe)) ? i+1 : i;
rbsbits = READ_SIGX_REG(REG_SIGX_CURRENT, channo);
DEBUG_TE1("%s: Update status for ch %d\n",
fe->name,
channo);
if (rbsbits & BIT_SIGX_CURRENT_A_N){
wan_set_bit(channo, &rx_a);
}
if (rbsbits & BIT_SIGX_CURRENT_B_N){
wan_set_bit(channo, &rx_b);
}
if (rbsbits & BIT_SIGX_CURRENT_C_N){
wan_set_bit(channo, &rx_c);
}
if (rbsbits & BIT_SIGX_CURRENT_D_N){
wan_set_bit(channo, &rx_d);
}
if ((IS_E1_FEMEDIA(fe) && (channo < 16)) ||
(IS_T1_FEMEDIA(fe) && (channo <= 8))){
DEBUG_TE1("%s: Update status for ch %d\n",
fe->name, channo+16);
if (rbsbits & BIT_SIGX_CURRENT_A_N16){
wan_set_bit(channo+16, &rx_a);
}
if (rbsbits & BIT_SIGX_CURRENT_B_N16){
wan_set_bit(channo+16, &rx_b);
}
if (rbsbits & BIT_SIGX_CURRENT_C_N16){
wan_set_bit(channo+16, &rx_c);
}
if (rbsbits & BIT_SIGX_CURRENT_D_N16){
wan_set_bit(channo+16, &rx_d);
}
}
if (i >= 15){
break;
}
}
DEBUG_EVENT("%s: Current Status:\n",
fe->name);
sdla_te_rbs_print_banner(fe);
}
sdla_te_rbs_print_bits(fe, rx_a, "RX A:");
sdla_te_rbs_print_bits(fe, rx_b, "RX B:");
sdla_te_rbs_print_bits(fe, rx_c, "RX C:");
sdla_te_rbs_print_bits(fe, rx_d, "RX D:");
return 0;
}
#if 0
static int
sdla_te_check_rbsbits(sdla_fe_t* fe, unsigned char sig_chg, int channel_base, int report)
{
sdla_t* card = (sdla_t*)fe->card;
int SIGX_addr = 0;
unsigned char status = 0x0;
int i = 0;
if (fe->fe_status == FE_CONNECTED){
#if 0
DEBUG_EVENT("Read RBS: sig_chg: 0x%02X, ch base: %d\n",
sig_chg, channel_base);
#endif
}
if (IS_T1_FEMEDIA(fe)){
SIGX_addr = (channel_base == 9) ? 0x18 : 0x10;
}
for(i = 0; i < 8; i ++) {
if(sig_chg & ((unsigned char)(0x01 << i))) {
status = READ_SIGX_REG(SIGX_addr, i+1);
if (fe->fe_status != FE_CONNECTED){
return -EINVAL;
}
#if 0
DEBUG_EVENT("%s: SIGX bit %d set, value 0x%02X read from reg 0x%02X\n",
fe->name, i, status, SIGX_addr + i);
#endif
if (channel_base == 17){
status &= 0x0F;
}else{
status = (status >> 4) & 0x0F;
}
DEBUG_TE1("%s: %s:%d RX RBS A:%1d B:%1d C:%1d D:%1d\n",
fe->name,
FE_MEDIA_DECODE(fe),
channel_base + i,
(status & BIT_SIGX_A) ? 1 : 0,
(status & BIT_SIGX_B) ? 1 : 0,
(status & BIT_SIGX_C) ? 1 : 0,
(status & BIT_SIGX_D) ? 1 : 0);
if (report && card->wandev.te_report_rbsbits){
card->wandev.te_report_rbsbits(
card,
channel_base+i,
status);
}
}
}
return 0;
}
#endif
#if !defined(CONFIG_PRODUCT_WANPIPE_GENERIC)
/*
******************************************************************************
* sdla_te_get_snmp_data()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
#define DSX1IFINDEX 4
#define DSX1TIMEELAPSED 5
#define DSX1VALIDINTERVALS 6
#define DSX1LINETYPE 7
#define DSX1LINECODING 8
#define DSX1SENDCODE 9
#define DSX1CIRCUITIDENTIFIER 10
#define DSX1LOOPBACKCONFIG 11
#define DSX1LINESTATUS 12
#define DSX1SIGNALMODE 13
#define DSX1TRANSMITCLOCKSOURCE 14
#define DSX1FDL 15
#define DSX1INVALIDINTERVALS 16
#define DSX1LINELENGTH 17
#define DSX1LINESTATUSLASTCHANGE 18
#define DSX1LINESTATUSCHANGETRAPENABLE 19
#define DSX1LOOPBACKSTATUS 20
#define DSX1DS1CHANNELNUMBER 21
#define DSX1CHANNELIZATION 22
#define DSX1CURRENTINDEX 25
#define DSX1CURRENTESS 26
#define DSX1CURRENTSESS 27
#define DSX1CURRENTSEFSS 28
#define DSX1CURRENTUASS 29
#define DSX1CURRENTCSSS 30
#define DSX1CURRENTPCVS 31
#define DSX1CURRENTLESS 32
#define DSX1CURRENTBESS 33
#define DSX1CURRENTDMS 34
#define DSX1CURRENTLCVS 35
#define DSX1INTERVALINDEX 38
#define DSX1INTERVALNUMBER 39
#define DSX1INTERVALESS 40
#define DSX1INTERVALSESS 41
#define DSX1INTERVALSEFSS 42
#define DSX1INTERVALUASS 43
#define DSX1INTERVALCSSS 44
#define DSX1INTERVALPCVS 45
#define DSX1INTERVALLESS 46
#define DSX1INTERVALBESS 47
#define DSX1INTERVALDMS 48
#define DSX1INTERVALLCVS 49
#define DSX1INTERVALVALIDDATA 50
#define DSX1TOTALINDEX 53
#define DSX1TOTALESS 54
#define DSX1TOTALSESS 55
#define DSX1TOTALSEFSS 56
#define DSX1TOTALUASS 57
#define DSX1TOTALCSSS 58
#define DSX1TOTALPCVS 59
#define DSX1TOTALLESS 60
#define DSX1TOTALBESS 61
#define DSX1TOTALDMS 62
#define DSX1TOTALLCVS 63
#define DSX1FARENDCURRENTINDEX 66
#define DSX1FARENDTIMEELAPSED 67
#define DSX1FARENDVALIDINTERVALS 68
#define DSX1FARENDCURRENTESS 69
#define DSX1FARENDCURRENTSESS 70
#define DSX1FARENDCURRENTSEFSS 71
#define DSX1FARENDCURRENTUASS 72
#define DSX1FARENDCURRENTCSSS 73
#define DSX1FARENDCURRENTLESS 74
#define DSX1FARENDCURRENTPCVS 75
#define DSX1FARENDCURRENTBESS 76
#define DSX1FARENDCURRENTDMS 77
#define DSX1FARENDINVALIDINTERVALS 78
#define DSX1FARENDINTERVALINDEX 81
#define DSX1FARENDINTERVALNUMBER 82
#define DSX1FARENDINTERVALESS 83
#define DSX1FARENDINTERVALSESS 84
#define DSX1FARENDINTERVALSEFSS 85
#define DSX1FARENDINTERVALUASS 86
#define DSX1FARENDINTERVALCSSS 87
#define DSX1FARENDINTERVALLESS 88
#define DSX1FARENDINTERVALPCVS 89
#define DSX1FARENDINTERVALBESS 90
#define DSX1FARENDINTERVALDMS 91
#define DSX1FARENDINTERVALVALIDDATA 92
#define DSX1FARENDTOTALINDEX 95
#define DSX1FARENDTOTALESS 96
#define DSX1FARENDTOTALSESS 97
#define DSX1FARENDTOTALSEFSS 98
#define DSX1FARENDTOTALUASS 99
#define DSX1FARENDTOTALCSSS 100
#define DSX1FARENDTOTALLESS 101
#define DSX1FARENDTOTALPCVS 102
#define DSX1FARENDTOTALBESS 103
#define DSX1FARENDTOTALDMS 104
#define DSX1FRACINDEX 107
#define DSX1FRACNUMBER 108
#define DSX1FRACIFINDEX 109
#define DSX1CHANMAPPEDIFINDEX 112
static int sdla_te_get_snmp_data(sdla_fe_t* fe, void* pdev, void* data)
{
#if 0
/* FIXME: NC dev not used
* ALEX please confirm
*/
netdevice_t* dev = (netdevice_t *)dev_ptr;
#endif
wanpipe_snmp_t* snmp;
sdla_te_pmon_t* pmon = &fe->fe_stats.te_pmon;
unsigned long alarms = 0;
snmp = (wanpipe_snmp_t*)data;
switch(snmp->snmp_magic){
case DSX1LINESTATUS:
alarms = fe->fe_alarm;
snmp->snmp_val = 0;
if (alarms & WAN_TE_BIT_ALARM_YEL){
snmp->snmp_val |= SNMP_DSX1_RCVFARENDLOF;
}
if (alarms & WAN_TE_BIT_ALARM_AIS){
snmp->snmp_val |= SNMP_DSX1_RCVAIS;
}
if (alarms & WAN_TE_BIT_ALARM_RED){
snmp->snmp_val |= SNMP_DSX1_LOSSOFFRAME;
}
if (alarms & WAN_TE_BIT_ALARM_LOS){
snmp->snmp_val |= SNMP_DSX1_LOSSOFSIGNAL;
}
if (!snmp->snmp_val){
snmp->snmp_val = SNMP_DSX1_NOALARM;
}
break;
case DSX1CURRENTLCVS:
case DSX1INTERVALLCVS:
case DSX1TOTALLCVS:
/* Current measurement in a current 15 minutes interval */
/* FIXME: Currently, I return total number of LCV */
snmp->snmp_val = pmon->lcv_errors;
break;
case DSX1CURRENTSEFSS:
case DSX1INTERVALSEFSS:
case DSX1TOTALSEFSS:
/* Second with one or more Out of Frame defects */
/* FIXME: If we got OOF errors, return 1 */
if (pmon->oof_errors){
snmp->snmp_val = 1;
}
break;
case DSX1CURRENTPCVS:
case DSX1INTERVALPCVS:
case DSX1TOTALPCVS:
/* Second with one or more CRC or bit errors defects */
/* FIXME: If we got OOF errors, return 1 */
if (IS_T1_FEMEDIA(fe) && pmon->oof_errors){
snmp->snmp_val = 1;
}else if (IS_E1_FEMEDIA(fe) && pmon->crc4_errors){
snmp->snmp_val = 1;
}
break;
break;
}
return 0;
}
#endif
static int sdla_te_led_ctrl(sdla_fe_t *fe, int mode)
{
unsigned char led;
if (!fe->read_fe_reg || !fe->write_fe_reg){
return -EINVAL;
}
led= READ_REG(REG_GLOBAL_CFG);
if (mode == AFT_LED_ON){
led&=~(BIT_GLOBAL_PIO);
}else if (mode == AFT_LED_OFF){
led|=BIT_GLOBAL_PIO;
}else{
if (led&BIT_GLOBAL_PIO){
led&=~(BIT_GLOBAL_PIO);
}else{
led|=BIT_GLOBAL_PIO;
}
}
WRITE_REG(REG_GLOBAL_CFG,led);
return 0;
}
static int
sdla_te_update_alarm_info(sdla_fe_t* fe, struct seq_file* m, int* stop_cnt)
{
#if !defined(__WINDOWS__)
PROC_ADD_LINE(m,
"=============================== %s Alarms ===============================\n",
FE_MEDIA_DECODE(fe));
PROC_ADD_LINE(m,
PROC_STATS_ALARM_FORMAT,
"ALOS", WAN_TE_PRN_ALARM_ALOS(fe->fe_alarm),
"LOS", WAN_TE_PRN_ALARM_LOS(fe->fe_alarm));
PROC_ADD_LINE(m,
PROC_STATS_ALARM_FORMAT,
"RED", WAN_TE_PRN_ALARM_RED(fe->fe_alarm),
"AIS", WAN_TE_PRN_ALARM_AIS(fe->fe_alarm));
if (IS_T1_FEMEDIA(fe)){
PROC_ADD_LINE(m,
PROC_STATS_ALARM_FORMAT,
"YEL", WAN_TE_PRN_ALARM_YEL(fe->fe_alarm),
"LOF", WAN_TE_PRN_ALARM_LOF(fe->fe_alarm));
}else{
PROC_ADD_LINE(m,
PROC_STATS_ALARM_FORMAT,
"LOF", WAN_TE_PRN_ALARM_LOF(fe->fe_alarm),
"", "");
}
return m->count;
#endif
return 0;
}
static int
sdla_te_update_pmon_info(sdla_fe_t* fe, struct seq_file* m, int* stop_cnt)
{
#if !defined(__WINDOWS__)
PROC_ADD_LINE(m,
"=========================== %s PMON counters ============================\n",
FE_MEDIA_DECODE(fe));
if (IS_T1_FEMEDIA(fe)){
PROC_ADD_LINE(m,
PROC_STATS_PMON_FORMAT,
"Framing Bit Error", fe->fe_stats.te_pmon.fer_errors,
"Line Code Violation", fe->fe_stats.te_pmon.lcv_errors);
PROC_ADD_LINE(m,
PROC_STATS_PMON_FORMAT,
"Out of Frame Errors", fe->fe_stats.te_pmon.oof_errors,
"Bit Errors", fe->fe_stats.te_pmon.bee_errors);
}else{
PROC_ADD_LINE(m,
PROC_STATS_PMON_FORMAT,
"Frame Alighment Signal", fe->fe_stats.te_pmon.fas_errors,
"Line Code Violation", fe->fe_stats.te_pmon.lcv_errors);
PROC_ADD_LINE(m,
PROC_STATS_PMON_FORMAT,
"CRC4 Errors", fe->fe_stats.te_pmon.crc4_errors,
"Far End Block Errors", fe->fe_stats.te_pmon.feb_errors);
}
return m->count;
#endif
return 0;
}
/*
******************************************************************************
* ClearTemplate()
*
* Description:
* Arguments:
* Returns:
******************************************************************************
*/
/************************** End of files *************************************/