/[dynamips]/upstream/dynamips-0.2.8-RC1/dev_c3725_eth.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.8-RC1/dev_c3725_eth.c

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

upstream/dynamips-0.2.7/dev_c3725_eth.c revision 10 by dpavlin, Sat Oct 6 16:29:14 2007 UTC upstream/dynamips-0.2.8-RC1/dev_c3725_eth.c revision 11 by dpavlin, Sat Oct 6 16:33:40 2007 UTC
# Line 29  struct nm_eth_data { Line 29  struct nm_eth_data {
29     struct am79c971_data *port[8];     struct am79c971_data *port[8];
30  };  };
31    
32    /* Return sub-slot info for integrated WIC slots (on motherboard) */
33    static int dev_c3725_mb_get_sub_info(vm_instance_t *vm,struct cisco_card *card,
34                                         u_int port_id,
35                                         struct cisco_card_driver ***drv_array,
36                                         u_int *subcard_type)
37    {
38       /* 3 integrated WIC slots */
39       if ((port_id & 0x0F) >= 3)
40          return(-1);
41    
42       *drv_array = dev_c3725_mb_wic_drivers;
43       *subcard_type = CISCO_CARD_TYPE_WIC;
44       return(0);
45    }
46    
47  /*  /*
48   * dev_c3725_nm_eth_init()   * dev_c3725_nm_eth_init()
49   *   *
50   * Add an Ethernet Network Module into specified slot.   * Add an Ethernet Network Module into specified slot.
51   */   */
52  static int dev_c3725_nm_eth_init(c3725_t *router,char *name,u_int nm_bay,  static int dev_c3725_nm_eth_init(vm_instance_t *vm,struct cisco_card *card,
53                                   int nr_port,int interface_type,                                   int nr_port,int interface_type,
54                                   const struct cisco_eeprom *eeprom)                                   const struct cisco_eeprom *eeprom)
55  {  {
56     struct nm_eth_data *data;     struct nm_eth_data *data;
57       u_int slot = card->slot_id;
58     int i;     int i;
59    
60     /* Allocate the private data structure */     /* Allocate the private data structure */
61     if (!(data = malloc(sizeof(*data)))) {     if (!(data = malloc(sizeof(*data)))) {
62        fprintf(stderr,"%s: out of memory\n",name);        vm_error(vm,"%s: out of memory.\n",card->dev_name);
63        return(-1);        return(-1);
64     }     }
65    
66     memset(data,0,sizeof(*data));     memset(data,0,sizeof(*data));
67     data->nr_port = nr_port;     data->nr_port = nr_port;
68    
69       /* Set the PCI bus */
70       card->pci_bus = vm->slots_pci_bus[slot];
71    
72     /* Set the EEPROM */     /* Set the EEPROM */
73     c3725_nm_set_eeprom(router,nm_bay,eeprom);     cisco_card_set_eeprom(vm,card,eeprom);
74       c3725_set_slot_eeprom(VM_C3725(vm),slot,&card->eeprom);
75    
76     /* Create the AMD Am971c971 chip(s) */     /* Create the AMD Am971c971 chip(s) */
77     for(i=0;i<data->nr_port;i++) {     for(i=0;i<data->nr_port;i++) {
78        data->port[i] = dev_am79c971_init(router->vm,name,interface_type,        data->port[i] = dev_am79c971_init(vm,card->dev_name,interface_type,
79                                          router->nm_bay[nm_bay].pci_map,                                          card->pci_bus,
80                                          c3725_nm_get_pci_device(nm_bay),                                          c3725_nm_get_pci_device(slot),
81                                          c3725_net_irq_for_slot_port(nm_bay,i));                                          c3725_net_irq_for_slot_port(slot,i));
82     }     }
83    
84     /* Store device info into the router structure */     /* Store device info into the router structure */
85     return(c3725_nm_set_drvinfo(router,nm_bay,data));     card->drv_info = data;
86       return(0);
87  }  }
88    
89  /* Remove an Ethernet NM from the specified slot */  /* Remove an Ethernet NM from the specified slot */
90  static int dev_c3725_nm_eth_shutdown(c3725_t *router,u_int nm_bay)  static int dev_c3725_nm_eth_shutdown(vm_instance_t *vm,struct cisco_card *card)
91  {  {
92     struct c3725_nm_bay *bay;     struct nm_eth_data *data = card->drv_info;
    struct nm_eth_data *data;  
93     int i;     int i;
94    
    if (!(bay = c3725_nm_get_info(router,nm_bay)))  
       return(-1);  
   
    data = bay->drv_info;  
   
95     /* Remove the NM EEPROM */     /* Remove the NM EEPROM */
96     c3725_nm_unset_eeprom(router,nm_bay);     cisco_card_unset_eeprom(card);
97       c3725_set_slot_eeprom(VM_C3725(vm),card->slot_id,NULL);
98    
99     /* Remove the AMD Am79c971 chips */     /* Remove the AMD Am79c971 chips */
100     for(i=0;i<data->nr_port;i++)     for(i=0;i<data->nr_port;i++)
# Line 88  static int dev_c3725_nm_eth_shutdown(c37 Line 104  static int dev_c3725_nm_eth_shutdown(c37
104     return(0);     return(0);
105  }  }
106    
107  /* Bind a Network IO descriptor */  static int dev_c3725_nm_eth_set_nio(vm_instance_t *vm,struct cisco_card *card,
 static int dev_c3725_nm_eth_set_nio(c3725_t *router,u_int nm_bay,  
108                                      u_int port_id,netio_desc_t *nio)                                      u_int port_id,netio_desc_t *nio)
109  {  {
110     struct nm_eth_data *d;     struct nm_eth_data *d = card->drv_info;
   
    d = c3725_nm_get_drvinfo(router,nm_bay);  
111    
112     if (!d || (port_id >= d->nr_port))     if (!d || (port_id >= d->nr_port))
113        return(-1);        return(-1);
# Line 104  static int dev_c3725_nm_eth_set_nio(c372 Line 117  static int dev_c3725_nm_eth_set_nio(c372
117  }  }
118    
119  /* Unbind a Network IO descriptor */  /* Unbind a Network IO descriptor */
120  static int dev_c3725_nm_eth_unset_nio(c3725_t *router,u_int nm_bay,  static int dev_c3725_nm_eth_unset_nio(vm_instance_t *vm,
121                                          struct cisco_card *card,
122                                        u_int port_id)                                        u_int port_id)
123  {  {
124     struct nm_eth_data *d;     struct nm_eth_data *d = card->drv_info;
   
    d = c3725_nm_get_drvinfo(router,nm_bay);  
125    
126     if (!d || (port_id >= d->nr_port))     if (!d || (port_id >= d->nr_port))
127        return(-1);        return(-1);
# Line 127  static int dev_c3725_nm_eth_unset_nio(c3 Line 139  static int dev_c3725_nm_eth_unset_nio(c3
139   *   *
140   * Add a NM-1FE-TX Network Module into specified slot.   * Add a NM-1FE-TX Network Module into specified slot.
141   */   */
142  static int dev_c3725_nm_1fe_tx_init(c3725_t *router,char *name,u_int nm_bay)  static int dev_c3725_nm_1fe_tx_init(vm_instance_t *vm,struct cisco_card *card)
143  {  {
144     return(dev_c3725_nm_eth_init(router,name,nm_bay,1,AM79C971_TYPE_100BASE_TX,     return(dev_c3725_nm_eth_init(vm,card,1,AM79C971_TYPE_100BASE_TX,
145                                  cisco_eeprom_find_nm("NM-1FE-TX")));                                  cisco_eeprom_find_nm("NM-1FE-TX")));
146  }  }
147    
# Line 138  static int dev_c3725_nm_1fe_tx_init(c372 Line 150  static int dev_c3725_nm_1fe_tx_init(c372
150  /* ====================================================================== */  /* ====================================================================== */
151    
152  /* Add a NM-16ESW */  /* Add a NM-16ESW */
153  static int dev_c3725_nm_16esw_init(c3725_t *router,char *name,u_int nm_bay)  static int dev_c3725_nm_16esw_init(vm_instance_t *vm,struct cisco_card *card)
154  {  {
155     struct nm_16esw_data *data;     struct nm_16esw_data *data;
156       u_int slot = card->slot_id;
157    
158       /* Set the PCI bus */
159       card->pci_bus = vm->slots_pci_bus[slot];
160    
161     /* Set the EEPROM */     /* Set the EEPROM */
162     c3725_nm_set_eeprom(router,nm_bay,cisco_eeprom_find_nm("NM-16ESW"));     cisco_card_set_eeprom(vm,card,cisco_eeprom_find_nm("NM-16ESW"));
163     dev_nm_16esw_burn_mac_addr(router->vm,nm_bay,     dev_nm_16esw_burn_mac_addr(vm,slot,&card->eeprom);
164                                &router->nm_bay[nm_bay].eeprom);     c3725_set_slot_eeprom(VM_C3725(vm),slot,&card->eeprom);
165    
166     /* Create the device */     /* Create the device */
167     data = dev_nm_16esw_init(router->vm,name,nm_bay,     data = dev_nm_16esw_init(vm,card->dev_name,slot,
168                              router->nm_bay[nm_bay].pci_map,                              card->pci_bus,c3725_nm_get_pci_device(slot),
169                              c3725_nm_get_pci_device(nm_bay),                              c3725_net_irq_for_slot_port(slot,0));
                             c3725_net_irq_for_slot_port(nm_bay,0));  
170    
171     /* Store device info into the router structure */     /* Store device info into the router structure */
172     return(c3725_nm_set_drvinfo(router,nm_bay,data));     card->drv_info = data;
173       return(0);
174  }  }
175    
176  /* Remove a NM-16ESW from the specified slot */  /* Remove a NM-16ESW from the specified slot */
177  static int dev_c3725_nm_16esw_shutdown(c3725_t *router,u_int nm_bay)  static int
178    dev_c3725_nm_16esw_shutdown(vm_instance_t *vm,struct cisco_card *card)
179  {  {
180     struct c3725_nm_bay *bay;     struct nm_16esw_data *data = card->drv_info;
    struct nm_16esw_data *data;  
   
    if (!(bay = c3725_nm_get_info(router,nm_bay)))  
       return(-1);  
   
    data = bay->drv_info;  
181    
182     /* Remove the NM EEPROM */     /* Remove the NM EEPROM */
183     c3725_nm_unset_eeprom(router,nm_bay);     cisco_card_unset_eeprom(card);
184       c3725_set_slot_eeprom(VM_C3725(vm),card->slot_id,NULL);
185    
186     /* Remove the BCM5600 chip */     /* Remove the BCM5600 chip */
187     dev_nm_16esw_remove(data);     dev_nm_16esw_remove(data);
# Line 177  static int dev_c3725_nm_16esw_shutdown(c Line 189  static int dev_c3725_nm_16esw_shutdown(c
189  }  }
190    
191  /* Bind a Network IO descriptor */  /* Bind a Network IO descriptor */
192  static int dev_c3725_nm_16esw_set_nio(c3725_t *router,u_int nm_bay,  static int
193                                        u_int port_id,netio_desc_t *nio)  dev_c3725_nm_16esw_set_nio(vm_instance_t *vm,struct cisco_card *card,
194                               u_int port_id,netio_desc_t *nio)
195  {  {
196     struct nm_16esw_data *d;     struct nm_16esw_data *d = card->drv_info;
   
    d = c3725_nm_get_drvinfo(router,nm_bay);  
197     dev_nm_16esw_set_nio(d,port_id,nio);     dev_nm_16esw_set_nio(d,port_id,nio);
198     return(0);     return(0);
199  }  }
200    
201  /* Unbind a Network IO descriptor */  /* Unbind a Network IO descriptor */
202  static int dev_c3725_nm_16esw_unset_nio(c3725_t *router,u_int nm_bay,  static int dev_c3725_nm_16esw_unset_nio(vm_instance_t *vm,
203                                            struct cisco_card *card,
204                                          u_int port_id)                                          u_int port_id)
205  {  {
206     struct nm_16esw_data *d;     struct nm_16esw_data *d = card->drv_info;
   
    d = c3725_nm_get_drvinfo(router,nm_bay);  
207     dev_nm_16esw_unset_nio(d,port_id);     dev_nm_16esw_unset_nio(d,port_id);
208     return(0);     return(0);
209  }  }
210    
211  /* Show debug info */  /* Show debug info */
212  static int dev_c3725_nm_16esw_show_info(c3725_t *router,u_int nm_bay)  static int
213    dev_c3725_nm_16esw_show_info(vm_instance_t *vm,struct cisco_card *card)
214  {  {
215     struct nm_16esw_data *d;     struct nm_16esw_data *d = card->drv_info;
   
    d = c3725_nm_get_drvinfo(router,nm_bay);  
216     dev_nm_16esw_show_info(d);     dev_nm_16esw_show_info(d);
217     return(0);     return(0);
218  }  }
219    
220    
221  /* ====================================================================== */  /* ====================================================================== */
222  /* GT96100 - Integrated Ethernet ports                                    */  /* GT96100 - Integrated Ethernet ports                                    */
223  /* ====================================================================== */  /* ====================================================================== */
224    
225  /* Initialize Ethernet part of the GT96100 controller */  /* Initialize Ethernet part of the GT96100 controller */
226  static int dev_c3725_gt96100_fe_init(c3725_t *router,char *name,u_int nm_bay)  static int dev_c3725_gt96100_fe_init(vm_instance_t *vm,struct cisco_card *card)
227  {  {
228     vm_obj_t *obj;     if (card->slot_id != 0) {
229          vm_error(vm,"dev_c3725_gt96100_fe_init: bad slot %u specified.\n",
230     if (nm_bay != 0) {                 card->slot_id);
       fprintf(stderr,"dev_c3725_gt96100_fe_init: bad slot specified.\n");  
       return(-1);  
    }  
   
    if (!(obj = vm_object_find(router->vm,"gt96100"))) {  
       fprintf(stderr,"dev_c3725_gt96100_fe_init: unable to find "  
               "system controller!\n");  
231        return(-1);        return(-1);
232     }     }
233    
234     /* Store device info into the router structure */     /* Store device info into the router structure */
235     return(c3725_nm_set_drvinfo(router,0,obj->data));     card->drv_info = VM_C3725(vm)->gt_data;
236       return(0);
237  }  }
238    
239  /* Nothing to do, we never remove the system controller */  /* Nothing to do, we never remove the system controller */
240  static int dev_c3725_gt96100_fe_shutdown(c3725_t *router,u_int nm_bay)  static int
241    dev_c3725_gt96100_fe_shutdown(vm_instance_t *vm,struct cisco_card *card)
242  {    {  
243     return(0);     return(0);
244  }  }
245    
246  /* Bind a Network IO descriptor */  /* Bind a Network IO descriptor */
247  static int dev_c3725_gt96100_fe_set_nio(c3725_t *router,u_int nm_bay,  static int
248                                          u_int port_id,netio_desc_t *nio)  dev_c3725_gt96100_fe_set_nio(vm_instance_t *vm,struct cisco_card *card,
249                                 u_int port_id,netio_desc_t *nio)
250  {  {
251     struct gt_data *d;     struct gt_data *d = card->drv_info;
252       dev_gt96100_eth_set_nio(d,port_id,nio);
    if (!(d = c3725_nm_get_drvinfo(router,nm_bay)))  
       return(-1);  
   
    dev_gt96100_set_nio(d,port_id,nio);  
253     return(0);     return(0);
254  }  }
255    
256  /* Unbind a Network IO descriptor */  /* Unbind a Network IO descriptor */
257  static int dev_c3725_gt96100_fe_unset_nio(c3725_t *router,u_int nm_bay,  static int dev_c3725_gt96100_fe_unset_nio(vm_instance_t *vm,
258                                          u_int port_id)                                            struct cisco_card *card,
259                                              u_int port_id)
260  {  {
261     struct gt_data *d;     struct gt_data *d = card->drv_info;
262       dev_gt96100_eth_unset_nio(d,port_id);
263     if (!(d = c3725_nm_get_drvinfo(router,nm_bay)))     return(0);
264        return(-1);  }
265    
266     dev_gt96100_unset_nio(d,port_id);  /* Show debug info */
267    static int
268    dev_c3725_gt96100_show_info(vm_instance_t *vm,struct cisco_card *card)
269    {
270       struct gt_data *d = card->drv_info;
271       dev_gt96100_show_info(d);
272     return(0);     return(0);
273  }  }
274    
275  /* ====================================================================== */  /* ====================================================================== */
276    
277  /* NM-1FE-TX driver */  /* NM-1FE-TX driver */
278  struct c3725_nm_driver dev_c3725_nm_1fe_tx_driver = {  struct cisco_card_driver dev_c3725_nm_1fe_tx_driver = {
279     "NM-1FE-TX", 1, 0,     "NM-1FE-TX", 1, 0,
280     dev_c3725_nm_1fe_tx_init,     dev_c3725_nm_1fe_tx_init,
281     dev_c3725_nm_eth_shutdown,     dev_c3725_nm_eth_shutdown,
282       NULL,
283     dev_c3725_nm_eth_set_nio,     dev_c3725_nm_eth_set_nio,
284     dev_c3725_nm_eth_unset_nio,     dev_c3725_nm_eth_unset_nio,
285     NULL,     NULL,
286  };  };
287    
288  /* NM-16ESW driver */  /* NM-16ESW driver */
289  struct c3725_nm_driver dev_c3725_nm_16esw_driver = {  struct cisco_card_driver dev_c3725_nm_16esw_driver = {
290     "NM-16ESW", 1, 0,     "NM-16ESW", 1, 0,
291     dev_c3725_nm_16esw_init,     dev_c3725_nm_16esw_init,
292     dev_c3725_nm_16esw_shutdown,     dev_c3725_nm_16esw_shutdown,
293       NULL,
294     dev_c3725_nm_16esw_set_nio,     dev_c3725_nm_16esw_set_nio,
295     dev_c3725_nm_16esw_unset_nio,     dev_c3725_nm_16esw_unset_nio,
296     dev_c3725_nm_16esw_show_info,     dev_c3725_nm_16esw_show_info,
297  };  };
298    
299  /* GT96100 FastEthernet integrated ports */  /* GT96100 FastEthernet integrated ports */
300  struct c3725_nm_driver dev_c3725_gt96100_fe_driver = {  struct cisco_card_driver dev_c3725_gt96100_fe_driver = {
301     "GT96100-FE", 1, 0,     "GT96100-FE", 1, 0,
302     dev_c3725_gt96100_fe_init,     dev_c3725_gt96100_fe_init,
303     dev_c3725_gt96100_fe_shutdown,     dev_c3725_gt96100_fe_shutdown,
304       dev_c3725_mb_get_sub_info,
305     dev_c3725_gt96100_fe_set_nio,     dev_c3725_gt96100_fe_set_nio,
306     dev_c3725_gt96100_fe_unset_nio,     dev_c3725_gt96100_fe_unset_nio,
307     NULL,     dev_c3725_gt96100_show_info,
308  };  };

Legend:
Removed from v.10  
changed lines
  Added in v.11

  ViewVC Help
Powered by ViewVC 1.1.26