[Qemu-devel] Re: [PATCH] moving eeprom initialization
Thanks, applied. On Sun, Mar 6, 2011 at 11:27 PM, William Dauchy wdau...@gmail.com 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 | 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] Re: [PATCH] moving eeprom initialization
At 03/07/2011 05:27 AM, William Dauchy Write: 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 Thanks for merging AMD fix. This patch works fine to me. --- 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);
[Qemu-devel] Re: [PATCH] moving eeprom initialization
On Wed, Mar 2, 2011 at 3:36 PM, William Dauchy wdau...@gmail.com 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. Missing Signed-off-by: line.
[Qemu-devel] Re: [PATCH] moving eeprom initialization
On Wed, Mar 2, 2011 at 2:36 PM, William Dauchy wdau...@gmail.com 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. --- 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 hm I just noticed your correction here http://lists.gnu.org/archive/html/qemu-devel/2011-02/msg03232.html ; sorry Anyway, I tested my version and it works fine. Regards, -- William
Re: [Qemu-devel] Re: [PATCH] moving eeprom initialization
Hello, Your patch should be based on fixes for correct EEPROM initialization, see for details: http://www.mail-archive.com/qemu-devel@nongnu.org/msg56414.html Ciao, Gerhard -- http://www.wiesinger.com/ On Wed, 2 Mar 2011, William Dauchy wrote: On Wed, Mar 2, 2011 at 2:36 PM, William Dauchy wdau...@gmail.com 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. --- 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 hm I just noticed your correction here http://lists.gnu.org/archive/html/qemu-devel/2011-02/msg03232.html ; sorry Anyway, I tested my version and it works fine. Regards, -- William
Re: [Qemu-devel] Re: [PATCH] moving eeprom initialization
On Wed, Mar 2, 2011 at 7:28 PM, Gerhard Wiesinger li...@wiesinger.com wrote: Your patch should be based on fixes for correct EEPROM initialization, see for details: http://www.mail-archive.com/qemu-devel@nongnu.org/msg56414.html This patch is not yet integrated upstream. I will correct it if needed. -- William