|
@@ -49,6 +49,10 @@
|
|
|
#define DRV_NAME "ahci"
|
|
|
#define DRV_VERSION "3.0"
|
|
|
|
|
|
+static int ahci_skip_host_reset;
|
|
|
+module_param_named(skip_host_reset, ahci_skip_host_reset, int, 0444);
|
|
|
+MODULE_PARM_DESC(skip_host_reset, "skip global host reset (0=don't skip, 1=skip)");
|
|
|
+
|
|
|
static int ahci_enable_alpm(struct ata_port *ap,
|
|
|
enum link_pm policy);
|
|
|
static void ahci_disable_alpm(struct ata_port *ap);
|
|
@@ -1088,29 +1092,35 @@ static int ahci_reset_controller(struct ata_host *host)
|
|
|
ahci_enable_ahci(mmio);
|
|
|
|
|
|
/* global controller reset */
|
|
|
- tmp = readl(mmio + HOST_CTL);
|
|
|
- if ((tmp & HOST_RESET) == 0) {
|
|
|
- writel(tmp | HOST_RESET, mmio + HOST_CTL);
|
|
|
- readl(mmio + HOST_CTL); /* flush */
|
|
|
- }
|
|
|
+ if (!ahci_skip_host_reset) {
|
|
|
+ tmp = readl(mmio + HOST_CTL);
|
|
|
+ if ((tmp & HOST_RESET) == 0) {
|
|
|
+ writel(tmp | HOST_RESET, mmio + HOST_CTL);
|
|
|
+ readl(mmio + HOST_CTL); /* flush */
|
|
|
+ }
|
|
|
|
|
|
- /* reset must complete within 1 second, or
|
|
|
- * the hardware should be considered fried.
|
|
|
- */
|
|
|
- ssleep(1);
|
|
|
+ /* reset must complete within 1 second, or
|
|
|
+ * the hardware should be considered fried.
|
|
|
+ */
|
|
|
+ ssleep(1);
|
|
|
|
|
|
- tmp = readl(mmio + HOST_CTL);
|
|
|
- if (tmp & HOST_RESET) {
|
|
|
- dev_printk(KERN_ERR, host->dev,
|
|
|
- "controller reset failed (0x%x)\n", tmp);
|
|
|
- return -EIO;
|
|
|
- }
|
|
|
+ tmp = readl(mmio + HOST_CTL);
|
|
|
+ if (tmp & HOST_RESET) {
|
|
|
+ dev_printk(KERN_ERR, host->dev,
|
|
|
+ "controller reset failed (0x%x)\n", tmp);
|
|
|
+ return -EIO;
|
|
|
+ }
|
|
|
|
|
|
- /* turn on AHCI mode */
|
|
|
- ahci_enable_ahci(mmio);
|
|
|
+ /* turn on AHCI mode */
|
|
|
+ ahci_enable_ahci(mmio);
|
|
|
|
|
|
- /* some registers might be cleared on reset. restore initial values */
|
|
|
- ahci_restore_initial_config(host);
|
|
|
+ /* Some registers might be cleared on reset. Restore
|
|
|
+ * initial values.
|
|
|
+ */
|
|
|
+ ahci_restore_initial_config(host);
|
|
|
+ } else
|
|
|
+ dev_printk(KERN_INFO, host->dev,
|
|
|
+ "skipping global host reset\n");
|
|
|
|
|
|
if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
|
|
|
u16 tmp16;
|