|
|
1.1 root 1: /*
2: * Cisco C2691 simulation platform.
3: * Copyright (c) 2006 Christophe Fillot ([email protected])
4: *
5: * Ethernet Network Modules.
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_nm_16esw.h"
23: #include "dev_gt.h"
24: #include "dev_c2691.h"
25:
26: /* Multi-Ethernet NM with Am79c971 chips */
27: struct nm_eth_data {
28: u_int nr_port;
29: struct am79c971_data *port[8];
30: };
31:
32: /*
33: * dev_c2691_nm_eth_init()
34: *
35: * Add an Ethernet Network Module into specified slot.
36: */
37: static int dev_c2691_nm_eth_init(c2691_t *router,char *name,u_int nm_bay,
38: int nr_port,int interface_type,
39: const struct cisco_eeprom *eeprom)
40: {
41: struct nm_eth_data *data;
42: int i;
43:
44: /* Allocate the private data structure */
45: if (!(data = malloc(sizeof(*data)))) {
46: fprintf(stderr,"%s: out of memory\n",name);
47: return(-1);
48: }
49:
50: memset(data,0,sizeof(*data));
51: data->nr_port = nr_port;
52:
53: /* Set the EEPROM */
54: c2691_nm_set_eeprom(router,nm_bay,eeprom);
55:
56: /* Create the AMD Am971c971 chip(s) */
57: for(i=0;i<data->nr_port;i++) {
58: data->port[i] = dev_am79c971_init(router->vm,name,interface_type,
1.1.1.2 ! root 59: router->nm_bay[nm_bay].pci_map,6+i,
! 60: c2691_net_irq_for_slot_port(nm_bay,i));
1.1 root 61: }
62:
63: /* Store device info into the router structure */
64: return(c2691_nm_set_drvinfo(router,nm_bay,data));
65: }
66:
67: /* Remove an Ethernet NM from the specified slot */
68: static int dev_c2691_nm_eth_shutdown(c2691_t *router,u_int nm_bay)
69: {
70: struct c2691_nm_bay *bay;
71: struct nm_eth_data *data;
72: int i;
73:
74: if (!(bay = c2691_nm_get_info(router,nm_bay)))
75: return(-1);
76:
77: data = bay->drv_info;
78:
79: /* Remove the NM EEPROM */
80: c2691_nm_unset_eeprom(router,nm_bay);
81:
82: /* Remove the AMD Am79c971 chips */
83: for(i=0;i<data->nr_port;i++)
84: dev_am79c971_remove(data->port[i]);
85:
86: free(data);
87: return(0);
88: }
89:
90: /* Bind a Network IO descriptor */
91: static int dev_c2691_nm_eth_set_nio(c2691_t *router,u_int nm_bay,
92: u_int port_id,netio_desc_t *nio)
93: {
94: struct nm_eth_data *d;
95:
96: d = c2691_nm_get_drvinfo(router,nm_bay);
97:
98: if (!d || (port_id >= d->nr_port))
99: return(-1);
100:
101: dev_am79c971_set_nio(d->port[port_id],nio);
102: return(0);
103: }
104:
105: /* Unbind a Network IO descriptor */
106: static int dev_c2691_nm_eth_unset_nio(c2691_t *router,u_int nm_bay,
107: u_int port_id)
108: {
109: struct nm_eth_data *d;
110:
111: d = c2691_nm_get_drvinfo(router,nm_bay);
112:
113: if (!d || (port_id >= d->nr_port))
114: return(-1);
115:
116: dev_am79c971_unset_nio(d->port[port_id]);
117: return(0);
118: }
119:
120: /* ====================================================================== */
121: /* NM-1FE-TX */
122: /* ====================================================================== */
123:
124: /*
125: * dev_c2691_nm_1fe_tx_init()
126: *
127: * Add a NM-1FE-TX Network Module into specified slot.
128: */
129: static int dev_c2691_nm_1fe_tx_init(c2691_t *router,char *name,u_int nm_bay)
130: {
131: return(dev_c2691_nm_eth_init(router,name,nm_bay,1,AM79C971_TYPE_100BASE_TX,
132: cisco_eeprom_find_nm("NM-1FE-TX")));
133: }
134:
135: /* ====================================================================== */
136: /* NM-16ESW */
137: /* ====================================================================== */
138:
139: /* Add a NM-16ESW */
140: static int dev_c2691_nm_16esw_init(c2691_t *router,char *name,u_int nm_bay)
141: {
142: struct nm_16esw_data *data;
143:
144: /* Set the EEPROM */
145: c2691_nm_set_eeprom(router,nm_bay,cisco_eeprom_find_nm("NM-16ESW"));
146: dev_nm_16esw_burn_mac_addr(router->vm,nm_bay,
147: &router->nm_bay[nm_bay].eeprom);
148:
149: /* Create the device */
150: data = dev_nm_16esw_init(router->vm,name,nm_bay,
1.1.1.2 ! root 151: router->nm_bay[nm_bay].pci_map,6,
! 152: c2691_net_irq_for_slot_port(nm_bay,0));
1.1 root 153:
154: /* Store device info into the router structure */
155: return(c2691_nm_set_drvinfo(router,nm_bay,data));
156: }
157:
158: /* Remove a NM-16ESW from the specified slot */
159: static int dev_c2691_nm_16esw_shutdown(c2691_t *router,u_int nm_bay)
160: {
161: struct c2691_nm_bay *bay;
162: struct nm_16esw_data *data;
163:
164: if (!(bay = c2691_nm_get_info(router,nm_bay)))
165: return(-1);
166:
167: data = bay->drv_info;
168:
169: /* Remove the NM EEPROM */
170: c2691_nm_unset_eeprom(router,nm_bay);
171:
172: /* Remove the BCM5600 chip */
173: dev_nm_16esw_remove(data);
174: return(0);
175: }
176:
177: /* Bind a Network IO descriptor */
178: static int dev_c2691_nm_16esw_set_nio(c2691_t *router,u_int nm_bay,
179: u_int port_id,netio_desc_t *nio)
180: {
181: struct nm_16esw_data *d;
182:
183: d = c2691_nm_get_drvinfo(router,nm_bay);
184: dev_nm_16esw_set_nio(d,port_id,nio);
185: return(0);
186: }
187:
188: /* Unbind a Network IO descriptor */
189: static int dev_c2691_nm_16esw_unset_nio(c2691_t *router,u_int nm_bay,
190: u_int port_id)
191: {
192: struct nm_16esw_data *d;
193:
194: d = c2691_nm_get_drvinfo(router,nm_bay);
195: dev_nm_16esw_unset_nio(d,port_id);
196: return(0);
197: }
198:
199: /* Show debug info */
200: static int dev_c2691_nm_16esw_show_info(c2691_t *router,u_int nm_bay)
201: {
202: struct nm_16esw_data *d;
203:
204: d = c2691_nm_get_drvinfo(router,nm_bay);
205: dev_nm_16esw_show_info(d);
206: return(0);
207: }
208:
209: /* ====================================================================== */
210: /* GT96100 - Integrated Ethernet ports */
211: /* ====================================================================== */
212:
213: /* Initialize Ethernet part of the GT96100 controller */
214: static int dev_c2691_gt96100_fe_init(c2691_t *router,char *name,u_int nm_bay)
215: {
216: vm_obj_t *obj;
217:
218: if (nm_bay != 0) {
219: fprintf(stderr,"dev_c2691_gt96100_fe_init: bad slot specified.\n");
220: return(-1);
221: }
222:
223: if (!(obj = vm_object_find(router->vm,"gt96100"))) {
224: fprintf(stderr,"dev_c2691_gt96100_fe_init: unable to find "
225: "system controller!\n");
226: return(-1);
227: }
228:
229: /* Store device info into the router structure */
230: return(c2691_nm_set_drvinfo(router,0,obj->data));
231: }
232:
233: /* Nothing to do, we never remove the system controller */
234: static int dev_c2691_gt96100_fe_shutdown(c2691_t *router,u_int nm_bay)
235: {
236: return(0);
237: }
238:
239: /* Bind a Network IO descriptor */
240: static int dev_c2691_gt96100_fe_set_nio(c2691_t *router,u_int nm_bay,
241: u_int port_id,netio_desc_t *nio)
242: {
243: struct gt_data *d;
244:
245: if (!(d = c2691_nm_get_drvinfo(router,nm_bay)))
246: return(-1);
247:
248: dev_gt96100_set_nio(d,port_id,nio);
249: return(0);
250: }
251:
252: /* Unbind a Network IO descriptor */
253: static int dev_c2691_gt96100_fe_unset_nio(c2691_t *router,u_int nm_bay,
254: u_int port_id)
255: {
256: struct gt_data *d;
257:
258: if (!(d = c2691_nm_get_drvinfo(router,nm_bay)))
259: return(-1);
260:
261: dev_gt96100_unset_nio(d,port_id);
262: return(0);
263: }
264:
265: /* ====================================================================== */
266:
267: /* NM-1FE-TX driver */
268: struct c2691_nm_driver dev_c2691_nm_1fe_tx_driver = {
269: "NM-1FE-TX", 1, 0,
270: dev_c2691_nm_1fe_tx_init,
271: dev_c2691_nm_eth_shutdown,
272: dev_c2691_nm_eth_set_nio,
273: dev_c2691_nm_eth_unset_nio,
274: NULL,
275: };
276:
277: /* NM-16ESW driver */
278: struct c2691_nm_driver dev_c2691_nm_16esw_driver = {
279: "NM-16ESW", 1, 0,
280: dev_c2691_nm_16esw_init,
281: dev_c2691_nm_16esw_shutdown,
282: dev_c2691_nm_16esw_set_nio,
283: dev_c2691_nm_16esw_unset_nio,
284: dev_c2691_nm_16esw_show_info,
285: };
286:
287: /* GT96100 FastEthernet integrated ports */
288: struct c2691_nm_driver dev_c2691_gt96100_fe_driver = {
289: "GT96100-FE", 1, 0,
290: dev_c2691_gt96100_fe_init,
291: dev_c2691_gt96100_fe_shutdown,
292: dev_c2691_gt96100_fe_set_nio,
293: dev_c2691_gt96100_fe_unset_nio,
294: NULL,
295: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.