1. 11 2月, 2016 1 次提交
  2. 17 11月, 2015 3 次提交
  3. 04 11月, 2015 1 次提交
  4. 31 10月, 2015 1 次提交
  5. 25 8月, 2015 1 次提交
    • Z
      PCI: Disable async suspend/resume for JMicron multi-function SATA/AHCI · 91f15fb3
      Zhang Rui 提交于
      On multi-function JMicron SATA/PATA/AHCI devices, the PATA controller at
      function 1 doesn't work if it is powered on before the SATA controller at
      function 0.  The result is that PATA doesn't work after resume, and we
      print messages like this:
      
        pata_jmicron 0000:02:00.1: Refused to change power state, currently in D3
        irq 17: nobody cared (try booting with the "irqpoll" option)
      
      Async resume was introduced in v3.15 by 76569faa ("PM / sleep:
      Asynchronous threads for resume_noirq").  Prior to that, we powered on
      the functions in order, so this problem shouldn't happen.
      
      e6b7e41c ("ata: Disabling the async PM for JMicron chip 363/361")
      solved the problem for JMicron 361 and 363 devices.  With async suspend
      disabled, we always power on function 0 before function 1.
      
      Barto then reported the same problem with a JMicron 368 (see comment #57 in
      the bugzilla).
      
      Rather than extending the blacklist piecemeal, disable async suspend for
      all JMicron multi-function SATA/PATA/AHCI devices.
      
      This quirk could stay in the ahci and pata_jmicron drivers, but it's likely
      the problem will occur even if pata_jmicron isn't loaded until after the
      suspend/resume.  Making it a PCI quirk ensures that we'll preserve the
      power-on order even if the drivers aren't loaded.
      
      [bhelgaas: changelog, limit to multi-function, limit to IDE/ATA]
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=81551Reported-and-tested-by: NBarto <mister.freeman@laposte.net>
      Signed-off-by: NZhang Rui <rui.zhang@intel.com>
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      CC: stable@vger.kernel.org	# v3.15+
      91f15fb3
  6. 18 6月, 2015 1 次提交
  7. 17 6月, 2015 2 次提交
    • R
      ahci: Add support for Cavium's ThunderX host controller · b7ae128d
      Robert Richter 提交于
      This patch adds support for Cavium's ThunderX host controller. The
      controller resides on the SoC and is a AHCI compatible SATA controller
      with one port, compliant with Serial ATA 3.1 and AHCI Revision 1.31.
      There can exists multiple SATA controllers on the SoC.
      
      The controller depends on MSI-X support since the PCI ECAM controller
      on the SoC does not implement MSI nor lagacy intx interrupt support.
      Thus, during device initialization, if MSI fails MSI-X will be used to
      enable the device's interrupts.
      
      The controller uses non-standard BAR0 for its register range. The
      already existing device lookup (vendor and device id) that is already
      implemented for other host controllers is used to change the PCI BAR.
      Signed-off-by: NRobert Richter <rrichter@cavium.com>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      b7ae128d
    • R
      ahci: Add generic MSI-X support for single interrupts to SATA PCI driver · ee2aad42
      Robert Richter 提交于
      This patch adds generic MSI-X support for single interrupts to the
      SATA PCI driver. MSI-X support is needed for host controller that only
      have MSI-X support implemented, but no MSI or intx. This patch only
      adds support for single interrupts, multiple per-port MSI-X interrupts
      are not yet implemented.
      
      The new implementation still initializes MSIs first. Only if that
      fails, the code tries to enable MSI-X. If that fails too, setup is
      continued with intx interrupts.
      
      To not break other chips by this generic code change, there are the
      following precautions:
      
       * Interrupt ranges are not enabled at all.
      
       * Only single interrupt mode is enabled for msix cap devices. Thus,
         only one interrupt will be setup.
      
       * During the discussion with Tejun we agreed to change the init
         sequence from msix-msi-intx to msi-msix-intx. Thus, if a device
         offers msi and init does not fail, the msix init code will not be
         executed. This is equivalent to current code.
      
      With this, the code only setups single mode msix as a last resort if
      msi fails. No interrupt range is enabled at all. Only one interrupt
      will be enabled.
      
      tj: comment edits.
      
      Changes of the patch series:
      
      v5:
       * updated patch subject that the patch only implements single IRQ
       * moved Cavium specific code to a separate patch
       * detect Cavium ThunderX device with PCI_CLASS_STORAGE_SATA_AHCI
         instead of vendor/dev id
       * added more comments to the code
       * enable single msix support for all kind of devices (removing strict
         check)
       * rebased onto update libata/for-4.2 with patch 1, 2 applied
      
      v4:
       * removed implementation of ahci_init_intx()
       * improved patch descriptions
       * rebased onto libata/for-4.2
      
      v3:
       * store irq number in struct ahci_host_priv
       * change initialization order from msix-msi-intx to msi-msix-intx
       * improve comments in ahci_init_msix()
       * improve error message in ahci_init_msix()
       * do not enable MSI-X if MSI is actively disabled for the device
      
      v2:
       * determine irq vector from pci_dev->msi_list
      
      Based on a patch from Sunil Goutham <sgoutham@cavium.com>.
      Signed-off-by: NRobert Richter <rrichter@cavium.com>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      ee2aad42
  8. 03 6月, 2015 2 次提交
    • R
      ahci: Store irq number in struct ahci_host_priv · 21bfd1aa
      Robert Richter 提交于
      Currently, ahci supports only msi and intx. To also support msix the
      handling of the irq number need to be changed. The irq number for msix
      devices is taken from msi_list instead of pci_dev. Thus, the irq
      number of a device needs to be stored in struct ahci_host_priv now.
      This allows the host controller to be activated in a generic way.
      
      This change is only intended for ahci drivers. For that reason the irq
      number is stored in struct ahci_host_priv used only by ahci drivers.
      Thus, the ABI changes only for ahci_host_activate(), but existing ata
      drivers (about 50) are unaffected and keep unchanged. All users of
      ahci_host_activate() have been updated.
      
      While touching drivers/ata/libahci.c, doing a small code cleanup in
      ahci_port_start().
      Signed-off-by: NRobert Richter <rrichter@cavium.com>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      21bfd1aa
    • R
      ahci: Move interrupt enablement code to a separate function · a1c82311
      Robert Richter 提交于
      This patch refactors ahci_init_interrupts() and moves msi code to a
      separate function. Need the split since we add msix initialization in
      a later patch. The initialization for msix will be done after msi but
      before intx.
      Signed-off-by: NRobert Richter <rrichter@cavium.com>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      a1c82311
  9. 10 5月, 2015 1 次提交
  10. 08 4月, 2015 1 次提交
    • Q
      ata: remove deprecated use of pci api · c54c719b
      Quentin Lambert 提交于
      Replace occurences of the pci api by appropriate call to the dma api.
      
      A simplified version of the semantic patch that finds this problem is as
      follows: (http://coccinelle.lip6.fr)
      
      @deprecated@
      idexpression id;
      position p;
      @@
      
      (
        pci_dma_supported@p ( id, ...)
      |
        pci_alloc_consistent@p ( id, ...)
      )
      
      @bad1@
      idexpression id;
      position deprecated.p;
      @@
      ...when != &id->dev
         when != pci_get_drvdata ( id )
         when != pci_enable_device ( id )
      (
        pci_dma_supported@p ( id, ...)
      |
        pci_alloc_consistent@p ( id, ...)
      )
      
      @depends on !bad1@
      idexpression id;
      expression direction;
      position deprecated.p;
      @@
      
      (
      - pci_dma_supported@p ( id,
      + dma_supported ( &id->dev,
      ...
      + , GFP_ATOMIC
        )
      |
      - pci_alloc_consistent@p ( id,
      + dma_alloc_coherent ( &id->dev,
      ...
      + , GFP_ATOMIC
        )
      )
      Signed-off-by: NQuentin Lambert <lambert.quentin@gmail.com>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      c54c719b
  11. 13 1月, 2015 1 次提交
  12. 05 12月, 2014 1 次提交
  13. 03 12月, 2014 1 次提交
  14. 05 11月, 2014 1 次提交
  15. 28 10月, 2014 2 次提交
  16. 06 10月, 2014 3 次提交
  17. 28 9月, 2014 1 次提交
  18. 06 9月, 2014 1 次提交
  19. 01 9月, 2014 1 次提交
    • C
      ata: Disabling the async PM for JMicron chip 363/361 · e6b7e41c
      Chuansheng Liu 提交于
      After enabled the PM feature that supporting async noirq(76569faa
      (PM / sleep: Asynchronous threads for resume_noirq)),
      Jay hit the system resuming issue, that one of the JMicron controller
      can not be powered up.
      
      His device tree is like below:
                   +-1c.4-[02]--+-00.0  JMicron Technology Corp. JMB363 SATA/IDE Controller
                   |            \-00.1  JMicron Technology Corp. JMB363 SATA/IDE Controller
      
      After investigation, we found the the Micron chip 363 included
      one SATA controller(0000:02:00.0) and one PATA controller(0000:02:00.1),
      these two controllers do not have parent-children relationship,
      but the PATA controller only can be powered on after the SATA controller
      has finished the powering on.
      
      If we enabled the async noirq(), then the below error is hit during noirq
      phase:
      pata_jmicron 0000:02:00.1: Refused to change power state, currently in D3
      
      Here for JMicron chip 363/361, we need forcedly to disable the async method.
      
      Bug detail: https://bugzilla.kernel.org/show_bug.cgi?id=81551Reported-by: NJay <MyMailClone@t-online.de>
      Signed-off-by: NChuansheng Liu <chuansheng.liu@intel.com>
      Acked-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      e6b7e41c
  20. 31 8月, 2014 1 次提交
  21. 28 8月, 2014 1 次提交
  22. 31 7月, 2014 1 次提交
  23. 19 7月, 2014 1 次提交
  24. 04 6月, 2014 1 次提交
  25. 27 5月, 2014 1 次提交
  26. 24 4月, 2014 1 次提交
  27. 19 4月, 2014 1 次提交
    • A
      ahci: Do not receive interrupts sent by dummy ports · 2cf532f5
      Alexander Gordeev 提交于
      In multiple MSI mode all AHCI ports (including dummy) get assigned
      separate MSI vectors and (as result of execution
      pci_enable_msi_exact() function) separate IRQ numbers, (mapped to the
      MSI vectors).
      
      Therefore, although interrupts from dummy ports are not desired they
      are still enabled. We do not request IRQs for dummy ports, but that
      only means we do not assign AHCI-specific ISRs to corresponding IRQ
      numbers.
      
      As result, dummy port interrupts still could come and traverse all the
      way from the PCI device to the kernel, causing unnecessary overhead.
      
      This update disables IRQs for dummy ports and prevents the described
      issue.
      Signed-off-by: NAlexander Gordeev <agordeev@redhat.com>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Tested-by: NDavid Milburn <dmilburn@redhat.com>
      Cc: linux-ide@vger.kernel.org
      Cc: stable@vger.kernel.org
      Fixes: 5ca72c4f ("AHCI: Support multiple MSIs")
      2cf532f5
  28. 17 4月, 2014 3 次提交
    • A
      ahci: Use pci_enable_msi_exact() instead of pci_enable_msi_range() · ccf8f53c
      Alexander Gordeev 提交于
      The driver calls pci_enable_msi_range() function with the range of
      [nvec..nvec] which is what pci_enable_msi_exact() function is for.
      Signed-off-by: NAlexander Gordeev <agordeev@redhat.com>
      Cc: linux-ide@vger.kernel.org
      Signed-off-by: NTejun Heo <tj@kernel.org>
      ccf8f53c
    • A
      ahci: Ensure "MSI Revert to Single Message" mode is not enforced · ab0f9e78
      Alexander Gordeev 提交于
      The AHCI specification allows hardware to choose to revert to
      single MSI mode when fewer messages are allocated than requested.
      Yet, at least ICH10 chipset reverts to single MSI mode even when
      enough messages are allocated in some cases (see below).
      
      This update forces the driver to not rely on initialization of
      multiple MSIs mode alone and always check if "MSI Revert to
      Single Message" (MRSM) mode was enforced by the controller and
      fallback to the single MSI mode in case it did.
      
      That prevents a situation when the driver configured multiple
      per-port IRQ handlers, but the controller sends all port's
      interrupts to a single IRQ, which could easily screw up the
      interrupt handling and lead to delays and possibly crashes.
      
      The fix was tested on a 6-port controller that successfully
      reverted to the single MSI mode:
      
      00:1f.2 SATA controller: Intel Corporation 82801JI (ICH10 Family) SATA
      AHCI Controller (prog-if 01 [AHCI 1.0])
      	Subsystem: Super Micro Computer Inc Device 10a7
      	Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 101
      	I/O ports at f110 [size=8]
      	I/O ports at f100 [size=4]
      	I/O ports at f0f0 [size=8]
      	I/O ports at f0e0 [size=4]
      	I/O ports at f020 [size=32]
      	Memory at fbf00000 (32-bit, non-prefetchable) [size=2K]
      	Capabilities: [80] MSI: Enable+ Count=1/16 Maskable- 64bit-
      	Capabilities: [70] Power Management version 3
      	Capabilities: [a8] SATA HBA v1.0
      	Capabilities: [b0] PCI Advanced Features
      	Kernel driver in use: ahci
      
      With 6 ports just 8 MSI vectors should be enough, but the adapter
      enforces the MRSM mode when less than 16 vectors are written to
      the Multiple Messages Enable PCI register. I instigated MRSM mode
      by forcing @nvec to 8 in ahci_init_interrupts().
      Signed-off-by: NAlexander Gordeev <agordeev@redhat.com>
      Cc: linux-ide@vger.kernel.org
      Cc: stable@vger.kernel.org
      Signed-off-by: NTejun Heo <tj@kernel.org>
      ab0f9e78
    • D
      ahci: do not request irq for dummy port · 9ae794ac
      David Milburn 提交于
      System may crash in ahci_hw_interrupt() or ahci_thread_fn() when
      accessing the interrupt status in a port's private_data if the port is
      actually a DUMMY port.
      
      00:1f.2 SATA controller: Intel Corporation 82801JI (ICH10 Family) SATA AHCI Controller
      
      <snip console output for linux-3.15-rc1>
      [    9.352080] ahci 0000:00:1f.2: AHCI 0001.0200 32 slots 6 ports 3 Gbps 0x1 impl SATA mode
      [    9.352084] ahci 0000:00:1f.2: flags: 64bit ncq sntf pm led clo pio slum part ccc
      [    9.368155] Console: switching to colour frame buffer device 128x48
      [    9.439759] mgag200 0000:11:00.0: fb0: mgadrmfb frame buffer device
      [    9.446765] mgag200 0000:11:00.0: registered panic notifier
      [    9.470166] scsi1 : ahci
      [    9.479166] scsi2 : ahci
      [    9.488172] scsi3 : ahci
      [    9.497174] scsi4 : ahci
      [    9.506175] scsi5 : ahci
      [    9.515174] scsi6 : ahci
      [    9.518181] ata1: SATA max UDMA/133 abar m2048@0x95c00000 port 0x95c00100 irq 91
      [    9.526448] ata2: DUMMY
      [    9.529182] ata3: DUMMY
      [    9.531916] ata4: DUMMY
      [    9.534650] ata5: DUMMY
      [    9.537382] ata6: DUMMY
      [    9.576196] [drm] Initialized mgag200 1.0.0 20110418 for 0000:11:00.0 on minor 0
      [    9.845257] ata1: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
      [    9.865161] ata1.00: ATAPI: Optiarc DVD RW AD-7580S, FX04, max UDMA/100
      [    9.891407] ata1.00: configured for UDMA/100
      [    9.900525] scsi 1:0:0:0: CD-ROM            Optiarc  DVD RW AD-7580S  FX04 PQ: 0 ANSI: 5
      [   10.247399] iTCO_vendor_support: vendor-support=0
      [   10.261572] iTCO_wdt: Intel TCO WatchDog Timer Driver v1.11
      [   10.269764] iTCO_wdt: unable to reset NO_REBOOT flag, device disabled by hardware/BIOS
      [   10.301932] sd 0:2:0:0: [sda] 570310656 512-byte logical blocks: (291 GB/271 GiB)
      [   10.317085] sd 0:2:0:0: [sda] Write Protect is off
      [   10.328326] sd 0:2:0:0: [sda] Write cache: disabled, read cache: disabled, supports DPO and FUA
      [   10.375452] BUG: unable to handle kernel NULL pointer dereference at 000000000000003c
      [   10.384217] IP: [<ffffffffa0133df0>] ahci_hw_interrupt+0x100/0x130 [libahci]
      [   10.392101] PGD 0
      [   10.394353] Oops: 0000 [#1] SMP
      [   10.397978] Modules linked in: sr_mod(+) cdrom sd_mod iTCO_wdt crc_t10dif iTCO_vendor_support crct10dif_common ahci libahci libata lpc_ich mfd_core mgag200 syscopyarea sysfillrect sysimgblt i2c_algo_bit drm_kms_helper ttm drm i2c_core megaraid_sas dm_mirror dm_region_hash
      dm_log dm_mod
      [   10.426499] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.15.0-rc1 #1
      [   10.433495] Hardware name: QCI QSSC-S4R/QSSC-S4R, BIOS QSSC-S4R.QCI.01.00.S013.032920111005 03/29/2011
      [   10.443886] task: ffffffff81906460 ti: ffffffff818f0000 task.ti: ffffffff818f0000
      [   10.452239] RIP: 0010:[<ffffffffa0133df0>]  [<ffffffffa0133df0>] ahci_hw_interrupt+0x100/0x130 [libahci]
      [   10.462838] RSP: 0018:ffff880033c03d98  EFLAGS: 00010046
      [   10.468767] RAX: 0000000000a400a4 RBX: ffff880029a6bc18 RCX: 00000000fffffffa
      [   10.476731] RDX: 00000000000000a4 RSI: ffff880029bb0000 RDI: ffff880029a6bc18
      [   10.484696] RBP: ffff880033c03dc8 R08: 0000000000000000 R09: ffff88002f800490
      [   10.492661] R10: 0000000000000000 R11: 0000000000000005 R12: 0000000000000000
      [   10.500625] R13: ffff880029a6bd98 R14: 0000000000000000 R15: ffffc90000194000
      [   10.508590] FS:  0000000000000000(0000) GS:ffff880033c00000(0000) knlGS:0000000000000000
      [   10.517623] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
      [   10.524035] CR2: 000000000000003c CR3: 00000000328ff000 CR4: 00000000000007b0
      [   10.531999] Stack:
      [   10.534241]  0000000000000017 ffff880031ba7d00 000000000000005c ffff880031ba7d00
      [   10.542535]  0000000000000000 000000000000005c ffff880033c03e10 ffffffff810c2a1e
      [   10.550827]  ffff880031ae2900 000000008108fb4f ffff880031ae2900 ffff880031ae2984
      [   10.559121] Call Trace:
      [   10.561849]  <IRQ>
      [   10.563994]  [<ffffffff810c2a1e>] handle_irq_event_percpu+0x3e/0x1a0
      [   10.571309]  [<ffffffff810c2bbd>] handle_irq_event+0x3d/0x60
      [   10.577631]  [<ffffffff810c4fdd>] try_one_irq.isra.6+0x8d/0xf0
      [   10.584142]  [<ffffffff810c5313>] note_interrupt+0x173/0x1f0
      [   10.590460]  [<ffffffff810c2a8e>] handle_irq_event_percpu+0xae/0x1a0
      [   10.597554]  [<ffffffff810c2bbd>] handle_irq_event+0x3d/0x60
      [   10.603872]  [<ffffffff810c5727>] handle_edge_irq+0x77/0x130
      [   10.610199]  [<ffffffff81014b8f>] handle_irq+0xbf/0x150
      [   10.616040]  [<ffffffff8109ff4e>] ? vtime_account_idle+0xe/0x50
      [   10.622654]  [<ffffffff815fca1a>] ? atomic_notifier_call_chain+0x1a/0x20
      [   10.630140]  [<ffffffff816038cf>] do_IRQ+0x4f/0xf0
      [   10.635490]  [<ffffffff815f8aed>] common_interrupt+0x6d/0x6d
      [   10.641805]  <EOI>
      [   10.643950]  [<ffffffff8149ca9f>] ? cpuidle_enter_state+0x4f/0xc0
      [   10.650972]  [<ffffffff8149ca98>] ? cpuidle_enter_state+0x48/0xc0
      [   10.657775]  [<ffffffff8149cb47>] cpuidle_enter+0x17/0x20
      [   10.663807]  [<ffffffff810b0070>] cpu_startup_entry+0x2c0/0x3d0
      [   10.670423]  [<ffffffff815dfcc7>] rest_init+0x77/0x80
      [   10.676065]  [<ffffffff81a60f47>] start_kernel+0x40f/0x41a
      [   10.682190]  [<ffffffff81a60941>] ? repair_env_string+0x5c/0x5c
      [   10.688799]  [<ffffffff81a60120>] ? early_idt_handlers+0x120/0x120
      [   10.695699]  [<ffffffff81a605ee>] x86_64_start_reservations+0x2a/0x2c
      [   10.702889]  [<ffffffff81a60733>] x86_64_start_kernel+0x143/0x152
      [   10.709689] Code: a0 fc ff 85 c0 8b 4d d4 74 c3 48 8b 7b 08 89 ca 48 c7 c6 60 66 13 a0 31 c0 e8 9d 70 28 e1 8b 4d d4 eb aa 0f 1f 84 00 00 00 00 00 <45> 8b 64 24 3c 48 89 df e8 23 47 4c e1 41 83 fc 01 19 c0 48 83
      [   10.731470] RIP  [<ffffffffa0133df0>] ahci_hw_interrupt+0x100/0x130 [libahci]
      [   10.739441]  RSP <ffff880033c03d98>
      [   10.743333] CR2: 000000000000003c
      [   10.747032] ---[ end trace b6e82636970e2690 ]---
      [   10.760190] Kernel panic - not syncing: Fatal exception in interrupt
      [   10.767291] Kernel Offset: 0x0 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffff9fffffff)
      
      Cc: Alexander Gordeev <agordeev@redhat.com>
      Cc: Tejun Heo <tj@kernel.org>
      Cc: <stable@vger.kernel.org>
      Signed-of-by: NDavid Milburn <dmilburn@redhat.com>
      Fixes: 5ca72c4f ("AHCI: Support multiple MSIs")
      9ae794ac
  29. 23 2月, 2014 1 次提交
    • H
      libahci: Allow drivers to override start_engine · 039ece38
      Hans de Goede 提交于
      Allwinner A10 and A20 ARM SoCs have an AHCI sata controller which needs a
      special register to be poked before starting the DMA engine.
      
      This register gets reset on an ahci_stop_engine call, so there is no other
      place then ahci_start_engine where this poking can be done.
      
      This commit allows drivers to override ahci_start_engine behavior for use by
      the Allwinner AHCI driver (and potentially other drivers in the future).
      Signed-off-by: NHans de Goede <hdegoede@redhat.com>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      039ece38
  30. 18 2月, 2014 1 次提交
  31. 15 2月, 2014 1 次提交