socsvn commit: r255958 - in soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb: . gpl include/hw
syuu at FreeBSD.org
syuu at FreeBSD.org
Thu Aug 15 04:30:04 UTC 2013
Author: syuu
Date: Thu Aug 15 04:30:03 2013
New Revision: 255958
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255958
Log:
trying to enable device registration
Modified:
soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/dev-hub.c
soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c
soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/dev-serial.c
soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c
soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/include/hw/usb.h
Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/dev-hub.c
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/dev-hub.c Thu Aug 15 01:42:46 2013 (r255957)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/dev-hub.c Thu Aug 15 04:30:03 2013 (r255958)
@@ -28,8 +28,6 @@
//#include "qemu/error-report.h"
#include <string.h>
-#define NUM_PORTS 8
-
#define trace_usb_hub_attach(a,b)
#define trace_usb_hub_detach(a,b)
#define trace_usb_hub_reset(a)
@@ -38,6 +36,8 @@
#define trace_usb_hub_set_port_feature(a,b,c)
#define trace_usb_hub_clear_port_feature(a,b,c)
+#if 0
+#define NUM_PORTS 8
typedef struct USBHubPort {
USBPort port;
@@ -51,6 +51,7 @@
USBEndpoint *intr;
USBHubPort ports[NUM_PORTS];
} USBHubState;
+#endif
#define ClearHubFeature (0x2000 | USB_REQ_CLEAR_FEATURE)
#define ClearPortFeature (0x2300 | USB_REQ_CLEAR_FEATURE)
@@ -515,7 +516,6 @@
}
}
-/*
static USBPortOps usb_hub_port_ops = {
.attach = usb_hub_attach,
.detach = usb_hub_detach,
@@ -523,7 +523,6 @@
.wakeup = usb_hub_wakeup,
.complete = usb_hub_complete,
};
-*/
static int usb_hub_initfn(USBDevice *dev)
{
@@ -532,7 +531,7 @@
int i;
if (dev->port->hubcount == 5) {
-// error_report("usb hub chain too deep");
+ error_report("usb hub chain too deep");
return -1;
}
@@ -541,11 +540,9 @@
s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);
for (i = 0; i < NUM_PORTS; i++) {
port = &s->ports[i];
- /*
usb_register_port(usb_bus_from_device(dev),
&port->port, s, i, &usb_hub_port_ops,
USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL);
- */
usb_port_location(&port->port, dev->port, i+1);
}
usb_hub_handle_reset(dev);
@@ -575,12 +572,12 @@
VMSTATE_END_OF_LIST()
}
};
+*/
-static void usb_hub_class_initfn(ObjectClass *klass, void *data)
-{
- DeviceClass *dc = DEVICE_CLASS(klass);
- USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
+void usb_hub_class_initfn(USBDeviceClass *uc, void *data);
+void usb_hub_class_initfn(USBDeviceClass *uc, void *data)
+{
uc->init = usb_hub_initfn;
uc->product_desc = "QEMU USB Hub";
uc->usb_desc = &desc_hub;
@@ -589,10 +586,11 @@
uc->handle_control = usb_hub_handle_control;
uc->handle_data = usb_hub_handle_data;
uc->handle_destroy = usb_hub_handle_destroy;
- dc->fw_name = "hub";
- dc->vmsd = &vmstate_usb_hub;
+// dc->fw_name = "hub";
+// dc->vmsd = &vmstate_usb_hub;
}
+/*
static const TypeInfo hub_info = {
.name = "usb-hub",
.parent = TYPE_USB_DEVICE,
Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c Thu Aug 15 01:42:46 2013 (r255957)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/bus.c Thu Aug 15 04:30:03 2013 (r255958)
@@ -1,4 +1,6 @@
#include <string.h>
+#include <stdlib.h>
+#include <malloc_np.h>
//#include "hw/hw.h"
#include "hw/usb.h"
//#include "hw/qdev.h"
@@ -6,12 +8,34 @@
//#include "monitor/monitor.h"
//#include "trace.h"
+#define trace_usb_port_claim(a, b)
+#define trace_usb_port_attach(a,b,c,d)
+
+void pstrcpy(char *buf, int buf_size, const char *str)
+{
+ int c;
+ char *q = buf;
+
+ if (buf_size <= 0)
+ return;
+
+ for(;;) {
+ c = *str++;
+ if (c == 0 || q >= buf + buf_size - 1)
+ break;
+ *q++ = c;
+ }
+ *q = '\0';
+}
+
#if 0
static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent);
static char *usb_get_dev_path(DeviceState *dev);
static char *usb_get_fw_dev_path(DeviceState *qdev);
-static int usb_qdev_exit(DeviceState *qdev);
+#endif
+static int usb_qdev_exit(USBDevice *dev);
+#if 0
static Property usb_props[] = {
DEFINE_PROP_STRING("port", USBDevice, port_path),
@@ -75,6 +99,7 @@
void usb_bus_new(USBBus *bus, USBBusOps *ops /*, DeviceState *host*/)
{
// qbus_create_inplace(&bus->qbus, TYPE_USB_BUS, host, NULL);
+ strncpy(bus->name, TYPE_USB_BUS, sizeof(bus->name));
bus->ops = ops;
bus->busnr = next_usb_bus++;
// bus->qbus.allow_hotplug = 1; /* Yes, we can */
@@ -96,6 +121,7 @@
}
return NULL;
}
+#endif
static int usb_device_init(USBDevice *dev)
{
@@ -106,6 +132,7 @@
return 0;
}
+#if 0
USBDevice *usb_device_find_device(USBDevice *dev, uint8_t addr)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
@@ -114,6 +141,7 @@
}
return NULL;
}
+#endif
static void usb_device_handle_destroy(USBDevice *dev)
{
@@ -123,6 +151,7 @@
}
}
+#if 0
void usb_device_cancel_packet(USBDevice *dev, USBPacket *p)
{
USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
@@ -205,10 +234,8 @@
}
}
-#if 0
-static int usb_qdev_init(DeviceState *qdev)
+static int usb_qdev_init(USBDevice *dev)
{
- USBDevice *dev = USB_DEVICE(qdev);
int rc;
pstrcpy(dev->product_desc, sizeof(dev->product_desc),
@@ -228,17 +255,15 @@
if (dev->auto_attach) {
rc = usb_device_attach(dev);
if (rc != 0) {
- usb_qdev_exit(qdev);
+ usb_qdev_exit(dev);
return rc;
}
}
return 0;
}
-static int usb_qdev_exit(DeviceState *qdev)
+static int usb_qdev_exit(USBDevice *dev)
{
- USBDevice *dev = USB_DEVICE(qdev);
-
if (dev->attached) {
usb_device_detach(dev);
}
@@ -249,6 +274,7 @@
return 0;
}
+#if 0
typedef struct LegacyUSBFactory
{
const char *name;
@@ -270,32 +296,27 @@
legacy_usb_factory = g_slist_append(legacy_usb_factory, f);
}
}
+#endif
-USBDevice *usb_create(USBBus *bus, const char *name)
+USBDevice *usb_create(USBBus *bus, const char *name, size_t len)
{
- DeviceState *dev;
+ USBDevice *dev;
- dev = qdev_create(&bus->qbus, name);
- return USB_DEVICE(dev);
+ dev = (USBDevice *)calloc(1, len);
+ strncpy(dev->name, name, sizeof(dev->name));
+ return dev;
}
-USBDevice *usb_create_simple(USBBus *bus, const char *name)
+USBDevice *usb_create_simple(USBBus *bus, const char *name, size_t len)
{
- USBDevice *dev = usb_create(bus, name);
- int rc;
+ USBDevice *dev = usb_create(bus, name, len);
if (!dev) {
error_report("Failed to create USB device '%s'", name);
return NULL;
}
- rc = qdev_init(&dev->qdev);
- if (rc < 0) {
- error_report("Failed to initialize USB device '%s'", name);
- return NULL;
- }
return dev;
}
-#endif
static void usb_fill_port(USBPort *port, void *opaque, int index,
USBPortOps *ops, int speedmask)
@@ -322,13 +343,11 @@
USBBus *bus;
int i;
-#if 0
QTAILQ_FOREACH(bus, &busses, next) {
- if (strcmp(bus->qbus.name, masterbus) == 0) {
+ if (strcmp(bus->name, masterbus) == 0) {
break;
}
}
-#endif
if (!bus || !bus->ops->register_companion) {
// qerror_report(QERR_INVALID_PARAMETER_VALUE, "masterbus",
@@ -360,11 +379,10 @@
}
}
-#if 0
void usb_unregister_port(USBBus *bus, USBPort *port)
{
- if (port->dev)
- qdev_free(&port->dev->qdev);
+// if (port->dev)
+// qdev_free(&port->dev->qdev);
QTAILQ_REMOVE(&bus->free, port, next);
bus->nfree--;
}
@@ -384,13 +402,13 @@
}
if (port == NULL) {
error_report("Error: usb port %s (bus %s) not found (in use?)",
- dev->port_path, bus->qbus.name);
+ dev->port_path, bus->name);
return -1;
}
} else {
- if (bus->nfree == 1 && strcmp(object_get_typename(OBJECT(dev)), "usb-hub") != 0) {
+ if (bus->nfree == 1 && strcmp(dev->name, "usb-hub") != 0) {
/* Create a new hub and chain it on */
- usb_create_simple(bus, "usb-hub");
+ usb_create_simple(bus, "usb-hub", sizeof(struct USBHubState));
}
if (bus->nfree == 0) {
error_report("Error: tried to attach usb device %s to a bus "
@@ -412,6 +430,7 @@
return 0;
}
+#if 0
void usb_release_port(USBDevice *dev)
{
USBBus *bus = usb_bus_from_device(dev);
@@ -429,6 +448,7 @@
QTAILQ_INSERT_TAIL(&bus->free, port, next);
bus->nfree++;
}
+#endif
static void usb_mask_to_str(char *dest, size_t size,
unsigned int speedmask)
@@ -470,7 +490,7 @@
" usb device \"%s\" (%s speed)"
" to bus \"%s\", port \"%s\" (%s speed)",
dev->product_desc, devspeed,
- bus->qbus.name, port->path, portspeed);
+ bus->name, port->path, portspeed);
return -1;
}
@@ -480,6 +500,7 @@
return 0;
}
+#if 0
int usb_device_detach(USBDevice *dev)
{
USBBus *bus = usb_bus_from_device(dev);
Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/dev-serial.c
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/dev-serial.c Thu Aug 15 01:42:46 2013 (r255957)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/gpl/dev-serial.c Thu Aug 15 04:30:03 2013 (r255958)
@@ -13,6 +13,7 @@
#include <string.h>
#include <stdlib.h>
#include <limits.h>
+#include <stdio.h>
//#include "qemu-common.h"
//#include "qemu/error-report.h"
@@ -124,6 +125,7 @@
uint8_t event_trigger;
QEMUSerialSetParams params;
int latency; /* ms */
+ FILE *fp;
// CharDriverState *cs;
} USBSerialState;
@@ -385,6 +387,7 @@
for (i = 0; i < p->iov.niov; i++) {
iov = p->iov.iov + i;
// qemu_chr_fe_write(s->cs, iov->iov_base, iov->iov_len);
+ fwrite(iov->iov_base, iov->iov_len, 1, s->fp);
}
p->actual_length = p->iov.size;
break;
@@ -495,8 +498,7 @@
}
}
-#if 0
-static int usb_serial_initfn(USBDevice *dev)
+int usb_serial_initfn(USBDevice *dev)
{
USBSerialState *s = DO_UPCAST(USBSerialState, dev, dev);
@@ -504,6 +506,7 @@
usb_desc_init(dev);
dev->auto_attach = 0;
+#if 0
if (!s->cs) {
error_report("Property chardev is required");
return -1;
@@ -511,59 +514,62 @@
qemu_chr_add_handlers(s->cs, usb_serial_can_read, usb_serial_read,
usb_serial_event, s);
+#endif
+ s->fp = fopen("/tmp/usbserial.out", "w");
usb_serial_handle_reset(dev);
- if (s->cs->be_open && !dev->attached) {
+// if (s->cs->be_open && !dev->attached) {
usb_device_attach(dev);
- }
+// }
return 0;
}
-#endif
-static USBDevice *usb_serial_init(USBBus *bus, const char *filename)
+USBDevice *usb_serial_init(USBBus *bus /*, const char *filename */)
{
USBDevice *dev;
// CharDriverState *cdrv;
- uint32_t vendorid = 0, productid = 0;
+// uint32_t vendorid = 0, productid = 0;
char label[32];
static int index;
+#if 0
while (*filename && *filename != ':') {
const char *p;
char *e;
if (strstart(filename, "vendorid=", &p)) {
vendorid = strtol(p, &e, 16);
if (e == p || (*e && *e != ',' && *e != ':')) {
-// error_report("bogus vendor ID %s", p);
+ error_report("bogus vendor ID %s", p);
return NULL;
}
filename = e;
} else if (strstart(filename, "productid=", &p)) {
productid = strtol(p, &e, 16);
if (e == p || (*e && *e != ',' && *e != ':')) {
-// error_report("bogus product ID %s", p);
+ error_report("bogus product ID %s", p);
return NULL;
}
filename = e;
} else {
-// error_report("unrecognized serial USB option %s", filename);
+ error_report("unrecognized serial USB option %s", filename);
return NULL;
}
while(*filename == ',')
filename++;
}
if (!*filename) {
-// error_report("character device specification needed");
+ error_report("character device specification needed");
return NULL;
}
filename++;
+#endif
snprintf(label, sizeof(label), "usbserial%d", index++);
// cdrv = qemu_chr_new(label, filename, NULL);
// if (!cdrv)
// return NULL;
- dev = usb_create(bus, "usb-serial");
+ dev = usb_create(bus, "usb-serial", sizeof(USBSerialState));
if (!dev) {
return NULL;
}
@@ -577,23 +583,23 @@
return dev;
}
+#if 0
static USBDevice *usb_braille_init(USBBus *bus, const char *unused)
{
USBDevice *dev;
-// CharDriverState *cdrv;
+ CharDriverState *cdrv;
-// cdrv = qemu_chr_new("braille", "braille", NULL);
-// if (!cdrv)
-// return NULL;
+ cdrv = qemu_chr_new("braille", "braille", NULL);
+ if (!cdrv)
+ return NULL;
dev = usb_create(bus, "usb-braille");
-// qdev_prop_set_chr(&dev->qdev, "chardev", cdrv);
-// qdev_init_nofail(&dev->qdev);
+ qdev_prop_set_chr(&dev->qdev, "chardev", cdrv);
+ qdev_init_nofail(&dev->qdev);
return dev;
}
-#if 0
static const VMStateDescription vmstate_usb_serial = {
.name = "usb-serial",
.unmigratable = 1,
@@ -603,23 +609,22 @@
DEFINE_PROP_CHR("chardev", USBSerialState, cs),
DEFINE_PROP_END_OF_LIST(),
};
+#endif
-static void usb_serial_class_initfn(ObjectClass *klass, void *data)
+static void usb_serial_class_initfn(USBDeviceClass *uc, void *data)
{
- DeviceClass *dc = DEVICE_CLASS(klass);
- USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
-
uc->init = usb_serial_initfn;
uc->product_desc = "QEMU USB Serial";
uc->usb_desc = &desc_serial;
uc->handle_reset = usb_serial_handle_reset;
uc->handle_control = usb_serial_handle_control;
uc->handle_data = usb_serial_handle_data;
- dc->vmsd = &vmstate_usb_serial;
- dc->props = serial_properties;
- set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
+// dc->vmsd = &vmstate_usb_serial;
+// dc->props = serial_properties;
+// set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
}
+#if 0
static const TypeInfo serial_info = {
.name = "usb-serial",
.parent = TYPE_USB_DEVICE,
Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c Thu Aug 15 01:42:46 2013 (r255957)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/hcd-uhci.c Thu Aug 15 04:30:03 2013 (r255958)
@@ -1702,6 +1702,8 @@
return (value);
}
+extern USBDevice *usb_serial_init(USBBus *bus /*, const char *filename */);
+extern int usb_serial_initfn(USBDevice *dev);
static int
pci_uhci_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
{
@@ -1761,6 +1763,10 @@
uhci_reset(&sc->sc_st);
pci_emul_alloc_bar(pi, 4, PCIBAR_IO, 0x20);
+ {
+ USBDevice *dev = usb_serial_init(&sc->sc_st.bus);
+ usb_serial_initfn(dev);
+ }
return (0);
}
Modified: soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/include/hw/usb.h
==============================================================================
--- soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/include/hw/usb.h Thu Aug 15 01:42:46 2013 (r255957)
+++ soc2013/syuu/bhyve_usb/usr.sbin/bhyve/usb/include/hw/usb.h Thu Aug 15 04:30:03 2013 (r255958)
@@ -332,6 +332,7 @@
int altsetting[USB_MAX_INTERFACES];
const USBDescConfig *config;
const USBDescIface *ifaces[USB_MAX_INTERFACES];
+ char name[128];
};
typedef struct USBPortOps {
@@ -512,6 +513,7 @@
QTAILQ_HEAD(, USBPort) free;
QTAILQ_HEAD(, USBPort) used;
QTAILQ_ENTRY(USBBus) next;
+ char name[128];
};
struct USBBusOps {
@@ -525,8 +527,8 @@
void usb_legacy_register(const char *typename, const char *usbdevice_name,
USBDevice *(*usbdevice_init)(USBBus *bus,
const char *params));
-USBDevice *usb_create(USBBus *bus, const char *name);
-USBDevice *usb_create_simple(USBBus *bus, const char *name);
+USBDevice *usb_create(USBBus *bus, const char *name, size_t len);
+USBDevice *usb_create_simple(USBBus *bus, const char *name, size_t len);
USBDevice *usbdevice_create(const char *cmdline);
void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index,
USBPortOps *ops, int speedmask);
@@ -595,4 +597,21 @@
uint8_t interface_protocol);
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+#define error_report(...) fprintf(stderr, __VA_ARGS__)
+
+#define NUM_PORTS 8
+
+typedef struct USBHubPort {
+ USBPort port;
+ uint16_t wPortStatus;
+ uint16_t wPortChange;
+ uint16_t wPortChange_reported;
+} USBHubPort;
+
+typedef struct USBHubState {
+ USBDevice dev;
+ USBEndpoint *intr;
+ USBHubPort ports[NUM_PORTS];
+} USBHubState;
+
#endif
More information about the svn-soc-all
mailing list