25 Mar, 2009

40 commits

  • Cache the test result of whether a device implements BROADCAST_CHANNEL.
    This minimizes traffic on the bus after each bus reset. A majority of
    devices does not implement BROADCAST_CHANNEL.

    Remove busy retries; just rely on the hardware to retry requests to busy
    responders. Remove unnecessary log messages.

    Rename the flag is_irm to broadcast_channel_allocated to better reflect
    its meaning. Reset the flag earlier in fw_core_handle_bus_reset.

    Pass the generation down as a call parameter; that way generation can't
    be newer than card->broadcast_channel_allocated and device->node_id.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • fw-iso.c has channel allocation code now, use it.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Per IEEE 1394 clause 8.4.2.5, bus manager capable nodes which are not
    incumbent shall wait at least 125ms before trying to establish
    themselves as bus manager.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • All callers inserted NULL and 0 here.

    Signed-off-by: Stefan Richter

    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: Stefan Richter

    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: Stefan Richter

    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: Stefan Richter

    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: Stefan Richter

    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: Stefan Richter

    Stefan Richter
     
  • This patch adds the ISO broadcast channel support that is required of a
    1394a IRM. In specific, if the local device the IRM, it allocates ISO
    channel 31 and sets the broadcast channel register of all devices on the
    local bus to BROADCAST_CHANNEL_INITIAL | BROADCAST_CHANNEL_VALID to indicate
    that channel 31 can be use for broadcast messages.

    One minor complication is that on startup the local device may become IRM
    before all the devices on the bus have been enumerated by the stack. Therefore
    we have to keep a "the local device is IRM" flag and possibly set the
    broadcast channel register of new devices at enumeration time.

    Signed-off-by: Jay Fenlason
    Signed-off-by: Stefan Richter

    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: Jay Fenlason
    Signed-off-by: Stefan Richter (tweaks)

    Jay Fenlason
     
  • It's called "payload" rather than "data" almost everywhere in
    fw-transaction.c.

    Signed-off-by: Stefan Richter

    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: Stefan Richter

    Stefan Richter
     
  • reread_bus_info_block() only gets to see devices whose config_rom_length
    is at least 6 (ROM header, bus info block, root directory header).

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Signed-off-by: Stefan Richter

    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: Stefan Richter

    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: Stefan Richter

    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: Stefan Richter

    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: Stefan Richter

    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: Stefan Richter

    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: Stefan Richter

    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
    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: Stefan Richter

    Jay Fenlason, 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: Stefan Richter

    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: Stefan Richter

    Stefan Richter
     
  • Based on
    Date: Tue, 18 Nov 2008 11:41:27 -0500
    From: Jay Fenlason
    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: Stefan Richter
    Tested-by: David Moore

    Jay Fenlason, Stefan Richter
     
  • Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Signed-off-by: Stefan Richter

    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: Stefan Richter

    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: Stefan Richter
    Reviewed-by: David Moore

    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 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: Stefan Richter

    Stefan Richter
     
  • Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Signed-off-by: Stefan Richter

    Stefan Richter
     
  • type
    function_name(parameters);

    is nice to look at but was not used consistently.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • "ret" is the new "retval".

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • This code never changes.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Like before my commit 1415d9189e8c59aa9c77a3bba419dcea062c145f,
    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: Stefan Richter

    Stefan Richter
     
  • 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: Jay Fenlason

    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: Stefan Richter

    Jay Fenlason
     
  • 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: Stefan Richter

    Stefan Richter