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.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index 6a196c27b0aa..875429728021 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -1444,6 +1444,54 @@ 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 i = (d && (d->host_flags & IDE_HFLAG_QD_2ND_PORT)) ? 1 : 0;
1472
1473 for (; i < MAX_HWIFS; i++) {
1474 hwif = &ide_hwifs[i];
1475 if (hwif->chipset == ide_unknown)
1476 return hwif;
1477 }
1478 } else {
1479 for (i = 2; i < MAX_HWIFS; i++) {
1480 hwif = &ide_hwifs[i];
1481 if (hwif->chipset == ide_unknown)
1482 return hwif;
1483 }
1484 for (i = 0; i < 2 && i < MAX_HWIFS; i++) {
1485 hwif = &ide_hwifs[i];
1486 if (hwif->chipset == ide_unknown)
1487 return hwif;
1488 }
1489 }
1490
1491 return NULL;
1492}
1493EXPORT_SYMBOL_GPL(ide_find_port_slot);
1494
1447int ide_device_add_all(u8 *idx, const struct ide_port_info *d) 1495int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1448{ 1496{
1449 ide_hwif_t *hwif, *mate = NULL; 1497 ide_hwif_t *hwif, *mate = NULL;