|
|
|
@ -1,9 +1,7 @@ |
|
|
|
|
From dda25991ee4dc0a2ebe2e3b50857971fe1d878c4 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Ivo van Doorn <IvDoorn@gmail.com>
|
|
|
|
|
Date: Sun, 28 Dec 2008 12:48:53 +0000 (+0100)
|
|
|
|
|
Subject: rt2x00: Implement support for rt2800pci
|
|
|
|
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fivd%2Frt2x00.git;a=commitdiff_plain;h=0be1744a47e7513f862554273216a8d37d2760e8
|
|
|
|
|
|
|
|
|
|
rt2x00: Implement support for rt2800pci
|
|
|
|
|
Date: Sat, 10 Jan 2009 11:03:23 +0100
|
|
|
|
|
Subject: [PATCH] rt2x00: Implement support for rt2800pci
|
|
|
|
|
|
|
|
|
|
Add support for the rt2800pci chipset.
|
|
|
|
|
|
|
|
|
@ -14,7 +12,14 @@ Signed-off-by: Mark Asselstine <asselsm@gmail.com> |
|
|
|
|
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|
|
|
|
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
drivers/net/wireless/rt2x00/Kconfig | 15 +
|
|
|
|
|
drivers/net/wireless/rt2x00/Makefile | 1 +
|
|
|
|
|
drivers/net/wireless/rt2x00/rt2800pci.c | 2707 +++++++++++++++++++++++++++++++
|
|
|
|
|
drivers/net/wireless/rt2x00/rt2800pci.h | 1879 +++++++++++++++++++++
|
|
|
|
|
drivers/net/wireless/rt2x00/rt2x00.h | 4 +
|
|
|
|
|
5 files changed, 4606 insertions(+), 0 deletions(-)
|
|
|
|
|
create mode 100644 drivers/net/wireless/rt2x00/rt2800pci.c
|
|
|
|
|
create mode 100644 drivers/net/wireless/rt2x00/rt2800pci.h
|
|
|
|
|
--- a/drivers/net/wireless/rt2x00/Makefile
|
|
|
|
|
+++ b/drivers/net/wireless/rt2x00/Makefile
|
|
|
|
|
@@ -16,5 +16,6 @@ obj-$(CONFIG_RT2X00_LIB_USB) += rt2x00u
|
|
|
|
@ -26,7 +31,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
obj-$(CONFIG_RT73USB) += rt73usb.o
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
|
|
|
|
@@ -0,0 +1,2693 @@
|
|
|
|
|
@@ -0,0 +1,2707 @@
|
|
|
|
|
+/*
|
|
|
|
|
+ Copyright (C) 2004 - 2008 rt2x00 SourceForge Project
|
|
|
|
|
+ <http://rt2x00.serialmonkey.com>
|
|
|
|
@ -1044,6 +1049,9 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+ return -EBUSY;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000002);
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, AUTOWAKEUP_CFG, 0x00000000);
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
|
|
+ * Disable DMA, will be reenabled later when enabling
|
|
|
|
|
+ * the radio.
|
|
|
|
@ -1056,10 +1064,6 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
|
|
|
|
|
+
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, WPDMA_RST_IDX, ~0);
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x0e1f);
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x0e00);
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
|
|
+ * enable Host program ram write selection
|
|
|
|
|
+ */
|
|
|
|
@ -1092,6 +1096,11 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
|
|
+ * Disable interrupts
|
|
|
|
|
+ */
|
|
|
|
|
+ rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_IRQ_OFF);
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
|
|
+ * Initialize BBP R/W access agent
|
|
|
|
|
+ */
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
|
|
|
|
@ -1203,13 +1212,17 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, WPDMA_RST_IDX, reg);
|
|
|
|
|
+
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f);
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000000);
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00);
|
|
|
|
|
+
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
|
|
|
|
|
+
|
|
|
|
|
+ rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, ®);
|
|
|
|
|
+ rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_CSR, 1);
|
|
|
|
|
+ rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_BBP, 1);
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
|
|
|
|
|
+
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000);
|
|
|
|
|
+
|
|
|
|
|
+ rt2x00pci_register_read(rt2x00dev, BCN_OFFSET0, ®);
|
|
|
|
|
+ rt2x00_set_field32(®, BCN_OFFSET0_BCN0, 0xe0); /* 0x3800 */
|
|
|
|
|
+ rt2x00_set_field32(®, BCN_OFFSET0_BCN1, 0xe8); /* 0x3a00 */
|
|
|
|
@ -1465,6 +1478,14 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+ unsigned int i;
|
|
|
|
|
+ u8 value;
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
|
|
+ * BBP was enabled after firmware was loaded,
|
|
|
|
|
+ * but we need to reactivate it now.
|
|
|
|
|
+ */
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, H2M_BBP_AGENT, 0x00000000);
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0x00000000);
|
|
|
|
|
+ msleep(1);
|
|
|
|
|
+
|
|
|
|
|
+ for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
|
|
|
|
+ rt2800pci_bbp_read(rt2x00dev, 0, &value);
|
|
|
|
|
+ if ((value != 0xff) && (value != 0x00))
|
|
|
|
@ -1564,6 +1585,12 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+ rt2x00_set_field32(®, INT_MASK_CSR_HCCA_DMA_DONE, mask);
|
|
|
|
|
+ rt2x00_set_field32(®, INT_MASK_CSR_MGMT_DMA_DONE, mask);
|
|
|
|
|
+ rt2x00_set_field32(®, INT_MASK_CSR_MCU_COMMAND, mask);
|
|
|
|
|
+ rt2x00_set_field32(®, INT_MASK_CSR_RXTX_COHERENT, mask);
|
|
|
|
|
+ rt2x00_set_field32(®, INT_MASK_CSR_TBTT, mask);
|
|
|
|
|
+ rt2x00_set_field32(®, INT_MASK_CSR_PRE_TBTT, mask);
|
|
|
|
|
+ rt2x00_set_field32(®, INT_MASK_CSR_TX_FIFO_STATUS, mask);
|
|
|
|
|
+ rt2x00_set_field32(®, INT_MASK_CSR_AUTO_WAKEUP, mask);
|
|
|
|
|
+ rt2x00_set_field32(®, INT_MASK_CSR_GPTIMER, mask);
|
|
|
|
|
+ rt2x00_set_field32(®, INT_MASK_CSR_RX_COHERENT, mask);
|
|
|
|
|
+ rt2x00_set_field32(®, INT_MASK_CSR_TX_COHERENT, mask);
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, INT_MASK_CSR, reg);
|
|
|
|
@ -1601,7 +1628,10 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+ rt2800pci_init_bbp(rt2x00dev)))
|
|
|
|
|
+ return -EIO;
|
|
|
|
|
+
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00001a80);
|
|
|
|
|
+ /*
|
|
|
|
|
+ * Send signal to firmware during boot time.
|
|
|
|
|
+ */
|
|
|
|
|
+ rt2800pci_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0xff, 0, 0);
|
|
|
|
|
+
|
|
|
|
|
+ /* Wait for DMA, ignore error */
|
|
|
|
|
+ rt2800pci_wait_wpdma_ready(rt2x00dev);
|
|
|
|
@ -1612,6 +1642,8 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+ rt2x00pci_register_read(rt2x00dev, WPDMA_GLO_CFG, ®);
|
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 1);
|
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_RX_DMA, 1);
|
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_WP_DMA_BURST_SIZE, 2);
|
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
|
|
|
|
|
+
|
|
|
|
|
+ rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, ®);
|
|
|
|
@ -1634,14 +1666,6 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+ rt2800pci_mcu_request(rt2x00dev, MCU_LED_3, 0xff,
|
|
|
|
|
+ word & 0xff, (word >> 8) & 0xff);
|
|
|
|
|
+
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
|
|
+ * Send signal to firmware during boot time.
|
|
|
|
|
+ */
|
|
|
|
|
+ rt2800pci_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0xff, 0, 0);
|
|
|
|
|
+
|
|
|
|
|
+ return 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
@ -1651,7 +1675,10 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+
|
|
|
|
|
+ rt2x00pci_register_read(rt2x00dev, WPDMA_GLO_CFG, ®);
|
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
|
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
|
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
|
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
|
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
|
|
|
|
|
+
|
|
|
|
|
+ rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, 0);
|
|
|
|
@ -1768,8 +1795,8 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+ rt2x00_desc_read(txwi, 1, &word);
|
|
|
|
|
+ rt2x00_set_field32(&word, TXWI_W1_ACK,
|
|
|
|
|
+ test_bit(ENTRY_TXD_ACK, &txdesc->flags));
|
|
|
|
|
+ rt2x00_set_field32(&word, TXWI_W1_ACK,
|
|
|
|
|
+ test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags));
|
|
|
|
|
+ rt2x00_set_field32(&word, TXWI_W1_NSEQ,
|
|
|
|
|
+ test_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags));
|
|
|
|
|
+ rt2x00_set_field32(&word, TXWI_W1_BW_WIN_SIZE, txdesc->ba_size);
|
|
|
|
|
+ rt2x00_set_field32(&word, TXWI_W1_WIRELESS_CLI_ID,
|
|
|
|
|
+ skbdesc->entry->entry_idx);
|
|
|
|
@ -1943,26 +1970,18 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+ if (rt2x00_get_field32(rxwi1, RXWI_W1_BW))
|
|
|
|
|
+ rxdesc->flags |= RX_FLAG_40MHZ;
|
|
|
|
|
+
|
|
|
|
|
+ switch (rt2x00_get_field32(rxwi1, RXWI_W1_PHYMODE)) {
|
|
|
|
|
+ case RATE_MODE_CCK:
|
|
|
|
|
+ /*
|
|
|
|
|
+ * Mask of 0x8 bit to remove the short preamble flag.
|
|
|
|
|
+ */
|
|
|
|
|
+ rxdesc->signal =
|
|
|
|
|
+ (RATE_MODE_CCK << 8) |
|
|
|
|
|
+ (rt2x00_get_field32(rxwi1, RXWI_W1_MCS) & ~0x8);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case RATE_MODE_OFDM:
|
|
|
|
|
+ rxdesc->signal =
|
|
|
|
|
+ (RATE_MODE_OFDM << 8) |
|
|
|
|
|
+ rt2x00_get_field32(rxwi1, RXWI_W1_MCS);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case RATE_MODE_HT_MIX:
|
|
|
|
|
+ case RATE_MODE_HT_GREENFIELD:
|
|
|
|
|
+ rxdesc->signal = rt2x00_get_field32(rxwi1, RXWI_W1_MCS);
|
|
|
|
|
+ rxdesc->flags |= RX_FLAG_HT;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ /*
|
|
|
|
|
+ * Detect RX rate, always use MCS as signal type.
|
|
|
|
|
+ */
|
|
|
|
|
+ rxdesc->dev_flags |= RXDONE_SIGNAL_MCS;
|
|
|
|
|
+ rxdesc->rate_mode = rt2x00_get_field32(rxwi1, RXWI_W1_PHYMODE);
|
|
|
|
|
+ rxdesc->signal = rt2x00_get_field32(rxwi1, RXWI_W1_MCS);
|
|
|
|
|
+
|
|
|
|
|
+ /*
|
|
|
|
|
+ * Mask of 0x8 bit to remove the short preamble flag.
|
|
|
|
|
+ */
|
|
|
|
|
+ if (rxdesc->dev_flags == RATE_MODE_CCK)
|
|
|
|
|
+ rxdesc->signal &= ~0x8;
|
|
|
|
|
+
|
|
|
|
|
+ rxdesc->rssi =
|
|
|
|
|
+ (rt2x00_get_field32(rxwi2, RXWI_W2_RSSI0) +
|
|
|
|
@ -2722,7 +2741,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+module_exit(rt2800pci_exit);
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/drivers/net/wireless/rt2x00/rt2800pci.h
|
|
|
|
|
@@ -0,0 +1,1873 @@
|
|
|
|
|
@@ -0,0 +1,1879 @@
|
|
|
|
|
+/*
|
|
|
|
|
+ Copyright (C) 2004 - 2008 rt2x00 SourceForge Project
|
|
|
|
|
+ <http://rt2x00.serialmonkey.com>
|
|
|
|
@ -2816,13 +2835,13 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+ * LOAD_STATUS: 1:loading, 0:done.
|
|
|
|
|
+ */
|
|
|
|
|
+#define E2PROM_CSR 0x0004
|
|
|
|
|
+#define E2PROM_CSR_RELOAD FIELD32(0x00000001)
|
|
|
|
|
+#define E2PROM_CSR_DATA_CLOCK FIELD32(0x00000002)
|
|
|
|
|
+#define E2PROM_CSR_CHIP_SELECT FIELD32(0x00000004)
|
|
|
|
|
+#define E2PROM_CSR_DATA_IN FIELD32(0x00000008)
|
|
|
|
|
+#define E2PROM_CSR_DATA_OUT FIELD32(0x00000010)
|
|
|
|
|
+#define E2PROM_CSR_DATA_CLOCK FIELD32(0x00000001)
|
|
|
|
|
+#define E2PROM_CSR_CHIP_SELECT FIELD32(0x00000002)
|
|
|
|
|
+#define E2PROM_CSR_DATA_IN FIELD32(0x00000004)
|
|
|
|
|
+#define E2PROM_CSR_DATA_OUT FIELD32(0x00000008)
|
|
|
|
|
+#define E2PROM_CSR_TYPE_93C46 FIELD32(0x00000020)
|
|
|
|
|
+#define E2PROM_CSR_LOAD_STATUS FIELD32(0x00000040)
|
|
|
|
|
+#define E2PROM_CSR_RELOAD FIELD32(0x00000080)
|
|
|
|
|
+
|
|
|
|
|
+/*
|
|
|
|
|
+ * HOST-MCU shared memory
|
|
|
|
@ -2869,8 +2888,14 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+#define INT_MASK_CSR_HCCA_DMA_DONE FIELD32(0x00000080)
|
|
|
|
|
+#define INT_MASK_CSR_MGMT_DMA_DONE FIELD32(0x00000100)
|
|
|
|
|
+#define INT_MASK_CSR_MCU_COMMAND FIELD32(0x00000200)
|
|
|
|
|
+#define INT_MASK_CSR_RX_COHERENT FIELD32(0x40000000)
|
|
|
|
|
+#define INT_MASK_CSR_TX_COHERENT FIELD32(0x80000000)
|
|
|
|
|
+#define INT_MASK_CSR_RXTX_COHERENT FIELD32(0x00000400)
|
|
|
|
|
+#define INT_MASK_CSR_TBTT FIELD32(0x00000800)
|
|
|
|
|
+#define INT_MASK_CSR_PRE_TBTT FIELD32(0x00001000)
|
|
|
|
|
+#define INT_MASK_CSR_TX_FIFO_STATUS FIELD32(0x00002000)
|
|
|
|
|
+#define INT_MASK_CSR_AUTO_WAKEUP FIELD32(0x00004000)
|
|
|
|
|
+#define INT_MASK_CSR_GPTIMER FIELD32(0x00008000)
|
|
|
|
|
+#define INT_MASK_CSR_RX_COHERENT FIELD32(0x00010000)
|
|
|
|
|
+#define INT_MASK_CSR_TX_COHERENT FIELD32(0x00020000)
|
|
|
|
|
+
|
|
|
|
|
+/*
|
|
|
|
|
+ * WPDMA_GLO_CFG
|
|
|
|
@ -4242,7 +4267,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+#define EEPROM_MAC_ADDR_0 0x0002
|
|
|
|
|
+#define EEPROM_MAC_ADDR_BYTE0 FIELD16(0x00ff)
|
|
|
|
|
+#define EEPROM_MAC_ADDR_BYTE1 FIELD16(0xff00)
|
|
|
|
|
+#define EEPROM_MAC_ADDR1 0x0003
|
|
|
|
|
+#define EEPROM_MAC_ADDR_1 0x0003
|
|
|
|
|
+#define EEPROM_MAC_ADDR_BYTE2 FIELD16(0x00ff)
|
|
|
|
|
+#define EEPROM_MAC_ADDR_BYTE3 FIELD16(0xff00)
|
|
|
|
|
+#define EEPROM_MAC_ADDR_2 0x0004
|
|
|
|
@ -4598,7 +4623,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> |
|
|
|
|
+#endif /* RT2800PCI_H */
|
|
|
|
|
--- a/drivers/net/wireless/rt2x00/rt2x00.h
|
|
|
|
|
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
|
|
|
|
|
@@ -138,6 +138,10 @@ struct rt2x00_chip {
|
|
|
|
|
@@ -139,6 +139,10 @@ struct rt2x00_chip {
|
|
|
|
|
#define RT2561 0x0302
|
|
|
|
|
#define RT2661 0x0401
|
|
|
|
|
#define RT2571 0x1300
|