Commit 7230341f authored by Yair Shapira's avatar Yair Shapira Committed by Luciano Coelho

wlcore/wl18xx/wl12xx: add recovery settings to conf

add support for recovery settings including bug_on_recovery and
no_recovery options.

These options can now be set using wl18xx-conf.bin file and wlconf
tool.
Signed-off-by: default avatarYair Shapira <yair.shapira@ti.com>
Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent c108c905
...@@ -370,6 +370,10 @@ static struct wlcore_conf wl12xx_conf = { ...@@ -370,6 +370,10 @@ static struct wlcore_conf wl12xx_conf = {
.increase_time = 1, .increase_time = 1,
.window_size = 16, .window_size = 16,
}, },
.recovery = {
.bug_on_recovery = 0,
.no_recovery = 0,
},
}; };
static struct wl12xx_priv_conf wl12xx_default_priv_conf = { static struct wl12xx_priv_conf wl12xx_default_priv_conf = {
......
...@@ -492,6 +492,10 @@ static struct wlcore_conf wl18xx_conf = { ...@@ -492,6 +492,10 @@ static struct wlcore_conf wl18xx_conf = {
.increase_time = 1, .increase_time = 1,
.window_size = 16, .window_size = 16,
}, },
.recovery = {
.bug_on_recovery = 0,
.no_recovery = 0,
},
}; };
static struct wl18xx_priv_conf wl18xx_default_priv_conf = { static struct wl18xx_priv_conf wl18xx_default_priv_conf = {
......
...@@ -1268,12 +1268,20 @@ struct conf_hangover_settings { ...@@ -1268,12 +1268,20 @@ struct conf_hangover_settings {
u8 window_size; u8 window_size;
} __packed; } __packed;
struct conf_recovery_settings {
/* BUG() on fw recovery */
u8 bug_on_recovery;
/* Prevent HW recovery. FW will remain stuck. */
u8 no_recovery;
} __packed;
/* /*
* The conf version consists of 4 bytes. The two MSB are the wlcore * The conf version consists of 4 bytes. The two MSB are the wlcore
* version, the two LSB are the lower driver's private conf * version, the two LSB are the lower driver's private conf
* version. * version.
*/ */
#define WLCORE_CONF_VERSION (0x0003 << 16) #define WLCORE_CONF_VERSION (0x0004 << 16)
#define WLCORE_CONF_MASK 0xffff0000 #define WLCORE_CONF_MASK 0xffff0000
#define WLCORE_CONF_SIZE (sizeof(struct wlcore_conf_header) + \ #define WLCORE_CONF_SIZE (sizeof(struct wlcore_conf_header) + \
sizeof(struct wlcore_conf)) sizeof(struct wlcore_conf))
...@@ -1301,6 +1309,7 @@ struct wlcore_conf { ...@@ -1301,6 +1309,7 @@ struct wlcore_conf {
struct conf_fwlog fwlog; struct conf_fwlog fwlog;
struct conf_rate_policy_settings rate; struct conf_rate_policy_settings rate;
struct conf_hangover_settings hangover; struct conf_hangover_settings hangover;
struct conf_recovery_settings recovery;
} __packed; } __packed;
struct wlcore_conf_file { struct wlcore_conf_file {
......
...@@ -56,8 +56,8 @@ ...@@ -56,8 +56,8 @@
#define WL1271_BOOT_RETRIES 3 #define WL1271_BOOT_RETRIES 3
static char *fwlog_param; static char *fwlog_param;
static bool bug_on_recovery; static int bug_on_recovery = -1;
static bool no_recovery; static int no_recovery = -1;
static void __wl1271_op_remove_interface(struct wl1271 *wl, static void __wl1271_op_remove_interface(struct wl1271 *wl,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
...@@ -306,6 +306,7 @@ static void wl12xx_tx_watchdog_work(struct work_struct *work) ...@@ -306,6 +306,7 @@ static void wl12xx_tx_watchdog_work(struct work_struct *work)
static void wlcore_adjust_conf(struct wl1271 *wl) static void wlcore_adjust_conf(struct wl1271 *wl)
{ {
/* Adjust settings according to optional module parameters */ /* Adjust settings according to optional module parameters */
if (fwlog_param) { if (fwlog_param) {
if (!strcmp(fwlog_param, "continuous")) { if (!strcmp(fwlog_param, "continuous")) {
wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS; wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS;
...@@ -321,6 +322,12 @@ static void wlcore_adjust_conf(struct wl1271 *wl) ...@@ -321,6 +322,12 @@ static void wlcore_adjust_conf(struct wl1271 *wl)
wl1271_error("Unknown fwlog parameter %s", fwlog_param); wl1271_error("Unknown fwlog parameter %s", fwlog_param);
} }
} }
if (bug_on_recovery != -1)
wl->conf.recovery.bug_on_recovery = (u8) bug_on_recovery;
if (no_recovery != -1)
wl->conf.recovery.no_recovery = (u8) no_recovery;
} }
static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl, static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl,
...@@ -903,10 +910,10 @@ static void wl1271_recovery_work(struct work_struct *work) ...@@ -903,10 +910,10 @@ static void wl1271_recovery_work(struct work_struct *work)
wlcore_print_recovery(wl); wlcore_print_recovery(wl);
} }
BUG_ON(bug_on_recovery && BUG_ON(wl->conf.recovery.bug_on_recovery &&
!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags)); !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags));
if (no_recovery) { if (wl->conf.recovery.no_recovery) {
wl1271_info("No recovery (chosen on module load). Fw will remain stuck."); wl1271_info("No recovery (chosen on module load). Fw will remain stuck.");
goto out_unlock; goto out_unlock;
} }
...@@ -6013,10 +6020,10 @@ module_param_named(fwlog, fwlog_param, charp, 0); ...@@ -6013,10 +6020,10 @@ module_param_named(fwlog, fwlog_param, charp, 0);
MODULE_PARM_DESC(fwlog, MODULE_PARM_DESC(fwlog,
"FW logger options: continuous, ondemand, dbgpins or disable"); "FW logger options: continuous, ondemand, dbgpins or disable");
module_param(bug_on_recovery, bool, S_IRUSR | S_IWUSR); module_param(bug_on_recovery, int, S_IRUSR | S_IWUSR);
MODULE_PARM_DESC(bug_on_recovery, "BUG() on fw recovery"); MODULE_PARM_DESC(bug_on_recovery, "BUG() on fw recovery");
module_param(no_recovery, bool, S_IRUSR | S_IWUSR); module_param(no_recovery, int, S_IRUSR | S_IWUSR);
MODULE_PARM_DESC(no_recovery, "Prevent HW recovery. FW will remain stuck."); MODULE_PARM_DESC(no_recovery, "Prevent HW recovery. FW will remain stuck.");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment