Skip to contentSkip to conversation

b43: Implement antenna diversity support for LP-PHY

PATCH Superseded Gábor Stefanik 3 participants 4 messages Aug 27, 2009 Networking drivers (wireless)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 b43: Implement antenna diversity support for LP-PHY

The A/G-PHY changes are fallout fixes from the enum change, which in turn allows the LP-PHY code to be much simpler. The antenna_to_phyctl change is a fix for a potential existing bug that this patch may otherwise trigger.

---
Note that according to recent spec changes, the A/G-PHY antenna diversity routines also need to be updated. However, I'm not lumping those changes into this patch (this is for LP-PHY).

drivers/net/wireless/b43/main.c       |    3 ++-
drivers/net/wireless/b43/phy_a.c      |    2 +-
drivers/net/wireless/b43/phy_common.h |   10 +++++-----
drivers/net/wireless/b43/phy_g.c      |    2 +-
drivers/net/wireless/b43/phy_lp.c     |   11 ++++++++++-
5 files changed, 19 insertions(+), 9 deletions(-)
drivers/net/wireless/b43/main.c +0 -0
index 289e06c..3b038c9 100644
@@ -1456,7 +1456,8 @@ static u16 b43_antenna_to_phyctl(int antenna)
		return B43_TXH_PHY_ANT2;
	case B43_ANTENNA3:
		return B43_TXH_PHY_ANT3;
-	case B43_ANTENNA_AUTO:
+	case B43_ANTENNA_AUTO0:
+	case B43_ANTENNA_AUTO1:
		return B43_TXH_PHY_ANT01AUTO;
	}
	B43_WARN_ON(1);
drivers/net/wireless/b43/phy_a.c +0 -0
index 816e028..809ec97 100644
@@ -531,7 +531,7 @@ static void b43_aphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna)
 
	tmp = b43_phy_read(dev, B43_PHY_BBANDCFG);
	tmp &= ~B43_PHY_BBANDCFG_RXANT;
-	tmp |= (autodiv ? B43_ANTENNA_AUTO0 : antenna)
+	tmp |= (autodiv ? B43_ANTENNA_AUTO1 : antenna)
	    << B43_PHY_BBANDCFG_RXANT_SHIFT;
	b43_phy_write(dev, B43_PHY_BBANDCFG, tmp);
drivers/net/wireless/b43/phy_common.h +0 -0
index b47a0f5..28e3846 100644
@@ -49,11 +49,11 @@ enum b43_interference_mitigation {
 

/* Antenna identifiers */
enum {
- B43_ANTENNA0, /* Antenna 0 */
- B43_ANTENNA1, /* Antenna 0 */
- B43_ANTENNA_AUTO1, /* Automatic, starting with antenna 1 */
- B43_ANTENNA_AUTO0, /* Automatic, starting with antenna 0 */
- B43_ANTENNA2,
+ B43_ANTENNA0 = 0, /* Antenna 0 */
+ B43_ANTENNA1 = 1, /* Antenna 1 */
+ B43_ANTENNA_AUTO0 = 2, /* Automatic, starting with antenna 0 */
+ B43_ANTENNA_AUTO1 = 3, /* Automatic, starting with antenna 1 */
+ B43_ANTENNA2 = 4,

	B43_ANTENNA3 = 8,

	B43_ANTENNA_AUTO = B43_ANTENNA_AUTO0,
drivers/net/wireless/b43/phy_g.c +0 -0
index c6c9d2f..c6d639d 100644
@@ -2651,7 +2651,7 @@ static void b43_gphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna)
 
	tmp = b43_phy_read(dev, B43_PHY_BBANDCFG);
	tmp &= ~B43_PHY_BBANDCFG_RXANT;
-	tmp |= (autodiv ? B43_ANTENNA_AUTO0 : antenna)
+	tmp |= (autodiv ? B43_ANTENNA_AUTO1 : antenna)
			<< B43_PHY_BBANDCFG_RXANT_SHIFT;
	b43_phy_write(dev, B43_PHY_BBANDCFG, tmp);
drivers/net/wireless/b43/phy_lp.c +0 -0
index 837d952..055c0f7 100644
@@ -2204,7 +2204,16 @@ static int b43_lpphy_op_init(struct b43_wldev *dev)
 

static void b43_lpphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna) {
- //TODO
+ int autodiv = ;
+
+ if (dev->phy.rev >= 2)
+ return; // rev2+ doesn't support antenna diversity
+
+ if (B43_WARN_ON(antenna > B43_ANTENNA_AUTO1))
+ return;
+
+ b43_phy_maskset(dev, B43_LPPHY_CRSGAIN_CTL, 0xFFFD, antenna & 0x2);
+ b43_phy_maskset(dev, B43_LPPHY_CRSGAIN_CTL, 0xFFFE, antenna & 0x1);
}

static void b43_lpphy_op_adjust_txpower(struct b43_wldev *dev)

Signature · 1 line
1.6.2.4
#1 lore raw
Quoted 85 lines · On Thursday 27 August 2009 20:56:22 Gábor Stefanik wrote:

The A/G-PHY changes are fallout fixes from the enum change, which in turn allows the LP-PHY code to be much simpler. The antenna_to_phyctl change is a fix for a potential existing bug that this patch may otherwise trigger.

---
Note that according to recent spec changes, the A/G-PHY antenna diversity routines also need to be updated. However, I'm not lumping those changes into this patch (this is for LP-PHY).

 drivers/net/wireless/b43/main.c       |    3 ++-
 drivers/net/wireless/b43/phy_a.c      |    2 +-
 drivers/net/wireless/b43/phy_common.h |   10 +++++-----
 drivers/net/wireless/b43/phy_g.c      |    2 +-
 drivers/net/wireless/b43/phy_lp.c     |   11 ++++++++++-
 5 files changed, 19 insertions(+), 9 deletions(-)
drivers/net/wireless/b43/main.c +2 -1
index 289e06c..3b038c9 100644
@@ -1456,7 +1456,8 @@ static u16 b43_antenna_to_phyctl(int antenna)
 		return B43_TXH_PHY_ANT2;
 	case B43_ANTENNA3:
 		return B43_TXH_PHY_ANT3;
-	case B43_ANTENNA_AUTO:
+	case B43_ANTENNA_AUTO0:
+	case B43_ANTENNA_AUTO1:
 		return B43_TXH_PHY_ANT01AUTO;
 	}
 	B43_WARN_ON(1);
drivers/net/wireless/b43/phy_a.c +1 -1
index 816e028..809ec97 100644
@@ -531,7 +531,7 @@ static void b43_aphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna)
 
 	tmp = b43_phy_read(dev, B43_PHY_BBANDCFG);
 	tmp &= ~B43_PHY_BBANDCFG_RXANT;
-	tmp |= (autodiv ? B43_ANTENNA_AUTO0 : antenna)
+	tmp |= (autodiv ? B43_ANTENNA_AUTO1 : antenna)
 	    << B43_PHY_BBANDCFG_RXANT_SHIFT;
 	b43_phy_write(dev, B43_PHY_BBANDCFG, tmp);
 
drivers/net/wireless/b43/phy_common.h +5 -5
index b47a0f5..28e3846 100644
@@ -49,11 +49,11 @@ enum b43_interference_mitigation {
 
 /* Antenna identifiers */
 enum {
-	B43_ANTENNA0,		/* Antenna 0 */
-	B43_ANTENNA1,		/* Antenna 0 */
-	B43_ANTENNA_AUTO1,	/* Automatic, starting with antenna 1 */
-	B43_ANTENNA_AUTO0,	/* Automatic, starting with antenna 0 */
-	B43_ANTENNA2,
+	B43_ANTENNA0 = 0,	/* Antenna 0 */
+	B43_ANTENNA1 = 1,	/* Antenna 1 */
+	B43_ANTENNA_AUTO0 = 2,	/* Automatic, starting with antenna 0 */
+	B43_ANTENNA_AUTO1 = 3,	/* Automatic, starting with antenna 1 */
+	B43_ANTENNA2 = 4,
 	B43_ANTENNA3 = 8,
 
 	B43_ANTENNA_AUTO = B43_ANTENNA_AUTO0,
drivers/net/wireless/b43/phy_g.c +1 -1
index c6c9d2f..c6d639d 100644
@@ -2651,7 +2651,7 @@ static void b43_gphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna)
 
 	tmp = b43_phy_read(dev, B43_PHY_BBANDCFG);
 	tmp &= ~B43_PHY_BBANDCFG_RXANT;
-	tmp |= (autodiv ? B43_ANTENNA_AUTO0 : antenna)
+	tmp |= (autodiv ? B43_ANTENNA_AUTO1 : antenna)
 			<< B43_PHY_BBANDCFG_RXANT_SHIFT;
 	b43_phy_write(dev, B43_PHY_BBANDCFG, tmp);
 
drivers/net/wireless/b43/phy_lp.c +0 -0
index 837d952..055c0f7 100644

drivers/net/wireless/b43/phy_lp.c static int b43_lpphy_op_init(struct b43_wldev *dev) · line 2207

Quoted 5 lines
drivers/net/wireless/b43/phy_lp.c +1 -1
@@ -2204,7 +2204,16 @@ static int b43_lpphy_op_init(struct b43_wldev *dev)
 
 static void b43_lpphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna)
 {
-	//TODO
+	int autodiv = ;

Does this compile?

Quoted 12 lines
drivers/net/wireless/b43/phy_lp.c +9 -0
+
+	if (dev->phy.rev >= 2)
+		return; // rev2+ doesn't support antenna diversity
+
+	if (B43_WARN_ON(antenna > B43_ANTENNA_AUTO1))
+		return;
+
+	b43_phy_maskset(dev, B43_LPPHY_CRSGAIN_CTL, 0xFFFD, antenna & 0x2);
+	b43_phy_maskset(dev, B43_LPPHY_CRSGAIN_CTL, 0xFFFE, antenna & 0x1);
 }
 
 static void b43_lpphy_op_adjust_txpower(struct b43_wldev *dev)
Signature · 1 line
Greetings, Michael.
#2 lore raw

2009/8/27 Michael Buesch <[email protected]>:

Quoted 87 lines · On Thursday 27 August 2009 20:56:22 Gábor Stefanik wrote:
Quoted 86 lines

The A/G-PHY changes are fallout fixes from the enum change, which in turn allows the LP-PHY code to be much simpler. The antenna_to_phyctl change is a fix for a potential existing bug that this patch may otherwise trigger.

---
Note that according to recent spec changes, the A/G-PHY antenna diversity routines also need to be updated. However, I'm not lumping those changes into this patch (this is for LP-PHY).

 drivers/net/wireless/b43/main.c       |    3 ++- drivers/net/wireless/b43/phy_a.c      |    2 +- drivers/net/wireless/b43/phy_common.h |   10 +++++----- drivers/net/wireless/b43/phy_g.c      |    2 +- drivers/net/wireless/b43/phy_lp.c     |   11 ++++++++++-

 5 files changed, 19 insertions(+), 9 deletions(-)
drivers/net/wireless/b43/main.c +0 -0
index 289e06c..3b038c9 100644
@@ -1456,7 +1456,8 @@ static u16 b43_antenna_to_phyctl(int antenna)
               return B43_TXH_PHY_ANT2;

      case B43_ANTENNA3:
              return B43_TXH_PHY_ANT3;
-     case B43_ANTENNA_AUTO:
+     case B43_ANTENNA_AUTO0:
+     case B43_ANTENNA_AUTO1:
              return B43_TXH_PHY_ANT01AUTO;
      }
      B43_WARN_ON(1);

drivers/net/wireless/b43/phy_a.c +1 -1
index 816e028..809ec97 100644
@@ -531,7 +531,7 @@ static void b43_aphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna)
 
       tmp = b43_phy_read(dev, B43_PHY_BBANDCFG);
       tmp &= ~B43_PHY_BBANDCFG_RXANT;
-     tmp |= (autodiv ? B43_ANTENNA_AUTO0 : antenna)
+     tmp |= (autodiv ? B43_ANTENNA_AUTO1 : antenna)
           << B43_PHY_BBANDCFG_RXANT_SHIFT;
       b43_phy_write(dev, B43_PHY_BBANDCFG, tmp);
 
drivers/net/wireless/b43/phy_common.h +5 -5
index b47a0f5..28e3846 100644
@@ -49,11 +49,11 @@ enum b43_interference_mitigation {
 
  /* Antenna identifiers */
  enum {
-     B43_ANTENNA0,           /* Antenna 0 */
-     B43_ANTENNA1,           /* Antenna 0 */
-     B43_ANTENNA_AUTO1,      /* Automatic, starting with antenna 1 */
-     B43_ANTENNA_AUTO0,      /* Automatic, starting with antenna 0 */
-     B43_ANTENNA2,
+     B43_ANTENNA0 = 0,       /* Antenna 0 */
+     B43_ANTENNA1 = 1,       /* Antenna 1 */
+     B43_ANTENNA_AUTO0 = 2,  /* Automatic, starting with antenna 0 */
+     B43_ANTENNA_AUTO1 = 3,  /* Automatic, starting with antenna 1 */
+     B43_ANTENNA2 = 4,
       B43_ANTENNA3 = 8,
 
       B43_ANTENNA_AUTO = B43_ANTENNA_AUTO0,
drivers/net/wireless/b43/phy_g.c +1 -1
index c6c9d2f..c6d639d 100644
@@ -2651,7 +2651,7 @@ static void b43_gphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna)
 
       tmp = b43_phy_read(dev, B43_PHY_BBANDCFG);
       tmp &= ~B43_PHY_BBANDCFG_RXANT;
-     tmp |= (autodiv ? B43_ANTENNA_AUTO0 : antenna)
+     tmp |= (autodiv ? B43_ANTENNA_AUTO1 : antenna)
                       << B43_PHY_BBANDCFG_RXANT_SHIFT;
       b43_phy_write(dev, B43_PHY_BBANDCFG, tmp);
 
drivers/net/wireless/b43/phy_lp.c +0 -0
index 837d952..055c0f7 100644
@@ -2204,7 +2204,16 @@ static int b43_lpphy_op_init(struct b43_wldev *dev)
 
Quoted 6 lines

drivers/net/wireless/b43/phy_lp.c static int b43_lpphy_op_init(struct b43_wldev *dev) · line 2207

Quoted 4 lines
drivers/net/wireless/b43/phy_lp.c +1 -1
  static void b43_lpphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna)
  {
-     //TODO
+     int autodiv = ;

Does this compile?

That's a typo. Also, the autodiv variable shouldn't be there at all. Will respin.

Quoted 19 lines

drivers/net/wireless/b43/phy_lp.c static int b43_lpphy_op_init(struct b43_wldev *dev) · line 2219

Quoted 13 lines
drivers/net/wireless/b43/phy_lp.c +9 -0
+
+     if (dev->phy.rev >= 2)
+             return; // rev2+ doesn't support antenna diversity
+
+     if (B43_WARN_ON(antenna > B43_ANTENNA_AUTO1))
+             return;
+
+     b43_phy_maskset(dev, B43_LPPHY_CRSGAIN_CTL, 0xFFFD, antenna & 0x2);
+     b43_phy_maskset(dev, B43_LPPHY_CRSGAIN_CTL, 0xFFFE, antenna & 0x1);
  }
 
  static void b43_lpphy_op_adjust_txpower(struct b43_wldev *dev)

--
Greetings, Michael.

Signature · 1 line
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)
#3 lore raw
In reply to Gábor Stefanik
Quoted 15 lines · Gábor Stefanik

static void b43_lpphy_op_set_rx_antenna(struct b43_wldev *dev, int antenna) {

(quoted diff) +10 -1
-    //TODO
+    int autodiv = ;
+
+    if (dev->phy.rev >= 2)
+        return; // rev2+ doesn't support antenna diversity
+
+    if (B43_WARN_ON(antenna > B43_ANTENNA_AUTO1))
+        return;
+
+    b43_phy_maskset(dev, B43_LPPHY_CRSGAIN_CTL, 0xFFFD, antenna & 0x2);
+    b43_phy_maskset(dev, B43_LPPHY_CRSGAIN_CTL, 0xFFFE, antenna & 0x1);

}

Quoted 1 line

static void b43_lpphy_op_adjust_txpower(struct b43_wldev *dev)

I noticed that your code didn't look like the specs, which is why I thought the recent changes had affected this section.

It took me a while to figure it out, but the code above is correct. The part that led to confusion is that the vendor uses 3 to indicate "start with antenna 0", while you use 2 for that state. Even if we get it wrong later, it shouldn't matter.

Larry