Annotation of cf/dev_c2691_eth.c, revision 1.1.1.1

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,
                     59:                                         router->nm_bay[nm_bay].pci_map,
                     60:                                         6,C2691_NETIO_IRQ);
                     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,
                    151:                             router->nm_bay[nm_bay].pci_map,
                    152:                             6,C2691_NETIO_IRQ);
                    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: };

unix.superglobalmegacorp.com

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