diff options
Diffstat (limited to 'drivers/net/wireless/ath/carl9170/main.c')
-rw-r--r-- | drivers/net/wireless/ath/carl9170/main.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/carl9170/main.c b/drivers/net/wireless/ath/carl9170/main.c index dc7b30b170d0..870df8c42622 100644 --- a/drivers/net/wireless/ath/carl9170/main.c +++ b/drivers/net/wireless/ath/carl9170/main.c | |||
@@ -428,6 +428,7 @@ static void carl9170_cancel_worker(struct ar9170 *ar) | |||
428 | cancel_delayed_work_sync(&ar->led_work); | 428 | cancel_delayed_work_sync(&ar->led_work); |
429 | #endif /* CONFIG_CARL9170_LEDS */ | 429 | #endif /* CONFIG_CARL9170_LEDS */ |
430 | cancel_work_sync(&ar->ps_work); | 430 | cancel_work_sync(&ar->ps_work); |
431 | cancel_work_sync(&ar->ping_work); | ||
431 | cancel_work_sync(&ar->ampdu_work); | 432 | cancel_work_sync(&ar->ampdu_work); |
432 | } | 433 | } |
433 | 434 | ||
@@ -533,6 +534,21 @@ void carl9170_restart(struct ar9170 *ar, const enum carl9170_restart_reasons r) | |||
533 | */ | 534 | */ |
534 | } | 535 | } |
535 | 536 | ||
537 | static void carl9170_ping_work(struct work_struct *work) | ||
538 | { | ||
539 | struct ar9170 *ar = container_of(work, struct ar9170, ping_work); | ||
540 | int err; | ||
541 | |||
542 | if (!IS_STARTED(ar)) | ||
543 | return; | ||
544 | |||
545 | mutex_lock(&ar->mutex); | ||
546 | err = carl9170_echo_test(ar, 0xdeadbeef); | ||
547 | if (err) | ||
548 | carl9170_restart(ar, CARL9170_RR_UNRESPONSIVE_DEVICE); | ||
549 | mutex_unlock(&ar->mutex); | ||
550 | } | ||
551 | |||
536 | static int carl9170_init_interface(struct ar9170 *ar, | 552 | static int carl9170_init_interface(struct ar9170 *ar, |
537 | struct ieee80211_vif *vif) | 553 | struct ieee80211_vif *vif) |
538 | { | 554 | { |
@@ -1614,6 +1630,7 @@ void *carl9170_alloc(size_t priv_size) | |||
1614 | skb_queue_head_init(&ar->tx_pending[i]); | 1630 | skb_queue_head_init(&ar->tx_pending[i]); |
1615 | } | 1631 | } |
1616 | INIT_WORK(&ar->ps_work, carl9170_ps_work); | 1632 | INIT_WORK(&ar->ps_work, carl9170_ps_work); |
1633 | INIT_WORK(&ar->ping_work, carl9170_ping_work); | ||
1617 | INIT_WORK(&ar->restart_work, carl9170_restart_work); | 1634 | INIT_WORK(&ar->restart_work, carl9170_restart_work); |
1618 | INIT_WORK(&ar->ampdu_work, carl9170_ampdu_work); | 1635 | INIT_WORK(&ar->ampdu_work, carl9170_ampdu_work); |
1619 | INIT_DELAYED_WORK(&ar->tx_janitor, carl9170_tx_janitor); | 1636 | INIT_DELAYED_WORK(&ar->tx_janitor, carl9170_tx_janitor); |
@@ -1829,7 +1846,7 @@ int carl9170_register(struct ar9170 *ar) | |||
1829 | err = carl9170_led_register(ar); | 1846 | err = carl9170_led_register(ar); |
1830 | if (err) | 1847 | if (err) |
1831 | goto err_unreg; | 1848 | goto err_unreg; |
1832 | #endif /* CONFIG_CAR9L170_LEDS */ | 1849 | #endif /* CONFIG_CARL9170_LEDS */ |
1833 | 1850 | ||
1834 | #ifdef CONFIG_CARL9170_WPC | 1851 | #ifdef CONFIG_CARL9170_WPC |
1835 | err = carl9170_register_wps_button(ar); | 1852 | err = carl9170_register_wps_button(ar); |