diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-27 19:07:21 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-27 19:07:21 -0700 |
commit | 03529d9f66b7995c67ddceb8f83258df3c9915da (patch) | |
tree | c16b506ebbb5644849f094c23976680906d64c1f /drivers/scsi/libata-eh.c | |
parent | 11bcab9071ac204b1ca2bb0514ad1641bc4c280b (diff) | |
parent | 2154cfa6ba560401d25f6cc083fe3fb996cbb571 (diff) | |
download | kernel-crypto-03529d9f66b7995c67ddceb8f83258df3c9915da.tar.gz kernel-crypto-03529d9f66b7995c67ddceb8f83258df3c9915da.tar.xz kernel-crypto-03529d9f66b7995c67ddceb8f83258df3c9915da.zip |
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev:
[PATCH] ata_piix: add ICH6/7/8 to Kconfig
[PATCH] sata_sil: disable hotplug interrupts on two ATI IXPs
[PATCH] libata: cosmetic updates
[PATCH] ata: add some NVIDIA chipset IDs
[PATCH] libata reduce timeouts
[PATCH] libata: implement ata_port_max_devices()
[PATCH] libata: make two functions global
[PATCH] libata: update ata_do_simple_cmd()
[PATCH] libata: move ata_do_simple_cmd() below ata_exec_internal()
[PATCH] libata: clear EH action on device detach
[PATCH] libata: implement and use ata_deh_dev_action()
[PATCH] libata: move ata_eh_clear_action() upward
[PATCH] libata.h needs scatterlist.h
[libata] sata_vsc: partially revert a PCI ID-related commit
[libata] Bump versions
Diffstat (limited to 'drivers/scsi/libata-eh.c')
-rw-r--r-- | drivers/scsi/libata-eh.c | 63 |
1 files changed, 37 insertions, 26 deletions
diff --git a/drivers/scsi/libata-eh.c b/drivers/scsi/libata-eh.c index 823385981a7..bf5a72aca8a 100644 --- a/drivers/scsi/libata-eh.c +++ b/drivers/scsi/libata-eh.c @@ -93,6 +93,38 @@ static int ata_ering_map(struct ata_ering *ering, return rc; } +static unsigned int ata_eh_dev_action(struct ata_device *dev) +{ + struct ata_eh_context *ehc = &dev->ap->eh_context; + + return ehc->i.action | ehc->i.dev_action[dev->devno]; +} + +static void ata_eh_clear_action(struct ata_device *dev, + struct ata_eh_info *ehi, unsigned int action) +{ + int i; + + if (!dev) { + ehi->action &= ~action; + for (i = 0; i < ATA_MAX_DEVICES; i++) + ehi->dev_action[i] &= ~action; + } else { + /* doesn't make sense for port-wide EH actions */ + WARN_ON(!(action & ATA_EH_PERDEV_MASK)); + + /* break ehi->action into ehi->dev_action */ + if (ehi->action & action) { + for (i = 0; i < ATA_MAX_DEVICES; i++) + ehi->dev_action[i] |= ehi->action & action; + ehi->action &= ~action; + } + + /* turn off the specified per-dev action */ + ehi->dev_action[dev->devno] &= ~action; + } +} + /** * ata_scsi_timed_out - SCSI layer time out callback * @cmd: timed out SCSI command @@ -702,32 +734,11 @@ static void ata_eh_detach_dev(struct ata_device *dev) ap->flags |= ATA_FLAG_SCSI_HOTPLUG; } - spin_unlock_irqrestore(ap->lock, flags); -} - -static void ata_eh_clear_action(struct ata_device *dev, - struct ata_eh_info *ehi, unsigned int action) -{ - int i; + /* clear per-dev EH actions */ + ata_eh_clear_action(dev, &ap->eh_info, ATA_EH_PERDEV_MASK); + ata_eh_clear_action(dev, &ap->eh_context.i, ATA_EH_PERDEV_MASK); - if (!dev) { - ehi->action &= ~action; - for (i = 0; i < ATA_MAX_DEVICES; i++) - ehi->dev_action[i] &= ~action; - } else { - /* doesn't make sense for port-wide EH actions */ - WARN_ON(!(action & ATA_EH_PERDEV_MASK)); - - /* break ehi->action into ehi->dev_action */ - if (ehi->action & action) { - for (i = 0; i < ATA_MAX_DEVICES; i++) - ehi->dev_action[i] |= ehi->action & action; - ehi->action &= ~action; - } - - /* turn off the specified per-dev action */ - ehi->dev_action[dev->devno] &= ~action; - } + spin_unlock_irqrestore(ap->lock, flags); } /** @@ -1592,7 +1603,7 @@ static int ata_eh_revalidate_and_attach(struct ata_port *ap, unsigned int action; dev = &ap->device[i]; - action = ehc->i.action | ehc->i.dev_action[dev->devno]; + action = ata_eh_dev_action(dev); if (action & ATA_EH_REVALIDATE && ata_dev_enabled(dev)) { if (ata_port_offline(ap)) { |