From owner-cvs-src@FreeBSD.ORG Wed Apr 23 21:15:05 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 CA2041065677; Wed, 23 Apr 2008 21:15:05 +0000 (UTC) (envelope-from scottl@samsco.org) Received: from pooker.samsco.org (pooker.samsco.org [168.103.85.57]) by mx1.freebsd.org (Postfix) with ESMTP id 60F938FC1C; Wed, 23 Apr 2008 21:15:05 +0000 (UTC) (envelope-from scottl@samsco.org) Received: from phobos.samsco.home (phobos.samsco.home [192.168.254.11]) (authenticated bits=0) by pooker.samsco.org (8.13.8/8.13.8) with ESMTP id m3NLEw6v087740; Wed, 23 Apr 2008 15:14:59 -0600 (MDT) (envelope-from scottl@samsco.org) Message-ID: <480FA6D2.8080807@samsco.org> Date: Wed, 23 Apr 2008 15:14:58 -0600 From: Scott Long User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.13) Gecko/20080313 SeaMonkey/1.1.9 MIME-Version: 1.0 To: John Baldwin References: <200803201619.m2KGJQr7033985@repoman.freebsd.org> <20080423205943.GG99566@alchemy.franken.de> <480FA41F.20407@freebsd.org> <200804231711.43945.jhb@freebsd.org> In-Reply-To: <200804231711.43945.jhb@freebsd.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-3.1 required=3.8 tests=ALL_TRUSTED,AWL,BAYES_00 autolearn=ham version=3.1.8 X-Spam-Checker-Version: SpamAssassin 3.1.8 (2007-02-13) on pooker.samsco.org Cc: cvs-src@FreeBSD.org, Sam Leffler , cvs-all@FreeBSD.org, src-committers@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:15:05 -0000 John Baldwin wrote: > On Wednesday 23 April 2008 05:03:27 pm Sam Leffler 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. >>> >> Thanks for explaining, I will look. Please hold off for a bit. > > Also, other archs may not be crashing because some of them use a NULL map for > bus_dmamem_alloc() as a sentinel of sorts so that sync operations are nops > (since bus_dmamem_alloc() won't alloc memory that needs to be bounced, etc.). > Well, this is why drivers need to treat the maps and opaque and valid in order to be portable across architectures =-) Scott