2009-08-27 18:56:23

by Gábor Stefanik

[permalink] [raw]
Subject: [PATCH] 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.

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(-)

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)
--
1.6.2.4





2009-08-27 20:41:40

by Gábor Stefanik

[permalink] [raw]
Subject: Re: [PATCH] b43: Implement antenna diversity support for LP-PHY

2009/8/27 Michael Buesch <[email protected]>:
> 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 <[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(-)
>>
>> 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.
>



--
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)

2009-08-27 21:01:36

by Larry Finger

[permalink] [raw]
Subject: Re: [PATCH] b43: Implement antenna diversity support for LP-PHY

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

2009-08-27 20:31:24

by Michael Büsch

[permalink] [raw]
Subject: Re: [PATCH] b43: Implement antenna diversity support for LP-PHY

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 <[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(-)
>
> 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)



--
Greetings, Michael.