本文讲述HBA是怎么打开一个链路的过程,我画了一个图,如下,后面会根据该图进行XL状态机进行理解;
1. 相连的phy之间进行速度协商,IDAF交换之后,收到link ready的信号,均处于Idle的状态;
在这个状态下,phy向ECM一直重复发送Idle request.
2. 当HBA发送OPAF给phy0后,phy0的状态转换为Idle-->Request_Path
3. phy0(XL:Request_Path)在该状态时,向ECM发送request path的请求,ECM查找路由表,并根据目标phy8的状态,返回仲裁信息;
会有如下仲裁信息
a. Arbitrating(Normal)
b. Arbitrating(Waiting on partial)
c. Arbitrating(Blocked On Partial)
d. Arbitrating(Waiting On Connection)
当该处于该状态的phy收到如上四个信息后,一方面需要指使transmitter重复的发送AIP(),一方面自己重复的反馈Phy Status()给ECM --(b,c,d的情况)
同时,处于该状态的phy需要管理一个Partial Pathway Timeout timer;
该timer的用法如下:
当收到Arbitrating (Blocked On Partial)后,必须初始化并启动;
如果在timer触发之前,收到了Arbitrating (Waiting On Partial) 或者Arbitrating (Waiting On Connection),则停止该timer.
如果timer触发了,则需要告诉ECM,让ECM处理该timer触发的事件;
即向ECM发一个这样的请求,Partial Pathway Timeout Timer Expired request;
该状态的phy当接收到ECM返回的Arb Reject的时候,则根据Reject的类型,指示transmitter发送如下原语:
Arb Reject (No Destination)----------对应原语------->OPEN_REJECT (No Destination)
Arb Reject (Bad Destination)----------对应原语------->OPEN_REJECT (Bad Destination)
Arb Reject (Connection Rate Not Supported)----------对应原语------->OPEN_REJECT (Connection Rate Not Supported)
Arb Reject (Zone Violation)----------对应原语------->OPEN_REJECT (Zone Violation)
Arb Reject (Pathway Blocked)----------对应原语------->OPEN_REJECT (Pathway Blocked)
Arb Reject (Retry)----------对应原语------->OPEN_REJECT (Retry)
4.当经历了步骤三ECM的仲裁之后,phy0收到了ECM返回的Arb Won,则phy0的状态转换为:Request_Path-->Request_Open
5. phy0(Request_Open), 该状态的作用是将OPEN帧透过ECR发向目标phy.
该状态的phy一方面指使transmitter发送Idle, 一方面向ECR发送一个“Forward Open”的请求,ECR接收到这个请求之后,打开配置好的路由,让OPAF帧传送过到phy8.
phy0干过这个事情之后,就进入Open_Confirm_Wait状态,顾名思义:打开等待确认的状态;
到此为止,phy0的状态历程为:
Idle->Request_Path->Request_Open->Open_Confirm_Wait
此时phy0会一直处于此状态,等待OPEN_ACCEPT或者OPEN_REJECT(调皮一下:即,是死是活要给个话)
等待的时候,还要忙碌如下两件事:
1. 不断的重复的向ECM返回自己的phy状态,Phy Status(partial pathway);
2. 根据从ECR收到的Arb Status(来自于phy4向ECM仲裁时,返回给phy8的原语,phy8收到不同的原语,转化成不同的ArbStatus透过ECR发给phy0)信息不断的指使transmitter发送AIP -- 这点是可以展开的;不同的ArbStatus,对应不同的AIP原语;
OPAF的历程为:
HBA->phy0->phy8
当phy8[Idle]收到来自ECR的Forward Open indication之后,phy8的状态变化为:Idle->Forward_Open
phy8的历程为:
Idle->Forward_Open
下面我们结束对phy0的关注,将开始关注phy8的XL变化
5. 进入Forward_Open的phy8,指使transmitter将OPAF传送出去(即传送到phy4); 此时的phy8不能处理PS_REQ(该源于的作用是让attached phy进入低电状态),如果收到PS_REQ,则指使transmitter传送PS_NAK.
(调皮一下~~ phy8心想:老子刚刚传送了OPAF,对端忙着呢,在建立链接呢,不要烦老子,老子不想让对端休眠)
一旦将OPAF传送出去,phy8即进入Open_Response_Wait状态.
梳理一下,到此为止,phy8的状态变化为:
Idle-->Forward_Open-->Open_Response_Wait
phy4加入战队....
phy4的状态变化会跟phy0的状态变化路线一致,做的事情也一致;
Idle->Request_Path->Request_Open->Open_Confirm_Wait
phy24的状态变化会跟phy8的状态变化一致,即:
Idle-->Forward_Open-->Open_Response_Wait
phy24也开始加入战队....
6. 到了这里,phy24将OPAF发向了HDD
7. HDD根据内部状态,由SL_CC状态机,返回OPEN_REJECT或者OPEN_ACCEPT;
从现在开始,我们开始梳理OPEN_ACCEPT/OPEN_REJECT回来的路程;
先发布一下...