pcnet: access descriptor rings & init block uncached
authorPaul Burton <paul.burton@imgtec.com>
Mon, 7 Apr 2014 15:41:46 +0000 (16:41 +0100)
committerTom Rini <trini@ti.com>
Fri, 18 Apr 2014 14:42:30 +0000 (10:42 -0400)
commitf1ae382dfd3850f4fbf34d794a31b8a1d1a5c389
treefad2c8e5964e43617b1fa96380be984ae9f04cf7
parentccfc89cb16ef1407a475cfce1dac1555745d8268
pcnet: access descriptor rings & init block uncached

The prior accesses to the descriptor rings & init block via cached
memory had a few issues:

  - The memory needs cache flushes or invalidation at the appropriate
    times, but was not necessarily aligned on cache line boundaries.
    This could lead to data being incorrectly lost or written back to
    RAM at the wrong time.

  - There are points where ordering of writes to the memory is
    important, but because it's cached memory the pcnet controller
    would see cache lines written back ordered by address. This could
    occasionally lead to hardware seeing descriptors in an incorrect
    state.

  - Flushing the cache constantly is inefficient.

So, to avoid all of those issues simply access the descriptors & init
block via uncached memory. The MIPS-specific UNCACHED_SDRAM macro is
used to do this (retrieving an address in kseg1) as I could see no
existing generic solution. Since the MIPS Malta board is the only user
of the pcnet driver, hopefully this doesn't matter.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
drivers/net/pcnet.c