[kismac] [binaervarianz] r117 - KisMACng/Subprojects/AtheroJack/OpenHAL
- From: svn@xxxxxxxxxxxxxxxx
- To: kismac@xxxxxxxxxxxxx
- Date: Thu, 13 Apr 2006 05:55:56 +0200
Author: mick
Date: 2006-04-13 05:55:56 +0200 (Thu, 13 Apr 2006)
New Revision: 117
Modified:
KisMACng/Subprojects/AtheroJack/OpenHAL/OpenHAL.cpp
KisMACng/Subprojects/AtheroJack/OpenHAL/OpenHAL5212.cpp
Log:
* reordering some HAL functions (this is a patch by beat zahnd)
Modified: KisMACng/Subprojects/AtheroJack/OpenHAL/OpenHAL.cpp
===================================================================
--- KisMACng/Subprojects/AtheroJack/OpenHAL/OpenHAL.cpp 2006-04-10 06:45:20 UTC
(rev 116)
+++ KisMACng/Subprojects/AtheroJack/OpenHAL/OpenHAL.cpp 2006-04-13 03:55:56 UTC
(rev 117)
@@ -12,6 +12,11 @@
OSDefineMetaClassAndStructors(OpenHAL, OSObject);
+bool OpenHAL::init() {
+ ah_rf_banks = NULL;
+ return true;
+}
+
/*
* Supported channels
*/
@@ -37,11 +42,6 @@
#pragma mark -
-bool OpenHAL::init() {
- ah_rf_banks = NULL;
- return true;
-}
-
//implementation
bool OpenHAL::ath_hal_attach(u_int16_t device, void *sc, HAL_BUS_TAG st,
HAL_BUS_HANDLE sh, HAL_STATUS *status)
{
@@ -224,38 +224,6 @@
return (value);
}
-HAL_BOOL OpenHAL::ar5k_check_channel(u_int16_t freq, u_int flags) {
- /* Check if the channel is in our supported range */
- if (flags & IEEE80211_CHAN_2GHZ) {
- if ((freq >= ah_capabilities.cap_range.range_2ghz_min) &&
- (freq <= ah_capabilities.cap_range.range_2ghz_max))
- return (AH_TRUE);
- } else if (flags & IEEE80211_CHAN_5GHZ) {
- if ((freq >= ah_capabilities.cap_range.range_5ghz_min) &&
- (freq <= ah_capabilities.cap_range.range_5ghz_max))
- return (AH_TRUE);
- }
-
- return (AH_FALSE);
-}
-
-u_int32_t OpenHAL::ieee80211_regdomain2flag(u_int16_t regdomain, u_int16_t
mhz) {
- int i;
-
- for(i = 0; i < (sizeof(ieee80211_r_map) /
- sizeof(ieee80211_r_map[0])); i++) {
- if(ieee80211_r_map[i].rm_domain == regdomain) {
- if(mhz >= 2000 && mhz <= 3000)
-
return((u_int32_t)ieee80211_r_map[i].rm_domain_2ghz);
- if(mhz >= IEEE80211_CHANNELS_5GHZ_MIN &&
- mhz <= IEEE80211_CHANNELS_5GHZ_MAX)
-
return((u_int32_t)ieee80211_r_map[i].rm_domain_5ghz);
- }
- }
-
- return((u_int32_t)DMN_DEBUG);
-}
-
/*
* Convert MHz frequency to IEEE channel number.
*/
@@ -304,6 +272,21 @@
}
}
+HAL_BOOL OpenHAL::ar5k_check_channel(u_int16_t freq, u_int flags) {
+ /* Check if the channel is in our supported range */
+ if (flags & IEEE80211_CHAN_2GHZ) {
+ if ((freq >= ah_capabilities.cap_range.range_2ghz_min) &&
+ (freq <= ah_capabilities.cap_range.range_2ghz_max))
+ return (AH_TRUE);
+ } else if (flags & IEEE80211_CHAN_5GHZ) {
+ if ((freq >= ah_capabilities.cap_range.range_5ghz_min) &&
+ (freq <= ah_capabilities.cap_range.range_5ghz_max))
+ return (AH_TRUE);
+ }
+
+ return (AH_FALSE);
+}
+
HAL_BOOL OpenHAL::ath_hal_init_channels(HAL_CHANNEL *channels, u_int
max_channels, u_int *channels_size, HAL_CTRY_CODE country, u_int16_t mode,
HAL_BOOL outdoor, HAL_BOOL extended) {
u_int i, c;
u_int32_t domain_current;
@@ -423,64 +406,243 @@
return (AH_TRUE);
}
+
#pragma mark -
-HAL_STATUS OpenHAL::ar5k_eeprom_read_mac(u_int8_t *mac) {
- u_int32_t total, offset;
- u_int16_t data;
- int octet;
- u_int8_t mac_d[IEEE80211_ADDR_LEN];
+u_int16_t OpenHAL::ar5k_regdomain_from_ieee(ieee80211_regdomain_t ieee) {
+ u_int32_t regdomain = (u_int32_t)ieee;
- bzero(mac, IEEE80211_ADDR_LEN);
- bzero(&mac_d, IEEE80211_ADDR_LEN);
+ if (regdomain & 0xf0000000)
+ return ((u_int16_t)AR5K_TUNE_REGDOMAIN);
- if (nic_eeprom_is_busy())
- return (HAL_EELOCKED);
+ return (regdomain & 0xff);
+}
- if (nic_eeprom_read(0x20, &data) != 0)
- return (HAL_EIO);
+ieee80211_regdomain_t OpenHAL::ar5k_regdomain_to_ieee(u_int16_t regdomain) {
+ ieee80211_regdomain_t ieee = (ieee80211_regdomain_t)regdomain & 0xff;
+ return (ieee);
+}
- for (offset = 0x1f, octet = 0, total = 0;
- offset >= 0x1d; offset--) {
- if (nic_eeprom_read(offset, &data) != 0)
- return (HAL_EIO);
- total += data;
- mac_d[octet + 1] = data & 0xff;
- mac_d[octet] = data >> 8;
- octet += 2;
+u_int16_t OpenHAL::ar5k_get_regdomain() {
+#ifndef COUNTRYCODE
+ /*
+ * Use the regulation domain found in the EEPROM, if not
+ * forced by a static country code.
+ */
+ u_int16_t regdomain;
+ ieee80211_regdomain_t ieee_regdomain;
+
+ if (ar5k_eeprom_regulation_domain(AH_FALSE, &ieee_regdomain) ==
AH_TRUE) {
+ if ((regdomain = ar5k_regdomain_from_ieee(ieee_regdomain)))
+ return (regdomain);
}
- bcopy(mac_d, mac, IEEE80211_ADDR_LEN);
+ return (ah_regdomain);
+#else
+ /*
+ * Get the regulation domain by country code. This will ignore
+ * the settings found in the EEPROM.
+ */
+ u_int16_t code;
- if ((!total) || total == (3 * 0xffff))
- return (HAL_EINVAL);
+ code = ieee80211_name2countrycode(COUNTRYCODE);
+ return (ieee80211_countrycode2regdomain(code));
+#endif
+}
- return (HAL_OK);
+u_int32_t OpenHAL::ar5k_bitswap(u_int32_t val, u_int bits) {
+ u_int32_t retval = 0, bit, i;
+
+ for (i = 0; i < bits; i++) {
+ bit = (val >> i) & 1;
+ retval = (retval << 1) | bit;
+ }
+
+ return (retval);
}
-int OpenHAL::ar5k_check_eeprom() {
- u_int32_t addr;
- u_int16_t data[0x400], chksum = 0;
+void OpenHAL::ar5k_rt_copy(HAL_RATE_TABLE *dst, HAL_RATE_TABLE *src) {
+ bzero(dst, sizeof(HAL_RATE_TABLE));
+ dst->rateCount = src->rateCount;
+ bcopy(src->info, dst->info, sizeof(dst->info));
+}
+
+HAL_BOOL OpenHAL::ar5k_register_timeout(u_int32_t reg, u_int32_t flag,
u_int32_t val, HAL_BOOL is_set) {
+ int i;
+ u_int32_t data;
+
+ for (i = AR5K_TUNE_REGISTER_TIMEOUT; i > 0; i--) {
+ data = AR5K_REG_READ(reg);
+ if ((is_set == AH_TRUE) && (data & flag))
+ break;
+ else if ((data & flag) == val)
+ break;
+ AR5K_DELAY(15);
+ }
+
+ if (i <= 0)
+ return (AH_FALSE);
+
+ return (AH_TRUE);
+}
+
+#pragma mark -
+
+u_int16_t OpenHAL::ar5k_eeprom_bin2freq(u_int16_t bin, u_int mode) {
+ u_int16_t val;
+
+ if (bin == AR5K_EEPROM_CHANNEL_DIS)
+ return (bin);
+
+ if (mode == AR5K_EEPROM_MODE_11A) {
+ if (ah_ee_version > AR5K_EEPROM_VERSION_3_2)
+ val = (5 * bin) + 4800;
+ else
+ val = bin > 62 ?
+ (10 * 62) + (5 * (bin - 62)) + 5100 :
+ (bin * 10) + 5100;
+ } else {
+ if (ah_ee_version > AR5K_EEPROM_VERSION_3_2)
+ val = bin + 2300;
+ else
+ val = bin + 2400;
+ }
+
+ return (val);
+}
+
+int OpenHAL::ar5k_eeprom_read_ants(u_int32_t *offset, u_int mode) {
+ struct ar5k_eeprom_info *ee = &ah_capabilities.cap_eeprom;
+ u_int32_t o = *offset;
+ u_int16_t val;
+ int ret, i = 0;
+
+ AR5K_EEPROM_READ(o++, val);
+ ee->ee_switch_settling[mode] = (val >> 8) & 0x7f;
+ ee->ee_ant_tx_rx[mode] = (val >> 2) & 0x3f;
+ ee->ee_ant_control[mode][i] = (val << 4) & 0x3f;
+
+ AR5K_EEPROM_READ(o++, val);
+ ee->ee_ant_control[mode][i++] |= (val >> 12) & 0xf;
+ ee->ee_ant_control[mode][i++] = (val >> 6) & 0x3f;
+ ee->ee_ant_control[mode][i++] = val & 0x3f;
+
+ AR5K_EEPROM_READ(o++, val);
+ ee->ee_ant_control[mode][i++] = (val >> 10) & 0x3f;
+ ee->ee_ant_control[mode][i++] = (val >> 4) & 0x3f;
+ ee->ee_ant_control[mode][i] = (val << 2) & 0x3f;
+
+ AR5K_EEPROM_READ(o++, val);
+ ee->ee_ant_control[mode][i++] |= (val >> 14) & 0x3;
+ ee->ee_ant_control[mode][i++] = (val >> 8) & 0x3f;
+ ee->ee_ant_control[mode][i++] = (val >> 2) & 0x3f;
+ ee->ee_ant_control[mode][i] = (val << 4) & 0x3f;
+
+ AR5K_EEPROM_READ(o++, val);
+ ee->ee_ant_control[mode][i++] |= (val >> 12) & 0xf;
+ ee->ee_ant_control[mode][i++] = (val >> 6) & 0x3f;
+ ee->ee_ant_control[mode][i++] = val & 0x3f;
+
+ /* Get antenna modes */
+ ah_antenna[mode][0] =
+ (ee->ee_ant_control[mode][0] << 4) | 0x1;
+ ah_antenna[mode][HAL_ANT_FIXED_A] =
+ ee->ee_ant_control[mode][1] |
+ (ee->ee_ant_control[mode][2] << 6) |
+ (ee->ee_ant_control[mode][3] << 12) |
+ (ee->ee_ant_control[mode][4] << 18) |
+ (ee->ee_ant_control[mode][5] << 24);
+ ah_antenna[mode][HAL_ANT_FIXED_B] =
+ ee->ee_ant_control[mode][6] |
+ (ee->ee_ant_control[mode][7] << 6) |
+ (ee->ee_ant_control[mode][8] << 12) |
+ (ee->ee_ant_control[mode][9] << 18) |
+ (ee->ee_ant_control[mode][10] << 24);
+
+ /* return new offset */
+ *offset = o;
+
+ return (0);
+}
+
+int OpenHAL::ar5k_eeprom_read_modes(u_int32_t *offset, u_int mode) {
+ struct ar5k_eeprom_info *ee = &ah_capabilities.cap_eeprom;
+ u_int32_t o = *offset;
+ u_int16_t val;
int ret;
-
- for (addr = 0; addr < AR5K_EEPROM_INFO_BASE + AR5K_EEPROM_INFO_MAX;
addr++) {
- AR5K_EEPROM_READ(addr, data[addr]);
- if (addr >= AR5K_EEPROM_INFO_BASE) chksum ^= data[addr];
- }
- /*for (addr = 0; addr < AR5K_EEPROM_INFO_BASE + AR5K_EEPROM_INFO_MAX;
addr+=16) {
- IOLog("0x%04x %04x%04x%04x%04x %04x%04x%04x%04x %04x%04x%04x%04x
%04x%04x%04x%04x\n", addr, data[addr], data[addr + 1], data[addr + 2],
data[addr + 3], data[addr + 4], data[addr + 5], data[addr + 6], data[addr + 7],
data[addr + 8], data[addr + 9], data[addr + 10], data[addr + 11], data[addr +
12], data[addr + 13], data[addr + 14], data[addr + 15]);
- IOSleep(100);
- }*/
+ AR5K_EEPROM_READ(o++, val);
+ ee->ee_tx_end2xlna_enable[mode] = (val >> 8) & 0xff;
+ ee->ee_thr_62[mode] = val & 0xff;
+ if (ah_ee_version <= AR5K_EEPROM_VERSION_3_2)
+ ee->ee_thr_62[mode] =
+ mode == AR5K_EEPROM_MODE_11A ? 15 : 28;
- if (chksum != 0xffff) {
- AR5K_PRINTF("Checksum 0x%04x != 0xffff\n", chksum);
- return HAL_EEBADSUM;
- }
+ AR5K_EEPROM_READ(o++, val);
+ ee->ee_tx_end2xpa_disable[mode] = (val >> 8) & 0xff;
+ ee->ee_tx_frm2xpa_enable[mode] = val & 0xff;
- return HAL_OK;
+ AR5K_EEPROM_READ(o++, val);
+ ee->ee_pga_desired_size[mode] = (val >> 8) & 0xff;
+
+ if ((val & 0xff) & 0x80)
+ ee->ee_noise_floor_thr[mode] = -((((val & 0xff) ^ 0xff)) + 1);
+ else
+ ee->ee_noise_floor_thr[mode] = val & 0xff;
+
+ if (ah_ee_version <= AR5K_EEPROM_VERSION_3_2)
+ ee->ee_noise_floor_thr[mode] =
+ mode == AR5K_EEPROM_MODE_11A ? -54 : -1;
+
+ AR5K_EEPROM_READ(o++, val);
+ ee->ee_xlna_gain[mode] = (val >> 5) & 0xff;
+ ee->ee_x_gain[mode] = (val >> 1) & 0xf;
+ ee->ee_xpd[mode] = val & 0x1;
+
+ if (ah_ee_version >= AR5K_EEPROM_VERSION_4_0)
+ ee->ee_fixed_bias[mode] = (val >> 13) & 0x1;
+
+ if (ah_ee_version >= AR5K_EEPROM_VERSION_3_3) {
+ AR5K_EEPROM_READ(o++, val);
+ ee->ee_false_detect[mode] = (val >> 6) & 0x7f;
+
+ if (mode == AR5K_EEPROM_MODE_11A)
+ ee->ee_xr_power[mode] = val & 0x3f;
+ else {
+ ee->ee_ob[mode][0] = val & 0x7;
+ ee->ee_db[mode][0] = (val >> 3) & 0x7;
+ }
+ }
+
+ if (ah_ee_version < AR5K_EEPROM_VERSION_3_4) {
+ ee->ee_i_gain[mode] = AR5K_EEPROM_I_GAIN;
+ ee->ee_cck_ofdm_power_delta = AR5K_EEPROM_CCK_OFDM_DELTA;
+ } else {
+ ee->ee_i_gain[mode] = (val >> 13) & 0x7;
+
+ AR5K_EEPROM_READ(o++, val);
+ ee->ee_i_gain[mode] |= (val << 3) & 0x38;
+
+ if (mode == AR5K_EEPROM_MODE_11G)
+ ee->ee_cck_ofdm_power_delta = (val >> 3) & 0xff;
+ }
+
+ if (ah_ee_version >= AR5K_EEPROM_VERSION_4_0 &&
+ mode == AR5K_EEPROM_MODE_11A) {
+ ee->ee_i_cal[mode] = (val >> 8) & 0x3f;
+ ee->ee_q_cal[mode] = (val >> 3) & 0x1f;
+ }
+
+ if (ah_ee_version >= AR5K_EEPROM_VERSION_4_6 &&
+ mode == AR5K_EEPROM_MODE_11G)
+ ee->ee_scaled_cck_delta = (val >> 11) & 0x1f;
+
+ /* return new offset */
+ *offset = o;
+
+ return (0);
}
int OpenHAL::ar5k_eeprom_init() {
@@ -674,6 +836,40 @@
return (0);
}
+HAL_STATUS OpenHAL::ar5k_eeprom_read_mac(u_int8_t *mac) {
+ u_int32_t total, offset;
+ u_int16_t data;
+ int octet;
+ u_int8_t mac_d[IEEE80211_ADDR_LEN];
+
+ bzero(mac, IEEE80211_ADDR_LEN);
+ bzero(&mac_d, IEEE80211_ADDR_LEN);
+
+ if (nic_eeprom_is_busy())
+ return (HAL_EELOCKED);
+
+ if (nic_eeprom_read(0x20, &data) != 0)
+ return (HAL_EIO);
+
+ for (offset = 0x1f, octet = 0, total = 0;
+ offset >= 0x1d; offset--) {
+ if (nic_eeprom_read(offset, &data) != 0)
+ return (HAL_EIO);
+
+ total += data;
+ mac_d[octet + 1] = data & 0xff;
+ mac_d[octet] = data >> 8;
+ octet += 2;
+ }
+
+ bcopy(mac_d, mac, IEEE80211_ADDR_LEN);
+
+ if ((!total) || total == (3 * 0xffff))
+ return (HAL_EINVAL);
+
+ return (HAL_OK);
+}
+
HAL_BOOL OpenHAL::ar5k_eeprom_regulation_domain(HAL_BOOL write,
ieee80211_regdomain_t *regdomain)
{
/* Read current value */
@@ -699,245 +895,32 @@
return (AH_TRUE);
}
-u_int16_t OpenHAL::ar5k_eeprom_bin2freq(u_int16_t bin, u_int mode) {
- u_int16_t val;
-
- if (bin == AR5K_EEPROM_CHANNEL_DIS)
- return (bin);
-
- if (mode == AR5K_EEPROM_MODE_11A) {
- if (ah_ee_version > AR5K_EEPROM_VERSION_3_2)
- val = (5 * bin) + 4800;
- else
- val = bin > 62 ?
- (10 * 62) + (5 * (bin - 62)) + 5100 :
- (bin * 10) + 5100;
- } else {
- if (ah_ee_version > AR5K_EEPROM_VERSION_3_2)
- val = bin + 2300;
- else
- val = bin + 2400;
- }
-
- return (val);
-}
-
-int OpenHAL::ar5k_eeprom_read_ants(u_int32_t *offset, u_int mode) {
- struct ar5k_eeprom_info *ee = &ah_capabilities.cap_eeprom;
- u_int32_t o = *offset;
- u_int16_t val;
- int ret, i = 0;
-
- AR5K_EEPROM_READ(o++, val);
- ee->ee_switch_settling[mode] = (val >> 8) & 0x7f;
- ee->ee_ant_tx_rx[mode] = (val >> 2) & 0x3f;
- ee->ee_ant_control[mode][i] = (val << 4) & 0x3f;
-
- AR5K_EEPROM_READ(o++, val);
- ee->ee_ant_control[mode][i++] |= (val >> 12) & 0xf;
- ee->ee_ant_control[mode][i++] = (val >> 6) & 0x3f;
- ee->ee_ant_control[mode][i++] = val & 0x3f;
-
- AR5K_EEPROM_READ(o++, val);
- ee->ee_ant_control[mode][i++] = (val >> 10) & 0x3f;
- ee->ee_ant_control[mode][i++] = (val >> 4) & 0x3f;
- ee->ee_ant_control[mode][i] = (val << 2) & 0x3f;
-
- AR5K_EEPROM_READ(o++, val);
- ee->ee_ant_control[mode][i++] |= (val >> 14) & 0x3;
- ee->ee_ant_control[mode][i++] = (val >> 8) & 0x3f;
- ee->ee_ant_control[mode][i++] = (val >> 2) & 0x3f;
- ee->ee_ant_control[mode][i] = (val << 4) & 0x3f;
-
- AR5K_EEPROM_READ(o++, val);
- ee->ee_ant_control[mode][i++] |= (val >> 12) & 0xf;
- ee->ee_ant_control[mode][i++] = (val >> 6) & 0x3f;
- ee->ee_ant_control[mode][i++] = val & 0x3f;
-
- /* Get antenna modes */
- ah_antenna[mode][0] =
- (ee->ee_ant_control[mode][0] << 4) | 0x1;
- ah_antenna[mode][HAL_ANT_FIXED_A] =
- ee->ee_ant_control[mode][1] |
- (ee->ee_ant_control[mode][2] << 6) |
- (ee->ee_ant_control[mode][3] << 12) |
- (ee->ee_ant_control[mode][4] << 18) |
- (ee->ee_ant_control[mode][5] << 24);
- ah_antenna[mode][HAL_ANT_FIXED_B] =
- ee->ee_ant_control[mode][6] |
- (ee->ee_ant_control[mode][7] << 6) |
- (ee->ee_ant_control[mode][8] << 12) |
- (ee->ee_ant_control[mode][9] << 18) |
- (ee->ee_ant_control[mode][10] << 24);
-
- /* return new offset */
- *offset = o;
-
- return (0);
-}
-
-int OpenHAL::ar5k_eeprom_read_modes(u_int32_t *offset, u_int mode) {
- struct ar5k_eeprom_info *ee = &ah_capabilities.cap_eeprom;
- u_int32_t o = *offset;
- u_int16_t val;
+int OpenHAL::ar5k_check_eeprom() {
+ u_int32_t addr;
+ u_int16_t data[0x400], chksum = 0;
int ret;
+
+ for (addr = 0; addr < AR5K_EEPROM_INFO_BASE + AR5K_EEPROM_INFO_MAX;
addr++) {
+ AR5K_EEPROM_READ(addr, data[addr]);
+ if (addr >= AR5K_EEPROM_INFO_BASE) chksum ^= data[addr];
+ }
- AR5K_EEPROM_READ(o++, val);
- ee->ee_tx_end2xlna_enable[mode] = (val >> 8) & 0xff;
- ee->ee_thr_62[mode] = val & 0xff;
+ /*for (addr = 0; addr < AR5K_EEPROM_INFO_BASE + AR5K_EEPROM_INFO_MAX;
addr+=16) {
+ IOLog("0x%04x %04x%04x%04x%04x %04x%04x%04x%04x %04x%04x%04x%04x
%04x%04x%04x%04x\n", addr, data[addr], data[addr + 1], data[addr + 2],
data[addr + 3], data[addr + 4], data[addr + 5], data[addr + 6], data[addr + 7],
data[addr + 8], data[addr + 9], data[addr + 10], data[addr + 11], data[addr +
12], data[addr + 13], data[addr + 14], data[addr + 15]);
+ IOSleep(100);
+ }*/
- if (ah_ee_version <= AR5K_EEPROM_VERSION_3_2)
- ee->ee_thr_62[mode] =
- mode == AR5K_EEPROM_MODE_11A ? 15 : 28;
- AR5K_EEPROM_READ(o++, val);
- ee->ee_tx_end2xpa_disable[mode] = (val >> 8) & 0xff;
- ee->ee_tx_frm2xpa_enable[mode] = val & 0xff;
+ if (chksum != 0xffff) {
+ AR5K_PRINTF("Checksum 0x%04x != 0xffff\n", chksum);
+ return HAL_EEBADSUM;
+ }
- AR5K_EEPROM_READ(o++, val);
- ee->ee_pga_desired_size[mode] = (val >> 8) & 0xff;
-
- if ((val & 0xff) & 0x80)
- ee->ee_noise_floor_thr[mode] = -((((val & 0xff) ^ 0xff)) + 1);
- else
- ee->ee_noise_floor_thr[mode] = val & 0xff;
-
- if (ah_ee_version <= AR5K_EEPROM_VERSION_3_2)
- ee->ee_noise_floor_thr[mode] =
- mode == AR5K_EEPROM_MODE_11A ? -54 : -1;
-
- AR5K_EEPROM_READ(o++, val);
- ee->ee_xlna_gain[mode] = (val >> 5) & 0xff;
- ee->ee_x_gain[mode] = (val >> 1) & 0xf;
- ee->ee_xpd[mode] = val & 0x1;
-
- if (ah_ee_version >= AR5K_EEPROM_VERSION_4_0)
- ee->ee_fixed_bias[mode] = (val >> 13) & 0x1;
-
- if (ah_ee_version >= AR5K_EEPROM_VERSION_3_3) {
- AR5K_EEPROM_READ(o++, val);
- ee->ee_false_detect[mode] = (val >> 6) & 0x7f;
-
- if (mode == AR5K_EEPROM_MODE_11A)
- ee->ee_xr_power[mode] = val & 0x3f;
- else {
- ee->ee_ob[mode][0] = val & 0x7;
- ee->ee_db[mode][0] = (val >> 3) & 0x7;
- }
- }
-
- if (ah_ee_version < AR5K_EEPROM_VERSION_3_4) {
- ee->ee_i_gain[mode] = AR5K_EEPROM_I_GAIN;
- ee->ee_cck_ofdm_power_delta = AR5K_EEPROM_CCK_OFDM_DELTA;
- } else {
- ee->ee_i_gain[mode] = (val >> 13) & 0x7;
-
- AR5K_EEPROM_READ(o++, val);
- ee->ee_i_gain[mode] |= (val << 3) & 0x38;
-
- if (mode == AR5K_EEPROM_MODE_11G)
- ee->ee_cck_ofdm_power_delta = (val >> 3) & 0xff;
- }
-
- if (ah_ee_version >= AR5K_EEPROM_VERSION_4_0 &&
- mode == AR5K_EEPROM_MODE_11A) {
- ee->ee_i_cal[mode] = (val >> 8) & 0x3f;
- ee->ee_q_cal[mode] = (val >> 3) & 0x1f;
- }
-
- if (ah_ee_version >= AR5K_EEPROM_VERSION_4_6 &&
- mode == AR5K_EEPROM_MODE_11G)
- ee->ee_scaled_cck_delta = (val >> 11) & 0x1f;
-
- /* return new offset */
- *offset = o;
-
- return (0);
+ return HAL_OK;
}
#pragma mark -
-void OpenHAL::ar5k_rt_copy(HAL_RATE_TABLE *dst, HAL_RATE_TABLE *src) {
- bzero(dst, sizeof(HAL_RATE_TABLE));
- dst->rateCount = src->rateCount;
- bcopy(src->info, dst->info, sizeof(dst->info));
-}
-
-HAL_BOOL OpenHAL::ar5k_register_timeout(u_int32_t reg, u_int32_t flag,
u_int32_t val, HAL_BOOL is_set) {
- int i;
- u_int32_t data;
-
- for (i = AR5K_TUNE_REGISTER_TIMEOUT; i > 0; i--) {
- data = AR5K_REG_READ(reg);
- if ((is_set == AH_TRUE) && (data & flag))
- break;
- else if ((data & flag) == val)
- break;
- AR5K_DELAY(15);
- }
-
- if (i <= 0)
- return (AH_FALSE);
-
- return (AH_TRUE);
-}
-
-
-ieee80211_regdomain_t OpenHAL::ar5k_regdomain_to_ieee(u_int16_t regdomain) {
- ieee80211_regdomain_t ieee = (ieee80211_regdomain_t)regdomain & 0xff;
- return (ieee);
-}
-
-
-u_int16_t OpenHAL::ar5k_regdomain_from_ieee(ieee80211_regdomain_t ieee) {
- u_int32_t regdomain = (u_int32_t)ieee;
-
- if (regdomain & 0xf0000000)
- return ((u_int16_t)AR5K_TUNE_REGDOMAIN);
-
- return (regdomain & 0xff);
-}
-
-u_int16_t OpenHAL::ar5k_get_regdomain() {
-#ifndef COUNTRYCODE
- /*
- * Use the regulation domain found in the EEPROM, if not
- * forced by a static country code.
- */
- u_int16_t regdomain;
- ieee80211_regdomain_t ieee_regdomain;
-
- if (ar5k_eeprom_regulation_domain(AH_FALSE, &ieee_regdomain) ==
AH_TRUE) {
- if ((regdomain = ar5k_regdomain_from_ieee(ieee_regdomain)))
- return (regdomain);
- }
-
- return (ah_regdomain);
-#else
- /*
- * Get the regulation domain by country code. This will ignore
- * the settings found in the EEPROM.
- */
- u_int16_t code;
-
- code = ieee80211_name2countrycode(COUNTRYCODE);
- return (ieee80211_countrycode2regdomain(code));
-#endif
-}
-
-u_int32_t OpenHAL::ar5k_bitswap(u_int32_t val, u_int bits) {
- u_int32_t retval = 0, bit, i;
-
- for (i = 0; i < bits; i++) {
- bit = (val >> i) & 1;
- retval = (retval << 1) | bit;
- }
-
- return (retval);
-}
-
-#pragma mark -
-
HAL_BOOL OpenHAL::ar5k_channel(HAL_CHANNEL *channel) {
HAL_BOOL ret;
@@ -970,8 +953,6 @@
return (AH_TRUE);
}
-#pragma mark -
-
u_int OpenHAL::ar5k_rfregs_op(u_int32_t *rf, u_int32_t offset, u_int32_t reg,
u_int32_t bits, u_int32_t first, u_int32_t col, HAL_BOOL set) {
u_int32_t mask, entry, last, data, shift, position;
int32_t left;
@@ -1378,6 +1359,8 @@
return (AH_TRUE);
}
+#pragma mark -
+
void OpenHAL::ar5k_txpower_table(HAL_CHANNEL *channel, int16_t max_power) {
u_int16_t txpower, *rates;
int i;
@@ -1403,3 +1386,21 @@
ah_txpower.txp_pcdac[i] = AR5K_EEPROM_PCDAC_START;
}
+#pragma mark -
+
+u_int32_t OpenHAL::ieee80211_regdomain2flag(u_int16_t regdomain, u_int16_t
mhz) {
+ int i;
+
+ for(i = 0; i < (sizeof(ieee80211_r_map) /
+ sizeof(ieee80211_r_map[0])); i++) {
+ if(ieee80211_r_map[i].rm_domain == regdomain) {
+ if(mhz >= 2000 && mhz <= 3000)
+
return((u_int32_t)ieee80211_r_map[i].rm_domain_2ghz);
+ if(mhz >= IEEE80211_CHANNELS_5GHZ_MIN &&
+ mhz <= IEEE80211_CHANNELS_5GHZ_MAX)
+
return((u_int32_t)ieee80211_r_map[i].rm_domain_5ghz);
+ }
+ }
+
+ return((u_int32_t)DMN_DEBUG);
+}
\ No newline at end of file
Modified: KisMACng/Subprojects/AtheroJack/OpenHAL/OpenHAL5212.cpp
===================================================================
--- KisMACng/Subprojects/AtheroJack/OpenHAL/OpenHAL5212.cpp 2006-04-10
06:45:20 UTC (rev 116)
+++ KisMACng/Subprojects/AtheroJack/OpenHAL/OpenHAL5212.cpp 2006-04-13
03:55:56 UTC (rev 117)
@@ -195,62 +195,152 @@
return AH_TRUE;
}
-void OpenHAL5212::nic_detach() {
- if (ah_rf_banks != NULL)
- IOFree(ah_rf_banks, sizeof(ar5112_rf_tofix));
-}
+HAL_BOOL OpenHAL5212::ar5k_ar5212_nic_reset(u_int32_t val) {
+ HAL_BOOL ret = AH_FALSE;
+ u_int32_t mask = val ? val : 0xFFFFFFFF;
-HAL_BOOL OpenHAL5212::nic_get_capabilities()
-{
- u_int16_t ee_header;
+ /* Read-and-clear */
+ AR5K_REG_READ(AR5K_AR5212_RXDP);
- /* Capabilities stored in the EEPROM */
- ee_header = ah_capabilities.cap_eeprom.ee_header;
+ /*
+ * Reset the device and wait until success
+ */
+ AR5K_REG_WRITE(AR5K_AR5212_RC, val);
+ /* Wait at least 128 PCI clocks */
+ AR5K_DELAY(15);
+
+ val &=
+ AR5K_AR5212_RC_PCU | AR5K_AR5212_RC_BB;
+
+ mask &=
+ AR5K_AR5212_RC_PCU | AR5K_AR5212_RC_BB;
+
+ ret = ar5k_register_timeout(AR5K_AR5212_RC, mask, val, AH_FALSE);
+
/*
- * XXX The AR5212 tranceiver supports frequencies from 4920 to 6100GHz
- * XXX and from 2312 to 2732GHz. There are problems with the current
- * XXX ieee80211 implementation because the IEEE channel mapping
- * XXX does not support negative channel numbers (2312MHz is channel
- * XXX -19). Of course, this doesn't matter because these channels
- * XXX are out of range but some regulation domains like MKK (Japan)
- * XXX will support frequencies somewhere around 4.8GHz.
+ * Reset configuration register
*/
+ if ((val & AR5K_AR5212_RC_PCU) == 0)
+ AR5K_REG_WRITE(AR5K_AR5212_CFG, AR5K_AR5212_INIT_CFG);
+ return (ret);
+}
+
+HAL_BOOL OpenHAL5212::ar5k_ar5212_nic_wakeup(u_int16_t flags) {
+ u_int32_t turbo, mode, clock;
+
+ turbo = 0;
+ mode = 0;
+ clock = 0;
+
/*
- * Set radio capabilities
+ * Get channel mode flags
*/
- if (AR5K_EEPROM_HDR_11A(ee_header)) {
- ah_capabilities.cap_range.range_5ghz_min = 5005; /* 4920 */
- ah_capabilities.cap_range.range_5ghz_max = 6100;
+ if (ah_radio >= AR5K_AR5112) {
+ mode = AR5K_AR5212_PHY_MODE_RAD_AR5112;
+ clock = AR5K_AR5212_PHY_PLL_AR5112;
+ } else {
+ mode = AR5K_AR5212_PHY_MODE_RAD_AR5111;
+ clock = AR5K_AR5212_PHY_PLL_AR5111;
+ }
- /* Set supported modes */
- ah_capabilities.cap_mode =
- HAL_MODE_11A | HAL_MODE_TURBO | HAL_MODE_XR;
+ if (flags & IEEE80211_CHAN_2GHZ) {
+ mode |= AR5K_AR5212_PHY_MODE_FREQ_2GHZ;
+ clock |= AR5K_AR5212_PHY_PLL_44MHZ;
+ } else if (flags & IEEE80211_CHAN_5GHZ) {
+ mode |= AR5K_AR5212_PHY_MODE_FREQ_5GHZ;
+ clock |= AR5K_AR5212_PHY_PLL_40MHZ;
+ } else {
+ AR5K_PRINT("invalid radio frequency mode\n");
+ return (AH_FALSE);
}
- /* This chip will support 802.11b if the 2GHz radio is connected */
- if (AR5K_EEPROM_HDR_11B(ee_header) || AR5K_EEPROM_HDR_11G(ee_header)) {
- ah_capabilities.cap_range.range_2ghz_min = 2412; /* 2312 */
- ah_capabilities.cap_range.range_2ghz_max = 2732;
- ah_capabilities.cap_mode |= HAL_MODE_11B;
+ if (flags & IEEE80211_CHAN_CCK) {
+ mode |= AR5K_AR5212_PHY_MODE_MOD_CCK;
+ } else if (flags & IEEE80211_CHAN_OFDM) {
+ mode |= AR5K_AR5212_PHY_MODE_MOD_OFDM;
+ } else if (flags & IEEE80211_CHAN_DYN) {
+ mode |= AR5K_AR5212_PHY_MODE_MOD_DYN;
+ } else {
+ AR5K_PRINT("invalid radio frequency mode\n");
+ return (AH_FALSE);
+ }
- if (AR5K_EEPROM_HDR_11B(ee_header))
- ah_capabilities.cap_mode |= HAL_MODE_11B;
- if (AR5K_EEPROM_HDR_11G(ee_header))
- ah_capabilities.cap_mode |= HAL_MODE_11G;
+ if (flags & IEEE80211_CHAN_TURBO) {
+ turbo = AR5K_AR5212_PHY_TURBO_MODE |
+ AR5K_AR5212_PHY_TURBO_SHORT;
}
- /* GPIO */
- ah_gpio_npins = AR5K_AR5212_NUM_GPIO;
+ /*
+ * Reset and wakeup the device
+ */
- /* Set number of supported TX queues */
- ah_capabilities.cap_queues.q_tx_num = AR5K_AR5212_TX_NUM_QUEUES;
+ /* ...reset chipset and PCI device */
+ if (ar5k_ar5212_nic_reset(AR5K_AR5212_RC_CHIP | AR5K_AR5212_RC_PCI) ==
AH_FALSE) {
+ AR5K_PRINT("failed to reset the AR5212 + PCI chipset\n");
+ return (AH_FALSE);
+ }
+ /* ...wakeup */
+ if (nic_setPowerMode(HAL_PM_AWAKE, AH_TRUE, 0) == AH_FALSE) {
+ AR5K_PRINT("failed to resume the AR5212 (again)\n");
+ return (AH_FALSE);
+ }
+
+ /* ...final warm reset */
+ if (ar5k_ar5212_nic_reset(0) == AH_FALSE) {
+ AR5K_PRINT("failed to warm reset the AR5212\n");
+ return (AH_FALSE);
+ }
+
+ /* ...set the PHY operating mode */
+ AR5K_REG_WRITE(AR5K_AR5212_PHY_PLL, clock);
+ AR5K_DELAY(300);
+
+ AR5K_REG_WRITE(AR5K_AR5212_PHY_MODE, mode);
+ AR5K_REG_WRITE(AR5K_AR5212_PHY_TURBO, turbo);
+
return (AH_TRUE);
}
+u_int16_t OpenHAL5212::ar5k_ar5212_radio_revision(HAL_CHIP chip) {
+ int i;
+ u_int32_t srev;
+ u_int16_t ret;
+
+ /*
+ * Set the radio chip access register
+ */
+ switch (chip) {
+ case HAL_CHIP_2GHZ:
+ AR5K_REG_WRITE(AR5K_AR5212_PHY(0), AR5K_AR5212_PHY_SHIFT_2GHZ);
+ break;
+ case HAL_CHIP_5GHZ:
+ AR5K_REG_WRITE(AR5K_AR5212_PHY(0), AR5K_AR5212_PHY_SHIFT_5GHZ);
+ break;
+ default:
+ return (0);
+ }
+
+ AR5K_DELAY(2000);
+
+ /* ...wait until PHY is ready and read the selected radio revision */
+ AR5K_REG_WRITE(AR5K_AR5212_PHY(0x34), 0x00001c16);
+
+ for (i = 0; i < 8; i++)
+ AR5K_REG_WRITE(AR5K_AR5212_PHY(0x20), 0x00010000);
+ srev = (AR5K_REG_READ(AR5K_AR5212_PHY(0x100)) >> 24) & 0xff;
+
+ ret = ar5k_bitswap(((srev & 0xf0) >> 4) | ((srev & 0x0f) << 4), 8);
+
+ /* Reset to the 5GHz mode */
+ AR5K_REG_WRITE(AR5K_AR5212_PHY(0), AR5K_AR5212_PHY_SHIFT_5GHZ);
+
+ return (ret);
+}
+
const HAL_RATE_TABLE * OpenHAL5212::nic_getRateTable(u_int mode) {
switch (mode) {
case HAL_MODE_11A:
@@ -271,6 +361,11 @@
return (NULL);
}
+void OpenHAL5212::nic_detach() {
+ if (ah_rf_banks != NULL)
+ IOFree(ah_rf_banks, sizeof(ar5112_rf_tofix));
+}
+
HAL_BOOL OpenHAL5212::nic_reset(HAL_OPMODE op_mode, HAL_CHANNEL *channel,
HAL_BOOL change_channel, HAL_STATUS *status) {
struct ar5k_eeprom_info *ee = &ah_capabilities.cap_eeprom;
u_int8_t mac[IEEE80211_ADDR_LEN];
@@ -890,6 +985,8 @@
return (AH_TRUE);
}
+#pragma mark -
+
u_int32_t OpenHAL5212::nic_getRxDP() {
return (AR5K_REG_READ(AR5K_AR5212_RXDP));
}
@@ -1061,6 +1158,109 @@
AR5K_AR5212_RX_FILTER_PROMISC);
}
+#pragma mark -
+
+void OpenHAL5212::dumpState() {
+#define AR5K_PRINT_REGISTER(_x)
\
+ IOLog("(%s: %08x) ", #_x, AR5K_REG_READ(AR5K_AR5212_##_x));\
+ IOSleep(100);
+
+ IOLog("MAC registers:\n");
+ AR5K_PRINT_REGISTER(CR);
+ AR5K_PRINT_REGISTER(CFG);
+ AR5K_PRINT_REGISTER(IER);
+ AR5K_PRINT_REGISTER(TXCFG);
+ AR5K_PRINT_REGISTER(RXCFG);
+ AR5K_PRINT_REGISTER(MIBC);
+ AR5K_PRINT_REGISTER(TOPS);
+ AR5K_PRINT_REGISTER(RXNOFRM);
+ AR5K_PRINT_REGISTER(RPGTO);
+ AR5K_PRINT_REGISTER(RFCNT);
+ AR5K_PRINT_REGISTER(MISC);
+ AR5K_PRINT_REGISTER(PISR);
+ AR5K_PRINT_REGISTER(SISR0);
+ AR5K_PRINT_REGISTER(SISR1);
+ AR5K_PRINT_REGISTER(SISR3);
+ AR5K_PRINT_REGISTER(SISR4);
+ AR5K_PRINT_REGISTER(DCM_ADDR);
+ AR5K_PRINT_REGISTER(DCM_DATA);
+ AR5K_PRINT_REGISTER(DCCFG);
+ AR5K_PRINT_REGISTER(CCFG);
+ AR5K_PRINT_REGISTER(CCFG_CUP);
+ AR5K_PRINT_REGISTER(CPC0);
+ AR5K_PRINT_REGISTER(CPC1);
+ AR5K_PRINT_REGISTER(CPC2);
+ AR5K_PRINT_REGISTER(CPCORN);
+ AR5K_PRINT_REGISTER(QCU_TXE);
+ AR5K_PRINT_REGISTER(QCU_TXD);
+ AR5K_PRINT_REGISTER(DCU_GBL_IFS_SIFS);
+ AR5K_PRINT_REGISTER(DCU_GBL_IFS_SLOT);
+ AR5K_PRINT_REGISTER(DCU_FP);
+ AR5K_PRINT_REGISTER(DCU_TXP);
+ AR5K_PRINT_REGISTER(DCU_TX_FILTER);
+ AR5K_PRINT_REGISTER(RC);
+ AR5K_PRINT_REGISTER(SCR);
+ AR5K_PRINT_REGISTER(INTPEND);
+ AR5K_PRINT_REGISTER(PCICFG);
+ AR5K_PRINT_REGISTER(GPIOCR);
+ AR5K_PRINT_REGISTER(GPIODO);
+ AR5K_PRINT_REGISTER(SREV);
+ AR5K_PRINT_REGISTER(EEPROM_BASE);
+ AR5K_PRINT_REGISTER(EEPROM_DATA);
+ AR5K_PRINT_REGISTER(EEPROM_CMD);
+ AR5K_PRINT_REGISTER(EEPROM_CFG);
+ AR5K_PRINT_REGISTER(PCU_MIN);
+ AR5K_PRINT_REGISTER(STA_ID0);
+ AR5K_PRINT_REGISTER(STA_ID1);
+ AR5K_PRINT_REGISTER(BSS_ID0);
+ AR5K_PRINT_REGISTER(SLOT_TIME);
+ AR5K_PRINT_REGISTER(TIME_OUT);
+ AR5K_PRINT_REGISTER(RSSI_THR);
+ AR5K_PRINT_REGISTER(BEACON);
+ AR5K_PRINT_REGISTER(CFP_PERIOD);
+ AR5K_PRINT_REGISTER(TIMER0);
+ AR5K_PRINT_REGISTER(TIMER2);
+ AR5K_PRINT_REGISTER(TIMER3);
+ AR5K_PRINT_REGISTER(CFP_DUR);
+ AR5K_PRINT_REGISTER(MCAST_FIL0);
+ AR5K_PRINT_REGISTER(MCAST_FIL1);
+ AR5K_PRINT_REGISTER(DIAG_SW);
+ AR5K_PRINT_REGISTER(TSF_U32);
+ AR5K_PRINT_REGISTER(ADDAC_TEST);
+ AR5K_PRINT_REGISTER(DEFAULT_ANTENNA);
+ AR5K_PRINT_REGISTER(LAST_TSTP);
+ AR5K_PRINT_REGISTER(NAV);
+ AR5K_PRINT_REGISTER(RTS_OK);
+ AR5K_PRINT_REGISTER(ACK_FAIL);
+ AR5K_PRINT_REGISTER(FCS_FAIL);
+ AR5K_PRINT_REGISTER(BEACON_CNT);
+ AR5K_PRINT_REGISTER(TSF_PARM);
+ AR5K_PRINT_REGISTER(RATE_DUR_0);
+ AR5K_PRINT_REGISTER(KEYTABLE_0);
+ IOLog("\n");
+
+ IOLog("PHY registers:\n");
+ AR5K_PRINT_REGISTER(PHY_TURBO);
+ AR5K_PRINT_REGISTER(PHY_AGC);
+ AR5K_PRINT_REGISTER(PHY_TIMING_3);
+ AR5K_PRINT_REGISTER(PHY_CHIP_ID);
+ AR5K_PRINT_REGISTER(PHY_AGCCTL);
+ AR5K_PRINT_REGISTER(PHY_NF);
+ AR5K_PRINT_REGISTER(PHY_SCR);
+ AR5K_PRINT_REGISTER(PHY_SLMT);
+ AR5K_PRINT_REGISTER(PHY_SCAL);
+ AR5K_PRINT_REGISTER(PHY_RX_DELAY);
+ AR5K_PRINT_REGISTER(PHY_IQ);
+ AR5K_PRINT_REGISTER(PHY_PAPD_PROBE);
+ AR5K_PRINT_REGISTER(PHY_TXPOWER_RATE1);
+ AR5K_PRINT_REGISTER(PHY_TXPOWER_RATE2);
+ AR5K_PRINT_REGISTER(PHY_FC);
+ AR5K_PRINT_REGISTER(PHY_RADAR);
+ AR5K_PRINT_REGISTER(PHY_ANT_SWITCH_TABLE_0);
+ AR5K_PRINT_REGISTER(PHY_ANT_SWITCH_TABLE_1);
+ IOLog("\n");
+}
+
void OpenHAL5212::nic_getMacAddress(u_int8_t *mac) {
bcopy(ah_sta_id, mac, IEEE80211_ADDR_LEN);
}
@@ -1177,8 +1377,6 @@
nic_enablePSPoll(NULL, 0);
}
-#pragma mark -
-
HAL_BOOL OpenHAL5212::nic_gpioCfgInput(u_int32_t gpio) {
if (gpio > AR5K_AR5212_NUM_GPIO)
return (AH_FALSE);
@@ -1222,8 +1420,6 @@
AR5K_REG_ENABLE_BITS(AR5K_AR5212_PIMR, AR5K_AR5212_PIMR_GPIO);
}
-#pragma mark -
-
HAL_RFGAIN OpenHAL5212::nic_getRfGain() {
u_int32_t data, type;
@@ -1261,6 +1457,8 @@
return (ah_rf_gain);
}
+#pragma mark -
+
HAL_BOOL OpenHAL5212::nic_resetKeyCacheEntry(u_int16_t entry) {
int i;
@@ -1276,6 +1474,8 @@
return (AH_FALSE);
}
+#pragma mark -
+
HAL_BOOL OpenHAL5212::nic_setPowerMode(HAL_POWER_MODE mode, HAL_BOOL set_chip,
u_int16_t sleep_duration) {
int i;
@@ -1438,6 +1638,59 @@
#pragma mark -
+HAL_BOOL OpenHAL5212::nic_get_capabilities()
+{
+ u_int16_t ee_header;
+
+ /* Capabilities stored in the EEPROM */
+ ee_header = ah_capabilities.cap_eeprom.ee_header;
+
+ /*
+ * XXX The AR5212 tranceiver supports frequencies from 4920 to 6100GHz
+ * XXX and from 2312 to 2732GHz. There are problems with the current
+ * XXX ieee80211 implementation because the IEEE channel mapping
+ * XXX does not support negative channel numbers (2312MHz is channel
+ * XXX -19). Of course, this doesn't matter because these channels
+ * XXX are out of range but some regulation domains like MKK (Japan)
+ * XXX will support frequencies somewhere around 4.8GHz.
+ */
+
+ /*
+ * Set radio capabilities
+ */
+
+ if (AR5K_EEPROM_HDR_11A(ee_header)) {
+ ah_capabilities.cap_range.range_5ghz_min = 5005; /* 4920 */
+ ah_capabilities.cap_range.range_5ghz_max = 6100;
+
+ /* Set supported modes */
+ ah_capabilities.cap_mode =
+ HAL_MODE_11A | HAL_MODE_TURBO | HAL_MODE_XR;
+ }
+
+ /* This chip will support 802.11b if the 2GHz radio is connected */
+ if (AR5K_EEPROM_HDR_11B(ee_header) || AR5K_EEPROM_HDR_11G(ee_header)) {
+ ah_capabilities.cap_range.range_2ghz_min = 2412; /* 2312 */
+ ah_capabilities.cap_range.range_2ghz_max = 2732;
+ ah_capabilities.cap_mode |= HAL_MODE_11B;
+
+ if (AR5K_EEPROM_HDR_11B(ee_header))
+ ah_capabilities.cap_mode |= HAL_MODE_11B;
+ if (AR5K_EEPROM_HDR_11G(ee_header))
+ ah_capabilities.cap_mode |= HAL_MODE_11G;
+ }
+
+ /* GPIO */
+ ah_gpio_npins = AR5K_AR5212_NUM_GPIO;
+
+ /* Set number of supported TX queues */
+ ah_capabilities.cap_queues.q_tx_num = AR5K_AR5212_TX_NUM_QUEUES;
+
+ return (AH_TRUE);
+}
+
+#pragma mark -
+
HAL_BOOL OpenHAL5212::nic_eeprom_is_busy() {
return (AR5K_REG_READ(AR5K_AR5212_CFG) & AR5K_AR5212_CFG_EEBS ?
AH_TRUE : AH_FALSE);
@@ -1506,195 +1759,6 @@
#pragma mark -
-HAL_BOOL OpenHAL5212::nic_channel(HAL_CHANNEL *channel) {
- u_int32_t data, data0, data1, data2;
- u_int16_t c;
-
- data = data0 = data1 = data2 = 0;
- c = channel->c_channel;
-
- /*
- * Set the channel on the AR5112 or newer
- */
- if (c < 4800) {
- if (!((c - 2224) % 5)) {
- data0 = ((2 * (c - 704)) - 3040) / 10;
- data1 = 1;
- } else if (!((c - 2192) % 5)) {
- data0 = ((2 * (c - 672)) - 3040) / 10;
- data1 = 0;
- } else
- return (AH_FALSE);
-
- data0 = ar5k_bitswap((data0 << 2) & 0xff, 8);
- } else {
- if (!(c % 20) && c >= 5120) {
- data0 = ar5k_bitswap(((c - 4800) / 20 << 2), 8);
- data2 = ar5k_bitswap(3, 2);
- } else if (!(c % 10)) {
- data0 = ar5k_bitswap(((c - 4800) / 10 << 1), 8);
- data2 = ar5k_bitswap(2, 2);
- } else if (!(c % 5)) {
- data0 = ar5k_bitswap((c - 4800) / 5, 8);
- data2 = ar5k_bitswap(1, 2);
- } else
- return (AH_FALSE);
- }
-
- data = (data0 << 4) | (data1 << 1) | (data2 << 2) | 0x1001;
-
- AR5K_PHY_WRITE(0x27, data & 0xff);
- AR5K_PHY_WRITE(0x36, (data >> 8) & 0x7f);
-
- return (AH_TRUE);
-}
-
-HAL_BOOL OpenHAL5212::ar5k_ar5212_nic_reset(u_int32_t val) {
- HAL_BOOL ret = AH_FALSE;
- u_int32_t mask = val ? val : 0xFFFFFFFF;
-
- /* Read-and-clear */
- AR5K_REG_READ(AR5K_AR5212_RXDP);
-
- /*
- * Reset the device and wait until success
- */
- AR5K_REG_WRITE(AR5K_AR5212_RC, val);
-
- /* Wait at least 128 PCI clocks */
- AR5K_DELAY(15);
-
- val &=
- AR5K_AR5212_RC_PCU | AR5K_AR5212_RC_BB;
-
- mask &=
- AR5K_AR5212_RC_PCU | AR5K_AR5212_RC_BB;
-
- ret = ar5k_register_timeout(AR5K_AR5212_RC, mask, val, AH_FALSE);
-
- /*
- * Reset configuration register
- */
- if ((val & AR5K_AR5212_RC_PCU) == 0)
- AR5K_REG_WRITE(AR5K_AR5212_CFG, AR5K_AR5212_INIT_CFG);
-
- return (ret);
-}
-
-HAL_BOOL OpenHAL5212::ar5k_ar5212_nic_wakeup(u_int16_t flags) {
- u_int32_t turbo, mode, clock;
-
- turbo = 0;
- mode = 0;
- clock = 0;
-
- /*
- * Get channel mode flags
- */
-
- if (ah_radio >= AR5K_AR5112) {
- mode = AR5K_AR5212_PHY_MODE_RAD_AR5112;
- clock = AR5K_AR5212_PHY_PLL_AR5112;
- } else {
- mode = AR5K_AR5212_PHY_MODE_RAD_AR5111;
- clock = AR5K_AR5212_PHY_PLL_AR5111;
- }
-
- if (flags & IEEE80211_CHAN_2GHZ) {
- mode |= AR5K_AR5212_PHY_MODE_FREQ_2GHZ;
- clock |= AR5K_AR5212_PHY_PLL_44MHZ;
- } else if (flags & IEEE80211_CHAN_5GHZ) {
- mode |= AR5K_AR5212_PHY_MODE_FREQ_5GHZ;
- clock |= AR5K_AR5212_PHY_PLL_40MHZ;
- } else {
- AR5K_PRINT("invalid radio frequency mode\n");
- return (AH_FALSE);
- }
-
- if (flags & IEEE80211_CHAN_CCK) {
- mode |= AR5K_AR5212_PHY_MODE_MOD_CCK;
- } else if (flags & IEEE80211_CHAN_OFDM) {
- mode |= AR5K_AR5212_PHY_MODE_MOD_OFDM;
- } else if (flags & IEEE80211_CHAN_DYN) {
- mode |= AR5K_AR5212_PHY_MODE_MOD_DYN;
- } else {
- AR5K_PRINT("invalid radio frequency mode\n");
- return (AH_FALSE);
- }
-
- if (flags & IEEE80211_CHAN_TURBO) {
- turbo = AR5K_AR5212_PHY_TURBO_MODE |
- AR5K_AR5212_PHY_TURBO_SHORT;
- }
-
- /*
- * Reset and wakeup the device
- */
-
- /* ...reset chipset and PCI device */
- if (ar5k_ar5212_nic_reset(AR5K_AR5212_RC_CHIP | AR5K_AR5212_RC_PCI) ==
AH_FALSE) {
- AR5K_PRINT("failed to reset the AR5212 + PCI chipset\n");
- return (AH_FALSE);
- }
-
- /* ...wakeup */
- if (nic_setPowerMode(HAL_PM_AWAKE, AH_TRUE, 0) == AH_FALSE) {
- AR5K_PRINT("failed to resume the AR5212 (again)\n");
- return (AH_FALSE);
- }
-
- /* ...final warm reset */
- if (ar5k_ar5212_nic_reset(0) == AH_FALSE) {
- AR5K_PRINT("failed to warm reset the AR5212\n");
- return (AH_FALSE);
- }
-
- /* ...set the PHY operating mode */
- AR5K_REG_WRITE(AR5K_AR5212_PHY_PLL, clock);
- AR5K_DELAY(300);
-
- AR5K_REG_WRITE(AR5K_AR5212_PHY_MODE, mode);
- AR5K_REG_WRITE(AR5K_AR5212_PHY_TURBO, turbo);
-
- return (AH_TRUE);
-}
-
-u_int16_t OpenHAL5212::ar5k_ar5212_radio_revision(HAL_CHIP chip) {
- int i;
- u_int32_t srev;
- u_int16_t ret;
-
- /*
- * Set the radio chip access register
- */
- switch (chip) {
- case HAL_CHIP_2GHZ:
- AR5K_REG_WRITE(AR5K_AR5212_PHY(0), AR5K_AR5212_PHY_SHIFT_2GHZ);
- break;
- case HAL_CHIP_5GHZ:
- AR5K_REG_WRITE(AR5K_AR5212_PHY(0), AR5K_AR5212_PHY_SHIFT_5GHZ);
- break;
- default:
- return (0);
- }
-
- AR5K_DELAY(2000);
-
- /* ...wait until PHY is ready and read the selected radio revision */
- AR5K_REG_WRITE(AR5K_AR5212_PHY(0x34), 0x00001c16);
-
- for (i = 0; i < 8; i++)
- AR5K_REG_WRITE(AR5K_AR5212_PHY(0x20), 0x00010000);
- srev = (AR5K_REG_READ(AR5K_AR5212_PHY(0x100)) >> 24) & 0xff;
-
- ret = ar5k_bitswap(((srev & 0xf0) >> 4) | ((srev & 0x0f) << 4), 8);
-
- /* Reset to the 5GHz mode */
- AR5K_REG_WRITE(AR5K_AR5212_PHY(0), AR5K_AR5212_PHY_SHIFT_5GHZ);
-
- return (ret);
-}
-
HAL_BOOL OpenHAL5212::ar5k_ar5212_txpower(HAL_CHANNEL *channel, u_int txpower)
{
HAL_BOOL tpc = ah_txpower.txp_tpc;
int i;
@@ -1752,103 +1816,45 @@
#pragma mark -
-void OpenHAL5212::dumpState() {
-#define AR5K_PRINT_REGISTER(_x)
\
- IOLog("(%s: %08x) ", #_x, AR5K_REG_READ(AR5K_AR5212_##_x));\
- IOSleep(100);
+HAL_BOOL OpenHAL5212::nic_channel(HAL_CHANNEL *channel) {
+ u_int32_t data, data0, data1, data2;
+ u_int16_t c;
- IOLog("MAC registers:\n");
- AR5K_PRINT_REGISTER(CR);
- AR5K_PRINT_REGISTER(CFG);
- AR5K_PRINT_REGISTER(IER);
- AR5K_PRINT_REGISTER(TXCFG);
- AR5K_PRINT_REGISTER(RXCFG);
- AR5K_PRINT_REGISTER(MIBC);
- AR5K_PRINT_REGISTER(TOPS);
- AR5K_PRINT_REGISTER(RXNOFRM);
- AR5K_PRINT_REGISTER(RPGTO);
- AR5K_PRINT_REGISTER(RFCNT);
- AR5K_PRINT_REGISTER(MISC);
- AR5K_PRINT_REGISTER(PISR);
- AR5K_PRINT_REGISTER(SISR0);
- AR5K_PRINT_REGISTER(SISR1);
- AR5K_PRINT_REGISTER(SISR3);
- AR5K_PRINT_REGISTER(SISR4);
- AR5K_PRINT_REGISTER(DCM_ADDR);
- AR5K_PRINT_REGISTER(DCM_DATA);
- AR5K_PRINT_REGISTER(DCCFG);
- AR5K_PRINT_REGISTER(CCFG);
- AR5K_PRINT_REGISTER(CCFG_CUP);
- AR5K_PRINT_REGISTER(CPC0);
- AR5K_PRINT_REGISTER(CPC1);
- AR5K_PRINT_REGISTER(CPC2);
- AR5K_PRINT_REGISTER(CPCORN);
- AR5K_PRINT_REGISTER(QCU_TXE);
- AR5K_PRINT_REGISTER(QCU_TXD);
- AR5K_PRINT_REGISTER(DCU_GBL_IFS_SIFS);
- AR5K_PRINT_REGISTER(DCU_GBL_IFS_SLOT);
- AR5K_PRINT_REGISTER(DCU_FP);
- AR5K_PRINT_REGISTER(DCU_TXP);
- AR5K_PRINT_REGISTER(DCU_TX_FILTER);
- AR5K_PRINT_REGISTER(RC);
- AR5K_PRINT_REGISTER(SCR);
- AR5K_PRINT_REGISTER(INTPEND);
- AR5K_PRINT_REGISTER(PCICFG);
- AR5K_PRINT_REGISTER(GPIOCR);
- AR5K_PRINT_REGISTER(GPIODO);
- AR5K_PRINT_REGISTER(SREV);
- AR5K_PRINT_REGISTER(EEPROM_BASE);
- AR5K_PRINT_REGISTER(EEPROM_DATA);
- AR5K_PRINT_REGISTER(EEPROM_CMD);
- AR5K_PRINT_REGISTER(EEPROM_CFG);
- AR5K_PRINT_REGISTER(PCU_MIN);
- AR5K_PRINT_REGISTER(STA_ID0);
- AR5K_PRINT_REGISTER(STA_ID1);
- AR5K_PRINT_REGISTER(BSS_ID0);
- AR5K_PRINT_REGISTER(SLOT_TIME);
- AR5K_PRINT_REGISTER(TIME_OUT);
- AR5K_PRINT_REGISTER(RSSI_THR);
- AR5K_PRINT_REGISTER(BEACON);
- AR5K_PRINT_REGISTER(CFP_PERIOD);
- AR5K_PRINT_REGISTER(TIMER0);
- AR5K_PRINT_REGISTER(TIMER2);
- AR5K_PRINT_REGISTER(TIMER3);
- AR5K_PRINT_REGISTER(CFP_DUR);
- AR5K_PRINT_REGISTER(MCAST_FIL0);
- AR5K_PRINT_REGISTER(MCAST_FIL1);
- AR5K_PRINT_REGISTER(DIAG_SW);
- AR5K_PRINT_REGISTER(TSF_U32);
- AR5K_PRINT_REGISTER(ADDAC_TEST);
- AR5K_PRINT_REGISTER(DEFAULT_ANTENNA);
- AR5K_PRINT_REGISTER(LAST_TSTP);
- AR5K_PRINT_REGISTER(NAV);
- AR5K_PRINT_REGISTER(RTS_OK);
- AR5K_PRINT_REGISTER(ACK_FAIL);
- AR5K_PRINT_REGISTER(FCS_FAIL);
- AR5K_PRINT_REGISTER(BEACON_CNT);
- AR5K_PRINT_REGISTER(TSF_PARM);
- AR5K_PRINT_REGISTER(RATE_DUR_0);
- AR5K_PRINT_REGISTER(KEYTABLE_0);
- IOLog("\n");
+ data = data0 = data1 = data2 = 0;
+ c = channel->c_channel;
- IOLog("PHY registers:\n");
- AR5K_PRINT_REGISTER(PHY_TURBO);
- AR5K_PRINT_REGISTER(PHY_AGC);
- AR5K_PRINT_REGISTER(PHY_TIMING_3);
- AR5K_PRINT_REGISTER(PHY_CHIP_ID);
- AR5K_PRINT_REGISTER(PHY_AGCCTL);
- AR5K_PRINT_REGISTER(PHY_NF);
- AR5K_PRINT_REGISTER(PHY_SCR);
- AR5K_PRINT_REGISTER(PHY_SLMT);
- AR5K_PRINT_REGISTER(PHY_SCAL);
- AR5K_PRINT_REGISTER(PHY_RX_DELAY);
- AR5K_PRINT_REGISTER(PHY_IQ);
- AR5K_PRINT_REGISTER(PHY_PAPD_PROBE);
- AR5K_PRINT_REGISTER(PHY_TXPOWER_RATE1);
- AR5K_PRINT_REGISTER(PHY_TXPOWER_RATE2);
- AR5K_PRINT_REGISTER(PHY_FC);
- AR5K_PRINT_REGISTER(PHY_RADAR);
- AR5K_PRINT_REGISTER(PHY_ANT_SWITCH_TABLE_0);
- AR5K_PRINT_REGISTER(PHY_ANT_SWITCH_TABLE_1);
- IOLog("\n");
+ /*
+ * Set the channel on the AR5112 or newer
+ */
+ if (c < 4800) {
+ if (!((c - 2224) % 5)) {
+ data0 = ((2 * (c - 704)) - 3040) / 10;
+ data1 = 1;
+ } else if (!((c - 2192) % 5)) {
+ data0 = ((2 * (c - 672)) - 3040) / 10;
+ data1 = 0;
+ } else
+ return (AH_FALSE);
+
+ data0 = ar5k_bitswap((data0 << 2) & 0xff, 8);
+ } else {
+ if (!(c % 20) && c >= 5120) {
+ data0 = ar5k_bitswap(((c - 4800) / 20 << 2), 8);
+ data2 = ar5k_bitswap(3, 2);
+ } else if (!(c % 10)) {
+ data0 = ar5k_bitswap(((c - 4800) / 10 << 1), 8);
+ data2 = ar5k_bitswap(2, 2);
+ } else if (!(c % 5)) {
+ data0 = ar5k_bitswap((c - 4800) / 5, 8);
+ data2 = ar5k_bitswap(1, 2);
+ } else
+ return (AH_FALSE);
+ }
+
+ data = (data0 << 4) | (data1 << 1) | (data2 << 2) | 0x1001;
+
+ AR5K_PHY_WRITE(0x27, data & 0xff);
+ AR5K_PHY_WRITE(0x36, (data >> 8) & 0x7f);
+
+ return (AH_TRUE);
}
\ No newline at end of file
Other related posts:
- » [kismac] [binaervarianz] r117 - KisMACng/Subprojects/AtheroJack/OpenHAL