1. 29 4月, 2007 2 次提交
    • T
      ahci: move port_map handling to ahci_save_initial_config() · 17199b18
      Tejun Heo 提交于
      Move cross checking between port_map and cap.n_ports into
      ahci_save_initial_config().  After save_initial_config is done,
      hpriv->port_map is always setup properly.
      
      Tested on JMB363, ICH7 and ICH8 (with dummy ports).
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      17199b18
    • T
      ahci: implement ata_save/restore_initial_config() · d447df14
      Tejun Heo 提交于
      There are several registers which describe how the controller is
      configured.  These registers are sometimes implemented as r/w
      registers which are configured by firmware and get cleared on
      controller reset or after suspend/resume cycle.  ahci saved and
      restored those values inside ahci_reset_controller() which is a bit
      messy and doesn't work over suspend/resume cycle.
      
      This patch implements ahci_save/restore_initial_config().  The save
      function is called during driver initialization and saves cap and
      port_map to hpriv.  The restore function is called after the
      controller is reset to restore the initial values.
      
      Sometimes the initial firmware values are inconsistent and need to be
      fixed up.  This is handled by ahci_save_initial_config().  For this,
      there are two versions of saved registers.  One to write back to the
      hardware register, the other to use during driver operation.  This is
      necessary to keep ahci's behavior unchanged (write back fixed up
      port_map while keeping cap as-is).
      
      This patch makes ahci save the register values once before the first
      controller reset, not after it's been reset.  Also, the same stored
      values are used written back after each reset, so the register values
      are properly recovered after suspend/resume cycle.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      d447df14
  2. 28 3月, 2007 1 次提交
    • C
      ahci.c: walkaround for SB600 SATA internal error issue · 55a61604
      Conke Hu 提交于
         There is a HW issue in ATI SB600 SATA that PxSERR.E should not be
      set on some conditions, for example, when there is no media in SATA
      CD/DVD drive or media is not ready, AHCI controller fails to execute
      ATAPI commands and reports PORT_IRQ_TF_ERR, but ATI SB600 SATA
      controller sets PxSERR.E at the
      same time, which is not necessary.
          This patch is just to ignore the INTERNAL ERROR in such case.
      Without this patch, ahci error handler will report many errors as
      below:
          ----------- cut from dmesg -----------
      ata9: soft resetting port
      ata9: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
      ata9.00: configured for UDMA/33
      ata9: EH complete
      ata9.00: exception Emask 0x40 SAct 0x0 SErr 0x800 action 0x2
      ata9.00: (irq_stat 0x40000001)
      ata9.00: cmd a0/00:00:00:00:20/00:00:00:00:00/a0 tag 0 cdb 0x0 data 0
              res 51/24:03:00:00:20/00:00:00:00:00/a0 Emask 0x40 (internal error)
      ata9: soft resetting port
      ata9: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
      ata9.00: configured for UDMA/33
      ata9: EH complete
      ata9.00: exception Emask 0x40 SAct 0x0 SErr 0x800 action 0x2
      ata9.00: (irq_stat 0x40000001)
      ata9.00: cmd a0/01:00:00:00:00/00:00:00:00:00/a0 tag 0 cdb 0x43 data 12 in
              res 51/24:03:00:00:00/00:00:00:00:00/a0 Emask 0x40 (internal error)
          -------- end cut ---------
      Signed-off-by: NConke Hu <conke.hu@amd.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      55a61604
  3. 06 3月, 2007 1 次提交
  4. 03 3月, 2007 1 次提交
  5. 02 3月, 2007 2 次提交
  6. 26 2月, 2007 1 次提交
  7. 23 2月, 2007 1 次提交
  8. 15 2月, 2007 1 次提交
    • T
      [PATCH] remove many unneeded #includes of sched.h · cd354f1a
      Tim Schmielau 提交于
      After Al Viro (finally) succeeded in removing the sched.h #include in module.h
      recently, it makes sense again to remove other superfluous sched.h includes.
      There are quite a lot of files which include it but don't actually need
      anything defined in there.  Presumably these includes were once needed for
      macros that used to live in sched.h, but moved to other header files in the
      course of cleaning it up.
      
      To ease the pain, this time I did not fiddle with any header files and only
      removed #includes from .c-files, which tend to cause less trouble.
      
      Compile tested against 2.6.20-rc2 and 2.6.20-rc2-mm2 (with offsets) on alpha,
      arm, i386, ia64, mips, powerpc, and x86_64 with allnoconfig, defconfig,
      allmodconfig, and allyesconfig as well as a few randconfigs on x86_64 and all
      configs in arch/arm/configs on arm.  I also checked that no new warnings were
      introduced by the patch (actually, some warnings are removed that were emitted
      by unnecessarily included header files).
      Signed-off-by: NTim Schmielau <tim@physik3.uni-rostock.de>
      Acked-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      cd354f1a
  9. 10 2月, 2007 9 次提交
  10. 27 1月, 2007 3 次提交
  11. 26 1月, 2007 1 次提交
  12. 24 1月, 2007 2 次提交
    • T
      ahci: don't enter slumber on power down · 07c53dac
      Tejun Heo 提交于
      Some ATA/ATAPI devices act weirdly after the link is put into slumber
      mode.  Some hang completely requiring physical power removal while
      others fail to wake up till the link is hardreset a couple of times.
      
      The addition of slumber on power down was never driven by real need.
      It just followed what ahci spec said literally.  The spec itself seems
      faulty in that it doesn't consider devices (not controllers) which
      don't support link powersaving mode.
      
      Theory never matches reality when it comes to dark allys of cheap
      ATA/ATAPI world.  It's just unrealistic to expect vendors to test
      rarely used link powersaving feature rigorously.  This patch makes
      ahci more friendly to the coldness of reality.
      
      This shouldn't have any negative effect - when suspend operation
      succeeds, we power off the whole machine; otherwise, we wake up
      everything.  I can't see any reason to be so elaborate with powering
      down the link in the first place.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      07c53dac
    • T
      ahci: make ULi M5288 ignore interface fatal error bit · 82490c09
      Tejun Heo 提交于
      As with JMicron controllers, ULi M5288 sets interface fatal error bit
      on device error including ATAPI CC.  This makes libata hardreset the
      port on ATAPI CC thus making it impossible to use.  Ignore interface
      fatal error bit on ULi M5288.  This fixes bugzilla bug #7837.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Signed-off-by: NJeff Garzik <jeff@garzik.org>
      82490c09
  13. 21 12月, 2006 1 次提交
  14. 16 12月, 2006 1 次提交
  15. 03 12月, 2006 1 次提交
    • T
      [PATCH] ahci: do not powerdown during initialization · 8e16f941
      Tejun Heo 提交于
      ahci_init_controller() calls ahci_deinit_port() to make sure the
      controller is stopped before initializing the controller.  In turn,
      ahci_deinit_port() invokes ahci_power_down() to power down the port.
      If the controller supports slumber mode, the link is put into it.
      
      Unfortunately, some devices don't implement link powersaving mode
      properly and show erratic behavior after link is put into slumber
      mode.  For example, HL-DT-ST DVD-RAM GSA-H30N completely locks up on
      slumber transition and can only be recovered with the *REAL* hard
      reset - power removal and reapply.
      
      Note that this makes the first probing reset different from all
      others.  If the above dvd-ram is hotplugged after ahci is initialized,
      no problem occurs because ahci is already fully initialized with phy
      powered up.  So, this might also be the reason for other weird AHCI
      initial probing abnormalities.
      
      This patch moves power up/down out of port init/deinit and call them
      only when needed.
      
      Power down is now called only when suspending.  As system suspend
      usually involves powering down 12v for storage devices, this shouldn't
      cause problem even if the attached device doesn't support slumber
      mode.  However, in partial power management and suspend failure cases,
      devices might lock up after suspend attempt.  I thought about removing
      transition to slumber mode altogether but ahci spec mandates it before
      HBA D3 state transition.  Blacklisting such devices might be the
      solution.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      8e16f941
  16. 02 12月, 2006 5 次提交
  17. 29 11月, 2006 1 次提交
    • T
      [PATCH] ahci: ignore PORT_IRQ_IF_ERR on JMB controllers · 41669553
      Tejun Heo 提交于
      JMicron AHCI controllers set PORT_IRQ_IF_ERR on device errors.  The
      IRQ status bit indicates interface error or protocol mismatch and ahci
      driver interprets it into AC_ERR_ATA_BUS.  So, whenever an ATAPI
      device raises check condition, ahci interprets it as ATA bus error and
      thus resets it which, in turn, raises check condition thus creating a
      reset loop and rendering the device unuseable.
      
      This patch makes JMB controllers ignore PORT_IRQ_IF_ERR when
      interpreting error condition.
      Signed-off-by: NTejun Heo <htejun@gmail.com>
      Cc: Justin Tsai <justin@jmicron.com>
      41669553
  18. 28 11月, 2006 1 次提交
  19. 03 11月, 2006 1 次提交
  20. 01 11月, 2006 1 次提交
  21. 22 10月, 2006 1 次提交
  22. 05 10月, 2006 1 次提交
    • D
      IRQ: Maintain regs pointer globally rather than passing to IRQ handlers · 7d12e780
      David Howells 提交于
      Maintain a per-CPU global "struct pt_regs *" variable which can be used instead
      of passing regs around manually through all ~1800 interrupt handlers in the
      Linux kernel.
      
      The regs pointer is used in few places, but it potentially costs both stack
      space and code to pass it around.  On the FRV arch, removing the regs parameter
      from all the genirq function results in a 20% speed up of the IRQ exit path
      (ie: from leaving timer_interrupt() to leaving do_IRQ()).
      
      Where appropriate, an arch may override the generic storage facility and do
      something different with the variable.  On FRV, for instance, the address is
      maintained in GR28 at all times inside the kernel as part of general exception
      handling.
      
      Having looked over the code, it appears that the parameter may be handed down
      through up to twenty or so layers of functions.  Consider a USB character
      device attached to a USB hub, attached to a USB controller that posts its
      interrupts through a cascaded auxiliary interrupt controller.  A character
      device driver may want to pass regs to the sysrq handler through the input
      layer which adds another few layers of parameter passing.
      
      I've build this code with allyesconfig for x86_64 and i386.  I've runtested the
      main part of the code on FRV and i386, though I can't test most of the drivers.
      I've also done partial conversion for powerpc and MIPS - these at least compile
      with minimal configurations.
      
      This will affect all archs.  Mostly the changes should be relatively easy.
      Take do_IRQ(), store the regs pointer at the beginning, saving the old one:
      
      	struct pt_regs *old_regs = set_irq_regs(regs);
      
      And put the old one back at the end:
      
      	set_irq_regs(old_regs);
      
      Don't pass regs through to generic_handle_irq() or __do_IRQ().
      
      In timer_interrupt(), this sort of change will be necessary:
      
      	-	update_process_times(user_mode(regs));
      	-	profile_tick(CPU_PROFILING, regs);
      	+	update_process_times(user_mode(get_irq_regs()));
      	+	profile_tick(CPU_PROFILING);
      
      I'd like to move update_process_times()'s use of get_irq_regs() into itself,
      except that i386, alone of the archs, uses something other than user_mode().
      
      Some notes on the interrupt handling in the drivers:
      
       (*) input_dev() is now gone entirely.  The regs pointer is no longer stored in
           the input_dev struct.
      
       (*) finish_unlinks() in drivers/usb/host/ohci-q.c needs checking.  It does
           something different depending on whether it's been supplied with a regs
           pointer or not.
      
       (*) Various IRQ handler function pointers have been moved to type
           irq_handler_t.
      Signed-Off-By: NDavid Howells <dhowells@redhat.com>
      (cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)
      7d12e780
  23. 28 9月, 2006 1 次提交