/*
 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
 * 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.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * File: rxtx.h
 *
 * Purpose:
 *
 * Author: Jerry Chen
 *
 * Date: Jun. 27, 2002
 *
 */

#ifndef __RXTX_H__
#define __RXTX_H__

#include "ttype.h"
#include "device.h"
#include "wcmd.h"

/*---------------------  Export Definitions -------------------------*/

/*---------------------  Export Classes  ----------------------------*/

//
// RTS buffer header
//
typedef struct tagSRTSDataF {
    WORD    wFrameControl;
    WORD    wDurationID;
    BYTE    abyRA[ETH_ALEN];
    BYTE    abyTA[ETH_ALEN];
} SRTSDataF, *PSRTSDataF;

//
// CTS buffer header
//
typedef struct tagSCTSDataF {
    WORD    wFrameControl;
    WORD    wDurationID;
    BYTE    abyRA[ETH_ALEN];
    WORD    wReserved;
} SCTSDataF, *PSCTSDataF;

//
// MICHDR data header
//
typedef struct tagSMICHDR {
    DWORD   adwHDR0[4];
    DWORD   adwHDR1[4];
    DWORD   adwHDR2[4];
} SMICHDR, *PSMICHDR;


typedef struct tagSTX_NAF_G_RTS
{
    //RsvTime
    WORD            wRTSTxRrvTime_ba;
    WORD            wRTSTxRrvTime_aa;
    WORD            wRTSTxRrvTime_bb;
    WORD            wReserved2;
    WORD            wTxRrvTime_b;
    WORD            wTxRrvTime_a;

    //RTS
    BYTE            byRTSSignalField_b;
    BYTE            byRTSServiceField_b;
    WORD            wRTSTransmitLength_b;
    BYTE            byRTSSignalField_a;
    BYTE            byRTSServiceField_a;
    WORD            wRTSTransmitLength_a;
    WORD            wRTSDuration_ba;
    WORD            wRTSDuration_aa;
    WORD            wRTSDuration_bb;
    WORD            wReserved3;
    SRTSDataF       sRTS;

    //Data
    BYTE            bySignalField_b;
    BYTE            byServiceField_b;
    WORD            wTransmitLength_b;
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_b;
    WORD            wDuration_a;
    WORD            wTimeStampOff_b;
    WORD            wTimeStampOff_a;

} TX_NAF_G_RTS, *PTX_NAF_G_RTS;

typedef struct tagSTX_NAF_G_RTS_MIC
{
    //RsvTime
    WORD            wRTSTxRrvTime_ba;
    WORD            wRTSTxRrvTime_aa;
    WORD            wRTSTxRrvTime_bb;
    WORD            wReserved2;
    WORD            wTxRrvTime_b;
    WORD            wTxRrvTime_a;

    SMICHDR         sMICHDR;

    //RTS
    BYTE            byRTSSignalField_b;
    BYTE            byRTSServiceField_b;
    WORD            wRTSTransmitLength_b;
    BYTE            byRTSSignalField_a;
    BYTE            byRTSServiceField_a;
    WORD            wRTSTransmitLength_a;
    WORD            wRTSDuration_ba;
    WORD            wRTSDuration_aa;
    WORD            wRTSDuration_bb;
    WORD            wReserved3;
    SRTSDataF       sRTS;

    //Data
    BYTE            bySignalField_b;
    BYTE            byServiceField_b;
    WORD            wTransmitLength_b;
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_b;
    WORD            wDuration_a;
    WORD            wTimeStampOff_b;
    WORD            wTimeStampOff_a;

} TX_NAF_G_RTS_MIC, *PTX_NAF_G_RTS_MIC;

typedef struct tagSTX_NAF_G_CTS
{
    //RsvTime
    WORD            wCTSTxRrvTime_ba;
    WORD            wReserved2;
    WORD            wTxRrvTime_b;
    WORD            wTxRrvTime_a;

    //CTS
    BYTE            byCTSSignalField_b;
    BYTE            byCTSServiceField_b;
    WORD            wCTSTransmitLength_b;
    WORD            wCTSDuration_ba;
    WORD            wReserved3;
    SCTSDataF       sCTS;

    //Data
    BYTE            bySignalField_b;
    BYTE            byServiceField_b;
    WORD            wTransmitLength_b;
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_b;
    WORD            wDuration_a;
    WORD            wTimeStampOff_b;
    WORD            wTimeStampOff_a;

} TX_NAF_G_CTS, *PTX_NAF_G_CTS;


typedef struct tagSTX_NAF_G_CTS_MIC
{
    //RsvTime
    WORD            wCTSTxRrvTime_ba;
    WORD            wReserved2;
    WORD            wTxRrvTime_b;
    WORD            wTxRrvTime_a;


    SMICHDR         sMICHDR;

    //CTS
    BYTE            byCTSSignalField_b;
    BYTE            byCTSServiceField_b;
    WORD            wCTSTransmitLength_b;
    WORD            wCTSDuration_ba;
    WORD            wReserved3;
    SCTSDataF       sCTS;

    //Data
    BYTE            bySignalField_b;
    BYTE            byServiceField_b;
    WORD            wTransmitLength_b;
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_b;
    WORD            wDuration_a;
    WORD            wTimeStampOff_b;
    WORD            wTimeStampOff_a;

} TX_NAF_G_CTS_MIC, *PTX_NAF_G_CTS_MIC;


typedef struct tagSTX_NAF_G_BEACON
{
    WORD            wFIFOCtl;
    WORD            wTimeStamp;

    //CTS
    BYTE            byCTSSignalField_b;
    BYTE            byCTSServiceField_b;
    WORD            wCTSTransmitLength_b;
    WORD            wCTSDuration_ba;
    WORD            wReserved1;
    SCTSDataF       sCTS;

    //Data
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_a;
    WORD            wTimeStampOff_a;


} TX_NAF_G_BEACON, *PTX_NAF_G_BEACON;


typedef struct tagSTX_NAF_AB_RTS
{
    //RsvTime
    WORD            wRTSTxRrvTime_ab;
    WORD            wTxRrvTime_ab;

    //RTS
    BYTE            byRTSSignalField_ab;
    BYTE            byRTSServiceField_ab;
    WORD            wRTSTransmitLength_ab;
    WORD            wRTSDuration_ab;
    WORD            wReserved2;
    SRTSDataF       sRTS;

    //Data
    BYTE            bySignalField_ab;
    BYTE            byServiceField_ab;
    WORD            wTransmitLength_ab;
    WORD            wDuration_ab;
    WORD            wTimeStampOff_ab;


} TX_NAF_AB_RTS, *PTX_NAF_AB_RTS;


typedef struct tagSTX_NAF_AB_RTS_MIC
{
    //RsvTime
    WORD            wRTSTxRrvTime_ab;
    WORD            wTxRrvTime_ab;

    SMICHDR         sMICHDR;

    //RTS
    BYTE            byRTSSignalField_ab;
    BYTE            byRTSServiceField_ab;
    WORD            wRTSTransmitLength_ab;
    WORD            wRTSDuration_ab;
    WORD            wReserved2;
    SRTSDataF       sRTS;

    //Data
    BYTE            bySignalField_ab;
    BYTE            byServiceField_ab;
    WORD            wTransmitLength_ab;
    WORD            wDuration_ab;
    WORD            wTimeStampOff_ab;


} TX_NAF_AB_RTS_MIC, *PTX_NAF_AB_RTS_MIC;



typedef struct tagSTX_NAF_AB_CTS
{
    //RsvTime
    WORD            wReserved2;
    WORD            wTxRrvTime_ab;

    //Data
    BYTE            bySignalField_ab;
    BYTE            byServiceField_ab;
    WORD            wTransmitLength_ab;
    WORD            wDuration_ab;
    WORD            wTimeStampOff_ab;

} TX_NAF_AB_CTS, *PTX_NAF_AB_CTS;

typedef struct tagSTX_NAF_AB_CTS_MIC
{
    //RsvTime
    WORD            wReserved2;
    WORD            wTxRrvTime_ab;

    SMICHDR         sMICHDR;

    //Data
    BYTE            bySignalField_ab;
    BYTE            byServiceField_ab;
    WORD            wTransmitLength_ab;
    WORD            wDuration_ab;
    WORD            wTimeStampOff_ab;

} TX_NAF_AB_CTS_MIC, *PTX_NAF_AB_CTS_MIC;


typedef struct tagSTX_NAF_AB_BEACON
{
    WORD            wFIFOCtl;
    WORD            wTimeStamp;

   //Data
    BYTE            bySignalField_ab;
    BYTE            byServiceField_ab;
    WORD            wTransmitLength_ab;
    WORD            wDuration_ab;
    WORD            wTimeStampOff_ab;

} TX_NAF_AB_BEACON, *PTX_NAF_AB_BEACON;

typedef struct tagSTX_AF_G_RTS
{
    //RsvTime
    WORD            wRTSTxRrvTime_ba;
    WORD            wRTSTxRrvTime_aa;
    WORD            wRTSTxRrvTime_bb;
    WORD            wReserved2;
    WORD            wTxRrvTime_b;
    WORD            wTxRrvTime_a;

    //RTS
    BYTE            byRTSSignalField_b;
    BYTE            byRTSServiceField_b;
    WORD            wRTSTransmitLength_b;
    BYTE            byRTSSignalField_a;
    BYTE            byRTSServiceField_a;
    WORD            wRTSTransmitLength_a;
    WORD            wRTSDuration_ba;
    WORD            wRTSDuration_aa;
    WORD            wRTSDuration_bb;
    WORD            wReserved3;
    WORD            wRTSDuration_ba_f0;
    WORD            wRTSDuration_aa_f0;
    WORD            wRTSDuration_ba_f1;
    WORD            wRTSDuration_aa_f1;
    SRTSDataF       sRTS;

    //Data
    BYTE            bySignalField_b;
    BYTE            byServiceField_b;
    WORD            wTransmitLength_b;
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_b;
    WORD            wDuration_a;
    WORD            wDuration_a_f0;
    WORD            wDuration_a_f1;
    WORD            wTimeStampOff_b;
    WORD            wTimeStampOff_a;

} TX_AF_G_RTS, *PTX_AF_G_RTS;


typedef struct tagSTX_AF_G_RTS_MIC
{
    //RsvTime
    WORD            wRTSTxRrvTime_ba;
    WORD            wRTSTxRrvTime_aa;
    WORD            wRTSTxRrvTime_bb;
    WORD            wReserved2;
    WORD            wTxRrvTime_b;
    WORD            wTxRrvTime_a;

    SMICHDR         sMICHDR;

    //RTS
    BYTE            byRTSSignalField_b;
    BYTE            byRTSServiceField_b;
    WORD            wRTSTransmitLength_b;
    BYTE            byRTSSignalField_a;
    BYTE            byRTSServiceField_a;
    WORD            wRTSTransmitLength_a;
    WORD            wRTSDuration_ba;
    WORD            wRTSDuration_aa;
    WORD            wRTSDuration_bb;
    WORD            wReserved3;
    WORD            wRTSDuration_ba_f0;
    WORD            wRTSDuration_aa_f0;
    WORD            wRTSDuration_ba_f1;
    WORD            wRTSDuration_aa_f1;
    SRTSDataF       sRTS;

    //Data
    BYTE            bySignalField_b;
    BYTE            byServiceField_b;
    WORD            wTransmitLength_b;
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_b;
    WORD            wDuration_a;
    WORD            wDuration_a_f0;
    WORD            wDuration_a_f1;
    WORD            wTimeStampOff_b;
    WORD            wTimeStampOff_a;

} TX_AF_G_RTS_MIC, *PTX_AF_G_RTS_MIC;



typedef struct tagSTX_AF_G_CTS
{
    //RsvTime
    WORD            wCTSTxRrvTime_ba;
    WORD            wReserved2;
    WORD            wTxRrvTime_b;
    WORD            wTxRrvTime_a;

    //CTS
    BYTE            byCTSSignalField_b;
    BYTE            byCTSServiceField_b;
    WORD            wCTSTransmitLength_b;
    WORD            wCTSDuration_ba;
    WORD            wReserved3;
    WORD            wCTSDuration_ba_f0;
    WORD            wCTSDuration_ba_f1;
    SCTSDataF       sCTS;

    //Data
    BYTE            bySignalField_b;
    BYTE            byServiceField_b;
    WORD            wTransmitLength_b;
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_b;
    WORD            wDuration_a;
    WORD            wDuration_a_f0;
    WORD            wDuration_a_f1;
    WORD            wTimeStampOff_b;
    WORD            wTimeStampOff_a;

} TX_AF_G_CTS, *PTX_AF_G_CTS;


typedef struct tagSTX_AF_G_CTS_MIC
{
    //RsvTime
    WORD            wCTSTxRrvTime_ba;
    WORD            wReserved2;
    WORD            wTxRrvTime_b;
    WORD            wTxRrvTime_a;


    SMICHDR         sMICHDR;

    //CTS
    BYTE            byCTSSignalField_b;
    BYTE            byCTSServiceField_b;
    WORD            wCTSTransmitLength_b;
    WORD            wCTSDuration_ba;
    WORD            wReserved3;
    WORD            wCTSDuration_ba_f0;
    WORD            wCTSDuration_ba_f1;
    SCTSDataF       sCTS;

    //Data
    BYTE            bySignalField_b;
    BYTE            byServiceField_b;
    WORD            wTransmitLength_b;
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_b;
    WORD            wDuration_a;
    WORD            wDuration_a_f0;
    WORD            wDuration_a_f1;
    WORD            wTimeStampOff_b;
    WORD            wTimeStampOff_a;

} TX_AF_G_CTS_MIC, *PTX_AF_G_CTS_MIC;



typedef struct tagSTX_AF_A_RTS
{
    //RsvTime
    WORD            wRTSTxRrvTime_a;
    WORD            wTxRrvTime_a;

    //RTS
    BYTE            byRTSSignalField_a;
    BYTE            byRTSServiceField_a;
    WORD            wRTSTransmitLength_a;
    WORD            wRTSDuration_a;
    WORD            wReserved2;
    WORD            wRTSDuration_a_f0;
    WORD            wRTSDuration_a_f1;
    SRTSDataF       sRTS;

    //Data
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_a;
    WORD            wTimeStampOff_a;
    WORD            wDuration_a_f0;
    WORD            wDuration_a_f1;

} TX_AF_A_RTS, *PTX_AF_A_RTS;


typedef struct tagSTX_AF_A_RTS_MIC
{
    //RsvTime
    WORD            wRTSTxRrvTime_a;
    WORD            wTxRrvTime_a;

    SMICHDR         sMICHDR;

    //RTS
    BYTE            byRTSSignalField_a;
    BYTE            byRTSServiceField_a;
    WORD            wRTSTransmitLength_a;
    WORD            wRTSDuration_a;
    WORD            wReserved2;
    WORD            wRTSDuration_a_f0;
    WORD            wRTSDuration_a_f1;
    SRTSDataF       sRTS;

    //Data
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_a;
    WORD            wTimeStampOff_a;
    WORD            wDuration_a_f0;
    WORD            wDuration_a_f1;

} TX_AF_A_RTS_MIC, *PTX_AF_A_RTS_MIC;



typedef struct tagSTX_AF_A_CTS
{
    //RsvTime
    WORD            wReserved2;
    WORD            wTxRrvTime_a;

    //Data
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_a;
    WORD            wTimeStampOff_a;
    WORD            wDuration_a_f0;
    WORD            wDuration_a_f1;

} TX_AF_A_CTS, *PTX_AF_A_CTS;


typedef struct tagSTX_AF_A_CTS_MIC
{
    //RsvTime
    WORD            wReserved2;
    WORD            wTxRrvTime_a;

    SMICHDR         sMICHDR;

    //Data
    BYTE            bySignalField_a;
    BYTE            byServiceField_a;
    WORD            wTransmitLength_a;
    WORD            wDuration_a;
    WORD            wTimeStampOff_a;
    WORD            wDuration_a_f0;
    WORD            wDuration_a_f1;

} TX_AF_A_CTS_MIC, *PTX_AF_A_CTS_MIC;


//
// union with all of the TX Buffer Type
//
typedef union tagUTX_BUFFER_CONTAINER
{
    TX_NAF_G_RTS                    RTS_G;
    TX_NAF_G_RTS_MIC                RTS_G_MIC;
    TX_NAF_G_CTS                    CTS_G;
    TX_NAF_G_CTS_MIC                CTS_G_MIC;
    //TX_NAF_G_BEACON                 Beacon_G;
    TX_NAF_AB_RTS                   RTS_AB;
    TX_NAF_AB_RTS_MIC               RTS_AB_MIC;
    TX_NAF_AB_CTS                   CTS_AB;
    TX_NAF_AB_CTS_MIC               CTS_AB_MIC;
    //TX_NAF_AB_BEACON                Beacon_AB;
    TX_AF_G_RTS                     RTS_G_AutoFB;
    TX_AF_G_RTS_MIC                 RTS_G_AutoFB_MIC;
    TX_AF_G_CTS                     CTS_G_AutoFB;
    TX_AF_G_CTS_MIC                 CTS_G_AutoFB_MIC;
    TX_AF_A_RTS                     RTS_A_AutoFB;
    TX_AF_A_RTS_MIC                 RTS_A_AutoFB_MIC;
    TX_AF_A_CTS                     CTS_A_AutoFB;
    TX_AF_A_CTS_MIC                 CTS_A_AutoFB_MIC;

} TX_BUFFER_CONTAINER, *PTX_BUFFER_CONTAINER;


//
// Remote NDIS message format
//
typedef struct tagSTX_BUFFER
{
    BYTE                            byType;
    BYTE                            byPKTNO;
    WORD                            wTxByteCount;

    DWORD                           adwTxKey[4];
    WORD                            wFIFOCtl;
    WORD                            wTimeStamp;
    WORD                            wFragCtl;
    WORD                            wReserved;


    // Actual message
    TX_BUFFER_CONTAINER             BufferHeader;

} TX_BUFFER, *PTX_BUFFER;


//
// Remote NDIS message format
//
typedef struct tagSBEACON_BUFFER
{
    BYTE                            byType;
    BYTE                            byPKTNO;
    WORD                            wTxByteCount;

    WORD                            wFIFOCtl;
    WORD                            wTimeStamp;

    // Actual message
    TX_BUFFER_CONTAINER             BufferHeader;

} BEACON_BUFFER, *PBEACON_BUFFER;


/*---------------------  Export Variables  --------------------------*/

/*---------------------  Export Functions  --------------------------*/

BOOL
bPacketToWirelessUsb(
      PSDevice         pDevice,
      BYTE             byPktType,
      PBYTE            usbPacketBuf,
      BOOL             bNeedEncrypt,
      unsigned int             cbPayloadSize,
      unsigned int             uDMAIdx,
      PSEthernetHeader psEthHeader,
      PBYTE            pPacket,
      PSKeyItem        pTransmitKey,
      unsigned int             uNodeIndex,
      WORD             wCurrentRate,
     unsigned int             *pcbHeaderLen,
     unsigned int             *pcbTotalLen
    );

void vDMA0_tx_80211(PSDevice  pDevice, struct sk_buff *skb);
int nsDMA_tx_packet(PSDevice pDevice,
		    unsigned int uDMAIdx,
		    struct sk_buff *skb);
CMD_STATUS csMgmt_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket);
CMD_STATUS csBeacon_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket);
BOOL bRelayPacketSend(PSDevice pDevice, PBYTE pbySkbData,
		      unsigned int uDataLen, unsigned int uNodeIndex);

#endif /* __RXTX_H__ */
