From owner-freebsd-usb@FreeBSD.ORG Tue Jun 23 09:43:29 2009 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 02E6A1065672; Tue, 23 Jun 2009 09:43:29 +0000 (UTC) (envelope-from ray@ddteam.net) Received: from mail-fx0-f217.google.com (mail-fx0-f217.google.com [209.85.220.217]) by mx1.freebsd.org (Postfix) with ESMTP id 647EE8FC12; Tue, 23 Jun 2009 09:43:28 +0000 (UTC) (envelope-from ray@ddteam.net) Received: by fxm17 with SMTP id 17so1344356fxm.43 for ; Tue, 23 Jun 2009 02:43:27 -0700 (PDT) Received: by 10.204.65.65 with SMTP id h1mr7071712bki.18.1245748292044; Tue, 23 Jun 2009 02:11:32 -0700 (PDT) Received: from terran.mk.farlep.net (i183-101-19-89.vpdn.way.kv.chereda.net [89.19.101.183]) by mx.google.com with ESMTPS id 19sm14290802fkr.25.2009.06.23.02.11.30 (version=SSLv3 cipher=RC4-MD5); Tue, 23 Jun 2009 02:11:31 -0700 (PDT) Sender: Alex RAY Date: Tue, 23 Jun 2009 12:11:29 +0300 From: Alexandr Rybalko To: Piotr =?UTF-8?B?WmnEmWNpaw==?= Message-Id: <20090623121129.d18492a3.ray@dlink.ua> In-Reply-To: <200906231035.43096.kosmo@semihalf.com> References: <200906231035.43096.kosmo@semihalf.com> Organization: D-Link X-Mailer: Sylpheed 2.6.0 (GTK+ 2.14.7; i386-portbld-freebsd7.1) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Rafal Jaworowski , freebsd-usb@freebsd.org, thompsa@FreeBSD.org Subject: Re: CPU Cache and busdma usage in USB X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Jun 2009 09:43:29 -0000 On Tue, 23 Jun 2009 10:35:42 +0200 Piotr Zięcik wrote: >> While bringing up EHCI (8-CURRENT, new USB stack) on ARM machine we have >> found cache-related problem in the USB stack. >> >> The usb_pc_cpu_flush() and usb_pc_cpu_invalidate() functions are used to >> flush/invalidate CPU caches in various places in USB code. Internally, the >> functions are implemented using bus_dmamap_sync(). In our case, on ARM >> machine, flags passed to the bus_dmamap_sync() function did not >> correspond with requested operation. We have fixed the problem by changing >> flags passed to the bus_dmamap_sync() function (see attached patch). >> >> My question is about general idea of bus_dma usage for cache operations. In my >> opinion we should not rely on bus_dmamap_sync() behaviour as this function >> may do different things on different architectures. This not always works as >> expected, which is clearly visible in our case. Better solution is to use >> cpu-specific functions implementing cache operations. Please comment on why >> CPU-specific functions are not used... >> >> Patch fixing our problem: >> diff --git a/sys/dev/usb/usb_busdma.c b/sys/dev/usb/usb_busdma.c >> index 3d6a5be..69a6fff 100644 >> --- a/sys/dev/usb/usb_busdma.c >> +++ b/sys/dev/usb/usb_busdma.c >> @@ -658,8 +658,7 @@ usb_pc_cpu_invalidate(struct usb_page_cache *pc) >> /* nothing has been loaded into this page cache! */ >> return; >> } >> - bus_dmamap_sync(pc->tag, pc->map, >> - BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); >> + bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREREAD); >> } >> >> /*------------------------------------------------------------------------* >> @@ -672,8 +671,7 @@ usb_pc_cpu_flush(struct usb_page_cache *pc) >> /* nothing has been loaded into this page cache! */ >> return; >> } >> - bus_dmamap_sync(pc->tag, pc->map, >> - BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); >> + bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREWRITE); >> } >> >> /*------------------------------------------------------------------------* >> >> -- >> Best regards. >> Piotr Ziecik >> _______________________________________________ >> freebsd-usb@freebsd.org mailing list >> http://lists.freebsd.org/mailman/listinfo/freebsd-usb >> To unsubscribe, send any mail to "freebsd-usb-unsubscribe@freebsd.org" Great thanks Piotr! I work on MIPS BCM5354 and BCM5836 and after apply your patch USB work correct. -- Alexandr Rybalko