1. 25 2月, 2010 5 次提交
    • S
      firewire: ohci: fix IR/IT context mask mixup · 4802f16d
      Stefan Richter 提交于
      This bug was present in firewire-ohci since day one:  The number of
      available isochronous receive DMA contexts was mixed up with that of
      available isochronous transmit DMA contexts.
      
      This is harmless on a few chips which offer the same number of contexts
      in both directions, but most chips nowadays implement only the standard
      minimum of 4 IR contexts, but 8 IT contexts.  If a user attempted to run
      a lot of IR contexts at once, results with more than four were therefore
      unpredictable.  I suppose the controller would simply refuse to start
      DMA of any unimplemented context.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      4802f16d
    • S
      firewire: ohci: add module parameter to activate quirk fixes · 3e9cc2f3
      Stefan Richter 提交于
      This way, we can advise users of precompiled kernel packages to test
      existing quirk fixes on chips which have not been listed yet, without
      them having to build a kernel from source.
      
      Note, to use this feature on a machine with more than one controller,
      steps like these are necessary:
      # lspci | grep 1394
      # ls /sys/bus/pci/drivers/firewire_ohci/
      # echo -n "0000:03:02.0" > /sys/bus/pci/drivers/firewire_ohci/unbind
      # echo 2 > /sys/module/firewire_ohci/parameters/quirks
      # echo -n "0000:03:02.0" > /sys/bus/pci/drivers/firewire_ohci/bind
      # echo 0 > /sys/module/firewire_ohci/parameters/quirks
      
      The parameter can also be used to switch off quirk flags that were
      hardwired into firewire-ohci's quirks table.  Simply specify a non-zero
      quirks value but without any known flags, e.g. 0x100.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      3e9cc2f3
    • S
      firewire: ohci: use an ID table for quirks detection · 4a635593
      Stefan Richter 提交于
      We don't have a lot of quirks to take into account (especially since
      dual-buffer IR is out of the picture), but still, a table-based approach
      is more organized than a series of if () clauses.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      4a635593
    • S
      firewire: ohci: reorder struct fw_ohci for better cache efficiency · ecb1cf9c
      Stefan Richter 提交于
      The config_rom struct members are only accessed during relatively
      infrequent self-ID-complete interrupts and only if the local config ROM
      was changed, while the ar_, at_, ir_, it_ members are used very
      frequently during I/O.  Hence move the config_rom members further down.
      
      More importantly, make the huge self_id_buffer member the last one; this
      is only accessed in self-ID-complete interrupts.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      ecb1cf9c
    • S
      firewire: ohci: remove unused dualbuffer IR code · 6498ba04
      Stefan Richter 提交于
      This code was no longer used since 2.6.33, "firewire: ohci: always use
      packet-per-buffer mode for isochronous reception" commit 090699c0.  If
      anybody needs this code in the future for special purposes, it can be
      brought back in.  But it must not be re-enabled by default; drivers
      (kernelspace or userspace drivers) should only get this mode if they
      explicitly request it.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      6498ba04
  2. 21 2月, 2010 2 次提交
    • S
      firewire: remove incomplete Bus_Time CSR support · 168cf9af
      Stefan Richter 提交于
      The current implementation of Bus_Time read access was buggy since it
      did not ensure that Bus_Time.second_count_hi and second_count_lo came
      from the same 128 seconds period.
      Reported-by: NHåkan Johansson <f96hajo@chalmers.se>
      
      Instead of a fix, remove Bus_Time register support altogether.  The spec
      requires all cycle master capable nodes to implement this (all Linux
      nodes are cycle master capable) while it also says that it "may" be
      initialized by the bus manager or by the IRM standing in for a bus
      manager.  (Neither Linux' firewire-core nor ieee1394 nodemgr implement
      this.)
      
      Since we cannot rely on Bus_Time having been initialized by a bus
      manager, it is better to return an error instead of a nonsensical value
      on a read request to Bus_Time.
      
      Alternatively, we could fix the Bus_Time read integrity bug _and_
      implement (a) cycle master's write support of the register as well as
      (b) bus manager's Bus_Time initialization service, i.e. preservation of
      the Bus_Time when the cycle master node of a bus changes.  However, that
      would be quite some code for a feature that is unreliable to begin with
      and very likely unused in practice.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      168cf9af
    • S
      firewire: get_cycle_timer optimization and cleanup · 4a9bde9b
      Stefan Richter 提交于
      ohci:  Break out of the retry loop if too many attempts were necessary.
      This may theoretically happen if the chip is fatally defective or if the
      get_cycle_timer ioctl was performed after a CardBus controller was
      ejected.
      
      Also micro-optimize the loop by re-using the last two register reads in
      the next iteration, remove a questionable inline keyword, and shuffle a
      comment around.
      
      core:  ioctl_get_cycle_timer() is always called with interrupts on,
      therefore local_irq_save() can be replaced by local_irq_disable().
      Disabled local IRQs imply disabled preemption, hence preempt_disable()
      can be removed.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      4a9bde9b
  3. 20 2月, 2010 2 次提交
  4. 14 2月, 2010 1 次提交
    • C
      firewire: ohci: retransmit isochronous transmit packets on cycle loss · 7f51a100
      Clemens Ladisch 提交于
      In isochronous transmit DMA descriptors, link the skip address pointer
      back to the descriptor itself.  When a cycle is lost, the controller
      will send the packet in the next cycle, instead of terminating the
      entire DMA program.
      
      There are two reasons for this:
      
      * This behaviour is compatible with the old IEEE1394 stack.  Old
        applications would not expect the DMA program to stop in this case.
      
      * Since the OHCI driver does not report any uncompleted packets, the
        context would stop silently; clients would not have any chance to
        detect and handle this error without a watchdog timer.
      Signed-off-by: NClemens Ladisch <clemens@ladisch.de>
      
      Pieter Palmers notes:
      
      "The reason I added this retry behavior to the old stack is because some
      cards now and then fail to send a packet (e.g. the o2micro card in my
      dell laptop).  I couldn't figure out why exactly this happens, my best
      guess is that the card cannot fetch the payload data on time.  This
      happens much more frequently when sending large packets, which leads me
      to suspect that there are some contention issues with the DMA that fills
      the transmit FIFO.
      
      In the old stack it was a pretty critical issue as it resulted in a
      freeze of the userspace application.
      
      The omission of a packet doesn't necessarily have to be an issue.  E.g.
      in IEC61883 streams the DBC field can be used to detect discontinuities
      in the stream.  So as long as the other side doesn't bail when no
      [packet] is present in a cycle, there is not really a problem.
      
      I'm not convinced though that retrying is the proper solution, but it is
      simple and effective for what it had to do.  And I think there are no
      reasons not to do it this way.  Userspace can still detect this by
      checking the cycle the descriptor was sent in."
      
      Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> (changelog, comment)
      7f51a100
  5. 28 1月, 2010 1 次提交
  6. 11 1月, 2010 1 次提交
  7. 30 12月, 2009 1 次提交
    • S
      firewire: ohci: always use packet-per-buffer mode for isochronous reception · 090699c0
      Stefan Richter 提交于
      This is a minimal change meant for the short term:  Never set the
      ohci->use_dualbuffer flag to true.
      
      There are two reasons to do so:
      
        - Packet-per-buffer mode and dual-buffer mode do not behave the same
          under certain circumstances, notably if several packets are covered
          by a single fw_cdev_iso_packet descriptor.
          http://marc.info/?l=linux1394-devel&m=124965653718313
          Therefore the driver stack should not silently choose one or the
          other mode but should leave the choice to the high-level driver
          (regardless if kernel driver or userspace driver).  Or simply always
          only offer packet-per-buffer mode, since a considerable number of
          controllers, even current ones, does not offer dual-buffer support.
      
        - Even under circumstances where packet-per-buffer mode and
          dual-buffer mode behave exactly the same --- notably when used
          through libraw1394, libdc1394, as well as the current two kernel
          drivers which use isochronous reception (firewire-net and firedtv)
          --- we are still faced with the problem that several OHCI 1.1
          controllers have bugs in dual-buffer mode.  Although it looks like
          we have identified most of those buggy controllers by now, we
          cannot be quite sure about that.
      
      So, use packet-per-buffer by default from now on.  This change should
      be followed up by a more complete solution:  Either extend the
      in-kernel API and the userspace ABI by a choice between the two IR modes
      or remove all dual-buffer related code from firewire-ohci.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      090699c0
  8. 12 12月, 2009 1 次提交
  9. 21 11月, 2009 1 次提交
    • J
      firewire: ohci: pass correct iso xmit timestamps to core · 31769cef
      Jay Fenlason 提交于
      Here is the final set of patches I used to get ffado to work with the
      new firewire stack.  With these patches, I was able to start ardour
      and record from and playback to my PreSonus Inspire1394 from a
      (mostly) Fedora 12 system.
      Signed-off-by: NJay Fenlason <fenlason@redhat.com>
      
      Until now, firewire-ohci exposed only the transmit cycle of the last
      transmitted packet at each isochronous transmit complete event.  This
      made it impossible for FFADO (FireWire audio drivers in userspace) to
      synchronize audio-out streams.  The fix is to store the timestamp of
      each packet in the iso xmit event.  As a bonus, the transfer status is
      stored too.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      31769cef
  10. 19 11月, 2009 1 次提交
    • J
      firewire: ohci: Make cycleMatch ISO transmission work · 5ed1f321
      Jay Fenlason 提交于
      Calling the START_ISO ioctl with a nonnegative cycle paramater has
      never worked.  Last night I got around to figuring out why.  Most of
      this patch is a big comment explaining why we enable an interrupt
      source then don't actually do anything when we get one.  As the
      comment says, we should do more, but we don't have a way to tell
      userspace what happened. . .
      Signed-off-by: NJay Fenlason <fenlason@redhat.com>
      Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> (edited comment)
      5ed1f321
  11. 31 10月, 2009 1 次提交
    • S
      firewire: ohci: 0 may be a valid DMA address · 19593ffd
      Stefan Richter 提交于
      I was told that there are obscure architectures with non-coherent DMA
      which may DMA-map to bus address 0.  We shall not use 0 as a magic
      number of uninitialized bus address variables.
      
      The packet->payload_length > 0 test cannot be used either (except in
      at_context_queue_packet) because local requests are not DMA-mapped
      regardless of payload_length.  Hence add a state flag to struct
      fw_packet.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      19593ffd
  12. 15 10月, 2009 1 次提交
    • S
      firewire: optimize config ROM creation · 8e85973e
      Stefan Richter 提交于
      The config ROM image of the local node was created in CPU byte order,
      then a temporary big endian copy was created to compute the CRC, and
      finally the card driver created its own big endian copy.
      
      We now generate it in big endian byte order in the first place to avoid
      one byte order conversion and the temporary on-stack copy of the ROM
      image (1000 bytes stack usage in process context).  Furthermore, two
      1000 bytes memset()s are replaced by one 1000 bytes - ROM length sized
      memset.
      
      The trivial fw_memcpy_{from,to}_be32() helpers are now superfluous and
      removed.  The newly added __compute_block_crc() function will be folded
      into fw_compute_block_crc() in a subsequent change.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      8e85973e
  13. 12 9月, 2009 1 次提交
    • S
      firewire: ohci: fix Self ID Count register mask (safeguard against buffer overflow) · 928ec5f1
      Stefan Richter 提交于
      The selfIDSize field of Self ID Count is 9 bits wide, and we are only
      interested in the high 8 bits.  Fix the mask accordingly.  The
      previously too large mask didn't do damage though because the next few
      bits in the register are reserved and therefore zero with presently
      existing hardware.
      
      Also, check for the maximum possible self ID count of 252 (according to
      OHCI 1.1 clause 11.2 and IEEE 1394a-2000 clause 4.3.4.1, i.e. up to four
      self IDs of up to 63 nodes, even though IEEE 1394 up to edition 2008
      defines only up to three self IDs per node).  More than 252 self IDs
      would only happen if the self ID receive DMA unit malfunctioned, which
      would likely be caught by other self ID buffer checks.  However, check
      it early to be sure.  More than 253 quadlets would overflow the Topology
      Map CSR.
      
      Reported-By: PaX Team
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      928ec5f1
  14. 05 9月, 2009 2 次提交
  15. 05 6月, 2009 4 次提交
    • S
      firewire: rename source files · e71d31da
      Stefan Richter 提交于
      The source files of firewire-core, firewire-ohci, firewire-sbp2, i.e.
       "drivers/firewire/fw-*.c"
      are renamed to
       "drivers/firewire/core-*.c",
       "drivers/firewire/ohci.c",
       "drivers/firewire/sbp2.c".
      
      The old fw- prefix was redundant to the directory name.  The new core-
      prefix distinguishes the files according to which driver they belong to.
      
      This change comes a little late, but still before further firewire
      drivers are added as anticipated RSN.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      e71d31da
    • S
      firewire: reorganize header files · 77c9a5da
      Stefan Richter 提交于
      The three header files of firewire-core, i.e.
       "drivers/firewire/fw-device.h",
       "drivers/firewire/fw-topology.h",
       "drivers/firewire/fw-transaction.h",
      are replaced by
       "drivers/firewire/core.h",
       "include/linux/firewire.h".
      
      The latter includes everything which a firewire high-level driver (like
      firewire-sbp2) needs besides linux/firewire-constants.h, while core.h
      contains the rest which is needed by firewire-core itself and by low-
      level drivers (card drivers) like firewire-ohci.
      
      High-level drivers can now also reside outside of drivers/firewire
      without having to add drivers/firewire to the header file search path in
      makefiles.  At least the firedtv driver will be such a driver.
      
      I also considered to spread the contents of core.h over several files,
      one for each .c file where the respective implementation resides.  But
      it turned out that most core .c files will end up including most of the
      core .h files.  Also, the combined core.h isn't unreasonably big, and it
      will lose more of its contents to linux/firewire.h anyway soon when more
      firewire drivers are added.  (IP-over-1394, firedtv, and there are plans
      for one or two more.)
      
      Furthermore, fw-ohci.h is renamed to ohci.h.  The name of core.h and
      ohci.h is chosen with regard to name changes of the .c files in a
      follow-up change.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      77c9a5da
    • S
      firewire: clean up includes · e8ca9702
      Stefan Richter 提交于
      Include required headers which were only indirectly included.
      Remove unused includes and an unused constant.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      e8ca9702
    • S
      firewire: ohci: access bus_seconds atomically · 3dcdc500
      Stefan Richter 提交于
      In the unlikely event that card->driver->get_bus_time() is called during
      a cycle64Seconds interrupt, we could read garbage unless atomic accesses
      are used.
      
      The switch to atomic ops requires to change the 64 seconds counter from
      unsigned to signed, but this shouldn't matter to the end result.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      3dcdc500
  16. 25 3月, 2009 6 次提交
    • J
      firewire: implement asynchronous stream transmission · f8c2287c
      Jay Fenlason 提交于
      Allow userspace and other firewire drivers (fw-ipv4 I'm looking at
      you!) to send Asynchronous Transmit Streams as described in 7.8.3 of
      release 1.1 of the 1394 Open Host Controller Interface Specification.
      Signed-off-by: NJay Fenlason <fenlason@redhat.com>
      Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> (tweaks)
      f8c2287c
    • S
      firewire: normalize a variable name · e1eff7a3
      Stefan Richter 提交于
      Standardize on  if (err)
                              handle_error;
                 and  if (ret < 0)
                              handle_error;
      
      Don't call a variable err if we store values in it which mean success.
      Also, offset some return statements by a blank line since this how we do
      it in drivers/firewire.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      e1eff7a3
    • S
      firewire: prevent creation of multiple IR DMA contexts for the same channel · 4817ed24
      Stefan Richter 提交于
      OHCI-1394 1.1 clause 10.4.3 says:  "If more than one IR DMA context
      specifies receives for packets from the same isochronous channel, the
      context destination for that channel's packets is undefined."
      
      Any userspace client and in the future also kernelspace clients can
      allocate IR DMA contexts for any channel.  We don't want them to
      interfere with each other, hence it is preferable to return -EBUSY if
      allocation of a second context for a channel is attempted.
      
      Notes:
        - This limitation is OHCI-1394 specific, therefore its proper place of
          implementation is down in the low-level driver.
      
        - Since the <linux/firewire-cdev.h> ABI simply maps one userspace iso
          client context to one hardware iso context, this OHCI-1394
          limitation alas requires userspace to implement its own multiplexing
          of iso reception from the same channel and card to multiple clients
          when needed.
      
        - The limitation is independent of channel allocation at the IRM; the
          latter is really only important for the initiation of iso 
          transmission but not of iso reception.
      
        - We don't need to do the same for IT DMA because OHCI-1394 does not
          have any ties between IT contexts and channels.  Only the voluntary
          channel allocation protocol via the IRM, globally to the FireWire
          bus, can ensure proper isochronous transmit behaviour anyway.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      4817ed24
    • S
      firewire: remove line breaks before function names · 53dca511
      Stefan Richter 提交于
      type
          function_name(parameters);
      
      is nice to look at but was not used consistently.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      53dca511
    • S
      firewire: standardize a variable name · 2dbd7d7e
      Stefan Richter 提交于
      "ret" is the new "retval".
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      2dbd7d7e
    • D
      firewire: Include iso timestamp in headers when header_size > 4 · 1aa292bb
      David Moore 提交于
      Previously, when an iso context had header_size > 4, the iso header
      (len/tag/channel/tcode/sy) was passed to userspace followed by quadlets
      stripped from the payload.  This patch changes the behavior:
      header_size = 8 now passes the header quadlet followed by the timestamp
      quadlet.  When header_size > 8, quadlets are stripped from the payload.
      The header_size = 4 case remains identical.
      
      Since this alters the semantics of the API, the firewire API version
      needs to be bumped concurrently with this change.
      
      This change also refactors the header copying code slightly to be much
      easier to read.
      Signed-off-by: NDavid Moore <dcm@acm.org>
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      1aa292bb
  17. 24 1月, 2009 2 次提交
  18. 10 12月, 2008 1 次提交
  19. 31 10月, 2008 1 次提交
  20. 26 10月, 2008 2 次提交
  21. 27 7月, 2008 1 次提交
    • F
      dma-mapping: add the device argument to dma_mapping_error() · 8d8bb39b
      FUJITA Tomonori 提交于
      Add per-device dma_mapping_ops support for CONFIG_X86_64 as POWER
      architecture does:
      
      This enables us to cleanly fix the Calgary IOMMU issue that some devices
      are not behind the IOMMU (http://lkml.org/lkml/2008/5/8/423).
      
      I think that per-device dma_mapping_ops support would be also helpful for
      KVM people to support PCI passthrough but Andi thinks that this makes it
      difficult to support the PCI passthrough (see the above thread).  So I
      CC'ed this to KVM camp.  Comments are appreciated.
      
      A pointer to dma_mapping_ops to struct dev_archdata is added.  If the
      pointer is non NULL, DMA operations in asm/dma-mapping.h use it.  If it's
      NULL, the system-wide dma_ops pointer is used as before.
      
      If it's useful for KVM people, I plan to implement a mechanism to register
      a hook called when a new pci (or dma capable) device is created (it works
      with hot plugging).  It enables IOMMUs to set up an appropriate
      dma_mapping_ops per device.
      
      The major obstacle is that dma_mapping_error doesn't take a pointer to the
      device unlike other DMA operations.  So x86 can't have dma_mapping_ops per
      device.  Note all the POWER IOMMUs use the same dma_mapping_error function
      so this is not a problem for POWER but x86 IOMMUs use different
      dma_mapping_error functions.
      
      The first patch adds the device argument to dma_mapping_error.  The patch
      is trivial but large since it touches lots of drivers and dma-mapping.h in
      all the architecture.
      
      This patch:
      
      dma_mapping_error() doesn't take a pointer to the device unlike other DMA
      operations.  So we can't have dma_mapping_ops per device.
      
      Note that POWER already has dma_mapping_ops per device but all the POWER
      IOMMUs use the same dma_mapping_error function.  x86 IOMMUs use device
      argument.
      
      [akpm@linux-foundation.org: fix sge]
      [akpm@linux-foundation.org: fix svc_rdma]
      [akpm@linux-foundation.org: build fix]
      [akpm@linux-foundation.org: fix bnx2x]
      [akpm@linux-foundation.org: fix s2io]
      [akpm@linux-foundation.org: fix pasemi_mac]
      [akpm@linux-foundation.org: fix sdhci]
      [akpm@linux-foundation.org: build fix]
      [akpm@linux-foundation.org: fix sparc]
      [akpm@linux-foundation.org: fix ibmvscsi]
      Signed-off-by: NFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
      Cc: Muli Ben-Yehuda <muli@il.ibm.com>
      Cc: Andi Kleen <andi@firstfloor.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Avi Kivity <avi@qumranet.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      8d8bb39b
  22. 25 7月, 2008 1 次提交
  23. 14 7月, 2008 1 次提交