This fixes corrupted video capture, seen with IIDC/DCAM video and certain
buffer settings. (Regression since v3.4 inclusive.) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.20 (GNU/Linux) iQIcBAABAgAGBQJR9s/GAAoJEHnzb7JUXXnQUQ0QAL+E3JIrifLNLvkWLPzBc/hP VyFqrBWvpMWGrAXmF6HtyTkSsvde7q2sTgwwFg4wamSctXT7jVNCaoS0vJ+tXv4F +mXlGtyQcQV6RrCTeHnH4lwsEe2sb3YbHbwZ8/GPVJQOWpmwXqM7Ikj6mG2p6qVU bOBztCnkbugSzcp+bdF0DtMyNkh8gDombnqyCKMjDvJq5oAR8l/wHPPqMed0r+kZ Yk66p2LqqMqs6yOGC6ftNSRCO8D9KlGCQH4ydwUgiN7vSElZClDqpb8mVYzhPj0H 35rE+gc2SGcbvJO3ypWmQDPlT0kwU52KO9t0KLKNbHYbutzw5jRmYjkiGwy4GqMC cGWNTakuDyUK2hStXKwVEmdGI/5bl7UPTGYresczNxQlaYr9JtEy85QYadW2sNPZ BL4psLTbcM4ovoLdtqxsHeD8vtYZIfd4ajPuvczQu/W9NgsjScL3x67Nq/bK1mBo uybrwaJR4U7ulfxjNME+ed7NiJMrppaweT5vFnM7/JbmcOgfiakuoOf2gxAU7y7D xCU4PqvO/mSR+BRN8oYQDTkyzXtdgxhr7od1vGQHLwnSq7IhBybaSZkoTtDahtVY L7L9TGT5cQ1fZbhtZbgIxrjr0RIVKF/ZLmR/s5vm1Y7UyPvDbbGxYXfeqsuypFy/ /Y8FZqlSE60MivSVpyAA =L5a0 -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
36f571e9ed
4 changed files with 14 additions and 4 deletions
|
@ -54,6 +54,7 @@
|
|||
#define FW_CDEV_KERNEL_VERSION 5
|
||||
#define FW_CDEV_VERSION_EVENT_REQUEST2 4
|
||||
#define FW_CDEV_VERSION_ALLOCATE_REGION_END 4
|
||||
#define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5
|
||||
|
||||
struct client {
|
||||
u32 version;
|
||||
|
@ -1005,6 +1006,8 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg)
|
|||
a->channel, a->speed, a->header_size, cb, client);
|
||||
if (IS_ERR(context))
|
||||
return PTR_ERR(context);
|
||||
if (client->version < FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW)
|
||||
context->drop_overflow_headers = true;
|
||||
|
||||
/* We only support one context at this time. */
|
||||
spin_lock_irq(&client->lock);
|
||||
|
|
|
@ -2749,8 +2749,11 @@ static void copy_iso_headers(struct iso_context *ctx, const u32 *dma_hdr)
|
|||
{
|
||||
u32 *ctx_hdr;
|
||||
|
||||
if (ctx->header_length + ctx->base.header_size > PAGE_SIZE)
|
||||
if (ctx->header_length + ctx->base.header_size > PAGE_SIZE) {
|
||||
if (ctx->base.drop_overflow_headers)
|
||||
return;
|
||||
flush_iso_completions(ctx);
|
||||
}
|
||||
|
||||
ctx_hdr = ctx->header + ctx->header_length;
|
||||
ctx->last_timestamp = (u16)le32_to_cpu((__force __le32)dma_hdr[0]);
|
||||
|
@ -2910,8 +2913,11 @@ static int handle_it_packet(struct context *context,
|
|||
|
||||
sync_it_packet_for_cpu(context, d);
|
||||
|
||||
if (ctx->header_length + 4 > PAGE_SIZE)
|
||||
if (ctx->header_length + 4 > PAGE_SIZE) {
|
||||
if (ctx->base.drop_overflow_headers)
|
||||
return 1;
|
||||
flush_iso_completions(ctx);
|
||||
}
|
||||
|
||||
ctx_hdr = ctx->header + ctx->header_length;
|
||||
ctx->last_timestamp = le16_to_cpu(last->res_count);
|
||||
|
|
|
@ -436,6 +436,7 @@ struct fw_iso_context {
|
|||
int type;
|
||||
int channel;
|
||||
int speed;
|
||||
bool drop_overflow_headers;
|
||||
size_t header_size;
|
||||
union {
|
||||
fw_iso_callback_t sc;
|
||||
|
|
|
@ -215,8 +215,8 @@ struct fw_cdev_event_request2 {
|
|||
* with the %FW_CDEV_ISO_INTERRUPT bit set, when explicitly requested with
|
||||
* %FW_CDEV_IOC_FLUSH_ISO, or when there have been so many completed packets
|
||||
* without the interrupt bit set that the kernel's internal buffer for @header
|
||||
* is about to overflow. (In the last case, kernels with ABI version < 5 drop
|
||||
* header data up to the next interrupt packet.)
|
||||
* is about to overflow. (In the last case, ABI versions < 5 drop header data
|
||||
* up to the next interrupt packet.)
|
||||
*
|
||||
* Isochronous transmit events (context type %FW_CDEV_ISO_CONTEXT_TRANSMIT):
|
||||
*
|
||||
|
|
Loading…
Reference in a new issue