/**
  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_MAC_H
#define _QDRV_MAC_H

#include <linux/workqueue.h>
#include <qtn/lhost_muc_comm.h>

#define IEEE80211_ADDR_LEN	6	/* size of 802.11 address */

#define MAC_UNITS		1
#define HOST_INTERRUPTS		16
#define HOST_DSP_INTERRUPTS	16

#define QDRV_RESERVED_DEVIDS		QTN_RESERVED_DEVIDS
#define QDRV_WLANID_FROM_DEVID(devid)	QTN_WLANID_FROM_DEVID(devid)
#define QDRV_MAX_BSS_VAPS 8
#define QDRV_MAX_WDS_VAPS 8
#define QDRV_MAX_VAPS (QDRV_MAX_BSS_VAPS + QDRV_MAX_WDS_VAPS)
#define QDRV_MAX_DEVID (QDRV_MAX_VAPS + QDRV_RESERVED_DEVIDS)

static __always_inline int qdrv_devid_valid(uint8_t devid)
{
	return (devid >= QDRV_RESERVED_DEVIDS) && (devid < QDRV_MAX_DEVID);
}

struct int_handler
{
	void (*handler)(void *arg1, void *arg2);
	void *arg1;
	void *arg2;
};

struct qdrv_mac_params
{
	unsigned int txif_list_max;
	uint8_t mucdbg_netdbg;
};

struct qdrv_mac
{
	int unit;
	struct net_device *vnet[QDRV_MAX_VAPS];
	uint8_t vnet_last;
	uint8_t mac_addr[IEEE80211_ADDR_LEN];
	unsigned int irq;
	uint8_t enabled;
	struct int_handler int_handlers[HOST_INTERRUPTS];
	volatile struct muc_ctrl_reg *reg;
	volatile u32 *mac_host_int_status;
	volatile u32 *mac_host_int_mask;
	volatile u32 *mac_host_sem;
	volatile u32 *mac_uc_intgen;
	struct int_handler mac_host_dsp_int_handlers[HOST_DSP_INTERRUPTS];
	volatile u32 *mac_host_dsp_int_status;
	volatile u32 *mac_host_dsp_int_mask;
	volatile u32 *mac_host_dsp_sem;
	volatile u32 *mac_host_dsp_intgen;
	struct qtn_stats_log *mac_sys_stats;
	void *data;
	struct qdrv_mac_params params; /* Configurable parameters per MAC */
	volatile struct ruby_sys_ctrl_reg *ruby_sysctrl;
	int dead;
	int mgmt_dead;
	int ioctl_fail_count;
	int mac_active_bss;
	int mac_active_wds;
	struct qtn_cca_stats *cca_stats;
};

int qdrv_mac_init(struct qdrv_mac *mac, u8 *mac_addr, int unit, int irq, struct qdrv_mac_params *params);
int qdrv_mac_exit(struct qdrv_mac *mac);
int qdrv_mac_set_handler(struct qdrv_mac *mac, int irq,
	struct int_handler *handler);
int qdrv_mac_set_host_dsp_handler(struct qdrv_mac *mac, int irq,
	struct int_handler *handler);
int qdrv_mac_clear_handler(struct qdrv_mac *mac, int irq);
void qdrv_mac_interrupt_muc(struct qdrv_mac *mac);
void qdrv_mac_interrupt_muc_high(struct qdrv_mac *mac);
void qdrv_muc_died_sysfs(void);

static __always_inline void
qdrv_mac_enable_irq(struct qdrv_mac *mac, int irq)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)
	set_bit(irq, (volatile unsigned long *)mac->mac_host_int_mask);
#else
	set_bit(irq, mac->mac_host_int_mask);
#endif
}

static __always_inline void
qdrv_mac_disable_irq(struct qdrv_mac *mac, int irq)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)
	clear_bit(irq, (volatile unsigned long *)mac->mac_host_int_mask);
#else
	clear_bit(irq, mac->mac_host_int_mask);
#endif

}

static __always_inline void
qdrv_mac_die_action(struct qdrv_mac *mac)
{
	/*
	 * Mark the mac as dead so ioctls and transmissions are
	 * dropped.
	 */
	mac->dead = 1;
	qdrv_muc_died_sysfs();
}

#endif

