Make watchdog disabled by default and add module parameter to enable it.

User will have to create file in /etc/modprobe.d/ with

options rt2800lib watchdog=1

to enable the watchdog or load "rt2800lib watchdog=1" module manually
before loading rt2800{soc,pci,usb} module.

Signed-off-by: Stanislaw Gruszka <[email protected]>
---
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c  | 12 ++++++++++--
 drivers/net/wireless/ralink/rt2x00/rt2x00.h     |  1 +
 drivers/net/wireless/ralink/rt2x00/rt2x00link.c |  2 +-
 3 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c 
b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
index a509953d7c2e..3c04e8fb65b5 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
@@ -41,6 +41,10 @@
 #include "rt2800lib.h"
 #include "rt2800.h"
 
+static bool modparam_watchdog;
+module_param_named(watchdog, modparam_watchdog, bool, S_IRUGO);
+MODULE_PARM_DESC(watchdog, "Enable watchdog to detect tx/rx hangs and reset 
hardware if detected");
+
 /*
  * Register access.
  * All access to the CSR registers will go through the methods
@@ -10289,8 +10293,12 @@ int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
                __set_bit(REQUIRE_TASKLET_CONTEXT, &rt2x00dev->cap_flags);
        }
 
-       __set_bit(CAPABILITY_RESTART_HW, &rt2x00dev->cap_flags);
-       rt2x00dev->link.watchdog_interval = msecs_to_jiffies(100);
+       if (modparam_watchdog) {
+               __set_bit(CAPABILITY_RESTART_HW, &rt2x00dev->cap_flags);
+               rt2x00dev->link.watchdog_interval = msecs_to_jiffies(100);
+       } else {
+               rt2x00dev->link.watchdog_disabled = true;
+       }
 
        /*
         * Set the rssi offset.
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h 
b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
index 1d7eaa9ecffb..c76d41272b03 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
@@ -337,6 +337,7 @@ struct link {
         */
        struct delayed_work watchdog_work;
        unsigned int watchdog_interval;
+       bool watchdog_disabled;
 
        /*
         * Work structure for scheduling periodic AGC adjustments.
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00link.c 
b/drivers/net/wireless/ralink/rt2x00/rt2x00link.c
index fcc59553918f..db4b164ac848 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00link.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00link.c
@@ -395,7 +395,7 @@ void rt2x00link_start_watchdog(struct rt2x00_dev *rt2x00dev)
        struct link *link = &rt2x00dev->link;
 
        if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) &&
-           rt2x00dev->ops->lib->watchdog)
+           rt2x00dev->ops->lib->watchdog && !link->watchdog_disabled)
                ieee80211_queue_delayed_work(rt2x00dev->hw,
                                             &link->watchdog_work,
                                             link->watchdog_interval);
-- 
2.7.5

Reply via email to