diff options
Diffstat (limited to 'drivers/ata/ahci.c')
| -rw-r--r-- | drivers/ata/ahci.c | 38 | 
1 files changed, 38 insertions, 0 deletions
| diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 2fc52407306c..c69954023c2e 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -1364,6 +1364,40 @@ static inline void ahci_gtf_filter_workaround(struct ata_host *host)  {}  #endif +/* + * On the Acer Aspire Switch Alpha 12, sometimes all SATA ports are detected + * as DUMMY, or detected but eventually get a "link down" and never get up + * again. When this happens, CAP.NP may hold a value of 0x00 or 0x01, and the + * port_map may hold a value of 0x00. + * + * Overriding CAP.NP to 0x02 and the port_map to 0x7 will reveal all 3 ports + * and can significantly reduce the occurrence of the problem. + * + * https://bugzilla.kernel.org/show_bug.cgi?id=189471 + */ +static void acer_sa5_271_workaround(struct ahci_host_priv *hpriv, +				    struct pci_dev *pdev) +{ +	static const struct dmi_system_id sysids[] = { +		{ +			.ident = "Acer Switch Alpha 12", +			.matches = { +				DMI_MATCH(DMI_SYS_VENDOR, "Acer"), +				DMI_MATCH(DMI_PRODUCT_NAME, "Switch SA5-271") +			}, +		}, +		{ } +	}; + +	if (dmi_check_system(sysids)) { +		dev_info(&pdev->dev, "enabling Acer Switch Alpha 12 workaround\n"); +		if ((hpriv->saved_cap & 0xC734FF00) == 0xC734FF00) { +			hpriv->port_map = 0x7; +			hpriv->cap = 0xC734FF02; +		} +	} +} +  #ifdef CONFIG_ARM64  /*   * Due to ERRATA#22536, ThunderX needs to handle HOST_IRQ_STAT differently. @@ -1636,6 +1670,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  			 "online status unreliable, applying workaround\n");  	} + +	/* Acer SA5-271 workaround modifies private_data */ +	acer_sa5_271_workaround(hpriv, pdev); +  	/* CAP.NP sometimes indicate the index of the last enabled  	 * port, at other times, that of the last possible port, so  	 * determining the maximum port number requires looking at |