RE: [PATCH] [SCSI] LIBSAS: fix libsas link error issue

Xiangliang Yu
2011-06-16T07:29:17Z

>> > >[Jack Wang]
>> > >I don't think the statement below is error:
>> > >child->linkrate = min(parent_phy->linkrate, child->max_linkrate);
>>
>> The parent_phy is same to child_phy, I don't think it's right.
>>
>[Jack Wang] The parent_phy->linkrate is report from DISCOVER response as
>negotiated link rate(parent phy with child phy), so same is right.

Parent_phy = &parent->ex_dev.ex_phy[phy_id]; (sas_ex_discover_expander)
struct expander_device *parent_ex = &parent->ex_dev;(sas_ex_get_linkrate)
struct ex_phy *phy = &parent_ex->ex_phy[i];
so, parent_phy and phy are same one variable.

>> >> Yes, you can test like this.
>> >> >Then expander1's linkrate will set to 3G, and expander2's linkrate
will
>> set
>> >> >to 6G, that is correct.
>> >> yes
>> >> > But the connection rate will be 3G from hba to
>> >> >expander2.
>> >> How to configure the connection rate?
>> >> Now, MVSAS driver get 6G from sas_ex_get_linkrate function, and set
>> linkrate
>> >> of OPEN address frame to the value. right?
>> >>
>> >> --
>> >[Jack Wang]
>> >Connection rate is auto, link layer will insert deletable primitives to
do
>> >rate matching (sas2r15 7.14).
>>
>> >Yes, you should set the linkrate to that value .
>>
>> OK.MVSAS driver seem right. But, the problem is command fail because of
link
>> error, that is why I commit this patch. And my patch work fine.
>> You can reproduce the issue and fix it. Thanks!
>[Jack Wang] I re-consider it , you maybe should compare the HBA linkrate
>with the child phy linkrate and chose a minor.

Yes, how about this:
- child->linkrate = min(parent_phy->linkrate, child->max_linkrate);
+ child->linkrate = min(parent->max_linkrate, child->max_linkrate);
The max link rate of parent have HBA link rate info:
dev->max_linkrate = port->linkrate; (in sas_get_port_device function).