On Friday 23 November 2007 06:36:55 Larry Finger wrote:
> Michael Buesch wrote:
> > 
> > partially acked.
> > Though, I'm not quite sure yet why you remove that
> > address extension bits. The specs clearly say that they _are_ there.
> > And it makes sense to use them, as two bytes of the address are used
> > for the routing stuff. So the highest 2 bits of the address have to be put
> > somewhere else. That's the "Transmit Channel Control Word" and
> > "Receive Channel Control Word" where 0x00030000 are the extension bits.
> > 
> 
> The appropriate section of dmacontroller_setup() in my patched source is as 
> follows:
> 
>         if (ring->tx) {
>                 if (ring->dma64) {
>                         u64 ringbase = (u64) (ring->dmabase);
> 
>                         b43_dma_write(ring, B43_DMA64_TXCTL,
>                                       B43_DMA64_TXENABLE);
>                         b43_dma_write(ring, B43_DMA64_TXRINGLO,
>                                       (ringbase & 0xFFFFFFFF));
>                         b43_dma_write(ring, B43_DMA64_TXRINGHI,
>                                       (ringbase >> 32));
>                 } else {
>                       ...... untouched 32-bit stuff ....
>               }
>         } else {
>                 err = alloc_initial_descbuffers(ring);
>                 if (err)
>                         goto out;
>                 if (ring->dma64) {
>                         u64 ringbase = (u64) (ring->dmabase);
> 
>                         value = (ring->frameoffset << B43_DMA64_RXFROFF_SHIFT)
>                                 | B43_DMA64_RXENABLE;
>                         b43_dma_write(ring, B43_DMA64_RXCTL, value);
>                         b43_dma_write(ring, B43_DMA64_RXRINGLO,
>                                       (ringbase & 0xFFFFFFFF));
>                         b43_dma_write(ring, B43_DMA64_RXRINGHI,
>                                       (ringbase >> 32));
>                         b43_dma_write(ring, B43_DMA64_RXINDEX, ring->nr_slots 
> *
>                                       sizeof(struct b43_dmadesc64));
>                 } else {
>                       ........... 32-bit stuff ........
>       }
> 
> No address extensions are used here because the specs clearly state that a 
> flat 64-bit address is
> used to specify the Descriptor Ring address. My code matches the specs.

I'm not sure which specifications you use, but here it clearly describes the
extension bits:
http://bcm-v4.sipsolutions.net/802.11/DMA#TransmitChannelControlWord-1

> > However I do think that this might be related to the bug you are explaining
> > in the comment:
> >> +   * For unknown reasons - possibly a hardware error - the BCM4311 rev
> >> +   * 02, which uses 64-bit DMA, needs the ring buffer in very low memory,
> >> +   * which accounts for the GFP_DMA flag below.

> the error, and that part does not use any extension bits. Secondly, the 
> address extension stuff
> would only apply if my computer had more than 2^(62) bytes of RAM, which is 
> something like 10
> billion GB - an amount that probably exceeds the total RAM in the world.

This is not true. We live in a world with IO-MMUs.

-- 
Greetings Michael.
_______________________________________________
Bcm43xx-dev mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev

Reply via email to