1. 09 1月, 2009 1 次提交
  2. 29 12月, 2008 2 次提交
    • T
      libata: perform port detach in EH · ece180d1
      Tejun Heo 提交于
      ata_port_detach() first made sure EH saw ATA_PFLAG_UNLOADING and then
      assumed EH context belongs to it and performed detach operation
      itself.  However, UNLOADING doesn't disable all of EH and this could
      lead to problems including triggering WARN_ON()'s in EH path.
      
      This patch makes port detach behave more like other EH actions such
      that ata_port_detach() requests EH to detach and waits for completion.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      ece180d1
    • T
      libata: beef up iterators · 1eca4365
      Tejun Heo 提交于
      There currently are the following looping constructs.
      
      * __ata_port_for_each_link() for all available links
      * ata_port_for_each_link() for edge links
      * ata_link_for_each_dev() for all devices
      * ata_link_for_each_dev_reverse() for all devices in reverse order
      
      Now there's a need for looping construct which is similar to
      __ata_port_for_each_link() but iterates over PMP links before the host
      link.  Instead of adding another one with long name, do the following
      cleanup.
      
      * Implement and export ata_link_next() and ata_dev_next() which take
        @mode parameter and can be used to build custom loop.
      * Implement ata_for_each_link() and ata_for_each_dev() which take
        looping mode explicitly.
      
      The following iteration modes are implemented.
      
      * ATA_LITER_EDGE		: loop over edge links
      * ATA_LITER_HOST_FIRST		: loop over all links, host link first
      * ATA_LITER_PMP_FIRST		: loop over all links, PMP links first
      
      * ATA_DITER_ENABLED		: loop over enabled devices
      * ATA_DITER_ENABLED_REVERSE	: loop over enabled devices in reverse order
      * ATA_DITER_ALL			: loop over all devices
      * ATA_DITER_ALL_REVERSE		: loop over all devices in reverse order
      
      This change removes exlicit device enabledness checks from many loops
      and makes it clear which ones are iterated over in which direction.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      1eca4365
  3. 02 12月, 2008 1 次提交
  4. 11 11月, 2008 1 次提交
    • T
      libata: revert convert-to-block-tagging patches · 8a8bc223
      Tejun Heo 提交于
      This patch reverts the following three commits which convert libata to
      use block layer tagging.
      
       43a49cbd
       e013e13b
       2fca5ccf
      
      Although using block layer tagging is the right direction, due to the
      tight coupling among tag number, data structure allocation and
      hardware command slot allocation, libata doesn't work correctly with
      the current conversion.
      
      The biggest problem is guaranteeing that tag 0 is always used for
      non-NCQ commands.  Due to the way blk-tag is implemented and how SCSI
      starts and finishes requests, such guarantee can't be made.  I'm not
      sure whether this would actually break any low level driver but it
      doesn't look like a good idea to break such assumption given the
      frailty of ATA controllers.
      
      So, for the time being, keep using the old dumb in-libata qc
      allocation.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Jens Axobe <jens.axboe@oracle.com>
      Cc: Jeff Garzik <jeff@garzik.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      8a8bc223
  5. 04 11月, 2008 1 次提交
  6. 31 10月, 2008 1 次提交
    • J
      libata: add whitelist for devices with known good pata-sata bridges · 9ce8e307
      Jens Axboe 提交于
      libata currently imposes a UDMA5 max transfer rate and 200 sector max
      transfer size for SATA devices that sit behind a pata-sata bridge. Lots
      of devices have known good bridges that don't need this limit applied.
      The MTRON SSD disks are such devices. Transfer rates are increased by
      20-30% with the restriction removed.
      
      So add a "blacklist" entry for the MTRON devices, with a flag indicating
      that the bridge is known good.
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      9ce8e307
  7. 24 10月, 2008 1 次提交
  8. 23 10月, 2008 1 次提交
    • T
      libata: transfer EHI control flags to slave ehc.i · 848e4c68
      Tejun Heo 提交于
      ATA_EHI_NO_AUTOPSY and ATA_EHI_QUIET are used to control the behavior
      of EH.  As only the master link is visible outside EH, these flags are
      set only for the master link although they should also apply to the
      slave link, which causes spurious EH messages during probe and
      suspend/resume.
      
      This patch transfers those two flags to slave ehc.i before performing
      slave autopsy and reporting.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      848e4c68
  9. 29 9月, 2008 6 次提交
    • R
      libata: reorder ata_device to remove 8 bytes of padding on 64 bits · 6866e7bc
      Richard Kennedy 提交于
      reduce size by 8 bytes from 1160 to 1152 allowing it to fit in 1 fewer
      cachelines.
      Signed-off-by: NRichard Kennedy <richard@rsk.demon.co.uk>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      6866e7bc
    • E
      libata: Implement disk shock protection support · 45fabbb7
      Elias Oltmanns 提交于
      On user request (through sysfs), the IDLE IMMEDIATE command with UNLOAD
      FEATURE as specified in ATA-7 is issued to the device and processing of
      the request queue is stopped thereafter until the specified timeout
      expires or user space asks to resume normal operation. This is supposed
      to prevent the heads of a hard drive from accidentally crashing onto the
      platter when a heavy shock is anticipated (like a falling laptop
      expected to hit the floor). In fact, the whole port stops processing
      commands until the timeout has expired in order to avoid any resets due
      to failed commands on another device.
      Signed-off-by: NElias Oltmanns <eo@nebensachen.de>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      45fabbb7
    • T
      libata: implement slave_link · b1c72916
      Tejun Heo 提交于
      Explanation taken from the comment of ata_slave_link_init().
      
       In libata, a port contains links and a link contains devices.  There
       is single host link but if a PMP is attached to it, there can be
       multiple fan-out links.  On SATA, there's usually a single device
       connected to a link but PATA and SATA controllers emulating TF based
       interface can have two - master and slave.
      
       However, there are a few controllers which don't fit into this
       abstraction too well - SATA controllers which emulate TF interface
       with both master and slave devices but also have separate SCR
       register sets for each device.  These controllers need separate links
       for physical link handling (e.g. onlineness, link speed) but should
       be treated like a traditional M/S controller for everything else
       (e.g. command issue, softreset).
      
       slave_link is libata's way of handling this class of controllers
       without impacting core layer too much.  For anything other than
       physical link handling, the default host link is used for both master
       and slave.  For physical link handling, separate @ap->slave_link is
       used.  All dirty details are implemented inside libata core layer.
       From LLD's POV, the only difference is that prereset, hardreset and
       postreset are called once more for the slave link, so the reset
       sequence looks like the following.
      
       prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) ->
       softreset(M) -> postreset(M) -> postreset(S)
      
       Note that softreset is called only for the master.  Softreset resets
       both M/S by definition, so SRST on master should handle both (the
       standard method will work just fine).
      
      As slave_link excludes PMP support and only code paths which deal with
      the attributes of physical link are affected, all the changes are
      localized to libata.h, libata-core.c and libata-eh.c.
      
       * ata_is_host_link() updated so that slave_link is considered as host
         link too.
      
       * iterator extended to iterate over the slave_link when using the
         underbarred version.
      
       * force param handling updated such that devno 16 is mapped to the
         slave link/device.
      
       * ata_link_on/offline() updated to return the combined result from
         master and slave link.  ata_phys_link_on/offline() are the direct
         versions.
      
       * EH autopsy and report are performed separately for master slave
         links.  Reset is udpated to implement the above described reset
         sequence.
      
      Except for reset update, most changes are minor, many of them just
      modifying dev->link to ata_dev_phys_link(dev) or using phys online
      test instead.
      
      After this update, LLDs can take full advantage of per-dev SCR
      registers by simply turning on slave link.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      b1c72916
    • T
      libata: misc updates to prepare for slave link · b5b3fa38
      Tejun Heo 提交于
      * Add ATA_EH_ALL_ACTIONS.
      
      * Make sata_link_{on|off}_line() return bool instead of int.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      b5b3fa38
    • T
      libata: reimplement link iterator · aadffb68
      Tejun Heo 提交于
      Implement __ata_port_next_link() and reimplement
      __ata_port_for_each_link() and ata_port_for_each_link() using it.
      This removes relatively large inlined code and makes iteration easier
      to extend.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      aadffb68
    • T
      libata: make SCR access ops per-link · 82ef04fb
      Tejun Heo 提交于
      Logically, SCR access ops should take @link; however, there was no
      compelling reason to convert all SCR access ops when adding @link
      abstraction as there's one-to-one mapping between a port and a non-PMP
      link.  However, that assumption won't hold anymore with the scheduled
      addition of slave link.
      
      Make SCR access ops per-link.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      82ef04fb
  10. 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
  11. 31 7月, 2008 2 次提交
  12. 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
  13. 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
  14. 20 5月, 2008 3 次提交
  15. 10 5月, 2008 1 次提交
  16. 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
  17. 30 4月, 2008 1 次提交
  18. 25 4月, 2008 1 次提交
  19. 20 4月, 2008 1 次提交
  20. 18 4月, 2008 5 次提交
    • 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