|
|
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: {
156: struct nm_16esw_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"));
! 164: dev_nm_16esw_burn_mac_addr(vm,slot,&card->eeprom);
! 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.3 ! root 181: struct nm_16esw_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 */
188: dev_nm_16esw_remove(data);
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.3 ! root 197: struct nm_16esw_data *d = card->drv_info;
1.1 root 198: dev_nm_16esw_set_nio(d,port_id,nio);
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.3 ! root 207: struct nm_16esw_data *d = card->drv_info;
1.1 root 208: dev_nm_16esw_unset_nio(d,port_id);
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.3 ! root 216: struct nm_16esw_data *d = card->drv_info;
1.1 root 217: dev_nm_16esw_show_info(d);
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.