diff options
author | Juuso Oikarinen <juuso.oikarinen@nokia.com> | 2010-04-09 04:07:30 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-04-09 13:43:11 -0400 |
commit | 00236aedf1d2c49a18ae9ea00698d97705ff7289 (patch) | |
tree | 6fbdcc4672216d18d3b2a9718b54247fc5fc4015 /drivers/net/wireless/wl12xx/wl1271_acx.c | |
parent | e19728181ca7187fa0ecb7076ce681311cf785e7 (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.c | 71 |
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 | |||
1168 | int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid) | 1169 | int 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 | |||
1199 | int 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 | |||
1234 | out: | ||
1235 | kfree(acx); | ||
1236 | return ret; | ||
1237 | } | ||
1238 | |||
1239 | int 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 | |||
1264 | out: | ||
1265 | kfree(acx); | ||
1266 | return ret; | ||
1267 | } | ||