Date: Sun, 29 Jan 2006 15:01:19 -0800 (PST) From: =?ISO-8859-1?Q?Mikko_Ty=F6l=E4j=E4rvi?= <mbsd@pacbell.net> To: lyubich_freebsd <lyubich-freebsd1@gmx.net> Cc: 'Bill Paul' <wpaul@FreeBSD.ORG>, freebsd-stable@FreeBSD.ORG Subject: RE: Broadcomm BCM4401-B0 and memory upgrade issue. Message-ID: <20060129145021.P834@spirou.home> In-Reply-To: <20060129221813.3F71043D75@mx1.FreeBSD.org> References: <20060129221813.3F71043D75@mx1.FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi,
The chip is indeed unable to do DMA > 1G, as seen in the linux driver
from Broadcom:
[...]
v3.0.11 (Aug 03, 2005)
======================
Fixes:
-------------
1. Problem: (CQ #13593) 4401 hangs when dealing with memory
addresses above 1G.
Cause : Hardware DMA limitation.
Change : Modify the code to ensure memory addresses are
below the 1G ceiling.
Impact : None.
[...]
See <http://www.broadcom.com/support/ethernet_nic/downloaddrivers.php>,
under BCM4401 drivers.
$.02,
/Mikko
On Sun, 29 Jan 2006, lyubich_freebsd wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Hi,
>
> I applied the suggested changes.
> I got the following message when I load the if_bfe driver.
>
> vm_page_alloc_config: alignment must be a power of 2
>
> After that the kernel panics and system reboots.
>
> I think, if I can specified the allignment correctly, it should work.
> Tell me, how to do this, and I will try it again.
>
> Regards,
> LM
>
>>
>> static int
>> bfe_dma_alloc(device_t dev)
>> {
>> struct bfe_softc *sc;
>> int error, i;
>>
>> sc = device_get_softc(dev);
>>
>> /* parent tag */
>> error = bus_dma_tag_create(NULL, /* parent */
>> PAGE_SIZE, 0, /*
>> alignment, boundary */
>> BUS_SPACE_MAXADDR, /* lowaddr */
>> BUS_SPACE_MAXADDR_32BIT, /* highaddr */
>> NULL, NULL, /* filter,
>> filterarg */
>> MAXBSIZE, /* maxsize */
>> BUS_SPACE_UNRESTRICTED, /* num of
>> segments */
>> BUS_SPACE_MAXSIZE_32BIT, /* max
>> segment size */
>> BUS_DMA_ALLOCNOW, /* flags */
>> NULL, NULL, /*
>> lockfunc, lockarg */
>> &sc->bfe_parent_tag);
>>
>> - Change it to look like this:
>>
>> static int
>> bfe_dma_alloc(device_t dev)
>> {
>> struct bfe_softc *sc;
>> int error, i;
>>
>> sc = device_get_softc(dev);
>>
>> /* parent tag */
>> error = bus_dma_tag_create(NULL, /* parent */
>> PAGE_SIZE, 0, /*
>> alignment, boundary */
>> /* change this -> */ 0x3E7FFFFF /*BUS_SPACE_MAXADDR*/,
>> /* lowaddr */
>> BUS_SPACE_MAXADDR_32BIT, /* highaddr */
>> NULL, NULL, /* filter,
>> filterarg */
>> MAXBSIZE, /* maxsize */
>> BUS_SPACE_UNRESTRICTED, /* num of
>> segments */
>> BUS_SPACE_MAXSIZE_32BIT, /* max
>> segment size */
>> BUS_DMA_ALLOCNOW, /* flags */
>> NULL, NULL, /*
>> lockfunc, lockarg */
>> &sc->bfe_parent_tag);
>>
>> - Save if_bfe.c
>> - Recompile if_bfe.ko and/or your kernel, test it, and report
>> back what
>> happens.
>>
>> Wait, let me say that last part again: REPORT BACK WHAT
>> HAPPENS! I hate it when I send people things to test and they
>> vanish into a black hole, never to be heard from again.
>>
>> I suspect this chipset has a DMA limitation that prevents it
>> from performing DMA to/from any addresses outside the first
>> 1GB of RAM.
>> Curiously, I ran into this with a Linksys wireless NIC with
>> the NDISulator, which is based on a Broadcom chipset too
>> (802.11b only).
>>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.2 (MingW32)
>
> iD8DBQFD3T87KOV0oHioLCARAvxGAKCn4FieqHpPBD7+6vOm+taaLjfZlgCgk2WR
> 5H7hLglq++SV8eaiujVL6cE=
> =L2Ut
> -----END PGP SIGNATURE-----
>
> _______________________________________________
> freebsd-stable@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-stable
> To unsubscribe, send any mail to "freebsd-stable-unsubscribe@freebsd.org"
>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060129145021.P834>
