kfree(rx_conf);
return ret;
}
+
+int wl1271_acx_smart_reflex(struct wl1271 *wl)
+{
+ struct acx_smart_reflex_state *sr_state = NULL;
+ struct acx_smart_reflex_config_params *sr_param = NULL;
+ int ret;
+
+ wl1271_debug(DEBUG_ACX, "acx smart reflex");
+
+ sr_param = kzalloc(sizeof(*sr_param), GFP_KERNEL);
+ if (!sr_param) {
+ ret = -ENOMEM;
+ goto out;
+ }
+
+ /* set cryptic smart reflex parameters - source TI reference code */
+ sr_param->error_table[0].len = 0x07;
+ sr_param->error_table[0].upper_limit = 0x03;
+ sr_param->error_table[0].values[0] = 0x18;
+ sr_param->error_table[0].values[1] = 0x10;
+ sr_param->error_table[0].values[2] = 0x05;
+ sr_param->error_table[0].values[3] = 0xfb;
+ sr_param->error_table[0].values[4] = 0xf0;
+ sr_param->error_table[0].values[5] = 0xe8;
+
+ sr_param->error_table[1].len = 0x07;
+ sr_param->error_table[1].upper_limit = 0x03;
+ sr_param->error_table[1].values[0] = 0x18;
+ sr_param->error_table[1].values[1] = 0x10;
+ sr_param->error_table[1].values[2] = 0x05;
+ sr_param->error_table[1].values[3] = 0xf6;
+ sr_param->error_table[1].values[4] = 0xf0;
+ sr_param->error_table[1].values[5] = 0xe8;
+
+ sr_param->error_table[2].len = 0x07;
+ sr_param->error_table[2].upper_limit = 0x03;
+ sr_param->error_table[2].values[0] = 0x18;
+ sr_param->error_table[2].values[1] = 0x10;
+ sr_param->error_table[2].values[2] = 0x05;
+ sr_param->error_table[2].values[3] = 0xfb;
+ sr_param->error_table[2].values[4] = 0xf0;
+ sr_param->error_table[2].values[5] = 0xe8;
+
+ ret = wl1271_cmd_configure(wl, ACX_SET_SMART_REFLEX_PARAMS,
+ sr_param, sizeof(*sr_param));
+ if (ret < 0) {
+ wl1271_warning("failed to set smart reflex params: %d", ret);
+ goto out;
+ }
+
+ sr_state = kzalloc(sizeof(*sr_state), GFP_KERNEL);
+ if (!sr_state) {
+ ret = -ENOMEM;
+ goto out;
+ }
+
+ /* enable smart reflex */
+ sr_state->enable = 1;
+
+ ret = wl1271_cmd_configure(wl, ACX_SET_SMART_REFLEX_STATE,
+ sr_state, sizeof(*sr_state));
+ if (ret < 0) {
+ wl1271_warning("failed to set smart reflex params: %d", ret);
+ goto out;
+ }
+
+out:
+ kfree(sr_state);
+ kfree(sr_param);
+ return ret;
+
+}
u8 pad[3];
} __attribute__ ((packed));
+struct acx_smart_reflex_state {
+ struct acx_header header;
+
+ u8 enable;
+ u8 padding[3];
+};
+
+struct smart_reflex_err_table {
+ u8 len;
+ s8 upper_limit;
+ s8 values[14];
+};
+
+struct acx_smart_reflex_config_params {
+ struct acx_header header;
+
+ struct smart_reflex_err_table error_table[3];
+};
+
#define PTA_ANTENNA_TYPE_DEF (0)
#define PTA_BT_HP_MAXTIME_DEF (2000)
#define PTA_WLAN_HP_MAX_TIME_DEF (5000)
ACX_PEER_HT_CAP = 0x0057,
ACX_HT_BSS_OPERATION = 0x0058,
ACX_COEX_ACTIVITY = 0x0059,
+ ACX_SET_SMART_REFLEX_DEBUG = 0x005A,
+ ACX_SET_SMART_REFLEX_STATE = 0x005B,
+ ACX_SET_SMART_REFLEX_PARAMS = 0x005F,
DOT11_RX_MSDU_LIFE_TIME = 0x1004,
DOT11_CUR_TX_PWR = 0x100D,
DOT11_RX_DOT11_MODE = 0x1012,
int wl1271_acx_mem_cfg(struct wl1271 *wl);
int wl1271_acx_init_mem_config(struct wl1271 *wl);
int wl1271_acx_init_rx_interrupt(struct wl1271 *wl);
+int wl1271_acx_smart_reflex(struct wl1271 *wl);
#endif /* __WL1271_ACX_H__ */