1. 17 4月, 2014 2 次提交
    • 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
  2. 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
  3. 18 2月, 2014 1 次提交
  4. 15 2月, 2014 3 次提交
  5. 14 2月, 2014 1 次提交
  6. 04 1月, 2014 1 次提交
  7. 31 12月, 2013 1 次提交
  8. 16 12月, 2013 1 次提交
    • P
      ahci: bail out on ICH6 before using AHCI BAR · 6fec8871
      Paul Bolle 提交于
      The check for "combined mode" (which disables ahci support) on ICH6 is
      done after the first use of AHCI BAR. But if ahci is not enabled AHCI
      BAR is initialized to 0x00000000. (At least it is on the ICH6-M I tested
      this on. If I understand the datasheet correctly it should also be on
      ICH6R.) This apparently makes the call of
      pcim_iomap_regions_request_all() return -EINVAL. And we end up with
          ahci: probe of 0000:00:1f.2 failed with error -22
      
      (at warning level) in the logs.
      
      So check for "combined mode" before calling
      pcim_iomap_regions_request_all().
      Signed-off-by: NPaul Bolle <pebolle@tiscali.nl>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      6fec8871
  9. 15 12月, 2013 1 次提交
  10. 23 11月, 2013 2 次提交
  11. 05 11月, 2013 1 次提交
  12. 08 10月, 2013 1 次提交
  13. 25 8月, 2013 1 次提交
  14. 23 7月, 2013 1 次提交
  15. 25 6月, 2013 1 次提交
  16. 22 6月, 2013 1 次提交
  17. 04 6月, 2013 1 次提交
  18. 03 6月, 2013 1 次提交
  19. 29 5月, 2013 1 次提交
  20. 22 5月, 2013 1 次提交
  21. 15 5月, 2013 1 次提交
  22. 16 4月, 2013 1 次提交
  23. 05 3月, 2013 1 次提交
  24. 21 2月, 2013 1 次提交
  25. 26 1月, 2013 1 次提交
  26. 25 1月, 2013 1 次提交
    • A
      AHCI: Support multiple MSIs · 5ca72c4f
      Alexander Gordeev 提交于
      Take advantage of multiple MSIs implementation on x86 - on
      systems with IRQ remapping AHCI ports not only get assigned
      separate MSI vectors - but also separate IRQs. As result,
      interrupts generated by different ports could be serviced on
      different CPUs rather than on a single one.
      
      In cases when number of allocated MSIs is less than requested
      the Sharing Last MSI mode does not get used, no matter
      implemented in hardware or not. Instead, the driver assumes the
      advantage of multiple MSIs is negated and falls back to the
      single MSI mode as if MRSM bit was set (some Intel chips
      implement this strategy anyway - MRSM bit gets set even if the
      number of allocated MSIs exceeds the number of implemented ports).
      Signed-off-by: NAlexander Gordeev <agordeev@redhat.com>
      Acked-by: NJeff Garzik <jgarzik@redhat.com>
      Cc: Bjorn Helgaas <bhelgaas@google.com>
      Cc: Suresh Siddha <suresh.b.siddha@intel.com>
      Cc: Yinghai Lu <yinghai@kernel.org>
      Cc: Matthew Wilcox <willy@linux.intel.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Link: http://lkml.kernel.org/r/15bf7ee314dd55f21ec7d2a01c47613cd8190a7c.1353324359.git.agordeev@redhat.comSigned-off-by: NIngo Molnar <mingo@kernel.org>
      5ca72c4f
  27. 15 1月, 2013 1 次提交
  28. 13 9月, 2012 3 次提交
  29. 18 8月, 2012 1 次提交
  30. 26 7月, 2012 3 次提交
  31. 04 5月, 2012 1 次提交
  32. 14 3月, 2012 1 次提交