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

#define DSPVERSZ                4
#define HWSERNUMSZ              16
#define SKUSZ                   20
#define EUISZ                   8
#define CALVERSZ                2
#define CALDATESZ               6

#define MAX_DNLD_BLKSZ          1024

// Standard Flarion Pseudo header
struct pseudo_hdr {
   unsigned short    length;           //length of msg body
   unsigned char     source;           //source address (0x10=Host 0x20=DSP)
   unsigned char     destination;      //destination address (refer to source address)
   unsigned char     portdest;         //destination port id
                                       //    0x00=Driver
                                       //    0x10=Application Broadcast
                                       //    0x20=Network Stack
                                       //    0x80=Dsp OAM
                                       //    0x90=Dsp Airlink
                                       //    0xa0=Dsp Loader
                                       //    0xb0=Dsp MIP
   unsigned char     portsrc;          //source port id (refer to portdest)
   unsigned short    sh_str_id;        //stream id (Not applicable on Mobile)
   unsigned char     control;          //stream id (Not applicable on Mobile)
   unsigned char     rsvd1;            //reserved
   unsigned char     seq_num;          //sequence number
   unsigned char     rsvd2;            //reserved
   unsigned short    qos_class;        //Quality of Service class (Not applicable on Mobile)
   unsigned short    checksum;         //Psuedo header checksum
} __attribute__ ((packed));

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_

