/*******************************************************************************
 * Agere Systems Inc.
 * Wireless device driver for Linux (wlags49).
 *
 * Copyright (c) 1998-2003 Agere Systems Inc.
 * All rights reserved.
 *   http://www.agere.com
 *
 * Initially developed by TriplePoint, Inc.
 *   http://www.triplepoint.com
 *
 *------------------------------------------------------------------------------
 *
 *   Driver common header for info needed by driver source and user-space
 *   processes communicating with the driver.
 *
 *------------------------------------------------------------------------------
 *
 * SOFTWARE LICENSE
 *
 * This software is provided subject to the following terms and conditions,
 * which you should read carefully before using the software.  Using this
 * software indicates your acceptance of these terms and conditions.  If you do
 * not agree with these terms and conditions, do not use the software.
 *
 * Copyright © 2003 Agere Systems Inc.
 * All rights reserved.
 *
 * Redistribution and use in source or binary forms, with or without
 * modifications, are permitted provided that the following conditions are met:
 *
 * . Redistributions of source code must retain the above copyright notice, this
 *    list of conditions and the following Disclaimer as comments in the code as
 *    well as in the documentation and/or other materials provided with the
 *    distribution.
 *
 * . Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following Disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 * . Neither the name of Agere Systems Inc. nor the names of the contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * Disclaimer
 *
 * THIS SOFTWARE IS PROVIDED AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  ANY
 * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN
 * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *
 ******************************************************************************/

#ifndef __WAVELAN2_IF_H__
#define __WAVELAN2_IF_H__




/*******************************************************************************
 *  constant definitions
 ******************************************************************************/
#define MAX_LTV_BUF_SIZE            (512 - (sizeof(hcf_16) * 2))

#define HCF_TALLIES_SIZE            (sizeof(CFG_HERMES_TALLIES_STRCT) + \
                                     (sizeof(hcf_16) * 2))

#define HCF_MAX_MULTICAST           16
#define HCF_MAX_NAME_LEN            32
#define MAX_LINE_SIZE   			256
#define HCF_NUM_IO_PORTS            0x80
#define TX_TIMEOUT                  ((800 * HZ) / 1000)


//#define HCF_MIN_COMM_QUALITY        0
//#define HCF_MAX_COMM_QUALITY        92
//#define HCF_MIN_SIGNAL_LEVEL        47
//#define HCF_MAX_SIGNAL_LEVEL        138
//#define HCF_MIN_NOISE_LEVEL         47
//#define HCF_MAX_NOISE_LEVEL         138
//#define HCF_0DBM_OFFSET             149

// PE1DNN
// Better data from the real world. Not scientific but empirical data gathered
// from a Thomson Speedtouch 110 which is identified as:
// PCMCIA Info: "Agere Systems" "Wireless PC Card Model 0110"
//              Manufacture ID: 0156,0003
// Lowest measurment for noise floor seen is value 54
// Highest signal strength in close proximity to the AP seen is value 118
// Very good must be around 100 (otherwise its never "full scale"
// All other constants are derrived from these. This makes the signal gauge
// work for me...
#define HCF_MIN_SIGNAL_LEVEL        54
#define HCF_MAX_SIGNAL_LEVEL        100
#define HCF_MIN_NOISE_LEVEL         HCF_MIN_SIGNAL_LEVEL
#define HCF_MAX_NOISE_LEVEL         HCF_MAX_SIGNAL_LEVEL
#define HCF_0DBM_OFFSET             (HCF_MAX_SIGNAL_LEVEL + 1)
#define HCF_MIN_COMM_QUALITY        0
#define HCF_MAX_COMM_QUALITY        (HCF_MAX_SIGNAL_LEVEL - HCF_MIN_NOISE_LEVEL + 1)


/* For encryption (WEP) */
#define MIN_KEY_SIZE                5       // 40 bits RC4 - WEP
#define MAX_KEY_SIZE                13      // 104 bits
#define MAX_KEYS                    4

#define RADIO_CHANNELS              14
#define RADIO_SENSITIVITY_LEVELS    3
#define RADIO_TX_POWER_MWATT        32
#define RADIO_TX_POWER_DBM          15

#define MIN_RTS_BYTES               0
#define MAX_RTS_BYTES               2347

#define MAX_RATES                   8
#define MEGABIT                     1024*1024

#define HCF_FAILURE                 0xFF
#define UIL_FAILURE		            0xFF
#define CFG_UIL_CONNECT             0xA123          // Define differently?
#define CFG_UIL_CONNECT_ACK_CODE    0x5653435A      // VSCZ
#define WVLAN2_UIL_CONNECTED        (0x01L << 0)
#define WVLAN2_UIL_BUSY             (0x01L << 1)




/*******************************************************************************
 * driver ioctl interface
 ******************************************************************************/
#define WVLAN2_IOCTL_UIL            SIOCDEVPRIVATE

/* The UIL Interface used in conjunction with the WVLAN2_IOCTL_UIL code above
   is defined in mdd.h. A quick reference of the UIL codes is listed below */
/*
UIL_FUN_CONNECT
UIL_FUN_DISCONNECT
UIL_FUN_ACTION
    UIL_ACT_BLOCK
    UIL_ACT_UNBLOCK
    UIL_ACT_SCA
    UIL_ACT_DIAG
    UIL_ACT_APPLY
UIL_FUN_SEND_DIAG_MSG
UIL_FUN_GET_INFO
UIL_FUN_PUT_INFO
*/

#define SIOCSIWNETNAME              SIOCDEVPRIVATE+1
#define SIOCGIWNETNAME              SIOCDEVPRIVATE+2
#define SIOCSIWSTANAME              SIOCDEVPRIVATE+3
#define SIOCGIWSTANAME              SIOCDEVPRIVATE+4
#define SIOCSIWPORTTYPE             SIOCDEVPRIVATE+5
#define SIOCGIWPORTTYPE             SIOCDEVPRIVATE+6

/* IOCTL code for the RTS interface */
#define WL_IOCTL_RTS                SIOCDEVPRIVATE+7

/* IOCTL subcodes for WL_IOCTL_RTS */
#define WL_IOCTL_RTS_READ           1
#define WL_IOCTL_RTS_WRITE          2
#define WL_IOCTL_RTS_BATCH_READ     3
#define WL_IOCTL_RTS_BATCH_WRITE    4


/*******************************************************************************
 * STRUCTURE DEFINITIONS
 ******************************************************************************/
typedef struct
{
    __u16   length;
    __u8    name[HCF_MAX_NAME_LEN];
}
wvName_t;


typedef struct
{
    hcf_16      len;
    hcf_16      typ;
    union
    {
        hcf_8       u8[MAX_LTV_BUF_SIZE / sizeof(hcf_8)];
        hcf_16      u16[MAX_LTV_BUF_SIZE / sizeof(hcf_16)];
        hcf_32      u32[MAX_LTV_BUF_SIZE / sizeof(hcf_32)];
    } u;
}
ltv_t;


struct uilreq
{
    union
    {
        char    ifrn_name[IFNAMSIZ];
    } ifr_ifrn;

    IFBP        hcfCtx;
    __u8        command;
    __u8        result;

    /* The data field in this structure is typically an LTV of some type. The
       len field is the size of the buffer in bytes, as opposed to words (like
       the L-field in the LTV */
    __u16       len;
    void       *data;
};


struct rtsreq
{
    union
    {
        char    ifrn_name[IFNAMSIZ];
    }
    ifr_ifrn;

    __u16   typ;
    __u16   reg;
    __u16   len;
    __u16   *data;
};


#endif  // __WAVELAN2_IF_H__

