Commit cb457d7679840b95de361c42921e601bd224ecf5
1 parent
0ae18cee
Make pci_nic_init() use qemu_setup_nic_model() (Mark McLoughlin)
Add a table of PCI NIC models to pass to qemu_setup_nic_model(). While we're at it, also add a corresponding table of NIC init functions. Signed-off-by: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6287 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
12 changed files
with
65 additions
and
89 deletions
hw/mips_malta.c
... | ... | @@ -487,19 +487,16 @@ static void audio_init (PCIBus *pci_bus) |
487 | 487 | static void network_init (PCIBus *pci_bus) |
488 | 488 | { |
489 | 489 | int i; |
490 | - NICInfo *nd; | |
491 | 490 | |
492 | 491 | for(i = 0; i < nb_nics; i++) { |
493 | - nd = &nd_table[i]; | |
494 | - if (!nd->model) { | |
495 | - nd->model = "pcnet"; | |
496 | - } | |
497 | - if (i == 0 && strcmp(nd->model, "pcnet") == 0) { | |
492 | + NICInfo *nd = &nd_table[i]; | |
493 | + int devfn = -1; | |
494 | + | |
495 | + if (i == 0 && (!nd->model || strcmp(nd->model, "pcnet") == 0)) | |
498 | 496 | /* The malta board has a PCNet card using PCI SLOT 11 */ |
499 | - pci_nic_init(pci_bus, nd, 88); | |
500 | - } else { | |
501 | - pci_nic_init(pci_bus, nd, -1); | |
502 | - } | |
497 | + devfn = 88; | |
498 | + | |
499 | + pci_nic_init(pci_bus, nd, devfn, "pcnet"); | |
503 | 500 | } |
504 | 501 | } |
505 | 502 | ... | ... |
hw/pc.c
... | ... | @@ -764,7 +764,6 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, |
764 | 764 | PCIBus *pci_bus; |
765 | 765 | int piix3_devfn = -1; |
766 | 766 | CPUState *env; |
767 | - NICInfo *nd; | |
768 | 767 | qemu_irq *cpu_irq; |
769 | 768 | qemu_irq *i8259; |
770 | 769 | int index; |
... | ... | @@ -1000,27 +999,12 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, |
1000 | 999 | } |
1001 | 1000 | |
1002 | 1001 | for(i = 0; i < nb_nics; i++) { |
1003 | - nd = &nd_table[i]; | |
1004 | - if (!nd->model) { | |
1005 | - if (pci_enabled) { | |
1006 | - nd->model = "ne2k_pci"; | |
1007 | - } else { | |
1008 | - nd->model = "ne2k_isa"; | |
1009 | - } | |
1010 | - } | |
1011 | - if (strcmp(nd->model, "ne2k_isa") == 0) { | |
1002 | + NICInfo *nd = &nd_table[i]; | |
1003 | + | |
1004 | + if (!pci_enabled || (nd->model && strcmp(nd->model, "ne2k_isa") == 0)) | |
1012 | 1005 | pc_init_ne2k_isa(nd, i8259); |
1013 | - } else if (pci_enabled) { | |
1014 | - if (strcmp(nd->model, "?") == 0) | |
1015 | - fprintf(stderr, "qemu: Supported ISA NICs: ne2k_isa\n"); | |
1016 | - pci_nic_init(pci_bus, nd, -1); | |
1017 | - } else if (strcmp(nd->model, "?") == 0) { | |
1018 | - fprintf(stderr, "qemu: Supported ISA NICs: ne2k_isa\n"); | |
1019 | - exit(1); | |
1020 | - } else { | |
1021 | - fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd->model); | |
1022 | - exit(1); | |
1023 | - } | |
1006 | + else | |
1007 | + pci_nic_init(pci_bus, nd, -1, "ne2k_pci"); | |
1024 | 1008 | } |
1025 | 1009 | |
1026 | 1010 | if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) { | ... | ... |
hw/pci.c
... | ... | @@ -652,33 +652,43 @@ void pci_info(void) |
652 | 652 | pci_for_each_device(0, pci_info_device); |
653 | 653 | } |
654 | 654 | |
655 | +static const char * const pci_nic_models[] = { | |
656 | + "ne2k_pci", | |
657 | + "i82551", | |
658 | + "i82557b", | |
659 | + "i82559er", | |
660 | + "rtl8139", | |
661 | + "e1000", | |
662 | + "pcnet", | |
663 | + "virtio", | |
664 | + NULL | |
665 | +}; | |
666 | + | |
667 | +typedef void (*PCINICInitFn)(PCIBus *, NICInfo *, int); | |
668 | + | |
669 | +static PCINICInitFn pci_nic_init_fns[] = { | |
670 | + pci_ne2000_init, | |
671 | + pci_i82551_init, | |
672 | + pci_i82557b_init, | |
673 | + pci_i82559er_init, | |
674 | + pci_rtl8139_init, | |
675 | + pci_e1000_init, | |
676 | + pci_pcnet_init, | |
677 | + virtio_net_init, | |
678 | + NULL | |
679 | +}; | |
680 | + | |
655 | 681 | /* Initialize a PCI NIC. */ |
656 | -void pci_nic_init(PCIBus *bus, NICInfo *nd, int devfn) | |
682 | +void pci_nic_init(PCIBus *bus, NICInfo *nd, int devfn, | |
683 | + const char *default_model) | |
657 | 684 | { |
658 | - if (strcmp(nd->model, "ne2k_pci") == 0) { | |
659 | - pci_ne2000_init(bus, nd, devfn); | |
660 | - } else if (strcmp(nd->model, "i82551") == 0) { | |
661 | - pci_i82551_init(bus, nd, devfn); | |
662 | - } else if (strcmp(nd->model, "i82557b") == 0) { | |
663 | - pci_i82557b_init(bus, nd, devfn); | |
664 | - } else if (strcmp(nd->model, "i82559er") == 0) { | |
665 | - pci_i82559er_init(bus, nd, devfn); | |
666 | - } else if (strcmp(nd->model, "rtl8139") == 0) { | |
667 | - pci_rtl8139_init(bus, nd, devfn); | |
668 | - } else if (strcmp(nd->model, "e1000") == 0) { | |
669 | - pci_e1000_init(bus, nd, devfn); | |
670 | - } else if (strcmp(nd->model, "pcnet") == 0) { | |
671 | - pci_pcnet_init(bus, nd, devfn); | |
672 | - } else if (strcmp(nd->model, "virtio") == 0) { | |
673 | - virtio_net_init(bus, nd, devfn); | |
674 | - } else if (strcmp(nd->model, "?") == 0) { | |
675 | - fprintf(stderr, "qemu: Supported PCI NICs: i82551 i82557b i82559er" | |
676 | - " ne2k_pci pcnet rtl8139 e1000 virtio\n"); | |
677 | - exit (1); | |
678 | - } else { | |
679 | - fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd->model); | |
680 | - exit (1); | |
681 | - } | |
685 | + int i; | |
686 | + | |
687 | + qemu_check_nic_model_list(nd, pci_nic_models, default_model); | |
688 | + | |
689 | + for (i = 0; pci_nic_models[i]; i++) | |
690 | + if (strcmp(nd->model, pci_nic_models[i]) == 0) | |
691 | + pci_nic_init_fns[i](bus, nd, devfn); | |
682 | 692 | } |
683 | 693 | |
684 | 694 | typedef struct { | ... | ... |
hw/pci.h
... | ... | @@ -118,7 +118,8 @@ typedef int (*pci_map_irq_fn)(PCIDevice *pci_dev, int irq_num); |
118 | 118 | PCIBus *pci_register_bus(pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, |
119 | 119 | qemu_irq *pic, int devfn_min, int nirq); |
120 | 120 | |
121 | -void pci_nic_init(PCIBus *bus, NICInfo *nd, int devfn); | |
121 | +void pci_nic_init(PCIBus *bus, NICInfo *nd, int devfn, | |
122 | + const char *default_model); | |
122 | 123 | void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len); |
123 | 124 | uint32_t pci_data_read(void *opaque, uint32_t addr, int len); |
124 | 125 | int pci_bus_num(PCIBus *s); | ... | ... |
hw/ppc440_bamboo.c
... | ... | @@ -90,7 +90,6 @@ static void bamboo_init(ram_addr_t ram_size, int vga_ram_size, |
90 | 90 | const char *cpu_model) |
91 | 91 | { |
92 | 92 | unsigned int pci_irq_nrs[4] = { 28, 27, 26, 25 }; |
93 | - NICInfo *nd; | |
94 | 93 | PCIBus *pcibus; |
95 | 94 | CPUState *env; |
96 | 95 | uint64_t elf_entry; |
... | ... | @@ -118,13 +117,9 @@ static void bamboo_init(ram_addr_t ram_size, int vga_ram_size, |
118 | 117 | |
119 | 118 | /* Register network interfaces. */ |
120 | 119 | for (i = 0; i < nb_nics; i++) { |
121 | - nd = &nd_table[i]; | |
122 | - if (!nd->model) { | |
123 | - /* There are no PCI NICs on the Bamboo board, but there are | |
124 | - * PCI slots, so we can pick model whatever we want. */ | |
125 | - nd->model = "e1000"; | |
126 | - } | |
127 | - pci_nic_init(pcibus, nd, -1); | |
120 | + /* There are no PCI NICs on the Bamboo board, but there are | |
121 | + * PCI slots, so we can pick whatever default model we want. */ | |
122 | + pci_nic_init(pcibus, &nd_table[i], -1, "e1000"); | |
128 | 123 | } |
129 | 124 | } |
130 | 125 | ... | ... |
hw/ppc_chrp.c
... | ... | @@ -265,11 +265,10 @@ static void ppc_core99_init (ram_addr_t ram_size, int vga_ram_size, |
265 | 265 | |
266 | 266 | escc_mem_index = escc_init(0x80013000, dummy_irq[4], serial_hds[0], |
267 | 267 | serial_hds[1], ESCC_CLOCK, 4); |
268 | - for(i = 0; i < nb_nics; i++) { | |
269 | - if (!nd_table[i].model) | |
270 | - nd_table[i].model = "ne2k_pci"; | |
271 | - pci_nic_init(pci_bus, &nd_table[i], -1); | |
272 | - } | |
268 | + | |
269 | + for(i = 0; i < nb_nics; i++) | |
270 | + pci_nic_init(pci_bus, &nd_table[i], -1, "ne2k_pci"); | |
271 | + | |
273 | 272 | if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) { |
274 | 273 | fprintf(stderr, "qemu: too many IDE bus\n"); |
275 | 274 | exit(1); | ... | ... |
hw/ppc_oldworld.c
... | ... | @@ -307,11 +307,8 @@ static void ppc_heathrow_init (ram_addr_t ram_size, int vga_ram_size, |
307 | 307 | escc_mem_index = escc_init(0x80013000, pic[0x10], serial_hds[0], |
308 | 308 | serial_hds[1], ESCC_CLOCK, 4); |
309 | 309 | |
310 | - for(i = 0; i < nb_nics; i++) { | |
311 | - if (!nd_table[i].model) | |
312 | - nd_table[i].model = "ne2k_pci"; | |
313 | - pci_nic_init(pci_bus, &nd_table[i], -1); | |
314 | - } | |
310 | + for(i = 0; i < nb_nics; i++) | |
311 | + pci_nic_init(pci_bus, &nd_table[i], -1, "ne2k_pci"); | |
315 | 312 | |
316 | 313 | /* First IDE channel is a CMD646 on the PCI bus */ |
317 | 314 | ... | ... |
hw/ppc_prep.c
... | ... | @@ -677,7 +677,7 @@ static void ppc_prep_init (ram_addr_t ram_size, int vga_ram_size, |
677 | 677 | if (strcmp(nd_table[i].model, "ne2k_isa") == 0) { |
678 | 678 | isa_ne2000_init(ne2000_io[i], i8259[ne2000_irq[i]], &nd_table[i]); |
679 | 679 | } else { |
680 | - pci_nic_init(pci_bus, &nd_table[i], -1); | |
680 | + pci_nic_init(pci_bus, &nd_table[i], -1, "ne2k_pci"); | |
681 | 681 | } |
682 | 682 | } |
683 | 683 | ... | ... |
hw/r2d.c
... | ... | @@ -230,9 +230,9 @@ static void r2d_init(ram_addr_t ram_size, int vga_ram_size, |
230 | 230 | drives_table[drive_get_index(IF_IDE, 0, 0)].bdrv, NULL); |
231 | 231 | |
232 | 232 | /* NIC: rtl8139 on-board, and 2 slots. */ |
233 | - pci_rtl8139_init(pci, &nd_table[0], 2 << 3); | |
233 | + pci_nic_init(pci, &nd_table[0], 2 << 3, "rtl8139"); | |
234 | 234 | for (i = 1; i < nb_nics; i++) |
235 | - pci_nic_init(pci, &nd_table[i], -1); | |
235 | + pci_nic_init(pci, &nd_table[i], -1, "ne2k_pci"); | |
236 | 236 | |
237 | 237 | /* Todo: register on board registers */ |
238 | 238 | { | ... | ... |
hw/realview.c
... | ... | @@ -126,9 +126,7 @@ static void realview_init(ram_addr_t ram_size, int vga_ram_size, |
126 | 126 | smc91c111_init(nd, 0x4e000000, pic[28]); |
127 | 127 | done_smc = 1; |
128 | 128 | } else { |
129 | - if (!nd->model) | |
130 | - nd->model = "rtl8139"; | |
131 | - pci_nic_init(pci_bus, nd, -1); | |
129 | + pci_nic_init(pci_bus, nd, -1, "rtl8139"); | |
132 | 130 | } |
133 | 131 | } |
134 | 132 | ... | ... |
hw/sun4u.c
... | ... | @@ -535,11 +535,8 @@ static void sun4uv_init(ram_addr_t RAM_size, int vga_ram_size, |
535 | 535 | } |
536 | 536 | } |
537 | 537 | |
538 | - for(i = 0; i < nb_nics; i++) { | |
539 | - if (!nd_table[i].model) | |
540 | - nd_table[i].model = "ne2k_pci"; | |
541 | - pci_nic_init(pci_bus, &nd_table[i], -1); | |
542 | - } | |
538 | + for(i = 0; i < nb_nics; i++) | |
539 | + pci_nic_init(pci_bus, &nd_table[i], -1, "ne2k_pci"); | |
543 | 540 | |
544 | 541 | irq = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS); |
545 | 542 | if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) { | ... | ... |
hw/versatilepb.c
... | ... | @@ -199,9 +199,7 @@ static void versatile_init(ram_addr_t ram_size, int vga_ram_size, |
199 | 199 | smc91c111_init(nd, 0x10010000, sic[25]); |
200 | 200 | done_smc = 1; |
201 | 201 | } else { |
202 | - if (!nd->model) | |
203 | - nd->model = "rtl8139"; | |
204 | - pci_nic_init(pci_bus, nd, -1); | |
202 | + pci_nic_init(pci_bus, nd, -1, "rtl8139"); | |
205 | 203 | } |
206 | 204 | } |
207 | 205 | if (usb_enabled) { | ... | ... |