1. 29 9月, 2008 3 次提交
  2. 22 8月, 2008 3 次提交
    • A
      libata: Fix a large collection of DMA mode mismatches · b15b3eba
      Alan Cox 提交于
      Dave Müller sent a diff for the pata_oldpiix that highlighted a problem
      where a lot of the ATA drivers assume dma_mode == 0 means "no DMA" while
      the core code uses 0xFF.
      
      This turns out to have other consequences such as code doing >= XFER_UDMA_0
      also catching 0xFF as UDMAlots. Fortunately it doesn't generally affect
      set_dma_mode, although some drivers call back into their own set mode code
      from other points.
      
      Having been through the drivers I've added helpers for using_udma/using_mwdma
      dma_enabled so that people don't open code ranges that may change (eg if UDMA8
      appears somewhere)
      
      Thanks to David for the initial bits
      [and added fix for pata_oldpiix from and signed-off-by Dave Mueller
       <dave.mueller@gmx.ch>  -jg]
      Signed-off-by: NAlan Cox <alan@redhat.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      b15b3eba
    • T
      libata: restore SControl on detach · d127ea7b
      Tejun Heo 提交于
      Save SControl during probing and restore it on detach.  This prevents
      adjustments made by libata drivers to seep into the next driver which
      gets attached (be it a libata one or not).
      
      It's not clear whether SControl also needs to be restored on suspend.
      The next system to have control (ACPI or kexec'd kernel) would
      probably like to see the original SControl value but there's no
      guarantee that a link is gonna keep working after SControl is adjusted
      without a reset and adding a reset and modified recovery cycle soley
      for this is an overkill.  For now, do it only for detach.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      d127ea7b
    • T
      libata: implement no[hs]rst force params · 05944bdf
      Tejun Heo 提交于
      Implement force params nohrst, nosrst and norst.  This is to work
      around reset related problems and ease debugging.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      05944bdf
  3. 31 7月, 2008 2 次提交
  4. 15 7月, 2008 4 次提交
    • K
      libata/ahci: enclosure management support · 18f7ba4c
      Kristen Carlson Accardi 提交于
      Add Enclosure Management support to libata and ahci.
      Signed-off-by: NKristen Carlson Accardi <kristen.c.accardi@intel.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      18f7ba4c
    • T
      libata: improve EH internal command timeout handling · 87fbc5a0
      Tejun Heo 提交于
      ATA_TMOUT_INTERNAL which was 30secs were used for all internal
      commands which is way too long when something goes wrong.  This patch
      implements command type based stepped timeouts.  Different command
      types can use different timeouts and each command type can use
      different timeout values after timeouts.
      
      ie. the initial timeout is set to a value which should cover most of
      the cases but not too long so that run away cases don't delay things
      too much.  After the first try times out, the second try can use
      longer timeout and if that one times out too, it can go for full 30sec
      timeout.
      
      IDENTIFYs use 5s - 10s - 30s timeout and all other commands use 5s -
      10s timeouts.
      
      This patch significantly cuts down the needed time to handle failure
      cases while still allowing libata to work with nut job devices through
      retries.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      87fbc5a0
    • T
      libata: improve EH retry delay handling · 0a2c0f56
      Tejun Heo 提交于
      EH retries were delayed by 5 seconds to ensure that resets don't occur
      back-to-back.  However, this 5 second delay is superflous or excessive
      in many cases.  For example, after IDENTIFY times out, there's no
      reason to wait five more seconds before retrying.
      
      This patch adds ehc->last_reset timestamp and record the timestamp for
      the last reset trial or success and uses it to space resets by
      ATA_EH_RESET_COOL_DOWN which is 5 secs and removes unconditional 5 sec
      sleeps.
      
      As this change makes inter-try waits often shorter and they're
      redundant in nature, this patch also removes the "retrying..."
      messages.
      
      While at it, convert explicit rounding up division to DIV_ROUND_UP().
      
      This change speeds up EH in many cases w/o sacrificing robustness.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      0a2c0f56
    • T
      libata: consistently use msecs for time durations · 341c2c95
      Tejun Heo 提交于
      libata has been using mix of jiffies and msecs for time druations.
      This is getting confusing.  As writing sub HZ values in jiffies is
      PITA and msecs_to_jiffies() can't be used as initializer, unify unit
      for all time durations to msecs.  So, durations are in msecs and
      deadlines are in jiffies.  ata_deadline() is added to compute deadline
      from a start time and duration in msecs.
      
      While at it, drop now superflous _msec suffix from arguments and
      rename @timeout to @deadline if it represents a fixed point in time
      rather than duration.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      341c2c95
  5. 04 6月, 2008 2 次提交
    • A
      libata-sff: Fix oops reported in kerneloops.org for pnp devices with no ctl · a57c1bad
      Alan Cox 提交于
      - Make ata_sff_altstatus private so nobody uses it by mistake
      - Drop the 400nS delay from it
      
      Add
      
      ata_sff_irq_status	-	encapsulates the IRQ check logic
      
      This function keeps the existing behaviour for altstatus using devices. I
      actually suspect the logic was wrong before the changes but -rc isn't the
      time to play with that
      
      ata_sff_sync		-	ensure writes hit the device
      
      Really we want an io* operation for 'is posted' eg ioisposted(ioaddr) so
      that we can fix the nasty delay this causes on most systems.
      
      - ata_sff_pause		-	400nS delay
      
      Ensure the command hit the device and delay 400nS
      
      - ata_sff_dma_pause
      
      Ensure the I/O hit the device and enforce an HDMA1:0 transition delay.
      Requires altstatus register exists, BUG if not so we don't risk
      corruption in MWDMA modes. (UDMA the checksum will save your backside in
      theory)
      
      The only other complication then is devices with their own handlers.
      rb532 can use dma_pause but scc needs to access its own altstatus
      register for internal errata workarounds so directly call the drivers own
      altstatus function.
      Signed-off-by: NAlan Cox <alan@redhat.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      a57c1bad
    • T
      libata: kill unused constants · 4f0ebe3c
      Tejun Heo 提交于
      Kill a few unused constants.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      4f0ebe3c
  6. 20 5月, 2008 3 次提交
  7. 10 5月, 2008 1 次提交
  8. 06 5月, 2008 2 次提交
    • M
      libata: export ata_eh_analyze_ncq_error · 10acf3b0
      Mark Lord 提交于
      Export ata_eh_analyze_ncq_error() for subsequent use by sata_mv,
      as suggested by Tejun.
      Signed-off-by: NMark Lord <mlord@pobox.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      10acf3b0
    • T
      libata: improve post-reset device ready test · 78ab88f0
      Tejun Heo 提交于
      Some controllers (jmb and inic162x) use 0x77 and 0x7f to indicate that
      the device isn't ready yet.  It looks like they use 0xff if device
      presence is detected but connection isn't established.  0x77 or 0x7f
      after connection is established and use the value from signature FIS
      after receiving it.
      
      This patch implements ata_check_ready(), which takes TF status value
      and determines whether the port is ready or not considering the above
      and other conditions, and use it in @check_ready() functions.  This is
      safe as both 0x77 and 0x7f aren't valid ready status value even though
      they have BSY bit cleared.
      
      This fixes hot plug detection failures which can be triggered with
      certain drives if they aren't already spun up when the data connector
      is hot plugged.
      
      Tested on sil, sil24, ahci (jmb/ich), piix and inic162x combined with
      eight drives from all major vendors.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      78ab88f0
  9. 30 4月, 2008 1 次提交
  10. 25 4月, 2008 1 次提交
  11. 20 4月, 2008 1 次提交
  12. 18 4月, 2008 17 次提交
    • T
      libata: make PMP support optional · 88fcd562
      Tejun Heo 提交于
      Make PMP support optional by adding CONFIG_SATA_PMP and leaving out
      libata-pmp.c if it isn't set.  PMP helpers return constant values if
      PMP support is not enabled and PMP declarations alias non-PMP
      counterparts.  This makes the compiler to leave out PMP related part
      out and LLDs to use non-PMP counterparts automatically.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      88fcd562
    • T
      libata: implement PMP helpers · 071f44b1
      Tejun Heo 提交于
      Implement helpers to test whether PMP is supported, attached and
      determine pmp number to use when issuing SRST to a link.  While at it,
      move ata_is_host_link() so that it's together with the two new PMP
      helpers.
      
      This change simplifies LLDs and helps making PMP support optional.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      071f44b1
    • T
      libata: separate PMP support code from core code · 48515f6c
      Tejun Heo 提交于
      Most of PMP support code is already in libata-pmp.c.  All that are in
      libata-core.c are sata_pmp_port_ops and EXPORTs.  Move them to
      libata-pmp.c.  Also, collect PMP related prototypes and declarations
      in header files and move them right above of SFF stuff.
      
      This change is to make PMP support optional.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      48515f6c
    • T
      libata: make SFF support optional · 127102ae
      Tejun Heo 提交于
      Now that SFF support is completely separated out from the core layer,
      it can be made optional.  Add CONFIG_ATA_SFF and let SFF drivers
      depend on it.  If CONFIG_ATA_SFF isn't set, all codes in libata-sff.c
      and data structures for SFF support are disabled.  This saves good
      number of bytes for small systems.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      127102ae
    • T
      libata: kill ata_noop_dev_select() · c9f75b04
      Tejun Heo 提交于
      Now that SFF assumptions are separated out from non-SFF reset
      sequence, port_ops->sff_dev_select() is no longer necessary for
      non-SFF controllers.  Kill ata_noop_dev_select() and ->sff_dev_select
      initialization from base and other non-SFF port_ops.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      c9f75b04
    • T
      libata: drop @finish_qc from ata_qc_complete_multiple() · 79f97dad
      Tejun Heo 提交于
      ata_qc_complete_multiple() took @finish_qc and called it on every qc
      before completing it.  This was to give opportunity to update TF cache
      before ata_qc_complete() tries to fill result_tf.  Now that result TF
      is a separate operation, this is no longer necessary.
      
      Update sata_sil24, which was the only user of this mechanism, such
      that it implements its own ops->qc_fill_rtf() and drop @finish_qc from
      ata_qc_complete_multiple().
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      79f97dad
    • T
      libata: add qc_fill_rtf port operation · 22183bf5
      Tejun Heo 提交于
      On command completion, ata_qc_complete() directly called ops->tf_read
      to fill qc->result_tf.  This patch adds ops->qc_fill_rtf to replace
      hardcoded ops->tf_read usage.
      
      ata_sff_qc_fill_rtf() which uses ops->tf_read to fill result_tf is
      implemented and set in ata_base_port_ops and other ops tables which
      don't inherit from ata_base_port_ops, so this patch doesn't introduce
      any behavior change.
      
      ops->qc_fill_rtf() is similar to ops->sff_tf_read() but can only be
      called when a command finishes.  As some non-SFF controllers don't
      have TF registers defined unless they're associated with in-flight
      commands, this limited operation makes life easier for those drivers
      and help lifting SFF assumptions from libata core layer.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      22183bf5
    • T
      libata: move PMP SCR access failure during reset to ata_eh_reset() · 5958e302
      Tejun Heo 提交于
      If PMP fan-out reset fails and SCR isn't accessible, PMP should be
      reset.  This used to be tested by sata_pmp_std_hardreset() and
      communicated to EH by -ERESTART.  However, this logic is generic and
      doesn't really have much to do with specific hardreset implementation.
      
      This patch moves SCR access failure detection logic to ata_eh_reset()
      where it belongs.  As this makes sata_pmp_std_hardreset() identical to
      sata_std_hardreset(), the function is killed and replaced with the
      standard method.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      5958e302
    • T
      libata: clear SError after link resume · ac371987
      Tejun Heo 提交于
      SError used to be cleared in ->postreset.  This has small hotplug race
      condition.  If a device is plugged in after reset is complete but
      postreset hasn't run yet, its hotplug event gets lost when SError is
      cleared.  This patch makes sata_link_resume() clear SError.  This
      kills the race condition and makes a lot of sense as some PMP and host
      PHYs don't work properly without SError cleared.
      
      This change makes sata_pmp_std_{pre|post}_reset()'s unnecessary as
      they become identical to ata_std counterparts.  It also simplifies
      sata_pmp_hardreset() and ahci_vt8251_hardreset().
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      ac371987
    • T
      libata: implement and use sata_std_hardreset() · 57c9efdf
      Tejun Heo 提交于
      Implement sata_std_hardreset(), which simply wraps around
      sata_link_hardreset().  sata_std_hardreset() becomes new standard
      hardreset method for sata_port_ops and sata_sff_hardreset() moves from
      ata_base_port_ops to ata_sff_port_ops, which is where it really
      belongs.
      
      ata_is_builtin_hardreset() is added so that both
      ata_std_error_handler() and ata_sff_error_handler() skip both builtin
      hardresets if SCR isn't accessible.
      
      piix_sidpr_hardreset() in ata_piix.c is identical to
      sata_std_hardreset() in functionality and got replaced with the
      standard function.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      57c9efdf
    • T
      libata: move generic hardreset code from sata_sff_hardreset() to sata_link_hardreset() · 9dadd45b
      Tejun Heo 提交于
      sata_sff_hardreset() contains link readiness wait logic which isn't
      SFF specific.  Move that part into sata_link_hardreset(), which now
      takes two more parameters - @online and @check_ready.  Both are
      optional.  The former is out parameter for link onlineness after
      reset.  The latter is used to wait for link readiness after hardreset.
      
      Users of sata_link_hardreset() is updated to use new funtionality and
      ahci_hardreset() is updated to use sata_link_hardreset() instead of
      sata_sff_hardreset().  This doesn't really cause any behavior change.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      9dadd45b
    • T
      libata: separate out ata_wait_ready() and implement ata_wait_after_reset() · aa2731ad
      Tejun Heo 提交于
      Factor out waiting logic (which is common to all ATA controllers) from
      ata_sff_wait_ready() into ata_wait_ready().  ata_wait_ready() takes
      @check_ready function pointer and uses it to poll for readiness.  This
      allows non-SFF controllers to use ata_wait_ready() to wait for link
      readiness.
      
      This patch also implements ata_wait_after_reset() - generic version of
      ata_sff_wait_after_reset() - using ata_wait_ready().
      
      ata_sff_wait_ready() is reimplemented using ata_wait_ready() and
      ata_sff_check_ready().  Functionality remains the same.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      aa2731ad
    • T
      libata: restructure SFF post-reset readiness waits · 705e76be
      Tejun Heo 提交于
      Previously, post-softreset readiness is waited as follows.
      
      1. ata_sff_wait_after_reset() waits for 150ms and then for
         ATA_TMOUT_FF_WAIT if status is 0xff and other conditions meet.
      
      2. ata_bus_softreset() finishes with -ENODEV if status is still 0xff.
         If not, continue to #3.
      
      3. ata_bus_post_reset() waits readiness of dev0 and/or dev1 depending
         on devmask using ata_sff_wait_ready().
      
      And for post-hardreset readiness,
      
      1. ata_sff_wait_after_reset() waits for 150ms and then for
         ATA_TMOUT_FF_WAIT if status is 0xff and other conditions meet.
      
      2. sata_sff_hardreset waits for device readiness using
         ata_sff_wait_ready().
      
      This patch merges and unifies post-reset readiness waits into
      ata_sff_wait_ready() and ata_sff_wait_after_reset().
      
      ATA_TMOUT_FF_WAIT handling is merged into ata_sff_wait_ready().  If TF
      status is 0xff, link status is unknown and the port is SATA, it will
      continue polling till ATA_TMOUT_FF_WAIT.
      
      ata_sff_wait_after_reset() is updated to perform the following steps.
      
      1. waits for 150ms.
      
      2. waits for dev0 readiness using ata_sff_wait_ready().  Note that
         this is done regardless of devmask, as ata_sff_wait_ready() handles
         0xff status correctly, this preserves the original behavior except
         that it may wait longer after softreset if link is online but
         status is 0xff.  This behavior change is very unlikely to cause any
         actual difference and is intended.  It brings softreset behavior to
         that of hardreset.
      
      3. waits for dev1 readiness just the same way ata_bus_post_reset() did.
      
      Now both soft and hard resets call ata_sff_wait_after_reset() after
      reset to wait for readiness after resets.  As
      ata_sff_wait_after_reset() contains calls to ->sff_dev_select(),
      explicit call near the end of sata_sff_hardreset() is removed.
      
      This change makes reset implementation simpler and more consistent.
      
      While at it, make the magical 150ms wait post-reset wait duration a
      constant and ata_sff_wait_ready() and ata_sff_wait_after_reset() take
      @link instead of @ap.  This is to make them consistent with other
      reset helpers and ease core changes.
      
      pata_scc is updated accordingly.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      705e76be
    • T
      libata: separate out ata_std_postreset() from ata_sff_postreset() · 203c75b8
      Tejun Heo 提交于
      Separate out generic ATA portion from ata_sff_postreset() into
      ata_std_postreset() and implement ata_sff_postreset() using the std
      version.
      
      ata_base_port_ops now has ata_std_postreset() for its postreset and
      ata_sff_port_ops overrides it to ata_sff_postreset().
      
      This change affects pdc_adma, ahci, sata_fsl and sata_sil24.  pdc_adma
      now specifies postreset to ata_sff_postreset() explicitly.  sata_fsl
      and sata_sil24 now use ata_std_postreset() which makes no difference
      to them.  ahci now calls ata_std_postreset() from its own postreset
      method, which causes no behavior difference.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      203c75b8
    • T
      libata: separate out ata_std_prereset() from ata_sff_prereset() · 0aa1113d
      Tejun Heo 提交于
      Separate out generic ATA portion from ata_sff_prereset() into
      ata_std_prereset() and implement ata_sff_prereset() using the std
      version.  Waiting for device readiness is the only SFF specific part.
      
      ata_base_port_ops now has ata_std_prereset() for its prereset and
      ata_sff_port_ops overrides it to ata_sff_prereset().  This change can
      affect pdc_adma, ahci, sata_fsl and sata_sil24.  pdc_adma implements
      its own prereset using ata_sff_prereset() and the rest has hardreset
      and thus are unaffected by this change.
      
      This change reflects real world situation.  There is no generic way to
      wait for device readiness for non-SFF controllers and some of them
      don't have any mechanism for that.  Non-sff drivers which don't have
      hardreset should wrap ata_std_prereset() and wait for device readiness
      itself but there's no such driver now and isn't likely to be popular
      in the future either.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      0aa1113d
    • T
      libata: clean up port_ops->sff_irq_clear() · 288623a0
      Tejun Heo 提交于
      ->sff_irq_clear() is called only from SFF interrupt handler, so there
      is no reason to initialize it for non-SFF controllers.  Also,
      ata_sff_irq_clear() can handle both BMDMA and non-BMDMA SFF
      controllers.
      
      This patch kills ata_noop_irq_clear() and removes it from base
      port_ops and sets ->sff_irq_clear to ata_sff_irq_clear() in sff
      port_ops instead of bmdma port_ops.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      288623a0
    • T
      libata: rename SFF port ops · 5682ed33
      Tejun Heo 提交于
      Add sff_ prefix to SFF specific port ops.
      
      This rename is in preparation of separating SFF support out of libata
      core layer.  This patch strictly renames ops and doesn't introduce any
      behavior difference.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      5682ed33