1. 13 10月, 2007 17 次提交
    • T
      libata-pmp-prep: implement ATA_LFLAG_DISABLED · f9df58cb
      Tejun Heo 提交于
      Implement ATA_LFLAG_DISABLED.  The flag indicates the link is disabled
      due to EH recovery failure.  While a link is disabled, no EH action is
      taken on the link and suspend/resume become noop too.
      
      This will be used by PMP links to manage failed links.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      f9df58cb
    • T
      libata-pmp-prep: implement ATA_LFLAG_NO_RETRY · fd995f70
      Tejun Heo 提交于
      Some PMP links are connected to internal pseudo devices which may come
      and go depending on situation.  There's no reason to try hard to
      recover them.  ATA_LFLAG_NO_RETRY tells EH to not retry if the device
      attached to the link fails.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      fd995f70
    • T
      libata-pmp-prep: implement ATA_LFLAG_NO_SRST, ASSUME_ATA and ASSUME_SEMB · ae791c05
      Tejun Heo 提交于
      Some links on some PMPs locks up on SRST and/or report incorrect
      device signature.  Implement ATA_LFLAG_NO_SRST, ASSUME_ATA and
      ASSUME_SEMB to handle these quirky links.  NO_SRST makes EH avoid
      SRST.  ASSUME_ATA and SEMB forces class code to ATA and SEMB_UNSUP
      respectively.  Note that SEMB isn't currently supported yet so the
      _UNSUP variant is used.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      ae791c05
    • T
      libata-pmp-prep: implement qc_defer helpers · da917d69
      Tejun Heo 提交于
      Implement ap->nr_active_links (the number of links with active qcs),
      ap->excl_link (pointer to link which can be used by ->qc_defer and is
      cleared when a qc with ATA_QCFLAG_CLEAR_EXCL completes), and
      ata_link_active().
      
      These can be used by ->qc_defer() to implement proper command
      exclusion.  This set of helpers seem enough for both sil24 (ATAPI
      exclusion needed) and cmd-switching PMP.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      da917d69
    • T
      libata-pmp-prep: make a number of functions global to libata · fb7fd614
      Tejun Heo 提交于
      Make a number of functions from libata-core.c and libata-eh.c global
      to libata (drivers/ata/libata.h).  These will be used by PMP.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      fb7fd614
    • T
      libata-pmp-prep: add @new_class to ata_dev_revalidate() · 422c9daa
      Tejun Heo 提交于
      Consider newly found class code while revalidating.  PMP resetting
      always results in valid class code and issuing PMP commands to
      ATA/ATAPI device isn't very attractive.  Add @new_class to
      ata_dev_revalidate() and check class code for revalidation.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      422c9daa
    • T
      libata: move EH repeat reporting into ata_eh_report() · a1e10f7e
      Tejun Heo 提交于
      EH is sometimes repeated without any error or action.  For example,
      this happens when probing IDENTIFY fails because of a phantom device.
      In these cases, all the repeated EH does is making sure there is no
      unhandled error or pending action and return.  This repeation is
      necessary to avoid losing any event which occurred while EH was in
      progress.
      
      Unfortunately, this dry run causes annonying "EH pending after
      completion" message.  This patch moves the repeat reporting into
      ata_eh_report() such that it's more compact and skipped on dry runs.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Mikael Pettersson <mikep@it.uu.se>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      a1e10f7e
    • T
      libata: implement and use ata_port_desc() to report port configuration · cbcdd875
      Tejun Heo 提交于
      Currently, port configuration reporting has the following problems.
      
      * iomapped address is reported instead of raw address
      * report contains irrelevant fields or lacks necessary fields for
        non-SFF controllers.
      * host->irq/irq2 are there just for reporting and hacky.
      
      This patch implements and uses ata_port_desc() and
      ata_port_pbar_desc().  ata_port_desc() is almost identical to
      ata_ehi_push_desc() except that it takes @ap instead of @ehi, has no
      locking requirement, can only be used during host initialization and "
      " is used as separator instead of ", ".  ata_port_pbar_desc() is a
      helper to ease reporting of a PCI BAR or an offsetted address into it.
      
      LLD pushes whatever description it wants using the above two
      functions.  The accumulated description is printed on host
      registration after "[S/P]ATA max MAX_XFERMODE ".
      
      SFF init helpers and ata_host_activate() automatically add
      descriptions for addresses and irq respectively, so only LLDs which
      isn't standard SFF need to add custom descriptions.  In many cases,
      such controllers need to report different things anyway.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      cbcdd875
    • T
      libata-link: update EH to deal with PMP links · 9b1e2658
      Tejun Heo 提交于
      Update ata_eh_autopsy(), ata_eh_report(),
      ata_eh_revalidate_and_attach() and ata_eh_recover() to deal with PMP
      links.  ata_eh_autopsy() and ata_eh_report() updates are
      straightforward.  They just repeat the same operation over all
      configured links.  The only change to ata_eh_revalidate_and_attach()
      is avoiding calling ->cable_select() on non-host ports.
      
      ata_eh_recover() update is more complex as it first processes all
      resets and then performs the rest.  This is necessary as thawing with
      some links in unknown state can be dangerous.  ehi->action is cleared
      on successful recovery of a link to avoid repeating recovery due to
      failures in other links.
      
      ata_eh_recover() iterates over only PMP links if PMP is attached, and,
      on failure, the failing link is returned in @failed_link instead of
      disabling devices directly.  These are to integrate ata_eh_recover()
      into PMP EH later.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      9b1e2658
    • T
      libata-link: update ata_scsi_error() to handle PMP links · cf1b86c8
      Tejun Heo 提交于
      Update ata_scsi_error() to handle PMP links.  As error conditions can
      occur on both host and PMP links, __ata_port_for_each_link() is used.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      cf1b86c8
    • T
      libata-link: implement ata_link_abort() · dbd82616
      Tejun Heo 提交于
      Implement ata_link_abort().
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      dbd82616
    • T
      libata-link: linkify config/EH related functions · 0260731f
      Tejun Heo 提交于
      Make the following functions deal with ata_link instead of ata_port.
      
      * ata_set_mode()
      * ata_eh_autopsy() and related functions
      * ata_eh_report() and related functions
      * suspend/resume related functions
      * ata_eh_recover() and related functions
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      0260731f
    • T
      libata-link: linkify reset · cc0680a5
      Tejun Heo 提交于
      Make reset methods and related functions deal with ata_link instead of
      ata_port.
      
      * ata_do_reset()
      * ata_eh_reset()
      * all prereset/reset/postreset methods and related functions
      
      This patch introduces no behavior change.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      cc0680a5
    • T
      libata-link: linkify EH action helpers · 955e57df
      Tejun Heo 提交于
      Make ata_eh_about_to_do() and ata_eh_done() deal with ata_link instead
      of ata_port.
      
      This patch introduces no behavior change.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      955e57df
    • T
      libata-link: linkify PHY-related functions · 936fd732
      Tejun Heo 提交于
      Make the following PHY-related functions to deal with ata_link instead
      of ata_port.
      
      * sata_print_link_status()
      * sata_down_spd_limit()
      * ata_set_sata_spd_limit() and friends
      * sata_link_debounce/resume()
      * sata_scr_valid/read/write/write_flush()
      * ata_link_on/offline()
      
      This patch introduces no behavior change.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      936fd732
    • T
      libata-link: implement and use link/device iterators · f58229f8
      Tejun Heo 提交于
      Multiple links and different number of devices per link should be
      considered to iterate over links and devices.  This patch implements
      and uses link and device iterators - ata_port_for_each_link() and
      ata_link_for_each_dev() - and ata_link_max_devices().
      
      This change makes a lot of functions iterate over only possible
      devices instead of from dev 0 to dev ATA_MAX_DEVICES.  All such
      changes have been examined and nothing should be broken.
      
      While at it, add a separating comment before device helpers to
      distinguish them better from link helpers and others.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      f58229f8
    • T
      libata-link: introduce ata_link · 9af5c9c9
      Tejun Heo 提交于
      Introduce ata_link.  It abstracts PHY and sits between ata_port and
      ata_device.  This new level of abstraction is necessary to support
      SATA Port Multiplier, which basically adds a bunch of links (PHYs) to
      a ATA host port.  Fields related to command execution, spd_limit and
      EH are per-link and thus moved to ata_link.
      
      This patch only defines the host link.  Multiple link handling will be
      added later.  Also, a lot of ap->link derefences are added but many of
      them will be removed as each part is converted to deal directly with
      ata_link instead of ata_port.
      
      This patch introduces no behavior change.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: James Bottomley <James.Bottomley@SteelEye.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      9af5c9c9
  2. 20 7月, 2007 7 次提交
    • T
      libata: implement EH fast drain · 5ddf24c5
      Tejun Heo 提交于
      In most cases, when EH is scheduled, all in-flight commands are
      aborted causing EH to kick in immediately.  However, in some cases
      (especially with PMP), it's unclear which commands are affected by the
      error condition and although aborting all in-flight commands work, it
      isn't optimal and may cause unnecessary disruption.  On the other
      hand, waiting for in-flight commands to drain themselves can take up
      to 30seconds.
      
      This patch implements EH fast drain to handle such situations.  It
      gives in-flight commands some time to finish up but doesn't wait for
      too long.  After EH is scheduled, fast drain timer is started and if
      no other completion occurs in ATA_EH_FASTDRAIN_INTERVAL all in-flight
      commands are aborted.  If any completion occurred in the interval, the
      port is given another interval to finish up itself.
      
      Currently ATA_EH_FASTDRAIN_INTERVAL is 3 secs which should be enough
      for finishing up most commands.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      5ddf24c5
    • T
      libata: schedule probing after SError access failure during autopsy · 4e57c517
      Tejun Heo 提交于
      If SError isn't accessible, EH can't tell whether hotplug has happened
      or not.  Report SError read failure with AC_ERR_OTHER and schedule
      probing with hardreset.  This will be mainly useful for PMPs.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      4e57c517
    • T
      libata: clear HOTPLUG flag after a reset · fccb6ea5
      Tejun Heo 提交于
      ATA_EHI_HOTPLUGGED is a hint for reset functions indicating the the
      port might have gone through hotplug/unplug just before entering EH.
      Reset functions modify their behaviors a bit to handle the situation
      better - e.g. using longer debouncing delay.
      
      Currently, once HOTPLUG is set, it isn't cleared till the end of EH.
      This is unnecessary and makes EH take longer.  Clear the HOTPLUGGED
      flag after a reset try (successful or not).
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      fccb6ea5
    • T
      libata: quickly trigger SATA SPD down after debouncing failed · f1545154
      Tejun Heo 提交于
      Debouncing failure is a good indicator of basic link problem.  Use
      -EPIPE to indicate debouncing failure and make ata_eh_reset() invoke
      sata_down_spd_limit() if the error occurs during reset.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      f1545154
    • T
      libata: improve SATA PHY speed down logic · 008a7896
      Tejun Heo 提交于
      sata_down_spd_limit() first reads the current SPD from SStatus and
      limit the speed to the lower one of one below the current limit or one
      below the current SPD in SStatus.  SPD may not be accessible or valid
      when SPD down is requested making sata_down_spd_limit() fail when it's
      most needed.
      
      This patch makes the current SPD cached after each successful reset
      and forces GEN I speed (1.5Gbps) if neither of SStatus or the cached
      value is valid, so sata_down_spd_limit() is now guaranteed to lower
      the speed limit if lower speed is available.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      008a7896
    • T
      libata: implement AC_ERR_NCQ · 5335b729
      Tejun Heo 提交于
      When an NCQ command fails, all commands in flight are aborted and the
      offending one is reported using log page 10h.  Depending on controller
      characteristics and LLD implementation, all commands may appear as
      having a device error due to shared TF status making it hard to
      determine what's actually going on.
      
      This patch adds AC_ERR_NCQ, marks the command reported by log page 10h
      with it and print extra "<F>" after the error report for the command
      to help distinguishing the offending command.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      5335b729
    • T
      libata: improve EH report formatting · b64bbc39
      Tejun Heo 提交于
      Requiring LLDs to format multiple error description messages properly
      doesn't work too well.  Help LLDs a bit by making ata_ehi_push_desc()
      insert ", " on each invocation.  __ata_ehi_push_desc() is the raw
      version without the automatic separator.
      
      While at it, make ehi_desc interface proper functions instead of
      macros.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      b64bbc39
  3. 11 7月, 2007 1 次提交
  4. 10 7月, 2007 2 次提交
    • T
      libata-acpi: implement _GTM/_STM support · 64578a3d
      Tejun Heo 提交于
      Implement _GTM/_STM support.  acpi_gtm is added to ata_port which
      stores _GTM parameters over suspend/resume cycle.  A new hook
      ata_acpi_on_suspend() is responsible for storing _GTM parameters
      during suspend.  _STM is executed in ata_acpi_on_resume().  With this
      change, invoking _GTF is safe on IDE hierarchy and acpi_sata check
      before _GTF is removed.
      
      ata_acpi_gtm() and ata_acpi_stm() implementation is taken from Alan
      Cox's pata_acpi implementation.  ata_acpi_gtm() is fixed such that the
      result parameter is not shifted by sizeof(union acpi_object).
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      64578a3d
    • T
      libata: reimplement ACPI invocation · 6746544c
      Tejun Heo 提交于
      This patch reimplements ACPI invocation such that, instead of
      exporting ACPI details to the rest of libata, ACPI event handlers -
      ata_acpi_on_resume() and ata_acpi_on_devcfg() - are used.  These two
      functions are responsible for determining whether specific ACPI method
      is used and when.
      
      On resume, _GTF is scheduled by setting ATA_DFLAG_ACPI_PENDING device
      flag.  This is done this way to avoid performing the action on wrong
      device device (device swapping while suspended).
      
      On every ata_dev_configure(), ata_acpi_on_devcfg() is called, which
      performs _SDD and _GTF.  _GTF is performed only after resuming and, if
      SATA, hardreset as the ACPI spec specifies.  As _GTF may contain
      arbitrary commands, IDENTIFY page is re-read after _GTF taskfiles are
      executed.
      
      If one of ACPI methods fails, ata_acpi_on_devcfg() retries on the
      first failure.  If it fails again on the second try, ACPI is disabled
      on the device.  Note that successful configuration clears ACPI failed
      status.
      
      With all feature checks moved to the above two functions,
      do_drive_set_taskfiles() is trivial and thus collapsed into
      ata_acpi_exec_tfs(), which is now static and converted to return the
      number of executed taskfiles to be used by ata_acpi_on_resume().  As
      failures are handled properly, ata_acpi_push_id() now returns -errno
      on errors instead of unconditional zero.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      6746544c
  5. 27 6月, 2007 3 次提交
  6. 22 5月, 2007 1 次提交
  7. 12 5月, 2007 3 次提交
    • T
      libata: give devices one last chance even if recovery failed with -EINVAL · 8575b814
      Tejun Heo 提交于
      After certain errors, some devices report complete garbage on
      IDENTIFY.  This can cause ata_dev_read_id() to fail with -EINVAL
      resulting in immediate disabling of the device.  Give the device one
      last chance after -EINVAL to allow recovery from such situations.  As
      -EINVAL is triggered very rarely, this shouldn't cause any noticeable
      affect on more common error paths.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Harald Dunkel <harald.dunkel@t-online.de>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      8575b814
    • T
      libata: ignore EH scheduling during initialization · f4d6d004
      Tejun Heo 提交于
      libata enables SCSI host during ATA host activation which happens
      after IRQ handler is registered and IRQ is enabled.  All ATA ports are
      in frozen state when IRQ is enabled but frozen ports may raise limited
      number of IRQs after being frozen - IOW, ->freeze() is not responsible
      for clearing pending IRQs.  During normal operation, the IRQ handler
      is responsible for clearing spurious IRQs on frozen ports and it
      usually doesn't require any extra code.
      
      Unfortunately, during host initialization, the IRQ handler can end up
      scheduling EH for a port whose SCSI host isn't initialized yet.  This
      results in OOPS in the SCSI midlayer.  This is relatively short window
      and scheduling EH for probing is the first thing libata does after
      initialization, so ignoring EH scheduling until initialization is
      complete solves the problem nicely.
      
      This problem was spotted by Berck E. Nash in the following thread.
      
        http://thread.gmane.org/gmane.linux.kernel/519412Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Berck E. Nash <flyboy@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      f4d6d004
    • T
      libata: reimplement suspend/resume support using sdev->manage_start_stop · 9666f400
      Tejun Heo 提交于
      Reimplement suspend/resume support using sdev->manage_start_stop.
      
      * Device suspend/resume is now SCSI layer's responsibility and the
        code is simplified a lot.
      
      * DPM is dropped.  This also simplifies code a lot.  Suspend/resume
        status is port-wide now.
      
      * ata_scsi_device_suspend/resume() and ata_dev_ready() removed.
      
      * Resume now has to wait for disk to spin up before proceeding.  I
        couldn't find easy way out as libata is in EH waiting for the
        disk to be ready and sd is waiting for EH to complete to issue
        START_STOP.
      
      * sdev->manage_start_stop is set to 1 in ata_scsi_slave_config().
        This fixes spindown on shutdown and suspend-to-disk.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      9666f400
  8. 01 5月, 2007 2 次提交
    • T
      libata: reimplement reset sequencing · 31daabda
      Tejun Heo 提交于
      libata previously depended upon waits in prereset to get resets after
      hotplug right for both spin up and device ready wait.  This was
      necessary both for reliablity and speed as reset was likely to fail if
      initiated too early and each try usually took more than 30secs to
      fail.  Previous patches fixed the reliability part by fixing status
      and SCR handling in resets.  This patch remedies the speed part by
      improving reset sequencing.
      
      Prereset waiting timeout is adjusted to 10s because spinup wait is
      replaced by reset sequencing and !BSY wait is not as important as
      before.  During boot or module loading where the drive is already
      fully spun up, !BSY wait succeeds immediately, so 10s should be enough
      in most cases.  It matters after hotplugging or other error
      conditions, but in those cases, !BSY wait in prereset simply can't be
      relied upon due to the varied and weird behaviors ATA controllers and
      devices show.
      
      Reset is now driven by ata_eh_reset_timeouts[] table which contains
      timeouts for each reset try.  The first reset can be softreset but the
      following ones are always hardreset if available.  Each timeout
      defines deadline for the reset try.  If a reset try fails, reset is
      retried with the next timeout till the end of the timeout table is
      reached.  If a reset try fails before the timeout with error, libata
      waits till the deadline of the failed try before retrying.
      
      IOW, the timeout table defines timetable of reset tries such that the
      n'th try always begins at least after the sum of all previous timeouts
      has passed.  The current timetable defines 4 tries and takes around 1
      minute.
      
      @0	: First try.  This should succeed most of the time during boot.
      @10	: 10s is enough to spin up most consumer harddrives.  Give it
      	  another shot.
      @20	: 20s should spin up > 99% of working drives.  This has 30s
      	  timeout for retarded devices needing long idleness post reset.
      @55	: Final try with 5s timeout just in case.
      
      The above timetable is trade off between not annoying the device too
      much with frequent resets and taking reasonable amount of time in most
      cases.  Some controllers may do better with shorter timeouts while
      others may fare better with longer but we just can't rely upon LLD
      writers to test each controller with wide variety of devices using
      various scenarios.  We need default behavior which reasonably fits
      most cases.
      
      I've tested the above timetable on a dozen SATA controllers and a few
      PATA controllers with about a dozen different drives from all major
      vendors and 4 different ODDs from three different vendors for both
      boot and hotplug (if available) cases.
      
      Boot probing is not affected unless the device is broken in which
      cases new code gives up on the port after a minute rather than five or
      nine minutes.  When hotplugging, most devices get detected on the
      first or second try.  Multi-platter drives with long spin up time
      which sometimes took > 40 secs with the original code, now usually
      comes up during the second try and at least right after the third try
      @20.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      31daabda
    • T
      libata: add deadline support to prereset and reset methods · d4b2bab4
      Tejun Heo 提交于
      Add @deadline to prereset and reset methods and make them honor it.
      ata_wait_ready() which directly takes @deadline is implemented to be
      used as the wait function.  This patch is in preparation for EH timing
      improvements.
      
      * ata_wait_ready() never does busy sleep.  It's only used from EH and
        no wait in EH is that urgent.  This function also prints 'be
        patient' message automatically after 5 secs of waiting if more than
        3 secs is remaining till deadline.
      
      * ata_bus_post_reset() now fails with error code if any of its wait
        fails.  This is important because earlier reset tries will have
        shorter timeout than the spec requires.  If a device fails to
        respond before the short timeout, reset should be retried with
        longer timeout rather than silently ignoring the device.
      
        There are three behavior differences.
      
        1. Timeout is applied to both devices at once, not separately.  This
           is more consistent with what the spec says.
      
        2. When a device passes devchk but fails to become ready before
           deadline.  Previouly, post_reset would just succeed and let
           device classification remove the device.  New code fails the
           reset thus causing reset retry.  After a few times, EH will give
           up disabling the port.
      
        3. When slave device passes devchk but fails to become accessible
           (TF-wise) after reset.  Original code disables dev1 after 30s
           timeout and continues as if the device doesn't exist, while the
           patched code fails reset.  When this happens, new code fails
           reset on whole port rather than proceeding with only the primary
           device.
      
        If the failing device is suffering transient problems, new code
        retries reset which is a better behavior.  If the failing device is
        actually broken, the net effect is identical to it, but not to the
        other device sharing the channel.  In the previous code, reset would
        have succeeded after 30s thus detecting the working one.  In the new
        code, reset fails and whole port gets disabled.  IMO, it's a
        pathological case anyway (broken device sharing bus with working
        one) and doesn't really matter.
      
      * ata_bus_softreset() is changed to return error code from
        ata_bus_post_reset().  It used to return 0 unconditionally.
      
      * Spin up waiting is to be removed and not converted to honor
        deadline.
      
      * To be on the safe side, deadline is set to 40s for the time being.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      d4b2bab4
  9. 29 4月, 2007 4 次提交
    • T
      libata: separate ATA_EHI_DID_RESET into DID_SOFTRESET and DID_HARDRESET · 0d64a233
      Tejun Heo 提交于
      Separate ATA_EHI_DID_RESET into ATA_EHI_DID_SOFTRESET and
      ATA_EHI_DID_HARDRESET.  ATA_EHI_DID_RESET is redefined as OR of the
      two flags.  This patch doesn't introduce any behavior change.  This
      will be used later to determine whether _SDD is necessary or not.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      0d64a233
    • T
      libata: add missing call to ->cable_detect() in new EH path · c1c4e8d5
      Tejun Heo 提交于
      ->cable_detect() used to be called on by the old ata_bus_probe() path.
      Add invocation to ata_eh_revalidate_and_attach() right after IDENTIFYs
      are done.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      c1c4e8d5
    • T
      libata: improve AC_ERR_DEV handling for ->post_internal_cmd · a51d644a
      Tejun Heo 提交于
      ->post_internal_cmd is simplified EH for internal commands.  Its
      primary mission is to stop the controller such that no rogue memory
      access or other activities occur after the internal command is
      released.  It may provide error diagnostics by setting qc->err_mask
      but this hasn't been a requirement.
      
      To ignore SETXFER failure for CFA devices, libata needs to know
      whether a command was failed by the device or for any other reason.
      ie. internal command needs to get AC_ERR_DEV right.
      
      This patch makes the following changes to AC_ERR_DEV handling and
      ->post_internal_cmd semantics to accomodate this need and simplify
      callback implementation.
      
      1. As long as the correct bits in the result TF registers are set,
         there is no need to set AC_ERR_DEV explicitly.  libata EH core
         takes care of that for both normal and internal commands.
      
      2. The only requirement for ->post_internal_cmd() is to put the
         controller into quiescent state.  It needs not to set any err_mask.
      
      3. ata_exec_internal_sg() performs minimal error analysis such that
         AC_ERR_DEV is automatically set as long as result_tf is filled
         correctly.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      a51d644a
    • T
      libata: hardreset on SERR_INTERNAL · 771b8dad
      Tejun Heo 提交于
      There was a rare report where SB600 reported SERR_INTERNAL and SRST
      couldn't get it out of the failure mode.  Hardreset on SERR_INTERNAL.
      As the problem is intermittent, whether this fixes the problem or not
      hasn't been verified yet, but hardresetting the channel on internal
      error is a good idea anyway.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      771b8dad