Skip to content

Commit

Permalink
ahci: implement skip_host_reset parameter
Browse files Browse the repository at this point in the history
Under certain circumstances (SSP turned off by the BIOS) and for
debugging purposes, skipping global controller reset is helpful.  Add
a kernel parameter for it.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
  • Loading branch information
Tejun Heo authored and Jeff Garzik committed Mar 17, 2008
1 parent dea5513 commit a22e644
Showing 1 changed file with 29 additions and 19 deletions.
48 changes: 29 additions & 19 deletions drivers/ata/ahci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit a22e644

Please sign in to comment.