b43-dev.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] ssb: improve device disabling
@ 2011-02-17  0:50 Rafał Miłecki
  2011-02-17  0:50 ` [PATCH 1/2] ssb: when needed, reject IM input while disabling device Rafał Miłecki
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Rafał Miłecki @ 2011-02-17  0:50 UTC (permalink / raw)
  To: linux-wireless, John W. Linville, Michael Büsch
  Cc: b43-dev, Rafał Miłecki

With that patches we follow specs and (as recently proved by MMIO dumps) wl.

The more important patch is the first one. It detects problem (and warns) with
SSB when it is in some broken state. We can for example hit such an issue when
enabling DMA on 14e4:4329 (N-PHY, rev 1). The real fix is now known yet, but
not we at least get warning. Switching to PIO on that card does not raise
warning anymore (as expected).

We all hate regressions and Michal says than enabling/disabling SSB device can
be tricky. I have tested that patches with few b43 driven devices:
14e4:4318 (BCM4318)
14e4:4315 (BCM4312)
14e4:4329 (BCM4321)
14e4:4328 (BCM4321)
14e4:432b (BCM4322)

With each device I performed cold booting, loading b43, testing, bringing
interface down and up, testing, reloading, testing. Sometime even more.

Unfortunately I do not have aany other SSB devices, like that supported by b44
or gige (OK, I did not even hear about gige earlier).

Rafa? Mi?ecki (2):
  ssb: when needed, reject IM input while disabling device
  ssb: reset device only if it was enabled

 drivers/ssb/main.c           |   36 +++++++++++++++++++++++++++---------
 include/linux/ssb/ssb_regs.h |    2 ++
 2 files changed, 29 insertions(+), 9 deletions(-)

-- 
1.7.3.4

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

* [PATCH 1/2] ssb: when needed, reject IM input while disabling device
  2011-02-17  0:50 [PATCH 0/2] ssb: improve device disabling Rafał Miłecki
@ 2011-02-17  0:50 ` Rafał Miłecki
  2011-02-17  0:50 ` [PATCH 2/2] ssb: reset device only if it was enabled Rafał Miłecki
  2011-02-17  4:21 ` [PATCH 0/2] ssb: improve device disabling Larry Finger
  2 siblings, 0 replies; 4+ messages in thread
From: Rafał Miłecki @ 2011-02-17  0:50 UTC (permalink / raw)
  To: linux-wireless, John W. Linville, Michael Büsch
  Cc: b43-dev, Rafał Miłecki

Signed-off-by: Rafa? Mi?ecki <zajec5@gmail.com>
---
 drivers/ssb/main.c           |   16 +++++++++++++++-
 include/linux/ssb/ssb_regs.h |    2 ++
 2 files changed, 17 insertions(+), 1 deletions(-)

diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c
index 08fed55..5b6160a 100644
--- a/drivers/ssb/main.c
+++ b/drivers/ssb/main.c
@@ -1220,7 +1220,7 @@ static int ssb_wait_bits(struct ssb_device *dev, u16 reg, u32 bitmask,
 
 void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags)
 {
-	u32 reject;
+	u32 reject, val;
 
 	if (ssb_read32(dev, SSB_TMSLOW) & SSB_TMSLOW_RESET)
 		return;
@@ -1229,12 +1229,26 @@ void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags)
 	ssb_write32(dev, SSB_TMSLOW, reject | SSB_TMSLOW_CLOCK);
 	ssb_wait_bits(dev, SSB_TMSLOW, reject, 1000, 1);
 	ssb_wait_bits(dev, SSB_TMSHIGH, SSB_TMSHIGH_BUSY, 1000, 0);
+
+	if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
+		val = ssb_read32(dev, SSB_IMSTATE);
+		val |= SSB_IMSTATE_REJECT;
+		ssb_write32(dev, SSB_IMSTATE, val);
+		ssb_wait_bits(dev, SSB_IMSTATE, SSB_IMSTATE_BUSY, 1000, 0);
+	}
+
 	ssb_write32(dev, SSB_TMSLOW,
 		    SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK |
 		    reject | SSB_TMSLOW_RESET |
 		    core_specific_flags);
 	ssb_flush_tmslow(dev);
 
+	if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
+		val = ssb_read32(dev, SSB_IMSTATE);
+		val &= ~SSB_IMSTATE_REJECT;
+		ssb_write32(dev, SSB_IMSTATE, val);
+	}
+
 	ssb_write32(dev, SSB_TMSLOW,
 		    reject | SSB_TMSLOW_RESET |
 		    core_specific_flags);
diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h
index 489f7b6..8ac6346 100644
--- a/include/linux/ssb/ssb_regs.h
+++ b/include/linux/ssb/ssb_regs.h
@@ -85,6 +85,8 @@
 #define  SSB_IMSTATE_AP_RSV	0x00000030 /* Reserved */
 #define  SSB_IMSTATE_IBE	0x00020000 /* In Band Error */
 #define  SSB_IMSTATE_TO		0x00040000 /* Timeout */
+#define  SSB_IMSTATE_BUSY	0x01800000 /* Busy (Backplane rev >= 2.3 only) */
+#define  SSB_IMSTATE_REJECT	0x02000000 /* Reject (Backplane rev >= 2.3 only) */
 #define SSB_INTVEC		0x0F94     /* SB Interrupt Mask */
 #define  SSB_INTVEC_PCI		0x00000001 /* Enable interrupts for PCI */
 #define  SSB_INTVEC_ENET0	0x00000002 /* Enable interrupts for enet 0 */
-- 
1.7.3.4

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

* [PATCH 2/2] ssb: reset device only if it was enabled
  2011-02-17  0:50 [PATCH 0/2] ssb: improve device disabling Rafał Miłecki
  2011-02-17  0:50 ` [PATCH 1/2] ssb: when needed, reject IM input while disabling device Rafał Miłecki
@ 2011-02-17  0:50 ` Rafał Miłecki
  2011-02-17  4:21 ` [PATCH 0/2] ssb: improve device disabling Larry Finger
  2 siblings, 0 replies; 4+ messages in thread
From: Rafał Miłecki @ 2011-02-17  0:50 UTC (permalink / raw)
  To: linux-wireless, John W. Linville, Michael Büsch
  Cc: b43-dev, Rafał Miłecki

Signed-off-by: Rafa? Mi?ecki <zajec5@gmail.com>
---
 drivers/ssb/main.c |   40 ++++++++++++++++++++++------------------
 1 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c
index 5b6160a..0c1c43a 100644
--- a/drivers/ssb/main.c
+++ b/drivers/ssb/main.c
@@ -1226,27 +1226,31 @@ void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags)
 		return;
 
 	reject = ssb_tmslow_reject_bitmask(dev);
-	ssb_write32(dev, SSB_TMSLOW, reject | SSB_TMSLOW_CLOCK);
-	ssb_wait_bits(dev, SSB_TMSLOW, reject, 1000, 1);
-	ssb_wait_bits(dev, SSB_TMSHIGH, SSB_TMSHIGH_BUSY, 1000, 0);
 
-	if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
-		val = ssb_read32(dev, SSB_IMSTATE);
-		val |= SSB_IMSTATE_REJECT;
-		ssb_write32(dev, SSB_IMSTATE, val);
-		ssb_wait_bits(dev, SSB_IMSTATE, SSB_IMSTATE_BUSY, 1000, 0);
-	}
+	if (ssb_read32(dev, SSB_TMSLOW) & SSB_TMSLOW_CLOCK) {
+		ssb_write32(dev, SSB_TMSLOW, reject | SSB_TMSLOW_CLOCK);
+		ssb_wait_bits(dev, SSB_TMSLOW, reject, 1000, 1);
+		ssb_wait_bits(dev, SSB_TMSHIGH, SSB_TMSHIGH_BUSY, 1000, 0);
+
+		if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
+			val = ssb_read32(dev, SSB_IMSTATE);
+			val |= SSB_IMSTATE_REJECT;
+			ssb_write32(dev, SSB_IMSTATE, val);
+			ssb_wait_bits(dev, SSB_IMSTATE, SSB_IMSTATE_BUSY, 1000,
+				      0);
+		}
 
-	ssb_write32(dev, SSB_TMSLOW,
-		    SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK |
-		    reject | SSB_TMSLOW_RESET |
-		    core_specific_flags);
-	ssb_flush_tmslow(dev);
+		ssb_write32(dev, SSB_TMSLOW,
+			SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK |
+			reject | SSB_TMSLOW_RESET |
+			core_specific_flags);
+		ssb_flush_tmslow(dev);
 
-	if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
-		val = ssb_read32(dev, SSB_IMSTATE);
-		val &= ~SSB_IMSTATE_REJECT;
-		ssb_write32(dev, SSB_IMSTATE, val);
+		if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
+			val = ssb_read32(dev, SSB_IMSTATE);
+			val &= ~SSB_IMSTATE_REJECT;
+			ssb_write32(dev, SSB_IMSTATE, val);
+		}
 	}
 
 	ssb_write32(dev, SSB_TMSLOW,
-- 
1.7.3.4

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

* [PATCH 0/2] ssb: improve device disabling
  2011-02-17  0:50 [PATCH 0/2] ssb: improve device disabling Rafał Miłecki
  2011-02-17  0:50 ` [PATCH 1/2] ssb: when needed, reject IM input while disabling device Rafał Miłecki
  2011-02-17  0:50 ` [PATCH 2/2] ssb: reset device only if it was enabled Rafał Miłecki
@ 2011-02-17  4:21 ` Larry Finger
  2 siblings, 0 replies; 4+ messages in thread
From: Larry Finger @ 2011-02-17  4:21 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: linux-wireless, John W. Linville, Michael Büsch, b43-dev

On 02/16/2011 06:50 PM, Rafa? Mi?ecki wrote:
> With that patches we follow specs and (as recently proved by MMIO dumps) wl.
>
> The more important patch is the first one. It detects problem (and warns) with
> SSB when it is in some broken state. We can for example hit such an issue when
> enabling DMA on 14e4:4329 (N-PHY, rev 1). The real fix is now known yet, but
> not we at least get warning. Switching to PIO on that card does not raise
> warning anymore (as expected).
>
> We all hate regressions and Michal says than enabling/disabling SSB device can
> be tricky. I have tested that patches with few b43 driven devices:
> 14e4:4318 (BCM4318)
> 14e4:4315 (BCM4312)
> 14e4:4329 (BCM4321)
> 14e4:4328 (BCM4321)
> 14e4:432b (BCM4322)

I tested 14e4:4311 (BCM4311) and found no problems.

Larry

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

end of thread, other threads:[~2011-02-17  4:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-02-17  0:50 [PATCH 0/2] ssb: improve device disabling Rafał Miłecki
2011-02-17  0:50 ` [PATCH 1/2] ssb: when needed, reject IM input while disabling device Rafał Miłecki
2011-02-17  0:50 ` [PATCH 2/2] ssb: reset device only if it was enabled Rafał Miłecki
2011-02-17  4:21 ` [PATCH 0/2] ssb: improve device disabling Larry Finger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).