[PATCH 3/3] Add support for 3680
Pontus Fuchs
pontus.fuchs at gmail.com
Fri Nov 29 09:41:11 EST 2013
3680 has a few registers on other addresses.
Signed-off-by: Pontus Fuchs <pontus.fuchs at gmail.com>
---
dxe.c | 8 +++++++-
dxe.h | 4 ++--
main.c | 13 +++++++++++++
wcn36xx.h | 4 ++++
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/dxe.c b/dxe.c
index dd7207d..1f4f044 100644
--- a/dxe.c
+++ b/dxe.c
@@ -672,6 +672,12 @@ int wcn36xx_dxe_tx_frame(struct wcn36xx *wcn,
return 0;
}
+#define wcn36xx_dxe_write_register_x(wcn, reg, reg_data) \
+ if (wcn->chip_version == WCN36XX_CHIP_3680) \
+ wcn36xx_dxe_write_register(wcn, reg ## _3680, reg_data); \
+ else \
+ wcn36xx_dxe_write_register(wcn, reg ## _3660, reg_data); \
+
int wcn36xx_dxe_init(struct wcn36xx *wcn)
{
int reg_data = 0, ret;
@@ -681,7 +687,7 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)
/* Setting interrupt path */
reg_data = WCN36XX_DXE_CCU_INT;
- wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_REG_CCU_INT, reg_data);
+ wcn36xx_dxe_write_register_x(wcn, WCN36XX_DXE_REG_CCU_INT, reg_data);
/***************************************/
/* Init descriptors for TX LOW channel */
diff --git a/dxe.h b/dxe.h
index 83b4d89..b30167c 100644
--- a/dxe.h
+++ b/dxe.h
@@ -29,11 +29,11 @@ H2H_TEST_RX_TX = DMA2
*/
/* DXE registers */
-#define WCN36XX_DXE_MEM_BASE 0x03000000
#define WCN36XX_DXE_MEM_REG 0x202000
#define WCN36XX_DXE_CCU_INT 0xA0011
-#define WCN36XX_DXE_REG_CCU_INT 0x200b10
+#define WCN36XX_DXE_REG_CCU_INT_3660 0x200b10
+#define WCN36XX_DXE_REG_CCU_INT_3680 0x2050dc
/* TODO This must calculated properly but not hardcoded */
#define WCN36XX_DXE_CTRL_TX_L 0x328a44
diff --git a/main.c b/main.c
index e882f18..6d8286d 100644
--- a/main.c
+++ b/main.c
@@ -178,6 +178,17 @@ static inline u8 get_sta_index(struct ieee80211_vif *vif,
sta_priv->sta_index;
}
+static void wcn36xx_detect_chip_version(struct wcn36xx *wcn)
+{
+ if (wcn->fw_major == 1 && wcn->fw_minor == 5) {
+ wcn36xx_info("Chip is 3680\n");
+ wcn->chip_version = WCN36XX_CHIP_3680;
+ } else {
+ wcn36xx_info("Chip is 3660\n");
+ wcn->chip_version = WCN36XX_CHIP_3660;
+ }
+}
+
static int wcn36xx_start(struct ieee80211_hw *hw)
{
struct wcn36xx *wcn = hw->priv;
@@ -224,6 +235,8 @@ static int wcn36xx_start(struct ieee80211_hw *hw)
goto out_free_smd_buf;
}
+ wcn36xx_detect_chip_version(wcn);
+
/* DMA channel initialization */
ret = wcn36xx_dxe_init(wcn);
if (ret) {
diff --git a/wcn36xx.h b/wcn36xx.h
index 01737fc..6974278 100644
--- a/wcn36xx.h
+++ b/wcn36xx.h
@@ -176,6 +176,7 @@ struct wcn36xx {
u8 fw_version;
u8 fw_minor;
u8 fw_major;
+ u32 chip_version;
/* extra byte for the NULL termination */
u8 crm_version[WCN36XX_HAL_VERSION_LENGTH + 1];
@@ -223,6 +224,9 @@ struct wcn36xx {
};
+#define WCN36XX_CHIP_3660 0
+#define WCN36XX_CHIP_3680 1
+
static inline bool wcn36xx_is_fw_version(struct wcn36xx *wcn,
u8 major,
u8 minor,
--
1.8.3.2
More information about the wcn36xx
mailing list