📄 ar5211.c
字号:
AR5K_PRINT_REGISTER(IER); AR5K_PRINT_REGISTER(RTSD0); AR5K_PRINT_REGISTER(TXCFG); AR5K_PRINT_REGISTER(RXCFG); AR5K_PRINT_REGISTER(RXJLA); 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(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(KEYTABLE_0); printf("\n"); printf("PHY registers:\n"); AR5K_PRINT_REGISTER(PHY_TURBO); AR5K_PRINT_REGISTER(PHY_AGC); AR5K_PRINT_REGISTER(PHY_CHIP_ID); AR5K_PRINT_REGISTER(PHY_AGCCTL); AR5K_PRINT_REGISTER(PHY_NF); AR5K_PRINT_REGISTER(PHY_RX_DELAY); AR5K_PRINT_REGISTER(PHY_IQ); AR5K_PRINT_REGISTER(PHY_PAPD_PROBE); 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); printf("\n");#endif}HAL_BOOL /*Added arguments*/ar5k_ar5211_get_diag_state(struct ath_hal *hal, int request, const void *args, u_int32_t argsize, void **result, u_int32_t *resultsize){ /* * We'll ignore this right now. This seems to be some kind of an obscure * debugging interface for the binary-only HAL. */ return (AH_FALSE);}voidar5k_ar5211_get_lladdr(struct ath_hal *hal, u_int8_t *mac){ bcopy(hal->ah_sta_id, mac, IEEE80211_ADDR_LEN);}HAL_BOOLar5k_ar5211_set_lladdr(struct ath_hal *hal, const u_int8_t *mac){ u_int32_t low_id, high_id; /* 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_AR5211_STA_ID0, low_id); AR5K_REG_WRITE(AR5K_AR5211_STA_ID1, high_id); return (AH_TRUE);}HAL_BOOLar5k_ar5211_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 = EIO; return (AH_FALSE);}voidar5k_ar5211_set_ledstate(struct ath_hal *hal, HAL_LED_STATE state){ u_int32_t led; AR5K_REG_DISABLE_BITS(AR5K_AR5211_PCICFG, AR5K_AR5211_PCICFG_LEDMODE | AR5K_AR5211_PCICFG_LED); /* * Some blinking values, define at your wish */ switch (state) { case IEEE80211_S_SCAN: case IEEE80211_S_AUTH: led = AR5K_AR5211_PCICFG_LEDMODE_PROP | AR5K_AR5211_PCICFG_LED_PEND; break; case IEEE80211_S_INIT: led = AR5K_AR5211_PCICFG_LEDMODE_PROP | AR5K_AR5211_PCICFG_LED_NONE; break; case IEEE80211_S_ASSOC: case IEEE80211_S_RUN: led = AR5K_AR5211_PCICFG_LEDMODE_PROP | AR5K_AR5211_PCICFG_LED_ASSOC; break; default: led = AR5K_AR5211_PCICFG_LEDMODE_PROM | AR5K_AR5211_PCICFG_LED_NONE; break; } AR5K_REG_ENABLE_BITS(AR5K_AR5211_PCICFG, led);}void /*Removed argument trim_offset for combatibility -need revision*/ar5k_ar5211_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 BSSID which triggers the "SME Join" operation */ bcopy(bssid, &low_id, 4); bcopy(bssid + 4, &high_id, 2); AR5K_REG_WRITE(AR5K_AR5211_BSS_ID0, low_id); AR5K_REG_WRITE(AR5K_AR5211_BSS_ID1, high_id | ((assoc_id & 0x3fff) << AR5K_AR5211_BSS_ID1_AID_S)); bcopy(bssid, hal->ah_bssid, IEEE80211_ADDR_LEN); if (assoc_id == 0) { ar5k_ar5211_disable_pspoll(hal); return; } AR5K_REG_WRITE(AR5K_AR5211_BEACON, (AR5K_REG_READ(AR5K_AR5211_BEACON) & ~AR5K_AR5211_BEACON_TIM) | (((tim_offset ? tim_offset + 4 : 0) << AR5K_AR5211_BEACON_TIM_S) & AR5K_AR5211_BEACON_TIM)); ar5k_ar5211_enable_pspoll(hal, NULL, 0);}HAL_BOOLar5k_ar5211_set_gpio_output(struct ath_hal *hal, u_int32_t gpio){ if (gpio > AR5K_AR5211_NUM_GPIO) return (AH_FALSE); AR5K_REG_WRITE(AR5K_AR5211_GPIOCR, (AR5K_REG_READ(AR5K_AR5211_GPIOCR) &~ AR5K_AR5211_GPIOCR_ALL(gpio)) | AR5K_AR5211_GPIOCR_ALL(gpio)); return (AH_TRUE);}HAL_BOOLar5k_ar5211_set_gpio_input(struct ath_hal *hal, u_int32_t gpio){ if (gpio > AR5K_AR5211_NUM_GPIO) return (AH_FALSE); AR5K_REG_WRITE(AR5K_AR5211_GPIOCR, (AR5K_REG_READ(AR5K_AR5211_GPIOCR) &~ AR5K_AR5211_GPIOCR_ALL(gpio)) | AR5K_AR5211_GPIOCR_NONE(gpio)); return (AH_TRUE);}u_int32_tar5k_ar5211_get_gpio(struct ath_hal *hal, u_int32_t gpio){ if (gpio > AR5K_AR5211_NUM_GPIO) return (0xffffffff); /* GPIO input magic */ return (((AR5K_REG_READ(AR5K_AR5211_GPIODI) & AR5K_AR5211_GPIODI_M) >> gpio) & 0x1);}HAL_BOOLar5k_ar5211_set_gpio(struct ath_hal *hal, u_int32_t gpio, u_int32_t val){ u_int32_t data; if (gpio > AR5K_AR5211_NUM_GPIO) return (0xffffffff); /* GPIO output magic */ data = AR5K_REG_READ(AR5K_AR5211_GPIODO); data &= ~(1 << gpio); data |= (val&1) << gpio; AR5K_REG_WRITE(AR5K_AR5211_GPIODO, data); return (AH_TRUE);}voidar5k_ar5211_set_gpio_intr(struct ath_hal *hal, u_int gpio, u_int32_t interrupt_level){ u_int32_t data; if (gpio > AR5K_AR5211_NUM_GPIO) return; /* * Set the GPIO interrupt */ data = (AR5K_REG_READ(AR5K_AR5211_GPIOCR) & ~(AR5K_AR5211_GPIOCR_INT_SEL(gpio) | AR5K_AR5211_GPIOCR_INT_SELH | AR5K_AR5211_GPIOCR_INT_ENA | AR5K_AR5211_GPIOCR_ALL(gpio))) | (AR5K_AR5211_GPIOCR_INT_SEL(gpio) | AR5K_AR5211_GPIOCR_INT_ENA); AR5K_REG_WRITE(AR5K_AR5211_GPIOCR, interrupt_level ? data : (data | AR5K_AR5211_GPIOCR_INT_SELH)); hal->ah_imr |= AR5K_AR5211_PIMR_GPIO; /* Enable GPIO interrupts */ AR5K_REG_ENABLE_BITS(AR5K_AR5211_PIMR, AR5K_AR5211_PIMR_GPIO);}u_int32_tar5k_ar5211_get_tsf32(struct ath_hal *hal){ return (AR5K_REG_READ(AR5K_AR5211_TSF_L32));}u_int64_tar5k_ar5211_get_tsf64(struct ath_hal *hal){ u_int64_t tsf = AR5K_REG_READ(AR5K_AR5211_TSF_U32); return (AR5K_REG_READ(AR5K_AR5211_TSF_L32) | (tsf << 32));}voidar5k_ar5211_reset_tsf(struct ath_hal *hal){ AR5K_REG_ENABLE_BITS(AR5K_AR5211_BEACON, AR5K_AR5211_BEACON_RESET_TSF);}u_int16_tar5k_ar5211_get_regdomain(struct ath_hal *hal){ return (ar5k_get_regdomain(hal));}HAL_BOOLar5k_ar5211_detect_card_present(struct ath_hal *hal){ u_int16_t magic; /* * 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_ar5211_eeprom_read(hal, AR5K_EEPROM_MAGIC, &magic) != 0) return (AH_FALSE); return (magic == AR5K_EEPROM_MAGIC_VALUE ? AH_TRUE : AH_FALSE);}voidar5k_ar5211_update_mib_counters(struct ath_hal *hal, HAL_MIB_STATS *statistics){ statistics->ackrcv_bad += AR5K_REG_READ(AR5K_AR5211_ACK_FAIL); statistics->rts_bad += AR5K_REG_READ(AR5K_AR5211_RTS_FAIL); statistics->rts_good += AR5K_REG_READ(AR5K_AR5211_RTS_OK); statistics->fcs_bad += AR5K_REG_READ(AR5K_AR5211_FCS_FAIL); statistics->beacons += AR5K_REG_READ(AR5K_AR5211_BEACON_CNT);}void /*Unimplemented*/ar5k_ar5211_proc_mib_event(struct ath_hal *hal, const HAL_NODE_STATS *stats) { AR5K_TRACE; return;}HAL_RFGAINar5k_ar5211_get_rf_gain(struct ath_hal *hal){ return (HAL_RFGAIN_INACTIVE);}HAL_BOOLar5k_ar5211_set_slot_time(struct ath_hal *hal, u_int slot_time){ if (slot_time < HAL_SLOT_TIME_9 || slot_time > HAL_SLOT_TIME_MAX) return (AH_FALSE); AR5K_REG_WRITE(AR5K_AR5211_DCU_GBL_IFS_SLOT, slot_time); return (AH_TRUE);}u_intar5k_ar5211_get_slot_time(struct ath_hal *hal){ return (AR5K_REG_READ(AR5K_AR5211_DCU_GBL_IFS_SLOT) & 0xffff);}HAL_BOOLar5k_ar5211_set_ack_timeout(struct ath_hal *hal, u_int timeout){ if (ar5k_clocktoh(AR5K_REG_MS(0xffffffff, AR5K_AR5211_TIME_OUT_ACK), hal->ah_turbo) <= timeout) return (AH_FALSE); AR5K_REG_WRITE_BITS(AR5K_AR5211_TIME_OUT, AR5K_AR5211_TIME_OUT_ACK, ar5k_htoclock(timeout, hal->ah_turbo)); return (AH_TRUE);}u_intar5k_ar5211_get_ack_timeout(struct ath_hal *hal){ return (ar5k_clocktoh(AR5K_REG_MS(AR5K_REG_READ(AR5K_AR5211_TIME_OUT), AR5K_AR5211_TIME_OUT_ACK), hal->ah_turbo));}HAL_BOOLar5k_ar5211_set_cts_timeout(struct ath_hal *hal, u_int timeout){ if (ar5k_clocktoh(AR5K_REG_MS(0xffffffff, AR5K_AR5211_TIME_OUT_CTS), hal->ah_turbo) <= timeout) return (AH_FALSE); AR5K_REG_WRITE_BITS(AR5K_AR5211_TIME_OUT, AR5K_AR5211_TIME_OUT_CTS, ar5k_htoclock(timeout, hal->ah_turbo)); return (AH_TRUE);}u_intar5k_ar5211_get_cts_timeout(struct ath_hal *hal){ return (ar5k_clocktoh(AR5K_REG_MS(AR5K_REG_READ(AR5K_AR5211_TIME_OUT), AR5K_AR5211_TIME_OUT_CTS), hal->ah_turbo));}HAL_STATUS /*New*/ar5k_ar5211_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_AR5211_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_ar5211_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_BOOLar5k_ar5211_is_cipher_supported(struct ath_hal *hal, HAL_CIPHER cipher){ /* * The AR5211 only supports WEP */ if (cipher == HAL_CIPHER_WEP) return (AH_TRUE); return (AH_FALSE);}u_int32_tar5k_ar5211_get_keycache_size(struct ath_hal *hal){ return (AR5K_AR5211_KEYCACHE_SIZE);}HAL_BOOLar5k_ar5211_reset_key(struct ath_hal *hal, u_int16_t entry){ int i; AR5K_ASSERT_ENTRY(entry, AR5K_AR5211_KEYTABLE_SIZE); for (i = 0; i < AR5K_AR5211_KEYCACHE_SIZE; i++) AR5K_REG_WRITE(AR5K_AR5211_KEYTABLE_OFF(entry, i), 0); return (AH_FALSE);}HAL_BOOLar5k_ar5211_is_key_valid(struct ath_hal *hal, u_int16_t entry){ AR5K_ASSERT_ENTRY(entry, AR5K_AR5211_KEYTABLE_SIZE); /* * Check the validation flag at the end of the entry */ if (AR5K_REG_READ(AR5K_AR5211_KEYTABLE_MAC1(entry)) &
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -