Re: Bug report for ahci-mvebu driver

marius
2023-01-28T17:08:57Z

January 27, 2023 8:28 AM, "Damien Le Moal" <damien.lemoal@opensource.wdc.com> wrote:

> On 1/27/23 14:13, Damien Le Moal wrote:
>
>> Marius,
>>
>> Thanks again for testing.
>> Could you try a new variation of the fix shown below ? This newer fix
>> should avoid uselessly going down to 1.5 Gbps as shown above.
>> Thanks !
>>
>> diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
>> index 884ae73b11ea..04938db566e5 100644
>> --- a/drivers/ata/libata-core.c
>> +++ b/drivers/ata/libata-core.c
>> @@ -3085,10 +3085,31 @@ int sata_down_spd_limit(struct ata_link *link, u32
>> spd_limit)
>> * If not, use cached value in link->sata_spd.
>> */
>> rc = sata_scr_read(link, SCR_STATUS, &sstatus);
>> - if (rc == 0 && ata_sstatus_online(sstatus))
>> + if (rc == 0 && ata_sstatus_online(sstatus)) {
>> spd = (sstatus >> 4) & 0xf;
>> - else
>> + } else {
>> + /*
>> + * If we reach here, the device is still offline or not
>> + * reporting a current speed yet. If we do not have a recorded
>> + * speed either, it means that probing the drive is failing,
>> + * most likely because problem with link speed autonegotiation
>> + * (e.g. reported case with mvebu adapter with a port multiplier
>> + * device). In this case, assume that probing was done at Gen3
>> + * speed and set the recorded speed to lower Gen2. With this,
>> + * the next probe retry will be done after sata_set_spd()
>> + * explicitly lowers the link speed. If the device then
>> + * responds, the actual maximum speed will be set once
>> + * libata-eh finishes the device revalidation.
>> + */
>> + if (!link->sata_spd) {
>> + link->sata_spd = 2;
>> + ata_link_warn(link,
>> + "No reported link speed. Assuming %s\n",
>> + sata_spd_string(link->sata_spd));
>> + return;
>
> Oops. My bad. This should be "return 0;" of course.
>
>> + }
>> spd = link->sata_spd;
>> + }
>>
>> mask = link->sata_spd_limit;
>> if (mask <= 1)
>
> --
> Damien Le Moal
> Western Digital Research

It doesn't work.

[ 15.145150][ T113] hardreset, Online=>Offline
[ 15.145159][ T113] sata_set_spd_needed, scontrol=0x300
[ 15.149632][ T113] __sata_set_spd_needed, initial limit=0xFFFFFFFF
[ 15.154910][ T113] __sata_set_spd_needed, corrected limit=0xFFFFFFFF
[ 15.161211][ T113] __sata_set_spd_needed, target=0x0
[ 15.167700][ T113] __sata_set_spd_needed, spd=0x0
[ 15.172781][ T113] __sata_set_spd_needed, final *scontrol=0x300
[ 15.178685][ T113] resume, do loop
[ 15.413909][ T113] resume, after do loop
[ 15.473909][ T113] debounce, SCR=0x100
..
[ 16.553930][ T113] debounce, SCR=0x100
[ 16.557791][ T113] resume, return at end of function
[ 16.561650][ T113] hardreset, ata_phys_link_offline check failed
[ 16.566754][ T113] ata2: SATA link down (SStatus 101 SControl 300)
[ 16.579222][ T113] sata_down_spd_limit: limit 0x1, cur spd 0x0, saved limit 0xffffffff, hw limit 0xffffffff
[ 16.589115][ T113] ata2: No reported link speed. Assuming 3.0 Gbps
[ 16.595436][ T113] hardreset, Online=>Offline
[ 16.595442][ T113] sata_set_spd_needed, scontrol=0x300
[ 16.599911][ T113] __sata_set_spd_needed, initial limit=0xFFFFFFFF
[ 16.605178][ T113] __sata_set_spd_needed, corrected limit=0xFFFFFFFF
[ 16.611479][ T113] __sata_set_spd_needed, target=0x0
[ 16.617975][ T113] __sata_set_spd_needed, spd=0x0
[ 16.623055][ T113] __sata_set_spd_needed, final *scontrol=0x300
[ 16.628957][ T113] resume, do loop
[ 16.863910][ T113] resume, after do loop
[ 16.923909][ T113] debounce, SCR=0x100
...
[ 18.123908][ T113] debounce, SCR=0x100
[ 18.127770][ T113] resume, return at end of function
[ 18.131628][ T113] hardreset, ata_phys_link_offline check failed
[ 18.136731][ T113] ata2: SATA link down (SStatus 100 SControl 300)
[ 18.149196][ T113] sata_down_spd_limit: limit 0x1, cur spd 0x0, saved limit 0xffffffff, hw limit 0xffffffff
[ 18.159089][ T113] ata2: No reported link speed. Assuming 3.0 Gbps
[ 18.165409][ T113] hardreset, Online=>Offline
[ 18.165415][ T113] sata_set_spd_needed, scontrol=0x300
[ 18.169884][ T113] __sata_set_spd_needed, initial limit=0xFFFFFFFF
[ 18.175151][ T113] __sata_set_spd_needed, corrected limit=0xFFFFFFFF
[ 18.181451][ T113] __sata_set_spd_needed, target=0x0
[ 18.187946][ T113] __sata_set_spd_needed, spd=0x0
[ 18.193025][ T113] __sata_set_spd_needed, final *scontrol=0x300
[ 18.198927][ T113] resume, do loop
[ 18.433909][ T113] resume, after do loop
[ 18.493909][ T113] debounce, SCR=0x100
...
[ 20.413909][ T113] debounce, SCR=0x100
[ 20.417768][ T113] resume, return at end of function
[ 20.421627][ T113] hardreset, ata_phys_link_offline check failed
[ 20.426730][ T113] ata2: SATA link down (SStatus 100 SControl 300)
[ 20.439196][ T113] sata_down_spd_limit: limit 0x1, cur spd 0x0, saved limit 0xffffffff, hw limit 0xffffffff
[ 20.449089][ T113] ata2: No reported link speed. Assuming 3.0 Gbps
[ 20.455409][ T113] hardreset, Online=>Offline
[ 20.455415][ T113] sata_set_spd_needed, scontrol=0x300
[ 20.459884][ T113] __sata_set_spd_needed, initial limit=0xFFFFFFFF
[ 20.465151][ T113] __sata_set_spd_needed, corrected limit=0xFFFFFFFF
[ 20.471452][ T113] __sata_set_spd_needed, target=0x0
[ 20.477947][ T113] __sata_set_spd_needed, spd=0x0
[ 20.483027][ T113] __sata_set_spd_needed, final *scontrol=0x300
[ 20.488929][ T113] resume, do loop
[ 20.723909][ T113] resume, after do loop
[ 20.783909][ T113] debounce, SCR=0x0
[ 20.843909][ T113] debounce, SCR=0x0
[ 20.903909][ T113] debounce, SCR=0x0
[ 20.963909][ T113] debounce, SCR=0x0
[ 21.023909][ T113] debounce, SCR=0x100
[ 21.083909][ T113] debounce, SCR=0x100
[ 21.143909][ T113] debounce, SCR=0x100
[ 21.203929][ T113] debounce, SCR=0x100
[ 21.263909][ T113] debounce, SCR=0x100
[ 21.267768][ T113] resume, return at end of function
[ 21.271626][ T113] hardreset, ata_phys_link_offline check failed
[ 21.276728][ T113] ata2: SATA link down (SStatus 101 SControl 300)
[ 21.289194][ T113] sata_down_spd_limit: limit 0x1, cur spd 0x0, saved limit 0xffffffff, hw limit 0xffffffff
[ 21.299086][ T113] ata2: No reported link speed. Assuming 3.0 Gbps
[ 21.305407][ T113] hardreset, Online=>Offline
[ 21.305413][ T113] sata_set_spd_needed, scontrol=0x300
[ 21.309882][ T113] __sata_set_spd_needed, initial limit=0xFFFFFFFF
[ 21.315149][ T113] __sata_set_spd_needed, corrected limit=0xFFFFFFFF
[ 21.321448][ T113] __sata_set_spd_needed, target=0x0
[ 21.327943][ T113] __sata_set_spd_needed, spd=0x0
[ 21.333024][ T113] __sata_set_spd_needed, final *scontrol=0x300
[ 21.338925][ T113] resume, do loop
[ 21.573909][ T113] resume, after do loop
[ 21.633909][ T113] debounce, SCR=0x101
...
[ 22.893908][ T113] debounce, SCR=0x100
[ 22.897769][ T113] resume, return at end of function
[ 22.901628][ T113] hardreset, ata_phys_link_offline check failed
[ 22.906731][ T113] ata2: SATA link down (SStatus 100 SControl 300)
[ 22.919179][ T113] ata2: EH pending after 5 tries, giving up