/*******************************************************************************
 * 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 arround 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__

