From owner-p4-projects@FreeBSD.ORG Fri Nov 7 17:03:11 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6F5151065676; Fri, 7 Nov 2008 17:03:11 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 31C5C1065670 for ; Fri, 7 Nov 2008 17:03:11 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 210DE8FC1A for ; Fri, 7 Nov 2008 17:03:11 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id mA7H3BI1007451 for ; Fri, 7 Nov 2008 17:03:11 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id mA7H3Bjp007449 for perforce@freebsd.org; Fri, 7 Nov 2008 17:03:11 GMT (envelope-from hselasky@FreeBSD.org) Date: Fri, 7 Nov 2008 17:03:11 GMT Message-Id: <200811071703.mA7H3Bjp007449@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 152624 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 07 Nov 2008 17:03:11 -0000 http://perforce.freebsd.org/chv.cgi?CH=152624 Change 152624 by hselasky@hselasky_laptop001 on 2008/11/07 17:02:49 Fix some problems related to busdma: Need to unload DMA maps before re-use! Fix a corner case when loading zero bytes. Affected files ... .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_busdma.c#10 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_busdma.c#10 (text+ko) ==== @@ -597,6 +597,12 @@ uptag = pc->tag_parent; /* + * We have to unload the previous loaded DMA + * pages before trying to load a new one! + */ + bus_dmamap_unload(pc->tag, pc->map); + + /* * Try to load memory into DMA. */ err = bus_dmamap_load( @@ -612,6 +618,12 @@ } else { /* + * We have to unload the previous loaded DMA + * pages before trying to load a new one! + */ + bus_dmamap_unload(pc->tag, pc->map); + + /* * Try to load memory into DMA. The callback * will be called in all cases: */ @@ -639,6 +651,10 @@ void usb2_pc_cpu_invalidate(struct usb2_page_cache *pc) { + if (pc->page_offset_end == pc->page_offset_buf) { + /* nothing has been loaded into this page cache! */ + return; + } bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); return; @@ -650,6 +666,10 @@ void usb2_pc_cpu_flush(struct usb2_page_cache *pc) { + if (pc->page_offset_end == pc->page_offset_buf) { + /* nothing has been loaded into this page cache! */ + return; + } bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); return; @@ -953,6 +973,12 @@ if (size > 0) { + /* + * We have to unload the previous loaded DMA + * pages before trying to load a new one! + */ + bus_dmamap_unload(pc->tag, pc->map); + /* try to load memory into DMA using using no wait option */ if (bus_dmamap_load(pc->tag, pc->map, pc->buffer, size, NULL, BUS_DMA_NOWAIT)) { @@ -990,6 +1016,10 @@ len = pc->page_offset_end - pc->page_offset_buf; + if (len == 0) { + /* nothing has been loaded into this page cache */ + return; + } bus_dmamap_sync(pc->tag, pc->map, 0, len, BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); return; @@ -1005,6 +1035,10 @@ len = pc->page_offset_end - pc->page_offset_buf; + if (len == 0) { + /* nothing has been loaded into this page cache */ + return; + } bus_dmamap_sync(pc->tag, pc->map, 0, len, BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); return;