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