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-----

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to