Added PXE bus driver (with support only for using PXE structures found
[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 #include <gpxe/device.h>
7
8 /* Parameter block for pxenv_unknown() */
9 struct s_PXENV_UNKNOWN {
10         PXENV_STATUS_t Status;                  /**< PXE status code */
11 } PACKED;
12
13 typedef struct s_PXENV_UNKNOWN PXENV_UNKNOWN_t;
14
15 /* Union used for PXE API calls; we don't know the type of the
16  * structure until we interpret the opcode.  Also, Status is available
17  * in the same location for any opcode, and it's convenient to have
18  * non-specific access to it.
19  */
20 union u_PXENV_ANY {
21         /* Make it easy to read status for any operation */
22         PXENV_STATUS_t                          Status;
23         struct s_PXENV_UNKNOWN                  unknown;
24         struct s_PXENV_UNLOAD_STACK             unload_stack;
25         struct s_PXENV_GET_CACHED_INFO          get_cached_info;
26         struct s_PXENV_TFTP_READ_FILE           restart_tftp;
27         struct s_PXENV_START_UNDI               start_undi;
28         struct s_PXENV_STOP_UNDI                stop_undi;
29         struct s_PXENV_START_BASE               start_base;
30         struct s_PXENV_STOP_BASE                stop_base;
31         struct s_PXENV_TFTP_OPEN                tftp_open;
32         struct s_PXENV_TFTP_CLOSE               tftp_close;
33         struct s_PXENV_TFTP_READ                tftp_read;
34         struct s_PXENV_TFTP_READ_FILE           tftp_read_file;
35         struct s_PXENV_TFTP_GET_FSIZE           tftp_get_fsize;
36         struct s_PXENV_UDP_OPEN                 udp_open;
37         struct s_PXENV_UDP_CLOSE                udp_close;
38         struct s_PXENV_UDP_WRITE                udp_write;
39         struct s_PXENV_UDP_READ                 udp_read;
40         struct s_PXENV_UNDI_STARTUP             undi_startup;
41         struct s_PXENV_UNDI_CLEANUP             undi_cleanup;
42         struct s_PXENV_UNDI_INITIALIZE          undi_initialize;
43         struct s_PXENV_UNDI_RESET               undi_reset_adapter;
44         struct s_PXENV_UNDI_SHUTDOWN            undi_shutdown;
45         struct s_PXENV_UNDI_OPEN                undi_open;
46         struct s_PXENV_UNDI_CLOSE               undi_close;
47         struct s_PXENV_UNDI_TRANSMIT            undi_transmit;
48         struct s_PXENV_UNDI_SET_MCAST_ADDRESS   undi_set_mcast_address;
49         struct s_PXENV_UNDI_SET_STATION_ADDRESS undi_set_station_address;
50         struct s_PXENV_UNDI_SET_PACKET_FILTER   undi_set_packet_filter;
51         struct s_PXENV_UNDI_GET_INFORMATION     undi_get_information;
52         struct s_PXENV_UNDI_GET_STATISTICS      undi_get_statistics;
53         struct s_PXENV_UNDI_CLEAR_STATISTICS    undi_clear_statistics;
54         struct s_PXENV_UNDI_INITIATE_DIAGS      undi_initiate_diags;
55         struct s_PXENV_UNDI_FORCE_INTERRUPT     undi_force_interrupt;
56         struct s_PXENV_UNDI_GET_MCAST_ADDRESS   undi_get_mcast_address;
57         struct s_PXENV_UNDI_GET_NIC_TYPE        undi_get_nic_type;
58         struct s_PXENV_UNDI_GET_IFACE_INFO      undi_get_iface_info;
59         struct s_PXENV_UNDI_GET_STATE           undi_get_state;
60         struct s_PXENV_UNDI_ISR                 undi_isr;
61 };
62
63 typedef union u_PXENV_ANY PXENV_ANY_t;
64
65 /** A PXE device */
66 struct pxe_device {
67         /** Generic device */
68         struct device dev;
69         /** Driver-private data
70          *
71          * Use pxe_set_drvdata() and pxe_get_drvdata() to access this
72          * field.
73          */
74         void *priv;
75
76         /** PXENV+ structure address */
77         SEGOFF16_t pxenv;
78         /** !PXE structure address */
79         SEGOFF16_t ppxe;
80         /** Entry point */
81         SEGOFF16_t entry;
82         /** MAC address */
83         MAC_ADDR_t hwaddr;
84         /** Assigned IRQ number */
85         UINT16_t irq;
86         /** ROM address */
87         SEGSEL_t rom;
88 };
89
90 /**
91  * Set PXE driver-private data
92  *
93  * @v pxe               PXE device
94  * @v priv              Private data
95  */
96 static inline void pxe_set_drvdata ( struct pxe_device *pxe, void *priv ) {
97         pxe->priv = priv;
98 }
99
100 /**
101  * Get PXE driver-private data
102  *
103  * @v pxe               PXE device
104  * @ret priv            Private data
105  */
106 static inline void * pxe_get_drvdata ( struct pxe_device *pxe ) {
107         return pxe->priv;
108 }
109
110 extern int pxe_call ( struct pxe_device *pxe, unsigned int function,
111                       void *params, size_t params_len );
112 extern int undi_probe ( struct pxe_device *pxe );
113 extern void undi_remove ( struct pxe_device *pxe );
114
115 extern struct net_device *pxe_netdev;
116
117 #endif /* PXE_H */