aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ath/ath_hal/ar5416/ar2133.c30
-rw-r--r--sys/dev/ath/ath_hal/ar9002/ar9280.c60
2 files changed, 86 insertions, 4 deletions
diff --git a/sys/dev/ath/ath_hal/ar5416/ar2133.c b/sys/dev/ath/ath_hal/ar5416/ar2133.c
index 779f0de256d22..457a7c3034b18 100644
--- a/sys/dev/ath/ath_hal/ar5416/ar2133.c
+++ b/sys/dev/ath/ath_hal/ar5416/ar2133.c
@@ -163,6 +163,33 @@ ar2133SetChannel(struct ath_hal *ah, const struct ieee80211_channel *chan)
OS_REG_WRITE(ah, AR_PHY_CCK_TX_CTRL,
txctl &~ AR_PHY_CCK_TX_CTRL_JAPAN);
}
+ /*
+ * Handle programming the RF synth for odd frequencies in the
+ * 4.9->5GHz range. This matches the programming from the
+ * later model 802.11abg RF synths.
+ *
+ * This interoperates on the quarter rate channels with the
+ * AR5112 and later RF synths. Please note that the synthesiser
+ * isn't able to completely accurately represent these frequencies
+ * (as the resolution in this reference is 2.5MHz) and thus it will
+ * be slightly "off centre." This matches the same slightly
+ * incorrect * centre frequency behaviour that the AR5112 and later
+ * channel selection code has.
+ *
+ * This is disabled because it hasn't been tested for regulatory
+ * compliance and neither have the NICs which would use it.
+ * So if you enable this code, you must first ensure that you've
+ * re-certified the NICs in question beforehand or you will be
+ * violating your local regulatory rules and breaking the law.
+ */
+#if 0
+ } else if (((freq % 5) == 2) && (freq <= 5435)) {
+ freq = freq - 2;
+ channelSel = ath_hal_reverseBits(
+ (uint32_t) (((freq - 4800) * 10) / 25 + 1), 8);
+ /* XXX what about for Howl/Sowl? */
+ aModeRefSel = ath_hal_reverseBits(0, 2);
+#endif
} else if ((freq % 20) == 0 && freq >= 5120) {
channelSel = ath_hal_reverseBits(((freq - 4800) / 20 << 2), 8);
if (AR_SREV_HOWL(ah) || AR_SREV_SOWL_10_OR_LATER(ah))
@@ -179,7 +206,8 @@ ar2133SetChannel(struct ath_hal *ah, const struct ieee80211_channel *chan)
channelSel = ath_hal_reverseBits((freq - 4800) / 5, 8);
aModeRefSel = ath_hal_reverseBits(1, 2);
} else {
- HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid channel %u MHz\n",
+ HALDEBUG(ah, HAL_DEBUG_UNMASKABLE,
+ "%s: invalid channel %u MHz\n",
__func__, freq);
return AH_FALSE;
}
diff --git a/sys/dev/ath/ath_hal/ar9002/ar9280.c b/sys/dev/ath/ath_hal/ar9002/ar9280.c
index 104e4d1aa1424..c9aabf0ca3daf 100644
--- a/sys/dev/ath/ath_hal/ar9002/ar9280.c
+++ b/sys/dev/ath/ath_hal/ar9002/ar9280.c
@@ -132,9 +132,63 @@ ar9280SetChannel(struct ath_hal *ah, const struct ieee80211_channel *chan)
default:
aModeRefSel = 0;
/* Enable 2G (fractional) mode for channels which are 5MHz spaced */
- fracMode = 1;
- refDivA = 1;
- channelSel = (freq * 0x8000)/15;
+
+ /*
+ * Workaround for talking on PSB non-5MHz channels;
+ * the pre-Merlin chips only had a 2.5MHz channel
+ * spacing so some channels aren't reachable.
+
+ *
+ * This interoperates on the quarter rate channels
+ * with the AR5112 and later RF synths. Please note
+ * that the synthesiser isn't able to completely
+ * accurately represent these frequencies (as the
+ * resolution in this reference is 2.5MHz) and thus
+ * it will be slightly "off centre." This matches
+ * the same slightly incorrect centre frequency
+ * behaviour that the AR5112 and later channel
+ * selection code has.
+ *
+ * This also interoperates with the AR5416
+ * synthesiser modification for programming
+ * fractional frequencies in 5GHz mode. However
+ * that modification is also disabled by default.
+ *
+ * This is disabled because it hasn't been tested for
+ * regulatory compliance and neither have the NICs
+ * which would use it. So if you enable this code,
+ * you must first ensure that you've re-certified the
+ * NICs in question beforehand or you will be
+ * violating your local regulatory rules and breaking
+ * the law.
+ */
+#if 0
+ if (freq % 5 == 0) {
+#endif
+ /* Normal */
+ fracMode = 1;
+ refDivA = 1;
+ channelSel = (freq * 0x8000)/15;
+#if 0
+ } else {
+ /* Offset by 500KHz */
+ uint32_t f, ch, ch2;
+
+ fracMode = 1;
+ refDivA = 1;
+
+ /* Calculate the "adjusted" frequency */
+ f = freq - 2;
+ ch = (((f - 4800) * 10) / 25) + 1;
+
+ ch2 = ((ch * 25) / 5) + 9600;
+ channelSel = (ch2 * 0x4000) / 15;
+ //ath_hal_printf(ah,
+ // "%s: freq=%d, ch=%d, ch2=%d, "
+ // "channelSel=%d\n",
+ // __func__, freq, ch, ch2, channelSel);
+ }
+#endif
/* RefDivA setting */
OS_A_REG_RMW_FIELD(ah, AR_AN_SYNTH9,