From 410d1a073e291d4ef833558e8b740fc89bd44a53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Llu=C3=ADs=20Batlle=20i=20Rossell?= Date: Fri, 5 Apr 2013 10:42:51 +0200 Subject: [PATCH] qemu-kvm: fix USB passthrough with a patch I saw the same symptoms as https://bugs.launchpad.net/qemu/+bug/1033727 , and the patch there proposed fixes my case. --- pkgs/os-specific/linux/qemu-kvm/default.nix | 2 +- .../linux/qemu-kvm/fix-usb-passthrough.patch | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 pkgs/os-specific/linux/qemu-kvm/fix-usb-passthrough.patch diff --git a/pkgs/os-specific/linux/qemu-kvm/default.nix b/pkgs/os-specific/linux/qemu-kvm/default.nix index 6c2c8d57fc50..eeaeacd46601 100644 --- a/pkgs/os-specific/linux/qemu-kvm/default.nix +++ b/pkgs/os-specific/linux/qemu-kvm/default.nix @@ -19,7 +19,7 @@ stdenv.mkDerivation rec { ncurses python glib libaio mesa texinfo perl ] ++ stdenv.lib.optionals spiceSupport [ spice_protocol spice ]; - patches = [ ./fix-librt-check.patch ]; + patches = [ ./fix-librt-check.patch ./fix-usb-passthrough.patch ]; postPatch = "patchShebangs .;" + stdenv.lib.optionalString spiceSupport '' diff --git a/pkgs/os-specific/linux/qemu-kvm/fix-usb-passthrough.patch b/pkgs/os-specific/linux/qemu-kvm/fix-usb-passthrough.patch new file mode 100644 index 000000000000..a73df310629d --- /dev/null +++ b/pkgs/os-specific/linux/qemu-kvm/fix-usb-passthrough.patch @@ -0,0 +1,45 @@ +https://bugs.launchpad.net/qemu/+bug/1033727 + +From: Hans de Goede +Date: Wed, 12 Sep 2012 13:08:40 +0000 (+0200) +Subject: uhci: Don't queue up packets after one with the SPD flag set +X-Git-Tag: v1.3.0-rc0~483^2 +X-Git-Url: http://git.qemu.org/?p=qemu.git;a=commitdiff_plain;h=72a04d0c178f01908d74539230d9de64ffc6da19 +Bug-Debian: http://bugs.debian.org/683983 + +uhci: Don't queue up packets after one with the SPD flag set + +Don't queue up packets after a packet with the SPD (short packet detect) +flag set. Since we won't know if the packet will actually be short until it +has completed, and if it is short we should stop the queue. + +This fixes a miniature photoframe emulating a USB cdrom with the windows +software for it not working. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +--- + +diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c +index c7c8786..cdc8bc3 100644 +--- a/hw/usb/hcd-uhci.c ++++ b/hw/usb/hcd-uhci.c +@@ -1000,6 +1000,9 @@ static void uhci_fill_queue(UHCIState *s, UHCI_TD *td) + } + assert(ret == TD_RESULT_ASYNC_START); + assert(int_mask == 0); ++ if (ptd.ctrl & TD_CTRL_SPD) { ++ break; ++ } + plink = ptd.link; + } + } +@@ -1097,7 +1100,7 @@ static void uhci_process_frame(UHCIState *s) + + case TD_RESULT_ASYNC_START: + trace_usb_uhci_td_async(curr_qh & ~0xf, link & ~0xf); +- if (is_valid(td.link)) { ++ if (is_valid(td.link) && !(td.ctrl & TD_CTRL_SPD)) { + uhci_fill_queue(s, &td); + } + link = curr_qh ? qh.link : td.link;