libata: beef up iterators
There currently are the following looping constructs. * __ata_port_for_each_link() for all available links * ata_port_for_each_link() for edge links * ata_link_for_each_dev() for all devices * ata_link_for_each_dev_reverse() for all devices in reverse order Now there's a need for looping construct which is similar to __ata_port_for_each_link() but iterates over PMP links before the host link. Instead of adding another one with long name, do the following cleanup. * Implement and export ata_link_next() and ata_dev_next() which take @mode parameter and can be used to build custom loop. * Implement ata_for_each_link() and ata_for_each_dev() which take looping mode explicitly. The following iteration modes are implemented. * ATA_LITER_EDGE : loop over edge links * ATA_LITER_HOST_FIRST : loop over all links, host link first * ATA_LITER_PMP_FIRST : loop over all links, PMP links first * ATA_DITER_ENABLED : loop over enabled devices * ATA_DITER_ENABLED_REVERSE : loop over enabled devices in reverse order * ATA_DITER_ALL : loop over all devices * ATA_DITER_ALL_REVERSE : loop over all devices in reverse order This change removes exlicit device enabledness checks from many loops and makes it clear which ones are iterated over in which direction. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
@@ -1119,14 +1119,14 @@ static void ahci_start_port(struct ata_port *ap)
|
||||
|
||||
/* turn on LEDs */
|
||||
if (ap->flags & ATA_FLAG_EM) {
|
||||
ata_port_for_each_link(link, ap) {
|
||||
ata_for_each_link(link, ap, EDGE) {
|
||||
emp = &pp->em_priv[link->pmp];
|
||||
ahci_transmit_led_message(ap, emp->led_state, 4);
|
||||
}
|
||||
}
|
||||
|
||||
if (ap->flags & ATA_FLAG_SW_ACTIVITY)
|
||||
ata_port_for_each_link(link, ap)
|
||||
ata_for_each_link(link, ap, EDGE)
|
||||
ahci_init_sw_activity(link);
|
||||
|
||||
}
|
||||
@@ -1361,7 +1361,7 @@ static ssize_t ahci_led_show(struct ata_port *ap, char *buf)
|
||||
struct ahci_em_priv *emp;
|
||||
int rc = 0;
|
||||
|
||||
ata_port_for_each_link(link, ap) {
|
||||
ata_for_each_link(link, ap, EDGE) {
|
||||
emp = &pp->em_priv[link->pmp];
|
||||
rc += sprintf(buf, "%lx\n", emp->led_state);
|
||||
}
|
||||
@@ -1941,7 +1941,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
|
||||
u32 serror;
|
||||
|
||||
/* determine active link */
|
||||
ata_port_for_each_link(link, ap)
|
||||
ata_for_each_link(link, ap, EDGE)
|
||||
if (ata_link_active(link))
|
||||
break;
|
||||
if (!link)
|
||||
|
Reference in New Issue
Block a user