diff options
Diffstat (limited to 'drivers/net/wireless/wl12xx/wl1271_acx.c')
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_acx.c | 179 |
1 files changed, 151 insertions, 28 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1271_acx.c b/drivers/net/wireless/wl12xx/wl1271_acx.c index 308782421fce..e19e2f8f1e52 100644 --- a/drivers/net/wireless/wl12xx/wl1271_acx.c +++ b/drivers/net/wireless/wl12xx/wl1271_acx.c | |||
@@ -32,7 +32,6 @@ | |||
32 | #include "wl1271.h" | 32 | #include "wl1271.h" |
33 | #include "wl12xx_80211.h" | 33 | #include "wl12xx_80211.h" |
34 | #include "wl1271_reg.h" | 34 | #include "wl1271_reg.h" |
35 | #include "wl1271_spi.h" | ||
36 | #include "wl1271_ps.h" | 35 | #include "wl1271_ps.h" |
37 | 36 | ||
38 | int wl1271_acx_wake_up_conditions(struct wl1271 *wl) | 37 | int wl1271_acx_wake_up_conditions(struct wl1271 *wl) |
@@ -137,12 +136,7 @@ int wl1271_acx_tx_power(struct wl1271 *wl, int power) | |||
137 | goto out; | 136 | goto out; |
138 | } | 137 | } |
139 | 138 | ||
140 | /* | 139 | acx->current_tx_power = power * 10; |
141 | * FIXME: This is a workaround needed while we don't the correct | ||
142 | * calibration, to avoid distortions | ||
143 | */ | ||
144 | /* acx->current_tx_power = power * 10; */ | ||
145 | acx->current_tx_power = 120; | ||
146 | 140 | ||
147 | ret = wl1271_cmd_configure(wl, DOT11_CUR_TX_PWR, acx, sizeof(*acx)); | 141 | ret = wl1271_cmd_configure(wl, DOT11_CUR_TX_PWR, acx, sizeof(*acx)); |
148 | if (ret < 0) { | 142 | if (ret < 0) { |
@@ -511,12 +505,17 @@ out: | |||
511 | return ret; | 505 | return ret; |
512 | } | 506 | } |
513 | 507 | ||
514 | 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) | ||
515 | { | 511 | { |
516 | 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; | ||
517 | int ret; | 515 | int ret; |
518 | 516 | ||
519 | wl1271_debug(DEBUG_ACX, "acx connection monitor parameters"); | 517 | wl1271_debug(DEBUG_ACX, "acx connection monitor parameters: %s", |
518 | enable ? "enabled" : "disabled"); | ||
520 | 519 | ||
521 | acx = kzalloc(sizeof(*acx), GFP_KERNEL); | 520 | acx = kzalloc(sizeof(*acx), GFP_KERNEL); |
522 | if (!acx) { | 521 | if (!acx) { |
@@ -524,8 +523,13 @@ int wl1271_acx_conn_monit_params(struct wl1271 *wl) | |||
524 | goto out; | 523 | goto out; |
525 | } | 524 | } |
526 | 525 | ||
527 | acx->synch_fail_thold = cpu_to_le32(wl->conf.conn.synch_fail_thold); | 526 | if (enable) { |
528 | 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); | ||
529 | 533 | ||
530 | ret = wl1271_cmd_configure(wl, ACX_CONN_MONIT_PARAMS, | 534 | ret = wl1271_cmd_configure(wl, ACX_CONN_MONIT_PARAMS, |
531 | acx, sizeof(*acx)); | 535 | acx, sizeof(*acx)); |
@@ -541,7 +545,7 @@ out: | |||
541 | } | 545 | } |
542 | 546 | ||
543 | 547 | ||
544 | int wl1271_acx_sg_enable(struct wl1271 *wl) | 548 | int wl1271_acx_sg_enable(struct wl1271 *wl, bool enable) |
545 | { | 549 | { |
546 | struct acx_bt_wlan_coex *pta; | 550 | struct acx_bt_wlan_coex *pta; |
547 | int ret; | 551 | int ret; |
@@ -554,7 +558,10 @@ int wl1271_acx_sg_enable(struct wl1271 *wl) | |||
554 | goto out; | 558 | goto out; |
555 | } | 559 | } |
556 | 560 | ||
557 | pta->enable = SG_ENABLE; | 561 | if (enable) |
562 | pta->enable = wl->conf.sg.state; | ||
563 | else | ||
564 | pta->enable = CONF_SG_DISABLE; | ||
558 | 565 | ||
559 | ret = wl1271_cmd_configure(wl, ACX_SG_ENABLE, pta, sizeof(*pta)); | 566 | ret = wl1271_cmd_configure(wl, ACX_SG_ENABLE, pta, sizeof(*pta)); |
560 | if (ret < 0) { | 567 | if (ret < 0) { |
@@ -571,7 +578,7 @@ int wl1271_acx_sg_cfg(struct wl1271 *wl) | |||
571 | { | 578 | { |
572 | struct acx_bt_wlan_coex_param *param; | 579 | struct acx_bt_wlan_coex_param *param; |
573 | struct conf_sg_settings *c = &wl->conf.sg; | 580 | struct conf_sg_settings *c = &wl->conf.sg; |
574 | int ret; | 581 | int i, ret; |
575 | 582 | ||
576 | wl1271_debug(DEBUG_ACX, "acx sg cfg"); | 583 | wl1271_debug(DEBUG_ACX, "acx sg cfg"); |
577 | 584 | ||
@@ -582,19 +589,9 @@ int wl1271_acx_sg_cfg(struct wl1271 *wl) | |||
582 | } | 589 | } |
583 | 590 | ||
584 | /* BT-WLAN coext parameters */ | 591 | /* BT-WLAN coext parameters */ |
585 | param->per_threshold = cpu_to_le32(c->per_threshold); | 592 | for (i = 0; i < CONF_SG_PARAMS_MAX; i++) |
586 | param->max_scan_compensation_time = | 593 | param->params[i] = cpu_to_le32(c->params[i]); |
587 | cpu_to_le32(c->max_scan_compensation_time); | 594 | param->param_idx = CONF_SG_PARAMS_ALL; |
588 | param->nfs_sample_interval = cpu_to_le16(c->nfs_sample_interval); | ||
589 | param->load_ratio = c->load_ratio; | ||
590 | param->auto_ps_mode = c->auto_ps_mode; | ||
591 | param->probe_req_compensation = c->probe_req_compensation; | ||
592 | param->scan_window_compensation = c->scan_window_compensation; | ||
593 | param->antenna_config = c->antenna_config; | ||
594 | param->beacon_miss_threshold = c->beacon_miss_threshold; | ||
595 | param->rate_adaptation_threshold = | ||
596 | cpu_to_le32(c->rate_adaptation_threshold); | ||
597 | param->rate_adaptation_snr = c->rate_adaptation_snr; | ||
598 | 595 | ||
599 | ret = wl1271_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param)); | 596 | ret = wl1271_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param)); |
600 | if (ret < 0) { | 597 | if (ret < 0) { |
@@ -806,7 +803,7 @@ int wl1271_acx_rate_policies(struct wl1271 *wl) | |||
806 | 803 | ||
807 | /* configure one basic rate class */ | 804 | /* configure one basic rate class */ |
808 | idx = ACX_TX_BASIC_RATE; | 805 | idx = ACX_TX_BASIC_RATE; |
809 | 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); |
810 | acx->rate_class[idx].short_retry_limit = c->short_retry_limit; | 807 | acx->rate_class[idx].short_retry_limit = c->short_retry_limit; |
811 | acx->rate_class[idx].long_retry_limit = c->long_retry_limit; | 808 | acx->rate_class[idx].long_retry_limit = c->long_retry_limit; |
812 | acx->rate_class[idx].aflags = c->aflags; | 809 | acx->rate_class[idx].aflags = c->aflags; |
@@ -1143,3 +1140,129 @@ out: | |||
1143 | kfree(acx); | 1140 | kfree(acx); |
1144 | return ret; | 1141 | return ret; |
1145 | } | 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 | } | ||