Go to file
aliguori 54f254f973 uhci: rewrite UHCI emulator, fully async operation with multiple outstanding transactions (Max Krasnyansky)
This is esentially a re-write of the QEMU UHCI layer. My initial goal
was to support fully async operation with multiple outstanding async
transactions. Along the way I realized that I can greatly simplify
and cleanup the overall logic. There was a lot of duplicate and confusing
code in the UHCI data structure parsing and other places.
We were actually violating UHCI spec in handling async ISOC transaction
(host controller is not supposed to write into the frame pointer).

The reason I wanted to support fully async operation is because current
synchronous version is unusable with most devices exported from host
(via usb-linux.c). Transactions take a long time and the whole VM becomes
slow as hell.

Current async support is very rudimentory and for the most part
non-functional. Single transaction at a time is simply not enough. I have
a device for which XP driver submits both IN and OUT packets at the same
time. IN packet always times out unless OUT packet makes it to the device.
Hence we must be able to process both in order for that device to work.

The new code is backwards compatible and was first tested agains original
synchronous usb-linux.c and builtin usb devices like tablet which is also
synchronous. Rewrite of the usb-linux.c is coming up next.

Async support was tested against various XP versions (ie XP, SP2, SP3) and
a bunch of different USB devices: serial port controllers, mice, keyboard,
JTAG dongles (from Xilinx and Altera).

ISOC support was only lighly tested and needs more work. It's not any worse
than current code though.

UHCI parser changes are probably somewhat hard to review without the
understanding of the UHCI spec.
The async design should be fairly easy to follow. Basically we have a list
of async objects for each pending transfer. Async objects are tagged with
the original TD (transfer descriptor) address and token. We now support
unlimited number of outstanding isoc and one outstanding bulk/intr/ctrl
transfer per QH (queue head). UHCI spec does not have a clear protocol for
the cancelation of the trasfer requests. Driver can yank out TDs on any
frame boundary. In oder to handle that I added somewhat fancy TD validation
logic logic to avoid unnecessary cancelations.

Signed-off-by: Max Krasnyansky <maxk@kernel.org>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>



git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5050 c046a42c-6fe2-441c-8c8c-71466251a162
2008-08-21 19:30:31 +00:00
audio Fix OpenBSD linker warnings 2008-08-21 17:58:08 +00:00
darwin-user variable dynamic translation buffer size 2008-05-28 12:30:31 +00:00
fpu Preliminary OpenBSD host support (based on OpenBSD patches by Todd T. Fries) 2008-08-15 18:33:42 +00:00
hw uhci: rewrite UHCI emulator, fully async operation with multiple outstanding transactions (Max Krasnyansky) 2008-08-21 19:30:31 +00:00
keymaps Improve jp106 keyboard support, by Akio Takebe. 2008-07-07 19:29:49 +00:00
linux-user Kludge to support linux-user on a PPC64 2008-08-20 22:39:28 +00:00
pc-bios bios: update from bochs release 2.3.7 2008-08-21 03:14:29 +00:00
slirp Fix OpenBSD linker warnings 2008-08-21 17:58:08 +00:00
target-alpha Fix warnings that would be generated by gcc -Wstrict-prototypes 2008-08-17 20:21:51 +00:00
target-arm ARMv6: fix SIMD add/sub carry flags (Vincent Palatin). 2008-07-19 10:46:13 +00:00
target-cris Remove dyngen leftovers. 2008-07-29 07:46:53 +00:00
target-i386 i386: Catch all non-present ptes in cpu_get_phys_page_debug (Jan Kiszka) 2008-08-18 18:00:31 +00:00
target-m68k Small cleanup of gen_intermediate_code(_internal), by Laurent Desnogues. 2008-07-18 18:01:29 +00:00
target-mips Delete unused variable. 2008-08-01 17:14:35 +00:00
target-ppc Fix encoding of efsctsiz (powerpc spe), by Tristan Gingold. 2008-08-13 11:30:10 +00:00
target-sh4 Fix warnings that would be generated by gcc -Wstrict-prototypes 2008-08-17 20:21:51 +00:00
target-sparc Fix wrwim masking (Luis Pureza) 2008-08-21 17:34:42 +00:00
tcg Relax qemu_ld/st constraints for !SOFTMMU case 2008-08-21 01:14:07 +00:00
tests Make the tests run when built with experimental gcc-cris 4.4. Prettify the logs. 2008-06-06 11:07:50 +00:00
a.out.h 64bit->win32 cross build fix. 2007-03-04 00:52:16 +00:00
aes.c Fix miscellaneous minor things, by Andre Przywara. 2007-12-17 03:15:52 +00:00
aes.h AES crypto support 2004-08-01 21:54:53 +00:00
alpha-dis.c find -type f | xargs sed -i 's/[\t ]$//g' # on most files 2007-09-16 21:08:06 +00:00
alpha.ld alpha support 2003-04-29 20:53:42 +00:00
arm-dis.c Update ARM disassembler. 2007-11-10 17:38:00 +00:00
arm-semi.c Add missing return in arm-semi, by Laurent Desnogues. 2008-07-01 16:40:04 +00:00
arm.ld Link ARM prologue closer to code segment to avoid a build failure 2008-07-10 17:21:31 +00:00
block_int.h Revert fix for CVE-2008-0928. Will be fixed in a different way later. 2008-03-11 23:30:22 +00:00
block-bochs.c Split block API from vl.h. 2007-11-11 02:51:17 +00:00
block-cloop.c Split block API from vl.h. 2007-11-11 02:51:17 +00:00
block-cow.c Split block API from vl.h. 2007-11-11 02:51:17 +00:00
block-dmg.c Add qemu_realloc(), by Gerd Hoffmann. 2008-08-06 08:37:17 +00:00
block-nbd.c Remove unnecessary #includes from block-nbd.c 2008-08-19 19:10:38 +00:00
block-parallels.c Split block API from vl.h. 2007-11-11 02:51:17 +00:00
block-qcow2.c qcow2: Try to aggregate free clusters and freed clusters (Laurent Vivier) 2008-08-14 18:11:52 +00:00
block-qcow.c Remove dead-code (else-block) from block-qcow.c, by Marc Bevand. 2008-06-05 22:00:45 +00:00
block-raw-posix.c Preliminary OpenBSD host support (based on OpenBSD patches by Todd T. Fries) 2008-08-15 18:33:42 +00:00
block-raw-win32.c Add "cache" parameter to "-drive" (Laurent Vivier). 2007-12-24 14:33:24 +00:00
block-vmdk.c Fix OpenBSD linker warnings 2008-08-21 17:58:08 +00:00
block-vpc.c Fix char* signedness, by Andre Przywara. 2007-12-16 03:16:05 +00:00
block-vvfat.c Fix OpenBSD linker warnings 2008-08-21 17:58:08 +00:00
block.c Fix windows build 2008-08-21 19:25:45 +00:00
block.h Allow QEMU to connect directly to an NBD server, by Laurent Vivier. 2008-07-03 13:41:03 +00:00
bswap.h e1000: fix unaligned access 2008-03-28 22:30:48 +00:00
Changelog Update 2008-06-08 01:55:07 +00:00
check_ops.sh Fixes for s/390 host support, by Bastian Blank. 2007-11-18 21:22:10 +00:00
cocoa.m Let the USB tablet reach the far bottom and right pixels 2008-03-10 19:34:27 +00:00
configure Fix windows build 2008-08-21 19:25:45 +00:00
console.c Force screen resize if no buffer set (Avi Kivity). 2008-07-19 14:09:20 +00:00
console.h Revert r4979 since it breaks the monitor 2008-08-19 14:44:22 +00:00
COPYING distribution patches 2003-03-23 20:17:16 +00:00
COPYING.LIB update 2003-05-25 16:41:52 +00:00
cpu-all.h Avoid compiler warning. 2008-07-03 21:36:35 +00:00
cpu-defs.h Move interrupt_request and user_mode_only to common cpu state. 2008-07-01 20:01:19 +00:00
cpu-exec.c Support for address masking 2008-07-17 12:53:05 +00:00
cris-dis.c Teach the CRIS disassembler to stay within the provided buffer. 2008-05-06 08:45:10 +00:00
curses_keys.h Typo in curses_keys.h. 2008-03-18 06:55:27 +00:00
curses.c Preliminary OpenBSD host support (based on OpenBSD patches by Todd T. Fries) 2008-08-15 18:33:42 +00:00
cutils.c Prevent guest reusing host memory allocations. 2008-06-09 13:47:45 +00:00
d3des.c Actually add d3des implementation files. 2007-08-25 02:09:50 +00:00
d3des.h Actually add d3des implementation files. 2007-08-25 02:09:50 +00:00
dis-asm.h Fix OpenBSD linker warnings 2008-08-21 17:58:08 +00:00
disas.c Fix warnings that would be generated by gcc -Wstrict-prototypes 2008-08-17 20:21:51 +00:00
disas.h monitor_disas() prototype change 2005-11-21 23:35:10 +00:00
dyngen-exec.h Preliminary OpenBSD host support (based on OpenBSD patches by Todd T. Fries) 2008-08-15 18:33:42 +00:00
dyngen.c Fix some warnings that would be generated by gcc -Wmissing-prototypes 2008-08-17 20:26:25 +00:00
elf_ops.h Add statics and missing #includes for prototypes. 2007-11-18 01:44:38 +00:00
elf.h Report missing elf_addr_t definition from Linux kernel header 2007-10-07 16:07:25 +00:00
exec-all.h On ppc32 make tb_set_jmp_target1 behave like it does on a ppc64 2008-07-29 20:08:17 +00:00
exec.c Fix some warnings that would be generated by gcc -Wmissing-prototypes 2008-08-17 20:26:25 +00:00
gdbstub.c Fix OpenBSD linker warnings 2008-08-21 17:58:08 +00:00
gdbstub.h Allow gdbstub to connect over any serial device. 2007-02-22 01:48:01 +00:00
gen-icount.h Spelling fixes, spotted by Stuart Brady. 2008-06-30 17:22:19 +00:00
host-utils.c Code used by the linux-user targets should not use vl.h. 2007-11-05 13:01:41 +00:00
host-utils.h Fix always_inline definition for Darwin, by Andreas Faerber. 2008-06-05 22:55:54 +00:00
hostregs_helper.h Fix 64-bit host register corruption. 2007-02-04 13:37:44 +00:00
hpet.h Add a local copy of hpet.h. 2007-09-16 20:03:23 +00:00
hppa-dis.c HPPA (PA-RISC) host support 2008-04-12 20:14:54 +00:00
hppa.ld HPPA (PA-RISC) host support 2008-04-12 20:14:54 +00:00
i386-dis.c Fix OpenBSD linker warnings 2008-08-21 17:58:08 +00:00
i386.ld Add TLS sections. 2008-05-31 16:21:33 +00:00
ia64.ld ia64 host support (David Mosberger) 2005-04-07 22:20:31 +00:00
keymaps.c Miscellaneous VNC related fixes from Xen forwarded by Matthew Kent. 2007-10-30 22:38:53 +00:00
kqemu.c Fix error reporting under Win32 (CreateFile does not set errno) 2008-06-08 01:55:09 +00:00
kqemu.h kqemu API change - allow use of kqemu with 32 bit QEMU on a 64 bit host 2008-05-30 20:48:25 +00:00
LICENSE use the TCG code generator 2008-02-01 10:50:11 +00:00
loader.c Remove most uses of phys_ram_base (initial patch by Ian Jackson) 2008-05-12 17:22:13 +00:00
m68k-dis.c find -type f | xargs sed -i 's/[\t ]*$//g' # Yes, again. Note the star in the regex. 2007-09-17 08:09:54 +00:00
m68k-semi.c Break up vl.h. 2007-11-17 17:14:51 +00:00
m68k.ld m68k host port (Richard Zidlicky) 2003-08-10 22:14:22 +00:00
MAINTAINERS update 2008-06-04 14:57:43 +00:00
Makefile Fix windows build 2008-08-21 19:25:45 +00:00
Makefile.target Fix OSS on OpenBSD 2008-08-21 18:00:53 +00:00
mips-dis.c Fix warnings that would be generated by gcc -Wstrict-prototypes 2008-08-17 20:21:51 +00:00
mips.ld Linker scripts for MIPS hosts. 2007-05-05 19:24:38 +00:00
mipsel.ld Linker scripts for MIPS hosts. 2007-05-05 19:24:38 +00:00
monitor.c Fix OpenBSD linker warnings 2008-08-21 17:58:08 +00:00
nbd.c Fix compilation of nbd on Solaris (Andreas Faerber) 2008-08-02 01:57:02 +00:00
nbd.h Allow QEMU to connect directly to an NBD server, by Laurent Vivier. 2008-07-03 13:41:03 +00:00
net-checksum.c Add IP checksumming functions to qemu (Gerd Hoffmann) 2008-07-29 19:40:04 +00:00
net.h Add IP checksumming functions to qemu (Gerd Hoffmann) 2008-07-29 19:40:04 +00:00
osdep.c Preliminary OpenBSD host support (based on OpenBSD patches by Todd T. Fries) 2008-08-15 18:33:42 +00:00
osdep.h Preliminary OpenBSD host support (based on OpenBSD patches by Todd T. Fries) 2008-08-15 18:33:42 +00:00
ppc64.ld Correct version of Heikki Lindholms ppc64.ld script 2008-08-20 22:39:24 +00:00
ppc-dis.c find -type f | xargs sed -i 's/[\t ]$//g' # on most files 2007-09-16 21:08:06 +00:00
ppc.ld Update ppc.ld to work with newer binutils. 2007-04-28 19:00:30 +00:00
qemu_socket.h Use WIN32_LEAN_AND_MEAN, by Stefan Weil. 2007-12-17 04:42:29 +00:00
qemu-binfmt-conf.sh Code provision for n32/n64 mips userland emulation. Not functional yet. 2007-09-30 01:58:33 +00:00
qemu-char.h Upgrade emulated UART to 16550A (Stefano Stabellini) 2008-08-11 14:17:04 +00:00
qemu-common.h Add qemu_realloc(), by Gerd Hoffmann. 2008-08-06 08:37:17 +00:00
qemu-doc.texi Simplify -usbdevice net: syntax, allow VLANs with no NICs. 2008-07-29 13:16:31 +00:00
qemu-img.c Revert 4977. Laurent asked for this not to be applied but I mistakenly applied 2008-08-01 15:04:00 +00:00
qemu-img.texi New qemu-img convert -B option, by Marc Bevand. 2008-06-05 21:53:49 +00:00
qemu-lock.h Multithreaded locking fixes. 2008-06-07 20:50:51 +00:00
qemu-malloc.c Fix OpenBSD linker warnings 2008-08-21 17:58:08 +00:00
qemu-nbd.c Allow qemu-nbd --version to show the application name dynamically, by 2008-07-18 18:06:23 +00:00
qemu-nbd.texi Allow QEMU to connect directly to an NBD server, by Laurent Vivier. 2008-07-03 13:41:03 +00:00
qemu-tech.texi Spelling fixes, by Stefan Weil. 2008-06-03 19:51:57 +00:00
qemu-timer.h Break up vl.h. 2007-11-17 17:14:51 +00:00
readline.c Handle history additions properly, by Andreas Schwab. 2007-12-17 20:31:43 +00:00
README update 2005-02-10 21:46:47 +00:00
s390-dis.c Revert licensing to "GPLv2 or later", by Ulrich Hecht. 2008-01-17 13:56:59 +00:00
s390.ld update 2003-04-29 21:34:02 +00:00
sdl_keysym.h Windows keys support with keymaps 2005-03-01 21:43:42 +00:00
sdl.c Fix detection of 15 bit display depth 2008-07-24 11:25:30 +00:00
sh4-dis.c find -type f | xargs sed -i 's/[\t ]*$//g' # Yes, again. Note the star in the regex. 2007-09-17 08:09:54 +00:00
softmmu_exec.h Replace is_user variable with mmu_idx in softmmu core, 2007-10-14 07:07:08 +00:00
softmmu_header.h Convert remaining __builtin_expect to likely/unlikely, by Jan Kiszka. 2008-07-03 17:57:36 +00:00
softmmu_template.h Add instruction counter. 2008-06-29 01:03:05 +00:00
softmmu-semi.h suppressed tgetx and tputx (initial patch by Thayne Harbaugh) 2007-11-16 10:46:05 +00:00
sparc64.ld Map code buffers below 2G on Sparc64 2008-07-26 15:05:57 +00:00
sparc-dis.c More detabification 2007-10-06 11:28:21 +00:00
sparc.ld More detabification 2007-10-06 11:28:21 +00:00
sys-queue.h Move audio/sys-queue.h => sys-queue.h 2008-07-29 20:08:37 +00:00
sysemu.h Move CPU save/load registration to common code. 2008-06-30 16:31:04 +00:00
tap-win32.c Use WIN32_LEAN_AND_MEAN, by Stefan Weil. 2007-12-17 04:42:29 +00:00
texi2pod.pl Update texi2pod.pl. 2008-02-04 14:47:49 +00:00
thunk.c Fix attempt to inline recursive functions. 2007-11-19 01:06:24 +00:00
thunk.h Fix attempt to inline recursive functions. 2007-11-19 01:06:24 +00:00
TODO update 2008-05-13 18:26:52 +00:00
translate-all.c Small cleanup of gen_intermediate_code(_internal), by Laurent Desnogues. 2008-07-18 18:01:29 +00:00
uboot_image.h Simple u-boot image loading support. 2007-03-06 23:52:01 +00:00
usb-linux.c husb: support for USB host device auto connect (Max Krasnyansky) 2008-08-21 19:28:55 +00:00
VERSION version change 2008-01-06 17:10:54 +00:00
vgafont.h virtual console 2004-07-14 17:39:50 +00:00
vl.c husb: support for USB host device auto connect (Max Krasnyansky) 2008-08-21 19:28:55 +00:00
vnc_keysym.h Improve jp106 keyboard support, by Akio Takebe. 2008-07-07 19:29:49 +00:00
vnc.c Add qemu_realloc(), by Gerd Hoffmann. 2008-08-06 08:37:17 +00:00
vnchextile.h Fix wrong signedness, by Andre Przywara. 2007-12-16 03:02:09 +00:00
x86_64.ld update 2005-01-06 20:50:00 +00:00
x_keymap.c Add statics and missing #includes for prototypes. 2007-11-18 01:44:38 +00:00

Read the documentation in qemu-doc.html.

Fabrice Bellard.