|
@@ -254,86 +254,25 @@ static int ar5008_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-/**
|
|
|
|
- * ar5008_hw_spur_mitigate - convert baseband spur frequency for external radios
|
|
|
|
- * @ah: atheros hardware structure
|
|
|
|
- * @chan:
|
|
|
|
- *
|
|
|
|
- * For non single-chip solutions. Converts to baseband spur frequency given the
|
|
|
|
- * input channel frequency and compute register settings below.
|
|
|
|
- */
|
|
|
|
-static void ar5008_hw_spur_mitigate(struct ath_hw *ah,
|
|
|
|
- struct ath9k_channel *chan)
|
|
|
|
|
|
+void ar5008_hw_cmn_spur_mitigate(struct ath_hw *ah,
|
|
|
|
+ struct ath9k_channel *chan, int bin)
|
|
{
|
|
{
|
|
- int bb_spur = AR_NO_SPUR;
|
|
|
|
- int bin, cur_bin;
|
|
|
|
- int spur_freq_sd;
|
|
|
|
- int spur_delta_phase;
|
|
|
|
- int denominator;
|
|
|
|
|
|
+ int cur_bin;
|
|
int upper, lower, cur_vit_mask;
|
|
int upper, lower, cur_vit_mask;
|
|
- int tmp, new;
|
|
|
|
int i;
|
|
int i;
|
|
- static int pilot_mask_reg[4] = {
|
|
|
|
|
|
+ int8_t mask_m[123];
|
|
|
|
+ int8_t mask_p[123];
|
|
|
|
+ int8_t mask_amt;
|
|
|
|
+ int tmp_mask;
|
|
|
|
+ static const int pilot_mask_reg[4] = {
|
|
AR_PHY_TIMING7, AR_PHY_TIMING8,
|
|
AR_PHY_TIMING7, AR_PHY_TIMING8,
|
|
AR_PHY_PILOT_MASK_01_30, AR_PHY_PILOT_MASK_31_60
|
|
AR_PHY_PILOT_MASK_01_30, AR_PHY_PILOT_MASK_31_60
|
|
};
|
|
};
|
|
- static int chan_mask_reg[4] = {
|
|
|
|
|
|
+ static const int chan_mask_reg[4] = {
|
|
AR_PHY_TIMING9, AR_PHY_TIMING10,
|
|
AR_PHY_TIMING9, AR_PHY_TIMING10,
|
|
AR_PHY_CHANNEL_MASK_01_30, AR_PHY_CHANNEL_MASK_31_60
|
|
AR_PHY_CHANNEL_MASK_01_30, AR_PHY_CHANNEL_MASK_31_60
|
|
};
|
|
};
|
|
- static int inc[4] = { 0, 100, 0, 0 };
|
|
|
|
-
|
|
|
|
- int8_t mask_m[123];
|
|
|
|
- int8_t mask_p[123];
|
|
|
|
- int8_t mask_amt;
|
|
|
|
- int tmp_mask;
|
|
|
|
- int cur_bb_spur;
|
|
|
|
- bool is2GHz = IS_CHAN_2GHZ(chan);
|
|
|
|
-
|
|
|
|
- memset(&mask_m, 0, sizeof(int8_t) * 123);
|
|
|
|
- memset(&mask_p, 0, sizeof(int8_t) * 123);
|
|
|
|
-
|
|
|
|
- for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {
|
|
|
|
- cur_bb_spur = ah->eep_ops->get_spur_channel(ah, i, is2GHz);
|
|
|
|
- if (AR_NO_SPUR == cur_bb_spur)
|
|
|
|
- break;
|
|
|
|
- cur_bb_spur = cur_bb_spur - (chan->channel * 10);
|
|
|
|
- if ((cur_bb_spur > -95) && (cur_bb_spur < 95)) {
|
|
|
|
- bb_spur = cur_bb_spur;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (AR_NO_SPUR == bb_spur)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- bin = bb_spur * 32;
|
|
|
|
-
|
|
|
|
- tmp = REG_READ(ah, AR_PHY_TIMING_CTRL4(0));
|
|
|
|
- new = tmp | (AR_PHY_TIMING_CTRL4_ENABLE_SPUR_RSSI |
|
|
|
|
- AR_PHY_TIMING_CTRL4_ENABLE_SPUR_FILTER |
|
|
|
|
- AR_PHY_TIMING_CTRL4_ENABLE_CHAN_MASK |
|
|
|
|
- AR_PHY_TIMING_CTRL4_ENABLE_PILOT_MASK);
|
|
|
|
-
|
|
|
|
- REG_WRITE(ah, AR_PHY_TIMING_CTRL4(0), new);
|
|
|
|
-
|
|
|
|
- new = (AR_PHY_SPUR_REG_MASK_RATE_CNTL |
|
|
|
|
- AR_PHY_SPUR_REG_ENABLE_MASK_PPM |
|
|
|
|
- AR_PHY_SPUR_REG_MASK_RATE_SELECT |
|
|
|
|
- AR_PHY_SPUR_REG_ENABLE_VIT_SPUR_RSSI |
|
|
|
|
- SM(SPUR_RSSI_THRESH, AR_PHY_SPUR_REG_SPUR_RSSI_THRESH));
|
|
|
|
- REG_WRITE(ah, AR_PHY_SPUR_REG, new);
|
|
|
|
-
|
|
|
|
- spur_delta_phase = ((bb_spur * 524288) / 100) &
|
|
|
|
- AR_PHY_TIMING11_SPUR_DELTA_PHASE;
|
|
|
|
-
|
|
|
|
- denominator = IS_CHAN_2GHZ(chan) ? 440 : 400;
|
|
|
|
- spur_freq_sd = ((bb_spur * 2048) / denominator) & 0x3ff;
|
|
|
|
-
|
|
|
|
- new = (AR_PHY_TIMING11_USE_SPUR_IN_AGC |
|
|
|
|
- SM(spur_freq_sd, AR_PHY_TIMING11_SPUR_FREQ_SD) |
|
|
|
|
- SM(spur_delta_phase, AR_PHY_TIMING11_SPUR_DELTA_PHASE));
|
|
|
|
- REG_WRITE(ah, AR_PHY_TIMING11, new);
|
|
|
|
|
|
+ static const int inc[4] = { 0, 100, 0, 0 };
|
|
|
|
|
|
cur_bin = -6000;
|
|
cur_bin = -6000;
|
|
upper = bin + 100;
|
|
upper = bin + 100;
|
|
@@ -343,6 +282,7 @@ static void ar5008_hw_spur_mitigate(struct ath_hw *ah,
|
|
int pilot_mask = 0;
|
|
int pilot_mask = 0;
|
|
int chan_mask = 0;
|
|
int chan_mask = 0;
|
|
int bp = 0;
|
|
int bp = 0;
|
|
|
|
+
|
|
for (bp = 0; bp < 30; bp++) {
|
|
for (bp = 0; bp < 30; bp++) {
|
|
if ((cur_bin > lower) && (cur_bin < upper)) {
|
|
if ((cur_bin > lower) && (cur_bin < upper)) {
|
|
pilot_mask = pilot_mask | 0x1 << bp;
|
|
pilot_mask = pilot_mask | 0x1 << bp;
|
|
@@ -361,7 +301,6 @@ static void ar5008_hw_spur_mitigate(struct ath_hw *ah,
|
|
|
|
|
|
for (i = 0; i < 123; i++) {
|
|
for (i = 0; i < 123; i++) {
|
|
if ((cur_vit_mask > lower) && (cur_vit_mask < upper)) {
|
|
if ((cur_vit_mask > lower) && (cur_vit_mask < upper)) {
|
|
-
|
|
|
|
/* workaround for gcc bug #37014 */
|
|
/* workaround for gcc bug #37014 */
|
|
volatile int tmp_v = abs(cur_vit_mask - bin);
|
|
volatile int tmp_v = abs(cur_vit_mask - bin);
|
|
|
|
|
|
@@ -466,6 +405,78 @@ static void ar5008_hw_spur_mitigate(struct ath_hw *ah,
|
|
REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask);
|
|
REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * ar5008_hw_spur_mitigate - convert baseband spur frequency for external radios
|
|
|
|
+ * @ah: atheros hardware structure
|
|
|
|
+ * @chan:
|
|
|
|
+ *
|
|
|
|
+ * For non single-chip solutions. Converts to baseband spur frequency given the
|
|
|
|
+ * input channel frequency and compute register settings below.
|
|
|
|
+ */
|
|
|
|
+static void ar5008_hw_spur_mitigate(struct ath_hw *ah,
|
|
|
|
+ struct ath9k_channel *chan)
|
|
|
|
+{
|
|
|
|
+ int bb_spur = AR_NO_SPUR;
|
|
|
|
+ int bin;
|
|
|
|
+ int spur_freq_sd;
|
|
|
|
+ int spur_delta_phase;
|
|
|
|
+ int denominator;
|
|
|
|
+ int tmp, new;
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ int8_t mask_m[123];
|
|
|
|
+ int8_t mask_p[123];
|
|
|
|
+ int cur_bb_spur;
|
|
|
|
+ bool is2GHz = IS_CHAN_2GHZ(chan);
|
|
|
|
+
|
|
|
|
+ memset(&mask_m, 0, sizeof(int8_t) * 123);
|
|
|
|
+ memset(&mask_p, 0, sizeof(int8_t) * 123);
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {
|
|
|
|
+ cur_bb_spur = ah->eep_ops->get_spur_channel(ah, i, is2GHz);
|
|
|
|
+ if (AR_NO_SPUR == cur_bb_spur)
|
|
|
|
+ break;
|
|
|
|
+ cur_bb_spur = cur_bb_spur - (chan->channel * 10);
|
|
|
|
+ if ((cur_bb_spur > -95) && (cur_bb_spur < 95)) {
|
|
|
|
+ bb_spur = cur_bb_spur;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (AR_NO_SPUR == bb_spur)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ bin = bb_spur * 32;
|
|
|
|
+
|
|
|
|
+ tmp = REG_READ(ah, AR_PHY_TIMING_CTRL4(0));
|
|
|
|
+ new = tmp | (AR_PHY_TIMING_CTRL4_ENABLE_SPUR_RSSI |
|
|
|
|
+ AR_PHY_TIMING_CTRL4_ENABLE_SPUR_FILTER |
|
|
|
|
+ AR_PHY_TIMING_CTRL4_ENABLE_CHAN_MASK |
|
|
|
|
+ AR_PHY_TIMING_CTRL4_ENABLE_PILOT_MASK);
|
|
|
|
+
|
|
|
|
+ REG_WRITE(ah, AR_PHY_TIMING_CTRL4(0), new);
|
|
|
|
+
|
|
|
|
+ new = (AR_PHY_SPUR_REG_MASK_RATE_CNTL |
|
|
|
|
+ AR_PHY_SPUR_REG_ENABLE_MASK_PPM |
|
|
|
|
+ AR_PHY_SPUR_REG_MASK_RATE_SELECT |
|
|
|
|
+ AR_PHY_SPUR_REG_ENABLE_VIT_SPUR_RSSI |
|
|
|
|
+ SM(SPUR_RSSI_THRESH, AR_PHY_SPUR_REG_SPUR_RSSI_THRESH));
|
|
|
|
+ REG_WRITE(ah, AR_PHY_SPUR_REG, new);
|
|
|
|
+
|
|
|
|
+ spur_delta_phase = ((bb_spur * 524288) / 100) &
|
|
|
|
+ AR_PHY_TIMING11_SPUR_DELTA_PHASE;
|
|
|
|
+
|
|
|
|
+ denominator = IS_CHAN_2GHZ(chan) ? 440 : 400;
|
|
|
|
+ spur_freq_sd = ((bb_spur * 2048) / denominator) & 0x3ff;
|
|
|
|
+
|
|
|
|
+ new = (AR_PHY_TIMING11_USE_SPUR_IN_AGC |
|
|
|
|
+ SM(spur_freq_sd, AR_PHY_TIMING11_SPUR_FREQ_SD) |
|
|
|
|
+ SM(spur_delta_phase, AR_PHY_TIMING11_SPUR_DELTA_PHASE));
|
|
|
|
+ REG_WRITE(ah, AR_PHY_TIMING11, new);
|
|
|
|
+
|
|
|
|
+ ar5008_hw_cmn_spur_mitigate(ah, chan, bin);
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* ar5008_hw_rf_alloc_ext_banks - allocates banks for external radio programming
|
|
* ar5008_hw_rf_alloc_ext_banks - allocates banks for external radio programming
|
|
* @ah: atheros hardware structure
|
|
* @ah: atheros hardware structure
|