1*8044SWilliam.Kucharski@Sun.COM /* 2*8044SWilliam.Kucharski@Sun.COM * Copyright (c) 2000 Alfred Perlstein <alfred@freebsd.org> 3*8044SWilliam.Kucharski@Sun.COM * All rights reserved. 4*8044SWilliam.Kucharski@Sun.COM * Copyright (c) 2000 Paul Saab <ps@freebsd.org> 5*8044SWilliam.Kucharski@Sun.COM * All rights reserved. 6*8044SWilliam.Kucharski@Sun.COM * Copyright (c) 2000 John Baldwin <jhb@freebsd.org> 7*8044SWilliam.Kucharski@Sun.COM * All rights reserved. 8*8044SWilliam.Kucharski@Sun.COM * 9*8044SWilliam.Kucharski@Sun.COM * Redistribution and use in source and binary forms, with or without 10*8044SWilliam.Kucharski@Sun.COM * modification, are permitted provided that the following conditions 11*8044SWilliam.Kucharski@Sun.COM * are met: 12*8044SWilliam.Kucharski@Sun.COM * 1. Redistributions of source code must retain the above copyright 13*8044SWilliam.Kucharski@Sun.COM * notice, this list of conditions and the following disclaimer. 14*8044SWilliam.Kucharski@Sun.COM * 2. Redistributions in binary form must reproduce the above copyright 15*8044SWilliam.Kucharski@Sun.COM * notice, this list of conditions and the following disclaimer in the 16*8044SWilliam.Kucharski@Sun.COM * documentation and/or other materials provided with the distribution. 17*8044SWilliam.Kucharski@Sun.COM * 18*8044SWilliam.Kucharski@Sun.COM * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19*8044SWilliam.Kucharski@Sun.COM * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*8044SWilliam.Kucharski@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*8044SWilliam.Kucharski@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22*8044SWilliam.Kucharski@Sun.COM * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23*8044SWilliam.Kucharski@Sun.COM * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24*8044SWilliam.Kucharski@Sun.COM * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25*8044SWilliam.Kucharski@Sun.COM * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26*8044SWilliam.Kucharski@Sun.COM * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27*8044SWilliam.Kucharski@Sun.COM * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28*8044SWilliam.Kucharski@Sun.COM * SUCH DAMAGE. 29*8044SWilliam.Kucharski@Sun.COM * 30*8044SWilliam.Kucharski@Sun.COM * $FreeBSD: src/sys/boot/i386/libi386/pxe.h,v 1.4.2.2 2000/09/10 02:52:18 ps Exp $ 31*8044SWilliam.Kucharski@Sun.COM */ 32*8044SWilliam.Kucharski@Sun.COM 33*8044SWilliam.Kucharski@Sun.COM /* 34*8044SWilliam.Kucharski@Sun.COM * The typedefs and structures declared in this file 35*8044SWilliam.Kucharski@Sun.COM * clearly violate style(9), the reason for this is to conform to the 36*8044SWilliam.Kucharski@Sun.COM * typedefs/structure-names used in the Intel literature to avoid confusion. 37*8044SWilliam.Kucharski@Sun.COM * 38*8044SWilliam.Kucharski@Sun.COM * It's for your own good. :) 39*8044SWilliam.Kucharski@Sun.COM */ 40*8044SWilliam.Kucharski@Sun.COM 41*8044SWilliam.Kucharski@Sun.COM /* SEGOFF16_t defined in separate header for Etherboot 42*8044SWilliam.Kucharski@Sun.COM */ 43*8044SWilliam.Kucharski@Sun.COM #include <segoff.h> 44*8044SWilliam.Kucharski@Sun.COM 45*8044SWilliam.Kucharski@Sun.COM /* It seems that intel didn't think about ABI, 46*8044SWilliam.Kucharski@Sun.COM * either that or 16bit ABI != 32bit ABI (which seems reasonable) 47*8044SWilliam.Kucharski@Sun.COM * I have to thank Intel for the hair loss I incurred trying to figure 48*8044SWilliam.Kucharski@Sun.COM * out why PXE was mis-reading structures I was passing it (at least 49*8044SWilliam.Kucharski@Sun.COM * from my point of view) 50*8044SWilliam.Kucharski@Sun.COM * 51*8044SWilliam.Kucharski@Sun.COM * Solution: use gcc's '__attribute__ ((packed))' to correctly align 52*8044SWilliam.Kucharski@Sun.COM * structures passed into PXE 53*8044SWilliam.Kucharski@Sun.COM * Question: does this really work for PXE's expected ABI? 54*8044SWilliam.Kucharski@Sun.COM */ 55*8044SWilliam.Kucharski@Sun.COM #define PACKED __attribute__ ((packed)) 56*8044SWilliam.Kucharski@Sun.COM 57*8044SWilliam.Kucharski@Sun.COM #define S_SIZE(s) s, sizeof(s) - 1 58*8044SWilliam.Kucharski@Sun.COM 59*8044SWilliam.Kucharski@Sun.COM #define IP_STR "%d.%d.%d.%d" 60*8044SWilliam.Kucharski@Sun.COM #define IP_ARGS(ip) \ 61*8044SWilliam.Kucharski@Sun.COM (int)(ip >> 24) & 0xff, (int)(ip >> 16) & 0xff, \ 62*8044SWilliam.Kucharski@Sun.COM (int)(ip >> 8) & 0xff, (int)ip & 0xff 63*8044SWilliam.Kucharski@Sun.COM 64*8044SWilliam.Kucharski@Sun.COM #define MAC_STR "%02x:%02x:%02x:%02x:%02x:%02x" 65*8044SWilliam.Kucharski@Sun.COM #define MAC_ARGS(mac) \ 66*8044SWilliam.Kucharski@Sun.COM mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] 67*8044SWilliam.Kucharski@Sun.COM 68*8044SWilliam.Kucharski@Sun.COM #define PXENFSROOTPATH "/pxeroot" 69*8044SWilliam.Kucharski@Sun.COM 70*8044SWilliam.Kucharski@Sun.COM typedef struct { 71*8044SWilliam.Kucharski@Sun.COM uint16_t Seg_Addr; 72*8044SWilliam.Kucharski@Sun.COM uint32_t Phy_Addr; 73*8044SWilliam.Kucharski@Sun.COM uint16_t Seg_Size; 74*8044SWilliam.Kucharski@Sun.COM } PACKED SEGDESC_t; /* PACKED is required, otherwise gcc pads this out to 12 75*8044SWilliam.Kucharski@Sun.COM bytes - mbrown@fensystems.co.uk (mcb30) 17/5/03 */ 76*8044SWilliam.Kucharski@Sun.COM 77*8044SWilliam.Kucharski@Sun.COM typedef uint16_t SEGSEL_t; 78*8044SWilliam.Kucharski@Sun.COM typedef uint16_t PXENV_STATUS_t; 79*8044SWilliam.Kucharski@Sun.COM typedef uint32_t IP4_t; 80*8044SWilliam.Kucharski@Sun.COM typedef uint32_t ADDR32_t; 81*8044SWilliam.Kucharski@Sun.COM typedef uint16_t UDP_PORT_t; 82*8044SWilliam.Kucharski@Sun.COM 83*8044SWilliam.Kucharski@Sun.COM #define MAC_ADDR_LEN 16 84*8044SWilliam.Kucharski@Sun.COM typedef uint8_t MAC_ADDR[MAC_ADDR_LEN]; 85*8044SWilliam.Kucharski@Sun.COM 86*8044SWilliam.Kucharski@Sun.COM /* PXENV+ */ 87*8044SWilliam.Kucharski@Sun.COM typedef struct { 88*8044SWilliam.Kucharski@Sun.COM uint8_t Signature[6]; /* 'PXENV+' */ 89*8044SWilliam.Kucharski@Sun.COM uint16_t Version; /* MSB = major, LSB = minor */ 90*8044SWilliam.Kucharski@Sun.COM uint8_t Length; /* structure length */ 91*8044SWilliam.Kucharski@Sun.COM uint8_t Checksum; /* checksum pad */ 92*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t RMEntry; /* SEG:OFF to PXE entry point */ 93*8044SWilliam.Kucharski@Sun.COM /* don't use PMOffset and PMSelector (from the 2.1 PXE manual) */ 94*8044SWilliam.Kucharski@Sun.COM uint32_t PMOffset; /* Protected mode entry */ 95*8044SWilliam.Kucharski@Sun.COM SEGSEL_t PMSelector; /* Protected mode selector */ 96*8044SWilliam.Kucharski@Sun.COM SEGSEL_t StackSeg; /* Stack segment address */ 97*8044SWilliam.Kucharski@Sun.COM uint16_t StackSize; /* Stack segment size (bytes) */ 98*8044SWilliam.Kucharski@Sun.COM SEGSEL_t BC_CodeSeg; /* BC Code segment address */ 99*8044SWilliam.Kucharski@Sun.COM uint16_t BC_CodeSize; /* BC Code segment size (bytes) */ 100*8044SWilliam.Kucharski@Sun.COM SEGSEL_t BC_DataSeg; /* BC Data segment address */ 101*8044SWilliam.Kucharski@Sun.COM uint16_t BC_DataSize; /* BC Data segment size (bytes) */ 102*8044SWilliam.Kucharski@Sun.COM SEGSEL_t UNDIDataSeg; /* UNDI Data segment address */ 103*8044SWilliam.Kucharski@Sun.COM uint16_t UNDIDataSize; /* UNDI Data segment size (bytes) */ 104*8044SWilliam.Kucharski@Sun.COM SEGSEL_t UNDICodeSeg; /* UNDI Code segment address */ 105*8044SWilliam.Kucharski@Sun.COM uint16_t UNDICodeSize; /* UNDI Code segment size (bytes) */ 106*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t PXEPtr; /* SEG:OFF to !PXE struct, 107*8044SWilliam.Kucharski@Sun.COM only present when Version > 2.1 */ 108*8044SWilliam.Kucharski@Sun.COM } PACKED pxenv_t; 109*8044SWilliam.Kucharski@Sun.COM 110*8044SWilliam.Kucharski@Sun.COM /* !PXE */ 111*8044SWilliam.Kucharski@Sun.COM typedef struct { 112*8044SWilliam.Kucharski@Sun.COM uint8_t Signature[4]; 113*8044SWilliam.Kucharski@Sun.COM uint8_t StructLength; 114*8044SWilliam.Kucharski@Sun.COM uint8_t StructCksum; 115*8044SWilliam.Kucharski@Sun.COM uint8_t StructRev; 116*8044SWilliam.Kucharski@Sun.COM uint8_t reserved_1; 117*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t UNDIROMID; 118*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t BaseROMID; 119*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t EntryPointSP; 120*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t EntryPointESP; 121*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t StatusCallout; 122*8044SWilliam.Kucharski@Sun.COM uint8_t reserved_2; 123*8044SWilliam.Kucharski@Sun.COM uint8_t SegDescCn; 124*8044SWilliam.Kucharski@Sun.COM SEGSEL_t FirstSelector; 125*8044SWilliam.Kucharski@Sun.COM SEGDESC_t Stack; 126*8044SWilliam.Kucharski@Sun.COM SEGDESC_t UNDIData; 127*8044SWilliam.Kucharski@Sun.COM SEGDESC_t UNDICode; 128*8044SWilliam.Kucharski@Sun.COM SEGDESC_t UNDICodeWrite; 129*8044SWilliam.Kucharski@Sun.COM SEGDESC_t BC_Data; 130*8044SWilliam.Kucharski@Sun.COM SEGDESC_t BC_Code; 131*8044SWilliam.Kucharski@Sun.COM SEGDESC_t BC_CodeWrite; 132*8044SWilliam.Kucharski@Sun.COM } PACKED pxe_t; 133*8044SWilliam.Kucharski@Sun.COM 134*8044SWilliam.Kucharski@Sun.COM #define PXENV_START_UNDI 0x0000 135*8044SWilliam.Kucharski@Sun.COM typedef struct { 136*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 137*8044SWilliam.Kucharski@Sun.COM uint16_t ax; 138*8044SWilliam.Kucharski@Sun.COM uint16_t bx; 139*8044SWilliam.Kucharski@Sun.COM uint16_t dx; 140*8044SWilliam.Kucharski@Sun.COM uint16_t di; 141*8044SWilliam.Kucharski@Sun.COM uint16_t es; 142*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_START_UNDI; 143*8044SWilliam.Kucharski@Sun.COM 144*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_STARTUP 0x0001 145*8044SWilliam.Kucharski@Sun.COM typedef struct { 146*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 147*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_STARTUP; 148*8044SWilliam.Kucharski@Sun.COM 149*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_CLEANUP 0x0002 150*8044SWilliam.Kucharski@Sun.COM typedef struct { 151*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 152*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_CLEANUP; 153*8044SWilliam.Kucharski@Sun.COM 154*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_INITIALIZE 0x0003 155*8044SWilliam.Kucharski@Sun.COM typedef struct { 156*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 157*8044SWilliam.Kucharski@Sun.COM ADDR32_t ProtocolIni; /* Phys addr of a copy of the driver module */ 158*8044SWilliam.Kucharski@Sun.COM uint8_t reserved[8]; 159*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_INITIALIZE; 160*8044SWilliam.Kucharski@Sun.COM 161*8044SWilliam.Kucharski@Sun.COM 162*8044SWilliam.Kucharski@Sun.COM #define MAXNUM_MCADDR 8 163*8044SWilliam.Kucharski@Sun.COM typedef struct { 164*8044SWilliam.Kucharski@Sun.COM uint16_t MCastAddrCount; 165*8044SWilliam.Kucharski@Sun.COM MAC_ADDR McastAddr[MAXNUM_MCADDR]; 166*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_MCAST_ADDRESS; 167*8044SWilliam.Kucharski@Sun.COM 168*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_RESET_ADAPTER 0x0004 169*8044SWilliam.Kucharski@Sun.COM typedef struct { 170*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 171*8044SWilliam.Kucharski@Sun.COM t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; 172*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_RESET; 173*8044SWilliam.Kucharski@Sun.COM 174*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_SHUTDOWN 0x0005 175*8044SWilliam.Kucharski@Sun.COM typedef struct { 176*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 177*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_SHUTDOWN; 178*8044SWilliam.Kucharski@Sun.COM 179*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_OPEN 0x0006 180*8044SWilliam.Kucharski@Sun.COM typedef struct { 181*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 182*8044SWilliam.Kucharski@Sun.COM uint16_t OpenFlag; 183*8044SWilliam.Kucharski@Sun.COM uint16_t PktFilter; 184*8044SWilliam.Kucharski@Sun.COM # define FLTR_DIRECTED 0x0001 185*8044SWilliam.Kucharski@Sun.COM # define FLTR_BRDCST 0x0002 186*8044SWilliam.Kucharski@Sun.COM # define FLTR_PRMSCS 0x0003 187*8044SWilliam.Kucharski@Sun.COM # define FLTR_SRC_RTG 0x0004 188*8044SWilliam.Kucharski@Sun.COM 189*8044SWilliam.Kucharski@Sun.COM t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; 190*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_OPEN; 191*8044SWilliam.Kucharski@Sun.COM 192*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_CLOSE 0x0007 193*8044SWilliam.Kucharski@Sun.COM typedef struct { 194*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 195*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_CLOSE; 196*8044SWilliam.Kucharski@Sun.COM 197*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_TRANSMIT 0x0008 198*8044SWilliam.Kucharski@Sun.COM typedef struct { 199*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 200*8044SWilliam.Kucharski@Sun.COM uint8_t Protocol; 201*8044SWilliam.Kucharski@Sun.COM # define P_UNKNOWN 0 202*8044SWilliam.Kucharski@Sun.COM # define P_IP 1 203*8044SWilliam.Kucharski@Sun.COM # define P_ARP 2 204*8044SWilliam.Kucharski@Sun.COM # define P_RARP 3 205*8044SWilliam.Kucharski@Sun.COM 206*8044SWilliam.Kucharski@Sun.COM uint8_t XmitFlag; 207*8044SWilliam.Kucharski@Sun.COM # define XMT_DESTADDR 0x0000 208*8044SWilliam.Kucharski@Sun.COM # define XMT_BROADCAST 0x0001 209*8044SWilliam.Kucharski@Sun.COM 210*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t DestAddr; 211*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t TBD; 212*8044SWilliam.Kucharski@Sun.COM uint32_t Reserved[2]; 213*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_TRANSMIT; 214*8044SWilliam.Kucharski@Sun.COM 215*8044SWilliam.Kucharski@Sun.COM #define MAX_DATA_BLKS 8 216*8044SWilliam.Kucharski@Sun.COM typedef struct { 217*8044SWilliam.Kucharski@Sun.COM uint16_t ImmedLength; 218*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t Xmit; 219*8044SWilliam.Kucharski@Sun.COM uint16_t DataBlkCount; 220*8044SWilliam.Kucharski@Sun.COM struct DataBlk { 221*8044SWilliam.Kucharski@Sun.COM uint8_t TDPtrType; 222*8044SWilliam.Kucharski@Sun.COM uint8_t TDRsvdByte; 223*8044SWilliam.Kucharski@Sun.COM uint16_t TDDataLen; 224*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t TDDataPtr; 225*8044SWilliam.Kucharski@Sun.COM } DataBlock[MAX_DATA_BLKS]; 226*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_TBD; 227*8044SWilliam.Kucharski@Sun.COM 228*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_SET_MCAST_ADDRESS 0x0009 229*8044SWilliam.Kucharski@Sun.COM typedef struct { 230*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 231*8044SWilliam.Kucharski@Sun.COM t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; 232*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_SET_MCAST_ADDR; 233*8044SWilliam.Kucharski@Sun.COM 234*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_SET_STATION_ADDRESS 0x000A 235*8044SWilliam.Kucharski@Sun.COM typedef struct { 236*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 237*8044SWilliam.Kucharski@Sun.COM MAC_ADDR StationAddress; /* Temp MAC addres to use */ 238*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_SET_STATION_ADDRESS; 239*8044SWilliam.Kucharski@Sun.COM 240*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_SET_PACKET_FILTER 0x000B 241*8044SWilliam.Kucharski@Sun.COM typedef struct { 242*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 243*8044SWilliam.Kucharski@Sun.COM uint8_t filter; /* see UNDI_OPEN (0x0006) */ 244*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_SET_PACKET_FILTER; 245*8044SWilliam.Kucharski@Sun.COM 246*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_GET_INFORMATION 0x000C 247*8044SWilliam.Kucharski@Sun.COM typedef struct { 248*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 249*8044SWilliam.Kucharski@Sun.COM uint16_t BaseIo; /* Adapter base I/O address */ 250*8044SWilliam.Kucharski@Sun.COM uint16_t IntNumber; /* Adapter IRQ number */ 251*8044SWilliam.Kucharski@Sun.COM uint16_t MaxTranUnit; /* Adapter maximum transmit unit */ 252*8044SWilliam.Kucharski@Sun.COM uint16_t HwType; /* Type of protocol at the hardware addr */ 253*8044SWilliam.Kucharski@Sun.COM # define ETHER_TYPE 1 254*8044SWilliam.Kucharski@Sun.COM # define EXP_ETHER_TYPE 2 255*8044SWilliam.Kucharski@Sun.COM # define IEEE_TYPE 6 256*8044SWilliam.Kucharski@Sun.COM # define ARCNET_TYPE 7 257*8044SWilliam.Kucharski@Sun.COM 258*8044SWilliam.Kucharski@Sun.COM uint16_t HwAddrLen; /* Length of hardware address */ 259*8044SWilliam.Kucharski@Sun.COM MAC_ADDR CurrentNodeAddress; /* Current hardware address */ 260*8044SWilliam.Kucharski@Sun.COM MAC_ADDR PermNodeAddress; /* Permanent hardware address */ 261*8044SWilliam.Kucharski@Sun.COM SEGSEL_t ROMAddress; /* Real mode ROM segment address */ 262*8044SWilliam.Kucharski@Sun.COM uint16_t RxBufCt; /* Receive queue length */ 263*8044SWilliam.Kucharski@Sun.COM uint16_t TxBufCt; /* Transmit queue length */ 264*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_GET_INFORMATION; 265*8044SWilliam.Kucharski@Sun.COM 266*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_GET_STATISTICS 0x000D 267*8044SWilliam.Kucharski@Sun.COM typedef struct { 268*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 269*8044SWilliam.Kucharski@Sun.COM uint32_t XmitGoodFrames; /* Number of successful transmissions */ 270*8044SWilliam.Kucharski@Sun.COM uint32_t RcvGoodFrames; /* Number of good frames received */ 271*8044SWilliam.Kucharski@Sun.COM uint32_t RcvCRCErrors; /* Number of frames with CRC errors */ 272*8044SWilliam.Kucharski@Sun.COM uint32_t RcvResourceErrors; /* Number of frames dropped */ 273*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_GET_STATISTICS; 274*8044SWilliam.Kucharski@Sun.COM 275*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_CLEAR_STATISTICS 0x000E 276*8044SWilliam.Kucharski@Sun.COM typedef struct { 277*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 278*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_CLEAR_STATISTICS; 279*8044SWilliam.Kucharski@Sun.COM 280*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_INITIATE_DIAGS 0x000F 281*8044SWilliam.Kucharski@Sun.COM typedef struct { 282*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 283*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_INITIATE_DIAGS; 284*8044SWilliam.Kucharski@Sun.COM 285*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_FORCE_INTERRUPT 0x0010 286*8044SWilliam.Kucharski@Sun.COM typedef struct { 287*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 288*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_FORCE_INTERRUPT; 289*8044SWilliam.Kucharski@Sun.COM 290*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_GET_MCAST_ADDRESS 0x0011 291*8044SWilliam.Kucharski@Sun.COM typedef struct { 292*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 293*8044SWilliam.Kucharski@Sun.COM IP4_t InetAddr; /* IP mulicast address */ 294*8044SWilliam.Kucharski@Sun.COM MAC_ADDR MediaAddr; /* MAC multicast address */ 295*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_GET_MCAST_ADDR; 296*8044SWilliam.Kucharski@Sun.COM 297*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_GET_NIC_TYPE 0x0012 298*8044SWilliam.Kucharski@Sun.COM typedef struct { 299*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 300*8044SWilliam.Kucharski@Sun.COM uint8_t NicType; /* Type of NIC */ 301*8044SWilliam.Kucharski@Sun.COM # define PCI_NIC 2 302*8044SWilliam.Kucharski@Sun.COM # define PnP_NIC 3 303*8044SWilliam.Kucharski@Sun.COM # define CardBus_NIC 4 304*8044SWilliam.Kucharski@Sun.COM 305*8044SWilliam.Kucharski@Sun.COM union { 306*8044SWilliam.Kucharski@Sun.COM struct { 307*8044SWilliam.Kucharski@Sun.COM uint16_t Vendor_ID; 308*8044SWilliam.Kucharski@Sun.COM uint16_t Dev_ID; 309*8044SWilliam.Kucharski@Sun.COM uint8_t Base_Class; 310*8044SWilliam.Kucharski@Sun.COM uint8_t Sub_Class; 311*8044SWilliam.Kucharski@Sun.COM uint8_t Prog_Intf; 312*8044SWilliam.Kucharski@Sun.COM uint8_t Rev; 313*8044SWilliam.Kucharski@Sun.COM uint16_t BusDevFunc; 314*8044SWilliam.Kucharski@Sun.COM uint16_t SubVendor_ID; 315*8044SWilliam.Kucharski@Sun.COM uint16_t SubDevice_ID; 316*8044SWilliam.Kucharski@Sun.COM } pci, cardbus; 317*8044SWilliam.Kucharski@Sun.COM struct { 318*8044SWilliam.Kucharski@Sun.COM uint32_t EISA_Dev_ID; 319*8044SWilliam.Kucharski@Sun.COM uint8_t Base_Class; 320*8044SWilliam.Kucharski@Sun.COM uint8_t Sub_Class; 321*8044SWilliam.Kucharski@Sun.COM uint8_t Prog_Intf; 322*8044SWilliam.Kucharski@Sun.COM uint16_t CardSelNum; 323*8044SWilliam.Kucharski@Sun.COM } pnp; 324*8044SWilliam.Kucharski@Sun.COM } info; 325*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_GET_NIC_TYPE; 326*8044SWilliam.Kucharski@Sun.COM 327*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_GET_IFACE_INFO 0x0013 328*8044SWilliam.Kucharski@Sun.COM typedef struct { 329*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 330*8044SWilliam.Kucharski@Sun.COM uint8_t IfaceType[16]; /* Name of MAC type in ASCII. */ 331*8044SWilliam.Kucharski@Sun.COM uint32_t LinkSpeed; /* Defined in NDIS 2.0 spec */ 332*8044SWilliam.Kucharski@Sun.COM uint32_t ServiceFlags; /* Defined in NDIS 2.0 spec */ 333*8044SWilliam.Kucharski@Sun.COM uint32_t Reserved[4]; /* must be 0 */ 334*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_GET_IFACE_INFO; 335*8044SWilliam.Kucharski@Sun.COM 336*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNDI_ISR 0x0014 337*8044SWilliam.Kucharski@Sun.COM typedef struct { 338*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 339*8044SWilliam.Kucharski@Sun.COM uint16_t FuncFlag; /* PXENV_UNDI_ISR_OUT_xxx */ 340*8044SWilliam.Kucharski@Sun.COM uint16_t BufferLength; /* Length of Frame */ 341*8044SWilliam.Kucharski@Sun.COM uint16_t FrameLength; /* Total length of reciever frame */ 342*8044SWilliam.Kucharski@Sun.COM uint16_t FrameHeaderLength; /* Length of the media header in Frame */ 343*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t Frame; /* receive buffer */ 344*8044SWilliam.Kucharski@Sun.COM uint8_t ProtType; /* Protocol type */ 345*8044SWilliam.Kucharski@Sun.COM uint8_t PktType; /* Packet Type */ 346*8044SWilliam.Kucharski@Sun.COM # define PXENV_UNDI_ISR_IN_START 1 347*8044SWilliam.Kucharski@Sun.COM # define PXENV_UNDI_ISR_IN_PROCESS 2 348*8044SWilliam.Kucharski@Sun.COM # define PXENV_UNDI_ISR_IN_GET_NEXT 3 349*8044SWilliam.Kucharski@Sun.COM 350*8044SWilliam.Kucharski@Sun.COM /* one of these will be returned for PXENV_UNDI_ISR_IN_START */ 351*8044SWilliam.Kucharski@Sun.COM # define PXENV_UNDI_ISR_OUT_OURS 0 352*8044SWilliam.Kucharski@Sun.COM # define PXENV_UNDI_ISR_OUT_NOT_OURS 1 353*8044SWilliam.Kucharski@Sun.COM 354*8044SWilliam.Kucharski@Sun.COM /* 355*8044SWilliam.Kucharski@Sun.COM * one of these will bre returnd for PXEND_UNDI_ISR_IN_PROCESS 356*8044SWilliam.Kucharski@Sun.COM * and PXENV_UNDI_ISR_IN_GET_NEXT 357*8044SWilliam.Kucharski@Sun.COM */ 358*8044SWilliam.Kucharski@Sun.COM # define PXENV_UNDI_ISR_OUT_DONE 0 359*8044SWilliam.Kucharski@Sun.COM # define PXENV_UNDI_ISR_OUT_TRANSMIT 2 360*8044SWilliam.Kucharski@Sun.COM # define PXENV_UNDI_ISR_OUT_RECEIVE 3 361*8044SWilliam.Kucharski@Sun.COM # define PXENV_UNDI_ISR_OUT_BUSY 4 362*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNDI_ISR; 363*8044SWilliam.Kucharski@Sun.COM 364*8044SWilliam.Kucharski@Sun.COM #define PXENV_STOP_UNDI 0x0015 365*8044SWilliam.Kucharski@Sun.COM typedef struct { 366*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 367*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_STOP_UNDI; 368*8044SWilliam.Kucharski@Sun.COM 369*8044SWilliam.Kucharski@Sun.COM #define PXENV_TFTP_OPEN 0x0020 370*8044SWilliam.Kucharski@Sun.COM typedef struct { 371*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 372*8044SWilliam.Kucharski@Sun.COM IP4_t ServerIPAddress; 373*8044SWilliam.Kucharski@Sun.COM IP4_t GatewayIPAddress; 374*8044SWilliam.Kucharski@Sun.COM uint8_t FileName[128]; 375*8044SWilliam.Kucharski@Sun.COM UDP_PORT_t TFTPPort; 376*8044SWilliam.Kucharski@Sun.COM uint16_t PacketSize; 377*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_TFTP_OPEN; 378*8044SWilliam.Kucharski@Sun.COM 379*8044SWilliam.Kucharski@Sun.COM #define PXENV_TFTP_CLOSE 0x0021 380*8044SWilliam.Kucharski@Sun.COM typedef struct { 381*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 382*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_TFTP_CLOSE; 383*8044SWilliam.Kucharski@Sun.COM 384*8044SWilliam.Kucharski@Sun.COM #define PXENV_TFTP_READ 0x0022 385*8044SWilliam.Kucharski@Sun.COM typedef struct { 386*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 387*8044SWilliam.Kucharski@Sun.COM uint16_t PacketNumber; 388*8044SWilliam.Kucharski@Sun.COM uint16_t BufferSize; 389*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t Buffer; 390*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_TFTP_READ; 391*8044SWilliam.Kucharski@Sun.COM 392*8044SWilliam.Kucharski@Sun.COM #define PXENV_TFTP_READ_FILE 0x0023 393*8044SWilliam.Kucharski@Sun.COM typedef struct { 394*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 395*8044SWilliam.Kucharski@Sun.COM uint8_t FileName[128]; 396*8044SWilliam.Kucharski@Sun.COM uint32_t BufferSize; 397*8044SWilliam.Kucharski@Sun.COM ADDR32_t Buffer; 398*8044SWilliam.Kucharski@Sun.COM IP4_t ServerIPAddress; 399*8044SWilliam.Kucharski@Sun.COM IP4_t GatewayIPAdress; 400*8044SWilliam.Kucharski@Sun.COM IP4_t McastIPAdress; 401*8044SWilliam.Kucharski@Sun.COM UDP_PORT_t TFTPClntPort; 402*8044SWilliam.Kucharski@Sun.COM UDP_PORT_t TFTPSrvPort; 403*8044SWilliam.Kucharski@Sun.COM uint16_t TFTPOpenTimeOut; 404*8044SWilliam.Kucharski@Sun.COM uint16_t TFTPReopenDelay; 405*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_TFTP_READ_FILE; 406*8044SWilliam.Kucharski@Sun.COM 407*8044SWilliam.Kucharski@Sun.COM #define PXENV_TFTP_GET_FSIZE 0x0025 408*8044SWilliam.Kucharski@Sun.COM typedef struct { 409*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 410*8044SWilliam.Kucharski@Sun.COM IP4_t ServerIPAddress; 411*8044SWilliam.Kucharski@Sun.COM IP4_t GatewayIPAdress; 412*8044SWilliam.Kucharski@Sun.COM uint8_t FileName[128]; 413*8044SWilliam.Kucharski@Sun.COM uint32_t FileSize; 414*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_TFTP_GET_FSIZE; 415*8044SWilliam.Kucharski@Sun.COM 416*8044SWilliam.Kucharski@Sun.COM #define PXENV_UDP_OPEN 0x0030 417*8044SWilliam.Kucharski@Sun.COM typedef struct { 418*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 419*8044SWilliam.Kucharski@Sun.COM IP4_t src_ip; /* IP address of this station */ 420*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UDP_OPEN; 421*8044SWilliam.Kucharski@Sun.COM 422*8044SWilliam.Kucharski@Sun.COM #define PXENV_UDP_CLOSE 0x0031 423*8044SWilliam.Kucharski@Sun.COM typedef struct { 424*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t status; 425*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UDP_CLOSE; 426*8044SWilliam.Kucharski@Sun.COM 427*8044SWilliam.Kucharski@Sun.COM #define PXENV_UDP_READ 0x0032 428*8044SWilliam.Kucharski@Sun.COM typedef struct { 429*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t status; 430*8044SWilliam.Kucharski@Sun.COM IP4_t src_ip; /* IP of sender */ 431*8044SWilliam.Kucharski@Sun.COM IP4_t dest_ip; /* Only accept packets sent to this IP */ 432*8044SWilliam.Kucharski@Sun.COM UDP_PORT_t s_port; /* UDP source port of sender */ 433*8044SWilliam.Kucharski@Sun.COM UDP_PORT_t d_port; /* Only accept packets sent to this port */ 434*8044SWilliam.Kucharski@Sun.COM uint16_t buffer_size; /* Size of the packet buffer */ 435*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t buffer; /* SEG:OFF to the packet buffer */ 436*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UDP_READ; 437*8044SWilliam.Kucharski@Sun.COM 438*8044SWilliam.Kucharski@Sun.COM #define PXENV_UDP_WRITE 0x0033 439*8044SWilliam.Kucharski@Sun.COM typedef struct { 440*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t status; 441*8044SWilliam.Kucharski@Sun.COM IP4_t ip; /* dest ip addr */ 442*8044SWilliam.Kucharski@Sun.COM IP4_t gw; /* ip gateway */ 443*8044SWilliam.Kucharski@Sun.COM UDP_PORT_t src_port; /* source udp port */ 444*8044SWilliam.Kucharski@Sun.COM UDP_PORT_t dst_port; /* destination udp port */ 445*8044SWilliam.Kucharski@Sun.COM uint16_t buffer_size; /* Size of the packet buffer */ 446*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t buffer; /* SEG:OFF to the packet buffer */ 447*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UDP_WRITE; 448*8044SWilliam.Kucharski@Sun.COM 449*8044SWilliam.Kucharski@Sun.COM #define PXENV_UNLOAD_STACK 0x0070 450*8044SWilliam.Kucharski@Sun.COM typedef struct { 451*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 452*8044SWilliam.Kucharski@Sun.COM uint8_t reserved[10]; 453*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_UNLOAD_STACK; 454*8044SWilliam.Kucharski@Sun.COM 455*8044SWilliam.Kucharski@Sun.COM 456*8044SWilliam.Kucharski@Sun.COM #define PXENV_GET_CACHED_INFO 0x0071 457*8044SWilliam.Kucharski@Sun.COM typedef struct { 458*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 459*8044SWilliam.Kucharski@Sun.COM uint16_t PacketType; /* type (defined right here) */ 460*8044SWilliam.Kucharski@Sun.COM # define PXENV_PACKET_TYPE_DHCP_DISCOVER 1 461*8044SWilliam.Kucharski@Sun.COM # define PXENV_PACKET_TYPE_DHCP_ACK 2 462*8044SWilliam.Kucharski@Sun.COM # define PXENV_PACKET_TYPE_BINL_REPLY 3 463*8044SWilliam.Kucharski@Sun.COM uint16_t BufferSize; /* max to copy, leave at 0 for pointer */ 464*8044SWilliam.Kucharski@Sun.COM SEGOFF16_t Buffer; /* copy to, leave at 0 for pointer */ 465*8044SWilliam.Kucharski@Sun.COM uint16_t BufferLimit; /* max size of buffer in BC dataseg ? */ 466*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_GET_CACHED_INFO; 467*8044SWilliam.Kucharski@Sun.COM 468*8044SWilliam.Kucharski@Sun.COM 469*8044SWilliam.Kucharski@Sun.COM /* structure filled in by PXENV_GET_CACHED_INFO 470*8044SWilliam.Kucharski@Sun.COM * (how we determine which IP we downloaded the initial bootstrap from) 471*8044SWilliam.Kucharski@Sun.COM * words can't describe... 472*8044SWilliam.Kucharski@Sun.COM */ 473*8044SWilliam.Kucharski@Sun.COM typedef struct { 474*8044SWilliam.Kucharski@Sun.COM uint8_t opcode; 475*8044SWilliam.Kucharski@Sun.COM # define BOOTP_REQ 1 476*8044SWilliam.Kucharski@Sun.COM # define BOOTP_REP 2 477*8044SWilliam.Kucharski@Sun.COM uint8_t Hardware; /* hardware type */ 478*8044SWilliam.Kucharski@Sun.COM uint8_t Hardlen; /* hardware addr len */ 479*8044SWilliam.Kucharski@Sun.COM uint8_t Gatehops; /* zero it */ 480*8044SWilliam.Kucharski@Sun.COM uint32_t ident; /* random number chosen by client */ 481*8044SWilliam.Kucharski@Sun.COM uint16_t seconds; /* seconds since did initial bootstrap */ 482*8044SWilliam.Kucharski@Sun.COM uint16_t Flags; /* seconds since did initial bootstrap */ 483*8044SWilliam.Kucharski@Sun.COM # define BOOTP_BCAST 0x8000 /* ? */ 484*8044SWilliam.Kucharski@Sun.COM IP4_t cip; /* Client IP */ 485*8044SWilliam.Kucharski@Sun.COM IP4_t yip; /* Your IP */ 486*8044SWilliam.Kucharski@Sun.COM IP4_t sip; /* IP to use for next boot stage */ 487*8044SWilliam.Kucharski@Sun.COM IP4_t gip; /* Relay IP ? */ 488*8044SWilliam.Kucharski@Sun.COM MAC_ADDR CAddr; /* Client hardware address */ 489*8044SWilliam.Kucharski@Sun.COM uint8_t Sname[64]; /* Server's hostname (Optional) */ 490*8044SWilliam.Kucharski@Sun.COM uint8_t bootfile[128]; /* boot filename */ 491*8044SWilliam.Kucharski@Sun.COM union { 492*8044SWilliam.Kucharski@Sun.COM # if 1 493*8044SWilliam.Kucharski@Sun.COM # define BOOTP_DHCPVEND 1024 /* DHCP extended vendor field size */ 494*8044SWilliam.Kucharski@Sun.COM # else 495*8044SWilliam.Kucharski@Sun.COM # define BOOTP_DHCPVEND 312 /* DHCP standard vendor field size */ 496*8044SWilliam.Kucharski@Sun.COM # endif 497*8044SWilliam.Kucharski@Sun.COM uint8_t d[BOOTP_DHCPVEND]; /* raw array of vendor/dhcp options */ 498*8044SWilliam.Kucharski@Sun.COM struct { 499*8044SWilliam.Kucharski@Sun.COM uint8_t magic[4]; /* DHCP magic cookie */ 500*8044SWilliam.Kucharski@Sun.COM # ifndef VM_RFC1048 501*8044SWilliam.Kucharski@Sun.COM # define VM_RFC1048 0x63825363L /* ? */ 502*8044SWilliam.Kucharski@Sun.COM # endif 503*8044SWilliam.Kucharski@Sun.COM uint32_t flags; /* bootp flags/opcodes */ 504*8044SWilliam.Kucharski@Sun.COM uint8_t pad[56]; /* I don't think intel knows what a 505*8044SWilliam.Kucharski@Sun.COM union does... */ 506*8044SWilliam.Kucharski@Sun.COM } v; 507*8044SWilliam.Kucharski@Sun.COM } vendor; 508*8044SWilliam.Kucharski@Sun.COM } PACKED BOOTPLAYER; 509*8044SWilliam.Kucharski@Sun.COM 510*8044SWilliam.Kucharski@Sun.COM #define PXENV_RESTART_TFTP 0x0073 511*8044SWilliam.Kucharski@Sun.COM #define t_PXENV_RESTART_TFTP t_PXENV_TFTP_READ_FILE 512*8044SWilliam.Kucharski@Sun.COM 513*8044SWilliam.Kucharski@Sun.COM #define PXENV_START_BASE 0x0075 514*8044SWilliam.Kucharski@Sun.COM typedef struct { 515*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 516*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_START_BASE; 517*8044SWilliam.Kucharski@Sun.COM 518*8044SWilliam.Kucharski@Sun.COM #define PXENV_STOP_BASE 0x0076 519*8044SWilliam.Kucharski@Sun.COM typedef struct { 520*8044SWilliam.Kucharski@Sun.COM PXENV_STATUS_t Status; 521*8044SWilliam.Kucharski@Sun.COM } PACKED t_PXENV_STOP_BASE; 522