aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ide/ide-probe.c46
-rw-r--r--drivers/ide/ide.c15
-rw-r--r--drivers/ide/setup-pci.c48
-rw-r--r--include/linux/ide.h8
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
1454ide_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}
1491EXPORT_SYMBOL_GPL(ide_find_port_slot);
1492
1447int ide_device_add_all(u8 *idx, const struct ide_port_info *d) 1493int 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
235ide_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}
248EXPORT_SYMBOL_GPL(ide_find_port);
249
250static struct resource* hwif_request_region(ide_hwif_t *hwif, 235static 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
31static 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
173struct hwif_s *ide_find_port(void);
174void ide_init_port_data(struct hwif_s *, unsigned int); 173void ide_init_port_data(struct hwif_s *, unsigned int);
175void ide_init_port_hw(struct hwif_s *, hw_regs_t *); 174void 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
810extern int noautodma; 809extern int noautodma;
811 810
811ide_hwif_t *ide_find_port_slot(const struct ide_port_info *);
812
813static inline ide_hwif_t *ide_find_port(void)
814{
815 return ide_find_port_slot(NULL);
816}
817
812extern int ide_end_request (ide_drive_t *drive, int uptodate, int nrsecs); 818extern int ide_end_request (ide_drive_t *drive, int uptodate, int nrsecs);
813int ide_end_dequeued_request(ide_drive_t *drive, struct request *rq, 819int ide_end_dequeued_request(ide_drive_t *drive, struct request *rq,
814 int uptodate, int nr_sectors); 820 int uptodate, int nr_sectors);