22 Aug, 2011

1 commit


13 Aug, 2011

1 commit

  • Some older Panasonic made camcorders (Panasonic AG-EZ30 and NV-DX110,
    Grundig Scenos DLC 2000) reject requests with ack_busy_X if a request is
    sent immediately after they sent a response to a prior transaction.
    This causes firewire-core to fail probing of the camcorder with "giving
    up on config rom for node id ...". Consequently, programs like kino or
    dvgrab are unaware of the presence of a camcorder.

    Such transaction failures happen also with the ieee1394 driver stack
    (of the 2.4...2.6 kernel series until 2.6.36 inclusive) but with a lower
    likelihood, such that kino or dvgrab are generally able to use these
    camcorders via the older driver stack. The cause for firewire-ohci's or
    firewire-core's worse behavior is not yet known. Gap count optimization
    in firewire-core is not the cause. Perhaps the slightly higher latency
    of transaction completion in the older stack plays a role. (ieee1394:
    AR-resp DMA context tasklet -> packet completion ktread -> user process;
    firewire-core: tasklet -> user process.)

    This change introduces retries and delays after ack_busy_X into
    firewire-core's Config ROM reader, such that at least firewire-core's
    probing and /dev/fw* creation are successful. This still leaves the
    problem that userland processes are facing transaction failures.
    gscanbus's built-in retry routines deal with them successfully, but
    neither kino's nor dvgrab's do ever succeed.

    But at least DV capture with "dvgrab -noavc -card 0" works now. Live
    video preview in kino works too, but not actual capture.

    One way to prevent Configuration ROM reading failures in application
    programs is to modify libraw1394 to synthesize read responses by means
    of firewire-core's Configuration ROM cache. This would only leave
    CMP and FCP transaction failures as a potential problem source for
    applications.

    Reported-and-tested-by: Thomas Seilund
    Reported-and-tested-by: René Fritz
    Signed-off-by: Stefan Richter

    Stefan Richter
     

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

2 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
     

20 Mar, 2011

1 commit

  • Like the older ieee1394 core driver, firewire-core skipped scanning of
    any new node whose PHY sent a self ID without "link active" bit. If a
    device had this bit off mistakenly, it meant that it was inaccessible to
    kernel drivers with the old IEEE 1394 driver stack but could still be
    accessed by userspace drivers through the raw1394 interface.

    But with firewire-core, userspace drivers don't get to see such buggy
    devices anymore. This is effectively a driver regression since this
    device bug is otherwise harmless.

    We now attempt to scan all devices, even repeaters that don't have a
    link or powered-down devices that have everything but their PHY shut
    down when plugged in. This results in futile repeated scanning attempts
    in case of such devices that really don't have an active link, but this
    doesn't hurt since recent workqueue infrastructure lets us run more
    concurrent scanning jobs than we can shake a stick at.

    This should fix accessibility of Focusrite Saffire PRO 26 I/O:
    http://sourceforge.net/mailarchive/forum.php?thread_name=20110314215622.5c751bb0%40stein&forum_name=ffado-user

    Signed-off-by: Stefan Richter

    Stefan Richter
     

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
     

02 Aug, 2010

1 commit


13 Jul, 2010

2 commits

  • When a descriptor was added or removed to the local node's config ROM,
    userspace clients which had a local node's /dev/fw* open did not receive
    any fw_cdev_event_bus_reset for poll()/read() consumption.

    The cause was that the core-device.c facility which re-reads the config
    ROM of the bus reset initiator node missed to call the fw_device update
    function. The fw_units are destroyed and newly added, but their parent
    stays and needs to be updated.

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

    Stefan Richter
     
  • The present inline documentation of the fw_send_request() in-kernel API
    refers to userland code that is not applicable to kernel drivers at all.

    Reported-by: Ben Gamari

    While we are at fixing the whole documentation of fw_send_request(),
    also improve the rest of firewire-core's kerneldoc comments:
    - Add a bit of text concerning fw_run_transaction()'s call parameters.
    - Append () to function names and tab-align parameter descriptions as
    suggested by the example in Documentation/kernel-doc-nano-HOWTO.txt.
    - Remove kerneldoc markers from comments on static functions.
    - Remove outdated parameter descriptions at build_tree().

    Signed-off-by: Stefan Richter

    Stefan Richter
     

30 Mar, 2010

1 commit

  • …it slab.h inclusion from percpu.h

    percpu.h is included by sched.h and module.h and thus ends up being
    included when building most .c files. percpu.h includes slab.h which
    in turn includes gfp.h making everything defined by the two files
    universally available and complicating inclusion dependencies.

    percpu.h -> slab.h dependency is about to be removed. Prepare for
    this change by updating users of gfp and slab facilities include those
    headers directly instead of assuming availability. As this conversion
    needs to touch large number of source files, the following script is
    used as the basis of conversion.

    http://userweb.kernel.org/~tj/misc/slabh-sweep.py

    The script does the followings.

    * Scan files for gfp and slab usages and update includes such that
    only the necessary includes are there. ie. if only gfp is used,
    gfp.h, if slab is used, slab.h.

    * When the script inserts a new include, it looks at the include
    blocks and try to put the new include such that its order conforms
    to its surrounding. It's put in the include block which contains
    core kernel includes, in the same order that the rest are ordered -
    alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
    doesn't seem to be any matching order.

    * If the script can't find a place to put a new include (mostly
    because the file doesn't have fitting include block), it prints out
    an error message indicating which .h file needs to be added to the
    file.

    The conversion was done in the following steps.

    1. The initial automatic conversion of all .c files updated slightly
    over 4000 files, deleting around 700 includes and adding ~480 gfp.h
    and ~3000 slab.h inclusions. The script emitted errors for ~400
    files.

    2. Each error was manually checked. Some didn't need the inclusion,
    some needed manual addition while adding it to implementation .h or
    embedding .c file was more appropriate for others. This step added
    inclusions to around 150 files.

    3. The script was run again and the output was compared to the edits
    from #2 to make sure no file was left behind.

    4. Several build tests were done and a couple of problems were fixed.
    e.g. lib/decompress_*.c used malloc/free() wrappers around slab
    APIs requiring slab.h to be added manually.

    5. The script was run on all .h files but without automatically
    editing them as sprinkling gfp.h and slab.h inclusions around .h
    files could easily lead to inclusion dependency hell. Most gfp.h
    inclusion directives were ignored as stuff from gfp.h was usually
    wildly available and often used in preprocessor macros. Each
    slab.h inclusion directive was examined and added manually as
    necessary.

    6. percpu.h was updated not to include slab.h.

    7. Build test were done on the following configurations and failures
    were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
    distributed build env didn't work with gcov compiles) and a few
    more options had to be turned off depending on archs to make things
    build (like ipr on powerpc/64 which failed due to missing writeq).

    * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
    * powerpc and powerpc64 SMP allmodconfig
    * sparc and sparc64 SMP allmodconfig
    * ia64 SMP allmodconfig
    * s390 SMP allmodconfig
    * alpha SMP allmodconfig
    * um on x86_64 SMP allmodconfig

    8. percpu.h modifications were reverted so that it could be applied as
    a separate patch and serve as bisection point.

    Given the fact that I had only a couple of failures from tests on step
    6, I'm fairly confident about the coverage of this conversion patch.
    If there is a breakage, it's likely to be something in one of the arch
    headers which should be easily discoverable easily on most builds of
    the specific arch.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>

    Tejun Heo
     

27 Mar, 2010

1 commit


25 Mar, 2010

2 commits

  • The driver match strategy was:
    - Match vendor/model/specifier/version of the unit directory.
    - If that was a miss, match vendor from the root directory and
    model/specifier/version of the unit directory.

    This was inconsistent with how the modalias string was constructed
    until recently (take vendor/model from root directory and specifier/
    version from unit directory). It was also inconsistent with how it is
    done since the parent commit:
    - Use vendor/model/specifier/version of the unit directory if possible,
    - fall back to one or more of vendor/model/specifier/version from the
    root directory depending on which ones are not present at the unit
    directory.

    Fix this inconsistency by sharing the ROM scanner function between
    modalias printer function and driver match function.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • The modalias string of devices that represent units on a FireWire node
    did not show Module_ID entries within unit directories. This was
    because firewire-core searched only the root directory of the
    configuration ROM for a Model_ID entry.

    We now search first the root directory, then the unit directory. IOW
    honor a unit directory's Model_ID if present, otherwise fall back to the
    root directory's model ID (if present).

    Furthermore, apply the same change to Vendor_ID. This had the same
    issue but it was less apparent because most devices provide Vendor_ID
    only in the root directory.

    And finally, also use this strategy for the remaining two IDs in the
    modalias, Specifier_ID and Version. It does not actually make sense to
    look for them elsewhere than in the unit directory because they are
    mandatory there. However, a uniform search order simplifies the
    implementation and has no adverse affect in practice.

    Side notes:
    - The older counterpart of this, nodemgr.c of ieee1394, looked for
    Vendor_ID first in the root directory, then in the unit directory,
    and for Model_ID only in the unit directory.
    - There is a single mainline driver which requires Vendor_ID and
    Model_ID --- the firedtv driver. This one worked because FireDTVs
    provide Vendor_ID in the root directory and Model_ID identically in
    root directory and unit directory.
    - Apart from firedtv, there are currently no drivers known to me
    (including userspace drivers) that look at the Vendor_ID or Model_ID
    of the modalias.

    Reported-by: Maciej Żenczykowski
    Signed-off-by: Stefan Richter

    Stefan Richter
     

08 Mar, 2010

1 commit

  • In the future, we are going to be changing the lock type for struct
    device (once we get the lockdep infrastructure properly worked out) To
    make that changeover easier, and to possibly burry the lock in a
    different part of struct device, let's create some functions to lock and
    unlock a device so that no out-of-core code needs to be changed in the
    future.

    This patch creates the device_lock/unlock/trylock() functions, and
    converts all in-tree users to them.

    Cc: Thomas Gleixner
    Cc: Jean Delvare
    Cc: Dave Young
    Cc: Ming Lei
    Cc: Jiri Kosina
    Cc: Phil Carmody
    Cc: Arjan van de Ven
    Cc: Cornelia Huck
    Cc: Rafael J. Wysocki
    Cc: Pavel Machek
    Cc: Len Brown
    Cc: Magnus Damm
    Cc: Alan Stern
    Cc: Randy Dunlap
    Cc: Stefan Richter
    Cc: David Brownell
    Cc: Vegard Nossum
    Cc: Jesse Barnes
    Cc: Alex Chiang
    Cc: Kenji Kaneshige
    Cc: Andrew Morton
    Cc: Andrew Patterson
    Cc: Yu Zhao
    Cc: Dominik Brodowski
    Cc: Samuel Ortiz
    Cc: Wolfram Sang
    Cc: CHENG Renquan
    Cc: Oliver Neukum
    Cc: Frans Pop
    Cc: David Vrabel
    Cc: Kay Sievers
    Cc: Sarah Sharp
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

25 Feb, 2010

5 commits

  • according to what it really does.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • If a device exposes a sparsely populated configuration ROM,
    firewire-core's sysfs interface and character device file interface
    showed random data in the gaps between config ROM blocks. Fix this by
    zero-initialization of the config ROM reader's scratch buffer.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • The stack size of 16 was artificially chosen and may be too small in
    extreme cases. A device won't be accessible then.

    Since it doesn't really matter to the slab allocator whether we ask for
    1088 bytes or 2048 bytes of scratch memory, just allocate 2048 bytes for
    the sum of temporary config ROM image and stack, and we will never ever
    overflow the stack (because there simply can't be more stack items than
    ROM entries).

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • It never happened yet, but better safe than sorry: If a device's config
    ROM contains a block which overlaps the boundary at 0xfffff00007ff, just
    ignore that one block instead of refusing to add the device
    representation. That way, upper layers (kernelspace or userspace
    drivers) might still be able to use the device to some degree.

    That's better than total inaccessibility of the device. Worse, the core
    would have logged only a generic "giving up on config rom" message which
    could only be debugged by feeding a firewire-ohci debug logging session
    through a config ROM interpreter, IOW would likely remain undiagnosed.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • The Panasonic AG-DV2500 tape deck contains an invalid entry in its
    configuration ROM root directory: A leaf pointer with the undefined key
    ID 0 and an offset that points way out of the standard config ROM area.
    This caused firewire-core to dismiss the device with the generic log
    message "giving up on config rom for node id...", after which it was of
    course impossible to access the tape deck with dvgrab or any other
    program. https://bugzilla.redhat.com/show_bug.cgi?id=449252#c29

    The fix is to simply ignore this invalid ROM entry and proceed to read
    the valid rest of the ROM. There is a catch though: When the kernel
    later iterates over the ROM, it would be nasty having to check again for
    such too large ROM offsets. Therefore we manipulate the defective or
    unsupported ROM entry to become a harmless immediate entry that won't
    have any side effects later (an entry with the value 0x00000000).

    Reported-by: George Chriss
    Signed-off-by: Stefan Richter

    Stefan Richter
     

30 Dec, 2009

3 commits


16 Sep, 2009

1 commit


14 Jun, 2009

1 commit

  • This extra check will avoid Broadcast_Channel register related traffic
    to many IIDC, SBP-2, and AV/C devices which aren't IRMC or have a
    max_rec < 8 (i.e. support < 512 bytes async payload). This avoids a
    little bit of traffic after bus reset and is even more careful with
    devices which don't implement this CSR.

    The assumption is that no other protocol than IP over 1394 uses the
    broadcast channel for streams.

    Signed-off-by: Stefan Richter

    Stefan Richter
     

07 Jun, 2009

2 commits


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