⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ar5212.c

📁 无线网卡驱动 固件程序 There are currently 3 "programming generations" of Atheros 802.11 wireless devices (
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -