All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC][RFT][PATCH V2 1/2] ssb: fix DMA translation for some specific boards
@ 2011-08-10 18:35 ` Rafał Miłecki
  0 siblings, 0 replies; 20+ messages in thread
From: Rafał Miłecki @ 2011-08-10 18:35 UTC (permalink / raw)
  To: linux-wireless, John W. Linville
  Cc: b43-dev, Rafał Miłecki, Michael Buesch

Signed-off-by: Michael Buesch <m@bues.ch>
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 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


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [RFC][RFT][PATCH V2 1/2] ssb: fix DMA translation for some specific boards
@ 2011-08-10 18:35 ` Rafał Miłecki
  0 siblings, 0 replies; 20+ messages in thread
From: Rafał Miłecki @ 2011-08-10 18:35 UTC (permalink / raw)
  To: linux-wireless, John W. Linville
  Cc: b43-dev, Rafał Miłecki, Michael Buesch

Signed-off-by: Michael Buesch <m@bues.ch>
Signed-off-by: Rafa? Mi?ecki <zajec5@gmail.com>
---
 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

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
  2011-08-10 18:35 ` Rafał Miłecki
@ 2011-08-10 18:35   ` Rafał Miłecki
  -1 siblings, 0 replies; 20+ messages in thread
From: Rafał Miłecki @ 2011-08-10 18:35 UTC (permalink / raw)
  To: linux-wireless, John W. Linville; +Cc: b43-dev, Rafał Miłecki

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 <zajec5@gmail.com>
---
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


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
@ 2011-08-10 18:35   ` Rafał Miłecki
  0 siblings, 0 replies; 20+ messages in thread
From: Rafał Miłecki @ 2011-08-10 18:35 UTC (permalink / raw)
  To: linux-wireless, John W. Linville; +Cc: b43-dev, Rafał Miłecki

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 <zajec5@gmail.com>
---
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

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
  2011-08-10 18:35   ` Rafał Miłecki
@ 2011-08-10 19:11     ` Michael Büsch
  -1 siblings, 0 replies; 20+ messages in thread
From: Michael Büsch @ 2011-08-10 19:11 UTC (permalink / raw)
  To: Rafał Miłecki; +Cc: linux-wireless, John W. Linville, b43-dev

On Wed, 10 Aug 2011 20:35:39 +0200
Rafał Miłecki <zajec5@gmail.com> 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 <zajec5@gmail.com>
> ---
> 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.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
@ 2011-08-10 19:11     ` Michael Büsch
  0 siblings, 0 replies; 20+ messages in thread
From: Michael Büsch @ 2011-08-10 19:11 UTC (permalink / raw)
  To: Rafał Miłecki; +Cc: linux-wireless, John W. Linville, b43-dev

On Wed, 10 Aug 2011 20:35:39 +0200
Rafa? Mi?ecki <zajec5@gmail.com> 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 <zajec5@gmail.com>
> ---
> 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.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
  2011-08-10 18:35   ` Rafał Miłecki
@ 2011-08-11  0:14     ` Rafał Miłecki
  -1 siblings, 0 replies; 20+ messages in thread
From: Rafał Miłecki @ 2011-08-11  0:14 UTC (permalink / raw)
  To: linux-wireless, John W. Linville; +Cc: b43-dev, Rafał Miłecki

W dniu 10 sierpnia 2011 20:35 użytkownik Rafał Miłecki
<zajec5@gmail.com> 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 <zajec5@gmail.com>
> ---
> 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ł

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
@ 2011-08-11  0:14     ` Rafał Miłecki
  0 siblings, 0 replies; 20+ messages in thread
From: Rafał Miłecki @ 2011-08-11  0:14 UTC (permalink / raw)
  To: linux-wireless, John W. Linville; +Cc: b43-dev, Rafał Miłecki

W dniu 10 sierpnia 2011 20:35 u?ytkownik Rafa? Mi?ecki
<zajec5@gmail.com> 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 <zajec5@gmail.com>
> ---
> 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?

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
  2011-08-11  0:14     ` Rafał Miłecki
@ 2011-08-11  4:39       ` Larry Finger
  -1 siblings, 0 replies; 20+ messages in thread
From: Larry Finger @ 2011-08-11  4:39 UTC (permalink / raw)
  To: Rafał Miłecki; +Cc: linux-wireless, John W. Linville, b43-dev

On 08/10/2011 07:14 PM, Rafał Miłecki wrote:
> W dniu 10 sierpnia 2011 20:35 użytkownik Rafał Miłecki
> <zajec5@gmail.com>  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<zajec5@gmail.com>
>> ---
>> 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

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
@ 2011-08-11  4:39       ` Larry Finger
  0 siblings, 0 replies; 20+ messages in thread
From: Larry Finger @ 2011-08-11  4:39 UTC (permalink / raw)
  To: Rafał Miłecki; +Cc: linux-wireless, John W. Linville, b43-dev

On 08/10/2011 07:14 PM, Rafa? Mi?ecki wrote:
> W dniu 10 sierpnia 2011 20:35 u?ytkownik Rafa? Mi?ecki
> <zajec5@gmail.com>  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<zajec5@gmail.com>
>> ---
>> 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

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
  2011-08-11  4:39       ` Larry Finger
@ 2011-08-11  8:05         ` Rafał Miłecki
  -1 siblings, 0 replies; 20+ messages in thread
From: Rafał Miłecki @ 2011-08-11  8:05 UTC (permalink / raw)
  To: Larry Finger; +Cc: linux-wireless, John W. Linville, b43-dev

W dniu 11 sierpnia 2011 06:39 użytkownik Larry Finger
<Larry.Finger@lwfinger.net> napisał:
> On 08/10/2011 07:14 PM, Rafał Miłecki wrote:
>>
>> W dniu 10 sierpnia 2011 20:35 użytkownik Rafał Miłecki
>> <zajec5@gmail.com>  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<zajec5@gmail.com>
>>> ---
>>> 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ł

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
@ 2011-08-11  8:05         ` Rafał Miłecki
  0 siblings, 0 replies; 20+ messages in thread
From: Rafał Miłecki @ 2011-08-11  8:05 UTC (permalink / raw)
  To: Larry Finger; +Cc: linux-wireless, John W. Linville, b43-dev

W dniu 11 sierpnia 2011 06:39 u?ytkownik Larry Finger
<Larry.Finger@lwfinger.net> napisa?:
> On 08/10/2011 07:14 PM, Rafa? Mi?ecki wrote:
>>
>> W dniu 10 sierpnia 2011 20:35 u?ytkownik Rafa? Mi?ecki
>> <zajec5@gmail.com> ?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<zajec5@gmail.com>
>>> ---
>>> 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?

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
  2011-08-11  8:05         ` Rafał Miłecki
@ 2011-08-11 16:04           ` John W. Linville
  -1 siblings, 0 replies; 20+ messages in thread
From: John W. Linville @ 2011-08-11 16:04 UTC (permalink / raw)
  To: Rafał Miłecki; +Cc: Larry Finger, linux-wireless, b43-dev

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
> <Larry.Finger@lwfinger.net> napisał:
> > On 08/10/2011 07:14 PM, Rafał Miłecki wrote:
> >>
> >> W dniu 10 sierpnia 2011 20:35 użytkownik Rafał Miłecki
> >> <zajec5@gmail.com>  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<zajec5@gmail.com>
> >>> ---
> >>> 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
linville@tuxdriver.com			might be all we have.  Be ready.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
@ 2011-08-11 16:04           ` John W. Linville
  0 siblings, 0 replies; 20+ messages in thread
From: John W. Linville @ 2011-08-11 16:04 UTC (permalink / raw)
  To: Rafał Miłecki; +Cc: Larry Finger, linux-wireless, b43-dev

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
> <Larry.Finger@lwfinger.net> napisa?:
> > On 08/10/2011 07:14 PM, Rafa? Mi?ecki wrote:
> >>
> >> W dniu 10 sierpnia 2011 20:35 u?ytkownik Rafa? Mi?ecki
> >> <zajec5@gmail.com> ?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<zajec5@gmail.com>
> >>> ---
> >>> 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
linville at tuxdriver.com			might be all we have.  Be ready.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
  2011-08-11 16:04           ` John W. Linville
@ 2011-08-11 16:21             ` Rafał Miłecki
  -1 siblings, 0 replies; 20+ messages in thread
From: Rafał Miłecki @ 2011-08-11 16:21 UTC (permalink / raw)
  To: John W. Linville; +Cc: Larry Finger, linux-wireless, b43-dev

W dniu 11 sierpnia 2011 18:04 użytkownik John W. Linville
<linville@tuxdriver.com> 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
>> <Larry.Finger@lwfinger.net> napisał:
>> > On 08/10/2011 07:14 PM, Rafał Miłecki wrote:
>> >>
>> >> W dniu 10 sierpnia 2011 20:35 użytkownik Rafał Miłecki
>> >> <zajec5@gmail.com>  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<zajec5@gmail.com>
>> >>> ---
>> >>> 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ł

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
@ 2011-08-11 16:21             ` Rafał Miłecki
  0 siblings, 0 replies; 20+ messages in thread
From: Rafał Miłecki @ 2011-08-11 16:21 UTC (permalink / raw)
  To: John W. Linville; +Cc: Larry Finger, linux-wireless, b43-dev

W dniu 11 sierpnia 2011 18:04 u?ytkownik John W. Linville
<linville@tuxdriver.com> 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
>> <Larry.Finger@lwfinger.net> napisa?:
>> > On 08/10/2011 07:14 PM, Rafa? Mi?ecki wrote:
>> >>
>> >> W dniu 10 sierpnia 2011 20:35 u?ytkownik Rafa? Mi?ecki
>> >> <zajec5@gmail.com> ?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<zajec5@gmail.com>
>> >>> ---
>> >>> 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?

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
  2011-08-11 16:21             ` Rafał Miłecki
@ 2011-08-11 16:22               ` Rafał Miłecki
  -1 siblings, 0 replies; 20+ messages in thread
From: Rafał Miłecki @ 2011-08-11 16:22 UTC (permalink / raw)
  To: John W. Linville; +Cc: Larry Finger, linux-wireless, b43-dev

W dniu 11 sierpnia 2011 18:21 użytkownik Rafał Miłecki
<zajec5@gmail.com> napisał:
> W dniu 11 sierpnia 2011 18:04 użytkownik John W. Linville
> <linville@tuxdriver.com> 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
>>> <Larry.Finger@lwfinger.net> napisał:
>>> > On 08/10/2011 07:14 PM, Rafał Miłecki wrote:
>>> >>
>>> >> W dniu 10 sierpnia 2011 20:35 użytkownik Rafał Miłecki
>>> >> <zajec5@gmail.com>  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<zajec5@gmail.com>
>>> >>> ---
>>> >>> 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ł

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
@ 2011-08-11 16:22               ` Rafał Miłecki
  0 siblings, 0 replies; 20+ messages in thread
From: Rafał Miłecki @ 2011-08-11 16:22 UTC (permalink / raw)
  To: John W. Linville; +Cc: Larry Finger, linux-wireless, b43-dev

W dniu 11 sierpnia 2011 18:21 u?ytkownik Rafa? Mi?ecki
<zajec5@gmail.com> napisa?:
> W dniu 11 sierpnia 2011 18:04 u?ytkownik John W. Linville
> <linville@tuxdriver.com> 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
>>> <Larry.Finger@lwfinger.net> napisa?:
>>> > On 08/10/2011 07:14 PM, Rafa? Mi?ecki wrote:
>>> >>
>>> >> W dniu 10 sierpnia 2011 20:35 u?ytkownik Rafa? Mi?ecki
>>> >> <zajec5@gmail.com> ?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<zajec5@gmail.com>
>>> >>> ---
>>> >>> 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?

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
  2011-08-10 18:35   ` Rafał Miłecki
@ 2011-08-13 22:26     ` Larry Finger
  -1 siblings, 0 replies; 20+ messages in thread
From: Larry Finger @ 2011-08-13 22:26 UTC (permalink / raw)
  To: Rafał Miłecki; +Cc: linux-wireless, John W. Linville, b43-dev

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<zajec5@gmail.com>
> ---
> 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

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware
@ 2011-08-13 22:26     ` Larry Finger
  0 siblings, 0 replies; 20+ messages in thread
From: Larry Finger @ 2011-08-13 22:26 UTC (permalink / raw)
  To: Rafał Miłecki; +Cc: linux-wireless, John W. Linville, b43-dev

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<zajec5@gmail.com>
> ---
> 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

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2011-08-13 22:26 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-08-10 18:35 [RFC][RFT][PATCH V2 1/2] ssb: fix DMA translation for some specific boards Rafał Miłecki
2011-08-10 18:35 ` Rafał Miłecki
2011-08-10 18:35 ` [RFC][RFT][PATCH V2 2/2] b43: fix DMA on some bugged hardware Rafał Miłecki
2011-08-10 18:35   ` Rafał Miłecki
2011-08-10 19:11   ` Michael Büsch
2011-08-10 19:11     ` Michael Büsch
2011-08-11  0:14   ` Rafał Miłecki
2011-08-11  0:14     ` Rafał Miłecki
2011-08-11  4:39     ` Larry Finger
2011-08-11  4:39       ` Larry Finger
2011-08-11  8:05       ` Rafał Miłecki
2011-08-11  8:05         ` Rafał Miłecki
2011-08-11 16:04         ` John W. Linville
2011-08-11 16:04           ` John W. Linville
2011-08-11 16:21           ` Rafał Miłecki
2011-08-11 16:21             ` Rafał Miłecki
2011-08-11 16:22             ` Rafał Miłecki
2011-08-11 16:22               ` Rafał Miłecki
2011-08-13 22:26   ` Larry Finger
2011-08-13 22:26     ` Larry Finger

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.