Browse Source

mac80211: backport ath9k GPIO support

Matthias Schiffer 8 years ago
parent
commit
b56b6640e6
77 changed files with 1562 additions and 26 deletions
  1. 0 0
      patches/openwrt/0010-ipv6-fix-crash-on-ICMPv6-redirects-with-prohibited-blackholed-source.patch
  2. 0 0
      patches/openwrt/0011-lua-fix-installation-of-headers-for-host-build.patch
  3. 0 0
      patches/openwrt/0012-kernel-fs-seq_file-fallback-to-vmalloc-instead-of-oom-kill-processes.patch
  4. 0 0
      patches/openwrt/0013-fix-UBNT-XM-model-detection.patch
  5. 0 0
      patches/openwrt/0014-base-files-implemented-basic-GPIO-control.patch
  6. 0 0
      patches/openwrt/0015-ar71xx-assign-proper-GPIO-pin-for-Ubiquiti-Nanostation-models.patch
  7. 0 0
      patches/openwrt/0016-netifd-update-to-latest-git-master.patch
  8. 0 0
      patches/openwrt/0017-x86-fix-platform_export_bootpart-for-Xen-virtual-disks.patch
  9. 0 0
      patches/openwrt/0018-Support-LibreSSL-as-provider-of-openssl.patch
  10. 0 0
      patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch
  11. 0 0
      patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch
  12. 0 0
      patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch
  13. 0 0
      patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch
  14. 0 0
      patches/openwrt/0023-xtables-addons-build-fix-configure-compatiblity-with-POSIX-shells.patch
  15. 0 0
      patches/openwrt/0024-tools-add-tar-host-build-required-for-sort-name-which-was-only-added-in-the-latest-version.patch
  16. 0 0
      patches/openwrt/0025-tools-compile-flock-before-everything-else.patch
  17. 0 0
      patches/openwrt/0026-rules.mk-make-the-locked-template-available-even-if-flock-has-not-been-built-yet-fall-back-to-unlocked-shell-command.patch
  18. 0 0
      patches/openwrt/0027-build-add-locking-for-downloads-fixes-race-conditions-with-multiple-variants.patch
  19. 0 0
      patches/openwrt/0028-download.mk-fix-packed-checkout-mirroring-support.patch
  20. 0 0
      patches/openwrt/0029-kernel-backport-spi-nor-driver-from-4.4.9.patch
  21. 0 0
      patches/openwrt/0030-kernel-mtd-spi-nor-wait-until-status-register-writes-are-ready.patch
  22. 0 0
      patches/openwrt/0031-kernel-mtd-spi-nor-unlock-Winbond-flashs.patch
  23. 0 0
      patches/openwrt/0032-tools-pkg-config-fix-build-with-GCC-6.patch
  24. 0 0
      patches/openwrt/0033-tools-mkimage-sync-include-linux-compiler-.h-with-u-boot-master.patch
  25. 0 0
      patches/openwrt/0034-toolchain-gcc-fix-build-with-GCC-6.patch
  26. 0 0
      patches/openwrt/0035-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch
  27. 0 0
      patches/openwrt/0036-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch
  28. 0 0
      patches/openwrt/0037-ar71xx-update-QCA956x-support.patch
  29. 0 0
      patches/openwrt/0038-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch
  30. 0 0
      patches/openwrt/0039-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch
  31. 0 0
      patches/openwrt/0040-ar71xx-fix-qca956x-ethernet-initialization.patch
  32. 0 0
      patches/openwrt/0041-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch
  33. 0 0
      patches/openwrt/0042-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch
  34. 0 0
      patches/openwrt/0043-ar71xx-Rename-unifiac-to-unifiac-lite.patch
  35. 0 0
      patches/openwrt/0044-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch
  36. 0 0
      patches/openwrt/0045-ar71xx-Generate-sysupgrade-images-for-OpenMesh-devices.patch
  37. 0 0
      patches/openwrt/0046-ar71xx-add-kernel-support-for-the-OpenMesh-MR1750-board.patch
  38. 0 0
      patches/openwrt/0047-ar71xx-add-user-space-support-for-the-OpenMesh-MR1750-board.patch
  39. 0 0
      patches/openwrt/0048-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-MR1750.patch
  40. 0 0
      patches/openwrt/0049-ar71xx-enable-sysupgrade-for-the-OpenMesh-MR1750.patch
  41. 0 0
      patches/openwrt/0050-package-om-watchdog-add-OpenMesh-MR1750-support.patch
  42. 0 0
      patches/openwrt/0051-package-uboot-envtools-add-OpenMesh-MR1750-support.patch
  43. 0 0
      patches/openwrt/0052-ar71xx-create-profile-and-build-image-for-the-OpenMesh-MR1750-board.patch
  44. 0 0
      patches/openwrt/0053-ar71xx-Extend-the-list-of-bits-in-QCA955X_GMAC_REG_ETH_CFG.patch
  45. 0 0
      patches/openwrt/0054-ar71xx-Use-_eth_cfg-helper-for-Open-Mesh-MR900-boards.patch
  46. 0 0
      patches/openwrt/0055-ar71xx-Allow-to-use-ath79_gpio_output_select-on-QCA955x.patch
  47. 0 0
      patches/openwrt/0056-ar71xx-Add-support-for-ath79_gpio_function_-on-QCA955X.patch
  48. 0 0
      patches/openwrt/0057-ar71xx-Add-QCA955X-GPIO-mux-and-function-definitions.patch
  49. 0 0
      patches/openwrt/0058-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR900.patch
  50. 0 0
      patches/openwrt/0059-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR1750.patch
  51. 0 0
      patches/openwrt/0060-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR900.patch
  52. 0 0
      patches/openwrt/0061-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR1750.patch
  53. 0 0
      patches/openwrt/0062-scripts-om-fwupgradecfg-gen.sh-Fix-u-boot-image-md5sum-check.patch
  54. 0 0
      patches/openwrt/0063-scripts-om-fwupgradecfg-gen.sh-Generate-sha256sum-for-uboot-verification.patch
  55. 0 0
      patches/openwrt/0064-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-AC-board.patch
  56. 0 0
      patches/openwrt/0065-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-AC.patch
  57. 0 0
      patches/openwrt/0066-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-OM5P-AC.patch
  58. 0 0
      patches/openwrt/0067-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-AC.patch
  59. 0 0
      patches/openwrt/0068-om-watchdog-add-OpenMesh-OM5P-AC-support.patch
  60. 0 0
      patches/openwrt/0069-uboot-envtools-add-OpenMesh-OM5P-AC-support.patch
  61. 0 0
      patches/openwrt/0070-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-AC-board.patch
  62. 0 0
      patches/openwrt/0071-ar71xx-create-profile-and-build-image-for-the-OpenMesh-OM5P-AC-board.patch
  63. 0 0
      patches/openwrt/0072-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-ACv2-board.patch
  64. 0 0
      patches/openwrt/0073-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-ACv2.patch
  65. 0 0
      patches/openwrt/0074-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-ACv2.patch
  66. 0 0
      patches/openwrt/0075-om-watchdog-add-OpenMesh-OM5P-ACv2-support.patch
  67. 0 0
      patches/openwrt/0076-uboot-envtools-add-OpenMesh-OM5P-ACv2-support.patch
  68. 0 0
      patches/openwrt/0077-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-ACv2-board.patch
  69. 0 0
      patches/openwrt/0078-ar71xx-add-OM5P-ACv2-to-the-OM5P-AC-profile.patch
  70. 0 0
      patches/openwrt/0079-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch
  71. 121 0
      patches/openwrt/0080-mac80211-ath9k-enable-platform-WLAN-LED-name.patch
  72. 47 0
      patches/openwrt/0081-mac80211-ath9k-set-default-state-for-platform-LEDs.patch
  73. 261 0
      patches/openwrt/0082-mac80211-ath9k-enable-access-to-GPIO.patch
  74. 30 0
      patches/openwrt/0083-mac80211-refresh-patch.patch
  75. 259 0
      patches/openwrt/0084-mac80211-ath9k-enable-GPIO-buttons.patch
  76. 827 0
      patches/openwrt/0085-mac80211-rework-gpio-chip-button-support-to-build-on-platforms-without-CONFIG_GPIOLIB.patch
  77. 17 26
      patches/openwrt/0086-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch

+ 0 - 0
patches/openwrt/0011-ipv6-fix-crash-on-ICMPv6-redirects-with-prohibited-blackholed-source.patch → patches/openwrt/0010-ipv6-fix-crash-on-ICMPv6-redirects-with-prohibited-blackholed-source.patch


+ 0 - 0
patches/openwrt/0012-lua-fix-installation-of-headers-for-host-build.patch → patches/openwrt/0011-lua-fix-installation-of-headers-for-host-build.patch


+ 0 - 0
patches/openwrt/0013-kernel-fs-seq_file-fallback-to-vmalloc-instead-of-oom-kill-processes.patch → patches/openwrt/0012-kernel-fs-seq_file-fallback-to-vmalloc-instead-of-oom-kill-processes.patch


+ 0 - 0
patches/openwrt/0014-fix-UBNT-XM-model-detection.patch → patches/openwrt/0013-fix-UBNT-XM-model-detection.patch


+ 0 - 0
patches/openwrt/0015-base-files-implemented-basic-GPIO-control.patch → patches/openwrt/0014-base-files-implemented-basic-GPIO-control.patch


+ 0 - 0
patches/openwrt/0016-ar71xx-assign-proper-GPIO-pin-for-Ubiquiti-Nanostation-models.patch → patches/openwrt/0015-ar71xx-assign-proper-GPIO-pin-for-Ubiquiti-Nanostation-models.patch


+ 0 - 0
patches/openwrt/0017-netifd-update-to-latest-git-master.patch → patches/openwrt/0016-netifd-update-to-latest-git-master.patch


+ 0 - 0
patches/openwrt/0018-x86-fix-platform_export_bootpart-for-Xen-virtual-disks.patch → patches/openwrt/0017-x86-fix-platform_export_bootpart-for-Xen-virtual-disks.patch


+ 0 - 0
patches/openwrt/0019-Support-LibreSSL-as-provider-of-openssl.patch → patches/openwrt/0018-Support-LibreSSL-as-provider-of-openssl.patch


+ 0 - 0
patches/openwrt/0020-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch → patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch


+ 0 - 0
patches/openwrt/0021-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch → patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch


+ 0 - 0
patches/openwrt/0022-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch → patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch


+ 0 - 0
patches/openwrt/0023-ar71xx-build-image-for-TL-WR710N-v2.1.patch → patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch


+ 0 - 0
patches/openwrt/0024-xtables-addons-build-fix-configure-compatiblity-with-POSIX-shells.patch → patches/openwrt/0023-xtables-addons-build-fix-configure-compatiblity-with-POSIX-shells.patch


+ 0 - 0
patches/openwrt/0025-tools-add-tar-host-build-required-for-sort-name-which-was-only-added-in-the-latest-version.patch → patches/openwrt/0024-tools-add-tar-host-build-required-for-sort-name-which-was-only-added-in-the-latest-version.patch


+ 0 - 0
patches/openwrt/0026-tools-compile-flock-before-everything-else.patch → patches/openwrt/0025-tools-compile-flock-before-everything-else.patch


+ 0 - 0
patches/openwrt/0027-rules.mk-make-the-locked-template-available-even-if-flock-has-not-been-built-yet-fall-back-to-unlocked-shell-command.patch → patches/openwrt/0026-rules.mk-make-the-locked-template-available-even-if-flock-has-not-been-built-yet-fall-back-to-unlocked-shell-command.patch


+ 0 - 0
patches/openwrt/0028-build-add-locking-for-downloads-fixes-race-conditions-with-multiple-variants.patch → patches/openwrt/0027-build-add-locking-for-downloads-fixes-race-conditions-with-multiple-variants.patch


+ 0 - 0
patches/openwrt/0029-download.mk-fix-packed-checkout-mirroring-support.patch → patches/openwrt/0028-download.mk-fix-packed-checkout-mirroring-support.patch


+ 0 - 0
patches/openwrt/0030-kernel-backport-spi-nor-driver-from-4.4.9.patch → patches/openwrt/0029-kernel-backport-spi-nor-driver-from-4.4.9.patch


+ 0 - 0
patches/openwrt/0031-kernel-mtd-spi-nor-wait-until-status-register-writes-are-ready.patch → patches/openwrt/0030-kernel-mtd-spi-nor-wait-until-status-register-writes-are-ready.patch


+ 0 - 0
patches/openwrt/0032-kernel-mtd-spi-nor-unlock-Winbond-flashs.patch → patches/openwrt/0031-kernel-mtd-spi-nor-unlock-Winbond-flashs.patch


+ 0 - 0
patches/openwrt/0033-tools-pkg-config-fix-build-with-GCC-6.patch → patches/openwrt/0032-tools-pkg-config-fix-build-with-GCC-6.patch


+ 0 - 0
patches/openwrt/0034-tools-mkimage-sync-include-linux-compiler-.h-with-u-boot-master.patch → patches/openwrt/0033-tools-mkimage-sync-include-linux-compiler-.h-with-u-boot-master.patch


+ 0 - 0
patches/openwrt/0035-toolchain-gcc-fix-build-with-GCC-6.patch → patches/openwrt/0034-toolchain-gcc-fix-build-with-GCC-6.patch


+ 0 - 0
patches/openwrt/0036-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch → patches/openwrt/0035-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch


+ 0 - 0
patches/openwrt/0037-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch → patches/openwrt/0036-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch


+ 0 - 0
patches/openwrt/0038-ar71xx-update-QCA956x-support.patch → patches/openwrt/0037-ar71xx-update-QCA956x-support.patch


+ 0 - 0
patches/openwrt/0039-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch → patches/openwrt/0038-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch


+ 0 - 0
patches/openwrt/0040-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch → patches/openwrt/0039-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch


+ 0 - 0
patches/openwrt/0041-ar71xx-fix-qca956x-ethernet-initialization.patch → patches/openwrt/0040-ar71xx-fix-qca956x-ethernet-initialization.patch


+ 0 - 0
patches/openwrt/0042-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch → patches/openwrt/0041-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch


+ 0 - 0
patches/openwrt/0043-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch → patches/openwrt/0042-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch


+ 0 - 0
patches/openwrt/0044-ar71xx-Rename-unifiac-to-unifiac-lite.patch → patches/openwrt/0043-ar71xx-Rename-unifiac-to-unifiac-lite.patch


+ 0 - 0
patches/openwrt/0045-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch → patches/openwrt/0044-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch


+ 0 - 0
patches/openwrt/0046-ar71xx-Generate-sysupgrade-images-for-OpenMesh-devices.patch → patches/openwrt/0045-ar71xx-Generate-sysupgrade-images-for-OpenMesh-devices.patch


+ 0 - 0
patches/openwrt/0047-ar71xx-add-kernel-support-for-the-OpenMesh-MR1750-board.patch → patches/openwrt/0046-ar71xx-add-kernel-support-for-the-OpenMesh-MR1750-board.patch


+ 0 - 0
patches/openwrt/0048-ar71xx-add-user-space-support-for-the-OpenMesh-MR1750-board.patch → patches/openwrt/0047-ar71xx-add-user-space-support-for-the-OpenMesh-MR1750-board.patch


+ 0 - 0
patches/openwrt/0049-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-MR1750.patch → patches/openwrt/0048-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-MR1750.patch


+ 0 - 0
patches/openwrt/0050-ar71xx-enable-sysupgrade-for-the-OpenMesh-MR1750.patch → patches/openwrt/0049-ar71xx-enable-sysupgrade-for-the-OpenMesh-MR1750.patch


+ 0 - 0
patches/openwrt/0051-package-om-watchdog-add-OpenMesh-MR1750-support.patch → patches/openwrt/0050-package-om-watchdog-add-OpenMesh-MR1750-support.patch


+ 0 - 0
patches/openwrt/0052-package-uboot-envtools-add-OpenMesh-MR1750-support.patch → patches/openwrt/0051-package-uboot-envtools-add-OpenMesh-MR1750-support.patch


+ 0 - 0
patches/openwrt/0053-ar71xx-create-profile-and-build-image-for-the-OpenMesh-MR1750-board.patch → patches/openwrt/0052-ar71xx-create-profile-and-build-image-for-the-OpenMesh-MR1750-board.patch


+ 0 - 0
patches/openwrt/0054-ar71xx-Extend-the-list-of-bits-in-QCA955X_GMAC_REG_ETH_CFG.patch → patches/openwrt/0053-ar71xx-Extend-the-list-of-bits-in-QCA955X_GMAC_REG_ETH_CFG.patch


+ 0 - 0
patches/openwrt/0055-ar71xx-Use-_eth_cfg-helper-for-Open-Mesh-MR900-boards.patch → patches/openwrt/0054-ar71xx-Use-_eth_cfg-helper-for-Open-Mesh-MR900-boards.patch


+ 0 - 0
patches/openwrt/0056-ar71xx-Allow-to-use-ath79_gpio_output_select-on-QCA955x.patch → patches/openwrt/0055-ar71xx-Allow-to-use-ath79_gpio_output_select-on-QCA955x.patch


+ 0 - 0
patches/openwrt/0057-ar71xx-Add-support-for-ath79_gpio_function_-on-QCA955X.patch → patches/openwrt/0056-ar71xx-Add-support-for-ath79_gpio_function_-on-QCA955X.patch


+ 0 - 0
patches/openwrt/0058-ar71xx-Add-QCA955X-GPIO-mux-and-function-definitions.patch → patches/openwrt/0057-ar71xx-Add-QCA955X-GPIO-mux-and-function-definitions.patch


+ 0 - 0
patches/openwrt/0059-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR900.patch → patches/openwrt/0058-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR900.patch


+ 0 - 0
patches/openwrt/0060-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR1750.patch → patches/openwrt/0059-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR1750.patch


+ 0 - 0
patches/openwrt/0061-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR900.patch → patches/openwrt/0060-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR900.patch


+ 0 - 0
patches/openwrt/0062-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR1750.patch → patches/openwrt/0061-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR1750.patch


+ 0 - 0
patches/openwrt/0063-scripts-om-fwupgradecfg-gen.sh-Fix-u-boot-image-md5sum-check.patch → patches/openwrt/0062-scripts-om-fwupgradecfg-gen.sh-Fix-u-boot-image-md5sum-check.patch


+ 0 - 0
patches/openwrt/0064-scripts-om-fwupgradecfg-gen.sh-Generate-sha256sum-for-uboot-verification.patch → patches/openwrt/0063-scripts-om-fwupgradecfg-gen.sh-Generate-sha256sum-for-uboot-verification.patch


+ 0 - 0
patches/openwrt/0065-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-AC-board.patch → patches/openwrt/0064-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-AC-board.patch


+ 0 - 0
patches/openwrt/0066-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-AC.patch → patches/openwrt/0065-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-AC.patch


+ 0 - 0
patches/openwrt/0067-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-OM5P-AC.patch → patches/openwrt/0066-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-OM5P-AC.patch


+ 0 - 0
patches/openwrt/0068-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-AC.patch → patches/openwrt/0067-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-AC.patch


+ 0 - 0
patches/openwrt/0069-om-watchdog-add-OpenMesh-OM5P-AC-support.patch → patches/openwrt/0068-om-watchdog-add-OpenMesh-OM5P-AC-support.patch


+ 0 - 0
patches/openwrt/0070-uboot-envtools-add-OpenMesh-OM5P-AC-support.patch → patches/openwrt/0069-uboot-envtools-add-OpenMesh-OM5P-AC-support.patch


+ 0 - 0
patches/openwrt/0071-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-AC-board.patch → patches/openwrt/0070-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-AC-board.patch


+ 0 - 0
patches/openwrt/0072-ar71xx-create-profile-and-build-image-for-the-OpenMesh-OM5P-AC-board.patch → patches/openwrt/0071-ar71xx-create-profile-and-build-image-for-the-OpenMesh-OM5P-AC-board.patch


+ 0 - 0
patches/openwrt/0073-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-ACv2-board.patch → patches/openwrt/0072-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-ACv2-board.patch


+ 0 - 0
patches/openwrt/0074-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-ACv2.patch → patches/openwrt/0073-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-ACv2.patch


+ 0 - 0
patches/openwrt/0075-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-ACv2.patch → patches/openwrt/0074-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-ACv2.patch


+ 0 - 0
patches/openwrt/0076-om-watchdog-add-OpenMesh-OM5P-ACv2-support.patch → patches/openwrt/0075-om-watchdog-add-OpenMesh-OM5P-ACv2-support.patch


+ 0 - 0
patches/openwrt/0077-uboot-envtools-add-OpenMesh-OM5P-ACv2-support.patch → patches/openwrt/0076-uboot-envtools-add-OpenMesh-OM5P-ACv2-support.patch


+ 0 - 0
patches/openwrt/0078-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-ACv2-board.patch → patches/openwrt/0077-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-ACv2-board.patch


+ 0 - 0
patches/openwrt/0079-ar71xx-add-OM5P-ACv2-to-the-OM5P-AC-profile.patch → patches/openwrt/0078-ar71xx-add-OM5P-ACv2-to-the-OM5P-AC-profile.patch


+ 0 - 0
patches/openwrt/0080-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch → patches/openwrt/0079-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch


+ 121 - 0
patches/openwrt/0080-mac80211-ath9k-enable-platform-WLAN-LED-name.patch

@@ -0,0 +1,121 @@
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Sun, 29 May 2016 12:56:43 +0200
+Subject: mac80211: ath9k: enable platform WLAN LED name
+
+Enable platform-supplied WLAN LED name for ath9k device.
+
+Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
+Acked-by: Hartmut Knaack <knaack.h@gmx.de>
+
+Backport of r48879
+
+diff --git a/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch b/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch
+new file mode 100644
+index 0000000..8d2d899
+--- /dev/null
++++ b/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch
+@@ -0,0 +1,48 @@
++From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++Date: Sun, 31 Jan 2016 20:45:57 +0100
++Subject: [PATCH v4 1/8] mac80211: ath9k: enable platform WLAN LED name
++
++Enable platform-supplied WLAN LED name for ath9k device. It replaces generic
++'ath9k-phy*' label with string set during platform initialization.
++
++Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++---
++ drivers/net/wireless/ath/ath9k/gpio.c |   10 +++++++---
++ include/linux/ath9k_platform.h        |    1 +
++ 2 files changed, 8 insertions(+), 3 deletions(-)
++
++--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++++ b/drivers/net/wireless/ath/ath9k/gpio.c
++@@ -132,15 +132,19 @@ void ath_init_leds(struct ath_softc *sc)
++ 	if (AR_SREV_9100(sc->sc_ah))
++ 		return;
++ 
++-	snprintf(led_name, sizeof(led_name), "ath9k-%s",
++-		 wiphy_name(sc->hw->wiphy));
+++	if (pdata && pdata->led_name)
+++		strncpy(led_name, pdata->led_name, sizeof(led_name));
+++	else
+++		snprintf(led_name, sizeof(led_name), "ath9k-%s",
+++		 	 wiphy_name(sc->hw->wiphy));
++ 
++ 	if (ath9k_led_blink)
++ 		trigger = sc->led_default_trigger;
++ 	else
++ 		trigger = ieee80211_get_radio_led_name(sc->hw);
++ 
++-	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, !sc->sc_ah->config.led_active_high);
+++	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger,
+++			    !sc->sc_ah->config.led_active_high);
++ 
++ 	if (!pdata)
++ 		return;
++--- a/include/linux/ath9k_platform.h
+++++ b/include/linux/ath9k_platform.h
++@@ -45,6 +45,7 @@ struct ath9k_platform_data {
++ 
++ 	int num_leds;
++ 	const struct gpio_led *leds;
+++	const char *led_name;
++ };
++ 
++ #endif /* _LINUX_ATH9K_PLATFORM_H */
+diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.c b/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.c
+index d382453..bf80d4d 100644
+--- a/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.c
++++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.c
+@@ -39,6 +39,18 @@ __init void ap9x_pci_setup_wmac_led_pin(unsigned wmac, int pin)
+ 	}
+ }
+ 
++__init void ap9x_pci_setup_wmac_led_name(unsigned wmac, const char *led_name)
++{
++	switch (wmac) {
++	case 0:
++		ap9x_wmac0_data.led_name = led_name;
++		break;
++	case 1:
++		ap9x_wmac1_data.led_name = led_name;
++		break;
++	}
++}
++
+ __init struct ath9k_platform_data *ap9x_pci_get_wmac_data(unsigned wmac)
+ {
+ 	switch (wmac) {
+diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.h b/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.h
+index ad288cb..dcfe541 100644
+--- a/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.h
++++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.h
+@@ -19,6 +19,7 @@ void ap9x_pci_setup_wmac_led_pin(unsigned wmac, int pin);
+ void ap9x_pci_setup_wmac_gpio(unsigned wmac, u32 mask, u32 val);
+ void ap9x_pci_setup_wmac_leds(unsigned wmac, struct gpio_led *leds,
+ 			      int num_leds);
++void ap9x_pci_setup_wmac_led_name(unsigned wmac, const char *led_name);
+ struct ath9k_platform_data *ap9x_pci_get_wmac_data(unsigned wmac);
+ 
+ void ap91_pci_init(u8 *cal_data, u8 *mac_addr);
+@@ -33,6 +34,8 @@ static inline void ap9x_pci_setup_wmac_gpio(unsigned wmac,
+ static inline void ap9x_pci_setup_wmac_leds(unsigned wmac,
+ 					    struct gpio_led *leds,
+ 					    int num_leds) {}
++static inline void ap9x_pci_setup_wmac_led_name(unsigned wmac,
++						const char *led_name) {}
+ static inline struct ath9k_platform_data *ap9x_pci_get_wmac_data(unsigned wmac)
+ {
+ 	return NULL;
+diff --git a/target/linux/generic/files/include/linux/ath9k_platform.h b/target/linux/generic/files/include/linux/ath9k_platform.h
+index 30ce216..823e5ac 100644
+--- a/target/linux/generic/files/include/linux/ath9k_platform.h
++++ b/target/linux/generic/files/include/linux/ath9k_platform.h
+@@ -45,6 +45,7 @@ struct ath9k_platform_data {
+ 
+ 	int num_leds;
+ 	const struct gpio_led *leds;
++	const char *led_name;
+ };
+ 
+ #endif /* _LINUX_ATH9K_PLATFORM_H */

+ 47 - 0
patches/openwrt/0081-mac80211-ath9k-set-default-state-for-platform-LEDs.patch

@@ -0,0 +1,47 @@
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Sun, 29 May 2016 13:37:28 +0200
+Subject: mac80211: ath9k: set default state for platform LEDs
+
+Support default state for platform LEDs connected to ath9k device.
+Now LEDs are correctly set on or off at ath9k module initialization.
+
+Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
+Acked-by: Hartmut Knaack <knaack.h@gmx.de>
+
+Backport of r48880
+
+diff --git a/package/kernel/mac80211/patches/547-ath9k_led_defstate_fix.patch b/package/kernel/mac80211/patches/547-ath9k_led_defstate_fix.patch
+new file mode 100644
+index 0000000..db0b619
+--- /dev/null
++++ b/package/kernel/mac80211/patches/547-ath9k_led_defstate_fix.patch
+@@ -0,0 +1,29 @@
++From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++Date: Sun, 31 Jan 2016 20:48:49 +0100
++Subject: [PATCH v4 2/8] mac80211: ath9k: set default state for platform LEDs
++
++Support default state for platform LEDs connected to ath9k device.
++Now LEDs are correctly set on or off at ath9k module initialization.
++Very useful if power LED is connected to wireless chip.
++
++Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++---
++ gpio.c |    7 +++++--
++ 1 file changed, 5 insertions(+), 2 deletions(-)
++
++--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++++ b/drivers/net/wireless/ath/ath9k/gpio.c
++@@ -54,8 +54,11 @@ static int ath_add_led(struct ath_softc
++ 	ath9k_hw_cfg_output(sc->sc_ah, gpio->gpio,
++ 			    AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
++ 
++-	/* LED off */
++-	ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
+++	/* Set default LED state */
+++	if (gpio->default_state == LEDS_GPIO_DEFSTATE_ON)
+++		ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, !gpio->active_low);
+++	else
+++		ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
++ 
++ 	return 0;
++ }

+ 261 - 0
patches/openwrt/0082-mac80211-ath9k-enable-access-to-GPIO.patch

@@ -0,0 +1,261 @@
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Sun, 29 May 2016 13:37:59 +0200
+Subject: mac80211: ath9k: enable access to GPIO
+
+Enable access to GPIO chip and its pins for Atheros AR92xx
+wireless devices. For now AR9285 and AR9287 are supported.
+
+Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
+Acked-by: Hartmut Knaack <knaack.h@gmx.de>
+
+Backport of r48881
+
+diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch
+new file mode 100644
+index 0000000..beee169
+--- /dev/null
++++ b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch
+@@ -0,0 +1,243 @@
++From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++Date: Sun, 31 Jan 2016 21:01:31 +0100
++Subject: [PATCH v4 4/8] mac80211: ath9k: enable access to GPIO
++
++Enable access to GPIO chip and its pins for Atheros AR92xx
++wireless devices. For now AR9285 and AR9287 are supported.
++
++Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++---
++ ath9k.h |   23 ++++++++++++
++ gpio.c  |  121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ init.c  |    2 +
++ 3 files changed, 146 insertions(+)
++
++--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
++@@ -24,6 +24,7 @@
++ #include <linux/completion.h>
++ #include <linux/time.h>
++ #include <linux/hw_random.h>
+++#include <linux/gpio/driver.h>
++ 
++ #include "common.h"
++ #include "debug.h"
++@@ -817,6 +818,13 @@ void ath_fill_led_pin(struct ath_softc *
++ int ath_create_gpio_led(struct ath_softc *sc, int gpio, const char *name,
++                         const char *trigger, bool active_low);
++ 
+++/***************/
+++/*  GPIO Chip  */
+++/***************/
+++
+++void ath9k_register_gpio_chip(struct ath_softc *sc);
+++void ath9k_unregister_gpio_chip(struct ath_softc *sc);
+++
++ #else
++ static inline void ath_init_leds(struct ath_softc *sc)
++ {
++@@ -828,6 +836,14 @@ static inline void ath_deinit_leds(struc
++ static inline void ath_fill_led_pin(struct ath_softc *sc)
++ {
++ }
+++
+++static inline void ath9k_register_gpio_chip(struct ath_softc *sc)
+++{
+++}
+++
+++static inline void ath9k_unregister_gpio_chip(struct ath_softc *sc)
+++{
+++}
++ #endif
++ 
++ /************************/
++@@ -963,6 +979,12 @@ struct ath_led {
++ 	struct led_classdev cdev;
++ };
++ 
+++struct ath9k_gpio_chip {
+++	struct ath_softc *sc;
+++	char label[32];
+++	struct gpio_chip gchip;
+++};
+++
++ struct ath_softc {
++ 	struct ieee80211_hw *hw;
++ 	struct device *dev;
++@@ -1017,6 +1039,7 @@ struct ath_softc {
++ #ifdef CPTCFG_MAC80211_LEDS
++ 	const char *led_default_trigger;
++ 	struct list_head leds;
+++	struct ath9k_gpio_chip *gpiochip;
++ #endif
++ 
++ #ifdef CPTCFG_ATH9K_DEBUGFS
++--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++++ b/drivers/net/wireless/ath/ath9k/gpio.c
++@@ -22,6 +22,9 @@
++ /********************************/
++ 
++ #ifdef CPTCFG_MAC80211_LEDS
+++
+++#include <asm-generic/gpio.h>
+++
++ static void ath_led_brightness(struct led_classdev *led_cdev,
++ 			       enum led_brightness brightness)
++ {
++@@ -60,6 +63,10 @@ static int ath_add_led(struct ath_softc
++ 	else
++ 		ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
++ 
+++	/* If there is GPIO chip configured, reserve LED pin */
+++	if (sc->gpiochip)
+++		gpio_request(sc->gpiochip->gchip.base + gpio->gpio, gpio->name);
+++
++ 	return 0;
++ }
++ 
++@@ -116,6 +123,9 @@ void ath_deinit_leds(struct ath_softc *s
++ 
++ 	while (!list_empty(&sc->leds)) {
++ 		led = list_first_entry(&sc->leds, struct ath_led, list);
+++		/* If there is GPIO chip configured, free LED pin */
+++		if (sc->gpiochip)
+++			gpio_free(sc->gpiochip->gchip.base + led->gpio->gpio);
++ 		list_del(&led->list);
++ 		ath_led_brightness(&led->cdev, LED_OFF);
++ 		led_classdev_unregister(&led->cdev);
++@@ -186,6 +196,117 @@ void ath_fill_led_pin(struct ath_softc *
++ 	/* LED off, active low */
++ 	ath9k_hw_set_gpio(ah, ah->led_pin, (ah->config.led_active_high) ? 0 : 1);
++ }
+++
+++/***************/
+++/*  GPIO Chip  */
+++/***************/
+++
+++/* gpio_chip handler : set GPIO to input */
+++static int ath9k_gpio_pin_cfg_input(struct gpio_chip *chip, unsigned offset)
+++{
+++	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+++						  gchip);
+++
+++	ath9k_hw_cfg_gpio_input(gc->sc->sc_ah, offset);
+++
+++	return 0;
+++}
+++
+++/* gpio_chip handler : set GPIO to output */
+++static int ath9k_gpio_pin_cfg_output(struct gpio_chip *chip, unsigned offset,
+++				     int value)
+++{
+++	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+++						  gchip);
+++
+++	ath9k_hw_cfg_output(gc->sc->sc_ah, offset,
+++			    AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
+++	ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value);
+++
+++	return 0;
+++}
+++
+++/* gpio_chip handler : query GPIO direction (0=out, 1=in) */
+++static int ath9k_gpio_pin_get_dir(struct gpio_chip *chip, unsigned offset)
+++{
+++	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+++						  gchip);
+++	struct ath_hw *ah = gc->sc->sc_ah;
+++
+++	return !((REG_READ(ah, AR_GPIO_OE_OUT) >> (offset * 2)) & 3);
+++}
+++
+++/* gpio_chip handler : get GPIO pin value */
+++static int ath9k_gpio_pin_get(struct gpio_chip *chip, unsigned offset)
+++{
+++	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+++						  gchip);
+++
+++	return ath9k_hw_gpio_get(gc->sc->sc_ah, offset);
+++}
+++
+++/* gpio_chip handler : set GPIO pin to value */
+++static void ath9k_gpio_pin_set(struct gpio_chip *chip, unsigned offset,
+++			       int value)
+++{
+++	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+++						  gchip);
+++
+++	ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value);
+++}
+++
+++/* register GPIO chip */
+++void ath9k_register_gpio_chip(struct ath_softc *sc)
+++{
+++	struct ath9k_gpio_chip *gc;
+++	u16 ng;
+++
+++	/* for now only AR9285 and AR9287 are recognized */
+++	if (AR_SREV_9287(sc->sc_ah))
+++		ng = AR9287_NUM_GPIO;
+++	else if (AR_SREV_9285(sc->sc_ah))
+++		ng = AR9285_NUM_GPIO;
+++	else
+++		return;
+++
+++	gc = kzalloc(sizeof(struct ath9k_gpio_chip), GFP_KERNEL);
+++	if (!gc)
+++		return;
+++
+++	snprintf(gc->label, sizeof(gc->label), "ath9k-%s",
+++		 wiphy_name(sc->hw->wiphy));
+++	gc->gchip.label = gc->label;
+++	gc->gchip.base = -1;	/* determine base automatically */
+++	gc->gchip.ngpio = ng;
+++	gc->gchip.direction_input = ath9k_gpio_pin_cfg_input;
+++	gc->gchip.direction_output = ath9k_gpio_pin_cfg_output;
+++	gc->gchip.get_direction = ath9k_gpio_pin_get_dir;
+++	gc->gchip.get = ath9k_gpio_pin_get;
+++	gc->gchip.set = ath9k_gpio_pin_set;
+++	gc->gchip.owner = THIS_MODULE;
+++
+++	if (gpiochip_add(&gc->gchip)) {
+++		kfree(gc);
+++		return;
+++	}
+++
+++	sc->gpiochip = gc;
+++	gc->sc = sc;
+++}
+++
+++/* remove GPIO chip */
+++void ath9k_unregister_gpio_chip(struct ath_softc *sc)
+++{
+++	struct ath9k_gpio_chip *gc = sc->gpiochip;
+++
+++	if (!gc)
+++		return;
+++
+++	gpiochip_remove(&gc->gchip);
+++	kfree(gc);
+++	sc->gpiochip = NULL;
+++}
+++
++ #endif
++ 
++ /*******************/
++--- a/drivers/net/wireless/ath/ath9k/init.c
+++++ b/drivers/net/wireless/ath/ath9k/init.c
++@@ -979,6 +979,7 @@ int ath9k_init_device(u16 devid, struct
++ 			goto debug_cleanup;
++ 	}
++ 
+++	ath9k_register_gpio_chip(sc);
++ 	ath_init_leds(sc);
++ 	ath_start_rfkill_poll(sc);
++ 
++@@ -1026,6 +1027,7 @@ void ath9k_deinit_device(struct ath_soft
++ 
++ 	wiphy_rfkill_stop_polling(sc->hw->wiphy);
++ 	ath_deinit_leds(sc);
+++	ath9k_unregister_gpio_chip(sc);
++ 
++ 	ath9k_ps_restore(sc);
++ 

+ 30 - 0
patches/openwrt/0083-mac80211-refresh-patch.patch

@@ -0,0 +1,30 @@
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Sun, 29 May 2016 13:38:19 +0200
+Subject: mac80211: refresh patch
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+
+Backport of r48882
+
+diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch
+index beee169..55bb991 100644
+--- a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch
++++ b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch
+@@ -225,7 +225,7 @@ Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
+  /*******************/
+ --- a/drivers/net/wireless/ath/ath9k/init.c
+ +++ b/drivers/net/wireless/ath/ath9k/init.c
+-@@ -979,6 +979,7 @@ int ath9k_init_device(u16 devid, struct
++@@ -975,6 +975,7 @@ int ath9k_init_device(u16 devid, struct
+  			goto debug_cleanup;
+  	}
+  
+@@ -233,7 +233,7 @@ Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
+  	ath_init_leds(sc);
+  	ath_start_rfkill_poll(sc);
+  
+-@@ -1026,6 +1027,7 @@ void ath9k_deinit_device(struct ath_soft
++@@ -1022,6 +1023,7 @@ void ath9k_deinit_device(struct ath_soft
+  
+  	wiphy_rfkill_stop_polling(sc->hw->wiphy);
+  	ath_deinit_leds(sc);

+ 259 - 0
patches/openwrt/0084-mac80211-ath9k-enable-GPIO-buttons.patch

@@ -0,0 +1,259 @@
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Sun, 29 May 2016 13:38:45 +0200
+Subject: mac80211: ath9k: enable GPIO buttons
+
+Enable platform-defined GPIO button support for ath9k device.
+Key poller is activated for attached platform buttons.
+Requires ath9k GPIO chip access.
+
+Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
+
+Backport of r48921
+
+diff --git a/package/kernel/mac80211/patches/550-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/550-ath9k_enable_gpio_buttons.patch
+new file mode 100644
+index 0000000..e3a8cec
+--- /dev/null
++++ b/package/kernel/mac80211/patches/550-ath9k_enable_gpio_buttons.patch
+@@ -0,0 +1,169 @@
++From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++Subject: [PATCH v5 5/8] mac80211: ath9k: enable GPIO buttons
++
++Enable platform-defined GPIO button support for ath9k device.
++Key poller is activated for attached platform buttons.
++Requires ath9k GPIO chip access.
++
++Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++---
++ drivers/net/wireless/ath/ath9k/ath9k.h |   16 ++++++
++ drivers/net/wireless/ath/ath9k/gpio.c  |   77 +++++++++++++++++++++++++++++++++
++ drivers/net/wireless/ath/ath9k/init.c  |    2 
++ include/linux/ath9k_platform.h         |    4 +
++ 4 files changed, 99 insertions(+)
++
++--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
++@@ -825,6 +825,13 @@ int ath_create_gpio_led(struct ath_softc
++ void ath9k_register_gpio_chip(struct ath_softc *sc);
++ void ath9k_unregister_gpio_chip(struct ath_softc *sc);
++ 
+++/******************/
+++/*  GPIO Buttons  */
+++/******************/
+++
+++void ath9k_init_buttons(struct ath_softc *sc);
+++void ath9k_deinit_buttons(struct ath_softc *sc);
+++
++ #else
++ static inline void ath_init_leds(struct ath_softc *sc)
++ {
++@@ -844,6 +851,14 @@ static inline void ath9k_register_gpio_c
++ static inline void ath9k_unregister_gpio_chip(struct ath_softc *sc)
++ {
++ }
+++
+++static inline void ath9k_init_buttons(struct ath_softc *sc)
+++{
+++}
+++
+++static inline void ath9k_deinit_buttons(struct ath_softc *sc)
+++{
+++}
++ #endif
++ 
++ /************************/
++@@ -1040,6 +1055,7 @@ struct ath_softc {
++ 	const char *led_default_trigger;
++ 	struct list_head leds;
++ 	struct ath9k_gpio_chip *gpiochip;
+++	struct platform_device *btnpdev;	/* gpio-keys-polled */
++ #endif
++ 
++ #ifdef CPTCFG_ATH9K_DEBUGFS
++--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++++ b/drivers/net/wireless/ath/ath9k/gpio.c
++@@ -24,6 +24,8 @@
++ #ifdef CPTCFG_MAC80211_LEDS
++ 
++ #include <asm-generic/gpio.h>
+++#include <linux/platform_device.h>
+++#include <linux/gpio_keys.h>
++ 
++ static void ath_led_brightness(struct led_classdev *led_cdev,
++ 			       enum led_brightness brightness)
++@@ -159,7 +161,7 @@ void ath_init_leds(struct ath_softc *sc)
++ 	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger,
++ 			    !sc->sc_ah->config.led_active_high);
++ 
++-	if (!pdata)
+++	if (!pdata || !pdata->leds || !pdata->num_leds)
++ 		return;
++ 
++ 	for (i = 0; i < pdata->num_leds; i++)
++@@ -307,6 +309,63 @@ void ath9k_unregister_gpio_chip(struct a
++ 	sc->gpiochip = NULL;
++ }
++ 
+++/******************/
+++/*  GPIO Buttons  */
+++/******************/
+++
+++/* add GPIO buttons */
+++void ath9k_init_buttons(struct ath_softc *sc)
+++{
+++	struct ath9k_platform_data *pdata = sc->dev->platform_data;
+++	struct platform_device *pdev;
+++	struct gpio_keys_platform_data gkpdata;
+++	struct gpio_keys_button *bt;
+++	int i;
+++
+++	if (!sc->gpiochip)
+++		return;
+++
+++	if (!pdata || !pdata->btns || !pdata->num_btns)
+++		return;
+++
+++	bt = devm_kmemdup(sc->dev, pdata->btns,
+++			  pdata->num_btns * sizeof(struct gpio_keys_button),
+++			  GFP_KERNEL);
+++	if (!bt)
+++		return;
+++
+++	for (i = 0; i < pdata->num_btns; i++) {
+++		ath9k_hw_cfg_gpio_input(sc->sc_ah, pdata->btns[i].gpio);
+++		bt[i].gpio = sc->gpiochip->gchip.base + pdata->btns[i].gpio;
+++	}
+++
+++	memset(&gkpdata, 0, sizeof(struct gpio_keys_platform_data));
+++	gkpdata.buttons = bt;
+++	gkpdata.nbuttons = pdata->num_btns;
+++	gkpdata.poll_interval = pdata->btn_poll_interval;
+++
+++	pdev = platform_device_register_data(sc->dev, "gpio-keys-polled",
+++					     PLATFORM_DEVID_AUTO, &gkpdata,
+++					     sizeof(gkpdata));
+++	if (!IS_ERR_OR_NULL(pdev))
+++		sc->btnpdev = pdev;
+++	else {
+++		sc->btnpdev = NULL;
+++		devm_kfree(sc->dev, bt);
+++	}
+++}
+++
+++/* remove GPIO buttons */
+++void ath9k_deinit_buttons(struct ath_softc *sc)
+++{
+++	if (!sc->gpiochip || !sc->btnpdev)
+++		return;
+++
+++	platform_device_unregister(sc->btnpdev);
+++
+++	sc->btnpdev = NULL;
+++}
+++
++ #endif
++ 
++ /*******************/
++--- a/drivers/net/wireless/ath/ath9k/init.c
+++++ b/drivers/net/wireless/ath/ath9k/init.c
++@@ -977,6 +977,7 @@ int ath9k_init_device(u16 devid, struct
++ 
++ 	ath9k_register_gpio_chip(sc);
++ 	ath_init_leds(sc);
+++	ath9k_init_buttons(sc);
++ 	ath_start_rfkill_poll(sc);
++ 
++ 	return 0;
++@@ -1022,6 +1023,7 @@ void ath9k_deinit_device(struct ath_soft
++ 	ath9k_ps_wakeup(sc);
++ 
++ 	wiphy_rfkill_stop_polling(sc->hw->wiphy);
+++	ath9k_deinit_buttons(sc);
++ 	ath_deinit_leds(sc);
++ 	ath9k_unregister_gpio_chip(sc);
++ 
++--- a/include/linux/ath9k_platform.h
+++++ b/include/linux/ath9k_platform.h
++@@ -46,6 +46,10 @@ struct ath9k_platform_data {
++ 	int num_leds;
++ 	const struct gpio_led *leds;
++ 	const char *led_name;
+++
+++	unsigned num_btns;
+++	const struct gpio_keys_button *btns;
+++	unsigned btn_poll_interval;
++ };
++ 
++ #endif /* _LINUX_ATH9K_PLATFORM_H */
+diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.c b/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.c
+index bf80d4d..20bb06e 100644
+--- a/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.c
++++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.c
+@@ -93,6 +93,20 @@ __init void ap9x_pci_setup_wmac_leds(unsigned wmac, struct gpio_led *leds,
+ 	}
+ }
+ 
++__init void ap9x_pci_setup_wmac_btns(unsigned wmac,
++				     struct gpio_keys_button *btns,
++				     unsigned num_btns, unsigned poll_interval)
++{
++	struct ath9k_platform_data *ap9x_wmac_data;
++
++	if (!(ap9x_wmac_data = ap9x_pci_get_wmac_data(wmac)))
++		return;
++
++	ap9x_wmac_data->btns = btns;
++	ap9x_wmac_data->num_btns = num_btns;
++	ap9x_wmac_data->btn_poll_interval = poll_interval;
++}
++
+ static int ap91_pci_plat_dev_init(struct pci_dev *dev)
+ {
+ 	switch (PCI_SLOT(dev->devfn)) {
+diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.h b/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.h
+index dcfe541..d7c0185 100644
+--- a/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.h
++++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.h
+@@ -12,6 +12,7 @@
+ #define _ATH79_DEV_AP9X_PCI_H
+ 
+ struct gpio_led;
++struct gpio_keys_button;
+ struct ath9k_platform_data;
+ 
+ #if defined(CONFIG_ATH79_DEV_AP9X_PCI)
+@@ -20,6 +21,8 @@ void ap9x_pci_setup_wmac_gpio(unsigned wmac, u32 mask, u32 val);
+ void ap9x_pci_setup_wmac_leds(unsigned wmac, struct gpio_led *leds,
+ 			      int num_leds);
+ void ap9x_pci_setup_wmac_led_name(unsigned wmac, const char *led_name);
++void ap9x_pci_setup_wmac_btns(unsigned wmac, struct gpio_keys_button *btns,
++			      unsigned num_btns, unsigned poll_interval);
+ struct ath9k_platform_data *ap9x_pci_get_wmac_data(unsigned wmac);
+ 
+ void ap91_pci_init(u8 *cal_data, u8 *mac_addr);
+@@ -36,6 +39,10 @@ static inline void ap9x_pci_setup_wmac_leds(unsigned wmac,
+ 					    int num_leds) {}
+ static inline void ap9x_pci_setup_wmac_led_name(unsigned wmac,
+ 						const char *led_name) {}
++static inline void ap9x_pci_setup_wmac_btns(unsigned wmac,
++					    struct gpio_keys_button *btns,
++					    unsigned num_btns,
++					    unsigned poll_interval) {}
+ static inline struct ath9k_platform_data *ap9x_pci_get_wmac_data(unsigned wmac)
+ {
+ 	return NULL;
+diff --git a/target/linux/generic/files/include/linux/ath9k_platform.h b/target/linux/generic/files/include/linux/ath9k_platform.h
+index 823e5ac..e543a64 100644
+--- a/target/linux/generic/files/include/linux/ath9k_platform.h
++++ b/target/linux/generic/files/include/linux/ath9k_platform.h
+@@ -46,6 +46,10 @@ struct ath9k_platform_data {
+ 	int num_leds;
+ 	const struct gpio_led *leds;
+ 	const char *led_name;
++
++	unsigned num_btns;
++	const struct gpio_keys_button *btns;
++	unsigned btn_poll_interval;
+ };
+ 
+ #endif /* _LINUX_ATH9K_PLATFORM_H */

+ 827 - 0
patches/openwrt/0085-mac80211-rework-gpio-chip-button-support-to-build-on-platforms-without-CONFIG_GPIOLIB.patch

@@ -0,0 +1,827 @@
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Sun, 29 May 2016 13:39:10 +0200
+Subject: mac80211: rework gpio chip/button support to build on platforms without CONFIG_GPIOLIB
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+
+Backport of r48938
+
+diff --git a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch
+new file mode 100644
+index 0000000..f91d85c
+--- /dev/null
++++ b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch
+@@ -0,0 +1,235 @@
++From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++Date: Sun, 31 Jan 2016 21:01:31 +0100
++Subject: [PATCH v4 4/8] mac80211: ath9k: enable access to GPIO
++
++Enable access to GPIO chip and its pins for Atheros AR92xx
++wireless devices. For now AR9285 and AR9287 are supported.
++
++Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++Signed-off-by: Felix Fietkau <nbd@openwrt.org>
++---
++--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
++@@ -24,6 +24,7 @@
++ #include <linux/completion.h>
++ #include <linux/time.h>
++ #include <linux/hw_random.h>
+++#include <linux/gpio/driver.h>
++ 
++ #include "common.h"
++ #include "debug.h"
++@@ -963,6 +964,14 @@ struct ath_led {
++ 	struct led_classdev cdev;
++ };
++ 
+++#ifdef CONFIG_GPIOLIB
+++struct ath9k_gpio_chip {
+++	struct ath_softc *sc;
+++	char label[32];
+++	struct gpio_chip gchip;
+++};
+++#endif
+++
++ struct ath_softc {
++ 	struct ieee80211_hw *hw;
++ 	struct device *dev;
++@@ -1017,6 +1026,9 @@ struct ath_softc {
++ #ifdef CPTCFG_MAC80211_LEDS
++ 	const char *led_default_trigger;
++ 	struct list_head leds;
+++#ifdef CONFIG_GPIOLIB
+++	struct ath9k_gpio_chip *gpiochip;
+++#endif
++ #endif
++ 
++ #ifdef CPTCFG_ATH9K_DEBUGFS
++--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++++ b/drivers/net/wireless/ath/ath9k/gpio.c
++@@ -16,12 +16,138 @@
++ 
++ #include "ath9k.h"
++ #include <linux/ath9k_platform.h>
+++#include <linux/gpio.h>
+++
+++#ifdef CPTCFG_MAC80211_LEDS
+++
+++#ifdef CONFIG_GPIOLIB
+++
+++/***************/
+++/*  GPIO Chip  */
+++/***************/
+++
+++/* gpio_chip handler : set GPIO to input */
+++static int ath9k_gpio_pin_cfg_input(struct gpio_chip *chip, unsigned offset)
+++{
+++	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+++						  gchip);
+++
+++	ath9k_hw_cfg_gpio_input(gc->sc->sc_ah, offset);
+++
+++	return 0;
+++}
+++
+++/* gpio_chip handler : set GPIO to output */
+++static int ath9k_gpio_pin_cfg_output(struct gpio_chip *chip, unsigned offset,
+++				     int value)
+++{
+++	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+++						  gchip);
+++
+++	ath9k_hw_cfg_output(gc->sc->sc_ah, offset,
+++			    AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
+++	ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value);
+++
+++	return 0;
+++}
+++
+++/* gpio_chip handler : query GPIO direction (0=out, 1=in) */
+++static int ath9k_gpio_pin_get_dir(struct gpio_chip *chip, unsigned offset)
+++{
+++	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+++						  gchip);
+++	struct ath_hw *ah = gc->sc->sc_ah;
+++
+++	return !((REG_READ(ah, AR_GPIO_OE_OUT) >> (offset * 2)) & 3);
+++}
+++
+++/* gpio_chip handler : get GPIO pin value */
+++static int ath9k_gpio_pin_get(struct gpio_chip *chip, unsigned offset)
+++{
+++	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+++						  gchip);
+++
+++	return ath9k_hw_gpio_get(gc->sc->sc_ah, offset);
+++}
+++
+++/* gpio_chip handler : set GPIO pin to value */
+++static void ath9k_gpio_pin_set(struct gpio_chip *chip, unsigned offset,
+++			       int value)
+++{
+++	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+++						  gchip);
+++
+++	ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value);
+++}
+++
+++/* register GPIO chip */
+++static void ath9k_register_gpio_chip(struct ath_softc *sc)
+++{
+++	struct ath9k_gpio_chip *gc;
+++	u16 ng;
+++
+++	/* for now only AR9285 and AR9287 are recognized */
+++	if (AR_SREV_9287(sc->sc_ah))
+++		ng = AR9287_NUM_GPIO;
+++	else if (AR_SREV_9285(sc->sc_ah))
+++		ng = AR9285_NUM_GPIO;
+++	else
+++		return;
+++
+++	gc = kzalloc(sizeof(struct ath9k_gpio_chip), GFP_KERNEL);
+++	if (!gc)
+++		return;
+++
+++	snprintf(gc->label, sizeof(gc->label), "ath9k-%s",
+++		 wiphy_name(sc->hw->wiphy));
+++	gc->gchip.label = gc->label;
+++	gc->gchip.base = -1;	/* determine base automatically */
+++	gc->gchip.ngpio = ng;
+++	gc->gchip.direction_input = ath9k_gpio_pin_cfg_input;
+++	gc->gchip.direction_output = ath9k_gpio_pin_cfg_output;
+++	gc->gchip.get_direction = ath9k_gpio_pin_get_dir;
+++	gc->gchip.get = ath9k_gpio_pin_get;
+++	gc->gchip.set = ath9k_gpio_pin_set;
+++	gc->gchip.owner = THIS_MODULE;
+++
+++	if (gpiochip_add(&gc->gchip)) {
+++		kfree(gc);
+++		return;
+++	}
+++
+++	sc->gpiochip = gc;
+++	gc->sc = sc;
+++}
+++
+++/* remove GPIO chip */
+++static void ath9k_unregister_gpio_chip(struct ath_softc *sc)
+++{
+++	struct ath9k_gpio_chip *gc = sc->gpiochip;
+++
+++	if (!gc)
+++		return;
+++
+++	gpiochip_remove(&gc->gchip);
+++	kfree(gc);
+++	sc->gpiochip = NULL;
+++}
+++
+++#else /* CONFIG_GPIOLIB */
+++
+++static inline void ath9k_register_gpio_chip(struct ath_softc *sc)
+++{
+++}
+++
+++static inline void ath9k_unregister_gpio_chip(struct ath_softc *sc)
+++{
+++}
+++
+++#endif /* CONFIG_GPIOLIB */
++ 
++ /********************************/
++ /*	 LED functions		*/
++ /********************************/
++ 
++-#ifdef CPTCFG_MAC80211_LEDS
++ static void ath_led_brightness(struct led_classdev *led_cdev,
++ 			       enum led_brightness brightness)
++ {
++@@ -60,6 +186,12 @@ static int ath_add_led(struct ath_softc
++ 	else
++ 		ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
++ 
+++#ifdef CONFIG_GPIOLIB
+++	/* If there is GPIO chip configured, reserve LED pin */
+++	if (sc->gpiochip)
+++		gpio_request(sc->gpiochip->gchip.base + gpio->gpio, gpio->name);
+++#endif
+++
++ 	return 0;
++ }
++ 
++@@ -116,11 +248,17 @@ void ath_deinit_leds(struct ath_softc *s
++ 
++ 	while (!list_empty(&sc->leds)) {
++ 		led = list_first_entry(&sc->leds, struct ath_led, list);
+++#ifdef CONFIG_GPIOLIB
+++		/* If there is GPIO chip configured, free LED pin */
+++		if (sc->gpiochip)
+++			gpio_free(sc->gpiochip->gchip.base + led->gpio->gpio);
+++#endif
++ 		list_del(&led->list);
++ 		ath_led_brightness(&led->cdev, LED_OFF);
++ 		led_classdev_unregister(&led->cdev);
++ 		kfree(led);
++ 	}
+++	ath9k_unregister_gpio_chip(sc);
++ }
++ 
++ void ath_init_leds(struct ath_softc *sc)
++@@ -135,6 +273,8 @@ void ath_init_leds(struct ath_softc *sc)
++ 	if (AR_SREV_9100(sc->sc_ah))
++ 		return;
++ 
+++	ath9k_register_gpio_chip(sc);
+++
++ 	if (pdata && pdata->led_name)
++ 		strncpy(led_name, pdata->led_name, sizeof(led_name));
++ 	else
++@@ -186,6 +326,7 @@ void ath_fill_led_pin(struct ath_softc *
++ 	/* LED off, active low */
++ 	ath9k_hw_set_gpio(ah, ah->led_pin, (ah->config.led_active_high) ? 0 : 1);
++ }
+++
++ #endif
++ 
++ /*******************/
+diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch
+new file mode 100644
+index 0000000..0527406
+--- /dev/null
++++ b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch
+@@ -0,0 +1,148 @@
++From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++Subject: [PATCH v5 5/8] mac80211: ath9k: enable GPIO buttons
++
++Enable platform-defined GPIO button support for ath9k device.
++Key poller is activated for attached platform buttons.
++Requires ath9k GPIO chip access.
++
++Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++Signed-off-by: Felix Fietkau <nbd@openwrt.org>
++---
++--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
++@@ -1028,6 +1028,7 @@ struct ath_softc {
++ 	struct list_head leds;
++ #ifdef CONFIG_GPIOLIB
++ 	struct ath9k_gpio_chip *gpiochip;
+++	struct platform_device *btnpdev;	/* gpio-keys-polled */
++ #endif
++ #endif
++ 
++--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++++ b/drivers/net/wireless/ath/ath9k/gpio.c
++@@ -17,6 +17,8 @@
++ #include "ath9k.h"
++ #include <linux/ath9k_platform.h>
++ #include <linux/gpio.h>
+++#include <linux/platform_device.h>
+++#include <linux/gpio_keys.h>
++ 
++ #ifdef CPTCFG_MAC80211_LEDS
++ 
++@@ -132,6 +134,63 @@ static void ath9k_unregister_gpio_chip(s
++ 	sc->gpiochip = NULL;
++ }
++ 
+++/******************/
+++/*  GPIO Buttons  */
+++/******************/
+++
+++/* add GPIO buttons */
+++static void ath9k_init_buttons(struct ath_softc *sc)
+++{
+++	struct ath9k_platform_data *pdata = sc->dev->platform_data;
+++	struct platform_device *pdev;
+++	struct gpio_keys_platform_data gkpdata;
+++	struct gpio_keys_button *bt;
+++	int i;
+++
+++	if (!sc->gpiochip)
+++		return;
+++
+++	if (!pdata || !pdata->btns || !pdata->num_btns)
+++		return;
+++
+++	bt = devm_kmemdup(sc->dev, pdata->btns,
+++			  pdata->num_btns * sizeof(struct gpio_keys_button),
+++			  GFP_KERNEL);
+++	if (!bt)
+++		return;
+++
+++	for (i = 0; i < pdata->num_btns; i++) {
+++		ath9k_hw_cfg_gpio_input(sc->sc_ah, pdata->btns[i].gpio);
+++		bt[i].gpio = sc->gpiochip->gchip.base + pdata->btns[i].gpio;
+++	}
+++
+++	memset(&gkpdata, 0, sizeof(struct gpio_keys_platform_data));
+++	gkpdata.buttons = bt;
+++	gkpdata.nbuttons = pdata->num_btns;
+++	gkpdata.poll_interval = pdata->btn_poll_interval;
+++
+++	pdev = platform_device_register_data(sc->dev, "gpio-keys-polled",
+++					     PLATFORM_DEVID_AUTO, &gkpdata,
+++					     sizeof(gkpdata));
+++	if (!IS_ERR_OR_NULL(pdev))
+++		sc->btnpdev = pdev;
+++	else {
+++		sc->btnpdev = NULL;
+++		devm_kfree(sc->dev, bt);
+++	}
+++}
+++
+++/* remove GPIO buttons */
+++static void ath9k_deinit_buttons(struct ath_softc *sc)
+++{
+++	if (!sc->gpiochip || !sc->btnpdev)
+++		return;
+++
+++	platform_device_unregister(sc->btnpdev);
+++
+++	sc->btnpdev = NULL;
+++}
+++
++ #else /* CONFIG_GPIOLIB */
++ 
++ static inline void ath9k_register_gpio_chip(struct ath_softc *sc)
++@@ -142,6 +201,14 @@ static inline void ath9k_unregister_gpio
++ {
++ }
++ 
+++static inline void ath9k_init_buttons(struct ath_softc *sc)
+++{
+++}
+++
+++static inline void ath9k_deinit_buttons(struct ath_softc *sc)
+++{
+++}
+++
++ #endif /* CONFIG_GPIOLIB */
++ 
++ /********************************/
++@@ -246,6 +313,7 @@ void ath_deinit_leds(struct ath_softc *s
++ {
++ 	struct ath_led *led;
++ 
+++	ath9k_deinit_buttons(sc);
++ 	while (!list_empty(&sc->leds)) {
++ 		led = list_first_entry(&sc->leds, struct ath_led, list);
++ #ifdef CONFIG_GPIOLIB
++@@ -274,6 +342,7 @@ void ath_init_leds(struct ath_softc *sc)
++ 		return;
++ 
++ 	ath9k_register_gpio_chip(sc);
+++	ath9k_init_buttons(sc);
++ 
++ 	if (pdata && pdata->led_name)
++ 		strncpy(led_name, pdata->led_name, sizeof(led_name));
++@@ -289,7 +358,7 @@ void ath_init_leds(struct ath_softc *sc)
++ 	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger,
++ 			    !sc->sc_ah->config.led_active_high);
++ 
++-	if (!pdata)
+++	if (!pdata || !pdata->leds || !pdata->num_leds)
++ 		return;
++ 
++ 	for (i = 0; i < pdata->num_leds; i++)
++--- a/include/linux/ath9k_platform.h
+++++ b/include/linux/ath9k_platform.h
++@@ -46,6 +46,10 @@ struct ath9k_platform_data {
++ 	int num_leds;
++ 	const struct gpio_led *leds;
++ 	const char *led_name;
+++
+++	unsigned num_btns;
+++	const struct gpio_keys_button *btns;
+++	unsigned btn_poll_interval;
++ };
++ 
++ #endif /* _LINUX_ATH9K_PLATFORM_H */
+diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch
+deleted file mode 100644
+index 55bb991..0000000
+--- a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_chip.patch
++++ /dev/null
+@@ -1,243 +0,0 @@
+-From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
+-Date: Sun, 31 Jan 2016 21:01:31 +0100
+-Subject: [PATCH v4 4/8] mac80211: ath9k: enable access to GPIO
+-
+-Enable access to GPIO chip and its pins for Atheros AR92xx
+-wireless devices. For now AR9285 and AR9287 are supported.
+-
+-Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
+----
+- ath9k.h |   23 ++++++++++++
+- gpio.c  |  121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+- init.c  |    2 +
+- 3 files changed, 146 insertions(+)
+-
+---- a/drivers/net/wireless/ath/ath9k/ath9k.h
+-+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
+-@@ -24,6 +24,7 @@
+- #include <linux/completion.h>
+- #include <linux/time.h>
+- #include <linux/hw_random.h>
+-+#include <linux/gpio/driver.h>
+- 
+- #include "common.h"
+- #include "debug.h"
+-@@ -817,6 +818,13 @@ void ath_fill_led_pin(struct ath_softc *
+- int ath_create_gpio_led(struct ath_softc *sc, int gpio, const char *name,
+-                         const char *trigger, bool active_low);
+- 
+-+/***************/
+-+/*  GPIO Chip  */
+-+/***************/
+-+
+-+void ath9k_register_gpio_chip(struct ath_softc *sc);
+-+void ath9k_unregister_gpio_chip(struct ath_softc *sc);
+-+
+- #else
+- static inline void ath_init_leds(struct ath_softc *sc)
+- {
+-@@ -828,6 +836,14 @@ static inline void ath_deinit_leds(struc
+- static inline void ath_fill_led_pin(struct ath_softc *sc)
+- {
+- }
+-+
+-+static inline void ath9k_register_gpio_chip(struct ath_softc *sc)
+-+{
+-+}
+-+
+-+static inline void ath9k_unregister_gpio_chip(struct ath_softc *sc)
+-+{
+-+}
+- #endif
+- 
+- /************************/
+-@@ -963,6 +979,12 @@ struct ath_led {
+- 	struct led_classdev cdev;
+- };
+- 
+-+struct ath9k_gpio_chip {
+-+	struct ath_softc *sc;
+-+	char label[32];
+-+	struct gpio_chip gchip;
+-+};
+-+
+- struct ath_softc {
+- 	struct ieee80211_hw *hw;
+- 	struct device *dev;
+-@@ -1017,6 +1039,7 @@ struct ath_softc {
+- #ifdef CPTCFG_MAC80211_LEDS
+- 	const char *led_default_trigger;
+- 	struct list_head leds;
+-+	struct ath9k_gpio_chip *gpiochip;
+- #endif
+- 
+- #ifdef CPTCFG_ATH9K_DEBUGFS
+---- a/drivers/net/wireless/ath/ath9k/gpio.c
+-+++ b/drivers/net/wireless/ath/ath9k/gpio.c
+-@@ -22,6 +22,9 @@
+- /********************************/
+- 
+- #ifdef CPTCFG_MAC80211_LEDS
+-+
+-+#include <asm-generic/gpio.h>
+-+
+- static void ath_led_brightness(struct led_classdev *led_cdev,
+- 			       enum led_brightness brightness)
+- {
+-@@ -60,6 +63,10 @@ static int ath_add_led(struct ath_softc
+- 	else
+- 		ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
+- 
+-+	/* If there is GPIO chip configured, reserve LED pin */
+-+	if (sc->gpiochip)
+-+		gpio_request(sc->gpiochip->gchip.base + gpio->gpio, gpio->name);
+-+
+- 	return 0;
+- }
+- 
+-@@ -116,6 +123,9 @@ void ath_deinit_leds(struct ath_softc *s
+- 
+- 	while (!list_empty(&sc->leds)) {
+- 		led = list_first_entry(&sc->leds, struct ath_led, list);
+-+		/* If there is GPIO chip configured, free LED pin */
+-+		if (sc->gpiochip)
+-+			gpio_free(sc->gpiochip->gchip.base + led->gpio->gpio);
+- 		list_del(&led->list);
+- 		ath_led_brightness(&led->cdev, LED_OFF);
+- 		led_classdev_unregister(&led->cdev);
+-@@ -186,6 +196,117 @@ void ath_fill_led_pin(struct ath_softc *
+- 	/* LED off, active low */
+- 	ath9k_hw_set_gpio(ah, ah->led_pin, (ah->config.led_active_high) ? 0 : 1);
+- }
+-+
+-+/***************/
+-+/*  GPIO Chip  */
+-+/***************/
+-+
+-+/* gpio_chip handler : set GPIO to input */
+-+static int ath9k_gpio_pin_cfg_input(struct gpio_chip *chip, unsigned offset)
+-+{
+-+	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+-+						  gchip);
+-+
+-+	ath9k_hw_cfg_gpio_input(gc->sc->sc_ah, offset);
+-+
+-+	return 0;
+-+}
+-+
+-+/* gpio_chip handler : set GPIO to output */
+-+static int ath9k_gpio_pin_cfg_output(struct gpio_chip *chip, unsigned offset,
+-+				     int value)
+-+{
+-+	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+-+						  gchip);
+-+
+-+	ath9k_hw_cfg_output(gc->sc->sc_ah, offset,
+-+			    AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
+-+	ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value);
+-+
+-+	return 0;
+-+}
+-+
+-+/* gpio_chip handler : query GPIO direction (0=out, 1=in) */
+-+static int ath9k_gpio_pin_get_dir(struct gpio_chip *chip, unsigned offset)
+-+{
+-+	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+-+						  gchip);
+-+	struct ath_hw *ah = gc->sc->sc_ah;
+-+
+-+	return !((REG_READ(ah, AR_GPIO_OE_OUT) >> (offset * 2)) & 3);
+-+}
+-+
+-+/* gpio_chip handler : get GPIO pin value */
+-+static int ath9k_gpio_pin_get(struct gpio_chip *chip, unsigned offset)
+-+{
+-+	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+-+						  gchip);
+-+
+-+	return ath9k_hw_gpio_get(gc->sc->sc_ah, offset);
+-+}
+-+
+-+/* gpio_chip handler : set GPIO pin to value */
+-+static void ath9k_gpio_pin_set(struct gpio_chip *chip, unsigned offset,
+-+			       int value)
+-+{
+-+	struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
+-+						  gchip);
+-+
+-+	ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value);
+-+}
+-+
+-+/* register GPIO chip */
+-+void ath9k_register_gpio_chip(struct ath_softc *sc)
+-+{
+-+	struct ath9k_gpio_chip *gc;
+-+	u16 ng;
+-+
+-+	/* for now only AR9285 and AR9287 are recognized */
+-+	if (AR_SREV_9287(sc->sc_ah))
+-+		ng = AR9287_NUM_GPIO;
+-+	else if (AR_SREV_9285(sc->sc_ah))
+-+		ng = AR9285_NUM_GPIO;
+-+	else
+-+		return;
+-+
+-+	gc = kzalloc(sizeof(struct ath9k_gpio_chip), GFP_KERNEL);
+-+	if (!gc)
+-+		return;
+-+
+-+	snprintf(gc->label, sizeof(gc->label), "ath9k-%s",
+-+		 wiphy_name(sc->hw->wiphy));
+-+	gc->gchip.label = gc->label;
+-+	gc->gchip.base = -1;	/* determine base automatically */
+-+	gc->gchip.ngpio = ng;
+-+	gc->gchip.direction_input = ath9k_gpio_pin_cfg_input;
+-+	gc->gchip.direction_output = ath9k_gpio_pin_cfg_output;
+-+	gc->gchip.get_direction = ath9k_gpio_pin_get_dir;
+-+	gc->gchip.get = ath9k_gpio_pin_get;
+-+	gc->gchip.set = ath9k_gpio_pin_set;
+-+	gc->gchip.owner = THIS_MODULE;
+-+
+-+	if (gpiochip_add(&gc->gchip)) {
+-+		kfree(gc);
+-+		return;
+-+	}
+-+
+-+	sc->gpiochip = gc;
+-+	gc->sc = sc;
+-+}
+-+
+-+/* remove GPIO chip */
+-+void ath9k_unregister_gpio_chip(struct ath_softc *sc)
+-+{
+-+	struct ath9k_gpio_chip *gc = sc->gpiochip;
+-+
+-+	if (!gc)
+-+		return;
+-+
+-+	gpiochip_remove(&gc->gchip);
+-+	kfree(gc);
+-+	sc->gpiochip = NULL;
+-+}
+-+
+- #endif
+- 
+- /*******************/
+---- a/drivers/net/wireless/ath/ath9k/init.c
+-+++ b/drivers/net/wireless/ath/ath9k/init.c
+-@@ -975,6 +975,7 @@ int ath9k_init_device(u16 devid, struct
+- 			goto debug_cleanup;
+- 	}
+- 
+-+	ath9k_register_gpio_chip(sc);
+- 	ath_init_leds(sc);
+- 	ath_start_rfkill_poll(sc);
+- 
+-@@ -1022,6 +1023,7 @@ void ath9k_deinit_device(struct ath_soft
+- 
+- 	wiphy_rfkill_stop_polling(sc->hw->wiphy);
+- 	ath_deinit_leds(sc);
+-+	ath9k_unregister_gpio_chip(sc);
+- 
+- 	ath9k_ps_restore(sc);
+- 
+diff --git a/package/kernel/mac80211/patches/550-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/550-ath9k_enable_gpio_buttons.patch
+deleted file mode 100644
+index e3a8cec..0000000
+--- a/package/kernel/mac80211/patches/550-ath9k_enable_gpio_buttons.patch
++++ /dev/null
+@@ -1,169 +0,0 @@
+-From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
+-Subject: [PATCH v5 5/8] mac80211: ath9k: enable GPIO buttons
+-
+-Enable platform-defined GPIO button support for ath9k device.
+-Key poller is activated for attached platform buttons.
+-Requires ath9k GPIO chip access.
+-
+-Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
+----
+- drivers/net/wireless/ath/ath9k/ath9k.h |   16 ++++++
+- drivers/net/wireless/ath/ath9k/gpio.c  |   77 +++++++++++++++++++++++++++++++++
+- drivers/net/wireless/ath/ath9k/init.c  |    2 
+- include/linux/ath9k_platform.h         |    4 +
+- 4 files changed, 99 insertions(+)
+-
+---- a/drivers/net/wireless/ath/ath9k/ath9k.h
+-+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
+-@@ -825,6 +825,13 @@ int ath_create_gpio_led(struct ath_softc
+- void ath9k_register_gpio_chip(struct ath_softc *sc);
+- void ath9k_unregister_gpio_chip(struct ath_softc *sc);
+- 
+-+/******************/
+-+/*  GPIO Buttons  */
+-+/******************/
+-+
+-+void ath9k_init_buttons(struct ath_softc *sc);
+-+void ath9k_deinit_buttons(struct ath_softc *sc);
+-+
+- #else
+- static inline void ath_init_leds(struct ath_softc *sc)
+- {
+-@@ -844,6 +851,14 @@ static inline void ath9k_register_gpio_c
+- static inline void ath9k_unregister_gpio_chip(struct ath_softc *sc)
+- {
+- }
+-+
+-+static inline void ath9k_init_buttons(struct ath_softc *sc)
+-+{
+-+}
+-+
+-+static inline void ath9k_deinit_buttons(struct ath_softc *sc)
+-+{
+-+}
+- #endif
+- 
+- /************************/
+-@@ -1040,6 +1055,7 @@ struct ath_softc {
+- 	const char *led_default_trigger;
+- 	struct list_head leds;
+- 	struct ath9k_gpio_chip *gpiochip;
+-+	struct platform_device *btnpdev;	/* gpio-keys-polled */
+- #endif
+- 
+- #ifdef CPTCFG_ATH9K_DEBUGFS
+---- a/drivers/net/wireless/ath/ath9k/gpio.c
+-+++ b/drivers/net/wireless/ath/ath9k/gpio.c
+-@@ -24,6 +24,8 @@
+- #ifdef CPTCFG_MAC80211_LEDS
+- 
+- #include <asm-generic/gpio.h>
+-+#include <linux/platform_device.h>
+-+#include <linux/gpio_keys.h>
+- 
+- static void ath_led_brightness(struct led_classdev *led_cdev,
+- 			       enum led_brightness brightness)
+-@@ -159,7 +161,7 @@ void ath_init_leds(struct ath_softc *sc)
+- 	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger,
+- 			    !sc->sc_ah->config.led_active_high);
+- 
+--	if (!pdata)
+-+	if (!pdata || !pdata->leds || !pdata->num_leds)
+- 		return;
+- 
+- 	for (i = 0; i < pdata->num_leds; i++)
+-@@ -307,6 +309,63 @@ void ath9k_unregister_gpio_chip(struct a
+- 	sc->gpiochip = NULL;
+- }
+- 
+-+/******************/
+-+/*  GPIO Buttons  */
+-+/******************/
+-+
+-+/* add GPIO buttons */
+-+void ath9k_init_buttons(struct ath_softc *sc)
+-+{
+-+	struct ath9k_platform_data *pdata = sc->dev->platform_data;
+-+	struct platform_device *pdev;
+-+	struct gpio_keys_platform_data gkpdata;
+-+	struct gpio_keys_button *bt;
+-+	int i;
+-+
+-+	if (!sc->gpiochip)
+-+		return;
+-+
+-+	if (!pdata || !pdata->btns || !pdata->num_btns)
+-+		return;
+-+
+-+	bt = devm_kmemdup(sc->dev, pdata->btns,
+-+			  pdata->num_btns * sizeof(struct gpio_keys_button),
+-+			  GFP_KERNEL);
+-+	if (!bt)
+-+		return;
+-+
+-+	for (i = 0; i < pdata->num_btns; i++) {
+-+		ath9k_hw_cfg_gpio_input(sc->sc_ah, pdata->btns[i].gpio);
+-+		bt[i].gpio = sc->gpiochip->gchip.base + pdata->btns[i].gpio;
+-+	}
+-+
+-+	memset(&gkpdata, 0, sizeof(struct gpio_keys_platform_data));
+-+	gkpdata.buttons = bt;
+-+	gkpdata.nbuttons = pdata->num_btns;
+-+	gkpdata.poll_interval = pdata->btn_poll_interval;
+-+
+-+	pdev = platform_device_register_data(sc->dev, "gpio-keys-polled",
+-+					     PLATFORM_DEVID_AUTO, &gkpdata,
+-+					     sizeof(gkpdata));
+-+	if (!IS_ERR_OR_NULL(pdev))
+-+		sc->btnpdev = pdev;
+-+	else {
+-+		sc->btnpdev = NULL;
+-+		devm_kfree(sc->dev, bt);
+-+	}
+-+}
+-+
+-+/* remove GPIO buttons */
+-+void ath9k_deinit_buttons(struct ath_softc *sc)
+-+{
+-+	if (!sc->gpiochip || !sc->btnpdev)
+-+		return;
+-+
+-+	platform_device_unregister(sc->btnpdev);
+-+
+-+	sc->btnpdev = NULL;
+-+}
+-+
+- #endif
+- 
+- /*******************/
+---- a/drivers/net/wireless/ath/ath9k/init.c
+-+++ b/drivers/net/wireless/ath/ath9k/init.c
+-@@ -977,6 +977,7 @@ int ath9k_init_device(u16 devid, struct
+- 
+- 	ath9k_register_gpio_chip(sc);
+- 	ath_init_leds(sc);
+-+	ath9k_init_buttons(sc);
+- 	ath_start_rfkill_poll(sc);
+- 
+- 	return 0;
+-@@ -1022,6 +1023,7 @@ void ath9k_deinit_device(struct ath_soft
+- 	ath9k_ps_wakeup(sc);
+- 
+- 	wiphy_rfkill_stop_polling(sc->hw->wiphy);
+-+	ath9k_deinit_buttons(sc);
+- 	ath_deinit_leds(sc);
+- 	ath9k_unregister_gpio_chip(sc);
+- 
+---- a/include/linux/ath9k_platform.h
+-+++ b/include/linux/ath9k_platform.h
+-@@ -46,6 +46,10 @@ struct ath9k_platform_data {
+- 	int num_leds;
+- 	const struct gpio_led *leds;
+- 	const char *led_name;
+-+
+-+	unsigned num_btns;
+-+	const struct gpio_keys_button *btns;
+-+	unsigned btn_poll_interval;
+- };
+- 
+- #endif /* _LINUX_ATH9K_PLATFORM_H */

+ 17 - 26
patches/openwrt/0010-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch → patches/openwrt/0086-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch

@@ -6,7 +6,7 @@ Patch-by: Stefan Rompf <stefan@loplof.de>
 
 diff --git a/package/kernel/mac80211/patches/931-ubnt-uap-plus-hsr.patch b/package/kernel/mac80211/patches/931-ubnt-uap-plus-hsr.patch
 new file mode 100644
-index 0000000..4533335
+index 0000000..14d63f1
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/931-ubnt-uap-plus-hsr.patch
 @@ -0,0 +1,346 @@
@@ -347,10 +347,10 @@ index 0000000..4533335
 + ath9k-$(CPTCFG_ATH9K_PCI) += pci.o
 +--- a/include/linux/ath9k_platform.h
 ++++ b/include/linux/ath9k_platform.h
-+@@ -44,6 +44,8 @@ struct ath9k_platform_data {
-+ 
-+ 	int num_leds;
-+ 	const struct gpio_led *leds;
++@@ -50,6 +50,8 @@ struct ath9k_platform_data {
++ 	unsigned num_btns;
++ 	const struct gpio_keys_button *btns;
++ 	unsigned btn_poll_interval;
 ++
 ++	bool ubnt_hsr;
 + };
@@ -368,25 +368,16 @@ index 7803513..d865ed2 100644
  +	ap91_pci_init(ee, NULL);
  +
  +	ath79_register_leds_gpio(-1, ARRAY_SIZE(ubnt_unifi_outdoor_plus_leds_gpio),
-diff --git a/target/linux/generic/patches-3.18/150-ath9k_ubnt_hsr_filter.patch b/target/linux/generic/patches-3.18/150-ath9k_ubnt_hsr_filter.patch
-new file mode 100644
-index 0000000..a0ebbc7
---- /dev/null
-+++ b/target/linux/generic/patches-3.18/150-ath9k_ubnt_hsr_filter.patch
-@@ -0,0 +1,16 @@
-+Flag that this platform is an Ubiquiti UniFi Outdoor Plus
-+containing a RF filter in ath9k's receive path.
+diff --git a/target/linux/generic/files/include/linux/ath9k_platform.h b/target/linux/generic/files/include/linux/ath9k_platform.h
+index e543a64..2cb0288 100644
+--- a/target/linux/generic/files/include/linux/ath9k_platform.h
++++ b/target/linux/generic/files/include/linux/ath9k_platform.h
+@@ -50,6 +50,8 @@ struct ath9k_platform_data {
+ 	unsigned num_btns;
+ 	const struct gpio_keys_button *btns;
+ 	unsigned btn_poll_interval;
 +
-+Signed-off-by: Stefan Rompf <stefan@loplof.de>
-+
-+--- a/include/linux/ath9k_platform.h
-++++ b/include/linux/ath9k_platform.h
-+@@ -44,6 +44,8 @@ struct ath9k_platform_data {
-+ 
-+ 	int num_leds;
-+ 	const struct gpio_led *leds;
-++
-++	bool ubnt_hsr;
-+ };
-+ 
-+ #endif /* _LINUX_ATH9K_PLATFORM_H */
++	bool ubnt_hsr;
+ };
+ 
+ #endif /* _LINUX_ATH9K_PLATFORM_H */