7e61c6ac9ce4a7330b85f59589038333d25f1a66
[people/xl0/gpxe.git] / src / include / pxe.h
1 #ifndef PXE_H
2 #define PXE_H
3
4 #include "pxe_types.h"
5 #include "pxe_api.h"
6
7 /* Parameter block for pxenv_unknown() */
8 struct s_PXENV_UNKNOWN {
9         PXENV_STATUS_t Status;                  /**< PXE status code */
10 } PACKED;
11
12 typedef struct s_PXENV_UNKNOWN PXENV_UNKNOWN_t;
13
14 /* Union used for PXE API calls; we don't know the type of the
15  * structure until we interpret the opcode.  Also, Status is available
16  * in the same location for any opcode, and it's convenient to have
17  * non-specific access to it.
18  */
19 union u_PXENV_ANY {
20         /* Make it easy to read status for any operation */
21         PXENV_STATUS_t                          Status;
22         struct s_PXENV_UNKNOWN                  unknown;
23         struct s_PXENV_UNLOAD_STACK             unload_stack;
24         struct s_PXENV_GET_CACHED_INFO          get_cached_info;
25         struct s_PXENV_TFTP_READ_FILE           restart_tftp;
26         struct s_PXENV_START_UNDI               start_undi;
27         struct s_PXENV_STOP_UNDI                stop_undi;
28         struct s_PXENV_START_BASE               start_base;
29         struct s_PXENV_STOP_BASE                stop_base;
30         struct s_PXENV_TFTP_OPEN                tftp_open;
31         struct s_PXENV_TFTP_CLOSE               tftp_close;
32         struct s_PXENV_TFTP_READ                tftp_read;
33         struct s_PXENV_TFTP_READ_FILE           tftp_read_file;
34         struct s_PXENV_TFTP_GET_FSIZE           tftp_get_fsize;
35         struct s_PXENV_UDP_OPEN                 udp_open;
36         struct s_PXENV_UDP_CLOSE                udp_close;
37         struct s_PXENV_UDP_WRITE                udp_write;
38         struct s_PXENV_UDP_READ                 udp_read;
39         struct s_PXENV_UNDI_STARTUP             undi_startup;
40         struct s_PXENV_UNDI_CLEANUP             undi_cleanup;
41         struct s_PXENV_UNDI_INITIALIZE          undi_initialize;
42         struct s_PXENV_UNDI_RESET               undi_reset_adapter;
43         struct s_PXENV_UNDI_SHUTDOWN            undi_shutdown;
44         struct s_PXENV_UNDI_OPEN                undi_open;
45         struct s_PXENV_UNDI_CLOSE               undi_close;
46         struct s_PXENV_UNDI_TRANSMIT            undi_transmit;
47         struct s_PXENV_UNDI_SET_MCAST_ADDRESS   undi_set_mcast_address;
48         struct s_PXENV_UNDI_SET_STATION_ADDRESS undi_set_station_address;
49         struct s_PXENV_UNDI_SET_PACKET_FILTER   undi_set_packet_filter;
50         struct s_PXENV_UNDI_GET_INFORMATION     undi_get_information;
51         struct s_PXENV_UNDI_GET_STATISTICS      undi_get_statistics;
52         struct s_PXENV_UNDI_CLEAR_STATISTICS    undi_clear_statistics;
53         struct s_PXENV_UNDI_INITIATE_DIAGS      undi_initiate_diags;
54         struct s_PXENV_UNDI_FORCE_INTERRUPT     undi_force_interrupt;
55         struct s_PXENV_UNDI_GET_MCAST_ADDRESS   undi_get_mcast_address;
56         struct s_PXENV_UNDI_GET_NIC_TYPE        undi_get_nic_type;
57         struct s_PXENV_UNDI_GET_IFACE_INFO      undi_get_iface_info;
58         struct s_PXENV_UNDI_GET_STATE           undi_get_state;
59         struct s_PXENV_UNDI_ISR                 undi_isr;
60 };
61
62 typedef union u_PXENV_ANY PXENV_ANY_t;
63
64 /* PXE stack status indicator.  See pxe_export.c for further
65  * explanation.
66  */
67 typedef enum {
68         CAN_UNLOAD = 0,
69         MIDWAY,
70         READY
71 } pxe_stack_state_t;
72
73 #define ENSURE_CAN_UNLOAD(structure) if ( ! ensure_pxe_state(CAN_UNLOAD) ) { \
74                         structure->Status = PXENV_STATUS_UNDI_INVALID_STATE; \
75                         return PXENV_EXIT_FAILURE; }
76 #define ENSURE_MIDWAY(structure) if ( ! ensure_pxe_state(MIDWAY) ) { \
77                         structure->Status = PXENV_STATUS_UNDI_INVALID_STATE; \
78                         return PXENV_EXIT_FAILURE; }
79 #define ENSURE_READY(structure) if ( ! ensure_pxe_state(READY) ) { \
80                         structure->Status = PXENV_STATUS_UNDI_INVALID_STATE; \
81                         return PXENV_EXIT_FAILURE; }
82
83 /* Data structures installed as part of a PXE stack.  Architectures
84  * will have extra information to append to the end of this.
85  */
86 #define PXE_TFTP_MAGIC_COOKIE ( ( 'P'<<24 ) | ( 'x'<<16 ) | ( 'T'<<8 ) | 'f' )
87 typedef struct pxe_stack {
88         struct s_PXE            pxe     __attribute__ ((aligned(16)));
89         struct s_PXENV          pxenv   __attribute__ ((aligned(16)));
90         pxe_stack_state_t       state;
91 } pxe_stack_t;
92
93 extern int ensure_pxe_state ( pxe_stack_state_t wanted );
94
95 extern pxe_stack_t *pxe_stack;
96
97 #endif /* PXE_H */