home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / nics / root.2 / usr / include / sys / odi.h / odi
Text File  |  1998-08-19  |  30KB  |  956 lines

  1. /*
  2.  * Copyright (c) 1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
  3.  *                                                                         
  4.  *        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
  5.  *                   SANTA CRUZ OPERATION INC.                             
  6.  *                                                                         
  7.  *   The copyright notice above does not evidence any actual or intended   
  8.  *   publication of such source code.                                      
  9.  */
  10.  
  11. #ifndef _IO_ODI_ODI_H   /* wrapper symbol for kernel use */
  12. #define _IO_ODI_ODI_H   /* subject to change without notice */
  13.  
  14. #ident    "@(#)odi.h    9.1"
  15. #ident    "$Header: $"
  16.  
  17. #ifdef  _KERNEL_HEADERS
  18.  
  19. #include <fs/ioccom.h>
  20. #include <io/conf.h>
  21. #include <io/stream.h>
  22. #include <io/strlog.h>
  23. #include <io/stropts.h>
  24. #include <mem/immu.h>
  25. #include <mem/kmem.h>
  26. #include <net/dlpi.h>
  27. #include <net/sockio.h>
  28. #include <net/inet/byteorder.h>
  29. #include <net/inet/if.h>
  30. #include <svc/clock.h>
  31. #include <svc/errno.h>
  32. #include <util/cmn_err.h>
  33. #include <util/debug.h>
  34. #include <util/ksynch.h>
  35. #include <util/param.h>
  36. #include <util/sysmacros.h>
  37. #include <util/types.h>
  38.  
  39. #elif defined(_KERNEL)
  40.  
  41. #include <sys/ioccom.h>
  42. #include <sys/conf.h>
  43. #include <sys/stream.h>
  44. #include <sys/strlog.h>
  45. #include <sys/stropts.h>
  46. #include <sys/immu.h>
  47. #include <sys/kmem.h>
  48. #include <sys/dlpi.h>
  49. #include <sys/sockio.h>
  50. #include <sys/byteorder.h>
  51. #include <net/if.h>
  52. #include <sys/clock.h>
  53. #include <sys/errno.h>
  54. #include <sys/cmn_err.h>
  55. #include <sys/debug.h>
  56. #include <sys/ksynch.h>
  57. #include <sys/param.h>
  58. #include <sys/sysmacros.h>
  59. #include <sys/types.h>
  60.  
  61. #endif  /* _KERNEL_HEADERS */
  62.  
  63. #define    FALSE            0x0
  64. #define    TRUE            0x1
  65. #define    UNUSED            0xFFFFFFFF
  66. #define    BOOLEAN            unsigned char
  67. #define ULONG                   ulong_t
  68. #define USHORT                  ushort_t
  69. #define UCHAR                   uchar_t
  70. #define _cdecl
  71.  
  72. typedef    unsigned char        MEON;
  73. typedef    unsigned char        MEON_STRING;
  74. typedef    unsigned char        UINT8;
  75. typedef    unsigned short        UINT16;
  76. typedef    unsigned long        UINT32;
  77. typedef    unsigned char        BYTE;
  78. typedef    signed long        LONG;
  79. typedef    signed char        INT8;
  80. typedef    signed short        INT16;
  81. typedef    signed long        INT32;
  82.  
  83. #define BCOPY(from, to, len)    bcopy((caddr_t)from,(caddr_t)to,(size_t)len)
  84. #define BCMP(s1, s2, len)       bcmp((char *)s1,(char *)s2, (size_t)len )
  85. #define BZERO(addr, len)        bzero((caddr_t)addr,(size_t)len)
  86. #define memcpy(from, to, len)    bcopy((caddr_t)from,(caddr_t)to,(size_t)len)
  87.  
  88. /*
  89.  * well defined sizes.
  90.  */
  91. #define    PID_SIZE        0x06    /* Number of Octets in Protocol */
  92.                     /* Identifier */
  93. #define    ADDR_SIZE        0x06    /* Number of Octets in Address */
  94.  
  95. #define    DefaultNumECBs        0x00
  96. #define    DefaultECBSize        1518L    /* not including ECB Structure */
  97. #define    MinECBSize        (512+74+MAXMEDIAHEADERSIZE)L
  98.                     /* Max. ECB size < 64K  */
  99. /*
  100.  * 42 is mac. FDDI MAC Header.
  101.  */
  102. #define    MAXLOOKAHEADSIZE    128L    /* Max. LookAhead Data Size */
  103.  
  104. /*
  105.  * define assumed Maximum Media Header Size that we'll encounter.
  106.  * assume that it will be Token-Ring (with SRT).
  107.  *
  108.  * AC, FC, Dest[6], Source[6], SRFields[30], 802.2UI[3], SNAP[5] = 52
  109.  */
  110. #define    MAXMEDIAHEADERSIZE    52L
  111.  
  112. #define    MAXBOARDS        16L
  113. #define    MAXSTACKS        16L
  114.  
  115. #define    MAXSTACKNAMELENGTH    65L
  116. #define    MAXNAMELENGTH        64L
  117.  
  118. #define    MAXMULTICASTS        10L
  119. #define MAX_FRAG_COUNT        16
  120.  
  121. /*
  122.  * MLIDCFG_LookAheadSize values.
  123.  */
  124. #define DEFAULT_LOOK_AHEAD_SIZE    0x12    /* Default of 18 look ahead bytes */
  125. #define MAX_LOOK_AHEAD_SIZE    0x80    /* Maximum 128 look ahead bytes */
  126.  
  127. /*
  128.  * Rx Packet Attributes (ie. LkAhd_PktAttr)
  129.  */
  130. #define PAE_CRC_BIT        0x00000001      /* CRC Error */
  131. #define PAE_CRC_ALIGN_BIT       0x00000002      /* CRC/Frame Alignment Error*/
  132. #define PAE_RUNT_PACKET_BIT     0x00000004      /* Runt Packet */
  133. #define PAE_TOO_BIG_BIT         0x00000010      /* Packet Too Large for Media */
  134. #define PAE_NOT_ENABLED_BIT     0x00000020      /* Unsupported Frame */
  135. #define PAE_MALFORMED_BIT       0x00000040      /* Malformed Packet */
  136. #define PA_NO_COMPRESS_BIT      0x00004000      /* Do not compress received */
  137.                         /* packet */
  138. #define PA_NONCAN_ADDR_BIT      0x00008000      /* Set if Addr. in Immediate */
  139.                         /* Address field is */
  140.                         /* noncanonical */
  141. #define PAE_ERROR_MASK          (PAE_CRC_BIT | PAE_CRC_ALIGN_BIT |    \
  142.                 PAE_RUNT_PACKET_BIT | PAE_TOO_BIG_BIT | \
  143.                 PAE_NOT_ENABLED_BIT | PAE_MALFORMED_BIT)
  144. /*
  145.  * Rx Packet Destination Address Types    (ie. LkAhd_DestType)
  146.  */
  147. #define DT_MULTICAST        0x00000001    /* Multicast Dest. address */
  148.                         /* (Group Address) */
  149. #define    DT_BROADCAST        0x00000002      /* Broadcast Dest. address */
  150. #define DT_REMOTE_UNICAST    0x00000004    /* Remote Unicast Dest. */
  151.                         /* address */
  152. #define DT_REMOTE_MULTICAST    0x00000008    /* Unsupported Multicast */
  153.                         /* address */
  154. #define DT_SOURCE_ROUTE         0x00000010      /* Source Routed packet */
  155. #define DT_ERRORED        0x00000020      /* Global Error, exculsive */
  156.                         /* bit */
  157. #define DT_MAC_FRAME            0x00000040      /* MAC/SMT frames. */
  158.                         /* (ie. NON-DATAFrame) */
  159. #define DT_DIRECT        0x00000080      /* Unicast for this */
  160.                         /* workstation */
  161. #define DT_8022_TYPE_I        0x00000100      /* set if packet is */
  162.                         /* 802.2 Type I */
  163. #define DT_8022_TYPE_II         0x00000200      /* set if packet is */
  164.                         /* 802.2 Type II */
  165. #define DT_8022_BYTES_BITS      0x00000300
  166. #define DT_RX_PRIORITY          0x00000400      /* Set if packet has */
  167.                         /* priority value other */
  168.                         /* than base values */
  169. #define DT_PROMISCUOUS        (DT_ERRORED | DT_DIRECT | DT_MULTICAST |    \
  170.                 DT_BROADCAST | DT_REMOTE_UNICAST |        \
  171.                 DT_REMOTE_MULTICAST | DT_NO_SROUTE |        \
  172.                 DT_MAC_FRAME | DT_RX_PRIORITY)
  173.  
  174. #define    DT_MASK            (DT_MULTICAST | DT_BROADCAST |            \
  175.                 DT_REMOTE_UNICAST | DT_REMOTE_MULTICAST |   \
  176.                 DT_SOURCE_ROUTE | DT_ERRORED | DT_MAC_FRAME \
  177.                 | DT_DIRECT | DT_RX_PRIORITY)
  178. /*
  179.  * ECB Definitions, stack ID Definitions.
  180.  */
  181. #define    ECB_RAWMODE        0xFFFF        /* Raw mode, ie. ECB */
  182.                         /* includes MAC Header */
  183.                         /* implies MLID should not  */
  184.                         /* build or strip MAC Header */
  185. #define RAW_SEND        ECB_RAWMODE    /* was going to delete this, */
  186.                         /* but it's referenced in */
  187.                         /* fdditsm... */
  188. #define ECB_RAWLLC        0xFFFE        /* Raw LLC, ie ECB includes */
  189.                         /* 802.2 header - implies */
  190.                         /* MLID should not build or */
  191.                         /* strip 802.2 header */
  192. #define    ECB_MULTICAST        0x00000001    /* Multicast Dest. address */
  193.                         /* (Group Address) */
  194. #define    ECB_BROADCAST        0x00000002    /* Broadcast Dest. address */
  195. #define    ECB_UNICASTREMOTE    0x00000004    /* Remote Unicast Dest. */
  196.                         /* address */
  197. #define    ECB_MULTICASTREMOTE    0x00000008    /* Unsupported Multicast */
  198.                         /* address */
  199. #define    ECB_SOURCE_ROUTE    0x00000010      /* Source Routed packet */
  200. #define    ECB_GLOBALERROR        0x00000020    /* Set if packet contains */
  201.                         /* errors (exculsive) */
  202.                         /* If set all other bits */
  203.                         /* should be reset. */
  204. #define ECB_MACFRAME        0x00000040    /* Packet is not a data */
  205.                         /* packet.
  206.                         /* If set all other bits */
  207.                         /* should be reset. */
  208. #define    ECB_UNICASTDIRECT    0x00000080    /* Unicast for this */
  209.                         /* workstation */
  210. #define    ECB_MASK        0x000000FF    /* mask off allowable */
  211.                         /* Destination Address Types */
  212. #define    ECB_TYPE_I        0x00000100    /* Set if packet is 802.2 */
  213.                         /* Type I */
  214. #define    ECB_TYPE_II        0x00000200    /* Set if packet is 802.2 */
  215.                         /* Type II */
  216. #define ECB_RX_PRIORITY        0x00000400    /* Set if packet has */
  217.                         /* priority value other */
  218.                         /* than base values */
  219. #define    ECB_PROMISCUOUS        (ECB_ERRORED | ECB_MULTICAST | ECB_BROADCAST \
  220.                 | ECB_UNICASTREMOTE | ECB_MULTICASTREMOTE |  \
  221.                 ECB_SOURCE_ROUTE | ECB_MAC_FRAME |         \
  222.                 ECB_RX_PRIORITY)
  223. /*
  224.  * PromiscuousChange state and mode values.
  225.  */
  226. #define PROM_STATE_OFF        0x00        /* Disable Promiscuous Mode */
  227. #define PROM_STATE_ON         0x01        /* Enable Promiscuous Mode */
  228. #define PROM_MODE_QUERY        0x00        /* Query as to prom mode */
  229. #define PROM_MODE_MAC        0x01        /* MAC frames */
  230. #define PROM_MODE_NON_MAC    0x02        /* Non-MAC frames */
  231. #define PROM_MODE_MACANDNON    0x03        /* Both MAC and Non-MAC */
  232.                         /* frames */
  233. #define PROM_MODE_SMT        0x04        /* FDDI SMT Type MAC frames */
  234.  
  235. /*
  236.  * system return code definitions
  237.  */
  238. typedef enum _ODISTAT_ {
  239.     ODISTAT_SUCCESSFUL        = 0,
  240.     ODISTAT_RESPONSE_DELAYED    = 1,
  241.     ODISTAT_SUCCESS_TAKEN        = 2,
  242.     ODISTAT_BAD_COMMAND        = -127,
  243.     ODISTAT_BAD_PARAMETER        = -126,
  244.     ODISTAT_DUPLICATE_ENTRY        = -125,
  245.     ODISTAT_FAIL            = -124,
  246.     ODISTAT_ITEM_NOT_PRESENT    = -123,
  247.     ODISTAT_NO_MORE_ITEMS        = -122,
  248.     ODISTAT_NO_SUCH_DRIVER        = -121,
  249.     ODISTAT_NO_SUCH_HANDLER        = -120,
  250.     ODISTAT_OUT_OF_RESOURCES    = -119,
  251.     ODISTAT_RX_OVERFLOW        = -118,
  252.     ODISTAT_IN_CRITICAL_SECTION    = -117,
  253.     ODISTAT_TRANSMIT_FAILED        = -116,
  254.     ODISTAT_PACKET_UNDELIVERABLE    = -115,
  255.     ODISTAT_CANCELED        = -4
  256. } ODISTAT;
  257.  
  258. /*
  259.  * MLID Configuration Table Bit Defintions
  260.  */
  261.  
  262. /*
  263.  * MLID 'Flags' Bit Definitions
  264.  */
  265. #define MF_HUB_MANAGEMENT_BIT    0x0100
  266. #define MF_SOFT_FILT_GRP_BIT    0x0200
  267. #define MF_GRP_ADDR_SUP_BIT    0x0400
  268. #define MF_MULTICAST_TYPE_BITS    0x0600
  269. #define MF_RECONFIG_BIT        0x0800
  270. #define MF_PRIORITYSUP_BIT    0x1000
  271.  
  272. /*
  273.  * MLID 'ModeFlags' Bit Definitions.
  274.  */
  275. #define MM_REAL_DRV_BIT        0x0001
  276. #define MM_USES_DMA_BIT        0x0002
  277. #define MM_DEPENDABLE_BIT    0x0004        /* should only be set if */
  278.                         /* MM_POINT_TO_POINT_BIT */
  279.                         /* set, for hardware that is */
  280.                         /* normally dependable but */
  281.                         /* is not 100% guaranteed */
  282. #define MM_MULTICAST_BIT    0x0008
  283. #define MM_CSL_COMPLIANT_BIT    0x0010        /* Set if MLID is CSL */
  284.                         /* compliant */
  285. #define MM_PREFILLED_ECB_BIT    0x0020        /* MLID supplies pre-filled */
  286.                         /* ECBs */
  287. #define MM_RAW_SENDS_BIT    0x0040
  288. #define MM_DATA_SZ_UNKNOWN_BIT    0x0080
  289. #define MM_SMP_BIT        0x0100        /* Set if MLID is SMP */
  290.                         /* enabled.  */
  291. #define MM_FRAG_RECEIVES_BIT    0x0400        /* MLID can handle 8/
  292.                         /* Fragmented Receive ECB. */
  293. #define MM_C_HSM_BIT        0x0800        /* set if HSM written in C. */
  294. #define MM_FRAGS_PHYS_BIT    0x1000        /* set if HSM wants Frags */
  295.                         /* with Physical Addresses. */
  296. #define MM_PROMISCUOUS_BIT    0x2000        /* set if supports */
  297.                         /* Promiscuous Mode. */
  298. #define MM_NONCANONICAL_BIT    0x4000        /* set if Config Node */
  299.                         /* Address Non-Canonical */
  300. #define MM_PHYS_NODE_ADDR_BIT    0x8000        /* set if MLID utilizes */
  301.                         /* Physical Node Address. */
  302. #define MM_CANONICAL_BITS    0xC000
  303.  
  304. /*
  305.  * MLID 'SharingFlags' Bit Defintions.
  306.  */
  307. #define MS_SHUTDOWN_BIT        0x0001
  308. #define MS_SHARE_PORT0_BIT    0x0002
  309. #define MS_SHARE_PORT1_BIT    0x0004
  310. #define MS_SHARE_MEMORY0_BIT    0x0008
  311. #define MS_SHARE_MEMORY1_BIT    0x0010
  312. #define MS_SHARE_IRQ0_BIT    0x0020
  313. #define MS_SHARE_IRQ1_BIT    0x0040
  314. #define MS_SHARE_DMA0_BIT    0x0080
  315. #define MS_SHARE_DMA1_BIT    0x0100
  316. #define MS_HAS_CMD_INFO_BIT    0x0200
  317. #define MS_NO_DEFAULT_INFO_BIT    0x0400
  318.  
  319. /*
  320.  * MLID 'LineSpeed' Bit Definitions.
  321.  */
  322. #define MLS_MASK        0x7FFFF
  323. #define MLS_KILO_IND_BIT    0x80000
  324.  
  325. /*
  326.  * STAT_TABLE_ENTRY Definitons.
  327.  */
  328. #define    ODI_STAT_UNUSED        0xFFFFFFFF    /* Statistics Table Entry */
  329.                         /* not in use.*/
  330. #define    ODI_STAT_UINT32        0x00000000    /* Statistics Table Entry */
  331.                         /* UINT32 Counter */
  332. #define    ODI_STAT_UINT64        0x00000001    /* Statistics Table Entry */
  333.                         /* UINT64 Counter */
  334. #define ODI_STAT_MEON_STRING    0x00000002    /* Statistics Table Entry */
  335.                         /* Counter is a MEON_STRING */
  336. #define ODI_STAT_UNTYPED    0x00000003    /* Statistics Table Entry */
  337.                         /* Counter is a UINT32 */
  338.                         /* length preceded array */
  339.                         /* UINT8 */
  340. #define ODI_STAT_RESETABLE    0x80000000    /* Statistics Table Entry */
  341.                         /* Counter is resetable by */
  342.                         /* external entity */
  343. #define    NULL        0
  344.  
  345. typedef    struct    _UINT64_ {
  346.     UINT32    Low_UINT32;
  347.     UINT32    High_UINT32;
  348. } UINT64;
  349.  
  350. typedef    void        VOID;
  351. typedef MEON        UNICODE_STRING;
  352. typedef MEON        *PUNICODE_STRING;
  353. typedef MEON        *PWSTR;
  354.  
  355. /*
  356.  * declare the pointer for the ODI definitions
  357.  */
  358. typedef    MEON        *PMEON;
  359. typedef    UINT8        *PUINT8;
  360. typedef    UINT16        *PUINT16;
  361. typedef    UINT32        *PUINT32;
  362. typedef    UINT64        *PUINT64;
  363. typedef    VOID        *PVOID;
  364.  
  365. typedef struct _PROT_ID_ {
  366.         UINT8   protocolID[6];
  367. } PROT_ID;
  368.  
  369. typedef struct  _NODE_ADDR_ {
  370.         UINT8   nodeAddress[6];
  371. } NODE_ADDR;
  372.  
  373. /*
  374.  * Set PRAGMA to pack these structures
  375.  */
  376. #pragma    pack(1)
  377.  
  378. typedef    struct _STAT_TABLE_ENTRY_ {
  379.     UINT32        StatUseFlag;    /* ODI_STAT_UNUSED Statistics Table */
  380.                     /* Entry not in use, OR */
  381.                     /* ODI_STAT_UINT32 *StatConter is a */
  382.                     /* pointer to an UINT32 Counter, OR */
  383.                     /* ODI_STAT_UINT32 *StatConter is a */
  384.                     /* a pointer to an UINT64 Counter */
  385.     VOID        *StatCounter;    /* pointer to a UINT32 or UINT64 */
  386.                     /* counter. */
  387.     MEON_STRING    *StatString;    /* pointer to a MEON String, */
  388.                     /* describing the statistics counter */
  389. } StatTableEntry, *PStatTableEntry, STAT_TABLE_ENTRY;
  390.  
  391. /*
  392.  * definitions for Information Block for passing API's, eg. Function Lists
  393.  */
  394. typedef    struct _INFO_BLOCK_ {
  395.     UINT32    NumberOfAPIs;
  396.     VOID    (**SupportAPIArray)();
  397. } INFO_BLOCK, *PINFO_BLOCK;
  398.  
  399. typedef struct _INT_AES_ {
  400.         struct _INT_AES_        *TLink;
  401.         void                    (* TCallBackProcedure)();
  402.         UINT32                  TCallBackEBXParameter;
  403.         UINT32                  TCallBackWaitTime;
  404.         void            *TResourceTag;
  405.         UINT32                  TWorkWakeUpTime;
  406.         UINT32                  TSignature;
  407. } INT_AES;
  408.  
  409. typedef struct  _AES_ {
  410.         struct _AES_            *AESLink;
  411.         UINT32                  AESWakeUpDelayAmount;
  412.         UINT32                  AESWakeUpTime;
  413.         void                    (* AESProcessToCall)();
  414.         void            *AESRTag;
  415.         struct _AES_            *AESOldLink;
  416. } AES;
  417.  
  418. #ifdef IAPX386
  419.  
  420. struct AESProcessStructure {
  421.     struct AESProcessStructure    *AESLink;
  422.     UINT32                AESWakeUpDelayAmount;
  423.     UINT32                AESWakeUpTime;
  424.     VOID                (* AESProcessToCall)();
  425.     VOID                *AESRTag;
  426.     VOID                *AESOldLink;
  427. };
  428.  
  429. #define    ALink            AESLink
  430. #define    AWakeUpDelayAmount    AESWakeUpDelayAmount
  431. #define    AWakeUpTime        AESWakeUpTime
  432. #define    AProcessToCall        AESProcessToCall
  433. #define    ARTag            AESRTag
  434. #define    AOldLink        AESOldLink
  435.  
  436. #endif
  437.  
  438. typedef    struct    _FRAGMENT_STRUCT_ {
  439.     VOID            *FragmentAddress;
  440.     UINT32            FragmentLength;
  441. } FRAGMENTSTRUCT, FRAGMENT_STRUCT, *PFRAGMENTSTRUCT;
  442.  
  443. struct    msgb;
  444. struct  lslsap;
  445.  
  446. typedef struct _manage_ecb_ {
  447.     struct    ECB        *manage_nextlink;
  448.     struct    ECB        *manage_prevlink;
  449.     struct    msgb        *manage_pmsgb;
  450.     void            (* manage_esr)(struct ECB *);
  451.     struct    lslsap        *manage_sap;
  452.     UINT32            manage_esrebxval;
  453.     UINT32            manage_memtype;
  454.     UINT32            manage_memsrc;
  455. } manage_ecb;
  456.  
  457. typedef struct ECB {
  458.     UINT8            ECB_RCBDriverWS[8];
  459.     UINT16            ECB_Status;
  460.     manage_ecb        *ECB_management;    /* only in Unixware! */
  461.     UINT16            ECB_StackID;
  462.     PROT_ID            ECB_ProtocolID;
  463.     UINT32            ECB_BoardNumber;
  464.     NODE_ADDR        ECB_ImmediateAddress;
  465.     union {
  466.         UINT8        DWs_i8val[4];
  467.         UINT16        DWs_i16val[2];
  468.         UINT32        DWs_i32val;
  469.         VOID        *DWs_pval;
  470.     } ECB_DriverWorkspace;
  471.  
  472.     union {
  473.         UINT8        PWs_i8val[8];
  474.         UINT16        PWs_i16val[4];
  475.         UINT32        PWs_i32val[2];
  476.         UINT64        PWs_i64val;
  477.         void        *PWs_pval[2];
  478.     } ECB_ProtocolWorkspace;
  479.  
  480.     UINT32            ECB_DataLength;
  481.     UINT32            ECB_FragmentCount;
  482.     FRAGMENT_STRUCT        ECB_Fragment[1];
  483. } ECB;
  484.  
  485. /*
  486.  * following macros for Unixware specific fields.
  487.  */
  488. #define ECB_NextLink            ECB_management->manage_nextlink
  489. #define ECB_PreviousLink        ECB_management->manage_prevlink
  490. #define ECB_mblk                ECB_management->manage_pmsgb
  491. #define ECB_sap                 ECB_management->manage_sap
  492. #define ECB_ESR                 ECB_management->manage_esr
  493. #define    ECB_memtype        ECB_management->manage_memtype
  494. #define    ECB_memsrc        ECB_management->manage_memsrc
  495.  
  496. /*
  497.  * just mapping to new names.
  498.  */
  499. #define fLinkAddress            ECB_NextLink
  500. #define fragmentDescriptor      ECB_Fragment
  501. #define packetLength            ECB_DataLength
  502. #define ESRAddress              ECB_ESR
  503. #define fragmentCount           ECB_FragmentCount
  504. #define boardNumber             ECB_BoardNumber
  505. #define socketNumber            ECB_ProtocolWorkspace.PWs_i32val[1]
  506. #define address                 FragmentAddress
  507.  
  508. #define ESREBXValue             ECB_management->manage_esrebxval
  509.  
  510. #define    ECB_TAIL        12
  511.  
  512. typedef    struct    _LOOKAHEAD_ {
  513.     struct ECB    *LkAhd_PreFilledECB;
  514.     UINT8        *LkAhd_MediaHeaderPtr;
  515.     UINT32        LkAhd_MediaHeaderLen;
  516.     UINT8        *LkAhd_DataLookAheadPtr;
  517.     UINT32        LkAhd_DataLookAheadLen;
  518.     UINT32        LkAhd_BoardNumber;
  519.     UINT32        LkAhd_PktAttr;    /* now Packet Attributes instead */
  520.                     /* of ErrorStatus */
  521.     UINT32        LkAhd_DestType;
  522.  
  523.     UINT32        LkAhd_FrameDataSize;
  524.     UINT16        LkAhd_PadAlignBytes1;
  525.     PROT_ID        LkAhd_ProtocolID;
  526.     UINT16        LkAhd_PadAlignBytes2;
  527.     NODE_ADDR    LkAhd_ImmediateAddress;
  528.     UINT32        LkAhd_FrameDataStartCopyOffset;
  529.     UINT32        LkAhd_FrameDataBytesWanted;
  530.     ECB        *LkAhd_ReturnedECB;
  531.     UINT32        LkAhd_PriorityLevel;
  532.     void        *LkAhd_Reserved;
  533. } LOOKAHEAD, *PLOOKAHEAD;
  534.  
  535. typedef struct _Lan_Memory_Configuration_ {
  536.     void        *MemoryAddress;
  537.     UINT16        MemorySize;
  538. } Lan_Memory_Configuration;
  539.  
  540. /*
  541.  * definitions for MLID Configuration, statistics tables and
  542.  * misc. structures.
  543.  */
  544. typedef    struct _MLID_CONFIG_TABLE_ {
  545.     MEON        MLIDCFG_Signature[26];
  546.     UINT8        MLIDCFG_MajorVersion;
  547.     UINT8        MLIDCFG_MinorVersion;
  548.     NODE_ADDR    MLIDCFG_NodeAddress;
  549.     UINT16        MLIDCFG_ModeFlags;
  550.     UINT16        MLIDCFG_BoardNumber;
  551.     UINT16        MLIDCFG_BoardInstance;
  552.     UINT32        MLIDCFG_MaxFrameSize;
  553.     UINT32        MLIDCFG_BestDataSize;
  554.     UINT32        MLIDCFG_WorstDataSize;
  555.     MEON_STRING    *MLIDCFG_CardName;
  556.     MEON_STRING    *MLIDCFG_ShortName;
  557.     MEON_STRING    *MLIDCFG_FrameTypeString;
  558.     UINT16        MLIDCFG_Reserved0;
  559.     UINT16        MLIDCFG_FrameID;
  560.     UINT16        MLIDCFG_TransportTime;
  561.     UINT32        (*MLIDCFG_SourceRouting)(UINT32, void*, void**,
  562.                 BOOLEAN);
  563.     UINT16        MLIDCFG_LineSpeed;
  564.     UINT16        MLIDCFG_LookAheadSize;
  565.     UINT8        MLIDCFG_SGCount;
  566.     UINT8        MLIDCFG_Reserved1;
  567.     UINT16        MLIDCFG_PrioritySup;
  568.     void        *MLIDCFG_Reserved2;
  569.     UINT8        MLIDCFG_DriverMajorVer;
  570.     UINT8        MLIDCFG_DriverMinorVer;
  571.     UINT16        MLIDCFG_Flags;
  572.     UINT16        MLIDCFG_SendRetries;
  573.     void        *MLIDCFG_DriverLink;
  574.     UINT16        MLIDCFG_SharingFlags;
  575.     UINT16        MLIDCFG_Slot;
  576.     UINT16        MLIDCFG_IOPort0;
  577.     UINT16        MLIDCFG_IORange0;
  578.     UINT16        MLIDCFG_IOPort1;
  579.     UINT16        MLIDCFG_IORange1;
  580.     Lan_Memory_Configuration
  581.             LAN_MEMORY_CONFIGURATION[2];
  582.     UINT8        MLIDCFG_Interrupt0;
  583.     UINT8        MLIDCFG_Interrupt1;
  584.     UINT8        MLIDCFG_DMALine0;
  585.     UINT8        MLIDCFG_DMALine1;
  586.     VOID        *MLIDCFG_ResourceTag;
  587.     VOID        *MLIDCFG_Config;
  588.     VOID        *MLIDCFG_CommandString;
  589.     MEON_STRING    MLIDCFG_LogicalName[18];
  590.     void        *MLIDCFG_LinearMemory0;
  591.     void        *MLIDCFG_LinearMemory1;
  592.     UINT16        MLIDCFG_ChannelNumber;
  593.     void        *MLIDCFG_DBusTag;
  594.     UINT8        MLIDCFG_DIOConfigMajorVer;
  595.     UINT8        MLIDCFG_DIOConfigMinorVer;
  596. } MLID_ConfigTable, *PMLID_ConfigTable, MLID_CONFIG_TABLE;
  597.  
  598. typedef    MLID_ConfigTable    CONFIG_TABLE;
  599.  
  600. #define MLIDCFG_MemoryAddress0    LAN_MEMORY_CONFIGURATION[0].MemoryAddress
  601. #define MLIDCFG_MemorySize0    LAN_MEMORY_CONFIGURATION[0].MemorySize
  602. #define MLIDCFG_MemoryAddress1    LAN_MEMORY_CONFIGURATION[1].MemoryAddress
  603. #define MLIDCFG_MemorySize1    LAN_MEMORY_CONFIGURATION[1].MemorySize
  604.  
  605. #define    DCardName        MLIDCFG_CardName
  606. #define    DShortName        MLIDCFG_ShortName
  607. #define    DBoardNumber        MLIDCFG_BoardNumber
  608. #define    DMaxDataSize        MLIDCFG_MaxFrameSize
  609. #define    DMaxRecvSize        MLIDCFG_BestDataSize
  610. #define    DRecvSize        MLIDCFG_WorstDataSize
  611. #define    DLogicalName        MLIDCFG_LogicalName
  612. #define    DNodeAddress        MLIDCFG_NodeAddress
  613. #define    DReserved        MLIDCFG_SourceRouting
  614. #define    DLink            MLIDCFG_DriverLink
  615.  
  616. typedef struct _IO_CONFIG_ {
  617.     struct _IO_CONFIG_        *IO_DriverLink;
  618.     UINT16                IO_SharingFlags;
  619.     UINT16                IO_Slot;
  620.     UINT16                IO_IOPort0;
  621.     UINT16                IO_IORange0;
  622.     UINT16                IO_IOPort1;
  623.     UINT16                IO_IORange1;
  624.     Lan_Memory_Configuration
  625.                     LAN_MEMORY_CONFIGURATION[2];
  626.     UINT8                IO_Interrupt0;
  627.     UINT8                IO_Interrupt1;
  628.     UINT8                IO_DMALine0;
  629.     UINT8                IO_DMALine1;
  630.     struct ResourceTagStructure    *IO_ResourceTag;
  631.     void                *IO_Config;
  632.     void                *IO_CommandString;
  633.     MEON_STRING            IO_LogicalName[18];
  634.     void                *IO_LinearMemory0;
  635.     void                *IO_LinearMemory1;
  636.     UINT16                IO_ChannelNumber;
  637.     void                *IO_DBusTag;
  638.     UINT8                IO_DIOConfigMajorVer;
  639.     UINT8                IO_DIOConfigMinorVer;
  640. } IO_CONFIG;
  641.  
  642. #define IO_MemoryAddress0    LAN_MEMORY_CONFIGURATION[0].MemoryAddress
  643. #define IO_MemorySize0        LAN_MEMORY_CONFIGURATION[0].MemorySize
  644. #define IO_MemoryAddress1    LAN_MEMORY_CONFIGURATION[1].MemoryAddress
  645. #define IO_MemorySize1        LAN_MEMORY_CONFIGURATION[1].MemorySize
  646.  
  647. typedef    struct _MLID_STATS_TABLE_ {
  648.     UINT16            MStatTableMajorVer;
  649.     UINT16            MStatTableMinorVer;
  650.     UINT32            MNumGenericCounters;
  651.     STAT_TABLE_ENTRY    *MGenericCountsPtr;
  652.     UINT32            MNumMediaCounters;
  653.     STAT_TABLE_ENTRY    *MMediaCountsPtr;
  654.     UINT32            MNumCustomCounters;
  655.     STAT_TABLE_ENTRY    *MCustomCountersPtr;
  656. } MLID_StatsTable, *PMLID_StatsTable, MLID_STATS_TABLE;
  657.  
  658. #define NUM_GENERIC_MLID_COUNTERS               20
  659.  
  660. #define MLID_TOTAL_TX_PACKET_COUNT        0
  661. #define MLID_TOTAL_RX_PACKET_COUNT        1
  662. #define MLID_NO_ECB_AVAILABLE_COUNT        2
  663. #define MLID_PACKET_TX_TOO_BIG_COUNT        3
  664. #define MLID_PACKET_TX_TOO_SMALL_COUNT        4
  665. #define MLID_PACKET_RX_OVERFLOW_COUNT        5
  666. #define MLID_PACKET_RX_TOO_BIG_COUNT        6
  667. #define MLID_PACKET_RX_TOO_SMALL_COUNT        7
  668. #define MLID_PACKET_TX_MISC_ERROR_COUNT        8
  669. #define MLID_PACKET_RX_MISC_ERROR_COUNT        9
  670. #define MLID_RETRY_TX_COUNT            10
  671. #define MLID_CHECKSUM_ERROR_COUNT        11
  672. #define MLID_HARDWARE_RX_MISMATCH_COUNT        12
  673. #define MLID_TOTAL_TX_OK_BYTE_COUNT        13
  674. #define MLID_TOTAL_RX_OK_BYTE_COUNT        14
  675. #define MLID_TOTAL_GROUP_ADDR_TX_COUNT        15
  676. #define MLID_TOTAL_GROUP_ADDR_RX_COUNT        16
  677. #define MLID_ADAPTER_RESET_COUNT        17
  678. #define MLID_ADAPTER_OPR_TIME_STAMP        18
  679. #define MLID_Q_DEPTH                19
  680.  
  681. #define NUM_TOKEN_SPECIFIC_COUNTERS             13
  682.  
  683. #define TRN_AC_ERROR_COUNT            0
  684. #define TRN_ABORT_DELIMITER_COUNTER             1
  685. #define TRN_BURST_ERROR_COUNTER                 2
  686. #define TRN_FRAME_COPIED_ERROR_COUNTER        3
  687. #define TRN_FREQUENCY_ERROR_COUNTER             4
  688. #define TRN_INTERNAL_ERROR_COUNTER              5
  689. #define TRN_LAST_RING_STATUS                    6
  690. #define TRN_LINE_ERROR_COUNTER                  7
  691. #define TRN_LOST_FRAME_COUNTER                  8
  692. #define TRN_TOKEN_ERROR_COUNTER                 9
  693. #define TRN_UPSTREAM_NODE_ADDRESS               10
  694. #define TRN_LAST_RING_ID            11
  695. #define TRN_LAST_BEACON_TYPE                    12
  696.  
  697. #define NUM_ETHERNET_SPECIFIC_COUNTERS          8
  698.  
  699. #define ETH_TX_OK_SINGLE_COLLISIONS_COUNT       0
  700. #define ETH_TX_OK_MULTIPLE_COLLISIONS_COUNT     1
  701. #define ETH_TX_OK_BUT_DEFERRED            2
  702. #define ETH_TX_ABORT_LATE_COLLISION        3
  703. #define ETH_TX_ABORT_EXCESS_COLLISION           4
  704. #define ETH_TX_ABORT_CARRIER_SENSE        5
  705. #define ETH_TX_ABORT_EXCESSIVE_DEFERRAL         6
  706. #define ETH_RX_ABORT_FRAME_ALIGNMENT            7
  707.  
  708. #define NUM_FDDI_SPECIFIC_COUNTERS        10
  709.  
  710. #define FDDI_CONFIGURATION_STATE        0
  711. #define FDDI_UPSTREAM_NODE                      1
  712. #define FDDI_DOWNSTREAM_NODE            2
  713. #define FDDI_FRAME_ERROR_COUNT            3
  714. #define FDDI_FRAMES_LOST_COUNT            4
  715. #define FDDI_RING_MANAGEMENT_STATE        5
  716. #define FDDI_LCT_FAILURE_COUNT            6
  717. #define FDDI_LEM_REJECT_COUNT            7
  718. #define FDDI_LEM_COUNT                8
  719. #define FDDI_L_CONNECTION_STATE            9
  720.  
  721. typedef    struct _MLID_Reg_ {
  722.     VOID        (*MLIDSendHandler)(struct ECB *);
  723.     INFO_BLOCK    *MLIDControlHandler;
  724.         void            *MLIDSendContext;
  725.         void            *MLIDResourceObj;
  726.         void            *MLIDModuleHandle;
  727. } MLID_Reg, *PMLID_Reg, MLID_REG;
  728.  
  729. /*
  730.  * reset PRAGMA to normal after packing above structures.
  731.  */
  732. #pragma    pack()
  733.  
  734. struct    _SHARED_DATA_;
  735. struct     _DRIVER_DATA_;
  736. struct     _FRAME_DATA_;
  737. struct    _TCB_;
  738.  
  739. typedef struct _TSM_CONFIG_LIMITS_ {
  740.         UINT8   *MinNodeAddress;
  741.         UINT8   *MaxNodeAddress;
  742.         UINT32  MinRetries;
  743.         UINT32  MaxCRetries;
  744.         UINT32  NumberFrames;
  745. } TSM_CONFIG_LIMITS;
  746.  
  747. /*
  748.  * TSM parameter block. Only for TSMs which assume that the HSM is
  749.  * MSM based.
  750.  */
  751. typedef struct    _TSM_PARM_BLOCK_ {
  752.     UINT32            MediaParameterSize;
  753.     TSM_CONFIG_LIMITS    *MediaConfigLimits;
  754.     MEON_STRING        **MediaFrameDescriptTable;
  755.     UINT8            (*MediaProtocolIDArray)[6];
  756.     UINT8            *MediaIDArray;
  757.     UINT8            *MediaHeaderSizeArray;
  758.     UINT32            (_cdecl ** MediaSendRoutineArray)(
  759.                     struct _SHARED_DATA_ *sharedData,
  760.                     ECB *, struct _TCB_ *tcb);
  761.     UINT32            MediaAdapterDataSpaceSize;
  762.     struct _MEDIA_DATA_    *MediaAdapterPtr;
  763.     ODISTAT            (_cdecl * MediaAdjustPtr)(struct _FRAME_DATA_
  764.                     *frameData);
  765.     ODISTAT            (_cdecl * MediaInitPtr)(struct
  766.                     _DRIVER_DATA_ *driverData,
  767.                     struct _FRAME_DATA_ *frameData);
  768.     ODISTAT            (_cdecl * MediaResetPtr)(struct
  769.                     _DRIVER_DATA_ *driverData,
  770.                     struct _FRAME_DATA_ *frameData);
  771.     ODISTAT            (_cdecl * MediaShutdownPtr)(struct
  772.                     _DRIVER_DATA_ *driverData,
  773.                     struct _FRAME_DATA_ *frameData, UINT32
  774.                     shutdownType);
  775.     void            (_cdecl * MediaSendPtr)(ECB *ecb,
  776.                     CONFIG_TABLE *configTable);
  777.     struct _TCB_        *(_cdecl * MediaGetNextSendPtr)(struct
  778.                     _DRIVER_DATA_ *driverData,
  779.                     CONFIG_TABLE **configTable, UINT32
  780.                     *PacketSize, void **PhysTcb);
  781.     ODISTAT            (_cdecl * MediaAddMulticastPtr)(struct
  782.                     _DRIVER_DATA_ *driverData,
  783.                     NODE_ADDR *McAddress);
  784.     ODISTAT            (_cdecl * MediaDeleteMulticastPtr)(struct
  785.                     _DRIVER_DATA_ *driverData, NODE_ADDR
  786.                     *McAddress);
  787.     ODISTAT            (_cdecl * MediaNodeOverridePtr)(struct
  788.                     _FRAME_DATA_ *frameData, MEON mode);
  789.     ODISTAT            (_cdecl * MediaAdjustNodeAddressPtr)(
  790.                     struct _FRAME_DATA_ *frameData);
  791.     ODISTAT            (_cdecl * MediaSetLookAheadSizePtr)(struct
  792.                     _DRIVER_DATA_ *driverData,
  793.                     struct _FRAME_DATA_ *frameData,
  794.                     UINT32 size);
  795.     ODISTAT            (_cdecl * MediaPromiscuousChangePtr)(struct
  796.                     _DRIVER_DATA_ *driverData,
  797.                     struct _FRAME_DATA_ *frameData,
  798.                     UINT32 PromiscuousState,
  799.                     UINT32 *PromiscuousMode);
  800.     ODISTAT            (_cdecl * MediaRegisterMonitorPtr)(struct
  801.                     _DRIVER_DATA_ *driverData,
  802.                     struct _FRAME_DATA_ *frameData, void
  803.                     (* _cdecl TXRMonRoutine)
  804.                     (struct _TCB_ *), BOOLEAN MonitorState);
  805.     ODISTAT            (_cdecl * MediaGetParametersPtr)(
  806.                     CONFIG_TABLE    *configTable);
  807.     ODISTAT            (_cdecl * MediaGetMulticastInfo)
  808.                     (struct _DRIVER_DATA_  *driverData,
  809.                     ECB *MulticastInfoECB);
  810. } TSM_PARM_BLOCK;
  811.  
  812.  
  813. typedef struct _ETHER_STATS_ {
  814.     UINT32    TxOKSingleCollisions;
  815.     UINT32    TxOKMultipleCollisions;
  816.     UINT32    TxOKButDeferred;
  817.     UINT32    TxAbortLateCollision;
  818.     UINT32    TxAbortExcessCollision;
  819.     UINT32    TxAbortCarrierSense;
  820.     UINT32    TxAbortExcessiveDeferral;
  821.     UINT32    RxAbortFrameAlignment;
  822. } ETHER_STATS;
  823.  
  824. #define ETHER_IN_ERRS(E_S) ( (E_S).RxAbortFrameAlignment )
  825. #define ETHER_OUT_ERRS(E_S) \
  826.     ( (E_S).TxAbortCarrierSense + (E_S).TxAbortLateCollision + \
  827.      (E_S).TxAbortExcessCollision + (E_S).TxAbortExcessiveDeferral )
  828.  
  829. typedef struct _TOKEN_STATS_ {
  830.     UINT32    ACErrorCounter;
  831.     UINT32    AbortDelimiterCounter;
  832.     UINT32    BurstErrorCounter;
  833.     UINT32    FrameCopiedErrorCounter;
  834.     UINT32    FrequenceyErrorCounter;
  835.     UINT32    InternalErrorCounter;
  836.     UINT32    LastRingStatus;
  837.     UINT32    LineErrorCounter;
  838.     UINT32    LostFrameCounter;
  839.     UINT32    TokenErrorCounter;
  840.     /*
  841.      * "CounterMask1" and addtional counters appear after these counters in
  842.      * the Spec but are omitted.
  843.      */
  844. } TOKEN_STATS;
  845.  
  846. #define TOKEN_IN_ERRS(T_S) \
  847.     ( (T_S).ACErrorCounter + (T_S).FrameCopiedErrorCounter )
  848. #define TOKEN_OUT_ERRS(T_S) \
  849.     ( (T_S).AbortDelimiterCounter + (T_S).BurstErrorCounter + \
  850.      (T_S).LostFrameCounter )
  851.  
  852. typedef struct _FDDI_STATS_ {
  853.     UINT32    FConfigurationState;
  854.     UINT32    FUpstreamNodeHighDword;
  855.     UINT32    FUpstreamNodeLowWord;
  856.     UINT32    FDownstreamNodeHighDword;
  857.     UINT32    FDownstreamNodeLowWord;
  858.     UINT32    FFrameErrorCount;
  859.     UINT32    FFrameLostCount;
  860.     UINT32    FRingManagementCount;
  861.     UINT32    FLCTFailureCount;
  862.     UINT32    FLemRejectCount;
  863.     /*
  864.      * "CounterMask1" and addtional counters appear after these counters in
  865.      * the Spec but are omitted here.
  866.      */
  867. } FDDI_STATS;
  868.  
  869. #define FDDI_IN_ERRS(F_S) ( (F_S).FFrameErrorCount + (F_S).FFrameLostCount )
  870.  
  871. typedef struct _GENERIC_STATS_ {
  872.     UINT32    Gen_TotalTxPackets;
  873.     UINT32    Gen_TotalRxPackets;
  874.     UINT32    Gen_NoECBs;
  875.     UINT32    Gen_TxTooBig;
  876.     UINT32    Gen_TxTooSmall;
  877.     UINT32    Gen_RxOverflow;
  878.     UINT32    Gen_RxTooBig;
  879.     UINT32    Gen_RxTooSmall;
  880.     UINT32    Gen_TxMiscError;
  881.     UINT32    Gen_RxMiscError;
  882.     UINT32    Gen_TxRetryCount;
  883.     UINT32    Gen_RxCheckSumError;
  884.     UINT32    Gen_RxMisMatchError;
  885.     UINT32    Gen_TotalTxOkByteLow;
  886.     UINT32    Gen_TotalTxOkByteHigh;
  887.     UINT32    Gen_TotalRxOkByteLow;
  888.     UINT32    Gen_TotalRxOkByteHigh;
  889.     UINT32    Gen_TotalGroupAddrTx;
  890.     UINT32    Gen_TotalGroupAddrRx;
  891.     UINT32    Gen_AdapterReset;
  892.     UINT32    Gen_AdapterOPRTimeStamp;
  893.     UINT32    Gen_Qdepth;
  894.     union {
  895.         ETHER_STATS    Gen_EtherStats;
  896.         TOKEN_STATS    Gen_TokenStats;
  897.         FDDI_STATS    Gen_FDDIStats;
  898.     } Gen_MediaSpecific;
  899. } GENERIC_STATS;
  900.  
  901. #define GEN_IN_ERRS(G_S) \
  902.     ( (G_S).Gen_RxTooBig + (G_S).Gen_RxTooSmall + (G_S).Gen_RxMiscError + \
  903.      (G_S).Gen_RxOverflow + (G_S).Gen_RxCheckSumError + \
  904.      (G_S).Gen_RxMisMatchError )
  905. #define GEN_OUT_ERRS(G_S) \
  906.     ( (G_S).Gen_TxTooBig + (G_S).Gen_TxTooSmall + (G_S).Gen_TxMiscError )
  907.  
  908.  
  909. #define    NUM_ODI_IOCTLS                15
  910.  
  911. #define ODI_IOCTL_GetConfiguration              0
  912. #define ODI_IOCTL_GetStatistics                 1
  913. #define ODI_IOCTL_AddMulticastAddress           2
  914. #define ODI_IOCTL_DeleteMulticastAddress        3
  915. #define ODI_IOCTL_Reserved0                     4
  916. #define ODI_IOCTL_Shutdown                      5
  917. #define ODI_IOCTL_Reset                         6
  918. #define ODI_IOCTL_Reserved1                     7
  919. #define ODI_IOCTL_Reserved2                     8
  920. #define ODI_IOCTL_SetLookAheadSize              9
  921. #define ODI_IOCTL_PromiscuousChange             10
  922. #define ODI_IOCTL_RegisterMonitor        11
  923. #define ODI_IOCTL_Reserved3                     12
  924. #define ODI_IOCTL_Reserved4                     13
  925. #define ODI_IOCTL_Management                    14
  926.  
  927. #define    NOT_PERIODIC                0
  928. #define    PERIODIC                1
  929.  
  930. #define    LSLReturnRcvECB                lsl_free_ecb
  931.  
  932. typedef struct _GROUP_ADDR_LIST_NODE_ {
  933.     NODE_ADDR    GRP_ADDR;
  934.     UINT16        GRP_ADDR_COUNT;
  935. } GROUP_ADDR_LIST_NODE;
  936.  
  937. /*
  938.  * DEBUG stuff
  939.  */
  940. #define ODI_DEBUG            /* REMOVE THIS */
  941. extern int odi_debug_printf();
  942. #ifdef DEBUG
  943. # define ODI_DEBUG
  944. #endif
  945. #ifdef ODI_DEBUG
  946. extern int odi_debug;
  947. # define _ODI_DPRINT(n) (odi_debug < n) ? 1 : odi_debug_printf
  948. #else
  949. # define _ODI_DPRINT(n) (1) ? 1 : odi_debug_printf
  950. #endif
  951. #define ODI_DPRINT1 _ODI_DPRINT(1)
  952. #define ODI_DPRINT2 _ODI_DPRINT(2)
  953. #define ODI_DPRINT3 _ODI_DPRINT(3)
  954.  
  955. #endif
  956.