From: Ivo van Doorn <ivdoorn@gmail.com>
To: "John W. Linville" <linville@tuxdriver.com>
Cc: linux-wireless@vger.kernel.org
Subject: [PATCH 18/18] rt2x00: Add watchdog functions for HW queue
Date: Sat, 6 Nov 2010 15:49:01 +0100 [thread overview]
Message-ID: <201011061549.02510.IvDoorn@gmail.com> (raw)
In-Reply-To: <201011061548.43949.IvDoorn@gmail.com>
From: Ivo van Doorn <IvDoorn@gmail.com>
Add watchdog functions for managing the Queues inside the hardware.
Normally the driver doesn't have much to do with these queues
directly, but the Ralink drivers did implement watchdog functions
for these. These watchdog functions are not triggered that often,
compared to the other watchdog functions, but I have at least
seen them trigger once or twice during a long stresstest run.
v2: Add extra documentation for register fields
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Acked-by: Gertjan van Wingerde <gwingerde@gmail.com>
---
drivers/net/wireless/rt2x00/rt2800.h | 16 +++++++++-
drivers/net/wireless/rt2x00/rt2800usb.c | 45 ++++++++++++++++++++++++++++++-
2 files changed, 58 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
index c2cc126..002224c 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -412,10 +412,22 @@
#define BCN_OFFSET1_BCN7 FIELD32(0xff000000)
/*
- * PBF registers
- * Most are for debug. Driver doesn't touch PBF register.
+ * TXRXQ_PCNT: PBF register
+ * PCNT_TX0Q: Page count for TX hardware queue 0
+ * PCNT_TX1Q: Page count for TX hardware queue 1
+ * PCNT_TX2Q: Page count for TX hardware queue 2
+ * PCNT_RX0Q: Page count for RX hardware queue
*/
#define TXRXQ_PCNT 0x0438
+#define TXRXQ_PCNT_TX0Q FIELD32(0x000000ff)
+#define TXRXQ_PCNT_TX1Q FIELD32(0x0000ff00)
+#define TXRXQ_PCNT_TX2Q FIELD32(0x00ff0000)
+#define TXRXQ_PCNT_RX0Q FIELD32(0xff000000)
+
+/*
+ * PBF register
+ * Debug. Driver doesn't touch PBF register.
+ */
#define PBF_DBG 0x043c
/*
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index f933371..389ecba 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -243,6 +243,49 @@ static int rt2800usb_set_device_state(struct rt2x00_dev *rt2x00dev,
}
/*
+ * Watchdog handlers
+ */
+static void rt2800usb_watchdog(struct rt2x00_dev *rt2x00dev)
+{
+ unsigned int i;
+ u32 reg;
+
+ rt2800_register_read(rt2x00dev, TXRXQ_PCNT, ®);
+ if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q)) {
+ WARNING(rt2x00dev, "TX HW queue 0 timed out,"
+ " invoke forced kick");
+
+ rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40012);
+
+ for (i = 0; i < 10; i++) {
+ udelay(10);
+ if (!rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q))
+ break;
+ }
+
+ rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006);
+ }
+
+ rt2800_register_read(rt2x00dev, TXRXQ_PCNT, ®);
+ if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q)) {
+ WARNING(rt2x00dev, "TX HW queue 1 timed out,"
+ " invoke forced kick");
+
+ rt2800_register_write(rt2x00dev, PBF_CFG, 0xf4000a);
+
+ for (i = 0; i < 10; i++) {
+ udelay(10);
+ if (!rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q))
+ break;
+ }
+
+ rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006);
+ }
+
+ rt2x00usb_watchdog(rt2x00dev);
+}
+
+/*
* TX descriptor initialization
*/
static __le32 *rt2800usb_get_txwi(struct queue_entry *entry)
@@ -534,7 +577,7 @@ static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {
.link_stats = rt2800_link_stats,
.reset_tuner = rt2800_reset_tuner,
.link_tuner = rt2800_link_tuner,
- .watchdog = rt2x00usb_watchdog,
+ .watchdog = rt2800usb_watchdog,
.write_tx_desc = rt2800usb_write_tx_desc,
.write_tx_data = rt2800_write_tx_data,
.write_beacon = rt2800_write_beacon,
--
1.7.2.3
prev parent reply other threads:[~2010-11-06 14:50 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-06 14:44 [PATCH 01/18] rt2x00: checkpatch.pl error fixes for rt2400pci.h Ivo van Doorn
2010-11-06 14:44 ` [PATCH 02/18] rt2x00: checkpatch.pl error fixes for rt2500pci.h Ivo van Doorn
2010-11-06 14:44 ` [PATCH 03/18] rt2x00: checkpatch.pl error fixes for rt2500usb.c Ivo van Doorn
2010-11-06 14:44 ` [PATCH 04/18] rt2x00: checkpatch.pl error fixes for rt2800.h Ivo van Doorn
2010-11-06 14:45 ` [PATCH 05/18] rt2x00: checkpatch.pl error fixes for rt2800lib.c Ivo van Doorn
2010-11-06 14:45 ` [PATCH 06/18] rt2x00: checkpatch.pl error fixes for rt2800pci.h Ivo van Doorn
2010-11-06 14:45 ` [PATCH 07/18] rt2x00: checkpatch.pl error fixes for rt2800usb.c Ivo van Doorn
2010-11-06 14:45 ` [PATCH 08/18] rt2x00: checkpatch.pl error fixes for rt2800usb.h Ivo van Doorn
2010-11-06 14:46 ` [PATCH 09/18] rt2x00: checkpatch.pl error fixes for rt2x00config.c Ivo van Doorn
2010-11-06 14:46 ` [PATCH 10/18] rt2x00: checkpatch.pl error fixes for rt2x00dev.c Ivo van Doorn
2010-11-06 14:46 ` [PATCH 11/18] rt2x00: checkpatch.pl error fixes for rt2x00lib.h Ivo van Doorn
2010-11-06 14:47 ` [PATCH 12/18] rt2x00: checkpatch.pl error fixes for rt2x00link.c Ivo van Doorn
2010-11-06 14:47 ` [PATCH 13/18] rt2x00: checkpatch.pl error fixes for rt2x00queue.c Ivo van Doorn
2010-11-06 14:47 ` [PATCH 14/18] rt2x00: checkpatch.pl error fixes for rt73usb.c Ivo van Doorn
2010-11-06 14:48 ` [PATCH 15/18] rt2x00: Rename queue->lock to queue->index_lock Ivo van Doorn
2010-11-06 14:48 ` [PATCH 16/18] rt2x00: Fix rt2x00queue_kick_tx_queue arguments Ivo van Doorn
2010-11-06 14:48 ` [PATCH 17/18] rt2x00: Remove rt2x00lib_toggle_rx Ivo van Doorn
2010-11-06 14:49 ` Ivo van Doorn [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201011061549.02510.IvDoorn@gmail.com \
--to=ivdoorn@gmail.com \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).