Patchwork usb-net: use qdev for -usbdevice

login
register
mail settings
Submitter Gerd Hoffmann
Date Nov. 17, 2009, 10:26 a.m.
Message ID <1258453577-4388-1-git-send-email-kraxel@redhat.com>
Download mbox | patch
Permalink /patch/38622/
State New
Headers show

Comments

Gerd Hoffmann - Nov. 17, 2009, 10:26 a.m.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/usb-net.c |   78 +++++++++++++++++++++++++++++++++++----------------------
 hw/usb.h     |    3 --
 vl.c         |   18 -------------
 3 files changed, 48 insertions(+), 51 deletions(-)
Anthony Liguori - Dec. 2, 2009, 4:29 p.m.
Can you update this against staging (or master if you want 24 hours) to 
take into account Mark's nic refactoring series?  The changes looked 
non-trivial to me.

Regards,

Anthony Liguori

Patch

diff --git a/hw/usb-net.c b/hw/usb-net.c
index 9c6549c..b2d01b6 100644
--- a/hw/usb-net.c
+++ b/hw/usb-net.c
@@ -610,7 +610,6 @@  typedef struct USBNetState {
     uint32_t media_state;
     uint16_t filter;
     uint32_t vendorid;
-    uint8_t mac[6];
 
     unsigned int out_ptr;
     uint8_t out_buf[2048];
@@ -621,6 +620,7 @@  typedef struct USBNetState {
 
     char usbstring_mac[13];
     VLANClientState *vc;
+    NICConf conf;
     QTAILQ_HEAD(rndis_resp_head, rndis_response) rndis_resp;
 } USBNetState;
 
@@ -741,12 +741,12 @@  static int ndis_query(USBNetState *s, uint32_t oid,
     /* ieee802.3 OIDs (table 4-3) */
     /* mandatory */
     case OID_802_3_PERMANENT_ADDRESS:
-        memcpy(outbuf, s->mac, 6);
+        memcpy(outbuf, s->conf.macaddr.a, 6);
         return 6;
 
     /* mandatory */
     case OID_802_3_CURRENT_ADDRESS:
-        memcpy(outbuf, s->mac, 6);
+        memcpy(outbuf, s->conf.macaddr.a, 6);
         return 6;
 
     /* mandatory */
@@ -1420,15 +1420,14 @@  static void usbnet_cleanup(VLANClientState *vc)
 {
     USBNetState *s = vc->opaque;
 
-    rndis_clear_responsequeue(s);
-    qemu_free(s);
+    s->vc = NULL;
 }
 
 static void usb_net_handle_destroy(USBDevice *dev)
 {
     USBNetState *s = (USBNetState *) dev;
 
-    /* TODO: remove the nd_table[] entry */
+    rndis_clear_responsequeue(s);
     qemu_del_vlan_client(s->vc);
 }
 
@@ -1447,42 +1446,55 @@  static int usb_net_initfn(USBDevice *dev)
     s->media_state = 0;	/* NDIS_MEDIA_STATE_CONNECTED */;
     s->filter = 0;
     s->vendorid = 0x1234;
+
+    qemu_macaddr_default_if_unset(&s->conf.macaddr);
+    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_NIC,
+                                 s->conf.vlan, s->conf.peer,
+                                 dev->qdev.info->name, dev->qdev.id,
+                                 usbnet_can_receive,
+                                 usbnet_receive,
+                                 NULL, NULL,
+                                 usbnet_cleanup, s);
+    qemu_format_nic_info_str(s->vc, s->conf.macaddr.a);
+    snprintf(s->usbstring_mac, sizeof(s->usbstring_mac),
+             "%02x%02x%02x%02x%02x%02x",
+             0x40,
+             s->conf.macaddr.a[1],
+             s->conf.macaddr.a[2],
+             s->conf.macaddr.a[3],
+             s->conf.macaddr.a[4],
+             s->conf.macaddr.a[5]);
+
     return 0;
 }
 
-USBDevice *usb_net_init(NICInfo *nd)
+static USBDevice *usb_net_init(const char *cmdline)
 {
     USBDevice *dev;
-    USBNetState *s;
-
-    dev = usb_create_simple(NULL /* FIXME */, "QEMU USB Network Interface");
-    s = DO_UPCAST(USBNetState, dev, dev);
+    QemuOpts *opts;
+    int idx;
 
-    memcpy(s->mac, nd->macaddr, 6);
-
-    s->vc = nd->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_NIC,
-                                          nd->vlan, nd->netdev,
-                                          nd->model, nd->name,
-                                          usbnet_can_receive,
-                                          usbnet_receive,
-                                          NULL, NULL,
-                                          usbnet_cleanup, s);
+    opts = qemu_opts_parse(&qemu_net_opts, cmdline, NULL);
+    if (!opts) {
+        return NULL;
+    }
+    qemu_opt_set(opts, "type", "nic");
+    qemu_opt_set(opts, "model", "usb");
 
-    qemu_format_nic_info_str(s->vc, s->mac);
+    idx = net_client_init(NULL, opts, 0);
+    if (idx == -1) {
+        return NULL;
+    }
 
-    snprintf(s->usbstring_mac, sizeof(s->usbstring_mac),
-                    "%02x%02x%02x%02x%02x%02x",
-                    0x40, s->mac[1], s->mac[2],
-                    s->mac[3], s->mac[4], s->mac[5]);
-    fprintf(stderr, "usbnet: initialized mac %02x:%02x:%02x:%02x:%02x:%02x\n",
-                    s->mac[0], s->mac[1], s->mac[2],
-                    s->mac[3], s->mac[4], s->mac[5]);
-
-    return (USBDevice *) s;
+    dev = usb_create(NULL /* FIXME */, "QEMU USB Network Interface");
+    qdev_set_nic_properties(&dev->qdev, &nd_table[idx]);
+    qdev_init(&dev->qdev);
+    return dev;
 }
 
 static struct USBDeviceInfo net_info = {
     .qdev.name      = "QEMU USB Network Interface",
+    .qdev.alias     = "usb-net",
     .qdev.size      = sizeof(USBNetState),
     .init           = usb_net_initfn,
     .handle_packet  = usb_generic_handle_packet,
@@ -1490,6 +1502,12 @@  static struct USBDeviceInfo net_info = {
     .handle_control = usb_net_handle_control,
     .handle_data    = usb_net_handle_data,
     .handle_destroy = usb_net_handle_destroy,
+    .usbdevice_name = "net",
+    .usbdevice_init = usb_net_init,
+    .qdev.props     = (Property[]) {
+        DEFINE_NIC_PROPERTIES(USBNetState, conf),
+        DEFINE_PROP_END_OF_LIST(),
+    }
 };
 
 static void usb_net_register_devices(void)
diff --git a/hw/usb.h b/hw/usb.h
index 351c466..3dc79d6 100644
--- a/hw/usb.h
+++ b/hw/usb.h
@@ -256,9 +256,6 @@  void usb_host_info(Monitor *mon);
 /* usb-hid.c */
 void usb_hid_datain_cb(USBDevice *dev, void *opaque, void (*datain)(void *));
 
-/* usb-net.c */
-USBDevice *usb_net_init(NICInfo *nd);
-
 /* usb-bt.c */
 USBDevice *usb_bt_init(HCIInfo *hci);
 
diff --git a/vl.c b/vl.c
index fff8e8d..6c7cf72 100644
--- a/vl.c
+++ b/vl.c
@@ -2543,24 +2543,6 @@  static int usb_device_add(const char *devname, int is_hotplug)
     /* the other ones */
     if (strstart(devname, "host:", &p)) {
         dev = usb_host_device_open(p);
-    } else if (strstart(devname, "net:", &p)) {
-        QemuOpts *opts;
-        int idx;
-
-        opts = qemu_opts_parse(&qemu_net_opts, p, NULL);
-        if (!opts) {
-            return -1;
-        }
-
-        qemu_opt_set(opts, "type", "nic");
-        qemu_opt_set(opts, "model", "usb");
-
-        idx = net_client_init(NULL, opts, 0);
-        if (idx == -1) {
-            return -1;
-        }
-
-        dev = usb_net_init(&nd_table[idx]);
     } else if (!strcmp(devname, "bt") || strstart(devname, "bt:", &p)) {
         dev = usb_bt_init(devname[2] ? hci_init(p) :
                         bt_new_hci(qemu_find_bt_vlan(0)));