/*
################################################################################
# 
# r8168 is the Linux device driver released for RealTek RTL8168B/8111B, 
# RTL8168C/8111C, RTL8168CP/8111CP, RTL8168D/8111D, and RTL8168DP/8111DP, and
# RTK8168E/8111E Gigabit Ethernet controllers with PCI-Express interface.
# 
# Copyright(c) 2012 Realtek Semiconductor Corp. All rights reserved.
# 
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
# 
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
# more details.
# 
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses/>.
# 
# Author:
# Realtek NIC software team <nicfae@realtek.com>
# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
# 
################################################################################
*/

/************************************************************************************
 *  This product is covered by one or more of the following patents:
 *  US5,307,459, US5,434,872, US5,732,094, US6,570,884, US6,115,776, and US6,327,625.
 ***********************************************************************************/

#define SIOCDEVPRIVATE_RTLASF   SIOCDEVPRIVATE

#define FUNCTION_ENABLE		1
#define FUNCTION_DISABLE	0

#define ASFCONFIG	0
#define ASFCAPABILITY	1
#define ASFCOMMULEN	0
#define ASFHBPERIOD	0
#define ASFWD16RST	0
#define ASFCAPMASK	0
#define ASFALERTRESND	0
#define ASFLSNRPOLLCYC	0
#define ASFSNRPOLLCYC	0
#define ASFWD8RESET	0
#define ASFRWHEXNUM	0

#define FMW_CAP_MASK	0x0000F867
#define SPC_CMD_MASK	0x1F00
#define SYS_CAP_MASK	0xFF
#define DISABLE_MASK	0x00

#define MAX_DATA_LEN	200
#define MAX_STR_LEN	200

#define COMMU_STR_MAX_LEN	23

#define KEY_LEN		20
#define UUID_LEN	16
#define SYSID_LEN	2

#define RW_ONE_BYTE	1
#define RW_TWO_BYTES	2
#define RW_FOUR_BYTES	4

enum asf_registers {
	HBPeriod	= 0x0000,
	WD8Rst		= 0x0002,
	WD8Timer	= 0x0003,
	WD16Rst		= 0x0004,
	LSnsrPollCycle	= 0x0006,
	ASFSnsrPollPrd	= 0x0007,
	AlertReSendCnt	= 0x0008,
	AlertReSendItvl	= 0x0009,
	SMBAddr		= 0x000A,
	SMBCap		= 0x000B,
	ASFConfigR0	= 0x000C,
	ASFConfigR1	= 0x000D,
	WD16Timer	= 0x000E,
	ConsoleMA	= 0x0010,
	ConsoleIP	= 0x0016,
	IPAddr		= 0x001A,

	UUID		= 0x0020,
	IANA		= 0x0030,
	SysID		= 0x0034,
	Community	= 0x0036,
	StringLength	= 0x004D,
	LC		= 0x004E,
	EntityInst	= 0x004F,
	FmCapMsk	= 0x0050,
	SpCMDMsk	= 0x0054,
	SysCapMsk	= 0x0056,
	WDSysSt		= 0x0057,
	RxMsgType	= 0x0058,
	RxSpCMD		= 0x0059,
	RxSpCMDPa	= 0x005A,
	RxBtOpMsk	= 0x005C,
	RmtRstAddr	= 0x005E,
	RmtRstCmd	= 0x005F,
	RmtRstData	= 0x0060,
	RmtPwrOffAddr	= 0x0061,
	RmtPwrOffCmd	= 0x0062,
	RmtPwrOffData	= 0x0063,
	RmtPwrOnAddr	= 0x0064,
	RmtPwrOnCmd	= 0x0065,
	RmtPwrOnData	= 0x0066,
	RmtPCRAddr	= 0x0067,
	RmtPCRCmd	= 0x0068,
	RmtPCRData	= 0x0069,
	RMCP_IANA	= 0x006A,
	RMCP_OEM	= 0x006E,
	ASFSnsr0Addr	= 0x0070,

	ASFSnsrEvSt	= 0x0073,
	ASFSnsrEvAlert	= 0x0081,

	LSnsrNo		= 0x00AD,
	AssrtEvntMsk	= 0x00AE,
	DeAssrtEvntMsk	= 0x00AF,

	LSnsrAddr0	= 0x00B0,
	LAlertCMD0	= 0x00B1,
	LAlertDataMsk0	= 0x00B2,
	LAlertCmp0	= 0x00B3,
	LAlertESnsrT0	= 0x00B4,
	LAlertET0	= 0x00B5,
	LAlertEOffset0	= 0x00B6,
	LAlertES0	= 0x00B7,
	LAlertSN0	= 0x00B8,
	LAlertEntity0	= 0x00B9,
	LAlertEI0	= 0x00BA,
	LSnsrState0	= 0x00BB,

	LSnsrAddr1	= 0x00BD,
	LAlertCMD1	= 0x00BE,
	LAlertDataMsk1	= 0x00BF,
	LAlertCmp1	= 0x00C0,
	LAlertESnsrT1	= 0x00C1,
	LAlertET1	= 0x00C2,
	LAlertEOffset1	= 0x00C3,
	LAlertES1	= 0x00C4,
	LAlertSN1	= 0x00C5,
	LAlertEntity1	= 0x00C6,
	LAlertEI1	= 0x00C7,
	LSnsrState1	= 0x00C8,
	
	LSnsrAddr2	= 0x00CA,
	LAlertCMD2	= 0x00CB,
	LAlertDataMsk2	= 0x00CC,
	LAlertCmp2	= 0x00CD,
	LAlertESnsrT2	= 0x00CE,
	LAlertET2	= 0x00CF,
	LAlertEOffset2	= 0x00D0,
	LAlertES2	= 0x00D1,
	LAlertSN2	= 0x00D2,
	LAlertEntity2	= 0x00D3,
	LAlertEI2	= 0x00D4,
	LSnsrState2	= 0x00D5,

	LSnsrAddr3	= 0x00D7,
	LAlertCMD3	= 0x00D8,
	LAlertDataMsk3	= 0x00D9,
	LAlertCmp3	= 0x00DA,
	LAlertESnsrT3	= 0x00DB,
	LAlertET3	= 0x00DC,
	LAlertEOffset3	= 0x00DD,
	LAlertES3	= 0x00DE,
	LAlertSN3	= 0x00DF,
	LAlertEntity3	= 0x00E0,
	LAlertEI3	= 0x00E1,
	LSnsrState3	= 0x00E2,

	LSnsrAddr4	= 0x00E4,
	LAlertCMD4	= 0x00E5,
	LAlertDataMsk4	= 0x00E6,
	LAlertCmp4	= 0x00E7,
	LAlertESnsrT4	= 0x00E8,
	LAlertET4	= 0x00E9,
	LAlertEOffset4	= 0x00EA,
	LAlertES4	= 0x00EB,
	LAlertSN4	= 0x00EC,
	LAlertEntity4	= 0x00ED,
	LAlertEI4	= 0x00EE,
	LSnsrState4	= 0x00EF,

	LSnsrAddr5	= 0x00F1,
	LAlertCMD5	= 0x00F2,
	LAlertDataMsk5	= 0x00F3,
	LAlertCmp5	= 0x00F4,
	LAlertESnsrT5	= 0x00F5,
	LAlertET5	= 0x00F6,
	LAlertEOffset5	= 0x00F7,
	LAlertES5	= 0x00F8,
	LAlertSN5	= 0x00F9,
	LAlertEntity5	= 0x00FA,
	LAlertEI5	= 0x00FB,
	LSnsrState5	= 0x00FC,

	LSnsrAddr6	= 0x00FE,
	LAlertCMD6	= 0x00FF,
	LAlertDataMsk6	= 0x0100,
	LAlertCmp6	= 0x0101,
	LAlertESnsrT6	= 0x0102,
	LAlertET6	= 0x0103,
	LAlertEOffset6	= 0x0104,
	LAlertES6	= 0x0105,
	LAlertSN6	= 0x0106,
	LAlertEntity6	= 0x0107,
	LAlertEI6	= 0x0108,
	LSnsrState6	= 0x0109,

	LSnsrAddr7	= 0x010B,
	LAlertCMD7	= 0x010C,
	LAlertDataMsk7	= 0x010D,
	LAlertCmp7	= 0x010E,
	LAlertESnsrT7	= 0x010F,
	LAlertET7	= 0x0110,
	LAlertEOffset7	= 0x0111,
	LAlertES7	= 0x0112,
	LAlertSN7	= 0x0113,
	LAlertEntity7	= 0x0114,
	LAlertEI7	= 0x0115,
	LSnsrState7	= 0x0116,
	LAssert		= 0x0117,
	LDAssert	= 0x0118,
	IPServiceType	= 0x0119,
	IPIdfr		= 0x011A,
	FlagFOffset	= 0x011C,
	TTL		= 0x011E,
	HbtEI		= 0x011F,
	MgtConSID1	= 0x0120,
	MgtConSID2	= 0x0124,
	MgdCltSID	= 0x0128,
	StCd		= 0x012C,
	MgtConUR	= 0x012D,
	MgtConUNL	= 0x012E,

	AuthPd		= 0x0130,
	IntyPd		= 0x0138,
	MgtConRN	= 0x0140,
	MgdCtlRN	= 0x0150,
	MgtConUN	= 0x0160,
	Rakp2IntCk	= 0x0170,
	KO		= 0x017C,
	KA		= 0x0190,
	KG		= 0x01A4,
	KR		= 0x01B8,
	CP		= 0x01CC,
	CQ		= 0x01D0,
	KC		= 0x01D4,
	ConsoleSid	= 0x01E8,

	SIK1		= 0x01FC,
	SIK2		= 0x0210,
	Udpsrc_port	= 0x0224,
	Udpdes_port	= 0x0226,
	Asf_debug_mux	= 0x0228
};

enum asf_cmdln_opt {
	ASF_GET,
	ASF_SET,
	ASF_HELP
};

struct asf_ioctl_struct {
	unsigned int arg;
	unsigned int offset;
	union {
		unsigned int data[MAX_DATA_LEN];
		char string[MAX_STR_LEN];
	} u;
};

int rtl8168_asf_ioctl(struct net_device *dev, struct ifreq *ifr);
void rtl8168_asf_hbperiod(void __iomem *ioaddr, int arg, unsigned int *data);
void rtl8168_asf_wd16rst(void __iomem *ioaddr, int arg, unsigned int *data);
void rtl8168_asf_console_mac(struct rtl8168_private *, int arg, unsigned int *data);
void rtl8168_asf_ip_address(struct rtl8168_private *, int arg, int offset, unsigned int *data);
void rtl8168_asf_config_regs(void __iomem *ioaddr, int arg, int offset, unsigned int *data);
void rtl8168_asf_capability_masks(void __iomem *ioaddr, int arg, int offset, unsigned int *data);
void rtl8168_asf_community_string(void __iomem *ioaddr, int arg, char *string);
void rtl8168_asf_community_string_len(void __iomem *ioaddr, int arg, unsigned int *data);
void rtl8168_asf_alert_resend_interval(void __iomem *ioaddr, int arg, unsigned int *data);
void rtl8168_asf_time_period(void __iomem *ioaddr, int arg, int offset, unsigned int *data);
void rtl8168_asf_key_access(struct rtl8168_private *, int arg, int offset, unsigned int *data);
void rtl8168_asf_rw_hexadecimal(void __iomem *ioaddr, int arg, int offset, int len, unsigned int *data);
void rtl8168_asf_rw_iana(void __iomem *ioaddr, int arg, unsigned int *data);
void rtl8168_asf_rw_uuid(void __iomem *ioaddr, int arg, unsigned int *data);
void rtl8168_asf_rw_systemid(void __iomem *ioaddr, int arg, unsigned int *data);
