Commit cb457d7679840b95de361c42921e601bd224ecf5

Authored by aliguori
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
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
@@ -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) {