📄 ar5212.c
字号:
AR5K_TRACE; bcopy(hal->ah_sta_id, mac, IEEE80211_ADDR_LEN);}HAL_BOOL /*O.K.*/ar5k_ar5212_set_lladdr(struct ath_hal *hal, const u_int8_t *mac){ u_int32_t low_id, high_id; AR5K_TRACE; /* Set new station ID */ bcopy(mac, hal->ah_sta_id, IEEE80211_ADDR_LEN); bcopy(mac, &low_id, 4); bcopy(mac + 4, &high_id, 2); high_id = 0x0000ffff & high_id; AR5K_REG_WRITE(AR5K_AR5212_STA_ID0, low_id); AR5K_REG_WRITE(AR5K_AR5212_STA_ID1, high_id); return (AH_TRUE);}HAL_BOOL /*O.K.*/ar5k_ar5212_set_regdomain(struct ath_hal *hal, u_int16_t regdomain, HAL_STATUS *status){ ieee80211_regdomain_t ieee_regdomain; ieee_regdomain = ar5k_regdomain_to_ieee(regdomain); if (ar5k_eeprom_regulation_domain(hal, AH_TRUE, &ieee_regdomain) == AH_TRUE) { *status = HAL_OK; return (AH_TRUE); } *status = HAL_EIO; return (AH_FALSE);}void /*O.K.*/ar5k_ar5212_set_ledstate(struct ath_hal *hal, HAL_LED_STATE state){ u_int32_t led; AR5K_TRACE; AR5K_REG_DISABLE_BITS(AR5K_AR5212_PCICFG, AR5K_AR5212_PCICFG_LEDMODE | AR5K_AR5212_PCICFG_LED); /* * Some blinking values, define at your wish */ switch (state) { case IEEE80211_S_SCAN: case IEEE80211_S_AUTH: led = AR5K_AR5212_PCICFG_LEDMODE_PROP | AR5K_AR5212_PCICFG_LED_PEND; break; case IEEE80211_S_INIT: led = AR5K_AR5212_PCICFG_LEDMODE_PROP | AR5K_AR5212_PCICFG_LED_NONE; break; case IEEE80211_S_ASSOC: case IEEE80211_S_RUN: led = AR5K_AR5212_PCICFG_LEDMODE_PROP | AR5K_AR5212_PCICFG_LED_ASSOC; break; default: led = AR5K_AR5212_PCICFG_LEDMODE_PROM | AR5K_AR5212_PCICFG_LED_NONE; break; } AR5K_REG_ENABLE_BITS(AR5K_AR5212_PCICFG, led);}void /*Removed argument trim_offset for combatibility -need revision*/ar5k_ar5212_set_associd(struct ath_hal *hal, const u_int8_t *bssid, u_int16_t assoc_id){ u_int32_t low_id, high_id; u_int16_t tim_offset = 0; /* * Set simple BSSID mask */ AR5K_REG_WRITE(AR5K_AR5212_BSS_IDM0, 0xfffffff); AR5K_REG_WRITE(AR5K_AR5212_BSS_IDM1, 0xfffffff); /* * Set BSSID which triggers the "SME Join" operation */ bcopy(bssid, &low_id, 4); bcopy(bssid + 4, &high_id, 2); AR5K_REG_WRITE(AR5K_AR5212_BSS_ID0, low_id); AR5K_REG_WRITE(AR5K_AR5212_BSS_ID1, high_id | ((assoc_id & 0x3fff) << AR5K_AR5212_BSS_ID1_AID_S)); bcopy(bssid, &hal->ah_bssid, IEEE80211_ADDR_LEN); if (assoc_id == 0) { ar5k_ar5212_disable_pspoll(hal); return; } AR5K_REG_WRITE(AR5K_AR5212_BEACON, (AR5K_REG_READ(AR5K_AR5212_BEACON) & ~AR5K_AR5212_BEACON_TIM) | (((tim_offset ? tim_offset + 4 : 0) << AR5K_AR5212_BEACON_TIM_S) & AR5K_AR5212_BEACON_TIM)); ar5k_ar5212_enable_pspoll(hal, NULL, 0);}HAL_BOOL /*O.K.*/ar5k_ar5212_set_gpio_output(struct ath_hal *hal, u_int32_t gpio){ AR5K_TRACE; if (gpio > AR5K_AR5212_NUM_GPIO) return (AH_FALSE); AR5K_REG_WRITE(AR5K_AR5212_GPIOCR, (AR5K_REG_READ(AR5K_AR5212_GPIOCR) &~ AR5K_AR5212_GPIOCR_ALL(gpio)) | AR5K_AR5212_GPIOCR_ALL(gpio)); return (AH_TRUE);}HAL_BOOL /*O.K.*/ar5k_ar5212_set_gpio_input(struct ath_hal *hal, u_int32_t gpio){ AR5K_TRACE; if (gpio > AR5K_AR5212_NUM_GPIO) return (AH_FALSE); AR5K_REG_WRITE(AR5K_AR5212_GPIOCR, (AR5K_REG_READ(AR5K_AR5212_GPIOCR) &~ AR5K_AR5212_GPIOCR_ALL(gpio)) | AR5K_AR5212_GPIOCR_NONE(gpio)); return (AH_TRUE);}u_int32_t /*O.K.*/ar5k_ar5212_get_gpio(struct ath_hal *hal, u_int32_t gpio){ AR5K_TRACE; if (gpio > AR5K_AR5212_NUM_GPIO) return (0xffffffff); /* GPIO input magic */ return (((AR5K_REG_READ(AR5K_AR5212_GPIODI) & AR5K_AR5212_GPIODI_M) >> gpio) & 0x1);}HAL_BOOL /*O.K.*/ar5k_ar5212_set_gpio(struct ath_hal *hal, u_int32_t gpio, u_int32_t val){ u_int32_t data; AR5K_TRACE; if (gpio > AR5K_AR5212_NUM_GPIO) return (0xffffffff); /* GPIO output magic */ data = AR5K_REG_READ(AR5K_AR5212_GPIODO); data &= ~(1 << gpio); data |= (val&1) << gpio; AR5K_REG_WRITE(AR5K_AR5212_GPIODO, data); return (AH_TRUE);}void /*O.K.*/ar5k_ar5212_set_gpio_intr(struct ath_hal *hal, u_int gpio, u_int32_t interrupt_level){ u_int32_t data; AR5K_TRACE; if (gpio > AR5K_AR5212_NUM_GPIO) return; /* * Set the GPIO interrupt */ data = (AR5K_REG_READ(AR5K_AR5212_GPIOCR) & ~(AR5K_AR5212_GPIOCR_INT_SEL(gpio) | AR5K_AR5212_GPIOCR_INT_SELH | AR5K_AR5212_GPIOCR_INT_ENA | AR5K_AR5212_GPIOCR_ALL(gpio))) | (AR5K_AR5212_GPIOCR_INT_SEL(gpio) | AR5K_AR5212_GPIOCR_INT_ENA); AR5K_REG_WRITE(AR5K_AR5212_GPIOCR, interrupt_level ? data : (data | AR5K_AR5212_GPIOCR_INT_SELH)); hal->ah_imr |= AR5K_AR5212_PIMR_GPIO; /* Enable GPIO interrupts */ AR5K_REG_ENABLE_BITS(AR5K_AR5212_PIMR, AR5K_AR5212_PIMR_GPIO);}u_int32_t /*O.K.*/ar5k_ar5212_get_tsf32(struct ath_hal *hal){ AR5K_TRACE; return (AR5K_REG_READ(AR5K_AR5212_TSF_L32));}u_int64_t /*O.K.*/ar5k_ar5212_get_tsf64(struct ath_hal *hal){ u_int64_t tsf = AR5K_REG_READ(AR5K_AR5212_TSF_U32); AR5K_TRACE; return (AR5K_REG_READ(AR5K_AR5212_TSF_L32) | (tsf << 32));}void /*O.K.*/ar5k_ar5212_reset_tsf(struct ath_hal *hal){ AR5K_TRACE; AR5K_REG_ENABLE_BITS(AR5K_AR5212_BEACON, AR5K_AR5212_BEACON_RESET_TSF);}u_int16_t /*O.K.*/ar5k_ar5212_get_regdomain(struct ath_hal *hal){ AR5K_TRACE; return (ar5k_get_regdomain(hal));}HAL_BOOL /*O.K.*/ar5k_ar5212_detect_card_present(struct ath_hal *hal){ u_int16_t magic; AR5K_TRACE; /* * Checking the EEPROM's magic value could be an indication * if the card is still present. I didn't find another suitable * way to do this. */ if (ar5k_ar5212_eeprom_read(hal, AR5K_EEPROM_MAGIC, &magic) != 0) return (AH_FALSE); return (magic == AR5K_EEPROM_MAGIC_VALUE ? AH_TRUE : AH_FALSE);}void /*O.K.*/ar5k_ar5212_update_mib_counters(struct ath_hal *hal, HAL_MIB_STATS *statistics){ AR5K_TRACE; /* Read-And-Clear */ statistics->ackrcv_bad += AR5K_REG_READ(AR5K_AR5212_ACK_FAIL); statistics->rts_bad += AR5K_REG_READ(AR5K_AR5212_RTS_FAIL); statistics->rts_good += AR5K_REG_READ(AR5K_AR5212_RTS_OK); statistics->fcs_bad += AR5K_REG_READ(AR5K_AR5212_FCS_FAIL); statistics->beacons += AR5K_REG_READ(AR5K_AR5212_BEACON_CNT); /* Reset profile count registers */ AR5K_REG_WRITE(AR5K_AR5212_PROFCNT_TX, 0); AR5K_REG_WRITE(AR5K_AR5212_PROFCNT_RX, 0); AR5K_REG_WRITE(AR5K_AR5212_PROFCNT_RXCLR, 0); AR5K_REG_WRITE(AR5K_AR5212_PROFCNT_CYCLE, 0);}void /*Unimplemented*/ar5k_ar5212_proc_mib_event(struct ath_hal *hal, const HAL_NODE_STATS *stats) { AR5K_TRACE; return;}HAL_RFGAIN /*O.K.*/ar5k_ar5212_get_rf_gain(struct ath_hal *hal){ u_int32_t data, type; AR5K_TRACE; if ((hal->ah_rf_banks == NULL) || (!hal->ah_gain.g_active)) return (HAL_RFGAIN_INACTIVE); if (hal->ah_rf_gain != HAL_RFGAIN_READ_REQUESTED) goto done; data = AR5K_REG_READ(AR5K_AR5212_PHY_PAPD_PROBE); if (!(data & AR5K_AR5212_PHY_PAPD_PROBE_TX_NEXT)) { hal->ah_gain.g_current = data >> AR5K_AR5212_PHY_PAPD_PROBE_GAINF_S; type = AR5K_REG_MS(data, AR5K_AR5212_PHY_PAPD_PROBE_TYPE); if (type == AR5K_AR5212_PHY_PAPD_PROBE_TYPE_CCK) hal->ah_gain.g_current += AR5K_GAIN_CCK_PROBE_CORR; if (hal->ah_radio == AR5K_AR5112) { ar5k_rfregs_gainf_corr(hal); hal->ah_gain.g_current = hal->ah_gain.g_current >= hal->ah_gain.g_f_corr ? (hal->ah_gain.g_current - hal->ah_gain.g_f_corr) : 0; } if (ar5k_rfregs_gain_readback(hal) && AR5K_GAIN_CHECK_ADJUST(&hal->ah_gain) && ar5k_rfregs_gain_adjust(hal)) hal->ah_rf_gain = HAL_RFGAIN_NEED_CHANGE; } done: return (hal->ah_rf_gain);}HAL_BOOL /*O.K.*/ar5k_ar5212_set_slot_time(struct ath_hal *hal, u_int slot_time){ AR5K_TRACE; if (slot_time < HAL_SLOT_TIME_9 || slot_time > HAL_SLOT_TIME_MAX) return (AH_FALSE); AR5K_REG_WRITE(AR5K_AR5212_DCU_GBL_IFS_SLOT, slot_time); return (AH_TRUE);}u_int /*O.K.*/ar5k_ar5212_get_slot_time(struct ath_hal *hal){ AR5K_TRACE; return (AR5K_REG_READ(AR5K_AR5212_DCU_GBL_IFS_SLOT) & 0xffff);}HAL_BOOL /*O.K.*/ar5k_ar5212_set_ack_timeout(struct ath_hal *hal, u_int timeout){ AR5K_TRACE; if (ar5k_clocktoh(AR5K_REG_MS(0xffffffff, AR5K_AR5212_TIME_OUT_ACK), hal->ah_turbo) <= timeout) return (AH_FALSE); AR5K_REG_WRITE_BITS(AR5K_AR5212_TIME_OUT, AR5K_AR5212_TIME_OUT_ACK, ar5k_htoclock(timeout, hal->ah_turbo)); return (AH_TRUE);}u_int /*O.K.*/ar5k_ar5212_get_ack_timeout(struct ath_hal *hal){ AR5K_TRACE; return (ar5k_clocktoh(AR5K_REG_MS(AR5K_REG_READ(AR5K_AR5212_TIME_OUT), AR5K_AR5212_TIME_OUT_ACK), hal->ah_turbo));}HAL_BOOL /*O.K.*/ar5k_ar5212_set_cts_timeout(struct ath_hal *hal, u_int timeout){ AR5K_TRACE; if (ar5k_clocktoh(AR5K_REG_MS(0xffffffff, AR5K_AR5212_TIME_OUT_CTS), hal->ah_turbo) <= timeout) return (AH_FALSE); AR5K_REG_WRITE_BITS(AR5K_AR5212_TIME_OUT, AR5K_AR5212_TIME_OUT_CTS, ar5k_htoclock(timeout, hal->ah_turbo)); return (AH_TRUE);}u_int /*O.K.*/ar5k_ar5212_get_cts_timeout(struct ath_hal *hal){ AR5K_TRACE; return (ar5k_clocktoh(AR5K_REG_MS(AR5K_REG_READ(AR5K_AR5212_TIME_OUT), AR5K_AR5212_TIME_OUT_CTS), hal->ah_turbo));}HAL_STATUS /*New*/ar5k_ar5212_get_capability(struct ath_hal *hal, HAL_CAPABILITY_TYPE cap_type, u_int32_t capability, u_int32_t *result) { AR5K_TRACE; switch (cap_type) { case HAL_CAP_REG_DMN: if (result){ *result = ar5k_get_regdomain(hal); goto yes; } case HAL_CAP_CIPHER: switch (capability) { case HAL_CIPHER_WEP: goto yes; default: goto no; } case HAL_CAP_NUM_TXQUEUES: if (result) { *result = AR5K_AR5212_TX_NUM_QUEUES; goto yes; } case HAL_CAP_VEOL: goto yes; case HAL_CAP_PSPOLL: goto no; case HAL_CAP_COMPRESSION: goto yes; case HAL_CAP_BURST: goto yes; case HAL_CAP_TPC: goto yes; case HAL_CAP_BSSIDMASK: goto yes; case HAL_CAP_XR: goto yes; default: goto no; } no: return (HAL_EINVAL); yes: return HAL_OK; }HAL_BOOLar5k_ar5212_set_capability(struct ath_hal *hal, HAL_CAPABILITY_TYPE cap_type, u_int32_t capability, u_int32_t setting, HAL_STATUS *status) { AR5K_TRACE; if (status) { *status = HAL_OK; } return (AH_FALSE);}/* * Key table (WEP) functions */HAL_BOOL /*O.K.*/ar5k_ar5212_is_cipher_supported(struct ath_hal *hal, HAL_CIPHER cipher){ AR5K_TRACE; /* * The AR5212 only supports WEP */ if (cipher == HAL_CIPHER_WEP) return (AH_TRUE); return (AH_FALSE);}u_int32_t /*O.K.*/ar5k_ar5212_get_keycache_size(struct ath_hal *hal){ AR5K_TRACE; return (AR5K_AR5212_KEYCACHE_SIZE);}HAL_BOOL /*O.K.*/ar5k_ar5212_reset_key(struct ath_hal *hal, u_int16_t entry){ int i; AR5K_TRACE; AR5K_ASSERT_ENTRY(entry, AR5K_AR5212_KEYTABLE_SIZE); for (i = 0; i < AR5K_AR5212_KEYCACHE_SIZE; i++) AR5K_REG_WRITE(AR5K_AR5212_KEYTABLE_OFF(entry, i), 0); /* Set NULL encryption */ AR5K_REG_WRITE(AR5K_AR5212_KEYTABLE_TYPE(entry), AR5K_AR5212_KEYTABLE_TYPE_NULL); return (AH_FALSE);}HAL_BOOL /*O.K.*/ar5k_ar5212_is_key_valid(struct ath_hal *hal, u_int16_t entry){ AR5K_TRACE; AR5K_ASSERT_ENTRY(entry, AR5K_AR5212_KEYTABLE_SIZE); /* * Check the validation flag at the end of the entry */ if (AR5K_REG_READ(AR5K_AR5212_KEYTAB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -