From 49febb43e7acdd84084b89153a79bffc5d262ac2 Mon Sep 17 00:00:00 2001
From: Daniel Ehlers <danielehlers@mindeye.net>
Date: Fri, 4 Jul 2014 00:15:41 +0200
Subject: [PATCH] gluon-ath9k-workaround: Workaround for the ath9k wifi bug.

Cron script which restarts wifi iff queues are marked stopped.
This script also outputs some debug information to nail
down the problem.
---
 package/gluon-ath9k-workaround/Makefile       | 35 +++++++++++
 .../files/lib/gluon/cron/ath9k-workaround     |  1 +
 .../files/usr/sbin/ath9k-workaround           | 61 +++++++++++++++++++
 3 files changed, 97 insertions(+)
 create mode 100644 package/gluon-ath9k-workaround/Makefile
 create mode 100644 package/gluon-ath9k-workaround/files/lib/gluon/cron/ath9k-workaround
 create mode 100755 package/gluon-ath9k-workaround/files/usr/sbin/ath9k-workaround

diff --git a/package/gluon-ath9k-workaround/Makefile b/package/gluon-ath9k-workaround/Makefile
new file mode 100644
index 000000000..bc809df8a
--- /dev/null
+++ b/package/gluon-ath9k-workaround/Makefile
@@ -0,0 +1,35 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=gluon-ath9k-workaround
+PKG_VERSION:=1
+PKG_RELEASE:=1
+
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/gluon-ath9k-workaround
+  SECTION:=gluon
+  CATEGORY:=Gluon
+  TITLE:=ATH9K Workaround
+  DEPENDS:=+gluon-cron
+endef
+
+define Package/gluon-ath9k-workaround/description
+	Gluon community wifi mesh firmware framework: ath9k wifi bug workaround
+endef
+
+define Build/Prepare
+endef
+
+define Build/Configure
+endef
+
+define Build/Compile
+endef
+
+define Package/gluon-ath9k-workaround/install
+	$(CP) ./files/* $(1)/
+endef
+
+$(eval $(call BuildPackage,gluon-ath9k-workaround))
diff --git a/package/gluon-ath9k-workaround/files/lib/gluon/cron/ath9k-workaround b/package/gluon-ath9k-workaround/files/lib/gluon/cron/ath9k-workaround
new file mode 100644
index 000000000..73552f9bd
--- /dev/null
+++ b/package/gluon-ath9k-workaround/files/lib/gluon/cron/ath9k-workaround
@@ -0,0 +1 @@
+* * * * * /usr/sbin/ath9k-workaround
diff --git a/package/gluon-ath9k-workaround/files/usr/sbin/ath9k-workaround b/package/gluon-ath9k-workaround/files/usr/sbin/ath9k-workaround
new file mode 100755
index 000000000..fccd218f7
--- /dev/null
+++ b/package/gluon-ath9k-workaround/files/usr/sbin/ath9k-workaround
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+check_stopped_queue(){
+  local device=$1
+  grep -q -E 'stopped: 1$' "${device}/queues"
+}
+
+get_tx_pkts() {
+  local device=$1
+  grep 'TX-Pkts-All' "${device}/xmit" \
+    | sed -e 's/^TX-Pkts-All: *\([0-9]*\) .*$/\1/'
+}
+
+inc_fatal() {
+  local qs=$(cat /tmp/ath9k_workaround_trigger 2>/dev/null || echo 0)
+  expr ${qs} + 1 > /tmp/ath9k_workaround_trigger
+}
+
+check_ath9k_bug() {
+  local device=$1
+  check_stopped_queue $device && {
+    local tx_first=$(get_tx_pkts $device)
+    sleep 5
+    check_stopped_queue $device && {
+      local tx_second=$(get_tx_pkts $device)
+      test $tx_first == $tx_second && {
+        local hostname=$(uci get -q system.@system[0].hostname)
+        echo "Hostname: ${hostname}"
+        echo "------------ Trigger workaround: ${tx_first} -> ${tx_second} ----------------"
+        echo "Model:" 
+        cat /tmp/sysinfo/model
+        echo "Release:"
+        cat /lib/gluon/release
+        echo "Uptime:"
+        uptime
+        echo "Batctl Neighbours:"
+        batctl o | grep wlan0-1
+        echo "Queues:"
+        cat $device/queues
+        echo "Reset:"
+        cat $device/reset
+        echo "------------ Interupts #1 ---------------------------------------------------"
+        cat $device/interrupt
+        sleep 10
+        echo "------------ Interupts #2 ---------------------------------------------------"
+        cat $device/interrupt
+        echo "Batctl Neighbours:"
+        batctl o | grep wlan0-1
+
+        #BE queue hangs
+        inc_fatal
+        wifi
+        exit 1;
+      }
+    }
+  }
+}
+
+for device in /sys/kernel/debug/ieee80211/phy*/ath9k ; do
+  check_ath9k_bug $device
+done
-- 
GitLab