FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

Merge tag 'firewire-fix' of git://git.kernel.org/pub/scm/linux/kernel… · fabgithub/linux@36f571e · GitHub

Repository navigation

Commit 36f571e

Browse files
committed
Merge tag 'firewire-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394
Pull firewire regression fix from Stefan Richter: "This fixes corrupted video capture, seen with IIDC/DCAM video and certain buffer settings. (Regression since v3.4 inclusive.)" * tag 'firewire-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394: firewire: fix libdc1394/FlyCap2 iso event regression
2 parents 8027678 + 0699a73 commit 36f571e

4 files changed

Lines changed: 14 additions & 4 deletions

File tree

‎drivers/firewire/core-cdev.c‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
#define FW_CDEV_KERNEL_VERSION 5
5555
#define FW_CDEV_VERSION_EVENT_REQUEST2 4
5656
#define FW_CDEV_VERSION_ALLOCATE_REGION_END 4
57+
#define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5
5758

5859
struct client {
5960
u32 version;
@@ -1005,6 +1006,8 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg)
10051006
a->channel, a->speed, a->header_size, cb, client);
10061007
if (IS_ERR(context))
10071008
return PTR_ERR(context);
1009+
if (client->version < FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW)
1010+
context->drop_overflow_headers = true;
10081011

10091012
/* We only support one context at this time. */
10101013
spin_lock_irq(&client->lock);

‎drivers/firewire/ohci.c‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2749,8 +2749,11 @@ static void copy_iso_headers(struct iso_context *ctx, const u32 *dma_hdr)
27492749
{
27502750
u32 *ctx_hdr;
27512751

2752-
if (ctx->header_length + ctx->base.header_size > PAGE_SIZE)
2752+
if (ctx->header_length + ctx->base.header_size > PAGE_SIZE) {
2753+
if (ctx->base.drop_overflow_headers)
2754+
return;
27532755
flush_iso_completions(ctx);
2756+
}
27542757

27552758
ctx_hdr = ctx->header + ctx->header_length;
27562759
ctx->last_timestamp = (u16)le32_to_cpu((__force __le32)dma_hdr[0]);
@@ -2910,8 +2913,11 @@ static int handle_it_packet(struct context *context,
29102913

29112914
sync_it_packet_for_cpu(context, d);
29122915

2913-
if (ctx->header_length + 4 > PAGE_SIZE)
2916+
if (ctx->header_length + 4 > PAGE_SIZE) {
2917+
if (ctx->base.drop_overflow_headers)
2918+
return 1;
29142919
flush_iso_completions(ctx);
2920+
}
29152921

29162922
ctx_hdr = ctx->header + ctx->header_length;
29172923
ctx->last_timestamp = le16_to_cpu(last->res_count);

‎include/linux/firewire.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ struct fw_iso_context {
436436
int type;
437437
int channel;
438438
int speed;
439+
bool drop_overflow_headers;
439440
size_t header_size;
440441
union {
441442
fw_iso_callback_t sc;

‎include/uapi/linux/firewire-cdev.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,8 @@ struct fw_cdev_event_request2 {
215215
* with the %FW_CDEV_ISO_INTERRUPT bit set, when explicitly requested with
216216
* %FW_CDEV_IOC_FLUSH_ISO, or when there have been so many completed packets
217217
* without the interrupt bit set that the kernel's internal buffer for @header
218-
* is about to overflow. (In the last case, kernels with ABI version < 5 drop
219-
* header data up to the next interrupt packet.)
218+
* is about to overflow. (In the last case, ABI versions < 5 drop header data
219+
* up to the next interrupt packet.)
220220
*
221221
* Isochronous transmit events (context type %FW_CDEV_ISO_CONTEXT_TRANSMIT):
222222
*

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL