/**
  Copyright (c) 2008 - 2013 Quantenna Communications Inc
  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, write to the Free Software
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

 **/

#ifndef _QDRV_CONTROL_H
#define _QDRV_CONTROL_H

#include <linux/seq_file.h>
#include "qdrv_mac.h"
#include "qdrv_wlan.h"

int qdrv_radar_is_test_mode(void);
int qdrv_radar_test_mode_csa_en(void);

int qdrv_get_wps_push_button_config( u8 *p_gpio_pin, u8 *p_use_interrupt, u8 *p_active_logic );
void set_wps_push_button_enabled( void );

void qdrv_control_txbf_pkt_send(void *data, u8 *stvec, u32 bw);
void qdrv_control_sysmsg_send(void *data, char *sysmsg, u_int32_t len, int send_now);
void qdrv_control_sysmsg_timer(unsigned long data);

int qdrv_control_init(struct device *dev);
int qdrv_control_exit(struct device *dev);
int qdrv_control_output(struct device *dev, char *buf);
int qdrv_control_input(struct device *dev, char *buf, unsigned int count);
void qdrv_control_set_show(void (*fn)(struct seq_file *s, void *data, u32 num),
	void *data, int start_num, int decr);
int qdrv_command_read_rf_reg(struct device *dev, int offset);
int qdrv_parse_mac(const char *mac_str, u8 *mac);
void qdrv_pktlogger_flush_data(struct qdrv_wlan *qw);
void qdrv_calcmd_set_tx_power(struct device *dev, uint8_t value);

enum
{
	GET_MAC_ADDRESS1 = 0,
	VCO_CALIBRATION,
	IQ_COMP_CALIBRATION,
	DC_OFFSET_CALIBRATION,
	GET_AP_INFO,
	GET_PHY_INFO,
	SET_MAC_ADDRESS,
	GET_VERSION,
	SET_TXONLY_MODE,
	SET_AFE_PATTERN = 9,
	GET_MAC_ADDRESS,
	GET_CHIP_ID,
	MAX_CMD
};

typedef struct qdrv_event {
	char *str;
	u32 jiffies;
	u32 clk;
	int arg1;
	int arg2;
	int arg3;
	int arg4;
	int arg5;
} qdrv_event_t;

#define QDRV_EVENT_LOG_SIZE	1024
#define QDRV_EVENT_LOG_MASK	(QDRV_EVENT_LOG_SIZE - 1)

enum {

	EXT_TEMPERATURE_SENSOR_REPORT_FLAG = 0x11111111,
	DISABLE_REPORT_FLAG  = 0x22222222
};

void qdrv_event_log(char *str, int arg1, int arg2, int arg3, int arg4, int arg5);
int qdrv_eventf(struct net_device *dev, const char *fmt, ...);
void qdrv_control_dump_active_hwreg(void);

// convenience functions
#define QDRV_EVENT(x)			(qdrv_event_log(x,0,0,0,0,0))
#define QDRV_EVENT_1(x,a)		(qdrv_event_log(x,a,0,0,0,0))
#define QDRV_EVENT_2(x,a,b)		(qdrv_event_log(x,a,b,0,0,0))
#define QDRV_EVENT_3(x,a,b,c)		(qdrv_event_log(x,a,b,c,0,0))
#define QDRV_EVENT_4(x,a,b,c,d)		(qdrv_event_log(x,a,b,c,d,0))
#define QDRV_EVENT_5(x,a,b,c,d,e)	(qdrv_event_log(x,a,b,c,d,e))

/* MU related cmds */
typedef enum {
	QDRV_MU_CMD_SET = 0,
	QDRV_MU_CMD_GET = 1,
	QDRV_MU_CMD_DBG = 2,
	QDRV_MU_CMD_CLR = 3,
	QDRV_MU_CMD_FIRST_IN_GROUP_SELECTION = 4,
} qdrv_mu_cmd;

typedef enum {
	QDRV_MU_SUBMD_GRP = 0,
} qdrv_mu_subcmd;
#endif

extern int qdrv_copy_core_dump(void *buf, uint32_t len, uint32_t *len_copied);
