/[dynamips]/upstream/dynamips-0.2.6-RC2/dev_c7200_eth.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /upstream/dynamips-0.2.6-RC2/dev_c7200_eth.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations)
Sat Oct 6 16:05:34 2007 UTC (13 years, 2 months ago) by dpavlin
File MIME type: text/plain
File size: 8812 byte(s)
dynamips-0.2.6-RC2

1 /*
2 * Cisco C7200 (Predator) simulation platform.
3 * Copyright (c) 2005,2006 Christophe Fillot (cf@utc.fr)
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 /* C7200-IO-FE EEPROM */
27 /* ====================================================================== */
28
29 /* C7200-IO-FE: C7200 IOCard with one FastEthernet port EEPROM */
30 static const m_uint16_t eeprom_c7200_io_fe_data[16] = {
31 0x0183, 0x010E, 0xffff, 0xffff, 0x490B, 0x8C02, 0x0000, 0x0000,
32 0x5000, 0x0000, 0x9812, 0x2800, 0x00FF, 0xFFFF, 0xFFFF, 0xFFFF,
33 };
34
35 static const struct cisco_eeprom eeprom_c7200_io_fe = {
36 "C7200-IO-FE", (m_uint16_t *)eeprom_c7200_io_fe_data,
37 sizeof(eeprom_c7200_io_fe_data)/2,
38 };
39
40 /*
41 * dev_c7200_iocard_init()
42 *
43 * Add an IOcard into slot 0.
44 */
45 static int dev_c7200_iocard_init(c7200_t *router,char *name,u_int pa_bay)
46 {
47 struct dec21140_data *data;
48
49 if (pa_bay != 0) {
50 fprintf(stderr,"C7200 '%s': cannot put IOCARD in PA bay %u!\n",
51 router->vm->name,pa_bay);
52 return(-1);
53 }
54
55 /* Set the EEPROM */
56 c7200_pa_set_eeprom(router,pa_bay,&eeprom_c7200_io_fe);
57
58 /* Create the DEC21140 chip */
59 data = dev_dec21140_init(router->vm,name,
60 router->pa_bay[pa_bay].pci_map,
61 router->npe_driver->dec21140_pci_dev,
62 C7200_NETIO_IRQ);
63 if (!data) return(-1);
64
65 /* Store device info into the router structure */
66 return(c7200_pa_set_drvinfo(router,pa_bay,data));
67 }
68
69 /* Remove an IOcard from slot 0 */
70 static int dev_c7200_iocard_shutdown(c7200_t *router,u_int pa_bay)
71 {
72 struct c7200_pa_bay *bay;
73
74 if (!(bay = c7200_pa_get_info(router,pa_bay)))
75 return(-1);
76
77 c7200_pa_unset_eeprom(router,pa_bay);
78 dev_dec21140_remove(bay->drv_info);
79 return(0);
80 }
81
82 /* Bind a Network IO descriptor */
83 static int dev_c7200_iocard_set_nio(c7200_t *router,u_int pa_bay,u_int port_id,
84 netio_desc_t *nio)
85 {
86 struct dec21140_data *d;
87
88 if ((port_id > 0) || !(d = c7200_pa_get_drvinfo(router,pa_bay)))
89 return(-1);
90
91 return(dev_dec21140_set_nio(d,nio));
92 }
93
94 /* Unbind a Network IO descriptor */
95 static int dev_c7200_iocard_unset_nio(c7200_t *router,u_int pa_bay,
96 u_int port_id)
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 dev_dec21140_unset_nio(d);
104 return(0);
105 }
106
107 /*
108 * dev_c7200_pa_fe_tx_init()
109 *
110 * Add a PA-FE-TX port adapter into specified slot.
111 */
112 static int dev_c7200_pa_fe_tx_init(c7200_t *router,char *name,u_int pa_bay)
113 {
114 struct dec21140_data *data;
115
116 /* Set the EEPROM */
117 c7200_pa_set_eeprom(router,pa_bay,cisco_eeprom_find_pa("PA-FE-TX"));
118
119 /* Create the DEC21140 chip */
120 data = dev_dec21140_init(router->vm,name,router->pa_bay[pa_bay].pci_map,0,
121 C7200_NETIO_IRQ);
122 if (!data) return(-1);
123
124 /* Store device info into the router structure */
125 return(c7200_pa_set_drvinfo(router,pa_bay,data));
126 }
127
128 /* Remove a PA-FE-TX from the specified slot */
129 static int dev_c7200_pa_fe_tx_shutdown(c7200_t *router,u_int pa_bay)
130 {
131 struct c7200_pa_bay *bay;
132
133 if (!(bay = c7200_pa_get_info(router,pa_bay)))
134 return(-1);
135
136 c7200_pa_unset_eeprom(router,pa_bay);
137 dev_dec21140_remove(bay->drv_info);
138 return(0);
139 }
140
141 /* Bind a Network IO descriptor */
142 static int dev_c7200_pa_fe_tx_set_nio(c7200_t *router,u_int pa_bay,
143 u_int port_id,netio_desc_t *nio)
144 {
145 struct dec21140_data *d;
146
147 if ((port_id > 0) || !(d = c7200_pa_get_drvinfo(router,pa_bay)))
148 return(-1);
149
150 return(dev_dec21140_set_nio(d,nio));
151 }
152
153 /* Unbind a Network IO descriptor */
154 static int dev_c7200_pa_fe_tx_unset_nio(c7200_t *router,u_int pa_bay,
155 u_int port_id)
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 dev_dec21140_unset_nio(d);
163 return(0);
164 }
165
166 /* C7200-IO-FE driver */
167 struct c7200_pa_driver dev_c7200_io_fe_driver = {
168 "C7200-IO-FE", 1,
169 dev_c7200_iocard_init,
170 dev_c7200_iocard_shutdown,
171 dev_c7200_iocard_set_nio,
172 dev_c7200_iocard_unset_nio,
173 NULL,
174 };
175
176 /* PA-FE-TX driver */
177 struct c7200_pa_driver dev_c7200_pa_fe_tx_driver = {
178 "PA-FE-TX", 1,
179 dev_c7200_pa_fe_tx_init,
180 dev_c7200_pa_fe_tx_shutdown,
181 dev_c7200_pa_fe_tx_set_nio,
182 dev_c7200_pa_fe_tx_unset_nio,
183 NULL,
184 };
185
186 /* ====================================================================== */
187 /* PA-4E / PA-8E */
188 /* ====================================================================== */
189
190 /* PA-4E/PA-8E data */
191 struct pa_4e8e_data {
192 u_int nr_port;
193 struct am79c971_data *port[8];
194 };
195
196 /*
197 * dev_c7200_pa_4e_init()
198 *
199 * Add a PA-4E port adapter into specified slot.
200 */
201 static int dev_c7200_pa_4e_init(c7200_t *router,char *name,u_int pa_bay)
202 {
203 struct pa_4e8e_data *data;
204 int i;
205
206 /* Allocate the private data structure for the PA-4E */
207 if (!(data = malloc(sizeof(*data)))) {
208 fprintf(stderr,"%s (PA-4E): out of memory\n",name);
209 return(-1);
210 }
211
212 /* 4 Ethernet ports */
213 memset(data,0,sizeof(*data));
214 data->nr_port = 4;
215
216 /* Set the EEPROM */
217 c7200_pa_set_eeprom(router,pa_bay,cisco_eeprom_find_pa("PA-4E"));
218
219 /* Create the AMD Am79c971 chips */
220 for(i=0;i<data->nr_port;i++) {
221 data->port[i] = dev_am79c971_init(router->vm,name,AM79C971_TYPE_10BASE_T,
222 router->pa_bay[pa_bay].pci_map,i,
223 C7200_NETIO_IRQ);
224 }
225
226 /* Store device info into the router structure */
227 return(c7200_pa_set_drvinfo(router,pa_bay,data));
228 }
229
230 /*
231 * dev_c7200_pa_8e_init()
232 *
233 * Add a PA-8E port adapter into specified slot.
234 */
235 static int dev_c7200_pa_8e_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-8E */
241 if (!(data = malloc(sizeof(*data)))) {
242 fprintf(stderr,"%s (PA-8E): out of memory\n",name);
243 return(-1);
244 }
245
246 /* 4 Ethernet ports */
247 memset(data,0,sizeof(*data));
248 data->nr_port = 8;
249
250 /* Set the EEPROM */
251 c7200_pa_set_eeprom(router,pa_bay,cisco_eeprom_find_pa("PA-8E"));
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 /* Remove a PA-4E/PA-8E from the specified slot */
265 static int dev_c7200_pa_4e8e_shutdown(c7200_t *router,u_int pa_bay)
266 {
267 struct c7200_pa_bay *bay;
268 struct pa_4e8e_data *data;
269 int i;
270
271 if (!(bay = c7200_pa_get_info(router,pa_bay)))
272 return(-1);
273
274 data = bay->drv_info;
275
276 /* Remove the PA EEPROM */
277 c7200_pa_unset_eeprom(router,pa_bay);
278
279 /* Remove the AMD Am79c971 chips */
280 for(i=0;i<data->nr_port;i++)
281 dev_am79c971_remove(data->port[i]);
282
283 free(data);
284 return(0);
285 }
286
287 /* Bind a Network IO descriptor */
288 static int dev_c7200_pa_4e8e_set_nio(c7200_t *router,u_int pa_bay,
289 u_int port_id,netio_desc_t *nio)
290 {
291 struct pa_4e8e_data *d;
292
293 d = c7200_pa_get_drvinfo(router,pa_bay);
294
295 if (!d || (port_id >= d->nr_port))
296 return(-1);
297
298 dev_am79c971_set_nio(d->port[port_id],nio);
299 return(0);
300 }
301
302 /* Unbind a Network IO descriptor */
303 static int dev_c7200_pa_4e8e_unset_nio(c7200_t *router,u_int pa_bay,
304 u_int port_id)
305 {
306 struct pa_4e8e_data *d;
307
308 d = c7200_pa_get_drvinfo(router,pa_bay);
309
310 if (!d || (port_id >= d->nr_port))
311 return(-1);
312
313 dev_am79c971_unset_nio(d->port[port_id]);
314 return(0);
315 }
316
317 /* PA-4E driver */
318 struct c7200_pa_driver dev_c7200_pa_4e_driver = {
319 "PA-4E", 1,
320 dev_c7200_pa_4e_init,
321 dev_c7200_pa_4e8e_shutdown,
322 dev_c7200_pa_4e8e_set_nio,
323 dev_c7200_pa_4e8e_unset_nio,
324 NULL,
325 };
326
327 /* PA-8E driver */
328 struct c7200_pa_driver dev_c7200_pa_8e_driver = {
329 "PA-8E", 1,
330 dev_c7200_pa_8e_init,
331 dev_c7200_pa_4e8e_shutdown,
332 dev_c7200_pa_4e8e_set_nio,
333 dev_c7200_pa_4e8e_unset_nio,
334 NULL,
335 };

  ViewVC Help
Powered by ViewVC 1.1.26