diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2009-01-06 11:20:56 -0500 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2009-01-06 11:20:56 -0500 |
commit | 2bd24a1cfc99d242c2cff9a6b74ca49fcaac3fb6 (patch) | |
tree | d4797f56699e9da367e12b5e1d01b108241424f6 | |
parent | 5e7f3a46690f7f6c9f2781c700ab4370874aa0e8 (diff) |
ide: add port and host iterators
Add ide_port_for_each_dev() / ide_host_for_each_port() iterators
and update IDE code to use them.
While at it:
- s/unit/i/ variable in ide_port_wait_ready(), ide_probe_port(),
ide_port_tune_devices(), ide_port_init_devices_data(), do_reset1(),
ide_acpi_set_state() and scc_dma_end()
- s/d/i/ variable in ide_proc_port_register_devices()
There should be no functional changes caused by this patch.
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
-rw-r--r-- | drivers/ide/ide-acpi.c | 14 | ||||
-rw-r--r-- | drivers/ide/ide-iops.c | 11 | ||||
-rw-r--r-- | drivers/ide/ide-probe.c | 96 | ||||
-rw-r--r-- | drivers/ide/ide-proc.c | 7 | ||||
-rw-r--r-- | drivers/ide/ide.c | 5 | ||||
-rw-r--r-- | drivers/ide/scc_pata.c | 8 | ||||
-rw-r--r-- | include/linux/ide.h | 11 |
7 files changed, 67 insertions, 85 deletions
diff --git a/drivers/ide/ide-acpi.c b/drivers/ide/ide-acpi.c index fd155b8a256c..2f9e941968d6 100644 --- a/drivers/ide/ide-acpi.c +++ b/drivers/ide/ide-acpi.c | |||
@@ -641,7 +641,8 @@ void ide_acpi_push_timing(ide_hwif_t *hwif) | |||
641 | */ | 641 | */ |
642 | void ide_acpi_set_state(ide_hwif_t *hwif, int on) | 642 | void ide_acpi_set_state(ide_hwif_t *hwif, int on) |
643 | { | 643 | { |
644 | int unit; | 644 | ide_drive_t *drive; |
645 | int i; | ||
645 | 646 | ||
646 | if (ide_noacpi || ide_noacpi_psx) | 647 | if (ide_noacpi || ide_noacpi_psx) |
647 | return; | 648 | return; |
@@ -655,9 +656,8 @@ void ide_acpi_set_state(ide_hwif_t *hwif, int on) | |||
655 | /* channel first and then drives for power on and verse versa for power off */ | 656 | /* channel first and then drives for power on and verse versa for power off */ |
656 | if (on) | 657 | if (on) |
657 | acpi_bus_set_power(hwif->acpidata->obj_handle, ACPI_STATE_D0); | 658 | acpi_bus_set_power(hwif->acpidata->obj_handle, ACPI_STATE_D0); |
658 | for (unit = 0; unit < MAX_DRIVES; ++unit) { | ||
659 | ide_drive_t *drive = hwif->devices[unit]; | ||
660 | 659 | ||
660 | ide_port_for_each_dev(i, drive, hwif) { | ||
661 | if (!drive->acpidata->obj_handle) | 661 | if (!drive->acpidata->obj_handle) |
662 | drive->acpidata->obj_handle = ide_acpi_drive_get_handle(drive); | 662 | drive->acpidata->obj_handle = ide_acpi_drive_get_handle(drive); |
663 | 663 | ||
@@ -717,9 +717,7 @@ void ide_acpi_port_init_devices(ide_hwif_t *hwif) | |||
717 | /* | 717 | /* |
718 | * Send IDENTIFY for each drive | 718 | * Send IDENTIFY for each drive |
719 | */ | 719 | */ |
720 | for (i = 0; i < MAX_DRIVES; i++) { | 720 | ide_port_for_each_dev(i, drive, hwif) { |
721 | drive = hwif->devices[i]; | ||
722 | |||
723 | memset(drive->acpidata, 0, sizeof(*drive->acpidata)); | 721 | memset(drive->acpidata, 0, sizeof(*drive->acpidata)); |
724 | 722 | ||
725 | if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) | 723 | if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) |
@@ -744,9 +742,7 @@ void ide_acpi_port_init_devices(ide_hwif_t *hwif) | |||
744 | ide_acpi_get_timing(hwif); | 742 | ide_acpi_get_timing(hwif); |
745 | ide_acpi_push_timing(hwif); | 743 | ide_acpi_push_timing(hwif); |
746 | 744 | ||
747 | for (i = 0; i < MAX_DRIVES; i++) { | 745 | ide_port_for_each_dev(i, drive, hwif) { |
748 | drive = hwif->devices[i]; | ||
749 | |||
750 | if (drive->dev_flags & IDE_DFLAG_PRESENT) | 746 | if (drive->dev_flags & IDE_DFLAG_PRESENT) |
751 | /* Execute ACPI startup code */ | 747 | /* Execute ACPI startup code */ |
752 | ide_acpi_exec_tfs(drive); | 748 | ide_acpi_exec_tfs(drive); |
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 26b58d15c4e6..1a22c31ce7ac 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -1081,8 +1081,9 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi) | |||
1081 | struct ide_io_ports *io_ports = &hwif->io_ports; | 1081 | struct ide_io_ports *io_ports = &hwif->io_ports; |
1082 | const struct ide_tp_ops *tp_ops = hwif->tp_ops; | 1082 | const struct ide_tp_ops *tp_ops = hwif->tp_ops; |
1083 | const struct ide_port_ops *port_ops; | 1083 | const struct ide_port_ops *port_ops; |
1084 | ide_drive_t *tdrive; | ||
1084 | unsigned long flags, timeout; | 1085 | unsigned long flags, timeout; |
1085 | unsigned int unit; | 1086 | int i; |
1086 | DEFINE_WAIT(wait); | 1087 | DEFINE_WAIT(wait); |
1087 | 1088 | ||
1088 | spin_lock_irqsave(&hwif->lock, flags); | 1089 | spin_lock_irqsave(&hwif->lock, flags); |
@@ -1110,9 +1111,7 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi) | |||
1110 | 1111 | ||
1111 | prepare_to_wait(&ide_park_wq, &wait, TASK_UNINTERRUPTIBLE); | 1112 | prepare_to_wait(&ide_park_wq, &wait, TASK_UNINTERRUPTIBLE); |
1112 | timeout = jiffies; | 1113 | timeout = jiffies; |
1113 | for (unit = 0; unit < MAX_DRIVES; unit++) { | 1114 | ide_port_for_each_dev(i, tdrive, hwif) { |
1114 | ide_drive_t *tdrive = hwif->devices[unit]; | ||
1115 | |||
1116 | if (tdrive->dev_flags & IDE_DFLAG_PRESENT && | 1115 | if (tdrive->dev_flags & IDE_DFLAG_PRESENT && |
1117 | tdrive->dev_flags & IDE_DFLAG_PARKED && | 1116 | tdrive->dev_flags & IDE_DFLAG_PARKED && |
1118 | time_after(tdrive->sleep, timeout)) | 1117 | time_after(tdrive->sleep, timeout)) |
@@ -1133,8 +1132,8 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi) | |||
1133 | * First, reset any device state data we were maintaining | 1132 | * First, reset any device state data we were maintaining |
1134 | * for any of the drives on this interface. | 1133 | * for any of the drives on this interface. |
1135 | */ | 1134 | */ |
1136 | for (unit = 0; unit < MAX_DRIVES; ++unit) | 1135 | ide_port_for_each_dev(i, tdrive, hwif) |
1137 | pre_reset(hwif->devices[unit]); | 1136 | pre_reset(tdrive); |
1138 | 1137 | ||
1139 | if (io_ports->ctl_addr == 0) { | 1138 | if (io_ports->ctl_addr == 0) { |
1140 | spin_unlock_irqrestore(&hwif->lock, flags); | 1139 | spin_unlock_irqrestore(&hwif->lock, flags); |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 006e601cafb8..e688ca1c967c 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -697,7 +697,8 @@ out: | |||
697 | 697 | ||
698 | static int ide_port_wait_ready(ide_hwif_t *hwif) | 698 | static int ide_port_wait_ready(ide_hwif_t *hwif) |
699 | { | 699 | { |
700 | int unit, rc; | 700 | ide_drive_t *drive; |
701 | int i, rc; | ||
701 | 702 | ||
702 | printk(KERN_DEBUG "Probing IDE interface %s...\n", hwif->name); | 703 | printk(KERN_DEBUG "Probing IDE interface %s...\n", hwif->name); |
703 | 704 | ||
@@ -714,9 +715,7 @@ static int ide_port_wait_ready(ide_hwif_t *hwif) | |||
714 | return rc; | 715 | return rc; |
715 | 716 | ||
716 | /* Now make sure both master & slave are ready */ | 717 | /* Now make sure both master & slave are ready */ |
717 | for (unit = 0; unit < MAX_DRIVES; unit++) { | 718 | ide_port_for_each_dev(i, drive, hwif) { |
718 | ide_drive_t *drive = hwif->devices[unit]; | ||
719 | |||
720 | /* Ignore disks that we will not probe for later. */ | 719 | /* Ignore disks that we will not probe for later. */ |
721 | if ((drive->dev_flags & IDE_DFLAG_NOPROBE) == 0 || | 720 | if ((drive->dev_flags & IDE_DFLAG_NOPROBE) == 0 || |
722 | (drive->dev_flags & IDE_DFLAG_PRESENT)) { | 721 | (drive->dev_flags & IDE_DFLAG_PRESENT)) { |
@@ -732,7 +731,7 @@ static int ide_port_wait_ready(ide_hwif_t *hwif) | |||
732 | } | 731 | } |
733 | out: | 732 | out: |
734 | /* Exit function with master reselected (let's be sane) */ | 733 | /* Exit function with master reselected (let's be sane) */ |
735 | if (unit) | 734 | if (i) |
736 | SELECT_DRIVE(hwif->devices[0]); | 735 | SELECT_DRIVE(hwif->devices[0]); |
737 | 736 | ||
738 | return rc; | 737 | return rc; |
@@ -778,9 +777,10 @@ EXPORT_SYMBOL_GPL(ide_undecoded_slave); | |||
778 | 777 | ||
779 | static int ide_probe_port(ide_hwif_t *hwif) | 778 | static int ide_probe_port(ide_hwif_t *hwif) |
780 | { | 779 | { |
780 | ide_drive_t *drive; | ||
781 | unsigned long flags; | 781 | unsigned long flags; |
782 | unsigned int irqd; | 782 | unsigned int irqd; |
783 | int unit, rc = -ENODEV; | 783 | int i, rc = -ENODEV; |
784 | 784 | ||
785 | BUG_ON(hwif->present); | 785 | BUG_ON(hwif->present); |
786 | 786 | ||
@@ -806,9 +806,7 @@ static int ide_probe_port(ide_hwif_t *hwif) | |||
806 | * Second drive should only exist if first drive was found, | 806 | * Second drive should only exist if first drive was found, |
807 | * but a lot of cdrom drives are configured as single slaves. | 807 | * but a lot of cdrom drives are configured as single slaves. |
808 | */ | 808 | */ |
809 | for (unit = 0; unit < MAX_DRIVES; ++unit) { | 809 | ide_port_for_each_dev(i, drive, hwif) { |
810 | ide_drive_t *drive = hwif->devices[unit]; | ||
811 | |||
812 | (void) probe_for_drive(drive); | 810 | (void) probe_for_drive(drive); |
813 | if (drive->dev_flags & IDE_DFLAG_PRESENT) | 811 | if (drive->dev_flags & IDE_DFLAG_PRESENT) |
814 | rc = 0; | 812 | rc = 0; |
@@ -829,20 +827,17 @@ static int ide_probe_port(ide_hwif_t *hwif) | |||
829 | static void ide_port_tune_devices(ide_hwif_t *hwif) | 827 | static void ide_port_tune_devices(ide_hwif_t *hwif) |
830 | { | 828 | { |
831 | const struct ide_port_ops *port_ops = hwif->port_ops; | 829 | const struct ide_port_ops *port_ops = hwif->port_ops; |
832 | int unit; | 830 | ide_drive_t *drive; |
833 | 831 | int i; | |
834 | for (unit = 0; unit < MAX_DRIVES; unit++) { | ||
835 | ide_drive_t *drive = hwif->devices[unit]; | ||
836 | 832 | ||
833 | ide_port_for_each_dev(i, drive, hwif) { | ||
837 | if (drive->dev_flags & IDE_DFLAG_PRESENT) { | 834 | if (drive->dev_flags & IDE_DFLAG_PRESENT) { |
838 | if (port_ops && port_ops->quirkproc) | 835 | if (port_ops && port_ops->quirkproc) |
839 | port_ops->quirkproc(drive); | 836 | port_ops->quirkproc(drive); |
840 | } | 837 | } |
841 | } | 838 | } |
842 | 839 | ||
843 | for (unit = 0; unit < MAX_DRIVES; ++unit) { | 840 | ide_port_for_each_dev(i, drive, hwif) { |
844 | ide_drive_t *drive = hwif->devices[unit]; | ||
845 | |||
846 | if (drive->dev_flags & IDE_DFLAG_PRESENT) { | 841 | if (drive->dev_flags & IDE_DFLAG_PRESENT) { |
847 | ide_set_max_pio(drive); | 842 | ide_set_max_pio(drive); |
848 | 843 | ||
@@ -853,9 +848,7 @@ static void ide_port_tune_devices(ide_hwif_t *hwif) | |||
853 | } | 848 | } |
854 | } | 849 | } |
855 | 850 | ||
856 | for (unit = 0; unit < MAX_DRIVES; ++unit) { | 851 | ide_port_for_each_dev(i, drive, hwif) { |
857 | ide_drive_t *drive = hwif->devices[unit]; | ||
858 | |||
859 | if ((hwif->host_flags & IDE_HFLAG_NO_IO_32BIT) || | 852 | if ((hwif->host_flags & IDE_HFLAG_NO_IO_32BIT) || |
860 | drive->id[ATA_ID_DWORD_IO]) | 853 | drive->id[ATA_ID_DWORD_IO]) |
861 | drive->dev_flags |= IDE_DFLAG_NO_IO_32BIT; | 854 | drive->dev_flags |= IDE_DFLAG_NO_IO_32BIT; |
@@ -927,12 +920,11 @@ static DEFINE_MUTEX(ide_cfg_mtx); | |||
927 | */ | 920 | */ |
928 | static int ide_port_setup_devices(ide_hwif_t *hwif) | 921 | static int ide_port_setup_devices(ide_hwif_t *hwif) |
929 | { | 922 | { |
923 | ide_drive_t *drive; | ||
930 | int i, j = 0; | 924 | int i, j = 0; |
931 | 925 | ||
932 | mutex_lock(&ide_cfg_mtx); | 926 | mutex_lock(&ide_cfg_mtx); |
933 | for (i = 0; i < MAX_DRIVES; i++) { | 927 | ide_port_for_each_dev(i, drive, hwif) { |
934 | ide_drive_t *drive = hwif->devices[i]; | ||
935 | |||
936 | if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) | 928 | if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) |
937 | continue; | 929 | continue; |
938 | 930 | ||
@@ -1161,10 +1153,10 @@ out: | |||
1161 | 1153 | ||
1162 | static void hwif_register_devices(ide_hwif_t *hwif) | 1154 | static void hwif_register_devices(ide_hwif_t *hwif) |
1163 | { | 1155 | { |
1156 | ide_drive_t *drive; | ||
1164 | unsigned int i; | 1157 | unsigned int i; |
1165 | 1158 | ||
1166 | for (i = 0; i < MAX_DRIVES; i++) { | 1159 | ide_port_for_each_dev(i, drive, hwif) { |
1167 | ide_drive_t *drive = hwif->devices[i]; | ||
1168 | struct device *dev = &drive->gendev; | 1160 | struct device *dev = &drive->gendev; |
1169 | int ret; | 1161 | int ret; |
1170 | 1162 | ||
@@ -1187,11 +1179,10 @@ static void hwif_register_devices(ide_hwif_t *hwif) | |||
1187 | static void ide_port_init_devices(ide_hwif_t *hwif) | 1179 | static void ide_port_init_devices(ide_hwif_t *hwif) |
1188 | { | 1180 | { |
1189 | const struct ide_port_ops *port_ops = hwif->port_ops; | 1181 | const struct ide_port_ops *port_ops = hwif->port_ops; |
1182 | ide_drive_t *drive; | ||
1190 | int i; | 1183 | int i; |
1191 | 1184 | ||
1192 | for (i = 0; i < MAX_DRIVES; i++) { | 1185 | ide_port_for_each_dev(i, drive, hwif) { |
1193 | ide_drive_t *drive = hwif->devices[i]; | ||
1194 | |||
1195 | drive->dn = i + hwif->channel * 2; | 1186 | drive->dn = i + hwif->channel * 2; |
1196 | 1187 | ||
1197 | if (hwif->host_flags & IDE_HFLAG_IO_32BIT) | 1188 | if (hwif->host_flags & IDE_HFLAG_IO_32BIT) |
@@ -1282,16 +1273,16 @@ static const u8 ide_hwif_to_major[] = | |||
1282 | 1273 | ||
1283 | static void ide_port_init_devices_data(ide_hwif_t *hwif) | 1274 | static void ide_port_init_devices_data(ide_hwif_t *hwif) |
1284 | { | 1275 | { |
1285 | int unit; | 1276 | ide_drive_t *drive; |
1277 | int i; | ||
1286 | 1278 | ||
1287 | for (unit = 0; unit < MAX_DRIVES; ++unit) { | 1279 | ide_port_for_each_dev(i, drive, hwif) { |
1288 | ide_drive_t *drive = hwif->devices[unit]; | 1280 | u8 j = (hwif->index * MAX_DRIVES) + i; |
1289 | u8 j = (hwif->index * MAX_DRIVES) + unit; | ||
1290 | 1281 | ||
1291 | memset(drive, 0, sizeof(*drive)); | 1282 | memset(drive, 0, sizeof(*drive)); |
1292 | 1283 | ||
1293 | drive->media = ide_disk; | 1284 | drive->media = ide_disk; |
1294 | drive->select = (unit << 4) | ATA_DEVICE_OBS; | 1285 | drive->select = (i << 4) | ATA_DEVICE_OBS; |
1295 | drive->hwif = hwif; | 1286 | drive->hwif = hwif; |
1296 | drive->ready_stat = ATA_DRDY; | 1287 | drive->ready_stat = ATA_DRDY; |
1297 | drive->bad_wstat = BAD_W_STAT; | 1288 | drive->bad_wstat = BAD_W_STAT; |
@@ -1387,10 +1378,11 @@ static void ide_free_port_slot(int idx) | |||
1387 | 1378 | ||
1388 | static void ide_port_free_devices(ide_hwif_t *hwif) | 1379 | static void ide_port_free_devices(ide_hwif_t *hwif) |
1389 | { | 1380 | { |
1381 | ide_drive_t *drive; | ||
1390 | int i; | 1382 | int i; |
1391 | 1383 | ||
1392 | for (i = 0; i < MAX_DRIVES; i++) | 1384 | ide_port_for_each_dev(i, drive, hwif) |
1393 | kfree(hwif->devices[i]); | 1385 | kfree(drive); |
1394 | } | 1386 | } |
1395 | 1387 | ||
1396 | static int ide_port_alloc_devices(ide_hwif_t *hwif, int node) | 1388 | static int ide_port_alloc_devices(ide_hwif_t *hwif, int node) |
@@ -1478,9 +1470,7 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d, | |||
1478 | ide_hwif_t *hwif, *mate = NULL; | 1470 | ide_hwif_t *hwif, *mate = NULL; |
1479 | int i, j = 0; | 1471 | int i, j = 0; |
1480 | 1472 | ||
1481 | for (i = 0; i < MAX_HOST_PORTS; i++) { | 1473 | ide_host_for_each_port(i, hwif, host) { |
1482 | hwif = host->ports[i]; | ||
1483 | |||
1484 | if (hwif == NULL) { | 1474 | if (hwif == NULL) { |
1485 | mate = NULL; | 1475 | mate = NULL; |
1486 | continue; | 1476 | continue; |
@@ -1506,9 +1496,7 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d, | |||
1506 | ide_port_init_devices(hwif); | 1496 | ide_port_init_devices(hwif); |
1507 | } | 1497 | } |
1508 | 1498 | ||
1509 | for (i = 0; i < MAX_HOST_PORTS; i++) { | 1499 | ide_host_for_each_port(i, hwif, host) { |
1510 | hwif = host->ports[i]; | ||
1511 | |||
1512 | if (hwif == NULL) | 1500 | if (hwif == NULL) |
1513 | continue; | 1501 | continue; |
1514 | 1502 | ||
@@ -1523,9 +1511,7 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d, | |||
1523 | ide_port_tune_devices(hwif); | 1511 | ide_port_tune_devices(hwif); |
1524 | } | 1512 | } |
1525 | 1513 | ||
1526 | for (i = 0; i < MAX_HOST_PORTS; i++) { | 1514 | ide_host_for_each_port(i, hwif, host) { |
1527 | hwif = host->ports[i]; | ||
1528 | |||
1529 | if (hwif == NULL) | 1515 | if (hwif == NULL) |
1530 | continue; | 1516 | continue; |
1531 | 1517 | ||
@@ -1550,9 +1536,7 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d, | |||
1550 | ide_acpi_port_init_devices(hwif); | 1536 | ide_acpi_port_init_devices(hwif); |
1551 | } | 1537 | } |
1552 | 1538 | ||
1553 | for (i = 0; i < MAX_HOST_PORTS; i++) { | 1539 | ide_host_for_each_port(i, hwif, host) { |
1554 | hwif = host->ports[i]; | ||
1555 | |||
1556 | if (hwif == NULL) | 1540 | if (hwif == NULL) |
1557 | continue; | 1541 | continue; |
1558 | 1542 | ||
@@ -1560,9 +1544,7 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d, | |||
1560 | hwif_register_devices(hwif); | 1544 | hwif_register_devices(hwif); |
1561 | } | 1545 | } |
1562 | 1546 | ||
1563 | for (i = 0; i < MAX_HOST_PORTS; i++) { | 1547 | ide_host_for_each_port(i, hwif, host) { |
1564 | hwif = host->ports[i]; | ||
1565 | |||
1566 | if (hwif == NULL) | 1548 | if (hwif == NULL) |
1567 | continue; | 1549 | continue; |
1568 | 1550 | ||
@@ -1602,11 +1584,10 @@ EXPORT_SYMBOL_GPL(ide_host_add); | |||
1602 | 1584 | ||
1603 | static void __ide_port_unregister_devices(ide_hwif_t *hwif) | 1585 | static void __ide_port_unregister_devices(ide_hwif_t *hwif) |
1604 | { | 1586 | { |
1587 | ide_drive_t *drive; | ||
1605 | int i; | 1588 | int i; |
1606 | 1589 | ||
1607 | for (i = 0; i < MAX_DRIVES; i++) { | 1590 | ide_port_for_each_dev(i, drive, hwif) { |
1608 | ide_drive_t *drive = hwif->devices[i]; | ||
1609 | |||
1610 | if (drive->dev_flags & IDE_DFLAG_PRESENT) { | 1591 | if (drive->dev_flags & IDE_DFLAG_PRESENT) { |
1611 | device_unregister(&drive->gendev); | 1592 | device_unregister(&drive->gendev); |
1612 | wait_for_completion(&drive->gendev_rel_comp); | 1593 | wait_for_completion(&drive->gendev_rel_comp); |
@@ -1675,9 +1656,7 @@ void ide_host_free(struct ide_host *host) | |||
1675 | ide_hwif_t *hwif; | 1656 | ide_hwif_t *hwif; |
1676 | int i; | 1657 | int i; |
1677 | 1658 | ||
1678 | for (i = 0; i < MAX_HOST_PORTS; i++) { | 1659 | ide_host_for_each_port(i, hwif, host) { |
1679 | hwif = host->ports[i]; | ||
1680 | |||
1681 | if (hwif == NULL) | 1660 | if (hwif == NULL) |
1682 | continue; | 1661 | continue; |
1683 | 1662 | ||
@@ -1692,11 +1671,12 @@ EXPORT_SYMBOL_GPL(ide_host_free); | |||
1692 | 1671 | ||
1693 | void ide_host_remove(struct ide_host *host) | 1672 | void ide_host_remove(struct ide_host *host) |
1694 | { | 1673 | { |
1674 | ide_hwif_t *hwif; | ||
1695 | int i; | 1675 | int i; |
1696 | 1676 | ||
1697 | for (i = 0; i < MAX_HOST_PORTS; i++) { | 1677 | ide_host_for_each_port(i, hwif, host) { |
1698 | if (host->ports[i]) | 1678 | if (hwif) |
1699 | ide_unregister(host->ports[i]); | 1679 | ide_unregister(hwif); |
1700 | } | 1680 | } |
1701 | 1681 | ||
1702 | ide_host_free(host); | 1682 | ide_host_free(host); |
diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c index 1dc827fa7061..1d8978b3314a 100644 --- a/drivers/ide/ide-proc.c +++ b/drivers/ide/ide-proc.c | |||
@@ -593,14 +593,13 @@ EXPORT_SYMBOL(ide_proc_unregister_driver); | |||
593 | 593 | ||
594 | void ide_proc_port_register_devices(ide_hwif_t *hwif) | 594 | void ide_proc_port_register_devices(ide_hwif_t *hwif) |
595 | { | 595 | { |
596 | int d; | ||
597 | struct proc_dir_entry *ent; | 596 | struct proc_dir_entry *ent; |
598 | struct proc_dir_entry *parent = hwif->proc; | 597 | struct proc_dir_entry *parent = hwif->proc; |
598 | ide_drive_t *drive; | ||
599 | char name[64]; | 599 | char name[64]; |
600 | int i; | ||
600 | 601 | ||
601 | for (d = 0; d < MAX_DRIVES; d++) { | 602 | ide_port_for_each_dev(i, drive, hwif) { |
602 | ide_drive_t *drive = hwif->devices[d]; | ||
603 | |||
604 | if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0 || drive->proc) | 603 | if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0 || drive->proc) |
605 | continue; | 604 | continue; |
606 | 605 | ||
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 8a6f893d127e..258805da15c3 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -488,6 +488,7 @@ MODULE_PARM_DESC(ignore_cable, "ignore cable detection"); | |||
488 | 488 | ||
489 | void ide_port_apply_params(ide_hwif_t *hwif) | 489 | void ide_port_apply_params(ide_hwif_t *hwif) |
490 | { | 490 | { |
491 | ide_drive_t *drive; | ||
491 | int i; | 492 | int i; |
492 | 493 | ||
493 | if (ide_ignore_cable & (1 << hwif->index)) { | 494 | if (ide_ignore_cable & (1 << hwif->index)) { |
@@ -496,8 +497,8 @@ void ide_port_apply_params(ide_hwif_t *hwif) | |||
496 | hwif->cbl = ATA_CBL_PATA40_SHORT; | 497 | hwif->cbl = ATA_CBL_PATA40_SHORT; |
497 | } | 498 | } |
498 | 499 | ||
499 | for (i = 0; i < MAX_DRIVES; i++) | 500 | ide_port_for_each_dev(i, drive, hwif) |
500 | ide_dev_apply_params(hwif->devices[i], i); | 501 | ide_dev_apply_params(drive, i); |
501 | } | 502 | } |
502 | 503 | ||
503 | /* | 504 | /* |
diff --git a/drivers/ide/scc_pata.c b/drivers/ide/scc_pata.c index 841164d7d3b9..5d53850c79d7 100644 --- a/drivers/ide/scc_pata.c +++ b/drivers/ide/scc_pata.c | |||
@@ -406,17 +406,17 @@ static int scc_dma_end(ide_drive_t *drive) | |||
406 | data_loss = 1; | 406 | data_loss = 1; |
407 | if (retry++) { | 407 | if (retry++) { |
408 | struct request *rq = hwif->rq; | 408 | struct request *rq = hwif->rq; |
409 | int unit; | 409 | ide_drive_t *drive; |
410 | int i; | ||
411 | |||
410 | /* ERROR_RESET and drive->crc_count are needed | 412 | /* ERROR_RESET and drive->crc_count are needed |
411 | * to reduce DMA transfer mode in retry process. | 413 | * to reduce DMA transfer mode in retry process. |
412 | */ | 414 | */ |
413 | if (rq) | 415 | if (rq) |
414 | rq->errors |= ERROR_RESET; | 416 | rq->errors |= ERROR_RESET; |
415 | for (unit = 0; unit < MAX_DRIVES; unit++) { | ||
416 | ide_drive_t *drive = hwif->devices[unit]; | ||
417 | 417 | ||
418 | ide_port_for_each_dev(i, drive, hwif) | ||
418 | drive->crc_count++; | 419 | drive->crc_count++; |
419 | } | ||
420 | } | 420 | } |
421 | } | 421 | } |
422 | } | 422 | } |
diff --git a/include/linux/ide.h b/include/linux/ide.h index f00086b10be3..4cecd923fc79 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -753,7 +753,7 @@ typedef struct hwif_s { | |||
753 | 753 | ||
754 | unsigned long sata_scr[SATA_NR_PORTS]; | 754 | unsigned long sata_scr[SATA_NR_PORTS]; |
755 | 755 | ||
756 | ide_drive_t *devices[MAX_DRIVES]; | 756 | ide_drive_t *devices[MAX_DRIVES + 1]; |
757 | 757 | ||
758 | u8 major; /* our major number */ | 758 | u8 major; /* our major number */ |
759 | u8 index; /* 0 for ide0; 1 for ide1; ... */ | 759 | u8 index; /* 0 for ide0; 1 for ide1; ... */ |
@@ -861,7 +861,7 @@ typedef struct hwif_s { | |||
861 | #define MAX_HOST_PORTS 4 | 861 | #define MAX_HOST_PORTS 4 |
862 | 862 | ||
863 | struct ide_host { | 863 | struct ide_host { |
864 | ide_hwif_t *ports[MAX_HOST_PORTS]; | 864 | ide_hwif_t *ports[MAX_HOST_PORTS + 1]; |
865 | unsigned int n_ports; | 865 | unsigned int n_ports; |
866 | struct device *dev[2]; | 866 | struct device *dev[2]; |
867 | unsigned int (*init_chipset)(struct pci_dev *); | 867 | unsigned int (*init_chipset)(struct pci_dev *); |
@@ -1604,4 +1604,11 @@ static inline ide_drive_t *ide_get_pair_dev(ide_drive_t *drive) | |||
1604 | 1604 | ||
1605 | return (peer->dev_flags & IDE_DFLAG_PRESENT) ? peer : NULL; | 1605 | return (peer->dev_flags & IDE_DFLAG_PRESENT) ? peer : NULL; |
1606 | } | 1606 | } |
1607 | |||
1608 | #define ide_port_for_each_dev(i, dev, port) \ | ||
1609 | for ((i) = 0; ((dev) = (port)->devices[i]) || (i) < MAX_DRIVES; (i)++) | ||
1610 | |||
1611 | #define ide_host_for_each_port(i, port, host) \ | ||
1612 | for ((i) = 0; ((port) = (host)->ports[i]) || (i) < MAX_HOST_PORTS; (i)++) | ||
1613 | |||
1607 | #endif /* _IDE_H */ | 1614 | #endif /* _IDE_H */ |