原文地址 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 | 由接受進入U1,U2或者U3的端口發送。 |
LXU | 由拒絕進入U1或U2的端口發送。 |
LPMA | 由端口在接收到LAU時發送。用來配合(in conjunction with)LGO_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:
- 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。
- 它已經發送了所有接收到的頭包的LGOOD_n以及LCRD_x。
- 它已經接收到了所有已經發送的頭包的LGOOD_n以及LCRD_x。
注意: 這暗指在端口可以發起轉換到低功耗鏈路狀態之前,所有的信用(credits)都必須被接收到並返回。
- 它沒有等待傳輸的包。
4. 一旦進入U0,它已經完成Header Sequence Number Advertisement和Rx Header Buffer Credit Advertisement。
• 在響應接收到一個LGO_U1 or LGO_U2時,端口應該做以下事項之一:
1. 如果Force Link PM Accept字段由於已經接收到一個Set Link Functionality LMP而被設置,端口應該發送一個LAU。
a. 對所有接收到的包,已經發送了LGOOD_n, LCRD_x序列。
b. 對所有已經發送了的包,接收到了LGOOD_n, LCRD_x序列。
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,端口應該繼續接收並處理包和鏈路命令。
• 在PM_LC_TIMER過期時如果還沒收到一個LAU或者LXU,則端口應該啓動轉換進入Recovery。
• 一旦發送了LAU,端口應啓動PM_ENTRY_TIMER。
• 當接收到LAU時,端口應該發送一個LPMA並進入請求的低功耗狀態。
• 一旦發送了LAU or LPMA,端口不應該發送任何包和鏈路命令。
• 在PM_ENTRY_TIMER超時前接收到LPMA,則發送LAU的端口應該進入相應的低功耗鏈路狀態。
• 在PM_ENTRY_TIMER超時時,如果下列所有條件都滿足,則發送LAU的端口應該進入相應的低功耗鏈路狀態
注意:這意味着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。
1. 端口的U2不活動定時器(U2 inactivity timer)被使能了。
2. U2不活動定時器(U2 inactivity timer)超時,沒有接收到U1 LFPS退出信號。
7.2.4.2.4 U3 進入流程【U3 Entry Flow】
• 當被指示時,下行端口應該發送一個LGO_U3來啓動U3進入。
• 當發送LGO_U3時,下行端口應該啓動其PM_LC_TIMER。
• 一旦發送了LAU之後,上行端口不能發送任何包和鏈路命令。
• 當發送了LGO_U3,下行端口應該忽略上行端口發送的任何包。
注意:這是一個邊角情形,上行端口在接收到LGO_U3之前正在發送頭包。
• 在接收到LGO_U3時,上行端口應該以LAU響應。對所有未被確認的包的處理應該被中止。
• 一旦發送了LAU,上行端口應啓動PM_ENTRY_TIMER。
• 當接收到LAU時,下行端口應該發送一個LPMA並轉換進入U3。
• 如果下列3個條件都滿足,下行端口應該轉換到Recovery,並在重新進入U0後重新啓動U3進入:
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】
• 發送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】
7.3.2 鏈路錯誤類型,檢測和恢復【Link Error Types, Detection, and Recovery】
在鏈路層有多種類型的錯誤。這包括包或鏈路命令的錯誤,或者在鏈路訓練過程中的錯誤,或者當鏈路從一個狀態轉換到另一個狀態過程中的錯誤。本節詳細描述如何檢測和從這些鏈路錯誤中恢復。
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)
7.3.3.1 包分幀錯誤【Packet Framing Error】
包分幀有序集(packet framing ordered set)被構建成即使有序集中出現任何單個K-符號損壞,也不會妨礙其包分幀的識別(packet framing recognition)。
• 如果下列兩個條件被滿足,應該聲明一個有效的HPSTART有序集:
注意:如果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】
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】
• 如果滿足下列條件,則應該發生Rx Header Sequence Number錯誤。
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】
1. 至少在4個連續的符號週期的4個K-符號中的3個是有效的鏈路命令K-符號(link command K-symbols)。
• 如果兩個鏈路命令字都相同,並且都包含有效的鏈路命令信息(如表7-4定義),並且他們都通過CRC-5檢查,則申明有效的鏈路命令【已勘誤】。
• 如果檢測到了一個鏈路命令但是沒有滿足有效鏈路命令的條件,則申明無效的鏈路命令。
• 檢測到丟失GOOD_n 或 LCRD_x的端口應該轉換進入Recovery。
• 檢測到丟失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】
• 如果下列條件被滿足,則聲明一個ACK Tx Header Sequence Number錯誤:
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】
• 如果下列條件之一是真,則發生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】
• 如果下列條件之一是真,則發生Rx Header Buffer Credit Advertisement錯誤:
1. CREDIT_HP_TIMER超時但是沒有接收到LCRD_x。
3. 在LCRD_x之前接收到LGO_Ux。
• 檢測到Rx Header Buffer Credit Advertisement錯誤的端口應該轉換到Recovery。
• Link Error Count應該在每次由於出錯而轉換到Recovery時被增加1。
7.3.8 訓練序列錯誤【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。
6. 如果練序列錯誤(Training Sequence error)發生在Recovery期間,上行端口應該轉換到SS.Inactive。
7.3.9 8b/10b錯誤
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)鏈路命令或頭包。這包含但是不限於如下情形:
4. 接收到LGOOD_n,既不是Header Sequence Number Advertisement,也不是頭包確認。
這而錯誤情形大部分不是由於鏈路錯誤造成。端口在這些情形下的行爲是未定義的,從而特定於具體實現。建議端口忽略這些不期望的鏈路命令或頭包。
7.4 上電覆位和帶內復位【PowerOn Reset and Inband Reset】
7.4.1 上電覆位(PowerOn Reset)
1. 接收器終端阻抗應該滿足表6-13中所定義的ZRX-HIGH-IMP-DC-POS規範。
2. 發生器應該維持表6-11所定義的常量DC共模電壓【constant DC common mode voltage (VTX-DC-CM)】。
當上電覆位(PowerOn Reset)完成時或者VBUS有效時,下面事項應該發生:
2. TSSM和PHY層變量(例如Rx均衡器設置)應該被複位到它們的默認值。
3. 端口的接收器終端阻抗應該滿足表6-13所定義的RRX-DC規範。
注意:Rx termination應該在除SS.Disabled以外的整個操作過程中總是被維持。
7.4.2 帶內復位(Inband Reset)
• 上行端口的端口配置信息(port configuration information)應該維持不變。參考第8.4.5節和第8.4.6節的詳情。
• 端口的LTSSM應該從Rx.Detect和Polling轉換到U0【已勘誤】。
• 上行端口的端口配置信息(port configuration information)應該維持不變。參考第8.4.5節和第8.4.6節的詳情。
• PHY層變量(例如Rx均衡器設置)應該被重新初始化或者重新訓練。
當被指示"PORT_RESET"時,下行端口應該基於下列條件,要麼發送一個Hot Reset,要麼發送一個Warm Reset:
• 如果下行端口處於U3,或者Loopback,或者Compliance Mode,或者SS.Inactive,應該使用Warm Reset。
• 如果下行端口處於過渡性狀態Polling或者Recovery,它應該使用Hot Reset。
- 如果Hot Reset失敗是由於LFPS握手超時,下行端口應該轉換到SS.Inactive,直到軟件干預,或者直到檢測到上行端口移除。
- 如果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)】
第三,兩個其他鏈路狀態,Loopback 和 Compliance Mode,被引入來進行比特錯誤測試以及發射器兼容性測試。
配置信息和請求發起LTSSM狀態轉換主要是被軟件控制。所有的LTSSM引用到"被指示"【"directed"】都是指上層機制。
在狀態機描述中,進入以及退出的條件列表並沒有被冠以優先級。狀態機圖指示概覽,肯泵沒包含所有的轉換條件。
【勘誤:上表中,U0 – RxDetect – 1 ms一行實際應該爲U0 – Recovery – 1 ms】
所有狀態機圖都有轉換條件的描述。這些描述僅供參考(informative only)。確切的狀態轉換的實現應該遵循各節的描述。
7.5.1 SS.Disabled
對於自供電的上行端口(self-powered upstream port),SS.Disabled也是一個邏輯上的power-off狀態。
7.5.1.1 SS.Disabled 的要求
• 端口的接收器終端阻抗應該呈現如表6-13所定義的到地的高阻抗(high impedance to ground)ZRX-HIGH-IMP-DC-POS。
• 端口應該被禁止發送和接收LFPS和SuperSpeed信號。
7.5.1.2 退出SS.Disabled
• 上行端口只有當VBUS轉換到有效,或者檢測到USB 2.0復位時,才能轉換到Rx.Detect 。
7.5.2 SS.Inactive
7.5.2.1 SS.Inactive子狀態機(Substate Machines)
• SS.Inactive.Disconnect.Detect
7.5.2.2 SS.Inactive的要求
• 接收器終端阻抗(receiver termination)應該滿足表6-13所指定的(RRX-DC)的要求。
• 在該狀態,發射器共模電壓(transmitter common mode)不要求處於規範的要求之內。
7.5.2.3 SS.Inactive.Quiet
7.5.2.3.1 SS.Inactive.Quiet的要求
• 遠端接收器終端阻抗檢測(far-end receiver termination detection)功能應該被禁止。
7.5.2.3.2 退出SS.Inactive.Quiet
• 一旦12ms定時器過期,端口應該轉換進入SS.Inactive.Disconnect.Detect。
• 當Warm Reset被髮送後,下行端口應該過度到Rx.Detect。
• 一旦檢測到Warm Reset,上行端口應該過度到Rx.Detect。
7.5.2.4 SS.Inactive.Disconnect.Detect
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
7.5.3 Rx.Detect
7.5.3.1 Rx.Detect子狀態機(Substate Machines)
Rx.Detect 包含一個具有下列子狀態的子狀態機顯示於圖7-15:
7.5.3.2 Rx.Detect 的要求
• 在該狀態,發射器共模電壓(transmitter common mode)不要求處於規範的要求之內。
• 表6-13所指定的接收器終端阻抗(receiver termination)(RRX-DC)應該被保持滿足(maintained)。
7.5.3.3 Rx.Detect.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。
• 下行端口應該在按照表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
7.5.3.5 Rx.Detect.Active的要求
• 發射器應該啓動如第6.11節所定義的遠端接收器終端阻抗檢測(far-end receiver termination detection)。
注意:該計數被外圍設備用來判定何時需要轉換進入SS.Disabled。它也被集線器用來控制其下行端口狀態機。參考第10.3.1.1節的詳情。
7.5.3.6 退出Rx.Detect.Active
• 端口應該在檢測到表6-13定義的遠端低阻抗接收器終端阻抗(far-end low-impedance receiver termination)(RRX-DC)的時候,轉換進入Polling。
• 當滿足下列條件時,外圍設備的上行端口應該轉換到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個。
7.5.3.7 Rx.Detect.Quiet
7.5.3.7.1 Rx.Detect.Quiet的要求
• 遠端接收器終端阻抗檢測(far-end low-impedance receiver termination detection)應該被禁止。
7.5.3.7.2 退出Rx.Detect.Quiet
• 一旦12ms定時器過期時,端口應該轉換進入Rx.Detect.Active。
7.5.4 Polling
7.5.4.1 Polling子狀態機(Substate Machines)
Polling包含如圖7-16所示的子狀態機,具有如下子狀態:
7.5.4.2 Polling的要求
端口應該保持其如表6-13所定義的低阻抗接收器終端阻抗檢測(low-impedance receiver termination)(RRX-DC)。
7.5.4.3 Polling.LFPS
7.5.4.3.1 Polling.LFPS的要求
• 一旦進入該子狀態,應該使能一個LFPS接收器,以便接收如第6.9.1節定義的Polling.LFPS信號。
• 一旦進入該子狀態,端口應該在80 μs內建立起其LFPS操作條件。
• 超高速PHY的操作條件應該在端口準備好退出到Polling.RxEQ的時候建立起來。
• 超高速接收器可以可選地被使能,以接收TSEQ有序集來進行接收器均衡器訓練(receiver equalizer training)。
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:
• 在PowerOn Reset後訓練過一次之後,一旦360ms定時器超時,而又不滿足轉換到Polling.RxEQ的條件,則下行端口應該轉換到Rx.Detect。
• 在PowerOn Reset後訓練過一次之後,一旦360ms定時器超時,而又不滿足轉換到Polling.RxEQ的條件,則集線器的上行端口應該轉換到Rx.Detect。
• 在PowerOn Reset後訓練過一次之後,一旦360ms定時器超時,而又不滿足轉換到Polling.RxEQ的條件,則集線器外圍設備應該轉換到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)應該被使能。
• 端口應該在從該子狀態退出時完成接收器均衡訓練(receiver equalizer training)。
7.5.4.4.2 退出Polling.RxEQ
• 在連續傳送65,536個如表6-2所定義的TSEQ有序集之後,端口應該轉換到Polling.Active。
• 當被指示發送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的要求
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位。
7.5.4.6.2 退出Polling.Configuration
• 當滿足下列兩個條件時,端口應該轉換到Polling.Idle:
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有序集,並繼續前進到下一個狀態。
• 上行端口應該復位其端口配置信息到默認值。參考第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【已勘誤】。
• 端口應該能夠從其鏈路夥伴處接收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。
• 如果在Polling.Configuration期間接收到的TS2有序集中的Reset位被設置,則端口應該轉換到Hot Reset。
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)。
• 一旦檢測到一個如第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-13中所定義的低阻抗接收器終端阻抗(low-impedance receiver termination) (RRX-DC)。
• 下行端口應該使能一個1ms定時器來測量兩個連續鏈路命令(link commands)之間的時間間隔(time interval)。該定時器在每次接收到一個鏈路命令時將被複位並重啓。
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。
• 當PENDING_HP_TIMER在第四次連續超時時(times out for the fourth consecutive time),端口應該轉換到SS.Inactive。
注意:這暗含着鏈路已經連續3次轉換進入Recovery,並且每次轉換進入Recovery都是由於PENDING_HP_TIMER超時。
• 當被指示時,下行端口應該轉換進入SS.Disabled。
• 當被指示時,下行端口應該轉換進入SS.Inactive。
• 當被指示時,上行端口應該轉換進入SS.Disabled。
如果端口在tPortConfiguration時間內還沒有接收到LMP,下行端口應該被指示轉換到SS.Inactive,而上行端口應該被指示轉換到SS.Disabled。
• 當被指示發送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的要求
• 端口應該保持其如表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)。
• 下行端口應該使能一個300ms定時器。當接收到一個Ping.LFPS時,該定時器將被複位並重啓(reset and restarted)。
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。
7.5.8 U2
U2是相比于于U1能更節能的鏈路狀態,當時具有更多的退出時延(increased exit latency)。
7.5.8.1 U2的要求
• 端口應該保持其如表6-13所定義的低阻抗接收器終端阻抗(low-impedance receiver termination)(RRX-DC)。
• 端口應該使能其如第6.9.2節所定義的U2退出檢測功能。
• 下行端口應該每100ms執行一次遠端接收器終端阻抗檢測(far-end receiver termination detection)。
7.5.8.2 退出U2
• 當被指示時,下行端口應該轉換進入SS.Disabled。
• 當被指示發送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。
7.5.9 U3
U3是設備被置於掛起(suspend)的狀態。大量鏈路和設備功耗可被節省。
7.5.9.1 U3的要求
• 端口應該保持其如表6-13所定義的低阻抗接收器終端阻抗(low-impedance receiver termination)(RRX-DC)。
• 端口應該使能其如第6.9.2節所定義的U3退出檢測功能。
• 下行端口應該每100ms執行一次遠端接收器終端阻抗檢測(far-end receiver termination detection)。
• 不能在tNoLFPSResponseTimeout時間內響應U3 LFPS wakeup的端口可以(may)在準備好返回到U0時發起U3 LFPS wakeup。
7.5.9.2 退出U3
• 當被指示時,下行端口應該轉換進入SS.Disabled。
• 當被指示發送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。
7.5.10 Recovery
7.5.10.1 Recovery子狀態機(Substate Machines)
Recovery包含一個顯示於圖7-20的具有下列子狀態的子狀態機:
7.5.10.2 Recovery的要求
• 端口應該維持其如表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的要求
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位。
7.5.10.4.2 退出Recovery.Configuration
• 當滿足下列兩個條件時,端口應該轉換到Recovery.Idle:
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的要求
• 如果下一狀態是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。
2. 在接收到一個Idle Symbol後,發送了16個Idle Symbols。
• 當下面兩個定時器之一超時並且轉換到U0的條件不滿足時,端口應該轉換進入SS.Inactive:
• 當被指示時,下行端口應該轉換進入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。
7.5.11.1 Loopback子狀態機(Substate Machines)
Loopback包含如圖7-21所顯示的具有下列子狀態的狀態機。
7.5.11.2 Loopback的要求
• 應該有一個loopback master 和一個loopback slave。loopback master 是在TS2有序集中的Loopback位被設置的端口。
• 端口應該維持表6-13所定義的低阻抗接收器終端阻抗(low-impedance receiver termination) (RRX-DC) 。
7.5.11.3 Loopback.Active
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必須如第節定義的那樣處理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。
7.5.11.4 Loopback.Exit
Loopback.Exit是loopback master 已經完成loopback test並開始從Loopback模式退出的子狀態。
7.5.11.4.1 Loopback.Exit的要求
• 端口應該傳送並接收如第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
7.5.12.1 Hot Reset 子狀態機(Substate Machines)
Hot Reset包含如圖7-22顯示的子狀態機,具有下列子狀態。
7.5.12.2 Hot Reset的要求
• 下行端口應該如第7.4.2節定義的那樣復位其Link Error Count。
• 下行端口應該復位其PM定時器以及相關的U1和U2超時值到0。
• 端口配置信息(port Configuration information)應該維持不變(參考第8.4.6節的詳情)。
• 端口應該維持其如表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過程中,上行端口應該傳送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的要求
• 端口應該能夠從其鏈路夥伴處接收Header Sequence Number Advertisement。
注意:退出時間的差別將導致一個端口先進入U0並開始Header Sequence Number Advertisement,而另一個端口仍然還處於Hot Reset.Idle。
7.5.12.4.2 退出Hot Reset.Exit
2. 在接收到一個Idle Symbol後,發送了16個Idle Symbols。
• 一旦2ms定時器超時,而轉換進入U0的條件不滿足,則端口應該轉換進入SS.Inactive。
• 當被指示時,下行端口應該轉換進入SS.Disabled。
• 當被指示發送Warm Reset時,下行端口應該轉換進入Rx.Detect。
• 當檢測到Warm Reset時,上行端口應該轉換進入Rx.Detect。