1. 20 1月, 2014 1 次提交
    • S
      firewire: Enable remote DMA above 4 GB · fcd46b34
      Stefan Richter 提交于
      This makes all of a machine's memory accessible to remote debugging via
      FireWire, using the physical response unit (i.e. RDMA) of OHCI-1394 link
      layer controllers.
      
      This requires actual support by the controller.  The only ones currently
      known to support it are Agere/LSI FW643.  Most if not all other OHCI-1394
      controllers do not implement the optional Physical Upper Bound register.
      With them, RDMA will continue to be limited to the lowermost 4 GB.
      
      firewire-ohci's startup message in the kernel log is augmented to tell
      whether the controller does expose more than 4 GB to RDMA.
      
      While OHCI-1394 allows for a maximum Physical Upper Bound of
      0xffff'0000'0000 (near 256 TB), this implementation sets it to
      0x8000'0000'0000 (128 TB) in order to avoid interference with applications
      that require interrupt-served asynchronous request reception at
      respectively low addresses.
      
      Note, this change does not switch remote DMA on.  It only increases the
      range of remote access to all memory (instead of just 4 GB) whenever
      remote DMA was switched on by other means.  The latter is achieved by
      setting firewire-ohci's remote_dma parameter, or if the physical DMA
      filter is opened through firewire-sbp2.
      
      Derived from patch "firewire: Enable physical DMA above 4GB" by
      Peter Hurley <peter@hurleysoftware.com> from March 27, 2013.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      fcd46b34
  2. 13 1月, 2014 1 次提交
  3. 30 8月, 2013 2 次提交
    • S
      firewire: ohci: Fix deadlock at bus reset · db9ae8fe
      Stephan Gatzka 提交于
      Put bus_reset_work into its own workqueue.  By doing this, forward
      progress of bus_reset_work() is guaranteed if the work is switched over
      to a rescuer thread.
      
      Switching work to a rescuer thread happens if a new worker thread could
      not be allocated in certain time (MAYDAY_INITIAL_TIMEOUT, typically 10
      ms).  This might not be possible under high memory pressure or even on a
      heavily loaded embedded system running a slow serial console.
      
      The former deadlock occured in the following situation:
      The rescuer thread ran
      fw_device_init->read_config_rom->read_rom->fw_run_transaction.
      fw_run_transaction blocked waiting for the completion object.
      This completion object would have been completed in bus_reset_work,
      but this work was never executed in the rescuer thread due to its
      strictly sequential behaviour.
      
      [Stefan R.:  Removed WQ_NON_REENTRANT flag from allocation because
      it is no longer needed in current kernels.  Add it back if you backport
      to kernels older than 3.7, i.e. one which does not contain dbf2576e
      "workqueue: make all workqueues non-reentrant".  Swapped order of
      destroy_workqueue and pci_unregister_driver.]
      Signed-off-by: NStephan Gatzka <stephan.gatzka@gmail.com>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      db9ae8fe
    • S
      firewire: ohci: Change module_pci_driver to module_init/module_exit · 7a723c6e
      Stephan Gatzka 提交于
      This is a prerequisite to allocate a per driver self_id workqueue.
      This reverts the ohci.c part of patch
      fe2af11c.
      Signed-off-by: NStephan Gatzka <stephan.gatzka@gmail.com>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      7a723c6e
  4. 19 8月, 2013 2 次提交
    • S
      firewire: ohci: beautify some macro definitions · 0dbe15f8
      Stefan Richter 提交于
      a) Sort device IDs by vendor -- device -- revision.
      
      b) Write quirk flags in hexadecimal.  This affects the user-visible
      output of "modinfo firewire-ohci".  Since more flags have been added
      recently, it is now easier to cope with them in hexadecimal represen-
      tation.  Besides, the device-specific combination of quirk flags is
      shown in hexadecimal in the kernel log too.  (And firewire-sbp2
      presents its own quirk flags in modinfo as hexadecimals as well.)
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      0dbe15f8
    • S
      firewire: ohci: change confusing name of a struct member · af53122a
      Stefan Richter 提交于
      We have got
      
      	struct descriptor *descriptors;
      	dma_addr_t         descriptors_bus;
      
      	dma_addr_t         buffer_bus;
      	struct descriptor buffer[0];
      
      	void      *misc_buffer;
      	dma_addr_t misc_buffer_bus;
      
      	__be32    *config_rom;
      	dma_addr_t config_rom_bus;
      	__be32    *next_config_rom;
      	dma_addr_t next_config_rom_bus;
      
      But then we have got
      
      	__le32    *self_id_cpu;
      	dma_addr_t self_id_bus;
      
      Better apply the pattern of xyz vs. xyz_bus to self_id vs. self_id_bus
      as well.  The _cpu suffix looks particularly weird in conversions from
      little endian to CPU endian.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      af53122a
  5. 28 7月, 2013 1 次提交
  6. 01 5月, 2013 4 次提交
    • P
      firewire: ohci: dump_stack() for PHY regs read/write failures · 6fe9efb9
      Peter Hurley 提交于
      A stack trace is an invaluable tool in determining the basis
      and cause of PHY regs read/write failures.
      
      Include PHY reg addr (and value for writes) in the diagnostic.
      
      [Stefan R:  changed whitespace]
      Signed-off-by: NPeter Hurley <peter@hurleysoftware.com>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      6fe9efb9
    • P
      firewire: ohci: Improve bus reset error messages · 67672134
      Peter Hurley 提交于
      Many of the error messages possible from bus_reset_work() do not
      contain enough information to distinguish which error condition
      occurred nor enough information to evaluate the error afterwards.
      
      Differentiate all error conditions in bus_reset_work(); add
      additional information to make error diagnosis possible.
      
      [Stefan R:  fixed self-ID endian conversion]
      Signed-off-by: NPeter Hurley <peter@hurleysoftware.com>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      67672134
    • P
      firewire: ohci: Alias dev_* log functions · de97cb64
      Peter Hurley 提交于
      Convert dev_xxxx(ohci->card.device, ...) log functions to
      ohci_xxxx(ohci, ...).
      
      [Stefan R:  Peter argues that this increases readability of the code.]
      [Stefan R:  changed whitespace]
      Signed-off-by: NPeter Hurley <peter@hurleysoftware.com>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      de97cb64
    • P
      firewire: ohci: Fix 'failed to read phy reg' on FW643 rev8 · bd972688
      Peter Hurley 提交于
      With the LSI FW643 rev 8 [1], the first commanded bus reset at
      the conclusion of ohci_enable() has been observed to fail with
      the following messages:
      
      [    4.884015] firewire_ohci 0000:01:00.0: failed to read phy reg
      ....
      [    5.684012] firewire_ohci 0000:01:00.0: failed to read phy reg
      
      With drivers/firewire/ohci.c instrumented, the error condition [2]
      indicates the PHY arbitration state machine has timed out prior to
      enabling PHY LCtrl.
      
      Furthermore, instrumenting ohci_enable() shows that LPS has been
      enabled within 1 ms.
      
      Test LPS latching every 1 ms rather than every 50ms.
      
      [1]  lspci -v
      
      01:00.0 FireWire (IEEE 1394): LSI Corporation FW643 [TrueFire] PCIe 1394b Controller (rev 08) (prog-if 10 [OHCI])
      	Subsystem: LSI Corporation FW643 [TrueFire] PCIe 1394b Controller
      	Flags: bus master, fast devsel, latency 0, IRQ 92
      	Memory at fbeff000 (64-bit, non-prefetchable) [size=4K]
      	Capabilities: [44] Power Management version 3
      	Capabilities: [4c] MSI: Enable+ Count=1/1 Maskable- 64bit+
      	Capabilities: [60] Express Endpoint, MSI 00
      	Capabilities: [100] Advanced Error Reporting
      	Capabilities: [140] Virtual Channel
      	Capabilities: [170] Device Serial Number 08-14-43-82-00-00-41-fc
      	Kernel driver in use: firewire_ohci
      	Kernel modules: firewire-ohci
      
      [2] instrumented WARNING in read_phy_reg()
      
      [    4.576010] ------------[ cut here ]------------
      [    4.576035] WARNING: at ./drivers/firewire/ohci.c:570 read_phy_reg+0x93/0xe0 [firewire_ohci]()
      [    4.576050] Hardware name: Precision WorkStation T5400
      [    4.576058] failed to read phy reg:1 (phy(5) @ config enhance:19)
      [    4.576068] Modules linked in: hid_logitech_dj hid_generic(+) usbhid <...snip...>
      [    4.576140] Pid: 61, comm: kworker/2:1 Not tainted 3.8.0-2+fwtest-xeon #2+fwtest
      [    4.576149] Call Trace:
      [    4.576160]  [<ffffffff8105468f>] warn_slowpath_common+0x7f/0xc0
      [    4.576168]  [<ffffffff81054786>] warn_slowpath_fmt+0x46/0x50
      [    4.576178]  [<ffffffffa00caca3>] read_phy_reg+0x93/0xe0 [firewire_ohci]
      [    4.576188]  [<ffffffffa00cae19>] ohci_read_phy_reg+0x39/0x60 [firewire_ohci]
      [    4.576203]  [<ffffffffa00731ff>] fw_send_phy_config+0xbf/0xe0 [firewire_core]
      [    4.576214]  [<ffffffffa006b2d6>] br_work+0x46/0xb0 [firewire_core]
      [    4.576225]  [<ffffffff81071e0c>] process_one_work+0x13c/0x500
      [    4.576238]  [<ffffffffa006b290>] ? fw_card_initialize+0x180/0x180 [firewire_core]
      [    4.576248]  [<ffffffff810737ed>] worker_thread+0x16d/0x470
      [    4.576257]  [<ffffffff81073680>] ? busy_worker_rebind_fn+0x100/0x100
      [    4.576266]  [<ffffffff8107d160>] kthread+0xc0/0xd0
      [    4.576275]  [<ffffffff816a0000>] ? pcpu_dump_alloc_info+0x1cb/0x2c4
      [    4.576284]  [<ffffffff8107d0a0>] ? kthread_create_on_node+0x130/0x130
      [    4.576297]  [<ffffffff816b2f6c>] ret_from_fork+0x7c/0xb0
      [    4.576305]  [<ffffffff8107d0a0>] ? kthread_create_on_node+0x130/0x130
      [    4.576313] ---[ end trace cbc940994b300302 ]---
      
      [Stefan R:  Peter also reports a change of behavior with LSI FW323.
      Before the patch, there would often occur a lock transaction failure
      during firewire-core startup:
      [    6.056022] firewire_core 0000:07:06.0: BM lock failed (timeout), making local node (ffc0) root
      This failure no longer happens after the patch, without an obvious
      reason for the failure or the fix.]
      
      [Stefan R:  Added quirk flag, quirk table entry, and comment.]
      Reported-by: NTim Jordan <tim@insipid.org.uk>
      Signed-off-by: NPeter Hurley <peter@hurleysoftware.com>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      bd972688
  7. 29 4月, 2013 5 次提交
    • A
      firewire: ohci: fix VIA VT6306 video reception · be8dcab9
      Andy Leiserson 提交于
      Add quirk for VT6306 wake bit behavior.
      
      VT6306 seems to reread the wrong descriptor when the wake bit is
      written. work around by putting a copy of the branch address in the
      first descriptor of the block.
      
      [Stefan R:  This fixes the known broken video reception via gstreamer
      on VIA VT6306.  100% repeatable testcase:
      $ gst-launch-0.10 dv1394src \! dvdemux \! dvdec \! xvimagesink
      with a camcorder or other DV source connected.  Likewise for MPEG2-TS
      reception via gstreamer, e.g. from TV settop boxes.
      Perhaps this also fixes dv4l on VT6306, but this is as yet untested.
      Kino, dvgrab or FFADO had not been affected by this chip quirk.
      Additional comments from Andy:]
      
      I've looked into some problems with the wake bit on a vt6306 family
      chip (1106:3044, rev 46).
      
      I used this firewire card in a mythtv setup (ISO receive MPEG2 stream)
      with Debian 2.6.32 kernels for ~2 years without problems.
      
      Since upgrading to 3.2, I've been having problems with the input stream
      freezing -- input data stops until I restart mythtv (I expect closing
      and reopening the device would be sufficient). This happens
      infrequently, maybe one out of 20 recordings. I eventually determined
      that the problem is more likely to occur if the system is loaded.
      
      I isolated the kernel version as the triggering SW factor and then
      specifically the change from dualbuffer back to packet-per-buffer DMA
      mode.
      
      The possibility that the controller does not properly respond to the
      wake bit was suggested in
      https://bugzilla.redhat.com/show_bug.cgi?id=415841, but not proven.
      
      Based on the fact that dualbuffer mode worked while packet-per-buffer
      has trouble, I guessed that upon seeing the wake bit written, the vt6306
      controller only checks the branch address in the first descriptor of the
      block, even if that is not the correct place to look (because the block
      has multiple descriptors).
      
      This theory seems to be correct. When the ISO reception is hung, I am
      able to resume it by manually writing the branch address to the first
      descriptor in the block, and then writing the wake bit.
      
      I've had luck so far with the attached patch, so I'm including it. It's
      probably not a complete solution -- I haven't tested transmit modes to
      see whether they have a similar issue.
      
      I doubt that the quirk test is any cheaper than just writing the extra
      branch address in all cases, but it does reduce the risk of breaking
      other hardware.
      
      [Stefan R:  omitted QUIRK_NO_MSI from VT6306 quirks table entry,
      changed whitespace]
      Signed-off-by: NAndy Leiserson <andy@leiserson.org>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      be8dcab9
    • P
      firewire: ohci: Check LPS before register access on pci removal · 8db49149
      Peter Hurley 提交于
      A pci device can be removed while in its suspended state. If the ohci
      host controller is suspended, the PHY is also in low-power mode and
      LPS is disabled. If LPS is disabled, most of the host registers aren't
      accessible, including IntMaskClear. Furthermore, access to these registers
      when LPS is disabled can cause hard lockups on some hardware. Since
      interrupts are already disabled in this mode, further action is
      unnecessary.
      
      Test LPS before attempting to write IntMaskClear to disable interrupts.
      
      [Stefan R: whitespace changes]
      Signed-off-by: NPeter Hurley <peter@hurleysoftware.com>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      8db49149
    • P
      firewire: ohci: Fix double free_irq() · 247fd50b
      Peter Hurley 提交于
      A pci device can be removed while in its suspended state.
      Because the ohci driver freed the irq to suspend, free_irq() is
      called twice; once from pci_remove() and again from pci_suspend(),
      which issues the warning below [1].
      
      Rather than allocate the irq in the .enable() path, move the
      allocation to .probe(). Consequently, the irq is not reallocated
      upon pci_resume() and thus is not freed upon pci_suspend().
      
      [1] Warning reported by Mark Einon <mark.einon@gmail.com> when
      suspending an MSI MS-1727 GT740 laptop on Ubuntu 3.5.0-22-generic
      
      WARNING: at ./kernel/irq/manage.c:1198 __free_irq+0xa3/0x1e0()
      Hardware name: MS-1727
      Trying to free already-free IRQ 16
      Modules linked in: ip6table_filter ip6_tables ebtable_nat ebtables <...snip...>
      Pid: 4, comm: kworker/0:0 Tainted: P           O 3.5.0-22-generic #34-Ubuntu
      Call Trace:
       [<ffffffff81051c1f>] warn_slowpath_common+0x7f/0xc0
       [<ffffffff81051d16>] warn_slowpath_fmt+0x46/0x50
       [<ffffffff8103fa39>] ? default_spin_lock_flags+0x9/0x10
       [<ffffffff810df6b3>] __free_irq+0xa3/0x1e0
       [<ffffffff810df844>] free_irq+0x54/0xc0
       [<ffffffffa005a27e>] pci_remove+0x6e/0x210 [firewire_ohci]
       [<ffffffff8135ae7f>] pci_device_remove+0x3f/0x110
       [<ffffffff8141fdbc>] __device_release_driver+0x7c/0xe0
       [<ffffffff8141fe4c>] device_release_driver+0x2c/0x40
       [<ffffffff8141f5f1>] bus_remove_device+0xe1/0x120
       [<ffffffff8141cd1a>] device_del+0x12a/0x1c0
       [<ffffffff8141cdc6>] device_unregister+0x16/0x30
       [<ffffffff81354784>] pci_stop_bus_device+0x94/0xa0
       [<ffffffffa0091c67>] acpiphp_disable_slot+0xb7/0x1a0 [acpiphp]
       [<ffffffffa0090716>] ? get_slot_status+0x46/0xc0 [acpiphp]
       [<ffffffffa0091d7d>] acpiphp_check_bridge.isra.15+0x2d/0xf0 [acpiphp]
       [<ffffffffa0092442>] _handle_hotplug_event_bridge+0x372/0x4d0 [acpiphp]
       [<ffffffff81390f8c>] ? acpi_os_execute_deferred+0x2f/0x34
       [<ffffffff8116e22d>] ? kfree+0xed/0x110
       [<ffffffff8107086a>] process_one_work+0x12a/0x420
       [<ffffffffa00920d0>] ? _handle_hotplug_event_func+0x1d0/0x1d0 [acpiphp]
       [<ffffffff8107141e>] worker_thread+0x12e/0x2f0
       [<ffffffff810712f0>] ? manage_workers.isra.26+0x200/0x200
       [<ffffffff81075f13>] kthread+0x93/0xa0
       [<ffffffff8168d024>] kernel_thread_helper+0x4/0x10
       [<ffffffff81075e80>] ? kthread_freezable_should_stop+0x70/0x70
       [<ffffffff8168d020>] ? gs_change+0x13/0x13
      Reported-by: NMark Einon <mark.einon@gmail.com>
      Signed-off-by: NPeter Hurley <peter@hurleysoftware.com>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      247fd50b
    • S
      firewire: remove unnecessary alloc/OOM messages · cfb0c9d1
      Stefan Richter 提交于
      These are redundant to log messages from the mm core.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      cfb0c9d1
    • P
      firewire: Remove two unneeded checks for macros · df7ce663
      Paul Bolle 提交于
      The old IEEE 1394 driver stack was removed in v2.6.37. That made the
      checks for two Kconfig (module) macros unneeded, since they will now
      always evaluate to true. Remove these two checks.
      Signed-off-by: NPaul Bolle <pebolle@tiscali.nl>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      df7ce663
  8. 09 1月, 2013 1 次提交
  9. 29 11月, 2012 1 次提交
  10. 19 11月, 2012 1 次提交
  11. 25 9月, 2012 1 次提交
  12. 18 6月, 2012 1 次提交
  13. 05 6月, 2012 1 次提交
  14. 27 5月, 2012 1 次提交
  15. 18 4月, 2012 2 次提交
  16. 09 4月, 2012 1 次提交
  17. 29 3月, 2012 1 次提交
  18. 19 3月, 2012 7 次提交
  19. 17 3月, 2012 1 次提交
    • C
      firewire: ohci: fix too-early completion of IR multichannel buffers · 0c0efbac
      Clemens Ladisch 提交于
      handle_ir_buffer_fill() assumed that a completed descriptor would be
      indicated by a non-zero transfer_status (as in most other descriptors).
      However, this field is written by the controller as soon as (the end of)
      the first packet has been written into the buffer.  As a consequence, if
      we happen to run into such a descriptor when the interrupt handler is
      executed after such a packet has completed, the descriptor would be
      taken out of the list of active descriptors as soon as the buffer had
      been partially filled, so the event for the buffer being completely
      filled would never be sent.
      
      To fix this, handle descriptors only when they have been completely
      filled, i.e., when res_count == 0.  (This also matches the condition
      that is reported by the controller with an interrupt.)
      Signed-off-by: NClemens Ladisch <clemens@ladisch.de>
      Cc: 2.6.36+ <stable@vger.kernel.org>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      0c0efbac
  20. 11 3月, 2012 2 次提交
  21. 31 1月, 2012 1 次提交
  22. 27 1月, 2012 1 次提交
  23. 16 1月, 2012 1 次提交