Home | History | Annotate | Download | only in UndiRuntimeDxe
      1 /** @file
      2   Definitions for network adapter card.
      3 
      4 Copyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef _E100B_H_
     16 #define _E100B_H_
     17 
     18 // pci config offsets:
     19 
     20 #define RX_BUFFER_COUNT 32
     21 #define TX_BUFFER_COUNT 32
     22 
     23 #define PCI_VENDOR_ID_INTEL 0x8086
     24 #define PCI_DEVICE_ID_INTEL_82557 0x1229
     25 #define D100_VENDOR_ID   0x8086
     26 #define D100_DEVICE_ID   0x1229
     27 #define D102_DEVICE_ID   0x2449
     28 
     29 #define ICH3_DEVICE_ID_1   0x1031
     30 #define ICH3_DEVICE_ID_2   0x1032
     31 #define ICH3_DEVICE_ID_3   0x1033
     32 #define ICH3_DEVICE_ID_4   0x1034
     33 #define ICH3_DEVICE_ID_5   0x1035
     34 #define ICH3_DEVICE_ID_6   0x1036
     35 #define ICH3_DEVICE_ID_7   0x1037
     36 #define ICH3_DEVICE_ID_8   0x1038
     37 
     38 #define SPEEDO_DEVICE_ID   0x1227
     39 #define SPLASH1_DEVICE_ID   0x1226
     40 
     41 
     42 // bit fields for the command
     43 #define PCI_COMMAND_MASTER  0x04  // bit 2
     44 #define PCI_COMMAND_IO    0x01  // bit 0
     45 #define PCI_COMMAND  0x04
     46 #define PCI_LATENCY_TIMER  0x0D
     47 
     48 #define ETHER_MAC_ADDR_LEN 6
     49 #ifdef AVL_XXX
     50 #define ETHER_HEADER_LEN 14
     51 // media interface type
     52 // #define INTERFACE_TYPE "
     53 
     54 // Hardware type values
     55 #define HW_ETHER_TYPE    1
     56 #define HW_EXPERIMENTAL_ETHER_TYPE 2
     57 #define HW_IEEE_TYPE    6
     58 #define HW_ARCNET_TYPE     7
     59 
     60 #endif  // AVL_XXX
     61 
     62 #define MAX_ETHERNET_PKT_SIZE 1514  // including eth header
     63 #define RX_BUFFER_SIZE 1536  // including crc and padding
     64 #define TX_BUFFER_SIZE 64
     65 #define ETH_MTU 1500  // does not include ethernet header length
     66 
     67 #define SPEEDO3_TOTAL_SIZE 0x20
     68 
     69 #pragma pack(1)
     70 
     71 typedef struct eth {
     72   UINT8 dest_addr[PXE_HWADDR_LEN_ETHER];
     73   UINT8 src_addr[PXE_HWADDR_LEN_ETHER];
     74   UINT16 type;
     75 } EtherHeader;
     76 
     77 #pragma pack(1)
     78 typedef struct CONFIG_HEADER {
     79   UINT16 VendorID;
     80   UINT16 DeviceID;
     81   UINT16 Command;
     82   UINT16 Status;
     83   UINT16 RevID;
     84   UINT16 ClassID;
     85   UINT8  CacheLineSize;
     86   UINT8  LatencyTimer;
     87   UINT8  HeaderType;    // must be zero to impose this structure...
     88   UINT8  BIST;  // built-in self test
     89   UINT32 BaseAddressReg_0;  // memory mapped address
     90   UINT32 BaseAddressReg_1;  //io mapped address, Base IO address
     91   UINT32 BaseAddressReg_2;  // option rom address
     92   UINT32 BaseAddressReg_3;
     93   UINT32 BaseAddressReg_4;
     94   UINT32 BaseAddressReg_5;
     95   UINT32 CardBusCISPtr;
     96   UINT16 SubVendorID;
     97   UINT16 SubSystemID;
     98   UINT32 ExpansionROMBaseAddr;
     99   UINT8 CapabilitiesPtr;
    100   UINT8 reserved1;
    101   UINT16 Reserved2;
    102   UINT32 Reserved3;
    103   UINT8 int_line;
    104   UINT8 int_pin;
    105   UINT8 Min_gnt;
    106   UINT8 Max_lat;
    107 } PCI_CONFIG_HEADER;
    108 #pragma pack()
    109 
    110 //-------------------------------------------------------------------------
    111 // Offsets to the various registers.
    112 //   All accesses need not be longword aligned.
    113 //-------------------------------------------------------------------------
    114 enum speedo_offsets {
    115   SCBStatus = 0, SCBCmd = 2,     // Rx/Command Unit command and status.
    116   SCBPointer = 4,                // General purpose pointer.
    117   SCBPort = 8,                   // Misc. commands and operands.
    118   SCBflash = 12, SCBeeprom = 14, // EEPROM and flash memory control.
    119   SCBCtrlMDI = 16,               // MDI interface control.
    120   SCBEarlyRx = 20,               // Early receive byte count.
    121   SCBEarlyRxInt = 24, SCBFlowCtrlReg = 25, SCBPmdr = 27,
    122   // offsets for general control registers (GCRs)
    123   SCBGenCtrl = 28, SCBGenStatus = 29, SCBGenCtrl2 = 30, SCBRsvd = 31
    124 };
    125 
    126 #define GCR2_EEPROM_ACCESS_SEMAPHORE 0x80 // bit offset into the gcr2
    127 
    128 //-------------------------------------------------------------------------
    129 // Action commands - Commands that can be put in a command list entry.
    130 //-------------------------------------------------------------------------
    131 enum commands {
    132   CmdNOp = 0, CmdIASetup = 1, CmdConfigure = 2, CmdMulticastList = 3,
    133   CmdTx = 4, CmdTDR = 5, CmdDump = 6, CmdDiagnose = 7,
    134   CmdSuspend = 0x4000,    /* Suspend after completion. */
    135   CmdIntr = 0x2000,      /* Interrupt after completion. */
    136   CmdTxFlex = 0x0008      /* Use "Flexible mode" for CmdTx command. */
    137 };
    138 
    139 //-------------------------------------------------------------------------
    140 // port commands
    141 //-------------------------------------------------------------------------
    142 #define PORT_RESET 0
    143 #define PORT_SELF_TEST 1
    144 #define POR_SELECTIVE_RESET 2
    145 #define PORT_DUMP_POINTER 2
    146 
    147 //-------------------------------------------------------------------------
    148 // SCB Command Word bit definitions
    149 //-------------------------------------------------------------------------
    150 //- CUC fields
    151 #define   CU_START    0x0010
    152 #define   CU_RESUME    0x0020
    153 #define   CU_STATSADDR  0x0040
    154 #define   CU_SHOWSTATS  0x0050  /* Dump statistics counters. */
    155 #define   CU_CMD_BASE  0x0060  /* Base address to add to add CU commands. */
    156 #define   CU_DUMPSTATS  0x0070  /* Dump then reset stats counters. */
    157 
    158 //- RUC fields
    159 #define   RX_START  0x0001
    160 #define   RX_RESUME  0x0002
    161 #define   RX_ABORT  0x0004
    162 #define   RX_ADDR_LOAD  0x0006  /* load ru_base_reg */
    163 #define   RX_RESUMENR  0x0007
    164 
    165 // Interrupt fields (assuming byte addressing)
    166 #define INT_MASK  0x0100
    167 #define DRVR_INT  0x0200    /* Driver generated interrupt. */
    168 
    169 //- CB Status Word
    170 #define CMD_STATUS_COMPLETE 0x8000
    171 #define RX_STATUS_COMPLETE 0x8000
    172 #define CMD_STATUS_MASK 0xF000
    173 
    174 //-------------------------------------------------------------------------
    175 //- SCB Status bits:
    176 // Interrupts are ACKed by writing to the upper 6 interrupt bits
    177 //-------------------------------------------------------------------------
    178 #define SCB_STATUS_MASK        0xFC00 // bits 2-7 - STATUS/ACK Mask
    179 #define SCB_STATUS_CX_TNO      0x8000 // BIT_15  - CX or TNO Interrupt
    180 #define SCB_STATUS_FR          0x4000 // BIT_14 - FR Interrupt
    181 #define SCB_STATUS_CNA         0x2000 // BIT_13 - CNA Interrupt
    182 #define SCB_STATUS_RNR         0x1000 // BIT_12  - RNR Interrupt
    183 #define SCB_STATUS_MDI         0x0800 // BIT_11  - MDI R/W Done Interrupt
    184 #define SCB_STATUS_SWI         0x0400 // BIT_10  - SWI Interrupt
    185 
    186 // CU STATUS: bits 6 & 7
    187 #define SCB_STATUS_CU_MASK     0x00C0 // bits 6 & 7
    188 #define SCB_STATUS_CU_IDLE     0x0000 // 00
    189 #define SCB_STATUS_CU_SUSPEND  0x0040 // 01
    190 #define SCB_STATUS_CU_ACTIVE   0x0080 // 10
    191 
    192 // RU STATUS: bits 2-5
    193 #define SCB_RUS_IDLE         0x0000
    194 #define SCB_RUS_SUSPENDED    0x0004  // bit 2
    195 #define SCB_RUS_NO_RESOURCES   0x0008 // bit 3
    196 #define SCB_RUS_READY       0x0010 // bit 4
    197 
    198 //-------------------------------------------------------------------------
    199 // Bit Mask definitions
    200 //-------------------------------------------------------------------------
    201 #define BIT_0       0x0001
    202 #define BIT_1       0x0002
    203 #define BIT_2       0x0004
    204 #define BIT_3       0x0008
    205 #define BIT_4       0x0010
    206 #define BIT_5       0x0020
    207 #define BIT_6       0x0040
    208 #define BIT_7       0x0080
    209 #define BIT_8       0x0100
    210 #define BIT_9       0x0200
    211 #define BIT_10      0x0400
    212 #define BIT_11      0x0800
    213 #define BIT_12      0x1000
    214 #define BIT_13      0x2000
    215 #define BIT_14      0x4000
    216 #define BIT_15      0x8000
    217 #define BIT_24      0x01000000
    218 #define BIT_28      0x10000000
    219 
    220 
    221 //-------------------------------------------------------------------------
    222 // MDI Control register bit definitions
    223 //-------------------------------------------------------------------------
    224 #define MDI_DATA_MASK           BIT_0_15        // MDI Data port
    225 #define MDI_REG_ADDR            BIT_16_20       // which MDI register to read/write
    226 #define MDI_PHY_ADDR            BIT_21_25       // which PHY to read/write
    227 #define MDI_PHY_OPCODE          BIT_26_27       // which PHY to read/write
    228 #define MDI_PHY_READY           BIT_28          // PHY is ready for another MDI cycle
    229 #define MDI_PHY_INT_ENABLE      BIT_29          // Assert INT at MDI cycle completion
    230 
    231 #define BIT_0_2     0x0007
    232 #define BIT_0_3     0x000F
    233 #define BIT_0_4     0x001F
    234 #define BIT_0_5     0x003F
    235 #define BIT_0_6     0x007F
    236 #define BIT_0_7     0x00FF
    237 #define BIT_0_8     0x01FF
    238 #define BIT_0_13    0x3FFF
    239 #define BIT_0_15    0xFFFF
    240 #define BIT_1_2     0x0006
    241 #define BIT_1_3     0x000E
    242 #define BIT_2_5     0x003C
    243 #define BIT_3_4     0x0018
    244 #define BIT_4_5     0x0030
    245 #define BIT_4_6     0x0070
    246 #define BIT_4_7     0x00F0
    247 #define BIT_5_7     0x00E0
    248 #define BIT_5_9     0x03E0
    249 #define BIT_5_12    0x1FE0
    250 #define BIT_5_15    0xFFE0
    251 #define BIT_6_7     0x00c0
    252 #define BIT_7_11    0x0F80
    253 #define BIT_8_10    0x0700
    254 #define BIT_9_13    0x3E00
    255 #define BIT_12_15   0xF000
    256 
    257 #define BIT_16_20   0x001F0000
    258 #define BIT_21_25   0x03E00000
    259 #define BIT_26_27   0x0C000000
    260 
    261 //-------------------------------------------------------------------------
    262 // MDI Control register opcode definitions
    263 //-------------------------------------------------------------------------
    264 #define MDI_WRITE               1               // Phy Write
    265 #define MDI_READ                2               // Phy read
    266 
    267 //-------------------------------------------------------------------------
    268 // PHY 100 MDI Register/Bit Definitions
    269 //-------------------------------------------------------------------------
    270 // MDI register set
    271 #define MDI_CONTROL_REG             0x00        // MDI control register
    272 #define MDI_STATUS_REG              0x01        // MDI Status regiser
    273 #define PHY_ID_REG_1                0x02        // Phy indentification reg (word 1)
    274 #define PHY_ID_REG_2                0x03        // Phy indentification reg (word 2)
    275 #define AUTO_NEG_ADVERTISE_REG      0x04        // Auto-negotiation advertisement
    276 #define AUTO_NEG_LINK_PARTNER_REG   0x05        // Auto-negotiation link partner ability
    277 #define AUTO_NEG_EXPANSION_REG      0x06        // Auto-negotiation expansion
    278 #define AUTO_NEG_NEXT_PAGE_REG      0x07        // Auto-negotiation next page transmit
    279 #define EXTENDED_REG_0              0x10        // Extended reg 0 (Phy 100 modes)
    280 #define EXTENDED_REG_1              0x14        // Extended reg 1 (Phy 100 error indications)
    281 #define NSC_CONG_CONTROL_REG        0x17        // National (TX) congestion control
    282 #define NSC_SPEED_IND_REG           0x19        // National (TX) speed indication
    283 
    284 // MDI Control register bit definitions
    285 #define MDI_CR_COLL_TEST_ENABLE     BIT_7       // Collision test enable
    286 #define MDI_CR_FULL_HALF            BIT_8       // FDX =1, half duplex =0
    287 #define MDI_CR_RESTART_AUTO_NEG     BIT_9       // Restart auto negotiation
    288 #define MDI_CR_ISOLATE              BIT_10      // Isolate PHY from MII
    289 #define MDI_CR_POWER_DOWN           BIT_11      // Power down
    290 #define MDI_CR_AUTO_SELECT          BIT_12      // Auto speed select enable
    291 #define MDI_CR_10_100               BIT_13      // 0 = 10Mbs, 1 = 100Mbs
    292 #define MDI_CR_LOOPBACK             BIT_14      // 0 = normal, 1 = loopback
    293 #define MDI_CR_RESET                BIT_15      // 0 = normal, 1 = PHY reset
    294 
    295 // MDI Status register bit definitions
    296 #define MDI_SR_EXT_REG_CAPABLE      BIT_0       // Extended register capabilities
    297 #define MDI_SR_JABBER_DETECT        BIT_1       // Jabber detected
    298 #define MDI_SR_LINK_STATUS          BIT_2       // Link Status -- 1 = link
    299 #define MDI_SR_AUTO_SELECT_CAPABLE  BIT_3       // Auto speed select capable
    300 #define MDI_SR_REMOTE_FAULT_DETECT  BIT_4       // Remote fault detect
    301 #define MDI_SR_AUTO_NEG_COMPLETE    BIT_5       // Auto negotiation complete
    302 #define MDI_SR_10T_HALF_DPX         BIT_11      // 10BaseT Half Duplex capable
    303 #define MDI_SR_10T_FULL_DPX         BIT_12      // 10BaseT full duplex capable
    304 #define MDI_SR_TX_HALF_DPX          BIT_13      // TX Half Duplex capable
    305 #define MDI_SR_TX_FULL_DPX          BIT_14      // TX full duplex capable
    306 #define MDI_SR_T4_CAPABLE           BIT_15      // T4 capable
    307 
    308 // Auto-Negotiation advertisement register bit definitions
    309 #define NWAY_AD_SELCTOR_FIELD       BIT_0_4     // identifies supported protocol
    310 #define NWAY_AD_ABILITY             BIT_5_12    // technologies that are supported
    311 #define NWAY_AD_10T_HALF_DPX        BIT_5       // 10BaseT Half Duplex capable
    312 #define NWAY_AD_10T_FULL_DPX        BIT_6       // 10BaseT full duplex capable
    313 #define NWAY_AD_TX_HALF_DPX         BIT_7       // TX Half Duplex capable
    314 #define NWAY_AD_TX_FULL_DPX         BIT_8       // TX full duplex capable
    315 #define NWAY_AD_T4_CAPABLE          BIT_9       // T4 capable
    316 #define NWAY_AD_REMOTE_FAULT        BIT_13      // indicates local remote fault
    317 #define NWAY_AD_RESERVED            BIT_14      // reserved
    318 #define NWAY_AD_NEXT_PAGE           BIT_15      // Next page (not supported)
    319 
    320 // Auto-Negotiation link partner ability register bit definitions
    321 #define NWAY_LP_SELCTOR_FIELD       BIT_0_4     // identifies supported protocol
    322 #define NWAY_LP_ABILITY             BIT_5_9     // technologies that are supported
    323 #define NWAY_LP_REMOTE_FAULT        BIT_13      // indicates partner remote fault
    324 #define NWAY_LP_ACKNOWLEDGE         BIT_14      // acknowledge
    325 #define NWAY_LP_NEXT_PAGE           BIT_15      // Next page (not supported)
    326 
    327 // Auto-Negotiation expansion register bit definitions
    328 #define NWAY_EX_LP_NWAY             BIT_0       // link partner is NWAY
    329 #define NWAY_EX_PAGE_RECEIVED       BIT_1       // link code word received
    330 #define NWAY_EX_NEXT_PAGE_ABLE      BIT_2       // local is next page able
    331 #define NWAY_EX_LP_NEXT_PAGE_ABLE   BIT_3       // partner is next page able
    332 #define NWAY_EX_PARALLEL_DET_FLT    BIT_4       // parallel detection fault
    333 #define NWAY_EX_RESERVED            BIT_5_15    // reserved
    334 
    335 
    336 // PHY 100 Extended Register 0 bit definitions
    337 #define PHY_100_ER0_FDX_INDIC       BIT_0       // 1 = FDX, 0 = half duplex
    338 #define PHY_100_ER0_SPEED_INDIC     BIT_1       // 1 = 100mbs, 0= 10mbs
    339 #define PHY_100_ER0_WAKE_UP         BIT_2       // Wake up DAC
    340 #define PHY_100_ER0_RESERVED        BIT_3_4     // Reserved
    341 #define PHY_100_ER0_REV_CNTRL       BIT_5_7     // Revsion control (A step = 000)
    342 #define PHY_100_ER0_FORCE_FAIL      BIT_8       // Force Fail is enabled
    343 #define PHY_100_ER0_TEST            BIT_9_13    // Revsion control (A step = 000)
    344 #define PHY_100_ER0_LINKDIS         BIT_14      // Link integrity test is disabled
    345 #define PHY_100_ER0_JABDIS          BIT_15      // Jabber function is disabled
    346 
    347 
    348 // PHY 100 Extended Register 1 bit definitions
    349 #define PHY_100_ER1_RESERVED        BIT_0_8     // Reserved
    350 #define PHY_100_ER1_CH2_DET_ERR     BIT_9       // Channel 2 EOF detection error
    351 #define PHY_100_ER1_MANCH_CODE_ERR  BIT_10      // Manchester code error
    352 #define PHY_100_ER1_EOP_ERR         BIT_11      // EOP error
    353 #define PHY_100_ER1_BAD_CODE_ERR    BIT_12      // bad code error
    354 #define PHY_100_ER1_INV_CODE_ERR    BIT_13      // invalid code error
    355 #define PHY_100_ER1_DC_BAL_ERR      BIT_14      // DC balance error
    356 #define PHY_100_ER1_PAIR_SKEW_ERR   BIT_15      // Pair skew error
    357 
    358 // National Semiconductor TX phy congestion control register bit definitions
    359 #define NSC_TX_CONG_TXREADY         BIT_10      // Makes TxReady an input
    360 #define NSC_TX_CONG_ENABLE          BIT_8       // Enables congestion control
    361 #define NSC_TX_CONG_F_CONNECT       BIT_5       // Enables congestion control
    362 
    363 // National Semiconductor TX phy speed indication register bit definitions
    364 #define NSC_TX_SPD_INDC_SPEED       BIT_6       // 0 = 100mb, 1=10mb
    365 
    366 //-------------------------------------------------------------------------
    367 // Phy related constants
    368 //-------------------------------------------------------------------------
    369 #define PHY_503                 0
    370 #define PHY_100_A               0x000003E0
    371 #define PHY_100_C               0x035002A8
    372 #define PHY_TX_ID               0x015002A8
    373 #define PHY_NSC_TX              0x5c002000
    374 #define PHY_OTHER               0xFFFF
    375 
    376 #define PHY_MODEL_REV_ID_MASK   0xFFF0FFFF
    377 #define PARALLEL_DETECT         0
    378 #define N_WAY                   1
    379 
    380 #define RENEGOTIATE_TIME        35 // (3.5 Seconds)
    381 
    382 #define CONNECTOR_AUTO          0
    383 #define CONNECTOR_TPE           1
    384 #define CONNECTOR_MII           2
    385 
    386 //-------------------------------------------------------------------------
    387 
    388 /* The Speedo3 Rx and Tx frame/buffer descriptors. */
    389 #pragma pack(1)
    390 struct CB_Header {      /* A generic descriptor. */
    391   UINT16 status;    /* Offset 0. */
    392   UINT16 command;    /* Offset 2. */
    393   UINT32 link;          /* struct descriptor *  */
    394 };
    395 
    396 /* transmit command block structure */
    397 #pragma pack(1)
    398 typedef struct s_TxCB {
    399   struct CB_Header cb_header;
    400   UINT32 PhysTBDArrayAddres;  /* address of an array that contains
    401                 physical TBD pointers */
    402   UINT16 ByteCount;  /* immediate data count = 0 always */
    403   UINT8 Threshold;
    404   UINT8 TBDCount;
    405   UINT8 ImmediateData[TX_BUFFER_SIZE];
    406   /* following fields are not seen by the 82557 */
    407   struct TBD {
    408     UINT32 phys_buf_addr;
    409     UINT32 buf_len;
    410     } TBDArray[MAX_XMIT_FRAGMENTS];
    411   UINT32 PhysArrayAddr;  /* in case the one in the header is lost */
    412   UINT32 PhysTCBAddress;    /* for this TCB */
    413   struct s_TxCB *NextTCBVirtualLinkPtr;
    414   struct s_TxCB *PrevTCBVirtualLinkPtr;
    415   UINT64 free_data_ptr;  // to be given to the upper layer when this xmit completes1
    416 }TxCB;
    417 
    418 /* The Speedo3 Rx and Tx buffer descriptors. */
    419 #pragma pack(1)
    420 typedef struct s_RxFD {          /* Receive frame descriptor. */
    421   struct CB_Header cb_header;
    422   UINT32 rx_buf_addr;      /* VOID * */
    423   UINT16 ActualCount;
    424   UINT16 RFDSize;
    425   UINT8 RFDBuffer[RX_BUFFER_SIZE];
    426   UINT8 forwarded;
    427   UINT8 junk[3];
    428 }RxFD;
    429 
    430 /* Elements of the RxFD.status word. */
    431 #define RX_COMPLETE 0x8000
    432 #define RX_FRAME_OK 0x2000
    433 
    434 /* Elements of the dump_statistics block. This block must be lword aligned. */
    435 #pragma pack(1)
    436 struct speedo_stats {
    437   UINT32 tx_good_frames;
    438   UINT32 tx_coll16_errs;
    439   UINT32 tx_late_colls;
    440   UINT32 tx_underruns;
    441   UINT32 tx_lost_carrier;
    442   UINT32 tx_deferred;
    443   UINT32 tx_one_colls;
    444   UINT32 tx_multi_colls;
    445   UINT32 tx_total_colls;
    446   UINT32 rx_good_frames;
    447   UINT32 rx_crc_errs;
    448   UINT32 rx_align_errs;
    449   UINT32 rx_resource_errs;
    450   UINT32 rx_overrun_errs;
    451   UINT32 rx_colls_errs;
    452   UINT32 rx_runt_errs;
    453   UINT32 done_marker;
    454 };
    455 #pragma pack()
    456 
    457 
    458 struct Krn_Mem{
    459   RxFD rx_ring[RX_BUFFER_COUNT];
    460   TxCB tx_ring[TX_BUFFER_COUNT];
    461   struct speedo_stats statistics;
    462 };
    463 #define MEMORY_NEEDED  sizeof(struct Krn_Mem)
    464 
    465 /* The parameters for a CmdConfigure operation.
    466    There are so many options that it would be difficult to document each bit.
    467    We mostly use the default or recommended settings.
    468 */
    469 
    470 /*
    471  *--------------------------------------------------------------------------
    472  * Configuration CB Parameter Bit Definitions
    473  *--------------------------------------------------------------------------
    474  */
    475 // - Byte 0  (Default Value = 16h)
    476 #define CFIG_BYTE_COUNT    0x16       // 22 Configuration Bytes
    477 
    478 //- Byte 1  (Default Value = 88h)
    479 #define CFIG_TXRX_FIFO_LIMIT  0x88
    480 
    481 //- Byte 2  (Default Value = 0)
    482 #define CFIG_ADAPTIVE_IFS    0
    483 
    484 //- Byte 3  (Default Value = 0, ALWAYS. This byte is RESERVED)
    485 #define CFIG_RESERVED        0
    486 
    487 //- Byte 4  (Default Value = 0. Default implies that Rx DMA cannot be
    488 //-          preempted).
    489 #define CFIG_RXDMA_BYTE_COUNT      0
    490 
    491 //- Byte 5  (Default Value = 80h. Default implies that Tx DMA cannot be
    492 //-          preempted. However, setting these counters is enabled.)
    493 #define CFIG_DMBC_ENABLE            0x80
    494 
    495 //- Byte 6  (Default Value = 33h. Late SCB enabled, No TNO interrupts,
    496 //-          CNA interrupts and do not save bad frames.)
    497 #define CFIG_LATE_SCB               1  // BIT 0
    498 #define CFIG_TNO_INTERRUPT          0x4  // BIT 2
    499 #define CFIG_CI_INTERRUPT           0x8  // BIT 3
    500 #define CFIG_SAVE_BAD_FRAMES        0x80  // BIT_7
    501 
    502 //- Byte 7  (Default Value = 7h. Discard short frames automatically and
    503 //-          attempt upto 3 retries on transmit.)
    504 #define CFIG_DISCARD_SHORTRX         0x00001
    505 #define CFIG_URUN_RETRY              BIT_1 OR BIT_2
    506 
    507 //- Byte 8  (Default Value = 1. Enable MII mode.)
    508 #define CFIG_503_MII              BIT_0
    509 
    510 //- Byte 9  (Default Value = 0, ALWAYS)
    511 
    512 //- Byte 10 (Default Value = 2Eh)
    513 #define CFIG_NSAI                   BIT_3
    514 #define CFIG_PREAMBLE_LENGTH         BIT_5      ;- Bit 5-4  = 1-0
    515 #define CFIG_NO_LOOPBACK             0
    516 #define CFIG_INTERNAL_LOOPBACK       BIT_6
    517 #define CFIG_EXT_LOOPBACK            BIT_7
    518 #define CFIG_EXT_PIN_LOOPBACK        BIT_6 OR BIT_7
    519 
    520 //- Byte 11 (Default Value = 0)
    521 #define CFIG_LINEAR_PRIORITY         0
    522 
    523 //- Byte 12 (Default Value = 60h)
    524 #define CFIG_LPRIORITY_MODE          0
    525 #define CFIG_IFS                     6          ;- 6 * 16 = 96
    526 
    527 //- Byte 13 (Default Value = 0, ALWAYS)
    528 
    529 //- Byte 14 (Default Value = 0F2h, ALWAYS)
    530 
    531 //- Byte 15 (Default Value = E8h)
    532 #define CFIG_PROMISCUOUS_MODE        BIT_0
    533 #define CFIG_BROADCAST_DISABLE       BIT_1
    534 #define CFIG_CRS_CDT                 BIT_7
    535 
    536 //- Byte 16 (Default Value = 0, ALWAYS)
    537 
    538 //- Byte 17 (Default Value = 40h, ALWAYS)
    539 
    540 //- Byte 18 (Default Value = F2h)
    541 #define CFIG_STRIPPING               BIT_0
    542 #define CFIG_PADDING                 BIT_1
    543 #define CFIG_RX_CRC_TRANSFER         BIT_2
    544 
    545 //- Byte 19 (Default Value = 80h)
    546 #define CFIG_FORCE_FDX               BIT_6
    547 #define CFIG_FDX_PIN_ENABLE          BIT_7
    548 
    549 //- Byte 20 (Default Value = 3Fh)
    550 #define CFIG_MULTI_IA                BIT_6
    551 
    552 //- Byte 21 (Default Value = 05)
    553 #define CFIG_MC_ALL                  BIT_3
    554 
    555 /*-----------------------------------------------------------------------*/
    556 #define D102_REVID 0x0b
    557 
    558 #define HALF_DUPLEX 1
    559 #define FULL_DUPLEX 2
    560 
    561 typedef struct s_data_instance {
    562 
    563   UINT16 State;  // stopped, started or initialized
    564   UINT16 Bus;
    565   UINT8 Device;
    566   UINT8 Function;
    567   UINT16 VendorID;
    568   UINT16 DeviceID;
    569   UINT16 RevID;
    570   UINT16 SubVendorID;
    571   UINT16 SubSystemID;
    572 
    573   UINT8 PermNodeAddress[PXE_MAC_LENGTH];
    574   UINT8 CurrentNodeAddress[PXE_MAC_LENGTH];
    575   UINT8 BroadcastNodeAddress[PXE_MAC_LENGTH];
    576   UINT32 Config[MAX_PCI_CONFIG_LEN];
    577   UINT32 NVData[MAX_EEPROM_LEN];
    578 
    579   UINT32 ioaddr;
    580   UINT32 flash_addr;
    581 
    582   UINT16 LinkSpeed;     // actual link speed setting
    583   UINT16 LinkSpeedReq;  // requested (forced) link speed
    584   UINT8  DuplexReq;     // requested duplex
    585   UINT8  Duplex;        // Duplex set
    586   UINT8  CableDetect;   // 1 to detect and 0 not to detect the cable
    587   UINT8  LoopBack;
    588 
    589   UINT16 TxBufCnt;
    590   UINT16 TxBufSize;
    591   UINT16 RxBufCnt;
    592   UINT16 RxBufSize;
    593   UINT32 RxTotals;
    594   UINT32 TxTotals;
    595 
    596   UINT16 int_mask;
    597   UINT16 Int_Status;
    598   UINT16 PhyRecord[2];  // primary and secondary PHY record registers from eeprom
    599   UINT8  PhyAddress;
    600   UINT8  int_num;
    601   UINT16 NVData_Len;
    602   UINT32 MemoryLength;
    603 
    604   RxFD *rx_ring;  // array of rx buffers
    605   TxCB *tx_ring;  // array of tx buffers
    606   struct speedo_stats *statistics;
    607   TxCB *FreeTxHeadPtr;
    608   TxCB *FreeTxTailPtr;
    609   RxFD *RFDTailPtr;
    610 
    611   UINT64 rx_phy_addr;  // physical addresses
    612   UINT64 tx_phy_addr;
    613   UINT64 stat_phy_addr;
    614   UINT64 MemoryPtr;
    615   UINT64 Mapped_MemoryPtr;
    616 
    617   UINT64 xmit_done[TX_BUFFER_COUNT << 1]; // circular buffer
    618   UINT16 xmit_done_head;  // index into the xmit_done array
    619   UINT16 xmit_done_tail;  // where are we filling now (index into xmit_done)
    620   UINT16 cur_rx_ind;  // current RX Q head index
    621   UINT16 FreeCBCount;
    622 
    623   BOOLEAN in_interrupt;
    624   BOOLEAN in_transmit;
    625   BOOLEAN Receive_Started;
    626   UINT8 Rx_Filter;
    627   UINT8 VersionFlag;  // UNDI30 or UNDI31??
    628   UINT8 rsvd[3];
    629 
    630   struct mc{
    631     UINT16 reserved [3]; // padding for this structure to make it 8 byte aligned
    632     UINT16 list_len;
    633     UINT8 mc_list[MAX_MCAST_ADDRESS_CNT][PXE_MAC_LENGTH]; // 8*32 is the size
    634   } mcast_list;
    635 
    636   UINT64 Unique_ID;
    637 
    638   EFI_PCI_IO_PROTOCOL   *Io_Function;
    639   //
    640   // Original PCI attributes
    641   //
    642   UINT64                OriginalPciAttributes;
    643 
    644   VOID (*Delay_30)(UINTN);  // call back routine
    645   VOID (*Virt2Phys_30)(UINT64 virtual_addr, UINT64 physical_ptr);  // call back routine
    646   VOID (*Block_30)(UINT32 enable);  // call back routine
    647   VOID (*Mem_Io_30)(UINT8 read_write, UINT8 len, UINT64 port, UINT64 buf_addr);
    648   VOID (*Delay)(UINT64, UINTN);  // call back routine
    649   VOID (*Virt2Phys)(UINT64 unq_id, UINT64 virtual_addr, UINT64 physical_ptr);  // call back routine
    650   VOID (*Block)(UINT64 unq_id, UINT32 enable);  // call back routine
    651   VOID (*Mem_Io)(UINT64 unq_id, UINT8 read_write, UINT8 len, UINT64 port,
    652           UINT64 buf_addr);
    653   VOID (*Map_Mem)(UINT64 unq_id, UINT64 virtual_addr, UINT32 size,
    654                    UINT32 Direction, UINT64 mapped_addr);
    655   VOID (*UnMap_Mem)(UINT64 unq_id, UINT64 virtual_addr, UINT32 size,
    656             UINT32 Direction, UINT64 mapped_addr);
    657   VOID (*Sync_Mem)(UINT64 unq_id, UINT64 virtual_addr,
    658             UINT32 size, UINT32 Direction, UINT64 mapped_addr);
    659 } NIC_DATA_INSTANCE;
    660 
    661 #pragma pack(1)
    662 struct MC_CB_STRUCT{
    663   UINT16 count;
    664   UINT8 m_list[MAX_MCAST_ADDRESS_CNT][ETHER_MAC_ADDR_LEN];
    665 };
    666 #pragma pack()
    667 
    668 #define FOUR_GIGABYTE (UINT64)0x100000000ULL
    669 
    670 #endif
    671 
    672