[PATCH] b43: Mask out unwanted bits of RX slot address

Rafał Miłecki zajec5 at gmail.com
Sat Aug 13 15:10:34 EDT 2011


W dniu 12 sierpnia 2011 12:15 użytkownik David Woodhouse
<dwmw2 at infradead.org> napisał:
> On some 64-bit DMA engines (my BCM4331, at least) with a ring buffer
> that is not aligned to 8KiB, we often see bit 12 spuriously being set in
> the B43_DMA64_RXSTATUS register. This will happen the first time the
> ring fills and loops back to zero:
>
> [35755.186080] Read RXSTATUS 3f0 (makes offs 3f0, divided by 10 gives slot 3f
> [35755.288366] Read RXSTATUS 1000 (makes offs 1000, divided by 10 gives slot 100
> [35755.291007] ------------[ cut here ]------------
> [35755.291041] WARNING: at drivers/net/wireless/b43/dma.c:1700 b43_dma_rx+0x5e/0x2df [b43]()
>  ...
> [35766.745374] b43-phy41 debug: DMA RX: Dropping poisoned buffer.
>
> All we need to do is mask the offending bit out. The packets *are* where
> they should be; it's just the high bit of the reported offset which is
> weird.
>
> Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
>
> diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c
> index 82168f8..92dd6d9 100644
> --- a/drivers/net/wireless/b43/dma.c
> +++ b/drivers/net/wireless/b43/dma.c
> @@ -247,6 +249,10 @@ static int op64_get_current_rxslot(struct b43_dmaring *ring)
>
>        val = b43_dma_read(ring, B43_DMA64_RXSTATUS);
>        val &= B43_DMA64_RXSTATDPTR;
> +       /* When the ring is not aligned to 8KiB, we sometimes get
> +          bit 12 (0x1000) set in the address. Mask it out; we
> +          only use a 4KiB ring. */
> +       val &= B43_DMA_RINGMEMSIZE-1;

I still have to understand that B43_DMA_RINGMEMSIZE (it's equal to
PAGE_SIZE, which is calculated in some magic way).

However there should be spaces around minus.

-- 
Rafał



More information about the b43-dev mailing list