/*
 * Copyright (c) 2007-2008 Atheros Communications Inc.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
/*                                                                      */
/*  Module Name : usbdrv.h                                              */
/*                                                                      */
/*  Abstract                                                            */
/*     This module contains network interface up/down related definition*/
/*                                                                      */
/*  NOTES                                                               */
/*     Platform dependent.                                              */
/*                                                                      */
/************************************************************************/

#ifndef _USBDRV_H
#define _USBDRV_H

#define WLAN_USB    0
#define WLAN_PCI    1

#include <linux/module.h>
#include <linux/pci.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/uaccess.h>
#include <linux/wireless.h>
#include <linux/if_arp.h>
#include <linux/io.h>

#include "zdcompat.h"

#include "oal_dt.h"
#include "oal_marc.h"
#include "80211core/pub_zfi.h"
//#include "pub_zfw.h"
#include "80211core/pub_usb.h"

#include <linux/usb.h>
/* Please include header files for device type in the beginning of this file */
#define urb_t                       struct urb

#define usb_complete_t              usb_complete_t
#define pipe_t                      u32_t

/* USB Endpoint definition */
#define USB_WLAN_TX_PIPE                    1
#define USB_WLAN_RX_PIPE                    2
#define USB_REG_IN_PIPE                     3
#define USB_REG_OUT_PIPE                    4

#ifdef ZM_HOSTAPD_SUPPORT
#include "athr_common.h"
#endif

/**************************************************************************
**		Descriptor Data Structure
***************************************************************************/
struct driver_stats {
	struct net_device_stats net_stats;
};

#define ZM_MAX_RX_BUFFER_SIZE               8192

#if ZM_USB_TX_STREAM_MODE == 1
#define ZM_MAX_TX_AGGREGATE_NUM             4
#define ZM_USB_TX_BUF_SIZE                  8096
#define ZM_MAX_TX_URB_NUM                   4
#else
#define ZM_USB_TX_BUF_SIZE                  2048
#define ZM_MAX_TX_URB_NUM                   8
#endif
#define ZM_USB_REG_MAX_BUF_SIZE             64
#define ZM_MAX_RX_URB_NUM                   16
#define ZM_MAX_TX_BUF_NUM                   128

typedef struct UsbTxQ
{
    zbuf_t *buf;
    u8_t hdr[80];
    u16_t hdrlen;
    u8_t snap[8];
    u16_t snapLen;
    u8_t tail[16];
    u16_t tailLen;
    u16_t offset;
} UsbTxQ_t;


struct zdap_ioctl {
	u16_t cmd;                /* Command to run */
	u32_t addr;                /* Length of the data buffer */
	u32_t value;              /* Pointer to the data buffer */
	u8_t	data[0x100];
};

#define ZM_OAL_MAX_STA_SUPPORT 16

struct usbdrv_private
{
	//linux used
	struct net_device 	*device;
#if (WLAN_HOSTIF == WLAN_PCI)
	struct pci_dev 		*pdev;
#endif
#if (WLAN_HOSTIF == WLAN_USB)
	struct usb_device	*udev;
	struct usb_interface    *interface;
#endif
	struct driver_stats drv_stats;
	char ifname[IFNAMSIZ];
	int	                using_dac;
	u8_t			rev_id;		/* adapter PCI revision ID */
	rwlock_t 		isolate_lock;
    spinlock_t      cs_lock;
	int 			driver_isolated;
#if (WLAN_HOSTIF == WLAN_PCI)
	void			*regp;
#endif

        /* timer for heart beat */
	struct timer_list hbTimer10ms;

	/* For driver core */
	void* wd;

#if (WLAN_HOSTIF == WLAN_USB)
	u8_t                    txUsbBuf[ZM_MAX_TX_URB_NUM][ZM_USB_TX_BUF_SIZE];
	u8_t                    regUsbReadBuf[ZM_USB_REG_MAX_BUF_SIZE];
	u8_t                    regUsbWriteBuf[ZM_USB_REG_MAX_BUF_SIZE];
	urb_t			*WlanTxDataUrb[ZM_MAX_TX_URB_NUM];
	urb_t			*WlanRxDataUrb[ZM_MAX_RX_URB_NUM];
	urb_t			*RegOutUrb;
	urb_t			*RegInUrb;
	UsbTxQ_t                UsbTxBufQ[ZM_MAX_TX_BUF_NUM];
	zbuf_t                  *UsbRxBufQ[ZM_MAX_RX_URB_NUM];
        u16_t                   TxBufHead;
        u16_t                   TxBufTail;
        u16_t                   TxBufCnt;
        u16_t                   TxUrbHead;
        u16_t                   TxUrbTail;
        u16_t                   TxUrbCnt;
        u16_t                   RxBufHead;
        u16_t                   RxBufTail;
        u16_t                   RxBufCnt;
#endif

#if ZM_USB_STREAM_MODE == 1
        zbuf_t                  *reamin_buf;
#endif

#ifdef ZM_HOSTAPD_SUPPORT
        struct athr_wlan_param  athr_wpa_req;
#endif
        struct sock             *netlink_sk;
        u8_t            DeviceOpened; //CWYang(+)
        u8_t            supIe[50];
        u8_t            supLen;
        struct ieee80211req_wpaie stawpaie[ZM_OAL_MAX_STA_SUPPORT];
        u8_t            forwardMgmt;

        struct zfCbUsbFuncTbl usbCbFunctions;

        /* For keventd */
        u32_t                   flags;
        unsigned long           kevent_flags;
        u16_t                   kevent_ready;

        struct semaphore        ioctl_sem;
        struct work_struct      kevent;
        wait_queue_head_t       wait_queue_event;
#ifdef ZM_HALPLUS_LOCK
        unsigned long           hal_irqFlag;
#endif
        u16_t                   adapterState;
};

/* WDS */
#define ZM_WDS_PORT_NUMBER  6

struct zsWdsStruct
{
    struct net_device* dev;
    u16_t openFlag;
};

/* VAP */
#define ZM_VAP_PORT_NUMBER  7

struct zsVapStruct
{
    struct net_device* dev;
    u16_t openFlag;
};

/***************************************/

#define ZM_IOCTL_REG_READ			0x01
#define ZM_IOCTL_REG_WRITE			0x02
#define ZM_IOCTL_MEM_DUMP			0x03
#define ZM_IOCTL_REG_DUMP			0x05
#define ZM_IOCTL_TXD_DUMP 			0x06
#define ZM_IOCTL_RXD_DUMP 			0x07
#define ZM_IOCTL_MEM_READ			0x0B
#define ZM_IOCTL_MEM_WRITE			0x0C
#define ZM_IOCTL_DMA_TEST           0x10
#define ZM_IOCTL_REG_TEST           0x11
#define ZM_IOCTL_TEST               0x80
#define ZM_IOCTL_TALLY              0x81 //CWYang(+)
#define ZM_IOCTL_RTS                0xA0
#define ZM_IOCTL_MIX_MODE           0xA1
#define ZM_IOCTL_FRAG               0xA2
#define ZM_IOCTL_SCAN               0xA3
#define ZM_IOCTL_KEY                0xA4
#define ZM_IOCTL_RATE               0xA5
#define ZM_IOCTL_ENCRYPTION_MODE    0xA6
#define ZM_IOCTL_GET_TXCNT          0xA7
#define ZM_IOCTL_GET_DEAGG_CNT      0xA8
#define ZM_IOCTL_DURATION_MODE      0xA9
#define ZM_IOCTL_SET_AES_KEY        0xAA
#define ZM_IOCTL_SET_AES_MODE       0xAB
#define ZM_IOCTL_SIGNAL_STRENGTH    0xAC //CWYang(+)
#define ZM_IOCTL_SIGNAL_QUALITY     0xAD //CWYang(+)
#define ZM_IOCTL_SET_PIBSS_MODE     0xAE

#define	ZDAPIOCTL				SIOCDEVPRIVATE

enum devState {
    Opened,
    Enabled,
    Disabled,
    Closed
};

#endif	/* _USBDRV_H */

