搜尋此網誌

2011年4月23日 星期六

[AHCI]Error Reporting and Recovery[錯誤報告與恢復]

6. Error Reporting and Recovery[譯自AHCI 1.0]

全部錯誤發生在HBA內的Port。沒有錯誤適用到整個主要控制器。有幾個錯誤來源可能會發生在轉換期間。錯誤範例如:
  • System Memory – 壞掉的記憶體指標造成資料的取得和儲存被遺失。
  • Interface/Device – 例如CRC的問題,非法的狀態機轉換,還有一些其他。
6.1 Error Type
6.1.1 System Memory Errors
系統記憶體錯誤例如指示目標中途發生失效、主要的錯誤、還有同位,這些可能會引起主要去停止處理目前的處理命令。從外部軟體干預,有嚴重的錯誤不能作重新恢復(6.2.2節)。
當系統軟體供給一個指標指到HBA,其實際的記憶體不存在,此時引發主要/目標的失敗錯誤。當發生這時,HBA轉換失敗(如果無法避免)如同6.2.1節所描述。當這完成時,HBA設定PxIS.HBFS。如果PxIE.HBFE與GHC.IE有設定時,HBA此時也將引發一個中斷。
一個資料發生錯誤(例如CRC或同位),能或不能作轉換。如果錯誤發生在取得CFIS、PRD entry或Command list時,HBA將停止。如果錯誤發生在一個FIS資料或ACMD區域,這HBA是允許去停止,但可能會繼續。當發生這時,HBA轉換失敗(如果無法避免)如同6.2.1節所描述。當這完成時,HBA設定PxIS.HBDS。如果PxIE.HBDE與GHC.IE有設定時,HBA此時也將引發一個中斷。
如果HBA繼續之後,在資料或ACMD區域又有資料錯誤,它將阻礙資料FIS的CRC轉換到裝置上。

6.1.2 Interface Errors
介面錯誤是由於在介面的電子發佈產生錯誤,或是在裝置跟HBA之間的通訊協定。取決於錯誤的型態,被設定在PxSERR不同的bit。當這些bit被設定時,PxIS.IFS(fatal)或PxIS.INFS(non-fatal)兩者其中之一就設定,還有如果在Enable的情況下,HBA將引起一個中斷。
造成PxIS.IFS/PxIS.INFS被設定的情況:
  • 在PxSERR.ERR的區域中,P bit被設定成1。
  • 在PxSERR.ERR的區域中,C bit或H bit被設定成1。
  • PhyRdy未意料的終止
這些錯誤型態範例下,對於符合適當的條件,其對應PxSERR的bit將會設定。
當錯誤發生時,在PxIS.IFS PxIS.INFS之間唯一的差別是設定傳送/接收的FIS類型。如果錯誤發生在非資料的FIS期間,FIS必須被重新傳送,所以PxIS.INFS被設定,則錯誤是非致命的。如果錯誤發生在資料FIS期間,傳送將被停止,所以PxIS.IFS被設定,則錯誤是致命的。
在這非資料FIS錯誤事件中,看一個非資料FIS失敗與試圖去重新傳送之間,這HBA可能接收來自裝置其他的FIS(當它執行native command queuing command這很可能將會發生)。當這發生,HBA必須同意這FIS,執行適當的行動,以及重試這失敗的FIS
如果HBA傳送一個資料FIS,它不重試FIS,且它會等待軟體去清除PxCMD.ST0HBA在傳送一個失敗,將連續不斷的重新傳送一個非資料的FIS,直到任一個傳送成功;或者是系統軟體經由清除PxCMD.ST0去停止控制器。
  • Received Disparity Error /Illegal Character(K28.3)當遇到一個不等的錯誤時, HBA認為這種特徵的不等是正確的,並且在8b/10b解碼器重新運轉的不等計數器。 沒有錯誤時bit將被設定。

  • Received Disparity Error /Illegal Character(D)當這發生時,HBA在FIS結束回傳R_ERR。它設定PxSERR.DIAG.B。注意那PxIS.IFS/PxIS.INFS將不被設定;由於這事件有發生CRC錯誤的可能將會設定適當的bit。如果那裡是一個不合法的特性在FIS範圍之外,HBA可能不理會這事件,還有不需要去設定PxSERR.DIAG.B

  • PhyRdy Dropping Unexpectedly當這發生,HBA恢復成空閒狀態。如果PhyRdy信號終止在命令期間中,HBA可能必須被Restart。如果PhyRdy信號中止一個在FIS範圍外,不去設定PxIS.IFS,也不去設定PxIS.INFS。

  • Calculated Different CRC than Received當這發生時,HBA會回傳R_ERR和恢復成空閒狀態。它會去設定PxSERR.DIAG.C。

  • Incorrect FIS or FIS with Illegal Length for Corresponding FIS Type Received當這發生時,HBA在FIS結束回傳R_ERR,將不去寄送FIS到Memory,還有恢復成空閒狀態。它會去設定PxSERR.ERR.P。這只為支援FIS型態做的。一個未知FIS不審慎考慮一個不合法FIS,除非接收長度大於64 bytes。如果一個被送來未知FIS符合長度<=64 bytes,它會被寄送,則那HBA 將繼續正常運作。

  • Internal Buffer Overflow當HBA送HOLD時發生了,但是HBA沒有足夠的速度去接收一個HOLDA,並且HBA內部資料先進先出的溢位。HBA在FIS結束回傳R_ERR,它會去設定PxSERR.ERR.P。

  • HBA Receives R_ERR如果HBA接收到一個R_ERR,它是因為在傳送一個FIS所發生的,它將設定PxSERR.DIAG.H。

  • FIS received from a devicewhere both BSY and DRQ are to be updated in the Status register and both PxTFD.STS.BSY and PxTFD.STS.DRQ are cleared當這發生時,HBA回傳R_OK,不做任何錯誤的設定,與不做任何暫存器的更新,還是接收FIS面積基於接收FIS(i.e. 忽視FIS)。因為當在Port Multiplier中有列舉裝置時,這是個有效的事件,所以沒有錯誤bit被設定。

它是系統軟體責任週期性地去檢查PxSERR暫存器,判定是否正常完整的操作界面, 並且如果當界面錯誤出現時,(例如去一般普遍情況1(Generation1)以高速的操作或者通知用戶),採取適當措施。
注意當一個錯誤,像是發生一個CRC損壞或是一個違反規則的長度,HBA不能相信進來的FIS是正確的。例如:HBA可能以為FIS是一個D2H暫存器的FIS,但如果CRC不是正確的,它可能是因為在FIS指定型態不正確。
處理這個問題,HBA將不更新它的內部暫存器,也不更新FIS接收面積,直到它確定接收一個有效非資料的FIS。如果HBA認為FIS是一個資料FIS,然而,挪用PRD位置它可能複製它到記憶體。這是因為資料FIS可能只要8K。當這是一個CRC錯誤時,HBA基於FIS的內容可能設定其他錯誤或診斷的bit;由於CRC錯誤,這些bit可能不是完整精確的。由於一個非致命的CRC錯誤,它可能是一個致命的錯誤引起的。在這事件中,軟體將執行一個標準程序去重新獲得來自一個致命的錯誤。

6.1.3 Port Multiplier Error
當一個Port Multipler被連接,假設接收來自一個裝置的FIS,預期在PMP區域中沒有符合,這HBA回傳R_OK和PxIS.IPMS。基於FIS內容HBA將拋棄訊息包和不更新任何暫存器或記憶體結構。在基本命令的切換,這表示唯一行動的PMP Port不是正確的回傳。在FIS基本切換,這表示PMP區域被回傳不是在PMP的行動列。

6.1.4 Device Errors
當更新工作檔案FIS送達時,HBA去查看PxTFD.STS.ERR的設定。如果它是,以及PxIE.TFEE被設定,HBA將引起一個中斷和停止處理任何附加的命令。

6.1.5 Command List Overflow
Command List溢位被定義為建構command Table的軟體,對於較少統計出的byte數量與傳送到裝置的交易數量值作比較。當device寫入時,HBA將執行資料輸出,然後變更為讀取時,此時將沒有空間去存放資料。
對於資料讀取的溢位,在PIO或DMA兩者之中HBA將設定PxIS.OFS,並且必須經由致能設定PxIE.OFE與GHC.IE才會引起中斷。當這種情況發生在資料讀取時,HBA將繼續盡力去執行;然而在沒有軟體介入時,HBA將不能夠去重新恢復。溢位是一個嚴重錯誤, 因此軟體應該進行致命錯誤恢復程序去確保HBA被導正回到一種已知狀態繼續之前的行程。在寫入狀態上的溢位,當HBA可能傳送HOLD給裝置設備以來它都沒有處理任何資料去回傳遞增滿足需求數量時,這個嚴重錯誤要求將由軟體使用COMRESET去清除。當DMA資料寫入溢位時,HBA不知道掉了許多資料,直到接收下一個DMA行動才發現。當這發生時,它可能選擇設定PxIS.OFS,並且試圖去終止轉換。對於這種致命的條件,HBA允許在轉換上鎖住不放。當PIO寫入時,HBA接收到PIO架構的FIS,因此知道長度,也因此可能會去選擇設定PxIS.OFS。由於不滿足長度,其轉換結果將是一個錯誤,並且必須使用軟體重新恢復。因此設定PxIS.OFS對於DMAPIO兩者的資料寫入狀態是非必須的。偵測溢位並且設定PxIS.OFSnative command queuing commands也是非必須的。

PxIS.OFS:對於命令的指示HBA接收許多來自裝置的傳送的資料量(byte),去比較PRD table內的指示。

6.1.6 Command List Underflow
Command list底部的流動被定義為建構command table的軟體,對於多數統計的byte數量與傳送到裝置的交易數量值作比較。
對於PIO與DMA兩者資料的寫入,裝置將偵測一個錯誤和終止時的轉換。這些錯誤大部份很可能將要變成致命的錯誤,這會引起Port去做Restart的動作。若是關於讀取方面,HBA將更新它的PRD byte計數值對應接收來自一個最後FIS的統計其byte總數量,並且能正常繼續,但是沒被要求。
對於Native Command Queuing 命令,HBA沒被要求去偵測底部流動狀態。

6.1.7 Native Command Queuing Tag Errors
HBA不主動檢查進入DMA安排FIS去確保PxSACT暫存器對應到Slot的bit被設定。
這是一個動機,如果裝置給一個不正確的Tag,它很可能只是為了一個有效Tag。在這事件中,HBA將看不到錯誤,儘管資料在轉換錯誤發生了。因此,對於不起作用的Tag,在HBA的檢查已經是少數的優勢了。剛好同樣錯誤在Tag事件中進行,資料轉換也發生的錯誤。
現行的錯誤機制用來從這種情況中重新恢復,例如主要匯流排故障或者協議損壞。

6.1.8 PIO Data Transfer Error
根據Serial ATA 1.0a,在最終的資料FIS以前資料FIS必須是構成整體Dword數。如果HBA接收資料FIS轉換需求中,不是一個構成Dword的數,HBA將設定PxSERR.ERR.P為1與設定PxIS.IFS成1,還有停止執行直到軟體對Port作Restart。
HBA將確保在PIO命令期間接收的資料FIS的容量與之前PIO安排的FIS轉換計數方面要相符合。如果之前的PIO安排中的資料FIS容量沒有符合轉換方面計數量,HBA將對資料FIS作出R_ERR的反應,設定PxSERR.ERR.P1,設定PxIS.IFS1,然後停止執行直到軟體對Port作出Restart

6.2 Error Recovery
6.2.1 HBA Aborting a Transfer
當它不能重新恢復HBA偵測到的錯誤,它可能需要去結束在SATA介面的轉換。
為了做這,HBA認定SYNC避免去停止一個損壞的FIS,以及設備什麼時候靜止,就返回空閒狀態。在這裡,SATA裝置將送出一個D2H暫存器的FIS包裝訊息,在轉換過程中以ERR bit來設定指示錯誤。
當一次轉換失敗, 進行錯誤重新恢復之前,HBA不等待D2H暫存器FIS包裝訊息(例如設定中斷狀態bit,並且產生中斷)。這是因為設備可能在一種停留不動的狀態,並且不能產生D2H暫存器FIS包裝訊息。

6.2.2 Software Error Recovery
由於錯誤狀態引發一個中斷,軟體將試圖去重新恢復。致命的錯誤(由這些設定表示PxIS.HBFS、PxIS.HBDS、PxIS.IFS、或PxIS.TFES)將造成HBA進入致命錯誤狀態,以及清除PxCMD.CR。在這狀態中,HBA將不發佈任何新命令,也不去通知DMA安排FIS去處理任何Native Command Queuing命令。要重新恢復的話,必須對Port作Restart;清除PxCMD.ST成0對Port作Restart,然後在設定PxCMD.ST成1。對於非致命的錯誤(由這些設定表示PxIS.INFS或PxIS.OFS)HBA將會繼續運作。
如果裝置預期去傳送一個D2H暫存器FIS包裝訊息,隨著PxTFD.STS.ERR設定成1,以及PxTFD.STS.BSY與PxTFD.STS.DRQ兩者都清除為0,則傳送失敗(請參考6.2.1節)。在這情況下,系統軟體知道裝置是在一個穩定狀態,而且轉換可能就要Restart,而沒有發佈一個COMRESET命令到裝置上。
在致命的錯誤下,軟體必須判斷哪些命令不需被處理,之後再次執行這些命令或者通知上層的軟體有哪些命令發生錯誤。接下來的章節會列出這些複雜的步驟。
偵測到哪些需要軟體執行重新恢復動作的錯誤,軟體將檢查接下來的。在中斷裡軟體會檢查是否有狀態位元被設定:PxIS.HBFS、PxIS.HBDS、PxIS.IFS、還有PxIS.TFES。
無論是執行Non-queued命令或者執行Native Command Quenuing情況之下,如果有以上之任意狀態位元被設定,軟體應當執行適當的錯誤恢復動作。

6.2.2.1 Non-Queued Error Recovery
由於錯誤系統軟體去重新恢復的流程,對於non-queued command得到如下:
  • 讀取PxCI去看哪些命令仍未完成。
  • 當錯誤發生時,讀取PxCMD.CCS判斷HBA處理的位置。
  • 清除PxCMD.ST成0,去Reset PxCI暫存器,等待PxCMD.CR去清除為0。
  • 清除PxSERR中的每個Error bit,致能擷取新的錯誤。
  • 適當的在PxIS裡清理狀態的bit
  • 如果PxTFD.STS.BSY或PxTFD.STS.DRQ被設定成1,發一個COMRESET到裝置上,使它處於空閒狀態。
  • 設定PxCMD.ST成1,致能發佈新命令。
  • 假如軟體不須執行一個Reset(COMRESET或軟體的Reset)作為錯誤的部份重新恢復,就隨意的發佈一個命令去收集關於錯誤的資訊,例如:READ LOG EXT。
然後軟體在完成命令的錯誤跟高階軟體命令未完成的錯誤中任一個,也就是說要重新發佈命令到裝置上。

6.2.2 Native Command Queuing Error Recovery
由於錯誤系統軟體去重新恢復的流程,對於Native Command Queued (NCQ) command得到如下:
  • 讀取PxSACT去看哪些命令仍未完成。
  • 清除PxCMD.ST成0,去Reset PxCI與PxSACT暫存器,等待PxCMD.CR去清除為0。
  • 清除PxSERR中的每個Error bit,致能擷取新的錯誤。
  • 適當的在PxIS裡清理狀態的bit
  • 如果PxTFD.STS.BSY或PxTFD.STS.DRQ被設定成1,發一個COMRESET到裝置上,使它處於空閒狀態。
  • 設定PxCMD.ST成1,致能發佈新命令。
  • 假如軟體不須執行一個Reset(COMRESET或軟體的Reset)作為錯誤的部份重新恢復,就發佈READ LOG EXT去確定錯誤條件所引起。
然後軟體在高階軟體中完成的命令還沒結束與錯誤,也就是說要重新發佈命令到裝置上。

6.2.3 Recovery of Unsolicited COMINIT
主動請求的COMINIT是因為COMRESET發佈到設備上COMINIT沒被收到的結果(參考Serial ATA II:延伸的部份Serial ATA 1.0a與修訂版1.2)。如果HBA在標準的運作時期,接收到一個主動要求的COMINIT ,HBA將執行接下來的動作:
  • 使用COMRESET對設備作出回應。
  • 停止執行直到PxIS.PCS備軟體清除成0。
去偵測這個狀況,在中斷時軟體將檢查PxIS.PCS是否被設定為1。HBA不能確保裝置接收到COMRESET,因為COMINIT可能像在跟HBA請求,如果它碰巧發生在接近發佈COMRESET。所以當軟體偵測PxIS.PCS被設定為1時,軟體應當在第一時間發佈COMRESET,去確保裝置接收到COMRESET。然後軟體應當做出適當的行動去清除PxIS.PCS成0。重新恢復,對於一個致命的動作狀態,軟體將去執行錯誤恢復行動(包括重開控制器)。然後軟體應該進行重新列舉檢查是否一個新設備已經被插入。


沒有留言:

張貼留言