Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6fc28a1 authored by Piotr Haber's avatar Piotr Haber Committed by John W. Linville
Browse files

brcmsmac: support 4313iPA



Add support for 4313 iPA variant.
It is a variant of already supported 4313 ePA
and needs some PHY changes to work properly.

Reviewed-by: default avatarArend Van Spriel <arend@broadcom.com>
Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: default avatarHante Meuleman <meuleman@broadcom.com>
Signed-off-by: default avatarPiotr Haber <phaber@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent b8357634
Loading
Loading
Loading
Loading
+239 −130
Original line number Original line Diff line number Diff line
@@ -1137,8 +1137,9 @@ wlc_lcnphy_set_rx_gain_by_distribution(struct brcms_phy *pi,
	gain0_15 = ((biq1 & 0xf) << 12) |
	gain0_15 = ((biq1 & 0xf) << 12) |
		   ((tia & 0xf) << 8) |
		   ((tia & 0xf) << 8) |
		   ((lna2 & 0x3) << 6) |
		   ((lna2 & 0x3) << 6) |
		   ((lna2 &
		   ((lna2 & 0x3) << 4) |
		     0x3) << 4) | ((lna1 & 0x3) << 2) | ((lna1 & 0x3) << 0);
		   ((lna1 & 0x3) << 2) |
		   ((lna1 & 0x3) << 0);


	mod_phy_reg(pi, 0x4b6, (0xffff << 0), gain0_15 << 0);
	mod_phy_reg(pi, 0x4b6, (0xffff << 0), gain0_15 << 0);
	mod_phy_reg(pi, 0x4b7, (0xf << 0), gain16_19 << 0);
	mod_phy_reg(pi, 0x4b7, (0xf << 0), gain16_19 << 0);
@@ -1156,6 +1157,8 @@ wlc_lcnphy_set_rx_gain_by_distribution(struct brcms_phy *pi,
	}
	}


	mod_phy_reg(pi, 0x44d, (0x1 << 0), (!trsw) << 0);
	mod_phy_reg(pi, 0x44d, (0x1 << 0), (!trsw) << 0);
	mod_phy_reg(pi, 0x4b1, (0x3 << 11), lna1 << 11);
	mod_phy_reg(pi, 0x4e6, (0x3 << 3), lna1 << 3);


}
}


@@ -1328,6 +1331,43 @@ static u32 wlc_lcnphy_measure_digital_power(struct brcms_phy *pi, u16 nsamples)
	return (iq_est.i_pwr + iq_est.q_pwr) / nsamples;
	return (iq_est.i_pwr + iq_est.q_pwr) / nsamples;
}
}


static bool wlc_lcnphy_rx_iq_cal_gain(struct brcms_phy *pi, u16 biq1_gain,
				      u16 tia_gain, u16 lna2_gain)
{
	u32 i_thresh_l, q_thresh_l;
	u32 i_thresh_h, q_thresh_h;
	struct lcnphy_iq_est iq_est_h, iq_est_l;

	wlc_lcnphy_set_rx_gain_by_distribution(pi, 0, 0, 0, biq1_gain, tia_gain,
					       lna2_gain, 0);

	wlc_lcnphy_rx_gain_override_enable(pi, true);
	wlc_lcnphy_start_tx_tone(pi, 2000, (40 >> 1), 0);
	usleep_range(500, 500);
	write_radio_reg(pi, RADIO_2064_REG112, 0);
	if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_l))
		return false;

	wlc_lcnphy_start_tx_tone(pi, 2000, 40, 0);
	usleep_range(500, 500);
	write_radio_reg(pi, RADIO_2064_REG112, 0);
	if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_h))
		return false;

	i_thresh_l = (iq_est_l.i_pwr << 1);
	i_thresh_h = (iq_est_l.i_pwr << 2) + iq_est_l.i_pwr;

	q_thresh_l = (iq_est_l.q_pwr << 1);
	q_thresh_h = (iq_est_l.q_pwr << 2) + iq_est_l.q_pwr;
	if ((iq_est_h.i_pwr > i_thresh_l) &&
	    (iq_est_h.i_pwr < i_thresh_h) &&
	    (iq_est_h.q_pwr > q_thresh_l) &&
	    (iq_est_h.q_pwr < q_thresh_h))
		return true;

	return false;
}

static bool
static bool
wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi,
wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi,
		     const struct lcnphy_rx_iqcomp *iqcomp,
		     const struct lcnphy_rx_iqcomp *iqcomp,
@@ -1342,8 +1382,8 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi,
	    RFOverrideVal0_old, rfoverride2_old, rfoverride2val_old,
	    RFOverrideVal0_old, rfoverride2_old, rfoverride2val_old,
	    rfoverride3_old, rfoverride3val_old, rfoverride4_old,
	    rfoverride3_old, rfoverride3val_old, rfoverride4_old,
	    rfoverride4val_old, afectrlovr_old, afectrlovrval_old;
	    rfoverride4val_old, afectrlovr_old, afectrlovrval_old;
	int tia_gain;
	int tia_gain, lna2_gain, biq1_gain;
	u32 received_power, rx_pwr_threshold;
	bool set_gain;
	u16 old_sslpnCalibClkEnCtrl, old_sslpnRxFeClkEnCtrl;
	u16 old_sslpnCalibClkEnCtrl, old_sslpnRxFeClkEnCtrl;
	u16 values_to_save[11];
	u16 values_to_save[11];
	s16 *ptr;
	s16 *ptr;
@@ -1368,8 +1408,7 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi,
		goto cal_done;
		goto cal_done;
	}
	}


	if (module == 1) {
	WARN_ON(module != 1);

	tx_pwr_ctrl = wlc_lcnphy_get_tx_pwr_ctrl(pi);
	tx_pwr_ctrl = wlc_lcnphy_get_tx_pwr_ctrl(pi);
	wlc_lcnphy_set_tx_pwr_ctrl(pi, LCNPHY_TX_PWR_CTRL_OFF);
	wlc_lcnphy_set_tx_pwr_ctrl(pi, LCNPHY_TX_PWR_CTRL_OFF);


@@ -1432,28 +1471,38 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi,
	mod_phy_reg(pi, 0x43b, (0x1 << 0), 1 << 0);
	mod_phy_reg(pi, 0x43b, (0x1 << 0), 1 << 0);
	mod_phy_reg(pi, 0x43c, (0x1 << 0), 0 << 0);
	mod_phy_reg(pi, 0x43c, (0x1 << 0), 0 << 0);


		wlc_lcnphy_start_tx_tone(pi, 2000, 120, 0);
	write_phy_reg(pi, 0x6da, 0xffff);
	write_phy_reg(pi, 0x6da, 0xffff);
	or_phy_reg(pi, 0x6db, 0x3);
	or_phy_reg(pi, 0x6db, 0x3);

	wlc_lcnphy_set_trsw_override(pi, tx_switch, rx_switch);
	wlc_lcnphy_set_trsw_override(pi, tx_switch, rx_switch);
		wlc_lcnphy_rx_gain_override_enable(pi, true);
	set_gain = false;


		tia_gain = 8;
	lna2_gain = 3;
		rx_pwr_threshold = 950;
	while ((lna2_gain >= 0) && !set_gain) {
		while (tia_gain > 0) {
		tia_gain = 4;
			tia_gain -= 1;
			wlc_lcnphy_set_rx_gain_by_distribution(pi,
							       0, 0, 2, 2,
							       (u16)
							       tia_gain, 1, 0);
			udelay(500);


			received_power =
		while ((tia_gain >= 0) && !set_gain) {
				wlc_lcnphy_measure_digital_power(pi, 2000);
			biq1_gain = 6;
			if (received_power < rx_pwr_threshold)

				break;
			while ((biq1_gain >= 0) && !set_gain) {
				set_gain = wlc_lcnphy_rx_iq_cal_gain(pi,
								     (u16)
								     biq1_gain,
								     (u16)
								     tia_gain,
								     (u16)
								     lna2_gain);
				biq1_gain -= 1;
			}
			tia_gain -= 1;
		}
		}
		result = wlc_lcnphy_calc_rx_iq_comp(pi, 0xffff);
		lna2_gain -= 1;
	}

	if (set_gain)
		result = wlc_lcnphy_calc_rx_iq_comp(pi, 1024);
	else
		result = false;


	wlc_lcnphy_stop_tx_tone(pi);
	wlc_lcnphy_stop_tx_tone(pi);


@@ -1487,7 +1536,6 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi,


	wlc_lcnphy_set_tx_pwr_ctrl(pi, tx_pwr_ctrl);
	wlc_lcnphy_set_tx_pwr_ctrl(pi, tx_pwr_ctrl);
	wlc_lcnphy_rx_gain_override_enable(pi, false);
	wlc_lcnphy_rx_gain_override_enable(pi, false);
	}


cal_done:
cal_done:
	kfree(ptr);
	kfree(ptr);
@@ -1781,6 +1829,17 @@ wlc_lcnphy_radio_2064_channel_tune_4313(struct brcms_phy *pi, u8 channel)
		write_radio_reg(pi, RADIO_2064_REG038, 3);
		write_radio_reg(pi, RADIO_2064_REG038, 3);
		write_radio_reg(pi, RADIO_2064_REG091, 7);
		write_radio_reg(pi, RADIO_2064_REG091, 7);
	}
	}

	if (!(pi->sh->boardflags & BFL_FEM)) {
		u8 reg038[14] = {0xd, 0xe, 0xd, 0xd, 0xd, 0xc,
			0xa, 0xb, 0xb, 0x3, 0x3, 0x2, 0x0, 0x0};

		write_radio_reg(pi, RADIO_2064_REG02A, 0xf);
		write_radio_reg(pi, RADIO_2064_REG091, 0x3);
		write_radio_reg(pi, RADIO_2064_REG038, 0x3);

		write_radio_reg(pi, RADIO_2064_REG038, reg038[channel - 1]);
	}
}
}


static int
static int
@@ -1975,6 +2034,16 @@ wlc_lcnphy_set_tssi_mux(struct brcms_phy *pi, enum lcnphy_tssi_mode pos)
		} else {
		} else {
			mod_radio_reg(pi, RADIO_2064_REG03A, 1, 0x1);
			mod_radio_reg(pi, RADIO_2064_REG03A, 1, 0x1);
			mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 0x8);
			mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 0x8);
			mod_radio_reg(pi, RADIO_2064_REG028, 0x1, 0x0);
			mod_radio_reg(pi, RADIO_2064_REG11A, 0x4, 1<<2);
			mod_radio_reg(pi, RADIO_2064_REG036, 0x10, 0x0);
			mod_radio_reg(pi, RADIO_2064_REG11A, 0x10, 1<<4);
			mod_radio_reg(pi, RADIO_2064_REG036, 0x3, 0x0);
			mod_radio_reg(pi, RADIO_2064_REG035, 0xff, 0x77);
			mod_radio_reg(pi, RADIO_2064_REG028, 0x1e, 0xe<<1);
			mod_radio_reg(pi, RADIO_2064_REG112, 0x80, 1<<7);
			mod_radio_reg(pi, RADIO_2064_REG005, 0x7, 1<<1);
			mod_radio_reg(pi, RADIO_2064_REG029, 0xf0, 0<<4);
		}
		}
	} else {
	} else {
		mod_phy_reg(pi, 0x4d9, (0x1 << 2), (0x1) << 2);
		mod_phy_reg(pi, 0x4d9, (0x1 << 2), (0x1) << 2);
@@ -2061,12 +2130,14 @@ static void wlc_lcnphy_pwrctrl_rssiparams(struct brcms_phy *pi)
		    (auxpga_vmid_temp << 0) | (auxpga_gain_temp << 12));
		    (auxpga_vmid_temp << 0) | (auxpga_gain_temp << 12));


	mod_radio_reg(pi, RADIO_2064_REG082, (1 << 5), (1 << 5));
	mod_radio_reg(pi, RADIO_2064_REG082, (1 << 5), (1 << 5));
	mod_radio_reg(pi, RADIO_2064_REG07C, (1 << 0), (1 << 0));
}
}


static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi)
static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi)
{
{
	struct phytbl_info tab;
	struct phytbl_info tab;
	u32 rfseq, ind;
	u32 rfseq, ind;
	u8 tssi_sel;


	tab.tbl_id = LCNPHY_TBL_ID_TXPWRCTL;
	tab.tbl_id = LCNPHY_TBL_ID_TXPWRCTL;
	tab.tbl_width = 32;
	tab.tbl_width = 32;
@@ -2088,7 +2159,13 @@ static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi)


	mod_phy_reg(pi, 0x503, (0x1 << 4), (1) << 4);
	mod_phy_reg(pi, 0x503, (0x1 << 4), (1) << 4);


	if (pi->sh->boardflags & BFL_FEM) {
		tssi_sel = 0x1;
		wlc_lcnphy_set_tssi_mux(pi, LCNPHY_TSSI_EXT);
		wlc_lcnphy_set_tssi_mux(pi, LCNPHY_TSSI_EXT);
	} else {
		tssi_sel = 0xe;
		wlc_lcnphy_set_tssi_mux(pi, LCNPHY_TSSI_POST_PA);
	}
	mod_phy_reg(pi, 0x4a4, (0x1 << 14), (0) << 14);
	mod_phy_reg(pi, 0x4a4, (0x1 << 14), (0) << 14);


	mod_phy_reg(pi, 0x4a4, (0x1 << 15), (1) << 15);
	mod_phy_reg(pi, 0x4a4, (0x1 << 15), (1) << 15);
@@ -2124,9 +2201,10 @@ static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi)
	mod_phy_reg(pi, 0x49a, (0x1ff << 0), (0xff) << 0);
	mod_phy_reg(pi, 0x49a, (0x1ff << 0), (0xff) << 0);


	if (LCNREV_IS(pi->pubpi.phy_rev, 2)) {
	if (LCNREV_IS(pi->pubpi.phy_rev, 2)) {
		mod_radio_reg(pi, RADIO_2064_REG028, 0xf, 0xe);
		mod_radio_reg(pi, RADIO_2064_REG028, 0xf, tssi_sel);
		mod_radio_reg(pi, RADIO_2064_REG086, 0x4, 0x4);
		mod_radio_reg(pi, RADIO_2064_REG086, 0x4, 0x4);
	} else {
	} else {
		mod_radio_reg(pi, RADIO_2064_REG028, 0x1e, tssi_sel << 1);
		mod_radio_reg(pi, RADIO_2064_REG03A, 0x1, 1);
		mod_radio_reg(pi, RADIO_2064_REG03A, 0x1, 1);
		mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 1 << 3);
		mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 1 << 3);
	}
	}
@@ -2173,6 +2251,10 @@ static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi)


	mod_phy_reg(pi, 0x4d7, (0xf << 8), (0) << 8);
	mod_phy_reg(pi, 0x4d7, (0xf << 8), (0) << 8);


	mod_radio_reg(pi, RADIO_2064_REG035, 0xff, 0x0);
	mod_radio_reg(pi, RADIO_2064_REG036, 0x3, 0x0);
	mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 0x8);

	wlc_lcnphy_pwrctrl_rssiparams(pi);
	wlc_lcnphy_pwrctrl_rssiparams(pi);
}
}


@@ -2791,6 +2873,8 @@ static void wlc_lcnphy_idle_tssi_est(struct brcms_phy_pub *ppi)
		read_radio_reg(pi, RADIO_2064_REG007) & 1;
		read_radio_reg(pi, RADIO_2064_REG007) & 1;
	u16 SAVE_jtag_auxpga = read_radio_reg(pi, RADIO_2064_REG0FF) & 0x10;
	u16 SAVE_jtag_auxpga = read_radio_reg(pi, RADIO_2064_REG0FF) & 0x10;
	u16 SAVE_iqadc_aux_en = read_radio_reg(pi, RADIO_2064_REG11F) & 4;
	u16 SAVE_iqadc_aux_en = read_radio_reg(pi, RADIO_2064_REG11F) & 4;
	u8 SAVE_bbmult = wlc_lcnphy_get_bbmult(pi);

	idleTssi = read_phy_reg(pi, 0x4ab);
	idleTssi = read_phy_reg(pi, 0x4ab);
	suspend = (0 == (bcma_read32(pi->d11core, D11REGOFFS(maccontrol)) &
	suspend = (0 == (bcma_read32(pi->d11core, D11REGOFFS(maccontrol)) &
			 MCTL_EN_MAC));
			 MCTL_EN_MAC));
@@ -2808,6 +2892,12 @@ static void wlc_lcnphy_idle_tssi_est(struct brcms_phy_pub *ppi)
	mod_radio_reg(pi, RADIO_2064_REG0FF, 0x10, 1 << 4);
	mod_radio_reg(pi, RADIO_2064_REG0FF, 0x10, 1 << 4);
	mod_radio_reg(pi, RADIO_2064_REG11F, 0x4, 1 << 2);
	mod_radio_reg(pi, RADIO_2064_REG11F, 0x4, 1 << 2);
	wlc_lcnphy_tssi_setup(pi);
	wlc_lcnphy_tssi_setup(pi);

	mod_phy_reg(pi, 0x4d7, (0x1 << 0), (1 << 0));
	mod_phy_reg(pi, 0x4d7, (0x1 << 6), (1 << 6));

	wlc_lcnphy_set_bbmult(pi, 0x0);

	wlc_phy_do_dummy_tx(pi, true, OFF);
	wlc_phy_do_dummy_tx(pi, true, OFF);
	idleTssi = ((read_phy_reg(pi, 0x4ab) & (0x1ff << 0))
	idleTssi = ((read_phy_reg(pi, 0x4ab) & (0x1ff << 0))
		    >> 0);
		    >> 0);
@@ -2829,6 +2919,7 @@ static void wlc_lcnphy_idle_tssi_est(struct brcms_phy_pub *ppi)


	mod_phy_reg(pi, 0x44c, (0x1 << 12), (0) << 12);
	mod_phy_reg(pi, 0x44c, (0x1 << 12), (0) << 12);


	wlc_lcnphy_set_bbmult(pi, SAVE_bbmult);
	wlc_lcnphy_set_tx_gain_override(pi, tx_gain_override_old);
	wlc_lcnphy_set_tx_gain_override(pi, tx_gain_override_old);
	wlc_lcnphy_set_tx_gain(pi, &old_gains);
	wlc_lcnphy_set_tx_gain(pi, &old_gains);
	wlc_lcnphy_set_tx_pwr_ctrl(pi, SAVE_txpwrctrl);
	wlc_lcnphy_set_tx_pwr_ctrl(pi, SAVE_txpwrctrl);
@@ -3042,6 +3133,11 @@ static void wlc_lcnphy_tx_pwr_ctrl_init(struct brcms_phy_pub *ppi)
			wlc_lcnphy_write_table(pi, &tab);
			wlc_lcnphy_write_table(pi, &tab);
			tab.tbl_offset++;
			tab.tbl_offset++;
		}
		}
		mod_phy_reg(pi, 0x4d0, (0x1 << 0), (0) << 0);
		mod_phy_reg(pi, 0x4d3, (0xff << 0), (0) << 0);
		mod_phy_reg(pi, 0x4d3, (0xff << 8), (0) << 8);
		mod_phy_reg(pi, 0x4d0, (0x1 << 4), (0) << 4);
		mod_phy_reg(pi, 0x4d0, (0x1 << 2), (0) << 2);


		mod_phy_reg(pi, 0x410, (0x1 << 7), (0) << 7);
		mod_phy_reg(pi, 0x410, (0x1 << 7), (0) << 7);


@@ -3843,7 +3939,6 @@ static void wlc_lcnphy_txpwrtbl_iqlo_cal(struct brcms_phy *pi)
	target_gains.pad_gain = 21;
	target_gains.pad_gain = 21;
	target_gains.dac_gain = 0;
	target_gains.dac_gain = 0;
	wlc_lcnphy_set_tx_gain(pi, &target_gains);
	wlc_lcnphy_set_tx_gain(pi, &target_gains);
	wlc_lcnphy_set_tx_pwr_by_index(pi, 16);


	if (LCNREV_IS(pi->pubpi.phy_rev, 1) || pi_lcn->lcnphy_hw_iqcal_en) {
	if (LCNREV_IS(pi->pubpi.phy_rev, 1) || pi_lcn->lcnphy_hw_iqcal_en) {


@@ -3854,6 +3949,7 @@ static void wlc_lcnphy_txpwrtbl_iqlo_cal(struct brcms_phy *pi)
					lcnphy_recal ? LCNPHY_CAL_RECAL :
					lcnphy_recal ? LCNPHY_CAL_RECAL :
					LCNPHY_CAL_FULL), false);
					LCNPHY_CAL_FULL), false);
	} else {
	} else {
		wlc_lcnphy_set_tx_pwr_by_index(pi, 16);
		wlc_lcnphy_tx_iqlo_soft_cal_full(pi);
		wlc_lcnphy_tx_iqlo_soft_cal_full(pi);
	}
	}


@@ -4278,17 +4374,22 @@ wlc_lcnphy_load_tx_gain_table(struct brcms_phy *pi,
	if (CHSPEC_IS5G(pi->radio_chanspec))
	if (CHSPEC_IS5G(pi->radio_chanspec))
		pa_gain = 0x70;
		pa_gain = 0x70;
	else
	else
		pa_gain = 0x70;
		pa_gain = 0x60;


	if (pi->sh->boardflags & BFL_FEM)
	if (pi->sh->boardflags & BFL_FEM)
		pa_gain = 0x10;
		pa_gain = 0x10;

	tab.tbl_id = LCNPHY_TBL_ID_TXPWRCTL;
	tab.tbl_id = LCNPHY_TBL_ID_TXPWRCTL;
	tab.tbl_width = 32;
	tab.tbl_width = 32;
	tab.tbl_len = 1;
	tab.tbl_len = 1;
	tab.tbl_ptr = &val;
	tab.tbl_ptr = &val;


	for (j = 0; j < 128; j++) {
	for (j = 0; j < 128; j++) {
		if (pi->sh->boardflags & BFL_FEM)
			gm_gain = gain_table[j].gm;
			gm_gain = gain_table[j].gm;
		else
			gm_gain = 15;

		val = (((u32) pa_gain << 24) |
		val = (((u32) pa_gain << 24) |
		       (gain_table[j].pad << 16) |
		       (gain_table[j].pad << 16) |
		       (gain_table[j].pga << 8) | gm_gain);
		       (gain_table[j].pga << 8) | gm_gain);
@@ -4499,7 +4600,10 @@ static void wlc_radio_2064_init(struct brcms_phy *pi)


	write_phy_reg(pi, 0x4ea, 0x4688);
	write_phy_reg(pi, 0x4ea, 0x4688);


	if (pi->sh->boardflags & BFL_FEM)
		mod_phy_reg(pi, 0x4eb, (0x7 << 0), 2 << 0);
		mod_phy_reg(pi, 0x4eb, (0x7 << 0), 2 << 0);
	else
		mod_phy_reg(pi, 0x4eb, (0x7 << 0), 3 << 0);


	mod_phy_reg(pi, 0x4eb, (0x7 << 6), 0 << 6);
	mod_phy_reg(pi, 0x4eb, (0x7 << 6), 0 << 6);


@@ -4510,6 +4614,13 @@ static void wlc_radio_2064_init(struct brcms_phy *pi)
	wlc_lcnphy_rcal(pi);
	wlc_lcnphy_rcal(pi);


	wlc_lcnphy_rc_cal(pi);
	wlc_lcnphy_rc_cal(pi);

	if (!(pi->sh->boardflags & BFL_FEM)) {
		write_radio_reg(pi, RADIO_2064_REG032, 0x6f);
		write_radio_reg(pi, RADIO_2064_REG033, 0x19);
		write_radio_reg(pi, RADIO_2064_REG039, 0xe);
	}

}
}


static void wlc_lcnphy_radio_init(struct brcms_phy *pi)
static void wlc_lcnphy_radio_init(struct brcms_phy *pi)
@@ -4539,22 +4650,20 @@ static void wlc_lcnphy_tbl_init(struct brcms_phy *pi)
		wlc_lcnphy_write_table(pi, &tab);
		wlc_lcnphy_write_table(pi, &tab);
	}
	}


	if (!(pi->sh->boardflags & BFL_FEM)) {
		tab.tbl_id = LCNPHY_TBL_ID_RFSEQ;
		tab.tbl_id = LCNPHY_TBL_ID_RFSEQ;
		tab.tbl_width = 16;
		tab.tbl_width = 16;
		tab.tbl_ptr = &val;
		tab.tbl_ptr = &val;
		tab.tbl_len = 1;
		tab.tbl_len = 1;


	val = 114;
		val = 150;
		tab.tbl_offset = 0;
		tab.tbl_offset = 0;
		wlc_lcnphy_write_table(pi, &tab);
		wlc_lcnphy_write_table(pi, &tab);


	val = 130;
		val = 220;
		tab.tbl_offset = 1;
		tab.tbl_offset = 1;
		wlc_lcnphy_write_table(pi, &tab);
		wlc_lcnphy_write_table(pi, &tab);

	}
	val = 6;
	tab.tbl_offset = 8;
	wlc_lcnphy_write_table(pi, &tab);


	if (CHSPEC_IS2G(pi->radio_chanspec)) {
	if (CHSPEC_IS2G(pi->radio_chanspec)) {
		if (pi->sh->boardflags & BFL_FEM)
		if (pi->sh->boardflags & BFL_FEM)
@@ -4946,6 +5055,7 @@ void wlc_phy_chanspec_set_lcnphy(struct brcms_phy *pi, u16 chanspec)
		wlc_lcnphy_load_tx_iir_filter(pi, true, 3);
		wlc_lcnphy_load_tx_iir_filter(pi, true, 3);


	mod_phy_reg(pi, 0x4eb, (0x7 << 3), (1) << 3);
	mod_phy_reg(pi, 0x4eb, (0x7 << 3), (1) << 3);
	wlc_lcnphy_tssi_setup(pi);
}
}


void wlc_phy_detach_lcnphy(struct brcms_phy *pi)
void wlc_phy_detach_lcnphy(struct brcms_phy *pi)
@@ -4984,8 +5094,7 @@ bool wlc_phy_attach_lcnphy(struct brcms_phy *pi)
	if (!wlc_phy_txpwr_srom_read_lcnphy(pi))
	if (!wlc_phy_txpwr_srom_read_lcnphy(pi))
		return false;
		return false;


	if ((pi->sh->boardflags & BFL_FEM) &&
	if (LCNREV_IS(pi->pubpi.phy_rev, 1)) {
	    (LCNREV_IS(pi->pubpi.phy_rev, 1))) {
		if (pi_lcn->lcnphy_tempsense_option == 3) {
		if (pi_lcn->lcnphy_tempsense_option == 3) {
			pi->hwpwrctrl = true;
			pi->hwpwrctrl = true;
			pi->hwpwrctrl_capable = true;
			pi->hwpwrctrl_capable = true;
+32 −32
Original line number Original line Diff line number Diff line
@@ -1992,70 +1992,70 @@ static const u16 dot11lcn_sw_ctrl_tbl_4313_epa_rev0[] = {
};
};


static const u16 dot11lcn_sw_ctrl_tbl_4313_rev0[] = {
static const u16 dot11lcn_sw_ctrl_tbl_4313_rev0[] = {
	0x000a,
	0x0009,
	0x0009,
	0x0006,
	0x0005,
	0x000a,
	0x000a,
	0x0009,
	0x0006,
	0x0005,
	0x0005,
	0x000a,
	0x0009,
	0x0006,
	0x0006,
	0x0005,
	0x000a,
	0x0009,
	0x0009,
	0x0006,
	0x0005,
	0x000a,
	0x000a,
	0x0009,
	0x0006,
	0x0005,
	0x0005,
	0x000a,
	0x0009,
	0x0006,
	0x0006,
	0x0005,
	0x000a,
	0x0009,
	0x0009,
	0x0006,
	0x0005,
	0x000a,
	0x000a,
	0x0009,
	0x0006,
	0x0005,
	0x0005,
	0x000a,
	0x0009,
	0x0006,
	0x0006,
	0x0005,
	0x000a,
	0x0009,
	0x0009,
	0x0006,
	0x0005,
	0x000a,
	0x000a,
	0x0009,
	0x0006,
	0x0005,
	0x0005,
	0x000a,
	0x0009,
	0x0006,
	0x0006,
	0x0005,
	0x0009,
	0x000a,
	0x000a,
	0x0005,
	0x0006,
	0x0009,
	0x0009,
	0x000a,
	0x0005,
	0x0006,
	0x0006,
	0x0009,
	0x000a,
	0x0005,
	0x0005,
	0x0006,
	0x0009,
	0x000a,
	0x000a,
	0x0005,
	0x0006,
	0x0009,
	0x0009,
	0x000a,
	0x0005,
	0x0006,
	0x0006,
	0x0009,
	0x000a,
	0x0005,
	0x0005,
	0x0006,
	0x0009,
	0x000a,
	0x000a,
	0x0005,
	0x0006,
	0x0009,
	0x0009,
	0x000a,
	0x0005,
	0x0006,
	0x0006,
	0x0009,
	0x000a,
	0x0005,
	0x0005,
	0x0006,
	0x0009,
	0x000a,
	0x000a,
	0x0005,
	0x0006,
	0x0009,
	0x0009,
	0x000a,
	0x0005,
	0x0006,
	0x0006,
	0x0009,
	0x000a,
	0x0005,
	0x0005,
	0x0006,
};
};


static const u16 dot11lcn_sw_ctrl_tbl_rev0[] = {
static const u16 dot11lcn_sw_ctrl_tbl_rev0[] = {