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