1. 21 2月, 2010 1 次提交
    • 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
  2. 30 12月, 2009 2 次提交
    • S
      firewire: cdev: fix another memory leak in an error path · cf0e575d
      Stefan Richter 提交于
      If copy_from_user in an FW_CDEV_IOC_SEND_RESPONSE ioctl failed, the
      fw_request pointed to by the inbound_transaction_resource is no
      longer referenced and needs to be freed.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      cf0e575d
    • C
      firewire: fix use of multiple AV/C devices, allow multiple FCP listeners · db5d247a
      Clemens Ladisch 提交于
      Control of more than one AV/C device at once --- e.g. camcorders, tape
      decks, audio devices, TV tuners --- failed or worked only unreliably,
      depending on driver implementation.  This affected kernelspace and
      userspace drivers alike and was caused by firewire-core's inability to
      accept multiple registrations of FCP listeners.
      
      The fix allows multiple address handlers to be registered for the FCP
      command and response registers.  When a request for these registers is
      received, all handlers are invoked, and the Firewire response is
      generated by the core and not by any handler.
      
      The cdev API does not change, i.e., userspace is still expected to send
      a response for FCP requests; this response is silently ignored.
      Signed-off-by: NClemens Ladisch <clemens@ladisch.de>
      Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> (changelog, rebased, whitespace)
      db5d247a
  3. 31 10月, 2009 1 次提交
  4. 15 10月, 2009 3 次提交
  5. 05 10月, 2009 1 次提交
  6. 26 6月, 2009 1 次提交
    • S
      firewire: core: do not DMA-map stack addresses · 6fdc0370
      Stefan Richter 提交于
      The DMA mapping API cannot map on-stack addresses, as explained in
      Documentation/DMA-mapping.txt.  Convert the two cases of on-stack packet
      payload buffers in firewire-core (payload of lock requests in the bus
      manager work and in iso resource management) to slab-allocated memory.
      
      There are a number on-stack buffers for quadlet write or quadlet read
      requests in firewire-core and firewire-sbp2.  These are harmless; they
      are copied to/ from card driver internal DMA buffers since quadlet
      payloads are inlined with packet headers.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      6fdc0370
  7. 07 6月, 2009 1 次提交
  8. 05 6月, 2009 2 次提交
    • 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
  9. 17 5月, 2009 1 次提交
    • S
      firewire: core: improve check for local node · 92368890
      Stefan Richter 提交于
      My recently added test for a device being local in fw-cdev.c got it
      slightly wrong:  Comparisons of node IDs are only valid if the
      generation is current, which I forgot to check.  Normally, serialization
      by card->lock takes care of this, but a device in FW_DEVICE_GONE state
      will necessarily have a wrong generation and invalid node_id.
      
      The "is it local?" check is made 100% correct and simpler now by means
      of a struct fw_device flag which is set at fw_device creation.
      
      Besides the fw-cdev site which was to be fixed, there is another site
      which can make use of the new flag, and an RFC-2734 driver will benefit
      from it too.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      92368890
  10. 25 3月, 2009 27 次提交
    • S
      firewire: cdev: add closure to async stream ioctl · 18e9b10f
      Stefan Richter 提交于
      This changes the as yet unreleased FW_CDEV_IOC_SEND_STREAM_PACKET ioctl
      to generate an fw_cdev_event_response event just like the other two
      ioctls for asynchronous request transmission do.  This way, clients get
      feedback on successful or unsuccessful transmission.
      
      This also adds input validation for length, tag, channel, sy, speed.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      18e9b10f
    • S
      firewire: cdev: simplify FW_CDEV_IOC_SEND_REQUEST return value · 664d8010
      Stefan Richter 提交于
      This changes the ioctl() return value of FW_CDEV_IOC_SEND_REQUEST and of
      the as yet unreleased FW_CDEV_IOC_SEND_BROADCAST_REQUEST.  They used to
      return
      	sizeof(struct fw_cdev_send_request *) + data_length
      
      which is obviously a failed attempt to emulate the return value of
      raw1394's respective interface which uses write() instead of ioctl().
      
      However, the first summand, as size of a kernel pointer, is entirely
      meaningless to clients and the second summand is already known to
      clients.  And the result does not resemble raw1394's write() return
      code anyway.
      
      So simplify it to a constant non-negative value, i.e. 0.  The only
      dangers here would be that future client implementations check for error
      by ret != 0 instead of ret < 0 when running on top of an old kernel; or
      that current clients interpret ret = 0 or more as failure.  But both are
      hypothetical cases which don't justify to return irritating values.
      
      While we touch this code, also remove "& 0x1f" from tcode in the call of
      fw_send_request.  The tcode cannot be bigger than 0x1f at this point.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      664d8010
    • S
      firewire: cdev: fix race of ioctl_send_request with bus reset · 207fbefb
      Stefan Richter 提交于
      The bus reset handler concurrently frees client->device->node.  Use
      device->node_id instead.  This is equivalent to device->node->node_id
      while device->generation is current.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      207fbefb
    • S
      firewire: cdev: secure add_descriptor ioctl · de487da8
      Stefan Richter 提交于
      The access permissions and ownership or ACL of /dev/fw* character device
      files will typically be set based on the device type of the respective
      nodes, as obtained by firewire-core from descriptors in the device's
      configuration ROM.  An example policy is to deny write permission by
      default but grant write permission to files of AV/C video and audio
      devices and IIDC video devices.
      
      The FW_CDEV_IOC_ADD_DESCRIPTOR ioctl could be used to partly subvert
      such a policy:  Find a device file with relaxed permissions, use the
      ioctl to add a descriptor with AV/C marker to the local node's ROM, thus
      gain access to the local node's character device file.  (This is only
      possible if there are udev scripts installed which actively relax
      permissions for known device types and if there is a device of such a
      type connected.)
      
      Accessibility of the local node's device file is relevant to host
      security if the host contains two or more IEEE 1394 link layer
      controllers which are plugged into a single bus.
      
      Therefore change the ABI to deny FW_CDEV_IOC_ADD_DESCRIPTOR if the file
      belongs to a remote node.  (This change has no impact on known
      implementers of the ABI:  None of them uses the ioctl yet.)
      
      Also clarify the documentation:  The ioctl affects all local nodes, not
      just one local node.
      
      Cc: stable@kernel.org
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      de487da8
    • S
      firewire: cdev: amendment to "add ioctl to query maximum transmission speed" · c8a25900
      Stefan Richter 提交于
      The as yet unreleased FW_CDEV_IOC_GET_SPEED ioctl puts only a single
      integer into the parameter buffer.  We can use ioctl()'s return value
      instead.
      
      (Also: Some whitespace change in firewire-cdev.h.)
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      c8a25900
    • 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: cdev: simplify a schedule_delayed_work wrapper · 81610b8f
      Stefan Richter 提交于
      The kernel API documentation says that queue_delayed_work() returns 0
      (only) if the work was already queued.  The return codes of
      schedule_delayed_work() are not documented but the same.
      
      In init_iso_resource(), the work has never been queued yet, hence we
      can assume schedule_delayed_work() to be a guaranteed success there.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      81610b8f
    • S
      firewire: cdev: add ioctls for iso resource management, amendment · 5d9cb7d2
      Stefan Richter 提交于
      Some fixes:
        - Remove stale documentation.
        - Fix a != vs. == thinko that got in the way of channel management.
        - Try bandwidth deallocation even if channel deallocation failed.
      
      A simplification:
        - fw_cdev_allocate_iso_resource.channels is now ordered like
          libdc1394's dc1394_iso_allocate_channel() channels_allowed
          argument.
      
      By the way, I looked closer at cards from NEC, TI, and VIA, and noticed
      that they all don't implement IEEE 1394a behaviour which is meant to
      deviate from IEEE 1212's notion of lock compare-swap.  This means that
      we have to do two lock transactions instead of one in many cases where
      one transaction would already succeed on a fully 1394a compliant IRM.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      5d9cb7d2
    • S
      firewire: cdev: shut down iso context before freeing the buffer · 36a755cf
      Stefan Richter 提交于
      DMA must be halted before we DMA-unmap and free the DMA buffer.  Since
      we cannot rely on the client to stop the context before it closes the
      fd, we have to reorder fw_iso_buffer_destroy vs. fw_iso_context_destroy.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      36a755cf
    • S
      firewire: cdev: replace some spin_lock_irqsave by spin_lock_irq · 3ba94986
      Stefan Richter 提交于
      All of these functions are entered with IRQs enabled.
      Hence the unconditional spin_unlock_irq can be used.
      
      Function:                  Caller context:
          dequeue_event()            client process, via read(2)
          fill_bus_reset_event()     fw-device.c update worqueue job
          release_client_resource()  client process, via ioctl(2)
          fw_device_op_release()     client process, via close(2)
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      3ba94986
    • S
      firewire: cdev: extend transaction payload size check · 5d3fd692
      Stefan Richter 提交于
      Make the size check of ioctl_send_request and
      ioctl_send_broadcast_request speed dependent.  Also change the error
      return code from -EINVAL to -EIO to distinguish this from other errors
      concerning the ioctl parameters.
      
      Another payload size limit for which we don't check here though is the
      remote node's Bus_Info_Block.max_rec.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      5d3fd692
    • S
      firewire: cdev: restrict broadcast write requests to Units Space · 1566f3dc
      Stefan Richter 提交于
      We don't want random users write to Memory Space (e.g. PCs with physical
      DMA filters down) or to core CSRs like Reset_Start.
      
      This does not protect SBP-2 target CSRs.  But properly behaving SBP-2
      targets ignore broadcast write requests to these registers, and the
      maximum damage which can happen with laxer targets is DOS.  But there
      are ways to create DOS situations anyway if there are devices with weak
      device file permissions (like audio/video devices) present at the same
      bus as an SBP-2 target.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      1566f3dc
    • J
      firewire: cdev: add ioctl for broadcast write requests · acfe8333
      Jay Fenlason, Stefan Richter 提交于
      Write transactions to the broadcast node ID are a convenient way to
      trigger functions of multiple nodes at once.  IIDC is a protocol which
      can make use of this if multiple cameras with same command_regs_base are
      connected at the same bus.
      
      Based on
          Date: Wed, 10 Sep 2008 11:32:16 -0400
          From: Jay Fenlason <fenlason@redhat.com>
          Subject: [patch] SEND_BROADCAST_REQUEST
      Changes:  ioctl_send_request() and ioctl_send_broadcast_request() now
      share code.  Broadcast speed corrected to S100.  Check for proper tcode.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      acfe8333
    • S
      firewire: cdev: add ioctl to query maximum transmission speed · 33580a3e
      Stefan Richter 提交于
      While the speed of asynchronous transactions is automatically chosen by
      the kernel, the speed of isochronous streams has to be chosen by the
      initiating client.
      
      In case of 1394a bus topologies, the maximum possible speed could be
      figured out with some effort by evaluation of the remote node's link
      speed field in the config ROM, the local node's link speed field, and
      the PHY speeds and topologic information in the local node's or IRM's
      topology map CSR.  However, this does not work in case of 1394b buses.
      
      Hence add an ioctl to export the maximum speed which the kernel already
      determined.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      33580a3e
    • S
      firewire: cdev: add ioctls for manual iso resource management · 1ec3c026
      Stefan Richter 提交于
      This adds ioctls for allocation and deallocation of a channel or/and
      bandwidth without auto-reallocation and without auto-deallocation.
      
      The benefit of these ioctls is that libraw1394-style isochronous
      resource management can be implemented without write access to the IRM's
      character device file.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      1ec3c026
    • J
      firewire: cdev: add ioctls for isochronous resource management · b1bda4cd
      Jay Fenlason, Stefan Richter 提交于
      Based on
          Date: Tue, 18 Nov 2008 11:41:27 -0500
          From: Jay Fenlason <fenlason@redhat.com>
          Subject: [Patch V4] Add ISO resource management support
      with several changes to the ABI and implementation.  Only the part of
      the ABI which enables auto-reallocation and auto-deallocation is
      included here.
      
      This implements ioctls for kernel-assisted allocation of isochronous
      channels and isochronous bandwidth.  The benefits are:
        - The client does not have to have write access to the /dev/fw* device
          corresponding to the IRM.
        - The client does not have to perform reallocation after bus resets.
        - Channel and bandwidth are deallocated by the kernel if the file is
          closed before the client deallocated the resources.  Thus resources
          are released even if the client crashes.
      
      It is anticipated that future in-kernel code (firewire-core IRM code;
      the firewire port of firedtv), will use the fw-iso.c portions of this
      code too.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      Tested-by: NDavid Moore <dcm@acm.org>
      b1bda4cd
    • S
      firewire: cdev: sort includes · be5bbd67
      Stefan Richter 提交于
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      be5bbd67
    • S
      firewire: cdev: unify names of struct types and of their instances · 97c18b7f
      Stefan Richter 提交于
      to indicate that they are specializations of struct event or of struct
      client_resource, respectively.
      
      struct response was both an event and a client_resource; it is now split
      into struct outbound_transaction_resource and ~_event in order to
      document more explicitly which types of client resources exist.
      
      struct request and struct_request_event are renamed to struct
      inbound_transaction_resource and ~_event because requests and responses
      occur in outbound and in inbound transactions.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      97c18b7f
    • S
      firewire: cdev: reference-count client instances · fb443036
      Stefan Richter 提交于
      The lifetime of struct client instances must be longer than the lifetime
      of any client resource.
      
      This fixes a possible race between fw_device_op_release and transaction
      completions.  It also prepares for new ioctls for isochronous resource
      management which will involve delayed processing of client resources.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      Reviewed-by: NDavid Moore <dcm@acm.org>
      fb443036
    • S
      firewire: cdev: use list_first_entry · a459b8ab
      Stefan Richter 提交于
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      a459b8ab
    • 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
    • S
      firewire: cdev: address handler input validation · 3e0b5f0d
      Stefan Richter 提交于
      Like before my commit 1415d918,
      fw_core_add_address_handler() does not align the address region now.
      Instead the caller is required to pass valid parameters.
      
      Since one of the callers of fw_core_add_address_handler() is the cdev
      userspace interface, we now check for valid input.  If the client is
      buggy, we give it a hint with -EINVAL.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      3e0b5f0d
    • J
      firewire: cdev: use an idr rather than a linked list for resources · 45ee3199
      Jay Fenlason 提交于
      The current code uses a linked list and a counter for storing
      resources and the corresponding handle numbers.  By changing to an idr
      we can be safe from counter wrap-around giving two resources the same
      handle.
      
      Furthermore, the deallocation ioctls now check whether the resource to
      be freed is of the intended type.
      Signed-off-by: NJay Fenlason <fenlason@redhat.com>
      
      Some rework by Stefan R:
        - The idr API documentation says we get an ID within 0...0x7fffffff.
          Hence we can rest assured that idr handles fit into cdev handles.
        - Fix some races.  Add a client->in_shutdown flag for this purpose.
        - Add allocation retry to add_client_resource().
        - It is possible to use idr_for_each() in fw_device_op_release().
        - Fix ioctl_send_response() regression.
        - Small style changes.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      45ee3199
    • S
      firewire: cdev: fix race of fw_device_op_release with bus reset · 97811e34
      Stefan Richter 提交于
      Unlink the client from the fw_device earlier in order to prevent bus
      reset events being added to client->event_list during shutdown.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      97811e34
    • S
      firewire: cdev: tcodes input validation · 1f3125af
      Stefan Richter 提交于
      The behaviour of fw-transaction.c::fw_send_request is ill-defined for
      any other tcodes than read/ write/ lock request tcodes.  Therefore
      prevent requests with wrong tcodes from entering the transaction layer.
      
      Maybe fw_send_request should check them itself, but I am not inclined to
      change it and fw_fill_request from void-valued functions to ones which
      return error codes and pass those up.  Besides, maybe fw_send_request is
      going to support one more tcode than ioctl_send_request in the future
      (TCODE_STREAM_DATA).
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      1f3125af
    • S
      firewire: convert client_list_lock to mutex · d67cfb96
      Stefan Richter 提交于
      So far it is only taken in non-atomic contexts.
      Signed-off-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
      d67cfb96