正常なPacketの場合はこれでいいとして、次は問題があった場合である。勿論CRCのエラーなどがあった場合は、そのままエラーとしてハンドリングすればいいわけだが(Photo01)、Packetは正常ながらRouting先がLow Power Link Stateにいた場合が問題である。具体的にはU1とかU2あたりであろう。この場合、HubはDownstream PortがU0になるまでBufferにPacketを留保して待機し、U0になったらそのPacketを送り出すことになる。但し、U1なりU2なりからU0に戻るまでにそれなりの時間を要しているため、Hubはここでdeferred flagを立てると共に、Deferredが発生したHub Depthを付け加える。当然こうなるとCRCの値は変わってくるので、これも計算しなおし、新しいCRCを入れる形になる。こうして変更したPacketをDownstream側にQueueingすると同時に、Upstream側にもDeferredを通知するHeaderを送出する形で、HostとDeviceの両方に通知を行うわけだ。最終的にこのシーケンスは、DeviceがU0に復帰してこのDeferred bitの立ったHeaderを受け取り、HostもまたTransactionがDeferredになったことで(DeviceのU0復帰を待って)Retryを掛ける、という形で収束することになる。

Photo01: Deferred Packetの処理。面白いのだが、Hostが自身でDeferredを管理することはなく、最小構成の場合でもRoot Hubがこれを担う事になる。

まぁ処理としてはこの程度の事で済むのだが、これに限らず前回紹介したPacket Insertionとか、そもそものRoutingに関わる処理そのものを、かなり迅速にやらないといけないというのがHubにおける最大の制約となる。そもそもHubを5段に積み重ね可能という互換性を保ちつつ、速度を10倍(しかもSerial Link)にしたら、当然Time Windowは1/10になる。おまけにIsochronous Timestampの仕組みを導入したために、ますますTime windowの幅が狭くなってしまった(Photo02)。前回SpacingのDelayの最大値が8nsという話をしたが、こうした個別のDelayではなく、全体としての伝達遅延を200nsに抑えろというのは、考えようによってはなかなか厳しい。最大5段のHub Stackingを前提にすると、Hub 1段(+配線)の遅延を40ns以内に抑えないといけないからだ。しかもRoutingはやや処理が遅いStore&Forwardが前提で、更に受信/送信側に4段づつのBufferがあり、これがFIFOとしてもランダムアクセス可能としても利用できないといけない。当然こうなると、結構なスピードで動作するSRAMセルをバッファに用意しなければ間に合わないし、そのハンドリングも結構大変だろう。なるほど簡単に書かれてはいるが、Deviceを作るより難しいのは間違いない。昨今ではUSB Host/DeviceのIPはかなり見かけるが、USB Hubに関しては殆どない(まぁ、IPで提供する意味も殆どないのだが)とか、USB Hubに関して真っ先に手を上げたのが(PCIe Switchなどでこのあたりのノウハウを蓄えている)TIだとかいうのも、うなづけるものがある。

Photo02: これは前回も説明した話である。Isochronous timestampだけは、もう少し遅延しても可能なメカニズムを考えるべきではなかったか? という気も。

ということで、やっとUSB 3.0のSpecificationの話を一通り終わったと思う。Specificationの方は、ほかにもまだInteroperability and Power Deliveryの話とか、Power Managementの話とかが示されているが、自分で実装するという開発者でなければあまり関係ない部分なので、ここでは割愛することにしたいと思う。

その代わり、といっては何だがUASPの話を最後に御紹介したいと思う。UASPはUSB Attached SCSI Protocolの略で、本来は名前の通りUSBにSCSIデバイスを繋げて使うためのプロトコルである。ただこのプロトコルを使ってHDDなどのストレージを接続するのが、USB 3.0では本命視されている。実際、昨年のSuperSpeed USB Developer Conference Tokyo 2009でもLucidPortほか数社が、UASPが有利という展示を行っていた

このUSB Attached SCSIは、例えばこういう製品とはちょっと(というか、大分)異なる。そもそもUSB Attached SCSIそのものが、実は現時点でもまだINCITS T10 Technical CommitteeでDraft状態にある(D2095:現時点の最新版は今年3月9日リリースのRevision 4)のだが、にも関わらずここで利用されるUSAPは既にRevision 1.0が2009年6月24日にリリースされているあたりがちょっと面白い。

(続く)