ath9k: use external reset on AR91xx and QCA955x to improve stability
[openwrt/openwrt.git] / package / kernel / mac80211 / patches / 542-ath9k_debugfs_diag.patch
index e4cc0d40fbcad1b5c98c769191300e31eac2f8e1..3b746dc6833a1a9b91ff98dafce895ea31db73e4 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1625,6 +1625,50 @@ static const struct file_operations fops
+@@ -1467,6 +1467,50 @@ static const struct file_operations fops
  #endif
  
  
  int ath9k_init_debug(struct ath_hw *ah)
  {
        struct ath_common *common = ath9k_hw_common(ah);
-@@ -1652,6 +1696,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1494,6 +1538,8 @@ int ath9k_init_debug(struct ath_hw *ah)
        debugfs_create_file("gpio_led", S_IWUSR,
                           sc->debug.debugfs_phy, sc, &fops_gpio_led);
  #endif
 +      debugfs_create_file("diag", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
 +                          sc, &fops_diag);
-       debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc,
-                           &fops_dma);
-       debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
+       debugfs_create_devm_seqfile(sc->dev, "dma", sc->debug.debugfs_phy,
+                                   read_file_dma);
+       debugfs_create_devm_seqfile(sc->dev, "interrupt", sc->debug.debugfs_phy,
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -482,6 +482,12 @@ enum {
+@@ -520,6 +520,12 @@ enum {
        ATH9K_RESET_COLD,
  };
  
@@ -75,7 +75,7 @@
  struct ath9k_hw_version {
        u32 magic;
        u16 devid;
-@@ -762,6 +768,8 @@ struct ath_hw {
+@@ -805,6 +811,8 @@ struct ath_hw {
        u32 rfkill_polarity;
        u32 ah_flags;
  
@@ -84,7 +84,7 @@
        bool reset_power_on;
        bool htc_reset_init;
  
-@@ -1013,6 +1021,7 @@ void ath9k_hw_check_nav(struct ath_hw *a
+@@ -1067,6 +1075,7 @@ void ath9k_hw_check_nav(struct ath_hw *a
  bool ath9k_hw_check_alive(struct ath_hw *ah);
  
  bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
@@ -94,9 +94,9 @@
  struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1730,6 +1730,20 @@ fail:
-       return -EINVAL;
+@@ -1841,6 +1841,20 @@ u32 ath9k_hw_get_tsf_offset(struct times
  }
+ EXPORT_SYMBOL(ath9k_hw_get_tsf_offset);
  
 +void ath9k_hw_update_diag(struct ath_hw *ah)
 +{
  int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
                   struct ath9k_hw_cal_data *caldata, bool fastcc)
  {
-@@ -1935,6 +1949,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2049,6 +2063,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
                ar9003_hw_disable_phy_restart(ah);
  
        ath9k_hw_apply_gpio_override(ah);
                REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -602,6 +602,11 @@ irqreturn_t ath_isr(int irq, void *dev)
-       ath9k_debug_sync_cause(sc, sync_cause);
-       status &= ah->imask;    /* discard unasked-for bits */
+@@ -533,6 +533,11 @@ irqreturn_t ath_isr(int irq, void *dev)
+       if (test_bit(ATH_OP_HW_RESET, &common->op_flags))
+               return IRQ_HANDLED;
  
 +      if (test_bit(ATH_DIAG_TRIGGER_ERROR, &ah->diag)) {
 +              status |= ATH9K_INT_FATAL;