27 Jul, 2011

1 commit

  • This allows us to move duplicated code in
    (atomic_inc_not_zero() for now) to

    Signed-off-by: Arun Sharma
    Reviewed-by: Eric Dumazet
    Cc: Ingo Molnar
    Cc: David Miller
    Cc: Eric Dumazet
    Acked-by: Mike Frysinger
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Arun Sharma
     

11 May, 2011

4 commits

  • The struct sbp2_logical_unit.work items can all be executed in parallel
    but are not reentrant. Furthermore, reconnect or re-login work must be
    executed in a WQ_MEM_RECLAIM workqueue.

    Hence replace the old single-threaded firewire-sbp2 workqueue by a
    concurrency-managed but non-reentrant workqueue with rescuer.
    firewire-core already maintains one, hence use this one.

    In earlier versions of this change, I observed occasional failures of
    parallel INQUIRY to an Initio INIC-2430 FireWire 800 to dual IDE bridge.
    More testing indicates that parallel INQUIRY is not actually a problem,
    but too quick successions of logout and login + INQUIRY, e.g. a quick
    sequence of cable plugout and plugin, can result in failed INQUIRY.
    This does not seem to be something that should or could be addressed by
    serialization.

    Another dual-LU device to which I currently have access to, an
    OXUF924DSB FireWire 800 to dual SATA bridge with firmware from MacPower,
    has been successfully tested with this too.

    This change is beneficial to environments with two or more FireWire
    storage devices, especially if they are located on the same bus.
    Management tasks that should be performed as soon and as quickly as
    possible, especially reconnect, are no longer held up by tasks on other
    devices that may take a long time, especially login with INQUIRY and sd
    or sr driver probe.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • firewire-core manages the following types of work items:

    fw_card.br_work:
    - resets the bus on a card and possibly sends a PHY packet before that
    - does not sleep for long or not at all
    - is scheduled via fw_schedule_bus_reset() by
    - firewire-ohci's pci_probe method
    - firewire-ohci's set_config_rom method, called by kernelspace
    protocol drivers and userspace drivers which add/remove
    Configuration ROM descriptors
    - userspace drivers which use the bus reset ioctl
    - itself if the last reset happened less than 2 seconds ago

    fw_card.bm_work:
    - performs bus management duties
    - usually does not (but may in corner cases) sleep for long
    - is scheduled via fw_schedule_bm_work() by
    - firewire-ohci's self-ID-complete IRQ handler tasklet
    - firewire-core's fw_device.work instances whenever the root node
    device was (successfully or unsuccessfully) discovered,
    refreshed, or rediscovered
    - itself in case of resource allocation failures or in order to
    obey the 125ms bus manager arbitration interval

    fw_device.work:
    - performs node probe, update, shutdown, revival, removal; including
    kernel driver probe, update, shutdown and bus reset notification to
    userspace drivers
    - usually sleeps moderately long, in corner cases very long
    - is scheduled by
    - firewire-ohci's self-ID-complete IRQ handler tasklet via the
    core's fw_node_event
    - firewire-ohci's pci_remove method via core's fw_destroy_nodes/
    fw_node_event
    - itself during retries, e.g. while a node is powering up

    iso_resource.work:
    - accesses registers at the Isochronous Resource Manager node
    - usually does not (but may in corner cases) sleep for long
    - is scheduled via schedule_iso_resource() by
    - the owning userspace driver at addition and removal of the
    resource
    - firewire-core's fw_device.work instances after bus reset
    - itself in case of resource allocation if necessary to obey the
    1000ms reallocation period after bus reset

    fw_card.br_work instances should not, and instances of the others must
    not, be executed in parallel by multiple CPUs -- but were not protected
    against that. Hence allocate a non-reentrant workqueue for them.

    fw_device.work may be used in the memory reclaim path in case of SBP-2
    device updates. Hence we need a workqueue with rescuer and cannot use
    system_nrt_wq.

    Signed-off-by: Stefan Richter
    Reviewed-by: Tejun Heo

    Stefan Richter
     
  • When queueing iso packets, the run time is dominated by the two
    MMIO accesses that set the DMA context's wake bit. Because most
    drivers submit packets in batches, we can save much time by
    removing all but the last wakeup.

    The internal kernel API is changed to require a call to
    fw_iso_context_queue_flush() after a batch of queued packets.
    The user space API does not change, so one call to
    FW_CDEV_IOC_QUEUE_ISO must specify multiple packets to take
    advantage of this optimization.

    In my measurements, this patch reduces the time needed to queue
    fifty skip packets from userspace to one sixth on a 2.5 GHz CPU,
    or to one third at 800 MHz.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     
  • We do not need slab allocations anymore in order to satisfy
    streaming DMA mapping constraints, thanks to commit da28947e7e36
    "firewire: ohci: avoid separate DMA mapping for small AT payloads".

    (Besides, the slab-allocated buffers that firewire-core, firewire-sbp2,
    and firedtv used to provide for 8-byte write and lock requests were
    still not fully portable since they crossed cacheline boundaries or
    shared a cacheline with unrelated CPU-accessed data. snd-firewire-lib
    got this aspect right by using an extra kmalloc/ kfree just for the
    8-byte transaction buffer.)

    This change replaces kmalloc'ed lock transaction scratch buffers in
    firewire-core, firedtv, and snd-firewire-lib by local stack allocations.
    Perhaps the most notable result of the change is simpler locking because
    there is no need to serialize usages of preallocated per-device buffers
    anymore. Also, allocations and deallocations are simpler.

    Signed-off-by: Stefan Richter
    Acked-by: Clemens Ladisch

    Stefan Richter
     

20 Mar, 2011

1 commit

  • The SPLIT_TIMEOUT mechanism is intended to detect requests that somehow
    got lost. However, when the timeout value is too low, transactions that
    could have been completed successfully will be cancelled. Furthermore,
    there are chips whose firmwares ignore the configured split timeout and
    send late split response; known examples are the DM1x00 (BeBoB), TCD22x0
    (DICE), and some OXUF936QSE firmwares.

    This patch changes the default timeout to two seconds, which happens to
    be the default on other OSes, too.

    Actual lost requests are extremely rare, so there should be no practical
    downside to increasing the split timeout even on devices that work
    correctly.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     

23 Jan, 2011

1 commit

  • On a 32-bit machine with, e.g., HZ=1000, jiffies will overflow after
    about 50 days, so if there are between 25 and 50 days between bus
    resets, the card->reset_jiffies comparisons can get wrong results.

    To fix this, ensure that this timestamp always uses 64 bits.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: "Stefan Richter"

    Clemens Ladisch
     

21 Jan, 2011

1 commit

  • Regression since commit 10389536742c, "firewire: core: check for 1394a
    compliant IRM, fix inaccessibility of Sony camcorder":

    The camcorder Canon MV5i generates lots of bus resets when asynchronous
    requests are sent to it (e.g. Config ROM read requests or FCP Command
    write requests) if the camcorder is not root node. This causes drop-
    outs in videos or makes the camcorder entirely inaccessible.
    https://bugzilla.redhat.com/show_bug.cgi?id=633260

    Fix this by allowing any Canon device, even if it is a pre-1394a IRM
    like MV5i are, to remain root node (if it is at least Cycle Master
    capable). With the FireWire controller cards that I tested, MV5i always
    becomes root node when plugged in and left to its own devices.

    Reported-by: Ralf Lange
    Signed-off-by: Stefan Richter
    Cc: # 2.6.32.y and newer

    Stefan Richter
     

02 Aug, 2010

2 commits


23 Jul, 2010

2 commits

  • Add an FW_CDEV_IOC_RECEIVE_PHY_PACKETS ioctl() and
    FW_CDEV_EVENT_PHY_PACKET_RECEIVED poll()/read() event for /dev/fw*.
    This can be used to get information from remote PHYs by remote access
    PHY packets.

    This is also the 2nd half of the functionality (the receive part) to
    support a userspace implementation of a VersaPHY transaction layer.

    Safety considerations:

    - PHY packets are generally broadcasts, hence some kind of elevated
    privileges should be required of a process to be able to listen in
    on PHY packets. This implementation assumes that a process that is
    allowed to open the /dev/fw* of a local node does have this
    privilege.

    There was an inconclusive discussion about introducing POSIX
    capabilities as a means to check for user privileges for these
    kinds of operations.

    Other limitations:

    - PHY packet reception may be switched on by ioctl() but cannot be
    switched off again. It would be trivial to provide an off switch,
    but this is not worth the code. The client should simply close()
    the fd then, or just ignore further events.

    - For sake of simplicity of API and kernel-side implementation, no
    filter per packet content is provided.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • core-transaction.c transmit_complete_callback() and close_transaction()
    expect packet callback status to be an ACK or RCODE, and ACKs get
    translated to RCODEs for transaction callbacks.

    An old comment on the packet callback API (been there from the initial
    submission of the stack) and the dummy_driver implementation of
    send_request/send_response deviated from this as they also included
    -ERRNO in the range of status values.

    Let's narrow status values down to ACK and RCODE to prevent surprises.
    RCODE_CANCELLED is chosen as the dummy_driver's RCODE as its meaning of
    "transaction timed out" comes closest to what happens when a transaction
    coincides with card removal.

    Signed-off-by: Stefan Richter

    Stefan Richter
     

13 Jul, 2010

1 commit

  • Bus resets which are triggered
    - by the kernel drivers after updates of the local nodes' config ROM,
    - by userspace software via ioctl
    shall be deferred until after >=2 seconds after the last bus reset.

    If multiple modifications of the local nodes' config ROM happen in a row,
    only a single bus reset should happen after them.

    When the local node's link goes from inactive to active or vice versa,
    and at the two occasions of bus resets mentioned above --- and if the
    current gap count differs from 63 --- the bus reset should be preceded
    by a PHY configuration packet that reaffirms the gap count. Otherwise a
    bus manager would have to reset the bus again right after that.

    This is necessary to promote bus stability, e.g. leave grace periods for
    allocations and reallocations of isochronous channels and bandwidth,
    SBP-2 reconnections etc.; see IEEE 1394 clause 8.2.1.

    This change implements all of the above by moving bus reset initiation
    into a delayed work (except for bus resets which are triggered by the
    bus manager workqueue job and are performed there immediately). It
    comes with a necessary addition to the card driver methods that allows
    to get the current gap count from PHY registers.

    Signed-off-by: Stefan Richter

    Stefan Richter
     

08 Jul, 2010

2 commits


19 Jun, 2010

1 commit

  • In case of fw_card_bm_work()'s lock request, the present sizeof
    expression is going to be wrong if somebody changes the fw_card's DMA
    scratch buffer's size in the future.

    In case of quadlet write requests, sizeof(u32) is just silly; it's 4.

    In case of SBP-2 ORB pointer write requests, 8 is arguably quicker to
    understand as the correct and only possible value than
    sizeof(some_datum).

    Signed-off-by: Stefan Richter

    Stefan Richter
     

10 Jun, 2010

5 commits

  • As part of the bus manager responsibilities, make sure that the cycle
    master sends cycle start packets. This is needed when the old bus
    manager disabled the cycle master's cmstr bit and there are iso-capable
    nodes on the new bus.

    Signed-off-by: Clemens Ladisch

    Clemens Ladisch
     
  • On OHCI 1.1 controllers, let the hardware allocate the broadcast channel
    automatically. This removes a theoretical race condition directly after
    a bus reset where it could be possible to read the channel allocation
    register with channel 31 still being unallocated.

    Signed-off-by: Clemens Ladisch

    Clemens Ladisch
     
  • Implement the abdicate bit, which is required for bus manager
    capable nodes and tested by the Base 1394 Test Suite.

    Finally, something to do at a command reset! :-)

    Signed-off-by: Clemens Ladisch

    Clemens Ladisch
     
  • Implement the SPLIT_TIMEOUT registers. Besides being required by the
    spec, this is desirable for some IIDC devices and necessary for many
    audio devices to be able to increase the timeout from userspace.

    Signed-off-by: Clemens Ladisch

    Clemens Ladisch
     
  • When the candidate bus manager fails to do the lock request with which
    it tries to become bus manager, it assumes that the current IRM is not
    actually IRM capable and forces itself to become root. However, if that
    lock request failed because the local node itself was not able to send
    it, then we cannot blame the current IRM and should not steal its
    rootness.

    In this case, RCODE_SEND_ERROR is likely to indicate a temporary error
    condition such as exhausted tlabels or low memory, so we better try
    again later.

    Signed-off-by: Clemens Ladisch

    Clemens Ladisch
     

03 Jun, 2010

1 commit

  • Per IEEE 1394 clause 8.4.2.3, a contender for the IRM role shall check
    whether the current IRM complies to 1394a-2000 or later. If not force a
    compliant node (e.g. itself) to become IRM. This was implemented in the
    older ieee1394 driver but not yet in firewire-core.

    An older Sony camcorder (Sony DCR-TRV25) which implements 1394-1995 IRM
    but neither 1394a-2000 IRM nor BM was now found to cause an
    interoperability bug:
    - Camcorder becomes root node when plugged in, hence gets IRM role.
    - firewire-core successfully contends for BM role, proceeds to perform
    gap count optimization and resets the bus.
    - Sony camcorder ignores presence of a BM (against the spec, this is
    a firmware bug), performs its idea of gap count optimization and
    resets the bus.
    - Preceding two steps are repeated endlessly, bus never settles,
    regular I/O is practically impossible.
    http://thread.gmane.org/gmane.linux.kernel.firewire.user/3913

    This is an interoperability regression from the old to the new drivers.
    Fix it indirectly by adding the 1394a IRM check. The spec suggests
    three and a half methods to determine 1394a compliance of a remote IRM;
    we choose the method of testing the Config_ROM.Bus_Info.generation
    field. This is data that firewire-core should have readily available at
    this point, i.e. does not require extra I/O.

    Reported-by: Clemens Ladisch (missing 1394a check)
    Reported-by: H. S. (issue with Sony DCR-TRV25)
    Tested-by: H. S.

    Cc: # .32.x and newer

    Signed-off-by: Stefan Richter

    Stefan Richter
     

19 May, 2010

1 commit

  • Using a single timeout for all transaction that need to be flushed does
    not work if the submission of new transactions can defer the timeout
    indefinitely into the future. We need to have timeouts that do not
    change due to other transactions; the simplest way to do this is with a
    separate timer for each transaction.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Stefan Richter (+ one lockdep annotation)

    Clemens Ladisch
     

20 Apr, 2010

1 commit

  • Clemens Ladisch pointed out that
    - BIB_IMC is not named like the field is called in the standard,
    - readers of the code may get worried about the magic 0x0c0083c0,
    - a CSR_NODE_CAPABILITIES key is there in the header but not put to
    good use.

    So let's rename BIB_IMC, add a defined constant for Node_Capabilities
    and a comment which reassures people that somebody thought about it and
    they don't have to (or if they still do, tell them where they have to
    look for confirmation), and prune our incomplete and arbitrary set of
    defined constants of CSR key IDs. And there is a nother magic number,
    that of Bus_Information_Block.Bus_Name, to be defined and commented.

    Signed-off-by: Stefan Richter

    Stefan Richter
     

27 Jan, 2010

1 commit

  • Presently, firewire-core only checks whether descriptors that are to be
    added by userspace drivers to the local node's config ROM do not exceed
    a size of 256 quadlets. However, the sum of the bare minimum ROM plus
    all descriptors (from firewire-core, from firewire-net, from userspace)
    must not exceed 256 quadlets.

    Otherwise, the bounds of a statically allocated buffer will be
    overwritten. If the kernel survives that, firewire-core will
    subsequently be unable to parse the local node's config ROM.

    (Note, userspace drivers can add descriptors only through device files
    of local nodes. These are usually only accessible by root, unlike
    device files of remote nodes which may be accessible to lesser
    privileged users.)

    Therefore add a test which takes the actual present and required ROM
    size into account for all descriptors of kernelspace and userspace
    drivers.

    Cc: stable@kernel.org
    Signed-off-by: Stefan Richter

    Stefan Richter
     

15 Oct, 2009

4 commits

  • The Topology Map of the local node was created in CPU byte order,
    then a temporary big endian copy was created to compute the CRC,
    and when a read request to the Topology Map arrived it had to be
    converted to big endian byte order again.

    We now generate it in big endian byte order in the first place.
    This also rids us of 1000 bytes stack usage in tasklet context.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Move the static config ROM buffer into the scope of the two callers of
    generate_config_rom(). That way the ROM length can be passed over as
    return value rather than through a pointer argument.

    It also becomes more obvious that accesses to the config ROM buffer have
    to be serialized and how this is accomplished. And firewire-core.ko
    shrinks a bit as well.

    Signed-off-by: Stefan Richter

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

    Stefan Richter
     
  • A few stylistic changes to unify some code patterns in the subsystem:

    - The similar queue_delayed_work helpers fw_schedule_bm_work,
    schedule_iso_resource, and sbp2_queue_work now have the same call
    convention.
    - Two conditional calls of schedule_iso_resource are factored into
    another small helper.
    - An sbp2_target_get helper is added as counterpart to
    sbp2_target_put.

    Object size of firewire-core is decreased a little bit, object size of
    firewire-sbp2 remains unchanged.

    Signed-off-by: Stefan Richter

    Stefan Richter
     

12 Sep, 2009

1 commit

  • The config ROM buffer received from generate_config_rom is a globally
    shared static buffer. Extend the card_mutex protection in fw_add_card
    until after the config ROM was copied into the card driver's buffer.
    Otherwise, parallelized card driver probes may end up with ROM contents
    that were meant for a different card.

    firewire-ohci's card->driver->enable hook is safe to be called within
    the card_mutex. Furthermore, it is safe to reorder card_list update
    versus card enable, which simplifies the code a little.

    Signed-off-by: Stefan Richter

    Stefan Richter
     

26 Jun, 2009

1 commit

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

    Stefan Richter
     

17 Jun, 2009

1 commit

  • If isochronous contexts existed when firewire-ohci was unloaded, the
    core iso shutdown functions crashed with NULL dereferences, and buffers
    etc. weren't released.

    How the fix works: We first copy the card driver's iso shutdown hooks
    into the dummy driver, then fw_destroy_nodes notifies upper layers of
    devices going away, these should shut down (including their iso
    contexts), wait_for_completion(&card->done) will be triggered after
    upper layers gave up all fw_device references, after which the card
    driver's shutdown proceeds.

    Signed-off-by: Stefan Richter

    Stefan Richter
     

14 Jun, 2009

3 commits

  • Decouple the creation and destruction of the net_device from the order
    of discovery and removal of nodes with RFC 2734 unit directories since
    there is no reliable order. The net_device is now created when the
    first RFC 2734 unit on a card is discovered, and destroyed when the last
    RFC 2734 unit on a card went away. This includes all remote units as
    well as the local unit, which is therefore tracked as a peer now too.

    Also, locking around the list of peers is slightly extended to guard
    against peer removal. As a side effect, fwnet_peer.pdg_lock has become
    superfluous and is deleted.

    Peer data (max_rec, speed, node ID, generation) are updated more
    carefully.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Change names of types, variables, functions.
    Omit debug code.
    Use get_unaligned*, put_unaligned*.
    Annotate big endian data.
    Handle errors in __init.
    Change whitespace.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Implement IPv4 over IEEE 1394 as per RFC 2734 for the newer firewire
    stack. This feature has only been present in the older ieee1394 stack
    via the eth1394 driver.

    Still to do:
    - fix ipv4_priv and ipv4_node lifetime logic
    - fix determination of speeds and max payloads
    - fix bus reset handling
    - fix unaligned memory accesses
    - fix coding style
    - further testing/ improvement of fragment reassembly
    - perhaps multicast support

    Signed-off-by: Jay Fenlason
    Signed-off-by: Stefan Richter (rebased, copyright note, changelog)

    Jay Fenlason
     

07 Jun, 2009

1 commit


05 Jun, 2009

1 commit

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

    Stefan Richter