From: Yong Wang <yong.y.wang@intel.com>
Date: Thu Mar 11 15:31:50 2010 +0800
Subject: [PATCH] ahci: Fix accounting oops on dummy port

Not all ports are implemented in AHCI mode on some machines.
If this is the case, it results in NULL pointer dereference
when doing alpm accounting. Skip such dummy ports.

Signed-off-by: Yong Wang <yong.y.wang@intel.com>
---
 drivers/ata/ahci.c |   10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -2283,8 +2283,8 @@ static ssize_t ahci_alpm_show_active(str
 	struct ata_port *ap = ata_shost_to_port(shost);
 	struct ahci_port_priv *pp;
 
-	if (!ap)
-		return;
+	if (!ap || ata_port_is_dummy(ap))
+		return 0;
 	pp = ap->private_data;
 	account_alpm_stats(ap);
 
@@ -2298,6 +2298,8 @@ static ssize_t ahci_alpm_show_partial(st
 	struct ata_port *ap = ata_shost_to_port(shost);
 	struct ahci_port_priv *pp = ap->private_data;
 
+	if (!ap || ata_port_is_dummy(ap))
+		return 0;
 	account_alpm_stats(ap);
 
 	return sprintf(buf, "%u\n", jiffies_to_msecs(pp->partial_jiffies));
@@ -2310,6 +2312,8 @@ static ssize_t ahci_alpm_show_slumber(st
 	struct ata_port *ap = ata_shost_to_port(shost);
 	struct ahci_port_priv *pp = ap->private_data;
 
+	if (!ap || ata_port_is_dummy(ap))
+		return 0;
 	account_alpm_stats(ap);
 
 	return sprintf(buf, "%u\n", jiffies_to_msecs(pp->slumber_jiffies));
@@ -2323,6 +2327,8 @@ static ssize_t ahci_alpm_show_accounting
 	struct ata_port *ap = ata_shost_to_port(shost);
 	struct ahci_port_priv *pp = ap->private_data;
 
+	if (!ap || ata_port_is_dummy(ap))
+		return 0;
 	return sprintf(buf, "%u\n", pp->accounting_active);
 }
 
