/******************************************************************************
 *
 * Copyright(c) 2019 - 2020 Realtek Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * 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.
 *
 *****************************************************************************/
#ifndef __PHL_BTC_DEF_H__
#define __PHL_BTC_DEF_H__

#define RTW_PHL_BTC_CTRL_BUF 40
#define RTW_PHL_BTC_FWINFO_BUF 1280


/*****************************************
 * Please contact the member of BTC submodule if you
 * need to revise this section
 *****************************************/
#define RTW_BTINFO_MAXLEN 10
#define RTW_SCBD_MAXLEN 10

#define BTC_C2H_CAT 2 /* C2H Category for OutSrc */
#define BTC_CLASS_MIN 0x10
#define BTC_CLASS_FEV 0x12
#define BTC_CLASS_MAX 0x17

enum {
	BTC_FEV_REPORT = 0,
	BTC_FEV_BT_INFO = 1,
	BTC_FEV_BT_SCBD = 2,
	BTC_FEV_BT_REG = 3
};
/*****************************************/

enum {
	BTC_HMSG_TMR_EN = 0x0,
	BTC_HMSG_BT_REG_READBACK = 0x1,
	BTC_HMSG_SET_BT_REQ_SLOT = 0x2,
	BTC_HMSG_FW_EV = 0x3,
	BTC_HMSG_BT_LINK_CHG = 0x4,
	BTC_HMSG_MAX
};

enum {
	BTC_CTRL_TYPE_MANUAL,
	BTC_CTRL_TYPE_EN_REPORT,
	BTC_CTRL_TYPE_SET_SLOTS,
	BTC_CTRL_TYPE_SET_MREGS,
	BTC_CTRL_TYPE_SET_TDMA,
	BTC_CTRL_TYPE_SET_1SLOT,
	BTC_CTRL_TYPE_SET_POLICY,
	BTC_CTRL_TYPE_SET_GPIO_DBG,
	BTC_CTRL_TYPE_SEND_HUB_MSG,
	BTC_CTRL_TYPE_TEST,
	BTC_CTRL_TYPE_MAX
};

enum {
	BTC_TIMER_PERIODIC,
	BTC_TIMER_WL_SPECPKT,
	BTC_TIMER_WL_RFKTO,
	BTC_TIMER_BT_A2DPPLAY,
	BTC_TIMER_MAX
};

enum RTW_PHL_BTC_CTRL_TYPE {
	PHL_BTC_CTRL_MANUAL,
	PHL_BTC_CTRL_MAX
};

enum {
	PHL_BTC_CNTFY_BTINFO,
	PHL_BTC_CNTFY_MAX
};

enum PHL_BTC_NTFY_REASON {
	PHL_BTC_NTFY_RSN_PERIOTIC
};

enum RTW_PHL_BTC_NOTIFY {
	PHL_BTC_NTFY_SCAN_START,
	PHL_BTC_NTFY_SCAN_STOP,
	PHL_BTC_NTFY_COEX_INFO,
	PHL_BTC_NTFY_ROLE_INFO,
	PHL_BTC_NTFY_CTRL,
	PHL_BTC_NTFY_FWINFO,
	PHL_BTC_NTFY_RADIO_STATE,
	PHL_BTC_NTFY_WLSTA,
	PHL_BTC_NTFY_PACKET_EVT,
	PHL_BTC_NTFY_TIMER,
	PHL_BTC_NTFY_MAX
};

enum {
	BTC_MODE_NORMAL,
	BTC_MODE_WL,
	BTC_MODE_BT,
	BTC_MODE_WLOFF,
	BTC_MODE_MAX
};

enum {
	BTC_RFCTRL_WL_OFF,
	BTC_RFCTRL_WL_ON,
	BTC_RFCTRL_LPS_WL_ON,
	BTC_RFCTRL_FW_CTRL,
	BTC_RFCTRL_MAX
};

struct rtw_phl_btc_ops {
	void (*print)(const char *msg);
};

struct rtw_phl_btc_coex_info_param {
	u8 query_type;
};

struct rtw_phl_btc_role_info_param {
	u8 role_id;
	enum role_state rstate;
};

struct rtw_phl_btc_wl_sta_param {
	u8 role_id;
	u16 mac_id;
	u8 reason;
};

struct rtw_phl_btc_pkt_param {
	u8 role_id;
	u8 pkt_evt_type;
};

struct rtw_phl_btc_ctrl_param {
	u8 type;
	u16 len;
	u8 buf[RTW_PHL_BTC_CTRL_BUF];
};

struct rtw_phl_btc_fwinfo_param {
	u8 c2h_class;
	u8 c2h_func;
};

struct rtw_phl_btc_radio_state_param {
	u8 rf_on;
};

struct rtw_phl_btc_tmr_param {
	void *timer;
};

struct rtw_phl_btc_ntfy {
	enum RTW_PHL_BTC_NOTIFY notify;
	struct rtw_phl_btc_ops *ops;

	/* real parameter for different notifications */
	union {
		struct rtw_phl_btc_coex_info_param cinfo;
		struct rtw_phl_btc_role_info_param rinfo;
		struct rtw_phl_btc_ctrl_param ctrl;
		struct rtw_phl_btc_radio_state_param rfst;
		struct rtw_phl_btc_fwinfo_param finfo;
		struct rtw_phl_btc_wl_sta_param wsta;
		struct rtw_phl_btc_pkt_param pkt;
		struct rtw_phl_btc_tmr_param tmr;
	} u;

	void *priv;
	int (*ntfy_cb)(void *priv, enum RTW_PHL_BTC_NOTIFY ntfy,
		struct rtw_phl_btc_ntfy *info);
};

#endif /* __PHL_BTC_DEF_H__ */
