wl1271: add most of the normal initialization commands to PLT mode
authorLuciano Coelho <luciano.coelho@nokia.com>
Thu, 18 Feb 2010 11:25:44 +0000 (13:25 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 19 Feb 2010 20:52:44 +0000 (15:52 -0500)
We need to configure PLT mode almost in the same way as normal mode.  Most of
the configuration functions need to be called also when entering PLT, with
the exception of a few RX and TX configuration (which cause mac80211 warnings
if enable while runnning PLT tests).

Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
Reviewed-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/wl12xx/wl1271_init.c
drivers/net/wireless/wl12xx/wl1271_init.h
drivers/net/wireless/wl12xx/wl1271_main.c

index 78403daab9494eab030ac76bf2f17c76a0e49926..86c30a86a456cd5952f2b28c5ee65baaf9763fe7 100644 (file)
@@ -49,7 +49,7 @@ static int wl1271_init_hwenc_config(struct wl1271 *wl)
        return 0;
 }
 
-static int wl1271_init_templates_config(struct wl1271 *wl)
+int wl1271_init_templates_config(struct wl1271 *wl)
 {
        int ret;
 
@@ -113,7 +113,7 @@ static int wl1271_init_rx_config(struct wl1271 *wl, u32 config, u32 filter)
        return 0;
 }
 
-static int wl1271_init_phy_config(struct wl1271 *wl)
+int wl1271_init_phy_config(struct wl1271 *wl)
 {
        int ret;
 
@@ -156,7 +156,7 @@ static int wl1271_init_beacon_filter(struct wl1271 *wl)
        return 0;
 }
 
-static int wl1271_init_pta(struct wl1271 *wl)
+int wl1271_init_pta(struct wl1271 *wl)
 {
        int ret;
 
@@ -171,7 +171,7 @@ static int wl1271_init_pta(struct wl1271 *wl)
        return 0;
 }
 
-static int wl1271_init_energy_detection(struct wl1271 *wl)
+int wl1271_init_energy_detection(struct wl1271 *wl)
 {
        int ret;
 
index 930677fbe852a564cac7ec34ac0a3629f09bab93..bc26f8c53b91bedb7a38091e2d38389d0d16606c 100644 (file)
 #include "wl1271.h"
 
 int wl1271_hw_init_power_auth(struct wl1271 *wl);
+int wl1271_init_templates_config(struct wl1271 *wl);
+int wl1271_init_phy_config(struct wl1271 *wl);
+int wl1271_init_pta(struct wl1271 *wl);
+int wl1271_init_energy_detection(struct wl1271 *wl);
 int wl1271_hw_init(struct wl1271 *wl);
 
 #endif
index b5d53a3fcc5d1cf344232c97c0e6bb4e103037dd..e698dec40511c56fa1422e774da37fe86e3dde14 100644 (file)
@@ -265,7 +265,9 @@ static void wl1271_conf_init(struct wl1271 *wl)
 
 static int wl1271_plt_init(struct wl1271 *wl)
 {
-       int ret;
+       struct conf_tx_ac_category *conf_ac;
+       struct conf_tx_tid *conf_tid;
+       int ret, i;
 
        ret = wl1271_cmd_general_parms(wl);
        if (ret < 0)
@@ -275,15 +277,89 @@ static int wl1271_plt_init(struct wl1271 *wl)
        if (ret < 0)
                return ret;
 
+       ret = wl1271_init_templates_config(wl);
+       if (ret < 0)
+               return ret;
+
        ret = wl1271_acx_init_mem_config(wl);
        if (ret < 0)
                return ret;
 
+       /* PHY layer config */
+       ret = wl1271_init_phy_config(wl);
+       if (ret < 0)
+               goto out_free_memmap;
+
+       ret = wl1271_acx_dco_itrim_params(wl);
+       if (ret < 0)
+               goto out_free_memmap;
+
+       /* Initialize connection monitoring thresholds */
+       ret = wl1271_acx_conn_monit_params(wl);
+       if (ret < 0)
+               goto out_free_memmap;
+
+       /* Bluetooth WLAN coexistence */
+       ret = wl1271_init_pta(wl);
+       if (ret < 0)
+               goto out_free_memmap;
+
+       /* Energy detection */
+       ret = wl1271_init_energy_detection(wl);
+       if (ret < 0)
+               goto out_free_memmap;
+
+       /* Default fragmentation threshold */
+       ret = wl1271_acx_frag_threshold(wl);
+       if (ret < 0)
+               goto out_free_memmap;
+
+       /* Default TID configuration */
+       for (i = 0; i < wl->conf.tx.tid_conf_count; i++) {
+               conf_tid = &wl->conf.tx.tid_conf[i];
+               ret = wl1271_acx_tid_cfg(wl, conf_tid->queue_id,
+                                        conf_tid->channel_type,
+                                        conf_tid->tsid,
+                                        conf_tid->ps_scheme,
+                                        conf_tid->ack_policy,
+                                        conf_tid->apsd_conf[0],
+                                        conf_tid->apsd_conf[1]);
+               if (ret < 0)
+                       goto out_free_memmap;
+       }
+
+       /* Default AC configuration */
+       for (i = 0; i < wl->conf.tx.ac_conf_count; i++) {
+               conf_ac = &wl->conf.tx.ac_conf[i];
+               ret = wl1271_acx_ac_cfg(wl, conf_ac->ac, conf_ac->cw_min,
+                                       conf_ac->cw_max, conf_ac->aifsn,
+                                       conf_ac->tx_op_limit);
+               if (ret < 0)
+                       goto out_free_memmap;
+       }
+
+       /* Enable data path */
        ret = wl1271_cmd_data_path(wl, 1);
        if (ret < 0)
-               return ret;
+               goto out_free_memmap;
+
+       /* Configure for CAM power saving (ie. always active) */
+       ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
+       if (ret < 0)
+               goto out_free_memmap;
+
+       /* configure PM */
+       ret = wl1271_acx_pm_config(wl);
+       if (ret < 0)
+               goto out_free_memmap;
 
        return 0;
+
+ out_free_memmap:
+       kfree(wl->target_mem_map);
+       wl->target_mem_map = NULL;
+
+       return ret;
 }
 
 static void wl1271_disable_interrupts(struct wl1271 *wl)
@@ -653,11 +729,6 @@ int wl1271_plt_start(struct wl1271 *wl)
                if (ret < 0)
                        goto irq_disable;
 
-               /* Make sure power saving is disabled */
-               ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
-               if (ret < 0)
-                       goto irq_disable;
-
                wl->state = WL1271_STATE_PLT;
                wl1271_notice("firmware booted in PLT mode (%s)",
                              wl->chip.fw_ver);