@@ -2548,6 +2548,12 @@
lapic_timer_c2_ok [X86,APIC] trust the local apic timer
in C2 power state.
+ libata.libata_debounce_delay_ms= [LIBATA] Set debounce delay in
+ ms
+
+ libata.dma<0 Use default value from code
+ libata.dma>1 Debounce delay in milliseconds
+
libata.dma= [LIBATA] DMA control
libata.dma=0 Disable all PATA and SATA DMA
libata.dma=1 PATA and SATA Disk DMA only
@@ -154,6 +154,10 @@ static int atapi_an;
module_param(atapi_an, int, 0444);
MODULE_PARM_DESC(atapi_an, "Enable ATAPI AN media presence notification (0=0ff [default], 1=on)");
+int debounce_delay_ms = -1;
+module_param_named(debounce_delay_ms, libata_debounce_delay_ms, int, 0644);
+MODULE_PARM_DESC(debounce_delay_ms, "Delay amount milliseconds in sata_link_resume() to work around controller issues (negative values mean default value in code (200 ms)");
+
MODULE_AUTHOR("Jeff Garzik");
MODULE_DESCRIPTION("Library module for ATA devices");
MODULE_LICENSE("GPL");
@@ -315,10 +315,12 @@ int sata_link_resume(struct ata_link *link, const unsigned long *params,
/*
* Some PHYs react badly if SStatus is pounded
* immediately after resuming. Delay 200ms before
- * debouncing.
+ * debouncing. Duration can be configured with module
+ * parameter debounce_delay_ms.
*/
if (!(link->flags & ATA_LFLAG_NO_DEBOUNCE_DELAY))
- ata_msleep(link->ap, 200);
+ ata_msleep(link->ap,
+ (libata_debounce_delay_ms < 0) ? 200 : libata_debounce_delay_ms);
/* is SControl restored correctly? */
if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol)))
@@ -35,6 +35,7 @@ extern int atapi_passthru16;
extern int libata_fua;
extern int libata_noacpi;
extern int libata_allow_tpm;
+extern int libata_debounce_delay_ms;
extern const struct device_type ata_port_type;
extern struct ata_link *ata_dev_phys_link(struct ata_device *dev);
#ifdef CONFIG_ATA_FORCE