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,19 +487,16 @@ static void audio_init (PCIBus *pci_bus) | ||
| 487 | static void network_init (PCIBus *pci_bus) | 487 | static void network_init (PCIBus *pci_bus) |
| 488 | { | 488 | { |
| 489 | int i; | 489 | int i; |
| 490 | - NICInfo *nd; | ||
| 491 | 490 | ||
| 492 | for(i = 0; i < nb_nics; i++) { | 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 | /* The malta board has a PCNet card using PCI SLOT 11 */ | 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,7 +764,6 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, | ||
| 764 | PCIBus *pci_bus; | 764 | PCIBus *pci_bus; |
| 765 | int piix3_devfn = -1; | 765 | int piix3_devfn = -1; |
| 766 | CPUState *env; | 766 | CPUState *env; |
| 767 | - NICInfo *nd; | ||
| 768 | qemu_irq *cpu_irq; | 767 | qemu_irq *cpu_irq; |
| 769 | qemu_irq *i8259; | 768 | qemu_irq *i8259; |
| 770 | int index; | 769 | int index; |
| @@ -1000,27 +999,12 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, | @@ -1000,27 +999,12 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, | ||
| 1000 | } | 999 | } |
| 1001 | 1000 | ||
| 1002 | for(i = 0; i < nb_nics; i++) { | 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 | pc_init_ne2k_isa(nd, i8259); | 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 | if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) { | 1010 | if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) { |
hw/pci.c
| @@ -652,33 +652,43 @@ void pci_info(void) | @@ -652,33 +652,43 @@ void pci_info(void) | ||
| 652 | pci_for_each_device(0, pci_info_device); | 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 | /* Initialize a PCI NIC. */ | 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 | typedef struct { | 694 | typedef struct { |
hw/pci.h
| @@ -118,7 +118,8 @@ typedef int (*pci_map_irq_fn)(PCIDevice *pci_dev, int irq_num); | @@ -118,7 +118,8 @@ typedef int (*pci_map_irq_fn)(PCIDevice *pci_dev, int irq_num); | ||
| 118 | PCIBus *pci_register_bus(pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, | 118 | PCIBus *pci_register_bus(pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, |
| 119 | qemu_irq *pic, int devfn_min, int nirq); | 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 | void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len); | 123 | void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len); |
| 123 | uint32_t pci_data_read(void *opaque, uint32_t addr, int len); | 124 | uint32_t pci_data_read(void *opaque, uint32_t addr, int len); |
| 124 | int pci_bus_num(PCIBus *s); | 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,7 +90,6 @@ static void bamboo_init(ram_addr_t ram_size, int vga_ram_size, | ||
| 90 | const char *cpu_model) | 90 | const char *cpu_model) |
| 91 | { | 91 | { |
| 92 | unsigned int pci_irq_nrs[4] = { 28, 27, 26, 25 }; | 92 | unsigned int pci_irq_nrs[4] = { 28, 27, 26, 25 }; |
| 93 | - NICInfo *nd; | ||
| 94 | PCIBus *pcibus; | 93 | PCIBus *pcibus; |
| 95 | CPUState *env; | 94 | CPUState *env; |
| 96 | uint64_t elf_entry; | 95 | uint64_t elf_entry; |
| @@ -118,13 +117,9 @@ static void bamboo_init(ram_addr_t ram_size, int vga_ram_size, | @@ -118,13 +117,9 @@ static void bamboo_init(ram_addr_t ram_size, int vga_ram_size, | ||
| 118 | 117 | ||
| 119 | /* Register network interfaces. */ | 118 | /* Register network interfaces. */ |
| 120 | for (i = 0; i < nb_nics; i++) { | 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,11 +265,10 @@ static void ppc_core99_init (ram_addr_t ram_size, int vga_ram_size, | ||
| 265 | 265 | ||
| 266 | escc_mem_index = escc_init(0x80013000, dummy_irq[4], serial_hds[0], | 266 | escc_mem_index = escc_init(0x80013000, dummy_irq[4], serial_hds[0], |
| 267 | serial_hds[1], ESCC_CLOCK, 4); | 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 | if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) { | 272 | if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) { |
| 274 | fprintf(stderr, "qemu: too many IDE bus\n"); | 273 | fprintf(stderr, "qemu: too many IDE bus\n"); |
| 275 | exit(1); | 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,11 +307,8 @@ static void ppc_heathrow_init (ram_addr_t ram_size, int vga_ram_size, | ||
| 307 | escc_mem_index = escc_init(0x80013000, pic[0x10], serial_hds[0], | 307 | escc_mem_index = escc_init(0x80013000, pic[0x10], serial_hds[0], |
| 308 | serial_hds[1], ESCC_CLOCK, 4); | 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 | /* First IDE channel is a CMD646 on the PCI bus */ | 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,7 +677,7 @@ static void ppc_prep_init (ram_addr_t ram_size, int vga_ram_size, | ||
| 677 | if (strcmp(nd_table[i].model, "ne2k_isa") == 0) { | 677 | if (strcmp(nd_table[i].model, "ne2k_isa") == 0) { |
| 678 | isa_ne2000_init(ne2000_io[i], i8259[ne2000_irq[i]], &nd_table[i]); | 678 | isa_ne2000_init(ne2000_io[i], i8259[ne2000_irq[i]], &nd_table[i]); |
| 679 | } else { | 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,9 +230,9 @@ static void r2d_init(ram_addr_t ram_size, int vga_ram_size, | ||
| 230 | drives_table[drive_get_index(IF_IDE, 0, 0)].bdrv, NULL); | 230 | drives_table[drive_get_index(IF_IDE, 0, 0)].bdrv, NULL); |
| 231 | 231 | ||
| 232 | /* NIC: rtl8139 on-board, and 2 slots. */ | 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 | for (i = 1; i < nb_nics; i++) | 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 | /* Todo: register on board registers */ | 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,9 +126,7 @@ static void realview_init(ram_addr_t ram_size, int vga_ram_size, | ||
| 126 | smc91c111_init(nd, 0x4e000000, pic[28]); | 126 | smc91c111_init(nd, 0x4e000000, pic[28]); |
| 127 | done_smc = 1; | 127 | done_smc = 1; |
| 128 | } else { | 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,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 | irq = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS); | 541 | irq = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS); |
| 545 | if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) { | 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,9 +199,7 @@ static void versatile_init(ram_addr_t ram_size, int vga_ram_size, | ||
| 199 | smc91c111_init(nd, 0x10010000, sic[25]); | 199 | smc91c111_init(nd, 0x10010000, sic[25]); |
| 200 | done_smc = 1; | 200 | done_smc = 1; |
| 201 | } else { | 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 | if (usb_enabled) { | 205 | if (usb_enabled) { |