[Qemu-devel] Re: [PATCH] moving eeprom initialization

2011-03-13 Thread Blue Swirl
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

2011-03-06 Thread Wen Congyang
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

2011-03-05 Thread Blue Swirl
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

2011-03-02 Thread William Dauchy
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

2011-03-02 Thread Gerhard Wiesinger

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

2011-03-02 Thread William Dauchy
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