/**
  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_WLAN_H
#define _QDRV_WLAN_H

#include <linux/version.h>
#include <linux/interrupt.h>
#include "../../../../net/bridge/br_public.h"

/* Include the WLAN 802.11 layer here */
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <linux/i2c.h>
#include <linux/workqueue.h>
#include <net/ip.h>
#include <net80211/if_media.h>
#include <net80211/ieee80211_var.h>
#include "qdrv_comm.h"
#include "qdrv_debug.h"
#include "qtn/qtn_pcap.h"
#include "qdrv_bridge.h"
#include "qtn/muc_txrx_stats.h"
#include "qtn/muc_phy_stats.h"
#include "qtn/dsp_stats.h"
#include "qtn/auc_debug_stats.h"
#include "qtn/skb_recycle.h"
#include "qtn/qdrv_sch_data.h"
#include "qtn/iputil.h"
#ifdef CONFIG_QVSP
#include "qtn/qvsp.h"
#endif
#include "qtn/topaz_congest_queue.h"
#include <qtn/txbf_common.h>
#include <qtn/lhost_muc_comm.h>

#define QNET_TXLIST_ENTRIES_DEFAULT 512
#define QNET_TXLIST_ENTRIES_MAX 2048
#define QNET_TXLIST_ENTRIES_MIN 1
#define QNET_HLRING_ENTRIES 32
#define QDRV_NUM_RF_STREAMS IEEE80211_QTN_NUM_RF_STREAMS

#define RSSI_40M_TO_20M_DBM(x)		(x - 3)
#define RSSI_20M_TO_40M_DBM(x)		(x + 3)
#define RSSI_TOTAL_TO_PERCHAIN_DBM(x)	(x - 6)
#define RSSI_PERCHAIN_TO_TOTAL_DBM(x)	(x + 6)
#define LINK_MARGIN_INVALID		(-127)

enum qdrv_bld_type {
	QDRV_BLD_TYPE_ENG = 1,
	QDRV_BLD_TYPE_BENCH,
	QDRV_BLD_TYPE_BUILDBOT,
	QDRV_BLD_TYPE_REL,
	QDRV_BLD_TYPE_SDK,
	QDRV_BLD_TYPE_GPL
};

struct qdrv_vap;

/* driver-specific node state */
struct qdrv_node
{
	struct ieee80211_node qn_node;  /* Must be first for the 802.11 layer */
	struct kobject kobj;
	TAILQ_ENTRY(qdrv_node) qn_next;
	uint16_t qn_node_idx;		/* a copy of ni_node_idx */
};

#define MAX_MEMDEBUG_WATCHPTS	64
struct qdrv_memdebug_watchpt {
	uint32_t	addr;
	void	*remap_addr;
	size_t	size;
};

#include "qdrv_slab_def.h"

struct qdrv_meminfo {
	struct kmem_cache *caches[QDRV_SLAB_IDX_MAX];
};

struct qtn_auc_stat_field {
	uintptr_t addr;
	const char *name;
};

struct qdrv_auc_intr_stats {
	uint32_t sleep;
	uint32_t jiffies;
	uint32_t aucirq[AUC_TID_NUM];
};

struct qdrv_pktlogger_stats {
	uint32_t pkt_queued;
	uint32_t pkt_dropped;
	uint32_t pkt_failed;
	uint32_t pkt_requeued;
	uint32_t queue_send;
};

struct qdrv_pktlogger {
	struct qdrv_wlan *qw;
	struct net_device *dev;
	__be32 dst_ip;
	__be32 src_ip;
	__be16 dst_port;
	__be16 src_port;
	uint8_t dst_addr[IEEE80211_ADDR_LEN];
	uint8_t src_addr[IEEE80211_ADDR_LEN];
	uint8_t recv_addr[IEEE80211_ADDR_LEN];
	uint32_t maxfraglen;
	uint32_t flag;
	uint16_t ip_id;

	spinlock_t sendq_lock;
	STAILQ_HEAD(,qdrv_pktlogger_data) sendq_head;
	struct work_struct sendq_work;
	int sendq_scheduled;

	struct sock *netlink_socket;
	int netlink_ref;

	struct timer_list stats_timer;
	struct timer_list mem_timer;
	int mem_wp_index;
	struct qdrv_memdebug_watchpt mem_wps[MAX_MEMDEBUG_WATCHPTS];

	struct timer_list rate_timer;
	struct timer_list sysmsg_timer;
	struct timer_list flush_data;

	uint32_t *stats_uc_rx_ptr;
	uint32_t *stats_uc_rx_rate_ptr;
	uint32_t *stats_uc_rx_bf_ptr;
	uint32_t *stats_uc_tx_ptr;
	uint32_t *stats_uc_tx_rate_ptr;
	uint32_t *stats_uc_su_rates_read_ptr;
	uint32_t *stats_uc_mu_rates_read_ptr;
	uint32_t *stats_uc_scs_cnt;
	struct netdev_queue *netdev_q_ptr_w;
	struct netdev_queue *netdev_q_ptr_e;
	struct qdrv_meminfo qmeminfo;
	uint32_t queue_len;
	struct qdrv_pktlogger_stats stats;

	struct net_device *dev_emac0;
	struct net_device *dev_emac1;

	uint32_t *stats_auc_sleep_p;
	uint32_t *stats_auc_jiffies_p;
	uint32_t *stats_auc_intr_p;
	struct auc_dbg_counters *stats_auc_dbg_p;

	struct muc_rx_rates rx_rates[2];
	struct muc_rx_rates *rx_rate_pre;
	struct muc_rx_rates *rx_rate_cur;

	struct muc_rx_rates rx_ratelog[2];
	struct muc_rx_rates *rx_ratelog_pre;
	struct muc_rx_rates *rx_ratelog_cur;
	struct timer_list phy_stats_timer;
	struct timer_list dsp_stats_timer;
};

/**********/
/** SCAN **/
/**********/

struct host_scanif
{
	struct workqueue_struct *workqueue;
	u32 scan_sem_bit;
	u32 tx_sem_bit;
	volatile u32 *sc_res_mbox;
	volatile u32 *sc_req_mbox;
};

/**********/
/** RX   **/
/**********/

struct host_fifo_if
{
	struct host_descfifo *fifo;
	dma_addr_t fifo_dma;
	struct host_rxdesc *pending;
	struct host_rxdesc **descp;
	int ring_size;
	struct dma_pool *df_rxdesc_cache;
};

#define QNET_RXRING_ENTRIES		64
#define QNET_MGMTRING_ENTRIES	4
#define QNET_CTRLRING_ENTRIES	4
#define QNET_ERRRING_ENTRIES	4

struct host_rxif
{
	struct host_fifo_if rx;
	u32 rx_sem_bit;
};

#define QNET_RXRING_SIZE (QNET_RXRING_ENTRIES*sizeof(struct host_rxdesc))
#define QNET_RXBUF_SIZE (QNET_RXRING_ENTRIES*sizeof(struct host_buf))

/**********/
/** TX   **/
/**********/

#define QDRV_TXDESC_DATA		0
#define QDRV_TXDESC_MGMT		1
#define QDRV_TXDESC_QUEUE_MAX		2

/* each node is always allowed this many descriptors */
#define QDRV_TXDESC_THRESH_MAX_MIN	384
/* re-enable a node queue when muc_queued is this much less than max per node */
#define QDRV_TXDESC_THRESH_MIN_DIFF	32

struct host_txif
{
	uint16_t txdesc_cnt[QDRV_TXDESC_QUEUE_MAX];
	uint16_t list_max_size;
	uint16_t muc_thresh_high;
	uint16_t muc_thresh_low;
	struct tasklet_struct txdone_tasklet;

	struct host_ioctl *hl_ring;
	struct host_ioctl *hl_first;
	struct host_ioctl *hl_last;
	dma_addr_t hl_ring_dma;
	int hl_read;
	int hl_write;
	int hl_tosend;
	u32 hl_count;
	spinlock_t hl_flowlock;

	struct dma_pool *df_txdesc_cache;

	struct lhost_txdesc *df_txdesc_list_head;
	struct lhost_txdesc *df_txdesc_list_tail;

	volatile u32 *tx_mbox;
};

#define QNET_HLRING_SIZE (QNET_HLRING_ENTRIES*sizeof(struct host_ioctl))

/**********/
/** WLAN **/
/**********/

#define HOST_TXD_VERSION	0x01
#define CCA_TOKEN_INIT_VAL	0x50
#define QTN_RATE_11N		0x80    /* Same bit setting as in MLME */

#define QTN_RATE_PHY_OFDM	0
#define QTN_RATE_PHY_CCK	1
#define QTN_RATE_PHY_HT		2

struct qtn_rateentry
{
	u_int8_t re_ieeerate;    /* IEEE rate:2*phyrate (for legacy MLME)
							* or MCS index for 11n */
	u_int16_t   re_rate;    /* Rate in 100Kbps */
	u_int8_t    re_ctrlrate;    /* index in rate table of control
                       rate to use with this rate */
	u_int8_t    re_shortpre:1;  /* Must use short preamble */
	u_int8_t    re_basicrate:1; /* Is this rate a basic rate */
	u_int8_t    re_phytype:2;   /* Phy type */
} __packed;

struct qtn_ratetable
{
	u_int8_t        rt_num;     /* Number of entries (legacy + 11n) in the rate table */
	u_int8_t        rt_legacy_num;     /* Number of legacy entries in the rate table */
	struct qtn_rateentry    *rt_entries;    /* Array of entries */
} __packed;

struct qtn_channel
{
	u_int16_t channel_number;	/* IEEE channel number */
	u_int16_t channel_freq;		/* Channel frequency */
	u_int32_t channel_flags;	/* Channel flags */
	u_int16_t center_freq_40M;	/* Channel Center Frequency for 40MHz */
	u_int16_t center_freq_80M;	/* Channel Center Frequency for 80MHz */
	u_int16_t center_freq_160M;	/* Channel Center Frequency for 160MHz */
	u_int32_t channel_ext_flags;	/* Extra channel flags for 80MHZ mode */
} __packed;

#define QDRV_STAT(_qw, _is_tx, _member)	do	\
{						\
	if (_is_tx) {				\
		_qw->tx_stats._member++;	\
	} else {				\
		_qw->rx_stats._member++;	\
	}					\
} while (0)

#define TXSTAT(qw, member) \
	(qw)->tx_stats.member += 1

#define TXSTAT_SET(qw, member, val) \
	(qw)->tx_stats.member = (val)

#define RXSTAT(qw, member) \
	(qw)->rx_stats.member += 1

#define RXSTAT_SET(qw, member, val) \
	(qw)->rx_stats.member = (val)

#define SMSTAT(qw, member) \
	(qw)->sm_stats.member += 1

/* #define QDRV_TX_DEBUG 1 */
#ifdef QDRV_TX_DEBUG

extern uint32_t qdrv_tx_ctr[];
extern uint32_t qdrv_dbg_ctr[];
#define QDRV_TX_CTR_INC(_x)	qdrv_tx_ctr[_x]++;

#define QDRV_TX_DBG(_i, _ni, _fmt, ...) do			\
{								\
	struct ieee80211_node *__ni = _ni;			\
	if (_i >= 0) {						\
		if (qdrv_dbg_ctr[_i] == 0) {			\
			break;					\
		}						\
		qdrv_dbg_ctr[_i]--;				\
	}							\
	if (__ni) {						\
		printk("[%s]", ether_sprintf(__ni->ni_macaddr));\
	}							\
	printk("%s " _fmt,					\
		__func__, ##__VA_ARGS__);			\
} while (0)

#else

#define QDRV_TX_CTR_INC(_x)
#define QDRV_TX_DBG(_i, _ni, _fmt, ...) if (_ni) {}

#endif /* QDRV_TX_DEBUG */

/**
 * \defgroup LHOST_STATS Linux host generated stats
 */
/* @{ */

/**
 * \brief 802.11 state machine statistics.
 *
 * These statistics are updated as 802.11 management packets are sent and received
 * by both the AP and STA.
 */
struct qdrv_wlan_sm_stats {
	/**
	 * The number of times that the state machine went from trying to authenticate
	 * directly back to scanning - i.e. the AUTH request timed out or was rejected.
	 */
	unsigned int sm_scan_auth_fail_scan_pend;

	/**
	 * The number of times that the state machine went from trying to associate
	 * directly back to scanning - i.e. the ASSOC request timed out or was rejected.
	 */
	unsigned int sm_scan_assoc_fail_scan_pend;

	/**
	 * The number of times that a scan has been triggered (excluding failure to connect).
	 */
	unsigned int sm_scan_pend;

	/**
	 * The number of times that an authentication request is sent, waiting on response.
	 */
	unsigned int sm_auth_pend;

	/**
	 * The number of times that a deauth sequence is sent (i.e. going from authenticated
	 * to disconnected state).
	 */
	unsigned int sm_run_deauth_auth_pend;

	/**
	 * The number of times that an association request is sent, waiting on response.
	 */
	unsigned int sm_assoc_pend;

	/**
	 * The number of times that a disassociate sequence is sent (i.e. going from
	 * associated to authenticated state).
	 */
	unsigned int sm_run_disassoc_assoc_pend;

	/**
	 * The number of times a node is authenticated - i.e. becomes ready to send data packets.
	 */
	unsigned int sm_nd_auth;

	/**
	 * The number of times a node is unauthenticated.
	 */
	unsigned int sm_nd_unauth;

	/**
	 * The total number of nodes that are currently authenticated.
	 */
	unsigned int sm_nd_auth_tot;

	/**
	 * The number of times a station goes into connected state - i.e. ready to send data
	 * packets.
	 */
	unsigned int sm_sta_associated;

	/**
	 * The state of the device - composite of flags indicating current operating mode and
	 * radar flags.
	 */
	unsigned int sm_state;
#define QDRV_WLAN_SM_STATE_AP          0x00000001
#define QDRV_WLAN_SM_STATE_STA         0x00000002
#define QDRV_WLAN_SM_STATE_RADAR_EN    0x00000004
#define QDRV_WLAN_SM_STATE_RADAR_ACT   0x00000008
#define QDRV_WLAN_SM_STATE_CAC_ACTIVE  0x00000010
#define QDRV_SET_SM_FLAG(_stats, _flag) (_stats).sm_state |= (_flag)
#define QDRV_CLEAR_SM_FLAG(_stats, _flag) (_stats).sm_state &= ~(_flag)
};

/**
 * \brief WLAN transmit statistics.
 *
 * These statistics are gathered within the WLAN driver on the LHost.
 */
struct qdrv_wlan_tx_stats {
	/**
	 * The total number of management frames enqueued for transmission.
	 */
	unsigned int tx_enqueue_mgmt;

	/**
	 * The total number of driver-generated data frames enqueued for transmission.
	 */
	unsigned int tx_enqueue_80211_data;

	/**
	 * The total number of data packets enqueued for transmission.
	 */
	unsigned int tx_enqueue_data;

	/**
	 * The total number of packets enqueued to the MuC via the mailbox.
	 */
	unsigned int tx_muc_enqueue;

	/**
	 * The number of data packets enqueued to the MuC via the host mailbox (when no current
	 * packets are in the mailbox).
	 */
	unsigned int tx_muc_enqueue_mbox;

	/**
	 * The total number of keep-alive (NULL data) packets transmitted to clients
	 * associated to the AP. These packets are used to check the client is still
	 * connected and able to ACK the AP.
	 */
	unsigned int tx_null_data;

	/**
	 * The number of TX done interrupts received indicating the MuC is not ready.
	 * This figure should always read as zero.
	 */
	unsigned int tx_done_muc_ready_err;

	/**
	 * The number of packets successfully sent (all data, mgmt for all TIDs).
	 */
	unsigned int tx_done_success;

	/**
	 * The number of txdone interrupts received at the LHost.
	 */
	unsigned int tx_done_enable_queues;

	/**
	 * The number of times the transmit queue has stopped.
	 * Generally this is because the MuC backs up and causes backpressure to the
	 * LHost.
	 */
	unsigned int tx_queue_stop;

	/**
	 * The number of times a packet to the MuC was requeued.
	 */
	unsigned int tx_requeue;

	/**
	 * The number of times packet requeuing failed.
	 */
	unsigned int tx_requeue_err;

	/**
	 * The number of times the hardstart function is called.
	 */
	unsigned int tx_hardstart;

	/**
	 * The number of packets completed - marked as done by the MuC.
	 */
	unsigned int tx_complete;

	/**
	 * The size of the skb recycle list shared between the Ethernet and wireless drivers.
	 *
	 * This number will vary as traffic goes through the system.
	 */
	unsigned int tx_min_cl_cnt;

	/**
	 * The number of packets dropped in the driver during a configuration change.
	 */
	unsigned int tx_dropped_config;

	/**
	 * The number of packets dropped in the driver due to the MAC not being enabled.
	 */
	unsigned int tx_dropped_mac_dead;

	/**
	 * The current transmit channel.
	 */
	unsigned int tx_channel;

	/**
	 * The total number of IGMP packets for transmission.
	 */
	unsigned int tx_igmp;

	/**
	 * The number of packets for transmission to unknown destination MAC addresses.
	 */
	unsigned int tx_unknown;

	/**
	 * The number of ARP request packets sent in attempts to discover the location of
	 * unknown destinations.
	 */
	unsigned int tx_arp_req;

	/**
	 * The number of packets transmitted that lie inside the Local Network Control Block
	 * (LNCB), the range 224.0.0.0/24, sent as four address (reliable) multicast
	 * packets to Quantenna bridge stations.
	 */
	unsigned int tx_copy4_mc;

	/**
	 * The number of IGMP packets transmitted as 4 address reliable multicast packets
	 * to Quantenna bridge stations.
	 */
	unsigned int tx_copy4_igmp;

	/**
	 * The number of packets for unknown destination MAC addresses sent as 4 address
	 * reliable multicast packets to bridge stations.
	 */
	unsigned int tx_copy4_unknown;

	/**
	 * The total count of packet retransmissions as reliable, 4 address multicast frames.
	 */
	unsigned int tx_copy4;

	/**
	 * The number of times transmission of a copied packet failed due to lack of
	 * resources.
	 */
	unsigned int tx_copy_fail;

	/**
	 * The number of times transmission of a 4 address packet failed due to the tx
	 * queue being full.
	 */
	unsigned int tx_copy4_busy;

	/**
	 * The number of packets transmitted that lie inside the Local Network Control Block
	 * (LNCB), the range 224.0.0.0/24, sent as three address (unreliable) multicast
	 * packets (to third party clients).
	 */
	unsigned int tx_copy3_mc;

	/**
	 * The number of IGMP packets transmitted as 3 address unreliable multicast
	 * packets (to third party clients).
	 */
	unsigned int tx_copy3_igmp;

	/**
	 * The number of broadcast or multicast packets transmitted as unicast frames.
	 */
	unsigned int tx_copy_uc;

	/**
	 * The number of 3 address broadcast/multicast packets sent to third party STAs.
	 */
	unsigned int tx_copy3;

	/**
	 * The number of broadcast/multicast packets transmitted as group-addressed frames.
	 */
	unsigned int tx_copy_mc;

	/**
	 * The number of broadcast/multicast packets transmitted as group-addressed frames.
	 */
	unsigned int tx_copy_mc_enc;

	/**
	 * The number of broadcast/multicast packets transmitted as directed frames
	 */
	unsigned int tx_copy_mc_to_uc;

	/**
	 * The number of SSDP packets transmitted as directed frames
	 */
	unsigned int tx_copy_ssdp;

	/**
	 * The number of packets that were dropped because the destination station was not
	 * authorised.
	 */
	unsigned int tx_drop_auth;

	/**
	 * The number of packets that were dropped because the destination station had
	 * disassociated.
	 */
	unsigned int tx_drop_aid;

	/**
	 * The number of packets that were dropped because of buffer exhaustion.
	 */
	unsigned int tx_drop_nodesc;

	/**
	 * The number of packets that were dropped because the WDS peer was not
	 * associated.
	 */
	unsigned int tx_drop_wds;

	/**
	 * The number of packets that were dropped because of 3 address mode bridging
	 * rules.
	 */
	unsigned int tx_drop_3addr;

	/**
	 * The number of packets that were dropped because of Video Stream Protection.
	 */
	unsigned int tx_drop_vsp;

	/**
	 * The total count of packets dropped at the wireless interface.
	 */
	unsigned int tx_drop_total;

	/**
	 * The number of data frames forworded to L2 external filter
	 */
	unsigned int tx_l2_ext_filter;

	/**
	 * The number of data frames droped without forwording to L2 external filter
	 */
	unsigned int tx_drop_l2_ext_filter;

	/**
	 * Field for QCAT.
	 */
	unsigned int qcat_state;

	/**
	 * Ticks that DSP waits until wmac is ready before installing the qmatrix.
	 */
	unsigned int txbf_qmat_wait;

	/**
	 * Protocol counts
	 */
	unsigned int prot_ip_udp;
	unsigned int prot_ip_tcp;
	unsigned int prot_ip_icmp;
	unsigned int prot_ip_igmp;
	unsigned int prot_ip_other;
	unsigned int prot_ipv6;
	unsigned int prot_arp;
	unsigned int prot_pae;
	unsigned int prot_other;
};

/**
 * \brief WLAN receive statistics.
 *
 * These statistics are gathered within the WLAN driver on the LHost.
 */
struct qdrv_wlan_rx_stats {

	/**
	 * The number of receive IRQs
	 */
	unsigned int rx_irq;

	/**
	 * The number of times the receive tasklet is scheduled based on the IRQ.
	 */
	unsigned int rx_irq_schedule;

	/**
	 * The number of beacons received.
	 */
	unsigned int rx_beacon;

	/**
	 * The number of non-beacon packets received (eg, other management, control
	 * and data packets combined).
	 */
	unsigned int rx_non_beacon;

	/**
	 * The number of packets received that were sent via the slow WLAN driver path,
	 * which have no node structure associated with them.
	 */
	unsigned int rx_input_all;

	/**
	 * The number of packets received for a specific node (slow WLAN driver path).
	 * The slow path is for management, control or fragmented data packets.
	 */
	unsigned int rx_input_node;

	/**
	 * The number of data packets received which are SNAP encapsulated.
	 */
	unsigned int rx_data_snap;

	/**
	 * The number of packets received with only the to DS bit set.
	 */
	unsigned int rx_data_tods;

	/**
	 * The number of packets received with none of the to/from DS bits set.
	 */
	unsigned int rx_data_nods;

	/**
	 * The number of packets received with only the from DS bit set.
	 */
	unsigned int rx_data_fromds;

	/**
	 * The number of packets received with both the to and from DS bits set.
	 * These are 4 address (bridged) packets.
	 */
	unsigned int rx_data_dstods;

	/**
	 * The number of packets received from unknown STAs - that is, the AP doesn't
	 * have an association with the STA.
	 */
	unsigned int rx_data_no_node;

	/**
	 * The number of packets received which have too short a length. These packets
	 * are dropped.
	 */
	unsigned int rx_data_too_short;

	/**
	 * The number of times the rx poll function is called.
	 */
	unsigned int rx_poll;

	/**
	 * The number of times that a poll is carried on from a previous poll - that is,
	 * the previous poll terminated early due to heavy RX load.
	 */
	unsigned int rx_poll_pending;

	/**
	 * The number of times rx poll terminated due to reaching the end of the received
	 * data chain.
	 */
	unsigned int rx_poll_empty;

	/**
	 * The number of times a poll to the receive mailbox has data available.
	 */
	unsigned int rx_poll_retrieving;

	/**
	 * The number of times that an AMSDU being decapsulated fails due to not having enough headroom
	 * in the packet. Eg, badly formatted AMSDU.
	 */
	unsigned int rx_poll_buffer_err;

	/**
	 * The number of times a receive descriptor allocate for an skb (when used for requeueing the RX descriptor
	 * for the next packet) fails.
	 */
	unsigned int rx_poll_skballoc_err;

	/**
	 * Whether the poll function for receive is currently running (1) or not (0).
	 */
	unsigned int rx_poll_stopped;

	/**
	 * The number of elements on the receive FIFO between the MuC and LHost.
	 */
	unsigned int rx_df_numelems;

	/**
	 * The number of Aggregate MSDUs received.
	 *
	 * This counter is incremented once per AMSDU, NOT once per subframe within
	 * the AMSDU.
	 */
	unsigned int rx_amsdu;

	/**
	 * The number of received packets (singletons, MPDUs or AMSDUs) in the LHost driver.
	 */
	unsigned int rx_packets;

	/**
	 * The number of received bytes (based on received packets counter above), including 802.2, 802.11 headers.
	 */
	unsigned int rx_bytes;

	/**
	 * The number of times chained receive descriptors are read in.
	 */
	unsigned int rx_poll_next;

	/**
	 * The number of times that the poll function completed processing all received packets before using
	 * it's entire budget.
	 */
	unsigned int rx_poll_complete;

	/**
	 * The number of times the receive poll function completes.
	 */
	unsigned int rx_poll_continue;

	/**
	 * The number of times packets received are from unauthenticated STAs.
	 */
	unsigned int rx_poll_vap_err;

	/**
	 * The number of received 802.11 fragmented packets.
	 * Fragmented packets are processed via the slow data path.
	 */
	unsigned int rx_frag;

	/**
	 * The number of packets received for STAs that are currently blacklisted (due to MAC address filtering).
	 */
	unsigned int rx_blacklist;

	/**
	 * The number of received LNCB packets in 4 address mode.
	 */
	unsigned int rx_lncb_4;

	/**
	 * The number of received IGMP packets.
	 */
	unsigned int rx_igmp;

	/**
	 * The number of received IGMP packets in 4 address mode.
	 */
	unsigned int rx_igmp_4;

	/**
	 * The number of IGMP packets dropped due to already receiving the IGMP packet
	 * as a reliable 4 address packet.
	 */
	unsigned int rx_igmp_3_drop;

	/**
	 * The number of received 3 address multicast packets dropped due to already
	 * receiving the same packet as a reliable 4 address packet.
	 */
	unsigned int rx_mc_3_drop;

	/**
	 * Protocol counts
	 */
	unsigned int prot_ip_udp;
	unsigned int prot_ip_tcp;
	unsigned int prot_ip_icmp;
	unsigned int prot_ip_igmp;
	unsigned int prot_ip_other;
	unsigned int prot_ipv6;
	unsigned int prot_arp;
	unsigned int prot_pae;
	unsigned int prot_other;

	/**
	 * Beamforming Statistics
	 */
	unsigned int rx_bf_success[QTN_STATS_NUM_BF_SLOTS];
	unsigned int rx_bf_rejected[QTN_STATS_NUM_BF_SLOTS];

	unsigned int rx_rate_train_invalid;
	unsigned int rx_mac_reserved;
	unsigned int rx_coex_bw_action;
	unsigned int rx_coex_bw_assoc;
	unsigned int rx_coex_bw_scan;
};

struct qdrv_tqe_cgq_stats {
	uint32_t	congest_qlen[TOPAZ_CONGEST_QUEUE_NUM];
	uint32_t	congest_enq_fail[TOPAZ_CONGEST_QUEUE_NUM];
};
/* @} */

/*
 * This can be changed to an array if the stat_parser is enhanced to parse array syntax.
 */
struct qdrv_rx_evm_array {
	unsigned int rx_evm_val[NUM_ANT];
};

/**
 * \brief Transmit power
 *
 * Each member of the array records transmit power of one Tx chain.
 */
struct qdrv_tx_pd_array {
	/**
	 * Transmit power of chain 0-3.
	 */
	uint16_t tx_pd_vol[NUM_ANT];
};

/**
 * \brief Qdisc stats
 *
 * Queue statistics per-node
 */
struct qdrv_netdebug_nd_stats {
	uint32_t	sch_aid;
	uint32_t	sch_mac1;
	uint32_t	sch_mac2;
	uint32_t	sch_ref;
	uint32_t	sch_muc_queued;
	uint32_t	sch_tokens;
	uint32_t	sch_qlen;
	uint32_t	sch_low_rate;
	uint32_t	sch_depth[QDRV_SCH_BANDS];
	uint32_t	sch_sent[QDRV_SCH_BANDS];
	uint32_t	sch_dropped[QDRV_SCH_BANDS];
	uint32_t	sch_victim[QDRV_SCH_BANDS];
};

struct qdrv_sch_stats {
	uint32_t	sch_users;
	uint32_t	sch_tokens;
	uint32_t	sch_cnt;
};

/**
 * \brief Linux memory statistics.
 *
 * This structure contains a sample of different statistics related to the Linux memory
 * management subsystem.
 */
struct qdrv_mem_stats {
	/**
	 * The number of free pages in the system.
	 */
	unsigned long mem_free;
	/**
	 * The number of SLAB pages that can be freed up.
	 */
	unsigned long mem_slab_reclaimable;
	/**
	 * The number of SLAB pages that can't be freed up.
	 */
	unsigned long mem_slab_unreclaimable;
	/**
	 *
	 */
	unsigned long mem_anon;
	unsigned long mem_mapped;
	unsigned long mem_cached;
};

/**
 * \brief Linux misc statistics
 */
struct qdrv_misc_stats {
	/**
	 * CPU awake cycles. When CPU is at full load, this will be at
	 * CPU clock speed (Hz) / stats interval (s)
	 */
	unsigned long cpuawake;
};

/**
 * \brief Statistics indicates the reason for a channel change
 *
 * Each member of this structure records times channel change caused by different reason.
 */
struct qdrv_csw_count_stats {
	/**
	 * Channel change caused by SCS.
	 */
	uint16_t csw_by_scs;
	/**
	 * Channel change caused by DFS.
	 */
	uint16_t csw_by_dfs;
	/**
	 * Channel change caused by User configuration
	 */
	uint16_t csw_by_user;
	/**
	 * Channel change when device does off-channel sampling.
	 */
	uint16_t csw_by_sampling;
	/**
	 * Channel change when device does scan and sample.
	 */
	uint16_t csw_by_tdls;
	/**
	 * Channel change when device does background scanning.
	 */
	uint16_t csw_by_bgscan;
	/**
	 * Channel change after off-channel CAC is completed.
	 */
	uint16_t csw_by_ocac;
	/**
	 * Channel change when off-channel CAC is running.
	 */
	uint16_t csw_by_ocac_run;
	/**
	 * Channel change when received CSAIE from action frame or beacon
	 */
	uint16_t csw_by_csa;
	/**
	 * Channel change when device does regular scanning.
	 */
	uint16_t csw_by_scan;
	/**
	 * Channel change triggered due to pm level changes
	 */
	uint16_t csw_by_coc;

	/**
	 * reserved
	 */
	uint16_t reserved;
};

struct tx_power_cal
{
	struct _temp_info {
		int temp_index;
		int real_temp;
		u_int8_t num_zone;
	} temp_info;
	struct delayed_work bbrf_cal_work;
};

#define MAX_UNKNOWN_DP_PER_SECOND 5   /* Rate limit per sec for unknown data pkts */

/* Ext Flags in qdrv_wlan */
#define QDRV_WLAN_MUC_KILLED		0x00000001
#define QDRV_FLAG_3ADDR_BRIDGE_DISABLE	0x00000002
#define QDRV_WLAN_DEBUG_TEST_LNCB	0x00000004
#define QDRV_WLAN_FLAG_UNKNOWN_ARP	0x00000008 /* send ARP requests for unknown destinations */
#define QDRV_WLAN_FLAG_UNKNOWN_FWD	0x00000010 /* send unknown dest pkt to all bridge STAs */
#define QDRV_WLAN_FLAG_AUC_TX		0x00000020 /* enqueue tx packets to AuC, not MuC */

#define QDRV_WLAN_TX_USE_AUC(qw)	( qw->flags_ext & QDRV_WLAN_FLAG_AUC_TX )

#define QDRV_FLAG_3ADDR_BRIDGE_ENABLED() ((qw->flags_ext & QDRV_FLAG_3ADDR_BRIDGE_DISABLE) == 0)

struct qtn_node_shared_stats_list {
	/* Note: shared_pernode_stats should be the 1st field in the structure */
	struct qtn_node_shared_stats		shared_pernode_stats;
	TAILQ_ENTRY(qtn_node_shared_stats_list)	next;
};

struct qdrv_wlan {
	/* The 802.11 networking structure */
	struct ieee80211com ic;
	int unit;

	struct work_struct scan_task;

	u32 flags_ext;
	u16 flags;
	u8 rf_chipid;
	u8 rf_chip_verid;
	struct qdrv_mac *mac;/* Interrupts per MAC so we need a back pointer */

	/* Synchronization */
	spinlock_t lock;

	char semmap[HOST_NUM_HOSTIFQ];
	char txdoneirq;
	int rxirq;
	int scanirq;

	struct host_scanif scan_if;

	struct host_scanfifo *scan_fifo; /* For iounmap */

	/* Tx to MuC */
	struct host_txif tx_if;
	/* Rx from MuC */
	struct host_rxif rx_if;

	/* Registers */
	u32 host_sem;
	struct qtn_ratetable qw_rates[IEEE80211_MODE_MAX];/* rate tables */
	struct qtn_ratetable *qw_currt;      /* current rate table */
	enum ieee80211_phymode qw_curmode;
	struct qdrv_wlan_tx_stats tx_stats;
	struct qdrv_wlan_rx_stats rx_stats;
	struct qdrv_csw_count_stats csw_stats;
	struct qdrv_pktlogger pktlogger;
	struct qdrv_wlan_sm_stats sm_stats;

	/*congest queue stats*/
	struct qdrv_tqe_cgq_stats cgq_stats;

	/* TX Beamforming support */
	void *txbf_state;

	/* Flow control */
	spinlock_t flowlock;

	struct net_device *br_dev;

	int unknown_dp_count;
	unsigned long unknown_dp_jiffies;

#ifdef CONFIG_QVSP
	struct qvsp_s *qvsp;
	struct qtn_vsp_stats *vsp_stats;
	struct tasklet_struct vsp_tasklet;
	struct timer_list vsp_ba_throt;
#if TOPAZ_QTM
	uint32_t vsp_enabling;		/* VSP is just enabled, need warm up for traffic stats */
	uint32_t vsp_check_intvl;	/* in seconds */
	uint32_t vsp_sync_sched_remain;	/* sched sync task before next vsp interrupt from MuC */
	/*
	 * Used to sync stream stats every second. Since VSP check interval is bigger than 1 second,
	 * we need to sched the sync work one less than the interval. And vsp tasklet will do 1 time.
	 */
	struct delayed_work vsp_sync_work;
#endif
#endif

	/* 3-address mode bridging */
	struct qdrv_br bridge_table;
	int mcs_cap;
	int mcs_odd_even;
	int tx_restrict;
	int tx_restrict_rts;
	int tx_restrict_limit;
	int tx_restrict_rate;
	uint8_t tx_swretry_agg_max;
	uint8_t tx_swretry_noagg_max;
	uint8_t tx_swretry_suspend_xmit;
	struct timer_list hr_timer;
	struct timer_list cca_timer;
	struct timer_list igmp_query_timer;
	struct work_struct cca_wq;
	struct work_struct meas_wq;
	spinlock_t cca_lock;
	struct work_struct scan_wq;
	spinlock_t scan_lock;
	void (*csa_callback)(const struct ieee80211_channel *, u_int64_t);
	struct work_struct csa_wq;
	spinlock_t csa_lock;
	struct work_struct channel_work_wq;
	int (*radar_detect_callback)(const struct ieee80211_channel *);
	unsigned long arp_last_sent;

	struct work_struct remain_chan_wq;

	/* MuC per node stats pool */
	struct qtn_node_shared_stats_list		*shared_pernode_stats_pool;
	dma_addr_t					shared_pernode_stats_phys;
	TAILQ_HEAD(, qtn_node_shared_stats_list)	shared_pernode_stats_head;

	struct notifier_block pm_notifier;

#if QTN_GENPCAP
	struct qtn_genpcap_args genpcap_args;
#endif

	struct qdrv_sch_shared_data	*tx_sch_shared_data;
	bool				queue_enabled;
#define QDRV_BR_ISOLATE_NORMAL		BIT(0)
#define QDRV_BR_ISOLATE_VLAN		BIT(1)
	uint16_t br_isolate;
	uint16_t br_isolate_vid;
	uint8_t restrict_wlan_ip;
	struct i2c_client *se95_temp_sensor;
	struct tx_power_cal tx_power_cal_data;
	struct shared_params *sp;
	uint32_t tx_mimomode;
};

/**************/
/** Netdebug **/
/**************/
#define	QDRV_NETDEBUG_NETPOLL_NAME		"qdrv_netpoll"
#define	QDRV_NETDEBUG_NETPOLL_DEV		"eth1_0"

#define	QDRV_NETDEBUG_FLAGS_NO_STATS		0x1
#define	QDRV_NETDEBUG_FLAGS_TRUNCATED		0x2

#define QDRV_NETDEBUG_RADAR_MAXPULSE		(175)
#define QDRV_NETDEBUG_RADAR_PULSESIZE		(8)

#define QDRV_NETDEBUG_TXBF_DATALEN		1024
#define QDRV_NETDEBUG_IWEVENT_LENGTH		128
#define QDRV_NETDEBUG_MEM_DATALEN		1024
#define QDRV_NETDEBUG_SYSMSG_LENGTH		4096
#define QDRV_NETDEBUG_BUILDSTRING_SIZE		32

/**
 * \brief The common header for netdebug (packetlogger) packets.
 */
struct qdrv_pktlogger_hdr {
	struct udphdr udpheader;
	u_int8_t type;
	u_int8_t			opmode;
	/**
	 * The source address (the bridge MAC address).
	 */
	unsigned char			src[IEEE80211_ADDR_LEN];
	u_int32_t			version;
	u_int32_t			builddate;
	/**
	 * Identifying string to easily see in packet dumps that this is a packetlogger packet.
	 */
	char				buildstring[QDRV_NETDEBUG_BUILDSTRING_SIZE];
	u_int8_t			flags;

	/**
	 * Epoch timestamp.
	 */
	u_int32_t			timestamp;
	/**
	 * TSF timestamp low bytes.
	 */
	u_int32_t			tsf_lo;
	/**
	 * TSF timestamp high bytes.
	 */
	u_int32_t			tsf_hi;

	u_int32_t			platform;
	u_int32_t			stats_len;
	char				padding[3];	/* Word align data start */
} __packed;

/* Note: NDB tags are added to pktlogger structures. Do not remove these tags. */
/* @NDB@: type=4 */
struct qdrv_netdebug_txbf {
	struct qdrv_pktlogger_hdr	ndb_hdr;
	u_int8_t			stvec_data[QDRV_NETDEBUG_TXBF_DATALEN];
} __packed;

/* @NDB@: type=5,payload=iwevent_data,payloadtype=varstring */
struct qdrv_netdebug_iwevent {
	struct qdrv_pktlogger_hdr	ndb_hdr;
	char				iwevent_data[QDRV_NETDEBUG_IWEVENT_LENGTH];
} __packed;

/* @NDB@: type=7 */
struct qdrv_netdebug_mem {
	struct qdrv_pktlogger_hdr	ndb_hdr;
	u_int8_t			stvec_data[QDRV_NETDEBUG_MEM_DATALEN];
} __packed;

/* @NDB@: type=8 */
struct qdrv_netdebug_rate {
	struct qdrv_pktlogger_hdr	ndb_hdr;
	struct qtn_rate_su_tx_stats	rate_su_tx_stats[RATES_STATS_NUM_ADAPTATIONS];
	struct qtn_rate_mu_tx_stats	rate_mu_tx_stats[RATES_STATS_NUM_ADAPTATIONS];
	struct qtn_rate_gen_stats	rate_gen_stats;
} __packed;

/* @NDB@: type=3 */
struct qdrv_radar_stats {
	struct qdrv_pktlogger_hdr	ndb_hdr;
	u_int32_t			numpulses;
	u_int8_t			pulseinfo[QDRV_NETDEBUG_RADAR_PULSESIZE *
						  QDRV_NETDEBUG_RADAR_MAXPULSE];
} __packed;

struct qdrv_muc_rx_rates {
	u_int16_t			rx_mcs[IEEE80211_HT_RATE_MAXSIZE];
	u_int16_t			rx_mcs_pad; /* unique name for packet logger */
} __packed;

struct qdrv_muc_rx_11acrates {
	u_int16_t			rx_11ac_mcs[MUC_VHT_NUM_RATES];
} __packed;

/* @NDB@: type=6,payload=msg,payloadtype=varstring */
struct qdrv_netdebug_sysmsg {
	struct qdrv_pktlogger_hdr ndb_hdr;
	char msg[QDRV_NETDEBUG_SYSMSG_LENGTH];
} __packed;

/**
 * \brief Statistics on the traffic queueing discipline (qdisc).
 *
 * These statistics are used to track packets that are sent/dropped by the traffic
 * policer on the Ethernet and wireless interfaces.
 *
 * The '_dropped' counters represent true packet loss, due to backpressure from lower
 * parts of the system.
 */
struct qdrv_qdisc_stats {
	/**
	 * The number of packets queued via the qdisc for the wireless interface.
	 */
	u_int32_t wifi_sent;
	/**
	 * The number of packets dropped by the qdisc on the wireless interface.
	 */
	u_int32_t wifi_dropped;
	/**
	 * The number of packets queued via the qdisc for the Ethernet interface.
	 */
	u_int32_t eth_sent;
	/**
	 * The number of packets dropped by the qdisc on the Ethernet interface.
	 */
	u_int32_t eth_dropped;
};

/**
 * \brief Statistics related to the EMAC.
 *
 * This structure contains statistic related to the EMAC block of the system.
 */
struct qdrv_emac_stats {
	/**
	 * The number of packets lost due to no DMA buffers being available on
	 * receive. Each of these represents a genuine single packet loss on
	 * Ethernet receive.
	 */
	u_int32_t rx_emac0_dma_missed;
	u_int32_t rx_emac1_dma_missed;
};

/* This struct must be kept in sync with qtn_scs_cnt*/
struct qdrv_scs_cnt {
	uint32_t scs_iotcl;
	uint32_t scs_noqosnull;
	uint32_t scs_1stcnflct;
	uint32_t scs_qosnul_sntfail;
	uint32_t scs_2ndcnflct;
	uint32_t scs_low_dwell;
	uint32_t scs_offch_scan;
	uint32_t scs_sample_start;
	uint32_t scs_sample_stop;
};

struct qdrv_tqe_stats {
	uint32_t emac0_outc;
	uint32_t emac1_outc;
	uint32_t wmac_outc;
	uint32_t lhost_outc;
	uint32_t muc_outc;
	uint32_t dsp_outc;
	uint32_t auc_outc;
	uint32_t pcie_outc;
	uint32_t drop;
	uint32_t emac0_drop;
	uint32_t emac1_drop;
	uint32_t wmac_drop;
	uint32_t lhost_drop;
	uint32_t muc_drop;
	uint32_t dsp_drop;
	uint32_t auc_drop;
	uint32_t pcie_drop;
};

struct qdrv_hbm_stats {
	uint32_t req_lhost[TOPAZ_HBM_POOL_COUNT];
	uint32_t req_muc[TOPAZ_HBM_POOL_COUNT];
	uint32_t req_emac0[TOPAZ_HBM_POOL_COUNT];
	uint32_t req_emac1[TOPAZ_HBM_POOL_COUNT];
	uint32_t req_wmac[TOPAZ_HBM_POOL_COUNT];
	uint32_t req_tqe[TOPAZ_HBM_POOL_COUNT];
	uint32_t req_auc[TOPAZ_HBM_POOL_COUNT];
	uint32_t req_dsp[TOPAZ_HBM_POOL_COUNT];
	uint32_t req_pcie[TOPAZ_HBM_POOL_COUNT];
	uint32_t rel_lhost[TOPAZ_HBM_POOL_COUNT];
	uint32_t rel_muc[TOPAZ_HBM_POOL_COUNT];
	uint32_t rel_emac0[TOPAZ_HBM_POOL_COUNT];
	uint32_t rel_emac1[TOPAZ_HBM_POOL_COUNT];
	uint32_t rel_wmac[TOPAZ_HBM_POOL_COUNT];
	uint32_t rel_tqe[TOPAZ_HBM_POOL_COUNT];
	uint32_t rel_auc[TOPAZ_HBM_POOL_COUNT];
	uint32_t rel_dsp[TOPAZ_HBM_POOL_COUNT];
	uint32_t rel_pcie[TOPAZ_HBM_POOL_COUNT];
};

struct qdrv_hbm_stats_oth {
	uint32_t hbm_req;
	uint32_t hbm_rel;
	uint32_t hbm_diff;
	uint32_t hbm_overflow;
	uint32_t hbm_underflow;
};

struct dsp_mu_stats {
	uint32_t mu_u0_aid[QTN_MU_QMAT_MAX_SLOTS];
	uint32_t mu_u1_aid[QTN_MU_QMAT_MAX_SLOTS];
	int32_t  mu_rank[QTN_MU_QMAT_MAX_SLOTS];
};

/* @NDB@: type=1 */
struct qdrv_netdebug_stats {
	struct qdrv_pktlogger_hdr	ndb_hdr;
	struct muc_rx_stats		stats_muc_rx;
	struct qdrv_muc_rx_rates	rates_muc_rx;
	struct qdrv_muc_rx_11acrates	rates_muc_rx_11ac;
	struct muc_rx_bf_stats		stats_muc_rx_bf;
	struct muc_tx_stats		stats_muc_tx;
	struct qdrv_emac_stats		stats_emac;
	struct qdrv_qdisc_stats		stats_qdisc;

	struct qdrv_wlan_rx_stats	stats_wlan_rx;
	struct qdrv_wlan_tx_stats	stats_wlan_tx;
	struct qdrv_wlan_sm_stats	stats_wlan_sm;

	struct qtn_rx_stats		stats_phy_rx;
	struct qtn_tx_stats		stats_phy_tx;
	struct qdrv_mem_stats		stats_mem;
	struct qdrv_misc_stats		stats_misc;
	struct qdrv_rx_evm_array	stats_evm;
	struct qdrv_csw_count_stats	stats_csw;
	struct qdrv_tx_pd_array		stats_pd_vol;
	struct qdrv_slab_watch		stats_slab;
	struct qdrv_scs_cnt		stats_scs_cnt;
	struct qdrv_auc_intr_stats	stats_auc_intr_count;
	struct auc_dbg_counters		stats_auc_debug_counts;
	struct qdrv_tqe_stats		stats_tqe;
	struct qdrv_tqe_cgq_stats	stats_cgq;
	struct qdrv_hbm_stats		stats_hbm;
	struct qdrv_hbm_stats_oth	stats_hbm_oth;
	struct dsp_mu_stats		stats_dsp_mu;
} __packed;

/* TBD */
#define QDRV_NETDEBUG_EVENT_STR_MAX	127
struct qdrv_netdebug_event {
	u_int8_t 			version;
	u_int8_t 			type;
	u_int8_t 			reserved[2];		/* Reserved for alignment */
	u_int32_t 			tstamp;
	u_int8_t 			event_msg[QDRV_NETDEBUG_EVENT_STR_MAX + 1];
};

struct qdrv_netdebug_per_node_phystats {
	uint8_t node_macaddr[IEEE80211_ADDR_LEN];
	struct qtn_node_shared_stats per_node_phystats;
} __packed;

/*
 * We always have at least one per-node statistic (the board itself)
 * For APs we can have more than one, so added variable length array at the end of structure
 */
/* @NDB@: type=10,payload=per_node_stats,payloadtype=vararray(per_node_stats_count) */
struct qdrv_netdebug_phystats {
	struct qdrv_pktlogger_hdr		ndb_hdr;
	struct qtn_stats			stats;
	u_int32_t				per_node_stats_count;
	struct qdrv_netdebug_per_node_phystats	per_node_stats[1];
} __packed;

/* @NDB@: type=11 */
struct qdrv_netdebug_dspstats {
	struct qdrv_pktlogger_hdr		ndb_hdr;
	struct qtn_dsp_stats			stats;
} __packed;

/* @NDB@: type=12 */
struct qdrv_netdebug_core_dump {
	struct qdrv_pktlogger_hdr		ndb_hdr;
	char					data[CONFIG_ARC_MUC_STACK_SIZE];
} __packed;

extern int g_triggers_on;

int topaz_read_internal_temp_sens(int *temp);
void qdrv_halt_muc(void);
int get_temp_zone_from_tprofile(void);
int convert_temp_index(int temp);

/* Support wlan modules */
int qdrv_rx_poll(struct napi_struct *napi, int budget);
int qdrv_rx_start(struct qdrv_mac *mac);
int qdrv_rx_stop(struct qdrv_mac *mac);
int qdrv_rx_init(struct qdrv_wlan *qw, struct host_ioctl_hifinfo *hifinfo);
int qdrv_rx_exit(struct qdrv_wlan *qw);

void qdrv_tx_done_flush_vap(struct qdrv_vap *qv);
int qdrv_tx_hardstart(struct sk_buff *skb, struct net_device *dev);
struct host_txdesc * qdrv_tx_get_mgt_txdesc(struct sk_buff *skb, struct net_device *dev);
void qdrv_tx_release_txdesc(struct qdrv_wlan *qw, struct lhost_txdesc* txdesc);
int qdrv_tx_start(struct qdrv_mac *mac);
int qdrv_tx_stop(struct qdrv_mac *mac);
int qdrv_tx_eth_pause_init(struct qdrv_wlan *qw);
int qdrv_tx_init(struct qdrv_mac *mac, struct host_ioctl_hifinfo *hifinfo,
	u32 arg2);
int qdrv_tx_exit(struct qdrv_wlan *qw);
void qdrv_tx_ba_establish(struct qdrv_vap *qv,
		struct ieee80211_node *ni, uint8_t tid);

int qdrv_scan_start(struct qdrv_mac *mac);
int qdrv_scan_stop(struct qdrv_mac *mac);
int qdrv_scan_init(struct qdrv_wlan *qw, struct host_ioctl_hifinfo *hifinfo);
int qdrv_scan_exit(struct qdrv_wlan *qw);
int qdrv_async_cca_read(struct ieee80211com *ic, const struct ieee80211_channel *sample_channel,
		u_int64_t start_tsf, u_int32_t sample_millis);

int qdrv_ap_isolate_filter(struct ieee80211_node *ni, struct sk_buff *skb);

int qdrv_hostlink_msg_cmd(struct qdrv_wlan *qw, u_int32_t cmd, u_int32_t arg);
int qdrv_hostlink_msg_create_vap(struct qdrv_wlan *qw, const char *name, const uint8_t *mac_addr,
		int devid, int opmode, int flags);
int qdrv_hostlink_msg_delete_vap(struct qdrv_wlan *qw, struct net_device *vdev);
int qdrv_hostlink_start(struct qdrv_mac *mac);
int qdrv_hostlink_stop(struct qdrv_mac *mac);
int qdrv_hostlink_init(struct qdrv_wlan *qw,
	struct host_ioctl_hifinfo *hifinfo);
int qdrv_hostlink_exit(struct qdrv_wlan *qw);
int qdrv_hostlink_store_txpow(struct qdrv_wlan *qw, u_int32_t txpower);
int qdrv_hostlink_setchan(struct qdrv_wlan *qw, uint32_t freq_band, uint32_t qtn_chan);
int qdrv_hostlink_sample_chan_cancel(struct qdrv_wlan *qw, struct qtn_samp_chan_info *);
int qdrv_hostlink_sample_chan(struct qdrv_wlan *qw, struct qtn_samp_chan_info *);
int qdrv_hostlink_remain_chan(struct qdrv_wlan *qw, struct qtn_remain_chan_info *remain_chan_bus);
int qdrv_hostlink_set_ocac(struct qdrv_wlan *qw, struct qtn_ocac_info *);
int qdrv_hostlink_suspend_off_chan(struct qdrv_wlan *qw, uint32_t suspend);
int qdrv_hostlink_meas_chan(struct qdrv_wlan *qw, struct qtn_meas_chan_info *meas_chan_bus);
int qdrv_hostlink_rxgain_params(struct qdrv_wlan *qw, uint32_t index, struct qtn_rf_rxgain_params *rx_gain_params);
#ifdef QTN_BG_SCAN
int qdrv_hostlink_bgscan_chan(struct qdrv_wlan *qw, struct qtn_scan_chan_info *);
#endif /* QTN_BG_SCAN */
int qdrv_hostlink_setchan_deferred(struct qdrv_wlan *qw, struct qtn_csa_info*);
int qdrv_hostlink_setscanmode(struct qdrv_wlan *qw, u_int32_t scanmode);
int qdrv_hostlink_xmitctl(struct qdrv_wlan *qw, bool enable_xmit);
int qdrv_hostlink_msg_calcmd(struct qdrv_wlan *qw, int cmdlen, dma_addr_t cmd_dma);
//int qdrv_hostlink_do_txpwr_cal(struct qdrv_wlan *qw, int temp_idx, int pwr);
int qdrv_hostlink_msg_set_wifi_macaddr( struct qdrv_wlan *qw, u8 *new_macaddr );
int qdrv_hlink_get_outstand_msgs(struct qdrv_wlan *qw);
int qdrv_hostlink_set_hrflags(struct qdrv_wlan *qw, u_int32_t flags);
int qdrv_hostlink_power_save(struct qdrv_wlan *qw, int param, int val);
int qdrv_hostlink_tx_airtime_control(struct qdrv_wlan *qw, uint32_t value);
int qdrv_hostlink_mu_group_update(struct qdrv_wlan *qw, struct qtn_mu_group_update_args *args);
void* qdrv_hostlink_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag);
void qdrv_hostlink_free_coherent(struct device *dev, size_t size, void *kvaddr, dma_addr_t dma_handle);
extern u_int8_t get_bootcfg_scancnt(void);
uint8_t get_bootcfg_two_by_four_configuration(void);
enum hw_opt_t get_bootcfg_bond_opt(void);

#ifdef CONFIG_QVSP
int qdrv_hostlink_qvsp(struct qdrv_wlan *qw, uint32_t param, uint32_t value);
int qdrv_wlan_query_wds(struct ieee80211com *ic);
#endif

int qdrv_hostlink_killmuc(struct qdrv_wlan *qw);
int qdrv_hostlink_use_rtscts(struct qdrv_wlan *qw, int rtscts_required);
int qdrv_hostlink_send_ioctl_args(struct qdrv_wlan *qw, uint32_t command,
	uint32_t arg1, uint32_t arg2);

void qdrv_dump_replace_db(struct qdrv_wlan *qw);
int qdrv_hostlink_enable_flush_data(struct qdrv_wlan *qw, int enable);
int qdrv_hostlink_update_ocac_state_ie(struct qdrv_wlan *qw, uint8_t state, uint8_t param);

int qdrv_wlan_80211_set_bcn_scheme(struct ieee80211vap *vap, int param, int value);
int qdrv_hostlink_change_bcn_scheme(struct qdrv_vap *qv, int param, int value);

/* Main wlan module */
#if 0
int qdrv_wlan_start(void *data, char *name);
#endif
int qdrv_wlan_stats(void *data);
int qdrv_wlan_start_vap(struct qdrv_wlan *qw, const char *name,
	uint8_t *mac_addr, int devid, int opmode, int flags);
int qdrv_wlan_stop_vap(struct qdrv_mac *mac, struct net_device *vdev);
int qdrv_wlan_init(struct qdrv_mac *mac, struct host_ioctl_hifinfo *hifinfo,
	u32 arg1, u32 arg2);
int qdrv_wlan_exit(struct qdrv_mac *mac);
int qdrv_wlan_get_assoc_queue_info(void *data);
int qdrv_wlan_get_assoc_info(void *data);
#ifdef CONFIG_NAC_MONITOR
int qdrv_wlan_get_nac_info(void *data);
#endif
int qdrv_wps_button_init(struct net_device *dev);
void qdrv_wps_button_exit(void);
struct net_device *qdrv_wps_button_get_dev(void);
int qdrv_wlan_tkip_mic_error(struct qdrv_mac *mac, int devid, int count);
int qdrv_wlan_ba_is_ok(struct ieee80211_node *ni, int tid, int direction);
void qdrv_wlan_igmp_query_timer_start(struct qdrv_wlan *qw);
void qdrv_wlan_igmp_timer_stop(struct qdrv_wlan *qw);
void qdrv_wlan_drop_ba(struct ieee80211_node *ni, int tid, int tx, int reason);
void qdrv_wlan_cleanup_before_reload(struct ieee80211com *ic);
int qdrv_get_br_ipaddr(struct qdrv_wlan *qw, __be32 *ipaddr);
int qdrv_is_bridge_ipaddr(struct qdrv_wlan *qw, __be32 ipaddr);
void qdrv_wlan_dump_ba(struct ieee80211_node *ni);
void qdrv_wlan_stats_prot(struct qdrv_wlan *qw, uint8_t is_tx, uint16_t ether_type,
				uint8_t ip_proto);
int qdrv_proxy_arp(struct ieee80211vap *iv,
		struct qdrv_wlan *qw,
		struct ieee80211_node *ni_rx,
		uint8_t *data_start);
#ifdef CONFIG_IPV6
int qdrv_wlan_handle_neigh_msg(struct ieee80211vap *vap, struct qdrv_wlan *qw,
			uint8_t *data_start, uint8_t in_tx,  struct sk_buff *skb,
			uint8_t ip_proto, void *proto_data);
#endif
#ifdef CONFIG_QVSP
int qdrv_wlan_vsp_3rdpt_init(struct qdrv_wlan *qw);
void qdrv_wlan_vsp_3rdpt_exit(struct qdrv_wlan *qw);
#endif

void qdrv_wlan_vlan_enable(struct ieee80211com *ic, int enable);
int qdrv_hostlink_vlan_enable(struct qdrv_wlan *qw, int enable);

void qdrv_tx_airtime_control(struct ieee80211vap *vap, uint32_t vaule);

void qdrv_mu_grp_update(struct ieee80211com *ic, struct qtn_mu_group_update_args *args);

static inline struct qdrv_wlan *qdrv_mac_get_wlan(struct qdrv_mac *mac)
{
	return (struct qdrv_wlan*)mac->data;
}

static inline int
qdrv_wlan_bc_should_forward(const struct ether_header *eh,
			struct ieee80211vap *iv)
{
	if (ieee80211_is_bcst(eh->ether_dhost) && iv->iv_reliable_bcst) {
		return 1;
	}

	return 0;
}

static inline int
qdrv_wlan_mc_should_drop(const struct ether_header *eh, void *p_iphdr,
			struct ieee80211vap *iv, bool is_vap_node, uint8_t ip_proto)
{
	/* Make sure frames are not transmitted prior to CAC */
	if (IEEE80211_IS_MULTICAST(eh->ether_dhost) &&
			iv->iv_opmode == IEEE80211_M_HOSTAP &&
			iv->iv_ic->ic_sta_assoc == 0) {
		return 1;
	}

	if (IEEE80211_IS_MULTICAST(eh->ether_dhost) &&
			is_vap_node &&
			ip_proto != IPPROTO_ICMPV6 &&
			ip_proto != IPPROTO_IGMP &&
			!iv->iv_forward_unknown_mc &&
			iputil_is_mc_data(eh, p_iphdr)) {
		return 1;
	}

	return 0;
}

static inline int
qdrv_wlan_mc_should_forward(const struct ether_header *eh, void *p_iphdr,
			struct ieee80211vap *iv, bool is_vap_node)
{
	if (iputil_eth_is_multicast(eh) &&
			is_vap_node &&
			iv->iv_forward_unknown_mc) {
		return 1;
	}

	return 0;
}

static inline int qdrv_wlan_is_4addr_mc(const struct ether_header *eh, u_int8_t *data_start,
		struct ieee80211vap *iv, bool is_vap_node)
{
	if (unlikely(IEEE80211_IS_MULTICAST(eh->ether_dhost) &&
		(iputil_is_lncb(eh->ether_dhost, data_start) ||
			qdrv_wlan_mc_should_forward(eh, data_start, iv, is_vap_node) ||
			qdrv_wlan_bc_should_forward(eh, iv)))) {
		return 1;
	}

	return 0;
}

#define IGMP_TYPE_QUERY 0x11
#define IGMP_TYPE_MEMBERSHIP_REPORT1 0x12
#define IGMP_TYPE_MEMBERSHIP_REPORT2 0x16
#define IGMP_TYPE_LEAVE_GROUP 0x17
#define IGMP_TYPE_MEMBERSHIP_REPORT3 0x22

static inline const char *qdrv_igmp_type_to_string(int igmp_type)
{
	switch(igmp_type) {
		case IGMP_TYPE_QUERY:
			return "Query";
		case IGMP_TYPE_MEMBERSHIP_REPORT1:
			return "Membership Report (v1)";
		case IGMP_TYPE_MEMBERSHIP_REPORT2:
			return "Membership Report (v2)";
		case IGMP_TYPE_MEMBERSHIP_REPORT3:
			return "Membership Report (v3)";
		case IGMP_TYPE_LEAVE_GROUP:
			return "Leave Group";
		//default:
			/* Fall through */
	}
	return "Unknown";
}

static inline int qdrv_igmp_type(struct iphdr *p_iphdr, int len)
{
	/* Incomplete, but enough for the field we're interested in. */
	struct igmphdr {
		u_int8_t type;
	};
	if (len > (sizeof(*p_iphdr) + sizeof(struct igmphdr))) {
		if (p_iphdr->protocol == IPPROTO_IGMP) {
			/* Size of IP header is in 4 byte words */
			int hlen = p_iphdr->ihl * (sizeof(u_int32_t));
			struct igmphdr *p_igmp = (struct igmphdr *)((u_int8_t *)p_iphdr + hlen);
			return p_igmp->type;
		}
	}
	return 0;
}

/* Is this an IGMP query? */
static inline int qdrv_is_igmp_query(struct iphdr *p_iphdr, int len)
{
	if (qdrv_igmp_type(p_iphdr, len) == IGMP_TYPE_QUERY) {
		return 1;
	}
	return 0;
}

void qdrv_channel_switch_record(struct ieee80211com *ic, struct ieee80211_channel *new_chan,
		uint32_t reason);
void qdrv_channel_switch_reason_record(struct ieee80211com *ic, int reason);
int8_t qdrv_get_local_tx_power(struct ieee80211com *ic);
int qdrv_get_local_link_margin(struct ieee80211_node *ni, int8_t *result);
int qdrv_wlan_get_shared_vap_stats(struct ieee80211vap *vap);
int qdrv_wlan_reset_shared_vap_stats(struct ieee80211vap *vap);
int qdrv_wlan_get_shared_node_stats(struct ieee80211_node *ni);
int qdrv_wlan_reset_shared_node_stats(struct ieee80211_node *ni);
int qdrv_rxgain_params(struct ieee80211com *ic, int index, struct qtn_rf_rxgain_params *params);
void qdrv_wlan_get_dscp2ac_map(const uint8_t vapid, uint8_t *dscp2ac);
void qdrv_wlan_set_dscp2ac_map(const uint8_t vapid, uint8_t *ip_dscp, uint8_t listlen, uint8_t ac);
void wowlan_wakeup_host(void);
/*
 * Delete all bridge table entries for the peer.  They would eventually
 * age out, but in the mean time data will be directed to the wrong
 * sub_port (node_idx) until the bridge entries are updated by upstream
 * traffic from the endpoint. Multicast port entries for the sub_port
 *  are not aged and would hang around for ever, so they are also deleted.
 */


#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
static inline void qdrv_remove_invalid_sub_port(struct ieee80211vap *vap,
						uint32_t sub_port)
{
	struct net_bridge_port *br_port = get_br_port(vap->iv_dev);

	DBGPRINTF(DBG_LL_DEBUG, QDRV_LF_BRIDGE, "Purge subport[0x%x]\n", sub_port);
#if (defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE))
	if (br_fdb_delete_by_sub_port_hook && br_port) {
		br_fdb_delete_by_sub_port_hook(br_port->br,
				br_port, sub_port);
	}
#endif
}
#else
static inline void qdrv_remove_invalid_sub_port(struct ieee80211vap *vap,
		uint32_t sub_port)
{
	DBGPRINTF(DBG_LL_DEBUG, QDRV_LF_BRIDGE, "Purge subport[0x%x]\n", sub_port);
#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
	if (br_fdb_delete_by_sub_port_hook && vap->iv_dev->br_port) {
		br_fdb_delete_by_sub_port_hook(vap->iv_dev->br_port->br,
				vap->iv_dev->br_port, sub_port);
	}
#endif
}
#endif

int qtn_tsensor_get_temperature(struct i2c_client *client, int *val);

void qdrv_tqe_send_l2_ext_filter(struct qdrv_wlan *qw, struct sk_buff *skb);

/*
 * Called only if packet received has destination address as broadcast.
 */
static inline int check_if_exceeds_max_bcast_pps(struct bcast_pps_info *bcast_pps, int is_rx)
{
	u_int16_t *bcast_counter;
	unsigned long *start_time;
	if (is_rx) {
		bcast_counter = &bcast_pps->rx_bcast_counter;
		start_time = &bcast_pps->rx_bcast_pps_start_time;
	} else {
		bcast_counter = &bcast_pps->tx_bcast_counter;
		start_time = &bcast_pps->tx_bcast_pps_start_time;
	}
	if (time_after(jiffies, ((*start_time) + HZ))) {
		*start_time = jiffies;
		*bcast_counter = 0;
	}
	if (*bcast_counter >= bcast_pps->max_bcast_pps) {
		return 1;
	}
	(*bcast_counter)++;
	return 0;
}

static inline int check_is_bcast_pps_exception(uint16_t ether_type, uint8_t ip_proto,
			void *proto_data)
{
	if (ether_type == __constant_htons(ETH_P_ARP)) {
		return 1;
	}

	if (ether_type == __constant_htons(ETH_P_IP) &&
			proto_data &&
			ip_proto == IPPROTO_UDP) {
		struct udphdr *udph = proto_data;

		if ((udph->dest == __constant_htons(DHCPSERVER_PORT)) ||
				udph->dest == __constant_htons(DHCPCLIENT_PORT)) {
			return 1;
		}
	}
	return 0;
}

static inline int bcast_pps_should_drop(const u8 *dst, struct bcast_pps_info *bcast_pps,
		uint16_t eth_type, uint8_t ip_proto, void *proto_data, int is_rx)
{
	if ((ieee80211_is_bcst(dst))
			&& (bcast_pps->max_bcast_pps)
			&& (!check_is_bcast_pps_exception(eth_type, ip_proto, proto_data))
			&& (check_if_exceeds_max_bcast_pps(bcast_pps, is_rx))) {
		return 1;
	}
	return 0;
}

#endif
