aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuuso Oikarinen <juuso.oikarinen@nokia.com>2009-10-12 08:08:52 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-10-27 16:48:05 -0400
commit3cfd6cf960b2b030ccae1144a5c0dcd91c7c56a8 (patch)
tree54d0ff7c915701d12fdf891f5131e44c0efd6682
parent5d0af498c08b43566733d5c5fb8293ce3b109eab (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.c72
-rw-r--r--drivers/net/wireless/wl12xx/wl1271_acx.h23
-rw-r--r--drivers/net/wireless/wl12xx/wl1271_init.c5
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
1002int 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
1067out:
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
448struct acx_smart_reflex_state {
449 struct acx_header header;
450
451 u8 enable;
452 u8 padding[3];
453};
454
455struct smart_reflex_err_table {
456 u8 len;
457 s8 upper_limit;
458 s8 values[14];
459};
460
461struct 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);
1233int wl1271_acx_mem_cfg(struct wl1271 *wl); 1255int wl1271_acx_mem_cfg(struct wl1271 *wl);
1234int wl1271_acx_init_mem_config(struct wl1271 *wl); 1256int wl1271_acx_init_mem_config(struct wl1271 *wl);
1235int wl1271_acx_init_rx_interrupt(struct wl1271 *wl); 1257int wl1271_acx_init_rx_interrupt(struct wl1271 *wl);
1258int 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: