b43: Implement antenna diversity support for LP-PHY
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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
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_phyctlchange is a fix for a potential existing bug that this patch may otherwise trigger.Signed-off-by Gábor Stefanik <[email protected]>---
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@@ -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@@ -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@@ -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@@ -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
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.
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_phyctlchange is a fix for a potential existing bug that this patch may otherwise trigger.Signed-off-by Gábor Stefanik <[email protected]>---
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@@ -1456,7 +1456,8 @@ static u16 b43_antenna_to_phyctl(int antenna) return B43_TXH_PHY_ANT2;case
B43_ANTENNA3:
returnB43_TXH_PHY_ANT3;
- caseB43_ANTENNA_AUTO:
+ caseB43_ANTENNA_AUTO0:
+ caseB43_ANTENNA_AUTO1:
returnB43_TXH_PHY_ANT01AUTO;
}
B43_WARN_ON(1);drivers/net/wireless/b43/phy_a.c +1
-1@@ -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@@ -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@@ -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@@ -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
-1static 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. :-)
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