/* SPDX-License-Identifier: GPL-2.0 */
/*
 *   Driver for KeyStream wireless LAN
 *
 *   Copyright (c) 2005-2008 KeyStream Corp.
 *   Copyright (C) 2009 Renesas Technology Corp.
 */

#ifndef _KS_HOSTIF_H_
#define _KS_HOSTIF_H_

#include <linux/compiler.h>
#include <linux/ieee80211.h>

/*
 * HOST-MAC I/F events
 */
#define HIF_DATA_REQ		0xE001
#define HIF_DATA_IND		0xE801
#define HIF_MIB_GET_REQ		0xE002
#define HIF_MIB_GET_CONF	0xE802
#define HIF_MIB_SET_REQ		0xE003
#define HIF_MIB_SET_CONF	0xE803
#define HIF_POWER_MGMT_REQ	0xE004
#define HIF_POWER_MGMT_CONF	0xE804
#define HIF_START_REQ		0xE005
#define HIF_START_CONF		0xE805
#define HIF_CONNECT_IND		0xE806
#define HIF_STOP_REQ		0xE006
#define HIF_STOP_CONF		0xE807
#define HIF_PS_ADH_SET_REQ	0xE007
#define HIF_PS_ADH_SET_CONF	0xE808
#define HIF_INFRA_SET_REQ	0xE008
#define HIF_INFRA_SET_CONF	0xE809
#define HIF_ADH_SET_REQ		0xE009
#define HIF_ADH_SET_CONF	0xE80A
#define HIF_AP_SET_REQ		0xE00A
#define HIF_AP_SET_CONF		0xE80B
#define HIF_ASSOC_INFO_IND	0xE80C
#define HIF_MIC_FAILURE_REQ	0xE00B
#define HIF_MIC_FAILURE_CONF	0xE80D
#define HIF_SCAN_REQ		0xE00C
#define HIF_SCAN_CONF		0xE80E
#define HIF_PHY_INFO_REQ	0xE00D
#define HIF_PHY_INFO_CONF	0xE80F
#define HIF_SLEEP_REQ		0xE00E
#define HIF_SLEEP_CONF		0xE810
#define HIF_PHY_INFO_IND	0xE811
#define HIF_SCAN_IND		0xE812
#define HIF_INFRA_SET2_REQ	0xE00F
#define HIF_INFRA_SET2_CONF	0xE813
#define HIF_ADH_SET2_REQ	0xE010
#define HIF_ADH_SET2_CONF	0xE814

#define HIF_REQ_MAX		0xE010

/*
 * HOST-MAC I/F data structure
 * Byte alignment Little Endian
 */

struct hostif_hdr {
	__le16 size;
	__le16 event;
} __packed;

struct hostif_data_request {
	struct hostif_hdr header;
	__le16 auth_type;
#define TYPE_DATA 0x0000
#define TYPE_AUTH 0x0001
	__le16 reserved;
	u8 data[];
} __packed;

#define TYPE_PMK1 0x0001
#define TYPE_GMK1 0x0002
#define TYPE_GMK2 0x0003

#define CHANNEL_LIST_MAX_SIZE 14
struct channel_list {
	u8 size;
	u8 body[CHANNEL_LIST_MAX_SIZE];
	u8 pad;
} __packed;

/**
 * enum mib_attribute - Management Information Base attribute
 * Attribute value used for accessing and updating MIB
 *
 * @DOT11_MAC_ADDRESS: MAC Address (R)
 * @DOT11_PRODUCT_VERSION: FirmWare Version (R)
 * @DOT11_RTS_THRESHOLD: RTS Threshold (R/W)
 * @DOT11_FRAGMENTATION_THRESHOLD: Fragment Threshold (R/W)
 * @DOT11_PRIVACY_INVOKED: WEP ON/OFF (W)
 * @DOT11_WEP_DEFAULT_KEY_ID: WEP Index (W)
 * @DOT11_WEP_DEFAULT_KEY_VALUE1: WEP Key#1(TKIP AES: PairwiseTemporalKey) (W)
 * @DOT11_WEP_DEFAULT_KEY_VALUE2: WEP Key#2(TKIP AES: GroupKey1) (W)
 * @DOT11_WEP_DEFAULT_KEY_VALUE3: WEP Key#3(TKIP AES: GroupKey2) (W)
 * @DOT11_WEP_DEFAULT_KEY_VALUE4: WEP Key#4 (W)
 * @DOT11_WEP_LIST: WEP LIST
 * @DOT11_DESIRED_SSID: SSID
 * @DOT11_CURRENT_CHANNEL: channel set
 * @DOT11_OPERATION_RATE_SET: rate set
 * @LOCAL_AP_SEARCH_INTERVAL: AP search interval (R/W)
 * @LOCAL_CURRENTADDRESS: MAC Address change (W)
 * @LOCAL_MULTICAST_ADDRESS: Multicast Address (W)
 * @LOCAL_MULTICAST_FILTER: Multicast Address Filter enable/disable (W)
 * @LOCAL_SEARCHED_AP_LIST: AP list (R)
 * @LOCAL_LINK_AP_STATUS: Link AP status (R)
 * @LOCAL_PACKET_STATISTICS: tx,rx packets statistics
 * @LOCAL_AP_SCAN_LIST_TYPE_SET: AP_SCAN_LIST_TYPE
 * @DOT11_RSN_ENABLED: WPA enable/disable (W)
 * @LOCAL_RSN_MODE: RSN mode WPA/WPA2 (W)
 * @DOT11_RSN_CONFIG_MULTICAST_CIPHER: GroupKeyCipherSuite (W)
 * @DOT11_RSN_CONFIG_UNICAST_CIPHER: PairwiseKeyCipherSuite (W)
 * @DOT11_RSN_CONFIG_AUTH_SUITE: AuthenticationKeyManagementSuite (W)
 * @DOT11_RSN_CONFIG_VERSION: RSN version (W)
 * @LOCAL_RSN_CONFIG_ALL: RSN CONFIG ALL (W)
 * @DOT11_PMK_TSC: PMK_TSC (W)
 * @DOT11_GMK1_TSC: GMK1_TSC (W)
 * @DOT11_GMK2_TSC: GMK2_TSC (W)
 * @DOT11_GMK3_TSC: GMK3_TSC
 * @LOCAL_PMK: Pairwise Master Key cache (W)
 * @LOCAL_REGION: Region setting
 * @LOCAL_WPS_ENABLE: WiFi Protected Setup
 * @LOCAL_WPS_PROBE_REQ: WPS Probe Request
 * @LOCAL_GAIN: Carrer sense threshold for demo ato show
 * @LOCAL_EEPROM_SUM: EEPROM checksum information
 */
enum mib_attribute {
	DOT11_MAC_ADDRESS                 = 0x21010100,
	DOT11_PRODUCT_VERSION             = 0x31024100,
	DOT11_RTS_THRESHOLD               = 0x21020100,
	DOT11_FRAGMENTATION_THRESHOLD     = 0x21050100,
	DOT11_PRIVACY_INVOKED             = 0x15010100,
	DOT11_WEP_DEFAULT_KEY_ID          = 0x15020100,
	DOT11_WEP_DEFAULT_KEY_VALUE1      = 0x13020101,
	DOT11_WEP_DEFAULT_KEY_VALUE2      = 0x13020102,
	DOT11_WEP_DEFAULT_KEY_VALUE3      = 0x13020103,
	DOT11_WEP_DEFAULT_KEY_VALUE4      = 0x13020104,
	DOT11_WEP_LIST                    = 0x13020100,
	DOT11_DESIRED_SSID		  = 0x11090100,
	DOT11_CURRENT_CHANNEL		  = 0x45010100,
	DOT11_OPERATION_RATE_SET	  = 0x11110100,
	LOCAL_AP_SEARCH_INTERVAL          = 0xF1010100,
	LOCAL_CURRENTADDRESS              = 0xF1050100,
	LOCAL_MULTICAST_ADDRESS           = 0xF1060100,
	LOCAL_MULTICAST_FILTER            = 0xF1060200,
	LOCAL_SEARCHED_AP_LIST            = 0xF1030100,
	LOCAL_LINK_AP_STATUS              = 0xF1040100,
	LOCAL_PACKET_STATISTICS		  = 0xF1020100,
	LOCAL_AP_SCAN_LIST_TYPE_SET	  = 0xF1030200,
	DOT11_RSN_ENABLED                 = 0x15070100,
	LOCAL_RSN_MODE                    = 0x56010100,
	DOT11_RSN_CONFIG_MULTICAST_CIPHER = 0x51040100,
	DOT11_RSN_CONFIG_UNICAST_CIPHER   = 0x52020100,
	DOT11_RSN_CONFIG_AUTH_SUITE       = 0x53020100,
	DOT11_RSN_CONFIG_VERSION          = 0x51020100,
	LOCAL_RSN_CONFIG_ALL              = 0x5F010100,
	DOT11_PMK_TSC                     = 0x55010100,
	DOT11_GMK1_TSC                    = 0x55010101,
	DOT11_GMK2_TSC                    = 0x55010102,
	DOT11_GMK3_TSC                    = 0x55010103,
	LOCAL_PMK                         = 0x58010100,
	LOCAL_REGION                      = 0xF10A0100,
	LOCAL_WPS_ENABLE                  = 0xF10B0100,
	LOCAL_WPS_PROBE_REQ               = 0xF10C0100,
	LOCAL_GAIN                        = 0xF10D0100,
	LOCAL_EEPROM_SUM                  = 0xF10E0100
};

struct hostif_mib_get_request {
	struct hostif_hdr header;
	__le32 mib_attribute;
} __packed;

/**
 * enum mib_data_type - Message Information Base data type.
 * @MIB_VALUE_TYPE_NULL: NULL type
 * @MIB_VALUE_TYPE_INT: INTEGER type
 * @MIB_VALUE_TYPE_BOOL: BOOL type
 * @MIB_VALUE_TYPE_COUNT32: unused
 * @MIB_VALUE_TYPE_OSTRING: Chunk of memory
 */
enum mib_data_type {
	MIB_VALUE_TYPE_NULL = 0,
	MIB_VALUE_TYPE_INT,
	MIB_VALUE_TYPE_BOOL,
	MIB_VALUE_TYPE_COUNT32,
	MIB_VALUE_TYPE_OSTRING
};

struct hostif_mib_value {
	__le16 size;
	__le16 type;
	u8 body[];
} __packed;

struct hostif_mib_get_confirm_t {
	struct hostif_hdr header;
	__le32 mib_status;
#define MIB_SUCCESS    0
#define MIB_INVALID    1
#define MIB_READ_ONLY  2
#define MIB_WRITE_ONLY 3
	__le32 mib_attribute;
	struct hostif_mib_value mib_value;
} __packed;

struct hostif_mib_set_request_t {
	struct hostif_hdr header;
	__le32 mib_attribute;
	struct hostif_mib_value mib_value;
} __packed;

struct hostif_power_mgmt_request {
	struct hostif_hdr header;
	__le32 mode;
#define POWER_ACTIVE  1
#define POWER_SAVE    2
	__le32 wake_up;
#define SLEEP_FALSE 0
#define SLEEP_TRUE  1	/* not used */
	__le32 receive_dtims;
#define DTIM_FALSE 0
#define DTIM_TRUE  1
} __packed;

enum power_mgmt_mode_type {
	POWER_MGMT_ACTIVE,
	POWER_MGMT_SAVE1,
	POWER_MGMT_SAVE2
};

#define	RESULT_SUCCESS            0
#define	RESULT_INVALID_PARAMETERS 1
#define	RESULT_NOT_SUPPORTED      2
/* #define	RESULT_ALREADY_RUNNING    3 */
#define	RESULT_ALREADY_RUNNING    7

struct hostif_start_request {
	struct hostif_hdr header;
	__le16 mode;
#define MODE_PSEUDO_ADHOC   0
#define MODE_INFRASTRUCTURE 1
#define MODE_AP             2	/* not used */
#define MODE_ADHOC          3
} __packed;

struct ssid {
	u8 size;
	u8 body[IEEE80211_MAX_SSID_LEN];
	u8 ssid_pad;
} __packed;

#define RATE_SET_MAX_SIZE 16
struct rate_set8 {
	u8 size;
	u8 body[8];
	u8 rate_pad;
} __packed;

struct fh_parms {
	__le16 dwell_time;
	u8 hop_set;
	u8 hop_pattern;
	u8 hop_index;
} __packed;

struct ds_parms {
	u8 channel;
} __packed;

struct cf_parms {
	u8 count;
	u8 period;
	__le16 max_duration;
	__le16 dur_remaining;
} __packed;

struct ibss_parms {
	__le16 atim_window;
} __packed;

struct rsn_t {
	u8 size;
#define RSN_BODY_SIZE 64
	u8 body[RSN_BODY_SIZE];
} __packed;

struct erp_params_t {
	u8 erp_info;
} __packed;

struct rate_set16 {
	u8 size;
	u8 body[16];
	u8 rate_pad;
} __packed;

struct ap_info {
	u8 bssid[6];	/* +00 */
	u8 rssi;	/* +06 */
	u8 sq;	/* +07 */
	u8 noise;	/* +08 */
	u8 pad0;	/* +09 */
	__le16 beacon_period;	/* +10 */
	__le16 capability;	/* +12 */
	u8 frame_type;	/* +14 */
	u8 ch_info;	/* +15 */
	__le16 body_size;	/* +16 */
	u8 body[1024];	/* +18 */
	/* +1032 */
} __packed;

struct link_ap_info {
	u8 bssid[6];	/* +00 */
	u8 rssi;	/* +06 */
	u8 sq;	/* +07 */
	u8 noise;	/* +08 */
	u8 pad0;	/* +09 */
	__le16 beacon_period;	/* +10 */
	__le16 capability;	/* +12 */
	struct rate_set8 rate_set;	/* +14 */
	struct fh_parms fh_parameter;	/* +24 */
	struct ds_parms ds_parameter;	/* +29 */
	struct cf_parms cf_parameter;	/* +30 */
	struct ibss_parms ibss_parameter;	/* +36 */
	struct erp_params_t erp_parameter;	/* +38 */
	u8 pad1;	/* +39 */
	struct rate_set8 ext_rate_set;	/* +40 */
	u8 DTIM_period;	/* +50 */
	u8 rsn_mode;	/* +51 */
#define RSN_MODE_NONE	0
#define RSN_MODE_WPA	1
#define RSN_MODE_WPA2	2
	struct {
		u8 size;	/* +52 */
		u8 body[128];	/* +53 */
	} __packed rsn;
} __packed;

#define RESULT_CONNECT    0
#define RESULT_DISCONNECT 1

struct hostif_stop_request {
	struct hostif_hdr header;
} __packed;

#define D_11B_ONLY_MODE		0
#define D_11G_ONLY_MODE		1
#define D_11BG_COMPATIBLE_MODE	2
#define D_11A_ONLY_MODE		3

#define CTS_MODE_FALSE	0
#define CTS_MODE_TRUE	1

struct hostif_request {
	__le16 phy_type;
	__le16 cts_mode;
	__le16 scan_type;
	__le16 capability;
	struct rate_set16 rate_set;
} __packed;

/**
 * struct hostif_ps_adhoc_set_request - pseudo adhoc mode
 * @capability: bit5  : preamble
 *              bit6  : pbcc - Not supported always 0
 *              bit10 : ShortSlotTime
 *              bit13 : DSSS-OFDM - Not supported always 0
 */
struct hostif_ps_adhoc_set_request {
	struct hostif_hdr header;
	struct hostif_request request;
	__le16 channel;
} __packed;

#define AUTH_TYPE_OPEN_SYSTEM 0
#define AUTH_TYPE_SHARED_KEY  1

/**
 * struct hostif_infrastructure_set_request
 * @capability: bit5  : preamble
 *              bit6  : pbcc - Not supported always 0
 *              bit10 : ShortSlotTime
 *              bit13 : DSSS-OFDM - Not supported always 0
 */
struct hostif_infrastructure_set_request {
	struct hostif_hdr header;
	struct hostif_request request;
	struct ssid ssid;
	__le16 beacon_lost_count;
	__le16 auth_type;
	struct channel_list channel_list;
	u8 bssid[ETH_ALEN];
} __packed;

/**
 * struct hostif_adhoc_set_request
 * @capability: bit5  : preamble
 *              bit6  : pbcc - Not supported always 0
 *              bit10 : ShortSlotTime
 *              bit13 : DSSS-OFDM - Not supported always 0
 */
struct hostif_adhoc_set_request {
	struct hostif_hdr header;
	struct hostif_request request;
	struct ssid ssid;
	__le16 channel;
} __packed;

/**
 * struct hostif_adhoc_set2_request
 * @capability: bit5  : preamble
 *              bit6  : pbcc - Not supported always 0
 *              bit10 : ShortSlotTime
 *              bit13 : DSSS-OFDM - Not supported always 0
 */
struct hostif_adhoc_set2_request {
	struct hostif_hdr header;
	struct hostif_request request;
	__le16 reserved;
	struct ssid ssid;
	struct channel_list channel_list;
	u8 bssid[ETH_ALEN];
} __packed;

struct association_request {
	u8 type;
	u8 pad;
	__le16 capability;
	__le16 listen_interval;
	u8 ap_address[6];
	__le16 req_ies_size;
} __packed;

struct association_response {
	u8 type;
	u8 pad;
	__le16 capability;
	__le16 status;
	__le16 association_id;
	__le16 resp_ies_size;
} __packed;

struct hostif_bss_scan_request {
	struct hostif_hdr header;
	u8 scan_type;
#define ACTIVE_SCAN  0
#define PASSIVE_SCAN 1
	u8 pad[3];
	__le32 ch_time_min;
	__le32 ch_time_max;
	struct channel_list channel_list;
	struct ssid ssid;
} __packed;

struct hostif_phy_information_request {
	struct hostif_hdr header;
	__le16 type;
#define NORMAL_TYPE	0
#define TIME_TYPE	1
	__le16 time;	/* unit 100ms */
} __packed;

enum sleep_mode_type {
	SLP_ACTIVE,
	SLP_SLEEP
};

struct hostif_sleep_request {
	struct hostif_hdr header;
} __packed;

struct hostif_mic_failure_request {
	struct hostif_hdr header;
	__le16 failure_count;
	__le16 timer;
} __packed;

#define BASIC_RATE	0x80
#define RATE_MASK	0x7F

#define TX_RATE_AUTO      0xff
#define TX_RATE_1M_FIXED  0
#define TX_RATE_2M_FIXED  1
#define TX_RATE_1_2M_AUTO 2
#define TX_RATE_5M_FIXED  3
#define TX_RATE_11M_FIXED 4

#define TX_RATE_FULL_AUTO	0
#define TX_RATE_11_AUTO		1
#define TX_RATE_11B_AUTO	2
#define TX_RATE_11BG_AUTO	3
#define TX_RATE_MANUAL_AUTO	4
#define TX_RATE_FIXED		5

/* 11b rate */
#define TX_RATE_1M	((u8)(10 / 5))	/* 11b 11g basic rate */
#define TX_RATE_2M	((u8)(20 / 5))	/* 11b 11g basic rate */
#define TX_RATE_5M	((u8)(55 / 5))	/* 11g basic rate */
#define TX_RATE_11M	((u8)(110 / 5))	/* 11g basic rate */

/* 11g rate */
#define TX_RATE_6M	((u8)(60 / 5))	/* 11g basic rate */
#define TX_RATE_12M	((u8)(120 / 5))	/* 11g basic rate */
#define TX_RATE_24M	((u8)(240 / 5))	/* 11g basic rate */
#define TX_RATE_9M	((u8)(90 / 5))
#define TX_RATE_18M	((u8)(180 / 5))
#define TX_RATE_36M	((u8)(360 / 5))
#define TX_RATE_48M	((u8)(480 / 5))
#define TX_RATE_54M	((u8)(540 / 5))

static inline bool is_11b_rate(u8 rate)
{
	return (((rate & RATE_MASK) == TX_RATE_1M) ||
		((rate & RATE_MASK) == TX_RATE_2M) ||
		((rate & RATE_MASK) == TX_RATE_5M) ||
		((rate & RATE_MASK) == TX_RATE_11M));
}

static inline bool is_ofdm_rate(u8 rate)
{
	return (((rate & RATE_MASK) == TX_RATE_6M)  ||
		((rate & RATE_MASK) == TX_RATE_12M) ||
		((rate & RATE_MASK) == TX_RATE_24M) ||
		((rate & RATE_MASK) == TX_RATE_9M)  ||
		((rate & RATE_MASK) == TX_RATE_18M) ||
		((rate & RATE_MASK) == TX_RATE_36M) ||
		((rate & RATE_MASK) == TX_RATE_48M) ||
		((rate & RATE_MASK) == TX_RATE_54M));
}

static inline bool is_11bg_rate(u8 rate)
{
	return (is_11b_rate(rate) || is_ofdm_rate(rate));
}

static inline bool is_ofdm_ext_rate(u8 rate)
{
	return (((rate & RATE_MASK) == TX_RATE_9M)  ||
		((rate & RATE_MASK) == TX_RATE_18M) ||
		((rate & RATE_MASK) == TX_RATE_36M) ||
		((rate & RATE_MASK) == TX_RATE_48M) ||
		((rate & RATE_MASK) == TX_RATE_54M));
}

enum connect_status_type {
	CONNECT_STATUS,
	DISCONNECT_STATUS
};

enum preamble_type {
	LONG_PREAMBLE,
	SHORT_PREAMBLE
};

enum multicast_filter_type {
	MCAST_FILTER_MCAST,
	MCAST_FILTER_MCASTALL,
	MCAST_FILTER_PROMISC,
};

#define NIC_MAX_MCAST_LIST 32

#define HIF_EVENT_MASK 0xE800

static inline bool is_hif_ind(unsigned short event)
{
	return (((event & HIF_EVENT_MASK) == HIF_EVENT_MASK) &&
		(((event & ~HIF_EVENT_MASK) == 0x0001) ||
		 ((event & ~HIF_EVENT_MASK) == 0x0006) ||
		 ((event & ~HIF_EVENT_MASK) == 0x000C) ||
		 ((event & ~HIF_EVENT_MASK) == 0x0011) ||
		 ((event & ~HIF_EVENT_MASK) == 0x0012)));
}

static inline bool is_hif_conf(unsigned short event)
{
	return (((event & HIF_EVENT_MASK) == HIF_EVENT_MASK) &&
		((event & ~HIF_EVENT_MASK) > 0x0000) &&
		((event & ~HIF_EVENT_MASK) < 0x0012) &&
		!is_hif_ind(event));
}

#ifdef __KERNEL__

#include "ks_wlan.h"

/* function prototype */
int hostif_data_request(struct ks_wlan_private *priv, struct sk_buff *skb);
void hostif_receive(struct ks_wlan_private *priv, unsigned char *p,
		    unsigned int size);
void hostif_sme_enqueue(struct ks_wlan_private *priv, u16 event);
int hostif_init(struct ks_wlan_private *priv);
void hostif_exit(struct ks_wlan_private *priv);
int ks_wlan_hw_tx(struct ks_wlan_private *priv, void *p, unsigned long size,
		  void (*complete_handler)(struct ks_wlan_private *priv,
					   struct sk_buff *skb),
		  struct sk_buff *skb);
void send_packet_complete(struct ks_wlan_private *priv, struct sk_buff *skb);

void ks_wlan_hw_wakeup_request(struct ks_wlan_private *priv);
int ks_wlan_hw_power_save(struct ks_wlan_private *priv);

#define KS7010_SIZE_ALIGNMENT	32

static inline size_t hif_align_size(size_t size)
{
	return ALIGN(size, KS7010_SIZE_ALIGNMENT);
}

#endif /* __KERNEL__ */

#endif /* _KS_HOSTIF_H_ */
