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

📄 rt2400pci.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 4 页
字号:
		break;	case ANTENNA_B:		rt2x00_set_field8(&r1, BBP_R1_TX_ANTENNA, 2);		break;	}	/*	 * Configure the RX antenna.	 */	switch (antenna_rx) {	case ANTENNA_SW_DIVERSITY:	case ANTENNA_HW_DIVERSITY:		rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA, 1);		break;	case ANTENNA_A:		rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA, 0);		break;	case ANTENNA_B:		rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA, 2);		break;	}	rt2400pci_bbp_write(rt2x00dev, 4, r4);	rt2400pci_bbp_write(rt2x00dev, 1, r1);}static void rt2400pci_config_duration(struct rt2x00_dev *rt2x00dev,				      struct rt2x00lib_conf *libconf){	u32 reg;	rt2x00pci_register_read(rt2x00dev, CSR11, &reg);	rt2x00_set_field32(&reg, CSR11_SLOT_TIME, libconf->slot_time);	rt2x00pci_register_write(rt2x00dev, CSR11, reg);	rt2x00pci_register_read(rt2x00dev, CSR18, &reg);	rt2x00_set_field32(&reg, CSR18_SIFS, libconf->sifs);	rt2x00_set_field32(&reg, CSR18_PIFS, libconf->pifs);	rt2x00pci_register_write(rt2x00dev, CSR18, reg);	rt2x00pci_register_read(rt2x00dev, CSR19, &reg);	rt2x00_set_field32(&reg, CSR19_DIFS, libconf->difs);	rt2x00_set_field32(&reg, CSR19_EIFS, libconf->eifs);	rt2x00pci_register_write(rt2x00dev, CSR19, reg);	rt2x00pci_register_read(rt2x00dev, TXCSR1, &reg);	rt2x00_set_field32(&reg, TXCSR1_TSF_OFFSET, IEEE80211_HEADER);	rt2x00_set_field32(&reg, TXCSR1_AUTORESPONDER, 1);	rt2x00pci_register_write(rt2x00dev, TXCSR1, reg);	rt2x00pci_register_read(rt2x00dev, CSR12, &reg);	rt2x00_set_field32(&reg, CSR12_BEACON_INTERVAL,			   libconf->conf->beacon_int * 16);	rt2x00_set_field32(&reg, CSR12_CFP_MAX_DURATION,			   libconf->conf->beacon_int * 16);	rt2x00pci_register_write(rt2x00dev, CSR12, reg);}static void rt2400pci_config(struct rt2x00_dev *rt2x00dev,			     const unsigned int flags,			     struct rt2x00lib_conf *libconf){	if (flags & CONFIG_UPDATE_PHYMODE)		rt2400pci_config_phymode(rt2x00dev, libconf->basic_rates);	if (flags & CONFIG_UPDATE_CHANNEL)		rt2400pci_config_channel(rt2x00dev, &libconf->rf);	if (flags & CONFIG_UPDATE_TXPOWER)		rt2400pci_config_txpower(rt2x00dev,					 libconf->conf->power_level);	if (flags & CONFIG_UPDATE_ANTENNA)		rt2400pci_config_antenna(rt2x00dev,					 libconf->conf->antenna_sel_tx,					 libconf->conf->antenna_sel_rx);	if (flags & (CONFIG_UPDATE_SLOT_TIME | CONFIG_UPDATE_BEACON_INT))		rt2400pci_config_duration(rt2x00dev, libconf);}static void rt2400pci_config_cw(struct rt2x00_dev *rt2x00dev,				struct ieee80211_tx_queue_params *params){	u32 reg;	rt2x00pci_register_read(rt2x00dev, CSR11, &reg);	rt2x00_set_field32(&reg, CSR11_CWMIN, params->cw_min);	rt2x00_set_field32(&reg, CSR11_CWMAX, params->cw_max);	rt2x00pci_register_write(rt2x00dev, CSR11, reg);}/* * LED functions. */static void rt2400pci_enable_led(struct rt2x00_dev *rt2x00dev){	u32 reg;	rt2x00pci_register_read(rt2x00dev, LEDCSR, &reg);	rt2x00_set_field32(&reg, LEDCSR_ON_PERIOD, 70);	rt2x00_set_field32(&reg, LEDCSR_OFF_PERIOD, 30);	if (rt2x00dev->led_mode == LED_MODE_TXRX_ACTIVITY) {		rt2x00_set_field32(&reg, LEDCSR_LINK, 1);		rt2x00_set_field32(&reg, LEDCSR_ACTIVITY, 0);	} else if (rt2x00dev->led_mode == LED_MODE_ASUS) {		rt2x00_set_field32(&reg, LEDCSR_LINK, 0);		rt2x00_set_field32(&reg, LEDCSR_ACTIVITY, 1);	} else {		rt2x00_set_field32(&reg, LEDCSR_LINK, 1);		rt2x00_set_field32(&reg, LEDCSR_ACTIVITY, 1);	}	rt2x00pci_register_write(rt2x00dev, LEDCSR, reg);}static void rt2400pci_disable_led(struct rt2x00_dev *rt2x00dev){	u32 reg;	rt2x00pci_register_read(rt2x00dev, LEDCSR, &reg);	rt2x00_set_field32(&reg, LEDCSR_LINK, 0);	rt2x00_set_field32(&reg, LEDCSR_ACTIVITY, 0);	rt2x00pci_register_write(rt2x00dev, LEDCSR, reg);}/* * Link tuning */static void rt2400pci_link_stats(struct rt2x00_dev *rt2x00dev){	u32 reg;	u8 bbp;	/*	 * Update FCS error count from register.	 */	rt2x00pci_register_read(rt2x00dev, CNT0, &reg);	rt2x00dev->link.rx_failed = rt2x00_get_field32(reg, CNT0_FCS_ERROR);	/*	 * Update False CCA count from register.	 */	rt2400pci_bbp_read(rt2x00dev, 39, &bbp);	rt2x00dev->link.false_cca = bbp;}static void rt2400pci_reset_tuner(struct rt2x00_dev *rt2x00dev){	rt2400pci_bbp_write(rt2x00dev, 13, 0x08);	rt2x00dev->link.vgc_level = 0x08;}static void rt2400pci_link_tuner(struct rt2x00_dev *rt2x00dev){	u8 reg;	/*	 * The link tuner should not run longer then 60 seconds,	 * and should run once every 2 seconds.	 */	if (rt2x00dev->link.count > 60 || !(rt2x00dev->link.count & 1))		return;	/*	 * Base r13 link tuning on the false cca count.	 */	rt2400pci_bbp_read(rt2x00dev, 13, &reg);	if (rt2x00dev->link.false_cca > 512 && reg < 0x20) {		rt2400pci_bbp_write(rt2x00dev, 13, ++reg);		rt2x00dev->link.vgc_level = reg;	} else if (rt2x00dev->link.false_cca < 100 && reg > 0x08) {		rt2400pci_bbp_write(rt2x00dev, 13, --reg);		rt2x00dev->link.vgc_level = reg;	}}/* * Initialization functions. */static void rt2400pci_init_rxring(struct rt2x00_dev *rt2x00dev){	struct data_ring *ring = rt2x00dev->rx;	struct data_desc *rxd;	unsigned int i;	u32 word;	memset(ring->data_addr, 0x00, rt2x00_get_ring_size(ring));	for (i = 0; i < ring->stats.limit; i++) {		rxd = ring->entry[i].priv;		rt2x00_desc_read(rxd, 2, &word);		rt2x00_set_field32(&word, RXD_W2_BUFFER_LENGTH,				   ring->data_size);		rt2x00_desc_write(rxd, 2, word);		rt2x00_desc_read(rxd, 1, &word);		rt2x00_set_field32(&word, RXD_W1_BUFFER_ADDRESS,				   ring->entry[i].data_dma);		rt2x00_desc_write(rxd, 1, word);		rt2x00_desc_read(rxd, 0, &word);		rt2x00_set_field32(&word, RXD_W0_OWNER_NIC, 1);		rt2x00_desc_write(rxd, 0, word);	}	rt2x00_ring_index_clear(rt2x00dev->rx);}static void rt2400pci_init_txring(struct rt2x00_dev *rt2x00dev, const int queue){	struct data_ring *ring = rt2x00lib_get_ring(rt2x00dev, queue);	struct data_desc *txd;	unsigned int i;	u32 word;	memset(ring->data_addr, 0x00, rt2x00_get_ring_size(ring));	for (i = 0; i < ring->stats.limit; i++) {		txd = ring->entry[i].priv;		rt2x00_desc_read(txd, 1, &word);		rt2x00_set_field32(&word, TXD_W1_BUFFER_ADDRESS,				   ring->entry[i].data_dma);		rt2x00_desc_write(txd, 1, word);		rt2x00_desc_read(txd, 2, &word);		rt2x00_set_field32(&word, TXD_W2_BUFFER_LENGTH,				   ring->data_size);		rt2x00_desc_write(txd, 2, word);		rt2x00_desc_read(txd, 0, &word);		rt2x00_set_field32(&word, TXD_W0_VALID, 0);		rt2x00_set_field32(&word, TXD_W0_OWNER_NIC, 0);		rt2x00_desc_write(txd, 0, word);	}	rt2x00_ring_index_clear(ring);}static int rt2400pci_init_rings(struct rt2x00_dev *rt2x00dev){	u32 reg;	/*	 * Initialize rings.	 */	rt2400pci_init_rxring(rt2x00dev);	rt2400pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_DATA0);	rt2400pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_DATA1);	rt2400pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_AFTER_BEACON);	rt2400pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_BEACON);	/*	 * Initialize registers.	 */	rt2x00pci_register_read(rt2x00dev, TXCSR2, &reg);	rt2x00_set_field32(&reg, TXCSR2_TXD_SIZE,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA0].desc_size);	rt2x00_set_field32(&reg, TXCSR2_NUM_TXD,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA1].stats.limit);	rt2x00_set_field32(&reg, TXCSR2_NUM_ATIM,			   rt2x00dev->bcn[1].stats.limit);	rt2x00_set_field32(&reg, TXCSR2_NUM_PRIO,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA0].stats.limit);	rt2x00pci_register_write(rt2x00dev, TXCSR2, reg);	rt2x00pci_register_read(rt2x00dev, TXCSR3, &reg);	rt2x00_set_field32(&reg, TXCSR3_TX_RING_REGISTER,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA1].data_dma);	rt2x00pci_register_write(rt2x00dev, TXCSR3, reg);	rt2x00pci_register_read(rt2x00dev, TXCSR5, &reg);	rt2x00_set_field32(&reg, TXCSR5_PRIO_RING_REGISTER,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA0].data_dma);	rt2x00pci_register_write(rt2x00dev, TXCSR5, reg);	rt2x00pci_register_read(rt2x00dev, TXCSR4, &reg);	rt2x00_set_field32(&reg, TXCSR4_ATIM_RING_REGISTER,			   rt2x00dev->bcn[1].data_dma);	rt2x00pci_register_write(rt2x00dev, TXCSR4, reg);	rt2x00pci_register_read(rt2x00dev, TXCSR6, &reg);	rt2x00_set_field32(&reg, TXCSR6_BEACON_RING_REGISTER,			   rt2x00dev->bcn[0].data_dma);	rt2x00pci_register_write(rt2x00dev, TXCSR6, reg);	rt2x00pci_register_read(rt2x00dev, RXCSR1, &reg);	rt2x00_set_field32(&reg, RXCSR1_RXD_SIZE, rt2x00dev->rx->desc_size);	rt2x00_set_field32(&reg, RXCSR1_NUM_RXD, rt2x00dev->rx->stats.limit);	rt2x00pci_register_write(rt2x00dev, RXCSR1, reg);	rt2x00pci_register_read(rt2x00dev, RXCSR2, &reg);	rt2x00_set_field32(&reg, RXCSR2_RX_RING_REGISTER,			   rt2x00dev->rx->data_dma);	rt2x00pci_register_write(rt2x00dev, RXCSR2, reg);	return 0;}static int rt2400pci_init_registers(struct rt2x00_dev *rt2x00dev){	u32 reg;	rt2x00pci_register_write(rt2x00dev, PSCSR0, 0x00020002);	rt2x00pci_register_write(rt2x00dev, PSCSR1, 0x00000002);	rt2x00pci_register_write(rt2x00dev, PSCSR2, 0x00023f20);	rt2x00pci_register_write(rt2x00dev, PSCSR3, 0x00000002);	rt2x00pci_register_read(rt2x00dev, TIMECSR, &reg);	rt2x00_set_field32(&reg, TIMECSR_US_COUNT, 33);	rt2x00_set_field32(&reg, TIMECSR_US_64_COUNT, 63);	rt2x00_set_field32(&reg, TIMECSR_BEACON_EXPECT, 0);	rt2x00pci_register_write(rt2x00dev, TIMECSR, reg);	rt2x00pci_register_read(rt2x00dev, CSR9, &reg);	rt2x00_set_field32(&reg, CSR9_MAX_FRAME_UNIT,			   (rt2x00dev->rx->data_size / 128));	rt2x00pci_register_write(rt2x00dev, CSR9, reg);	rt2x00pci_register_write(rt2x00dev, CNT3, 0x3f080000);	rt2x00pci_register_read(rt2x00dev, ARCSR0, &reg);	rt2x00_set_field32(&reg, ARCSR0_AR_BBP_DATA0, 133);	rt2x00_set_field32(&reg, ARCSR0_AR_BBP_ID0, 134);	rt2x00_set_field32(&reg, ARCSR0_AR_BBP_DATA1, 136);	rt2x00_set_field32(&reg, ARCSR0_AR_BBP_ID1, 135);	rt2x00pci_register_write(rt2x00dev, ARCSR0, reg);	rt2x00pci_register_read(rt2x00dev, RXCSR3, &reg);	rt2x00_set_field32(&reg, RXCSR3_BBP_ID0, 3); /* Tx power.*/	rt2x00_set_field32(&reg, RXCSR3_BBP_ID0_VALID, 1);	rt2x00_set_field32(&reg, RXCSR3_BBP_ID1, 32); /* Signal */	rt2x00_set_field32(&reg, RXCSR3_BBP_ID1_VALID, 1);	rt2x00_set_field32(&reg, RXCSR3_BBP_ID2, 36); /* Rssi */	rt2x00_set_field32(&reg, RXCSR3_BBP_ID2_VALID, 1);	rt2x00pci_register_write(rt2x00dev, RXCSR3, reg);	rt2x00pci_register_write(rt2x00dev, PWRCSR0, 0x3f3b3100);	if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE))		return -EBUSY;	rt2x00pci_register_write(rt2x00dev, MACCSR0, 0x00217223);	rt2x00pci_register_write(rt2x00dev, MACCSR1, 0x00235518);	rt2x00pci_register_read(rt2x00dev, MACCSR2, &reg);	rt2x00_set_field32(&reg, MACCSR2_DELAY, 64);	rt2x00pci_register_write(rt2x00dev, MACCSR2, reg);	rt2x00pci_register_read(rt2x00dev, RALINKCSR, &reg);	rt2x00_set_field32(&reg, RALINKCSR_AR_BBP_DATA0, 17);	rt2x00_set_field32(&reg, RALINKCSR_AR_BBP_ID0, 154);	rt2x00_set_field32(&reg, RALINKCSR_AR_BBP_DATA1, 0);	rt2x00_set_field32(&reg, RALINKCSR_AR_BBP_ID1, 154);	rt2x00pci_register_write(rt2x00dev, RALINKCSR, reg);	rt2x00pci_register_read(rt2x00dev, CSR1, &reg);	rt2x00_set_field32(&reg, CSR1_SOFT_RESET, 1);	rt2x00_set_field32(&reg, CSR1_BBP_RESET, 0);	rt2x00_set_field32(&reg, CSR1_HOST_READY, 0);	rt2x00pci_register_write(rt2x00dev, CSR1, reg);	rt2x00pci_register_read(rt2x00dev, CSR1, &reg);	rt2x00_set_field32(&reg, CSR1_SOFT_RESET, 0);	rt2x00_set_field32(&reg, CSR1_HOST_READY, 1);	rt2x00pci_register_write(rt2x00dev, CSR1, reg);	/*	 * We must clear the FCS and FIFO error count.	 * These registers are cleared on read,	 * so we may pass a useless variable to store the value.	 */	rt2x00pci_register_read(rt2x00dev, CNT0, &reg);	rt2x00pci_register_read(rt2x00dev, CNT4, &reg);	return 0;}static int rt2400pci_init_bbp(struct rt2x00_dev *rt2x00dev){	unsigned int i;	u16 eeprom;	u8 reg_id;	u8 value;	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {		rt2400pci_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:	rt2400pci_bbp_write(rt2x00dev, 1, 0x00);	rt2400pci_bbp_write(rt2x00dev, 3, 0x27);	rt2400pci_bbp_write(rt2x00dev, 4, 0x08);	rt2400pci_bbp_write(rt2x00dev, 10, 0x0f);	rt2400pci_bbp_write(rt2x00dev, 15, 0x72);	rt2400pci_bbp_write(rt2x00dev, 16, 0x74);	rt2400pci_bbp_write(rt2x00dev, 17, 0x20);	rt2400pci_bbp_write(rt2x00dev, 18, 0x72);	rt2400pci_bbp_write(rt2x00dev, 19, 0x0b);	rt2400pci_bbp_write(rt2x00dev, 20, 0x00);	rt2400pci_bbp_write(rt2x00dev, 28, 0x11);	rt2400pci_bbp_write(rt2x00dev, 29, 0x04);	rt2400pci_bbp_write(rt2x00dev, 30, 0x21);	rt2400pci_bbp_write(rt2x00dev, 31, 0x00);	DEBUG(rt2x00dev, "Start initialization from EEPROM...\n");	for (i = 0; i < EEPROM_BBP_SIZE; i++) {		rt2x00_eeprom_read(rt2x00dev, EEPROM_BBP_START + i, &eeprom);

⌨️ 快捷键说明

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