2011-08-10 18:42:22

by Rafał Miłecki

[permalink] [raw]
Subject: [RFC][RFT][PATCH V2 1/2] ssb: fix DMA translation for some specific boards

Signed-off-by: Michael Buesch <[email protected]>
Signed-off-by: Rafał Miłecki <[email protected]>
---
drivers/ssb/main.c | 24 +++++++++++++++++++++---
1 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c
index 6ec6e09..87067b8 100644
--- a/drivers/ssb/main.c
+++ b/drivers/ssb/main.c
@@ -1260,16 +1260,34 @@ void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags)
}
EXPORT_SYMBOL(ssb_device_disable);

+/* Some chipsets need routing known for PCIe and 64-bit DMA */
+static bool ssb_dma_translation_special_bit(struct ssb_device *dev)
+{
+ u16 chip_id = dev->bus->chip_id;
+
+ if (dev->id.coreid == SSB_DEV_80211) {
+ return (chip_id == 0x4322 || chip_id == 43221 ||
+ chip_id == 43231 || chip_id == 43222);
+ }
+
+ return 0;
+}
+
u32 ssb_dma_translation(struct ssb_device *dev)
{
switch (dev->bus->bustype) {
case SSB_BUSTYPE_SSB:
return 0;
case SSB_BUSTYPE_PCI:
- if (ssb_read32(dev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64)
+ if (pci_is_pcie(dev->bus->host_pci) &&
+ ssb_read32(dev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64) {
return SSB_PCIE_DMA_H32;
- else
- return SSB_PCI_DMA;
+ } else {
+ if (ssb_dma_translation_special_bit(dev))
+ return SSB_PCIE_DMA_H32;
+ else
+ return SSB_PCI_DMA;
+ }
default:
__ssb_dma_not_implemented(dev);
}
--
1.7.1



2011-08-11 08:05:20

by Rafał Miłecki

[permalink] [raw]
Subject: Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware

W dniu 11 sierpnia 2011 06:39 użytkownik Larry Finger
<[email protected]> napisał:
> On 08/10/2011 07:14 PM, Rafał Miłecki wrote:
>>
>> W dniu 10 sierpnia 2011 20:35 użytkownik Rafał Miłecki
>> <[email protected]>  napisał:
>>>
>>> Some hardware with 64-bit DMA uses lower address word for setting
>>> routing (translation) bit. Add workaround for such boards.
>>>
>>> Signed-off-by: Rafał Miłecki<[email protected]>
>>> ---
>>> This requires testing on at least 1 normal 64-bit DMA card and 1 32-bit
>>> DMA card. So far it was tested only on my 14e4:4329 where it fixed DMA.
>>
>> 14e4:4353 (BCM43224), 64-bit DMA, still works :)
>>
>> The rest will follow tomorrow.
>
> Tested with 14e4:4311 (64-bit) and 14e4:4318 (32-bit). The ssb changes were
> also tested with b43legacy.

Thanks Larry.

I've additionally tested this on 14e4:4312 (BCM4311), 32-bit DMA. Works OK.

John: please take this patchset.

--
Rafał

2011-08-10 19:11:51

by Michael Büsch

[permalink] [raw]
Subject: Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware

On Wed, 10 Aug 2011 20:35:39 +0200
Rafał Miłecki <[email protected]> wrote:

> Some hardware with 64-bit DMA uses lower address word for setting
> routing (translation) bit. Add workaround for such boards.
>
> Signed-off-by: Rafał Miłecki <[email protected]>
> ---
> This requires testing on at least 1 normal 64-bit DMA card and 1 32-bit
> DMA card. So far it was tested only on my 14e4:4329 where it fixed DMA.
> ---

Looks good. I didn't test it, though.

--
Greetings, Michael.

2011-08-10 18:42:34

by Rafał Miłecki

[permalink] [raw]
Subject: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware

Some hardware with 64-bit DMA uses lower address word for setting
routing (translation) bit. Add workaround for such boards.

Signed-off-by: Rafał Miłecki <[email protected]>
---
This requires testing on at least 1 normal 64-bit DMA card and 1 32-bit
DMA card. So far it was tested only on my 14e4:4329 where it fixed DMA.
---
drivers/net/wireless/b43/b43.h | 1 +
drivers/net/wireless/b43/dma.c | 113 +++++++++++++++++++++++++++-------------
drivers/net/wireless/b43/dma.h | 6 ++
3 files changed, 84 insertions(+), 36 deletions(-)

diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
index c818b0b..3aee322 100644
--- a/drivers/net/wireless/b43/b43.h
+++ b/drivers/net/wireless/b43/b43.h
@@ -594,6 +594,7 @@ struct b43_dma {
struct b43_dmaring *rx_ring;

u32 translation; /* Routing bits */
+ bool translation_in_low; /* Should translation bit go into low addr? */
bool parity; /* Check for parity */
};

diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c
index 0953ce1..547851c 100644
--- a/drivers/net/wireless/b43/dma.c
+++ b/drivers/net/wireless/b43/dma.c
@@ -47,6 +47,38 @@
* into separate slots. */
#define TX_SLOTS_PER_FRAME 2

+static u32 b43_dma_address(struct b43_dma *dma, dma_addr_t dmaaddr,
+ enum b43_addrtype addrtype)
+{
+ u32 uninitialized_var(addr);
+
+ switch (addrtype) {
+ case B43_DMA_ADDR_LOW:
+ addr = dmaaddr & 0xFFFFFFFF;
+ if (dma->translation_in_low) {
+ addr &= ~SSB_DMA_TRANSLATION_MASK;
+ addr |= dma->translation;
+ }
+ break;
+ case B43_DMA_ADDR_HIGH:
+ addr = dmaaddr >> 32;
+ if (!dma->translation_in_low) {
+ addr &= ~SSB_DMA_TRANSLATION_MASK;
+ addr |= dma->translation;
+ }
+ break;
+ case B43_DMA_ADDR_EXT:
+ if (dma->translation_in_low)
+ addr = dmaaddr & 0xFFFFFFFF;
+ else
+ addr = dmaaddr >> 32;
+ addr &= SSB_DMA_TRANSLATION_MASK;
+ addr >>= SSB_DMA_TRANSLATION_SHIFT;
+ break;
+ }
+
+ return addr;
+}

/* 32bit DMA ops. */
static
@@ -77,10 +109,9 @@ static void op32_fill_descriptor(struct b43_dmaring *ring,
slot = (int)(&(desc->dma32) - descbase);
B43_WARN_ON(!(slot >= 0 && slot < ring->nr_slots));

- addr = (u32) (dmaaddr & ~SSB_DMA_TRANSLATION_MASK);
- addrext = (u32) (dmaaddr & SSB_DMA_TRANSLATION_MASK)
- >> SSB_DMA_TRANSLATION_SHIFT;
- addr |= ring->dev->dma.translation;
+ addr = b43_dma_address(&ring->dev->dma, dmaaddr, B43_DMA_ADDR_LOW);
+ addrext = b43_dma_address(&ring->dev->dma, dmaaddr, B43_DMA_ADDR_EXT);
+
ctl = bufsize & B43_DMA32_DCTL_BYTECNT;
if (slot == ring->nr_slots - 1)
ctl |= B43_DMA32_DCTL_DTABLEEND;
@@ -170,11 +201,10 @@ static void op64_fill_descriptor(struct b43_dmaring *ring,
slot = (int)(&(desc->dma64) - descbase);
B43_WARN_ON(!(slot >= 0 && slot < ring->nr_slots));

- addrlo = (u32) (dmaaddr & 0xFFFFFFFF);
- addrhi = (((u64) dmaaddr >> 32) & ~SSB_DMA_TRANSLATION_MASK);
- addrext = (((u64) dmaaddr >> 32) & SSB_DMA_TRANSLATION_MASK)
- >> SSB_DMA_TRANSLATION_SHIFT;
- addrhi |= ring->dev->dma.translation;
+ addrlo = b43_dma_address(&ring->dev->dma, dmaaddr, B43_DMA_ADDR_LOW);
+ addrhi = b43_dma_address(&ring->dev->dma, dmaaddr, B43_DMA_ADDR_HIGH);
+ addrext = b43_dma_address(&ring->dev->dma, dmaaddr, B43_DMA_ADDR_EXT);
+
if (slot == ring->nr_slots - 1)
ctl0 |= B43_DMA64_DCTL0_DTABLEEND;
if (start)
@@ -658,41 +688,37 @@ static int dmacontroller_setup(struct b43_dmaring *ring)
int err = 0;
u32 value;
u32 addrext;
- u32 trans = ring->dev->dma.translation;
bool parity = ring->dev->dma.parity;
+ u32 addrlo;
+ u32 addrhi;

if (ring->tx) {
if (ring->type == B43_DMA_64BIT) {
u64 ringbase = (u64) (ring->dmabase);
+ addrext = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_EXT);
+ addrlo = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_LOW);
+ addrhi = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_HIGH);

- addrext = ((ringbase >> 32) & SSB_DMA_TRANSLATION_MASK)
- >> SSB_DMA_TRANSLATION_SHIFT;
value = B43_DMA64_TXENABLE;
value |= (addrext << B43_DMA64_TXADDREXT_SHIFT)
& B43_DMA64_TXADDREXT_MASK;
if (!parity)
value |= B43_DMA64_TXPARITYDISABLE;
b43_dma_write(ring, B43_DMA64_TXCTL, value);
- b43_dma_write(ring, B43_DMA64_TXRINGLO,
- (ringbase & 0xFFFFFFFF));
- b43_dma_write(ring, B43_DMA64_TXRINGHI,
- ((ringbase >> 32) &
- ~SSB_DMA_TRANSLATION_MASK)
- | trans);
+ b43_dma_write(ring, B43_DMA64_TXRINGLO, addrlo);
+ b43_dma_write(ring, B43_DMA64_TXRINGHI, addrhi);
} else {
u32 ringbase = (u32) (ring->dmabase);
+ addrext = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_EXT);
+ addrlo = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_LOW);

- addrext = (ringbase & SSB_DMA_TRANSLATION_MASK)
- >> SSB_DMA_TRANSLATION_SHIFT;
value = B43_DMA32_TXENABLE;
value |= (addrext << B43_DMA32_TXADDREXT_SHIFT)
& B43_DMA32_TXADDREXT_MASK;
if (!parity)
value |= B43_DMA32_TXPARITYDISABLE;
b43_dma_write(ring, B43_DMA32_TXCTL, value);
- b43_dma_write(ring, B43_DMA32_TXRING,
- (ringbase & ~SSB_DMA_TRANSLATION_MASK)
- | trans);
+ b43_dma_write(ring, B43_DMA32_TXRING, addrlo);
}
} else {
err = alloc_initial_descbuffers(ring);
@@ -700,9 +726,10 @@ static int dmacontroller_setup(struct b43_dmaring *ring)
goto out;
if (ring->type == B43_DMA_64BIT) {
u64 ringbase = (u64) (ring->dmabase);
+ addrext = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_EXT);
+ addrlo = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_LOW);
+ addrhi = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_HIGH);

- addrext = ((ringbase >> 32) & SSB_DMA_TRANSLATION_MASK)
- >> SSB_DMA_TRANSLATION_SHIFT;
value = (ring->frameoffset << B43_DMA64_RXFROFF_SHIFT);
value |= B43_DMA64_RXENABLE;
value |= (addrext << B43_DMA64_RXADDREXT_SHIFT)
@@ -710,19 +737,15 @@ static int dmacontroller_setup(struct b43_dmaring *ring)
if (!parity)
value |= B43_DMA64_RXPARITYDISABLE;
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) &
- ~SSB_DMA_TRANSLATION_MASK)
- | trans);
+ b43_dma_write(ring, B43_DMA64_RXRINGLO, addrlo);
+ b43_dma_write(ring, B43_DMA64_RXRINGHI, addrhi);
b43_dma_write(ring, B43_DMA64_RXINDEX, ring->nr_slots *
sizeof(struct b43_dmadesc64));
} else {
u32 ringbase = (u32) (ring->dmabase);
+ addrext = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_EXT);
+ addrlo = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_LOW);

- addrext = (ringbase & SSB_DMA_TRANSLATION_MASK)
- >> SSB_DMA_TRANSLATION_SHIFT;
value = (ring->frameoffset << B43_DMA32_RXFROFF_SHIFT);
value |= B43_DMA32_RXENABLE;
value |= (addrext << B43_DMA32_RXADDREXT_SHIFT)
@@ -730,9 +753,7 @@ static int dmacontroller_setup(struct b43_dmaring *ring)
if (!parity)
value |= B43_DMA32_RXPARITYDISABLE;
b43_dma_write(ring, B43_DMA32_RXCTL, value);
- b43_dma_write(ring, B43_DMA32_RXRING,
- (ringbase & ~SSB_DMA_TRANSLATION_MASK)
- | trans);
+ b43_dma_write(ring, B43_DMA32_RXRING, addrlo);
b43_dma_write(ring, B43_DMA32_RXINDEX, ring->nr_slots *
sizeof(struct b43_dmadesc32));
}
@@ -1052,6 +1073,25 @@ static int b43_dma_set_mask(struct b43_wldev *dev, u64 mask)
return 0;
}

+/* Some hardware with 64-bit DMA seems to be bugged and looks for translation
+ * bit in low address word instead of high one.
+ */
+static bool b43_dma_translation_in_low_word(struct b43_wldev *dev,
+ enum b43_dmatype type)
+{
+ if (type != B43_DMA_64BIT)
+ return 1;
+
+#ifdef CONFIG_B43_SSB
+ if (dev->dev->bus_type == B43_BUS_SSB &&
+ dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
+ !(dev->dev->sdev->bus->host_pci->is_pcie &&
+ ssb_read32(dev->dev->sdev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64))
+ return 1;
+#endif
+ return 0;
+}
+
int b43_dma_init(struct b43_wldev *dev)
{
struct b43_dma *dma = &dev->dma;
@@ -1077,6 +1117,7 @@ int b43_dma_init(struct b43_wldev *dev)
break;
#endif
}
+ dma->translation_in_low = b43_dma_translation_in_low_word(dev, type);

dma->parity = true;
#ifdef CONFIG_B43_BCMA
diff --git a/drivers/net/wireless/b43/dma.h b/drivers/net/wireless/b43/dma.h
index cdf8709..1a5313d 100644
--- a/drivers/net/wireless/b43/dma.h
+++ b/drivers/net/wireless/b43/dma.h
@@ -212,6 +212,12 @@ enum b43_dmatype {
B43_DMA_64BIT = 64,
};

+enum b43_addrtype {
+ B43_DMA_ADDR_LOW,
+ B43_DMA_ADDR_HIGH,
+ B43_DMA_ADDR_EXT,
+};
+
struct b43_dmaring {
/* Lowlevel DMA ops. */
const struct b43_dma_ops *ops;
--
1.7.1


2011-08-11 16:22:27

by Rafał Miłecki

[permalink] [raw]
Subject: Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware

W dniu 11 sierpnia 2011 18:21 użytkownik Rafał Miłecki
<[email protected]> napisał:
> W dniu 11 sierpnia 2011 18:04 użytkownik John W. Linville
> <[email protected]> napisał:
>> On Thu, Aug 11, 2011 at 10:05:19AM +0200, Rafał Miłecki wrote:
>>> W dniu 11 sierpnia 2011 06:39 użytkownik Larry Finger
>>> <[email protected]> napisał:
>>> > On 08/10/2011 07:14 PM, Rafał Miłecki wrote:
>>> >>
>>> >> W dniu 10 sierpnia 2011 20:35 użytkownik Rafał Miłecki
>>> >> <[email protected]>  napisał:
>>> >>>
>>> >>> Some hardware with 64-bit DMA uses lower address word for setting
>>> >>> routing (translation) bit. Add workaround for such boards.
>>> >>>
>>> >>> Signed-off-by: Rafał Miłecki<[email protected]>
>>> >>> ---
>>> >>> This requires testing on at least 1 normal 64-bit DMA card and 1 32-bit
>>> >>> DMA card. So far it was tested only on my 14e4:4329 where it fixed DMA.
>>> >>
>>> >> 14e4:4353 (BCM43224), 64-bit DMA, still works :)
>>> >>
>>> >> The rest will follow tomorrow.
>>> >
>>> > Tested with 14e4:4311 (64-bit) and 14e4:4318 (32-bit). The ssb changes were
>>> > also tested with b43legacy.
>>>
>>> Thanks Larry.
>>>
>>> I've additionally tested this on 14e4:4312 (BCM4311), 32-bit DMA. Works OK.
>>>
>>> John: please take this patchset.
>>
>> Are these fixes intended for 3.1?
>
> The bug in DMA support is in the driver since the first moment we
> enabled support for N-PHY. It's not any kind of regression. However,
> it's still a bug fix.
>
> If it's OK to take that for 3.1, then go on. I believe it received
> required testing. On the other hand, if it's going to make Dave or
> Linus angry, leave it for 3.2. We have this bug since  2.6.39, we can
> have it for one more release.

s/Dave/David/, sorry

--
Rafał

2011-08-13 22:26:46

by Larry Finger

[permalink] [raw]
Subject: Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware

On 08/10/2011 01:35 PM, Rafał Miłecki wrote:
> Some hardware with 64-bit DMA uses lower address word for setting
> routing (translation) bit. Add workaround for such boards.
>
> Signed-off-by: Rafał Miłecki<[email protected]>
> ---
> This requires testing on at least 1 normal 64-bit DMA card and 1 32-bit
> DMA card. So far it was tested only on my 14e4:4329 where it fixed DMA.
> ---
> drivers/net/wireless/b43/b43.h | 1 +
> drivers/net/wireless/b43/dma.c | 113 +++++++++++++++++++++++++++-------------
> drivers/net/wireless/b43/dma.h | 6 ++
> 3 files changed, 84 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
> index c818b0b..3aee322 100644
> --- a/drivers/net/wireless/b43/b43.h
> +++ b/drivers/net/wireless/b43/b43.h
> @@ -594,6 +594,7 @@ struct b43_dma {
> struct b43_dmaring *rx_ring;
>
> u32 translation; /* Routing bits */
> + bool translation_in_low; /* Should translation bit go into low addr? */
> bool parity; /* Check for parity */
> };
>
> diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c
> index 0953ce1..547851c 100644
> --- a/drivers/net/wireless/b43/dma.c
> +++ b/drivers/net/wireless/b43/dma.c
> @@ -47,6 +47,38 @@
> * into separate slots. */
> #define TX_SLOTS_PER_FRAME 2
>
> +static u32 b43_dma_address(struct b43_dma *dma, dma_addr_t dmaaddr,
> + enum b43_addrtype addrtype)
> +{
> + u32 uninitialized_var(addr);
> +
> + switch (addrtype) {
> + case B43_DMA_ADDR_LOW:
> + addr = dmaaddr& 0xFFFFFFFF;
> + if (dma->translation_in_low) {
> + addr&= ~SSB_DMA_TRANSLATION_MASK;
> + addr |= dma->translation;
> + }
> + break;
> + case B43_DMA_ADDR_HIGH:
> + addr = dmaaddr>> 32;
> + if (!dma->translation_in_low) {
> + addr&= ~SSB_DMA_TRANSLATION_MASK;
> + addr |= dma->translation;
> + }
> + break;
> + case B43_DMA_ADDR_EXT:
> + if (dma->translation_in_low)
> + addr = dmaaddr& 0xFFFFFFFF;
> + else
> + addr = dmaaddr>> 32;
> + addr&= SSB_DMA_TRANSLATION_MASK;
> + addr>>= SSB_DMA_TRANSLATION_SHIFT;
> + break;

Sorry I missed this earlier, but when this code is compiled on a 32-bit system,
the compiler spits out

CC [M] drivers/net/wireless/b43/dma.o
drivers/net/wireless/b43/dma.c: In function ‘b43_dma_address’:
drivers/net/wireless/b43/dma.c:64: warning: right shift count >= width of type
drivers/net/wireless/b43/dma.c:74: warning: right shift count >= width of type

This is reasonable as dma_addr_t is 32 bits.

Larry

2011-08-11 16:21:32

by Rafał Miłecki

[permalink] [raw]
Subject: Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware

W dniu 11 sierpnia 2011 18:04 użytkownik John W. Linville
<[email protected]> napisał:
> On Thu, Aug 11, 2011 at 10:05:19AM +0200, Rafał Miłecki wrote:
>> W dniu 11 sierpnia 2011 06:39 użytkownik Larry Finger
>> <[email protected]> napisał:
>> > On 08/10/2011 07:14 PM, Rafał Miłecki wrote:
>> >>
>> >> W dniu 10 sierpnia 2011 20:35 użytkownik Rafał Miłecki
>> >> <[email protected]>  napisał:
>> >>>
>> >>> Some hardware with 64-bit DMA uses lower address word for setting
>> >>> routing (translation) bit. Add workaround for such boards.
>> >>>
>> >>> Signed-off-by: Rafał Miłecki<[email protected]>
>> >>> ---
>> >>> This requires testing on at least 1 normal 64-bit DMA card and 1 32-bit
>> >>> DMA card. So far it was tested only on my 14e4:4329 where it fixed DMA.
>> >>
>> >> 14e4:4353 (BCM43224), 64-bit DMA, still works :)
>> >>
>> >> The rest will follow tomorrow.
>> >
>> > Tested with 14e4:4311 (64-bit) and 14e4:4318 (32-bit). The ssb changes were
>> > also tested with b43legacy.
>>
>> Thanks Larry.
>>
>> I've additionally tested this on 14e4:4312 (BCM4311), 32-bit DMA. Works OK.
>>
>> John: please take this patchset.
>
> Are these fixes intended for 3.1?

The bug in DMA support is in the driver since the first moment we
enabled support for N-PHY. It's not any kind of regression. However,
it's still a bug fix.

If it's OK to take that for 3.1, then go on. I believe it received
required testing. On the other hand, if it's going to make Dave or
Linus angry, leave it for 3.2. We have this bug since 2.6.39, we can
have it for one more release.

--
Rafał

2011-08-11 16:15:14

by John W. Linville

[permalink] [raw]
Subject: Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware

On Thu, Aug 11, 2011 at 10:05:19AM +0200, Rafał Miłecki wrote:
> W dniu 11 sierpnia 2011 06:39 użytkownik Larry Finger
> <[email protected]> napisał:
> > On 08/10/2011 07:14 PM, Rafał Miłecki wrote:
> >>
> >> W dniu 10 sierpnia 2011 20:35 użytkownik Rafał Miłecki
> >> <[email protected]>  napisał:
> >>>
> >>> Some hardware with 64-bit DMA uses lower address word for setting
> >>> routing (translation) bit. Add workaround for such boards.
> >>>
> >>> Signed-off-by: Rafał Miłecki<[email protected]>
> >>> ---
> >>> This requires testing on at least 1 normal 64-bit DMA card and 1 32-bit
> >>> DMA card. So far it was tested only on my 14e4:4329 where it fixed DMA.
> >>
> >> 14e4:4353 (BCM43224), 64-bit DMA, still works :)
> >>
> >> The rest will follow tomorrow.
> >
> > Tested with 14e4:4311 (64-bit) and 14e4:4318 (32-bit). The ssb changes were
> > also tested with b43legacy.
>
> Thanks Larry.
>
> I've additionally tested this on 14e4:4312 (BCM4311), 32-bit DMA. Works OK.
>
> John: please take this patchset.

Are these fixes intended for 3.1?

--
John W. Linville Someday the world will need a hero, and you
[email protected] might be all we have. Be ready.

2011-08-11 00:14:15

by Rafał Miłecki

[permalink] [raw]
Subject: Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware

W dniu 10 sierpnia 2011 20:35 użytkownik Rafał Miłecki
<[email protected]> napisał:
> Some hardware with 64-bit DMA uses lower address word for setting
> routing (translation) bit. Add workaround for such boards.
>
> Signed-off-by: Rafał Miłecki <[email protected]>
> ---
> This requires testing on at least 1 normal 64-bit DMA card and 1 32-bit
> DMA card. So far it was tested only on my 14e4:4329 where it fixed DMA.

14e4:4353 (BCM43224), 64-bit DMA, still works :)

The rest will follow tomorrow.

--
Rafał

2011-08-11 04:39:46

by Larry Finger

[permalink] [raw]
Subject: Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware

On 08/10/2011 07:14 PM, Rafał Miłecki wrote:
> W dniu 10 sierpnia 2011 20:35 użytkownik Rafał Miłecki
> <[email protected]> napisał:
>> Some hardware with 64-bit DMA uses lower address word for setting
>> routing (translation) bit. Add workaround for such boards.
>>
>> Signed-off-by: Rafał Miłecki<[email protected]>
>> ---
>> This requires testing on at least 1 normal 64-bit DMA card and 1 32-bit
>> DMA card. So far it was tested only on my 14e4:4329 where it fixed DMA.
>
> 14e4:4353 (BCM43224), 64-bit DMA, still works :)
>
> The rest will follow tomorrow.

Tested with 14e4:4311 (64-bit) and 14e4:4318 (32-bit). The ssb changes were also
tested with b43legacy.

Larry