きれいにダンプできるSFP+にプログラマーがWRITE FAILを返す: EEPROMが死んでいるのか、それとも書き込みを塞ぐ何かがあるのか
毎月のように顧客のホスト向けに少量のモジュールを再コード化していて、特に変わったことはしていない。元のページを読み、ホストが求めるベンダー文字列を書き込み、モジュールをスイッチに挿して次に進むだけ。今回のバッチのうち1つのモジュールだけが、読み出しは完璧にできるのに書き込みを一切受け付けない。捨てる前に、まだ試せることが残っていないか知りたい。
ベンチの構成:
- SFPブレイクアウトボード付きのCH341系USBプログラマー
- 診断機能付きのSFP+モジュール、コールド状態でも電源再投入後でも読み出しは正常
- 同じ装置で、1時間前に同じトレイの別の3個のモジュールへの書き込みには成功している
書き込みを実行した瞬間にツールが表示するもの:
WRITE FAIL
その直後に読み直すと、元のページがバイト単位でそのまま返ってくる。つまり部分的にすら何も反映されていない。
試したこと:
- モジュールを挿し直し、ブレイクアウトボードも予備に交換した
- ページ全体ではなく、気にしていない領域の1バイトだけ書き込んでみたが結果は同じ
- 何度か電源を入れ直しても読み出しが安定していることを確認済みで、配線がぎりぎりというわけではない
読み出しはきれいなのに書き込みを一切受け付けないモジュールというのは、単に寿命が来ているだけなのか、それともモジュール自体に意図的に書き込みを拒否する仕組みがあるのか。
Comments 5
読み出しはきれいで、書き込みは拒否され、そのあとも元のページはそのまま。それは寿命が尽きたEEPROMの普通の挙動ではない。セルが死んでいる場合は、読み返しがおかしくなったり、書き込みが半端に入ったりするもので、何も変わらないきれいな拒否にはならない。
しかもベンダー領域の外にある1バイトすら弾かれたということは、チップ上の特定の領域が悪いのではなく、そのパーツが書き込みをまるごと拒否しているということ。何か結論を出す前に押さえておく価値のある点が2つある。1つ目は、実際にそのモジュールを作ったのは誰かということ。トレイに貼ってあったラベルではなく、すでにダンプしたページの中のベンダー文字列を見ること。2つ目は、電源が入った直後、バス上の他の誰かがそのモジュールと話す前に書き込みを撃てば通るかどうか。答えによってありそうな説明は変わってくるし、そのうちの一つは故障ですらない。
それは故障というよりパスワード保護のように見える。SFF-8472は、診断機能付きのモジュールが書き込みを受け付ける前に4バイトのパスワードを要求できることを許容している。何も送らないか、間違ったものを送ると、モジュールは読み出しは全開のままエラーで書き込みに応じる。これはまさにそちらのWRITE FAILとページが変わらず戻ってくる状況そのもの。これはそのパーツの機能であって、壊れかけている兆候ではない。
そちらのベンチにとっての意味は、これを知っているプログラマーならメーカーやホストのパスワードを入力させてくれるということで、出来の良いものだと未知のパスワードをブルートフォースし、書き込み後にチェックサムまで再計算してくれる。CH341系の装置にはチェックサムの自動化が一切ないので、パスワードを突破したあともチェックサムは自分で直す必要がある。そうしないと、見た目は正しいのにホストからは相変わらず拒否されるモジュールが出来上がることになる。
いつもの断り書きだが、自分がこれに当たったのは数個のモジュールだけで、そこではパスワードのルートがうまくいった。何かを見限る前に、手元のパーツでも試してみること。
それに付け加えると、ベンダーによってはパスワードは実質秘密でも何でもない。Ubiquitiのトランシーバ用パスワード集がまとまって出回っていて、0x00001011のようなエントリや、SFPXやQSFPといったそのままの文字列が含まれている。モジュールがそのエコシステム出身なら、ブルートフォースに近づく前に、既知のものを試すのに5分かければ済む。
汎用プログラマー相手に格闘するのではなく、一連の流れをあらかじめ知っているツールが欲しいなら、UACC-SFP-WIZARDがみんなが手を伸ばす安価な選択肢だ。ラボ用の測定器というわけではないが、モジュール側はちゃんと扱ってくれる。
関連する話として、Huawei S5731とS6730向けのホスト、それに古いHP 6120XG向けにモジュールを再コード化した経験から。弱点がモジュールではなくケージやブレイクアウト側にあるときは、モジュールのピン4と7、つまりI2CのSDAとSCLに直接はんだ付けして、ケージを完全に無視した状態でEEPROMを駆動するという手を使う人たちがいる。見た目は汚いし、失っても構わないパーツでしかやらないが、接触関連の問題をまるごと排除できる。
こちらでその処理をしたパーツは、Finisar FTLX8571D3BCVとFTLX8574D3BCV、IntelのSFP+ LRとSRモジュール、SNR-SFP+W73-3とSNR-SFP+W37-3、それにHP J9150A。
そちらの場合、電源の入れ直しをまたいでも読み出しはすでに盤石なので、接触は問題ではない。まずパスワードの線を追うこと。
パスワードが有力な答えではあるが、「パスワードを入力すれば終わり」で止めないこと。そのすぐ後に2つ、人を噛む落とし穴がある。
1つ目、パーツによってはモジュールの電源が落ちるたびに再入力が必要になるので、複数ページを順番に書き込むスクリプトは、1回のアンロックがセッション全体をカバーすると決めつけず、再入力に備えておく必要がある。
2つ目、チェックサム。CH341系のプログラマーでは手動で再計算することになる。古いままにしておくと、モジュールは相変わらず正常に読め、ツールも成功したと報告するのに、ホスト側は黙ってそのモジュールを拒否し続け、結局みんなまたハードウェアのせいにし始める。そのモジュールを顧客のスイッチに入れる前に、ページを読み戻してチェックサムを検証すること。