#ifndef __XDSL_CTRL_H__
#define __XDSL_CTRL_H__

#include <linux/atm.h>
#include <linux/atmdev.h>
#include <linux/atmbr2684.h>
#include <linux/netdevice.h>
#include <linux/ppp_channel.h>

#include "xdsl_types.h"
#include "xdsl_ctrl_erb.h"

#define PTM_WANIF		"ptm0"

#if defined(CONFIG_XDSL_CTRL_ON_SOC)
#define ETH_WANIF		"eth0.2"
#else
#define ETH_WANIF		"eth0"
#endif

enum {
	XDSL_CMD,
	PTM_CMD,
};

// category
enum {
	CTRL_2DSL_SET,
	CTRL_2DSL_GET,
	CTRL_2SOC_RET,
	CTRL_2MASTER_SET,
	CTRL_2MASTER_GET,
	CTRL_2SLAVE_RET,
	CTRL_SLAVE_LINKCHANGE,
	CTRL_SLAVE_EXECEPTION,
	CTRL_MASTER_EXECEPTION,
};

// protocol
enum {
	XDSL_CMD_SET,
	XDSL_CMD_GET,
	XDSL_CMD_DATA,
	XDSL_CMD_DATA_EOF,
	XDSL_ERB_SET,
	PTM_CMD_SET,
	PTM_CMD_GET,
	PTM_CMD_DATA,
	SLAVE_XDSL_UP,
	SLAVE_XDSL_DOWN,
	SLAVE_RX_FIFO_FULL,
	SLAVE_RX_FIFO_CHECK,
	SLAVE_TPSTC_RX_POLLING
};

#define DSL_MAX_BUF_SIZE	4096
#define DSL_CMD_POOL_SIZE	32
#define DSL_ARG_MAX_SIZE	256
#define DSL_RXBUF_MAX_SIZE	4000


typedef struct {
	uint8   devnum;
	uint8	category;
	uint8	protocol;
	uint32	command;
	uint32	argsize;
	uint32  msg;
	uint8	arg[ DSL_ARG_MAX_SIZE ];
	int32   ret;
	uint8	rxbuf[ DSL_RXBUF_MAX_SIZE ];
	uint8   reserved[1];
} ctrl_pkt_t;

typedef struct CMD_TYPE {
  int cmdId;
  int setFlag;  //1: data get	2: command setting
} cmd_t;


typedef struct {
	unsigned char cmd;
	union{
		struct{
			unsigned int cmd2;
			unsigned int cmd3;
			unsigned int cmd4;
		};
		struct{
			unsigned short a1;
			unsigned short a2;
			unsigned char a3[8];
		};
		unsigned char arg[12];
	};
} ptm_arg;


typedef struct XDSL_ARG {
	int argsize;
	int arg;
} xdsl_arg;

typedef struct MSGTODSL {
	int msg;
	int* intVal;
} msgtodsl;

typedef struct DEF_MSGTODSL {
	int message;
	int intVal[4];
} def_msgtodsl;

typedef struct XDSL_CMD {
	char devnum;
	char category;
	char protocol;
	unsigned int cmdId;
	unsigned long argp;
	xdsl_arg argument;
	msgtodsl message;
	uint8 *buf;
} xdsl_cmd;

typedef struct XDSL_CMD_POOL {
	int start;
	int tail;
	int counter;
	xdsl_cmd  data[ DSL_CMD_POOL_SIZE ];
} xdsl_cmd_pool;


// ptm ioctl command called by protocols (system-independent)
#define PTM_MAGIC           					(('R'+'T'+'L'+'P'+'T'+'M') << 8)
#define PTM_SET_DEFAULT_TABLE   				(PTM_MAGIC+1)
#define PTM_GET_TABLE          					(PTM_MAGIC+2)
#define PTM_READ_DATA           				(PTM_MAGIC+3)
#define PTM_WRITE_DATA          				(PTM_MAGIC+4)
#define PTM_SET_HW              				(PTM_MAGIC+5)
#define PTM_GET_QMAP            				(PTM_MAGIC+6)
#define PTM_STOP_HW             				(PTM_MAGIC+7)
#define PTM_START_HW            				(PTM_MAGIC+8)
#define PTM_CLEAN_WANIF         				(PTM_MAGIC+9)
#define PTM_CLEAN_QMAP          				(PTM_MAGIC+10)
#define PTM_SET_WANIF           				(PTM_MAGIC+11)
#define PTM_SET_QMAP            				(PTM_MAGIC+12)
#define PTM_SET_STAGTYPE        				(PTM_MAGIC+13)
#define PTM_SET_DUMMYVID        				(PTM_MAGIC+14)
#define PTM_SET_QMAPATSTAG      				(PTM_MAGIC+15)
#define PTM_SET_MODE            				(PTM_MAGIC+16)
#define PTM_SET_SYSTEM          				(PTM_MAGIC+17)
#define PTM_ENABLE_TPSTC						(PTM_MAGIC+18)
#define PTM_DISABLE_TPSTC						(PTM_MAGIC+19)
#define PTM_RESET_TPSTC							(PTM_MAGIC+20)
#define PTM_GET_TPSTC_TX_CNT					(PTM_MAGIC+21)
#define PTM_GET_UTOPIA_TX_CNT					(PTM_MAGIC+22)


// xdsl ioctl command
#define RLCM_IOC_MAGIC							(('R'+'L'+'C'+'M'+'a'+'d'+'s'+'l') << 8)
#define ADSL_CMD_BASE							(RLCM_IOC_MAGIC + 0)
#define ADSL_CMD_END							(RLCM_IOC_MAGIC + 206)
#define VDSL_CMD_BASE							(RLCM_IOC_MAGIC + 111 + 1000)
#define VDSL_CMD_END							(RLCM_IOC_MAGIC + 145 + 1000)

// ioctl command called by protocols (system-independent)
#define RLCM_PHY_ENABLE_MODEM					(RLCM_IOC_MAGIC + 1)
#define RLCM_PHY_DISABLE_MODEM					(RLCM_IOC_MAGIC + 2)
#define RLCM_GET_DRIVER_VERSION					(RLCM_IOC_MAGIC + 3)
#define RLCM_GET_DRIVER_BUILD					(RLCM_IOC_MAGIC + 4)
#define RLCM_MODEM_RETRAIN						(RLCM_IOC_MAGIC + 5)
#define RLCM_GET_REHS_COUNT						(RLCM_IOC_MAGIC + 6)
#define RLCM_GET_CHANNEL_SNR					(RLCM_IOC_MAGIC + 7)
#define RLCM_GET_AVERAGE_SNR					(RLCM_IOC_MAGIC + 8)
#define RLCM_GET_SNR_MARGIN						(RLCM_IOC_MAGIC + 9)
#define RLCM_REPORT_MODEM_STATE					(RLCM_IOC_MAGIC +10)
#define RLCM_REPORT_PM_DATA						(RLCM_IOC_MAGIC +11)
#define RLCM_MODEM_NEAR_END_ID_REQ				(RLCM_IOC_MAGIC +12)
#define RLCM_MODEM_FAR_END_ID_REQ				(RLCM_IOC_MAGIC +13)
#define RLCM_MODEM_NEAR_END_LINE_DATA_REQ		(RLCM_IOC_MAGIC +14)
#define RLCM_MODEM_FAR_END_LINE_DATA_REQ		(RLCM_IOC_MAGIC +15)
#define RLCM_MODEM_NEAR_END_FAST_CH_DATA_REQ	(RLCM_IOC_MAGIC +16)
#define RLCM_MODEM_NEAR_END_INT_CH_DATA_REQ		(RLCM_IOC_MAGIC +17)
#define RLCM_MODEM_FAR_END_FAST_CH_DATA_REQ		(RLCM_IOC_MAGIC +18)
#define RLCM_MODEM_FAR_END_INT_CH_DATA_REQ		(RLCM_IOC_MAGIC +19)
#define RLCM_SET_ADSL_MODE						(RLCM_IOC_MAGIC +20)
#define RLCM_GET_ADSL_MODE						(RLCM_IOC_MAGIC +21)
#define RLCM_GET_LOSS_DATA						(RLCM_IOC_MAGIC +22)
#define RLCM_GET_LINK_SPEED						(RLCM_IOC_MAGIC +23)
#define RLCM_GET_CHANNEL_MODE					(RLCM_IOC_MAGIC +24)
#define RLCM_GET_LOOP_ATT						(RLCM_IOC_MAGIC +25)
#define RLCM_INC_TX_POWER						(RLCM_IOC_MAGIC +26)
#define RLCM_TUNE_PERF							(RLCM_IOC_MAGIC +27)
#define RLCM_ENABLE_BIT_SWAP					(RLCM_IOC_MAGIC +28)
#define RLCM_DISABLE_BIT_SWAP					(RLCM_IOC_MAGIC +29)
#define RLCM_ENABLE_PILOT_RELOCATION			(RLCM_IOC_MAGIC +30)
#define RLCM_DISABLE_PILOT_RELOCATION			(RLCM_IOC_MAGIC +31)
#define RLCM_ENABLE_TRELLIS						(RLCM_IOC_MAGIC +32)
#define RLCM_DISABLE_TRELLIS					(RLCM_IOC_MAGIC +33)
#define RLCM_SET_VENDOR_ID						(RLCM_IOC_MAGIC +34)
#define RLCM_MODEM_READ_CONFIG                  (RLCM_IOC_MAGIC +35)
#define RLCM_MODEM_WRITE_CONFIG                 (RLCM_IOC_MAGIC +36)
#define RLCM_DEBUG_MODE							(RLCM_IOC_MAGIC +37)
#define RLCM_TEST_PSD							(RLCM_IOC_MAGIC +38)
#define RLCM_GET_ADSL_TIME						(RLCM_IOC_MAGIC +39)
#define RLCM_PHY_START_MODEM					(RLCM_IOC_MAGIC +40)
#define RLCM_ENABLE_ADSL_LOG					(RLCM_IOC_MAGIC +41)
#define RLCM_DISABLE_ADSL_LOG					(RLCM_IOC_MAGIC +42)
//added command
#define RLCM_GET_VENDOR_ID						(RLCM_IOC_MAGIC +43)
#define RLCM_GET_TX_POWER						(RLCM_IOC_MAGIC +44)
#define RLCM_GET_PERF_VALUE						(RLCM_IOC_MAGIC +45)
#define RLCM_GET_15MIN_LOSS_DATA				(RLCM_IOC_MAGIC +46)
#define RLCM_GET_1DAY_LOSS_DATA					(RLCM_IOC_MAGIC +47)
#define RLCM_GET_CHANNEL_BITLOAD				(RLCM_IOC_MAGIC +48)
//for MIB TRAP set
#define RLCM_GET_TRAP_THRESHOLD					(RLCM_IOC_MAGIC +49)
#define RLCM_SET_TRAP_THRESHOLD					(RLCM_IOC_MAGIC +50)
#define RLCM_15MIN_WAIT_TRAP					(RLCM_IOC_MAGIC +51)
//for ATM test
#define RLCM_ENABLE_ATM_LOOPBACK				(RLCM_IOC_MAGIC +52)
#define RLCM_DISABLE_ATM_LOOPBACK				(RLCM_IOC_MAGIC +53)
#define RLCM_MSGMODE							(RLCM_IOC_MAGIC +54)
#define RLCM_CMD_API							(RLCM_IOC_MAGIC +55)
#define RLCM_GET_CURRENT_LOSS_DATA				(RLCM_IOC_MAGIC +56)
#define RLCM_GET_CHANNEL_BH						(RLCM_IOC_MAGIC +57)
#define RLCM_GET_TRAP_15MIN_LOSS_DATA			(RLCM_IOC_MAGIC +58)
#define RLCM_SEND_DYING_GASP					(RLCM_IOC_MAGIC +59)
#define RLCM_TEST_HW							(RLCM_IOC_MAGIC +62)
#define RLCM_SET_LOOPBACK						(RLCM_IOC_MAGIC +63)
#define RLCM_INIT_ADSL_MODE						(RLCM_IOC_MAGIC +64)
#define RLCM_ENABLE_POM_ACCESS					(RLCM_IOC_MAGIC +65)
#define RLCM_DISABLE_POM_ACCESS					(RLCM_IOC_MAGIC +66)
#define RLCM_MASK_TONE							(RLCM_IOC_MAGIC +67)
#define RLCM_GET_CAPABILITY						(RLCM_IOC_MAGIC +68)
#define RLCM_VERIFY_HW							(RLCM_IOC_MAGIC +69)
#define RLCM_TRIG_OLR_TYPE						(RLCM_IOC_MAGIC +70)
#define RLCM_TRIG_OLR_TYPE1						(RLCM_IOC_MAGIC +71)
#define RLCM_ENABLE_AEQ							(RLCM_IOC_MAGIC +72)
#define RLCM_ENABLE_HPF							(RLCM_IOC_MAGIC +73)
#define RLCM_SET_HPF_FC							(RLCM_IOC_MAGIC +74)

// new_hibrid
#define RLCM_SET_HYBRID							(RLCM_IOC_MAGIC +75)
#define RLCM_SET_RX_GAIN						(RLCM_IOC_MAGIC +76)
#define RLCM_SET_AFE_REG						(RLCM_IOC_MAGIC +77)
#define RLCM_SET_FOBASE							(RLCM_IOC_MAGIC +78)

//yaru + for webdata
#define RLCM_SET_XDSL_MODE						(RLCM_IOC_MAGIC +79)
#define RLCM_GET_SHOWTIME_XDSL_MODE				(RLCM_IOC_MAGIC +80)
#define RLCM_GET_XDSL_MODE						(RLCM_IOC_MAGIC +81)
#define RLCM_SET_OLR_TYPE						(RLCM_IOC_MAGIC +82)
#define RLCM_GET_OLR_TYPE						(RLCM_IOC_MAGIC +83)
#define RLCM_GET_LINE_RATE						(RLCM_IOC_MAGIC +84)
#define RLCM_GET_DS_ERROR_COUNT					(RLCM_IOC_MAGIC +85)
#define RLCM_GET_US_ERROR_COUNT					(RLCM_IOC_MAGIC +86)
#define RLCM_GET_DIAG_QLN						(RLCM_IOC_MAGIC +87)
#define RLCM_GET_DIAG_HLOG						(RLCM_IOC_MAGIC +88)
#define RLCM_GET_DIAG_SNR						(RLCM_IOC_MAGIC +89)
#define RLCM_GET_DS_PMS_PARAM1					(RLCM_IOC_MAGIC +90)
#define RLCM_GET_US_PMS_PARAM1					(RLCM_IOC_MAGIC +91)
#define RLCM_SET_ANNEX_L						(RLCM_IOC_MAGIC +92)
#define RLCM_GET_ANNEX_L						(RLCM_IOC_MAGIC +93)
#define RLCM_GET_LINK_POWER_STATE				(RLCM_IOC_MAGIC +94)
#define RLCM_GET_ATT_RATE						(RLCM_IOC_MAGIC +95)
#define RLCM_LOADCARRIERMASK					(RLCM_IOC_MAGIC +96)
#define RLCM_SET_ANNEX_M						(RLCM_IOC_MAGIC +97)
#define RLCM_GET_ANNEX_M						(RLCM_IOC_MAGIC +98)
#define RLCM_SET_8671_REV						(RLCM_IOC_MAGIC +99)
#define RLCM_GET_8671_REV						(RLCM_IOC_MAGIC +100)
#define RLCM_SET_HIGH_INP						(RLCM_IOC_MAGIC +101)
#define RLCM_GET_HIGH_INP						(RLCM_IOC_MAGIC +102)
#define RLCM_GET_LD_STATE						(RLCM_IOC_MAGIC +103)
#define RLCM_SET_ANNEX_B						(RLCM_IOC_MAGIC +104)
#define RLCM_GET_ANNEX_B						(RLCM_IOC_MAGIC +105)
//for TR069
#define RLCM_GET_DSL_STAT_SHOWTIME				(RLCM_IOC_MAGIC +106)
#define RLCM_GET_DSL_STAT_TOTAL					(RLCM_IOC_MAGIC +107)
#define RLCM_GET_DSL_PSD						(RLCM_IOC_MAGIC +108)
#define RLCM_GET_DSL_ORHERS						(RLCM_IOC_MAGIC +109)
#define RLCM_GET_DSL_GI							(RLCM_IOC_MAGIC +110)
// for Telefonica
#define RLCM_SET_ADSL_LAST_OPMode				(RLCM_IOC_MAGIC +111)
#define RLCM_SET_ADSL_PMS_CONFIG				(RLCM_IOC_MAGIC +112)
//Lupin, for TR069
#define RLCM_GET_ADSL2WAN_IFCFG					(RLCM_IOC_MAGIC +113)
#define RLCM_ENABLE_DIAGNOSTIC					(RLCM_IOC_MAGIC +114)

#ifdef FIELD_TRY_SAFE_MODE
#define RLCM_GET_SAFEMODE_CTRL					(RLCM_IOC_MAGIC +115)
#define RLCM_SET_SAFEMODE_CTRL					(RLCM_IOC_MAGIC +116)   
#endif

// Mason Yu. For CurrentDay and QuarterHour.
#define RLCM_GET_DSL_STAT_15MIN					(RLCM_IOC_MAGIC +117)
#define RLCM_GET_DSL_STAT_1DAY					(RLCM_IOC_MAGIC +118)
#define RLCM_WEB_SET_USPSD						(RLCM_IOC_MAGIC +154)
 
#define RLCM_GET_INIT_COUNT_LAST_LINK_RATE		(RLCM_IOC_MAGIC +155)
#define RLCM_ENABLE_NODROPLINEFLAG				(RLCM_IOC_MAGIC +156)
#define RLCM_DISABLE_NODROPLINEFLAG				(RLCM_IOC_MAGIC +157)

#define RLCM_SET_D_CONFIG						(RLCM_IOC_MAGIC +158)
#define RLCM_GET_DSL_STAT_LAST_SHOWTIME			(RLCM_IOC_MAGIC +159)

#define RLCM_GET_DSL_STAT_SHOWTIME_REV1P4		(RLCM_IOC_MAGIC +160)
#define RLCM_GET_DSL_STAT_TOTAL_REV1P4			(RLCM_IOC_MAGIC +161)
#define RLCM_GET_DSL_STAT_LAST_SHOWTIME_REV1P4	(RLCM_IOC_MAGIC +162)
#define RLCM_GET_DSL_STAT_15MIN_REV1P4			(RLCM_IOC_MAGIC +163)
#define RLCM_GET_DSL_STAT_1DAY_REV1P4			(RLCM_IOC_MAGIC +164)
#define RLCM_GET_DSL_STAT_FLAG_LOF				(RLCM_IOC_MAGIC +165)
#define RLCM_GET_FRAME_COUNT					(RLCM_IOC_MAGIC +166)
#define RLCM_DBG_DATA							(RLCM_IOC_MAGIC +167)
#define RLCM_SET_DSL_FUNC						(RLCM_IOC_MAGIC +168)
#define RLCM_GET_DSL_STAT_PRE_15MIN				(RLCM_IOC_MAGIC +180)
#define	RLCM_GET_CHANNEL_TABLE					(RLCM_IOC_MAGIC +190)		// Mason Yu.  20130207
#define RLCM_GET_PREV1DAY_LOSS_DATA				(RLCM_IOC_MAGIC +200)
#define RLCM_GET_ANY_15MIN_LOSS_DATA			(RLCM_IOC_MAGIC +201)
#define RLCM_GET_ADSLLINE_ENABLED				(RLCM_IOC_MAGIC +202)
#define RLCM_SET_ADSLLINE_ENABLED				(RLCM_IOC_MAGIC +203)
#define RLCM_GET_ADSLLINE_CAP_ACT				(RLCM_IOC_MAGIC +204)
#define RLCM_GET_ADSLLINE_MODE_CAP				(RLCM_IOC_MAGIC +205)
#define RLCM_GET_ADSLLINE_MODE_ACT				(RLCM_IOC_MAGIC +206) 

#define RLCM_DEBUG_DATA							(RLCM_IOC_MAGIC +111+1000)
#define RLCM_GET_VDSL2_MREFPSD_DS				(RLCM_IOC_MAGIC +114+1000)
#define RLCM_GET_VDSL2_TXREFVNPSD_DS			(RLCM_IOC_MAGIC +115+1000)
#define RLCM_GET_VDSL2_MREFPSD_US				(RLCM_IOC_MAGIC +116+1000)
#define RLCM_GET_VDSL2_TXREFVNPSD_US			(RLCM_IOC_MAGIC +117+1000)
#define RLCM_GET_ADSL_DIAG_HLIN					(RLCM_IOC_MAGIC +118+1000)
#define RLCM_GET_ADSL_DIAG_GI					(RLCM_IOC_MAGIC +119+1000)
#define RLCM_GET_ADSL_DIAG_BI					(RLCM_IOC_MAGIC +120+1000)
#define RLCM_GET_ADSL_DIAG_OTHER				(RLCM_IOC_MAGIC +121+1000)
#define RLCM_GET_VDSL2_DIAG_QLN					(RLCM_IOC_MAGIC +122+1000)
#define RLCM_GET_VDSL2_DIAG_HLOG				(RLCM_IOC_MAGIC +123+1000)
#define RLCM_GET_VDSL2_DIAG_SNR					(RLCM_IOC_MAGIC +124+1000)
#define RLCM_GET_VDSL2_DIAG_HLIN				(RLCM_IOC_MAGIC +125+1000)
#define RLCM_GET_VDSL2_DIAG_HLIN_SCALE			(RLCM_IOC_MAGIC +126+1000)
#define RLCM_GET_VDSL2_DIAG_OTHER				(RLCM_IOC_MAGIC +127+1000)
#define RLCM_GET_VDSL2_DS_PMS_PARAM1			(RLCM_IOC_MAGIC +128+1000)
#define RLCM_GET_VDSL2_US_PMS_PARAM1			(RLCM_IOC_MAGIC +129+1000)
#define RLCM_GET_VDSL2_SNR_MARGIN				(RLCM_IOC_MAGIC +130+1000)
#define RLCM_GET_VDSL2_LOOP_ATT					(RLCM_IOC_MAGIC +131+1000)
#define RLCM_GET_VDSL2_CHANNEL_SNR				(RLCM_IOC_MAGIC +132+1000)
#define RLCM_GET_VDSL2_CHANNEL_BITLOAD			(RLCM_IOC_MAGIC +133+1000)
#define RLCM_WANBonderDSLConfig_Enable		 	(RLCM_IOC_MAGIC +137+1000)
#define RLCM_WANBonderDSLConfig_Status			(RLCM_IOC_MAGIC +138+1000)
#define RLCM_WANBonderDSLConfig_GroupBondScheme   		(RLCM_IOC_MAGIC +139+1000)
#define RLCM_WANBonderDSLConfig_GroupCapacity   		(RLCM_IOC_MAGIC +140+1000)
#define RLCM_WANBonderDSLConfig_aGroupTargetUpRate   	(RLCM_IOC_MAGIC +141+1000)
#define RLCM_WANBonderDSLConfig_aGroupTargetDownRate   	(RLCM_IOC_MAGIC +142+1000)
#define RLCM_WANConfig_LineNumber 						(RLCM_IOC_MAGIC +143+1000)
#define RLCM_UserGetDslData						(RLCM_IOC_MAGIC +144+1000)
#define RLCM_UserSetDslData						(RLCM_IOC_MAGIC +145+1000)
#define RLCM_INIT_ATMSAR						(RLCM_IOC_MAGIC +146+1000)
#define RLCM_INIT_PTMMAC						(RLCM_IOC_MAGIC +147+1000)

#define OWNBYCPU								0
#define OWNBYDSL								1

#define VLAN_HLEN 								4
#define VLAN_ETH_ALEN 							6

#define CH_UNUSE								0
#define CH_SETTING								1
#define CH_USED									2

#if defined(ERB_DEBUG)
extern void dump_ctrlp(ctrl_pkt_t * p);
extern void dump_rxbuf(unsigned char * b, int l);
#endif

#if 0
#ifdef _LITTLE_ENDIAN
	#define ntohs(x)   (swaps16(x))
	#define ntohl(x)   (swapl32(x))
	#define htons(x)   (swaps16(x))
	#define htonl(x)   (swapl32(x))
#else
	#define ntohs(x)	(x)
	#define ntohl(x)	(x)
	#define htons(x)	(x)
	#define htonl(x)	(x)
#endif
#endif
#endif /* __XDSL_CTRL_H__ */