さて、今回からLink Layerに話を移したい。Link Layerの機能は、要するにLinkを保持することにある(Photo01)。
Photo01: SuperSpped USB Developer ConferenceにおけるSue Vining氏(Principal USB Architect, TI)のLink Layerのセッションのプレゼンテーションより。もっともこの図は、Universal Serial Bus 3.0 SpecificationのFigure 7-1そのままであるが。 |
具体的な機能を並べると、
- Link Trainingの制御と、Linkの確立
- 送信データをパケット化して送出
- 受信データのパケットを分解してデータ受け取り
- ヘッダパケットの確実な送受信
- Low Power stateへのEntry/Exitの実行
- Link ErrorのHandle
- DSPs(DownStream-facing Ports)の切断検出
- Inband resetのHandle
といったあたりになる。これをもう少しこまかく紹介して行こう。
まず最初のLink Trainingに関係する部分であるが、USB 3.0ではこれをLTSSM(Link Training & Status State Machine)と呼んでいる(Photo02)。これは前回まで説明してきたPower Down Stateの追加に対応したものである。
ちなみにPCI Expressの場合は? というと、図1の様な簡単なものである。
もっともこれは必須のStateのみであって、他にオプションとして、
DL_Down | Data Link Layerが相手サイドと通信状態にない |
---|---|
DL_Up | Data Link Layerが相手サイドと通信状態にある |
が用意されるが、それでも5ステートのみで、USB 3.0の12ステートとは比べ物にならない。このあたりは、Power Down stateを設けた事に加え、LFPSをサポートした事も関係しているだろう。このLFPSに関しては上位層に処理を移さず、全部Link Layerで処理を行っている関係で、余計にもStatus State Machineが複雑になっているともいえる。
さて各Stateの内容だが、
- SS.Disabled(Photo03)
名前の通りUSB 3.0の動作をとめるStateである。ただしこれはあくまでUSB 3.0での動作のみをとめるのであって、USB 1.1/2.0での通信には影響しない事になる。もっとも、そうは言っても実際にはデバイスの動作に多少の影響は及ぼされることになるのだが。
SS.Disabledに入ると、まずSelf-powered UPSはLogical power-off状態になる。また、USB HubなどDPSを持つデバイスの場合も、自動的にそのDPSはSS.Disabled状態に入ることになる。SS.Disabledにはデバイス側の要因で遷移することも出来るし、VBUSの供給に異常が発生した場合も自動的にここに遷移する事になっている。ちなみにLFPSでLink Training中のPortの状態もまたSS.Disabledとされている。
SS.Disabledから抜けるのは、USB 2.0 HubがResetしたかVBUSの供給が正常になった場合、もしくはDisabled状態からの復帰が指示された場合である。SS.DisabledにはSubStateはなく、このためRx.Detected状態にそのまま推移することになる。
- SS.Inactive(Photo04)
SS.Inactiveは殆ど全ての状態で「やり直し」をするためのStateである。ちょっとPhoto02だと判りにくいかもしれないが、RecoveryとかHot Reset/Loopback、U0/U1などのStateでTimeoutが発生した場合、無条件でSS.Inactiveに入ることになる。Timeout、というのは物理的に配線が切られた場合もあれば、何らかの事情でプロトコルのハンドシェイクに失敗した場合もあるだろうし、要するに何かしらエラーがあった場合は最終的にTimeoutとして見做されることになるからだ。こうした場合にUSB 3.0のやり直しを行う前の段階がSS.Inactiveである。
SS.InactiveにはSS.Inactive.QuietとSS.Inactive.Disconnect.Detectの2つがある。前者は内部に12msのタイマーを持っており、要するに12msの間何もせずに待機している。要するに一時的なノイズなどでプロトコルエラーが起きたのであれば、すぐにやり直しても影響がまだ残ってる可能性があるので、「ちょっと待て」というわけだ。後者は信号の状態を確認し、相手がDisconnect状態にあるかどうかを検出する。ここで、
- 相手が存在し、しかも通信可能状態でDisconnectならばWarm Resetに移る
- 相手が存在しない、あるいは通信不能状態ならば待機
といった形になる。要は通信相手がいないとか、居てもLow Power StateでLinkを落として待機中ならば、こちらもLinkを落とした状態を継続するという話だ。ただSS.Disabledまで落としてしまうと今度は復活できなくなるので、定期的に監視できるように12msのタマーをかけているというわけだ。
(続く)