usb-net: use qdev for -usbdevice

Rebased to master, adapted to device renaming by armbru,
no other changes.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Gerd Hoffmann 2009-12-15 10:20:57 +01:00 committed by Anthony Liguori
parent 15ff770544
commit 42be86ce95
3 changed files with 47 additions and 52 deletions

View file

@ -1420,8 +1420,7 @@ static void usbnet_cleanup(VLANClientState *nc)
{
USBNetState *s = DO_UPCAST(NICState, nc, nc)->opaque;
rndis_clear_responsequeue(s);
qemu_free(s);
s->nic = NULL;
}
static void usb_net_handle_destroy(USBDevice *dev)
@ -1429,9 +1428,18 @@ 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->nic->nc);
}
static NetClientInfo net_usbnet_info = {
.type = NET_CLIENT_TYPE_NIC,
.size = sizeof(NICState),
.can_receive = usbnet_can_receive,
.receive = usbnet_receive,
.cleanup = usbnet_cleanup,
};
static int usb_net_initfn(USBDevice *dev)
{
USBNetState *s = DO_UPCAST(USBNetState, dev, dev);
@ -1447,43 +1455,45 @@ 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->nic = qemu_new_nic(&net_usbnet_info, &s->conf,
s->dev.qdev.info->name, s->dev.qdev.id, s);
qemu_format_nic_info_str(&s->nic->nc, 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;
}
static NetClientInfo net_usbnet_info = {
.type = NET_CLIENT_TYPE_NIC,
.size = sizeof(NICState),
.can_receive = usbnet_can_receive,
.receive = usbnet_receive,
.cleanup = usbnet_cleanup,
};
USBDevice *usb_net_init(NICInfo *nd)
static USBDevice *usb_net_init(const char *cmdline)
{
USBDevice *dev;
USBNetState *s;
QemuOpts *opts;
int idx;
dev = usb_create_simple(NULL /* FIXME */, "usb-net");
s = DO_UPCAST(USBNetState, dev, dev);
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");
memcpy(s->conf.macaddr.a, nd->macaddr, sizeof(nd->macaddr));
s->conf.vlan = nd->vlan;
s->conf.peer = nd->netdev;
idx = net_client_init(NULL, opts, 0);
if (idx == -1) {
return NULL;
}
s->nic = qemu_new_nic(&net_usbnet_info, &s->conf,
nd->model, nd->name, s);
qemu_format_nic_info_str(&s->nic->nc, 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]);
fprintf(stderr, "usbnet: initialized mac %02x:%02x:%02x:%02x:%02x:%02x\n",
s->conf.macaddr.a[0], 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 (USBDevice *) s;
dev = usb_create(NULL /* FIXME */, "usb-net");
qdev_set_nic_properties(&dev->qdev, &nd_table[idx]);
qdev_init(&dev->qdev);
return dev;
}
static struct USBDeviceInfo net_info = {
@ -1496,6 +1506,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)

View file

@ -258,9 +258,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);

18
vl.c
View file

@ -2654,24 +2654,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)));