ath6kl: add a timeout to ath6kl_hif_intr_bh_handler()
authorKalle Valo <kvalo@qca.qualcomm.com>
Thu, 27 Oct 2011 15:48:52 +0000 (18:48 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Fri, 11 Nov 2011 10:58:57 +0000 (12:58 +0200)
It's possible to busyloop forever in ath6kl_hif_intr_bh_handler(). Add
a check that it lasts only one second.

Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath6kl/hif.c
drivers/net/wireless/ath/ath6kl/hif.h

index e2d8088..309be98 100644 (file)
@@ -485,6 +485,7 @@ out:
 int ath6kl_hif_intr_bh_handler(struct ath6kl *ar)
 {
        struct ath6kl_device *dev = ar->htc_target->dev;
+       unsigned long timeout;
        int status = 0;
        bool done = false;
 
@@ -498,7 +499,8 @@ int ath6kl_hif_intr_bh_handler(struct ath6kl *ar)
         * IRQ processing is synchronous, interrupt status registers can be
         * re-read.
         */
-       while (!done) {
+       timeout = jiffies + msecs_to_jiffies(ATH6KL_HIF_COMMUNICATION_TIMEOUT);
+       while (time_before(jiffies, timeout) && !done) {
                status = proc_pending_irqs(dev, &done);
                if (status)
                        break;
index ee7c31a..78a6c79 100644 (file)
@@ -69,6 +69,8 @@
 #define ATH6KL_MAX_TRANSFER_SIZE_PER_SCATTER      (16 * 1024)
 #define ATH6KL_SCATTER_REQS                       4
 
+#define ATH6KL_HIF_COMMUNICATION_TIMEOUT       1000
+
 struct bus_request {
        struct list_head list;