b43: Implement antenna diversity support for LP-PHY
Gábor Stefanik [Thu, 27 Aug 2009 20:49:49 +0000 (22:49 +0200)]
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.

Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

drivers/net/wireless/b43/main.c
drivers/net/wireless/b43/phy_a.c
drivers/net/wireless/b43/phy_common.h
drivers/net/wireless/b43/phy_g.c
drivers/net/wireless/b43/phy_lp.c

index f5bdf1c..0f16844 100644 (file)
@@ -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);
index 816e028..809ec97 100644 (file)
@@ -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);
 
index b47a0f5..28e3846 100644 (file)
@@ -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,
index e471312..bdff9af 100644 (file)
@@ -2664,7 +2664,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);
 
index 7d2a702..1ab00b0 100644 (file)
@@ -2205,7 +2205,14 @@ 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
+       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)