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) { | ... | ... |