tests: usb: Generic usb device hotplug
use usb-tablet as a hotplugged usb device. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
parent
fbd942c993
commit
b393768314
@ -344,10 +344,10 @@ tests/ac97-test$(EXESUF): tests/ac97-test.o
|
|||||||
tests/es1370-test$(EXESUF): tests/es1370-test.o
|
tests/es1370-test$(EXESUF): tests/es1370-test.o
|
||||||
tests/intel-hda-test$(EXESUF): tests/intel-hda-test.o
|
tests/intel-hda-test$(EXESUF): tests/intel-hda-test.o
|
||||||
tests/ioh3420-test$(EXESUF): tests/ioh3420-test.o
|
tests/ioh3420-test$(EXESUF): tests/ioh3420-test.o
|
||||||
tests/usb-hcd-ohci-test$(EXESUF): tests/usb-hcd-ohci-test.o
|
tests/usb-hcd-ohci-test$(EXESUF): tests/usb-hcd-ohci-test.o $(libqos-usb-obj-y)
|
||||||
tests/usb-hcd-uhci-test$(EXESUF): tests/usb-hcd-uhci-test.o $(libqos-usb-obj-y)
|
tests/usb-hcd-uhci-test$(EXESUF): tests/usb-hcd-uhci-test.o $(libqos-usb-obj-y)
|
||||||
tests/usb-hcd-ehci-test$(EXESUF): tests/usb-hcd-ehci-test.o $(libqos-usb-obj-y)
|
tests/usb-hcd-ehci-test$(EXESUF): tests/usb-hcd-ehci-test.o $(libqos-usb-obj-y)
|
||||||
tests/usb-hcd-xhci-test$(EXESUF): tests/usb-hcd-xhci-test.o
|
tests/usb-hcd-xhci-test$(EXESUF): tests/usb-hcd-xhci-test.o $(libqos-usb-obj-y)
|
||||||
tests/vhost-user-test$(EXESUF): tests/vhost-user-test.o qemu-char.o qemu-timer.o $(qtest-obj-y)
|
tests/vhost-user-test$(EXESUF): tests/vhost-user-test.o qemu-char.o qemu-timer.o $(qtest-obj-y)
|
||||||
tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_helper.o
|
tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_helper.o
|
||||||
tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o libqemuutil.a libqemustub.a
|
tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o libqemuutil.a libqemustub.a
|
||||||
|
@ -35,3 +35,37 @@ void uhci_port_test(struct qhc *hc, int port, uint16_t expect)
|
|||||||
|
|
||||||
g_assert((value & mask) == (expect & mask));
|
g_assert((value & mask) == (expect & mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void usb_test_hotplug(const char *hcd_id, const int port,
|
||||||
|
void (*port_check)(void))
|
||||||
|
{
|
||||||
|
QDict *response;
|
||||||
|
char *cmd;
|
||||||
|
|
||||||
|
cmd = g_strdup_printf("{'execute': 'device_add',"
|
||||||
|
" 'arguments': {"
|
||||||
|
" 'driver': 'usb-tablet',"
|
||||||
|
" 'port': '%d',"
|
||||||
|
" 'bus': '%s.0',"
|
||||||
|
" 'id': 'usbdev%d'"
|
||||||
|
"}}", port, hcd_id, port);
|
||||||
|
response = qmp(cmd);
|
||||||
|
g_free(cmd);
|
||||||
|
g_assert(response);
|
||||||
|
g_assert(!qdict_haskey(response, "error"));
|
||||||
|
QDECREF(response);
|
||||||
|
|
||||||
|
if (port_check) {
|
||||||
|
port_check();
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd = g_strdup_printf("{'execute': 'device_del',"
|
||||||
|
" 'arguments': {"
|
||||||
|
" 'id': 'usbdev%d'"
|
||||||
|
"}}", port);
|
||||||
|
response = qmp(cmd);
|
||||||
|
g_free(cmd);
|
||||||
|
g_assert(response);
|
||||||
|
g_assert(qdict_haskey(response, "event"));
|
||||||
|
g_assert(!strcmp(qdict_get_str(response, "event"), "DEVICE_DELETED"));
|
||||||
|
}
|
||||||
|
@ -11,4 +11,7 @@ struct qhc {
|
|||||||
void qusb_pci_init_one(QPCIBus *pcibus, struct qhc *hc,
|
void qusb_pci_init_one(QPCIBus *pcibus, struct qhc *hc,
|
||||||
uint32_t devfn, int bar);
|
uint32_t devfn, int bar);
|
||||||
void uhci_port_test(struct qhc *hc, int port, uint16_t expect);
|
void uhci_port_test(struct qhc *hc, int port, uint16_t expect);
|
||||||
|
|
||||||
|
void usb_test_hotplug(const char *bus_name, const int port,
|
||||||
|
void (*port_check)(void));
|
||||||
#endif
|
#endif
|
||||||
|
@ -128,6 +128,19 @@ static void pci_ehci_port_2(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pci_ehci_port_3_hotplug(void)
|
||||||
|
{
|
||||||
|
/* check for presence of hotplugged usb-tablet */
|
||||||
|
g_assert(pcibus != NULL);
|
||||||
|
ehci_port_test(&ehci1, 2, PORTSC_PPOWER | PORTSC_CONNECT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pci_ehci_port_hotplug(void)
|
||||||
|
{
|
||||||
|
usb_test_hotplug("ich9-ehci-1", 3, pci_ehci_port_3_hotplug);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@ -139,6 +152,7 @@ int main(int argc, char **argv)
|
|||||||
qtest_add_func("/ehci/pci/ehci-config", pci_ehci_config);
|
qtest_add_func("/ehci/pci/ehci-config", pci_ehci_config);
|
||||||
qtest_add_func("/ehci/pci/uhci-port-2", pci_uhci_port_2);
|
qtest_add_func("/ehci/pci/uhci-port-2", pci_uhci_port_2);
|
||||||
qtest_add_func("/ehci/pci/ehci-port-2", pci_ehci_port_2);
|
qtest_add_func("/ehci/pci/ehci-port-2", pci_ehci_port_2);
|
||||||
|
qtest_add_func("/ehci/pci/ehci-port-3-hotplug", pci_ehci_port_hotplug);
|
||||||
|
|
||||||
qtest_start("-machine q35 -device ich9-usb-ehci1,bus=pcie.0,addr=1d.7,"
|
qtest_start("-machine q35 -device ich9-usb-ehci1,bus=pcie.0,addr=1d.7,"
|
||||||
"multifunction=on,id=ich9-ehci-1 "
|
"multifunction=on,id=ich9-ehci-1 "
|
||||||
|
@ -11,15 +11,18 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "libqtest.h"
|
#include "libqtest.h"
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "libqos/usb.h"
|
||||||
|
|
||||||
|
|
||||||
static void test_ohci_init(void)
|
static void test_ohci_init(void)
|
||||||
{
|
{
|
||||||
qtest_start("-device pci-ohci,id=ohci");
|
|
||||||
|
|
||||||
qtest_end();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_ohci_hotplug(void)
|
||||||
|
{
|
||||||
|
usb_test_hotplug("ohci", 1, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -28,8 +31,11 @@ int main(int argc, char **argv)
|
|||||||
g_test_init(&argc, &argv, NULL);
|
g_test_init(&argc, &argv, NULL);
|
||||||
|
|
||||||
qtest_add_func("/ohci/pci/init", test_ohci_init);
|
qtest_add_func("/ohci/pci/init", test_ohci_init);
|
||||||
|
qtest_add_func("/ohci/pci/hotplug", test_ohci_hotplug);
|
||||||
|
|
||||||
|
qtest_start("-device pci-ohci,id=ohci");
|
||||||
ret = g_test_run();
|
ret = g_test_run();
|
||||||
|
qtest_end();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -19,17 +19,32 @@ static void test_uhci_init(void)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_port_1(void)
|
static void test_port(int port)
|
||||||
{
|
{
|
||||||
QPCIBus *pcibus;
|
QPCIBus *pcibus;
|
||||||
struct qhc uhci;
|
struct qhc uhci;
|
||||||
|
|
||||||
|
g_assert(port > 0);
|
||||||
pcibus = qpci_init_pc();
|
pcibus = qpci_init_pc();
|
||||||
g_assert(pcibus != NULL);
|
g_assert(pcibus != NULL);
|
||||||
qusb_pci_init_one(pcibus, &uhci, QPCI_DEVFN(0x1d, 0), 4);
|
qusb_pci_init_one(pcibus, &uhci, QPCI_DEVFN(0x1d, 0), 4);
|
||||||
uhci_port_test(&uhci, 0, UHCI_PORT_CCS);
|
uhci_port_test(&uhci, port - 1, UHCI_PORT_CCS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_port_1(void)
|
||||||
|
{
|
||||||
|
test_port(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_port_2(void)
|
||||||
|
{
|
||||||
|
test_port(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_uhci_hotplug(void)
|
||||||
|
{
|
||||||
|
usb_test_hotplug("uhci", 2, test_port_2);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -39,6 +54,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
qtest_add_func("/uhci/pci/init", test_uhci_init);
|
qtest_add_func("/uhci/pci/init", test_uhci_init);
|
||||||
qtest_add_func("/uhci/pci/port1", test_port_1);
|
qtest_add_func("/uhci/pci/port1", test_port_1);
|
||||||
|
qtest_add_func("/uhci/pci/hotplug", test_uhci_hotplug);
|
||||||
|
|
||||||
qtest_start("-device piix3-usb-uhci,id=uhci,addr=1d.0"
|
qtest_start("-device piix3-usb-uhci,id=uhci,addr=1d.0"
|
||||||
" -device usb-tablet,bus=uhci.0,port=1");
|
" -device usb-tablet,bus=uhci.0,port=1");
|
||||||
|
@ -11,15 +11,17 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "libqtest.h"
|
#include "libqtest.h"
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "libqos/usb.h"
|
||||||
|
|
||||||
|
|
||||||
static void test_xhci_init(void)
|
static void test_xhci_init(void)
|
||||||
{
|
{
|
||||||
qtest_start("-device nec-usb-xhci,id=xhci");
|
|
||||||
|
|
||||||
qtest_end();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_xhci_hotplug(void)
|
||||||
|
{
|
||||||
|
usb_test_hotplug("xhci", 1, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -28,8 +30,11 @@ int main(int argc, char **argv)
|
|||||||
g_test_init(&argc, &argv, NULL);
|
g_test_init(&argc, &argv, NULL);
|
||||||
|
|
||||||
qtest_add_func("/xhci/pci/init", test_xhci_init);
|
qtest_add_func("/xhci/pci/init", test_xhci_init);
|
||||||
|
qtest_add_func("/xhci/pci/hotplug", test_xhci_hotplug);
|
||||||
|
|
||||||
|
qtest_start("-device nec-usb-xhci,id=xhci");
|
||||||
ret = g_test_run();
|
ret = g_test_run();
|
||||||
|
qtest_end();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user