diff mbox

b43: Implement antenna diversity support for LP-PHY

Message ID 4A96D6D6.3050201@gmail.com (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Gábor Stefanik Aug. 27, 2009, 6:56 p.m. UTC
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>
---
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(-)

Comments

Michael Buesch Aug. 27, 2009, 8:31 p.m. UTC | #1
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.
> 
> Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
> ---
> 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(-)
> 
> diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
> index 289e06c..3b038c9 100644
> --- a/drivers/net/wireless/b43/main.c
> +++ b/drivers/net/wireless/b43/main.c
> @@ -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);
> diff --git a/drivers/net/wireless/b43/phy_a.c b/drivers/net/wireless/b43/phy_a.c
> index 816e028..809ec97 100644
> --- a/drivers/net/wireless/b43/phy_a.c
> +++ b/drivers/net/wireless/b43/phy_a.c
> @@ -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);
>  
> diff --git a/drivers/net/wireless/b43/phy_common.h b/drivers/net/wireless/b43/phy_common.h
> index b47a0f5..28e3846 100644
> --- a/drivers/net/wireless/b43/phy_common.h
> +++ b/drivers/net/wireless/b43/phy_common.h
> @@ -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,
> diff --git a/drivers/net/wireless/b43/phy_g.c b/drivers/net/wireless/b43/phy_g.c
> index c6c9d2f..c6d639d 100644
> --- a/drivers/net/wireless/b43/phy_g.c
> +++ b/drivers/net/wireless/b43/phy_g.c
> @@ -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);
>  
> diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c
> index 837d952..055c0f7 100644
> --- a/drivers/net/wireless/b43/phy_lp.c
> +++ b/drivers/net/wireless/b43/phy_lp.c
> @@ -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?

> +
> +	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)
Gábor Stefanik Aug. 27, 2009, 8:41 p.m. UTC | #2
2009/8/27 Michael Buesch <mb@bu3sch.de>:
> 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.
>>
>> Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
>> ---
>> 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(-)
>>
>> diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
>> index 289e06c..3b038c9 100644
>> --- a/drivers/net/wireless/b43/main.c
>> +++ b/drivers/net/wireless/b43/main.c
>> @@ -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);
>> diff --git a/drivers/net/wireless/b43/phy_a.c b/drivers/net/wireless/b43/phy_a.c
>> index 816e028..809ec97 100644
>> --- a/drivers/net/wireless/b43/phy_a.c
>> +++ b/drivers/net/wireless/b43/phy_a.c
>> @@ -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);
>>
>> diff --git a/drivers/net/wireless/b43/phy_common.h b/drivers/net/wireless/b43/phy_common.h
>> index b47a0f5..28e3846 100644
>> --- a/drivers/net/wireless/b43/phy_common.h
>> +++ b/drivers/net/wireless/b43/phy_common.h
>> @@ -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,
>> diff --git a/drivers/net/wireless/b43/phy_g.c b/drivers/net/wireless/b43/phy_g.c
>> index c6c9d2f..c6d639d 100644
>> --- a/drivers/net/wireless/b43/phy_g.c
>> +++ b/drivers/net/wireless/b43/phy_g.c
>> @@ -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);
>>
>> diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c
>> index 837d952..055c0f7 100644
>> --- a/drivers/net/wireless/b43/phy_lp.c
>> +++ b/drivers/net/wireless/b43/phy_lp.c
>> @@ -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?

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

>
>> +
>> +     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.
>
Larry Finger Aug. 27, 2009, 9:01 p.m. UTC | #3
Gábor Stefanik wrote:
> 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)

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
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 289e06c..3b038c9 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -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);
diff --git a/drivers/net/wireless/b43/phy_a.c b/drivers/net/wireless/b43/phy_a.c
index 816e028..809ec97 100644
--- a/drivers/net/wireless/b43/phy_a.c
+++ b/drivers/net/wireless/b43/phy_a.c
@@ -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);
 
diff --git a/drivers/net/wireless/b43/phy_common.h b/drivers/net/wireless/b43/phy_common.h
index b47a0f5..28e3846 100644
--- a/drivers/net/wireless/b43/phy_common.h
+++ b/drivers/net/wireless/b43/phy_common.h
@@ -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,
diff --git a/drivers/net/wireless/b43/phy_g.c b/drivers/net/wireless/b43/phy_g.c
index c6c9d2f..c6d639d 100644
--- a/drivers/net/wireless/b43/phy_g.c
+++ b/drivers/net/wireless/b43/phy_g.c
@@ -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);
 
diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c
index 837d952..055c0f7 100644
--- a/drivers/net/wireless/b43/phy_lp.c
+++ b/drivers/net/wireless/b43/phy_lp.c
@@ -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)