diff options
author | Juuso Oikarinen <juuso.oikarinen@nokia.com> | 2009-10-12 08:08:52 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-10-27 16:48:05 -0400 |
commit | 3cfd6cf960b2b030ccae1144a5c0dcd91c7c56a8 (patch) | |
tree | 54d0ff7c915701d12fdf891f5131e44c0efd6682 | |
parent | 5d0af498c08b43566733d5c5fb8293ce3b109eab (diff) |
wl1271: Enable smart reflex
Enable and configure smart reflex. This should have a reducing impact on
power consumption.
Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_acx.c | 72 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_acx.h | 23 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_init.c | 5 |
3 files changed, 100 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1271_acx.c b/drivers/net/wireless/wl12xx/wl1271_acx.c index d5dac5753ae2..6c2989002218 100644 --- a/drivers/net/wireless/wl12xx/wl1271_acx.c +++ b/drivers/net/wireless/wl12xx/wl1271_acx.c | |||
@@ -998,3 +998,75 @@ out: | |||
998 | kfree(rx_conf); | 998 | kfree(rx_conf); |
999 | return ret; | 999 | return ret; |
1000 | } | 1000 | } |
1001 | |||
1002 | int wl1271_acx_smart_reflex(struct wl1271 *wl) | ||
1003 | { | ||
1004 | struct acx_smart_reflex_state *sr_state = NULL; | ||
1005 | struct acx_smart_reflex_config_params *sr_param = NULL; | ||
1006 | int ret; | ||
1007 | |||
1008 | wl1271_debug(DEBUG_ACX, "acx smart reflex"); | ||
1009 | |||
1010 | sr_param = kzalloc(sizeof(*sr_param), GFP_KERNEL); | ||
1011 | if (!sr_param) { | ||
1012 | ret = -ENOMEM; | ||
1013 | goto out; | ||
1014 | } | ||
1015 | |||
1016 | /* set cryptic smart reflex parameters - source TI reference code */ | ||
1017 | sr_param->error_table[0].len = 0x07; | ||
1018 | sr_param->error_table[0].upper_limit = 0x03; | ||
1019 | sr_param->error_table[0].values[0] = 0x18; | ||
1020 | sr_param->error_table[0].values[1] = 0x10; | ||
1021 | sr_param->error_table[0].values[2] = 0x05; | ||
1022 | sr_param->error_table[0].values[3] = 0xfb; | ||
1023 | sr_param->error_table[0].values[4] = 0xf0; | ||
1024 | sr_param->error_table[0].values[5] = 0xe8; | ||
1025 | |||
1026 | sr_param->error_table[1].len = 0x07; | ||
1027 | sr_param->error_table[1].upper_limit = 0x03; | ||
1028 | sr_param->error_table[1].values[0] = 0x18; | ||
1029 | sr_param->error_table[1].values[1] = 0x10; | ||
1030 | sr_param->error_table[1].values[2] = 0x05; | ||
1031 | sr_param->error_table[1].values[3] = 0xf6; | ||
1032 | sr_param->error_table[1].values[4] = 0xf0; | ||
1033 | sr_param->error_table[1].values[5] = 0xe8; | ||
1034 | |||
1035 | sr_param->error_table[2].len = 0x07; | ||
1036 | sr_param->error_table[2].upper_limit = 0x03; | ||
1037 | sr_param->error_table[2].values[0] = 0x18; | ||
1038 | sr_param->error_table[2].values[1] = 0x10; | ||
1039 | sr_param->error_table[2].values[2] = 0x05; | ||
1040 | sr_param->error_table[2].values[3] = 0xfb; | ||
1041 | sr_param->error_table[2].values[4] = 0xf0; | ||
1042 | sr_param->error_table[2].values[5] = 0xe8; | ||
1043 | |||
1044 | ret = wl1271_cmd_configure(wl, ACX_SET_SMART_REFLEX_PARAMS, | ||
1045 | sr_param, sizeof(*sr_param)); | ||
1046 | if (ret < 0) { | ||
1047 | wl1271_warning("failed to set smart reflex params: %d", ret); | ||
1048 | goto out; | ||
1049 | } | ||
1050 | |||
1051 | sr_state = kzalloc(sizeof(*sr_state), GFP_KERNEL); | ||
1052 | if (!sr_state) { | ||
1053 | ret = -ENOMEM; | ||
1054 | goto out; | ||
1055 | } | ||
1056 | |||
1057 | /* enable smart reflex */ | ||
1058 | sr_state->enable = 1; | ||
1059 | |||
1060 | ret = wl1271_cmd_configure(wl, ACX_SET_SMART_REFLEX_STATE, | ||
1061 | sr_state, sizeof(*sr_state)); | ||
1062 | if (ret < 0) { | ||
1063 | wl1271_warning("failed to set smart reflex params: %d", ret); | ||
1064 | goto out; | ||
1065 | } | ||
1066 | |||
1067 | out: | ||
1068 | kfree(sr_state); | ||
1069 | kfree(sr_param); | ||
1070 | return ret; | ||
1071 | |||
1072 | } | ||
diff --git a/drivers/net/wireless/wl12xx/wl1271_acx.h b/drivers/net/wireless/wl12xx/wl1271_acx.h index 07256d280e51..0c704af1953c 100644 --- a/drivers/net/wireless/wl12xx/wl1271_acx.h +++ b/drivers/net/wireless/wl12xx/wl1271_acx.h | |||
@@ -445,6 +445,25 @@ struct acx_bt_wlan_coex { | |||
445 | u8 pad[3]; | 445 | u8 pad[3]; |
446 | } __attribute__ ((packed)); | 446 | } __attribute__ ((packed)); |
447 | 447 | ||
448 | struct acx_smart_reflex_state { | ||
449 | struct acx_header header; | ||
450 | |||
451 | u8 enable; | ||
452 | u8 padding[3]; | ||
453 | }; | ||
454 | |||
455 | struct smart_reflex_err_table { | ||
456 | u8 len; | ||
457 | s8 upper_limit; | ||
458 | s8 values[14]; | ||
459 | }; | ||
460 | |||
461 | struct acx_smart_reflex_config_params { | ||
462 | struct acx_header header; | ||
463 | |||
464 | struct smart_reflex_err_table error_table[3]; | ||
465 | }; | ||
466 | |||
448 | #define PTA_ANTENNA_TYPE_DEF (0) | 467 | #define PTA_ANTENNA_TYPE_DEF (0) |
449 | #define PTA_BT_HP_MAXTIME_DEF (2000) | 468 | #define PTA_BT_HP_MAXTIME_DEF (2000) |
450 | #define PTA_WLAN_HP_MAX_TIME_DEF (5000) | 469 | #define PTA_WLAN_HP_MAX_TIME_DEF (5000) |
@@ -1184,6 +1203,9 @@ enum { | |||
1184 | ACX_PEER_HT_CAP = 0x0057, | 1203 | ACX_PEER_HT_CAP = 0x0057, |
1185 | ACX_HT_BSS_OPERATION = 0x0058, | 1204 | ACX_HT_BSS_OPERATION = 0x0058, |
1186 | ACX_COEX_ACTIVITY = 0x0059, | 1205 | ACX_COEX_ACTIVITY = 0x0059, |
1206 | ACX_SET_SMART_REFLEX_DEBUG = 0x005A, | ||
1207 | ACX_SET_SMART_REFLEX_STATE = 0x005B, | ||
1208 | ACX_SET_SMART_REFLEX_PARAMS = 0x005F, | ||
1187 | DOT11_RX_MSDU_LIFE_TIME = 0x1004, | 1209 | DOT11_RX_MSDU_LIFE_TIME = 0x1004, |
1188 | DOT11_CUR_TX_PWR = 0x100D, | 1210 | DOT11_CUR_TX_PWR = 0x100D, |
1189 | DOT11_RX_DOT11_MODE = 0x1012, | 1211 | DOT11_RX_DOT11_MODE = 0x1012, |
@@ -1233,5 +1255,6 @@ int wl1271_acx_tx_config_options(struct wl1271 *wl); | |||
1233 | int wl1271_acx_mem_cfg(struct wl1271 *wl); | 1255 | int wl1271_acx_mem_cfg(struct wl1271 *wl); |
1234 | int wl1271_acx_init_mem_config(struct wl1271 *wl); | 1256 | int wl1271_acx_init_mem_config(struct wl1271 *wl); |
1235 | int wl1271_acx_init_rx_interrupt(struct wl1271 *wl); | 1257 | int wl1271_acx_init_rx_interrupt(struct wl1271 *wl); |
1258 | int wl1271_acx_smart_reflex(struct wl1271 *wl); | ||
1236 | 1259 | ||
1237 | #endif /* __WL1271_ACX_H__ */ | 1260 | #endif /* __WL1271_ACX_H__ */ |
diff --git a/drivers/net/wireless/wl12xx/wl1271_init.c b/drivers/net/wireless/wl12xx/wl1271_init.c index bf4d0e18fb81..f9315f601bd6 100644 --- a/drivers/net/wireless/wl12xx/wl1271_init.c +++ b/drivers/net/wireless/wl12xx/wl1271_init.c | |||
@@ -394,6 +394,11 @@ int wl1271_hw_init(struct wl1271 *wl) | |||
394 | if (ret < 0) | 394 | if (ret < 0) |
395 | goto out_free_memmap; | 395 | goto out_free_memmap; |
396 | 396 | ||
397 | /* Configure smart reflex */ | ||
398 | ret = wl1271_acx_smart_reflex(wl); | ||
399 | if (ret < 0) | ||
400 | goto out_free_memmap; | ||
401 | |||
397 | return 0; | 402 | return 0; |
398 | 403 | ||
399 | out_free_memmap: | 404 | out_free_memmap: |