SAS驅動中PHY和PORT的介紹
v0.1 20170412 Felix: Init
這篇文檔是基於內核Linux-v4.10, hisi_sas驅動,介紹phy,port,及其之間的關係。
1、PHY的介紹
1.1、整體理解PHY
SAS協議共有6層,從上到下依次爲: 應用層(application layer), 傳輸層(transport layer),端口層(port layer), 鏈路層(link layer), phy層(phy layer), 物理層(physical layer)。
PHY層定義了8b10b編碼和解碼方式、組成dwords、OOB信號、PHY reset以及速率協商等過程。PHY層的主要作用是實現phy reset系列以及dword的同步。
8b10b編解碼:目的是”直流平衡”,爲的是不出現大量連續的0和1.
Dwords: 有4個字符組成。
OOB信號:是一個不出現在數據幀中的低速信號。包括COMMINIT、COMSAS、COMWAKE三種信號。其中COMWAKE用於SATA與SATA設備、SATA與SAS設備,COMSAS用於SAS設備之間的交互,COMMINIT則是通用語言。
1.2、軟件是怎麼定義PHY
libsas層的phy定義成struct asd_sas_phy。
LLDD層的phy則是對libsas phy做了封裝,定義成struct hisi_sas_phy。
SAS控制器一般支持8個PHY,放在hisi_hba中,HBA初始化的時候統一分配內存,並初始化。在phyup中斷後,會找一個port進行綁定。phydown之後,則與port解綁定。
8個PHY對應的asd_sas_phy及hisi_sas_phy內存是固定的,PHY的下標(0~7)就存在asd_sas_phy中。
小竅門:所有libsas接口用到的phy,都是struct asd_sas_phy,對port也適用。
2.PORT的介紹
1.1、整體理解PORT
端口層實際上起從傳輸層到鏈路層的承接作用。一個或多個phy可以構成一個端口。
硬盤掛是在port上的,可以共享port下面所有的phy資源。還沒弄清楚,一次傳輸具體是使用哪個phy,或者是說phy的選擇是在邏輯上實現的?
2.2、軟件是怎麼定義PORT
與phy的定義類似:
libsas層的port定義成struct asd_sas_port。
LLDD層的port則是對libsas port做了封裝,定義成struct hisi_sas_port。
HBA初始化的時候也分配了8個port的內存,都標記爲未使用,sas_form_port會爲新上來的phy分配port,並調用lldd_port_form()進行綁定。