/*SH0
*******************************************************************************
**                                                                           **
**         Copyright (c) 2011-2013 Quantenna Communications, Inc             **
**                            All Rights Reserved                            **
**                                                                           **
*******************************************************************************
EH0*/

#ifndef _QVSP_DRV_H_
#define _QVSP_DRV_H_

#ifdef CONFIG_QVSP

#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/ip.h>

#include <net80211/if_ethersubr.h>

#include "qtn/qvsp_data.h"
#include "qtn/shared_defs.h"

#define QVSP_BA_THROT_TIMER_INTV	25	/* unit: ms */

struct qvsp_s;
struct qvsp_strm;
struct qvsp_ext_s;
struct ieee80211_node;
struct qdrv_wlan;

enum qdrv_vsp_check_type {
	QDRV_VSP_CHECK_ENABLE,
};

#define QVSP_CHECK_FUNC_PROTOTYPE(_fn)			\
	int (_fn)(struct qvsp_ext_s *qvsp,		\
			enum qvsp_if_e qvsp_if,		\
			struct sk_buff *skb,		\
			void *data_start,		\
			uint32_t pktlen,		\
			uint8_t ac)

typedef void (*_fn_qvsp_inactive_flags_changed_handler)(struct qvsp_ext_s *qvsp_ext);

/* This definition must be kept in sync with QVSP_INACTIVE_REASON */
struct qvsp_ext_s {

#define QVSP_INACTIVE_CFG	0x00000001
#define QVSP_INACTIVE_WDS	0x00000002
#define QVSP_INACTIVE_COC	0x00000004
	uint32_t				inactive_flags;
	_fn_qvsp_inactive_flags_changed_handler	flags_changed;
};

struct qvsp_wrapper {
	struct qvsp_ext_s	*qvsp;
	QVSP_CHECK_FUNC_PROTOTYPE(*qvsp_check_func);
};

static inline void
__qvsp_inactive_flag_update(struct qvsp_ext_s *qvsp_ext, uint32_t flag, int set)
{
	unsigned long irq_flags;
	unsigned long old_flags;
	unsigned long update = 0;

	if (qvsp_ext && flag) {
		local_irq_save(irq_flags);

		old_flags = qvsp_ext->inactive_flags;
		if (set) {
			qvsp_ext->inactive_flags |= flag;
		} else {
			qvsp_ext->inactive_flags &= ~flag;
		}

		local_irq_restore(irq_flags);

		update = ((old_flags == 0) != (qvsp_ext->inactive_flags == 0));
		if (update && qvsp_ext->flags_changed) {
			qvsp_ext->flags_changed(qvsp_ext);
		}
	}
}

#define qvsp_inactive_flag_set(_qvsp, _flag) \
		__qvsp_inactive_flag_update((struct qvsp_ext_s *)(_qvsp), (_flag), 1)

#define qvsp_inactive_flag_clear(_qvsp, _flag) \
		__qvsp_inactive_flag_update((struct qvsp_ext_s *)(_qvsp), (_flag), 0)

static __always_inline int
__qvsp_is_active(struct qvsp_ext_s *qvsp_ext)
{
	return (qvsp_ext && (qvsp_ext->inactive_flags == 0));
}
#define qvsp_is_active(_qvsp)  __qvsp_is_active((struct qvsp_ext_s *)(_qvsp))

static __always_inline int
__qvsp_is_enabled(struct qvsp_ext_s *qvsp_ext)
{
	return (qvsp_ext && ((qvsp_ext->inactive_flags & QVSP_INACTIVE_CFG) == 0));
}
#define qvsp_is_enabled(_qvsp) \
		__qvsp_is_enabled((struct qvsp_ext_s *)(_qvsp))



int qvsp_strm_check_add(struct qvsp_s *qvsp, enum qvsp_if_e qvsp_if, struct ieee80211_node *ni,
			struct sk_buff *skb, struct ether_header *eh, struct iphdr *iphdr_p,
			int pktlen, uint8_t ac, int32_t tid);
void qvsp_cmd_strm_state_set(struct qvsp_s *qvsp, uint8_t strm_state,
			const struct ieee80211_qvsp_strm_id *strm_id, struct ieee80211_qvsp_strm_dis_attr *attr);
void qvsp_cmd_vsp_configure(struct qvsp_s *qvsp, uint32_t index, uint32_t value);
void qvsp_cmd_vsp_cfg_set(struct qvsp_s *qvsp, uint32_t index, uint32_t value);
int qvsp_cmd_vsp_cfg_get(struct qvsp_s *qvsp, uint32_t index, uint32_t *value);
void qvsp_fat_set(struct qvsp_s *qvsp, uint32_t fat, uint32_t intf_ms, uint8_t chan);
void qvsp_node_del(struct qvsp_s *qvsp, struct ieee80211_node *ni);
void qvsp_reset(struct qvsp_s *qvsp);
void qvsp_change_stamode(struct qvsp_s *qvsp, uint8_t stamode);
int qvsp_netdbg_init(struct qvsp_s *qvsp,
		void (*cb_logger)(void *token, void *vsp_data, uint32_t size),
		uint32_t interval);
void qvsp_netdbg_exit(struct qvsp_s *qvsp);
void qvsp_disable(struct qvsp_s *qvsp);
struct qvsp_s *qvsp_init(int (*ioctl_fn)(void *token, uint32_t param, uint32_t value),
			void *ioctl_fn_token, struct net_device *dev, uint8_t stamode,
			void (*cb_cfg)(void *token, uint32_t index, uint32_t value),
			void (*cb_strm_ctrl)(void *token, struct ieee80211_node *ni, uint8_t strm_state,
				struct ieee80211_qvsp_strm_id *strm_id, struct ieee80211_qvsp_strm_dis_attr *attr),
			void (*cb_strm_ext_throttler)(void *token, struct ieee80211_node *node,
				uint8_t strm_state, const struct ieee80211_qvsp_strm_id *strm_id,
				struct ieee80211_qvsp_strm_dis_attr *attr, uint32_t throt_intvl),
			uint32_t ieee80211node_size, uint32_t ieee80211vap_size
			);
void qvsp_exit(struct qvsp_s **qvsp, struct net_device *dev);

void qvsp_wrapper_init(struct qvsp_ext_s *qvsp_ext, QVSP_CHECK_FUNC_PROTOTYPE(fn));
void qvsp_wrapper_exit(void);
void qvsp_node_init(struct ieee80211_node *ni);

void qvsp_3rdpt_register_cb(struct qvsp_s *qvsp,
		void *wme_token,
		int (*cb_3rdpt_get_method)(struct ieee80211_node *ni, uint8_t *throt_session_dur, uint8_t *throt_winsize),
		int (*cb_ba_throt)(struct ieee80211_node *ni, int32_t tid, int intv, int dur, int win_size),
		int (*cb_wme_throt)(void *qw, uint32_t ac, uint32_t enable,
					uint32_t aifs, uint32_t cwmin, uint32_t cwmax, uint32_t txoplimit,
					uint32_t add_qwme_ie)
		);

#if TOPAZ_QTM
void qvsp_strm_tid_check_add(struct qvsp_s *qvsp, struct ieee80211_node *ni, uint8_t node, uint8_t tid,
		uint32_t pkts, uint32_t bytes, uint32_t sent_pkts, uint32_t sent_bytes);
#endif
#endif /* CONFIG_QVSP */

#endif
