aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnaud Patard <apatard@mandriva.com>2006-09-19 00:23:52 -0400
committerJeff Garzik <jeff@garzik.org>2006-09-19 00:23:52 -0400
commitcb60736b32a84cbc9525b0bb4df26b04cbfbc8e8 (patch)
treef0e179a8596588366e098f77ffddbe8cf4b8e677
parent95064a75ebf8744e1ff595e8cd7ff9b6c851523e (diff)
Fix libata resource conflict for legacy mode
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>
-rw-r--r--drivers/scsi/libata-bmdma.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/scsi/libata-bmdma.c b/drivers/scsi/libata-bmdma.c
index 9ce221f25954..3482abbc6e09 100644
--- a/drivers/scsi/libata-bmdma.c
+++ b/drivers/scsi/libata-bmdma.c
@@ -1016,11 +1016,14 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
1016 res.start = 0x1f0; 1016 res.start = 0x1f0;
1017 res.end = 0x1f0 + 8 - 1; 1017 res.end = 0x1f0 + 8 - 1;
1018 conflict = ____request_resource(&ioport_resource, &res); 1018 conflict = ____request_resource(&ioport_resource, &res);
1019 while (conflict->child)
1020 conflict = ____request_resource(conflict, &res);
1019 if (!strcmp(conflict->name, "libata")) 1021 if (!strcmp(conflict->name, "libata"))
1020 legacy_mode |= (1 << 0); 1022 legacy_mode |= (1 << 0);
1021 else { 1023 else {
1022 disable_dev_on_err = 0; 1024 disable_dev_on_err = 0;
1023 printk(KERN_WARNING "ata: 0x1f0 IDE port busy\n"); 1025 printk(KERN_WARNING "ata: 0x1f0 IDE port busy\n" \
1026 "ata: conflict with %s\n", conflict->name);
1024 } 1027 }
1025 } else 1028 } else
1026 legacy_mode |= (1 << 0); 1029 legacy_mode |= (1 << 0);
@@ -1030,11 +1033,14 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
1030 res.start = 0x170; 1033 res.start = 0x170;
1031 res.end = 0x170 + 8 - 1; 1034 res.end = 0x170 + 8 - 1;
1032 conflict = ____request_resource(&ioport_resource, &res); 1035 conflict = ____request_resource(&ioport_resource, &res);
1036 while (conflict->child)
1037 conflict = ____request_resource(conflict, &res);
1033 if (!strcmp(conflict->name, "libata")) 1038 if (!strcmp(conflict->name, "libata"))
1034 legacy_mode |= (1 << 1); 1039 legacy_mode |= (1 << 1);
1035 else { 1040 else {
1036 disable_dev_on_err = 0; 1041 disable_dev_on_err = 0;
1037 printk(KERN_WARNING "ata: 0x170 IDE port busy\n"); 1042 printk(KERN_WARNING "ata: 0x170 IDE port busy\n" \
1043 "ata: conflict with %s\n", conflict->name);
1038 } 1044 }
1039 } else 1045 } else
1040 legacy_mode |= (1 << 1); 1046 legacy_mode |= (1 << 1);