/[dynamips]/upstream/dynamips-0.2.6-RC3/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-RC3/dev_c3600.c

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

upstream/dynamips-0.2.6-RC1/dev_c3600.c revision 2 by dpavlin, Sat Oct 6 16:03:58 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 102  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 120  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    
154  /* Directly push the IOS configuration to the NVRAM device */  /* Directly push the IOS configuration to the NVRAM device */
# Line 232  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 309  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 334  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 350  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 950  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 989  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 1012  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    

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

  ViewVC Help
Powered by ViewVC 1.1.26