Patchwork [RFC,v2,4/5] ne2k_isa: qdev-ify.

login
register
mail settings
Submitter Gerd Hoffmann
Date Oct. 7, 2009, 12:36 p.m.
Message ID <1254918996-26050-5-git-send-email-kraxel@redhat.com>
Download mbox | patch
Permalink /patch/35267/
State RFC
Headers show

Comments

Gerd Hoffmann - Oct. 7, 2009, 12:36 p.m.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/ne2000-isa.c |   25 +++++++++++++++++--------
 hw/ne2000.h     |    3 ++-
 2 files changed, 19 insertions(+), 9 deletions(-)
Mark McLoughlin - Oct. 7, 2009, 1:50 p.m.
On Wed, 2009-10-07 at 14:36 +0200, Gerd Hoffmann wrote:

> -    s->vc = qdev_get_vlan_client(&dev->qdev,
> -                                 ne2000_can_receive, ne2000_receive, NULL,
> -                                 isa_ne2000_cleanup, s);
> -    qemu_format_nic_info_str(s->vc, s->macaddr);
> +    if (s->vlan != -1) {
> +        s->vc = qemu_new_vlan_client(qemu_find_vlan(s->vlan, 1),
> +                                     dev->qdev.info->name, dev->qdev.id,
> +                                     ne2000_can_receive, ne2000_receive, NULL,
> +                                     isa_ne2000_cleanup, s);
> +        qemu_format_nic_info_str(s->vc, s->macaddr);
> +    } else {
> +        qemu_error("warning: no vlan specfied, ne2k_isa is unconnected\n");
> +    }

I'll be posting a patch later which allows qemu_new_vlan_client() to
take a NULL vlan thereafter drop any packets passed to it.

I think that makes more sense, as VLANClientState should become a
NetClient structure which can represent a NIC, backend or even a vlan
itself.

Cheers,
Mark.
Gerd Hoffmann - Oct. 7, 2009, 2:07 p.m.
On 10/07/09 15:50, Mark McLoughlin wrote:
> On Wed, 2009-10-07 at 14:36 +0200, Gerd Hoffmann wrote:
>
>> -    s->vc = qdev_get_vlan_client(&dev->qdev,
>> -                                 ne2000_can_receive, ne2000_receive, NULL,
>> -                                 isa_ne2000_cleanup, s);
>> -    qemu_format_nic_info_str(s->vc, s->macaddr);
>> +    if (s->vlan != -1) {
>> +        s->vc = qemu_new_vlan_client(qemu_find_vlan(s->vlan, 1),
>> +                                     dev->qdev.info->name, dev->qdev.id,
>> +                                     ne2000_can_receive, ne2000_receive, NULL,
>> +                                     isa_ne2000_cleanup, s);
>> +        qemu_format_nic_info_str(s->vc, s->macaddr);
>> +    } else {
>> +        qemu_error("warning: no vlan specfied, ne2k_isa is unconnected\n");
>> +    }
>
> I'll be posting a patch later which allows qemu_new_vlan_client() to
> take a NULL vlan thereafter drop any packets passed to it.
>
> I think that makes more sense, as VLANClientState should become a
> NetClient structure which can represent a NIC, backend or even a vlan
> itself.

Fine with me.  I just had to pull out something out of thin air as 
placeholder for net changes which are in the pipeline but not posted 
yet.  Will adjust to whatever comes with for the next respin ;)

cheers,
   Gerd

Patch

diff --git a/hw/ne2000-isa.c b/hw/ne2000-isa.c
index 54c0478..7a24088 100644
--- a/hw/ne2000-isa.c
+++ b/hw/ne2000-isa.c
@@ -65,13 +65,18 @@  static int isa_ne2000_initfn(ISADevice *dev)
 
     isa_init_irq(dev, &s->irq, isa->isairq);
 
-    qdev_get_macaddr(&dev->qdev, s->macaddr);
+    qemu_macaddr_default_if_unset(s->macaddr);
     ne2000_reset(s);
 
-    s->vc = qdev_get_vlan_client(&dev->qdev,
-                                 ne2000_can_receive, ne2000_receive, NULL,
-                                 isa_ne2000_cleanup, s);
-    qemu_format_nic_info_str(s->vc, s->macaddr);
+    if (s->vlan != -1) {
+        s->vc = qemu_new_vlan_client(qemu_find_vlan(s->vlan, 1),
+                                     dev->qdev.info->name, dev->qdev.id,
+                                     ne2000_can_receive, ne2000_receive, NULL,
+                                     isa_ne2000_cleanup, s);
+        qemu_format_nic_info_str(s->vc, s->macaddr);
+    } else {
+        qemu_error("warning: no vlan specfied, ne2k_isa is unconnected\n");
+    }
 
     register_savevm("ne2000", -1, 2, ne2000_save, ne2000_load, s);
     return 0;
@@ -84,9 +89,11 @@  void isa_ne2000_init(int base, int irq, NICInfo *nd)
     qemu_check_nic_model(nd, "ne2k_isa");
 
     dev = isa_create("ne2k_isa");
-    dev->qdev.nd = nd; /* hack alert */
     qdev_prop_set_uint32(&dev->qdev, "iobase", base);
     qdev_prop_set_uint32(&dev->qdev, "irq",    irq);
+    qdev_prop_set_macaddr(&dev->qdev, "mac",   nd->macaddr);
+    if (nd->vlan)
+        qdev_prop_set_int32(&dev->qdev, "vlan",   nd->vlan->id);
     qdev_init(&dev->qdev);
 }
 
@@ -95,8 +102,10 @@  static ISADeviceInfo ne2000_isa_info = {
     .qdev.size  = sizeof(ISANE2000State),
     .init       = isa_ne2000_initfn,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_HEX32("iobase", ISANE2000State, iobase, 0x300),
-        DEFINE_PROP_UINT32("irq",   ISANE2000State, isairq, 9),
+        DEFINE_PROP_HEX32("iobase", ISANE2000State, iobase,       0x300),
+        DEFINE_PROP_UINT32("irq",   ISANE2000State, isairq,       9),
+        DEFINE_PROP_MACADDR("mac",  ISANE2000State, ne2000.macaddr),
+        DEFINE_PROP_INT32("vlan",   ISANE2000State, ne2000.vlan,  -1),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/ne2000.h b/hw/ne2000.h
index 92a2ddb..7936fb2 100644
--- a/hw/ne2000.h
+++ b/hw/ne2000.h
@@ -22,8 +22,9 @@  typedef struct NE2000State {
     uint8_t curpag;
     uint8_t mult[8]; /* multicast mask array */
     qemu_irq irq;
+    int32_t vlan;
     VLANClientState *vc;
-    uint8_t macaddr[6];
+    macaddr_t macaddr;
     uint8_t mem[NE2000_MEM_SIZE];
 } NE2000State;