* [PATCH 1/9] wcn36xx: Fix copy paste error hal_exit_bmps -> hal_keep_alive
@ 2014-02-12 19:04 Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 2/9] wcn36xx: Improve feature caps exchange Eugene Krasnikov
` (7 more replies)
0 siblings, 8 replies; 11+ messages in thread
From: Eugene Krasnikov @ 2014-02-12 19:04 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Pontus Fuchs
From: Pontus Fuchs <pontus.fuchs@gmail.com>
Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
---
drivers/net/wireless/ath/wcn36xx/smd.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c
index 750626b..8a57dfe 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.c
+++ b/drivers/net/wireless/ath/wcn36xx/smd.c
@@ -1637,12 +1637,12 @@ int wcn36xx_smd_keep_alive_req(struct wcn36xx *wcn,
ret = wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
if (ret) {
- wcn36xx_err("Sending hal_exit_bmps failed\n");
+ wcn36xx_err("Sending hal_keep_alive failed\n");
goto out;
}
ret = wcn36xx_smd_rsp_status_check(wcn->hal_buf, wcn->hal_rsp_len);
if (ret) {
- wcn36xx_err("hal_exit_bmps response failed err=%d\n", ret);
+ wcn36xx_err("hal_keep_alive response failed err=%d\n", ret);
goto out;
}
out:
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/9] wcn36xx: Improve feature caps exchange
2014-02-12 19:04 [PATCH 1/9] wcn36xx: Fix copy paste error hal_exit_bmps -> hal_keep_alive Eugene Krasnikov
@ 2014-02-12 19:04 ` Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 3/9] wcn36xx: Wait longer for SMD commands to complete Eugene Krasnikov
` (6 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Eugene Krasnikov @ 2014-02-12 19:04 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Pontus Fuchs
From: Pontus Fuchs <pontus.fuchs@gmail.com>
* Response format is not in the canonical format.
wcn36xx_smd_rsp_status_check cannot be used.
* Save the FW caps in wcn36xx struct for later use.
Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
---
drivers/net/wireless/ath/wcn36xx/hal.h | 4 +++-
drivers/net/wireless/ath/wcn36xx/smd.c | 15 +++++++++------
drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 1 +
3 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/drivers/net/wireless/ath/wcn36xx/hal.h b/drivers/net/wireless/ath/wcn36xx/hal.h
index 3c2ef0c..a1f1127 100644
--- a/drivers/net/wireless/ath/wcn36xx/hal.h
+++ b/drivers/net/wireless/ath/wcn36xx/hal.h
@@ -4384,11 +4384,13 @@ enum place_holder_in_cap_bitmap {
MAX_FEATURE_SUPPORTED = 128,
};
+#define WCN36XX_HAL_CAPS_SIZE 4
+
struct wcn36xx_hal_feat_caps_msg {
struct wcn36xx_hal_msg_header header;
- u32 feat_caps[4];
+ u32 feat_caps[WCN36XX_HAL_CAPS_SIZE];
} __packed;
/* status codes to help debug rekey failures */
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c
index 8a57dfe..425365c 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.c
+++ b/drivers/net/wireless/ath/wcn36xx/smd.c
@@ -1731,8 +1731,8 @@ static inline void clear_feat_caps(u32 *bitmap,
int wcn36xx_smd_feature_caps_exchange(struct wcn36xx *wcn)
{
- struct wcn36xx_hal_feat_caps_msg msg_body;
- int ret = 0;
+ struct wcn36xx_hal_feat_caps_msg msg_body, *rsp;
+ int ret = 0, i;
mutex_lock(&wcn->hal_mutex);
INIT_HAL_MSG(msg_body, WCN36XX_HAL_FEATURE_CAPS_EXCHANGE_REQ);
@@ -1746,12 +1746,15 @@ int wcn36xx_smd_feature_caps_exchange(struct wcn36xx *wcn)
wcn36xx_err("Sending hal_feature_caps_exchange failed\n");
goto out;
}
- ret = wcn36xx_smd_rsp_status_check(wcn->hal_buf, wcn->hal_rsp_len);
- if (ret) {
- wcn36xx_err("hal_feature_caps_exchange response failed err=%d\n",
- ret);
+ if (wcn->hal_rsp_len != sizeof(*rsp)) {
+ wcn36xx_err("Invalid hal_feature_caps_exchange response");
goto out;
}
+
+ rsp = (struct wcn36xx_hal_feat_caps_msg *) wcn->hal_buf;
+
+ for (i = 0; i < WCN36XX_HAL_CAPS_SIZE; i++)
+ wcn->fw_feat_caps[i] = rsp->feat_caps[i];
out:
mutex_unlock(&wcn->hal_mutex);
return ret;
diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
index 8fa5cba..c5bd61c 100644
--- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
+++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
@@ -175,6 +175,7 @@ struct wcn36xx {
u8 fw_version;
u8 fw_minor;
u8 fw_major;
+ u32 fw_feat_caps[WCN36XX_HAL_CAPS_SIZE];
/* extra byte for the NULL termination */
u8 crm_version[WCN36XX_HAL_VERSION_LENGTH + 1];
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/9] wcn36xx: Wait longer for SMD commands to complete
2014-02-12 19:04 [PATCH 1/9] wcn36xx: Fix copy paste error hal_exit_bmps -> hal_keep_alive Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 2/9] wcn36xx: Improve feature caps exchange Eugene Krasnikov
@ 2014-02-12 19:04 ` Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 4/9] Cache nv to avoid request_firmware on resume path Eugene Krasnikov
` (5 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Eugene Krasnikov @ 2014-02-12 19:04 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Pontus Fuchs
From: Pontus Fuchs <pontus.fuchs@gmail.com>
On some wcnss firmwares the start command can take up to 300ms to
complete. Currently there is a 200ms timeout for SMD command to
complete which causes the start to fail.
Increase the timeout to 500ms. Also improve debug information
regarding SMD command completion time.
Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
---
drivers/net/wireless/ath/wcn36xx/smd.c | 7 ++++++-
drivers/net/wireless/ath/wcn36xx/smd.h | 2 +-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c
index 425365c..ad93cc7 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.c
+++ b/drivers/net/wireless/ath/wcn36xx/smd.c
@@ -195,9 +195,11 @@ static void wcn36xx_smd_set_sta_params(struct wcn36xx *wcn,
static int wcn36xx_smd_send_and_wait(struct wcn36xx *wcn, size_t len)
{
int ret = 0;
+ unsigned long start;
wcn36xx_dbg_dump(WCN36XX_DBG_SMD_DUMP, "HAL >>> ", wcn->hal_buf, len);
init_completion(&wcn->hal_rsp_compl);
+ start = jiffies;
ret = wcn->ctrl_ops->tx(wcn->hal_buf, len);
if (ret) {
wcn36xx_err("HAL TX failed\n");
@@ -205,10 +207,13 @@ static int wcn36xx_smd_send_and_wait(struct wcn36xx *wcn, size_t len)
}
if (wait_for_completion_timeout(&wcn->hal_rsp_compl,
msecs_to_jiffies(HAL_MSG_TIMEOUT)) <= 0) {
- wcn36xx_err("Timeout while waiting SMD response\n");
+ wcn36xx_err("Timeout! No SMD response in %dms\n",
+ HAL_MSG_TIMEOUT);
ret = -ETIME;
goto out;
}
+ wcn36xx_dbg(WCN36XX_DBG_SMD, "SMD command completed in %dms",
+ jiffies_to_msecs(jiffies - start));
out:
return ret;
}
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.h b/drivers/net/wireless/ath/wcn36xx/smd.h
index e7c3901..c46246f 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.h
+++ b/drivers/net/wireless/ath/wcn36xx/smd.h
@@ -24,7 +24,7 @@
#define WCN36XX_HAL_BUF_SIZE 4096
-#define HAL_MSG_TIMEOUT 200
+#define HAL_MSG_TIMEOUT 500
#define WCN36XX_SMSM_WLAN_TX_ENABLE 0x00000400
#define WCN36XX_SMSM_WLAN_TX_RINGS_EMPTY 0x00000200
/* The PNO version info be contained in the rsp msg */
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 4/9] Cache nv to avoid request_firmware on resume path
2014-02-12 19:04 [PATCH 1/9] wcn36xx: Fix copy paste error hal_exit_bmps -> hal_keep_alive Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 2/9] wcn36xx: Improve feature caps exchange Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 3/9] wcn36xx: Wait longer for SMD commands to complete Eugene Krasnikov
@ 2014-02-12 19:04 ` Eugene Krasnikov
2014-02-12 22:51 ` Kalle Valo
2014-02-12 19:04 ` [PATCH 5/9] wcn36xx: Print FW capabilities Eugene Krasnikov
` (4 subsequent siblings)
7 siblings, 1 reply; 11+ messages in thread
From: Eugene Krasnikov @ 2014-02-12 19:04 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Pontus Fuchs
From: Pontus Fuchs <pontus.fuchs@gmail.com>
If wowlan if off mac80211 will stop / start the driver on suspend /
resume. This causes problems on resume since request_firmware is called
from start. Fix this by caching the nv.
Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
---
drivers/net/wireless/ath/wcn36xx/main.c | 2 ++
drivers/net/wireless/ath/wcn36xx/smd.c | 22 ++++++++++------------
drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 2 ++
3 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c
index e64a678..a801aaa 100644
--- a/drivers/net/wireless/ath/wcn36xx/main.c
+++ b/drivers/net/wireless/ath/wcn36xx/main.c
@@ -17,6 +17,7 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
+#include <linux/firmware.h>
#include <linux/platform_device.h>
#include "wcn36xx.h"
@@ -992,6 +993,7 @@ static int wcn36xx_remove(struct platform_device *pdev)
struct wcn36xx *wcn = hw->priv;
wcn36xx_dbg(WCN36XX_DBG_MAC, "platform remove\n");
+ release_firmware(wcn->nv);
mutex_destroy(&wcn->hal_mutex);
ieee80211_unregister_hw(hw);
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c
index ad93cc7..d5e90c4 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.c
+++ b/drivers/net/wireless/ath/wcn36xx/smd.c
@@ -251,21 +251,22 @@ static int wcn36xx_smd_rsp_status_check(void *buf, size_t len)
int wcn36xx_smd_load_nv(struct wcn36xx *wcn)
{
- const struct firmware *nv;
struct nv_data *nv_d;
struct wcn36xx_hal_nv_img_download_req_msg msg_body;
int fw_bytes_left;
int ret;
u16 fm_offset = 0;
- ret = request_firmware(&nv, WLAN_NV_FILE, wcn->dev);
- if (ret) {
- wcn36xx_err("Failed to load nv file %s: %d\n",
- WLAN_NV_FILE, ret);
- goto out_free_nv;
+ if (!wcn->nv) {
+ ret = request_firmware(&wcn->nv, WLAN_NV_FILE, wcn->dev);
+ if (ret) {
+ wcn36xx_err("Failed to load nv file %s: %d\n",
+ WLAN_NV_FILE, ret);
+ goto out;
+ }
}
- nv_d = (struct nv_data *)nv->data;
+ nv_d = (struct nv_data *)wcn->nv->data;
INIT_HAL_MSG(msg_body, WCN36XX_HAL_DOWNLOAD_NV_REQ);
msg_body.header.len += WCN36XX_NV_FRAGMENT_SIZE;
@@ -275,7 +276,7 @@ int wcn36xx_smd_load_nv(struct wcn36xx *wcn)
mutex_lock(&wcn->hal_mutex);
do {
- fw_bytes_left = nv->size - fm_offset - 4;
+ fw_bytes_left = wcn->nv->size - fm_offset - 4;
if (fw_bytes_left > WCN36XX_NV_FRAGMENT_SIZE) {
msg_body.last_fragment = 0;
msg_body.nv_img_buffer_size = WCN36XX_NV_FRAGMENT_SIZE;
@@ -313,10 +314,7 @@ int wcn36xx_smd_load_nv(struct wcn36xx *wcn)
out_unlock:
mutex_unlock(&wcn->hal_mutex);
-out_free_nv:
- release_firmware(nv);
-
- return ret;
+out: return ret;
}
static int wcn36xx_smd_start_rsp(struct wcn36xx *wcn, void *buf, size_t len)
diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
index c5bd61c..0c5413f 100644
--- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
+++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
@@ -171,6 +171,8 @@ struct wcn36xx {
struct device *dev;
struct list_head vif_list;
+ const struct firmware *nv;
+
u8 fw_revision;
u8 fw_version;
u8 fw_minor;
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 5/9] wcn36xx: Print FW capabilities
2014-02-12 19:04 [PATCH 1/9] wcn36xx: Fix copy paste error hal_exit_bmps -> hal_keep_alive Eugene Krasnikov
` (2 preceding siblings ...)
2014-02-12 19:04 ` [PATCH 4/9] Cache nv to avoid request_firmware on resume path Eugene Krasnikov
@ 2014-02-12 19:04 ` Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 6/9] wcn36xx: Add support for 3680 Eugene Krasnikov
` (3 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Eugene Krasnikov @ 2014-02-12 19:04 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Pontus Fuchs
From: Pontus Fuchs <pontus.fuchs@gmail.com>
After fw caps exchange, print the FW's capabilities.
Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
---
drivers/net/wireless/ath/wcn36xx/main.c | 45 +++++++++++++++++++++++++++++++++
drivers/net/wireless/ath/wcn36xx/smd.c | 9 +++----
drivers/net/wireless/ath/wcn36xx/smd.h | 3 +++
3 files changed, 51 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c
index a801aaa..95fd5c6 100644
--- a/drivers/net/wireless/ath/wcn36xx/main.c
+++ b/drivers/net/wireless/ath/wcn36xx/main.c
@@ -178,6 +178,49 @@ static inline u8 get_sta_index(struct ieee80211_vif *vif,
sta_priv->sta_index;
}
+static const char * const wcn36xx_caps_names[] = {
+ "MCC", /* 0 */
+ "P2P", /* 1 */
+ "DOT11AC", /* 2 */
+ "SLM_SESSIONIZATION", /* 3 */
+ "DOT11AC_OPMODE", /* 4 */
+ "SAP32STA", /* 5 */
+ "TDLS", /* 6 */
+ "P2P_GO_NOA_DECOUPLE_INIT_SCAN",/* 7 */
+ "WLANACTIVE_OFFLOAD", /* 8 */
+ "BEACON_OFFLOAD", /* 9 */
+ "SCAN_OFFLOAD", /* 10 */
+ "ROAM_OFFLOAD", /* 11 */
+ "BCN_MISS_OFFLOAD", /* 12 */
+ "STA_POWERSAVE", /* 13 */
+ "STA_ADVANCED_PWRSAVE", /* 14 */
+ "AP_UAPSD", /* 15 */
+ "AP_DFS", /* 16 */
+ "BLOCKACK", /* 17 */
+ "PHY_ERR", /* 18 */
+ "BCN_FILTER", /* 19 */
+ "RTT", /* 20 */
+ "RATECTRL", /* 21 */
+ "WOW" /* 22 */
+};
+
+static const char *wcn36xx_get_cap_name(enum place_holder_in_cap_bitmap x)
+{
+ if (x >= ARRAY_SIZE(wcn36xx_caps_names))
+ return "UNKNOWN";
+ return wcn36xx_caps_names[x];
+}
+
+static void wcn36xx_feat_caps_info(struct wcn36xx *wcn)
+{
+ int i;
+
+ for (i = 0; i < MAX_FEATURE_SUPPORTED; i++) {
+ if (get_feat_caps(wcn->fw_feat_caps, i))
+ wcn36xx_info("FW Cap %s\n", wcn36xx_get_cap_name(i));
+ }
+}
+
static int wcn36xx_start(struct ieee80211_hw *hw)
{
struct wcn36xx *wcn = hw->priv;
@@ -237,6 +280,8 @@ static int wcn36xx_start(struct ieee80211_hw *hw)
ret = wcn36xx_smd_feature_caps_exchange(wcn);
if (ret)
wcn36xx_warn("Exchange feature caps failed\n");
+ else
+ wcn36xx_feat_caps_info(wcn);
}
INIT_LIST_HEAD(&wcn->vif_list);
return 0;
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c
index d5e90c4..ae36409 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.c
+++ b/drivers/net/wireless/ath/wcn36xx/smd.c
@@ -1685,8 +1685,7 @@ out:
return ret;
}
-static inline void set_feat_caps(u32 *bitmap,
- enum place_holder_in_cap_bitmap cap)
+void set_feat_caps(u32 *bitmap, enum place_holder_in_cap_bitmap cap)
{
int arr_idx, bit_idx;
@@ -1700,8 +1699,7 @@ static inline void set_feat_caps(u32 *bitmap,
bitmap[arr_idx] |= (1 << bit_idx);
}
-static inline int get_feat_caps(u32 *bitmap,
- enum place_holder_in_cap_bitmap cap)
+int get_feat_caps(u32 *bitmap, enum place_holder_in_cap_bitmap cap)
{
int arr_idx, bit_idx;
int ret = 0;
@@ -1717,8 +1715,7 @@ static inline int get_feat_caps(u32 *bitmap,
return ret;
}
-static inline void clear_feat_caps(u32 *bitmap,
- enum place_holder_in_cap_bitmap cap)
+void clear_feat_caps(u32 *bitmap, enum place_holder_in_cap_bitmap cap)
{
int arr_idx, bit_idx;
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.h b/drivers/net/wireless/ath/wcn36xx/smd.h
index c46246f..008d034 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.h
+++ b/drivers/net/wireless/ath/wcn36xx/smd.h
@@ -112,6 +112,9 @@ int wcn36xx_smd_keep_alive_req(struct wcn36xx *wcn,
int wcn36xx_smd_dump_cmd_req(struct wcn36xx *wcn, u32 arg1, u32 arg2,
u32 arg3, u32 arg4, u32 arg5);
int wcn36xx_smd_feature_caps_exchange(struct wcn36xx *wcn);
+void set_feat_caps(u32 *bitmap, enum place_holder_in_cap_bitmap cap);
+int get_feat_caps(u32 *bitmap, enum place_holder_in_cap_bitmap cap);
+void clear_feat_caps(u32 *bitmap, enum place_holder_in_cap_bitmap cap);
int wcn36xx_smd_add_ba_session(struct wcn36xx *wcn,
struct ieee80211_sta *sta,
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 6/9] wcn36xx: Add support for 3680
2014-02-12 19:04 [PATCH 1/9] wcn36xx: Fix copy paste error hal_exit_bmps -> hal_keep_alive Eugene Krasnikov
` (3 preceding siblings ...)
2014-02-12 19:04 ` [PATCH 5/9] wcn36xx: Print FW capabilities Eugene Krasnikov
@ 2014-02-12 19:04 ` Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 7/9] wcn36xx: Rename wcn36xx_vif.ucast_dpu_signature to self_ucast_dpu_sign Eugene Krasnikov
` (2 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Eugene Krasnikov @ 2014-02-12 19:04 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Pontus Fuchs
From: Pontus Fuchs <pontus.fuchs@gmail.com>
3680 has a few registers on other addresses.
Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
---
drivers/net/wireless/ath/wcn36xx/dxe.c | 10 +++++++++-
drivers/net/wireless/ath/wcn36xx/dxe.h | 4 ++--
drivers/net/wireless/ath/wcn36xx/main.c | 28 +++++++++++++++++++++-------
drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 4 ++++
4 files changed, 36 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/ath/wcn36xx/dxe.c b/drivers/net/wireless/ath/wcn36xx/dxe.c
index ee25786..73f12f1 100644
--- a/drivers/net/wireless/ath/wcn36xx/dxe.c
+++ b/drivers/net/wireless/ath/wcn36xx/dxe.c
@@ -44,6 +44,14 @@ static void wcn36xx_dxe_write_register(struct wcn36xx *wcn, int addr, int data)
writel(data, wcn->mmio + addr);
}
+#define wcn36xx_dxe_write_register_x(wcn, reg, reg_data) \
+do { \
+ 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); \
+} while (0) \
+
static void wcn36xx_dxe_read_register(struct wcn36xx *wcn, int addr, int *data)
{
*data = readl(wcn->mmio + addr);
@@ -680,7 +688,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/drivers/net/wireless/ath/wcn36xx/dxe.h b/drivers/net/wireless/ath/wcn36xx/dxe.h
index c88562f..35ee7e9 100644
--- a/drivers/net/wireless/ath/wcn36xx/dxe.h
+++ b/drivers/net/wireless/ath/wcn36xx/dxe.h
@@ -28,11 +28,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/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c
index 95fd5c6..dca21ee 100644
--- a/drivers/net/wireless/ath/wcn36xx/main.c
+++ b/drivers/net/wireless/ath/wcn36xx/main.c
@@ -221,6 +221,17 @@ static void wcn36xx_feat_caps_info(struct wcn36xx *wcn)
}
}
+static void wcn36xx_detect_chip_version(struct wcn36xx *wcn)
+{
+ if (get_feat_caps(wcn->fw_feat_caps, DOT11AC)) {
+ 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;
@@ -267,6 +278,16 @@ static int wcn36xx_start(struct ieee80211_hw *hw)
goto out_free_smd_buf;
}
+ if (!wcn36xx_is_fw_version(wcn, 1, 2, 2, 24)) {
+ ret = wcn36xx_smd_feature_caps_exchange(wcn);
+ if (ret)
+ wcn36xx_warn("Exchange feature caps failed\n");
+ else
+ wcn36xx_feat_caps_info(wcn);
+ }
+
+ wcn36xx_detect_chip_version(wcn);
+
/* DMA channel initialization */
ret = wcn36xx_dxe_init(wcn);
if (ret) {
@@ -276,13 +297,6 @@ static int wcn36xx_start(struct ieee80211_hw *hw)
wcn36xx_debugfs_init(wcn);
- if (!wcn36xx_is_fw_version(wcn, 1, 2, 2, 24)) {
- ret = wcn36xx_smd_feature_caps_exchange(wcn);
- if (ret)
- wcn36xx_warn("Exchange feature caps failed\n");
- else
- wcn36xx_feat_caps_info(wcn);
- }
INIT_LIST_HEAD(&wcn->vif_list);
return 0;
diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
index 0c5413f..b4dc85b 100644
--- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
+++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
@@ -178,6 +178,7 @@ struct wcn36xx {
u8 fw_minor;
u8 fw_major;
u32 fw_feat_caps[WCN36XX_HAL_CAPS_SIZE];
+ u32 chip_version;
/* extra byte for the NULL termination */
u8 crm_version[WCN36XX_HAL_VERSION_LENGTH + 1];
@@ -225,6 +226,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
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 7/9] wcn36xx: Rename wcn36xx_vif.ucast_dpu_signature to self_ucast_dpu_sign
2014-02-12 19:04 [PATCH 1/9] wcn36xx: Fix copy paste error hal_exit_bmps -> hal_keep_alive Eugene Krasnikov
` (4 preceding siblings ...)
2014-02-12 19:04 ` [PATCH 6/9] wcn36xx: Add support for 3680 Eugene Krasnikov
@ 2014-02-12 19:04 ` Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 8/9] wcn36xx: Track dpu signature per sta Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 9/9] wcn36xx: Update dtim period before starting BSS Eugene Krasnikov
7 siblings, 0 replies; 11+ messages in thread
From: Eugene Krasnikov @ 2014-02-12 19:04 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Pontus Fuchs
From: Pontus Fuchs <pontus.fuchs@gmail.com>
This is more line with the names of the other members
Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
---
drivers/net/wireless/ath/wcn36xx/smd.c | 2 +-
drivers/net/wireless/ath/wcn36xx/txrx.c | 2 +-
drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c
index ae36409..c7da55c 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.c
+++ b/drivers/net/wireless/ath/wcn36xx/smd.c
@@ -1121,7 +1121,7 @@ static int wcn36xx_smd_config_bss_rsp(struct wcn36xx *wcn,
priv_vif->sta->bss_dpu_desc_index = params->dpu_desc_index;
}
- priv_vif->ucast_dpu_signature = params->ucast_dpu_signature;
+ priv_vif->self_ucast_dpu_sign = params->ucast_dpu_signature;
return 0;
}
diff --git a/drivers/net/wireless/ath/wcn36xx/txrx.c b/drivers/net/wireless/ath/wcn36xx/txrx.c
index b2b60e3..2dbed20 100644
--- a/drivers/net/wireless/ath/wcn36xx/txrx.c
+++ b/drivers/net/wireless/ath/wcn36xx/txrx.c
@@ -147,7 +147,7 @@ static void wcn36xx_set_tx_data(struct wcn36xx_tx_bd *bd,
bd->dpu_desc_idx = __vif_priv->self_dpu_desc_index;
}
- bd->dpu_sign = __vif_priv->ucast_dpu_signature;
+ bd->dpu_sign = __vif_priv->self_ucast_dpu_sign;
if (ieee80211_is_nullfunc(hdr->frame_control) ||
(sta_priv && !sta_priv->is_data_encrypted))
diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
index b4dc85b..6447105 100644
--- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
+++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
@@ -125,10 +125,10 @@ struct wcn36xx_vif {
enum wcn36xx_power_state pw_state;
u8 bss_index;
- u8 ucast_dpu_signature;
/* Returned from WCN36XX_HAL_ADD_STA_SELF_RSP */
u8 self_sta_index;
u8 self_dpu_desc_index;
+ u8 self_ucast_dpu_sign;
};
/**
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 8/9] wcn36xx: Track dpu signature per sta
2014-02-12 19:04 [PATCH 1/9] wcn36xx: Fix copy paste error hal_exit_bmps -> hal_keep_alive Eugene Krasnikov
` (5 preceding siblings ...)
2014-02-12 19:04 ` [PATCH 7/9] wcn36xx: Rename wcn36xx_vif.ucast_dpu_signature to self_ucast_dpu_sign Eugene Krasnikov
@ 2014-02-12 19:04 ` Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 9/9] wcn36xx: Update dtim period before starting BSS Eugene Krasnikov
7 siblings, 0 replies; 11+ messages in thread
From: Eugene Krasnikov @ 2014-02-12 19:04 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Pontus Fuchs
From: Pontus Fuchs <pontus.fuchs@gmail.com>
This fixes problems seen with multiple softap clients and reconnecting
softap clients.
Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
---
drivers/net/wireless/ath/wcn36xx/smd.c | 5 +++--
drivers/net/wireless/ath/wcn36xx/txrx.c | 4 ++--
drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 1 +
3 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c
index c7da55c..7bf0ef8 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.c
+++ b/drivers/net/wireless/ath/wcn36xx/smd.c
@@ -902,11 +902,12 @@ static int wcn36xx_smd_config_sta_rsp(struct wcn36xx *wcn,
sta_priv->sta_index = params->sta_index;
sta_priv->dpu_desc_index = params->dpu_index;
+ sta_priv->ucast_dpu_sign = params->uc_ucast_sig;
wcn36xx_dbg(WCN36XX_DBG_HAL,
- "hal config sta rsp status %d sta_index %d bssid_index %d p2p %d\n",
+ "hal config sta rsp status %d sta_index %d bssid_index %d uc_ucast_sig %d p2p %d\n",
params->status, params->sta_index, params->bssid_index,
- params->p2p);
+ params->uc_ucast_sig, params->p2p);
return 0;
}
diff --git a/drivers/net/wireless/ath/wcn36xx/txrx.c b/drivers/net/wireless/ath/wcn36xx/txrx.c
index 2dbed20..be0dda0 100644
--- a/drivers/net/wireless/ath/wcn36xx/txrx.c
+++ b/drivers/net/wireless/ath/wcn36xx/txrx.c
@@ -132,6 +132,7 @@ static void wcn36xx_set_tx_data(struct wcn36xx_tx_bd *bd,
struct ieee80211_vif,
drv_priv);
+ bd->dpu_sign = sta_priv->ucast_dpu_sign;
if (vif->type == NL80211_IFTYPE_STATION) {
bd->sta_index = sta_priv->bss_sta_index;
bd->dpu_desc_idx = sta_priv->bss_dpu_desc_index;
@@ -145,10 +146,9 @@ static void wcn36xx_set_tx_data(struct wcn36xx_tx_bd *bd,
__vif_priv = get_vif_by_addr(wcn, hdr->addr2);
bd->sta_index = __vif_priv->self_sta_index;
bd->dpu_desc_idx = __vif_priv->self_dpu_desc_index;
+ bd->dpu_sign = __vif_priv->self_ucast_dpu_sign;
}
- bd->dpu_sign = __vif_priv->self_ucast_dpu_sign;
-
if (ieee80211_is_nullfunc(hdr->frame_control) ||
(sta_priv && !sta_priv->is_data_encrypted))
bd->dpu_ne = 1;
diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
index 6447105..f0fb81d 100644
--- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
+++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
@@ -159,6 +159,7 @@ struct wcn36xx_sta {
u16 tid;
u8 sta_index;
u8 dpu_desc_index;
+ u8 ucast_dpu_sign;
u8 bss_sta_index;
u8 bss_dpu_desc_index;
bool is_data_encrypted;
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 9/9] wcn36xx: Update dtim period before starting BSS
2014-02-12 19:04 [PATCH 1/9] wcn36xx: Fix copy paste error hal_exit_bmps -> hal_keep_alive Eugene Krasnikov
` (6 preceding siblings ...)
2014-02-12 19:04 ` [PATCH 8/9] wcn36xx: Track dpu signature per sta Eugene Krasnikov
@ 2014-02-12 19:04 ` Eugene Krasnikov
7 siblings, 0 replies; 11+ messages in thread
From: Eugene Krasnikov @ 2014-02-12 19:04 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Pontus Fuchs
From: Pontus Fuchs <pontus.fuchs@gmail.com>
The dtim period sent to FW was 0 because the dtim period
was never set. This caused an incorrect dtim count to be sent in
beacons.
Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
---
drivers/net/wireless/ath/wcn36xx/main.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c
index dca21ee..4ab5370 100644
--- a/drivers/net/wireless/ath/wcn36xx/main.c
+++ b/drivers/net/wireless/ath/wcn36xx/main.c
@@ -708,6 +708,7 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,
bss_conf->enable_beacon);
if (bss_conf->enable_beacon) {
+ vif_priv->dtim_period = bss_conf->dtim_period;
vif_priv->bss_index = 0xff;
wcn36xx_smd_config_bss(wcn, vif, NULL,
vif->addr, false);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 4/9] Cache nv to avoid request_firmware on resume path
2014-02-12 19:04 ` [PATCH 4/9] Cache nv to avoid request_firmware on resume path Eugene Krasnikov
@ 2014-02-12 22:51 ` Kalle Valo
2014-02-13 21:10 ` Pontus Fuchs
0 siblings, 1 reply; 11+ messages in thread
From: Kalle Valo @ 2014-02-12 22:51 UTC (permalink / raw)
To: Eugene Krasnikov; +Cc: linville, linux-wireless, Pontus Fuchs
Eugene Krasnikov <k.eugene.e@gmail.com> writes:
> From: Pontus Fuchs <pontus.fuchs@gmail.com>
>
> If wowlan if off mac80211 will stop / start the driver on suspend /
> resume. This causes problems on resume since request_firmware is called
> from start. Fix this by caching the nv.
>
> Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
"wcn36xx:" prefix missing.
--
Kalle Valo
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 4/9] Cache nv to avoid request_firmware on resume path
2014-02-12 22:51 ` Kalle Valo
@ 2014-02-13 21:10 ` Pontus Fuchs
0 siblings, 0 replies; 11+ messages in thread
From: Pontus Fuchs @ 2014-02-13 21:10 UTC (permalink / raw)
To: linville; +Cc: Kalle Valo, Eugene Krasnikov, linux-wireless
On 2014-02-12 23:51, Kalle Valo wrote:
>
> "wcn36xx:" prefix missing.
>
Oops. Thanks for fixing John.
Cheers,
Pontus
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2014-02-13 21:10 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-12 19:04 [PATCH 1/9] wcn36xx: Fix copy paste error hal_exit_bmps -> hal_keep_alive Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 2/9] wcn36xx: Improve feature caps exchange Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 3/9] wcn36xx: Wait longer for SMD commands to complete Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 4/9] Cache nv to avoid request_firmware on resume path Eugene Krasnikov
2014-02-12 22:51 ` Kalle Valo
2014-02-13 21:10 ` Pontus Fuchs
2014-02-12 19:04 ` [PATCH 5/9] wcn36xx: Print FW capabilities Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 6/9] wcn36xx: Add support for 3680 Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 7/9] wcn36xx: Rename wcn36xx_vif.ucast_dpu_signature to self_ucast_dpu_sign Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 8/9] wcn36xx: Track dpu signature per sta Eugene Krasnikov
2014-02-12 19:04 ` [PATCH 9/9] wcn36xx: Update dtim period before starting BSS Eugene Krasnikov
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.