2023年7月時点の最新の Linux-6.4.4 カーネルでSH7706(SH3)を起動しました。
SH7706(SH3)でもLinux6.5が正常に起動でき、問題なくコマンド操作もできました。
しかし、DHCPでのネットワークインターフェース初期化が失敗し、pingも一切通りません。
これは、Linux6.4.4 でカーネルでのネットワークドライバのインターフェースに変更があったのでしょうか?
そこで、手当たり次第に driver/net/ethernet 以下のドライバのソースコードを調査して、カーネルとのインターフェース関数を見てみましたが、Linux-5.xのときと基本的に変わりはないです。
そして、AX88796BLFのドライバも正常に動作していますが、なぜか ping が通りません。
詳細に調査していくと、pingでの送信動作は正常でしたが、受信はされませんでした。
そこで受信関連のソースコードを再点検しても特に問題ないですし、IRQ割り込みの初期化処理も正常で、AX88796BLFの-IRQ4(LinuxではIRQ34)もカーネルで正常に認識されています。
が、実際には受信をしても IRQ受信割り込みルーチンが起動しません。
そこで、Linux6.4.4で割り込み関係の仕様変更があったのか? と思い調査しましたが、特にそのようなこともなかったのです。
また、AX88796BLF以外の割り込みも正常動作しています。
それでは何でなのか? ということで /proc/interrupts を見てみました。
CPU0
32: 51500 sh770x 32-level sh-tmu-sh3.0
34: 0 sh770x 34-level eth0
36: 0 sh770x 36-level sh-rtc
72: 855 sh770x 72-level sh-sci.1:mux
NMI: 0 Non-maskable interrupts
ERR: 0
eth0 がIRQ34割り込みとしてきちんと登録されています…が、なんとeth0の割り込みが外部割り込み(IRQ0123)でなく、内部割り込み(sh770x)として登録されているではないですか!!
どうりで受信割り込みが発生しないわけですね。
それにLinuxの割り込み番号がいつの間にか16だけ加算されているようです。
ということは…AX88796BLFの割り込みを34番を16だけ加算すれば、辻褄が合いそうです。