// Sample code file: cne3200.h

// Warning: This code has been marked up for HTML

/*--------------------------------------------------------------------------*
 * $name: Cne3200.h
 * $version: 7
 * $date_modified: 121898
 * $description: C NE3200 HSM Header file
 * $owner: ODI LAN Driver Manager
 * Copyright (c) 1996, 1997, 1998 Novell, Inc. All Rights Reserved.
 *
 * THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND TREATIES.
 * USE AND REDISTRIBUTION OF THIS WORK IS SUBJECT TO THE LICENSE AGREEMENT
 * ACCOMPANYING THE SOFTWARE DEVELOPMENT KIT (SDK) THAT CONTAINS THIS WORK.
 * PURSUANT TO THE SDK LICENSE AGREEMENT, NOVELL HEREBY GRANTS TO DEVELOPER A
 * ROYALTY-FREE, NON-EXCLUSIVE LICENSE TO INCLUDE NOVELL'S SAMPLE CODE IN ITS
 * PRODUCT. NOVELL GRANTS DEVELOPER WORLDWIDE DISTRIBUTION RIGHTS TO MARKET,
 * DISTRIBUTE, OR SELL NOVELL'S SAMPLE CODE AS A COMPONENT OF DEVELOPER'S
 * PRODUCTS. NOVELL SHALL HAVE NO OBLIGATIONS TO DEVELOPER OR DEVELOPER'S
 * CUSTOMERS WITH RESPECT TO THIS CODE.
 *--------------------------------------------------------------------------*/
/*****************************************************************************
 *
 * Title:         C language NE3200 HSM Header file.
 *
 * Filename:      NE3200.H
 *
 * ODI Spec Ver:   1.11
 *
 * Description:       Include file for C version of NE2_32 LAN HSM.
 *
 * Modification History: 
 *
 * 08-19-97 JCJ WAIT_LOOP and WAIT_RESET values are changed to a high value
 *              since the waiting procedure is changed to a counter based one.
 *              Now this values are the initial count for the counter.  Very
 *              high value is chosen because it needs to run in a variety of
 *              systems.  SPD# 159385
 *
 * 09-18-97 JCJ If adapter provides 100% filtering of group addresses and
 *              the TSM does not need to perform any checking bits 10&9
 *              of MLIDFlags should be set. SPD# 166454
 *
 * 11-07-97 JCJ WAIT_LOOP and WAIT_RESET values are changed since some fast 
 *              machines are having loading problem SPD# 164834
 *
 ****************************************************************************/

#ifndef CNE3200_H

/*===[ Include files specific to current platform ]======================*/

#include <portable.h>

/*===[ Generic HSM Include files ]===========================*/

#include <odi.h>
#include <odi_nbi.h>
#include <odi_nesl.h>
#include <nesl_str.h>
#include <parser.h>
#include <cmsm.h>

#ifndef NULL
#define NULL 0L
#endif

/*===[ External data ]===================================================*/

extern   MLID_CONFIG_TABLE   DriverConfigTemplate;

/*===[ Manifest constants ]==============================================*/

/* EISA Slot Equates                                                      */

#define   PRODUCT_ID_LEN            4

#define  MANUFACT_CHAR_CODE_1    0x3a     /* Computed from the code...    */
#define  MANUFACT_CHAR_CODE_2    0xcc     /* .."NVL 07 01" or "NVL 07 02" */
#define  PRODUCT_NUMBER_07       0x07     /* For this adapter...          */
#define  PRODUCT_NUMBER_01       0x01     /* For this adapter...          */
#define  PRODUCT_NUMBER_02       0x02     

#define  SLOT_0                  0x0c80   /* begin with this slot value   */
#define  ISOLATE_INT_MASK        0x0f     /* mask used to isolate ints    */
#define  EISA_INT_FUNCTION_BIT   0x04     /* interrupt function           */

#define  EISA_VALID_INT          0x22     /* valid interrupt bit          */
#define  EISA_INTERRUPT          0xb2     /* possible interrupt           */
#define  EISA_SHARED_INT_MASK    0x40     /* is it a shared interrupt?    */
#define  EISA_CFG_BLOCK_SIZE     320      /* size of the config block     */

/* Firmware definitions                                                   */

#define  STATIC_RAM_ERROR_MASK   0x40
#define  FIRMWARE_INIT_SUCCESS   0x80
#define  FIRMWARE_RUNNING        0x11111111

/* Counter/Timeout definitions                                            */

#define  DEFAULT_TIMEOUT_VALUE   2        /* default poll                 */
#define   DEADMAN_TIMEOUT         18*9      /* 9 seconds                      */
#define   RESET_BASE_COUNT         200      /* Speed from slow 386.           */

/* Timeout definitions                                                    */

#define  WAIT_BYTE_SET           1
#define  WAIT_BYTE_CLEAR         2
#define  WAIT_FIRMWARE           3
#define   WAIT_TIMEOUT            4

//JCJ SPD# 159385 Following values are changed for reset problem
//These values will be the initial values for the counter while the driver
//wait for the adapter response.  A high value is chosen to take care of
//high speed systems.
//JCJ SPD# 164834 Following values are changed since some fast machines are having 
//driver loading problem
#define  WAIT_LOOP               0xE00000
#define  WAIT_RESET              20000
//JCJ End SPD# 159385

/* Mailbox  commands                                                      */

#define  ADD_MULTICAST_COMMAND   1        /* update the multicastlist     */
#define  IDLE_COMMAND            4        /* idle the adapter             */

/* Miscellaneous driver definitions                                       */

#define  MAX_PACKET_SIZE         1514

#define  TOTAL_RCBS              0x10
#define  TABLE_SIZE              0x20
#define  TABLE_MASK              TABLE_SIZE-1

#define  TOTAL_TCBS              128
#define  TCB_TABLE_SIZE          256
#define  TCB_TABLE_MASK          TCB_TABLE_SIZE-1

#define  GLOBAL_CONFIG           0x0e
#define  GLOBAL_CFG_SHARE_MASK   0xf7

/* Config Table Flags */

#define  MODE_FLAGS              MM_PREFILLED_ECB_BIT | \
                                 MM_MULTICAST_BIT      | \
                                 MM_C_HSM_BIT          | \
                                 MM_RAW_SENDS_BIT      | \
                                 MM_FRAGS_PHYS_BIT     | \
                                 MM_PROMISCUOUS_BIT
/* JCJ: 18-Sep-97 SPD# 166454
If adapter provides 100% filtering of group addresses and the TSM does not
need to perform any checking bits 10&9 of MLIDFlags should be set.        */
#define  FLAGS                   MF_MULTICAST_TYPE_BITS

#define  SHARING_FLAGS           MS_SHARE_IRQ0_BIT


/* BMIC IO port structure defines                                         */

#define  ID                               0x00
#define  RESERVED_0                       0x04
#define  GLOBAL_CFG_REG                   0x08
#define  SYSTEM_INT_MASK_CTRL_REG         0x09
#define  SEMAPHORES                       0x0a
#define  LOCAL_DOORBELL_MASK_REG          0x0c
#define  LOCAL_DOORBELL_INT_STATUS_REG    0x0d
#define  SYSTEM_DOORBELL_MASK_REG         0x0e
#define  SYSTEM_DOORBELL_INT_STATUS_REG   0x0f
#define  MAILBOX_REGISTERS                0x10
#define  RESERVED_1                       0x20


/*===[ Type definitions ]==================================================*/

/* Start of the Driver Virtual Adapter structure for CNE3200              */

typedef struct _DRIVER_DATA_ 
{
   /***********************************************************************\
   **    !! IMPORTANT !!
   **    This list must be dword aligned !!!
   **    The BMIC locked exchange only works on dword boundaries.
   \***********************************************************************/

   RCB               *adapterRCBList [TABLE_SIZE];
   struct _TCB_      *adapterTCBList [TCB_TABLE_SIZE];
   UINT32            hostPWSList1 [TABLE_SIZE];         
   UINT32            hostPWSList2 [TABLE_SIZE];         
   RCB               *hostRCBList [TABLE_SIZE];
   struct _TCB_      *hostTCBList [TCB_TABLE_SIZE];
   UINT32            txStartList [TCB_TABLE_SIZE];

   UINT32            tcbQueueHead;
   UINT32            tcbQueueTail;

   UINT32            tcbInProcess;
   UINT32            txStartTime;
   UINT32            updateStatCount;                  

   /***********************************************************************\
   **    Receive and Transmit pointers.
   \***********************************************************************/

   UINT32            receiveQueueHead;
   UINT32            receiveQueueTail;
   UINT32            needRCBCount;

   /***********************************************************************\
   **
   **    CNE3200 I/O Register Values...
   **
   \***********************************************************************/

   void              *resetRegister;
   void              *eisaSystemDoorbellEnable;
   void              *eisaSystemDoorbellStatus;
   void              *idleMailbox;
   void              *updateParmMailbox;
   void              *updateStatMailbox;
   void              *tcbValidMailbox;
   void              *pollingMailbox;
   void              *tcbMailbox;
   void              *parametersMailbox;

   /***********************************************************************\
   **
   **    Adapter Parameter Block.  Do NOT change the order of the
   **    following fields...
   **
   \***********************************************************************/

   UINT32            logicalToPhysicalOffset;
   void              *nodeAddressPointer;
   UINT16            boardNumber8023;
   UINT16            boardNumberEII;
   UINT16            boardNumber8022;
   UINT16            boardNumberSNAP;
   UINT32            maxReceivePacketSize;
   void              *genericStatisticsPointer;
   UINT16            customStatisticsCount;
   void              *rcbListPointer;
   UINT16            multicastCount;
   void              *multicastTablePointer;
   UINT8             hostNodeAddress [ADDR_SIZE];
   UINT8             promiscuousMode;
   UINT16            pollTimeout;
   UINT8             globalConfigValue;

   UINT16            dummyAlignValue;

   /***********************************************************************\
   **    Command parameter storage location.
   \***********************************************************************/

   UINT32            parameterCommand;          
   UINT32            parameter1;
   UINT32            parameter2;

   /***********************************************************************\
   **    Other variables.
   \***********************************************************************/

   UINT32            inDriverPoll;
   UINT32            inDriverReset;                  
   UINT32            inDriverDisable;               

   MLID_AES_ECB      DAES;

   UINT32            busType;
   void              *busTag;

   /***********************************************************************\
   **    Statistics Table.
   \***********************************************************************/

   MLID_StatsTable   StatsTable;

/*   Generic Statistics Table Entries   */
   StatTableEntry    TotalTxPacketTable;
   StatTableEntry    TotalRxPacketTable;
   StatTableEntry    NoECBAvailableTable;
   StatTableEntry    PacketTxTooBigTable;
   StatTableEntry    PacketTxTooSmallTable;
   StatTableEntry    PacketRxOverflowTable;
   StatTableEntry    PacketRxTooBigTable;
   StatTableEntry    PacketRxTooSmallTable;
   StatTableEntry    PacketTxMiscErrorTable;
   StatTableEntry    PacketRxMiscErrorTable;
   StatTableEntry    RetryTxTable;
   StatTableEntry    ChecksumErrorTable;
   StatTableEntry    HardwareRxMismatchTable;
   StatTableEntry    TotalTxOKByteTable;
   StatTableEntry    TotalRxOKByteTable;
   StatTableEntry    TotalGroupAddrTxTable;
   StatTableEntry    TotalGroupAddrRxTable;
   StatTableEntry    AdapterResetTable;
   StatTableEntry    AdapterOprTimeStampTable;
   StatTableEntry    QDepthTable;

/*   Media Statistics Table Entries   */
   StatTableEntry    TxOKSingleCollisionTable;
   StatTableEntry    TxOKMultipleCollisionsTable;
   StatTableEntry    TxOKButDeferredTable;
   StatTableEntry    TxAbortLateCollisionTable;
   StatTableEntry    TxAbortExcessCollisionsTable;
   StatTableEntry    TxAbortCarrierSenseTable;
   StatTableEntry    TxAbortExDeferralTable;
   StatTableEntry    RxAbortFrameAlignmentTable;

/*   Custom Statistics Table Entries   */
   StatTableEntry    TxRetryFailureTable;
   StatTableEntry    ClearToSendTable;
   StatTableEntry    UnderRunTable;
   StatTableEntry    RxDMAOverrunTable;
   StatTableEntry    PacketSlideTable;
   StatTableEntry    DummyRCBTable;
   StatTableEntry    AdapterReset1Table;
   StatTableEntry    BadFragLengthTable;
   StatTableEntry    PollingTimeoutTable;
   StatTableEntry    AdapterDiedTable;
   StatTableEntry    NumberOfIntsFiredTable;

/* Generic Counters */
   UINT32            TotalTxPacketCount;
   UINT32            TotalRxPacketCount;
   UINT32            NoECBAvailableCount;
   UINT32            PacketTxTooBigCount;
   UINT32            PacketTxTooSmallCount;
   UINT32            PacketRxOverflowCount;
   UINT32            PacketRxTooBigCount;
   UINT32            PacketRxTooSmallCount;
   UINT32            PacketTxMiscErrorCount;
   UINT32            PacketRxMiscErrorCount;
   UINT32            RetryTxCount;
   UINT32            ChecksumErrorCount;
   UINT32            HardwareRxMismatchCount;
   UINT64            TotalTxOKByteCount;
   UINT64            TotalRxOKByteCount;
   UINT32            TotalGroupAddrTxCount;
   UINT32            TotalGroupAddrRxCount;
   UINT32            AdapterResetCount;
   UINT32            AdapterOprTimeStamp;
   UINT32            QDepth;

/* Media Counters */
   UINT32            TxOKSingleCollision;
   UINT32            TxOKMultipleCollisions;
   UINT32            TxOKButDeferred;
   UINT32            TxAbortLateCollision;
   UINT32            TxAbortExcessCollisions;
   UINT32            TxAbortCarrierSense;
   UINT32            TxAbortExDeferral;
   UINT32            RxAbortFrameAlignment;

/* Custom Counters */
   UINT16            CustomCounterCount;   

   UINT32            TxRetryFailureCount;
   UINT32            ClearToSendCount;
   UINT32            UnderRunCount;
   UINT32            RxDMAOverrunCount;
   UINT32            PacketSlideCount;
   UINT32            DummyRCBCount;
   UINT32            AdapterReset1Count;
   UINT32            BadFragLengthCount;
   UINT32            PollingTimeoutCount;
   UINT32            AdapterDiedCount;
   UINT32            NumberOfIntsFiredCount;
} 
DRIVER_DATA;

/*===[ Include files specific Ethernet MLIDs ]===========================*/

#include "ethertsm.h"


/*===[ Function prototypes ]=============================================== */
void     CFixUpStatStrings (
            DRIVER_DATA       *driverData);

ODISTAT   DriverInit (
            struct _MODULE_HANDLE_  *ModuleHandle,
            SCREEN_HANDLE            *ScreenHandle,
            MEON                     *CommandLine,
            MEON                     *ModuleLoadPath,
            UINT32                  UnitializedDataLength,
            void                     *CustomDataFileHandle,
            UINT32                  (* FileRead)(
                                       void      *FileHandle,
                                         UINT32   FileOffset,
                                       void      *FileBuffer,
                                       UINT32   FileSize),
            UINT32                  CustomDataOffset,
            UINT32                  CustomDataSize,
            UINT32                  NumMsgs,
            MEON                     **Msgs);

ODISTAT  DriverReset (
            DRIVER_DATA       *driverData,
            CONFIG_TABLE      *configTable,
            OPERATION_SCOPE   operationScope);

ODISTAT   DriverMulticastChange (
            DRIVER_DATA            *driverData,
            CONFIG_TABLE         *configTable,
            GROUP_ADDR_LIST_NODE   *mcTable,
            UINT32               numEntries,
            UINT32               functionalTable);

ODISTAT  DriverShutdown (
            DRIVER_DATA       *driverData,
            MLID_ConfigTable  *configTable,
            UINT32            shutDownType,
            OPERATION_SCOPE   operationScope);

ODISTAT   DriverPromiscuousChange(
            DRIVER_DATA         *driverData,
            CONFIG_TABLE      *configTable,
            UINT32            promiscuousMode);

ODISTAT DriverStatisticsChange (
            DRIVER_DATA       *driverData,
            CONFIG_TABLE      *configTable);

void     DriverSend (
            DRIVER_DATA       *driverData,
            CONFIG_TABLE     *configTable, 
            TCB               *tcb,
            UINT32            pktSize,
            void                *physTcb);

void      DriverISR(
            DRIVER_DATA         *driverData);

void     DriverCallBack(
            DRIVER_DATA         *driverData,
            CONFIG_TABLE      *ConfigTable);

BOOLEAN  DriverDisableInterrupt(
            DRIVER_DATA         *driverData,
            BOOLEAN            flag);

void      DriverEnableInterrupt(
            DRIVER_DATA         *driverData);

void     DriverPoll (
            DRIVER_DATA       *driverData, 
            CONFIG_TABLE      *configTable);

UINT32   WaitForEvent (
            DRIVER_DATA       *driverData, 
            void              *port, 
            UINT8             type, 
            UINT32            timeout);

#define CNE3200_H
#endif /* CNE3200_H */