diff options
author | Maxime Bizon <mbizon@freebox.fr> | 2011-03-16 09:58:32 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2011-04-24 11:34:05 -0400 |
commit | 7b3a24c57d2eeda8dba9c205342b12689c4679f9 (patch) | |
tree | f4be496d3c0008c6b601b75616383bb735bc9fd2 /drivers/ata | |
parent | ae01b2493c3bf03c504c32ac4ebb01d528508db3 (diff) |
ahci: don't enable port irq before handler is registered
The ahci_pmp_attach() & ahci_pmp_detach() unmask port irqs, but they
are also called during port initialization, before ahci host irq
handler is registered. On ce4100 platform, this sometimes triggers
"irq 4: nobody cared" message when loading driver.
Fixed this by not touching the register if the port is in frozen
state, and mark all uninitialized port as frozen.
Signed-off-by: Maxime Bizon <mbizon@freebox.fr>
Acked-by: Tejun Heo <tj@kernel.org>
Cc: stable@kernel.org
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/libahci.c | 17 | ||||
-rw-r--r-- | drivers/ata/libata-core.c | 2 |
2 files changed, 16 insertions, 3 deletions
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index 633159b5152a..d38c40fe4ddb 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c | |||
@@ -1919,7 +1919,17 @@ static void ahci_pmp_attach(struct ata_port *ap) | |||
1919 | ahci_enable_fbs(ap); | 1919 | ahci_enable_fbs(ap); |
1920 | 1920 | ||
1921 | pp->intr_mask |= PORT_IRQ_BAD_PMP; | 1921 | pp->intr_mask |= PORT_IRQ_BAD_PMP; |
1922 | writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); | 1922 | |
1923 | /* | ||
1924 | * We must not change the port interrupt mask register if the | ||
1925 | * port is marked frozen, the value in pp->intr_mask will be | ||
1926 | * restored later when the port is thawed. | ||
1927 | * | ||
1928 | * Note that during initialization, the port is marked as | ||
1929 | * frozen since the irq handler is not yet registered. | ||
1930 | */ | ||
1931 | if (!(ap->pflags & ATA_PFLAG_FROZEN)) | ||
1932 | writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); | ||
1923 | } | 1933 | } |
1924 | 1934 | ||
1925 | static void ahci_pmp_detach(struct ata_port *ap) | 1935 | static void ahci_pmp_detach(struct ata_port *ap) |
@@ -1935,7 +1945,10 @@ static void ahci_pmp_detach(struct ata_port *ap) | |||
1935 | writel(cmd, port_mmio + PORT_CMD); | 1945 | writel(cmd, port_mmio + PORT_CMD); |
1936 | 1946 | ||
1937 | pp->intr_mask &= ~PORT_IRQ_BAD_PMP; | 1947 | pp->intr_mask &= ~PORT_IRQ_BAD_PMP; |
1938 | writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); | 1948 | |
1949 | /* see comment above in ahci_pmp_attach() */ | ||
1950 | if (!(ap->pflags & ATA_PFLAG_FROZEN)) | ||
1951 | writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); | ||
1939 | } | 1952 | } |
1940 | 1953 | ||
1941 | int ahci_port_resume(struct ata_port *ap) | 1954 | int ahci_port_resume(struct ata_port *ap) |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 423c0a6952b2..5096b2a24a17 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -5480,7 +5480,7 @@ struct ata_port *ata_port_alloc(struct ata_host *host) | |||
5480 | if (!ap) | 5480 | if (!ap) |
5481 | return NULL; | 5481 | return NULL; |
5482 | 5482 | ||
5483 | ap->pflags |= ATA_PFLAG_INITIALIZING; | 5483 | ap->pflags |= ATA_PFLAG_INITIALIZING | ATA_PFLAG_FROZEN; |
5484 | ap->lock = &host->lock; | 5484 | ap->lock = &host->lock; |
5485 | ap->print_id = -1; | 5485 | ap->print_id = -1; |
5486 | ap->host = host; | 5486 | ap->host = host; |