Date: Wed, 15 Jan 2003 22:58:04 +0100 From: Thomas Moestl <tmoestl@gmx.net> To: Josef Karthauser <joe@FreeBSD.org> Cc: Maxime Henrion <mux@FreeBSD.org>, current@FreeBSD.org Subject: Re: Bus DMA for USB - compilation problems. Message-ID: <20030115215804.GA286@crow.dom2ip.de> In-Reply-To: <20030115202033.GA13368@genius.tao.org.uk> References: <20030115195607.GA13076@genius.tao.org.uk> <20030115200519.GH16775@elvis.mu.org> <20030115202033.GA13368@genius.tao.org.uk>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 2003/01/15 at 20:20:33 +0000, Josef Karthauser wrote:
> On Wed, Jan 15, 2003 at 12:05:20PM -0800, Maxime Henrion wrote:
> > Josef Karthauser wrote:
> > > I've partially ported the NetBSD busdma code for USB to FreeBSD, but
> > > it doesn't compile, probably for a trivial reason.
> > >
> > > Anyone fancy helping me out?
> >
> > I didn't look at the patches yet, but could you give me the compilation
> > error you are getting ?
> >
>
> cc -c -O -pipe -march=pentium3 -Wall -Wredundant-decls -Wnested-externs
> -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline
> -Wcast-qual -fformat-extensions -ansi -g -nostdinc -I- -I.
> -I/usr/src/sys -I/usr/src/sys/dev -I/usr/src/sys/contrib/dev/acpica
> -I/usr/src/sys/contrib/ipfilter -D_KERNEL -include opt_global.h
> -fno-common -mno-align-long-strings -mpreferred-stack-boundary=2
> -ffreestanding -Werror /usr/src/sys/dev/usb/uhci.c
> /usr/src/sys/dev/usb/uhci.c: In function `uhci_init':
> /usr/src/sys/dev/usb/uhci.c:425: dereferencing pointer to incomplete type
> /usr/src/sys/dev/usb/uhci.c: In function `uhci_power':
> /usr/src/sys/dev/usb/uhci.c:714: dereferencing pointer to incomplete type
> /usr/src/sys/dev/usb/uhci.c: In function `uhci_alloc_std':
>
> It's failing at lines like:
>
> UWRITE4(sc, UHCI_FLBASEADDR, DMAADDR(&sc->sc_dma, 0)); /* set frame list */
>
> The problematic is DMAADDR, and it's because the sc->sc_dma, which is
> defined as usb_dma_t. This is defined in usb_port.h, and it uses
> usb_dma_block which is defined in usb_mem.h. I think that it's the
> usb_dma_block that is coming up as incomplete, but I'm not sure.
DMAADDR is:
#define DMAADDR(dma, o) ((dma)->block->map->dm_segs[0].ds_addr + (dma)->offs + (o))
struct usb_dma_block starts like:
typedef struct usb_dma_block {
bus_dma_tag_t tag;
bus_dmamap_t map;
However, bus_dmamap_t (like bus_dma_tag_t) is supposed to be opaque to
users of the busdma interface on FreeBSD. Our implementations enforce
this by defining it as:
typedef struct bus_dmamap *bus_dmamap_t;
, and by not exporting struct bus_dmamap in public headers.
The DMA addresses are obtained by writing an appropriate callback
routine to process them and passing it to bus_dmamap_load().
The usb_mem.c will need some other changes to work on FreeBSD, since
our busdma code has diverged from NetBSD's quite a bit.
- Thomas
--
Thomas Moestl <tmoestl@gmx.net> http://www.tu-bs.de/~y0015675/
<tmm@FreeBSD.org> http://people.FreeBSD.org/~tmm/
PGP fingerprint: 1C97 A604 2BD0 E492 51D0 9C0F 1FE6 4F1D 419C 776C
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030115215804.GA286>
