Problem with understanding DMA on some machines (known solution!), specs needed?

Rafał Miłecki zajec5 at gmail.com
Tue Jul 26 03:20:59 EDT 2011


W dniu 26 lipca 2011 02:35 użytkownik Larry Finger
<Larry.Finger at lwfinger.net> napisał:
> On 07/25/2011 04:54 PM, Rafał Miłecki wrote:
>>
>> Hey, I've finally came back to my 14e4:4329 with not working DMA. I
>> hoped disabling parity will make my DMA work, but this didn't do the
>> trick.
>>
>> The card is PCI one with following params:
>> SSB 2.4
>> BCM4321
>> SPROM: 4
>> PMU: ─
>> Core rev: 11
>> PHY: N / 1
>> Radio: 0x2055 / 4
>>
>> I've dumped wl and b43 ops and compare them. Noticed something
>> interesting in DMA setup.
>>
>> wl:
>>  read32 0xc0200200 ->  0x00000000
>> write32 0xc0200200<- 0x00000801
>> write32 0xc0200208<- 0x5f310000
>> write32 0xc020020c<- 0x00000000
>>
>> b43:
>> write32 0xc0200200<- 0x00000801
>> write32 0xc0200208<- 0x198b2000
>> write32 0xc020020c<- 0x80000000
>>
>> Can you see the difference? wl does not put routing (translation) bits
>> in 0x20c at all. 0x208 on the other hand is suspicious.
>>
>> It looks that wl is:
>> 1) Using 0x40000000 routing instead of 0x80000000 routing
>> 2) wl puts routing bits in addrlo instead of addrhi
>
> Does the card report 32- or 64-bit addressing?

64-bit:
read32 0xc0200f9c -> 0x100c0000
#define  SSB_TMSHIGH_DMA64	0x10000000 /* 64bit DMA supported */
(and b43 of course correctly displays info about 64-bit DMA)


>> According to the specs, routing goes always to the addrhi:
>>
>>> The address 2 field is as follows (address 1 contains all address bits):
>>> Mask    Function
>>> 0x3FFFFFFF      Address
>>> 0xC0000000      Routing
>>
>> So I've hacked b43 to use 0x40000000 as translation and to put routing
>> in addrlo. Wohoo, this helped! For the first time I saw packets using
>> DMA engine.
>
> What wl is doing is exactly what you would expect for 32-bit DMA. Do a few
> test prints in b43_dma_init() to see what dmamask is on input and what value
> is returned.

I don't think so. Below are wl ops with my comments:

write32 0xc0200208<- 0x5f310000
This is clearly some address ORed with 0x40000000. If you assume DMA
is really a 32-bit one, this would mean writing address to 0x208 ==
"Descriptor Stop Index".

write32 0xc020020c<- 0x00000000
In case of 32-bit DMA this would mean writing to "Transmit Status
Word". It sounds more like read-only register.

I think
write32 0xc0200208<- 0x5f310000
write32 0xc020020c<- 0x00000000
is just writing to:
Descriptor Ring Address (Low 32 Bits)
Descriptor Ring Address (High 32 Bits)
(and this is really 64-bit DMA with some additional special-support
for this card / PCI cards).


>> Now, the question: when for real we should use such a solution?
>
> If we detect the number of DMA bits correctly, all else should be OK. It may
> be that we need a quirk for this card.
>
>> Larry, could you check your driver? Can you see anything about this?
>> Is this maybe PCI (not PCIe!) specific?
>
> It could be. I don't recall anything as new as a Rev 11 802.11 core in PCI.
> I looked at it a bit, but I didn't see anything. There is no code that says
> do "this" if the card has a 4329 ID. There are some special 4329 routines,
> but none seem to have anything to do with DMA.

-- 
Rafał



More information about the b43-dev mailing list