diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2009-12-25 19:35:14 -0500 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2009-12-29 13:58:17 -0500 |
commit | 090699c0530ae5380a9b8511d76f656cc437bb6e (patch) | |
tree | 395c61692df693e6562446b2d23b06793f87a0a4 | |
parent | cf0e575dcc4cab9fd955e9bec49df7e8ee30a7cf (diff) |
firewire: ohci: always use packet-per-buffer mode for isochronous reception
This is a minimal change meant for the short term: Never set the
ohci->use_dualbuffer flag to true.
There are two reasons to do so:
- Packet-per-buffer mode and dual-buffer mode do not behave the same
under certain circumstances, notably if several packets are covered
by a single fw_cdev_iso_packet descriptor.
http://marc.info/?l=linux1394-devel&m=124965653718313
Therefore the driver stack should not silently choose one or the
other mode but should leave the choice to the high-level driver
(regardless if kernel driver or userspace driver). Or simply always
only offer packet-per-buffer mode, since a considerable number of
controllers, even current ones, does not offer dual-buffer support.
- Even under circumstances where packet-per-buffer mode and
dual-buffer mode behave exactly the same --- notably when used
through libraw1394, libdc1394, as well as the current two kernel
drivers which use isochronous reception (firewire-net and firedtv)
--- we are still faced with the problem that several OHCI 1.1
controllers have bugs in dual-buffer mode. Although it looks like
we have identified most of those buggy controllers by now, we
cannot be quite sure about that.
So, use packet-per-buffer by default from now on. This change should
be followed up by a more complete solution: Either extend the
in-kernel API and the userspace ABI by a choice between the two IR modes
or remove all dual-buffer related code from firewire-ohci.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
-rw-r--r-- | drivers/firewire/ohci.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index 96768e160866..a61571c63c59 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c | |||
@@ -2226,7 +2226,6 @@ static int ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base, | |||
2226 | if (rest == 0) | 2226 | if (rest == 0) |
2227 | return -EINVAL; | 2227 | return -EINVAL; |
2228 | 2228 | ||
2229 | /* FIXME: make packet-per-buffer/dual-buffer a context option */ | ||
2230 | while (rest > 0) { | 2229 | while (rest > 0) { |
2231 | d = context_get_descriptors(&ctx->context, | 2230 | d = context_get_descriptors(&ctx->context, |
2232 | z + header_z, &d_bus); | 2231 | z + header_z, &d_bus); |
@@ -2470,7 +2469,10 @@ static int __devinit pci_probe(struct pci_dev *dev, | |||
2470 | } | 2469 | } |
2471 | 2470 | ||
2472 | version = reg_read(ohci, OHCI1394_Version) & 0x00ff00ff; | 2471 | version = reg_read(ohci, OHCI1394_Version) & 0x00ff00ff; |
2472 | #if 0 | ||
2473 | /* FIXME: make it a context option or remove dual-buffer mode */ | ||
2473 | ohci->use_dualbuffer = version >= OHCI_VERSION_1_1; | 2474 | ohci->use_dualbuffer = version >= OHCI_VERSION_1_1; |
2475 | #endif | ||
2474 | 2476 | ||
2475 | /* dual-buffer mode is broken if more than one IR context is active */ | 2477 | /* dual-buffer mode is broken if more than one IR context is active */ |
2476 | if (dev->vendor == PCI_VENDOR_ID_AGERE && | 2478 | if (dev->vendor == PCI_VENDOR_ID_AGERE && |