/*
*---------------------------------------------------------------------------
* FT1000 driver for Flarion Flash OFDM NIC Device
*
* Copyright (C) 2002 Flarion Technologies, 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., 59 Temple Place -
* Suite 330, Boston, MA 02111-1307, USA.
*---------------------------------------------------------------------------
*
* File:         ft1000_ioctl.h
*
* Description:    Common structures and defines relating to IOCTL
*
* History:
* 11/5/02    Whc                Created.
*
*---------------------------------------------------------------------------
*/
#ifndef _FT1000IOCTLH_
#define _FT1000IOCTLH_

struct IOCTL_GET_VER {
	unsigned long drv_ver;
} __packed;

/* Data structure for Dsp statistics */
struct IOCTL_GET_DSP_STAT {
	unsigned char DspVer[DSPVERSZ];        /* DSP version number */
	unsigned char HwSerNum[HWSERNUMSZ];    /* Hardware Serial Number */
	unsigned char Sku[SKUSZ];              /* SKU */
	unsigned char eui64[EUISZ];            /* EUI64 */
	unsigned short ConStat;                /* Connection Status */
	/*    Bits 0-3 = Connection Status Field */
	/*               0000=Idle (Disconnect) */
	/*               0001=Searching */
	/*               0010=Active (Connected) */
	/*               0011=Waiting for L2 down */
	/*               0100=Sleep */
	unsigned short LedStat;                /* Led Status */
	/*    Bits 0-3   = Signal Strength Field */
	/*                 0000 = -105dBm to -92dBm */
	/*                 0001 = -92dBm to -85dBm */
	/*                 0011 = -85dBm to -75dBm */
	/*                 0111 = -75dBm to -50dBm */
	/*                 1111 = -50dBm to 0dBm */
	/*    Bits 4-7   = Reserved */
	/*    Bits 8-11  = SNR Field */
	/*                 0000 = <2dB */
	/*                 0001 = 2dB to 8dB */
	/*                 0011 = 8dB to 15dB */
	/*                 0111 = 15dB to 22dB */
	/*                 1111 = >22dB */
	/*    Bits 12-15 = Reserved */
	unsigned long nTxPkts;                /* Number of packets transmitted
					       * from host to dsp
					       */
	unsigned long nRxPkts;                /* Number of packets received from
					       * dsp to host
					       */
	unsigned long nTxBytes;               /* Number of bytes transmitted
					       * from host to dsp
					       */
	unsigned long nRxBytes;               /* Number of bytes received from
					       * dsp to host
					       */
	unsigned long ConTm;                  /* Current session connection time
					       * in seconds
					       */
	unsigned char CalVer[CALVERSZ];       /* Proprietary Calibration
					       * Version
					       */
	unsigned char CalDate[CALDATESZ];     /* Proprietary Calibration Date */
} __packed;

/* Data structure for Dual Ported RAM messaging between Host and Dsp */
struct IOCTL_DPRAM_BLK {
	unsigned short total_len;
	struct pseudo_hdr pseudohdr;
	unsigned char buffer[1780];
} __packed;

struct IOCTL_DPRAM_COMMAND {
	unsigned short extra;
	struct IOCTL_DPRAM_BLK dpram_blk;
} __packed;

/*
* Custom IOCTL command codes
*/
#define FT1000_MAGIC_CODE      'F'

#define IOCTL_REGISTER_CMD	0
#define IOCTL_SET_DPRAM_CMD	3
#define IOCTL_GET_DPRAM_CMD	4
#define IOCTL_GET_DSP_STAT_CMD	6
#define IOCTL_GET_VER_CMD	7
#define IOCTL_CONNECT		10
#define IOCTL_DISCONNECT	11

#define IOCTL_FT1000_GET_DSP_STAT _IOR(FT1000_MAGIC_CODE,      \
				       IOCTL_GET_DSP_STAT_CMD, \
				       struct IOCTL_GET_DSP_STAT)
#define IOCTL_FT1000_GET_VER _IOR(FT1000_MAGIC_CODE, IOCTL_GET_VER_CMD, \
				  struct IOCTL_GET_VER)
#define IOCTL_FT1000_CONNECT _IO(FT1000_MAGIC_CODE, IOCTL_CONNECT)
#define IOCTL_FT1000_DISCONNECT _IO(FT1000_MAGIC_CODE, IOCTL_DISCONNECT)
#define IOCTL_FT1000_SET_DPRAM _IOW(FT1000_MAGIC_CODE, IOCTL_SET_DPRAM_CMD, \
				    struct IOCTL_DPRAM_BLK)
#define IOCTL_FT1000_GET_DPRAM _IOR(FT1000_MAGIC_CODE, IOCTL_GET_DPRAM_CMD, \
				    struct IOCTL_DPRAM_BLK)
#define IOCTL_FT1000_REGISTER  _IOW(FT1000_MAGIC_CODE, IOCTL_REGISTER_CMD, \
				    unsigned short *)

#endif /* _FT1000IOCTLH_ */
