[Qemu-devel] [PATCH] moving eeprom initialization
The initialization should not be only on reset but also when initializing the device. It resolves a bug when hot plugging a pci network device: the mac address was always null. Signed-off-by: William Dauchy wdau...@gmail.com Signed-off-by: Wen Congyang we...@cn.fujitsu.com --- hw/pcnet.c | 59 + hw/rtl8139.c | 23 ++--- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/hw/pcnet.c b/hw/pcnet.c index 6dfdcc4..d3d5661 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c @@ -1557,35 +1557,6 @@ uint32_t pcnet_bcr_readw(PCNetState *s, uint32_t rap) void pcnet_h_reset(void *opaque) { PCNetState *s = opaque; -int i; -uint16_t checksum; - -/* Initialize the PROM */ - -/* - Datasheet: http://pdfdata.datasheetsite.com/web/24528/AM79C970A.pdf - page 95 -*/ -memcpy(s-prom, s-conf.macaddr.a, 6); -/* Reserved Location: must be 00h */ -s-prom[6] = s-prom[7] = 0x00; -/* Reserved Location: must be 00h */ -s-prom[8] = 0x00; -/* Hardware ID: must be 11h if compatibility to AMD drivers is desired */ -s-prom[9] = 0x11; -/* User programmable space, init with 0 */ -s-prom[10] = s-prom[11] = 0x00; -/* LSByte of two-byte checksum, which is the sum of bytes 00h-0Bh - and bytes 0Eh and 0Fh, must therefore be initialized with 0! */ -s-prom[12] = s-prom[13] = 0x00; -/* Must be ASCII W (57h) if compatibility to AMD - driver software is desired */ -s-prom[14] = s-prom[15] = 0x57; - -for (i = 0,checksum = 0; i 16; i++) -checksum += s-prom[i]; -*(uint16_t *)s-prom[12] = cpu_to_le16(checksum); - s-bcr[BCR_MSRDA] = 0x0005; s-bcr[BCR_MSWRA] = 0x0005; @@ -1752,6 +1723,9 @@ void pcnet_common_cleanup(PCNetState *d) int pcnet_common_init(DeviceState *dev, PCNetState *s, NetClientInfo *info) { +int i; +uint16_t checksum; + s-poll_timer = qemu_new_timer(vm_clock, pcnet_poll_timer, s); qemu_macaddr_default_if_unset(s-conf.macaddr); @@ -1760,5 +1734,32 @@ int pcnet_common_init(DeviceState *dev, PCNetState *s, NetClientInfo *info) add_boot_device_path(s-conf.bootindex, dev, /ethernet-phy@0); +/* Initialize the PROM */ + +/* + Datasheet: http://pdfdata.datasheetsite.com/web/24528/AM79C970A.pdf + page 95 +*/ +memcpy(s-prom, s-conf.macaddr.a, 6); +/* Reserved Location: must be 00h */ +s-prom[6] = s-prom[7] = 0x00; +/* Reserved Location: must be 00h */ +s-prom[8] = 0x00; +/* Hardware ID: must be 11h if compatibility to AMD drivers is desired */ +s-prom[9] = 0x11; +/* User programmable space, init with 0 */ +s-prom[10] = s-prom[11] = 0x00; +/* LSByte of two-byte checksum, which is the sum of bytes 00h-0Bh + and bytes 0Eh and 0Fh, must therefore be initialized with 0! */ +s-prom[12] = s-prom[13] = 0x00; +/* Must be ASCII W (57h) if compatibility to AMD + driver software is desired */ +s-prom[14] = s-prom[15] = 0x57; + +for (i = 0, checksum = 0; i 16; i++) { +checksum += s-prom[i]; +} +*(uint16_t *)s-prom[12] = cpu_to_le16(checksum); + return 0; } diff --git a/hw/rtl8139.c b/hw/rtl8139.c index a22530c..7a87522 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -1189,18 +1189,6 @@ static void rtl8139_reset(DeviceState *d) rtl8139_update_irq(s); -/* prepare eeprom */ -s-eeprom.contents[0] = 0x8129; -#if 1 -// PCI vendor and device ID should be mirrored here -s-eeprom.contents[1] = PCI_VENDOR_ID_REALTEK; -s-eeprom.contents[2] = PCI_DEVICE_ID_REALTEK_8139; -#endif - -s-eeprom.contents[7] = s-conf.macaddr.a[0] | s-conf.macaddr.a[1] 8; -s-eeprom.contents[8] = s-conf.macaddr.a[2] | s-conf.macaddr.a[3] 8; -s-eeprom.contents[9] = s-conf.macaddr.a[4] | s-conf.macaddr.a[5] 8; - /* mark all status registers as owned by host */ for (i = 0; i 4; ++i) { @@ -3392,6 +3380,17 @@ static int pci_rtl8139_init(PCIDevice *dev) qemu_macaddr_default_if_unset(s-conf.macaddr); +/* prepare eeprom */ +s-eeprom.contents[0] = 0x8129; +#if 1 +/* PCI vendor and device ID should be mirrored here */ +s-eeprom.contents[1] = PCI_VENDOR_ID_REALTEK; +s-eeprom.contents[2] = PCI_DEVICE_ID_REALTEK_8139; +#endif +s-eeprom.contents[7] = s-conf.macaddr.a[0] | s-conf.macaddr.a[1] 8; +s-eeprom.contents[8] = s-conf.macaddr.a[2] | s-conf.macaddr.a[3] 8; +s-eeprom.contents[9] = s-conf.macaddr.a[4] | s-conf.macaddr.a[5] 8; + s-nic = qemu_new_nic(net_rtl8139_info, s-conf, dev-qdev.info-name, dev-qdev.id, s); qemu_format_nic_info_str(s-nic-nc, s-conf.macaddr.a); -- 1.7.2.3
[Qemu-devel] [PATCH] moving eeprom initialization
The initialization should not be only on reset but also when initializing the device. It resolves a bug when hot plugging a pci network device: the mac address was always null. Signed-off-by: William Dauchy wdau...@gmail.com Signed-off-by: Wen Congyang we...@cn.fujitsu.com --- hw/pcnet.c | 27 ++- hw/rtl8139.c | 24 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/hw/pcnet.c b/hw/pcnet.c index db52dc5..4e30e9c 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c @@ -1557,19 +1557,6 @@ uint32_t pcnet_bcr_readw(PCNetState *s, uint32_t rap) void pcnet_h_reset(void *opaque) { PCNetState *s = opaque; -int i; -uint16_t checksum; - -/* Initialize the PROM */ - -memcpy(s-prom, s-conf.macaddr.a, 6); -s-prom[12] = s-prom[13] = 0x00; -s-prom[14] = s-prom[15] = 0x57; - -for (i = 0,checksum = 0; i 16; i++) -checksum += s-prom[i]; -*(uint16_t *)s-prom[12] = cpu_to_le16(checksum); - s-bcr[BCR_MSRDA] = 0x0005; s-bcr[BCR_MSWRA] = 0x0005; @@ -1736,6 +1723,9 @@ void pcnet_common_cleanup(PCNetState *d) int pcnet_common_init(DeviceState *dev, PCNetState *s, NetClientInfo *info) { +int i; +uint16_t checksum; + s-poll_timer = qemu_new_timer(vm_clock, pcnet_poll_timer, s); qemu_macaddr_default_if_unset(s-conf.macaddr); @@ -1744,5 +1734,16 @@ int pcnet_common_init(DeviceState *dev, PCNetState *s, NetClientInfo *info) add_boot_device_path(s-conf.bootindex, dev, /ethernet-phy@0); +/* Initialize the PROM */ + +memcpy(s-prom, s-conf.macaddr.a, 6); +s-prom[12] = s-prom[13] = 0x00; +s-prom[14] = s-prom[15] = 0x57; + +for (i = 0, checksum = 0; i 16; i++) { +checksum += s-prom[i]; +} +*(uint16_t *)s-prom[12] = cpu_to_le16(checksum); + return 0; } diff --git a/hw/rtl8139.c b/hw/rtl8139.c index a22530c..8356d5a 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -1189,18 +1189,6 @@ static void rtl8139_reset(DeviceState *d) rtl8139_update_irq(s); -/* prepare eeprom */ -s-eeprom.contents[0] = 0x8129; -#if 1 -// PCI vendor and device ID should be mirrored here -s-eeprom.contents[1] = PCI_VENDOR_ID_REALTEK; -s-eeprom.contents[2] = PCI_DEVICE_ID_REALTEK_8139; -#endif - -s-eeprom.contents[7] = s-conf.macaddr.a[0] | s-conf.macaddr.a[1] 8; -s-eeprom.contents[8] = s-conf.macaddr.a[2] | s-conf.macaddr.a[3] 8; -s-eeprom.contents[9] = s-conf.macaddr.a[4] | s-conf.macaddr.a[5] 8; - /* mark all status registers as owned by host */ for (i = 0; i 4; ++i) { @@ -3392,6 +3380,18 @@ static int pci_rtl8139_init(PCIDevice *dev) qemu_macaddr_default_if_unset(s-conf.macaddr); +/* prepare eeprom */ +s-eeprom.contents[0] = 0x8129; +#if 1 +/* PCI vendor and device ID should be mirrored here */ +s-eeprom.contents[1] = PCI_VENDOR_ID_REALTEK; +s-eeprom.contents[2] = PCI_DEVICE_ID_REALTEK_8139; +#endif + +s-eeprom.contents[7] = s-conf.macaddr.a[0] | s-conf.macaddr.a[1] 8; +s-eeprom.contents[8] = s-conf.macaddr.a[2] | s-conf.macaddr.a[3] 8; +s-eeprom.contents[9] = s-conf.macaddr.a[4] | s-conf.macaddr.a[5] 8; + s-nic = qemu_new_nic(net_rtl8139_info, s-conf, dev-qdev.info-name, dev-qdev.id, s); qemu_format_nic_info_str(s-nic-nc, s-conf.macaddr.a); -- 1.7.2.3
Re: [Qemu-devel] [PATCH] moving eeprom initialization
Hello, AMD fix is now upstream. Please merge it. Thnx. Ciao, Gerhard -- http://www.wiesinger.com/ On Sun, 6 Mar 2011, William Dauchy wrote: The initialization should not be only on reset but also when initializing the device. It resolves a bug when hot plugging a pci network device: the mac address was always null. Signed-off-by: William Dauchy wdau...@gmail.com Signed-off-by: Wen Congyang we...@cn.fujitsu.com --- hw/pcnet.c | 27 ++- hw/rtl8139.c | 24 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/hw/pcnet.c b/hw/pcnet.c index db52dc5..4e30e9c 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c @@ -1557,19 +1557,6 @@ uint32_t pcnet_bcr_readw(PCNetState *s, uint32_t rap) void pcnet_h_reset(void *opaque) { PCNetState *s = opaque; -int i; -uint16_t checksum; - -/* Initialize the PROM */ - -memcpy(s-prom, s-conf.macaddr.a, 6); -s-prom[12] = s-prom[13] = 0x00; -s-prom[14] = s-prom[15] = 0x57; - -for (i = 0,checksum = 0; i 16; i++) -checksum += s-prom[i]; -*(uint16_t *)s-prom[12] = cpu_to_le16(checksum); - s-bcr[BCR_MSRDA] = 0x0005; s-bcr[BCR_MSWRA] = 0x0005; @@ -1736,6 +1723,9 @@ void pcnet_common_cleanup(PCNetState *d) int pcnet_common_init(DeviceState *dev, PCNetState *s, NetClientInfo *info) { +int i; +uint16_t checksum; + s-poll_timer = qemu_new_timer(vm_clock, pcnet_poll_timer, s); qemu_macaddr_default_if_unset(s-conf.macaddr); @@ -1744,5 +1734,16 @@ int pcnet_common_init(DeviceState *dev, PCNetState *s, NetClientInfo *info) add_boot_device_path(s-conf.bootindex, dev, /ethernet-phy@0); +/* Initialize the PROM */ + +memcpy(s-prom, s-conf.macaddr.a, 6); +s-prom[12] = s-prom[13] = 0x00; +s-prom[14] = s-prom[15] = 0x57; + +for (i = 0, checksum = 0; i 16; i++) { +checksum += s-prom[i]; +} +*(uint16_t *)s-prom[12] = cpu_to_le16(checksum); + return 0; } diff --git a/hw/rtl8139.c b/hw/rtl8139.c index a22530c..8356d5a 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -1189,18 +1189,6 @@ static void rtl8139_reset(DeviceState *d) rtl8139_update_irq(s); -/* prepare eeprom */ -s-eeprom.contents[0] = 0x8129; -#if 1 -// PCI vendor and device ID should be mirrored here -s-eeprom.contents[1] = PCI_VENDOR_ID_REALTEK; -s-eeprom.contents[2] = PCI_DEVICE_ID_REALTEK_8139; -#endif - -s-eeprom.contents[7] = s-conf.macaddr.a[0] | s-conf.macaddr.a[1] 8; -s-eeprom.contents[8] = s-conf.macaddr.a[2] | s-conf.macaddr.a[3] 8; -s-eeprom.contents[9] = s-conf.macaddr.a[4] | s-conf.macaddr.a[5] 8; - /* mark all status registers as owned by host */ for (i = 0; i 4; ++i) { @@ -3392,6 +3380,18 @@ static int pci_rtl8139_init(PCIDevice *dev) qemu_macaddr_default_if_unset(s-conf.macaddr); +/* prepare eeprom */ +s-eeprom.contents[0] = 0x8129; +#if 1 +/* PCI vendor and device ID should be mirrored here */ +s-eeprom.contents[1] = PCI_VENDOR_ID_REALTEK; +s-eeprom.contents[2] = PCI_DEVICE_ID_REALTEK_8139; +#endif + +s-eeprom.contents[7] = s-conf.macaddr.a[0] | s-conf.macaddr.a[1] 8; +s-eeprom.contents[8] = s-conf.macaddr.a[2] | s-conf.macaddr.a[3] 8; +s-eeprom.contents[9] = s-conf.macaddr.a[4] | s-conf.macaddr.a[5] 8; + s-nic = qemu_new_nic(net_rtl8139_info, s-conf, dev-qdev.info-name, dev-qdev.id, s); qemu_format_nic_info_str(s-nic-nc, s-conf.macaddr.a); -- 1.7.2.3
Re: [Qemu-devel] [PATCH] moving eeprom initialization
On Sun, Mar 6, 2011 at 9:38 PM, Gerhard Wiesinger li...@wiesinger.com wrote: AMD fix is now upstream. Please merge it. oh sorry. did not see; will do. -- William
[Qemu-devel] [PATCH] moving eeprom initialization
The initialization should not be only on reset but also when initializing the device. It resolves a bug when hot plugging a pci network device: the mac address was always null. --- hw/pcnet.c | 27 ++- hw/rtl8139.c | 24 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/hw/pcnet.c b/hw/pcnet.c index db52dc5..4e30e9c 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c @@ -1557,19 +1557,6 @@ uint32_t pcnet_bcr_readw(PCNetState *s, uint32_t rap) void pcnet_h_reset(void *opaque) { PCNetState *s = opaque; -int i; -uint16_t checksum; - -/* Initialize the PROM */ - -memcpy(s-prom, s-conf.macaddr.a, 6); -s-prom[12] = s-prom[13] = 0x00; -s-prom[14] = s-prom[15] = 0x57; - -for (i = 0,checksum = 0; i 16; i++) -checksum += s-prom[i]; -*(uint16_t *)s-prom[12] = cpu_to_le16(checksum); - s-bcr[BCR_MSRDA] = 0x0005; s-bcr[BCR_MSWRA] = 0x0005; @@ -1736,6 +1723,9 @@ void pcnet_common_cleanup(PCNetState *d) int pcnet_common_init(DeviceState *dev, PCNetState *s, NetClientInfo *info) { +int i; +uint16_t checksum; + s-poll_timer = qemu_new_timer(vm_clock, pcnet_poll_timer, s); qemu_macaddr_default_if_unset(s-conf.macaddr); @@ -1744,5 +1734,16 @@ int pcnet_common_init(DeviceState *dev, PCNetState *s, NetClientInfo *info) add_boot_device_path(s-conf.bootindex, dev, /ethernet-phy@0); +/* Initialize the PROM */ + +memcpy(s-prom, s-conf.macaddr.a, 6); +s-prom[12] = s-prom[13] = 0x00; +s-prom[14] = s-prom[15] = 0x57; + +for (i = 0, checksum = 0; i 16; i++) { +checksum += s-prom[i]; +} +*(uint16_t *)s-prom[12] = cpu_to_le16(checksum); + return 0; } diff --git a/hw/rtl8139.c b/hw/rtl8139.c index a22530c..8356d5a 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -1189,18 +1189,6 @@ static void rtl8139_reset(DeviceState *d) rtl8139_update_irq(s); -/* prepare eeprom */ -s-eeprom.contents[0] = 0x8129; -#if 1 -// PCI vendor and device ID should be mirrored here -s-eeprom.contents[1] = PCI_VENDOR_ID_REALTEK; -s-eeprom.contents[2] = PCI_DEVICE_ID_REALTEK_8139; -#endif - -s-eeprom.contents[7] = s-conf.macaddr.a[0] | s-conf.macaddr.a[1] 8; -s-eeprom.contents[8] = s-conf.macaddr.a[2] | s-conf.macaddr.a[3] 8; -s-eeprom.contents[9] = s-conf.macaddr.a[4] | s-conf.macaddr.a[5] 8; - /* mark all status registers as owned by host */ for (i = 0; i 4; ++i) { @@ -3392,6 +3380,18 @@ static int pci_rtl8139_init(PCIDevice *dev) qemu_macaddr_default_if_unset(s-conf.macaddr); +/* prepare eeprom */ +s-eeprom.contents[0] = 0x8129; +#if 1 +/* PCI vendor and device ID should be mirrored here */ +s-eeprom.contents[1] = PCI_VENDOR_ID_REALTEK; +s-eeprom.contents[2] = PCI_DEVICE_ID_REALTEK_8139; +#endif + +s-eeprom.contents[7] = s-conf.macaddr.a[0] | s-conf.macaddr.a[1] 8; +s-eeprom.contents[8] = s-conf.macaddr.a[2] | s-conf.macaddr.a[3] 8; +s-eeprom.contents[9] = s-conf.macaddr.a[4] | s-conf.macaddr.a[5] 8; + s-nic = qemu_new_nic(net_rtl8139_info, s-conf, dev-qdev.info-name, dev-qdev.id, s); qemu_format_nic_info_str(s-nic-nc, s-conf.macaddr.a); -- William