USB 3.0規範中譯本 第7章 鏈路層

原文地址 https://www.cnblogs.com/coryxie/p/3956329.html

本文爲CoryXie原創譯文,轉載及有任何問題請聯繫cory.xie#gmail.com

鏈路層具有維持鏈路連接性的責任,從而確保在兩個鏈路夥伴之間的成功數據傳輸。基於包(packets)和鏈路命令(link commands)定義了健壯的鏈路流程控制。數據包在鏈路層被準備好,攜帶數據和不同的信息在主機和設備之間傳輸。鏈路命令的定義是爲了鏈路夥伴兩者之間的通信。包幀(Packet frame)有序集(ordered sets)和鏈路命令有序集也被構造得可以容忍一個符號錯誤。此外,錯誤檢測也被融入數據包和鏈接命令,用來驗證包和鏈路命令的完整性。在鏈路層也有鏈路訓練,鏈路測試/調試,以及鏈路電源管理。 這是通過引入鏈路訓練狀況狀態機【Link Training Status State Machine(LTSSM)】而得以實現的。 本章的重點是解決以下幾個問題:

  • 包分幀(Packet Framing)
  • 鏈路命令定義和用法(Link command definition and usage)
  • 鏈路初始化和流程控制(Link initialization and flow control)
  • 鏈路電源管理(Link power management)
  • 鏈路錯誤規則和恢復(Link error rules/recovery)
  • 復位(Resets)
  • LTSSM規範(LTSSM specifications)

7.1 字節序 【Byte Ordering】

包或鏈路命令的多字節字段以小端(little-endian)順序在總線上搬移, 即最低有效字節(LSB)最先傳輸,最高有效字節(MSB)最後傳輸。圖7-2顯示了一個字節序的例子。

數據包或鏈路命令的每一個字節都要在物理層使用的8B/10B編碼進行編碼。請參閱第6.3節關於8b/10b編碼和位序的介紹。

 

7.2 鏈路管理和流程控制 【Link Management and Flow Control】

本節包含有關鏈路數據完整性,流程控制和鏈路電源管理的信息。

  • 包和包分幀【packet and packet framing】一節定義每個數據包的包類型,包結構和CRC的要求。
  • 鏈路命令【link command】部分定義在鏈路層級上控制各種功能性的特殊鏈路命令。
  • 邏輯空閒【logical idle】定義了一個特殊的符號供U0使用。
  • 流程控制【flow control】定義了用於包事務的一組握手規則。

7.2.1 包和包分幀 【Packets and Packet Framing】

超高速使用數據包來傳輸信息。詳細的鏈路管理包(LMP),事務包(TP),等時時間戳包(ITP),以及數據包(DP)等包格式被定義在8.2節。

7.2.1.1 頭包結構 【Header Packet Structure】

所有的頭包(header packets)都是20個符號長,如圖7-3的格式。這包括LMPs, TPs, ITPs, 以及DPHs。頭包包括3個部分,一個頭包分幀符號(header packet framing),一個包頭(packet header),以及一個鏈路控制字(Link Control Word)。

7.2.1.1.1 頭包分幀符號 【Header Packet Framing】

頭包分幀符號(header packet framing),HPSTART有續集,是一個基於K-符號(K-symbols)的4個符號的頭包起始幀有續集(header packet starting frame ordered set)。它定義爲3個連續的SHP後面緊跟一個K-符號EPF。一個頭包應該總是以HPSTART有續集開始。頭包分幀符號(header packet framing)的構造是爲了達到1個符號的容錯性(error tolerance)。

7.2.1.1.2 包頭 【Packet Header】

一個包頭包含如圖7-4格式的14字節。它包括12字節頭信息以及2字節CRC-16。CRC-16用來保護該12字節頭信息的數據完整性。

包頭的CRC-16的實現定義如下:

  • CRC-16多項式應該是100Bh。

注意:CRC-16多項式與USB 2.0使用的不相同。

  • CRC-16的初值應爲FFFFh。
  • CRC-16應該對所有的12字節的頭信息進行計算,不包含任何分幀符號。
  • CRC-16計算應該從字節0的比特0開始,並繼續到12個字節的每個的比特7。
  • CRC-16的餘數(remainder)應該被補償(complemented)。
  • CRC-16的殘差(residual)應該爲F6AAh。【譯註:校對概念的準確性!

注意:在接收端,CRC-16的餘數(remainder)加上偏移量FFFFh,會得到CRC-16的一個常量殘差(residual)F6AAh。

圖7-5顯示了CRC-16的餘數(remainder)的生成。輸出比特順序列出在表7-1中。

7.2.1.1.3 鏈路控制字 【Link Control Word】

2字節的鏈路控制字(Link Control Word)格式如圖7-6所示。它被用來對鏈路層和端到端兩者進行流程控制。

鏈路控制字(Link Control Word)應該包含一個3比特的頭序列號(Header Sequence Number),一個3比特保留字段,一個3比特集線器深度索引(Hub Depth Index),一個延遲標誌比特(Delayed bit (DL)),一個推後標誌比特(Deferred bit (DF)),以及一個5比特的CRC-5。

CRC-5保護流程控制字的數據完整性。CRC-5的實現定義如下:

  • CRC-5多項式應該是00101b。
  • CRC-5的初值應爲11111b。
  • CRC-5是對流程控制字的其餘11比特進行計算。
  • CRC-5計算應該從比特0開始,並繼續到比特10。
  • CRC-5的餘數(remainder)應該被補償(complemented),將流程控制字的MSb映射到比特11,下一個MSb映射到比特12,如此下去,直到LSb被映射到比特15。
  • CRC-5的殘差(residual)應該爲01100b。【譯註:校對概念的準確性!

注意:在接收端,CRC-5的餘數(remainder)加上偏移量11111b,會得到CRC-5的一個常量殘差(residual)01100b。

圖7-7顯示了CRC-5的餘數(remainder)的生成。

7.2.1.2 數據包負載結構 【Data Packet Payload Structure】

數據包是特殊類型的包,由數據包頭【Data Packet Header (DPH)】以及數據包負載【Data Packet Payload (DPP)】組成。DPH定義在7.2.1.1節。而另一方面,DPP則由數據包負載分幀符號(data packet payload framing),以及可變長度的數據,緊跟4字節的CRC-32組成。圖7-8描述了DPP的格式。

7.2.1.2.1 數據包負載分幀符號 【Data Packet Payload Framing】

DPP分幀符號包含8個K-符號,一個4符號的DPP起始幀有續集(DPP starting frame ordered set),以及一個4符號的結束幀有續集(ending frame ordered set)。正如圖7-8所示,一個DPPSTART有續集,實際上是一個DPP起始幀有續集(DPP starting frame ordered set),包含3個連續的K符號SDP,緊跟一個K符號EPF。第二種類型,DPPABORT有續集,是一個DPP中止幀有續集(DPP aborting frame ordered set),包含2個連續的K-符號EDB(無效包結束,end of nullified packet),緊跟一個K-符號的EPF。DPPEND有續集用來指示一個常規的完整DPP的結束。DPPABORT有續集用來指示DPP的不正常結束。

7.2.1.2.2 數據包負載 【Data Packet Payload】

DPP部分包含0到1024數據字節,緊跟4字節的CRC-32。任何的提前中止DPP都應該包含一個DPPABORT有續集。DPP應該緊跟在其相應的DPH後面,中間不能有間隙。

CRC-32保護數據負載的數據完整性。CRC-32的實現定義如下:

  • CRC-32多項式應該是04C1 1DB7h。
  • CRC-32的初值應爲FFFF FFFFh。
  • CRC-32是對DPP的所有字節進行計算,不包括任何包的分幀符號。
  • CRC-32計算應該從字節0的比特0開始,並繼續到每個DPP字節的比特7。
  • CRC-32的餘數(remainder)應該被補償(complemented)。
  • CRC-32的殘差(residual)應該爲C704DD7Bh。【譯註:校對概念的準確性!

注意:在接收端,CRC-32的餘數(remainder)加上偏移量FFFF FFFFh,會得到CRC-32的一個常量殘差(residual)C704DD7Bh。

圖7-9說明了CRC-32餘數的生成。輸出比特順序列於表7-2中。

7.2.1.2.3 數據包頭和數據包負載之間的間隙【Spacing Between Data Packet Header and Data Packet Payload】

在數據包頭(DPH)和其相應的數據包負載(DPP)之間不應該有任何間隙。這顯示在圖7-10中。

在第7.2.4節將描述關於如何在鏈路層傳送和接收頭包的更多細節。

7.2.2 鏈路命令【Link Commands】

鏈路命令用於鏈路層的數據完整性,流程控制和鏈路電源管理。鏈路命令具有固定的8個符號長,幷包含重複的符號來增加容錯性。參考第7.3節更多細節。鏈路命令名稱具有L-前綴,以便區分其是用於鏈路層的,並避免與包相沖突。

7.2.2.1 鏈路命令結構【Link Command Structure】

鏈路命令應該是8個符號長,並使用下面圖7-11的格式構建。首先的4個符號,LCSTART,是鏈路命令起始幀有續集(link command starting frame ordered set),由3個連續的SLC緊跟EPF組成。其次的4個符號由一個兩個符號的鏈路命令字(link command word)和其複製品(replica)組成。兩個鏈路命令字都被加擾了(scrambled)。表7-3總結了,鏈路命令結構。

7.2.2.2 鏈路命令字定義【Link Command Word Definition】

鏈路命令字(Link command word)共16比特長,具有被5比特CRC-5(見圖7-12)保護的11比特鏈路命令信息。11比特鏈路命令信息定義於表7-4。CRC-5的計算與圖7-6中顯示的鏈路控制字(Link Control Word)相同。

鏈路命令被定義用於4種使用方式。第一,鏈路命令被用於確保包的成功傳輸。第二,鏈路命令被用於鏈路流程控制(link flow control)。第三,鏈路命令被用於電源管理。最後,一個特殊的鏈路命令被定義用於上游面端口在U0下展示其存在(an upstream port to signal its presence in U0)。

鏈路夥伴之間的成功頭包事務要求恰當的頭包確認(header packet acknowledgement)。Rx頭包緩衝信用交換(Rx Header Buffer Credit exchange)有益於鏈路流程控制。頭包確認和Rx頭包緩衝信用交換由不同的鏈路命令來實現。LGOOD_n (n = 0 to 7) 和 LBAD被用於確認一個頭包是否已經被恰當接收。LRTY被用於通知頭包已經被重傳(re-sent)。 LCRD_A, LCRD_B, LCRD_C, 以及LCRD_D被用於通知Rx Header Buffers已經可用,按信用而言(terms of Credit)。在下面的小節中,使用LCRD_x,其中x指代A, B,C, 或者D。參見表7-5的詳情。

LGOOD_n使用一個明確的叫做頭包序列號(Header Sequence Number)的數字索引來表示頭包的順序。頭包序列號(Header Sequence Number)以0開始,並且每個頭包都基於模8加法(modulo-8 addition)增加1。索引相應於接收到的頭包序列號(Header Sequence Number),用於流程控制以及檢測丟失或者破損的頭包。

LCRD_x使用明確的以字母順序的索引(alphabetical index)。索引A, B, C, D, A, B, C…在每個頭包被處理並且Rx頭包緩衝信用(Rx Header Buffer Credit)可用時被遞增1。該索引用於確保Rx頭包緩衝信用(Rx Header Buffer Credit)被按照順序接收到,這樣丟失一個LCRD_x就可以被檢測出來。

LBAD 以及 LRTY 不使用索引。

LGO_U1, LGO_U2, LGO_U3, LAU, LXU, 以及LPMA是用於鏈路電源管理的鏈路命令。

LUP是一個特殊的鏈路命令,被上游面端口用於在U0時指示其端口的存在。關於LUP的使用在表7-5中描述。

更多的關於使用鏈路命令的要求和示例可以在第7.2.4節找到。

Table 7-5. Link Command Definitions

 

鏈路命令

定義見第7.2.4.1, 7.2.4.2, 以及7.5.6節中詳細的使用和要求

LGOOD_n

n (0, 1, 2, ....7 ):頭包序列號(Header Sequence Number

 

由接收到頭包的端口在下列所有條件都是真時發送:

頭包具有有效的結構並可以被接收器識別。

• CRC-5 CRC-16 都有效。

接收到的頭包中的頭包序列號(Header Sequence Number)與所期望的Rx頭包序列號(Rx Header Sequence Number)匹配。

在接收器端具有Rx頭包緩衝(Rx Header Buffer)可用來存儲接收到的頭包。

 

接收到的頭包中的頭包序列號(Header Sequence Number)與所期望的Rx頭包序列號(Rx Header Sequence Number)不匹配將會導致端口轉換進入Recovery

 

由發送頭包的端口所接收到。這是從鏈路夥伴來的對具有頭包序列號(Header Sequence Number)爲"n"的頭包已經被恰當接收到的確認。接收到LGOOD_n而不匹配所期望的ACK Tx頭包序列號(ACK Tx Header Sequence Number)將會導致端口轉換進入Recovery

 

也可以被端口在進入U0時發送,作爲頭包序列號廣告(Header Sequence Number Advertisement)來初始化兩個端口的ACK Tx頭包序列號(ACK Tx Header Sequence Number)

 

參考第7.2.4.1節中的詳情。

LBAD

不好的頭包(Bad header packet)。

 

由接收頭包的端口在響應無效頭包時發送。接收到的包的CRC-5/CRC-16被損壞。接收到LBAD 將導致端口重新發送在最後一次被LGOOD_n確認之後的所有的頭包。

 

參考第7.2.4.1節中的詳情。

 

LCRD_x

x (A, B, C, D)Rx頭包緩衝信用索引(Rx Header Buffer Credit Index)。

 

通知一個Rx頭包緩衝信用(Rx Header Buffer Credit)已經可用。

 

由端口在接收到滿足下面情形的頭包時發送:

• LGOOD_n已經被或者即將被髮送【已勘誤】

頭包已經被處理,並且Rx Header Buffer Credit 已經可用。

 

LCRD_x 按照字母順序發送,並且繞回到A,沒有跳躍。丟失LCRD_x 將會導致鏈路轉換進入Recovery

 

參考第7.2.4.1節中的詳情。

LRTY

由端口在響應接收到的LBAD而重新發送第一個頭包之前發送。

LGO_U1

由請求進入U1的端口發送。

LGO_U2

由請求進入U2的端口發送。

LGO_U3

由請求進入U3的下游面端口發送。上游面端口應該接受該請求。

LAU

由接受進入U1U2或者U3的端口發送。

LXU

由拒絕進入U1U2的端口發送。

LPMA

由端口在接收到LAU時發送。用來配合(in conjunction withLGO_Ux以及LAU握手來保證兩個端口都處於相同狀態。

LUP

設備在U0時存在。由上游面端口在沒有包或者其他鏈路命令要被傳輸時,每隔10 μs 發送一次。參考7.5.6.1節中的詳情。

7.2.2.3 鏈路命令的放置【Link Command Placement】

鏈路命令的放置應該滿足下面的規則:

• 鏈路命令不應該被放置在頭包結構內部(例如, 在LMPs, TPs, ITPs, 或者DPHs內部)。

• 鏈路命令不應該被放置在DP結構的DPP內部。
• 鏈路命令不應該被放置在DPH和DPP之間。

• 鏈路命令可以被放置在頭包之前或者之後,除了不能被放置在DPH和DPP之間例外。

• 多個鏈路命令被允許背靠背(back to back)傳輸。

• 鏈路命令不能在所有已經調度的SKP有續集被全部傳完之前被髮送。

注意:在第10.7.5到10.7.12節中可以找到關於調度鏈路命令的更多規則。

7.2.3 邏輯空閒【Logical Idle】

邏輯空閒(Logical Idle)定義爲一段長爲一個或者多個符號週期的時間,期間沒有信息(包或鏈路命令)正被在鏈路上傳輸。一個特殊D-符號(00h),定義爲空閒符號【Idle Symbol (IS)】,只要在U0狀態任何時間滿足邏輯空閒定義,就應該被端口傳送。該IS應該被按照第6.4.3節定義的規則加擾。

7.2.4 鏈路命令用於流程控制,錯誤恢復以及電源管理

鏈路命令被用於鏈路層的頭包流程控制(flow control),來識別丟失或者損壞的頭包,併發起/確認鏈路層的電源管理的轉換。每個鏈路命令的構造和描述在第7.2.2節中可以找到。

7.2.4.1 頭包鏈路控制和錯誤恢復【Header Packet Flow Control and Error Recovery】

頭包鏈路控制(Header packet flow control)被用於所有的頭包。它要求鏈路的每端都遵循特定的頭包緩衝和傳輸順序的限制(specific header buffer and transmission ordering constraints),以保證包的成功傳輸和鏈路互操作。本節詳細地描述包流程控制(packet flow control)的規則。

7.2.4.1.1 初始化【Initialization】

鏈路初始化(link initialization)是指一旦鏈路從Polling,Recovery,或者Hot Reset轉換進入U0時對端口的初始化。該初始化包括在兩個端口之間(在能夠傳送包之前)進行頭包序列號宣告(Header Sequence Number Advertisement)以及Rx頭包緩衝信用宣告(Rx Header Buffer Credit Advertisement)。

• 下面的要求應該被應用於端口:

1. 端口應該維護兩個Tx Header Sequence Numbers。一個是Tx Header Sequence Number,定義爲當一個頭包被首次傳送時(不是重傳)被指派給頭包的Header Sequence Number。另一個是ACK Tx Header Sequence Number,定義爲將要被接收到頭包的端口使用LGOOD_n確認時所期望的Header Sequence Number。

2. 端口應該有一個Rx Header Sequence Number,定義爲當端口接收一個頭包時所期望的Header Sequence Number。

3. 端口應該維護兩個Rx Header Buffer Credit Counts。一個是Local Rx Header Buffer Credit Count,定義爲其接收器可用的Rx Header Buffer Credits的個數。另一個是Remote Rx Header Buffer Credit Count,定義爲其鏈路夥伴的可用Rx Header Buffer Credits的個數。

4. 端口應該有足夠的Tx Header Buffers在其發射器中,以便能保持達4個未被確認的頭包(unacknowledged header packets)。

5. 如果其Remote Rx Header Buffer Credit Count爲0,則端口不應該傳送任何頭包。

6. 端口應該有足夠的Rx Header Buffers在其接收器中,以便能接收達4個頭包。

7. 當進入U0時,應該按順序執行如下動作:

a. 端口應該啓動一個PENDING_HP_TIMER和CREDIT_HP_TIMER,以期待Header Sequence Number Advertisement以及Rx Header Buffer Credit Advertisement。

b. 端口應該啓動Header Sequence Number Advertisement。

c. 端口應該啓動Rx Header Buffer Credit Advertisement。

Header Sequence Number Advertisement是指ACK Tx Header Sequence Number的初始化,通過在兩個端口之間交換 Header Sequence Numbers來完成。這個Header Sequence Number是該端口在上一次恰當接收到的頭包的Header Sequence Number。Header Sequence Number Advertisement的主要目的是在Recovery前後維持鏈路流程(link flow),以便再次進入U0的端口知道在Recovery之前成功被髮送的頭包,並決定在其Tx Header Buffers中哪些頭包可以被清空(flushed)或者被重傳。在Header Sequence Number Advertisement中應該適用如下規則:

1. 端口應該按照如下定義來設置其初始Rx Header Sequence Number:

a. 如果端口是從Polling或Hot Reset進入U0,則Rx Header Sequence Number爲0。

b. 如果端口從Recovery進入U0,則Rx Header Sequence Number是期待的下一個頭包的Header Sequence Number。

2. 端口應該按照如下定義來設置其初始Tx Header Sequence Number:

a. 如果端口是從Polling或Hot Reset進入U0,則Tx Header Sequence Number爲0。

b. 如果端口從Recovery進入U0,則Tx Header Sequence Number與Recovery之前的Tx Header Sequence Number相同。

注意:被重傳的頭包應該維持其原先被指派的Header Sequence Number。

3. 端口應該通過傳送LGOOD_n ("n"等於Rx Header Sequence Number減1)來啓動Header Sequence Number Advertisement。

注意:遞減是基於模8操作。

4. 端口應該設置其初始ACK Tx Header Sequence Number等於在Rx Header Sequence Number Advertisement中接收到的Sequence Number加上1。

注意:遞增是基於模8操作。

5. 直到接收到了Header Sequence Number Advertisement,並且有一個Remote Rx Header Buffer Credit可用之前,端口不能發送任何頭包。

6. 端口在接收以及發送Header Sequence Number Advertisement之前,不應該請求低功耗鏈路狀態的進入(low power link state entry)。

注意:關於低功耗鏈路狀態的發起(Low Power Link State Initiation)的規則依然適用(參考第7.2.4.2節)。

7. 當接收到Header Sequence Number Advertisement時,端口應該清空(flush)其Tx Header Buffers中的頭包。端口應該執行下列之一:

a. 如果端口是從Polling或Hot Reset進入U0,它應該清空(flush)其Tx Header Buffers中的所有頭包。

b. 如果端口從Recovery進入U0, 它應該清空(flush)其Tx Header Buffers中在Recovery之前已經發送過的所有頭包,除了其中的Header Sequence Number大於(模8)Header Sequence Number Advertisement中所接收到的Header Sequence Number的那些頭包。

注意:舉例,如果接收到爲LGOOD_1的Header Sequence Number Advertisement,端口應該清空(flush)其Tx Header Buffers中的Header Sequence Numbers爲1, 0, 7, 6的頭包。

Rx Header Buffer Credit Advertisement是指Remote Rx Header Buffer Credit Count的初始化,通過在兩個端口之間交換可用的Local Rx Header Buffer Credits的個數而完成。這一宣告的主要目的是讓端口在進入U0時使其Remote Rx

Header Buffer Credit Count與其鏈路夥伴一致。在Rx Header Buffer Credit Advertisement期間,適用於下面的規則:

1. 在Header Sequence Number Advertisement期間,端口應該在發送LGOOD_n之後,發起Rx Header Buffer Credit Advertisement【已勘誤】。

2. 在發送Rx Header Buffer Credit之前,端口應做如下初始化:

a. 端口應該初始化其Tx Header Buffer Credit index 爲 A.

b. 端口應該初始化其Rx Header Buffer Credit index 爲 A.

c. 端口應該初始化其Remote Rx Header Buffer Credit Count 爲 0.

d. 端口應該繼續處理在Rx Header Buffers中的頭包(這些頭包已經在進入Recovery之前被用LGOOD_n確認,或者在Recovery期間被驗證爲有效),並更新Local Rx Header Buffer Credit Count。

e. 端口應按如下定義設置其Local Rx Header Buffer Credit Count:

1. 如果端口是從Polling或Hot Reset進入U0,則其Local Rx Header Buffer Credit Count爲4。

2. 如果端口從Recovery進入U0,則其Local Rx Header Buffer Credit Count是可以用於容納輸入頭包的Rx Header Buffers的個數。

3. 端口應該通過傳輸LCRD_x來執行Rx Header Buffer Credit Advertisement來通知其鏈路夥伴。端口應該基於其

Local Rx Header Buffer Credit Count來做如下傳送:

a. 如果Local Rx Header Buffer Credit Count是1, 則傳送LCRD_A。

b. 如果Local Rx Header Buffer Credit Count是2, 則傳送LCRD_A和LCRD_B。

c. 如果Local Rx Header Buffer Credit Count是3, 則傳送LCRD_A,LCRD_B和LCRD_C。

d. 如果Local Rx Header Buffer Credit Count是4, 則傳送LCRD_A,LCRD_B,LCRD_C和LCRD_D。

4. 從其鏈路夥伴處接收LCRD_x的端口應該在每次接收到LCRD_x時,將其Remote Rx Header Buffer Credit Count增加1,直到4。

5. 如果其Remote Rx Header Buffer Credit Count爲0,端口不應該傳送任何頭包。

6. 在Rx Header Buffer Credit Advertisement期間,在接收和發送LCRD_x之前,端口不應該請求低功耗鏈路狀態的進入(low power link state entry)。

注意:低功耗鏈路狀態的發起(Low Power Link State Initiation)規則(參考第7.2.4.2節)依然適用。

• 當端口從Recovery進入U0時,下面的附加規則應該被應用於端口:

1. 在Recovery之前發送了LBAD的端口,不應期望(shall not expect)在進入U0時能在一個被重試的頭包之前接收到LRTY。

2. 在Recovery之前接收到LBAD的端口,不應該在進入U0時在發送被重試的頭包之前發送LRTY。

注意:存在一種情形,一個端口在Recovery之前發送了一個LBAD,但是它可能會,也可能不會被其鏈路夥伴接收到。在這種情形下,LBAD/LRTY的規則就不適用。參考第7.2.4.1.4節和第7.2.4.1.9節的詳情。

3. 上行端口可以在鏈路初始化期間發送LUP。

• 一旦進入Recovery,而下一個狀態是Hot Reset 或者 Loopback,端口可以可選地繼續處理被恰當接收到的所有包。

7.2.4.1.2 LGOOD_n和LCRD_x用法的總體規則

Rx Header Buffer Credit應該以字母順序被傳送,LCRD_A,LCRD_B,LCRD_C,LCRD_D,然後返回到LCRD_A。沒有按照字母順序接收到LCRD_x被認爲是丟失了鏈路命令,應該啓動轉換到Recovery。

• 頭包應該以Header Sequence Number的數字順序發送,從0到7,並返回到0。沒有按照數字順序接收到LGOOD_n被認爲是丟失了鏈路命令,應該啓動轉換到Recovery。

• 頭包的傳送可以被延遲(delayed)。當這發生時,集線器應該將鏈路控制字(Link Control Word)的DL位置位(外圍設備或者主機可選)。一些(但不一定是全部)可能導致這一延遲的條件如下:

1. 當頭包被重新發送(resent)。

2. 當鏈路處於Recovery。

3. 當Remote Rx Header Buffer Credit Count爲0。

4. 當Tx Header Buffer非空。

注意:延遲(delayed)位(DL位)只有在ITP中被設置時纔有影響(significance)。如果設備使用ITP來同步其內部時鐘,則它應該忽略延遲(delayed)位(DL位)被設置的所有ITPs【已勘誤】

7.2.4.1.3 發送頭包【Transmitting Header Packets】

• 在發送一個頭包之前,端口應該相應於鏈路控制字(Link Control Word)的Header Sequence Number字段來增加Tx Header Sequence Number。

• 傳送一個頭包將消耗一個Tx Header Buffer。相應地,在傳送完畢後,Tx Header Sequence Number應該被加1,或者在已經達到最大Header Sequence Number時回滾到0。

• 傳送一個被重試的頭包不會消耗附加的Tx Header Buffer,且Tx Header Sequence Number應該保持不變。

• 當接收到LBAD時,端口應該發送LRTY,緊跟着再重傳還沒有被LGOOD_n確認的所有頭包,除了Recovery之外。參考第7.2.4.1.1節關於端口從Recovery進入U0時可適用的更多規則。

• 在重傳頭包之前,端口應該設置鏈路控制字(Link Control Word)中的Delay位(DL位),並重新計算CRC-5。

注意:頭包中的CRC-16保持不變。

• 如果接收到了有效的LCRD_x,則Remote Rx Header Buffer Credit Count應該增加1。

• 如果在進入U0後一個頭包被首次發送(包括在Recovery後被重傳),Remote Rx Header Buffer Credit Count應該被減1。

當頭包在LRTY後被重試時,Remote Rx Header Buffer Credit Count不應該被改變。

7.2.4.1.4 接收頭包【Receiving Header Packets】

• 當接收到頭包時,應該執行下列驗證:

1. CRC-5

2. CRC-16

3. 匹配接收到的頭包中的Header Sequence Number和Rx Header Sequence Number。

4. 用以存儲頭包的Rx Header Buffer的可用性

• 當上面描述的所有條件都通過時,頭包被定義爲"恰當接收(received properly)"。

• 當一個頭包被恰當接收時,端口應該發送一個LGOOD_n ,其中"n"相應於Rx Header Sequence Number,並將Rx Header Sequence Number遞增1(或者在達到最大Header Sequence Number時回滾至0)。

• 端口將消耗一個Rx Header Buffer,直到頭包被處理。

• 當頭包沒有被"恰當接收"時,下列之一將發生:

1. 如果頭包有一個或多個CRC-5或CRC-16錯誤,端口應該發出一個LBAD。端口應該忽略所有後續的頭包,直到接收到一個LRTY,或者鏈路已經進入Recovery。參考第7.2.4.1.1節關於端口從Recovery進入U0時可適用的更多規則。

2. 如果接收到的頭包中的Header Sequence Number和Rx Header Sequence Number不匹配,或者端口沒有可供用來存儲頭包的Rx Header Buffer,端口應該轉換到Recovery。

• 在傳送LBAD之後,如果有Rx Header Buffer Credit變得可用,端口應該繼續發送LCRD_x。

• 如果連續3次接收頭包失敗,端口應該直接轉換進入Recovery。端口在第3次錯誤時不應該發送第3個LBAD。

7.2.4.1.5 Rx頭包緩衝信用【Rx Header Buffer Credit】

每個端口都要求有4個Rx Header Buffer Credits在其接收器中。這是指Local Rx Header Buffer Credit。Local Rx Header Buffer Credits的個數代表端口能夠接受的頭包的個數,並由Local Rx Header Buffer Credit Count來管理。

• 如果一個頭包被"恰當接收",端口應該消耗一個Local Rx Header Buffer Credit。Local Rx Header Buffer Credit Count應該被遞減1。

• 當完成處理一個頭包,端口應該這樣恢復一個Local Rx Header Buffer Credit:

1. 發送一個LCRD_x

2. 以字母序步進Credit index(或者Header Buffer Credit index到達D時回滾至A)

3. 將Local Rx Header Buffer Credit Count遞增1。

注意:LCRD_x index被用來確保Rx Header Buffer Credits被以字母順序發送,從而丟失一個LCRD_x可以被檢測出來。

7.2.4.1.6 接收數據包負載【Receiving Data Packet Payload】

DPP的處理應該遵循如下規則:

• 如果滿足下列兩個條件,DPP應該被接受:

1. DPH被恰當接收。

2. DPPStart有序集緊跟其DPH之後被恰當接收。

• 當檢測到有效的DPPEND時,應該完成DPP處理。

• 當滿足下列條件時,DPP應該被中止:

1. 檢測到一個有效的DPPABORT有序集。

2. 在一個有效的DPPEND或DPPABORT有序集之前,檢測到一個既不屬於DPPEND也不屬於DPPABORT有序集的K-符號。端口應該忽略相應的與該DPP相關聯的DPPEND或DPPABORT有序集。

3. DPP長度已經超過sDataSymbolsBabble【已勘誤】 (見表10-15),並且還沒檢測到有效的DPPEND或DPPABORT有序集。

• 如果DPH被損壞了,DPP應該被丟掉。

• 當DPP沒有緊跟其DPH時,DPP應該被丟掉。

7.2.4.1.7 接收LGOOD_n 【Receiving LGOOD_n】

• 端口應該在其Tx Header Buffer 保持每一個被髮送過的頭包,直到它接收到一個LGOOD_n。當接收到一個LGOOD_n時,端口應該做如下事項:

1. 如果該LGOOD_n是Header Sequence Number Advertisement,並且端口是從Recovery進入U0,則端口應該清空Tx Header Buffers中所保持的Header Sequence Numbers小於或等於所接收到的Header Sequence Number的頭包,並且將其ACK Tx Header Sequence Number初始化成所接收到的Header Sequence Number加上1。

注意:比較和遞增是模8操作。

2. 如果端口接收到一個LGOOD_n,但是該LGOOD_n不是Header Sequence Number Advertisement,則它應該清空其Tx Header Buffer中Header Sequence Number與接收到的Header Sequence Number一致的頭包,並基於模8操作將ACK Tx Header Sequence Number遞增1。

3. 如果端口接收到一個LGOOD_n,但是該LGOOD_n不是Header Sequence Number Advertisement,如果接收到的如果端口接收到一個LGOOD_n,但是該LGOOD_n不是Header Sequence Number Advertisement不匹配ACK Tx Header Sequence Number,則端口應該轉換到Recovery。ACK Tx Header Sequence Number應該不變。

注意:接收到亂序的LGOOD_n意味着丟失或者損壞了鏈路命令,從而應該轉換進入Recovery。

7.2.4.1.8 接收LCRD_x 【Receiving LCRD_x】

• 端口應基於接收到的LCRD_x來調整其Remote Rx Header Buffer Credit Count:

1. 當接收到LCRD_x 時,端口應該將其Remote Rx Header Buffer Credit Count遞增1。

2. 如果接收到亂序的LCRD_x,端口應該轉換進入Recovery。

注意:接收到亂序的信用(credit)意味着丟失或者損壞了鏈路命令,從而應該轉換進入Recovery。

7.2.4.1.9 接收LBAD 【Receiving LBAD】

• 當接收到LBAD時,端口應該發送一個LRTY,緊跟着再重傳其Tx Header Buffers中還沒有被LGOOD_n確認的所有頭包。集線器應該在所有被重傳的頭包的鏈路控制字(Link Control Word)中設置DL位,並重算CRC-5。主機或者外圍設備可以可選地在所有被重傳的頭包的鏈路控制字(Link Control Word)中設置DL位,並重算CRC-5。如果被重傳的包是DP,並且其DL位是空的,則DPH後面應該緊跟一個DPP【已勘誤】。

注意:重傳ITP使得等時時間戳值無效(invalidates the isochronous timestamp value)。在被重傳的頭包中CRC-16不變。

• 在接收到LBAD時,如果在Tx Header Buffers中沒有未被確認的頭包,端口(依然)應該發送一個LRTY。

注意:這是一個錯誤情形,LBAD是由於鏈路錯誤而創建的。

7.2.4.1.10 發送器定時器【Transmitter Timers】

PENDING_HP_TIMER被指定用來覆蓋從一個頭包被髮送給鏈路夥伴到該頭包被鏈路夥伴確認的時間週期。該時間限制的目的是爲了允許端口檢測由其鏈路夥伴所發送的頭包確認(header packet acknowledgement)是否丟失了或者損壞了。PENDING_HP_TIMER的超時值被列於表7-7中。PENDING_HP_TIMER的操作應該基於以下規則:

• 端口應該只在U0期間並且下列條件其中之一被滿足時有一個活躍的PENDING_HP_TIMER:

1. 端口已經發送了一個頭包,但是還沒有被其鏈路夥伴確認 (除了在接收到LBAD之後到重傳Tx Header Buffer中最老的頭包之間的一段時間)。

2. 端口正在期待從其鏈路夥伴來的頭包序列號宣告(Header Sequence Number Advertisement)。

PENDING_HP_TIMER應該在下列條件之一被滿足時被啓動:

1. 當端口進入U0,期望頭包序列號宣告(Header Sequence Number Advertisement)。

2. 當一個頭包被髮送,並且Tx Header Buffers中之前沒有已經被髮送而沒被確認的頭包。

3. 當響應LBAD 而重傳最老的頭包(oldest header packet)時。

• 當一個頭包被LGOOD_n確認,而在Tx Header Buffers中還有已經被髮送而沒被確認的頭包時,PENDING_HP_TIMER應該被複位並重啓。

當下列條件之一被滿足時,PENDING_HP_TIMER應該被複位並停止:

1. 當接收到頭包序列號宣告(Header Sequence Number Advertisement)時。

2. 當一個頭包確認LGOOD_n被收到且Tx Header Buffers中所有已經發送的頭包都已經被確認時。

3. 當一個頭包確認LBAD被收到時。

• 如果下面兩個條件被滿足,則端口應該轉換到Recovery:

1. PENDING_HP_TIMER超時。

2. 向外的頭包(outgoing header packet)的傳輸被完成,或者向外的DPP(outgoing DPP)的傳輸要麼被DPPEND完成,要麼被DPPABORT終結。

注意: 這是爲了允許優雅的(graceful)轉換進入Recovery,而不會使得頭包被截斷(truncated)。

還指定了一個CREDIT_HP_TIMER,用來覆蓋當一個頭包已經被髮送且其遠端Rx頭包緩衝信用(Remote Rx Header Buffer Credit)的個數少於4,到接收到一個Remote Rx Header Buffer Credit,並且其Remote Rx Header Buffer Credit個數返回到4,之間的一段時間。這個定時器的目的是爲了確保一個Remote Rx Header Buffer Credit在合理的時間限度內被收到。這可以允許發送頭包的端口在一定的時間限度內回收(reclaim)一個Remote Rx Header Buffer Credit,以便可以繼續處理包傳輸。 這也可以允許一個接收頭包的端口由足夠的時間來處理頭包。CREDIT_HP_TIMER 的超時值被列於表7-7。CREDIT_HP_TIMER 的操作應該基於下面的規則:

  • 端口應該只在U0期間並且下列條件其中之一被滿足時有一個活躍的CREDIT_HP_TIMER:

1. 端口的Remote Rx Header Buffer Credit Count 小於4。

2. 端口正在期待來自其鏈路夥伴的Header Sequence Number Advertisement 和Rx Header Buffer Credit Advertisement。

當一個頭包或者被重試的頭包被髮送,或者端口進入U0時,CREDIT_HP_TIMER應該被啓動。

當有效的LCRD_x被接收到時,CREDIT_HP_TIMER應該被複位。

當有效的LCRD_x被接收到,並且Remote Rx Header Buffer Credit Count小於4時,CREDIT_HP_TIMER應該被重啓。

  • 如果下面兩個條件被滿足,則端口應該轉換到Recovery:

     

  1. CREDIT_HP_TIMER超時。

2. 向外的頭包(outgoing header packet)的傳輸被完成,或者向外的DPP(outgoing DPP)的傳輸要麼被DPPEND完成,要麼被DPPABORT終結。

注意: 這是爲了允許優雅的(graceful)轉換進入Recovery,而不會使得頭包被截斷(truncated)。

7.2.4.2 鏈路電源管理和流程【Link Power Management and Flow】

請求進入低功耗鏈路狀態是在U0期間完成的。鏈路命令LGO_U1, LGO_U2, 以及 LGO_U3被端口用來請求進入低功耗狀態。LAU 或者 LXU 由另一個端口發送來做出響應。LPMA僅由端口在響應LAU時發送。關於從低功耗狀態退出/喚醒的詳情在第7.5.7, 7.5.8, 以及 7.5.9節描述。

7.2.4.2.1 鏈路電源管理定時器【Link Power Management Timers】

端口應該具有3個定時器用於鏈路電源管理。首先,一個PM_LC_TIMER用於端口發起低功耗狀態的進入請求(entry request)。它被設計來確保及時進入低功耗鏈路狀態。其次,一個PM_ENTRY_TIMER端口接受該低功耗鏈路狀態的進入請求。它被設計來確保鏈路的兩個端口都處於相同的低功耗鏈路狀態,不論LAU或者LPMA丟失或損壞與否。最後,一個Ux_EXIT_TIMER被端口用來發起從U1或者U2退出。它被指定來確保U1或者U2退出的時間是有界限的(bounded),並且頭包傳輸的時延(latency)不被連累(compromised)。這3個定時器的超時值被指定在表7-8中。

端口應該基於下列規則操作定時器PM_LC_TIMER:

• 請求進入低功耗鏈路狀態的端口應在LGO_Ux鏈路命令的最後一個符號被髮送之後啓動PM_LC_TIMER。

• 一旦接收到LAU或者LXU,請求進入低功耗鏈路狀態的端口就應該禁止並復位PM_LC_TIMER。

端口應該基於下列規則操作定時器PM_ENTRY_TIMER:

• 接受進入低功耗鏈路狀態請求的端口應在LAU的最後一個符號被髮送之後啓動PM_ENTRY_TIMER。

• 一旦接收到LPMA或者TS1有序集,接受進入低功耗鏈路狀態請求的端口就應該禁止並復位PM_ENTRY_TIMER【已勘誤】

端口應該基於下列規則操作定時器Ux_EXIT_TIMER:

  • 發起U1或者U2退出的端口應在它開始發送LFPS退出握手信號(LFPS Exit handshake signal)的時候就啓動Ux_EXIT_TIMER。

     

  • 一旦進入U0,發起U1或者U2退出的端口應禁止並復位Ux_EXIT_TIMER。

 

7.2.4.2.2 低功耗鏈路狀態的發起【Low Power Link State Initiation】

• 除非滿足下列條件,端口不應該發送LGO_U1, LGO_U2或者LGO_U3。

  1. 它已經發送了所有接收到的頭包的LGOOD_n以及LCRD_x。

     

  2. 它已經接收到了所有已經發送的頭包的LGOOD_n以及LCRD_x。

注意: 這暗指在端口可以發起轉換到低功耗鏈路狀態之前,所有的信用(credits)都必須被接收到並返回。

  1. 它沒有等待傳輸的包。

4. 一旦進入U0,它已經完成Header Sequence Number Advertisement和Rx Header Buffer Credit Advertisement。

注意: 這暗指端口已經發送Header Sequence Number Advertisement和Rx Header Buffer Credit Advertisement給了其鏈路夥伴,並且從其鏈路夥伴接收到了Header Sequence Number Advertisement和Rx Header Buffer Credit Advertisement。

5. 由高層發起進入。高層指示鏈路層發起進入的例子包括:(a)U1或U2不活動定時器過期(參考第10章的PORT_U1_TIMEOUT, PORT_U2_TIMEOUT);(b) 接收到SetPortFeature(PORT_LINK_STATE)請求;(c)設備實現特定的機制。

6. 滿足高層發起進入的條件。例子包括:(a)U1_enable/U2_enable 被設置,或者U1_TIMEOUT/U2_TIMEOUT 非零;(b)設備接收到了此前已經發送了的每一個包的ACK TP;(c)設備沒有在PING後等待TP;(d)設備沒有在timestamp request之後等待一個timestamp (關於這些和其他例子,參考第8章)。

• 在響應接收到一個LGO_U1 or LGO_U2時,端口應該做以下事項之一:

1. 如果Force Link PM Accept字段由於已經接收到一個Set Link Functionality LMP而被設置,端口應該發送一個LAU。

  1. 如果下列所有條件都滿足,則端口應該發送一個LAU:

a. 對所有接收到的包,已經發送了LGOOD_n, LCRD_x序列。

b. 對所有已經發送了的包,接收到了LGOOD_n, LCRD_x序列。

c. 沒有等待發送的包。

d. 沒有被高層指示拒絕進入。高層可能指示拒絕進入的例子包括:(1)下行端口沒有被使能U1或U2(即,PORT_U1_TIMEOUT PORT_U2_TIMEOUT設爲0【已勘誤】;(2)當設備對此前傳送的包沒有接收到ACK TP (參考第8章);以及(3)當設備接收到一個Ping TP(參考第8章關於Ping包的定義)。

3. 如果任何上面的條件沒有被滿足,則端口應該發送一個LXU。

7.2.4.2.3 U1/U2進入流程【U1/U2 Entry Flow】

下行端口和上行端口都可以發起U1/U2的進入和退出。進入U1或U2低功耗鏈路狀態是通過使用表7-5定義的鏈路命令完成的。

• 端口應該發送一個LGO_U1或LGO_U2來請求轉換進入低功耗鏈路狀態。

• 當發送LGO_Ux時,端口應該啓動其PM_LC_TIMER。

• 端口應該使用一個LAU來接受LGO_Ux,或者應該使用一個LXU來拒絕LGO_U1或LGO_U2並保持在U0。

• 一旦發送了LGO_U1 or LGO_U2,端口不能發送任何包,直到接收到LXU或者重新進入U0。

• 當發送了LGO_U1 or LGO_U2,端口應該繼續接收並處理包和鏈路命令。

• 在接收到LXU時,端口應該保持在U0。

• 在PM_LC_TIMER過期時如果還沒收到一個LAU或者LXU,則端口應該啓動轉換進入Recovery。

• 一旦發送了LAU,端口應啓動PM_ENTRY_TIMER。

• 當接收到LAU時,端口應該發送一個LPMA並進入請求的低功耗狀態。

• 一旦發送了LAU or LPMA,端口不應該發送任何包和鏈路命令。

• 在PM_ENTRY_TIMER超時前接收到LPMA,則發送LAU的端口應該進入相應的低功耗鏈路狀態。

• 在PM_ENTRY_TIMER超時時,如果下列所有條件都滿足,則發送LAU的端口應該進入相應的低功耗鏈路狀態

1. 每收到LPMA。

2. 沒有收到TS1有序集。

注意:這意味着LPMA被損壞了,而發送LGO_Ux的端口已經進入Ux。

• 如果在PM_ENTRY_TIMER過期前接收到了TS1有序集,則發送了LAU的端口應該進入Recovery。

注意:這意味着LAU被損壞,而發送LGO_Ux的端口已經進入Recovery。

• 在PM_ENTRY_TIMER過期前,如果接收到了LFPS Ux_Exit信號,發送了LAU的端口不應該用Ux LFPS退出握手(定義於第6.9.2節)來響應。

注意:這意味着LPMA損壞了,而發送LGO_Ux的端口已經啓動了Ux exit。在此情形下,發送LAU的端口應該完成低功耗鏈路狀態的進入過程,接着響應Ux exit。

還存在一種情形,端口從U1直接轉換進入U2。

• 如果下列兩個條件滿足,則端口應該從U1直接進入U2:

1. 端口的U2不活動定時器(U2 inactivity timer)被使能了。

2. U2不活動定時器(U2 inactivity timer)超時,沒有接收到U1 LFPS退出信號。

7.2.4.2.4 U3 進入流程【U3 Entry Flow】

只有下行端口可以啓動進入U3。上行端口不能拒絕進入U3。

• 當被指示時,下行端口應該發送一個LGO_U3來啓動U3進入。

• 當發送LGO_U3時,下行端口應該啓動其PM_LC_TIMER。

• 端口應該發送LAU來響應下行端口的LGO_U3請求。

• 一旦發送了LAU之後,上行端口不能發送任何包和鏈路命令。

• 當發送了LGO_U3,下行端口應該忽略上行端口發送的任何包。

注意:這是一個邊角情形,上行端口在接收到LGO_U3之前正在發送頭包。

• 在接收到LGO_U3時,上行端口應該以LAU響應。對所有未被確認的包的處理應該被中止。

• 一旦發送了LAU,上行端口應啓動PM_ENTRY_TIMER。

• 當接收到LAU時,下行端口應該發送一個LPMA並轉換進入U3。

如果下列3個條件都滿足,下行端口應該轉換到Recovery,並在重新進入U0後重新啓動U3進入:

1. PM_LC_TIMER超時。

2. 沒有收到LAU。

3. 連續的U3進入的嘗試少於3。

• 當下列兩個條件之一滿足時,上行端口應該轉換進入U3:

1. 接收到了LPMA。

2. PM_ENTRY_TIMER超時但是沒有接收到LPMA。

• 當連續3次U3進入嘗試都失敗後,下行端口應該轉換進入SS.Inactive。

7.2.4.2.5 併發低功耗鏈路管理流程【Concurrent Low Power Link Management Flow】

併發低功耗鏈路管理流程(Concurrent low power link management flow)適用於當下行端口和上行端口兩者同時發起進入低功耗鏈路狀態請求的情形。

• 如果下行端口已經發送了LGO_U1, LGO_U2, or LGO_U3而又接收到了LGO_U1 or LGO_U2,則它應該發送一個LXU。

• 如果上行端口已經發送了LGO_U1 or LGO_U2而又接收到了LGO_U1, LGO_U2,則它應該等待直到接收到一個LXU併發送一個LAU 或 LXU。

• 如果上行端口已經發送了LGO_U1 or LGO_U2而又從下行端口接收到了LGO_U3,則它應該等待直到接收到一個LXU併發送一個LAU。

• 如果下行端口被高層指示要求啓動轉換到U3,而一個到U1或U2的轉換已經被髮起了但是還沒完成,則端口應該首先完成正在進行中的轉換到U1或U2,接着返回到U0並請求進入U3。

7.2.4.2.6 併發的低功耗鏈路管理和恢復流程【Concurrent Low Power Link Management and Recovery Flow】

併發的低功耗鏈路管理和恢復流程(Concurrent low power link management and Recovery flow)適用於一個端口發送了一個低功耗鏈路狀態的進入請求,而另一個端口發送了Recovery。發送低功耗鏈路狀態進入請求的端口應該滿足如下規則:

發送LGO_Ux後,如果接收到了TS1有序集,端口應該轉換進入Recovery。

• 當從Recovery再次進入U0後,如果進入低功耗鏈路狀態的條件仍然有效,端口應該重新發起如第7.2.4.2.3節和第7.2.4.2.4節描述的低功耗鏈路狀態的進入過程。

7.2.4.2.7 低功耗鏈路狀態退出流程【Low Power Link State Exit Flow】

退出低功耗鏈路狀態是指從U1/U2退出,或者從U3喚醒。它是通過第節定義的LFPS Exit信號完成的。成功的LFPS握手過程將引導下行端口和上行端口兩者都進入Recovery。

定義與第7.2.4.2.1節的Ux_EXIT_TIMER只適用於當端口嘗試從U1或U2退出的情形。它不應該被應用於當端口發起從U3喚醒的情形。

從U1/U2退出應該滿足下列流程。U3喚醒遵循想用的流程,只是Ux_EXIT_TIMER在U3喚醒期間是被禁止的。

• 如果端口正發起U1/U2 Exit,則它應該發送定義於第6.9.2節的U1/U2 LFPS Exit握手信號,並啓動Ux_EXIT_TIMER。

• 如果端口正發起U3喚醒,則它應該發送定義於第6.9.2節的U3 LFPS喚醒握手信號。

• 端口在接收到U1/U2 Exit或者U3喚醒LFPS握手信號時,應該通過響應第6.9.2節的U1/U2 LFPS Exit或U3 LFPS喚醒握手信號,來啓動U1/U2退出或者U3喚醒。

• 在tNoLFPSResponseTimeout(定義與表6-14)之前,成功的LFPS握手應該使端口轉換進入Recovery。

• 如果下列兩個條件之一滿足,則發起U1 or U2 Exit 的端口應該轉換進入SS.Inactive:

1. 在tNoLFPSResponseTimeout後而成功的LFPS握手的條件沒有被滿足。

2. 在Ux_EXIT_TIMER 超時,鏈路還沒轉換進入U0。

在tNoLFPSResponseTimeout後而成功的LFPS握手的條件沒有被滿足時,發起U3喚醒的端口應該保持在U3,並可以在100ms延遲之後再次發起U3喚醒。

• 不能在tNoLFPSResponseTimeout之內響應U3 LFPS喚醒的根端口,應該在它準備好返回到U0時發起U3 LFPS喚醒。

7.3 鏈路錯誤規則/恢復【Link Error Rules/Recovery】

7.3.1 超高速比特錯誤概覽【Overview of SuperSpeed Bit Errors】

超高速時序裕量(SuperSpeed timing budget)是基於鏈路的統計學隨機比特錯誤概率小於10-12而設。 包分幀(Packet framings)以及鏈路命令分幀(link command framing)能容忍1個符號錯誤。在鏈路流程控制下的比特錯誤檢測在第7.2.4節詳細描述。

7.3.2 鏈路錯誤類型,檢測和恢復【Link Error Types, Detection, and Recovery】

鏈路夥伴之間的數據傳輸時是以包的形式完成的。一組鏈路命令定義用來確保包成功地在鏈路上流動。其他鏈路命令也被用來管理鏈路連接性。當符號錯誤發生在鏈路上時,包和鏈路命令的完整性會被連累(compromised)。因此,不僅包和鏈路命令需要被構建來增加容錯性,而且鏈路數據完整性處理也需要被指定,從而可能會無效或者損壞包或鏈路命令的任何錯誤都可以被檢測到,從而鏈路錯誤可以被恢復。

在鏈路層有多種類型的錯誤。這包括包或鏈路命令的錯誤,或者在鏈路訓練過程中的錯誤,或者當鏈路從一個狀態轉換到另一個狀態過程中的錯誤。本節詳細描述如何檢測和從這些鏈路錯誤中恢復。

7.3.3 頭包錯誤【Header Packet Errors】

幾種類型的頭包錯誤可以被檢測出來,它們是:

1. 丟失頭包(Missing of a header packet)

2. 因CRC出錯的無效頭包(Invalid header packet due to CRC errors)

3. Rx頭包序列號不匹配(Mismatch of a Rx Header Sequence Number)

無論如何(Regardless),Link Error Count只爲鏈路層的一類錯誤而增加,而這些錯誤是將導致鏈路層轉換進入Recovery的錯誤。對於那些不會導致鏈路進入Recovery的錯誤,Link Error Count應該保持不變。

7.3.3.1 包分幀錯誤【Packet Framing Error】

包分幀有序集(packet framing ordered set)被構建成即使有序集中出現任何單個K-符號損壞,也不會妨礙其包分幀的識別(packet framing recognition)。

頭包分幀(Header packet framing)和DPP分幀(DPP framing)都是使用4個K-符號有序集構建。一個頭包只包含在包開始的一個由7.2.1節定義的包分幀有序集。DPP由起始包分幀有序集(start packet framing ordered set)開始,並由結尾包分幀有序集(end packet framing ordered set)結束,如在第7.2.2節所定義。

• 如果下列兩個條件被滿足,應該聲明一個有效的HPSTART有序集:

  1. 至少在4個連續的符號週期的4個K-符號中的3個是有效的包分幀K-符號(packet Framing K-symbols)。
  2. 4個符號按照表7-9定義的順序。

注意:如果HPSTART有序集有兩個或者更多的K-符號損壞,頭包將是不可檢測的,因此,會導致丟失頭包(missing of a header packet)。

• 丟失頭包將導致端口轉換到Recovery(根據下面那個條件最先滿足):

1. 發送頭包的端口在其PENDING_HP_TIMER超時的時候。

2. 接收頭包的端口在檢測到一個Rx Header Sequence Number錯誤的時候。

• 每次轉換到Recovery 發生時,Link Error Count 都應該被增加1。

7.3.3.2 頭包錯誤【Header Packet Error】

每個頭包都包含一個CRC-5和一個CRC-16來確保數據完整性可以被驗證。CRC-5用於檢測鏈路控制字(Link Control Word)中的比特錯誤。CRC-16用於檢測包頭中的比特錯誤。頭包錯誤可以使用CRC-5或CRC-16檢查來實現。

• 如果下列情形是真,則應該聲明一個頭包錯誤:

1. 檢測到了有效的HPSTART有序集。

2. 要麼CRC-5或C-16檢查失敗(如第7.2.1節定義),要麼在包頭中出現了K-符號,或者鏈路控制字(Link Control Word)導致CRC-5或C-16檢查不能被完成。

• 如果檢測到了一個頭包錯誤,接收頭包的端口應該按照第7.2.4.1節所定義的那樣發送一個LBAD。Link Error Count應該保持不變。

• 如果端口連續3次接收頭包失敗,它應該轉換到Recovery。Link Error Count應該被增加1。參考第7.2.4.1.4節的詳情。

7.3.3.3 Rx頭包序列號錯誤【Rx Header Sequence Number Error】

每個端口都包含一個如第7.2.4.1節定義的Rx Header Sequence Number,並在進入U0時被初始化。當接收到一個頭包時,要求端口將嵌入在頭包中的Header Sequence Number和存儲在接收器中的Rx Header Sequence Number進行比較。這確保頭包以順序的方式被傳送和接收。丟失或者損壞頭包可以被檢測到。

• 如果滿足下列條件,則應該發生Rx Header Sequence Number錯誤。

1. 頭包被接收到並且沒有檢測到頭包錯誤。

2. 接收到的頭包中的Header Sequence Number與Rx Header Sequence Number不匹配。

• 檢測到Rx Header Packet Sequence Number錯誤的端口應該轉換進入Recovery。

Link Error Count應該在每次轉換進入Recovery發生時被增加1。

7.3.4 鏈路命令錯誤【Link Command Errors】

鏈路命令包含4個K-符號鏈路命令分幀有序集,LCSTART,緊跟兩個符號的鏈路命令字(link command word),以及它的重複。鏈路命被構建成即使鏈路命令有序集中出現任何單個K-符號損壞,也不會妨礙使得鏈路命令的識別無效(invalidate the recognition of a link command),且在兩個被加擾的鏈路命令字中的任何單比特錯誤不會損壞鏈路命令的解析。

• 如果下列兩個條件被滿足,應該聲明檢測到了鏈路命令:

1. 至少在4個連續的符號週期的4個K-符號中的3個是有效的鏈路命令K-符號(link command K-symbols)。

2. 4個符號按照表7-10定義的順序。

• 如果兩個鏈路命令字都相同,並且都包含有效的鏈路命令信息(如表7-4定義),並且他們都通過CRC-5檢查,則申明有效的鏈路命令【已勘誤】。

• 如果檢測到了一個鏈路命令但是沒有滿足有效鏈路命令的條件,則申明無效的鏈路命令。

• 無效的鏈路命令應該被忽略。

• 檢測到丟失GOOD_n 或 LCRD_x的端口應該轉換進入Recovery。

注意:當在連續接收到兩個LGOOD_n但是沒有處於數字順序時,申明丟失LGOOD_n。當PENDING_HP_TIMER超時,也可以推測LGOOD_n, 或 LBAD, 或 LRTY丟失。當在連續接收到兩個LCRD_x但是沒有處於字母順序時,或者當PENDING_HP_TIMER超時而沒有接收到LCRD_x時,申明丟失LCRD_x。

• 檢測到丟失LGO_Ux, 或LAU, 或LXU應該轉換到Recovery。

注意:當PM_LC_TIMER超時而沒有接收到LAU或LXU時,申明丟失LGO_Ux, 或LAU, 或LXU。

• 下行端口檢測到丟失LUP將轉換到Recovery (參考第7.5.6節關於LUP的檢測)。

注意:丟失LPMA不會將鏈路轉換到Recovery。它只會導致接收受LGO_Ux的端口的Ux進入延遲(Ux entry delay)(參考第7.2.4.2節的詳情)。

Link Error Count應該在每次由於出錯而轉換到Recovery時被增加1。

7.3.5 ACK Tx 頭包序列號錯誤【ACK Tx Header Sequence Number Error】

每個端口都有一個定義與第7.2.4.1節的ACK Tx Header Sequence Number。該ACK Tx Header Sequence Number 是在 Header Sequence Number Advertisement期間被初始化的。在發送一個頭包後,端口期待從其鏈路夥伴處接收到一個LGOOD_n以明確確認該頭包被恰當接收。在接收到LGOOD_n時,LGOOD_n中包含的Header Sequence Number將被與ACK Tx Header Sequence Number相比較。比較的輸出將決定是否發生了ACK Tx Header Sequence Number錯誤。

• 如果下列條件被滿足,則聲明一個ACK Tx Header Sequence Number錯誤:

1. 接收到一個有效的LGOOD_n。

2. 接收到的LGOOD_n中包含的Header Sequence Number與ACK Tx Header Sequence Number不匹配。

3. 該LGOOD_n不是用於Header Sequence Number Advertisement。

檢測到ACK Tx Header Sequence Number 錯誤的端口應該轉換到Recovery。

Link Error Count應該在每次由於出錯而轉換到Recovery時被增加1。

7.3.6 頭包序列號宣告錯誤【Header Sequence Number Advertisement Error】

每個端口都要求在進入U0時首先執行一次Header Sequence Number Advertisement。Header Sequence Number Advertisement的詳情在第7.2.4節描述。Header Sequence Number Advertisement是鏈路初始化的第一步,用來確保鏈路流程在Recovery前後維持未被中斷(maintained un-interrupted)。在Header Sequence Number Advertisement期間的發生的任何錯誤都必須被檢測到併發起恰當的錯誤恢復。

• 如果下列條件之一是真,則發生Header Sequence Number Advertisement錯誤:

1. PENDING_HP_TIMER超時但是沒有接收到Header Sequence Number Advertisement。

2. 在發送Header Sequence Number Advertisement之前接收到頭包。

3. 在Header Sequence Number Advertisement之前接收到LCRD_x或LGO_Ux。

• 檢測到Header Sequence Number Advertisement錯誤的端口應該轉換到Recovery。

Link Error Count應該在每次由於出錯而轉換到Recovery時被增加1。

7.3.7 Rx頭包緩衝信用宣告錯誤【Rx Header Buffer Credit Advertisement Error】

在進入U0後,每個端口都有要求在Header Sequence Number Advertisement之後執行Rx Header Buffer Credit Advertisement。Rx Header Buffer Credit Advertisement的詳情在第7.2.4節描述。

• 如果下列條件之一是真,則發生Rx Header Buffer Credit Advertisement錯誤:

1. CREDIT_HP_TIMER超時但是沒有接收到LCRD_x。

2. 在發送LCRD_x之前接收到頭包。

3. 在LCRD_x之前接收到LGO_Ux。
• 檢測到Rx Header Buffer Credit Advertisement錯誤的端口應該轉換到Recovery。

Link Error Count應該在每次由於出錯而轉換到Recovery時被增加1。

7.3.8 訓練序列錯誤【Training Sequence Error】

在Polling.Active,Polling.Configuration,Recovery.Active,以及Recovery.Configuration子狀態期間,TS1和TS2有序集的符號損壞是符合預期的(expected),直到轉換到下一狀態的要求被滿足。在這些子狀態中的任何之一超時都被 認爲是訓練序列錯誤(Training Sequence error)。

• 從Polling.Active, Polling.Configuration, Recovery.Active, or Recovery.Configuration字狀態中任何之一超時都將導致訓練序列錯誤(Training Sequence error)。

• 當檢測到訓練序列錯誤(Training Sequence error),應該跟隨下列鏈路狀態轉換之一:

1. 如果練序列錯誤(Training Sequence error)發生在Polling期間,下行端口應該轉換到Rx.Detect。

2. 如果練序列錯誤(Training Sequence error)發生在Polling期間,集線器的上行端口應該轉換到Rx.Detect。

3. 如果練序列錯誤(Training Sequence error)發生在Polling期間,外圍設備的上行端口應該轉換到SS.Disabled。

4. 如果練序列錯誤(Training Sequence error)發生在Recovery期間而轉換到Recovery的目的不是爲了試圖做Hot Reset,下行端口應該轉換到SS.Inactive。

5. 如果練序列錯誤(Training Sequence error)發生在Recovery.Active 和 Recovery.Configuration期間而轉換到Recovery的目的爲了試圖做Hot Reset,下行端口應該轉換到Rx.Detect。

6. 如果練序列錯誤(Training Sequence error)發生在Recovery期間,上行端口應該轉換到SS.Inactive。

Link Error Count應該保持不變。

7.3.9 8b/10b錯誤

當接收器解碼8b/10b符號時,有兩種類型錯誤。一類是不均等性錯誤(disparity error),發生在接收到的8b/10b符號的運行不均等性(running disparity)不是+2, 或 0, 或 -2時。另一個是當接收到不能識別的8b/10b符號時的解碼錯誤

在接收到8b/10b錯誤通知時:

• 端口可以可選地做如下事項:

1. 如果鏈路正在接收一個頭包,它應該發生LBAD。

2. 如果鏈路正在接收一個鏈路命令,它應該忽略該鏈路命令。

3. 如果鏈路正在接收DPP,它應該丟棄該DPP。

Link Error Count應該保持不變。

7.3.10 錯誤類型和恢復的總結【Summary of Error Types and Recovery】

表7-11總結了鏈路錯誤類型(link error types),錯誤計數(error count),以及不同的恢復鏈路錯誤的路徑。

• 鏈路錯誤應該在每次由於出錯而轉換到Recovery時被計數。

• 鏈路錯誤應該由下行端口計數(counted by a downstream port)。

Link Error Count應該在PowerOn Reset, Warm Reset, Hot Reset,或者每當端口進入Polling.Idle時復位。.

還存在一些情形,接收到不期望的(unexpected)鏈路命令或頭包。這包含但是不限於如下情形:

1. 在接收到Header Sequence Number Advertisement和Remote Rx Header Buffer Credit Advertisement之前,接收到不期望的(unexpected)鏈路命令如LBAD, LRTY, LAU, LXU, 或LPMA。

2. 在從Recovery進入U0後,接收到Header Sequence Number Advertisement,但是其ACK Tx Header Sequence Number 與其Tx Header Buffers中的任何頭包都不一致。

3. 沒有發送LBAD卻接收到LRTY。

4. 接收到LGOOD_n,既不是Header Sequence Number Advertisement,也不是頭包確認。

5. 沒有發送LGO_Ux而接收到LAU或LXU。

6. 沒有發送LAU卻接收到LPMA。

7. 在鏈路初始化期間接收到一個不期望的頭包【已勘誤】。

這而錯誤情形大部分不是由於鏈路錯誤造成。端口在這些情形下的行爲是未定義的,從而特定於具體實現。建議端口忽略這些不期望的鏈路命令或頭包。

如果端口被基於TS2有序集而被指示到不同的鏈路狀態,則下行端口的TS2有序集覆蓋(overrides)上行端口的。例如,如果下行端口在其TS2有序集中發送Hot Reset,而上行端口發送Loopback mode,則Hot Reset覆蓋Loopback。端口應該進入Hot Reset【本段已勘誤】

7.4 上電覆位和帶內復位【PowerOn Reset and Inband Reset】

與鏈路相關的有兩類復位。第一,上電覆位(PowerOn Reset),當上電時,恢復存儲元素,寄存器,或者內存(storage elements, registers, or memories)到預先決定的(predetermined)狀態。一旦上電覆位,LTSSM(在第7.5節描述)應該進入Rx.Detect。第二,帶內復位(Inband Reset),使用超高速或者LFPS信號(SuperSpeed or LFPS signaling)來在鏈路上傳導復位。有兩種機制來完成帶內復位(Inband Reset),Hot Reset 以及 Warm Reset。一旦完成上電覆位(PowerOn Reset)或者帶內復位(Inband Reset)之一,鏈路應該如第7.4.2節所描述的那樣轉換到U0。

7.4.1 上電覆位(PowerOn Reset)

上電覆位(PowerOn Reset),當上電時恢復存儲元素,寄存器,或者內存(storage elements, registers, or memories)到預先決定的(predetermined)狀態(參考第9.1.1.2節關於何時對自供電的設備上電的澄清)。端口必須對其自己內部復位信號和時序負責。當上電覆位(PowerOn Reset)有效時或者VBUS關閉時,下面事項應該發生:

1. 接收器終端阻抗應該滿足表6-13中所定義的ZRX-HIGH-IMP-DC-POS規範。

2. 發生器應該維持表6-11所定義的常量DC共模電壓【constant DC common mode voltage (VTX-DC-CM)】。

當上電覆位(PowerOn Reset)完成時或者VBUS有效時,下面事項應該發生:

1. 端口的LTSSM應該被初始化到Rx.Detect。

2. TSSM和PHY層變量(例如Rx均衡器設置)應該被複位到它們的默認值。

3. 端口的接收器終端阻抗應該滿足表6-13所定義的RRX-DC規範。

注意:Rx termination應該在除SS.Disabled以外的整個操作過程中總是被維持。

7.4.2 帶內復位(Inband Reset)

帶內復位(Inband Reset)應該在被指示時被下行端口生成。有兩種機制可以生成帶內復位(Inband Reset)。第一種機制,Hot Reset,被定義成發送TS2有序集並將Reset位置位。Hot Reset應該導致LTSSM轉換到Hot Reset狀態。一旦完成Hot Reset,下面的事項應該發生:

• 下行端口應該復位其Link Error Count。

• 上行端口的端口配置信息(port configuration information)應該維持不變。參考第8.4.5節和第8.4.6節的詳情。

PHY層變量(例如Rx均衡器設置)應該維持不變。

端口的LTSSM應該從Rx.Detect和Polling轉換到U0【已勘誤】。

帶內復位(Inband Reset)的第二種機制是Warm Reset。Warm Reset的信號被定義爲滿足tReset要求(見表6-20)的LFPS信號。Warm Reset將導致LTSSM轉換到Rx.Detect,重新訓練鏈路,包括接收器均衡器(receiver equalizer),復位其上行端口,並轉換到U0。上行端口應該在除了SS.Disabled之外的所有鏈路狀態中使能其LFPS接收器以及Warm Reset檢測器。Warm Reset的完成應該導致如下事項發生:

• 下行端口應該復位其Link Error Count。

• 上行端口的端口配置信息(port configuration information)應該維持不變。參考第8.4.5節和第8.4.6節的詳情。

PHY層變量(例如Rx均衡器設置)應該被重新初始化或者重新訓練。

端口的LTSSM應該轉換到U0.

下行端口可能被指示以兩種方式復位鏈路,如第10.3.1.6節所描述的"PORT_RESET"或"BH_PORT_RESET"。當被指示"PORT_RESET"時,下行端口應該根據其LTSSM狀態,要麼發送一個Hot Reset,要麼發送一個Warm Reset。當被指示"BH_PORT_RESET"時,下行端口應該在除了SS.Disabled之外的任意LTSSM狀態中都發送Warm Reset。

當被指示"PORT_RESET"時,下行端口應該基於下列條件,要麼發送一個Hot Reset,要麼發送一個Warm Reset:

• 如果下行端口處於U3,或者Loopback,或者Compliance Mode,或者SS.Inactive,應該使用Warm Reset。

• 如果下行端口處於U0,它應該使用Hot Reset。

• 如果下行端口處於過渡性狀態Polling或者Recovery,它應該使用Hot Reset。

• 如果下行端口處於U1或者U2,它應該使用LFPS退出握手退出U1或U2,轉換到Recovery,接着轉換到Hot Reset。當下行端口進入Hot Reset失敗時,下列兩條附加規則可以適用【下列兩條規則已勘誤】:

  1. 如果Hot Reset失敗是由於LFPS握手超時,下行端口應該轉換到SS.Inactive,直到軟件干預,或者直到檢測到上行端口移除。
  2. 如果Hot Reset失敗是由於TS1/TS2在Recovery狀態握手超時,下行端口應該轉換到Rx.Detect 並且嘗試Warm Reset 。

• 如果下行端口處於SS.Disabled,則禁止(prohibited)帶內復位(Inband Reset)。.

如果被指示"BH_PORT_RESET",應該發送Warm Reset,下列事項應該發生:

• 下行端口應該在除了SS.Disabled 之外的所有鏈路狀態發起一個Warm Reset ,並轉換到Rx.Detect。

上行端口應該在除了SS.Disabled之外的所有鏈路狀態中使能其LFPS接收器以及Warm Reset檢測器。

• 接收到Warm Reset 的上行端口應該轉換到Rx.Detect 。參考第6.9.3節的Warm Reset Detection。

7.5 鏈路訓練和狀況狀態機【Link Training and Status State Machine (LTSSM)】

鏈路訓練和狀況狀態機【Link Training and Status State Machine (LTSSM)】是定義用於鏈路連接性和鏈路電源管理的狀態機。LTSSM包含12個不同的且可以根據它們的功能性爲特點的鏈路狀態。

第一,有4個操作性(operational)鏈路狀態,U0,U1,U2,以及U3。U0是超高速鏈路被使能(SuperSpeed link is enabled)的狀態。包傳輸正在進行,或者鏈路處於空閒。U1是低功耗狀態,沒有執行包傳輸,超高速鏈路連接性可以被禁止以允許有節能的機會。U2也是低功耗狀態。相比於U1,U2允許更進一步節省功耗,但是以增加的退出時延(increased exit latency)爲懲罰。U3是鏈路掛起狀態,具有更深入的(aggressive)功耗節省的機會。

第二,有4個鏈路狀態,Rx.Detect, Polling, Recovery,以及Hot Reset,被引入來進行鏈路初始化和訓練。Rx.Detect代表初始上電時鏈路狀態,端口正試圖判定是否其超高速鏈路夥伴存在。一旦檢測到存在超高速鏈路夥伴,鏈路訓練過程就會開始。Polling是一個鏈路狀態,定義用於兩個鏈路夥伴可以讓它們的超高速發射器和接收器被訓練,同步並準備好進行包傳輸。Recovery是一個鏈路狀態,定義用於當兩個鏈路夥伴從一個低功耗狀態退出時,或者當一個鏈路夥伴檢測到鏈路沒有在U0中恰當工作從而鏈路需要重新訓練時,或者當鏈路夥伴決定要改變鏈路操作模式時,對鏈路進行重新訓練(retraining)。Hot Reset是一個狀態,定義用於允許下行端口來複位其上行端口。

第三,兩個其他鏈路狀態,Loopback 和 Compliance Mode,被引入來進行比特錯誤測試以及發射器兼容性測試。

最後,還有兩個鏈路狀態被定義。SS.Inactive是一個鏈路錯誤狀態,鏈路處於不可操作(non-operable)狀態,而需要軟件干預(software intervention)。SS.Disabled是一個鏈路狀態,其中超高速連接性被禁止,並且鏈路可能處於USB 2.0模式。

配置信息和請求發起LTSSM狀態轉換主要是被軟件控制。所有的LTSSM引用到"被指示"【"directed"】都是指上層機制。

還有一些不同的定時器被定義且實現,用於LTSSM以便確保LTSSM的成功操作。超時值被總結在表7-12中。在鏈路層使用的所有定時器都具有容忍0~+50%的精確度,除了U2不活動定時器(U2 inactivity timer)【參見第10.4.1節關於U2不活動定時器精確度】。所有的超時值都必須在PowerOn Reset或者Inband Reset之後被設置到特定值。所有的計數器在PowerOn Reset或者Inband Reset之後也必須被初始化。

在狀態機描述中,進入以及退出的條件列表並沒有被冠以優先級。狀態機圖指示概覽,肯泵沒包含所有的轉換條件。

【勘誤:上表中,U0 – RxDetect – 1 ms一行實際應該爲U0 – Recovery – 1 ms】    

所有狀態機圖都有轉換條件的描述。這些描述僅供參考(informative only)。確切的狀態轉換的實現應該遵循各節的描述。

7.5.1 SS.Disabled

SS.Disabled是端口的低阻抗接收器終端阻抗(low-impedance receiver termination)被移除的狀態。它是端口的常規賽連接性被禁止的狀態。參考第10.16節關於外圍設備的行爲的詳情。參考第10.3到10.6節關於集線器的上行端口和下行端口的行爲。

對於自供電的上行端口(self-powered upstream port),SS.Disabled也是一個邏輯上的power-off狀態。

當被指示時,下行端口應該從任意的其他狀態轉換到該狀態。

當VBUS無效時,上行端口應該轉換到該狀態

SS.Disabled 不包含任何子狀態。

7.5.1.1 SS.Disabled 的要求

• 在SS.Disabled期間,VBUS可以存在。

• 端口的接收器終端阻抗應該呈現如表6-13所定義的到地的高阻抗(high impedance to groundZRX-HIGH-IMP-DC-POS

• 端口應該被禁止發送和接收LFPS和SuperSpeed信號。

7.5.1.2 退出SS.Disabled

• 當被指示時,下行端口應該轉換到Rx.Detect。

• 上行端口只有當VBUS轉換到有效,或者檢測到USB 2.0復位時,才能轉換到Rx.Detect 。

7.5.2 SS.Inactive

SS.Inactive是鏈路失敗了SuperSpeed操作後的狀態。下行端口只有在被指示時,或者檢測到沒有如表6-13所指定的遠端接收器終端阻抗(far-end receiver termination)(RRX-DC)時,或者當被Warm Reset時,才能從該狀態退出。上行端口只有在被Warm Reset時,或者檢測到沒有如表6-13所指定的遠端接收器終端阻抗(far-end receiver termination)(RRX-DC)時,才能從該狀態退出。

在SS.Inactive期間,端口週期性地執行遠端接收器終端阻抗檢測(far-end receiver termination detection)。如果檢測到斷開連接(disconnection),端口會返回到Rx.Detect。如果沒有檢測到斷開連接,鏈路會保持在SS.Inactive狀態,直到軟件干預。

7.5.2.1 SS.Inactive子狀態機(Substate Machines)

SS.Inactive包含如圖7-14所示的下列子狀態機:

SS.Inactive.Disconnect.Detect

SS.Inactive.Quiet

7.5.2.2 SS.Inactive的要求

VBUS應該存在。

接收器終端阻抗(receiver termination)應該滿足表6-13所指定的(RRX-DC)的要求。

• 在該狀態,發射器共模電壓(transmitter common mode)不要求處於規範的要求之內。

7.5.2.3 SS.Inactive.Quiet

SS.Inactive.Quiet是一個子狀態,定義爲端口在等待軟件干預時,禁止了其遠端接收器終端阻抗檢測(far-end receiver termination detection),以便可以節省更多能量。

7.5.2.3.1 SS.Inactive.Quiet的要求

遠端接收器終端阻抗檢測(far-end receiver termination detection)功能應該被禁止。

• 一旦進入該子狀態,應該啓動一個12ms的定時器。

7.5.2.3.2 退出SS.Inactive.Quiet

• 一旦12ms定時器過期,端口應該轉換進入SS.Inactive.Disconnect.Detect。

• 當被指示時,下行端口應該轉換到SS.Disabled。

• 當Warm Reset被髮送後,下行端口應該過度到Rx.Detect。

• 一旦檢測到Warm Reset,上行端口應該過度到Rx.Detect。

7.5.2.4 SS.Inactive.Disconnect.Detect

SS.Inactive.Disconnect.Detect是一個子狀態,在此期間端口執行遠端接收器終端阻抗檢測(far-end receiver termination detection)以便判定是否其鏈路夥伴在SS.Inactive期間斷開了連接(disconnected),或者轉換進入SS.Inactive狀態是由於和其鏈路夥伴斷開連接所致。

7.5.2.4.1 SS.Inactive.Disconnect.Detect的要求

發射器應該執行執行第6.11節所描述的遠端接收器終端阻抗檢測(far-end receiver termination detection)。

7.5.2.4.2 退出SS.Inactive.Disconnect.Detect

• 如果沒有檢測到滿足表6-13所定義的遠端低阻抗接收器終端阻抗【far-end low-impedance receiver termination (RRX-DC)】,端口應該轉換到Rx.Detect。

• 如果檢測到了滿足表6-13所定義的遠端低阻抗接收器終端阻抗【far-end low-impedance receiver termination (RRX-DC)】,端口應該轉換到SS.Inactive.Quiet。

7.5.3 Rx.Detect

Rx.Detect是上行端口和下行端口兩者的LTSSM上電狀態。它也是下行端口在發送了Warm Reset的時候,以及從除了SS.Disabled狀態之外的任何鏈路狀態檢測到Warm Reset的時候,下行端口的狀態。Rx.Detect的目的是爲了檢測到地的遠端接收器終端阻抗檢測(far-end receiver termination detection)。Rx.Detect.Reset是默認的復位狀態,用於兩端口來在Warm Reset之後同步操作。如果沒有Warm Reset,該子狀態將立即退出。Rx.Detect.Active是用於遠端接收器終端阻抗檢測(far-end receiver termination detection)的子狀態。Rx.Detect.Quiet是遠端接收器終端阻抗檢測(far-end receiver termination detection)功能被禁止的節能(power saving)子狀態。在Rx.Detect,端口會執行遠端接收器終端阻抗檢測(far-end receiver termination detection)。

7.5.3.1 Rx.Detect子狀態機(Substate Machines)

Rx.Detect 包含一個具有下列子狀態的子狀態機顯示於圖7-15:

Rx.Detect.Reset

Rx.Detect.Active

Rx.Detect.Quiet

7.5.3.2 Rx.Detect 的要求

• 在該狀態,發射器共模電壓(transmitter common mode)不要求處於規範的要求之內。

表6-13所指定的接收器終端阻抗(receiver termination)(RRX-DC)應該被保持滿足(maintained)。

7.5.3.3 Rx.Detect.Reset

Rx.Detect.Reset是設計用於兩個端口在Warm Reset時進行它們之間操作同步的。在該子狀態,下行端口應該當被指示下生成Warm Reset。如果上行端口在檢測到Warm Reset時進入Rx.Detect狀態,它應該保持處於該狀態,直到完成Warm Reset。

對於不是因爲Warm Reset而進入Rx.Detect的端口,它應該立即退出。

7.5.3.3.1 Rx.Detect.Reset的要求

如果上行端口在檢測到Warm Reset時進入Rx.Detect,應該適用於下列要求。參考第6.9.3節的詳情。

• 下行端口應該按照表6-21的定義,發送tReset時長的Warm Reset。

注意:這包括在Recovery時,Hot Reset的嘗試失敗時的情形。參考第7.4.2節的詳情。

• 上行端口應該保持在該狀態,直到檢測到Warm Reset完成

7.5.3.3.2 退出Rx.Detect.Reset

• 如果Rx.Detect的進入不是因爲Warm Reset的話,則端口應該直接轉換進入Rx.Detect.Active。

注意:Warm Reset在上電期間是不存在的。

• 下行端口應該在按照表6-21所定義的tReset的時長髮送Warm Reset後,轉換進入Rx.Detect.Active。

• 當被指示時,下行端口應該轉換進入SS.Disabled。

• 上行端口應該在沒有進一步從下行端口處按照第6.9.3節所定義的那樣收到LFPS Warm Reset信號時,轉換進入Rx.Detect.Active。

7.5.3.4 Rx.Detect.Active

Rx.Detect.Active是檢測超高速鏈路夥伴存在性的子狀態。端口會按照第6.11節定義的那樣執行遠端接收器終端阻抗檢測(far-end receiver termination detection)。

7.5.3.5 Rx.Detect.Active的要求

發射器應該啓動如第6.11節所定義的遠端接收器終端阻抗檢測(far-end receiver termination detection)。

• 上行端口應該計數遠端接收器終端阻抗檢測事件(far-end receiver termination detection events)的個數。對遠端接收器終端阻抗的檢測(detection of far-end receiver termination)在第6.11節定義。

注意:該計數被外圍設備用來判定何時需要轉換進入SS.Disabled。它也被集線器用來控制其下行端口狀態機。參考第10.3.1.1節的詳情。

7.5.3.6 退出Rx.Detect.Active

• 端口應該在檢測到表6-13定義的遠端低阻抗接收器終端阻抗(far-end low-impedance receiver termination)(RRX-DC)的時候,轉換進入Polling。

• 下行端口應該在沒有檢測到表6-13定義的遠端低阻抗接收器終端阻抗(far-end low-impedance receiver termination)(RRX-DC)的時候,轉換進入Rx.Detect.Quiet。

• 當被指示時,下行端口應該轉換到SS.Disabled

• 集線器的上行端口應該在沒有檢測到表6-13定義的遠端低阻抗接收器終端阻抗(far-end low-impedance receiver termination)(RRX-DC)的時候,轉換進入Rx.Detect.Quiet。

• 當滿足下列條件時,外圍設備的上行端口應該轉換到Rx.Detect.Quiet:

1. 沒有檢測到表6-13定義的遠端低阻抗接收器終端阻抗(far-end low-impedance receiver termination)(RRX-DC)。

2. 遠端接收器終端阻抗檢測事件(far-end low-impedance receiver termination detection events)的個數少於8個。

• 當滿足下列條件時,外圍設備的上行端口應該轉換到SS.Disabled:

1. 沒有檢測到表6-13定義的遠端低阻抗接收器終端阻抗(far-end low-impedance receiver termination)(RRX-DC)。

2. 遠端接收器終端阻抗檢測事件(far-end low-impedance receiver termination detection events)的個數已經達到8個。

注意:遠端接收器終端阻抗檢測事件(far-end low-impedance receiver termination detection events)的個數限制是爲了允許超高速外圍設備在老平臺(legacy platform)上能夠在80ms後轉換到USB 2.0。

7.5.3.7 Rx.Detect.Quiet

Rx.Detect.Quiet是一個子狀態,在此期間,端口已經禁止了其遠端接收器終端阻抗檢測(far-end low-impedance receiver termination detection)。

7.5.3.7.1 Rx.Detect.Quiet的要求

遠端接收器終端阻抗檢測(far-end low-impedance receiver termination detection)應該被禁止。

• 一旦進入該子狀態,應該啓動一個12ms定時器。

7.5.3.7.2 退出Rx.Detect.Quiet

• 一旦12ms定時器過期時,端口應該轉換進入Rx.Detect.Active。

• 當被指示時,下行端口應該轉換到SS.Disabled。

7.5.4 Polling

Polling是用於鏈路訓練的狀態。在Polling期間,在超高速訓練(SuperSpeed training)被啓動之前,兩個端口之間應該發生一個Polling.LFPS握手。比特鎖(Bit lock),符號鎖(symbol lock),以及Rx均衡訓練(Rx equalization trainings)是使用TSEQ,TS1,以及TS2訓練有序集來達到的。

7.5.4.1 Polling子狀態機(Substate Machines)

Polling包含如圖7-16所示的子狀態機,具有如下子狀態:

Polling.LFPS

Polling.RxEQ

Polling.Active

Polling.Configuration

Polling.Idle

7.5.4.2 Polling的要求

端口應該保持其如表6-13所定義的低阻抗接收器終端阻抗檢測(low-impedance receiver termination)(RRX-DC)。

7.5.4.3 Polling.LFPS

Polling.LFPS是設計用來建立PHY的直流操作點(DC operating point),以及當從Rx.Detect退出後在兩個鏈路夥伴之間同步操作(synchronize the operations)的子狀態。

7.5.4.3.1 Polling.LFPS的要求

• 一旦進入該子狀態,應該使能一個LFPS接收器,以便接收如第6.9.1節定義的Polling.LFPS信號。

• 一旦進入該子狀態,端口應該在80 μs內建立起其LFPS操作條件。

• 一旦進入該子狀態,應該啓動一個360ms的定時器。

• 超高速PHY的操作條件應該在端口準備好退出到Polling.RxEQ的時候建立起來。

• 超高速接收器可以可選地被使能,以接收TSEQ有序集來進行接收器均衡器訓練(receiver equalizer training)。

注意:首先進入Polling.RxEQ的端口將開始傳送TSEQ有續集,而另一個端口仍然還處於Polling.LFPS。在Polling.LFPS期間使能超高速接收器可以允許端口開始接收器均衡器訓練(receiver equalizer training),而同時還在完成Polling.LFPS退出握手的要求。

7.5.4.3.2 退出Polling.LFPS

• 當滿足下列條件時,端口應該轉換到Polling.RxEQ。

1. 至少連續發送了16個滿足在第6.9節定義的Polling.LFPS規範的Polling.LFPS突發(bursts)。

2. 接收到了兩個連續的Polling.LFPS突發(bursts)。

3. 在接收到一個Polling.LFPS突發(burst)之後發送了4個連續的Polling.LFPS突發(bursts)。

• 一旦360ms定時器超時,且滿足下列兩個條件,則端口應該轉換到Compliance Mode:

  1. 在PowerOn Reset 之後,端口還從來沒有成功完成過Polling.LFPS。
  2. 轉換到Polling.RxEQ 的條件沒有被滿足。

注意:如果在PowerOn Reset之後的第一個Polling.LFPS握手嘗試失敗了,就意味着(implies)可能存在一個無源(passive)測試負載,從而應該啓動兼容性測試。如果在PowerOn Reset之後的第一個Polling.LFPS握手嘗試是成功的,就意味着(implies)在鏈路的兩端都存在超高速端口,並且沒有意向進行兼容性測試。因此,任何後續的當鏈路被重新訓練(retrained)時的Polling.LFPS握手超時都只標誌着鏈路訓練失敗,而不是進入Compliance Mode的信號。

• 在PowerOn Reset後訓練過一次之後,一旦360ms定時器超時,而又不滿足轉換到Polling.RxEQ的條件,則下行端口應該轉換到Rx.Detect。

• 在PowerOn Reset後訓練過一次之後,一旦360ms定時器超時,而又不滿足轉換到Polling.RxEQ的條件,則集線器的上行端口應該轉換到Rx.Detect。

• 在PowerOn Reset後訓練過一次之後,一旦360ms定時器超時,而又不滿足轉換到Polling.RxEQ的條件,則集線器外圍設備應該轉換到SS.Disabled。

• 當被指示時,下行端口應該轉換到SS.Disabled。

• 當被指示發送Warm Reset 時,下行端口應該轉換到Rx.Detect。

• 當檢測到Warm Reset 時,上行端口應該轉換到Rx.Detect。

7.5.4.4 Polling.RxEQ

Polling.RxEQ是用於接收器均衡訓練(receiver equalization training)的子狀態。 端口被要求要完成其接收器均衡訓練。

7.5.4.4.1 Polling.RxEQ的要求

• 正如在第6.4.2節描述的那樣,通道極性反轉(lane polarity inversion)的檢測和校正(detection and correction)應該被使能。

• 端口應該發送如表6-2所定義的TSEQ有序集。

• 端口應該在從該子狀態退出時完成接收器均衡訓練(receiver equalizer training)。

注意:可能存在一種情形,早一些進入Polling.RxEQ的端口正在傳送TSEQ有序集,而其鏈路夥伴還正在發送Polling.LFPS來滿足從Polling.LFPS退出到Polling.RxEQ的條件。在這種情形下,如果其鏈路夥伴處於電氣空閒(electrical idle),則近端互擾(near-end cross talk)可能會導致端口使用其自己的TSEQ有序集來訓練其Rx均衡器。爲了防止接收器訓練自己,端口可以要麼忽略TSEQ有序集的開始部分(大概30 μs),要麼繼續均衡器訓練直到完成TSEQ有序集的傳送。

7.5.4.4.2 退出Polling.RxEQ

• 在連續傳送65,536個如表6-2所定義的TSEQ有序集之後,端口應該轉換到Polling.Active。

• 當被指示時,下行端口應該轉換到SS.Disabled。

• 當被指示發送Warm Reset時,下行端口應該轉換到Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換到Rx.Detect。

7.5.4.5 Polling.Active

Polling.Active是繼續鏈路超高速訓練(SuperSpeed training)的子狀態。

7.5.4.5.1 Polling.Active的要求

• 一旦進入該子狀態,應該啓動一個12ms定時器。

• 端口應該傳送TS1有序集。

• 接收器處於使用TS1或者TS2有序集的訓練狀態。

注意:根據鏈路條件和不同的接收器實現,一個端口的接收器可能訓練得比另外一個端口快。當發生此種情形時,接收器最先完成訓練的端口將進入Polling.Configuration,並開始傳送TS2有序集,而接收器還沒有完成訓練的端口仍然處於Polling.Active,使用TS2有序集來訓練其接收器。

7.5.4.5.2 退出Polling.Active

• 一旦接收到8個連續相同的TS1或者TS2有序集,端口應該轉換到Polling.Configuration

• 一旦12ms定時器超時,而轉換進入Polling.Configuration的條件不滿足,則下行端口應該轉換進入Rx.Detect。

• 一旦12ms定時器超時,而轉換進入Polling.Configuration的條件不滿足,則集線器的上行端口應該轉換進入Rx.Detect。

• 一旦12ms定時器超時,而轉換進入Polling.Configuration的條件不滿足,則外圍設備的上行端口應該轉換進入SS.Disabled。

• 當被指示時,下行端口應該轉換進入SS.Disabled。

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

7.5.4.6 Polling.Configuration

Polling.Configuration是兩個鏈路夥伴完成超高速訓練(SuperSpeed training)的子狀態。

7.5.4.6.1 Polling.Configuration的要求

• 一旦進入該子狀態,端口應該發送相同的TS2有序集,且基於下列情形設置TS2有序集中的鏈路配置字段(link configuration field)。

1. 當被指示時,下行端口應該在TS2有序集中設置Reset位。

注意:上行端口只有在Hot Reset. Active時才能設置TS2有序集中的Reset位。參考第7.5.12.3節的詳情。

2. 當被指示時,下行端口應該在TS2有序集中設置Loopback位。

3. 當被指示時,下行端口應該在TS2有序集中設置Disabling Scrambling位。

• 一旦進入該子狀態,應該啓動一個12ms定時器。

7.5.4.6.2 退出Polling.Configuration

• 當滿足下列兩個條件時,端口應該轉換到Polling.Idle:

1. 接收到8個連續且相同的TS2有序集。

2. 在接收到起先的8個連續且相同的TS2有序集之後,發送了16個TS2有序集。

• 一旦12ms定時器超時,而轉換進入Polling.Idle的條件不滿足,則下行端口應該轉換進入Rx.Detect。

• 一旦12ms定時器超時,而轉換進入Polling.Idle的條件不滿足,則集線器的上行端口應該轉換進入Rx.Detect。

• 一旦12ms定時器超時,而轉換進入Polling.Idle的條件不滿足,則外圍設備的上行端口應該轉換進入SS.Disabled。

• 當被指示時,下行端口應該轉換進入SS.Disabled。

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

7.5.4.7 Polling.Idle

Polling.Idle是一個子狀態,在此期間,端口解碼在Polling.Configuration期間接收到的TS2有序集,並判定下一個狀態。

7.5.4.7.1 Polling.Idle的要求

• 端口應該解碼在Polling.Configuration期間接收到的TS2有序集,並繼續前進到下一個狀態。

• 下行端口應該復位其Link Error Count。

• 上行端口應該復位其端口配置信息到默認值。參考第8.4.5節和第8.4.6節的詳情。

• 如果在Polling.Configuration期間接收到的TS2有序集中的Disabling Scrambling沒有設置,則端口應該使能加擾(scrambling)。

• 如果被指示,或者在Polling.Configuration期間接收到的TS2有序集中的Disabling Scrambling被設置,則端口應該禁止加擾(scrambling)。

• 如果下一狀態是U0,則端口應該傳送Idle Symbols。如果下一狀態是Loopback or Hot Reset,則端口可以(may)傳送Idle Symbols【已勘誤】。

• 一旦進入該狀態,應該啓動一個2ms定時器。

• 端口應該能夠從其鏈路夥伴處接收Header Sequence Number Advertisement。

注意:退出時間的差別將導致一個端口先進入U0並開始Header Sequence Number Advertisement,而另一個端口仍然還處於Polling.Idle。

7.5.4.7.2 退出Polling.Idle

• 當被指示作爲loopback master並且該端口能夠作爲loopback master時,端口應該轉換到Loopback。

• 如果在Polling.Configuration期間接收到的TS2有序集中的Loopback位被設置,則端口應該轉換到Loopback,作爲loopback slave。

• 當被指示時,下行端口應該轉換進入Hot Reset。

• 如果在Polling.Configuration期間接收到的TS2有序集中的Reset位被設置,則端口應該轉換到Hot Reset。

• 當滿足下面兩個條件時,端口應該轉換進入U0:

1. 接收到8個連續的Idle Symbols。

2. 在接收到一個Idle Symbol後,發送了16個Idle Symbols。

• 當被指示時,下行端口應該轉換進入SS.Disabled。    

• 一旦2ms定時器超時,而轉換進入U0的條件不滿足,則下行端口應該轉換進入Rx.Detect。

• 一旦2ms定時器超時,而轉換進入U0的條件不滿足,則集線器的上行端口應該轉換進入Rx.Detect。

• 一旦2ms定時器超時,而轉換進入U0的條件不滿足,則外圍設備的上行端口應該轉換進入SS.Disabled。

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

7.5.5 Compliance Mode

Compliance Mode是用於測試發送器對電壓和時序規範的兼容性。如表6-7所定義,要傳送好幾個不同的測試模式(test patterns)。Compliance Mode不包含任何子狀態。

7.5.5.1 Compliance Mode的要求

• 端口應該保持其在表6-13中所定義的低阻抗接收器終端阻抗(low-impedance receiver termination) (RRX-DC)。

LFPS接收器被用於控制測試模式的順序(test pattern sequencing)。

• 一旦進入Compliance Mode ,在它開始發送第一個表6-7中定義的兼容性測試模式(compliance test pattern)之前,端口應該等待,直到其超高速Tx DC共模電壓(SuperSpeed Tx DC common mode voltage)滿足表6-11所定義的VTX-DC-CM規範。

• 一旦檢測到一個如第6.9.1節所定義的Ping.LFPS,端口應該連續發送下一個兼容性測試模式(compliance test pattern)。

• 一旦檢測到一個如第6.9.1節所定義的Ping.LFPS,並且測試模式已經達到最後一個測試模式時,端口應該連續發送第一個兼容性測試模式(compliance test pattern)。

7.5.5.2 退出Compliance Mode

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

• 當被指示時,下行端口應該轉換進入SS.Disabled。

7.5.6 U0

U0是正常操作狀態,在此期間包可以被傳送和接收。U0不包含任何子狀態。

7.5.6.1 U0的要求

• 端口應該滿足表6-10定義的發送器規範。

• 端口應該保持其在表6-13中所定義的低阻抗接收器終端阻抗(low-impedance receiver termination) (RRX-DC)。

LFPS接收器被使能。

• 下行端口應該使能一個1ms定時器來測量兩個連續鏈路命令(link commands)之間的時間間隔(time interval)。該定時器在每次接收到一個鏈路命令時將被複位並重啓。

• 上行端口應該使能一個10μs定時器。當任意鏈路命令(link command)或者包(packet)的第一個符號被髮送時,該定時器應該被複位(reset);並且在任意鏈路命令(link command)或者包(packet)的最後一個符號被髮送時,該定時器應該被重啓(restarted)。當鏈路處於邏輯空閒時,該定時器應該處於活躍狀態(active)。

• 當10μs定時器過期時,上行端口應該傳送一個LUP。.

7.5.6.2 退出U0

• 在成功完成LGO_U1的進入序列時,端口應該轉換進入U1。參考第7.2.4.2節的詳情。

• 在成功完成LGO_U2的進入序列時,端口應該轉換進入U2。參考第7.2.4.2節的詳情。

• 在成功完成LGO_U3的進入序列時,端口應該轉換進入U3。參考第7.2.4.2節的詳情。

• 當U3進入失敗,在3次連續重試嘗試後,下行端口應該轉換進入SS.Inactive。

• 在遇到如第7.3節所指出的會導致鏈路轉換進入Recovery的任何錯誤時,端口應該轉換進入Recovery。

• 一旦檢測到TS1有序集,端口應該轉換進入Recovery。

• 當被指示時,端口應該轉換進入Recovery。

• 當PENDING_HP_TIMER在第四次連續超時時(times out for the fourth consecutive time),端口應該轉換到SS.Inactive。

注意:這暗含着鏈路已經連續3次轉換進入Recovery,並且每次轉換進入Recovery都是由於PENDING_HP_TIMER超時。

• 當被指示時,下行端口應該轉換進入SS.Disabled。

• 當被指示時,下行端口應該轉換進入SS.Inactive。

• 當被指示時,上行端口應該轉換進入SS.Disabled。

注意:在進入U0後,兩個端口都要求按照第8.4.5節所定義的,在tPortConfiguration時間內,使用LMP來交換端口能力信息(port capabilities information)。這包括下列情形【下列情形已勘誤】

1. Polling直接進入U0

2. Polling直接通過Hot Reset進入U0;

3. Recovery進入U0,而在從Polling退出後,端口配置(port configuration)還沒有成功完成。在這種情形下,兩個端口都應該通過完成餘下的LMP交換(remaining LMP exchanges)來繼續端口配置過程(port configuration process)。

如果端口在tPortConfiguration時間內還沒有接收到LMP,下行端口應該被指示轉換到SS.Inactive,而上行端口應該被指示轉換到SS.Disabled。

• 一旦在1ms內沒有接收到任何鏈路命令(link command或任何包(如在第7.2.4.1.4節所指定的),則下行端口應該轉換到Recovery。【已勘誤,加上了"或任何包"這一條件。存在一種情形,如果主機控制器在連續做ISO流數據傳輸(streaming ISO data),中間沒有超過10us的空閒時間(idle time),則原條件可能會導致設備進入Recovery狀態。這個問題在加上"或任何包"這一條件後可以被修正。】

注意:在1ms內沒有接收到任何鏈路命令(包括LUP),意味着要麼鏈路處於嚴重的錯誤情形,要麼上行端口已經被移除。爲了容許這兩種情形,下行端口將轉換到Recovery,並嘗試重新訓練鏈路。如果重新訓練失敗了,它就會轉換進入SS.Inactive。在SS.Inactive期間,下行端口將嘗試一次遠端接收器終端阻抗檢測(far-end receiver termination detection)。如果它判定不存在遠端低阻抗接收器終端阻抗(far-end low-impedance receiver termination) (RRX-DC),它將進入Rx.Detect。否則,他將等待軟件干預(software intervention)。

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

• 當檢測到VBUS off時,下行端口應該轉換進入SS.Disabled。

注意:這一條件只適用於自供電的上行端口(self-powered upstream port)。對於自供電的上行端口而言,SS.Disabled是邏輯上的power-off狀態。

7.5.7 U1

U1是低功耗狀態,在此期間,沒有包被傳送,並且兩個端口都同意進入一個超高速PHY可以被置於低功耗狀態的鏈路狀態。U1不包含任何子狀態。在圖7-17中顯示了到其他狀態的轉換。

7.5.7.1 U1的要求

• 超高速發射器DC共模電壓(SuperSpeed transmitter DC common mode voltage)應該處於表6-11中所定義的規範值(VTX-CM-DCACTIVE-IDLE-DELTA)內。

• 端口應該保持其如表6-13所定義的低阻抗接收器終端阻抗(low-impedance receiver termination)(RRX-DC)。

• 端口應該使能其如第6.9.2節所定義的U1退出檢測功能性(U1 exit detect functionality)。

• 當啓動從U1退出(exit from U1)時,端口應該使能其LFPS發射器。

• 如果U2不活動定時器(U2 inactivity timer)具有非零的超時值,則一旦進入該狀態,端口就應該使能其U2不活動定時器(U2 inactivity timer)。

• 下行端口應該使能其Ping.LFPS檢測。

• 下行端口應該使能一個300ms定時器。當接收到一個Ping.LFPS時,該定時器將被複位並重啓(reset and restarted)。

• 上行端口應該按照表6-20那樣轉送Ping.LFPS。

7.5.7.2 退出U1    

• 當被指示時,下行端口應該轉換進入SS.Disabled。

• 當300ms定時器過期時,下行端口應該轉換進入Rx.Detect。

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

• 一旦沒檢測到如第11.4.5節所定義的有效的Vbus,自供電的上行端口(self-powered upstream port)應該轉換進入SS.Disabled。

• 如第10.4.2.4節和第10.6.2.4節所定義的那樣,一旦U2不活動定時器超時,端口應轉換進入U2。

• 一旦成功完成一個滿足第6.9.2節所定義的U1 LFPS退出握手信號(U1 LFPS exit handshake signaling)的LFPS握手時,端口應該轉換進入Recovery。

• 一旦2ms LFPS握手定時器超時,並且沒有實現一個成功的滿足第6.9.2節所定義的U1 LFPS退出握手信號(U1 LFPS exit handshake signaling)的LFPS握手,則端口應該轉換進入SS.Inactive。

7.5.8 U2

U2是相比于于U1能更節能的鏈路狀態,當時具有更多的退出時延(increased exit latency)。

U2不包含任何子狀態。圖7-18顯示了到其他狀態的轉換。

7.5.8.1 U2的要求

• 超高速發射器DC共模電壓(SuperSpeed transmitter DC common mode voltage)不需要處於表6-10所定義的規範(VTX-CM-DC-ACTIVE-IDLE-DELTA )內。

• 端口應該保持其如表6-13所定義的低阻抗接收器終端阻抗(low-impedance receiver termination)(RRX-DC)。

• 當下行端口處於U2時,其上行端口可能處於U1或者U2。如果上行端口處於U1,它就會週期性地發送Ping.LFPS。下行端口應該區分Ping.LFPS和U1 LFPS退出握手信號(U1 LFPS exit handshake signaling)。

• 端口應該使能其如第6.9.2節所定義的U2退出檢測功能。

• 當啓動從U2退出時,端口應該使能其LFPS發射器。

• 下行端口應該每100ms執行一次遠端接收器終端阻抗檢測(far-end receiver termination detection)。

7.5.8.2 退出U2

• 當被指示時,下行端口應該轉換進入SS.Disabled。

• 當檢測到如表6-13所定義的遠端高阻抗接收器終端阻抗(far-end high-impedance receiver termination)(ZRX-HIGH-IMP-DC-POS)時,下行端口應該轉換進入Rx.Detect。

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

• 一旦沒檢測到如第11.4.5節所定義的有效的Vbus,自供電的上行端口(self-powered upstream port)應該轉換進入SS.Disabled。

• 如第10.4.2.4節和第10.6.2.4節所定義的那樣,一旦U2不活動定時器超時,端口應轉換進入U2。

• 一旦成功完成一個滿足第6.9.2節所定義的U1 LFPS退出握手信號(U1 LFPS exit handshake signaling)的LFPS握手時,端口應該轉換進入Recovery。

• 一旦2ms LFPS握手定時器超時,並且沒有實現一個成功的滿足第6.9.2節所定義的U1 LFPS退出握手信號(U1 LFPS exit handshake signaling)的LFPS握手,則端口應該轉換進入SS.Inactive。

 

7.5.9 U3

U3是設備被置於掛起(suspend)的狀態。大量鏈路和設備功耗可被節省。

U2不包含任何子狀態。圖7-19顯示了到其他狀態的轉換。

7.5.9.1 U3的要求

• 超高速發射器DC共模電壓(SuperSpeed transmitter DC common mode voltage)不需要處於表6-10所定義的規範(VTX-CM-DC-ACTIVE-IDLE-DELTA )內。

• 端口應該保持其如表6-13所定義的低阻抗接收器終端阻抗(low-impedance receiver termination)(RRX-DC)。

應該禁止LFPS Ping檢測。

• 端口應該使能其如第6.9.2節所定義的U3退出檢測功能。

• 當啓動從U3退出時,端口應該使能其LFPS發射器。

• 下行端口應該每100ms執行一次遠端接收器終端阻抗檢測(far-end receiver termination detection)。

• 不能在tNoLFPSResponseTimeout時間內響應U3 LFPS wakeup的端口可以(may)在準備好返回到U0時發起U3 LFPS wakeup。

7.5.9.2 退出U3

• 當被指示時,下行端口應該轉換進入SS.Disabled。

• 當檢測到如表6-13所定義的遠端高阻抗接收器終端阻抗(far-end high-impedance receiver termination)(ZRX-HIGH-IMP-DC-POS)時,下行端口應該轉換進入Rx.Detect。

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

• 一旦沒檢測到如第11.4.5節所定義的有效的Vbus,自供電的上行端口(self-powered upstream port)應該轉換進入SS.Disabled。

• 如第10.4.2.4節和第10.6.2.4節所定義的那樣,一旦U2不活動定時器超時,端口應轉換進入U2。

• 一旦成功完成一個滿足第6.9.2節所定義的U3 wakeup信號(U3 wakeup signaling)的LFPS握手時,端口應該轉換進入Recovery。

• 一旦10ms LFPS握手定時器超時,並且沒有實現一個成功的滿足第6.9.2節所定義的U3 wakeup握手信號(U3 wakeup handshake signaling)的LFPS握手,則端口應該保持在U3。在100ms延時後,端口可以(may)再次啓動U3 wakeup。

 

7.5.10 Recovery

Recovery鏈路狀態的進入是爲了重新訓練鏈路(retrain the link),或者執行Hot Reset,或者切換到Loopback模式。爲了重新訓練鏈路並最小化恢復時延(recovery latency),兩個鏈路夥伴都不訓練它們的接收器均衡器(receiver equalizers),而是維持最後一次訓練過的均衡器配置(equalizer configurations)。只有TS1和TS2有序集被傳輸,來同步鏈路並交換如表6-5所定義的鏈路配置信息(link configuration information)。

7.5.10.1 Recovery子狀態機(Substate Machines)

Recovery包含一個顯示於圖7-20的具有下列子狀態的子狀態機:

Recovery.Active

Recovery.Configuration

Recovery.Idle

7.5.10.2 Recovery的要求

• 端口應該滿足表6-10所定義的發射器規範。

• 端口應該維持其如表6-13所定義的低阻抗接收器終端阻抗(low-impedance receiver termination) (RRX-DC) 。

• 在Tx Header Buffers和Rx Header Buffers中的所有頭包(header packets)都應該基於第7.2.4節所指定的要求被處理。

7.5.10.3 Recovery.Active

Recovery.Active是通過傳送TS1有序集來訓練超高速鏈路的子狀態。

7.5.10.3.1 Recovery.Active的要求

• 一旦進入該子狀態,應該啓動一個12ms定時器。

• 一旦進入該子狀態,端口應該傳送TS1有序集。

• 端口應該用TS1或者TS2有序集訓練其接收器。

注意:根據鏈路條件和不同的接收器實現,一個端口的接收器可能訓練得比另外一個端口快。當發生此種情形時,接收器最先完成訓練的端口將進入Recovery.Configuration,並開始傳送TS2有序集,而接收器還沒有完成訓練的端口仍然處於Recovery.Active,使用TS2有序集來訓練其接收器。

7.5.10.3.2 退出Recovery.Active

• 一旦接收到8個連續相同的TS1或者TS2有序集,端口應該轉換到Recovery.Configuration

• 當滿足下列條件時,端口應該轉換到SS.Inactive:

1. 要麼Ux_EXIT_TIMER 或者12-ms 定時器超時。

2. 對於下行端口,轉換進入Recovery的目的不是爲了試圖進行Hot Reset。

• 當滿足下列條件時,下行端口應該轉換到Rx.Detect:

1. 要麼Ux_EXIT_TIMER 或者12-ms 定時器超時。

2. 對於下行端口,轉換進入Recovery的目的是爲了試圖進行Hot Reset。

• 當被指示時,下行端口應該轉換進入SS.Disabled。

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

7.5.10.4 Recovery.Configuration

Recovery.Configuration是設計用來通過交換TS2有序集使兩個鏈路夥伴完成超高速握手(SuperSpeed handshake)的子狀態。

7.5.10.4.1 Recovery.Configuration的要求

• 一旦進入該子狀態,端口應該發送相同的TS2有序集,且基於下列情形設置TS2有序集中的鏈路配置字段(link configuration field)。

1. 當被指示時,下行端口應該在TS2有序集中設置Reset位。

注意:上行端口只有在Hot Reset. Active時才能設置TS2有序集中的Reset位。參考第7.5.12.3節的詳情。

2. 當被指示時,下行端口應該在TS2有序集中設置Loopback位。

3. 當被指示時,下行端口應該在TS2有序集中設置Disabling Scrambling位。

• 一旦進入該子狀態,應該啓動一個6ms定時器。

7.5.10.4.2 退出Recovery.Configuration

• 當滿足下列兩個條件時,端口應該轉換到Recovery.Idle:

1. 接收到8個連續且相同的TS2有序集。

2. 在接收到起先的8個連續且相同的TS2有序集之後,發送了16個TS2有序集。

• 當滿足下列條件時,端口應該轉換到SS.Inactive【下列條件已勘誤】:

1. 要麼Ux_EXIT_TIMER 或者6ms 定時器超時。

2. 對於下行端口,轉換進入Recovery的目的不是爲了試圖進行Hot Reset。

• 當滿足下列條件時,下行端口應該轉換到Rx.Detect:

1. 要麼Ux_EXIT_TIMER 或者6ms 定時器超時。

2. 對於下行端口,轉換進入Recovery的目的是爲了試圖進行Hot Reset。

• 當被指示時,下行端口應該轉換進入SS.Disabled。

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

7.5.10.5 Recovery.Idle

Recovery.Idle是一個子狀態,在此期間,端口解碼在Recovery.Configuration期間接收到的TS2有序集,並判定下一個狀態。

7.5.10.5.1 Recovery.Idle的要求

• 一旦進入該子狀態,應該啓動一個2ms定時器。

• 如果下一狀態是U0,則端口應該傳送Idle Symbols。如果下一狀態是Loopback或者Hot Reset,則端口可以(may)傳送Idle Symbols【已勘誤】。

• 端口應該解碼在Recovery.Configuration期間接收到的TS2有序集,並繼續前進到下一個狀態。

• 如果在Recovery.Configuration期間接收到的TS2有序集中的Disabling Scrambling沒有設置,則端口應該默認使能加擾(scrambling)。

• 如果被指示,或者在Recovery.Configuration期間接收到的TS2有序集中的Disabling Scrambling被設置,則端口應該禁止加擾(scrambling)。

• 端口應該能夠從其鏈路夥伴處接收Header Sequence Number Advertisement。

注意:退出時間的差別將導致一個端口先進入U0並開始Header Sequence Number Advertisement,而另一個端口仍然還處於Recovery.Idle。

7.5.10.5.2 退出Recovery.Idle

• 當被指示作爲loopback master並且該端口能夠作爲loopback master時,端口應該轉換到Loopback。

• 如果【在Recovery.Configuration期間接收到的】TS2有序集中的Loopback位被設置,則端口應該轉換到Loopback,作爲loopback slave。

• 當滿足下面兩個條件時,端口應該轉換進入U0:

1. 接收到8個連續的Idle Symbols。

2. 在接收到一個Idle Symbol後,發送了16個Idle Symbols。

• 當下面兩個定時器之一超時並且轉換到U0的條件不滿足時,端口應該轉換進入SS.Inactive:

1. Ux_EXIT_TIMER

2. 2ms定時器

• 當被指示時,下行端口應該轉換進入Hot Reset

• 當被指示時,下行端口應該轉換進入SS.Disabled。    

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

• 如果【在Recovery.Configuration期間接收到的】TS2有序集中的Reset位被設置,則端口應該轉換到Hot Reset。

7.5.11 Loopback

Loopback是爲了測試以及錯誤隔離而設。Loopback包含一個在第6章中描述的比特誤差率測試【bit error rate test (BERT)】。

請求loopback的端口是loopback master。傳送從loopback master處接收到的符號的端口是loopback slave。

在Loopback.Active期間,loopback slave必須支持第6章定義的BERT協議。loopback slave必須響應BERT錯誤計數復位(error counter reset)和BERT 報告錯誤計數(report error count)命令。loopback slave必須爲迴環數據模式(loopback data pattern)檢查輸入數據(incoming data)。

7.5.11.1 Loopback子狀態機(Substate Machines)

Loopback包含如圖7-21所顯示的具有下列子狀態的狀態機。

Loopback.Active

Loopback.Exit

7.5.11.2 Loopback的要求

• 應該有一個loopback master 和一個loopback slave。loopback master 是在TS2有序集中的Loopback位被設置的端口。

• 端口應該維持表6-10所定義的發射器規範。

• 端口應該維持表6-13所定義的低阻抗接收器終端阻抗(low-impedance receiver termination) (RRX-DC) 。

7.5.11.3 Loopback.Active

Loopback.Active是loopback test活躍的子狀態。在此期間,loopback master正在向loopback slave發送數據/命令(data/commands)。loopback slave要麼在迴環數據(looping back the data),要麼就在檢測/執行(detecting/executing)從loopback master處接收到的命令。

7.5.11.3.1 Loopback.Active的要求

loopback master 應該發送具有必要的SKPs的有效8b/10b數據。

loopback slave 應該重傳接收到的10-bit符號。

loopback slave 不應該修改接收到的10-bit符號,除了如果必要可以通道極性反轉(lane polarity inversion),以及可以適時插入或者去除SKP有序集。

注意:這意味着loopback slave應該禁止或者略過(disable or bypass)其自己的8b/10b編碼器/解碼器(encoder/decoder)以及加擾器/解擾器(scrambler/descrambler)。

loopback slave必須如第節定義的那樣處理BERT命令。

LFPS接收器(LFPS receiver) 應該被使能。

7.5.11.3.2 退出Loopback.Active

• 當被指示時,下行端口應該轉換進入SS.Disabled

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

• 當被指示時,loopback master應該轉換進入Loopback.Exit

• 一旦檢測到滿足第6.9.2節所定義的Loopback LFPS退出信號(Loopback LFPS exit signaling)的Loopback LFPS退出握手信號(Loopback LFPS exit handshake signal),loopback slave就應該轉換進入Loopback.Exit

7.5.11.4 Loopback.Exit

Loopback.Exit是loopback master 已經完成loopback test並開始從Loopback模式退出的子狀態。

7.5.11.4.1 Loopback.Exit的要求

• 一旦進入該子狀態,應該啓動一個2ms定時器。

• 應該使能LFPS發射器和LFPS接收器。

• 端口應該傳送並接收如第6.9.2節所定義的Loopback LFPS退出握手信號(Loopback LFPS exit handshake signal)。

7.5.11.4.2 退出Loopback.Exit

• 在一次成功的如第6.9.2節所定義的Loopback LFPS退出握手信號(Loopback LFPS exit handshake signal)後,端口應該轉換進入Rx.Detect。

• 一旦2ms定時器超時並且轉換到Rx.Detect的條件不滿足,端口應該轉換進入SS.Inactive。

• 當被指示時,下行端口應該轉換進入SS.Disabled

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

 

7.5.12 Hot Reset

只有下行端口可以被指示來發起Hot Reset.

當下行端口發起reset時,它將傳送TS2有序集,其中的Reset位被置位。上行端口應該也發送TS2有序集並將Reset位置位(asserted)來做出響應。一旦完成Hot Reset處理,上行端口應該發送TS2有序集並將Reset位清除(de-asserted)來通知下行端口。下行端口應該發送TS2有序集並將Reset位清除(de-asserted)來響應。一旦兩個端口都接收到TS2有序集並且其中的Reset位被清除(de-asserted),則它們應該退出Hot Reset.Active,並且轉換到Hot Reset. Exit。一旦完成了一個成功的空閒符號握手(idle symbol handshake),則端口應該轉換到U0。

7.5.12.1 Hot Reset 子狀態機(Substate Machines)

Hot Reset包含如圖7-22顯示的子狀態機,具有下列子狀態。

Hot Reset Active

Hot Reset.Exit

7.5.12.2 Hot Reset的要求

• 下行端口應該如第7.4.2節定義的那樣復位其Link Error Count。

• 下行端口應該復位其PM定時器以及相關的U1和U2超時值到0。

• 端口配置信息(port Configuration information)應該維持不變(參考第8.4.6節的詳情)。

• 端口應該維持其表6-10所定義的發射器規範。

• 端口應該維持其如表6-13所定義的低阻抗接收器終端阻抗( low-impedance receiver termination) (RRX-DC)。

7.5.12.3 Hot Reset.Active

Hot Reset.Active是端口將執行如第7.4.12.2節所定義的復位的子狀態。

7.5.12.3.1 Hot Reset.Active的要求

• 一旦進入該子狀態,端口應該首先連續傳送至少16個Reset位被置位(asserted)的TS2有序集。

注意:根據兩個端口進入Hot Reset的時間延遲,當下行端口正在傳送最先的16個Reset位被置位(asserted)的TS2有序集的時候,它可能仍然能夠收到正在從Polling.Configuration 或者 Recovery.Configuration退出的上行端口所發出的部分TS2有序集。下行端口應該忽略這些TS2有序集。同樣,一旦進入該子狀態,兩個端口都應該忽略TS2有序集鏈路配置字段(link configuration field)中的Disabling Scrambling位。這一位只在Polling.Idle或者Recovery.Idle中解碼。【已勘誤】。

• 一旦進入該子狀態,應該啓動一個12ms定時器。

• 下行端口應該繼續傳送Reset位置位(asserted)的TS2有序集,直到上行端口從傳送Reset位置位(asserted)的TS2有序集轉換到傳送Reset位被清除(de-asserted)的TS2有序集。

• 在執行Hot Reset過程中,上行端口應該傳送Reset位置位(asserted)的TS2有序集。

• 在執行完成Hot Reset之後,上行端口應該傳送Reset位被清除(de-asserted)的TS2有序集。

• 端口應該執行在本節描述的Hot Reset的要求中的Hot Reset 。

7.5.12.3.2 退出Hot Reset.Active

• 當下列3個條件滿足時,端口應該轉換到Hot Reset.Exit:

1. 至少已傳送了16個傳送Reset位置位(asserted)的TS2有序集。

2. 接收到了兩個連續的Reset位被清除(de-asserted)的TS2有序集。

3. 在接收到一個Reset位被清除(de-asserted)的TS2有序集之後,傳送了4個傳送Reset位置位(asserted)的TS2有序集。

• 一旦12ms定時器超時並且轉換到Hot Reset.Exit 的條件不滿足時,端口應該轉換到SS.Inactive。

• 當被指示時,下行端口應該轉換進入SS.Disabled

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

7.5.12.4 Hot Reset.Exit

Hot Reset.Exit是端口已經完成了Hot Reset並已準備好從Hot Reset退出的子狀態。

7.5.12.4.1 Hot Reset.Exit的要求

• 端口應該傳送空閒符號(idle symbols)。

• 一旦進入該子狀態,應該啓動一個2ms定時器。

• 端口應該能夠從其鏈路夥伴處接收Header Sequence Number Advertisement。

注意:退出時間的差別將導致一個端口先進入U0並開始Header Sequence Number Advertisement,而另一個端口仍然還處於Hot Reset.Idle。

7.5.12.4.2 退出Hot Reset.Exit

• 當滿足下面兩個條件時,端口應該轉換進入U0:

1. 接收到8個連續的Idle Symbols。

2. 在接收到一個Idle Symbol後,發送了16個Idle Symbols。

• 一旦2ms定時器超時,而轉換進入U0的條件不滿足,則端口應該轉換進入SS.Inactive。

• 當被指示時,下行端口應該轉換進入SS.Disabled。    

• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。

• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章