diff options
Diffstat (limited to 'hw')
| -rw-r--r-- | hw/e1000.c | 31 | ||||
| -rw-r--r-- | hw/pci.c | 6 | ||||
| -rw-r--r-- | hw/pci.h | 4 | ||||
| -rw-r--r-- | hw/qdev.c | 2 | ||||
| -rw-r--r-- | hw/rtl8139.c | 6 |
5 files changed, 29 insertions, 20 deletions
diff --git a/hw/e1000.c b/hw/e1000.c index 7f8f5b2ae4..eed02a69f7 100644 --- a/hw/e1000.c +++ b/hw/e1000.c @@ -150,12 +150,18 @@ ioport_map(PCIDevice *pci_dev, int region_num, uint32_t addr, } static void +update_irqs(E1000State *s) +{ + qemu_set_irq(s->dev.irq[0], (s->mac_reg[IMS] & s->mac_reg[ICR]) != 0); +} + +static void set_interrupt_cause(E1000State *s, int index, uint32_t val) { if (val) val |= E1000_ICR_INT_ASSERTED; s->mac_reg[ICR] = val; - qemu_set_irq(s->dev.irq[0], (s->mac_reg[IMS] & s->mac_reg[ICR]) != 0); + update_irqs(s); } static void @@ -972,6 +978,7 @@ nic_load(QEMUFile *f, void *opaque, int version_id) for (j = 0; j < mac_regarraystosave[i].size; j++) qemu_get_be32s(f, s->mac_reg + mac_regarraystosave[i].array0 + j); + update_irqs(s); return 0; } @@ -1060,6 +1067,19 @@ pci_e1000_uninit(PCIDevice *dev) return 0; } +static void e1000_reset(void *opaque) +{ + E1000State *d = opaque; + + memset(d->phy_reg, 0, sizeof d->phy_reg); + memmove(d->phy_reg, phy_reg_init, sizeof phy_reg_init); + memset(d->mac_reg, 0, sizeof d->mac_reg); + memmove(d->mac_reg, mac_reg_init, sizeof mac_reg_init); + d->rxbuf_min_shift = 1; + memset(&d->tx, 0, sizeof d->tx); + update_irqs(d); +} + static void pci_e1000_init(PCIDevice *pci_dev) { E1000State *d = (E1000State *)pci_dev; @@ -1100,13 +1120,6 @@ static void pci_e1000_init(PCIDevice *pci_dev) checksum = (uint16_t) EEPROM_SUM - checksum; d->eeprom_data[EEPROM_CHECKSUM_REG] = checksum; - memset(d->phy_reg, 0, sizeof d->phy_reg); - memmove(d->phy_reg, phy_reg_init, sizeof phy_reg_init); - memset(d->mac_reg, 0, sizeof d->mac_reg); - memmove(d->mac_reg, mac_reg_init, sizeof mac_reg_init); - d->rxbuf_min_shift = 1; - memset(&d->tx, 0, sizeof d->tx); - d->vc = qdev_get_vlan_client(&d->dev.qdev, e1000_can_receive, e1000_receive, NULL, e1000_cleanup, d); @@ -1116,6 +1129,8 @@ static void pci_e1000_init(PCIDevice *pci_dev) register_savevm(info_str, -1, 2, nic_save, nic_load, d); d->dev.unregister = pci_e1000_uninit; + qemu_register_reset(e1000_reset, 0, d); + e1000_reset(d); } static void e1000_register_devices(void) diff --git a/hw/pci.c b/hw/pci.c index 0ab5b94a7d..8c904bafdb 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -54,7 +54,6 @@ static void pci_set_irq(void *opaque, int irq_num, int level); target_phys_addr_t pci_mem_base; static uint16_t pci_default_sub_vendor_id = PCI_SUBVENDOR_ID_REDHAT_QUMRANET; static uint16_t pci_default_sub_device_id = PCI_SUBDEVICE_ID_QEMU; -static int pci_irq_index; static PCIBus *first_bus; static void pcibus_save(QEMUFile *f, void *opaque) @@ -245,9 +244,6 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus, PCIConfigReadFunc *config_read, PCIConfigWriteFunc *config_write) { - if (pci_irq_index >= PCI_DEVICES_MAX) - return NULL; - if (devfn < 0) { for(devfn = bus->devfn_min ; devfn < 256; devfn += 8) { if (!bus->devices[devfn]) @@ -268,7 +264,6 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus, config_write = pci_default_write_config; pci_dev->config_read = config_read; pci_dev->config_write = config_write; - pci_dev->irq_index = pci_irq_index++; bus->devices[devfn] = pci_dev; pci_dev->irq = qemu_allocate_irqs(pci_set_irq, pci_dev, 4); return pci_dev; @@ -322,7 +317,6 @@ int pci_unregister_device(PCIDevice *pci_dev) pci_unregister_io_regions(pci_dev); qemu_free_irqs(pci_dev->irq); - pci_irq_index--; pci_dev->bus->devices[pci_dev->devfn] = NULL; qdev_free(&pci_dev->qdev); return 0; diff --git a/hw/pci.h b/hw/pci.h index 0405837f73..af6c8fd153 100644 --- a/hw/pci.h +++ b/hw/pci.h @@ -92,8 +92,6 @@ typedef struct PCIIORegion { #define PCI_ROM_SLOT 6 #define PCI_NUM_REGIONS 7 -#define PCI_DEVICES_MAX 64 - /* Declarations from linux/pci_regs.h */ #define PCI_VENDOR_ID 0x00 /* 16 bits */ #define PCI_DEVICE_ID 0x02 /* 16 bits */ @@ -154,8 +152,6 @@ struct PCIDevice { PCIConfigReadFunc *config_read; PCIConfigWriteFunc *config_write; PCIUnregisterFunc *unregister; - /* ??? This is a PC-specific hack, and should be removed. */ - int irq_index; /* IRQ objects for the INTA-INTD pins. */ qemu_irq *irq; diff --git a/hw/qdev.c b/hw/qdev.c index bab351c12f..d23298ca08 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -49,7 +49,7 @@ struct DeviceType { }; /* This is a nasty hack to allow passing a NULL bus to qdev_create. */ -BusState *main_system_bus; +static BusState *main_system_bus; static DeviceType *device_type_list; diff --git a/hw/rtl8139.c b/hw/rtl8139.c index c86b782e4c..de5a68fc99 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -1173,8 +1173,9 @@ static void rtl8139_reset_rxring(RTL8139State *s, uint32_t bufferSize) s->RxBufAddr = 0; } -static void rtl8139_reset(RTL8139State *s) +static void rtl8139_reset(void *opaque) { + RTL8139State *s = opaque; int i; /* restore MAC address */ @@ -3316,6 +3317,8 @@ static int rtl8139_load(QEMUFile* f,void* opaque,int version_id) s->cplus_enabled = s->CpCmd != 0; } + rtl8139_update_irq(s); + return 0; } @@ -3476,6 +3479,7 @@ static void pci_rtl8139_init(PCIDevice *dev) s->pci_dev = (PCIDevice *)d; qdev_get_macaddr(&dev->qdev, s->macaddr); + qemu_register_reset(rtl8139_reset, 0, s); rtl8139_reset(s); s->vc = qdev_get_vlan_client(&dev->qdev, rtl8139_can_receive, rtl8139_receive, NULL, |