aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/wl12xx/wl1271_acx.c
diff options
context:
space:
mode:
authorJuuso Oikarinen <juuso.oikarinen@nokia.com>2010-04-09 04:07:30 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-04-09 13:43:11 -0400
commit00236aedf1d2c49a18ae9ea00698d97705ff7289 (patch)
tree6fbdcc4672216d18d3b2a9718b54247fc5fc4015 /drivers/net/wireless/wl12xx/wl1271_acx.c
parente19728181ca7187fa0ecb7076ce681311cf785e7 (diff)
wl1271: Add support for connection quality monitoring
This patch will add support for connection quality monitoring by configuring rssi triggers to the firmware, and enabling the firmware rssi trigger functionality. 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>
Diffstat (limited to 'drivers/net/wireless/wl12xx/wl1271_acx.c')
-rw-r--r--drivers/net/wireless/wl12xx/wl1271_acx.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1271_acx.c b/drivers/net/wireless/wl12xx/wl1271_acx.c
index 621c94691e7..1a6b2ec1db5 100644
--- a/drivers/net/wireless/wl12xx/wl1271_acx.c
+++ b/drivers/net/wireless/wl12xx/wl1271_acx.c
@@ -1165,6 +1165,7 @@ out:
1165 kfree(acx); 1165 kfree(acx);
1166 return ret; 1166 return ret;
1167} 1167}
1168
1168int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid) 1169int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid)
1169{ 1170{
1170 struct wl1271_acx_keep_alive_config *acx = NULL; 1171 struct wl1271_acx_keep_alive_config *acx = NULL;
@@ -1194,3 +1195,73 @@ out:
1194 kfree(acx); 1195 kfree(acx);
1195 return ret; 1196 return ret;
1196} 1197}
1198
1199int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable,
1200 s16 thold, u8 hyst)
1201{
1202 struct wl1271_acx_rssi_snr_trigger *acx = NULL;
1203 int ret = 0;
1204
1205 wl1271_debug(DEBUG_ACX, "acx rssi snr trigger");
1206
1207 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
1208 if (!acx) {
1209 ret = -ENOMEM;
1210 goto out;
1211 }
1212
1213 wl->last_rssi_event = -1;
1214
1215 acx->pacing = cpu_to_le16(wl->conf.roam_trigger.trigger_pacing);
1216 acx->metric = WL1271_ACX_TRIG_METRIC_RSSI_BEACON;
1217 acx->type = WL1271_ACX_TRIG_TYPE_EDGE;
1218 if (enable)
1219 acx->enable = WL1271_ACX_TRIG_ENABLE;
1220 else
1221 acx->enable = WL1271_ACX_TRIG_DISABLE;
1222
1223 acx->index = WL1271_ACX_TRIG_IDX_RSSI;
1224 acx->dir = WL1271_ACX_TRIG_DIR_BIDIR;
1225 acx->threshold = cpu_to_le16(thold);
1226 acx->hysteresis = hyst;
1227
1228 ret = wl1271_cmd_configure(wl, ACX_RSSI_SNR_TRIGGER, acx, sizeof(*acx));
1229 if (ret < 0) {
1230 wl1271_warning("acx rssi snr trigger setting failed: %d", ret);
1231 goto out;
1232 }
1233
1234out:
1235 kfree(acx);
1236 return ret;
1237}
1238
1239int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl)
1240{
1241 struct wl1271_acx_rssi_snr_avg_weights *acx = NULL;
1242 struct conf_roam_trigger_settings *c = &wl->conf.roam_trigger;
1243 int ret = 0;
1244
1245 wl1271_debug(DEBUG_ACX, "acx rssi snr avg weights");
1246
1247 acx = kzalloc(sizeof(*acx), GFP_KERNEL);
1248 if (!acx) {
1249 ret = -ENOMEM;
1250 goto out;
1251 }
1252
1253 acx->rssi_beacon = c->avg_weight_rssi_beacon;
1254 acx->rssi_data = c->avg_weight_rssi_data;
1255 acx->snr_beacon = c->avg_weight_snr_beacon;
1256 acx->snr_data = c->avg_weight_snr_data;
1257
1258 ret = wl1271_cmd_configure(wl, ACX_RSSI_SNR_WEIGHTS, acx, sizeof(*acx));
1259 if (ret < 0) {
1260 wl1271_warning("acx rssi snr trigger weights failed: %d", ret);
1261 goto out;
1262 }
1263
1264out:
1265 kfree(acx);
1266 return ret;
1267}