1. 13 10月, 2007 30 次提交
    • T
      libata-pmp: implement qc_defer for command switching PMP support · 31f88384
      Tejun Heo 提交于
      Implement sata_pmp_qc_defer_cmd_switch() - standard qc_defer for
      command switching PMP support.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      31f88384
    • T
      libata-pmp: implement Port Multiplier support · 3af9a77a
      Tejun Heo 提交于
      Implement Port Multiplier support.  To support PMP, a LLDD has to
      supply ops->pmp_read() and pmp_write().  If non-null, ->pmp_attach and
      ->pmp_detach are called on PMP attach and detach, respectively.
      
      ->pmp_read/write() can be called while the port is frozen, so they
      must be implemented by polling.  This patch supplies several helpers
      to ease ->pmp_read/write() implementation.
      
      Also, irq_handler and error_handler must be PMP aware.  Most of PMP
      aware EH can be done by calling ata_pmp_do_eh() with appropriate
      methods.  PMP EH uses separate set of reset methods and this patch
      implements standard prereset, hardreset and postreset methods.
      
      This patch only implements PMP support.  The next patch will integrate
      PMP into the reset of libata and thus enable PMP support.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      3af9a77a
    • A
      [PATCH] libata: Fix HPA handling regression · 93328e11
      Alan Cox 提交于
      Restore the support for handling drives that report one sector too many
      (ie SCSI not ATA style). This worked before the HPA update but was
      removed in that process.
      Signed-off-by: NAlan Cox <alan@redhat.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      93328e11
    • T
      libata-pmp-prep: implement sata_async_notification() · 7d77b247
      Tejun Heo 提交于
      AN serves multiple purposes.  For ATAPI, it's used for media change
      notification.  For PMP, for downstream PHY status change notification.
      Implement sata_async_notification() which demultiplexes AN.
      
      To avoid unnecessary port events, ATAPI AN is not enabled if PMP is
      attached but SNTF is not available.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Kriten Carlson Accardi <kristen.c.accardi@intel.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      7d77b247
    • T
      libata-pmp-prep: implement ATA_HORKAGE_SKIP_PM · e31e8531
      Tejun Heo 提交于
      Some pseudo devices fail PM commands unnecessarily aborting system
      suspend.  Implement ATA_HORKAGE_SKIP_PM which makes libata skip PM
      commands for these devices.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      e31e8531
    • 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: implement ops->qc_defer() · 31cc23b3
      Tejun Heo 提交于
      Controllers which support PMP have various restrictions on which
      combinations of commands are allowed to what number of devices
      concurrently.  This patch implements ops->qc_defer() which determines
      whether a qc can be issued at the moment or should be deferred.
      
      If the function returns ATA_DEFER_LINK, the qc will be deferred until
      a qc completes on the link.  If ATA_DEFER_PORT, until a qc completes
      on any link.  The defer conditions are advisory and in general
      ATA_DEFER_LINK can be considered as lower priority deferring than
      ATA_DEFER_PORT.
      
      ops->qc_defer() replaces fixed ata_scmd_need_defer().  For standard
      NCQ/non-NCQ exclusion, ata_std_qc_defer() is implemented.  ahci and
      sata_sil24 are converted to use ata_std_qc_defer().
      
      ops->qc_defer() is heavier than the original mechanism because full qc
      is prepped before determining to defer it, but various information is
      needed to determine defer conditinos and fully translating a qc is the
      only way to supply such information in generic manner.
      
      IMHO, this shouldn't cause any noticeable performance issues as
      
      * for most cases deferring occurs rarely (except for NCQ-aware
        cmd-switching PMP)
      * translation itself isn't that expensive
      * once deferred the command won't be repeated until another command
        completes which usually is a very long time cpu-wise.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      31cc23b3
    • T
      libata-pmp-prep: add PMP related constants, fields, ops and update helpers · e0a71752
      Tejun Heo 提交于
      Add PMP related constants, fields and ops.  Also, update
      ata_class_enabled/disabled() such that PMP classes are considered.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      e0a71752
    • T
      libata: update ata_dev_try_classify() arguments · 3f19859e
      Tejun Heo 提交于
      Make ata_dev_try_classify() take a pointer to ata_device instead of
      ata_port/port_number combination for consistency and add @present
      argument.  @present indicates whether the device seems present during
      reset.  It's the result of TF access during softreset and link
      onlineness during hardreset.  @present will be used to improve
      diagnostic failure handling.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      3f19859e
    • K
      ata: increase allowed config flags · 2557164e
      Kristen Carlson Accardi 提交于
      In anticipation of more features, increase number of config flags
      allowed, and move the init flags.
      Signed-off-by: NKristen Carlson Accardi <kristen.c.accardi@intel.com>
      Cc: Hugh Dickens <hugh@veritas.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      2557164e
    • 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
    • J
      [libata] Remove ->port_disable() hook · ac8869d5
      Jeff Garzik 提交于
      It was always set to ata_port_disable().  Removed the hook, and replaced
      the very few ap->ops->port_disable() callsites with direct calls to
      ata_port_disable().
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      ac8869d5
    • A
      [libata] add ACPI cable detect API · e1ddb4b6
      Alan Cox 提交于
      Combined from two Alan Cox patches:
      
      1) libata: ACPI checks for 80wire cable
      
      We can use the ACPI mode information with several drivers as a hint to
      cable type. If the ACPI mode set by the BIOS is faster than UDMA33 then
      we know the BIOS thinks there are 80wire cables. If it doesn't set such a
      mode or it has no ACPI method then we get no further information and can
      rely on existing approaches
      
      Introduce the function headers needed. Null it out for non ACPI boxes
      Signed-off-by: NAlan Cox <alan@redhat.com>
      
      2) libata: ACPI checks for 80wire cable
      
      Provide actual methods for checking if the ACPI support thinks the cable
      is 80wire, or doesn't know
      Signed-off-by: NAlan Cox <alan@redhat.com>
      
      Combined into a single changeset and
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      e1ddb4b6
    • J
      [libata] Remove ->irq_ack() hook, and ata_dummy_irq_on() · 6d32d30f
      Jeff Garzik 提交于
      * ->irq_ack() is redundant to what the irq handler already
        performs... chk-status + irq-clear.  Furthermore, it is only
        called in one place, when screaming-irq-debugging is enabled,
        so we don't want to bother with a hook just for that.
      
      * ata_dummy_irq_on() is only ever used in drivers that have
        no callpath reaching ->irq_on().  Remove .irq_on hook from
        those drivers, and the now-unused ata_dummy_irq_on()
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      6d32d30f
    • T
      libata: add printf format attribute to ehi desc functions · cb94c1cf
      Tejun Heo 提交于
      Tell the compiler that [__]ata_ehi_push_desc() functions take printf
      style format string and arguments.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      cb94c1cf
    • T
      libata: use ata_port_printk() in ata_wait_idle() · 15529456
      Tejun Heo 提交于
      ata_wait_idle() identified controller by printing out the address of
      the Status register.  This is bogus because 1. it's iomapped address
      2. some controllers don't have Status register and don't initialize
      the field.  Use ata_port_printk() instead.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      15529456
    • K
      [libata] ahci: send event when AN received · 2f294968
      Kristen Carlson Accardi 提交于
      When we get an SDB FIS with the 'N' bit set, we should send
      an event to user space to indicate that there has been a
      media change.  This will be done via the scsi device.
      Signed-off-by: NKristen Carlson Accardi <kristen.c.accardi@intel.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      2f294968
    • K
      [libata] check for SATA async notify support · 9f45cbd3
      Kristen Carlson Accardi 提交于
      Check to see if an ATAPI device supports Asynchronous Notification.
      If so, enable it, if the host controller supports AN.
      Signed-off-by: NKristen Carlson Accardi <kristen.c.accardi@intel.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      9f45cbd3
    • T
      libata-link: add PMP links · 8989805d
      Tejun Heo 提交于
      Add link->pmp, ap->nr_pmp_links, ap->pmp_link[], and implement/update
      link helpers.
      
      printk helpers are updated such that port and link are identifed as
      'ataP:' if no PMP is attached, while device is identified as
      'ataP.DD:'.  If PMP is attached, they become 'ataP:', 'ataP.LL:' and
      'ataP.LL' - ie. link and device are identified their PMP number.
      
      If PPM is attached (ap->nr_pmp_links != 0), ata_for_each_link()
      iterates over PMP links, while __ata_for_each_link() iterates over the
      host link + PMP links.  If PMP is not attached (ap->nr_pmp_links ==
      0), both iterate over only the host link.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      8989805d
    • 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: make two port flags HRST_TO_RESUME and SKIP_D2H_BSY link flags · 0c88758b
      Tejun Heo 提交于
      HRST_TO_RESUME and SKIP_D2H_BSY are link attributes.  Move them to
      ata_link->flags.  This will allow host and PMP links to have different
      attributes.  ata_port_info->link_flags is added and used by LLDs to
      specify these flags during initialization.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      0c88758b
    • 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 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. 31 8月, 2007 1 次提交
  3. 25 7月, 2007 1 次提交
  4. 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: reorganize ata_ehi_hotplugged() · f8f1e1cc
      Tejun Heo 提交于
      __ata_ehi_hotplugged() now has no users.  Regorganize
      ata_ehi_hotplugged() such that a new function ata_ehi_schedule_probe()
      deals with scheduling probing.  ata_ehi_hotplugged() calls it and
      additionally marks hotplug specific flags.  ata_ehi_schedule_probe()
      will be used laster.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      f8f1e1cc
    • 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: make ->scr_read/write callbacks return error code · da3dbb17
      Tejun Heo 提交于
      Convert ->scr_read/write callbacks to return error code to better
      indicate failure.  This will help handling of SCR_NOTIFICATION.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      da3dbb17
    • 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
    • T
      libata: add @is_cmd to ata_tf_to_fis() · 9977126c
      Tejun Heo 提交于
      Add @is_cmd to ata_tf_to_fis().  This controls bit 7 of the second
      byte which tells the device whether this H2D FIS is for a command or
      not.  This cleans up ahci a bit and will be used by PMP.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      9977126c
  5. 19 7月, 2007 1 次提交
    • D
      [SCSI] sas_ata: ata_post_internal should abort the sas_task · 1c50dc83
      Darrick J. Wong 提交于
      This patch adds a new field, lldd_task, to ata_queued_cmd so that libata
      users such as libsas can associate some data with a qc.  The particular
      ambition with this patch is to associate a sas_task with a qc; that way,
      if libata decides to timeout a command, we can come back (in
      sas_ata_post_internal) and abort the sas task.
      
      One question remains: Is it necessary to reset the phy on error, or will
      the libata error handler take care of it?  (Assuming that one is written,
      of course.)  This patch, as it is today, works well enough to clean
      things up when an ATA device probe attempt fails halfway through the probe,
      though I'm not sure this is always the right thing to do.
      Signed-off-by: NDarrick J. Wong <djwong@us.ibm.com>
      Signed-off-by: NJames Bottomley <James.Bottomley@SteelEye.com>
      1c50dc83