···419419 gfp_t flags = GFP_KERNEL;420420421421 /* The specs call for 4K buffers for 30- and 32-bit DMA with 4K422422- * alignment and 8K buffers for 64-bit DMA with 8K alignment. Testing423423- * has shown that 4K is sufficient for the latter as long as the buffer424424- * does not cross an 8K boundary.425425- *422422+ * alignment and 8K buffers for 64-bit DMA with 8K alignment.423423+ * In practice we could use smaller buffers for the latter, but the424424+ * alignment is really important because of the hardware bug. If bit425425+ * 0x00001000 is used in DMA address, some hardware (like BCM4331)426426+ * copies that bit into B43_DMA64_RXSTATUS and we get false values from427427+ * B43_DMA64_RXSTATDPTR. Let's just use 8K buffers even if we don't use428428+ * more than 256 slots for ring.426429 */430430+ u16 ring_mem_size = (ring->type == B43_DMA_64BIT) ?431431+ B43_DMA64_RINGMEMSIZE : B43_DMA32_RINGMEMSIZE;432432+427433 ring->descbase = dma_alloc_coherent(ring->dev->dev->dma_dev,428428- B43_DMA_RINGMEMSIZE,429429- &(ring->dmabase), flags);434434+ ring_mem_size, &(ring->dmabase),435435+ flags);430436 if (!ring->descbase) {431437 b43err(ring->dev->wl, "DMA ringmemory allocation failed\n");432438 return -ENOMEM;433439 }434434- memset(ring->descbase, 0, B43_DMA_RINGMEMSIZE);440440+ memset(ring->descbase, 0, ring_mem_size);435441436442 return 0;437443}438444439445static void free_ringmemory(struct b43_dmaring *ring)440446{441441- dma_free_coherent(ring->dev->dev->dma_dev, B43_DMA_RINGMEMSIZE,447447+ u16 ring_mem_size = (ring->type == B43_DMA_64BIT) ?448448+ B43_DMA64_RINGMEMSIZE : B43_DMA32_RINGMEMSIZE;449449+ dma_free_coherent(ring->dev->dev->dma_dev, ring_mem_size,442450 ring->descbase, ring->dmabase);443451}444452
+2-1
drivers/net/wireless/b43/dma.h
···161161} __packed;162162163163/* Misc DMA constants */164164-#define B43_DMA_RINGMEMSIZE PAGE_SIZE164164+#define B43_DMA32_RINGMEMSIZE 4096165165+#define B43_DMA64_RINGMEMSIZE 8192165166/* Offset of frame with actual data */166167#define B43_DMA0_RX_FW598_FO 38167168#define B43_DMA0_RX_FW351_FO 30