wl1271: Fix keep-alive related command error
authorJuuso Oikarinen <juuso.oikarinen@nokia.com>
Thu, 1 Apr 2010 08:38:19 +0000 (11:38 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 6 Apr 2010 20:55:12 +0000 (16:55 -0400)
The firmware does not like the host configuring the keep-alive after it has
been once configured after a join-operation. Instead, it will complain about
invalid parameters, which do not break functionality, but do not look nice
in the syslog either.

This patch prevents the complaints by only configuring the keep-alive once
for an association, after the first time join is performed with the correct
bssid.

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

index 033cef01fd43cdb8ec9127bfde47fe407f2ae991..2494c967bb34ac5351880a77ecc4076a88c726f3 100644 (file)
@@ -1569,6 +1569,7 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
        enum wl1271_cmd_ps_mode mode;
        struct wl1271 *wl = hw->priv;
        bool do_join = false;
+       bool do_keepalive = false;
        int ret;
 
        wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed");
@@ -1685,6 +1686,14 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
                        if (ret < 0)
                                goto out_sleep;
 
+                       /*
+                        * This is awkward. The keep-alive configs must be done
+                        * *after* the join command, because otherwise it will
+                        * not work, but it must only be done *once* because
+                        * otherwise the firmware will start complaining.
+                        */
+                       do_keepalive = true;
+
                        /* enable the connection monitoring feature */
                        ret = wl1271_acx_conn_monit_params(wl, true);
                        if (ret < 0)
@@ -1763,6 +1772,9 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
                ret = wl1271_acx_aid(wl, wl->aid);
                if (ret < 0)
                        goto out_sleep;
+       }
+
+       if (do_keepalive) {
                ret = wl1271_cmd_build_klv_null_data(wl);
                if (ret < 0)
                        goto out_sleep;