1. 02 3月, 2010 2 次提交
    • T
      libata: implement spurious irq handling for SFF and apply it to piix · 27943620
      Tejun Heo 提交于
      Traditional IDE interface sucks in that it doesn't have a reliable IRQ
      pending bit, so if the controller raises IRQ while the driver is
      expecting it not to, the IRQ won't be cleared and eventually the IRQ
      line will be killed by interrupt subsystem.  Some controllers have
      non-standard mechanism to indicate IRQ pending so that this condition
      can be detected and worked around.
      
      This patch adds an optional operation ->sff_irq_check() which will be
      called for each port from the ata_sff_interrupt() if an unexpected
      interrupt is received.  If the operation returns %true,
      ->sff_check_status() and ->sff_irq_clear() will be cleared for the
      port.  Note that this doesn't mark the interrupt as handled so it
      won't prevent IRQ subsystem from killing the IRQ if this mechanism
      fails to clear the spurious IRQ.
      
      This patch also implements ->sff_irq_check() for ata_piix.  Note that
      this adds slight overhead to shared IRQ operation as IRQs which are
      destined for other controllers will trigger extra register accesses to
      check whether IDE interrupt is pending but this solves rare screaming
      IRQ cases and for some curious reason also helps weird BIOS related
      glitch on Samsung n130 as reported in bko#14314.
      
        http://bugzilla.kernel.org/show_bug.cgi?id=14314
      
      * piix_base_ops dropped as suggested by Sergei.
      
      * Spurious IRQ detection doesn't kick in anymore if polling qc is in
        progress.  This provides less protection but some controllers have
        possible data corruption issues if the wrong register is accessed
        while a command is in progress.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Reported-by: NJohannes Stezenbach <js@sig21.net>
      Reported-by: NHans Werner <hwerner4@gmx.de>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      27943620
    • T
      libata: cleanup ata_sff_interrupt() · d88ec2e5
      Tejun Heo 提交于
      host->ports[i] is never NULL if i < host->n_ports and non-NULL return
      from ata_qc_from_tag() guarantees that the returned qc is active.
      Drop unnecessary tests.
      
      Superflous () dropped as suggested by Sergei.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      d88ec2e5
  2. 04 2月, 2010 1 次提交
  3. 17 12月, 2009 1 次提交
  4. 09 12月, 2009 1 次提交
  5. 04 12月, 2009 1 次提交
  6. 03 12月, 2009 1 次提交
  7. 10 6月, 2009 1 次提交
    • S
      libata-sff: avoid byte swapping in ata_sff_data_xfer() · 2102d749
      Sergei Shtylyov 提交于
      Handling of the trailing byte in ata_sff_data_xfer() is suboptimal bacause:
      
      - it always initializes the padding buffer to 0 which is not really needed in
        both the read and write cases;
      
      - it has to use memcpy() to transfer a single byte from/to the padding buffer;
      
      - it uses io{read|write}16() accessors which swap bytes on the big endian CPUs
        and so have to additionally convert the data from/to the little endian format
        instead of using io{read|write}16_rep() accessors which are not supposed to
        change the byte ordering.
      Signed-off-by: NSergei Shtylyov <sshtylyov@ru.mvista.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      2102d749
  8. 17 4月, 2009 1 次提交
    • A
      ata: Report 16/32bit PIO as best we can · e3cf95dd
      Alan Cox 提交于
      The legacy old IDE ioctl API for this is a bit primitive so we try
      and map stuff sensibly onto it.
      
      - Set PIO over DMA devices to report 32bit
      - Add ability to change the PIO32 settings if the controller permits it
      - Add that functionality into the sff drivers
      - Add that functionality into the VLB legacy driver
      - Turn on the 32bit PIO on the ninja32 and add support there
      Signed-off-by: NAlan Cox <alan@linux.intel.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      e3cf95dd
  9. 25 3月, 2009 2 次提交
  10. 14 3月, 2009 1 次提交
    • S
      libata: Keep shadow last_ctl up to date during resets · e3e4385f
      Stuart MENEFY 提交于
      libata keeps a shadow copy of the ATA CTL register (which is write only),
      and only writes to the hardware when the required value doesn't match
      the shadow. However this copy wasn't being maintained when performing
      reset functions. This could cause problems for the first operation after
      a reset when the correct value might not be written to the CTL register.
      
      This problem was observed when hotplugging a drive: the identify command
      was being issued with interrupts enabled, when they should have been
      disabled.
      Signed-off-by: NStuart Menefy <stuart.menefy@st.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      e3e4385f
  11. 17 2月, 2009 1 次提交
    • S
      libata-sff: fix 32-bit PIO ATAPI regression · d1b3525b
      Sergei Shtylyov 提交于
      Commit 871af121 (libata: Add 32bit
      PIO support) has caused all kinds of errors on the ATAPI devices, so
      it has been empirically proven that one shouldn't try to read/write
      an extra data word when a device is not expecting it already. "Don't
      do it then"; however, still use a chance to do 32-bit read/write one
      last time when there are exactly 3 trailing bytes.
      
      Oh, and stop pointlessly swapping the bytes to and fro on big-endian
      machines by using io*_rep() accessors which shouldn't byte-swap.
      
      This patch should fix the kernel.org bug #12609.
      Signed-off-by: NSergei Shtylyov <sshtylyov@ru.mvista.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      d1b3525b
  12. 26 1月, 2009 2 次提交
  13. 13 1月, 2009 1 次提交
  14. 10 1月, 2009 1 次提交
  15. 09 1月, 2009 2 次提交
  16. 15 11月, 2008 1 次提交
    • T
      libata: improve phantom device detection · 6a6b97d3
      Tejun Heo 提交于
      Currently libata uses four methods to detect device presence.
      
      1. PHY status if available.
      2. TF register R/W test (only promotes presence, never demotes)
      3. device signature after reset
      4. IDENTIFY failure detection in SFF state machine
      
      Combination of the above works well in most cases but recently there
      have been a few reports where a phantom device causes unnecessary
      delay during probe.  In both cases, PHY status wasn't available.  In
      one case, it passed #2 and #3 and failed IDENTIFY with ATA_ERR which
      didn't qualify as #4.  The other failed #2 but as it passed #3 and #4,
      it still caused failure.
      
      In both cases, phantom device reported diagnostic failure, so these
      cases can be safely worked around by considering any !ATA_DRQ IDENTIFY
      failure as NODEV_HINT if diagnostic failure is set.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      6a6b97d3
  17. 23 10月, 2008 1 次提交
  18. 09 9月, 2008 1 次提交
  19. 15 7月, 2008 1 次提交
    • 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
  20. 04 7月, 2008 1 次提交
  21. 05 6月, 2008 1 次提交
  22. 04 6月, 2008 1 次提交
    • 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
  23. 06 5月, 2008 1 次提交
    • 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
  24. 25 4月, 2008 1 次提交
  25. 18 4月, 2008 12 次提交
    • T
      libata: move link onlineness check out of softreset methods · 45db2f6c
      Tejun Heo 提交于
      Currently, SATA softresets should do link onlineness check before
      actually performing SRST protocol but it doesn't really belong to
      softreset.
      
      This patch moves onlineness check in softreset to ata_eh_reset() and
      ata_eh_followup_srst_needed() to clean up code and help future sata_mv
      changes which need clear separation between SCR and TF accesses.
      
      sata_fsl is peculiar in that its softreset really isn't softreset but
      combination of hardreset and softreset.  This patch adds dummy private
      ->prereset to keep the current behavior but the driver really should
      implement separate hard and soft resets and return -EAGAIN from
      hardreset if it should be follwed by softreset.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      45db2f6c
    • T
      libata: replace tf_read with qc_fill_rtf for non-SFF drivers · 4c9bf4e7
      Tejun Heo 提交于
      Now that all SFF stuff is separated out of core layer, core layer
      doesn't call ops->tf_read directly.  It gets called only via
      ops->qc_fill_rtf() for non-SFF drivers.  This patch directly
      implements private ops->qc_fill_rtf() for non-SFF controllers and kill
      ops->tf_read().
      
      This is much cleaner for non-SFF controllers as some of them have to
      cache SFF register values in private data structure and report the
      cached values via ops->tf_read().  Also, ops->tf_read() gets nasty for
      controllers which don't have clear notion of TF registers when
      operation is not in progress.
      
      As this change makes default ops->qc_fill_rtf unnecessary, move
      ata_sff_qc_fill_rtf() form ata_base_port_ops to ata_sff_port_ops where
      it belongs.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      4c9bf4e7
    • 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: unify mechanism to request follow-up SRST · 305d2a1a
      Tejun Heo 提交于
      Previously, there were two ways to trigger follow-up SRST from
      hardreset method - returning -EAGAIN and leaving all device classes
      unmodified.  Drivers never used the latter mechanism and the only use
      case for the former was when hardreset couldn't classify.
      
      Drop the latter mechanism and let -EAGAIN mean "perform follow-up SRST
      if classification is required".  This change removes unnecessary
      follow-up SRSTs and simplifies reset implementations.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      305d2a1a
    • 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