记一次取无线网卡 TSF 的过程

Posted by shengliangd's blog on January 7, 2021

最近做实验需要拿到无线网卡的 TSF,魔改内核的过程还是挺有意思的。

手头的网卡是 mt7612e,先在内核源码目录(5.4.84)drivers/net/wireless/mediatek 里搜 TSF,得到大概 40 来个匹配,不算太多,如下:

search-result

扫一眼发现前两个文件的搜索结果已经很有趣了:

  1. MT_TSF_TIMER_DW0MT_TSF_TIMER_DW1 看起来很像寄存器的地址之类的东西;
  2. 第二个文件里似乎是在读时间戳了。

去看下第二个文件里这段代码:

1
2
3
4
dw0 = mt76_rr(dev, MT_TSF_TIMER_DW0);
dw1 = mt76_rr(dev, MT_TSF_TIMER_DW1);
tsf = (u64)dw0 << 32 | dw1;
dev_dbg(dev->mt76.dev, "TSF: %llu us TBTT %u us\n", tsf, tbtt);

基本上可以确定用前三行就好了。不过这是为 mt7612u 写的,不一定可用,打算碰碰运气。先封装了一个单独的函数,注册到 mt7612e 的 ieee80211_ops 结构中,然后在 mac80211 里我需要的地方调用并打出时间戳,发现确实可以,但观察每秒的变化发现 dw0 和 dw1 反了,可能因为 mt7612u 和 mt7612e 的两个寄存器顺序是反的,也可能原开发者确实写反了,之后抽空拿 mt7612u 试试。