diff mbox

b43: LP-PHY: Initialize TX power control

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

Commit Message

Gábor Stefanik Aug. 12, 2009, 8:42 p.m. UTC
The HW TX power control init still needs work.
The SW init is complete according to the specs.

Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
---
This depends on both the rev0/1 RC calibration patch and the
V4 dummy transmission patch I submitted earlier.

Larry, please check the SPEC TODO/SPEC FIXME comments.

 drivers/net/wireless/b43/phy_lp.c |  104 ++++++++++++++++++++++++++++++++++---
 drivers/net/wireless/b43/phy_lp.h |    5 ++
 2 files changed, 102 insertions(+), 7 deletions(-)

Comments

Michael Buesch Aug. 13, 2009, 1:15 p.m. UTC | #1
On Wednesday 12 August 2009 22:42:40 Gábor Stefanik wrote:
> The HW TX power control init still needs work.
> The SW init is complete according to the specs.

HW PCTL needs a serious amount of work in the common code, too.
For now I would focus to SW PCTL and fix HW PCTL later.

> 
> Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
> ---
> This depends on both the rev0/1 RC calibration patch and the
> V4 dummy transmission patch I submitted earlier.
> 
> Larry, please check the SPEC TODO/SPEC FIXME comments.
> 
>  drivers/net/wireless/b43/phy_lp.c |  104 ++++++++++++++++++++++++++++++++++---
>  drivers/net/wireless/b43/phy_lp.h |    5 ++
>  2 files changed, 102 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c
> index e05981b..6ebaeb2 100644
> --- a/drivers/net/wireless/b43/phy_lp.c
> +++ b/drivers/net/wireless/b43/phy_lp.c
> @@ -1258,18 +1258,108 @@ static void lpphy_calibration(struct b43_wldev *dev)
>  	b43_mac_enable(dev);
>  }
>  
> +static void lpphy_set_tssi_mux(struct b43_wldev *dev, enum tssi_mux_mode mode)
> +{
> +	if (mode != TSSI_MUX_EXT) {
> +		b43_radio_set(dev, B2063_PA_SP1, 0x2);
> +		b43_phy_set(dev, B43_PHY_OFDM(0xF3), 0x1000);
> +		b43_radio_write(dev, B2063_PA_CTL10, 0x51);
> +		if (mode == TSSI_MUX_POSTPA) {
> +			b43_radio_mask(dev, B2063_PA_SP1, 0xFFFE);
> +			b43_phy_mask(dev, B43_LPPHY_AFE_CTL_OVRVAL, 0xFFC7);
> +		} else {
> +			b43_radio_maskset(dev, B2063_PA_SP1, 0xFFFE, 0x1);
> +			b43_phy_maskset(dev, B43_LPPHY_AFE_CTL_OVRVAL,
> +					0xFFC7, 0x20);
> +		}
> +	} else {
> +		//SPEC TODO
> +	}
> +}
> +
> +static void lpphy_tx_pctl_init_hw(struct b43_wldev *dev)
> +{
> +	u16 tmp;
> +	int i;
> +
> +	//SPEC TODO Call LP PHY Clear TX Power offsets
> +	for (i = 0; i < 64; i++) {
> +		if (dev->phy.rev >= 2)
> +			b43_lptab_write(dev, B43_LPTAB32(7, i+1), i);
                                                            ^^^
Please keep in mind to use spaces all the time. It is our coding style and I think
we should stick with it.

> +	tmp = b43_phy_read(dev, B43_LPPHY_TX_PWR_CTL_STAT);
> +	if (tmp & 0x8000)
> +		b43_phy_maskset(dev, B43_LPPHY_TX_PWR_CTL_IDLETSSI,
> +				0xFFC0, (tmp & 0xFF) - 32);

Curly brackets for multiline indents, please.
Gábor Stefanik Aug. 13, 2009, 2:12 p.m. UTC | #2
2009/8/13 Michael Buesch <mb@bu3sch.de>:
> On Wednesday 12 August 2009 22:42:40 Gábor Stefanik wrote:
>> The HW TX power control init still needs work.
>> The SW init is complete according to the specs.
>
> HW PCTL needs a serious amount of work in the common code, too.
> For now I would focus to SW PCTL and fix HW PCTL later.
>
>>
>> Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
>> ---
>> This depends on both the rev0/1 RC calibration patch and the
>> V4 dummy transmission patch I submitted earlier.
>>
>> Larry, please check the SPEC TODO/SPEC FIXME comments.
>>
>>  drivers/net/wireless/b43/phy_lp.c |  104 ++++++++++++++++++++++++++++++++++---
>>  drivers/net/wireless/b43/phy_lp.h |    5 ++
>>  2 files changed, 102 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c
>> index e05981b..6ebaeb2 100644
>> --- a/drivers/net/wireless/b43/phy_lp.c
>> +++ b/drivers/net/wireless/b43/phy_lp.c
>> @@ -1258,18 +1258,108 @@ static void lpphy_calibration(struct b43_wldev *dev)
>>       b43_mac_enable(dev);
>>  }
>>
>> +static void lpphy_set_tssi_mux(struct b43_wldev *dev, enum tssi_mux_mode mode)
>> +{
>> +     if (mode != TSSI_MUX_EXT) {
>> +             b43_radio_set(dev, B2063_PA_SP1, 0x2);
>> +             b43_phy_set(dev, B43_PHY_OFDM(0xF3), 0x1000);
>> +             b43_radio_write(dev, B2063_PA_CTL10, 0x51);
>> +             if (mode == TSSI_MUX_POSTPA) {
>> +                     b43_radio_mask(dev, B2063_PA_SP1, 0xFFFE);
>> +                     b43_phy_mask(dev, B43_LPPHY_AFE_CTL_OVRVAL, 0xFFC7);
>> +             } else {
>> +                     b43_radio_maskset(dev, B2063_PA_SP1, 0xFFFE, 0x1);
>> +                     b43_phy_maskset(dev, B43_LPPHY_AFE_CTL_OVRVAL,
>> +                                     0xFFC7, 0x20);
>> +             }
>> +     } else {
>> +             //SPEC TODO
>> +     }
>> +}
>> +
>> +static void lpphy_tx_pctl_init_hw(struct b43_wldev *dev)
>> +{
>> +     u16 tmp;
>> +     int i;
>> +
>> +     //SPEC TODO Call LP PHY Clear TX Power offsets
>> +     for (i = 0; i < 64; i++) {
>> +             if (dev->phy.rev >= 2)
>> +                     b43_lptab_write(dev, B43_LPTAB32(7, i+1), i);
>                                                            ^^^
> Please keep in mind to use spaces all the time. It is our coding style and I think
> we should stick with it.

Will do.

>
>> +     tmp = b43_phy_read(dev, B43_LPPHY_TX_PWR_CTL_STAT);
>> +     if (tmp & 0x8000)
>> +             b43_phy_maskset(dev, B43_LPPHY_TX_PWR_CTL_IDLETSSI,
>> +                             0xFFC0, (tmp & 0xFF) - 32);
>
> Curly brackets for multiline indents, please.

Will do.
V2 will also be updated for the dummy transmission change.

>
>
> --
> Greetings, Michael.
>
diff mbox

Patch

diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c
index e05981b..6ebaeb2 100644
--- a/drivers/net/wireless/b43/phy_lp.c
+++ b/drivers/net/wireless/b43/phy_lp.c
@@ -1258,18 +1258,108 @@  static void lpphy_calibration(struct b43_wldev *dev)
 	b43_mac_enable(dev);
 }
 
+static void lpphy_set_tssi_mux(struct b43_wldev *dev, enum tssi_mux_mode mode)
+{
+	if (mode != TSSI_MUX_EXT) {
+		b43_radio_set(dev, B2063_PA_SP1, 0x2);
+		b43_phy_set(dev, B43_PHY_OFDM(0xF3), 0x1000);
+		b43_radio_write(dev, B2063_PA_CTL10, 0x51);
+		if (mode == TSSI_MUX_POSTPA) {
+			b43_radio_mask(dev, B2063_PA_SP1, 0xFFFE);
+			b43_phy_mask(dev, B43_LPPHY_AFE_CTL_OVRVAL, 0xFFC7);
+		} else {
+			b43_radio_maskset(dev, B2063_PA_SP1, 0xFFFE, 0x1);
+			b43_phy_maskset(dev, B43_LPPHY_AFE_CTL_OVRVAL,
+					0xFFC7, 0x20);
+		}
+	} else {
+		//SPEC TODO
+	}
+}
+
+static void lpphy_tx_pctl_init_hw(struct b43_wldev *dev)
+{
+	u16 tmp;
+	int i;
+
+	//SPEC TODO Call LP PHY Clear TX Power offsets
+	for (i = 0; i < 64; i++) {
+		if (dev->phy.rev >= 2)
+			b43_lptab_write(dev, B43_LPTAB32(7, i+1), i);
+		else
+			b43_lptab_write(dev, B43_LPTAB32(10, i+1), i);
+	}
+
+	b43_phy_maskset(dev, B43_LPPHY_TX_PWR_CTL_NNUM, 0xFF00, 0xFF);
+	b43_phy_maskset(dev, B43_LPPHY_TX_PWR_CTL_NNUM, 0x8FFF, 0x5000);
+	b43_phy_maskset(dev, B43_LPPHY_TX_PWR_CTL_IDLETSSI, 0xFFC0, 0x1F);
+	if (dev->phy.rev < 2) {
+		b43_phy_mask(dev, B43_LPPHY_LP_PHY_CTL, 0xEFFF);
+		b43_phy_maskset(dev, B43_LPPHY_LP_PHY_CTL, 0xDFFF, 0x2000);
+	} else {
+		b43_phy_mask(dev, B43_PHY_OFDM(0x103), 0xFFFE);
+		b43_phy_maskset(dev, B43_PHY_OFDM(0x103), 0xFFFB, 0x4);
+		b43_phy_maskset(dev, B43_PHY_OFDM(0x103), 0xFFEF, 0x10);
+		b43_radio_maskset(dev, B2063_IQ_CALIB_CTL2, 0xF3, 0x1);
+		lpphy_set_tssi_mux(dev, TSSI_MUX_POSTPA);
+	}
+	b43_phy_maskset(dev, B43_LPPHY_TX_PWR_CTL_IDLETSSI, 0x7FFF, 0x8000);
+	b43_phy_mask(dev, B43_LPPHY_TX_PWR_CTL_DELTAPWR_LIMIT, 0xFF);
+	b43_phy_write(dev, B43_LPPHY_TX_PWR_CTL_DELTAPWR_LIMIT, 0xA);
+	b43_phy_maskset(dev, B43_LPPHY_TX_PWR_CTL_CMD,
+			(u16)~B43_LPPHY_TX_PWR_CTL_CMD_MODE,
+			B43_LPPHY_TX_PWR_CTL_CMD_MODE_OFF);
+	b43_phy_mask(dev, B43_LPPHY_TX_PWR_CTL_NNUM, 0xF8FF);
+	b43_phy_maskset(dev, B43_LPPHY_TX_PWR_CTL_CMD,
+			(u16)~B43_LPPHY_TX_PWR_CTL_CMD_MODE,
+			B43_LPPHY_TX_PWR_CTL_CMD_MODE_SW);
+
+	if (dev->phy.rev < 2) {
+		b43_phy_maskset(dev, B43_LPPHY_RF_OVERRIDE_0, 0xEFFF, 0x1000);
+		b43_phy_mask(dev, B43_LPPHY_RF_OVERRIDE_VAL_0, 0xEFFF);
+	} else {
+		lpphy_set_tx_power_by_index(dev, 0x7F);
+	}
+
+	b43_dummy_transmission_v4(dev, true, true);
+
+	tmp = b43_phy_read(dev, B43_LPPHY_TX_PWR_CTL_STAT);
+	if (tmp & 0x8000)
+		b43_phy_maskset(dev, B43_LPPHY_TX_PWR_CTL_IDLETSSI,
+				0xFFC0, (tmp & 0xFF) - 32);
+
+	b43_phy_mask(dev, B43_LPPHY_RF_OVERRIDE_0, 0xEFFF);
+
+	// (SPEC?) TODO Set "Target TX frequency" variable to 0
+	// SPEC FIXME "Set BB Multiplier to 0xE000" impossible - bb_mult is u8!
+}
+
+static void lpphy_tx_pctl_init_sw(struct b43_wldev *dev)
+{
+	struct lpphy_tx_gains gains;
+
+	if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
+		gains.gm = 4;
+		gains.pad = 12;
+		gains.pga = 12;
+		gains.dac = 0;
+	} else {
+		gains.gm = 7;
+		gains.pad = 14;
+		gains.pga = 15;
+		gains.dac = 0;
+	}
+	lpphy_set_tx_gains(dev, gains);
+	lpphy_set_bb_mult(dev, 150);
+}
+
 /* Initialize TX power control */
 static void lpphy_tx_pctl_init(struct b43_wldev *dev)
 {
 	if (0/*FIXME HWPCTL capable */) {
-		//TODO
+		lpphy_tx_pctl_init_hw(dev);
 	} else { /* This device is only software TX power control capable. */
-		if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
-			//TODO
-		} else {
-			//TODO
-		}
-		//TODO set BB multiplier to 0x0096
+		lpphy_tx_pctl_init_sw(dev);
 	}
 }
 
diff --git a/drivers/net/wireless/b43/phy_lp.h b/drivers/net/wireless/b43/phy_lp.h
index 0461d5b..4eab760 100644
--- a/drivers/net/wireless/b43/phy_lp.h
+++ b/drivers/net/wireless/b43/phy_lp.h
@@ -886,6 +886,11 @@  struct b43_phy_lp {
 	u16 dig_flt_state[9];
 };
 
+enum tssi_mux_mode {
+	TSSI_MUX_PREPA,
+	TSSI_MUX_POSTPA,
+	TSSI_MUX_EXT,
+};
 
 struct b43_phy_operations;
 extern const struct b43_phy_operations b43_phyops_lp;