diff options
author | John W. Linville <linville@tuxdriver.com> | 2010-04-15 16:21:34 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-04-15 16:21:34 -0400 |
commit | 5c01d5669356e13f0fb468944c1dd4c6a7e978ad (patch) | |
tree | fa43345288d7b25fac92b3b35360a177c4947313 /drivers/net/wireless/wl12xx/wl1271_acx.c | |
parent | fea069152614cdeefba4b2bf80afcddb9c217fc8 (diff) | |
parent | a5e944f1d955f3819503348426763e21e0413ba6 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem
Conflicts:
Documentation/feature-removal-schedule.txt
drivers/net/wireless/ath/ath5k/phy.c
drivers/net/wireless/wl12xx/wl1271_main.c
Diffstat (limited to 'drivers/net/wireless/wl12xx/wl1271_acx.c')
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_acx.c | 146 |
1 files changed, 141 insertions, 5 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1271_acx.c b/drivers/net/wireless/wl12xx/wl1271_acx.c index adaa3f2485c3..2ad086efe06e 100644 --- a/drivers/net/wireless/wl12xx/wl1271_acx.c +++ b/drivers/net/wireless/wl12xx/wl1271_acx.c | |||
@@ -505,12 +505,17 @@ out: | |||
505 | return ret; | 505 | return ret; |
506 | } | 506 | } |
507 | 507 | ||
508 | int wl1271_acx_conn_monit_params(struct wl1271 *wl) | 508 | #define ACX_CONN_MONIT_DISABLE_VALUE 0xffffffff |
509 | |||
510 | int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable) | ||
509 | { | 511 | { |
510 | struct acx_conn_monit_params *acx; | 512 | struct acx_conn_monit_params *acx; |
513 | u32 threshold = ACX_CONN_MONIT_DISABLE_VALUE; | ||
514 | u32 timeout = ACX_CONN_MONIT_DISABLE_VALUE; | ||
511 | int ret; | 515 | int ret; |
512 | 516 | ||
513 | wl1271_debug(DEBUG_ACX, "acx connection monitor parameters"); | 517 | wl1271_debug(DEBUG_ACX, "acx connection monitor parameters: %s", |
518 | enable ? "enabled" : "disabled"); | ||
514 | 519 | ||
515 | acx = kzalloc(sizeof(*acx), GFP_KERNEL); | 520 | acx = kzalloc(sizeof(*acx), GFP_KERNEL); |
516 | if (!acx) { | 521 | if (!acx) { |
@@ -518,8 +523,13 @@ int wl1271_acx_conn_monit_params(struct wl1271 *wl) | |||
518 | goto out; | 523 | goto out; |
519 | } | 524 | } |
520 | 525 | ||
521 | acx->synch_fail_thold = cpu_to_le32(wl->conf.conn.synch_fail_thold); | 526 | if (enable) { |
522 | acx->bss_lose_timeout = cpu_to_le32(wl->conf.conn.bss_lose_timeout); | 527 | threshold = wl->conf.conn.synch_fail_thold; |
528 | timeout = wl->conf.conn.bss_lose_timeout; | ||
529 | } | ||
530 | |||
531 | acx->synch_fail_thold = cpu_to_le32(threshold); | ||
532 | acx->bss_lose_timeout = cpu_to_le32(timeout); | ||
523 | 533 | ||
524 | ret = wl1271_cmd_configure(wl, ACX_CONN_MONIT_PARAMS, | 534 | ret = wl1271_cmd_configure(wl, ACX_CONN_MONIT_PARAMS, |
525 | acx, sizeof(*acx)); | 535 | acx, sizeof(*acx)); |
@@ -793,7 +803,7 @@ int wl1271_acx_rate_policies(struct wl1271 *wl) | |||
793 | 803 | ||
794 | /* configure one basic rate class */ | 804 | /* configure one basic rate class */ |
795 | idx = ACX_TX_BASIC_RATE; | 805 | idx = ACX_TX_BASIC_RATE; |
796 | acx->rate_class[idx].enabled_rates = cpu_to_le32(wl->basic_rate_set); | 806 | acx->rate_class[idx].enabled_rates = cpu_to_le32(wl->basic_rate); |
797 | acx->rate_class[idx].short_retry_limit = c->short_retry_limit; | 807 | acx->rate_class[idx].short_retry_limit = c->short_retry_limit; |
798 | acx->rate_class[idx].long_retry_limit = c->long_retry_limit; | 808 | acx->rate_class[idx].long_retry_limit = c->long_retry_limit; |
799 | acx->rate_class[idx].aflags = c->aflags; | 809 | acx->rate_class[idx].aflags = c->aflags; |
@@ -1130,3 +1140,129 @@ out: | |||
1130 | kfree(acx); | 1140 | kfree(acx); |
1131 | return ret; | 1141 | return ret; |
1132 | } | 1142 | } |
1143 | |||
1144 | int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable) | ||
1145 | { | ||
1146 | struct wl1271_acx_keep_alive_mode *acx = NULL; | ||
1147 | int ret = 0; | ||
1148 | |||
1149 | wl1271_debug(DEBUG_ACX, "acx keep alive mode: %d", enable); | ||
1150 | |||
1151 | acx = kzalloc(sizeof(*acx), GFP_KERNEL); | ||
1152 | if (!acx) { | ||
1153 | ret = -ENOMEM; | ||
1154 | goto out; | ||
1155 | } | ||
1156 | |||
1157 | acx->enabled = enable; | ||
1158 | |||
1159 | ret = wl1271_cmd_configure(wl, ACX_KEEP_ALIVE_MODE, acx, sizeof(*acx)); | ||
1160 | if (ret < 0) { | ||
1161 | wl1271_warning("acx keep alive mode failed: %d", ret); | ||
1162 | goto out; | ||
1163 | } | ||
1164 | |||
1165 | out: | ||
1166 | kfree(acx); | ||
1167 | return ret; | ||
1168 | } | ||
1169 | |||
1170 | int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid) | ||
1171 | { | ||
1172 | struct wl1271_acx_keep_alive_config *acx = NULL; | ||
1173 | int ret = 0; | ||
1174 | |||
1175 | wl1271_debug(DEBUG_ACX, "acx keep alive config"); | ||
1176 | |||
1177 | acx = kzalloc(sizeof(*acx), GFP_KERNEL); | ||
1178 | if (!acx) { | ||
1179 | ret = -ENOMEM; | ||
1180 | goto out; | ||
1181 | } | ||
1182 | |||
1183 | acx->period = cpu_to_le32(wl->conf.conn.keep_alive_interval); | ||
1184 | acx->index = index; | ||
1185 | acx->tpl_validation = tpl_valid; | ||
1186 | acx->trigger = ACX_KEEP_ALIVE_NO_TX; | ||
1187 | |||
1188 | ret = wl1271_cmd_configure(wl, ACX_SET_KEEP_ALIVE_CONFIG, | ||
1189 | acx, sizeof(*acx)); | ||
1190 | if (ret < 0) { | ||
1191 | wl1271_warning("acx keep alive config failed: %d", ret); | ||
1192 | goto out; | ||
1193 | } | ||
1194 | |||
1195 | out: | ||
1196 | kfree(acx); | ||
1197 | return ret; | ||
1198 | } | ||
1199 | |||
1200 | int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable, | ||
1201 | s16 thold, u8 hyst) | ||
1202 | { | ||
1203 | struct wl1271_acx_rssi_snr_trigger *acx = NULL; | ||
1204 | int ret = 0; | ||
1205 | |||
1206 | wl1271_debug(DEBUG_ACX, "acx rssi snr trigger"); | ||
1207 | |||
1208 | acx = kzalloc(sizeof(*acx), GFP_KERNEL); | ||
1209 | if (!acx) { | ||
1210 | ret = -ENOMEM; | ||
1211 | goto out; | ||
1212 | } | ||
1213 | |||
1214 | wl->last_rssi_event = -1; | ||
1215 | |||
1216 | acx->pacing = cpu_to_le16(wl->conf.roam_trigger.trigger_pacing); | ||
1217 | acx->metric = WL1271_ACX_TRIG_METRIC_RSSI_BEACON; | ||
1218 | acx->type = WL1271_ACX_TRIG_TYPE_EDGE; | ||
1219 | if (enable) | ||
1220 | acx->enable = WL1271_ACX_TRIG_ENABLE; | ||
1221 | else | ||
1222 | acx->enable = WL1271_ACX_TRIG_DISABLE; | ||
1223 | |||
1224 | acx->index = WL1271_ACX_TRIG_IDX_RSSI; | ||
1225 | acx->dir = WL1271_ACX_TRIG_DIR_BIDIR; | ||
1226 | acx->threshold = cpu_to_le16(thold); | ||
1227 | acx->hysteresis = hyst; | ||
1228 | |||
1229 | ret = wl1271_cmd_configure(wl, ACX_RSSI_SNR_TRIGGER, acx, sizeof(*acx)); | ||
1230 | if (ret < 0) { | ||
1231 | wl1271_warning("acx rssi snr trigger setting failed: %d", ret); | ||
1232 | goto out; | ||
1233 | } | ||
1234 | |||
1235 | out: | ||
1236 | kfree(acx); | ||
1237 | return ret; | ||
1238 | } | ||
1239 | |||
1240 | int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl) | ||
1241 | { | ||
1242 | struct wl1271_acx_rssi_snr_avg_weights *acx = NULL; | ||
1243 | struct conf_roam_trigger_settings *c = &wl->conf.roam_trigger; | ||
1244 | int ret = 0; | ||
1245 | |||
1246 | wl1271_debug(DEBUG_ACX, "acx rssi snr avg weights"); | ||
1247 | |||
1248 | acx = kzalloc(sizeof(*acx), GFP_KERNEL); | ||
1249 | if (!acx) { | ||
1250 | ret = -ENOMEM; | ||
1251 | goto out; | ||
1252 | } | ||
1253 | |||
1254 | acx->rssi_beacon = c->avg_weight_rssi_beacon; | ||
1255 | acx->rssi_data = c->avg_weight_rssi_data; | ||
1256 | acx->snr_beacon = c->avg_weight_snr_beacon; | ||
1257 | acx->snr_data = c->avg_weight_snr_data; | ||
1258 | |||
1259 | ret = wl1271_cmd_configure(wl, ACX_RSSI_SNR_WEIGHTS, acx, sizeof(*acx)); | ||
1260 | if (ret < 0) { | ||
1261 | wl1271_warning("acx rssi snr trigger weights failed: %d", ret); | ||
1262 | goto out; | ||
1263 | } | ||
1264 | |||
1265 | out: | ||
1266 | kfree(acx); | ||
1267 | return ret; | ||
1268 | } | ||