|
|
1.1 root 1: /*
2: * Cisco C7200 (Predator) simulation platform.
3: * Copyright (c) 2005,2006 Christophe Fillot ([email protected])
4: *
5: * Ethernet Port Adapters.
6: */
7:
8: #include <stdio.h>
9: #include <stdlib.h>
10: #include <string.h>
11: #include <stdarg.h>
12: #include <unistd.h>
13: #include <time.h>
14: #include <errno.h>
15: #include <assert.h>
16:
17: #include "utils.h"
18: #include "net.h"
19: #include "net_io.h"
20: #include "ptask.h"
21: #include "dev_am79c971.h"
22: #include "dev_dec21140.h"
23: #include "dev_c7200.h"
24:
25: /* ====================================================================== */
26: /* PA-FE-TX / C7200-IO-FE */
27: /* ====================================================================== */
28:
29: /* PA-FE-TX: FastEthernet Port Adapter EEPROM */
30: static const m_uint16_t eeprom_c7200_pa_fe_tx_data[16] = {
31: 0x0111, 0x0102, 0xffff, 0xffff, 0x4906, 0x9804, 0x0000, 0x0000,
32: 0x6000, 0x0000, 0x9812, 0x1700, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
33: };
34:
35: static const struct c7200_eeprom eeprom_c7200_pa_fe_tx = {
36: "PA-FE-TX", (m_uint16_t *)eeprom_c7200_pa_fe_tx_data,
37: sizeof(eeprom_c7200_pa_fe_tx_data)/2,
38: };
39:
40: /* C7200-IO-FE: C7200 IOCard with one FastEthernet port EEPROM */
41: static const m_uint16_t eeprom_c7200_io_fe_data[16] = {
42: 0x0183, 0x010E, 0xffff, 0xffff, 0x490B, 0x8C02, 0x0000, 0x0000,
43: 0x5000, 0x0000, 0x9812, 0x2800, 0x00FF, 0xFFFF, 0xFFFF, 0xFFFF,
44: };
45:
46: static const struct c7200_eeprom eeprom_c7200_io_fe = {
47: "C7200-IO-FE", (m_uint16_t *)eeprom_c7200_io_fe_data,
48: sizeof(eeprom_c7200_io_fe_data)/2,
49: };
50:
51: /*
52: * dev_c7200_iocard_init()
53: *
54: * Add an IOcard into slot 0.
55: */
56: static int dev_c7200_iocard_init(c7200_t *router,char *name,u_int pa_bay)
57: {
58: struct dec21140_data *data;
59:
60: if (pa_bay != 0) {
61: fprintf(stderr,"C7200 '%s': cannot put IOCARD in PA bay %u!\n",
62: router->vm->name,pa_bay);
63: return(-1);
64: }
65:
66: /* Set the EEPROM */
67: c7200_pa_set_eeprom(router,pa_bay,&eeprom_c7200_io_fe);
68:
69: /* Create the DEC21140 chip */
70: data = dev_dec21140_init(router->vm,name,
71: router->pa_bay[pa_bay].pci_map,
72: /*router->npe_driver->dec21140_pci_bus,*/ //PCI
73: router->npe_driver->dec21140_pci_dev,
74: C7200_NETIO_IRQ);
75: if (!data) return(-1);
76:
77: /* Store device info into the router structure */
78: return(c7200_pa_set_drvinfo(router,pa_bay,data));
79: }
80:
81: /* Remove an IOcard from slot 0 */
82: static int dev_c7200_iocard_shutdown(c7200_t *router,u_int pa_bay)
83: {
84: struct c7200_pa_bay *bay;
85:
86: if (!(bay = c7200_pa_get_info(router,pa_bay)))
87: return(-1);
88:
89: c7200_pa_unset_eeprom(router,pa_bay);
90: dev_dec21140_remove(bay->drv_info);
91: return(0);
92: }
93:
94: /* Bind a Network IO descriptor */
95: static int dev_c7200_iocard_set_nio(c7200_t *router,u_int pa_bay,u_int port_id,
96: netio_desc_t *nio)
97: {
98: struct dec21140_data *d;
99:
100: if ((port_id > 0) || !(d = c7200_pa_get_drvinfo(router,pa_bay)))
101: return(-1);
102:
103: return(dev_dec21140_set_nio(d,nio));
104: }
105:
106: /* Unbind a Network IO descriptor */
107: static int dev_c7200_iocard_unset_nio(c7200_t *router,u_int pa_bay,
108: u_int port_id)
109: {
110: struct dec21140_data *d;
111:
112: if ((port_id > 0) || !(d = c7200_pa_get_drvinfo(router,pa_bay)))
113: return(-1);
114:
115: dev_dec21140_unset_nio(d);
116: return(0);
117: }
118:
119: /*
120: * dev_c7200_pa_fe_tx_init()
121: *
122: * Add a PA-FE-TX port adapter into specified slot.
123: */
124: static int dev_c7200_pa_fe_tx_init(c7200_t *router,char *name,u_int pa_bay)
125: {
126: struct dec21140_data *data;
127:
128: /* Set the EEPROM */
129: c7200_pa_set_eeprom(router,pa_bay,&eeprom_c7200_pa_fe_tx);
130:
131: /* Create the DEC21140 chip */
132: data = dev_dec21140_init(router->vm,name,router->pa_bay[pa_bay].pci_map,0,
133: C7200_NETIO_IRQ);
134: if (!data) return(-1);
135:
136: /* Store device info into the router structure */
137: return(c7200_pa_set_drvinfo(router,pa_bay,data));
138: }
139:
140: /* Remove a PA-FE-TX from the specified slot */
141: static int dev_c7200_pa_fe_tx_shutdown(c7200_t *router,u_int pa_bay)
142: {
143: struct c7200_pa_bay *bay;
144:
145: if (!(bay = c7200_pa_get_info(router,pa_bay)))
146: return(-1);
147:
148: c7200_pa_unset_eeprom(router,pa_bay);
149: dev_dec21140_remove(bay->drv_info);
150: return(0);
151: }
152:
153: /* Bind a Network IO descriptor */
154: static int dev_c7200_pa_fe_tx_set_nio(c7200_t *router,u_int pa_bay,
155: u_int port_id,netio_desc_t *nio)
156: {
157: struct dec21140_data *d;
158:
159: if ((port_id > 0) || !(d = c7200_pa_get_drvinfo(router,pa_bay)))
160: return(-1);
161:
162: return(dev_dec21140_set_nio(d,nio));
163: }
164:
165: /* Unbind a Network IO descriptor */
166: static int dev_c7200_pa_fe_tx_unset_nio(c7200_t *router,u_int pa_bay,
167: u_int port_id)
168: {
169: struct dec21140_data *d;
170:
171: if ((port_id > 0) || !(d = c7200_pa_get_drvinfo(router,pa_bay)))
172: return(-1);
173:
174: dev_dec21140_unset_nio(d);
175: return(0);
176: }
177:
178: /* C7200-IO-FE driver */
179: struct c7200_pa_driver dev_c7200_io_fe_driver = {
180: "C7200-IO-FE", 1,
181: dev_c7200_iocard_init,
182: dev_c7200_iocard_shutdown,
183: dev_c7200_iocard_set_nio,
184: dev_c7200_iocard_unset_nio,
1.1.1.2 ! root 185: NULL,
1.1 root 186: };
187:
188: /* PA-FE-TX driver */
189: struct c7200_pa_driver dev_c7200_pa_fe_tx_driver = {
190: "PA-FE-TX", 1,
191: dev_c7200_pa_fe_tx_init,
192: dev_c7200_pa_fe_tx_shutdown,
193: dev_c7200_pa_fe_tx_set_nio,
194: dev_c7200_pa_fe_tx_unset_nio,
1.1.1.2 ! root 195: NULL,
1.1 root 196: };
197:
198: /* ====================================================================== */
199: /* PA-4E / PA-8E */
200: /* ====================================================================== */
201:
202: /* PA-4E/PA-8E data */
203: struct pa_4e8e_data {
204: u_int nr_port;
205: struct am79c971_data *port[8];
206: };
207:
208: /* PA-4E: 4 Ethernet Port Adapter EEPROM */
209: static const m_uint16_t eeprom_c7200_pa_4e_data[16] = {
210: 0x0102, 0x010E, 0xFFFF, 0xFFFF, 0x4906, 0x1404, 0x0000, 0x0000,
211: 0x5000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
212: };
213:
214: static const struct c7200_eeprom eeprom_c7200_pa_4e = {
215: "PA-4E", (m_uint16_t *)eeprom_c7200_pa_4e_data,
216: sizeof(eeprom_c7200_pa_4e_data)/2,
217: };
218:
219: /* PA-8E: 8 Ethernet Port Adapter EEPROM */
220: static const m_uint16_t eeprom_c7200_pa_8e_data[16] = {
221: 0x0101, 0x010E, 0xFFFF, 0xFFFF, 0x4906, 0x1404, 0x0000, 0x0000,
222: 0x5000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
223: };
224:
225: static const struct c7200_eeprom eeprom_c7200_pa_8e = {
226: "PA-8E", (m_uint16_t *)eeprom_c7200_pa_8e_data,
227: sizeof(eeprom_c7200_pa_8e_data)/2,
228: };
229:
230: /*
231: * dev_c7200_pa_4e_init()
232: *
233: * Add a PA-4E port adapter into specified slot.
234: */
235: static int dev_c7200_pa_4e_init(c7200_t *router,char *name,u_int pa_bay)
236: {
237: struct pa_4e8e_data *data;
238: int i;
239:
240: /* Allocate the private data structure for the PA-4E */
241: if (!(data = malloc(sizeof(*data)))) {
242: fprintf(stderr,"%s (PA-4E): out of memory\n",name);
243: return(-1);
244: }
245:
246: /* 4 Ethernet ports */
247: memset(data,0,sizeof(*data));
248: data->nr_port = 4;
249:
250: /* Set the EEPROM */
251: c7200_pa_set_eeprom(router,pa_bay,&eeprom_c7200_pa_4e);
252:
253: /* Create the AMD Am79c971 chips */
254: for(i=0;i<data->nr_port;i++) {
255: data->port[i] = dev_am79c971_init(router->vm,name,AM79C971_TYPE_10BASE_T,
256: router->pa_bay[pa_bay].pci_map,i,
257: C7200_NETIO_IRQ);
258: }
259:
260: /* Store device info into the router structure */
261: return(c7200_pa_set_drvinfo(router,pa_bay,data));
262: }
263:
264: /*
265: * dev_c7200_pa_8e_init()
266: *
267: * Add a PA-8E port adapter into specified slot.
268: */
269: static int dev_c7200_pa_8e_init(c7200_t *router,char *name,u_int pa_bay)
270: {
271: struct pa_4e8e_data *data;
272: int i;
273:
274: /* Allocate the private data structure for the PA-8E */
275: if (!(data = malloc(sizeof(*data)))) {
276: fprintf(stderr,"%s (PA-8E): out of memory\n",name);
277: return(-1);
278: }
279:
280: /* 4 Ethernet ports */
281: memset(data,0,sizeof(*data));
282: data->nr_port = 8;
283:
284: /* Set the EEPROM */
285: c7200_pa_set_eeprom(router,pa_bay,&eeprom_c7200_pa_8e);
286:
287: /* Create the AMD Am79c971 chips */
288: for(i=0;i<data->nr_port;i++) {
289: data->port[i] = dev_am79c971_init(router->vm,name,AM79C971_TYPE_10BASE_T,
290: router->pa_bay[pa_bay].pci_map,i,
291: C7200_NETIO_IRQ);
292: }
293:
294: /* Store device info into the router structure */
295: return(c7200_pa_set_drvinfo(router,pa_bay,data));
296: }
297:
298: /* Remove a PA-4E/PA-8E from the specified slot */
299: static int dev_c7200_pa_4e8e_shutdown(c7200_t *router,u_int pa_bay)
300: {
301: struct c7200_pa_bay *bay;
302: struct pa_4e8e_data *data;
303: int i;
304:
305: if (!(bay = c7200_pa_get_info(router,pa_bay)))
306: return(-1);
307:
308: data = bay->drv_info;
309:
310: /* Remove the PA EEPROM */
311: c7200_pa_unset_eeprom(router,pa_bay);
312:
313: /* Remove the AMD Am79c971 chips */
314: for(i=0;i<data->nr_port;i++)
315: dev_am79c971_remove(data->port[i]);
316:
317: free(data);
318: return(0);
319: }
320:
321: /* Bind a Network IO descriptor */
322: static int dev_c7200_pa_4e8e_set_nio(c7200_t *router,u_int pa_bay,
323: u_int port_id,netio_desc_t *nio)
324: {
325: struct pa_4e8e_data *d;
326:
327: d = c7200_pa_get_drvinfo(router,pa_bay);
328:
329: if (!d || (port_id >= d->nr_port))
330: return(-1);
331:
332: dev_am79c971_set_nio(d->port[port_id],nio);
333: return(0);
334: }
335:
336: /* Unbind a Network IO descriptor */
337: static int dev_c7200_pa_4e8e_unset_nio(c7200_t *router,u_int pa_bay,
338: u_int port_id)
339: {
340: struct pa_4e8e_data *d;
341:
342: d = c7200_pa_get_drvinfo(router,pa_bay);
343:
344: if (!d || (port_id >= d->nr_port))
345: return(-1);
346:
347: dev_am79c971_unset_nio(d->port[port_id]);
348: return(0);
349: }
350:
351: /* PA-4E driver */
352: struct c7200_pa_driver dev_c7200_pa_4e_driver = {
353: "PA-4E", 1,
354: dev_c7200_pa_4e_init,
355: dev_c7200_pa_4e8e_shutdown,
356: dev_c7200_pa_4e8e_set_nio,
357: dev_c7200_pa_4e8e_unset_nio,
1.1.1.2 ! root 358: NULL,
1.1 root 359: };
360:
361: /* PA-8E driver */
362: struct c7200_pa_driver dev_c7200_pa_8e_driver = {
363: "PA-8E", 1,
364: dev_c7200_pa_8e_init,
365: dev_c7200_pa_4e8e_shutdown,
366: dev_c7200_pa_4e8e_set_nio,
367: dev_c7200_pa_4e8e_unset_nio,
1.1.1.2 ! root 368: NULL,
1.1 root 369: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.