From owner-cvs-src@FreeBSD.ORG Wed Apr 23 21:08:55 2008 Return-Path: Delivered-To: cvs-src@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 42C151065682; Wed, 23 Apr 2008 21:08:55 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from ebb.errno.com (ebb.errno.com [69.12.149.25]) by mx1.freebsd.org (Postfix) with ESMTP id E46978FC14; Wed, 23 Apr 2008 21:08:54 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from trouble.errno.com (trouble.errno.com [10.0.0.248]) (authenticated bits=0) by ebb.errno.com (8.13.6/8.12.6) with ESMTP id m3NL8qBd097909 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 23 Apr 2008 14:08:52 -0700 (PDT) (envelope-from sam@freebsd.org) Message-ID: <480FA564.5000008@freebsd.org> Date: Wed, 23 Apr 2008 14:08:52 -0700 From: Sam Leffler Organization: FreeBSD Project User-Agent: Thunderbird 2.0.0.9 (X11/20071125) MIME-Version: 1.0 To: Scott Long References: <200803201619.m2KGJQr7033985@repoman.freebsd.org> <20080412193358.GA44768@alchemy.franken.de> <20080423203622.GA66545@alchemy.franken.de> <480F9F8B.5050209@freebsd.org> <20080423205943.GG99566@alchemy.franken.de> <480FA4B4.50006@samsco.org> In-Reply-To: <480FA4B4.50006@samsco.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-DCC-Misty-Metrics: ebb.errno.com; whitelist Cc: cvs-src@freebsd.org, src-committers@freebsd.org, cvs-all@freebsd.org, Marius Strobl Subject: Re: cvs commit: src/sys/dev/usb ehci.c ohci.c X-BeenThere: cvs-src@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: CVS commit messages for the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 23 Apr 2008 21:08:55 -0000 Scott Long wrote: > Marius Strobl wrote: >> On Wed, Apr 23, 2008 at 01:43:55PM -0700, Sam Leffler wrote: >>> Marius Strobl wrote: >>>> On Sat, Apr 12, 2008 at 09:33:58PM +0200, Marius Strobl wrote: >>>> >>>>> On Thu, Mar 20, 2008 at 04:19:26PM +0000, Sam Leffler wrote: >>>>> >>>>>> sam 2008-03-20 16:19:25 UTC >>>>>> >>>>>> FreeBSD src repository >>>>>> >>>>>> Modified files: >>>>>> sys/dev/usb ehci.c ohci.c Log: >>>>>> Workaround design botch in usb: blindly mixing bus_dma with PIO >>>>>> does not >>>>>> work on architectures with a write-back cache as the PIO writes >>>>>> end up >>>>>> in the cache which the sync(BUS_DMASYNC_POSTREAD) in >>>>>> usb_transfer_complete >>>>>> then discards; compensate in the xfer methods that do PIO by >>>>>> pushing the >>>>>> writes out of the cache before usb_transfer_complete is called. >>>>>> >>>>>> This fixes USB on xscale and likely other places. >>>>>> >>>>>> Sponsored by: hobnob >>>>>> Reviewed by: cognet, imp >>>>>> MFC after: 1 month >>>>>> >>>>>> Revision Changes Path >>>>>> 1.62 +16 -0 src/sys/dev/usb/ehci.c >>>>>> 1.171 +16 -0 src/sys/dev/usb/ohci.c >>>>>> >>>>> This causes a crash during boot on sparc64. Looks like map is still >>>>> NULL at that point. >>>>> >>>>> >>>> Are you ok with the change below or would that also prevent >>>> your kludge from taking effect? >>>> >>>> Marius >>>> >>>> Index: ehci.c >>>> =================================================================== >>>> RCS file: /usr/data/bsd/cvs/fbsd/src/sys/dev/usb/ehci.c,v >>>> retrieving revision 1.62 >>>> diff -u -r1.62 ehci.c >>>> --- ehci.c 20 Mar 2008 16:19:25 -0000 1.62 >>>> +++ ehci.c 23 Apr 2008 20:23:58 -0000 >>>> @@ -664,6 +664,8 @@ >>>> usbd_pipe_handle pipe = xfer->pipe; >>>> bus_dma_tag_t tag = pipe->device->bus->buffer_dmatag; >>>> struct usb_dma_mapping *dmap = &xfer->dmamap; >>>> + if (dmap->map == NULL) >>>> + return; >>>> bus_dmamap_sync(tag, dmap->map, BUS_DMASYNC_PREWRITE); >>>> } >>>> >>>> Index: ohci.c >>>> =================================================================== >>>> RCS file: /usr/data/bsd/cvs/fbsd/src/sys/dev/usb/ohci.c,v >>>> retrieving revision 1.171 >>>> diff -u -r1.171 ohci.c >>>> --- ohci.c 20 Mar 2008 16:19:25 -0000 1.171 >>>> +++ ohci.c 21 Apr 2008 19:13:54 -0000 >>>> @@ -1571,6 +1571,8 @@ >>>> usbd_pipe_handle pipe = xfer->pipe; >>>> bus_dma_tag_t tag = pipe->device->bus->buffer_dmatag; >>>> struct usb_dma_mapping *dmap = &xfer->dmamap; >>>> + if (dmap->map == NULL) >>>> + return; >>>> bus_dmamap_sync(tag, dmap->map, BUS_DMASYNC_PREWRITE); >>>> } >>>> >>>> >>>> >>>> >>> You have not identified why you don't have a dma map. I don't have >>> a way to diagnose your problem and so far as I know no other >>> platform had an issue w/ the change. I suggest you figure out why >>> your map is not setup instead of adding a hack. >>> >> >> It's because the usb(4) code doesn't create DMA maps for >> zero-length transfers, see usbd_transfer(). In the case of >> the backtrace I posted not for usbd_set_address(), which >> does USETW(req.wLength, 0) so later on size is 0 in >> usbd_transfer() hence no DMA map. I don't know why your >> hack doesn't also crash other platforms. >> >> > > If there's a transfer without a DMA operation, then why is the > DMA API being used? > It should not be; that's the whole crux of the problem. It doesn't have different "transport methods" to split out PIO from DMA; it just sends everything through one set of routines. That's why I had to add my kludge. Sam