From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KWSTD-0004fg-4F for qemu-devel@nongnu.org; Fri, 22 Aug 2008 04:58:11 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KWSTC-0004fN-38 for qemu-devel@nongnu.org; Fri, 22 Aug 2008 04:58:10 -0400 Received: from [199.232.76.173] (port=51525 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KWSTB-0004fI-PF for qemu-devel@nongnu.org; Fri, 22 Aug 2008 04:58:09 -0400 Received: from savannah.gnu.org ([199.232.41.3]:49188 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KWSTB-0001a0-Lh for qemu-devel@nongnu.org; Fri, 22 Aug 2008 04:58:09 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1KWSTA-00058X-VH for qemu-devel@nongnu.org; Fri, 22 Aug 2008 08:58:09 +0000 Received: from aurel32 by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1KWSTA-00058T-QS for qemu-devel@nongnu.org; Fri, 22 Aug 2008 08:58:08 +0000 MIME-Version: 1.0 Errors-To: aurel32 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Aurelien Jarno Message-Id: Date: Fri, 22 Aug 2008 08:58:08 +0000 Subject: [Qemu-devel] [5070] uhci: Fixed length handling for SETUP and OUT tokens Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 5070 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5070 Author: aurel32 Date: 2008-08-22 08:58:08 +0000 (Fri, 22 Aug 2008) Log Message: ----------- uhci: Fixed length handling for SETUP and OUT tokens Fixes regression reported agains Linux 2.6.18. Looks like XP and newer Linux kernels are less sensitive to length returned for control transfers. Signed-off-by: Max Krasnyansky Signed-off-by: Aurelien Jarno Modified Paths: -------------- trunk/hw/usb-uhci.c Modified: trunk/hw/usb-uhci.c =================================================================== --- trunk/hw/usb-uhci.c 2008-08-22 08:58:00 UTC (rev 5069) +++ trunk/hw/usb-uhci.c 2008-08-22 08:58:08 UTC (rev 5070) @@ -635,7 +635,7 @@ dprintf("uhci: packet enter. pid %s addr 0x%02x ep %d len %d\n", pid2str(p->pid), p->devaddr, p->devep, p->len); - if (p->pid == USB_TOKEN_OUT) + if (p->pid == USB_TOKEN_OUT || p->pid == USB_TOKEN_SETUP) dump_data(p->data, p->len); ret = USB_RET_NODEV; @@ -755,7 +755,7 @@ static int uhci_handle_td(UHCIState *s, uint32_t addr, UHCI_TD *td, uint32_t *int_mask) { UHCIAsync *async; - int len = 0, max_len, ret = 0; + int len = 0, max_len; uint8_t pid; /* Is active ? */ @@ -798,12 +798,13 @@ case USB_TOKEN_OUT: case USB_TOKEN_SETUP: cpu_physical_memory_read(td->buffer, async->buffer, max_len); - ret = uhci_broadcast_packet(s, &async->packet); - len = max_len; + len = uhci_broadcast_packet(s, &async->packet); + if (len >= 0) + len = max_len; break; case USB_TOKEN_IN: - ret = uhci_broadcast_packet(s, &async->packet); + len = uhci_broadcast_packet(s, &async->packet); break; default: @@ -814,17 +815,17 @@ return -1; } - if (ret == USB_RET_ASYNC) { + if (len == USB_RET_ASYNC) { uhci_async_link(s, async); return 2; } - async->packet.len = ret; + async->packet.len = len; done: - ret = uhci_complete_td(s, td, async, int_mask); + len = uhci_complete_td(s, td, async, int_mask); uhci_async_free(s, async); - return ret; + return len; } static void uhci_async_complete(USBPacket *packet, void *opaque)