|
Lines 165-171
static void op64_fill_descriptor(struct
Link Here
|
| 165 |
addrhi = (((u64) dmaaddr >> 32) & ~SSB_DMA_TRANSLATION_MASK); |
165 |
addrhi = (((u64) dmaaddr >> 32) & ~SSB_DMA_TRANSLATION_MASK); |
| 166 |
addrext = (((u64) dmaaddr >> 32) & SSB_DMA_TRANSLATION_MASK) |
166 |
addrext = (((u64) dmaaddr >> 32) & SSB_DMA_TRANSLATION_MASK) |
| 167 |
>> SSB_DMA_TRANSLATION_SHIFT; |
167 |
>> SSB_DMA_TRANSLATION_SHIFT; |
| 168 |
addrhi |= ssb_dma_translation(ring->dev->dev); |
168 |
addrhi |= (ssb_dma_translation(ring->dev->dev) << 1); |
| 169 |
if (slot == ring->nr_slots - 1) |
169 |
if (slot == ring->nr_slots - 1) |
| 170 |
ctl0 |= B43_DMA64_DCTL0_DTABLEEND; |
170 |
ctl0 |= B43_DMA64_DCTL0_DTABLEEND; |
| 171 |
if (start) |
171 |
if (start) |
|
Lines 426-434
static inline
Link Here
|
| 426 |
static int alloc_ringmemory(struct b43_dmaring *ring) |
426 |
static int alloc_ringmemory(struct b43_dmaring *ring) |
| 427 |
{ |
427 |
{ |
| 428 |
struct device *dev = ring->dev->dev->dev; |
428 |
struct device *dev = ring->dev->dev->dev; |
|
|
429 |
gfp_t flags = GFP_KERNEL; |
| 429 |
|
430 |
|
|
|
431 |
/* The specs call for 4K buffers for 30- and 32-bit DMA with 4K |
| 432 |
* alignment and 8K buffers for 64-bit DMA with 8K alignment. Testing |
| 433 |
* has shown that 4K is sufficient for the latter as long as the buffer |
| 434 |
* does not cross an 8K boundary. |
| 435 |
* |
| 436 |
* For unknown reasons - possibly a hardware error - the BCM4311 rev |
| 437 |
* 02, which uses 64-bit DMA, needs the ring buffer in very low memory, |
| 438 |
* which accounts for the GFP_DMA flag below. |
| 439 |
*/ |
| 440 |
if (ring->dma64) |
| 441 |
flags |= GFP_DMA; |
| 430 |
ring->descbase = dma_alloc_coherent(dev, B43_DMA_RINGMEMSIZE, |
442 |
ring->descbase = dma_alloc_coherent(dev, B43_DMA_RINGMEMSIZE, |
| 431 |
&(ring->dmabase), GFP_KERNEL); |
443 |
&(ring->dmabase), flags); |
| 432 |
if (!ring->descbase) { |
444 |
if (!ring->descbase) { |
| 433 |
b43err(ring->dev->wl, "DMA ringmemory allocation failed\n"); |
445 |
b43err(ring->dev->wl, "DMA ringmemory allocation failed\n"); |
| 434 |
return -ENOMEM; |
446 |
return -ENOMEM; |
|
Lines 483-489
int b43_dmacontroller_rx_reset(struct b4
Link Here
|
| 483 |
return 0; |
495 |
return 0; |
| 484 |
} |
496 |
} |
| 485 |
|
497 |
|
| 486 |
/* Reset the RX DMA channel */ |
498 |
/* Reset the TX DMA channel */ |
| 487 |
int b43_dmacontroller_tx_reset(struct b43_wldev *dev, u16 mmio_base, int dma64) |
499 |
int b43_dmacontroller_tx_reset(struct b43_wldev *dev, u16 mmio_base, int dma64) |
| 488 |
{ |
500 |
{ |
| 489 |
int i; |
501 |
int i; |
|
Lines 647-653
static int dmacontroller_setup(struct b4
Link Here
|
| 647 |
b43_dma_write(ring, B43_DMA64_TXRINGHI, |
659 |
b43_dma_write(ring, B43_DMA64_TXRINGHI, |
| 648 |
((ringbase >> 32) & |
660 |
((ringbase >> 32) & |
| 649 |
~SSB_DMA_TRANSLATION_MASK) |
661 |
~SSB_DMA_TRANSLATION_MASK) |
| 650 |
| trans); |
662 |
| (trans << 1)); |
| 651 |
} else { |
663 |
} else { |
| 652 |
u32 ringbase = (u32) (ring->dmabase); |
664 |
u32 ringbase = (u32) (ring->dmabase); |
| 653 |
|
665 |
|
|
Lines 680-687
static int dmacontroller_setup(struct b4
Link Here
|
| 680 |
b43_dma_write(ring, B43_DMA64_RXRINGHI, |
692 |
b43_dma_write(ring, B43_DMA64_RXRINGHI, |
| 681 |
((ringbase >> 32) & |
693 |
((ringbase >> 32) & |
| 682 |
~SSB_DMA_TRANSLATION_MASK) |
694 |
~SSB_DMA_TRANSLATION_MASK) |
| 683 |
| trans); |
695 |
| (trans << 1)); |
| 684 |
b43_dma_write(ring, B43_DMA64_RXINDEX, 200); |
696 |
b43_dma_write(ring, B43_DMA64_RXINDEX, ring->nr_slots * |
|
|
697 |
sizeof(struct b43_dmadesc64)); |
| 685 |
} else { |
698 |
} else { |
| 686 |
u32 ringbase = (u32) (ring->dmabase); |
699 |
u32 ringbase = (u32) (ring->dmabase); |
| 687 |
|
700 |
|
|
Lines 695-705
static int dmacontroller_setup(struct b4
Link Here
|
| 695 |
b43_dma_write(ring, B43_DMA32_RXRING, |
708 |
b43_dma_write(ring, B43_DMA32_RXRING, |
| 696 |
(ringbase & ~SSB_DMA_TRANSLATION_MASK) |
709 |
(ringbase & ~SSB_DMA_TRANSLATION_MASK) |
| 697 |
| trans); |
710 |
| trans); |
| 698 |
b43_dma_write(ring, B43_DMA32_RXINDEX, 200); |
711 |
b43_dma_write(ring, B43_DMA32_RXINDEX, ring->nr_slots * |
|
|
712 |
sizeof(struct b43_dmadesc32)); |
| 699 |
} |
713 |
} |
| 700 |
} |
714 |
} |
| 701 |
|
715 |
|
| 702 |
out: |
716 |
out: |
| 703 |
return err; |
717 |
return err; |
| 704 |
} |
718 |
} |
| 705 |
|
719 |
|