• Hot Reset(Photo01)

Photo01: Universal Serial Bus 3.0 SpecificationのFigure 7-22からの抜粋。

DSPのみ、Hot Resetを行う事が出来る。USB 3.0のSpecificationはあくまで通信部分のみの規定だから、USBを搭載したApplicationがここで何をすべきかについて別に規定はしていないが、通常ApplicationがHot Reset動作を行う場合は当然USBのポートもHot Resetとなるだろう。ただ実際にHot Reset動作を行う場合、DSPはHot Resetでいいとしても、USPにはHot Resetは送出できないので、結局SS.InactiveにStateを遷移させるしかなくなる事になり、Host ControllerとかUSB Hub以外ではHot ResetというStateは使いにくいのが実情だ。

このあたりは、USBのMaster-Slaveの関係をReset動作にも及ぼしていると考えていいだろう。つまりHost側というか上位側がReset動作を行う場合、Device側というか下位側もこれに従ってReset動作を行うのは問題ないが、下位側のReset動作に上位側が連動することは無い、という発想であろう。まぁ確かに下位Deviceが勝手にHot Resetを掛けまくり、通信がさっぱり行われない、なんて事になるのは御免ではある。

想定されるのはむしろ、通信エラーなどが検出されているので、Linkを再構成しなおしたいといった用途が一般的だろう。こうした用途ならば、DSPのみに適用できるのも不思議ではないし、有用と思われる。

さてそのHot Resetだが、こちらは2つのSubstateを持つ。まずHot Resetを行う事を決定したら、Hot Reset.Activeに遷移する。このHot Reset.Activeでは、DSPに対しReset bitを立てた状態でTS2を最低16回送信する。これを受けて相手側はHot Resetに入るが、この際には相手もReset bitを立てた状態でTS2を送り返し続けるので、こちらも引き続きReset bitを立てた状態でTS2を送り続ける。相手側がHot Resetを完了すると、Reset bitを落とした状態でTS2を送り返してくるので、これを受け取ったらこちらもReset bitを落とした状態でTS2を送り返す事になる。双方とも、

  • Reset bitを落としたTS2を連続して2回以上受信する
  • 自分がReset bitを落としてTS2を送信した後で、4回以上連続してReset bitを落としたTS2を受信する

を経てHot Resetを完了することになる。この一連のシーケンスは12ms以内に完了する必要があり、失敗した場合はSS.Inactiveに遷移することになる。またこのシーケンスの中で、USPの先(つまり自分より上流のデバイス)がWarm Resetのシーケンスに入っている事を確認した場合、自身はEx.Detectに遷移することになる。

正常にHot Reset.Activeが終了したら、Hot Reset.Exitに遷移する。ここでは基本的にIdle Symbolを相互に通信しあう。Hot Reset.Exitでは2msのTimerをスタートし、

  • 8個の連続するIdle Symbolを受信する
  • 1つ以上のIdle Symbolを受信後、連続して16個のIdle Symbolを送信する

が成立すると終了であり、ここでTimeoutが発生したらSS.Inactiveに遷移する。問題がなければ、そのままU0に戻る事になる。

ちなみにHot Resetが無事終了すると、DSPのLink Error Countはゼロクリアされるが、Configurationとか(Loopbackなどで定めた)PHY Levelなどは一切変更されない。このあたりは、Link Trainingからやり直しとなるPowerOn Resetとは異なる部分だ。

ちなみにこのHot Resetは、あくまでLink層のみのResetであり、基本的にはDeviceのResetは考慮していないと思われる。というのは、USB 3.0ではResetを大別して、

  • PowerOn Reset(上でも触れた、電源投入直後に行われるReset)
  • Inband Reset(Link層のみのReset)

に分けており、Inband Resetは更に、

  • Hot Reset(今説明したもの)
  • Warm Reset(LFPSのtResetからやり直すシーケンス)

に分かれる。LFPSを使うため、こちらは当然Link Trainingのやり直しから始める事になるため、所要時間も長くなる。恐らく上位層のインプリメントとしては、まずLink Errorが出るようならHot Resetを何回か繰り返し、それでもダメならWarm Resetを行い、それでもダメだとLink Down(ここで例えばHostからDeviceに、USB 3.0を使わずにUSB 1.1/2.0で接続するようにリクエストを送って再起動といった事は、Specificationレベルではインプリメントされていないようだ)といったアプローチになるのではないかと思われる。

(続く)