diff options
-rw-r--r-- | drivers/firewire/core-card.c | 5 | ||||
-rw-r--r-- | drivers/firewire/core-cdev.c | 1 | ||||
-rw-r--r-- | drivers/firewire/core-iso.c | 6 | ||||
-rw-r--r-- | drivers/firewire/core.h | 2 | ||||
-rw-r--r-- | drivers/firewire/net.c | 4 | ||||
-rw-r--r-- | drivers/firewire/ohci.c | 19 | ||||
-rw-r--r-- | drivers/media/dvb/firewire/firedtv-fw.c | 1 | ||||
-rw-r--r-- | include/linux/firewire.h | 1 | ||||
-rw-r--r-- | sound/firewire/amdtp.c | 1 |
9 files changed, 35 insertions, 5 deletions
diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c index e119f1e6ba47..f05fc7bfceeb 100644 --- a/drivers/firewire/core-card.c +++ b/drivers/firewire/core-card.c | |||
@@ -630,6 +630,10 @@ static int dummy_queue_iso(struct fw_iso_context *ctx, struct fw_iso_packet *p, | |||
630 | return -ENODEV; | 630 | return -ENODEV; |
631 | } | 631 | } |
632 | 632 | ||
633 | static void dummy_flush_queue_iso(struct fw_iso_context *ctx) | ||
634 | { | ||
635 | } | ||
636 | |||
633 | static const struct fw_card_driver dummy_driver_template = { | 637 | static const struct fw_card_driver dummy_driver_template = { |
634 | .read_phy_reg = dummy_read_phy_reg, | 638 | .read_phy_reg = dummy_read_phy_reg, |
635 | .update_phy_reg = dummy_update_phy_reg, | 639 | .update_phy_reg = dummy_update_phy_reg, |
@@ -641,6 +645,7 @@ static const struct fw_card_driver dummy_driver_template = { | |||
641 | .start_iso = dummy_start_iso, | 645 | .start_iso = dummy_start_iso, |
642 | .set_iso_channels = dummy_set_iso_channels, | 646 | .set_iso_channels = dummy_set_iso_channels, |
643 | .queue_iso = dummy_queue_iso, | 647 | .queue_iso = dummy_queue_iso, |
648 | .flush_queue_iso = dummy_flush_queue_iso, | ||
644 | }; | 649 | }; |
645 | 650 | ||
646 | void fw_card_release(struct kref *kref) | 651 | void fw_card_release(struct kref *kref) |
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c index 2a3f1c4d6906..64768c2194f1 100644 --- a/drivers/firewire/core-cdev.c +++ b/drivers/firewire/core-cdev.c | |||
@@ -1107,6 +1107,7 @@ static int ioctl_queue_iso(struct client *client, union ioctl_arg *arg) | |||
1107 | payload += u.packet.payload_length; | 1107 | payload += u.packet.payload_length; |
1108 | count++; | 1108 | count++; |
1109 | } | 1109 | } |
1110 | fw_iso_context_queue_flush(ctx); | ||
1110 | 1111 | ||
1111 | a->size -= uptr_to_u64(p) - a->packets; | 1112 | a->size -= uptr_to_u64(p) - a->packets; |
1112 | a->packets = uptr_to_u64(p); | 1113 | a->packets = uptr_to_u64(p); |
diff --git a/drivers/firewire/core-iso.c b/drivers/firewire/core-iso.c index f872ede5af37..57c3973093ad 100644 --- a/drivers/firewire/core-iso.c +++ b/drivers/firewire/core-iso.c | |||
@@ -185,6 +185,12 @@ int fw_iso_context_queue(struct fw_iso_context *ctx, | |||
185 | } | 185 | } |
186 | EXPORT_SYMBOL(fw_iso_context_queue); | 186 | EXPORT_SYMBOL(fw_iso_context_queue); |
187 | 187 | ||
188 | void fw_iso_context_queue_flush(struct fw_iso_context *ctx) | ||
189 | { | ||
190 | ctx->card->driver->flush_queue_iso(ctx); | ||
191 | } | ||
192 | EXPORT_SYMBOL(fw_iso_context_queue_flush); | ||
193 | |||
188 | int fw_iso_context_stop(struct fw_iso_context *ctx) | 194 | int fw_iso_context_stop(struct fw_iso_context *ctx) |
189 | { | 195 | { |
190 | return ctx->card->driver->stop_iso(ctx); | 196 | return ctx->card->driver->stop_iso(ctx); |
diff --git a/drivers/firewire/core.h b/drivers/firewire/core.h index 25e729cde2f7..0fe4e4e6eda7 100644 --- a/drivers/firewire/core.h +++ b/drivers/firewire/core.h | |||
@@ -97,6 +97,8 @@ struct fw_card_driver { | |||
97 | struct fw_iso_buffer *buffer, | 97 | struct fw_iso_buffer *buffer, |
98 | unsigned long payload); | 98 | unsigned long payload); |
99 | 99 | ||
100 | void (*flush_queue_iso)(struct fw_iso_context *ctx); | ||
101 | |||
100 | int (*stop_iso)(struct fw_iso_context *ctx); | 102 | int (*stop_iso)(struct fw_iso_context *ctx); |
101 | }; | 103 | }; |
102 | 104 | ||
diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c index 3f04dd3681cf..b9762d07198d 100644 --- a/drivers/firewire/net.c +++ b/drivers/firewire/net.c | |||
@@ -881,7 +881,9 @@ static void fwnet_receive_broadcast(struct fw_iso_context *context, | |||
881 | 881 | ||
882 | spin_unlock_irqrestore(&dev->lock, flags); | 882 | spin_unlock_irqrestore(&dev->lock, flags); |
883 | 883 | ||
884 | if (retval < 0) | 884 | if (retval >= 0) |
885 | fw_iso_context_queue_flush(dev->broadcast_rcv_context); | ||
886 | else | ||
885 | fw_error("requeue failed\n"); | 887 | fw_error("requeue failed\n"); |
886 | } | 888 | } |
887 | 889 | ||
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index f9f55703375e..438e6c831170 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c | |||
@@ -1192,9 +1192,6 @@ static void context_append(struct context *ctx, | |||
1192 | wmb(); /* finish init of new descriptors before branch_address update */ | 1192 | wmb(); /* finish init of new descriptors before branch_address update */ |
1193 | ctx->prev->branch_address = cpu_to_le32(d_bus | z); | 1193 | ctx->prev->branch_address = cpu_to_le32(d_bus | z); |
1194 | ctx->prev = find_branch_descriptor(d, z); | 1194 | ctx->prev = find_branch_descriptor(d, z); |
1195 | |||
1196 | reg_write(ctx->ohci, CONTROL_SET(ctx->regs), CONTEXT_WAKE); | ||
1197 | flush_writes(ctx->ohci); | ||
1198 | } | 1195 | } |
1199 | 1196 | ||
1200 | static void context_stop(struct context *ctx) | 1197 | static void context_stop(struct context *ctx) |
@@ -1348,8 +1345,12 @@ static int at_context_queue_packet(struct context *ctx, | |||
1348 | 1345 | ||
1349 | context_append(ctx, d, z, 4 - z); | 1346 | context_append(ctx, d, z, 4 - z); |
1350 | 1347 | ||
1351 | if (!ctx->running) | 1348 | if (ctx->running) { |
1349 | reg_write(ohci, CONTROL_SET(ctx->regs), CONTEXT_WAKE); | ||
1350 | flush_writes(ohci); | ||
1351 | } else { | ||
1352 | context_run(ctx, 0); | 1352 | context_run(ctx, 0); |
1353 | } | ||
1353 | 1354 | ||
1354 | return 0; | 1355 | return 0; |
1355 | } | 1356 | } |
@@ -3121,6 +3122,15 @@ static int ohci_queue_iso(struct fw_iso_context *base, | |||
3121 | return ret; | 3122 | return ret; |
3122 | } | 3123 | } |
3123 | 3124 | ||
3125 | static void ohci_flush_queue_iso(struct fw_iso_context *base) | ||
3126 | { | ||
3127 | struct context *ctx = | ||
3128 | &container_of(base, struct iso_context, base)->context; | ||
3129 | |||
3130 | reg_write(ctx->ohci, CONTROL_SET(ctx->regs), CONTEXT_WAKE); | ||
3131 | flush_writes(ctx->ohci); | ||
3132 | } | ||
3133 | |||
3124 | static const struct fw_card_driver ohci_driver = { | 3134 | static const struct fw_card_driver ohci_driver = { |
3125 | .enable = ohci_enable, | 3135 | .enable = ohci_enable, |
3126 | .read_phy_reg = ohci_read_phy_reg, | 3136 | .read_phy_reg = ohci_read_phy_reg, |
@@ -3137,6 +3147,7 @@ static const struct fw_card_driver ohci_driver = { | |||
3137 | .free_iso_context = ohci_free_iso_context, | 3147 | .free_iso_context = ohci_free_iso_context, |
3138 | .set_iso_channels = ohci_set_iso_channels, | 3148 | .set_iso_channels = ohci_set_iso_channels, |
3139 | .queue_iso = ohci_queue_iso, | 3149 | .queue_iso = ohci_queue_iso, |
3150 | .flush_queue_iso = ohci_flush_queue_iso, | ||
3140 | .start_iso = ohci_start_iso, | 3151 | .start_iso = ohci_start_iso, |
3141 | .stop_iso = ohci_stop_iso, | 3152 | .stop_iso = ohci_stop_iso, |
3142 | }; | 3153 | }; |
diff --git a/drivers/media/dvb/firewire/firedtv-fw.c b/drivers/media/dvb/firewire/firedtv-fw.c index 8022b743af91..864b6274c729 100644 --- a/drivers/media/dvb/firewire/firedtv-fw.c +++ b/drivers/media/dvb/firewire/firedtv-fw.c | |||
@@ -125,6 +125,7 @@ static void handle_iso(struct fw_iso_context *context, u32 cycle, | |||
125 | 125 | ||
126 | i = (i + 1) & (N_PACKETS - 1); | 126 | i = (i + 1) & (N_PACKETS - 1); |
127 | } | 127 | } |
128 | fw_iso_context_queue_flush(ctx->context); | ||
128 | ctx->current_packet = i; | 129 | ctx->current_packet = i; |
129 | } | 130 | } |
130 | 131 | ||
diff --git a/include/linux/firewire.h b/include/linux/firewire.h index de90e1ff8488..c0fb405bb435 100644 --- a/include/linux/firewire.h +++ b/include/linux/firewire.h | |||
@@ -440,6 +440,7 @@ int fw_iso_context_queue(struct fw_iso_context *ctx, | |||
440 | struct fw_iso_packet *packet, | 440 | struct fw_iso_packet *packet, |
441 | struct fw_iso_buffer *buffer, | 441 | struct fw_iso_buffer *buffer, |
442 | unsigned long payload); | 442 | unsigned long payload); |
443 | void fw_iso_context_queue_flush(struct fw_iso_context *ctx); | ||
443 | int fw_iso_context_start(struct fw_iso_context *ctx, | 444 | int fw_iso_context_start(struct fw_iso_context *ctx, |
444 | int cycle, int sync, int tags); | 445 | int cycle, int sync, int tags); |
445 | int fw_iso_context_stop(struct fw_iso_context *ctx); | 446 | int fw_iso_context_stop(struct fw_iso_context *ctx); |
diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c index b18140ff2b93..87657dd7714c 100644 --- a/sound/firewire/amdtp.c +++ b/sound/firewire/amdtp.c | |||
@@ -396,6 +396,7 @@ static void out_packet_callback(struct fw_iso_context *context, u32 cycle, | |||
396 | 396 | ||
397 | for (i = 0; i < packets; ++i) | 397 | for (i = 0; i < packets; ++i) |
398 | queue_out_packet(s, ++cycle); | 398 | queue_out_packet(s, ++cycle); |
399 | fw_iso_context_queue_flush(s->context); | ||
399 | } | 400 | } |
400 | 401 | ||
401 | static int queue_initial_skip_packets(struct amdtp_out_stream *s) | 402 | static int queue_initial_skip_packets(struct amdtp_out_stream *s) |