diff options
-rw-r--r-- | drivers/ide/ide-probe.c | 46 | ||||
-rw-r--r-- | drivers/ide/ide.c | 15 | ||||
-rw-r--r-- | drivers/ide/setup-pci.c | 48 | ||||
-rw-r--r-- | include/linux/ide.h | 8 |
4 files changed, 54 insertions, 63 deletions
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 6a196c27b0aa..f81793f3f247 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -1444,6 +1444,52 @@ static int ide_sysfs_register_port(ide_hwif_t *hwif) | |||
1444 | return rc; | 1444 | return rc; |
1445 | } | 1445 | } |
1446 | 1446 | ||
1447 | /** | ||
1448 | * ide_find_port_slot - find free ide_hwifs[] slot | ||
1449 | * @d: IDE port info | ||
1450 | * | ||
1451 | * Return the new hwif. If we are out of free slots return NULL. | ||
1452 | */ | ||
1453 | |||
1454 | ide_hwif_t *ide_find_port_slot(const struct ide_port_info *d) | ||
1455 | { | ||
1456 | ide_hwif_t *hwif; | ||
1457 | int i; | ||
1458 | u8 bootable = (d && (d->host_flags & IDE_HFLAG_NON_BOOTABLE)) ? 0 : 1; | ||
1459 | |||
1460 | /* | ||
1461 | * Claim an unassigned slot. | ||
1462 | * | ||
1463 | * Give preference to claiming other slots before claiming ide0/ide1, | ||
1464 | * just in case there's another interface yet-to-be-scanned | ||
1465 | * which uses ports 0x1f0/0x170 (the ide0/ide1 defaults). | ||
1466 | * | ||
1467 | * Unless there is a bootable card that does not use the standard | ||
1468 | * ports 0x1f0/0x170 (the ide0/ide1 defaults). | ||
1469 | */ | ||
1470 | if (bootable) { | ||
1471 | for (i = 0; i < MAX_HWIFS; i++) { | ||
1472 | hwif = &ide_hwifs[i]; | ||
1473 | if (hwif->chipset == ide_unknown) | ||
1474 | return hwif; | ||
1475 | } | ||
1476 | } else { | ||
1477 | for (i = 2; i < MAX_HWIFS; i++) { | ||
1478 | hwif = &ide_hwifs[i]; | ||
1479 | if (hwif->chipset == ide_unknown) | ||
1480 | return hwif; | ||
1481 | } | ||
1482 | for (i = 0; i < 2 && i < MAX_HWIFS; i++) { | ||
1483 | hwif = &ide_hwifs[i]; | ||
1484 | if (hwif->chipset == ide_unknown) | ||
1485 | return hwif; | ||
1486 | } | ||
1487 | } | ||
1488 | |||
1489 | return NULL; | ||
1490 | } | ||
1491 | EXPORT_SYMBOL_GPL(ide_find_port_slot); | ||
1492 | |||
1447 | int ide_device_add_all(u8 *idx, const struct ide_port_info *d) | 1493 | int ide_device_add_all(u8 *idx, const struct ide_port_info *d) |
1448 | { | 1494 | { |
1449 | ide_hwif_t *hwif, *mate = NULL; | 1495 | ide_hwif_t *hwif, *mate = NULL; |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 4ca511156a11..f338fe96ff6d 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -232,21 +232,6 @@ static int ide_system_bus_speed(void) | |||
232 | return pci_dev_present(pci_default) ? 33 : 50; | 232 | return pci_dev_present(pci_default) ? 33 : 50; |
233 | } | 233 | } |
234 | 234 | ||
235 | ide_hwif_t *ide_find_port(void) | ||
236 | { | ||
237 | ide_hwif_t *hwif; | ||
238 | int i; | ||
239 | |||
240 | for (i = 0; i < MAX_HWIFS; i++) { | ||
241 | hwif = &ide_hwifs[i]; | ||
242 | if (hwif->chipset == ide_unknown) | ||
243 | return hwif; | ||
244 | } | ||
245 | |||
246 | return NULL; | ||
247 | } | ||
248 | EXPORT_SYMBOL_GPL(ide_find_port); | ||
249 | |||
250 | static struct resource* hwif_request_region(ide_hwif_t *hwif, | 235 | static struct resource* hwif_request_region(ide_hwif_t *hwif, |
251 | unsigned long addr, int num) | 236 | unsigned long addr, int num) |
252 | { | 237 | { |
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index 8947597e6bec..699c72947967 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
@@ -20,51 +20,6 @@ | |||
20 | #include <asm/io.h> | 20 | #include <asm/io.h> |
21 | #include <asm/irq.h> | 21 | #include <asm/irq.h> |
22 | 22 | ||
23 | |||
24 | /** | ||
25 | * ide_match_hwif - find free ide_hwifs[] slot | ||
26 | * @bootable: bootable flag | ||
27 | * | ||
28 | * Return the new hwif. If we are out of free slots return NULL. | ||
29 | */ | ||
30 | |||
31 | static ide_hwif_t *ide_match_hwif(u8 bootable) | ||
32 | { | ||
33 | ide_hwif_t *hwif; | ||
34 | int h; | ||
35 | |||
36 | /* | ||
37 | * Claim an unassigned slot. | ||
38 | * | ||
39 | * Give preference to claiming other slots before claiming ide0/ide1, | ||
40 | * just in case there's another interface yet-to-be-scanned | ||
41 | * which uses ports 1f0/170 (the ide0/ide1 defaults). | ||
42 | * | ||
43 | * Unless there is a bootable card that does not use the standard | ||
44 | * ports 1f0/170 (the ide0/ide1 defaults). The (bootable) flag. | ||
45 | */ | ||
46 | if (bootable) { | ||
47 | for (h = 0; h < MAX_HWIFS; ++h) { | ||
48 | hwif = &ide_hwifs[h]; | ||
49 | if (hwif->chipset == ide_unknown) | ||
50 | return hwif; /* pick an unused entry */ | ||
51 | } | ||
52 | } else { | ||
53 | for (h = 2; h < MAX_HWIFS; ++h) { | ||
54 | hwif = ide_hwifs + h; | ||
55 | if (hwif->chipset == ide_unknown) | ||
56 | return hwif; /* pick an unused entry */ | ||
57 | } | ||
58 | } | ||
59 | for (h = 0; h < 2 && h < MAX_HWIFS; ++h) { | ||
60 | hwif = ide_hwifs + h; | ||
61 | if (hwif->chipset == ide_unknown) | ||
62 | return hwif; /* pick an unused entry */ | ||
63 | } | ||
64 | |||
65 | return NULL; | ||
66 | } | ||
67 | |||
68 | /** | 23 | /** |
69 | * ide_setup_pci_baseregs - place a PCI IDE controller native | 24 | * ide_setup_pci_baseregs - place a PCI IDE controller native |
70 | * @dev: PCI device of interface to switch native | 25 | * @dev: PCI device of interface to switch native |
@@ -320,7 +275,6 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, | |||
320 | { | 275 | { |
321 | unsigned long ctl = 0, base = 0; | 276 | unsigned long ctl = 0, base = 0; |
322 | ide_hwif_t *hwif; | 277 | ide_hwif_t *hwif; |
323 | u8 bootable = (d->host_flags & IDE_HFLAG_NON_BOOTABLE) ? 0 : 1; | ||
324 | struct hw_regs_s hw; | 278 | struct hw_regs_s hw; |
325 | 279 | ||
326 | if ((d->host_flags & IDE_HFLAG_ISA_PORTS) == 0) { | 280 | if ((d->host_flags & IDE_HFLAG_ISA_PORTS) == 0) { |
@@ -346,7 +300,7 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, | |||
346 | base = port ? 0x170 : 0x1f0; | 300 | base = port ? 0x170 : 0x1f0; |
347 | } | 301 | } |
348 | 302 | ||
349 | hwif = ide_match_hwif(bootable); | 303 | hwif = ide_find_port_slot(d); |
350 | if (hwif == NULL) { | 304 | if (hwif == NULL) { |
351 | printk(KERN_ERR "%s: too many IDE interfaces, no room in " | 305 | printk(KERN_ERR "%s: too many IDE interfaces, no room in " |
352 | "table\n", d->name); | 306 | "table\n", d->name); |
diff --git a/include/linux/ide.h b/include/linux/ide.h index c6d4de60185a..2c43766ff344 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -170,7 +170,6 @@ typedef struct hw_regs_s { | |||
170 | struct device *dev; | 170 | struct device *dev; |
171 | } hw_regs_t; | 171 | } hw_regs_t; |
172 | 172 | ||
173 | struct hwif_s *ide_find_port(void); | ||
174 | void ide_init_port_data(struct hwif_s *, unsigned int); | 173 | void ide_init_port_data(struct hwif_s *, unsigned int); |
175 | void ide_init_port_hw(struct hwif_s *, hw_regs_t *); | 174 | void ide_init_port_hw(struct hwif_s *, hw_regs_t *); |
176 | 175 | ||
@@ -809,6 +808,13 @@ extern ide_hwif_t ide_hwifs[]; /* master data repository */ | |||
809 | #endif | 808 | #endif |
810 | extern int noautodma; | 809 | extern int noautodma; |
811 | 810 | ||
811 | ide_hwif_t *ide_find_port_slot(const struct ide_port_info *); | ||
812 | |||
813 | static inline ide_hwif_t *ide_find_port(void) | ||
814 | { | ||
815 | return ide_find_port_slot(NULL); | ||
816 | } | ||
817 | |||
812 | extern int ide_end_request (ide_drive_t *drive, int uptodate, int nrsecs); | 818 | extern int ide_end_request (ide_drive_t *drive, int uptodate, int nrsecs); |
813 | int ide_end_dequeued_request(ide_drive_t *drive, struct request *rq, | 819 | int ide_end_dequeued_request(ide_drive_t *drive, struct request *rq, |
814 | int uptodate, int nr_sectors); | 820 | int uptodate, int nr_sectors); |