Message ID | 20240108204909.564514-26-dwmw2@infradead.org |
---|---|
State | New |
Headers | show |
Series | Rework matching of network devices to -nic options | expand |
On 08/01/2024 21.26, David Woodhouse wrote: > From: David Woodhouse <dwmw@amazon.co.uk> > > Some callers instantiate the device unconditionally, others will do so only > if there is a NICInfo to go with it. This appears to be fairly random, but > preserve the existing behaviour for now. > > Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> > --- ... > diff --git a/hw/net/smc91c111.c b/hw/net/smc91c111.c > index 49b7c26102..702d0e8e83 100644 > --- a/hw/net/smc91c111.c > +++ b/hw/net/smc91c111.c > @@ -818,14 +818,13 @@ static void smc91c111_register_types(void) > > /* Legacy helper function. Should go away when machine config files are > implemented. */ > -void smc91c111_init(NICInfo *nd, uint32_t base, qemu_irq irq) > +void smc91c111_init(uint32_t base, qemu_irq irq) > { > DeviceState *dev; > SysBusDevice *s; > > - qemu_check_nic_model(nd, "smc91c111"); > dev = qdev_new(TYPE_SMC91C111); > - qdev_set_nic_properties(dev, nd); > + qemu_configure_nic_device(dev, true, NULL); Wouldn't it be possible to use qemu_create_nic_device() here, too? Anyway: Reviewed-by: Thomas Huth <thuth@redhat.com> > s = SYS_BUS_DEVICE(dev); > sysbus_realize_and_unref(s, &error_fatal); > sysbus_mmio_map(s, 0, base);
On Fri, 2024-01-26 at 16:14 +0100, Thomas Huth wrote: > > > /* Legacy helper function. Should go away when machine config files are > > implemented. */ > > -void smc91c111_init(NICInfo *nd, uint32_t base, qemu_irq irq) > > +void smc91c111_init(uint32_t base, qemu_irq irq) > > { > > DeviceState *dev; > > SysBusDevice *s; > > > > - qemu_check_nic_model(nd, "smc91c111"); > > dev = qdev_new(TYPE_SMC91C111); > > - qdev_set_nic_properties(dev, nd); > > + qemu_configure_nic_device(dev, true, NULL); > > Wouldn't it be possible to use qemu_create_nic_device() here, too? Not easily. The existing callers of smc91c111_init() differ. Some (e.g. mainstone) just create the device unconditionally, ignoring --nodefaults. Others (e.g. integratorcp) are better behaved and do it only if a configuration exists. (Citation of existing patch reinstated below) And even if we wanted to convert the well-behaved ones to use qemu_create_nic_device() directly, we'd still have to explicitly set up the base address and IRQ, which smc91c111_init() currently does for us. > --- a/hw/arm/integratorcp.c > +++ b/hw/arm/integratorcp.c > @@ -666,8 +666,9 @@ static void integratorcp_init(MachineState *machine) > sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x1d000000); > sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[25]); > > - if (nd_table[0].used) > - smc91c111_init(&nd_table[0], 0xc8000000, pic[27]); > + if (qemu_find_nic_info("smc91c111", true, NULL)) { > + smc91c111_init(0xc8000000, pic[27]); > + } > > sysbus_create_simple("pl110", 0xc0000000, pic[22]); > > diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c > index 68329c4617..84dbb6e525 100644 > --- a/hw/arm/mainstone.c > +++ b/hw/arm/mainstone.c > @@ -153,8 +153,7 @@ static void mainstone_common_init(MachineState *machine, > qdev_get_gpio_in(mst_irq, S1_IRQ), > qdev_get_gpio_in(mst_irq, S1_CD_IRQ)); > > - smc91c111_init(&nd_table[0], MST_ETH_PHYS, > - qdev_get_gpio_in(mst_irq, ETHERNET_IRQ)); > + smc91c111_init(MST_ETH_PHYS, qdev_get_gpio_in(mst_irq, ETHERNET_IRQ)); > > mainstone_binfo.board_id = arm_id; > arm_load_kernel(mpu->cpu, machine, &mainstone_binfo);
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c index 2ca4140c9f..f58c4da7f9 100644 --- a/hw/arm/gumstix.c +++ b/hw/arm/gumstix.c @@ -74,8 +74,7 @@ static void connex_init(MachineState *machine) FLASH_SECTOR_SIZE, 2, 0, 0, 0, 0, 0); /* Interrupt line of NIC is connected to GPIO line 36 */ - smc91c111_init(&nd_table[0], 0x04000300, - qdev_get_gpio_in(cpu->gpio, 36)); + smc91c111_init(0x04000300, qdev_get_gpio_in(cpu->gpio, 36)); } static void verdex_init(MachineState *machine) @@ -98,8 +97,7 @@ static void verdex_init(MachineState *machine) FLASH_SECTOR_SIZE, 2, 0, 0, 0, 0, 0); /* Interrupt line of NIC is connected to GPIO line 99 */ - smc91c111_init(&nd_table[0], 0x04000300, - qdev_get_gpio_in(cpu->gpio, 99)); + smc91c111_init(0x04000300, qdev_get_gpio_in(cpu->gpio, 99)); } static void connex_class_init(ObjectClass *oc, void *data) diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c index 1830e1d785..c56a2c1353 100644 --- a/hw/arm/integratorcp.c +++ b/hw/arm/integratorcp.c @@ -666,8 +666,9 @@ static void integratorcp_init(MachineState *machine) sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x1d000000); sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[25]); - if (nd_table[0].used) - smc91c111_init(&nd_table[0], 0xc8000000, pic[27]); + if (qemu_find_nic_info("smc91c111", true, NULL)) { + smc91c111_init(0xc8000000, pic[27]); + } sysbus_create_simple("pl110", 0xc0000000, pic[22]); diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c index 68329c4617..84dbb6e525 100644 --- a/hw/arm/mainstone.c +++ b/hw/arm/mainstone.c @@ -153,8 +153,7 @@ static void mainstone_common_init(MachineState *machine, qdev_get_gpio_in(mst_irq, S1_IRQ), qdev_get_gpio_in(mst_irq, S1_CD_IRQ)); - smc91c111_init(&nd_table[0], MST_ETH_PHYS, - qdev_get_gpio_in(mst_irq, ETHERNET_IRQ)); + smc91c111_init(MST_ETH_PHYS, qdev_get_gpio_in(mst_irq, ETHERNET_IRQ)); mainstone_binfo.board_id = arm_id; arm_load_kernel(mpu->cpu, machine, &mainstone_binfo); diff --git a/hw/arm/realview.c b/hw/arm/realview.c index 132217b2ed..6e7529d98f 100644 --- a/hw/arm/realview.c +++ b/hw/arm/realview.c @@ -89,7 +89,6 @@ static void realview_init(MachineState *machine, I2CBus *i2c; int n; unsigned int smp_cpus = machine->smp.cpus; - int done_nic = 0; qemu_irq cpu_irq[4]; int is_mpcore = 0; int is_pb = 0; @@ -295,24 +294,20 @@ static void realview_init(MachineState *machine, n--; } } - for(n = 0; n < nb_nics; n++) { - nd = &nd_table[n]; - - if (!done_nic && (!nd->model || - strcmp(nd->model, is_pb ? "lan9118" : "smc91c111") == 0)) { - if (is_pb) { - lan9118_init(nd, 0x4e000000, pic[28]); - } else { - smc91c111_init(nd, 0x4e000000, pic[28]); - } - done_nic = 1; + + nd = qemu_find_nic_info(is_pb ? "lan9118" : "smc91c111", true, NULL); + if (nd) { + if (is_pb) { + lan9118_init(nd, 0x4e000000, pic[28]); } else { - if (pci_bus) { - pci_nic_init_nofail(nd, pci_bus, "rtl8139", NULL); - } + smc91c111_init(0x4e000000, pic[28]); } } + if (pci_bus) { + pci_init_nic_devices(pci_bus, "rtl8139"); + } + dev = sysbus_create_simple(TYPE_ARM_SBCON_I2C, 0x10002000, NULL); i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c"); i2c_slave_create_simple(i2c, "ds1338", 0x68); diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c index 4b2257787b..0517a65601 100644 --- a/hw/arm/versatilepb.c +++ b/hw/arm/versatilepb.c @@ -192,10 +192,8 @@ static void versatile_init(MachineState *machine, int board_id) SysBusDevice *busdev; DeviceState *pl041; PCIBus *pci_bus; - NICInfo *nd; I2CBus *i2c; int n; - int done_smc = 0; DriveInfo *dinfo; if (machine->ram_size > 0x10000000) { @@ -263,16 +261,11 @@ static void versatile_init(MachineState *machine, int board_id) sysbus_connect_irq(busdev, 3, sic[30]); pci_bus = (PCIBus *)qdev_get_child_bus(dev, "pci"); - for(n = 0; n < nb_nics; n++) { - nd = &nd_table[n]; - - if (!done_smc && (!nd->model || strcmp(nd->model, "smc91c111") == 0)) { - smc91c111_init(nd, 0x10010000, sic[25]); - done_smc = 1; - } else { - pci_nic_init_nofail(nd, pci_bus, "rtl8139", NULL); - } + if (qemu_find_nic_info("smc91c111", true, NULL)) { + smc91c111_init(0x10010000, sic[25]); } + pci_init_nic_devices(pci_bus, "rtl8139"); + if (machine_usb(machine)) { pci_create_simple(pci_bus, -1, "pci-ohci"); } diff --git a/hw/net/smc91c111.c b/hw/net/smc91c111.c index 49b7c26102..702d0e8e83 100644 --- a/hw/net/smc91c111.c +++ b/hw/net/smc91c111.c @@ -818,14 +818,13 @@ static void smc91c111_register_types(void) /* Legacy helper function. Should go away when machine config files are implemented. */ -void smc91c111_init(NICInfo *nd, uint32_t base, qemu_irq irq) +void smc91c111_init(uint32_t base, qemu_irq irq) { DeviceState *dev; SysBusDevice *s; - qemu_check_nic_model(nd, "smc91c111"); dev = qdev_new(TYPE_SMC91C111); - qdev_set_nic_properties(dev, nd); + qemu_configure_nic_device(dev, true, NULL); s = SYS_BUS_DEVICE(dev); sysbus_realize_and_unref(s, &error_fatal); sysbus_mmio_map(s, 0, base); diff --git a/include/hw/net/smc91c111.h b/include/hw/net/smc91c111.h index df5b11dcef..dba32a233f 100644 --- a/include/hw/net/smc91c111.h +++ b/include/hw/net/smc91c111.h @@ -13,6 +13,6 @@ #include "net/net.h" -void smc91c111_init(NICInfo *, uint32_t, qemu_irq); +void smc91c111_init(uint32_t, qemu_irq); #endif