Annotation of cf/dev_c2691_eth.c, revision 1.1.1.4

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: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.