wlcore/wl12xx: make sure session id is always zero for AP
authorArik Nemtsov <arik@wizery.com>
Thu, 29 Nov 2012 22:50:06 +0000 (00:50 +0200)
committerLuciano Coelho <coelho@ti.com>
Tue, 4 Dec 2012 14:43:04 +0000 (16:43 +0200)
The 12xx FW doesn't support non-zero session ids for AP-mode. Introduce
an appropriate quirk to make sure the session id is always zero when
needed.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/ti/wl12xx/main.c
drivers/net/wireless/ti/wlcore/tx.c
drivers/net/wireless/ti/wlcore/wlcore.h

index 37e577f..d22b52f 100644 (file)
@@ -644,7 +644,8 @@ static int wl12xx_identify_chip(struct wl1271 *wl)
                wl->quirks |= WLCORE_QUIRK_LEGACY_NVS |
                              WLCORE_QUIRK_DUAL_PROBE_TMPL |
                              WLCORE_QUIRK_TKIP_HEADER_SPACE |
-                             WLCORE_QUIRK_START_STA_FAILS;
+                             WLCORE_QUIRK_START_STA_FAILS |
+                             WLCORE_QUIRK_AP_ZERO_SESSION_ID;
                wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
                wl->mr_fw_name = WL127X_FW_NAME_MULTI;
                memcpy(&wl->conf.mem, &wl12xx_default_priv_conf.mem_wl127x,
@@ -667,7 +668,8 @@ static int wl12xx_identify_chip(struct wl1271 *wl)
                wl->quirks |= WLCORE_QUIRK_LEGACY_NVS |
                              WLCORE_QUIRK_DUAL_PROBE_TMPL |
                              WLCORE_QUIRK_TKIP_HEADER_SPACE |
-                             WLCORE_QUIRK_START_STA_FAILS;
+                             WLCORE_QUIRK_START_STA_FAILS |
+                             WLCORE_QUIRK_AP_ZERO_SESSION_ID;
                wl->plt_fw_name = WL127X_PLT_FW_NAME;
                wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
                wl->mr_fw_name = WL127X_FW_NAME_MULTI;
@@ -695,7 +697,8 @@ static int wl12xx_identify_chip(struct wl1271 *wl)
                wl->quirks |= WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN |
                              WLCORE_QUIRK_DUAL_PROBE_TMPL |
                              WLCORE_QUIRK_TKIP_HEADER_SPACE |
-                             WLCORE_QUIRK_START_STA_FAILS;
+                             WLCORE_QUIRK_START_STA_FAILS |
+                             WLCORE_QUIRK_AP_ZERO_SESSION_ID;
 
                wlcore_set_min_fw_ver(wl, WL128X_CHIP_VER,
                              WL128X_IFTYPE_SR_VER,  WL128X_MAJOR_SR_VER,
index 68f73f9..c3607f0 100644 (file)
@@ -293,9 +293,14 @@ static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 
                tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
        } else if (wlvif) {
+               u8 session_id = wl->session_ids[hlid];
+
+               if ((wl->quirks & WLCORE_QUIRK_AP_ZERO_SESSION_ID) &&
+                   (wlvif->bss_type == BSS_TYPE_AP_BSS))
+                       session_id = 0;
+
                /* configure the tx attributes */
-               tx_attr = wl->session_ids[hlid] <<
-                         TX_HW_ATTR_OFST_SESSION_COUNTER;
+               tx_attr = session_id << TX_HW_ATTR_OFST_SESSION_COUNTER;
        }
 
        desc->hlid = hlid;
index 32987d0..d90436d 100644 (file)
@@ -533,6 +533,8 @@ wlcore_set_min_fw_ver(struct wl1271 *wl, unsigned int chip,
 /* Firmware requires reg domain configuration for active calibration */
 #define WLCORE_QUIRK_REGDOMAIN_CONF            BIT(11)
 
+/* The FW only support a zero session id for AP */
+#define WLCORE_QUIRK_AP_ZERO_SESSION_ID                BIT(12)
 
 /* TODO: move all these common registers and values elsewhere */
 #define HW_ACCESS_ELP_CTRL_REG         0x1FFFC