/[dynamips]/upstream/dynamips-0.2.6-RC2/dev_c3600.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /upstream/dynamips-0.2.6-RC2/dev_c3600.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

upstream/dynamips-0.2.5/dev_c3600.c revision 1 by dpavlin, Sat Oct 6 16:01:44 2007 UTC upstream/dynamips-0.2.6-RC2/dev_c3600.c revision 3 by dpavlin, Sat Oct 6 16:05:34 2007 UTC
# Line 28  Line 28 
28  /* ======================================================================== */  /* ======================================================================== */
29    
30  /* Cisco 3620 mainboard EEPROM */  /* Cisco 3620 mainboard EEPROM */
31  static m_uint16_t eeprom_c3620_mainboard[64] = {  static m_uint16_t eeprom_c3620_mainboard_data[64] = {
32     0x0001, 0x0000, 0x0000, 0x0000, 0x0AFF, 0x7318, 0x5011, 0x0020,     0x0001, 0x0000, 0x0000, 0x0000, 0x0AFF, 0x7318, 0x5011, 0x0020,
33     0x0000, 0x0000, 0xA0FF, 0x9904, 0x19FF, 0xFFFF, 0xFFFF, 0x0002,     0x0000, 0x0000, 0xA0FF, 0x9904, 0x19FF, 0xFFFF, 0xFFFF, 0x0002,
34     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
# Line 39  static m_uint16_t eeprom_c3620_mainboard Line 39  static m_uint16_t eeprom_c3620_mainboard
39     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
40  };  };
41    
42    struct cisco_eeprom eeprom_c3620_mainboard = {
43       "C3620 Mainboard",
44       eeprom_c3620_mainboard_data,
45       sizeof(eeprom_c3620_mainboard_data)/2,
46    };
47    
48  /* Cisco 3640 mainboard EEPROM */  /* Cisco 3640 mainboard EEPROM */
49  static m_uint16_t eeprom_c3640_mainboard[64] = {  static m_uint16_t eeprom_c3640_mainboard_data[64] = {
50     0x0001, 0x0000, 0x0000, 0x0000, 0x0AFF, 0x7316, 0x8514, 0x0040,     0x0001, 0x0000, 0x0000, 0x0000, 0x0AFF, 0x7316, 0x8514, 0x0040,
51     0x0000, 0x0000, 0xA1FF, 0x0102, 0x22FF, 0xFFFF, 0xFFFF, 0x0002,     0x0000, 0x0000, 0xA1FF, 0x0102, 0x22FF, 0xFFFF, 0xFFFF, 0x0002,
52     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
# Line 51  static m_uint16_t eeprom_c3640_mainboard Line 57  static m_uint16_t eeprom_c3640_mainboard
57     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
58  };  };
59    
60    struct cisco_eeprom eeprom_c3640_mainboard = {
61       "C3640 Mainboard",
62       eeprom_c3640_mainboard_data,
63       sizeof(eeprom_c3640_mainboard_data)/2,
64    };
65    
66  /* Cisco 3660 backplane EEPROM */  /* Cisco 3660 backplane EEPROM */
67  static m_uint16_t eeprom_c3660_backplane[64] = {  static m_uint16_t eeprom_c3660_backplane_data[64] = {
68     0x04FF, 0x4000, 0xC841, 0x0100, 0xC046, 0x0320, 0x0012, 0x8402,     0x04FF, 0x4000, 0xC841, 0x0100, 0xC046, 0x0320, 0x0012, 0x8402,
69     0x4243, 0x3080, 0x0000, 0x0000, 0x0202, 0xC18B, 0x4841, 0x4430,     0x4243, 0x3080, 0x0000, 0x0000, 0x0202, 0xC18B, 0x4841, 0x4430,
70     0x3434, 0x3431, 0x3135, 0x4A03, 0x0081, 0x0000, 0x0000, 0x0400,     0x3434, 0x3431, 0x3135, 0x4A03, 0x0081, 0x0000, 0x0000, 0x0400,
# Line 63  static m_uint16_t eeprom_c3660_backplane Line 75  static m_uint16_t eeprom_c3660_backplane
75     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,     0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
76  };  };
77    
78    struct cisco_eeprom eeprom_c3660_backplane = {
79       "C3660 Backplane",
80       eeprom_c3660_backplane_data,
81       sizeof(eeprom_c3660_backplane_data)/2,
82    };
83    
84  /* ======================================================================== */  /* ======================================================================== */
85  /* Chassis Drivers                                                          */  /* Chassis Drivers                                                          */
86  /* ======================================================================== */  /* ======================================================================== */
# Line 71  static int c3640_init(c3600_t *router); Line 89  static int c3640_init(c3600_t *router);
89  static int c3660_init(c3600_t *router);  static int c3660_init(c3600_t *router);
90    
91  static struct c3600_chassis_driver chassis_drivers[] = {  static struct c3600_chassis_driver chassis_drivers[] = {
92     { "3620"  , 3620, 1, c3620_init,     { "3620"  , 3620, 1, c3620_init, &eeprom_c3620_mainboard },
93       eeprom_c3620_mainboard, sizeof(eeprom_c3620_mainboard)/2 },     { "3640"  , 3640, 1, c3640_init, &eeprom_c3640_mainboard },
94     { "3640"  , 3640, 1, c3640_init,     { "3660"  , 3660, 1, c3660_init, &eeprom_c3660_backplane },
95       eeprom_c3640_mainboard, sizeof(eeprom_c3640_mainboard)/2 },     { NULL    , -1,   0, NULL,       NULL },
    { "3660"  , 3660, 1, c3660_init,  
      eeprom_c3660_backplane, sizeof(eeprom_c3660_backplane)/2 },  
   
    { NULL    , -1, 0, NULL },  
96  };  };
97    
98  /* ======================================================================== */  /* ======================================================================== */
# Line 90  static struct c3600_nm_driver *nm_driver Line 104  static struct c3600_nm_driver *nm_driver
104     &dev_c3600_nm_1fe_tx_driver,     &dev_c3600_nm_1fe_tx_driver,
105     &dev_c3600_nm_4t_driver,     &dev_c3600_nm_4t_driver,
106     &dev_c3600_leopard_2fe_driver,     &dev_c3600_leopard_2fe_driver,
107       &dev_c3600_nm_16esw_driver,
108     NULL,     NULL,
109  };  };
110    
# Line 101  static struct c3600_nm_driver *nm_driver Line 116  static struct c3600_nm_driver *nm_driver
116  ssize_t c3600_nvram_extract_config(vm_instance_t *vm,char **buffer)  ssize_t c3600_nvram_extract_config(vm_instance_t *vm,char **buffer)
117  {    {  
118     struct vdevice *nvram_dev;     struct vdevice *nvram_dev;
119     m_uint32_t start,end,clen,nvlen;     m_uint32_t start,nvlen;
120     m_uint16_t magic1,magic2;     m_uint16_t magic1,magic2;
121     m_uint64_t addr;     m_uint64_t addr;
122    
# Line 119  ssize_t c3600_nvram_extract_config(vm_in Line 134  ssize_t c3600_nvram_extract_config(vm_in
134     }     }
135    
136     start = physmem_copy_u32_from_vm(vm,addr+0x10) + 1;     start = physmem_copy_u32_from_vm(vm,addr+0x10) + 1;
    end   = physmem_copy_u32_from_vm(vm,addr+0x14);  
137     nvlen = physmem_copy_u32_from_vm(vm,addr+0x18);     nvlen = physmem_copy_u32_from_vm(vm,addr+0x18);
    clen  = end - start;  
138    
139     if ((clen + 1) != nvlen) {     if (nvlen <= 10) {
140        vm_error(vm,"invalid configuration size (0x%x)\n",nvlen);        vm_error(vm,"invalid configuration size (0x%x)\n",nvlen);
141        return(-1);        return(-1);
142     }     }
143    
144     if (!(*buffer = malloc(clen+1))) {     if (!(*buffer = malloc(nvlen+1))) {
145        vm_error(vm,"unable to allocate config buffer (%u bytes)\n",clen);        vm_error(vm,"unable to allocate config buffer (%u bytes)\n",nvlen);
146        return(-1);        return(-1);
147     }     }
148    
149     physmem_copy_from_vm(vm,*buffer,addr+start+0x08,clen);     physmem_copy_from_vm(vm,*buffer,addr+start+0x08,nvlen-1);
150     (*buffer)[clen] = 0;     (*buffer)[nvlen-1] = 0;
151     return(clen);     return(nvlen-1);
152  }  }
153    
 /* Compute NVRAM checksum */  
 static u_int16_t nvram_cksum(vm_instance_t *vm,m_uint64_t addr,size_t count)  
 {  
    m_uint32_t sum = 0;  
   
    while(count > 1) {  
       sum = sum + physmem_copy_u16_from_vm(vm,addr);  
       addr += sizeof(m_uint16_t);  
       count -= sizeof(m_uint16_t);  
    }  
   
    if (count > 0)  
       sum = sum + ((physmem_copy_u16_from_vm(vm,addr) & 0xFF) << 8);  
   
    while(sum>>16)  
       sum = (sum & 0xffff) + (sum >> 16);  
   
    return(~sum);  
 }  
   
   
154  /* Directly push the IOS configuration to the NVRAM device */  /* Directly push the IOS configuration to the NVRAM device */
155  int c3600_nvram_push_config(vm_instance_t *vm,char *buffer,size_t len)  int c3600_nvram_push_config(vm_instance_t *vm,char *buffer,size_t len)
156  {  {
# Line 173  int c3600_nvram_push_config(vm_instance_ Line 165  int c3600_nvram_push_config(vm_instance_
165    
166     addr = nvram_dev->phys_addr + vm->nvram_rom_space;     addr = nvram_dev->phys_addr + vm->nvram_rom_space;
167     cfg_offset = 0x2c;     cfg_offset = 0x2c;
168     cfg_addr   = addr + cfg_offset;;     cfg_addr   = addr + cfg_offset;
169    
170     /* Write IOS tag, uncompressed config... */     /* Write IOS tag, uncompressed config... */
171     physmem_copy_u16_to_vm(vm,addr+0x06,0xF0A5);     physmem_copy_u16_to_vm(vm,addr+0x06,0xF0A5);
# Line 252  static int c3600_free_instance(void *dat Line 244  static int c3600_free_instance(void *dat
244        /* Shutdown all Network Modules */        /* Shutdown all Network Modules */
245        c3600_nm_shutdown_all(router);        c3600_nm_shutdown_all(router);
246    
247          /* Free mainboard EEPROM */
248          cisco_eeprom_free(&router->mb_eeprom);
249    
250        /* Free all resources used by VM */        /* Free all resources used by VM */
251        vm_free(vm);        vm_free(vm);
252    
# Line 329  void c3600_save_config_all(FILE *fd) Line 324  void c3600_save_config_all(FILE *fd)
324    
325  /* Set NM EEPROM definition */  /* Set NM EEPROM definition */
326  int c3600_nm_set_eeprom(c3600_t *router,u_int nm_bay,  int c3600_nm_set_eeprom(c3600_t *router,u_int nm_bay,
327                          const struct c3600_eeprom *eeprom)                          const struct cisco_eeprom *eeprom)
328  {  {
329     if (nm_bay >= C3600_MAX_NM_BAYS) {     if (nm_bay >= C3600_MAX_NM_BAYS) {
330        vm_error(router->vm,"c3600_nm_set_eeprom: invalid NM Bay %u.\n",nm_bay);        vm_error(router->vm,"c3600_nm_set_eeprom: invalid NM Bay %u.\n",nm_bay);
331        return(-1);        return(-1);
332     }     }
333        
334     /* 3620/3640 */     if (cisco_eeprom_copy(&router->nm_bay[nm_bay].eeprom,eeprom) == -1) {
335     router->nm_bay[nm_bay].eeprom_data = eeprom->data;        vm_error(router->vm,"c3600_nm_set_eeprom: no memory.\n");
336     router->nm_bay[nm_bay].eeprom_data_len = eeprom->len;        return(-1);
337       }
338     /* 3660 */    
    router->c3660_nm_eeprom_def[nm_bay].data = eeprom->data;  
    router->c3660_nm_eeprom_def[nm_bay].data_len = eeprom->len;  
339     return(0);     return(0);
340  }  }
341    
# Line 354  int c3600_nm_unset_eeprom(c3600_t *route Line 347  int c3600_nm_unset_eeprom(c3600_t *route
347        return(-1);        return(-1);
348     }     }
349        
350     /* 3620/3640 */     cisco_eeprom_free(&router->nm_bay[nm_bay].eeprom);
    router->nm_bay[nm_bay].eeprom_data = NULL;  
    router->nm_bay[nm_bay].eeprom_data_len = 0;  
   
    /* 3660 */  
    router->c3660_nm_eeprom_def[nm_bay].data = NULL;  
    router->c3660_nm_eeprom_def[nm_bay].data_len = 0;  
351     return(0);     return(0);
352  }  }
353    
# Line 370  int c3600_nm_check_eeprom(c3600_t *route Line 357  int c3600_nm_check_eeprom(c3600_t *route
357     if (nm_bay >= C3600_MAX_NM_BAYS)     if (nm_bay >= C3600_MAX_NM_BAYS)
358        return(FALSE);        return(FALSE);
359    
360     return((router->nm_bay[nm_bay].eeprom_data != NULL) ? TRUE : FALSE);     return(cisco_eeprom_valid(&router->nm_bay[nm_bay].eeprom));
361  }  }
362    
363  /* Get bay info */  /* Get bay info */
# Line 745  int c3600_nm_shutdown_all(c3600_t *route Line 732  int c3600_nm_shutdown_all(c3600_t *route
732     return(0);     return(0);
733  }  }
734    
735    /* Show info about all NMs */
736    int c3600_nm_show_all_info(c3600_t *router)
737    {
738       struct c3600_nm_bay *bay;
739       int i;
740    
741       for(i=0;i<C3600_MAX_NM_BAYS;i++) {
742          if (!(bay = c3600_nm_get_info(router,i)) || !bay->nm_driver)
743             continue;
744    
745          if (bay->nm_driver->nm_show_info != NULL)
746             bay->nm_driver->nm_show_info(router,i);
747       }
748    
749       return(0);
750    }
751    
752  /* Maximum number of tokens in a NM description */  /* Maximum number of tokens in a NM description */
753  #define NM_DESC_MAX_TOKENS  8  #define NM_DESC_MAX_TOKENS  8
754    
# Line 953  struct c3600_chassis_driver *c3600_chass Line 957  struct c3600_chassis_driver *c3600_chass
957  }  }
958    
959  /* Set the base MAC address of the chassis */  /* Set the base MAC address of the chassis */
960  static int c3600_burn_mac_addr(m_uint16_t *data,size_t data_len,  static int c3600_burn_mac_addr(c3600_t *router,n_eth_addr_t *addr)
                                n_eth_addr_t *addr)  
961  {  {
962     m_uint8_t eeprom_ver;     m_uint8_t eeprom_ver;
963     size_t offset;     size_t offset;
964    
965     /* Read EEPROM format version */     /* Read EEPROM format version */
966     cisco_eeprom_get_byte(data,data_len,0,&eeprom_ver);     cisco_eeprom_get_byte(&router->mb_eeprom,0,&eeprom_ver);
967    
968     switch(eeprom_ver) {     switch(eeprom_ver) {
969        case 0:        case 0:
970           cisco_eeprom_set_region(data,data_len,2,addr->eth_addr_byte,6);           cisco_eeprom_set_region(&router->mb_eeprom,2,addr->eth_addr_byte,6);
971           break;           break;
972    
973        case 4:        case 4:
974           if (!cisco_eeprom_v4_find_field(data,data_len,0xC3,&offset)) {           if (!cisco_eeprom_v4_find_field(&router->mb_eeprom,0xC3,&offset)) {
975              cisco_eeprom_set_region(data,data_len,offset,              cisco_eeprom_set_region(&router->mb_eeprom,offset,
976                                      addr->eth_addr_byte,6);                                      addr->eth_addr_byte,6);
977           }           }
978           break;           break;
979    
980        default:        default:
981           fprintf(stderr,"c3600_burn_mac_addr: unable to handle "           vm_error(router->vm,"c3600_burn_mac_addr: unable to handle "
982                   "EEPROM version %u\n",eeprom_ver);                    "EEPROM version %u\n",eeprom_ver);
983           return(-1);           return(-1);
984     }     }
985    
# Line 992  int c3600_chassis_set_mac_addr(c3600_t * Line 995  int c3600_chassis_set_mac_addr(c3600_t *
995     }     }
996    
997     /* Set the chassis base MAC address */     /* Set the chassis base MAC address */
998     c3600_burn_mac_addr(router->mb_eeprom_data,sizeof(router->mb_eeprom_data),     c3600_burn_mac_addr(router,&router->mac_addr);
                        &router->mac_addr);  
999     return(0);     return(0);
1000  }  }
1001    
# Line 1015  int c3600_chassis_set_type(c3600_t *rout Line 1017  int c3600_chassis_set_type(c3600_t *rout
1017     router->chassis_driver = driver;     router->chassis_driver = driver;
1018    
1019     /* Copy the mainboard EEPROM */     /* Copy the mainboard EEPROM */
1020     memcpy(router->mb_eeprom_data,driver->mb_eeprom,driver->mb_eeprom_len << 1);     if (cisco_eeprom_copy(&router->mb_eeprom,driver->eeprom) == -1) {
1021          vm_error(router->vm,"unable to set chassis EEPROM '%s'.\n",chassis_type);
1022          return(-1);
1023       }
1024    
1025     /* Set the chassis base MAC address */     /* Set the chassis base MAC address */
1026     c3600_burn_mac_addr(router->mb_eeprom_data,sizeof(router->mb_eeprom_data),     c3600_burn_mac_addr(router,&router->mac_addr);
                        &router->mac_addr);  
   
    router->mb_eeprom.data = router->mb_eeprom_data;  
    router->mb_eeprom.data_len = driver->mb_eeprom_len;  
1027     return(0);     return(0);
1028  }  }
1029    
# Line 1315  int c3600_init_platform(c3600_t *router) Line 1316  int c3600_init_platform(c3600_t *router)
1316     }     }
1317    
1318     /* Initialize the NS16552 DUART */     /* Initialize the NS16552 DUART */
1319     dev_ns16552_init(vm,C3600_DUART_ADDR,0x1000,C3600_DUART_IRQ,     dev_ns16552_init(vm,C3600_DUART_ADDR,0x1000,3,C3600_DUART_IRQ,
1320                      vm->vtty_con,vm->vtty_aux);                      vm->vtty_con,vm->vtty_aux);
1321    
1322     /* Cirrus Logic PD6729 (PCI-to-PCMCIA host adapter) */     /* Cirrus Logic PD6729 (PCI-to-PCMCIA host adapter) */
# Line 1380  int c3600_boot_ios(c3600_t *router) Line 1381  int c3600_boot_ios(c3600_t *router)
1381     vm_log(vm,"C3600_BOOT",     vm_log(vm,"C3600_BOOT",
1382            "starting instance (CPU0 PC=0x%llx,idle_pc=0x%llx,JIT %s)\n",            "starting instance (CPU0 PC=0x%llx,idle_pc=0x%llx,JIT %s)\n",
1383            vm->boot_cpu->pc,vm->boot_cpu->idle_pc,vm->jit_use ? "on":"off");            vm->boot_cpu->pc,vm->boot_cpu->idle_pc,vm->jit_use ? "on":"off");
1384      
1385     /* Start main CPU */     /* Start main CPU */
1386     vm->status = VM_STATUS_RUNNING;     vm->status = VM_STATUS_RUNNING;
1387     cpu_start(vm->boot_cpu);     cpu_start(vm->boot_cpu);

Legend:
Removed from v.1  
changed lines
  Added in v.3

  ViewVC Help
Powered by ViewVC 1.1.26