|
@@ -1049,106 +1049,6 @@ static void ar9003_hw_set_nf_limits(struct ath_hw *ah)
|
|
ah->nf_5g.nominal = AR_PHY_CCA_NOM_VAL_9300_5GHZ;
|
|
ah->nf_5g.nominal = AR_PHY_CCA_NOM_VAL_9300_5GHZ;
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * Find out which of the RX chains are enabled
|
|
|
|
- */
|
|
|
|
-static u32 ar9003_hw_get_rx_chainmask(struct ath_hw *ah)
|
|
|
|
-{
|
|
|
|
- u32 chain = REG_READ(ah, AR_PHY_RX_CHAINMASK);
|
|
|
|
- /*
|
|
|
|
- * The bits [2:0] indicate the rx chain mask and are to be
|
|
|
|
- * interpreted as follows:
|
|
|
|
- * 00x => Only chain 0 is enabled
|
|
|
|
- * 01x => Chain 1 and 0 enabled
|
|
|
|
- * 1xx => Chain 2,1 and 0 enabled
|
|
|
|
- */
|
|
|
|
- return chain & 0x7;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void ar9003_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
|
|
|
|
-{
|
|
|
|
- struct ath9k_nfcal_hist *h;
|
|
|
|
- unsigned i, j;
|
|
|
|
- int32_t val;
|
|
|
|
- const u32 ar9300_cca_regs[6] = {
|
|
|
|
- AR_PHY_CCA_0,
|
|
|
|
- AR_PHY_CCA_1,
|
|
|
|
- AR_PHY_CCA_2,
|
|
|
|
- AR_PHY_EXT_CCA,
|
|
|
|
- AR_PHY_EXT_CCA_1,
|
|
|
|
- AR_PHY_EXT_CCA_2,
|
|
|
|
- };
|
|
|
|
- u8 chainmask, rx_chain_status;
|
|
|
|
- struct ath_common *common = ath9k_hw_common(ah);
|
|
|
|
-
|
|
|
|
- rx_chain_status = ar9003_hw_get_rx_chainmask(ah);
|
|
|
|
-
|
|
|
|
- chainmask = 0x3F;
|
|
|
|
- h = ah->nfCalHist;
|
|
|
|
-
|
|
|
|
- for (i = 0; i < NUM_NF_READINGS; i++) {
|
|
|
|
- if (chainmask & (1 << i)) {
|
|
|
|
- val = REG_READ(ah, ar9300_cca_regs[i]);
|
|
|
|
- val &= 0xFFFFFE00;
|
|
|
|
- val |= (((u32) (h[i].privNF) << 1) & 0x1ff);
|
|
|
|
- REG_WRITE(ah, ar9300_cca_regs[i], val);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Load software filtered NF value into baseband internal minCCApwr
|
|
|
|
- * variable.
|
|
|
|
- */
|
|
|
|
- REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL,
|
|
|
|
- AR_PHY_AGC_CONTROL_ENABLE_NF);
|
|
|
|
- REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL,
|
|
|
|
- AR_PHY_AGC_CONTROL_NO_UPDATE_NF);
|
|
|
|
- REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF);
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Wait for load to complete, should be fast, a few 10s of us.
|
|
|
|
- * The max delay was changed from an original 250us to 10000us
|
|
|
|
- * since 250us often results in NF load timeout and causes deaf
|
|
|
|
- * condition during stress testing 12/12/2009
|
|
|
|
- */
|
|
|
|
- for (j = 0; j < 1000; j++) {
|
|
|
|
- if ((REG_READ(ah, AR_PHY_AGC_CONTROL) &
|
|
|
|
- AR_PHY_AGC_CONTROL_NF) == 0)
|
|
|
|
- break;
|
|
|
|
- udelay(10);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * We timed out waiting for the noisefloor to load, probably due to an
|
|
|
|
- * in-progress rx. Simply return here and allow the load plenty of time
|
|
|
|
- * to complete before the next calibration interval. We need to avoid
|
|
|
|
- * trying to load -50 (which happens below) while the previous load is
|
|
|
|
- * still in progress as this can cause rx deafness. Instead by returning
|
|
|
|
- * here, the baseband nf cal will just be capped by our present
|
|
|
|
- * noisefloor until the next calibration timer.
|
|
|
|
- */
|
|
|
|
- if (j == 1000) {
|
|
|
|
- ath_print(common, ATH_DBG_ANY, "Timeout while waiting for nf "
|
|
|
|
- "to load: AR_PHY_AGC_CONTROL=0x%x\n",
|
|
|
|
- REG_READ(ah, AR_PHY_AGC_CONTROL));
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Restore maxCCAPower register parameter again so that we're not capped
|
|
|
|
- * by the median we just loaded. This will be initial (and max) value
|
|
|
|
- * of next noise floor calibration the baseband does.
|
|
|
|
- */
|
|
|
|
- for (i = 0; i < NUM_NF_READINGS; i++) {
|
|
|
|
- if (chainmask & (1 << i)) {
|
|
|
|
- val = REG_READ(ah, ar9300_cca_regs[i]);
|
|
|
|
- val &= 0xFFFFFE00;
|
|
|
|
- val |= (((u32) (-50) << 1) & 0x1ff);
|
|
|
|
- REG_WRITE(ah, ar9300_cca_regs[i], val);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* Initialize the ANI register values with default (ini) values.
|
|
* Initialize the ANI register values with default (ini) values.
|
|
* This routine is called during a (full) hardware reset after
|
|
* This routine is called during a (full) hardware reset after
|
|
@@ -1216,6 +1116,14 @@ static void ar9003_hw_ani_cache_ini_regs(struct ath_hw *ah)
|
|
void ar9003_hw_attach_phy_ops(struct ath_hw *ah)
|
|
void ar9003_hw_attach_phy_ops(struct ath_hw *ah)
|
|
{
|
|
{
|
|
struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
|
|
struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
|
|
|
|
+ const u32 ar9300_cca_regs[6] = {
|
|
|
|
+ AR_PHY_CCA_0,
|
|
|
|
+ AR_PHY_CCA_1,
|
|
|
|
+ AR_PHY_CCA_2,
|
|
|
|
+ AR_PHY_EXT_CCA,
|
|
|
|
+ AR_PHY_EXT_CCA_1,
|
|
|
|
+ AR_PHY_EXT_CCA_2,
|
|
|
|
+ };
|
|
|
|
|
|
priv_ops->rf_set_freq = ar9003_hw_set_channel;
|
|
priv_ops->rf_set_freq = ar9003_hw_set_channel;
|
|
priv_ops->spur_mitigate_freq = ar9003_hw_spur_mitigate;
|
|
priv_ops->spur_mitigate_freq = ar9003_hw_spur_mitigate;
|
|
@@ -1232,10 +1140,10 @@ void ar9003_hw_attach_phy_ops(struct ath_hw *ah)
|
|
priv_ops->set_diversity = ar9003_hw_set_diversity;
|
|
priv_ops->set_diversity = ar9003_hw_set_diversity;
|
|
priv_ops->ani_control = ar9003_hw_ani_control;
|
|
priv_ops->ani_control = ar9003_hw_ani_control;
|
|
priv_ops->do_getnf = ar9003_hw_do_getnf;
|
|
priv_ops->do_getnf = ar9003_hw_do_getnf;
|
|
- priv_ops->loadnf = ar9003_hw_loadnf;
|
|
|
|
priv_ops->ani_cache_ini_regs = ar9003_hw_ani_cache_ini_regs;
|
|
priv_ops->ani_cache_ini_regs = ar9003_hw_ani_cache_ini_regs;
|
|
|
|
|
|
ar9003_hw_set_nf_limits(ah);
|
|
ar9003_hw_set_nf_limits(ah);
|
|
|
|
+ memcpy(ah->nf_regs, ar9300_cca_regs, sizeof(ah->nf_regs));
|
|
}
|
|
}
|
|
|
|
|
|
void ar9003_hw_bb_watchdog_config(struct ath_hw *ah)
|
|
void ar9003_hw_bb_watchdog_config(struct ath_hw *ah)
|