Memory problems running Angstrom Linux (specifically USB buffer allocation failure)

I apologize. This seems like a very generic linux problem, but as
it's happening on my BeagleBoard I'm hoping that someone here would be
willing to help.
I have traced a failure in the ethernet driver I've downloaded and
compiled to what I think is a memory issue, but I can't find anyone
with the expertise to tell me what I'm doing wrong. I am running
kernel 2.6.29. I had issues upgrading to 2.6.33 and would like to
avoid trying so again for the time being, if at all possible.
Anywho, the situation is that my USB ethernet will function well for a
few days before mysteriously stopping. That is a separate problem
that I'm investigating. It can usually be solved by simply running
ifconfig down/up.
Occasionally (here's the real problem), ifconfig up will fail with the
following error:
[35099.576477] ifconfig: page allocation failure. order:6, mode:0x0
[35099.582611] [<c042866c>] (dump_stack+0x0/0x14) from [<c009bb24>]
[35099.592041] [<c009b770>] (__alloc_pages_internal+0x0/0x3d4) from
[<c00409b0>] (__dma_alloc+0x158/0x3cc)
[35099.601562] [<c0040858>] (__dma_alloc+0x0/0x3cc) from [<c0040cb0>]
[35099.610565] [<c0040c58>] (dma_alloc_coherent+0x0/0x64) from
[<c02cd3f0>] (hcd_buffer_alloc+0x9c/0xa4)
[35099.619934] r7:00000001 r6:d0f65000 r5:d0f65048 r4:00000020
[35099.625640] [<c02cd354>] (hcd_buffer_alloc+0x0/0xa4) from
[<c02c15ac>] (usb_buffer_alloc+0x24/0x30)
[35099.635040] r4:d0f65048
[35099.637573] [<c02c1588>] (usb_buffer_alloc+0x0/0x30) from
[<bf04b624>] (NICInitTransmit+0xe8/0x798 [rt2870sta])
[35099.648132] [<bf04b53c>] (NICInitTransmit+0x0/0x798 [rt2870sta])
from [<bf04be70>] (RTMPAllocTxRxRingMemory+0x40/0xac [rt2870sta])
It carries on, but that's the start and relevant part.
The failure comes in the NICInitTransmit, at the line with
usb_buffer_alloc where it creates the usb buffer for the network
data. I've come to conclude that this only occurs when there is
insufficient free memory. Approximately 35MB must be free for this
command not to fail, though I can't figure out why it would need so
much as the buffer it is trying to allocate is only a couple hundred
The problem is that I do not believe I am running out of memory, so it
should not be failing. Indeed, my memfree does become very low over
time, but cached and inactive memory (from /proc/meminfo) seem to
suggest that I in fact have over 128MB of memory available to be
When it begins failing in this way, I can usually recover a few more
days by simply killing a process to increase freemem before calling
ifconfig up, and then restart the killed process, but that only works
one or two times. Unfortunately, the inactive memory continues to
grow while the freemem shrinks, and eventually I run out of processes
large enough to kill to return memory, and am forced to restart in
order to reclaim it all.
to confirm or deny) it should be able to allocate memory from the
inactive memory pool, but for some reason usb_buffer_alloc is only
pulling from the freemem pool (assuming they do not overlap in any
way), thus it crashes.
I therefore have two questions: why dos usb_buffer_alloc not seem to
be pulling from the inactive memory? And is there any possible way to
kind of return that inactive memory to the freemem where it can be
used? Or am I simply mistaken in how the memory model works in this
Any insight would be appreciated. I don't like having to reset my
BeagleBoard every few days.