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

📄 rt61pci.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		if (r17 != low_bound)			rt61pci_bbp_write(rt2x00dev, 17, low_bound);		return;	}	/*	 * Special mid-R17 for middle distance	 */	if (rssi >= -74) {		low_bound += 0x08;		if (r17 != low_bound)			rt61pci_bbp_write(rt2x00dev, 17, low_bound);		return;	}	/*	 * Special case: Change up_bound based on the rssi.	 * Lower up_bound when rssi is weaker then -74 dBm.	 */	up_bound -= 2 * (-74 - rssi);	if (low_bound > up_bound)		up_bound = low_bound;	if (r17 > up_bound) {		rt61pci_bbp_write(rt2x00dev, 17, up_bound);		return;	}	/*	 * r17 does not yet exceed upper limit, continue and base	 * the r17 tuning on the false CCA count.	 */	if (rt2x00dev->link.false_cca > 512 && r17 < up_bound) {		if (++r17 > up_bound)			r17 = up_bound;		rt61pci_bbp_write(rt2x00dev, 17, r17);	} else if (rt2x00dev->link.false_cca < 100 && r17 > low_bound) {		if (--r17 < low_bound)			r17 = low_bound;		rt61pci_bbp_write(rt2x00dev, 17, r17);	}}/* * Firmware name function. */static char *rt61pci_get_firmware_name(struct rt2x00_dev *rt2x00dev){	char *fw_name;	switch (rt2x00dev->chip.rt) {	case RT2561:		fw_name = FIRMWARE_RT2561;		break;	case RT2561s:		fw_name = FIRMWARE_RT2561s;		break;	case RT2661:		fw_name = FIRMWARE_RT2661;		break;	default:		fw_name = NULL;		break;	}	return fw_name;}/* * Initialization functions. */static int rt61pci_load_firmware(struct rt2x00_dev *rt2x00dev, void *data,				 const size_t len){	int i;	u32 reg;	/*	 * Wait for stable hardware.	 */	for (i = 0; i < 100; i++) {		rt2x00pci_register_read(rt2x00dev, MAC_CSR0, &reg);		if (reg)			break;		msleep(1);	}	if (!reg) {		ERROR(rt2x00dev, "Unstable hardware.\n");		return -EBUSY;	}	/*	 * Prepare MCU and mailbox for firmware loading.	 */	reg = 0;	rt2x00_set_field32(&reg, MCU_CNTL_CSR_RESET, 1);	rt2x00pci_register_write(rt2x00dev, MCU_CNTL_CSR, reg);	rt2x00pci_register_write(rt2x00dev, M2H_CMD_DONE_CSR, 0xffffffff);	rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);	rt2x00pci_register_write(rt2x00dev, HOST_CMD_CSR, 0);	/*	 * Write firmware to device.	 */	reg = 0;	rt2x00_set_field32(&reg, MCU_CNTL_CSR_RESET, 1);	rt2x00_set_field32(&reg, MCU_CNTL_CSR_SELECT_BANK, 1);	rt2x00pci_register_write(rt2x00dev, MCU_CNTL_CSR, reg);	rt2x00pci_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE,				      data, len);	rt2x00_set_field32(&reg, MCU_CNTL_CSR_SELECT_BANK, 0);	rt2x00pci_register_write(rt2x00dev, MCU_CNTL_CSR, reg);	rt2x00_set_field32(&reg, MCU_CNTL_CSR_RESET, 0);	rt2x00pci_register_write(rt2x00dev, MCU_CNTL_CSR, reg);	for (i = 0; i < 100; i++) {		rt2x00pci_register_read(rt2x00dev, MCU_CNTL_CSR, &reg);		if (rt2x00_get_field32(reg, MCU_CNTL_CSR_READY))			break;		msleep(1);	}	if (i == 100) {		ERROR(rt2x00dev, "MCU Control register not ready.\n");		return -EBUSY;	}	/*	 * Reset MAC and BBP registers.	 */	reg = 0;	rt2x00_set_field32(&reg, MAC_CSR1_SOFT_RESET, 1);	rt2x00_set_field32(&reg, MAC_CSR1_BBP_RESET, 1);	rt2x00pci_register_write(rt2x00dev, MAC_CSR1, reg);	rt2x00pci_register_read(rt2x00dev, MAC_CSR1, &reg);	rt2x00_set_field32(&reg, MAC_CSR1_SOFT_RESET, 0);	rt2x00_set_field32(&reg, MAC_CSR1_BBP_RESET, 0);	rt2x00pci_register_write(rt2x00dev, MAC_CSR1, reg);	rt2x00pci_register_read(rt2x00dev, MAC_CSR1, &reg);	rt2x00_set_field32(&reg, MAC_CSR1_HOST_READY, 1);	rt2x00pci_register_write(rt2x00dev, MAC_CSR1, reg);	return 0;}static void rt61pci_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, 5, &word);		rt2x00_set_field32(&word, RXD_W5_BUFFER_PHYSICAL_ADDRESS,				   ring->entry[i].data_dma);		rt2x00_desc_write(rxd, 5, 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 rt61pci_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_COUNT, 1);		rt2x00_desc_write(txd, 1, word);		rt2x00_desc_read(txd, 5, &word);		rt2x00_set_field32(&word, TXD_W5_PID_TYPE, queue);		rt2x00_set_field32(&word, TXD_W5_PID_SUBTYPE, i);		rt2x00_desc_write(txd, 5, word);		rt2x00_desc_read(txd, 6, &word);		rt2x00_set_field32(&word, TXD_W6_BUFFER_PHYSICAL_ADDRESS,				   ring->entry[i].data_dma);		rt2x00_desc_write(txd, 6, 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 rt61pci_init_rings(struct rt2x00_dev *rt2x00dev){	u32 reg;	/*	 * Initialize rings.	 */	rt61pci_init_rxring(rt2x00dev);	rt61pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_DATA0);	rt61pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_DATA1);	rt61pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_DATA2);	rt61pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_DATA3);	rt61pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_DATA4);	/*	 * Initialize registers.	 */	rt2x00pci_register_read(rt2x00dev, TX_RING_CSR0, &reg);	rt2x00_set_field32(&reg, TX_RING_CSR0_AC0_RING_SIZE,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA0].stats.limit);	rt2x00_set_field32(&reg, TX_RING_CSR0_AC1_RING_SIZE,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA1].stats.limit);	rt2x00_set_field32(&reg, TX_RING_CSR0_AC2_RING_SIZE,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA2].stats.limit);	rt2x00_set_field32(&reg, TX_RING_CSR0_AC3_RING_SIZE,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA3].stats.limit);	rt2x00pci_register_write(rt2x00dev, TX_RING_CSR0, reg);	rt2x00pci_register_read(rt2x00dev, TX_RING_CSR1, &reg);	rt2x00_set_field32(&reg, TX_RING_CSR1_MGMT_RING_SIZE,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA4].stats.limit);	rt2x00_set_field32(&reg, TX_RING_CSR1_TXD_SIZE,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA0].desc_size /			   4);	rt2x00pci_register_write(rt2x00dev, TX_RING_CSR1, reg);	rt2x00pci_register_read(rt2x00dev, AC0_BASE_CSR, &reg);	rt2x00_set_field32(&reg, AC0_BASE_CSR_RING_REGISTER,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA0].data_dma);	rt2x00pci_register_write(rt2x00dev, AC0_BASE_CSR, reg);	rt2x00pci_register_read(rt2x00dev, AC1_BASE_CSR, &reg);	rt2x00_set_field32(&reg, AC1_BASE_CSR_RING_REGISTER,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA1].data_dma);	rt2x00pci_register_write(rt2x00dev, AC1_BASE_CSR, reg);	rt2x00pci_register_read(rt2x00dev, AC2_BASE_CSR, &reg);	rt2x00_set_field32(&reg, AC2_BASE_CSR_RING_REGISTER,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA2].data_dma);	rt2x00pci_register_write(rt2x00dev, AC2_BASE_CSR, reg);	rt2x00pci_register_read(rt2x00dev, AC3_BASE_CSR, &reg);	rt2x00_set_field32(&reg, AC3_BASE_CSR_RING_REGISTER,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA3].data_dma);	rt2x00pci_register_write(rt2x00dev, AC3_BASE_CSR, reg);	rt2x00pci_register_read(rt2x00dev, MGMT_BASE_CSR, &reg);	rt2x00_set_field32(&reg, MGMT_BASE_CSR_RING_REGISTER,			   rt2x00dev->tx[IEEE80211_TX_QUEUE_DATA4].data_dma);	rt2x00pci_register_write(rt2x00dev, MGMT_BASE_CSR, reg);	rt2x00pci_register_read(rt2x00dev, RX_RING_CSR, &reg);	rt2x00_set_field32(&reg, RX_RING_CSR_RING_SIZE,			   rt2x00dev->rx->stats.limit);	rt2x00_set_field32(&reg, RX_RING_CSR_RXD_SIZE,			   rt2x00dev->rx->desc_size / 4);	rt2x00_set_field32(&reg, RX_RING_CSR_RXD_WRITEBACK_SIZE, 4);	rt2x00pci_register_write(rt2x00dev, RX_RING_CSR, reg);	rt2x00pci_register_read(rt2x00dev, RX_BASE_CSR, &reg);	rt2x00_set_field32(&reg, RX_BASE_CSR_RING_REGISTER,			   rt2x00dev->rx->data_dma);	rt2x00pci_register_write(rt2x00dev, RX_BASE_CSR, reg);	rt2x00pci_register_read(rt2x00dev, TX_DMA_DST_CSR, &reg);	rt2x00_set_field32(&reg, TX_DMA_DST_CSR_DEST_AC0, 2);	rt2x00_set_field32(&reg, TX_DMA_DST_CSR_DEST_AC1, 2);	rt2x00_set_field32(&reg, TX_DMA_DST_CSR_DEST_AC2, 2);	rt2x00_set_field32(&reg, TX_DMA_DST_CSR_DEST_AC3, 2);	rt2x00_set_field32(&reg, TX_DMA_DST_CSR_DEST_MGMT, 0);	rt2x00pci_register_write(rt2x00dev, TX_DMA_DST_CSR, reg);	rt2x00pci_register_read(rt2x00dev, LOAD_TX_RING_CSR, &reg);	rt2x00_set_field32(&reg, LOAD_TX_RING_CSR_LOAD_TXD_AC0, 1);	rt2x00_set_field32(&reg, LOAD_TX_RING_CSR_LOAD_TXD_AC1, 1);	rt2x00_set_field32(&reg, LOAD_TX_RING_CSR_LOAD_TXD_AC2, 1);	rt2x00_set_field32(&reg, LOAD_TX_RING_CSR_LOAD_TXD_AC3, 1);	rt2x00_set_field32(&reg, LOAD_TX_RING_CSR_LOAD_TXD_MGMT, 1);	rt2x00pci_register_write(rt2x00dev, LOAD_TX_RING_CSR, reg);	rt2x00pci_register_read(rt2x00dev, RX_CNTL_CSR, &reg);	rt2x00_set_field32(&reg, RX_CNTL_CSR_LOAD_RXD, 1);	rt2x00pci_register_write(rt2x00dev, RX_CNTL_CSR, reg);	return 0;}static int rt61pci_init_registers(struct rt2x00_dev *rt2x00dev){	u32 reg;	rt2x00pci_register_read(rt2x00dev, TXRX_CSR0, &reg);	rt2x00_set_field32(&reg, TXRX_CSR0_AUTO_TX_SEQ, 1);	rt2x00_set_field32(&reg, TXRX_CSR0_DISABLE_RX, 0);	rt2x00_set_field32(&reg, TXRX_CSR0_TX_WITHOUT_WAITING, 0);	rt2x00pci_register_write(rt2x00dev, TXRX_CSR0, reg);	rt2x00pci_register_read(rt2x00dev, TXRX_CSR1, &reg);	rt2x00_set_field32(&reg, TXRX_CSR1_BBP_ID0, 47); /* CCK Signal */	rt2x00_set_field32(&reg, TXRX_CSR1_BBP_ID0_VALID, 1);	rt2x00_set_field32(&reg, TXRX_CSR1_BBP_ID1, 30); /* Rssi */	rt2x00_set_field32(&reg, TXRX_CSR1_BBP_ID1_VALID, 1);	rt2x00_set_field32(&reg, TXRX_CSR1_BBP_ID2, 42); /* OFDM Rate */	rt2x00_set_field32(&reg, TXRX_CSR1_BBP_ID2_VALID, 1);	rt2x00_set_field32(&reg, TXRX_CSR1_BBP_ID3, 30); /* Rssi */	rt2x00_set_field32(&reg, TXRX_CSR1_BBP_ID3_VALID, 1);	rt2x00pci_register_write(rt2x00dev, TXRX_CSR1, reg);	/*	 * CCK TXD BBP registers	 */	rt2x00pci_register_read(rt2x00dev, TXRX_CSR2, &reg);	rt2x00_set_field32(&reg, TXRX_CSR2_BBP_ID0, 13);	rt2x00_set_field32(&reg, TXRX_CSR2_BBP_ID0_VALID, 1);	rt2x00_set_field32(&reg, TXRX_CSR2_BBP_ID1, 12);	rt2x00_set_field32(&reg, TXRX_CSR2_BBP_ID1_VALID, 1);	rt2x00_set_field32(&reg, TXRX_CSR2_BBP_ID2, 11);	rt2x00_set_field32(&reg, TXRX_CSR2_BBP_ID2_VALID, 1);	rt2x00_set_field32(&reg, TXRX_CSR2_BBP_ID3, 10);	rt2x00_set_field32(&reg, TXRX_CSR2_BBP_ID3_VALID, 1);	rt2x00pci_register_write(rt2x00dev, TXRX_CSR2, reg);	/*	 * OFDM TXD BBP registers	 */	rt2x00pci_register_read(rt2x00dev, TXRX_CSR3, &reg);	rt2x00_set_field32(&reg, TXRX_CSR3_BBP_ID0, 7);	rt2x00_set_field32(&reg, TXRX_CSR3_BBP_ID0_VALID, 1);	rt2x00_set_field32(&reg, TXRX_CSR3_BBP_ID1, 6);	rt2x00_set_field32(&reg, TXRX_CSR3_BBP_ID1_VALID, 1);	rt2x00_set_field32(&reg, TXRX_CSR3_BBP_ID2, 5);	rt2x00_set_field32(&reg, TXRX_CSR3_BBP_ID2_VALID, 1);	rt2x00pci_register_write(rt2x00dev, TXRX_CSR3, reg);	rt2x00pci_register_read(rt2x00dev, TXRX_CSR7, &reg);	rt2x00_set_field32(&reg, TXRX_CSR7_ACK_CTS_6MBS, 59);	rt2x00_set_field32(&reg, TXRX_CSR7_ACK_CTS_9MBS, 53);	rt2x00_set_field32(&reg, TXRX_CSR7_ACK_CTS_12MBS, 49);	rt2x00_set_field32(&reg, TXRX_CSR7_ACK_CTS_18MBS, 46);	rt2x00pci_register_write(rt2x00dev, TXRX_CSR7, reg);	rt2x00pci_register_read(rt2x00dev, TXRX_CSR8, &reg);	rt2x00_set_field32(&reg, TXRX_CSR8_ACK_CTS_24MBS, 44);	rt2x00_set_field32(&reg, TXRX_CSR8_ACK_CTS_36MBS, 42);	rt2x00_set_field32(&reg, TXRX_CSR8_ACK_CTS_48MBS, 42);	rt2x00_set_field32(&reg, TXRX_CSR8_ACK_CTS_54MBS, 42);	rt2x00pci_register_write(rt2x00dev, TXRX_CSR8, reg);	rt2x00pci_register_write(rt2x00dev, TXRX_CSR15, 0x0000000f);	rt2x00pci_register_write(rt2x00dev, MAC_CSR6, 0x00000fff);	rt2x00pci_register_read(rt2x00dev, MAC_CSR9, &reg);	rt2x00_set_field32(&reg, MAC_CSR9_CW_SELECT, 0);	rt2x00pci_register_write(rt2x00dev, MAC_CSR9, reg);	rt2x00pci_register_write(rt2x00dev, MAC_CSR10, 0x0000071c);	if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE))		return -EBUSY;	rt2x00pci_register_write(rt2x00dev, MAC_CSR13, 0x0000e000);	/*	 * Invalidate all Shared Keys (SEC_CSR0),	 * and clear the Shared key Cipher algorithms (SEC_CSR1 & SEC_CSR5)	 */	rt2x00pci_register_write(rt2x00dev, SEC_CSR0, 0x00000000);	rt2x00pci_register_write(rt2x00dev, SEC_CSR1, 0x00000000);	rt2x00pci_register_write(rt2x00dev, SEC_CSR5, 0x00000000);	rt2x00pci_register_write(rt2x00dev, PHY_CSR1, 0x000023b0);	rt2x00pci_register_write(rt2x00dev, PHY_CSR5, 0x060a100c);	rt2x00pci_register_write(rt2x00dev, PHY_CSR6, 0x00080606);	rt2x00pci_register_write(rt2x00dev, PHY_CSR7, 0x00000a08);	rt2x00pci_register_write(rt2x00dev, PCI_CFG_CSR, 0x28ca4404);	rt2x00pci_register_write(rt2x00dev, TEST_MODE_CSR, 0x00000200);	rt2x00pci_register_write(rt2x00dev, M2H_CMD_DONE_CSR, 0xffffffff);	rt2x00pci_register_read(rt2x00dev, AC_TXOP_CSR0, &reg);	rt2x00_set_field32(&reg, AC_TXOP_CSR0_AC0_TX_OP, 0);	rt2x00_set_field32(&reg, AC_TXOP_CSR0_AC1_TX_OP, 0);	rt2x00pci_register_write(rt2x00dev, AC_TXOP_CSR0, reg);	rt2x00pci_register_read(rt2x00dev, AC_TXOP_CSR1, &reg);	rt2x00_set_field32(&reg, AC_TXOP_CSR1_AC2_TX_OP, 192);	rt2x00_set_field32(&reg, AC_TXOP_CSR1_AC3_TX_OP, 48);	rt2x00pci_register_write(rt2x00dev, AC_TXOP_CSR1, reg);	/*	 * We must clear the error counters.	 * These registers are cleared on read,	 * so we may pass a useless variable to store the value.	 */	rt2x00pci_register_read(rt2x00dev, STA_CSR0, &reg);	rt2x00pci_register_read(rt2x00dev, STA_CSR1, &reg);	rt2x00pci_register_read(rt2x00dev, STA_CSR2, &reg);	/*	 * Reset MAC and BBP registers.	 */	rt2x00pci_register_read(rt2x00dev, MAC_CSR1, &reg);	rt2x00_set_field32(&reg, MAC_CSR1_SOFT_RESET, 1);	rt2x00_set_field32(&reg, MAC_CSR1_BBP_RESET, 1);	rt2x00pci_register_write(rt2x00dev, MAC_CSR1, reg);	rt2x00pci_register_read(rt2x00dev, MAC_CSR1, &reg);	rt2x00_set_field32(&reg, MAC_CSR1_SOFT_RESET, 0);	rt2x00_set_field32(&reg, MAC_CSR1_BBP_RESET, 0);	rt2x00pci_register_write(rt2x00dev, MAC_CSR1, reg);	rt2x00pci_register_read(rt2x00dev, MAC_CSR1, &reg);	rt2x00_set_field32(&reg, MAC_CSR1_HOST_READY, 1);

⌨️ 快捷键说明

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