1. 目標
透過 OpenWrt/LEDE 的 quilt 將 ath9k 打上 patch,把 ath9k/xmit.c、ath9k/recv.c、net/mac80211/tx.c 特定的 function static 修飾字消除,以利 ftrace / perf 能夠順利取得 symbol 進行追蹤。
2. 方法
a. 找出 ath9k 在 OpenWrt/LEDE 正確的 package
b. 使用 quilt 對 ath9k 以及 mac80211 打 patch
c. 重新編譯後替換 ath9k.ko / 或重新刷機
3. 實做
a. 找出 ath9k 在 OpenWrt/LEDE 正確的 package
一般來說,kernel code 應該是在 target/linux/
裡面,但因為 ath9k 有 backport 的問題,所以是使用 package/kernel/mac80211/
處理。
首先先準備好 quilt 的設定檔,將設定檔放到家目錄下:
1 2 3 4 5 6 7 8 |
cat > ~/.quiltrc <<EOF QUILT_DIFF_ARGS=“–no-timestamps –no-index -p ab –color=auto” QUILT_REFRESH_ARGS=“–no-timestamps –no-index -p ab” QUILT_SERIES_ARGS=“–color=auto” QUILT_PATCH_OPTS=“–unified” QUILT_DIFF_OPTS=“-p” EDITOR=“enacs” EOF |
準備好設定檔後,回到 OpenWrt/LEDE 目錄下,將 code 準備好:
1 2 3 4 5 |
# 準備 mac80211 的 code $ make package/kernel/mac80211/{clean,prepare} V=s QUILT=1 # 切換到 ath9k 的 directory $ build_dir/target–mips_24kc_musl/linux–ar71xx_generic/backports–2017–11–01/drivers/net/wireless/ath/ath9k |
b. 使用 quilt 對 ath9k 以及 mac80211 打 patch
在 OpenWrt/LEDE 的 package 是使用 quilt
這個工具管理 patches,首先我們要先將所有已有的 patches apply 到 code 上:
1 |
$ quilt push –a |
接著使用 new 建立一個新的 patch:
1 |
$ quilt new 999–ath9k–test.patch |
這個 patch 的名稱應該要:
- 以數字開頭,接著一個分號以及這個 patch 的用途的說明
- 選擇的數字應該要比所有已經打上的 patch 還要高,可以用
quilt series
查看所有的 patches 名稱 - 用途說明應該要短而精鍊
當 patch 建立好後,必須要把要修改的檔案與這個 patch 做關聯,修正才會被納入 patch 當中,可以使用以下兩種方式:
1 2 3 4 5 |
# 將檔案關聯到 patch 中 $ quilt add xmit.c # 或,關聯檔案並同時開起編輯器 $ quilt edit xmit.c |
修正完所有的檔案後,可以用 quilt diff 檢查:
1 |
$ quilt diff |
接著更新修正檔:
1 |
$ quilt refresh |
回到原本 OpenWrt/LEDE 的目錄:
1 |
$ cd – |
c. 重新編譯後替換/刷機
回到 OpenWrt/LEDE 目錄後,將 patch file 更新到 buildroot:
1 |
$ make package/kernel/mac80211/update |
重新編譯:
1 |
$ make –j8 |
將編譯好的 ath9k.ko 替換到 OpenWrt/LEDE 上,可以用 find
找出 .ko 檔:
1 2 3 4 5 6 7 8 9 |
$ find . –iname “ath9k.ko” ./staging_dir/target–mips_24kc_musl/root–ar71xx/lib/modules/4.9.124/ath9k.ko ./build_dir/target–mips_24kc_musl/linux–ar71xx_generic/backports–2017–11–01/drivers/net/wireless/ath/ath9k/ath9k.ko ./build_dir/target–mips_24kc_musl/linux–ar71xx_generic/backports–2017–11–01/.pkgdir/kmod–ath9k/lib/modules/4.9.124/ath9k.ko ./build_dir/target–mips_24kc_musl/linux–ar71xx_generic/backports–2017–11–01/ipkg–mips_24kc/kmod–ath9k/lib/modules/4.9.124/ath9k.ko ./build_dir/target–mips_24kc_musl/root–ar71xx/lib/modules/4.9.124/ath9k.ko ./build_dir/target–mips_24kc_musl/root.orig–ar71xx/lib/modules/4.9.124/ath9k.ko $ scp ./build_dir/target–mips_24kc_musl/linux–ar71xx_generic/backports–2017–11–01/drivers/net/wireless/ath/ath9k/ath9k.ko root@192.168.1.1:/lib/modules/<linux–kernel–version>/ |
重開 wdr4300 後就能看到修正結果。
Leave a Reply