/*
*---------------------------------------------------------------------------
* 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_

typedef struct _IOCTL_GET_VER {
    unsigned long drv_ver;
} __attribute__ ((packed)) IOCTL_GET_VER, *PIOCTL_GET_VER;

/* Data structure for Dsp statistics */
typedef 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 */
} __attribute__ ((packed)) IOCTL_GET_DSP_STAT, *PIOCTL_GET_DSP_STAT;

/* Data structure for Dual Ported RAM messaging between Host and Dsp */
typedef struct _IOCTL_DPRAM_BLK {
    unsigned short total_len;
	struct pseudo_hdr pseudohdr;
    unsigned char buffer[1780];
} __attribute__ ((packed)) IOCTL_DPRAM_BLK, *PIOCTL_DPRAM_BLK;

typedef struct _IOCTL_DPRAM_COMMAND {
    unsigned short extra;
    IOCTL_DPRAM_BLK dpram_blk;
} __attribute__ ((packed)) IOCTL_DPRAM_COMMAND, *PIOCTL_DPRAM_COMMAND;

/*
* 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, sizeof(IOCTL_GET_DSP_STAT)
#define IOCTL_FT1000_GET_VER _IOR(FT1000_MAGIC_CODE, IOCTL_GET_VER_CMD, sizeof(IOCTL_GET_VER)
#define IOCTL_FT1000_CONNECT _IOW(FT1000_MAGIC_CODE, IOCTL_CONNECT, 0
#define IOCTL_FT1000_DISCONNECT _IOW(FT1000_MAGIC_CODE, IOCTL_DISCONNECT, 0
#define IOCTL_FT1000_SET_DPRAM _IOW(FT1000_MAGIC_CODE, IOCTL_SET_DPRAM_CMD, sizeof(IOCTL_DPRAM_BLK)
#define IOCTL_FT1000_GET_DPRAM _IOR(FT1000_MAGIC_CODE, IOCTL_GET_DPRAM_CMD, sizeof(IOCTL_DPRAM_BLK)
#define IOCTL_FT1000_REGISTER  _IOW(FT1000_MAGIC_CODE, IOCTL_REGISTER_CMD, sizeof(unsigned short *)
#endif /* _FT1000IOCTLH_ */

