550-ath9k_bb_fix.patch 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. --- a/drivers/net/wireless/ath/ath9k/hw.c
  2. +++ b/drivers/net/wireless/ath/ath9k/hw.c
  3. @@ -1125,6 +1125,34 @@ static bool ath9k_hw_channel_change(stru
  4. return true;
  5. }
  6. +bool ath9k_hw_check_alive(struct ath_hw *ah)
  7. +{
  8. + int count = 50;
  9. + u32 reg;
  10. +
  11. + if (AR_SREV_9285_10_OR_LATER(ah))
  12. + return true;
  13. +
  14. + do {
  15. + reg = REG_READ(ah, AR_OBS_BUS_1);
  16. +
  17. + if ((reg & 0x7E7FFFEF) != 0x00702400)
  18. + return true;
  19. +
  20. + switch (reg & 0x7E000B00) {
  21. + case 0x1E000000:
  22. + case 0x52000B00:
  23. + case 0x18000B00:
  24. + continue;
  25. + default:
  26. + return true;
  27. + }
  28. + } while (count-- > 0);
  29. +
  30. + return false;
  31. +}
  32. +EXPORT_SYMBOL(ath9k_hw_check_alive);
  33. +
  34. int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
  35. bool bChannelChange)
  36. {
  37. --- a/drivers/net/wireless/ath/ath9k/hw.h
  38. +++ b/drivers/net/wireless/ath/ath9k/hw.h
  39. @@ -847,6 +847,7 @@ void ath9k_hw_set11nmac2040(struct ath_h
  40. void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period);
  41. void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
  42. const struct ath9k_beacon_state *bs);
  43. +bool ath9k_hw_check_alive(struct ath_hw *ah);
  44. bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
  45. --- a/drivers/net/wireless/ath/ath9k/main.c
  46. +++ b/drivers/net/wireless/ath/ath9k/main.c
  47. @@ -406,7 +406,8 @@ void ath9k_tasklet(unsigned long data)
  48. ath9k_ps_wakeup(sc);
  49. - if (status & ATH9K_INT_FATAL) {
  50. + if ((status & ATH9K_INT_FATAL) ||
  51. + !ath9k_hw_check_alive(ah)) {
  52. ath_reset(sc, false);
  53. ath9k_ps_restore(sc);
  54. return;