mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
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:
parent
15ff770544
commit
42be86ce95
3 changed files with 47 additions and 52 deletions
78
hw/usb-net.c
78
hw/usb-net.c
|
@ -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)
|
||||
|
|
3
hw/usb.h
3
hw/usb.h
|
@ -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
18
vl.c
|
@ -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)));
|
||||
|
|
Loading…
Reference in a new issue