/*
    FILE:   adapter.h
    DATE:   2/7/00

    This file contains the hardware interface to the ethernet adapter.
*/

#ifndef _ADAPTER_H_
#define _ADAPTER_H_

#ifdef __cplusplus
extern "C" {
#endif

#define HDA_VERSION_STRING "HDR A: $Revision: #46 $"

#ifdef MODS_NETWORK_BUILD
#ifndef _DRVAPP_H_
#include "drvapp.h"
#endif
#endif

//////////////////////////////////////////////////////////////////
// For the set and get configuration calls.
typedef struct  _ADAPTER_CONFIG
{
    NV_UINT32   ulFlags;
}   ADAPTER_CONFIG, *PADAPTER_CONFIG;
//////////////////////////////////////////////////////////////////

typedef struct _ADAPTER_WRITE_OFFLOAD
{
    NV_UINT32   usBitmask;
    NV_UINT32   ulMss;

} ADAPTER_WRITE_OFFLOAD;

//////////////////////////////////////////////////////////////////
// For the ADAPTER_Write1 call.
/* This scatter gather list should be same as defined in ndis.h by MS.
   For ULONG_PTR MS header file says that it will be of same size as
   pointer. It has been defined to take care of casting between differenet
   sizes.
*/
typedef struct _NVSCATTER_GATHER_ELEMENT {
    NV_UINT32 PhysLow;
    NV_UINT32 PhysHigh;
    NV_UINT32 Length;
    NV_VOID *Reserved;
} NVSCATTER_GATHER_ELEMENT, *PNVSCATTER_GATHER_ELEMENT;

#ifndef linux
#pragma warning(disable:4200)
#endif
typedef struct _NVSCATTER_GATHER_LIST {
    NV_UINT32       NumberOfElements;
    NV_VOID         *Reserved;
    NVSCATTER_GATHER_ELEMENT Elements[0];   // Made 0 sized element to remove MODS compilation error
                                            // Elements[0] and Elements[] have the same effect. 
                                            // sizeof(NVSCATTER_GATHER_LIST) is the same (value of 8) in both cases
                                            // And both lead to Warning 4200 in MSVC
} NVSCATTER_GATHER_LIST, *PNVSCATTER_GATHER_LIST;
#ifndef linux
#pragma warning(default:4200)
#endif

typedef struct  _ADAPTER_WRITE_DATA1
{
    NV_UINT32                   ulTotalLength;
    PNV_VOID                    pvID;
    NV_UINT8                    uc8021pPriority;
    ADAPTER_WRITE_OFFLOAD       *psOffload;
    PNVSCATTER_GATHER_LIST      pNVSGL;
}   ADAPTER_WRITE_DATA1, *PADAPTER_WRITE_DATA1;


//////////////////////////////////////////////////////////////////
// For the ADAPTER_Write call.
typedef struct  _ADAPTER_WRITE_ELEMENT
{
    PNV_VOID   pPhysical;
    NV_UINT32   ulLength;
}   ADAPTER_WRITE_ELEMENT, *PADAPTER_WRITE_ELEMENT;


#define ADAPTER_WRITE_OFFLOAD_BP_SEGOFFLOAD      0
#define ADAPTER_WRITE_OFFLOAD_BP_IPV4CHECKSUM    1
#define ADAPTER_WRITE_OFFLOAD_BP_IPV6CHECKSUM    2
#define ADAPTER_WRITE_OFFLOAD_BP_TCPCHECKSUM     3
#define ADAPTER_WRITE_OFFLOAD_BP_UDPCHECKSUM     4
#define ADAPTER_WRITE_OFFLOAD_BP_IPCHECKSUM      5


// pvID is a value that will be passed back into OSAPI.pfnPacketWasSent
// when the transmission completes. if pvID is NULL, the ADAPTER code
// assumes the caller does not want the pfnPacketWasSent callback.
typedef struct  _ADAPTER_WRITE_DATA
{
    NV_UINT32                   ulNumberOfElements;
    NV_UINT32                   ulTotalLength;
    PNV_VOID                    pvID;
    NV_UINT8                    uc8021pPriority;
    ADAPTER_WRITE_OFFLOAD       *psOffload;
    ADAPTER_WRITE_ELEMENT       sElement[100];
}   ADAPTER_WRITE_DATA, *PADAPTER_WRITE_DATA;
//////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////
// For the ADAPTER_Read call.
typedef struct  _ADAPTER_READ_ELEMENT
{
    PNV_VOID   pPhysical;
    NV_UINT32   ulLength;
}   ADAPTER_READ_ELEMENT, *PADAPTER_READ_ELEMENT;

typedef struct _ADAPTER_READ_OFFLOAD
{
    NV_UINT8  ucChecksumStatus;

} ADAPTER_READ_OFFLOAD;

typedef struct _ADAPTER_READ_DATA
{
    NV_UINT32                   ulNumberOfElements;
    NV_UINT32                   ulTotalLength;
    PNV_VOID                    pvID;
    NV_UINT32                   ulFilterMatch;
    ADAPTER_READ_OFFLOAD        sOffload;
    ADAPTER_READ_ELEMENT        sElement[10];
}   ADAPTER_READ_DATA, *PADAPTER_READ_DATA;


#define RDFLAG_CHK_NOCHECKSUM      0
#define RDFLAG_CHK_IPPASSTCPFAIL   1
#define RDFLAG_CHK_IPPASSUDPFAIL   2
#define RDFLAG_CHK_IPFAIL          3
#define RDFLAG_CHK_IPPASSNOTCPUDP  4
#define RDFLAG_CHK_IPPASSTCPPASS   5
#define RDFLAG_CHK_IPPASSUDPPASS   6
#define RDFLAG_CHK_RESERVED        7


// The ulFilterMatch flag can be a logical OR of the following
#define ADREADFL_UNICAST_MATCH          0x00000001
#define ADREADFL_MULTICAST_MATCH        0x00000002
#define ADREADFL_BROADCAST_MATCH        0x00000004
//////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////
// For the ADAPTER_GetPowerCapabilities call.
typedef struct  _ADAPTER_POWERCAPS
{
    NV_UINT32   ulPowerFlags;
    NV_UINT32   ulMagicPacketWakeUpFlags;
    NV_UINT32   ulPatternWakeUpFlags;
    NV_UINT32   ulLinkChangeWakeUpFlags;
    NV_SINT32     iMaxWakeUpPatterns;
}   ADAPTER_POWERCAPS, *PADAPTER_POWERCAPS;

// For the ADAPTER_GetPowerState and ADAPTER_SetPowerState call.
typedef struct  _ADAPTER_POWERSTATE
{
    NV_UINT32   ulPowerFlags;
    NV_UINT32   ulMagicPacketWakeUpFlags;
    NV_UINT32   ulPatternWakeUpFlags;
    NV_UINT32   ulLinkChangeWakeUpFlags;
}   ADAPTER_POWERSTATE, *PADAPTER_POWERSTATE;

// Each of the flag fields in the POWERCAPS structure above can have
// any of the following bitflags set giving the capabilites of the
// adapter. In the case of the wake up fields, these flags mean that
// wake up can happen from the specified power state.

// For the POWERSTATE structure, the ulPowerFlags field should just
// have one of these bits set to go to that particular power state.
// The WakeUp fields can have one or more of these bits set to indicate
// what states should be woken up from.
#define POWER_STATE_D0          0x00000001
#define POWER_STATE_D1          0x00000002
#define POWER_STATE_D2          0x00000004
#define POWER_STATE_D3          0x00000008

#define POWER_STATE_ALL         (POWER_STATE_D0 | \
                                POWER_STATE_D1  | \
                                POWER_STATE_D2  | \
                                POWER_STATE_D3)
//////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////
// The ADAPTER_GetPacketFilterCaps call returns a NV_UINT32 that can
// have the following capability bits set.
#define ACCEPT_UNICAST_PACKETS      0x00000001
#define ACCEPT_MULTICAST_PACKETS    0x00000002
#define ACCEPT_BROADCAST_PACKETS    0x00000004
#define ACCEPT_ALL_PACKETS          0x00000008

#define ETH_LENGTH_OF_ADDRESS        6

// The ADAPTER_SetPacketFilter call uses this structure to know what
// packet filter to set. The ulPacketFilter field can contain some
// union of the bit flags above. The acMulticastMask array holds a
// 48 bit MAC address mask with a 0 in every bit position that should
// be ignored on compare and a 1 in every bit position that should
// be taken into account when comparing to see if the destination
// address of a packet should be accepted for multicast.
typedef struct  _PACKET_FILTER
{
    NV_UINT32   ulFilterFlags;
    NV_UINT8   acMulticastAddress[ETH_LENGTH_OF_ADDRESS];
    NV_UINT8   acMulticastMask[ETH_LENGTH_OF_ADDRESS];
}   PACKET_FILTER, *PPACKET_FILTER;
//////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////
// A WAKE_UP_PATTERN is a 128-byte pattern that the adapter can
// look for in incoming packets to decide when to wake up.  Higher-
// level protocols can use this to, for example, wake up the
// adapter whenever it sees an IP packet that is addressed to it.
// A pattern consists of 128 bits of byte masks that indicate
// which bytes in the packet are relevant to the pattern, plus
// values for each byte.
#define WAKE_UP_PATTERN_SIZE 128

typedef struct _WAKE_UP_PATTERN
{
    NV_UINT32   aulByteMask[WAKE_UP_PATTERN_SIZE/32];
    NV_UINT8   acData[WAKE_UP_PATTERN_SIZE];
}   WAKE_UP_PATTERN, *PWAKE_UP_PATTERN;



//
//
// Adapter offload
//
typedef struct _ADAPTER_OFFLOAD {

    NV_UINT32 Type;
    NV_UINT32 Value0;

} ADAPTER_OFFLOAD, *PADAPTER_OFFLOAD;

#define ADAPTER_OFFLOAD_VLAN        0x00000001
#define ADAPTER_OFFLOAD_IEEE802_1P    0x00000002
#define ADAPTER_OFFLOAD_IEEE802_1PQ_PAD    0x00000004

//////////////////////////////////////////////////////////////////

//  CMNDATA_OS_ADAPTER
//  Structure common to OS and Adapter layers
//  Used for moving data from the OS layer to the adapter layer through SetCommonData 
//  function call from OS layer to Adapter layer
// 

typedef struct  _CMNDATA_OS_ADAPTER
{
#ifndef linux
    ASF_SEC0_BASE   sRegSec0Base;
#endif
    NV_UINT32           bFPGA; 
    NV_UINT32           ulFPGAEepromSize;
    NV_UINT32           bChecksumOffloadEnable;
    NV_UINT32           ulChecksumOffloadBM;
    NV_UINT32           ulChecksumOffloadOS;
    NV_UINT32           ulMediaIF;
    NV_UINT32           bOemCustomEventRead;

    // Debug only right now
    //!!! Beware mods is relying on the fields blow.
    NV_UINT32           ulWatermarkTFBW;
    NV_UINT32           ulBackoffRseed;
    NV_UINT32           ulBackoffSlotTime;
    NV_UINT32           ulModeRegTxReadCompleteEnable;
    NV_UINT32           ulFatalErrorRegister;

} CMNDATA_OS_ADAPTER;


//////////////////////////////////////////////////////////////////
// The functional typedefs for the ADAPTER Api
typedef NV_SINT32 (* PFN_ADAPTER_CLOSE)  (PNV_VOID pvContext, NV_UINT8 ucIsPowerDown);
typedef NV_SINT32 (* PFN_ADAPTER_INIT)  (PNV_VOID pvContext, NV_UINT16 usForcedSpeed, NV_UINT8 ucForceDpx, NV_UINT8 ucForceMode, NV_UINT8 ucAsyncMode, NV_UINT32 *puiLinkState);
typedef NV_SINT32 (* PFN_ADAPTER_DEINIT)  (PNV_VOID pvContext, NV_UINT8 ucIsPowerDown);
typedef NV_SINT32 (* PFN_ADAPTER_START)  (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_STOP)   (PNV_VOID pvContext, NV_UINT8 ucIsPowerDown);
typedef NV_SINT32 (* PFN_ADAPTER_QUERY_WRITE_SLOTS) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_WRITE) (PNV_VOID pvContext, ADAPTER_WRITE_DATA *pADWriteData);
typedef NV_SINT32 (* PFN_ADAPTER_WRITE1) (PNV_VOID pvContext, ADAPTER_WRITE_DATA1 *pADWriteData1);
typedef NV_SINT32 (* PFN_ADAPTER_QUERY_INTERRUPT) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_HANDLE_INTERRUPT) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_DISABLE_INTERRUPTS) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_ENABLE_INTERRUPTS) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_CLEAR_INTERRUPTS) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_CLEAR_TX_DESC) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_GET_LINK_SPEED) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_GET_LINK_MODE) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_GET_LINK_STATE) (PNV_VOID pvContext, NV_UINT32 *pulLinkState);
typedef NV_SINT32 (* PFN_ADAPTER_IS_LINK_INITIALIZING) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_RESET_PHY_INIT_STATE) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_GET_TRANSMIT_QUEUE_SIZE) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_GET_RECEIVE_QUEUE_SIZE) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_GET_STATISTICS) (PNV_VOID pvContext, PADAPTER_STATS pADStats);
typedef NV_SINT32 (* PFN_ADAPTER_GET_POWER_CAPS) (PNV_VOID pvContext, PADAPTER_POWERCAPS pADPowerCaps);
typedef NV_SINT32 (* PFN_ADAPTER_GET_POWER_STATE) (PNV_VOID pvContext, PADAPTER_POWERSTATE pADPowerState);
typedef NV_SINT32 (* PFN_ADAPTER_SET_POWER_STATE) (PNV_VOID pvContext, PADAPTER_POWERSTATE pADPowerState);
typedef NV_SINT32 (* PFN_ADAPTER_SET_LOW_SPEED_FOR_PM) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_GET_PACKET_FILTER_CAPS) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_ADAPTER_SET_PACKET_FILTER) (PNV_VOID pvContext, PPACKET_FILTER pPacketFilter);
typedef NV_SINT32 (* PFN_ADAPTER_SET_WAKE_UP_PATTERN) (PNV_VOID pvContext, NV_SINT32 iPattern, PWAKE_UP_PATTERN pPattern);
typedef NV_SINT32 (* PFN_ADAPTER_ENABLE_WAKE_UP_PATTERN) (PNV_VOID pvContext, NV_SINT32 iPattern, NV_SINT32 iEnable);
typedef NV_SINT32 (* PFN_SET_NODE_ADDRESS) (PNV_VOID pvContext, NV_UINT8 *pNodeAddress);
typedef NV_SINT32 (* PFN_GET_NODE_ADDRESS) (PNV_VOID pvContext, NV_UINT8 *pNodeAddress);
typedef NV_SINT32 (* PFN_GET_ADAPTER_INFO) (PNV_VOID pvContext, PNV_VOID pVoidPtr, NV_SINT32 iType, NV_SINT32 *piLength);
typedef NV_SINT32 (* PFN_ADAPTER_READ_PHY)  (PNV_VOID pvContext, NV_UINT32 ulPhyAddr, NV_UINT32 ulPhyReg, NV_UINT32 *pulValue);
typedef NV_SINT32 (* PFN_ADAPTER_WRITE_PHY) (PNV_VOID pvContext, NV_UINT32 ulPhyAddr, NV_UINT32 ulPhyReg, NV_UINT32 ulValue);
typedef NV_VOID(* PFN_ADAPTER_SET_SPPED_DUPLEX) (PNV_VOID pvContext);
typedef NV_SINT32 (*PFN_REGISTER_OFFLOAD) (PNV_VOID pvContext,  PADAPTER_OFFLOAD pOffload);
typedef NV_SINT32 (*PFN_DEREGISTER_OFFLOAD) (PNV_VOID pvContext, PADAPTER_OFFLOAD pOffload);
typedef NV_SINT32 (*PFN_RX_BUFF_READY) (PNV_VOID pvContext, PMEMORY_BLOCK pMemBlock, PNV_VOID pvID);

#ifndef linux
typedef NV_SINT32 (*PFN_ADAPTER_ASF_SETUPREGISTERS) (PNV_VOID pvContext, NV_SINT32 bInitTime);
typedef NV_SINT32 (*PFN_ADAPTER_ASF_GETSEC0BASEADDRESS) (PNV_VOID pvContext, ASF_SEC0_BASE **ppsSec0Base);
typedef NV_SINT32 (*PFN_ADAPTER_ASF_SETSOURCEIPADDRESS) (PNV_VOID pvContext, NV_UINT8 *pucSrcIPAddress);
typedef NV_SINT32 (*PFN_ADAPTER_ASF_GETDESTIPADDRESS) (PNV_VOID pvContext, NV_UINT8 *pucDestIPAddress);
typedef NV_SINT32 (*PFN_ADAPTER_ASF_SETDESTIPADDRESS) (PNV_VOID pvContext, NV_UINT8 *pucDestIPAddress);
typedef NV_SINT32 (*PFN_ADAPTER_ASF_WRITEEEPROMANDSETUPREGISTERS) (PNV_VOID pvContext, NV_BOOLEAN bCompare, PNV_VOID pucValue, PNV_VOID pszSec0BaseMember, 
                                      NV_UINT16 usCount, NV_UINT32 ulAddressOffset);

typedef NV_SINT32 (*PFN_ADAPTER_ASF_ISASFREADY) (PNV_VOID pvContext, ASF_ASFREADY *psASFReady);

typedef NV_SINT32 (*PFN_ADAPTER_ASF_SETDESTMACADDRESS) (PNV_VOID pvContext, NV_UINT8 *pucDestMACAddress);
typedef NV_SINT32 (*PFN_ADAPTER_ASF_GETSOURCEMACADDRESS) (PNV_VOID pvContext, NV_UINT8 *pucSrcMACAddress);

typedef NV_SINT32 (*PFN_ADAPTER_ASF_CHECK_FOR_EEPROM_PRESENCE)  (PNV_VOID pvContext);
#endif

typedef NV_VOID (*PFN_ADAPTER_SET_COMMONDATA) (PNV_VOID pvContext, CMNDATA_OS_ADAPTER *psOSAdpater);
typedef NV_VOID (*PFN_ADAPTER_SET_CHECKSUMOFFLOAD) (PNV_VOID pvContext, NV_UINT32 bSet);


 
typedef struct  _ADAPTER_API
{
    // The adapter context
    PNV_VOID                                   pADCX;

    // The adapter interface
    PFN_ADAPTER_CLOSE                       pfnClose;
    PFN_ADAPTER_INIT                        pfnInit;
    PFN_ADAPTER_DEINIT                      pfnDeinit;
    PFN_ADAPTER_START                       pfnStart;
    PFN_ADAPTER_STOP                        pfnStop;
    PFN_ADAPTER_QUERY_WRITE_SLOTS           pfnQueryWriteSlots;
    PFN_ADAPTER_WRITE                       pfnWrite;
    PFN_ADAPTER_WRITE1                      pfnWrite1;
    PFN_ADAPTER_QUERY_INTERRUPT             pfnQueryInterrupt;
    PFN_ADAPTER_HANDLE_INTERRUPT            pfnHandleInterrupt;
    PFN_ADAPTER_DISABLE_INTERRUPTS          pfnDisableInterrupts;
    PFN_ADAPTER_ENABLE_INTERRUPTS           pfnEnableInterrupts;
    PFN_ADAPTER_CLEAR_INTERRUPTS            pfnClearInterrupts;
    PFN_ADAPTER_CLEAR_TX_DESC                pfnClearTxDesc;
    PFN_ADAPTER_GET_LINK_SPEED              pfnGetLinkSpeed;
    PFN_ADAPTER_GET_LINK_MODE               pfnGetLinkMode;
    PFN_ADAPTER_GET_LINK_STATE              pfnGetLinkState;
    PFN_ADAPTER_IS_LINK_INITIALIZING        pfnIsLinkInitializing;
    PFN_ADAPTER_RESET_PHY_INIT_STATE        pfnResetPhyInitState;
    PFN_ADAPTER_GET_TRANSMIT_QUEUE_SIZE     pfnGetTransmitQueueSize;
    PFN_ADAPTER_GET_RECEIVE_QUEUE_SIZE      pfnGetReceiveQueueSize;
    PFN_ADAPTER_GET_STATISTICS              pfnGetStatistics;
    PFN_ADAPTER_GET_POWER_CAPS              pfnGetPowerCaps;
    PFN_ADAPTER_GET_POWER_STATE             pfnGetPowerState;
    PFN_ADAPTER_SET_POWER_STATE             pfnSetPowerState;
    PFN_ADAPTER_SET_LOW_SPEED_FOR_PM        pfnSetLowSpeedForPM;
    PFN_ADAPTER_GET_PACKET_FILTER_CAPS      pfnGetPacketFilterCaps;
    PFN_ADAPTER_SET_PACKET_FILTER           pfnSetPacketFilter;
    PFN_ADAPTER_SET_WAKE_UP_PATTERN         pfnSetWakeUpPattern;
    PFN_ADAPTER_ENABLE_WAKE_UP_PATTERN      pfnEnableWakeUpPattern;
    PFN_SET_NODE_ADDRESS                    pfnSetNodeAddress;
    PFN_GET_NODE_ADDRESS                    pfnGetNodeAddress;
    PFN_GET_ADAPTER_INFO                    pfnGetAdapterInfo;
    PFN_ADAPTER_SET_SPPED_DUPLEX            pfnSetSpeedDuplex;
    PFN_ADAPTER_READ_PHY                    pfnReadPhy;
    PFN_ADAPTER_WRITE_PHY                    pfnWritePhy;
    PFN_REGISTER_OFFLOAD                    pfnRegisterOffload;
    PFN_DEREGISTER_OFFLOAD                    pfnDeRegisterOffload;
    PFN_RX_BUFF_READY                        pfnRxBuffReady;
#ifndef linux
    PFN_ADAPTER_ASF_SETUPREGISTERS          pfnASFSetupRegisters;
    PFN_ADAPTER_ASF_GETSEC0BASEADDRESS      pfnASFGetSec0BaseAddress;
    PFN_ADAPTER_ASF_SETSOURCEIPADDRESS      pfnASFSetSourceIPAddress;
    PFN_ADAPTER_ASF_GETDESTIPADDRESS        pfnASFGetDestIPAddress;
    PFN_ADAPTER_ASF_SETDESTIPADDRESS        pfnASFSetDestIPAddress;
    PFN_ADAPTER_ASF_WRITEEEPROMANDSETUPREGISTERS pfnASFWriteEEPROMAndSetupRegisters;
    PFN_ADAPTER_ASF_SETDESTMACADDRESS       pfnASFSetDestMACAddress;
    PFN_ADAPTER_ASF_GETSOURCEMACADDRESS     pfnASFGetSourceMACAddress;
    PFN_ADAPTER_ASF_ISASFREADY              pfnASFIsASFReady;
    PFN_ADAPTER_ASF_CHECK_FOR_EEPROM_PRESENCE pfnASFCheckForEepromPresence;
#endif
    PFN_ADAPTER_SET_COMMONDATA              pfnSetCommonData;

    PFN_ADAPTER_SET_CHECKSUMOFFLOAD         pfnSetChecksumOffload;

}   ADAPTER_API, *PADAPTER_API;
//////////////////////////////////////////////////////////////////

#define MAX_PACKET_TO_ACCUMULATE    16

typedef struct _ADAPTER_OPEN_PARAMS
{
    PNV_VOID pOSApi; //pointer to OSAPI structure passed from higher layer
    PNV_VOID pvHardwareBaseAddress; //memory mapped address passed from higher layer
    NV_UINT32 ulPollInterval; //poll interval in micro seconds. Used in polling mode
    NV_UINT32 MaxDpcLoop; //Maximum number of times we loop to in function ADAPTER_HandleInterrupt
    NV_UINT32 MaxRxPkt; //Maximum number of packet we process each time in function UpdateReceiveDescRingData
    NV_UINT32 MaxTxPkt; //Maximum number of packet we process each time in function UpdateTransmitDescRingData
    NV_UINT32 MaxRxPktToAccumulate; //maximum number of rx packet we accumulate in UpdateReceiveDescRingData before
                                //indicating packets to OS.
    NV_UINT32 SentPacketStatusSuccess; //Status returned from adapter layer to higher layer when packet was sent successfully
    NV_UINT32 SentPacketStatusFailure; ////Status returned from adapter layer to higher layer when packet send was unsuccessful
    NV_UINT32 SetForcedModeEveryNthRxPacket; //NOT USED: For experiment with descriptor based interrupt
    NV_UINT32 SetForcedModeEveryNthTxPacket; //NOT USED: For experiment with descriptor based interrupt
    NV_UINT32 RxForcedInterrupt; //NOT USED: For experiment with descriptor based interrupt
    NV_UINT32 TxForcedInterrupt; //NOT USED: For experiment with descriptor based interrupt
    NV_UINT32 DeviceId; //Of MAC
    NV_UINT32 DeviceType;
    NV_UINT32 PollIntervalInusForThroughputMode; //Of MAC
    NV_UINT32 bASFEnabled;
    NV_UINT32 ulDescriptorVersion;
    NV_UINT32 ulMaxPacketSize;


#define MEDIA_IF_AUTO       0
#define MEDIA_IF_RGMII      1
#define MEDIA_IF_MII        2
    NV_UINT32 ulMediaIF;

	NV_UINT32	PhyPowerIsolationTimeoutInms;
	NV_UINT32	PhyResetTimeoutInms;
	NV_UINT32	PhyAutonegotiateTimeoutInms;
	NV_UINT32	PhyLinkupTimeoutInms;
	NV_UINT32	PhyRdWrTimeoutInus;
	NV_UINT32	PhyPowerdownOnClose;

    // Added for Bug 100715
    NV_UINT32   bDisableMIIInterruptAndReadPhyStatus;

}ADAPTER_OPEN_PARAMS, *PADAPTER_OPEN_PARAMS;

//////////////////////////////////////////////////////////////////
// This is the one function in the adapter interface that is publicly
// available. The rest of the interface is returned in the pAdapterApi.
// The first argument needs to be cast to a OSAPI structure pointer.
// The second argument should be cast to a ADPATER_API structure pointer.
NV_SINT32 ADAPTER_Open (PADAPTER_OPEN_PARAMS pAdapterOpenParams, PNV_VOID *pvpAdapterApi, NV_UINT32 *pulPhyAddr);

//////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////
// Here are the error codes the adapter function calls return.
#define ADAPTERERR_NONE                             0x0000
#define ADAPTERERR_COULD_NOT_ALLOC_CONTEXT          0x0001
#define ADAPTERERR_COULD_NOT_CREATE_CONTEXT         0x0002
#define ADAPTERERR_COULD_NOT_OPEN_PHY               0x0003
#define ADAPTERERR_TRANSMIT_QUEUE_FULL              0x0004
#define ADAPTERERR_COULD_NOT_INIT_PHY               0x0005
#define ADAPTERERR_PHYS_SIZE_SMALL                    0x0006
#define ADAPTERERR_ERROR                            0x0007  // Generic error
//////////////////////////////////////////////////////////////////

// This block moved from myadap.h
// nFlag for Stop/Start ReceiverAndOrTransmitter can be an OR of
// the following two flags
#define AFFECT_RECEIVER     0x01
#define AFFECT_TRANSMITTER  0x02

#define REDUCE_LENGTH_BY 48

#define EXTRA_WRITE_SLOT_TO_REDUCE_PER_SEND    4
#define MAX_TX_DESCS                    256 
#define MAX_TX_DESCS_VER2               (256 * 4)

typedef struct _TX_INFO_ADAP
{
    NV_UINT32   NoOfDesc; 
    PNV_VOID    pvVar2; 
}TX_INFO_ADAP, *PTX_INFO_ADAP;

#define WORKAROUND_FOR_MCP3_TX_STALL

#ifdef WORKAROUND_FOR_MCP3_TX_STALL
NV_SINT32 ADAPTER_WorkaroundTXHang(PNV_VOID pvContext);
#endif

//#define TRACK_INIT_TIME

#ifdef TRACK_INIT_TIME
//This routine is defined in entry.c adapter doesn't link int64.lib
//We defined here so that its easy to use it in phy as well as mswin

#define MAX_PRINT_INDEX        32
extern NV_VOID PrintTime(NV_UINT32 ulIndex);
#define PRINT_INIT_TIME(_a) PrintTime((_a))
#else
#define PRINT_INIT_TIME(_a)
#endif

// Segmentation offload info
#define DEVCAPS_SEGOL_BP_ENABLE       0   
#define DEVCAPS_SEGOL_BP_IPOPTIONS    1
#define DEVCAPS_SEGOL_BP_TCPOPTIONS   2
#define DEVCAPS_SEGOL_BP_SEGSIZE_LO   8
#define DEVCAPS_SEGOL_BP_SEGSIZE_HI   31


// Checksum offload info
// Byte 0 : V4 TX
#define DEVCAPS_V4_TX_BP_IPOPTIONS      0
#define DEVCAPS_V4_TX_BP_TCPOPTIONS     1
#define DEVCAPS_V4_TX_BP_TCPCHECKSUM    2
#define DEVCAPS_V4_TX_BP_UDPCHECKSUM    3
#define DEVCAPS_V4_TX_BP_IPCHECKSUM     4

// Byte 0 : V4 RX
#define DEVCAPS_V4_RX_BP_IPOPTIONS      8
#define DEVCAPS_V4_RX_BP_TCPOPTIONS     9
#define DEVCAPS_V4_RX_BP_TCPCHECKSUM    10
#define DEVCAPS_V4_RX_BP_UDPCHECKSUM    11
#define DEVCAPS_V4_RX_BP_IPCHECKSUM     12

// Byte 1 : V6 TX
#define DEVCAPS_V6_TX_BP_IPOPTIONS      16
#define DEVCAPS_V6_TX_BP_TCPOPTIONS     17
#define DEVCAPS_V6_TX_BP_TCPCHECKSUM    18
#define DEVCAPS_V6_TX_BP_UDPCHECKSUM    19

// Byte 2 : V6 RX
#define DEVCAPS_V6_RX_BP_IPOPTIONS      24
#define DEVCAPS_V6_RX_BP_TCPOPTIONS     25
#define DEVCAPS_V6_RX_BP_TCPCHECKSUM    26
#define DEVCAPS_V6_RX_BP_UDPCHECKSUM    27


#define DESCR_VER_1         1       // MCP1, MCP2 and CK8 descriptor version
#define DESCR_VER_2         2       // The decsriptor structure for CK8G

// Get device and vendor IDs from 32 bit DeviceVendorID 
#define GET_DEVICEID(x)   (((x) >> 16) & 0xFFFF)
#define GET_VENDORID(x)   ((x) & 0xFFFF)

#ifdef __cplusplus
} // extern "C"
#endif

#endif // _ADAPTER_H_
