Annotation of cf/dev_c7200_eth.c, revision 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.