From owner-cvs-all@FreeBSD.ORG Tue Nov 28 05:32:38 2006 Return-Path: X-Original-To: cvs-all@FreeBSD.org Delivered-To: cvs-all@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 68A1516A556; Tue, 28 Nov 2006 05:32:38 +0000 (UTC) (envelope-from marius@alchemy.franken.de) Received: from alchemy.franken.de (alchemy.franken.de [194.94.249.214]) by mx1.FreeBSD.org (Postfix) with ESMTP id 24031451B2; Tue, 28 Nov 2006 04:43:37 +0000 (GMT) (envelope-from marius@alchemy.franken.de) Received: from alchemy.franken.de (localhost [127.0.0.1]) by alchemy.franken.de (8.13.8/8.13.8/ALCHEMY.FRANKEN.DE) with ESMTP id kAS0ZQeO022951; Tue, 28 Nov 2006 01:35:28 +0100 (CET) (envelope-from marius@alchemy.franken.de) Received: (from marius@localhost) by alchemy.franken.de (8.13.8/8.13.8/Submit) id kAS0ZQdq022950; Tue, 28 Nov 2006 01:35:26 +0100 (CET) (envelope-from marius) Date: Tue, 28 Nov 2006 01:35:26 +0100 From: Marius Strobl To: Ian Dowse , "M. Warner Losh" Message-ID: <20061128003526.GA76234@alchemy.franken.de> References: <200611271839.kARId33k039747@repoman.freebsd.org> <200611272232.aa46722@nowhere.iedowse.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200611272232.aa46722@nowhere.iedowse.com> User-Agent: Mutt/1.4.2.2i Cc: cvs-src@FreeBSD.org, src-committers@FreeBSD.org, cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sys/dev/usb usbdi.c X-BeenThere: cvs-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: CVS commit messages for the entire tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 28 Nov 2006 05:32:38 -0000 On Mon, Nov 27, 2006 at 10:32:12PM +0000, Ian Dowse wrote: > In message <200611271839.kARId33k039747@repoman.freebsd.org>, Marius Strobl wri > tes: > > Refine the previous change to only call bus_dmamap_sync() in case of > > an URQ_REQUEST when DMA segments are passed to usbd_start_transfer(); > > when the request doesn't include the optional data buffer the size of > > the transfer (xfer->length) is 0, in which case usbd_transfer() won't > > create a DMA map but call usbd_start_transfer() with no DMA segments. > > With the previous change this could result in the bus_dmamap_sync() > > implementation dereferencing the NULL-pointer passed as the DMA map > > argument. > > While at it fix what appears to be a typo in usbd_start_transfer(); > > in order to determine wheter usbd_start_transfer() was called with > > DMA segments check whether the number of segments is > 0 rather than > > the pointer to them being > 0. > > Thanks for spotting the typo - note though that the recently added > bus_dmamap_sync() call appears to be using the wrong bus_dma tag > and a potentially uninitialised map, so it is likely to only work > on architectures where bus_dmamap_sync doesn't depend on the tag > and map. > > The only bus_dmamap_sync() calls in the usb tree at the moment are > ones I added as part of the scatter-gather work a while ago, and > they all relate to the data buffer associated with a transfer. For > the control transfer SETUP packet buffer, each host controller driver > has a "reqdma" field that holds the DMA mapping information. It's > probably easiest to make the changes in the individual host controller > drivers so they do something like > > bus_dmamap_sync(reqdma.block->tag, > reqdma.block->map, BUS_DMASYNC_PREWRITE); > > after filling out the setup packet. > > I guess other memory structures such as descriptors and queue heads > might need bus_dmamap_sync calls too - what are the features of the > platform(s) where the original issues were seen? (e.g. is some IOMMU > operation or memory barrier required between host and I/O access > to memory?) Your suggestion sounds reasonable to me, but please talk to imp@ about it as I was merely trying to fix fallout seen on sparc64 which was caused by his change but don't know about the original problam that motivated that change. > Apart from the handling of data buffers, the USB code > appears to currently assume that with BUS_DMA_COHERENT it doesn't > need any further synchronisation, which can't be right in general. Hrm, because a certain platform might silently ignore BUS_DMA_COHERENT and provide a non-coherent mapping instead or because of another reason? Marius