aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-probe.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide-probe.c')
-rw-r--r--drivers/ide/ide-probe.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index d21e51a02c3e..235ebdb29b28 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -39,6 +39,8 @@
39#include <asm/uaccess.h> 39#include <asm/uaccess.h>
40#include <asm/io.h> 40#include <asm/io.h>
41 41
42static ide_hwif_t ide_hwifs[MAX_HWIFS]; /* master data repository */
43
42/** 44/**
43 * generic_id - add a generic drive id 45 * generic_id - add a generic drive id
44 * @drive: drive to make an ID block for 46 * @drive: drive to make an ID block for
@@ -1318,10 +1320,10 @@ static void ide_port_init_devices(ide_hwif_t *hwif)
1318 drive->unmask = 1; 1320 drive->unmask = 1;
1319 if (hwif->host_flags & IDE_HFLAG_NO_UNMASK_IRQS) 1321 if (hwif->host_flags & IDE_HFLAG_NO_UNMASK_IRQS)
1320 drive->no_unmask = 1; 1322 drive->no_unmask = 1;
1321 }
1322 1323
1323 if (port_ops && port_ops->port_init_devs) 1324 if (port_ops && port_ops->init_dev)
1324 port_ops->port_init_devs(hwif); 1325 port_ops->init_dev(drive);
1326 }
1325} 1327}
1326 1328
1327static void ide_init_port(ide_hwif_t *hwif, unsigned int port, 1329static void ide_init_port(ide_hwif_t *hwif, unsigned int port,
@@ -1473,22 +1475,29 @@ ide_hwif_t *ide_find_port_slot(const struct ide_port_info *d)
1473 for (; i < MAX_HWIFS; i++) { 1475 for (; i < MAX_HWIFS; i++) {
1474 hwif = &ide_hwifs[i]; 1476 hwif = &ide_hwifs[i];
1475 if (hwif->chipset == ide_unknown) 1477 if (hwif->chipset == ide_unknown)
1476 return hwif; 1478 goto out_found;
1477 } 1479 }
1478 } else { 1480 } else {
1479 for (i = 2; i < MAX_HWIFS; i++) { 1481 for (i = 2; i < MAX_HWIFS; i++) {
1480 hwif = &ide_hwifs[i]; 1482 hwif = &ide_hwifs[i];
1481 if (hwif->chipset == ide_unknown) 1483 if (hwif->chipset == ide_unknown)
1482 return hwif; 1484 goto out_found;
1483 } 1485 }
1484 for (i = 0; i < 2 && i < MAX_HWIFS; i++) { 1486 for (i = 0; i < 2 && i < MAX_HWIFS; i++) {
1485 hwif = &ide_hwifs[i]; 1487 hwif = &ide_hwifs[i];
1486 if (hwif->chipset == ide_unknown) 1488 if (hwif->chipset == ide_unknown)
1487 return hwif; 1489 goto out_found;
1488 } 1490 }
1489 } 1491 }
1490 1492
1493 printk(KERN_ERR "%s: no free slot for interface\n",
1494 d ? d->name : "ide");
1495
1491 return NULL; 1496 return NULL;
1497
1498out_found:
1499 ide_init_port_data(hwif, i);
1500 return hwif;
1492} 1501}
1493EXPORT_SYMBOL_GPL(ide_find_port_slot); 1502EXPORT_SYMBOL_GPL(ide_find_port_slot);
1494 1503