|
|
1.1 root 1: /*
2: * This program is free software; you can redistribute it and/or
3: * modify it under the terms of the GNU General Public License as
4: * published by the Free Software Foundation; either version 2, or (at
5: * your option) any later version.
6: */
7:
8: FILE_LICENCE ( GPL2_OR_LATER );
9:
10: #ifndef NIC_H
11: #define NIC_H
12:
13: #include <stdint.h>
14: #include <string.h>
15: #include <stdio.h>
16: #include <byteswap.h>
17: #include <ipxe/pci.h>
18: #include <ipxe/isapnp.h>
19: #include <ipxe/isa.h>
20: #include <ipxe/eisa.h>
21: #include <ipxe/mca.h>
22: #include <ipxe/io.h>
23:
24: typedef enum {
25: DISABLE = 0,
26: ENABLE,
27: FORCE
28: } irq_action_t;
29:
30: typedef enum duplex {
31: HALF_DUPLEX = 1,
32: FULL_DUPLEX
33: } duplex_t;
34:
35: /*
36: * Structure returned from eth_probe and passed to other driver
37: * functions.
38: */
39: struct nic {
40: struct nic_operations *nic_op;
41: int flags; /* driver specific flags */
42: unsigned char *node_addr;
43: unsigned char *packet;
44: unsigned int packetlen;
45: unsigned int ioaddr;
46: unsigned char irqno;
47: unsigned int mbps;
48: duplex_t duplex;
49: void *priv_data; /* driver private data */
50: };
51:
52: struct nic_operations {
53: int ( *connect ) ( struct nic * );
54: int ( *poll ) ( struct nic *, int retrieve );
55: void ( *transmit ) ( struct nic *, const char *,
56: unsigned int, unsigned int, const char * );
57: void ( *irq ) ( struct nic *, irq_action_t );
58: };
59:
60: extern struct nic nic;
61:
62: static inline int eth_poll ( int retrieve ) {
63: return nic.nic_op->poll ( &nic, retrieve );
64: }
65:
66: static inline void eth_transmit ( const char *dest, unsigned int type,
67: unsigned int size, const void *packet ) {
68: nic.nic_op->transmit ( &nic, dest, type, size, packet );
69: }
70:
71: /*
72: * Function prototypes
73: *
74: */
75: extern int dummy_connect ( struct nic *nic );
76: extern void dummy_irq ( struct nic *nic, irq_action_t irq_action );
77: extern int legacy_probe ( void *hwdev,
78: void ( * set_drvdata ) ( void *hwdev, void *priv ),
79: struct device *dev,
80: int ( * probe ) ( struct nic *nic, void *hwdev ),
81: void ( * disable ) ( struct nic *nic, void *hwdev ));
82: void legacy_remove ( void *hwdev,
83: void * ( * get_drvdata ) ( void *hwdev ),
84: void ( * disable ) ( struct nic *nic, void *hwdev ) );
85:
86: #define PCI_DRIVER(_name,_ids,_class) \
87: static inline int \
88: _name ## _pci_legacy_probe ( struct pci_device *pci ); \
89: static inline void \
90: _name ## _pci_legacy_remove ( struct pci_device *pci ); \
91: struct pci_driver _name __pci_driver = { \
92: .ids = _ids, \
93: .id_count = sizeof ( _ids ) / sizeof ( _ids[0] ), \
94: .probe = _name ## _pci_legacy_probe, \
95: .remove = _name ## _pci_legacy_remove, \
96: }; \
97: REQUIRE_OBJECT ( pci );
98:
99: static inline void legacy_pci_set_drvdata ( void *hwdev, void *priv ) {
100: pci_set_drvdata ( hwdev, priv );
101: }
102: static inline void * legacy_pci_get_drvdata ( void *hwdev ) {
103: return pci_get_drvdata ( hwdev );
104: }
105:
106: #define ISAPNP_DRIVER(_name,_ids) \
107: static inline int \
108: _name ## _isapnp_legacy_probe ( struct isapnp_device *isapnp, \
109: const struct isapnp_device_id *id ); \
110: static inline void \
111: _name ## _isapnp_legacy_remove ( struct isapnp_device *isapnp ); \
112: struct isapnp_driver _name __isapnp_driver = { \
113: .ids = _ids, \
114: .id_count = sizeof ( _ids ) / sizeof ( _ids[0] ), \
115: .probe = _name ## _isapnp_legacy_probe, \
116: .remove = _name ## _isapnp_legacy_remove, \
117: }; \
118: REQUIRE_OBJECT ( isapnp );
119:
120: static inline void legacy_isapnp_set_drvdata ( void *hwdev, void *priv ) {
121: isapnp_set_drvdata ( hwdev, priv );
122: }
123: static inline void * legacy_isapnp_get_drvdata ( void *hwdev ) {
124: return isapnp_get_drvdata ( hwdev );
125: }
126:
127: #define EISA_DRIVER(_name,_ids) \
128: static inline int \
129: _name ## _eisa_legacy_probe ( struct eisa_device *eisa, \
130: const struct eisa_device_id *id ); \
131: static inline void \
132: _name ## _eisa_legacy_remove ( struct eisa_device *eisa ); \
133: struct eisa_driver _name __eisa_driver = { \
134: .ids = _ids, \
135: .id_count = sizeof ( _ids ) / sizeof ( _ids[0] ), \
136: .probe = _name ## _eisa_legacy_probe, \
137: .remove = _name ## _eisa_legacy_remove, \
138: }; \
139: REQUIRE_OBJECT ( eisa );
140:
141: static inline void legacy_eisa_set_drvdata ( void *hwdev, void *priv ) {
142: eisa_set_drvdata ( hwdev, priv );
143: }
144: static inline void * legacy_eisa_get_drvdata ( void *hwdev ) {
145: return eisa_get_drvdata ( hwdev );
146: }
147:
148: #define MCA_DRIVER(_name,_ids) \
149: static inline int \
150: _name ## _mca_legacy_probe ( struct mca_device *mca, \
151: const struct mca_device_id *id ); \
152: static inline void \
153: _name ## _mca_legacy_remove ( struct mca_device *mca ); \
154: struct mca_driver _name __mca_driver = { \
155: .ids = _ids, \
156: .id_count = sizeof ( _ids ) / sizeof ( _ids[0] ), \
157: .probe = _name ## _mca_legacy_probe, \
158: .remove = _name ## _mca_legacy_remove, \
159: }; \
160: REQUIRE_OBJECT ( mca );
161:
162: static inline void legacy_mca_set_drvdata ( void *hwdev, void *priv ) {
163: mca_set_drvdata ( hwdev, priv );
164: }
165: static inline void * legacy_mca_get_drvdata ( void *hwdev ) {
166: return mca_get_drvdata ( hwdev );
167: }
168:
169: #define ISA_DRIVER(_name,_probe_addrs,_probe_addr,_vendor_id,_prod_id) \
170: static inline int \
171: _name ## _isa_legacy_probe ( struct isa_device *isa ); \
172: static inline int \
173: _name ## _isa_legacy_probe_at_addr ( struct isa_device *isa ) { \
174: if ( ! _probe_addr ( isa->ioaddr ) ) \
175: return -ENODEV; \
176: return _name ## _isa_legacy_probe ( isa ); \
177: } \
178: static inline void \
179: _name ## _isa_legacy_remove ( struct isa_device *isa ); \
180: static const char _name ## _text[]; \
181: struct isa_driver _name __isa_driver = { \
182: .name = _name ## _text, \
183: .probe_addrs = _probe_addrs, \
184: .addr_count = ( sizeof ( _probe_addrs ) / \
185: sizeof ( _probe_addrs[0] ) ), \
186: .vendor_id = _vendor_id, \
187: .prod_id = _prod_id, \
188: .probe = _name ## _isa_legacy_probe_at_addr, \
189: .remove = _name ## _isa_legacy_remove, \
190: }; \
191: REQUIRE_OBJECT ( isa );
192:
193: static inline void legacy_isa_set_drvdata ( void *hwdev, void *priv ) {
194: isa_set_drvdata ( hwdev, priv );
195: }
196: static inline void * legacy_isa_get_drvdata ( void *hwdev ) {
197: return isa_get_drvdata ( hwdev );
198: }
199:
200: #undef DRIVER
201: #define DRIVER(_name_text,_unused2,_unused3,_name,_probe,_disable) \
202: static const char _name ## _text[] = _name_text; \
203: static inline int \
204: _name ## _probe ( struct nic *nic, void *hwdev ) { \
205: return _probe ( nic, hwdev ); \
206: } \
207: static inline void \
208: _name ## _disable ( struct nic *nic, void *hwdev ) { \
209: void ( * _unsafe_disable ) () = _disable; \
210: _unsafe_disable ( nic, hwdev ); \
211: } \
212: static inline int \
213: _name ## _pci_legacy_probe ( struct pci_device *pci ) { \
214: return legacy_probe ( pci, legacy_pci_set_drvdata, \
215: &pci->dev, _name ## _probe, \
216: _name ## _disable ); \
217: } \
218: static inline void \
219: _name ## _pci_legacy_remove ( struct pci_device *pci ) { \
220: return legacy_remove ( pci, legacy_pci_get_drvdata, \
221: _name ## _disable ); \
222: } \
223: static inline int \
224: _name ## _isapnp_legacy_probe ( struct isapnp_device *isapnp, \
225: const struct isapnp_device_id *id __unused ) { \
226: return legacy_probe ( isapnp, legacy_isapnp_set_drvdata, \
227: &isapnp->dev, _name ## _probe, \
228: _name ## _disable ); \
229: } \
230: static inline void \
231: _name ## _isapnp_legacy_remove ( struct isapnp_device *isapnp ) { \
232: return legacy_remove ( isapnp, legacy_isapnp_get_drvdata, \
233: _name ## _disable ); \
234: } \
235: static inline int \
236: _name ## _eisa_legacy_probe ( struct eisa_device *eisa, \
237: const struct eisa_device_id *id __unused ) { \
238: return legacy_probe ( eisa, legacy_eisa_set_drvdata, \
239: &eisa->dev, _name ## _probe, \
240: _name ## _disable ); \
241: } \
242: static inline void \
243: _name ## _eisa_legacy_remove ( struct eisa_device *eisa ) { \
244: return legacy_remove ( eisa, legacy_eisa_get_drvdata, \
245: _name ## _disable ); \
246: } \
247: static inline int \
248: _name ## _mca_legacy_probe ( struct mca_device *mca, \
249: const struct mca_device_id *id __unused ) { \
250: return legacy_probe ( mca, legacy_mca_set_drvdata, \
251: &mca->dev, _name ## _probe, \
252: _name ## _disable ); \
253: } \
254: static inline void \
255: _name ## _mca_legacy_remove ( struct mca_device *mca ) { \
256: return legacy_remove ( mca, legacy_mca_get_drvdata, \
257: _name ## _disable ); \
258: } \
259: static inline int \
260: _name ## _isa_legacy_probe ( struct isa_device *isa ) { \
261: return legacy_probe ( isa, legacy_isa_set_drvdata, \
262: &isa->dev, _name ## _probe, \
263: _name ## _disable ); \
264: } \
265: static inline void \
266: _name ## _isa_legacy_remove ( struct isa_device *isa ) { \
267: return legacy_remove ( isa, legacy_isa_get_drvdata, \
268: _name ## _disable ); \
269: }
270:
271: #endif /* NIC_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.