wl1251: Add connection monitoring configuration
authorJuuso Oikarinen <juuso.oikarinen@nokia.com>
Tue, 17 Nov 2009 16:48:14 +0000 (18:48 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 18 Nov 2009 22:09:19 +0000 (17:09 -0500)
Add configuration for connection monitor (number of allowed beacons, and
timeout after last received beacon.)

Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Signed-off-by: Kalle Valo <kalle.valo@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/wl12xx/wl1251_acx.c
drivers/net/wireless/wl12xx/wl1251_acx.h
drivers/net/wireless/wl12xx/wl1251_init.c

index 10b26c4532c98c7c03e30b69e6fb1b2e64bc3785..4a9c70889a45c65faf98d0cfc5e2aa60b92a8864 100644 (file)
@@ -550,6 +550,35 @@ out:
        return ret;
 }
 
+int wl1251_acx_conn_monit_params(struct wl1251 *wl)
+{
+       struct acx_conn_monit_params *acx;
+       int ret;
+
+       wl1251_debug(DEBUG_ACX, "acx connection monitor parameters");
+
+       acx = kzalloc(sizeof(*acx), GFP_KERNEL);
+       if (!acx) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       acx->synch_fail_thold = SYNCH_FAIL_DEFAULT_THRESHOLD;
+       acx->bss_lose_timeout = NO_BEACON_DEFAULT_TIMEOUT;
+
+       ret = wl1251_cmd_configure(wl, ACX_CONN_MONIT_PARAMS,
+                                  acx, sizeof(*acx));
+       if (ret < 0) {
+               wl1251_warning("failed to set connection monitor "
+                              "parameters: %d", ret);
+               goto out;
+       }
+
+out:
+       kfree(acx);
+       return ret;
+}
+
 int wl1251_acx_sg_enable(struct wl1251 *wl)
 {
        struct acx_bt_wlan_coex *pta;
index cafb91459504d38ffd0da441db22644dcd5d0a52..926789ccc27f21c0b86a1889218d8834bb8e65a8 100644 (file)
@@ -458,6 +458,16 @@ struct acx_beacon_filter_ie_table {
        u8 pad[3];
 } __attribute__ ((packed));
 
+#define SYNCH_FAIL_DEFAULT_THRESHOLD    5     /* number of beacons */
+#define NO_BEACON_DEFAULT_TIMEOUT       (100) /* TU */
+
+struct acx_conn_monit_params {
+       struct acx_header header;
+
+       u32 synch_fail_thold; /* number of beacons missed */
+       u32 bss_lose_timeout; /* number of TU's from synch fail */
+};
+
 enum {
        SG_ENABLE = 0,
        SG_DISABLE,
@@ -1275,6 +1285,7 @@ int wl1251_acx_service_period_timeout(struct wl1251 *wl);
 int wl1251_acx_rts_threshold(struct wl1251 *wl, u16 rts_threshold);
 int wl1251_acx_beacon_filter_opt(struct wl1251 *wl);
 int wl1251_acx_beacon_filter_table(struct wl1251 *wl);
+int wl1251_acx_conn_monit_params(struct wl1251 *wl);
 int wl1251_acx_sg_enable(struct wl1251 *wl);
 int wl1251_acx_sg_cfg(struct wl1251 *wl);
 int wl1251_acx_cca_threshold(struct wl1251 *wl);
index b2ee4f468fc41cf95277d4360de3502f42f39ffd..035ab1140b43e56f531b004599a21a3f45091abc 100644 (file)
@@ -364,6 +364,11 @@ int wl1251_hw_init(struct wl1251 *wl)
        if (ret < 0)
                goto out_free_data_path;
 
+       /* Initialize connection monitoring thresholds */
+       ret = wl1251_acx_conn_monit_params(wl);
+       if (ret < 0)
+               goto out_free_data_path;
+
        /* Beacon filtering */
        ret = wl1251_hw_init_beacon_filter(wl);
        if (ret < 0)