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