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

📄 rt73usb.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 5 页
字号:
 */static void rt73usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev,				  unsigned int queue){	u32 reg;	if (queue != IEEE80211_TX_QUEUE_BEACON)		return;	/*	 * For Wi-Fi faily generated beacons between participating stations.	 * Set TBTT phase adaptive adjustment step to 8us (default 16us)	 */	rt73usb_register_write(rt2x00dev, TXRX_CSR10, 0x00001008);	rt73usb_register_read(rt2x00dev, TXRX_CSR9, &reg);	if (!rt2x00_get_field32(reg, TXRX_CSR9_BEACON_GEN)) {		rt2x00_set_field32(&reg, TXRX_CSR9_BEACON_GEN, 1);		rt73usb_register_write(rt2x00dev, TXRX_CSR9, reg);	}}/* * RX control handlers */static int rt73usb_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1){	u16 eeprom;	u8 offset;	u8 lna;	lna = rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_LNA);	switch (lna) {	case 3:		offset = 90;		break;	case 2:		offset = 74;		break;	case 1:		offset = 64;		break;	default:		return 0;	}	if (rt2x00dev->rx_status.phymode == MODE_IEEE80211A) {		if (test_bit(CONFIG_EXTERNAL_LNA_A, &rt2x00dev->flags)) {			if (lna == 3 || lna == 2)				offset += 10;		} else {			if (lna == 3)				offset += 6;			else if (lna == 2)				offset += 8;		}		rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_A, &eeprom);		offset -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_A_1);	} else {		if (test_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags))			offset += 14;		rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_BG, &eeprom);		offset -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_BG_1);	}	return rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_AGC) * 2 - offset;}static void rt73usb_fill_rxdone(struct data_entry *entry,			        struct rxdata_entry_desc *desc){	struct data_desc *rxd = (struct data_desc *)entry->skb->data;	u32 word0;	u32 word1;	rt2x00_desc_read(rxd, 0, &word0);	rt2x00_desc_read(rxd, 1, &word1);	desc->flags = 0;	if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR))		desc->flags |= RX_FLAG_FAILED_FCS_CRC;	/*	 * Obtain the status about this packet.	 */	desc->signal = rt2x00_get_field32(word1, RXD_W1_SIGNAL);	desc->rssi = rt73usb_agc_to_rssi(entry->ring->rt2x00dev, word1);	desc->ofdm = rt2x00_get_field32(word0, RXD_W0_OFDM);	desc->size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);	/*	 * Pull the skb to clear the descriptor area.	 */	skb_pull(entry->skb, entry->ring->desc_size);	return;}/* * Device probe functions. */static int rt73usb_validate_eeprom(struct rt2x00_dev *rt2x00dev){	u16 word;	u8 *mac;	s8 value;	rt2x00usb_eeprom_read(rt2x00dev, rt2x00dev->eeprom, EEPROM_SIZE);	/*	 * Start validation of the data that has been read.	 */	mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);	if (!is_valid_ether_addr(mac)) {		DECLARE_MAC_BUF(macbuf);		random_ether_addr(mac);		EEPROM(rt2x00dev, "MAC: %s\n", print_mac(macbuf, mac));	}	rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word);	if (word == 0xffff) {		rt2x00_set_field16(&word, EEPROM_ANTENNA_NUM, 2);		rt2x00_set_field16(&word, EEPROM_ANTENNA_TX_DEFAULT, 2);		rt2x00_set_field16(&word, EEPROM_ANTENNA_RX_DEFAULT, 2);		rt2x00_set_field16(&word, EEPROM_ANTENNA_FRAME_TYPE, 0);		rt2x00_set_field16(&word, EEPROM_ANTENNA_DYN_TXAGC, 0);		rt2x00_set_field16(&word, EEPROM_ANTENNA_HARDWARE_RADIO, 0);		rt2x00_set_field16(&word, EEPROM_ANTENNA_RF_TYPE, RF5226);		rt2x00_eeprom_write(rt2x00dev, EEPROM_ANTENNA, word);		EEPROM(rt2x00dev, "Antenna: 0x%04x\n", word);	}	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &word);	if (word == 0xffff) {		rt2x00_set_field16(&word, EEPROM_NIC_EXTERNAL_LNA, 0);		rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC, word);		EEPROM(rt2x00dev, "NIC: 0x%04x\n", word);	}	rt2x00_eeprom_read(rt2x00dev, EEPROM_LED, &word);	if (word == 0xffff) {		rt2x00_set_field16(&word, EEPROM_LED_POLARITY_RDY_G, 0);		rt2x00_set_field16(&word, EEPROM_LED_POLARITY_RDY_A, 0);		rt2x00_set_field16(&word, EEPROM_LED_POLARITY_ACT, 0);		rt2x00_set_field16(&word, EEPROM_LED_POLARITY_GPIO_0, 0);		rt2x00_set_field16(&word, EEPROM_LED_POLARITY_GPIO_1, 0);		rt2x00_set_field16(&word, EEPROM_LED_POLARITY_GPIO_2, 0);		rt2x00_set_field16(&word, EEPROM_LED_POLARITY_GPIO_3, 0);		rt2x00_set_field16(&word, EEPROM_LED_POLARITY_GPIO_4, 0);		rt2x00_set_field16(&word, EEPROM_LED_LED_MODE,				   LED_MODE_DEFAULT);		rt2x00_eeprom_write(rt2x00dev, EEPROM_LED, word);		EEPROM(rt2x00dev, "Led: 0x%04x\n", word);	}	rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &word);	if (word == 0xffff) {		rt2x00_set_field16(&word, EEPROM_FREQ_OFFSET, 0);		rt2x00_set_field16(&word, EEPROM_FREQ_SEQ, 0);		rt2x00_eeprom_write(rt2x00dev, EEPROM_FREQ, word);		EEPROM(rt2x00dev, "Freq: 0x%04x\n", word);	}	rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_BG, &word);	if (word == 0xffff) {		rt2x00_set_field16(&word, EEPROM_RSSI_OFFSET_BG_1, 0);		rt2x00_set_field16(&word, EEPROM_RSSI_OFFSET_BG_2, 0);		rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_OFFSET_BG, word);		EEPROM(rt2x00dev, "RSSI OFFSET BG: 0x%04x\n", word);	} else {		value = rt2x00_get_field16(word, EEPROM_RSSI_OFFSET_BG_1);		if (value < -10 || value > 10)			rt2x00_set_field16(&word, EEPROM_RSSI_OFFSET_BG_1, 0);		value = rt2x00_get_field16(word, EEPROM_RSSI_OFFSET_BG_2);		if (value < -10 || value > 10)			rt2x00_set_field16(&word, EEPROM_RSSI_OFFSET_BG_2, 0);		rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_OFFSET_BG, word);	}	rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_A, &word);	if (word == 0xffff) {		rt2x00_set_field16(&word, EEPROM_RSSI_OFFSET_A_1, 0);		rt2x00_set_field16(&word, EEPROM_RSSI_OFFSET_A_2, 0);		rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_OFFSET_A, word);		EEPROM(rt2x00dev, "RSSI OFFSET BG: 0x%04x\n", word);	} else {		value = rt2x00_get_field16(word, EEPROM_RSSI_OFFSET_A_1);		if (value < -10 || value > 10)			rt2x00_set_field16(&word, EEPROM_RSSI_OFFSET_A_1, 0);		value = rt2x00_get_field16(word, EEPROM_RSSI_OFFSET_A_2);		if (value < -10 || value > 10)			rt2x00_set_field16(&word, EEPROM_RSSI_OFFSET_A_2, 0);		rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_OFFSET_A, word);	}	return 0;}static int rt73usb_init_eeprom(struct rt2x00_dev *rt2x00dev){	u32 reg;	u16 value;	u16 eeprom;	/*	 * Read EEPROM word for configuration.	 */	rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);	/*	 * Identify RF chipset.	 */	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);	rt73usb_register_read(rt2x00dev, MAC_CSR0, &reg);	rt2x00_set_chip(rt2x00dev, RT2571, value, reg);	if (!rt2x00_check_rev(&rt2x00dev->chip, 0x25730)) {		ERROR(rt2x00dev, "Invalid RT chipset detected.\n");		return -ENODEV;	}	if (!rt2x00_rf(&rt2x00dev->chip, RF5226) &&	    !rt2x00_rf(&rt2x00dev->chip, RF2528) &&	    !rt2x00_rf(&rt2x00dev->chip, RF5225) &&	    !rt2x00_rf(&rt2x00dev->chip, RF2527)) {		ERROR(rt2x00dev, "Invalid RF chipset detected.\n");		return -ENODEV;	}	/*	 * Identify default antenna configuration.	 */	rt2x00dev->hw->conf.antenna_sel_tx =	    rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TX_DEFAULT);	rt2x00dev->hw->conf.antenna_sel_rx =	    rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RX_DEFAULT);	/*	 * Read the Frame type.	 */	if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_FRAME_TYPE))		__set_bit(CONFIG_FRAME_TYPE, &rt2x00dev->flags);	/*	 * Read frequency offset.	 */	rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &eeprom);	rt2x00dev->freq_offset = rt2x00_get_field16(eeprom, EEPROM_FREQ_OFFSET);	/*	 * Read external LNA informations.	 */	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &eeprom);	if (rt2x00_get_field16(eeprom, EEPROM_NIC_EXTERNAL_LNA)) {		__set_bit(CONFIG_EXTERNAL_LNA_A, &rt2x00dev->flags);		__set_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags);	}	/*	 * Store led settings, for correct led behaviour.	 */	rt2x00_eeprom_read(rt2x00dev, EEPROM_LED, &eeprom);	rt2x00_set_field16(&rt2x00dev->led_reg, MCU_LEDCS_LED_MODE,			   rt2x00dev->led_mode);	rt2x00_set_field16(&rt2x00dev->led_reg, MCU_LEDCS_POLARITY_GPIO_0,			   rt2x00_get_field16(eeprom,					      EEPROM_LED_POLARITY_GPIO_0));	rt2x00_set_field16(&rt2x00dev->led_reg, MCU_LEDCS_POLARITY_GPIO_1,			   rt2x00_get_field16(eeprom,					      EEPROM_LED_POLARITY_GPIO_1));	rt2x00_set_field16(&rt2x00dev->led_reg, MCU_LEDCS_POLARITY_GPIO_2,			   rt2x00_get_field16(eeprom,					      EEPROM_LED_POLARITY_GPIO_2));	rt2x00_set_field16(&rt2x00dev->led_reg, MCU_LEDCS_POLARITY_GPIO_3,			   rt2x00_get_field16(eeprom,					      EEPROM_LED_POLARITY_GPIO_3));	rt2x00_set_field16(&rt2x00dev->led_reg, MCU_LEDCS_POLARITY_GPIO_4,			   rt2x00_get_field16(eeprom,					      EEPROM_LED_POLARITY_GPIO_4));	rt2x00_set_field16(&rt2x00dev->led_reg, MCU_LEDCS_POLARITY_ACT,			   rt2x00_get_field16(eeprom, EEPROM_LED_POLARITY_ACT));	rt2x00_set_field16(&rt2x00dev->led_reg, MCU_LEDCS_POLARITY_READY_BG,			   rt2x00_get_field16(eeprom,					      EEPROM_LED_POLARITY_RDY_G));	rt2x00_set_field16(&rt2x00dev->led_reg, MCU_LEDCS_POLARITY_READY_A,			   rt2x00_get_field16(eeprom,					      EEPROM_LED_POLARITY_RDY_A));	return 0;}/* * RF value list for RF2528 * Supports: 2.4 GHz */static const struct rf_channel rf_vals_bg_2528[] = {	{ 1,  0x00002c0c, 0x00000786, 0x00068255, 0x000fea0b },	{ 2,  0x00002c0c, 0x00000786, 0x00068255, 0x000fea1f },	{ 3,  0x00002c0c, 0x0000078a, 0x00068255, 0x000fea0b },	{ 4,  0x00002c0c, 0x0000078a, 0x00068255, 0x000fea1f },	{ 5,  0x00002c0c, 0x0000078e, 0x00068255, 0x000fea0b },	{ 6,  0x00002c0c, 0x0000078e, 0x00068255, 0x000fea1f },	{ 7,  0x00002c0c, 0x00000792, 0x00068255, 0x000fea0b },	{ 8,  0x00002c0c, 0x00000792, 0x00068255, 0x000fea1f },	{ 9,  0x00002c0c, 0x00000796, 0x00068255, 0x000fea0b },	{ 10, 0x00002c0c, 0x00000796, 0x00068255, 0x000fea1f },	{ 11, 0x00002c0c, 0x0000079a, 0x00068255, 0x000fea0b },	{ 12, 0x00002c0c, 0x0000079a, 0x00068255, 0x000fea1f },	{ 13, 0x00002c0c, 0x0000079e, 0x00068255, 0x000fea0b },	{ 14, 0x00002c0c, 0x000007a2, 0x00068255, 0x000fea13 },};/* * RF value list for RF5226 * Supports: 2.4 GHz & 5.2 GHz */static const struct rf_channel rf_vals_5226[] = {	{ 1,  0x00002c0c, 0x00000786, 0x00068255, 0x000fea0b },	{ 2,  0x00002c0c, 0x00000786, 0x00068255, 0x000fea1f },	{ 3,  0x00002c0c, 0x0000078a, 0x00068255, 0x000fea0b },	{ 4,  0x00002c0c, 0x0000078a, 0x00068255, 0x000fea1f },	{ 5,  0x00002c0c, 0x0000078e, 0x00068255, 0x000fea0b },	{ 6,  0x00002c0c, 0x0000078e, 0x00068255, 0x000fea1f },	{ 7,  0x00002c0c, 0x00000792, 0x00068255, 0x000fea0b },	{ 8,  0x00002c0c, 0x00000792, 0x00068255, 0x000fea1f },	{ 9,  0x00002c0c, 0x00000796, 0x00068255, 0x000fea0b },	{ 10, 0x00002c0c, 0x00000796, 0x00068255, 0x000fea1f },	{ 11, 0x00002c0c, 0x0000079a, 0x00068255, 0x000fea0b },	{ 12, 0x00002c0c, 0x0000079a, 0x00068255, 0x000fea1f },	{ 13, 0x00002c0c, 0x0000079e, 0x00068255, 0x000fea0b },	{ 14, 0x00002c0c, 0x000007a2, 0x00068255, 0x000fea13 },	/* 802.11 UNI / HyperLan 2 */	{ 36, 0x00002c0c, 0x0000099a, 0x00098255, 0x000fea23 },	{ 40, 0x00002c0c, 0x000009a2, 0x00098255, 0x000fea03 },	{ 44, 0x00002c0c, 0x000009a6, 0x00098255, 0x000fea0b },	{ 48, 0x00002c0c, 0x000009aa, 0x00098255, 0x000fea13 },	{ 52, 0x00002c0c, 0x000009ae, 0x00098255, 0x000fea1b },	{ 56, 0x00002c0c, 0x000009b2, 0x00098255, 0x000fea23 },	{ 60, 0x00002c0c, 0x000009ba, 0x00098255, 0x000fea03 },	{ 64, 0x00002c0c, 0x000009be, 0x00098255, 0x000fea0b },	/* 802.11 HyperLan 2 */	{ 100, 0x00002c0c, 0x00000a2a, 0x000b8255, 0x000fea03 },	{ 104, 0x00002c0c, 0x00000a2e, 0x000b8255, 0x000fea0b },	{ 108, 0x00002c0c, 0x00000a32, 0x000b8255, 0x000fea13 },	{ 112, 0x00002c0c, 0x00000a36, 0x000b8255, 0x000fea1b },	{ 116, 0x00002c0c, 0x00000a3a, 0x000b8255, 0x000fea23 },	{ 120, 0x00002c0c, 0x00000a82, 0x000b8255, 0x000fea03 },	{ 124, 0x00002c0c, 0x00000a86, 0x000b8255, 0x000fea0b },	{ 128, 0x00002c0c, 0x00000a8a, 0x000b8255, 0x000fea13 },	{ 132, 0x00002c0c, 0x00000a8e, 0x000b8255, 0x000fea1b },	{ 136, 0x00002c0c, 0x00000a92, 0x000b8255, 0x000fea23 },	/* 802.11 UNII */	{ 140, 0x00002c0c, 0x00000a9a, 0x000b8255, 0x000fea03 },	{ 149, 0x00002c0c, 0x00000aa2, 0x000b8255, 0x000fea1f },	{ 153, 0x00002c0c, 0x00000aa6, 0x000b8255, 0x000fea27 },	{ 157, 0x00002c0c, 0x00000aae, 0x000b8255, 0x000fea07 },	{ 161, 0x00002c0c, 0x00000ab2, 0x000b8255, 0x000fea0f },	{ 165, 0x00002c0c, 0x00000ab6, 0x000b8255, 0x000fea17 },	/* MMAC(Japan)J52 ch 34,38,42,46 */	{ 34, 0x00002c0c, 0x0008099a, 0x000da255, 0x000d3a0b },	{ 38, 0x00002c0c, 0x0008099e, 0x000da255, 0x000d3a13 },	{ 42, 0x00002c0c, 0x000809a2, 0x000da255, 0x000d3a1b },	{ 46, 0x00002c0c, 0x000809a6, 0x000da255, 0x000d3a23 },};/* * RF value list for RF5225 & RF2527 * Supports: 2.4 GHz & 5.2 GHz */static const struct rf_channel rf_vals_5225_2527[] = {	{ 1,  0x00002ccc, 0x00004786, 0x00068455, 0x000ffa0b },	{ 2,  0x00002ccc, 0x00004786, 0x00068455, 0x000ffa1f },	{ 3,  0x00002ccc, 0x0000478a, 0x00068455, 0x000ffa0b },	{ 4,  0x00002ccc, 0x0000478a, 0x00068455, 0x000ffa1f },	{ 5,  0x00002ccc, 0x0000478e, 0x00068455, 0x000ffa0b },	{ 6,  0x00002ccc, 0x0000478e, 0x00068455, 0x000ffa1f },	{ 7,  0x00002ccc, 0x00004792, 0x00068455, 0x000ffa0b },	{ 8,  0x00002ccc, 0x00004792, 0x00068455, 0x000ffa1f },	{ 9,  0x00002ccc, 0x00004796, 0x00068455, 0x000ffa0b },	{ 10, 0x00002ccc, 0x00004796, 0x00068455, 0x000ffa1f },	{ 11, 0x00002ccc, 0x0000479a, 0x00068455, 0x000ffa0b },	{ 12, 0x00002ccc, 0x0000479a, 0x00068455, 0x000ffa1f },	{ 13, 0x00002ccc, 0x0000479e, 0x00068455, 0x000ffa0b },	{ 14, 0x00002ccc, 0x000047a2, 0x00068455, 0x000ffa13 },	/* 802.11 UNI / HyperLan 2 */	{ 36, 0x00002ccc, 0x0000499a, 0x0009be55, 0x000ffa23 },	{ 40, 0x00002ccc, 0x000049a2, 0x0009be55, 0x000ffa03 },	{ 44, 0x00002ccc, 0x000049a6, 0x0009be55, 0x000ffa0b },	{ 48, 0x00002ccc, 0x000049aa, 0x0009be55, 0x000ffa13 },	{ 52, 0x00002ccc, 0x000049ae, 0x0009ae55, 0x000ffa1b },	{ 56, 0x00002ccc, 0x000049b2, 0x0009ae55, 0x000ffa23 },	{ 60, 0x00002ccc, 0x000049ba, 0x0009ae55, 0x000ffa03 },	{ 64, 0x00002ccc, 0x000049be, 0x0009ae55, 0x000ffa0b },	/* 802.11 HyperLan 2 */	{ 100, 0x00002ccc, 0x00004a2a, 0x000bae55, 0x000ffa03 },	{ 104, 0x00002ccc, 0x00004a2e, 0x000bae55, 0x000ffa0b },	{ 108, 0x00002ccc, 0x00004a32, 0x000bae55, 0x000ffa13 },	{ 112, 0x00002ccc, 0x00004a36, 0x000bae55, 0x000ffa1b },	{ 116, 0x00002ccc, 0x00004a3a, 0x000bbe55, 0x000ffa23 },	{ 120, 0x00002ccc, 0x00004a82, 0x000bbe55, 0x000ffa03 },	{ 124, 0x00002ccc, 0x00004a86, 0x000bbe55, 0x000ffa0b },	{ 128, 0x00002ccc, 0x00004a8a, 0x000bbe55, 0x000ffa13 },	{ 132, 0x00002ccc, 0x00004a8e, 0x000bbe55, 0x000ffa1b },	{ 136, 0x00002ccc, 0x00004a92, 0x000bbe55, 0x000ffa23 },	/* 802.11 UNII */	{ 140, 0x00002ccc, 0x00004a9a, 0x000bbe55, 0x000ffa03 },	{ 149, 0x00002ccc, 0x00004aa2, 0x000bbe55, 0x000ffa1f },	{ 153, 0x00002ccc, 0x00004aa6, 0x000bbe55, 0x000ffa27 },	{ 157, 0x00002ccc, 0x00004aae, 0x000bbe55, 0x000ffa07 },	{ 161, 0x00002ccc, 0x00004ab2, 0x000bbe55, 0x000ffa0f },	{ 165, 0x00002ccc, 0x00004ab6, 0x000bbe55, 0x000ffa17 },

⌨️ 快捷键说明

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