|
|
1.1 root 1: /* 1.1.1.4 root 2: * Cisco router simulation platform. 1.1 root 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" 1.1.1.4 root 23: #include "dev_i8254x.h" 1.1 root 24: #include "dev_c7200.h" 25: 26: /* ====================================================================== */ 1.1.1.3 root 27: /* C7200-IO-FE EEPROM */ 1.1 root 28: /* ====================================================================== */ 29: 30: /* C7200-IO-FE: C7200 IOCard with one FastEthernet port EEPROM */ 31: static const m_uint16_t eeprom_c7200_io_fe_data[16] = { 32: 0x0183, 0x010E, 0xffff, 0xffff, 0x490B, 0x8C02, 0x0000, 0x0000, 33: 0x5000, 0x0000, 0x9812, 0x2800, 0x00FF, 0xFFFF, 0xFFFF, 0xFFFF, 34: }; 35: 1.1.1.3 root 36: static const struct cisco_eeprom eeprom_c7200_io_fe = { 1.1 root 37: "C7200-IO-FE", (m_uint16_t *)eeprom_c7200_io_fe_data, 38: sizeof(eeprom_c7200_io_fe_data)/2, 39: }; 40: 41: /* 42: * dev_c7200_iocard_init() 43: * 44: * Add an IOcard into slot 0. 45: */ 46: static int dev_c7200_iocard_init(c7200_t *router,char *name,u_int pa_bay) 47: { 48: struct dec21140_data *data; 49: 50: if (pa_bay != 0) { 51: fprintf(stderr,"C7200 '%s': cannot put IOCARD in PA bay %u!\n", 52: router->vm->name,pa_bay); 53: return(-1); 54: } 55: 56: /* Set the EEPROM */ 57: c7200_pa_set_eeprom(router,pa_bay,&eeprom_c7200_io_fe); 58: 59: /* Create the DEC21140 chip */ 60: data = dev_dec21140_init(router->vm,name, 61: router->pa_bay[pa_bay].pci_map, 62: router->npe_driver->dec21140_pci_dev, 1.1.1.5 ! root 63: c7200_net_irq_for_slot_port(pa_bay,0)); 1.1 root 64: if (!data) return(-1); 65: 66: /* Store device info into the router structure */ 67: return(c7200_pa_set_drvinfo(router,pa_bay,data)); 68: } 69: 70: /* Remove an IOcard from slot 0 */ 71: static int dev_c7200_iocard_shutdown(c7200_t *router,u_int pa_bay) 72: { 73: struct c7200_pa_bay *bay; 74: 75: if (!(bay = c7200_pa_get_info(router,pa_bay))) 76: return(-1); 77: 78: c7200_pa_unset_eeprom(router,pa_bay); 79: dev_dec21140_remove(bay->drv_info); 80: return(0); 81: } 82: 83: /* Bind a Network IO descriptor */ 84: static int dev_c7200_iocard_set_nio(c7200_t *router,u_int pa_bay,u_int port_id, 85: netio_desc_t *nio) 86: { 87: struct dec21140_data *d; 88: 89: if ((port_id > 0) || !(d = c7200_pa_get_drvinfo(router,pa_bay))) 90: return(-1); 91: 92: return(dev_dec21140_set_nio(d,nio)); 93: } 94: 95: /* Unbind a Network IO descriptor */ 96: static int dev_c7200_iocard_unset_nio(c7200_t *router,u_int pa_bay, 97: u_int port_id) 98: { 99: struct dec21140_data *d; 100: 101: if ((port_id > 0) || !(d = c7200_pa_get_drvinfo(router,pa_bay))) 102: return(-1); 103: 104: dev_dec21140_unset_nio(d); 105: return(0); 106: } 107: 108: /* 109: * dev_c7200_pa_fe_tx_init() 110: * 111: * Add a PA-FE-TX port adapter into specified slot. 112: */ 113: static int dev_c7200_pa_fe_tx_init(c7200_t *router,char *name,u_int pa_bay) 114: { 115: struct dec21140_data *data; 116: 117: /* Set the EEPROM */ 1.1.1.3 root 118: c7200_pa_set_eeprom(router,pa_bay,cisco_eeprom_find_pa("PA-FE-TX")); 1.1 root 119: 120: /* Create the DEC21140 chip */ 121: data = dev_dec21140_init(router->vm,name,router->pa_bay[pa_bay].pci_map,0, 1.1.1.5 ! root 122: c7200_net_irq_for_slot_port(pa_bay,0)); 1.1 root 123: if (!data) return(-1); 124: 125: /* Store device info into the router structure */ 126: return(c7200_pa_set_drvinfo(router,pa_bay,data)); 127: } 128: 129: /* Remove a PA-FE-TX from the specified slot */ 130: static int dev_c7200_pa_fe_tx_shutdown(c7200_t *router,u_int pa_bay) 131: { 132: struct c7200_pa_bay *bay; 133: 134: if (!(bay = c7200_pa_get_info(router,pa_bay))) 135: return(-1); 136: 137: c7200_pa_unset_eeprom(router,pa_bay); 138: dev_dec21140_remove(bay->drv_info); 139: return(0); 140: } 141: 142: /* Bind a Network IO descriptor */ 143: static int dev_c7200_pa_fe_tx_set_nio(c7200_t *router,u_int pa_bay, 144: u_int port_id,netio_desc_t *nio) 145: { 146: struct dec21140_data *d; 147: 148: if ((port_id > 0) || !(d = c7200_pa_get_drvinfo(router,pa_bay))) 149: return(-1); 150: 151: return(dev_dec21140_set_nio(d,nio)); 152: } 153: 154: /* Unbind a Network IO descriptor */ 155: static int dev_c7200_pa_fe_tx_unset_nio(c7200_t *router,u_int pa_bay, 156: u_int port_id) 157: { 158: struct dec21140_data *d; 159: 160: if ((port_id > 0) || !(d = c7200_pa_get_drvinfo(router,pa_bay))) 161: return(-1); 162: 163: dev_dec21140_unset_nio(d); 164: return(0); 165: } 166: 167: /* C7200-IO-FE driver */ 1.1.1.4 root 168: struct c7200_pa_driver dev_c7200_iocard_fe_driver = { 1.1 root 169: "C7200-IO-FE", 1, 170: dev_c7200_iocard_init, 171: dev_c7200_iocard_shutdown, 172: dev_c7200_iocard_set_nio, 173: dev_c7200_iocard_unset_nio, 1.1.1.2 root 174: NULL, 1.1 root 175: }; 176: 177: /* PA-FE-TX driver */ 178: struct c7200_pa_driver dev_c7200_pa_fe_tx_driver = { 179: "PA-FE-TX", 1, 180: dev_c7200_pa_fe_tx_init, 181: dev_c7200_pa_fe_tx_shutdown, 182: dev_c7200_pa_fe_tx_set_nio, 183: dev_c7200_pa_fe_tx_unset_nio, 1.1.1.2 root 184: NULL, 1.1 root 185: }; 186: 187: /* ====================================================================== */ 1.1.1.4 root 188: /* PA based on Intel i8254x chips */ 189: /* ====================================================================== */ 190: 191: struct pa_i8254x_data { 192: u_int nr_port; 193: struct i8254x_data *port[2]; 194: }; 195: 196: /* Remove a PA-2FE-TX from the specified slot */ 197: static int dev_c7200_pa_i8254x_shutdown(c7200_t *router,u_int pa_bay) 198: { 199: struct c7200_pa_bay *bay; 200: struct pa_i8254x_data *data; 201: int i; 202: 203: if (!(bay = c7200_pa_get_info(router,pa_bay))) 204: return(-1); 205: 206: data = bay->drv_info; 207: 208: /* Remove the PA EEPROM */ 209: c7200_pa_unset_eeprom(router,pa_bay); 210: 211: /* Remove the AMD Am79c971 chips */ 212: for(i=0;i<data->nr_port;i++) 213: dev_i8254x_remove(data->port[i]); 214: 215: free(data); 216: return(0); 217: } 218: 219: /* Bind a Network IO descriptor */ 220: static int dev_c7200_pa_i8254x_set_nio(c7200_t *router,u_int pa_bay, 221: u_int port_id,netio_desc_t *nio) 222: { 223: struct pa_i8254x_data *d; 224: 225: d = c7200_pa_get_drvinfo(router,pa_bay); 226: 227: if (!d || (port_id >= d->nr_port)) 228: return(-1); 229: 230: dev_i8254x_set_nio(d->port[port_id],nio); 231: return(0); 232: } 233: 234: /* Unbind a Network IO descriptor */ 235: static int dev_c7200_pa_i8254x_unset_nio(c7200_t *router,u_int pa_bay, 236: u_int port_id) 237: { 238: struct pa_i8254x_data *d; 239: 240: d = c7200_pa_get_drvinfo(router,pa_bay); 241: 242: if (!d || (port_id >= d->nr_port)) 243: return(-1); 244: 245: dev_i8254x_unset_nio(d->port[port_id]); 246: return(0); 247: } 248: 249: /* ====================================================================== */ 250: /* PA-2FE-TX */ 251: /* ====================================================================== */ 252: 253: /* 254: * dev_c7200_pa_2fe_tx_init() 255: * 256: * Add a PA-2FE-TX port adapter into specified slot. 257: */ 258: static int dev_c7200_pa_2fe_tx_init(c7200_t *router,char *name,u_int pa_bay) 259: { 260: struct pa_i8254x_data *data; 261: int i; 262: 263: /* Allocate the private data structure for the PA-2FE-TX */ 264: if (!(data = malloc(sizeof(*data)))) { 265: fprintf(stderr,"%s (PA-2FE-TX): out of memory\n",name); 266: return(-1); 267: } 268: 269: /* 2 Ethernet ports */ 270: memset(data,0,sizeof(*data)); 271: data->nr_port = 2; 272: 273: /* Set the EEPROM */ 274: c7200_pa_set_eeprom(router,pa_bay,cisco_eeprom_find_pa("PA-2FE-TX")); 275: 276: /* Create the Intel i8254x chips */ 277: for(i=0;i<data->nr_port;i++) { 278: data->port[i] = dev_i8254x_init(router->vm,name,0, 279: router->pa_bay[pa_bay].pci_map,i, 1.1.1.5 ! root 280: c7200_net_irq_for_slot_port(pa_bay,i)); 1.1.1.4 root 281: } 282: 283: /* Store device info into the router structure */ 284: return(c7200_pa_set_drvinfo(router,pa_bay,data)); 285: } 286: 287: /* PA-2FE-TX driver */ 288: struct c7200_pa_driver dev_c7200_pa_2fe_tx_driver = { 289: "PA-2FE-TX", 0, 290: dev_c7200_pa_2fe_tx_init, 291: dev_c7200_pa_i8254x_shutdown, 292: dev_c7200_pa_i8254x_set_nio, 293: dev_c7200_pa_i8254x_unset_nio, 294: NULL, 295: }; 296: 297: /* ====================================================================== */ 298: /* PA-GE */ 299: /* ====================================================================== */ 300: 301: /* 302: * dev_c7200_pa_ge_init() 303: * 304: * Add a PA-GE port adapter into specified slot. 305: */ 306: static int dev_c7200_pa_ge_init(c7200_t *router,char *name,u_int pa_bay) 307: { 308: struct pa_i8254x_data *data; 309: 310: /* Allocate the private data structure for the PA-2FE-TX */ 311: if (!(data = malloc(sizeof(*data)))) { 312: fprintf(stderr,"%s (PA-GE): out of memory\n",name); 313: return(-1); 314: } 315: 316: /* 2 Ethernet ports */ 317: memset(data,0,sizeof(*data)); 318: data->nr_port = 1; 319: 320: /* Set the EEPROM */ 321: c7200_pa_set_eeprom(router,pa_bay,cisco_eeprom_find_pa("PA-GE")); 322: 323: /* Create the Intel i8254x chip */ 324: data->port[0] = dev_i8254x_init(router->vm,name,0, 325: router->pa_bay[pa_bay].pci_map,0, 1.1.1.5 ! root 326: c7200_net_irq_for_slot_port(pa_bay,0)); 1.1.1.4 root 327: 328: /* Store device info into the router structure */ 329: return(c7200_pa_set_drvinfo(router,pa_bay,data)); 330: } 331: 332: /* PA-GE driver */ 333: struct c7200_pa_driver dev_c7200_pa_ge_driver = { 334: "PA-GE", 0, 335: dev_c7200_pa_ge_init, 336: dev_c7200_pa_i8254x_shutdown, 337: dev_c7200_pa_i8254x_set_nio, 338: dev_c7200_pa_i8254x_unset_nio, 339: NULL, 340: }; 341: 342: /* ====================================================================== */ 343: /* C7200-IO-2FE */ 344: /* ====================================================================== */ 345: 346: /* C7200-IO-2FE/E: C7200 IOCard with two FastEthernet ports EEPROM */ 347: static const m_uint16_t eeprom_c7200_io_2fe_data[] = { 348: 0x04FF, 0x4002, 0x1541, 0x0201, 0xC046, 0x0320, 0x001B, 0xCA06, 349: 0x8249, 0x138B, 0x0642, 0x4230, 0xC18B, 0x3030, 0x3030, 0x3030, 350: 0x3030, 0x0000, 0x0004, 0x0002, 0x0385, 0x1C0D, 0x7F03, 0xCB8F, 351: 0x4337, 0x3230, 0x302D, 0x492F, 0x4F2D, 0x3246, 0x452F, 0x4580, 352: 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 353: 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 354: 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 355: 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 356: }; 357: 358: static const struct cisco_eeprom eeprom_c7200_io_2fe = { 359: "C7200-IO-2FE", (m_uint16_t *)eeprom_c7200_io_2fe_data, 360: sizeof(eeprom_c7200_io_2fe_data)/2, 361: }; 362: 363: /* 364: * dev_c7200_pa_2fe_tx_init() 365: * 366: * Add a C7200-IO-2FE/E port adapter into specified slot. 367: */ 368: static int dev_c7200_iocard_2fe_init(c7200_t *router,char *name,u_int pa_bay) 369: { 370: struct pa_i8254x_data *data; 371: 372: /* Allocate the private data structure for the iocard */ 373: if (!(data = malloc(sizeof(*data)))) { 374: fprintf(stderr,"%s (C7200-IO-2FE): out of memory\n",name); 375: return(-1); 376: } 377: 378: /* 2 Ethernet ports */ 379: memset(data,0,sizeof(*data)); 380: data->nr_port = 2; 381: 382: /* Set the EEPROM */ 383: c7200_pa_set_eeprom(router,pa_bay,&eeprom_c7200_io_2fe); 384: 385: /* Port Fa0/0 is on PCI Device 1 */ 386: data->port[0] = dev_i8254x_init(router->vm,name,0, 387: router->pa_bay[pa_bay].pci_map,1, 1.1.1.5 ! root 388: c7200_net_irq_for_slot_port(pa_bay,1)); 1.1.1.4 root 389: 390: /* Port Fa0/1 is on PCI Device 0 */ 391: data->port[1] = dev_i8254x_init(router->vm,name,0, 392: router->pa_bay[pa_bay].pci_map,0, 1.1.1.5 ! root 393: c7200_net_irq_for_slot_port(pa_bay,0)); ! 394: ! 395: if (!data->port[0] || !data->port[1]) { ! 396: dev_i8254x_remove(data->port[0]); ! 397: dev_i8254x_remove(data->port[1]); ! 398: free(data); ! 399: return(-1); ! 400: } 1.1.1.4 root 401: 402: /* Store device info into the router structure */ 403: return(c7200_pa_set_drvinfo(router,pa_bay,data)); 404: } 405: 406: /* C7200-IO-2FE driver */ 407: struct c7200_pa_driver dev_c7200_iocard_2fe_driver = { 408: "C7200-IO-2FE", 0, 409: dev_c7200_iocard_2fe_init, 410: dev_c7200_pa_i8254x_shutdown, 411: dev_c7200_pa_i8254x_set_nio, 412: dev_c7200_pa_i8254x_unset_nio, 413: NULL, 414: }; 415: 416: /* ====================================================================== */ 417: /* C7200-IO-GE-E */ 418: /* ====================================================================== */ 419: 420: /* 421: * C7200-IO-GE+E: C7200 IOCard with 1 GigatEthernet ports 422: * and 1 Ethernet port EEPROM. 423: */ 424: static const m_uint16_t eeprom_c7200_io_ge_e_data[] = { 425: 0x04FF, 0x4002, 0x1641, 0x0201, 0xC046, 0x0320, 0x001B, 0xCA06, 426: 0x8249, 0x138B, 0x0642, 0x4230, 0xC18B, 0x3030, 0x3030, 0x3030, 427: 0x3030, 0x0000, 0x0004, 0x0002, 0x0385, 0x1C0D, 0x7F03, 0xCB8F, 428: 0x4337, 0x3230, 0x302D, 0x492F, 0x4F2D, 0x3246, 0x452F, 0x4580, 429: 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 430: 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 431: 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 432: 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 433: }; 434: 435: static const struct cisco_eeprom eeprom_c7200_io_ge_e = { 436: "C7200-IO-GE-E", (m_uint16_t *)eeprom_c7200_io_ge_e_data, 437: sizeof(eeprom_c7200_io_ge_e_data)/2, 438: }; 439: 440: /* 441: * dev_c7200_pa_ge_e_tx_init() 442: * 443: * Add a C7200-I/O-GE+E port adapter into specified slot. 444: */ 445: static int dev_c7200_iocard_ge_e_init(c7200_t *router,char *name,u_int pa_bay) 446: { 447: struct pa_i8254x_data *data; 448: 449: /* Allocate the private data structure for the iocard */ 450: if (!(data = malloc(sizeof(*data)))) { 451: fprintf(stderr,"%s (C7200-IO-GE+E): out of memory\n",name); 452: return(-1); 453: } 454: 455: /* 2 Ethernet ports */ 456: memset(data,0,sizeof(*data)); 457: data->nr_port = 2; 458: 459: /* Set the EEPROM */ 460: c7200_pa_set_eeprom(router,pa_bay,&eeprom_c7200_io_ge_e); 461: 462: /* Port Gi0/0 is on PCI Device 1 */ 463: data->port[0] = dev_i8254x_init(router->vm,name,0, 464: router->pa_bay[pa_bay].pci_map,1, 1.1.1.5 ! root 465: c7200_net_irq_for_slot_port(pa_bay,1)); 1.1.1.4 root 466: 467: /* Port e0/0 is on PCI Device 0 */ 468: data->port[1] = dev_i8254x_init(router->vm,name,0, 469: router->pa_bay[pa_bay].pci_map,0, 1.1.1.5 ! root 470: c7200_net_irq_for_slot_port(pa_bay,0)); 1.1.1.4 root 471: 472: /* Store device info into the router structure */ 473: return(c7200_pa_set_drvinfo(router,pa_bay,data)); 474: } 475: 476: /* C7200-IO-GE-E driver */ 477: struct c7200_pa_driver dev_c7200_iocard_ge_e_driver = { 478: "C7200-IO-GE-E", 0, 479: dev_c7200_iocard_ge_e_init, 480: dev_c7200_pa_i8254x_shutdown, 481: dev_c7200_pa_i8254x_set_nio, 482: dev_c7200_pa_i8254x_unset_nio, 483: NULL, 484: }; 485: 486: /* ====================================================================== */ 1.1 root 487: /* PA-4E / PA-8E */ 488: /* ====================================================================== */ 489: 490: /* PA-4E/PA-8E data */ 491: struct pa_4e8e_data { 492: u_int nr_port; 493: struct am79c971_data *port[8]; 494: }; 495: 496: /* 497: * dev_c7200_pa_4e_init() 498: * 499: * Add a PA-4E port adapter into specified slot. 500: */ 501: static int dev_c7200_pa_4e_init(c7200_t *router,char *name,u_int pa_bay) 502: { 503: struct pa_4e8e_data *data; 504: int i; 505: 506: /* Allocate the private data structure for the PA-4E */ 507: if (!(data = malloc(sizeof(*data)))) { 508: fprintf(stderr,"%s (PA-4E): out of memory\n",name); 509: return(-1); 510: } 511: 512: /* 4 Ethernet ports */ 513: memset(data,0,sizeof(*data)); 514: data->nr_port = 4; 515: 516: /* Set the EEPROM */ 1.1.1.3 root 517: c7200_pa_set_eeprom(router,pa_bay,cisco_eeprom_find_pa("PA-4E")); 1.1 root 518: 519: /* Create the AMD Am79c971 chips */ 520: for(i=0;i<data->nr_port;i++) { 521: data->port[i] = dev_am79c971_init(router->vm,name,AM79C971_TYPE_10BASE_T, 522: router->pa_bay[pa_bay].pci_map,i, 1.1.1.5 ! root 523: c7200_net_irq_for_slot_port(pa_bay,i)); 1.1 root 524: } 525: 526: /* Store device info into the router structure */ 527: return(c7200_pa_set_drvinfo(router,pa_bay,data)); 528: } 529: 530: /* 531: * dev_c7200_pa_8e_init() 532: * 533: * Add a PA-8E port adapter into specified slot. 534: */ 535: static int dev_c7200_pa_8e_init(c7200_t *router,char *name,u_int pa_bay) 536: { 537: struct pa_4e8e_data *data; 538: int i; 539: 540: /* Allocate the private data structure for the PA-8E */ 541: if (!(data = malloc(sizeof(*data)))) { 542: fprintf(stderr,"%s (PA-8E): out of memory\n",name); 543: return(-1); 544: } 545: 546: /* 4 Ethernet ports */ 547: memset(data,0,sizeof(*data)); 548: data->nr_port = 8; 549: 550: /* Set the EEPROM */ 1.1.1.3 root 551: c7200_pa_set_eeprom(router,pa_bay,cisco_eeprom_find_pa("PA-8E")); 1.1 root 552: 553: /* Create the AMD Am79c971 chips */ 554: for(i=0;i<data->nr_port;i++) { 555: data->port[i] = dev_am79c971_init(router->vm,name,AM79C971_TYPE_10BASE_T, 556: router->pa_bay[pa_bay].pci_map,i, 1.1.1.5 ! root 557: c7200_net_irq_for_slot_port(pa_bay,i)); 1.1 root 558: } 559: 560: /* Store device info into the router structure */ 561: return(c7200_pa_set_drvinfo(router,pa_bay,data)); 562: } 563: 564: /* Remove a PA-4E/PA-8E from the specified slot */ 565: static int dev_c7200_pa_4e8e_shutdown(c7200_t *router,u_int pa_bay) 566: { 567: struct c7200_pa_bay *bay; 568: struct pa_4e8e_data *data; 569: int i; 570: 571: if (!(bay = c7200_pa_get_info(router,pa_bay))) 572: return(-1); 573: 574: data = bay->drv_info; 575: 576: /* Remove the PA EEPROM */ 577: c7200_pa_unset_eeprom(router,pa_bay); 578: 579: /* Remove the AMD Am79c971 chips */ 580: for(i=0;i<data->nr_port;i++) 581: dev_am79c971_remove(data->port[i]); 582: 583: free(data); 584: return(0); 585: } 586: 587: /* Bind a Network IO descriptor */ 588: static int dev_c7200_pa_4e8e_set_nio(c7200_t *router,u_int pa_bay, 589: u_int port_id,netio_desc_t *nio) 590: { 591: struct pa_4e8e_data *d; 592: 593: d = c7200_pa_get_drvinfo(router,pa_bay); 594: 595: if (!d || (port_id >= d->nr_port)) 596: return(-1); 597: 598: dev_am79c971_set_nio(d->port[port_id],nio); 599: return(0); 600: } 601: 602: /* Unbind a Network IO descriptor */ 603: static int dev_c7200_pa_4e8e_unset_nio(c7200_t *router,u_int pa_bay, 604: u_int port_id) 605: { 606: struct pa_4e8e_data *d; 607: 608: d = c7200_pa_get_drvinfo(router,pa_bay); 609: 610: if (!d || (port_id >= d->nr_port)) 611: return(-1); 612: 613: dev_am79c971_unset_nio(d->port[port_id]); 614: return(0); 615: } 616: 617: /* PA-4E driver */ 618: struct c7200_pa_driver dev_c7200_pa_4e_driver = { 619: "PA-4E", 1, 620: dev_c7200_pa_4e_init, 621: dev_c7200_pa_4e8e_shutdown, 622: dev_c7200_pa_4e8e_set_nio, 623: dev_c7200_pa_4e8e_unset_nio, 1.1.1.2 root 624: NULL, 1.1 root 625: }; 626: 627: /* PA-8E driver */ 628: struct c7200_pa_driver dev_c7200_pa_8e_driver = { 629: "PA-8E", 1, 630: dev_c7200_pa_8e_init, 631: dev_c7200_pa_4e8e_shutdown, 632: dev_c7200_pa_4e8e_set_nio, 633: dev_c7200_pa_4e8e_unset_nio, 1.1.1.2 root 634: NULL, 1.1 root 635: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.