Annotation of cf/dev_c7200_eth.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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