linux/drivers/firewire
Stefan Richter 9ef28ccd59 firewire: ohci: reduce potential context_stop latency
Stopping an isochronous reception DMA context takes two loop iterations
in context_stop on several controllers (JMicron, NEC, VIA).  But there
is no extra delay necessary between these two reg_read trials; the MMIO
reads themselves are slow enough.  Hence bring back the behavior from
before commit dd6254e5c0 "firewire: ohci:
remove superfluous posted write flushes" on these controllers by means
of an "if (i)" condition.

Isochronous context stop is performed in preemptible contexts (and only
rarely), hence this change is of little impact.  (Besides, Agere and TI
controllers always, or almost always, have the context stopped already
at the first ContextControl read.)

More important is asynchronous transmit context stop, which is performed
while local interrupts are disabled (on the two AT DMAs in
bus_reset_tasklet, i.e. after a self-ID-complete event).  In my
experience with several controllers, tested with a usermode AT-request
transmitter as well as with FTP transmission over firewire-net, the AT
contexts were luckily already stopped at the first ContextControl read,
i.e. never required another MMIO read let alone mdelay.  A possible
explanation for this is that the controllers which I tested perhaps stop
AT DMA before they perform the self-ID reception DMA.

But we cannot be sure about that and should keep the interrupts-disabled
busy loop as short as possible.  Hence, query the ContextControl
register in 1000 udelay(10) intervals instead of 10 udelay(1000)
intervals.  I understand from an estimation by Clemens Ladisch that
stopping a busy DMA context should take microseconds or at worst tens of
microseconds, not milliseconds.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
2011-07-09 17:12:07 +02:00
..
core-card.c firewire: sbp2: parallelize login, reconnect, logout 2011-05-10 22:53:46 +02:00
core-cdev.c firewire: sbp2: parallelize login, reconnect, logout 2011-05-10 22:53:46 +02:00
core-device.c firewire: sbp2: parallelize login, reconnect, logout 2011-05-10 22:53:46 +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: reduce potential context_stop latency 2011-07-09 17:12:07 +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