aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/firewire-cdev.h
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2012-03-18 14:05:29 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2012-03-18 17:15:39 -0400
commit18d627113b830cda80792e96b28341bcd41cf40c (patch)
tree44281ec110668e9f7a583303b28ba2ca47012a20 /include/linux/firewire-cdev.h
parent910e76c607546ead218de8b11c32597d6b8fe7e4 (diff)
firewire: prevent dropping of completed iso packet header data
The buffer for the header data of completed iso packets has a fixed size, so it is possible to configure a stream with a big interval between interrupt packets or with big headers so that this buffer would overflow. Previously, ohci.c would drop any data that would not fit, but this could make unsuspecting applications believe that fewer than the actual number of packets have completed. Instead of dropping data, add calls to flush_iso_completion() so that there are as many events as needed to report all of the data. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'include/linux/firewire-cdev.h')
-rw-r--r--include/linux/firewire-cdev.h9
1 files changed, 7 insertions, 2 deletions
diff --git a/include/linux/firewire-cdev.h b/include/linux/firewire-cdev.h
index cc1b570a2eb3..b9bd349c6930 100644
--- a/include/linux/firewire-cdev.h
+++ b/include/linux/firewire-cdev.h
@@ -207,12 +207,15 @@ struct fw_cdev_event_request2 {
207 * @closure: See &fw_cdev_event_common; 207 * @closure: See &fw_cdev_event_common;
208 * set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl 208 * set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl
209 * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_ISO_INTERRUPT 209 * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_ISO_INTERRUPT
210 * @cycle: Cycle counter of the interrupt packet 210 * @cycle: Cycle counter of the last completed packet
211 * @header_length: Total length of following headers, in bytes 211 * @header_length: Total length of following headers, in bytes
212 * @header: Stripped headers, if any 212 * @header: Stripped headers, if any
213 * 213 *
214 * This event is sent when the controller has completed an &fw_cdev_iso_packet 214 * This event is sent when the controller has completed an &fw_cdev_iso_packet
215 * with the %FW_CDEV_ISO_INTERRUPT bit set. 215 * with the %FW_CDEV_ISO_INTERRUPT bit set, or when there have been so many
216 * completed packets without the interrupt bit set that the kernel's internal
217 * buffer for @header is about to overflow. (In the latter case, kernels with
218 * ABI version < 5 drop header data up to the next interrupt packet.)
216 * 219 *
217 * Isochronous transmit events (context type %FW_CDEV_ISO_CONTEXT_TRANSMIT): 220 * Isochronous transmit events (context type %FW_CDEV_ISO_CONTEXT_TRANSMIT):
218 * 221 *
@@ -440,6 +443,8 @@ union fw_cdev_event {
440 * - added %FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL, 443 * - added %FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL,
441 * %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL, and 444 * %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL, and
442 * %FW_CDEV_IOC_SET_ISO_CHANNELS 445 * %FW_CDEV_IOC_SET_ISO_CHANNELS
446 * 5 (3.4) - send %FW_CDEV_EVENT_ISO_INTERRUPT events when needed to
447 * avoid dropping data
443 */ 448 */
444 449
445/** 450/**