wl12xx: add BT-coexistance for AP
authorArik Nemtsov <arik@wizery.com>
Mon, 18 Apr 2011 11:15:20 +0000 (14:15 +0300)
committerLuciano Coelho <coelho@ti.com>
Mon, 2 May 2011 07:28:49 +0000 (10:28 +0300)
Initialize AP specific BT coexitance parameters to default values and
enable them in AP mode.

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

index b1b5139139e719892c42c88b3ee75daedbf2f5f5..2b5fb3d2df1b077d07b6e04a2414070d48ae6948 100644 (file)
@@ -540,13 +540,13 @@ out:
        return ret;
 }
 
-int wl1271_acx_sg_cfg(struct wl1271 *wl)
+int wl1271_acx_sta_sg_cfg(struct wl1271 *wl)
 {
-       struct acx_bt_wlan_coex_param *param;
+       struct acx_sta_bt_wlan_coex_param *param;
        struct conf_sg_settings *c = &wl->conf.sg;
        int i, ret;
 
-       wl1271_debug(DEBUG_ACX, "acx sg cfg");
+       wl1271_debug(DEBUG_ACX, "acx sg sta cfg");
 
        param = kzalloc(sizeof(*param), GFP_KERNEL);
        if (!param) {
@@ -555,8 +555,38 @@ int wl1271_acx_sg_cfg(struct wl1271 *wl)
        }
 
        /* BT-WLAN coext parameters */
-       for (i = 0; i < CONF_SG_PARAMS_MAX; i++)
-               param->params[i] = cpu_to_le32(c->params[i]);
+       for (i = 0; i < CONF_SG_STA_PARAMS_MAX; i++)
+               param->params[i] = cpu_to_le32(c->sta_params[i]);
+       param->param_idx = CONF_SG_PARAMS_ALL;
+
+       ret = wl1271_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param));
+       if (ret < 0) {
+               wl1271_warning("failed to set sg config: %d", ret);
+               goto out;
+       }
+
+out:
+       kfree(param);
+       return ret;
+}
+
+int wl1271_acx_ap_sg_cfg(struct wl1271 *wl)
+{
+       struct acx_ap_bt_wlan_coex_param *param;
+       struct conf_sg_settings *c = &wl->conf.sg;
+       int i, ret;
+
+       wl1271_debug(DEBUG_ACX, "acx sg ap cfg");
+
+       param = kzalloc(sizeof(*param), GFP_KERNEL);
+       if (!param) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       /* BT-WLAN coext parameters */
+       for (i = 0; i < CONF_SG_AP_PARAMS_MAX; i++)
+               param->params[i] = cpu_to_le32(c->ap_params[i]);
        param->param_idx = CONF_SG_PARAMS_ALL;
 
        ret = wl1271_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param));
index 2dde0346e955d2bf58dced1720849e5e338e2ef9..cd7548dacd590cabd29e6f767c4e826805b9a5f9 100644 (file)
@@ -370,14 +370,23 @@ struct acx_bt_wlan_coex {
        u8 pad[3];
 } __packed;
 
-struct acx_bt_wlan_coex_param {
+struct acx_sta_bt_wlan_coex_param {
        struct acx_header header;
 
-       __le32 params[CONF_SG_PARAMS_MAX];
+       __le32 params[CONF_SG_STA_PARAMS_MAX];
        u8 param_idx;
        u8 padding[3];
 } __packed;
 
+struct acx_ap_bt_wlan_coex_param {
+       struct acx_header header;
+
+       __le32 params[CONF_SG_AP_PARAMS_MAX];
+       u8 param_idx;
+       u8 padding[3];
+} __packed;
+
+
 struct acx_dco_itrim_params {
        struct acx_header header;
 
@@ -1330,7 +1339,8 @@ int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter);
 int wl1271_acx_beacon_filter_table(struct wl1271 *wl);
 int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable);
 int wl1271_acx_sg_enable(struct wl1271 *wl, bool enable);
-int wl1271_acx_sg_cfg(struct wl1271 *wl);
+int wl1271_acx_sta_sg_cfg(struct wl1271 *wl);
+int wl1271_acx_ap_sg_cfg(struct wl1271 *wl);
 int wl1271_acx_cca_threshold(struct wl1271 *wl);
 int wl1271_acx_bcn_dtim_options(struct wl1271 *wl);
 int wl1271_acx_aid(struct wl1271 *wl, u16 aid);
index a4e0acff8674fd8776787f6f2d2c81ed4e473bf5..2ffbe3e0601951698ccb3c4107b52109c9521d3f 100644 (file)
@@ -396,12 +396,43 @@ enum {
        CONF_SG_TEMP_PARAM_3,
        CONF_SG_TEMP_PARAM_4,
        CONF_SG_TEMP_PARAM_5,
-       CONF_SG_PARAMS_MAX,
+
+       /*
+        * AP beacon miss
+        *
+        * Range: 0 - 255
+        */
+       CONF_SG_AP_BEACON_MISS_TX,
+
+       /*
+        * AP RX window length
+        *
+        * Range: 0 - 50
+        */
+       CONF_SG_RX_WINDOW_LENGTH,
+
+       /*
+        * AP connection protection time
+        *
+        * Range: 0 - 5000
+        */
+       CONF_SG_AP_CONNECTION_PROTECTION_TIME,
+
+       CONF_SG_TEMP_PARAM_6,
+       CONF_SG_TEMP_PARAM_7,
+       CONF_SG_TEMP_PARAM_8,
+       CONF_SG_TEMP_PARAM_9,
+       CONF_SG_TEMP_PARAM_10,
+
+       CONF_SG_STA_PARAMS_MAX = CONF_SG_TEMP_PARAM_5 + 1,
+       CONF_SG_AP_PARAMS_MAX = CONF_SG_TEMP_PARAM_10 + 1,
+
        CONF_SG_PARAMS_ALL = 0xff
 };
 
 struct conf_sg_settings {
-       u32 params[CONF_SG_PARAMS_MAX];
+       u32 sta_params[CONF_SG_STA_PARAMS_MAX];
+       u32 ap_params[CONF_SG_AP_PARAMS_MAX];
        u8 state;
 };
 
index 46fd7212b2388a3c8dbc982843394add35427608..1be656914785d67e9811b7f1809cd5dd746bb232 100644 (file)
@@ -285,7 +285,10 @@ int wl1271_init_pta(struct wl1271 *wl)
 {
        int ret;
 
-       ret = wl1271_acx_sg_cfg(wl);
+       if (wl->bss_type == BSS_TYPE_AP_BSS)
+               ret = wl1271_acx_ap_sg_cfg(wl);
+       else
+               ret = wl1271_acx_sta_sg_cfg(wl);
        if (ret < 0)
                return ret;
 
@@ -351,11 +354,6 @@ static int wl1271_sta_hw_init(struct wl1271 *wl)
        if (ret < 0)
                return ret;
 
-       /* Bluetooth WLAN coexistence */
-       ret = wl1271_init_pta(wl);
-       if (ret < 0)
-               return ret;
-
        /* FM WLAN coexistence */
        ret = wl1271_acx_fm_coex(wl);
        if (ret < 0)
@@ -572,6 +570,11 @@ int wl1271_hw_init(struct wl1271 *wl)
        if (ret < 0)
                return ret;
 
+       /* Bluetooth WLAN coexistence */
+       ret = wl1271_init_pta(wl);
+       if (ret < 0)
+               return ret;
+
        /* Default memory configuration */
        ret = wl1271_acx_init_mem_config(wl);
        if (ret < 0)
index a8770102a74afa4cbce995e0670b60aaae0ee1d2..5f8bb35c64750e2da5bc1761a952618025ce7197 100644 (file)
@@ -51,7 +51,7 @@
 
 static struct conf_drv_settings default_conf = {
        .sg = {
-               .params = {
+               .sta_params = {
                        [CONF_SG_BT_PER_THRESHOLD]                  = 7500,
                        [CONF_SG_HV3_MAX_OVERRIDE]                  = 0,
                        [CONF_SG_BT_NFS_SAMPLE_INTERVAL]            = 400,
@@ -101,6 +101,61 @@ static struct conf_drv_settings default_conf = {
                        [CONF_SG_DHCP_TIME]                         = 5000,
                        [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP]  = 100,
                },
+               .ap_params = {
+                       [CONF_SG_BT_PER_THRESHOLD]                  = 7500,
+                       [CONF_SG_HV3_MAX_OVERRIDE]                  = 0,
+                       [CONF_SG_BT_NFS_SAMPLE_INTERVAL]            = 400,
+                       [CONF_SG_BT_LOAD_RATIO]                     = 50,
+                       [CONF_SG_AUTO_PS_MODE]                      = 1,
+                       [CONF_SG_AUTO_SCAN_PROBE_REQ]               = 170,
+                       [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3]   = 50,
+                       [CONF_SG_ANTENNA_CONFIGURATION]             = 0,
+                       [CONF_SG_BEACON_MISS_PERCENT]               = 60,
+                       [CONF_SG_RATE_ADAPT_THRESH]                 = 64,
+                       [CONF_SG_RATE_ADAPT_SNR]                    = 1,
+                       [CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_BR]      = 10,
+                       [CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_BR]      = 25,
+                       [CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_BR]      = 25,
+                       [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_BR]       = 20,
+                       [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_BR]       = 25,
+                       [CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_BR]       = 25,
+                       [CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_EDR]     = 7,
+                       [CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_EDR]     = 25,
+                       [CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_EDR]     = 25,
+                       [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_EDR]      = 8,
+                       [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_EDR]      = 25,
+                       [CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_EDR]      = 25,
+                       [CONF_SG_RXT]                               = 1200,
+                       [CONF_SG_TXT]                               = 1000,
+                       [CONF_SG_ADAPTIVE_RXT_TXT]                  = 1,
+                       [CONF_SG_PS_POLL_TIMEOUT]                   = 10,
+                       [CONF_SG_UPSD_TIMEOUT]                      = 10,
+                       [CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MIN_EDR] = 7,
+                       [CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MAX_EDR] = 15,
+                       [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_MASTER_EDR] = 15,
+                       [CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MIN_EDR]  = 8,
+                       [CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MAX_EDR]  = 20,
+                       [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_SLAVE_EDR]  = 15,
+                       [CONF_SG_WLAN_ACTIVE_BT_ACL_MIN_BR]         = 20,
+                       [CONF_SG_WLAN_ACTIVE_BT_ACL_MAX_BR]         = 50,
+                       [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_BR]         = 10,
+                       [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3]  = 200,
+                       [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP] = 800,
+                       [CONF_SG_PASSIVE_SCAN_A2DP_BT_TIME]         = 75,
+                       [CONF_SG_PASSIVE_SCAN_A2DP_WLAN_TIME]       = 15,
+                       [CONF_SG_HV3_MAX_SERVED]                    = 6,
+                       [CONF_SG_DHCP_TIME]                         = 5000,
+                       [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP]  = 100,
+                       [CONF_SG_TEMP_PARAM_1]                      = 0,
+                       [CONF_SG_TEMP_PARAM_2]                      = 0,
+                       [CONF_SG_TEMP_PARAM_3]                      = 0,
+                       [CONF_SG_TEMP_PARAM_4]                      = 0,
+                       [CONF_SG_TEMP_PARAM_5]                      = 0,
+                       [CONF_SG_AP_BEACON_MISS_TX]                 = 3,
+                       [CONF_SG_RX_WINDOW_LENGTH]                  = 6,
+                       [CONF_SG_AP_CONNECTION_PROTECTION_TIME]     = 50,
+                       [CONF_SG_TEMP_PARAM_6]                      = 1,
+               },
                .state = CONF_SG_PROTECTIVE,
        },
        .rx = {