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

📄 rt2500usb.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 4 页
字号:
	rt2500usb_register_write(rt2x00dev, PHY_CSR5, csr5);	rt2500usb_register_write(rt2x00dev, PHY_CSR6, csr6);}static void rt2500usb_config_duration(struct rt2x00_dev *rt2x00dev,				      struct rt2x00lib_conf *libconf){	u16 reg;	rt2500usb_register_write(rt2x00dev, MAC_CSR10, libconf->slot_time);	rt2500usb_register_read(rt2x00dev, TXRX_CSR18, &reg);	rt2x00_set_field16(&reg, TXRX_CSR18_INTERVAL,			   libconf->conf->beacon_int * 4);	rt2500usb_register_write(rt2x00dev, TXRX_CSR18, reg);}static void rt2500usb_config(struct rt2x00_dev *rt2x00dev,			     const unsigned int flags,			     struct rt2x00lib_conf *libconf){	if (flags & CONFIG_UPDATE_PHYMODE)		rt2500usb_config_phymode(rt2x00dev, libconf->phymode,					 libconf->basic_rates);	if (flags & CONFIG_UPDATE_CHANNEL)		rt2500usb_config_channel(rt2x00dev, &libconf->rf,					 libconf->conf->power_level);	if ((flags & CONFIG_UPDATE_TXPOWER) && !(flags & CONFIG_UPDATE_CHANNEL))		rt2500usb_config_txpower(rt2x00dev,					 libconf->conf->power_level);	if (flags & CONFIG_UPDATE_ANTENNA)		rt2500usb_config_antenna(rt2x00dev,					 libconf->conf->antenna_sel_tx,					 libconf->conf->antenna_sel_rx);	if (flags & (CONFIG_UPDATE_SLOT_TIME | CONFIG_UPDATE_BEACON_INT))		rt2500usb_config_duration(rt2x00dev, libconf);}/* * LED functions. */static void rt2500usb_enable_led(struct rt2x00_dev *rt2x00dev){	u16 reg;	rt2500usb_register_read(rt2x00dev, MAC_CSR21, &reg);	rt2x00_set_field16(&reg, MAC_CSR21_ON_PERIOD, 70);	rt2x00_set_field16(&reg, MAC_CSR21_OFF_PERIOD, 30);	rt2500usb_register_write(rt2x00dev, MAC_CSR21, reg);	rt2500usb_register_read(rt2x00dev, MAC_CSR20, &reg);	if (rt2x00dev->led_mode == LED_MODE_TXRX_ACTIVITY) {		rt2x00_set_field16(&reg, MAC_CSR20_LINK, 1);		rt2x00_set_field16(&reg, MAC_CSR20_ACTIVITY, 0);	} else if (rt2x00dev->led_mode == LED_MODE_ASUS) {		rt2x00_set_field16(&reg, MAC_CSR20_LINK, 0);		rt2x00_set_field16(&reg, MAC_CSR20_ACTIVITY, 1);	} else {		rt2x00_set_field16(&reg, MAC_CSR20_LINK, 1);		rt2x00_set_field16(&reg, MAC_CSR20_ACTIVITY, 1);	}	rt2500usb_register_write(rt2x00dev, MAC_CSR20, reg);}static void rt2500usb_disable_led(struct rt2x00_dev *rt2x00dev){	u16 reg;	rt2500usb_register_read(rt2x00dev, MAC_CSR20, &reg);	rt2x00_set_field16(&reg, MAC_CSR20_LINK, 0);	rt2x00_set_field16(&reg, MAC_CSR20_ACTIVITY, 0);	rt2500usb_register_write(rt2x00dev, MAC_CSR20, reg);}/* * Link tuning */static void rt2500usb_link_stats(struct rt2x00_dev *rt2x00dev){	u16 reg;	/*	 * Update FCS error count from register.	 */	rt2500usb_register_read(rt2x00dev, STA_CSR0, &reg);	rt2x00dev->link.rx_failed = rt2x00_get_field16(reg, STA_CSR0_FCS_ERROR);	/*	 * Update False CCA count from register.	 */	rt2500usb_register_read(rt2x00dev, STA_CSR3, &reg);	rt2x00dev->link.false_cca =	    rt2x00_get_field16(reg, STA_CSR3_FALSE_CCA_ERROR);}static void rt2500usb_reset_tuner(struct rt2x00_dev *rt2x00dev){	u16 eeprom;	u16 value;	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R24, &eeprom);	value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_R24_LOW);	rt2500usb_bbp_write(rt2x00dev, 24, value);	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R25, &eeprom);	value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_R25_LOW);	rt2500usb_bbp_write(rt2x00dev, 25, value);	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R61, &eeprom);	value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_R61_LOW);	rt2500usb_bbp_write(rt2x00dev, 61, value);	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_VGC, &eeprom);	value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_VGCUPPER);	rt2500usb_bbp_write(rt2x00dev, 17, value);	rt2x00dev->link.vgc_level = value;}static void rt2500usb_link_tuner(struct rt2x00_dev *rt2x00dev){	int rssi = rt2x00_get_link_rssi(&rt2x00dev->link);	u16 bbp_thresh;	u16 vgc_bound;	u16 sens;	u16 r24;	u16 r25;	u16 r61;	u16 r17_sens;	u8 r17;	u8 up_bound;	u8 low_bound;	/*	 * Determine the BBP tuning threshold and correctly	 * set BBP 24, 25 and 61.	 */	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE, &bbp_thresh);	bbp_thresh = rt2x00_get_field16(bbp_thresh, EEPROM_BBPTUNE_THRESHOLD);	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R24, &r24);	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R25, &r25);	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R61, &r61);	if ((rssi + bbp_thresh) > 0) {		r24 = rt2x00_get_field16(r24, EEPROM_BBPTUNE_R24_HIGH);		r25 = rt2x00_get_field16(r25, EEPROM_BBPTUNE_R25_HIGH);		r61 = rt2x00_get_field16(r61, EEPROM_BBPTUNE_R61_HIGH);	} else {		r24 = rt2x00_get_field16(r24, EEPROM_BBPTUNE_R24_LOW);		r25 = rt2x00_get_field16(r25, EEPROM_BBPTUNE_R25_LOW);		r61 = rt2x00_get_field16(r61, EEPROM_BBPTUNE_R61_LOW);	}	rt2500usb_bbp_write(rt2x00dev, 24, r24);	rt2500usb_bbp_write(rt2x00dev, 25, r25);	rt2500usb_bbp_write(rt2x00dev, 61, r61);	/*	 * Read current r17 value, as well as the sensitivity values	 * for the r17 register.	 */	rt2500usb_bbp_read(rt2x00dev, 17, &r17);	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R17, &r17_sens);	/*	 * A too low RSSI will cause too much false CCA which will	 * then corrupt the R17 tuning. To remidy this the tuning should	 * be stopped (While making sure the R17 value will not exceed limits)	 */	if (rssi >= -40) {		if (r17 != 0x60)			rt2500usb_bbp_write(rt2x00dev, 17, 0x60);		return;	}	/*	 * Special big-R17 for short distance	 */	if (rssi >= -58) {		sens = rt2x00_get_field16(r17_sens, EEPROM_BBPTUNE_R17_LOW);		if (r17 != sens)			rt2500usb_bbp_write(rt2x00dev, 17, sens);		return;	}	/*	 * Special mid-R17 for middle distance	 */	if (rssi >= -74) {		sens = rt2x00_get_field16(r17_sens, EEPROM_BBPTUNE_R17_HIGH);		if (r17 != sens)			rt2500usb_bbp_write(rt2x00dev, 17, sens);		return;	}	/*	 * Leave short or middle distance condition, restore r17	 * to the dynamic tuning range.	 */	rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_VGC, &vgc_bound);	vgc_bound = rt2x00_get_field16(vgc_bound, EEPROM_BBPTUNE_VGCUPPER);	low_bound = 0x32;	if (rssi >= -77)		up_bound = vgc_bound;	else		up_bound = vgc_bound - (-77 - rssi);	if (up_bound < low_bound)		up_bound = low_bound;	if (r17 > up_bound) {		rt2500usb_bbp_write(rt2x00dev, 17, up_bound);		rt2x00dev->link.vgc_level = up_bound;	} else if (rt2x00dev->link.false_cca > 512 && r17 < up_bound) {		rt2500usb_bbp_write(rt2x00dev, 17, ++r17);		rt2x00dev->link.vgc_level = r17;	} else if (rt2x00dev->link.false_cca < 100 && r17 > low_bound) {		rt2500usb_bbp_write(rt2x00dev, 17, --r17);		rt2x00dev->link.vgc_level = r17;	}}/* * Initialization functions. */static int rt2500usb_init_registers(struct rt2x00_dev *rt2x00dev){	u16 reg;	rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0x0001,				    USB_MODE_TEST, REGISTER_TIMEOUT);	rt2x00usb_vendor_request_sw(rt2x00dev, USB_SINGLE_WRITE, 0x0308,				    0x00f0, REGISTER_TIMEOUT);	rt2500usb_register_read(rt2x00dev, TXRX_CSR2, &reg);	rt2x00_set_field16(&reg, TXRX_CSR2_DISABLE_RX, 1);	rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg);	rt2500usb_register_write(rt2x00dev, MAC_CSR13, 0x1111);	rt2500usb_register_write(rt2x00dev, MAC_CSR14, 0x1e11);	rt2500usb_register_read(rt2x00dev, MAC_CSR1, &reg);	rt2x00_set_field16(&reg, MAC_CSR1_SOFT_RESET, 1);	rt2x00_set_field16(&reg, MAC_CSR1_BBP_RESET, 1);	rt2x00_set_field16(&reg, MAC_CSR1_HOST_READY, 0);	rt2500usb_register_write(rt2x00dev, MAC_CSR1, reg);	rt2500usb_register_read(rt2x00dev, MAC_CSR1, &reg);	rt2x00_set_field16(&reg, MAC_CSR1_SOFT_RESET, 0);	rt2x00_set_field16(&reg, MAC_CSR1_BBP_RESET, 0);	rt2x00_set_field16(&reg, MAC_CSR1_HOST_READY, 0);	rt2500usb_register_write(rt2x00dev, MAC_CSR1, reg);	rt2500usb_register_read(rt2x00dev, TXRX_CSR5, &reg);	rt2x00_set_field16(&reg, TXRX_CSR5_BBP_ID0, 13);	rt2x00_set_field16(&reg, TXRX_CSR5_BBP_ID0_VALID, 1);	rt2x00_set_field16(&reg, TXRX_CSR5_BBP_ID1, 12);	rt2x00_set_field16(&reg, TXRX_CSR5_BBP_ID1_VALID, 1);	rt2500usb_register_write(rt2x00dev, TXRX_CSR5, reg);	rt2500usb_register_read(rt2x00dev, TXRX_CSR6, &reg);	rt2x00_set_field16(&reg, TXRX_CSR6_BBP_ID0, 10);	rt2x00_set_field16(&reg, TXRX_CSR6_BBP_ID0_VALID, 1);	rt2x00_set_field16(&reg, TXRX_CSR6_BBP_ID1, 11);	rt2x00_set_field16(&reg, TXRX_CSR6_BBP_ID1_VALID, 1);	rt2500usb_register_write(rt2x00dev, TXRX_CSR6, reg);	rt2500usb_register_read(rt2x00dev, TXRX_CSR7, &reg);	rt2x00_set_field16(&reg, TXRX_CSR7_BBP_ID0, 7);	rt2x00_set_field16(&reg, TXRX_CSR7_BBP_ID0_VALID, 1);	rt2x00_set_field16(&reg, TXRX_CSR7_BBP_ID1, 6);	rt2x00_set_field16(&reg, TXRX_CSR7_BBP_ID1_VALID, 1);	rt2500usb_register_write(rt2x00dev, TXRX_CSR7, reg);	rt2500usb_register_read(rt2x00dev, TXRX_CSR8, &reg);	rt2x00_set_field16(&reg, TXRX_CSR8_BBP_ID0, 5);	rt2x00_set_field16(&reg, TXRX_CSR8_BBP_ID0_VALID, 1);	rt2x00_set_field16(&reg, TXRX_CSR8_BBP_ID1, 0);	rt2x00_set_field16(&reg, TXRX_CSR8_BBP_ID1_VALID, 0);	rt2500usb_register_write(rt2x00dev, TXRX_CSR8, reg);	rt2500usb_register_write(rt2x00dev, TXRX_CSR21, 0xe78f);	rt2500usb_register_write(rt2x00dev, MAC_CSR9, 0xff1d);	if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE))		return -EBUSY;	rt2500usb_register_read(rt2x00dev, MAC_CSR1, &reg);	rt2x00_set_field16(&reg, MAC_CSR1_SOFT_RESET, 0);	rt2x00_set_field16(&reg, MAC_CSR1_BBP_RESET, 0);	rt2x00_set_field16(&reg, MAC_CSR1_HOST_READY, 1);	rt2500usb_register_write(rt2x00dev, MAC_CSR1, reg);	if (rt2x00_rev(&rt2x00dev->chip) >= RT2570_VERSION_C) {		rt2500usb_register_read(rt2x00dev, PHY_CSR2, &reg);		reg &= ~0x0002;	} else {		reg = 0x3002;	}	rt2500usb_register_write(rt2x00dev, PHY_CSR2, reg);	rt2500usb_register_write(rt2x00dev, MAC_CSR11, 0x0002);	rt2500usb_register_write(rt2x00dev, MAC_CSR22, 0x0053);	rt2500usb_register_write(rt2x00dev, MAC_CSR15, 0x01ee);	rt2500usb_register_write(rt2x00dev, MAC_CSR16, 0x0000);	rt2500usb_register_read(rt2x00dev, MAC_CSR8, &reg);	rt2x00_set_field16(&reg, MAC_CSR8_MAX_FRAME_UNIT,			   rt2x00dev->rx->data_size);	rt2500usb_register_write(rt2x00dev, MAC_CSR8, reg);	rt2500usb_register_read(rt2x00dev, TXRX_CSR0, &reg);	rt2x00_set_field16(&reg, TXRX_CSR0_IV_OFFSET, IEEE80211_HEADER);	rt2x00_set_field16(&reg, TXRX_CSR0_KEY_ID, 0xff);	rt2500usb_register_write(rt2x00dev, TXRX_CSR0, reg);	rt2500usb_register_read(rt2x00dev, MAC_CSR18, &reg);	rt2x00_set_field16(&reg, MAC_CSR18_DELAY_AFTER_BEACON, 90);	rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg);	rt2500usb_register_read(rt2x00dev, PHY_CSR4, &reg);	rt2x00_set_field16(&reg, PHY_CSR4_LOW_RF_LE, 1);	rt2500usb_register_write(rt2x00dev, PHY_CSR4, reg);	rt2500usb_register_read(rt2x00dev, TXRX_CSR1, &reg);	rt2x00_set_field16(&reg, TXRX_CSR1_AUTO_SEQUENCE, 1);	rt2500usb_register_write(rt2x00dev, TXRX_CSR1, reg);	return 0;}static int rt2500usb_init_bbp(struct rt2x00_dev *rt2x00dev){	unsigned int i;	u16 eeprom;	u8 value;	u8 reg_id;	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {		rt2500usb_bbp_read(rt2x00dev, 0, &value);		if ((value != 0xff) && (value != 0x00))			goto continue_csr_init;		NOTICE(rt2x00dev, "Waiting for BBP register.\n");		udelay(REGISTER_BUSY_DELAY);	}	ERROR(rt2x00dev, "BBP register access failed, aborting.\n");	return -EACCES;continue_csr_init:	rt2500usb_bbp_write(rt2x00dev, 3, 0x02);	rt2500usb_bbp_write(rt2x00dev, 4, 0x19);	rt2500usb_bbp_write(rt2x00dev, 14, 0x1c);	rt2500usb_bbp_write(rt2x00dev, 15, 0x30);	rt2500usb_bbp_write(rt2x00dev, 16, 0xac);	rt2500usb_bbp_write(rt2x00dev, 18, 0x18);	rt2500usb_bbp_write(rt2x00dev, 19, 0xff);	rt2500usb_bbp_write(rt2x00dev, 20, 0x1e);	rt2500usb_bbp_write(rt2x00dev, 21, 0x08);	rt2500usb_bbp_write(rt2x00dev, 22, 0x08);	rt2500usb_bbp_write(rt2x00dev, 23, 0x08);	rt2500usb_bbp_write(rt2x00dev, 24, 0x80);	rt2500usb_bbp_write(rt2x00dev, 25, 0x50);	rt2500usb_bbp_write(rt2x00dev, 26, 0x08);	rt2500usb_bbp_write(rt2x00dev, 27, 0x23);	rt2500usb_bbp_write(rt2x00dev, 30, 0x10);	rt2500usb_bbp_write(rt2x00dev, 31, 0x2b);	rt2500usb_bbp_write(rt2x00dev, 32, 0xb9);	rt2500usb_bbp_write(rt2x00dev, 34, 0x12);	rt2500usb_bbp_write(rt2x00dev, 35, 0x50);	rt2500usb_bbp_write(rt2x00dev, 39, 0xc4);	rt2500usb_bbp_write(rt2x00dev, 40, 0x02);	rt2500usb_bbp_write(rt2x00dev, 41, 0x60);	rt2500usb_bbp_write(rt2x00dev, 53, 0x10);	rt2500usb_bbp_write(rt2x00dev, 54, 0x18);	rt2500usb_bbp_write(rt2x00dev, 56, 0x08);	rt2500usb_bbp_write(rt2x00dev, 57, 0x10);	rt2500usb_bbp_write(rt2x00dev, 58, 0x08);	rt2500usb_bbp_write(rt2x00dev, 61, 0x60);	rt2500usb_bbp_write(rt2x00dev, 62, 0x10);	rt2500usb_bbp_write(rt2x00dev, 75, 0xff);	DEBUG(rt2x00dev, "Start initialization from EEPROM...\n");	for (i = 0; i < EEPROM_BBP_SIZE; i++) {		rt2x00_eeprom_read(rt2x00dev, EEPROM_BBP_START + i, &eeprom);		if (eeprom != 0xffff && eeprom != 0x0000) {			reg_id = rt2x00_get_field16(eeprom, EEPROM_BBP_REG_ID);			value = rt2x00_get_field16(eeprom, EEPROM_BBP_VALUE);			DEBUG(rt2x00dev, "BBP: 0x%02x, value: 0x%02x.\n",			      reg_id, value);			rt2500usb_bbp_write(rt2x00dev, reg_id, value);		}	}	DEBUG(rt2x00dev, "...End initialization from EEPROM.\n");	return 0;}/* * Device state switch handlers. */static void rt2500usb_toggle_rx(struct rt2x00_dev *rt2x00dev,				enum dev_state state){	u16 reg;	rt2500usb_register_read(rt2x00dev, TXRX_CSR2, &reg);	rt2x00_set_field16(&reg, TXRX_CSR2_DISABLE_RX,			   state == STATE_RADIO_RX_OFF);	rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg);}static int rt2500usb_enable_radio(struct rt2x00_dev *rt2x00dev){	/*	 * Initialize all registers.	 */	if (rt2500usb_init_registers(rt2x00dev) ||	    rt2500usb_init_bbp(rt2x00dev)) {		ERROR(rt2x00dev, "Register initialization failed.\n");		return -EIO;	}	rt2x00usb_enable_radio(rt2x00dev);	/*	 * Enable LED	 */	rt2500usb_enable_led(rt2x00dev);	return 0;}static void rt2500usb_disable_radio(struct rt2x00_dev *rt2x00dev){	/*	 * Disable LED	 */	rt2500usb_disable_led(rt2x00dev);	rt2500usb_register_write(rt2x00dev, MAC_CSR13, 0x2121);	rt2500usb_register_write(rt2x00dev, MAC_CSR14, 0x2121);	/*	 * Disable synchronisation.	 */	rt2500usb_register_write(rt2x00dev, TXRX_CSR19, 0);	rt2x00usb_disable_radio(rt2x00dev);}static int rt2500usb_set_state(struct rt2x00_dev *rt2x00dev,			       enum dev_state state)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -