Re: Bug report for ahci-mvebu driver

marius
2023-01-29T10:24:41Z

January 29, 2023 4:25 AM, "Damien Le Moal" <damien.lemoal@opensource.wdc.com> wrote:
>
> OK. That is because the limit is not being changed with the added "return 0".
> What about this version:
>
> diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
> index 884ae73b11ea..f404e2c2869e 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 speed limit to the lower Gen2 speed.
> + * 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_limit == UINT_MAX) {
> + link->sata_spd_limit = 2;
> + ata_link_warn(link,
> + "No reported SATA link speed. Limiting to
> %s\n",
> + sata_spd_string(link->sata_spd_limit));
> + return 0;
> + }
> spd = link->sata_spd;
> + }
>
> mask = link->sata_spd_limit;
> if (mask <= 1)
>
> Does this work ?
>
> --
> Damien Le Moal
> Western Digital Research

No, it doesn't work.

[ 29.743388][ T113] hardreset, Online=>Offline
[ 29.743397][ T113] sata_set_spd_needed, scontrol=0x300
[ 29.747893][ T113] __sata_set_spd_needed, initial limit=0xFFFFFFFF
[ 29.753149][ T113] __sata_set_spd_needed, corrected limit=0xFFFFFFFF
[ 29.759464][ T113] __sata_set_spd_needed, target=0x0
[ 29.765953][ T113] __sata_set_spd_needed, spd=0x0
[ 29.771033][ T113] __sata_set_spd_needed, final *scontrol=0x300
[ 29.776937][ T113] resume, do loop
[ 30.003803][ T113] resume, after do loop
[ 30.063823][ T113] debounce, SCR=0x100
...
[ 31.443802][ T113] debounce, SCR=0x100
[ 31.447663][ T113] resume, return at end of function
[ 31.451522][ T113] hardreset, ata_phys_link_offline check failed
[ 31.456625][ T113] ata2: SATA link down (SStatus 100 SControl 300)
[ 31.469093][ T113] sata_down_spd_limit: limit 0x1, cur spd 0x0, saved limit 0xffffffff, hw limit 0xffffffff
[ 31.478986][ T113] ata2: No reported SATA link speed. Limiting to 3.0 Gbps
[ 31.486004][ T113] hardreset, Online=>Offline
[ 31.486010][ T113] sata_set_spd_needed, scontrol=0x300
[ 31.490479][ T113] __sata_set_spd_needed, initial limit=0x2
[ 31.495747][ T113] __sata_set_spd_needed, corrected limit=0x2
[ 31.501437][ T113] __sata_set_spd_needed, target=0x2
[ 31.507321][ T113] __sata_set_spd_needed, spd=0x0
[ 31.512401][ T113] __sata_set_spd_needed, final *scontrol=0x320
[ 31.517233][ T113] __sata_set_spd_needed, initial limit=0x2
[ 31.523272][ T113] __sata_set_spd_needed, corrected limit=0x2
[ 31.528975][ T113] __sata_set_spd_needed, target=0x2
[ 31.534852][ T113] __sata_set_spd_needed, spd=0x0
[ 31.539933][ T113] __sata_set_spd_needed, final *scontrol=0x324
[ 31.545834][ T113] resume, do loop
[ 31.773802][ T113] resume, after do loop
[ 31.833802][ T113] debounce, SCR=0x101
...
[ 32.433802][ T113] debounce, SCR=0x100
[ 32.437663][ T113] resume, return at end of function
[ 32.441522][ T113] hardreset, ata_phys_link_offline check failed
[ 32.446624][ T113] ata2: SATA link down (SStatus 100 SControl 320)
[ 32.459090][ T113] sata_down_spd_limit: limit 0x1, cur spd 0x0, saved limit 0xffffffff, hw limit 0xffffffff
[ 32.468982][ T113] ata2: No reported SATA link speed. Limiting to 3.0 Gbps
[ 32.475999][ T113] hardreset, Online=>Offline
[ 32.476005][ T113] sata_set_spd_needed, scontrol=0x320
[ 32.480474][ T113] __sata_set_spd_needed, initial limit=0x2
[ 32.485741][ T113] __sata_set_spd_needed, corrected limit=0x2
[ 32.491432][ T113] __sata_set_spd_needed, target=0x2
[ 32.497315][ T113] __sata_set_spd_needed, spd=0x2
[ 32.502395][ T113] __sata_set_spd_needed, final *scontrol=0x320
[ 32.508296][ T113] resume, do loop
[ 32.743801][ T113] resume, after do loop
[ 32.803802][ T113] debounce, SCR=0x100
...
[ 34.423802][ T113] debounce, SCR=0x100
[ 34.427662][ T113] resume, return at end of function
[ 34.431520][ T113] hardreset, ata_phys_link_offline check failed
[ 34.436624][ T113] ata2: SATA link down (SStatus 100 SControl 320)
[ 34.449088][ T113] sata_down_spd_limit: limit 0x1, cur spd 0x0, saved limit 0xffffffff, hw limit 0xffffffff
[ 34.458981][ T113] ata2: No reported SATA link speed. Limiting to 3.0 Gbps
[ 34.465998][ T113] hardreset, Online=>Offline
[ 34.466004][ T113] sata_set_spd_needed, scontrol=0x320
[ 34.470473][ T113] __sata_set_spd_needed, initial limit=0x2
[ 34.475740][ T113] __sata_set_spd_needed, corrected limit=0x2
[ 34.481430][ T113] __sata_set_spd_needed, target=0x2
[ 34.487314][ T113] __sata_set_spd_needed, spd=0x2
[ 34.492393][ T113] __sata_set_spd_needed, final *scontrol=0x320
[ 34.498294][ T113] resume, do loop
[ 34.723823][ T113] resume, after do loop
[ 34.783802][ T113] debounce, SCR=0x101
...
[ 36.763802][ T113] debounce, SCR=0x100
[ 36.767662][ T113] debounce, loop end with timeout
[ 36.771521][ T113] hardreset, sata_link_resume check failed
[ 36.776445][ T113] ata2: COMRESET failed (errno=-32)
[ 36.787224][ T113] ata2: reset failed (errno=-32), retrying in 8 secs
[ 44.643801][ T113] sata_down_spd_limit: limit 0x0, cur spd 0x0, saved limit 0x2, hw limit 0xffffffff
[ 44.653073][ T113] hardreset, Online=>Offline
[ 44.653079][ T113] sata_set_spd_needed, scontrol=0x320
[ 44.657569][ T113] __sata_set_spd_needed, initial limit=0x2
[ 44.662823][ T113] __sata_set_spd_needed, corrected limit=0x2
[ 44.668527][ T113] __sata_set_spd_needed, target=0x2
[ 44.674403][ T113] __sata_set_spd_needed, spd=0x2
[ 44.679484][ T113] __sata_set_spd_needed, final *scontrol=0x320
[ 44.685385][ T113] resume, do loop
[ 44.913802][ T113] resume, after do loop
[ 44.973802][ T113] debounce, SCR=0x100
...
[ 46.233802][ T113] debounce, SCR=0x100
[ 46.237663][ T113] resume, return at end of function
[ 46.241520][ T113] hardreset, ata_phys_link_offline check failed
[ 46.246622][ T113] ata2: SATA link down (SStatus 100 SControl 320)
[ 46.259088][ T113] sata_down_spd_limit: limit 0x1, cur spd 0x0, saved limit 0xffffffff, hw limit 0xffffffff
[ 46.268981][ T113] ata2: No reported SATA link speed. Limiting to 3.0 Gbps
[ 46.275997][ T113] hardreset, Online=>Offline
[ 46.276003][ T113] sata_set_spd_needed, scontrol=0x320
[ 46.280473][ T113] __sata_set_spd_needed, initial limit=0x2
[ 46.285740][ T113] __sata_set_spd_needed, corrected limit=0x2
[ 46.291430][ T113] __sata_set_spd_needed, target=0x2
[ 46.297314][ T113] __sata_set_spd_needed, spd=0x2
[ 46.302394][ T113] __sata_set_spd_needed, final *scontrol=0x320
[ 46.308296][ T113] resume, do loop
[ 46.543802][ T113] resume, after do loop
[ 46.603802][ T113] debounce, SCR=0x100
...
[ 47.683802][ T113] debounce, SCR=0x100
[ 47.687662][ T113] resume, return at end of function
[ 47.691520][ T113] hardreset, ata_phys_link_offline check failed
[ 47.696636][ T113] ata2: SATA link down (SStatus 101 SControl 320)
[ 47.709086][ T113] ata2: EH pending after 5 tries, giving up

Marius Dinu