Fix libata resource conflict for legacy mode
authorArnaud Patard <apatard@mandriva.com>
Tue, 19 Sep 2006 04:23:52 +0000 (00:23 -0400)
committerJeff Garzik <jeff@garzik.org>
Tue, 19 Sep 2006 04:23:52 +0000 (00:23 -0400)
When the libata is trying to handle legacy ide ports (0x1f0 for instance), it
doesn't take care if the resource has childs or not.
The result is that this situation :
0100-01fe : pnp 00:09
  0170-0177 : libata
  01f0-01f7 : libata

is seen as conflict, which is wrong.
The proposed fix is to detect childs and in this case, look at which child is
conflicting.

Signed-off-by: Arnaud Patard <apatard@mandriva.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/scsi/libata-bmdma.c

index 9ce221f..3482abb 100644 (file)
@@ -1016,11 +1016,14 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
                        res.start = 0x1f0;
                        res.end = 0x1f0 + 8 - 1;
                        conflict = ____request_resource(&ioport_resource, &res);
+                       while (conflict->child)
+                               conflict = ____request_resource(conflict, &res);
                        if (!strcmp(conflict->name, "libata"))
                                legacy_mode |= (1 << 0);
                        else {
                                disable_dev_on_err = 0;
-                               printk(KERN_WARNING "ata: 0x1f0 IDE port busy\n");
+                               printk(KERN_WARNING "ata: 0x1f0 IDE port busy\n" \
+                                                   "ata: conflict with %s\n", conflict->name);
                        }
                } else
                        legacy_mode |= (1 << 0);
@@ -1030,11 +1033,14 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
                        res.start = 0x170;
                        res.end = 0x170 + 8 - 1;
                        conflict = ____request_resource(&ioport_resource, &res);
+                       while (conflict->child)
+                               conflict = ____request_resource(conflict, &res);
                        if (!strcmp(conflict->name, "libata"))
                                legacy_mode |= (1 << 1);
                        else {
                                disable_dev_on_err = 0;
-                               printk(KERN_WARNING "ata: 0x170 IDE port busy\n");
+                               printk(KERN_WARNING "ata: 0x170 IDE port busy\n" \
+                                                   "ata: conflict with %s\n", conflict->name);
                        }
                } else
                        legacy_mode |= (1 << 1);