/*
 * linux/drivers/s390/net/qeth_mpc.h
 *
 * Linux on zSeries OSA Express and HiperSockets support
 *
 * Copyright 2000,2003 IBM Corporation
 * Author(s): Utz Bacher <utz.bacher@de.ibm.com>
 *            Thomas Spatzier <tspat@de.ibm.com>
 *            Frank Pavlic <pavlic@de.ibm.com>
 *
 */
#ifndef __QETH_MPC_H__
#define __QETH_MPC_H__

#include <asm/qeth.h>

#define VERSION_QETH_MPC_H "$Revision: 1.43 $"

extern const char *VERSION_QETH_MPC_C;

#define IPA_PDU_HEADER_SIZE	0x40
#define QETH_IPA_PDU_LEN_TOTAL(buffer) (buffer+0x0e)
#define QETH_IPA_PDU_LEN_PDU1(buffer) (buffer+0x26)
#define QETH_IPA_PDU_LEN_PDU2(buffer) (buffer+0x2a)
#define QETH_IPA_PDU_LEN_PDU3(buffer) (buffer+0x3a)

extern unsigned char IPA_PDU_HEADER[];
#define QETH_IPA_CMD_DEST_ADDR(buffer) (buffer+0x2c)

#define IPA_CMD_LENGTH	(IPA_PDU_HEADER_SIZE + sizeof(struct qeth_ipa_cmd))

#define QETH_SEQ_NO_LENGTH 	4
#define QETH_MPC_TOKEN_LENGTH 	4
#define QETH_MCL_LENGTH		4
#define OSA_ADDR_LEN		6

#define QETH_TIMEOUT 		(10 * HZ)
#define QETH_IPA_TIMEOUT 	(45 * HZ)
#define QETH_IDX_COMMAND_SEQNO 	0xffff0000
#define SR_INFO_LEN		16

#define QETH_CLEAR_CHANNEL_PARM	-10
#define QETH_HALT_CHANNEL_PARM	-11

/*****************************************************************************/
/* IP Assist related definitions                                             */
/*****************************************************************************/
#define IPA_CMD_INITIATOR_HOST  0x00
#define IPA_CMD_INITIATOR_HYDRA 0x01
#define IPA_CMD_PRIM_VERSION_NO 0x01

enum qeth_card_types {
	QETH_CARD_TYPE_UNKNOWN = 0,
	QETH_CARD_TYPE_OSAE    = 10,
	QETH_CARD_TYPE_IQD     = 1234,
};

#define QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE 0x18
/* only the first two bytes are looked at in qeth_get_cardname_short */
enum qeth_link_types {
	QETH_LINK_TYPE_FAST_ETH     = 0x01,
	QETH_LINK_TYPE_HSTR         = 0x02,
	QETH_LINK_TYPE_GBIT_ETH     = 0x03,
	QETH_LINK_TYPE_10GBIT_ETH   = 0x10,
	QETH_LINK_TYPE_LANE_ETH100  = 0x81,
	QETH_LINK_TYPE_LANE_TR      = 0x82,
	QETH_LINK_TYPE_LANE_ETH1000 = 0x83,
	QETH_LINK_TYPE_LANE         = 0x88,
	QETH_LINK_TYPE_ATM_NATIVE   = 0x90,
};

enum qeth_tr_macaddr_modes {
	QETH_TR_MACADDR_NONCANONICAL = 0,
	QETH_TR_MACADDR_CANONICAL    = 1,
};

enum qeth_tr_broadcast_modes {
	QETH_TR_BROADCAST_ALLRINGS = 0,
	QETH_TR_BROADCAST_LOCAL    = 1,
};

/* these values match CHECKSUM_* in include/linux/skbuff.h */
enum qeth_checksum_types {
	SW_CHECKSUMMING = 0, /* TODO: set to bit flag used in IPA Command */
	HW_CHECKSUMMING = 1,
	NO_CHECKSUMMING = 2,
};
#define QETH_CHECKSUM_DEFAULT SW_CHECKSUMMING

/*
 * Routing stuff
 */
#define RESET_ROUTING_FLAG 0x10 /* indicate that routing type shall be set */
enum qeth_routing_types {
	NO_ROUTER           = 0, /* TODO: set to bit flag used in IPA Command */
	PRIMARY_ROUTER      = 1,
	SECONDARY_ROUTER    = 2,
	MULTICAST_ROUTER    = 3,
	PRIMARY_CONNECTOR   = 4,
	SECONDARY_CONNECTOR = 5,
};


/* IPA Commands */
enum qeth_ipa_cmds {
	IPA_CMD_STARTLAN              = 0x01,
	IPA_CMD_STOPLAN               = 0x02,
	IPA_CMD_SETVMAC 	      = 0x21,
	IPA_CMD_DELVMAC 	      =	0x22,
	IPA_CMD_SETGMAC  	      = 0x23,
	IPA_CMD_DELGMAC 	      = 0x24,
	IPA_CMD_SETVLAN 	      = 0x25,
	IPA_CMD_DELVLAN 	      = 0x26,
	IPA_CMD_SETIP                 = 0xb1,
	IPA_CMD_DELIP                 = 0xb7,
	IPA_CMD_QIPASSIST             = 0xb2,
	IPA_CMD_SETASSPARMS           = 0xb3,
	IPA_CMD_SETIPM                = 0xb4,
	IPA_CMD_DELIPM                = 0xb5,
	IPA_CMD_SETRTG                = 0xb6,
	IPA_CMD_SETADAPTERPARMS       = 0xb8,
	IPA_CMD_IPFRAME               = 0xb9,
	IPA_CMD_ADD_ADDR_ENTRY        = 0xc1,
	IPA_CMD_DELETE_ADDR_ENTRY     = 0xc2,
	IPA_CMD_CREATE_ADDR           = 0xc3,
	IPA_CMD_DESTROY_ADDR          = 0xc4,
	IPA_CMD_REGISTER_LOCAL_ADDR   = 0xd1,
	IPA_CMD_UNREGISTER_LOCAL_ADDR = 0xd2,
};

enum qeth_ip_ass_cmds {
	IPA_CMD_ASS_START	= 0x0001,
	IPA_CMD_ASS_STOP	= 0x0002,
	IPA_CMD_ASS_CONFIGURE 	= 0x0003,
	IPA_CMD_ASS_ENABLE 	= 0x0004,
};

enum qeth_arp_process_subcmds {
	IPA_CMD_ASS_ARP_SET_NO_ENTRIES 	= 0x0003,
	IPA_CMD_ASS_ARP_QUERY_CACHE 	= 0x0004,
	IPA_CMD_ASS_ARP_ADD_ENTRY 	= 0x0005,
	IPA_CMD_ASS_ARP_REMOVE_ENTRY 	= 0x0006,
	IPA_CMD_ASS_ARP_FLUSH_CACHE 	= 0x0007,
	IPA_CMD_ASS_ARP_QUERY_INFO 	= 0x0104,
	IPA_CMD_ASS_ARP_QUERY_STATS 	= 0x0204,
};

/* Return Codes for IPA Commands */
enum qeth_ipa_return_codes {
	IPA_RC_SUCCESS             = 0x0000,
	IPA_RC_NOTSUPP             = 0x0001,
	IPA_RC_NO_ACCESS           = 0x0002,
	IPA_RC_FAILED              = 0x0003,
	IPA_RC_DATA_MISMATCH       = 0xe001,
	IPA_RC_INVALID_LAN_TYPE    = 0xe003,
	IPA_RC_INVALID_LAN_NO      = 0xe004,
	IPA_RC_IPADDR_ALREADY_REG  = 0xe005,
	IPA_RC_IPADDR_TABLE_FULL   = 0xe006,
	IPA_RC_IPADDR_ALREADY_USED = 0xe00a,
	IPA_RC_ASSNO_NOT_SUPP      = 0xe00d,
	IPA_RC_ASSCMD_START_FAILED = 0xe00e,
	IPA_RC_ASSCMD_PART_SUCCESS = 0xe00f,
	IPA_RC_IPADDR_NOT_DEFINED  = 0xe010,
	IPA_RC_LAN_OFFLINE         = 0xe080,
};

/* IPA function flags; each flag marks availability of respective function */
enum qeth_ipa_funcs {
	IPA_ARP_PROCESSING      = 0x00000001L,
	IPA_INBOUND_CHECKSUM    = 0x00000002L,
	IPA_OUTBOUND_CHECKSUM   = 0x00000004L,
	IPA_IP_FRAGMENTATION    = 0x00000008L,
	IPA_FILTERING           = 0x00000010L,
	IPA_IPV6                = 0x00000020L,
	IPA_MULTICASTING        = 0x00000040L,
	IPA_IP_REASSEMBLY       = 0x00000080L,
	IPA_QUERY_ARP_COUNTERS  = 0x00000100L,
	IPA_QUERY_ARP_ADDR_INFO = 0x00000200L,
	IPA_SETADAPTERPARMS     = 0x00000400L,
	IPA_VLAN_PRIO           = 0x00000800L,
	IPA_PASSTHRU            = 0x00001000L,
	IPA_FULL_VLAN           = 0x00004000L,
	IPA_SOURCE_MAC          = 0x00010000L,
	IPA_OSA_MC_ROUTER       = 0x00020000L,
	IPA_QUERY_ARP_ASSIST	= 0x00040000L,
	IPA_INBOUND_TSO         = 0x00080000L,
	IPA_OUTBOUND_TSO        = 0x00100000L,
};

/* SETIP/DELIP IPA Command: ***************************************************/
enum qeth_ipa_setdelip_flags {
	QETH_IPA_SETDELIP_DEFAULT          = 0x00L, /* default */
	QETH_IPA_SETIP_VIPA_FLAG           = 0x01L, /* no grat. ARP */
	QETH_IPA_SETIP_TAKEOVER_FLAG       = 0x02L, /* nofail on grat. ARP */
	QETH_IPA_DELIP_ADDR_2_B_TAKEN_OVER = 0x20L,
	QETH_IPA_DELIP_VIPA_FLAG           = 0x40L,
	QETH_IPA_DELIP_ADDR_NEEDS_SETIP    = 0x80L,
};

/* SETADAPTER IPA Command: ****************************************************/
enum qeth_ipa_setadp_cmd {
	IPA_SETADP_QUERY_COMMANDS_SUPPORTED	= 0x01,
	IPA_SETADP_ALTER_MAC_ADDRESS 		= 0x02,
	IPA_SETADP_ADD_DELETE_GROUP_ADDRESS 	= 0x04,
	IPA_SETADP_ADD_DELETE_FUNCTIONAL_ADDR 	= 0x08,
	IPA_SETADP_SET_ADDRESSING_MODE 		= 0x10,
	IPA_SETADP_SET_CONFIG_PARMS 		= 0x20,
	IPA_SETADP_SET_CONFIG_PARMS_EXTENDED 	= 0x40,
	IPA_SETADP_SET_BROADCAST_MODE 		= 0x80,
	IPA_SETADP_SEND_OSA_MESSAGE 		= 0x0100,
	IPA_SETADP_SET_SNMP_CONTROL 		= 0x0200,
	IPA_SETADP_READ_SNMP_PARMS 		= 0x0400,
	IPA_SETADP_WRITE_SNMP_PARMS 		= 0x0800,
	IPA_SETADP_QUERY_CARD_INFO 		= 0x1000,
};
enum qeth_ipa_mac_ops {
	CHANGE_ADDR_READ_MAC 		= 0,
	CHANGE_ADDR_REPLACE_MAC 	= 1,
	CHANGE_ADDR_ADD_MAC 		= 2,
	CHANGE_ADDR_DEL_MAC 		= 4,
	CHANGE_ADDR_RESET_MAC 		= 8,
};
enum qeth_ipa_addr_ops {
	CHANGE_ADDR_READ_ADDR 		= 0,
	CHANGE_ADDR_ADD_ADDR 		= 1,
	CHANGE_ADDR_DEL_ADDR 		= 2,
	CHANGE_ADDR_FLUSH_ADDR_TABLE 	= 4,


};
/* (SET)DELIP(M) IPA stuff ***************************************************/
struct qeth_ipacmd_setdelip4 {
	__u8   ip_addr[4];
	__u8   mask[4];
	__u32  flags;
} __attribute__ ((packed));

struct qeth_ipacmd_setdelip6 {
	__u8   ip_addr[16];
	__u8   mask[16];
	__u32  flags;
} __attribute__ ((packed));

struct qeth_ipacmd_setdelipm {
	__u8 mac[6];
	__u8 padding[2];
	__u8 ip6[12];
	__u8 ip4[4];
} __attribute__ ((packed));

struct qeth_ipacmd_layer2setdelmac {
	__u32 mac_length;
	__u8 mac[6];
} __attribute__ ((packed));

struct qeth_ipacmd_layer2setdelvlan {
	__u16 vlan_id;
} __attribute__ ((packed));


struct qeth_ipacmd_setassparms_hdr {
	__u32 assist_no;
	__u16 length;
	__u16 command_code;
	__u16 return_code;
	__u8 number_of_replies;
	__u8 seq_no;
} __attribute__((packed));

struct qeth_arp_query_data {
	__u16 request_bits;
	__u16 reply_bits;
	__u32 no_entries;
	char data;
} __attribute__((packed));

/* used as parameter for arp_query reply */
struct qeth_arp_query_info {
	__u32 udata_len;
	__u16 mask_bits;
	__u32 udata_offset;
	__u32 no_entries;
	char *udata;
};

/* SETASSPARMS IPA Command: */
struct qeth_ipacmd_setassparms {
	struct qeth_ipacmd_setassparms_hdr hdr;
	union {
		__u32 flags_32bit;
		struct qeth_arp_cache_entry add_arp_entry;
		struct qeth_arp_query_data query_arp;
		__u8 ip[16];
	} data;
} __attribute__ ((packed));


/* SETRTG IPA Command:    ****************************************************/
struct qeth_set_routing {
	__u8 type;
};

/* SETADAPTERPARMS IPA Command:    *******************************************/
struct qeth_query_cmds_supp {
	__u32 no_lantypes_supp;
	__u8 lan_type;
	__u8 reserved1[3];
	__u32 supported_cmds;
	__u8 reserved2[8];
} __attribute__ ((packed));

struct qeth_change_addr {
	__u32 cmd;
	__u32 addr_size;
	__u32 no_macs;
	__u8 addr[OSA_ADDR_LEN];
} __attribute__ ((packed));


struct qeth_snmp_cmd {
	__u8  token[16];
	__u32 request;
	__u32 interface;
	__u32 returncode;
	__u32 firmwarelevel;
	__u32 seqno;
	__u8  data;
} __attribute__ ((packed));

struct qeth_snmp_ureq_hdr {
	__u32   data_len;
	__u32   req_len;
	__u32   reserved1;
	__u32   reserved2;
} __attribute__ ((packed));

struct qeth_snmp_ureq {
	struct qeth_snmp_ureq_hdr hdr;
	struct qeth_snmp_cmd cmd;
} __attribute__((packed));

struct qeth_ipacmd_setadpparms_hdr {
	__u32 supp_hw_cmds;
	__u32 reserved1;
	__u16 cmdlength;
	__u16 reserved2;
	__u32 command_code;
	__u16 return_code;
	__u8  used_total;
	__u8  seq_no;
	__u32 reserved3;
} __attribute__ ((packed));

struct qeth_ipacmd_setadpparms {
	struct qeth_ipacmd_setadpparms_hdr hdr;
	union {
		struct qeth_query_cmds_supp query_cmds_supp;
		struct qeth_change_addr change_addr;
		struct qeth_snmp_cmd snmp;
		__u32 mode;
	} data;
} __attribute__ ((packed));

/* IPFRAME IPA Command:    ***************************************************/
/* TODO: define in analogy to commands define above */

/* ADD_ADDR_ENTRY IPA Command:    ********************************************/
/* TODO: define in analogy to commands define above */

/* DELETE_ADDR_ENTRY IPA Command:    *****************************************/
/* TODO: define in analogy to commands define above */

/* CREATE_ADDR IPA Command:    ***********************************************/
struct qeth_create_destroy_address {
	__u8 unique_id[8];
} __attribute__ ((packed));

/* REGISTER_LOCAL_ADDR IPA Command:    ***************************************/
/* TODO: define in analogy to commands define above */

/* UNREGISTER_LOCAL_ADDR IPA Command:    *************************************/
/* TODO: define in analogy to commands define above */

/* Header for each IPA command */
struct qeth_ipacmd_hdr {
	__u8   command;
	__u8   initiator;
	__u16  seqno;
	__u16  return_code;
	__u8   adapter_type;
	__u8   rel_adapter_no;
	__u8   prim_version_no;
	__u8   param_count;
	__u16  prot_version;
	__u32  ipa_supported;
	__u32  ipa_enabled;
} __attribute__ ((packed));

/* The IPA command itself */
struct qeth_ipa_cmd {
	struct qeth_ipacmd_hdr hdr;
	union {
		struct qeth_ipacmd_setdelip4   		setdelip4;
		struct qeth_ipacmd_setdelip6   		setdelip6;
		struct qeth_ipacmd_setdelipm		setdelipm;
		struct qeth_ipacmd_setassparms 		setassparms;
		struct qeth_ipacmd_layer2setdelmac  	setdelmac;
		struct qeth_ipacmd_layer2setdelvlan 	setdelvlan;
		struct qeth_create_destroy_address 	create_destroy_addr;
		struct qeth_ipacmd_setadpparms 		setadapterparms;
		struct qeth_set_routing 		setrtg;
	} data;
} __attribute__ ((packed));

/*
 * special command for ARP processing.
 * this is not included in setassparms command before, because we get
 * problem with the size of struct qeth_ipacmd_setassparms otherwise
 */
enum qeth_ipa_arp_return_codes {
	QETH_IPA_ARP_RC_SUCCESS      = 0x0000,
	QETH_IPA_ARP_RC_FAILED       = 0x0001,
	QETH_IPA_ARP_RC_NOTSUPP      = 0x0002,
	QETH_IPA_ARP_RC_OUT_OF_RANGE = 0x0003,
	QETH_IPA_ARP_RC_Q_NOTSUPP    = 0x0004,
	QETH_IPA_ARP_RC_Q_NO_DATA    = 0x0008,
};

#define QETH_SETASS_BASE_LEN (sizeof(struct qeth_ipacmd_hdr) + \
			       sizeof(struct qeth_ipacmd_setassparms_hdr))
#define QETH_IPA_ARP_DATA_POS(buffer) (buffer + IPA_PDU_HEADER_SIZE + \
				       QETH_SETASS_BASE_LEN)
#define QETH_SETADP_BASE_LEN (sizeof(struct qeth_ipacmd_hdr) + \
			      sizeof(struct qeth_ipacmd_setadpparms_hdr))
#define QETH_SNMP_SETADP_CMDLENGTH 16

#define QETH_ARP_DATA_SIZE 3968
#define QETH_ARP_CMD_LEN (QETH_ARP_DATA_SIZE + 8)
/* Helper functions */
#define IS_IPA_REPLY(cmd) (cmd->hdr.initiator == IPA_CMD_INITIATOR_HOST)

/*****************************************************************************/
/* END OF   IP Assist related definitions                                    */
/*****************************************************************************/


extern unsigned char WRITE_CCW[];
extern unsigned char READ_CCW[];

extern unsigned char CM_ENABLE[];
#define CM_ENABLE_SIZE 0x63
#define QETH_CM_ENABLE_ISSUER_RM_TOKEN(buffer) (buffer+0x2c)
#define QETH_CM_ENABLE_FILTER_TOKEN(buffer) (buffer+0x53)
#define QETH_CM_ENABLE_USER_DATA(buffer) (buffer+0x5b)

#define QETH_CM_ENABLE_RESP_FILTER_TOKEN(buffer) \
		(PDU_ENCAPSULATION(buffer)+ 0x13)


extern unsigned char CM_SETUP[];
#define CM_SETUP_SIZE 0x64
#define QETH_CM_SETUP_DEST_ADDR(buffer) (buffer+0x2c)
#define QETH_CM_SETUP_CONNECTION_TOKEN(buffer) (buffer+0x51)
#define QETH_CM_SETUP_FILTER_TOKEN(buffer) (buffer+0x5a)

#define QETH_CM_SETUP_RESP_DEST_ADDR(buffer) \
		(PDU_ENCAPSULATION(buffer) + 0x1a)

extern unsigned char ULP_ENABLE[];
#define ULP_ENABLE_SIZE 0x6b
#define QETH_ULP_ENABLE_LINKNUM(buffer) (buffer+0x61)
#define QETH_ULP_ENABLE_DEST_ADDR(buffer) (buffer+0x2c)
#define QETH_ULP_ENABLE_FILTER_TOKEN(buffer) (buffer+0x53)
#define QETH_ULP_ENABLE_PORTNAME_AND_LL(buffer) (buffer+0x62)
#define QETH_ULP_ENABLE_RESP_FILTER_TOKEN(buffer) \
		(PDU_ENCAPSULATION(buffer) + 0x13)
#define QETH_ULP_ENABLE_RESP_MAX_MTU(buffer) \
		(PDU_ENCAPSULATION(buffer)+ 0x1f)
#define QETH_ULP_ENABLE_RESP_DIFINFO_LEN(buffer) \
		(PDU_ENCAPSULATION(buffer) + 0x17)
#define QETH_ULP_ENABLE_RESP_LINK_TYPE(buffer) \
		(PDU_ENCAPSULATION(buffer)+ 0x2b)
/* Layer 2 defintions */
#define QETH_PROT_LAYER2 0x08
#define QETH_PROT_TCPIP  0x03
#define QETH_ULP_ENABLE_PROT_TYPE(buffer) (buffer+0x50)
#define QETH_IPA_CMD_PROT_TYPE(buffer) (buffer+0x19)

extern unsigned char ULP_SETUP[];
#define ULP_SETUP_SIZE 0x6c
#define QETH_ULP_SETUP_DEST_ADDR(buffer) (buffer+0x2c)
#define QETH_ULP_SETUP_CONNECTION_TOKEN(buffer) (buffer+0x51)
#define QETH_ULP_SETUP_FILTER_TOKEN(buffer) (buffer+0x5a)
#define QETH_ULP_SETUP_CUA(buffer) (buffer+0x68)
#define QETH_ULP_SETUP_REAL_DEVADDR(buffer) (buffer+0x6a)

#define QETH_ULP_SETUP_RESP_CONNECTION_TOKEN(buffer) \
		(PDU_ENCAPSULATION(buffer)+0x1a)


extern unsigned char DM_ACT[];
#define DM_ACT_SIZE 0x55
#define QETH_DM_ACT_DEST_ADDR(buffer) (buffer+0x2c)
#define QETH_DM_ACT_CONNECTION_TOKEN(buffer) (buffer+0x51)



#define QETH_TRANSPORT_HEADER_SEQ_NO(buffer) (buffer+4)
#define QETH_PDU_HEADER_SEQ_NO(buffer) (buffer+0x1c)
#define QETH_PDU_HEADER_ACK_SEQ_NO(buffer) (buffer+0x20)

extern unsigned char IDX_ACTIVATE_READ[];
extern unsigned char IDX_ACTIVATE_WRITE[];

#define IDX_ACTIVATE_SIZE 	0x22
#define QETH_IDX_ACT_ISSUER_RM_TOKEN(buffer) (buffer+0x0c)
#define QETH_IDX_NO_PORTNAME_REQUIRED(buffer) ((buffer)[0x0b]&0x80)
#define QETH_IDX_ACT_FUNC_LEVEL(buffer) (buffer+0x10)
#define QETH_IDX_ACT_DATASET_NAME(buffer) (buffer+0x16)
#define QETH_IDX_ACT_QDIO_DEV_CUA(buffer) (buffer+0x1e)
#define QETH_IDX_ACT_QDIO_DEV_REALADDR(buffer) (buffer+0x20)
#define QETH_IS_IDX_ACT_POS_REPLY(buffer) (((buffer)[0x08]&3)==2)
#define QETH_IDX_REPLY_LEVEL(buffer) (buffer+0x12)

#define PDU_ENCAPSULATION(buffer) \
	(buffer + *(buffer + (*(buffer+0x0b)) + \
	 *(buffer + *(buffer+0x0b)+0x11) +0x07))

#define IS_IPA(buffer) \
	((buffer) && \
	 ( *(buffer + ((*(buffer+0x0b))+4) )==0xc1) )

#define ADDR_FRAME_TYPE_DIX 1
#define ADDR_FRAME_TYPE_802_3 2
#define ADDR_FRAME_TYPE_TR_WITHOUT_SR 0x10
#define ADDR_FRAME_TYPE_TR_WITH_SR 0x20

#endif
