大破ログ

日々大破、それと側転少々。PC関連その他、気になったことなどをつらつらと。

WXR-2533DHP(経過報告2)

2020/04/19 追記: WXR-2533DHPのサポートは既に完了し、OpenWrt本体にマージ済みです。

前回の経過報告から10日くらい経過し、いくらか進んだのでここで再び経過報告です。

状況

  • U-Bootのbankチェックをパスできるようになった
    • rootfs checksumがどんな値かも判明。xeditで以下の様に出すことができ、
      wxr-2533dhp_133.PNG Linuxでの算出方法は某氏より以下を教えて頂いた。 [sourcecode] od -A n -t u1 | tr -s ' ' '\n' | awk '{s+=$0}END{printf "%x", 255-s%256}' [/sourcecode]
    • 上記により、ブート時にU-Bootのコンソールからbootipqを叩いてチェックをスキップさせる必要が無くなった(→ 何もせずブートできる)
  • KernelのRootfsとU-BootのRootfsチェック用にrootfsボリュームを2つ作る必要が生じた
    • U-Bootは "ubi_rootfs" ボリュームのみを、OpenWrtのKernelは "rootfs" ボリュームのみをそれぞれ固定で参照しようとするため。
      • 当初U-Boot側に合わせてOpenWrt側rootfsのボリューム名をubinizeで "ubi_rootfs" に変更したが、何度試してもrootfsの認識に失敗した。結局、OpenWrt側が target/linux/generic/pending-4.9/491-ubi-auto-create-ubiblock-device-for-rootfs.patch でrootfsとして使えるボリュームを "rootfs" のみに固定していることが判明、やむなく別個で作ることにした。
      • OpenWrtビルド時に生成されるrootfsを "ubi_rootfs" にもそのまま使用するとNAND Flash上のスペースを無駄に占有する(OpenWrt側では使用されない)ため、空のフォルダ1個をsquashfs化して、そこにU-Bootのチェックをパスするのに必要なchecksumを付加するようにした。
  • U-Bootの挙動に絡み、KernelはBank1を、RootfsはBank2のモノを使用することにした
    • U-Bootが、Bank2を "破損している" と判定しない限りBank2⇒Bank1の向きで書き戻しを行い、またその際 "kernel" と "ubi_rootfs" のみの書き戻ししか行わないため。
      • WXR-2533DHPでは、メーカーファームでは当然ながらBank1の "kernel", "ubi_rootfs", "ubi_rootfs_data" がブートに使用される。
      • その状態でアップデートを行った場合、更新先のファームはBank1ではなくBank2に書き込み、リブートしてU-Bootのbankチェックが実行された際、イメージが異なるとしてBank2からBank1へイメージが書き込まれ、アップデートが完了する仕組みになっている。
      • OpenWrtの場合、KernelはメーカーファームでもOpenWrtでも "kernel" なのでU-Bootにより問題なくBank2⇒Bank1へ書き込まれるが、RootfsはU-Boot用の "ubi_rootfs" がU-Bootに認識され書き戻されるのみで、Bank2にあるOpenWrt用の "rootfs" は何もされない(= Bank1のrootfsが更新されない)。
      • もしOpenWrtでKernelとRootfsを両方ともBank1から起動できるようにする場合、"kernel" と "ubi_rootfs" はBank2に、"rootfs" とデータ領域の "rootfs_data" はBank1にと2か所に書き込まなければならず、手順が面倒になる。
        また、sysupgrade時も両方への書き込みが必要になり、複雑化してしまう。
      • 対して、kernelはBank1、RootfsはBank2としてしまえば、Bank2に書き込まれたOpenWrtの "kernel" とU-Boot用の "ubi_rootfs" は自動でBank1に書き込まれU-Bootはそれをブートするほか、RootfsはBank2に書き込み済みの "rootfs" を読み込ませれば良いのでだいぶ簡単になる。
      • メーカーファームと現時点でのOpenWrtファームにおけるUBIボリュームの使用状況については、雑記にまとめた。
      • ただし、ぶっちゃけ上記の雑記で改めて表にしてみると「ひどいなこれ」という感想しか出てこない。
      • というのを書きながら、'Bank1にイメージ書き込んだ後Bank2から意図的に "kernel" だけボリューム削除して破損扱いにさせれば、通常とは逆向きのBank1⇒Bank2の書き戻しが発生するから、使用するボリュームをBank1にまとめることもできるかな?' というのが思い浮かんだ。後で試す。
  • sysupgradeまで機能するようにできた
    • WXR-2533DHPでは上の項目で長々と書いた通り "ubi_rootfs" を上手く扱わなくてはならず、その関係上OpenWrtに存在しているsysupgradeスクリプト(というかNAND向けスクリプトのnand.sh)では対応できない。そのため、いくらか引用したうえでbuffalo.shを作成し、 "ubi_rootfs" をバックアップ/書き戻しすることでsysupgradeを行えるようにした。
    • ただし、テスト回数とテスト条件はあまり多く試せていないため、確実性は不安。
    • また、上のBankの取り扱いで最後に書いた思いついたことを試す場合、再度sysupgrade用スクリプトの改変が必要になるため、どうなることやら。
  • PCI周りがエラーらしきものを吐く
    • ブート時にPCI周辺で "無線のFirmwareが読めない" というようなエラーが吐かれる。
      ただしブート完了後無線は正常に機能しているように見え、また少し検索してみても "問題ない" というような記述が見られる。

      ログ

      [sourcecode] [ 19.985388] ath10k_pci 0000:01:00.0: enabling device (0140 -> 0142) [ 19.985940] ath10k_pci 0000:01:00.0: pci irq msi oper_irq_mode 2 irq_mode 0 reset_mode 0 [ 20.172091] ath10k_pci 0000:01:00.0: Direct firmware load for ath10k/QCA99X0/hw2.0/firmware-6.bin failed with error -2 [ 20.172147] ath10k_pci 0000:01:00.0: Falling back to user helper [ 36.077329] firmware ath10k!QCA99X0!hw2.0!firmware-6.bin: firmware_loading_store: map pages failed [ 36.492146] ath10k_pci 0000:01:00.0: qca99x0 hw2.0 target 0x01000000 chip_id 0x003b01ff sub 168c:0002 [ 36.492179] ath10k_pci 0000:01:00.0: kconfig debug 0 debugfs 1 tracing 0 dfs 1 testmode 1 [ 36.502471] ath10k_pci 0000:01:00.0: firmware ver 10.4.1.00030-1 api 5 features no-p2p crc32 d2901e01 [ 36.600352] ath10k_pci 0000:01:00.0: board_file api 2 bmi_id 1:1 crc32 08fa09f2 [ 37.865657] ath10k_pci 0000:01:00.0: htt-ver 2.2 wmi-op 6 htt-op 4 cal pre-cal-file max-sta 512 raw 0 hwcrypto 1 [ 37.953404] ath10k_pci 0001:01:00.0: enabling device (0140 -> 0142) [ 37.953970] ath10k_pci 0001:01:00.0: pci irq msi oper_irq_mode 2 irq_mode 0 reset_mode 0 [ 38.156469] ath10k_pci 0001:01:00.0: Direct firmware load for ath10k/QCA99X0/hw2.0/firmware-6.bin failed with error -2 [ 38.156515] ath10k_pci 0001:01:00.0: Falling back to user helper [ 38.307675] firmware ath10k!QCA99X0!hw2.0!firmware-6.bin: firmware_loading_store: map pages failed [ 38.307815] ath10k_pci 0001:01:00.0: qca99x0 hw2.0 target 0x01000000 chip_id 0x003b01ff sub 168c:0002 [ 38.315640] ath10k_pci 0001:01:00.0: kconfig debug 0 debugfs 1 tracing 0 dfs 1 testmode 1 [ 38.327131] ath10k_pci 0001:01:00.0: firmware ver 10.4.1.00030-1 api 5 features no-p2p crc32 d2901e01 [ 38.389439] ath10k_pci 0001:01:00.0: board_file api 2 bmi_id 1:2 crc32 08fa09f2 [ 39.664713] ath10k_pci 0001:01:00.0: htt-ver 2.2 wmi-op 6 htt-op 4 cal pre-cal-file max-sta 512 raw 0 hwcrypto 1 [/sourcecode]

今後

  • できればfactoryイメージを作りたいものの、単にKernelとRootfsを投入しただけではリブート後OpenWrtのKernelがRootfsを見つけられなくなるので、どうしたものか

雑感とか

  • SoC(IPQ8064)は負荷に応じてコアごとにクロックが変動していた(384MHz - 1,400MHz)
  • LuCIのページ遷移が体感的に速い
  • どこかで有線のiperf計測したい

お知らせっぽいもの

  • 今のところ今年2月のOSC 2018 Tokyo/Springにて、東海道らぐブースの場所をお借りしてWXR-2533DHPを動態展示させていただく予定です。
    色々詳しい方にご意見等頂ければと思います。