diff options
author | Kalle Valo <kvalo@qca.qualcomm.com> | 2011-10-27 15:48:52 (GMT) |
---|---|---|
committer | Kalle Valo <kvalo@qca.qualcomm.com> | 2011-11-11 10:58:57 (GMT) |
commit | d60e8ab6b9bcbbb5eb7591c1989f8c79d6b3d964 (patch) | |
tree | d4f87bbe935e0606423cd64c930dce2ae3be569d /drivers/net | |
parent | 0c30295e4fd5436ad0bd78a6e0974dc4933e2ddb (diff) | |
download | linux-fsl-qoriq-d60e8ab6b9bcbbb5eb7591c1989f8c79d6b3d964.tar.xz |
ath6kl: add a timeout to ath6kl_hif_intr_bh_handler()
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>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/ath/ath6kl/hif.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath6kl/hif.h | 2 |
2 files changed, 5 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath6kl/hif.c b/drivers/net/wireless/ath/ath6kl/hif.c index e2d8088..309be98 100644 --- a/drivers/net/wireless/ath/ath6kl/hif.c +++ b/drivers/net/wireless/ath/ath6kl/hif.c @@ -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; diff --git a/drivers/net/wireless/ath/ath6kl/hif.h b/drivers/net/wireless/ath/ath6kl/hif.h index ee7c31a..78a6c79 100644 --- a/drivers/net/wireless/ath/ath6kl/hif.h +++ b/drivers/net/wireless/ath/ath6kl/hif.h @@ -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; |