前回に引き続き、6種類のLMPの詳細を見てみたい。

Port Configuration(Photo01)

Photo01: SubTypeの後に7bitのLink Speed Fieldが設けられただけ。

こちらはDownstream Portが受信するもので、内容はPort Capabilityに限りなく近いが、Link SpeedのFieldしか持たないところがちょっと異なる。Fieldは0bit目=1であることが求められ、この場合には5Gbpsの転送速度をサポートする意味となる。

このパケットはUpstream PortからDownstream Portに送られるもので、これを受け取ったDownstream Portは通信速度を5GT/sにセットする。現状では何の意味も無いLMPだが、SpecificationによればtPortConfiguration timeの時間間隔内にこのLMPを受け取らなかった場合、Upstream Portは自身を一度SS.Disabledに移行させ、ついで別の速度(といっても現状では5GT/sのみだが)に変更して再度接続を開始することになっている。つまり今後、USB 3.xか4.xかで複数の転送速度がサポートされた場合、恐らくは転送速度の速い順にこれを使って速度の確認を行ってゆき、Linkの両側のPortが共に動作する速度になったところでConfiguration成立、といったハンドシェイクが行われると思われ、そのためのパケットをあらかじめ用意しているというわけだ。

Port Configuration Responce(Photo02)

Photo02: Field名はResponse Codeになるが、内容はPort Configurrationと同じ。

Port Configuration LMPを受け取ったDownstream Portは、その返答をこちらのLMPでUpstream側に送り返す。現状では5GT/sで通信することを返すだけだが、将来のバージョンでは実際に通信を行う速度にあわせたbitを立てるのか、もしくはDownstream Portがサポートするスピードを全て返す(これはLink Speed/Responce Codeのフィールドが将来どんな形に拡張されるか次第だろう)形になると思われる。とりあえず現状では、このLMPがUpstream側に返されることで、Linkの速度が決まる形になる。

では具体的にこれらのLMPを使い、どんな感じにハンドシェイクが行われるか、を示したのがこちらである(Photo03)。PollingからLink Trainingを経てU0になった状態では、まず最初にPort Capability LMPを相互に送りあう。これにより、お互いに通信可能状態に入るわけだ。もしここでどちらのPortもBi-Directionaをサポートする場合は、TieBreakerを使って通信方向を決めるという話は前回紹介した通りである。また現在はLink Speedが5GT/sのみだが、将来はここで複数の速度がラインナップされるか、もしくはもっとも高速な転送速度をお互いに送りあう形になると思われる。これを受けて、Upstream Port側はPort Configuration LMPを使い、相互に利用する通信速度をDownstream Port側に通知する(ちなみに図のPacket 26ではなぜかDirectionのFieldが設けられているが、Specificationを見る限りこのFieldは存在しない。まぁこれを送れるという事自体がDirectionを示しているともいえるのだが)。これを正常に受け取ったDownstream Portは(受信通知をLink Commandを使って送出後に)Port Configuration Responce LMPを使い、これを確認するというわけだ。(Packet 27でSpeed以外にTypeが設けられているのは、仕様上はPort Configuration Responce LMPを使い、「その速度を拒否する」事が可能なためである(つまりTypeとしてAcceptとRejectが将来は提供される事が想定されている)。ただ現実問題として現状ではSpeedが1種類しかないので、拒否はありえないのだが。

Photo03: まずお互いにLink Commandを送りあって通信可能状態にあることを確認してから、LMPの通信に移る。勿論LMPの通信毎にLink Commandも送信されることになる。最初にLGOOD_7を送りあうことで、Port Capability LMP以降の通信が0からスタートするのはちょっと面白い。

ちなみにどちらのPortもBi-Directionalだった場合のハンドシェイクがこちら(Photo04)である。この場合、Port Capability LMPの値をお互いに交換することで、SSTx側は自身で4を持ち、相手から7が来ることで、相手のほうが大きいと判断できる。SSRxも同じ事を行い、自身の方が大きな値だと判断し、ここで一意に方向が決まる形となる。

Photo04: ここでは、最初のPort Capability LMPの交換ではTiebreakerの値がどちらも9なので、ここの時点ではUpstream/Downstreamの分担がきめられないでいる。このため、もう一度Port Capability LMPをお互いに送りなおし、今度はTiebreakerの値が異なるということでUpstream/Downstreamの分担が決まったという流れになる。

(続く)