diff options
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800.h | 16 | ||||
-rw-r--r-- | 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 c2cc126502d6..002224c9bb62 100644 --- a/drivers/net/wireless/rt2x00/rt2800.h +++ b/drivers/net/wireless/rt2x00/rt2800.h | |||
@@ -412,10 +412,22 @@ | |||
412 | #define BCN_OFFSET1_BCN7 FIELD32(0xff000000) | 412 | #define BCN_OFFSET1_BCN7 FIELD32(0xff000000) |
413 | 413 | ||
414 | /* | 414 | /* |
415 | * PBF registers | 415 | * TXRXQ_PCNT: PBF register |
416 | * Most are for debug. Driver doesn't touch PBF register. | 416 | * PCNT_TX0Q: Page count for TX hardware queue 0 |
417 | * PCNT_TX1Q: Page count for TX hardware queue 1 | ||
418 | * PCNT_TX2Q: Page count for TX hardware queue 2 | ||
419 | * PCNT_RX0Q: Page count for RX hardware queue | ||
417 | */ | 420 | */ |
418 | #define TXRXQ_PCNT 0x0438 | 421 | #define TXRXQ_PCNT 0x0438 |
422 | #define TXRXQ_PCNT_TX0Q FIELD32(0x000000ff) | ||
423 | #define TXRXQ_PCNT_TX1Q FIELD32(0x0000ff00) | ||
424 | #define TXRXQ_PCNT_TX2Q FIELD32(0x00ff0000) | ||
425 | #define TXRXQ_PCNT_RX0Q FIELD32(0xff000000) | ||
426 | |||
427 | /* | ||
428 | * PBF register | ||
429 | * Debug. Driver doesn't touch PBF register. | ||
430 | */ | ||
419 | #define PBF_DBG 0x043c | 431 | #define PBF_DBG 0x043c |
420 | 432 | ||
421 | /* | 433 | /* |
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index f93337128504..389ecba8e891 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, | |||
243 | } | 243 | } |
244 | 244 | ||
245 | /* | 245 | /* |
246 | * Watchdog handlers | ||
247 | */ | ||
248 | static void rt2800usb_watchdog(struct rt2x00_dev *rt2x00dev) | ||
249 | { | ||
250 | unsigned int i; | ||
251 | u32 reg; | ||
252 | |||
253 | rt2800_register_read(rt2x00dev, TXRXQ_PCNT, ®); | ||
254 | if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q)) { | ||
255 | WARNING(rt2x00dev, "TX HW queue 0 timed out," | ||
256 | " invoke forced kick"); | ||
257 | |||
258 | rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40012); | ||
259 | |||
260 | for (i = 0; i < 10; i++) { | ||
261 | udelay(10); | ||
262 | if (!rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q)) | ||
263 | break; | ||
264 | } | ||
265 | |||
266 | rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006); | ||
267 | } | ||
268 | |||
269 | rt2800_register_read(rt2x00dev, TXRXQ_PCNT, ®); | ||
270 | if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q)) { | ||
271 | WARNING(rt2x00dev, "TX HW queue 1 timed out," | ||
272 | " invoke forced kick"); | ||
273 | |||
274 | rt2800_register_write(rt2x00dev, PBF_CFG, 0xf4000a); | ||
275 | |||
276 | for (i = 0; i < 10; i++) { | ||
277 | udelay(10); | ||
278 | if (!rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q)) | ||
279 | break; | ||
280 | } | ||
281 | |||
282 | rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006); | ||
283 | } | ||
284 | |||
285 | rt2x00usb_watchdog(rt2x00dev); | ||
286 | } | ||
287 | |||
288 | /* | ||
246 | * TX descriptor initialization | 289 | * TX descriptor initialization |
247 | */ | 290 | */ |
248 | static __le32 *rt2800usb_get_txwi(struct queue_entry *entry) | 291 | static __le32 *rt2800usb_get_txwi(struct queue_entry *entry) |
@@ -534,7 +577,7 @@ static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = { | |||
534 | .link_stats = rt2800_link_stats, | 577 | .link_stats = rt2800_link_stats, |
535 | .reset_tuner = rt2800_reset_tuner, | 578 | .reset_tuner = rt2800_reset_tuner, |
536 | .link_tuner = rt2800_link_tuner, | 579 | .link_tuner = rt2800_link_tuner, |
537 | .watchdog = rt2x00usb_watchdog, | 580 | .watchdog = rt2800usb_watchdog, |
538 | .write_tx_desc = rt2800usb_write_tx_desc, | 581 | .write_tx_desc = rt2800usb_write_tx_desc, |
539 | .write_tx_data = rt2800_write_tx_data, | 582 | .write_tx_data = rt2800_write_tx_data, |
540 | .write_beacon = rt2800_write_beacon, | 583 | .write_beacon = rt2800_write_beacon, |