From: Rin Okuyama <rokuyama...@gmail.com>
Subject: Re: IDENTIFY failed
Date: Thu, 4 Nov 2021 21:18:35 +0900

> Yeah. Patrick, Jun, experiment to adjust delays will be appreciated a
> lot,
> if you have time. But, dmesg should be helpful enough :)

On my environment,

1. after that,back to the original kernel , boot fine.
>>>>>>>>> NetBSD 9.99.92 (GENERIC) #0: Mon Oct 25 20:32:38 UTC 2021 Failed

 8 times reboot,and cold boot after 15min system stop seems ok.

2. change deley time 500/250/125/60/30/15/7/0. boot fine.
+#define        AHCISATA_EXTRA_DELAY_TIME 250


--- ahcisata_core.c     2021/11/04 23:58:09     1.1
+++ ahcisata_core.c     2021/11/05 00:00:11
@@ -114,6 +114,7 @@
 #define ATA_DELAY 10000 /* 10s for a drive I/O */
 #define ATA_RESET_DELAY 31000 /* 31s for a drive reset */
 #define AHCI_RST_WAIT (ATA_RESET_DELAY / 10)
+#define        AHCISATA_EXTRA_DELAY_TIME 250
 
 const struct ata_bustype ahci_ata_bustype = {
        .bustype_type = SCSIPI_BUSTYPE_ATA,
@@ -971,7 +972,7 @@
 end:
        ahci_channel_stop(sc, chp, flags);
 #ifdef AHCISATA_EXTRA_DELAY
-       ata_delay(chp, 500, "ahcirst", flags);
+       ata_delay(chp, AHCISATA_EXTRA_DELAY_TIME, "ahcirst", flags);
 #endif
        /* clear port interrupt register */
        AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), 0xffffffff);
@@ -997,7 +998,7 @@
        }
        ata_kill_active(chp, KILL_RESET, flags);
 #ifdef AHCISATA_EXTRA_DELAY
-       ata_delay(chp, 500, "ahcirst", flags);
+       ata_delay(chp, AHCISATA_EXTRA_DELAY_TIME, "ahcirst", flags);
 #endif
        /* clear port interrupt register */
        AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), 0xffffffff);
@@ -1069,7 +1070,7 @@
            achp->ahcic_sstatus, AT_WAIT)) {
        case SStatus_DET_DEV:
 #ifdef AHCISATA_EXTRA_DELAY
-               ata_delay(chp, 500, "ahcidv", AT_WAIT);
+               ata_delay(chp, AHCISATA_EXTRA_DELAY_TIME, "ahcidv", AT_WAIT);
 #endif
 
                /* Initial value, used in case the soft reset fails */
@@ -1111,7 +1112,7 @@
                    AHCI_P_IX_PSS | AHCI_P_IX_DHRS | AHCI_P_IX_SDBS);
 #ifdef AHCISATA_EXTRA_DELAY
                /* wait 500ms before actually starting operations */
-               ata_delay(chp, 500, "ahciprb", AT_WAIT);
+               ata_delay(chp, AHCISATA_EXTRA_DELAY_TIME, "ahciprb", AT_WAIT);
 #endif
                break;
 

Reply via email to