* [PATCH] libata-sff: Undo bug introduced with pci_iomap changes
@ 2007-05-01 11:53 Alan Cox
2007-05-01 15:30 ` Tejun Heo
0 siblings, 1 reply; 2+ messages in thread
From: Alan Cox @ 2007-05-01 11:53 UTC (permalink / raw)
To: Tejun Heo, jeff, linux-kernel
If you have a controller with one channel disabled and unmapped the new
iomap code blindly tries to iomap unconfigured BARs. Later on the code
does the right thing and checks for unmapped bars but it is done in the
wrong order
Reorder the checks and make the iomap conditional
Tejun: I think the code below is now correct but would appreciate you
giving it a review.
Signed-off-by: Alan Cox <alan@redhat.com>
--- drivers/ata/libata-sff.c~ 2007-05-01 12:03:39.634876384 +0100
+++ drivers/ata/libata-sff.c 2007-05-01 12:03:39.634876384 +0100
@@ -557,12 +557,30 @@
int i, p = 0;
void __iomem * const *iomap;
+ /* Discard disabled ports. Some controllers show their
+ unused channels this way */
+ if (ata_resources_present(pdev, 0) == 0)
+ ports &= ~ATA_PORT_PRIMARY;
+ if (ata_resources_present(pdev, 1) == 0)
+ ports &= ~ATA_PORT_SECONDARY;
+
/* iomap BARs */
- for (i = 0; i < 4; i++) {
- if (pcim_iomap(pdev, i, 0) == NULL) {
- dev_printk(KERN_ERR, &pdev->dev,
- "failed to iomap PCI BAR %d\n", i);
- return NULL;
+ if (ports & ATA_PORT_PRIMARY) {
+ for (i = 0; i <= 1; i++) {
+ if (pcim_iomap(pdev, i, 0) == NULL) {
+ dev_printk(KERN_ERR, &pdev->dev,
+ "failed to iomap PCI BAR %d\n", i);
+ return NULL;
+ }
+ }
+ }
+ if (ports & ATA_PORT_SECONDARY) {
+ for (i = 2; i <= 3; i++) {
+ if (pcim_iomap(pdev, i, 0) == NULL) {
+ dev_printk(KERN_ERR, &pdev->dev,
+ "failed to iomap PCI BAR %d\n", i);
+ return NULL;
+ }
}
}
@@ -577,13 +595,6 @@
probe_ent->irq = pdev->irq;
probe_ent->irq_flags = IRQF_SHARED;
- /* Discard disabled ports. Some controllers show their
- unused channels this way */
- if (ata_resources_present(pdev, 0) == 0)
- ports &= ~ATA_PORT_PRIMARY;
- if (ata_resources_present(pdev, 1) == 0)
- ports &= ~ATA_PORT_SECONDARY;
-
if (ports & ATA_PORT_PRIMARY) {
probe_ent->port[p].cmd_addr = iomap[0];
probe_ent->port[p].altstatus_addr =
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] libata-sff: Undo bug introduced with pci_iomap changes
2007-05-01 11:53 [PATCH] libata-sff: Undo bug introduced with pci_iomap changes Alan Cox
@ 2007-05-01 15:30 ` Tejun Heo
0 siblings, 0 replies; 2+ messages in thread
From: Tejun Heo @ 2007-05-01 15:30 UTC (permalink / raw)
To: Alan Cox; +Cc: jeff, linux-kernel, stable
Hello, Alan.
Alan Cox wrote:
> If you have a controller with one channel disabled and unmapped the new
> iomap code blindly tries to iomap unconfigured BARs. Later on the code
> does the right thing and checks for unmapped bars but it is done in the
> wrong order
>
> Reorder the checks and make the iomap conditional
>
> Tejun: I think the code below is now correct but would appreciate you
> giving it a review.
>
> Signed-off-by: Alan Cox <alan@redhat.com>
Acked-by: Tejun Heo <htejun@gmail.com>
Yeap, the patch looks good. I got tunnel visioned while converting to
iomap and mechanically mapped IO BAR access to iomap. Thanks for
catching this. This is already fixed in #upstream while converting to
new-init-model (the code is in ata_pci_init_native_host() and does about
the same thing as your patch does), so I think this patch is only needed
for -stable. Cc'ing stable team. The original patch can be reached at...
http://article.gmane.org/gmane.linux.kernel/523335/raw
Thanks.
--
tejun
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-05-01 15:32 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-01 11:53 [PATCH] libata-sff: Undo bug introduced with pci_iomap changes Alan Cox
2007-05-01 15:30 ` Tejun Heo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox