linux-hardened/drivers/firewire
Stefan Richter aaff12039f firewire: core: handle ack_busy when fetching the Config ROM
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 <tps@netmaster.dk>
Reported-and-tested-by: René Fritz <rene@colorcube.de>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
2011-08-13 13:53:30 +02:00
..
core-card.c firewire: sbp2: parallelize login, reconnect, logout 2011-05-10 22:53:46 +02:00
core-cdev.c firewire: cdev: fix 32 bit userland on 64 bit kernel compat corner cases 2011-08-12 15:30:08 +02:00
core-device.c firewire: core: handle ack_busy when fetching the Config ROM 2011-08-13 13:53:30 +02:00
core-iso.c firewire: optimize iso queueing by setting wake only after the last packet 2011-05-10 22:53:45 +02:00
core-topology.c firewire: core: fix card->reset_jiffies overflow 2011-01-23 12:31:01 +01:00
core-transaction.c firewire: sbp2: parallelize login, reconnect, logout 2011-05-10 22:53:46 +02:00
core.h firewire: sbp2: parallelize login, reconnect, logout 2011-05-10 22:53:46 +02:00
init_ohci1394_dma.c ieee1394: move init_ohci1394_dma to drivers/firewire/ 2010-10-11 14:48:03 +02:00
Kconfig Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6 2011-03-21 10:05:22 -07:00
Makefile ieee1394: move init_ohci1394_dma to drivers/firewire/ 2010-10-11 14:48:03 +02:00
net.c firewire: net: replacing deprecated __attribute__((packed)) with __packed 2011-06-02 13:58:33 +02:00
nosy-user.h firewire: nosy: endianess fixes and annotations 2010-07-27 11:04:11 +02:00
nosy.c firewire: nosy: char device is not seekable 2010-12-12 15:47:02 +01:00
nosy.h firewire: nosy: misc cleanups 2010-07-27 11:04:10 +02:00
ohci.c firewire: ohci: fix DMA unmapping in an error path 2011-08-12 15:30:08 +02:00
ohci.h firewire: ohci: fix TI TSB82AA2 regression since 2.6.35 2010-10-17 14:09:12 +02:00
sbp2.c firewire: sbp2: parallelize login, reconnect, logout 2011-05-10 22:53:46 +02:00