diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-03-20 06:27:18 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-03-20 06:27:18 -0400 |
commit | 4958134df54c2c84e9c22ea042761d439164d26e (patch) | |
tree | 503177afab11f7d25b12a84ce25b481d305c51ba /drivers/media/dvb-core | |
parent | c4f528795d1add8b63652673f7262729f679c6c1 (diff) | |
parent | c698ca5278934c0ae32297a8725ced2e27585d7f (diff) |
Merge 4.16-rc6 into tty-next
We want the serial/tty fixes in here as well.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/media/dvb-core')
-rw-r--r-- | drivers/media/dvb-core/Makefile | 2 | ||||
-rw-r--r-- | drivers/media/dvb-core/dmxdev.c | 115 | ||||
-rw-r--r-- | drivers/media/dvb-core/dvb_demux.c | 112 | ||||
-rw-r--r-- | drivers/media/dvb-core/dvb_net.c | 5 | ||||
-rw-r--r-- | drivers/media/dvb-core/dvb_vb2.c | 31 |
5 files changed, 164 insertions, 101 deletions
diff --git a/drivers/media/dvb-core/Makefile b/drivers/media/dvb-core/Makefile index 3a105d82019a..62b028ded9f7 100644 --- a/drivers/media/dvb-core/Makefile +++ b/drivers/media/dvb-core/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | # | 4 | # |
5 | 5 | ||
6 | dvb-net-$(CONFIG_DVB_NET) := dvb_net.o | 6 | dvb-net-$(CONFIG_DVB_NET) := dvb_net.o |
7 | dvb-vb2-$(CONFIG_DVB_MMSP) := dvb_vb2.o | 7 | dvb-vb2-$(CONFIG_DVB_MMAP) := dvb_vb2.o |
8 | 8 | ||
9 | dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o \ | 9 | dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o \ |
10 | dvb_ca_en50221.o dvb_frontend.o \ | 10 | dvb_ca_en50221.o dvb_frontend.o \ |
diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c index 6d53af00190e..61a750fae465 100644 --- a/drivers/media/dvb-core/dmxdev.c +++ b/drivers/media/dvb-core/dmxdev.c | |||
@@ -128,11 +128,7 @@ static int dvb_dvr_open(struct inode *inode, struct file *file) | |||
128 | struct dvb_device *dvbdev = file->private_data; | 128 | struct dvb_device *dvbdev = file->private_data; |
129 | struct dmxdev *dmxdev = dvbdev->priv; | 129 | struct dmxdev *dmxdev = dvbdev->priv; |
130 | struct dmx_frontend *front; | 130 | struct dmx_frontend *front; |
131 | #ifndef DVB_MMAP | ||
132 | bool need_ringbuffer = false; | 131 | bool need_ringbuffer = false; |
133 | #else | ||
134 | const bool need_ringbuffer = true; | ||
135 | #endif | ||
136 | 132 | ||
137 | dprintk("%s\n", __func__); | 133 | dprintk("%s\n", __func__); |
138 | 134 | ||
@@ -144,17 +140,31 @@ static int dvb_dvr_open(struct inode *inode, struct file *file) | |||
144 | return -ENODEV; | 140 | return -ENODEV; |
145 | } | 141 | } |
146 | 142 | ||
147 | #ifndef DVB_MMAP | 143 | dmxdev->may_do_mmap = 0; |
144 | |||
145 | /* | ||
146 | * The logic here is a little tricky due to the ifdef. | ||
147 | * | ||
148 | * The ringbuffer is used for both read and mmap. | ||
149 | * | ||
150 | * It is not needed, however, on two situations: | ||
151 | * - Write devices (access with O_WRONLY); | ||
152 | * - For duplex device nodes, opened with O_RDWR. | ||
153 | */ | ||
154 | |||
148 | if ((file->f_flags & O_ACCMODE) == O_RDONLY) | 155 | if ((file->f_flags & O_ACCMODE) == O_RDONLY) |
149 | need_ringbuffer = true; | 156 | need_ringbuffer = true; |
150 | #else | 157 | else if ((file->f_flags & O_ACCMODE) == O_RDWR) { |
151 | if ((file->f_flags & O_ACCMODE) == O_RDWR) { | ||
152 | if (!(dmxdev->capabilities & DMXDEV_CAP_DUPLEX)) { | 158 | if (!(dmxdev->capabilities & DMXDEV_CAP_DUPLEX)) { |
159 | #ifdef CONFIG_DVB_MMAP | ||
160 | dmxdev->may_do_mmap = 1; | ||
161 | need_ringbuffer = true; | ||
162 | #else | ||
153 | mutex_unlock(&dmxdev->mutex); | 163 | mutex_unlock(&dmxdev->mutex); |
154 | return -EOPNOTSUPP; | 164 | return -EOPNOTSUPP; |
165 | #endif | ||
155 | } | 166 | } |
156 | } | 167 | } |
157 | #endif | ||
158 | 168 | ||
159 | if (need_ringbuffer) { | 169 | if (need_ringbuffer) { |
160 | void *mem; | 170 | void *mem; |
@@ -169,8 +179,9 @@ static int dvb_dvr_open(struct inode *inode, struct file *file) | |||
169 | return -ENOMEM; | 179 | return -ENOMEM; |
170 | } | 180 | } |
171 | dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE); | 181 | dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE); |
172 | dvb_vb2_init(&dmxdev->dvr_vb2_ctx, "dvr", | 182 | if (dmxdev->may_do_mmap) |
173 | file->f_flags & O_NONBLOCK); | 183 | dvb_vb2_init(&dmxdev->dvr_vb2_ctx, "dvr", |
184 | file->f_flags & O_NONBLOCK); | ||
174 | dvbdev->readers--; | 185 | dvbdev->readers--; |
175 | } | 186 | } |
176 | 187 | ||
@@ -200,11 +211,6 @@ static int dvb_dvr_release(struct inode *inode, struct file *file) | |||
200 | { | 211 | { |
201 | struct dvb_device *dvbdev = file->private_data; | 212 | struct dvb_device *dvbdev = file->private_data; |
202 | struct dmxdev *dmxdev = dvbdev->priv; | 213 | struct dmxdev *dmxdev = dvbdev->priv; |
203 | #ifndef DVB_MMAP | ||
204 | bool need_ringbuffer = false; | ||
205 | #else | ||
206 | const bool need_ringbuffer = true; | ||
207 | #endif | ||
208 | 214 | ||
209 | mutex_lock(&dmxdev->mutex); | 215 | mutex_lock(&dmxdev->mutex); |
210 | 216 | ||
@@ -213,15 +219,14 @@ static int dvb_dvr_release(struct inode *inode, struct file *file) | |||
213 | dmxdev->demux->connect_frontend(dmxdev->demux, | 219 | dmxdev->demux->connect_frontend(dmxdev->demux, |
214 | dmxdev->dvr_orig_fe); | 220 | dmxdev->dvr_orig_fe); |
215 | } | 221 | } |
216 | #ifndef DVB_MMAP | ||
217 | if ((file->f_flags & O_ACCMODE) == O_RDONLY) | ||
218 | need_ringbuffer = true; | ||
219 | #endif | ||
220 | 222 | ||
221 | if (need_ringbuffer) { | 223 | if (((file->f_flags & O_ACCMODE) == O_RDONLY) || |
222 | if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) | 224 | dmxdev->may_do_mmap) { |
223 | dvb_vb2_stream_off(&dmxdev->dvr_vb2_ctx); | 225 | if (dmxdev->may_do_mmap) { |
224 | dvb_vb2_release(&dmxdev->dvr_vb2_ctx); | 226 | if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) |
227 | dvb_vb2_stream_off(&dmxdev->dvr_vb2_ctx); | ||
228 | dvb_vb2_release(&dmxdev->dvr_vb2_ctx); | ||
229 | } | ||
225 | dvbdev->readers++; | 230 | dvbdev->readers++; |
226 | if (dmxdev->dvr_buffer.data) { | 231 | if (dmxdev->dvr_buffer.data) { |
227 | void *mem = dmxdev->dvr_buffer.data; | 232 | void *mem = dmxdev->dvr_buffer.data; |
@@ -380,7 +385,8 @@ static void dvb_dmxdev_filter_timer(struct dmxdev_filter *dmxdevfilter) | |||
380 | 385 | ||
381 | static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len, | 386 | static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len, |
382 | const u8 *buffer2, size_t buffer2_len, | 387 | const u8 *buffer2, size_t buffer2_len, |
383 | struct dmx_section_filter *filter) | 388 | struct dmx_section_filter *filter, |
389 | u32 *buffer_flags) | ||
384 | { | 390 | { |
385 | struct dmxdev_filter *dmxdevfilter = filter->priv; | 391 | struct dmxdev_filter *dmxdevfilter = filter->priv; |
386 | int ret; | 392 | int ret; |
@@ -399,10 +405,12 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len, | |||
399 | dprintk("section callback %*ph\n", 6, buffer1); | 405 | dprintk("section callback %*ph\n", 6, buffer1); |
400 | if (dvb_vb2_is_streaming(&dmxdevfilter->vb2_ctx)) { | 406 | if (dvb_vb2_is_streaming(&dmxdevfilter->vb2_ctx)) { |
401 | ret = dvb_vb2_fill_buffer(&dmxdevfilter->vb2_ctx, | 407 | ret = dvb_vb2_fill_buffer(&dmxdevfilter->vb2_ctx, |
402 | buffer1, buffer1_len); | 408 | buffer1, buffer1_len, |
409 | buffer_flags); | ||
403 | if (ret == buffer1_len) | 410 | if (ret == buffer1_len) |
404 | ret = dvb_vb2_fill_buffer(&dmxdevfilter->vb2_ctx, | 411 | ret = dvb_vb2_fill_buffer(&dmxdevfilter->vb2_ctx, |
405 | buffer2, buffer2_len); | 412 | buffer2, buffer2_len, |
413 | buffer_flags); | ||
406 | } else { | 414 | } else { |
407 | ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, | 415 | ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, |
408 | buffer1, buffer1_len); | 416 | buffer1, buffer1_len); |
@@ -422,11 +430,12 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len, | |||
422 | 430 | ||
423 | static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len, | 431 | static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len, |
424 | const u8 *buffer2, size_t buffer2_len, | 432 | const u8 *buffer2, size_t buffer2_len, |
425 | struct dmx_ts_feed *feed) | 433 | struct dmx_ts_feed *feed, |
434 | u32 *buffer_flags) | ||
426 | { | 435 | { |
427 | struct dmxdev_filter *dmxdevfilter = feed->priv; | 436 | struct dmxdev_filter *dmxdevfilter = feed->priv; |
428 | struct dvb_ringbuffer *buffer; | 437 | struct dvb_ringbuffer *buffer; |
429 | #ifdef DVB_MMAP | 438 | #ifdef CONFIG_DVB_MMAP |
430 | struct dvb_vb2_ctx *ctx; | 439 | struct dvb_vb2_ctx *ctx; |
431 | #endif | 440 | #endif |
432 | int ret; | 441 | int ret; |
@@ -440,20 +449,22 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len, | |||
440 | if (dmxdevfilter->params.pes.output == DMX_OUT_TAP || | 449 | if (dmxdevfilter->params.pes.output == DMX_OUT_TAP || |
441 | dmxdevfilter->params.pes.output == DMX_OUT_TSDEMUX_TAP) { | 450 | dmxdevfilter->params.pes.output == DMX_OUT_TSDEMUX_TAP) { |
442 | buffer = &dmxdevfilter->buffer; | 451 | buffer = &dmxdevfilter->buffer; |
443 | #ifdef DVB_MMAP | 452 | #ifdef CONFIG_DVB_MMAP |
444 | ctx = &dmxdevfilter->vb2_ctx; | 453 | ctx = &dmxdevfilter->vb2_ctx; |
445 | #endif | 454 | #endif |
446 | } else { | 455 | } else { |
447 | buffer = &dmxdevfilter->dev->dvr_buffer; | 456 | buffer = &dmxdevfilter->dev->dvr_buffer; |
448 | #ifdef DVB_MMAP | 457 | #ifdef CONFIG_DVB_MMAP |
449 | ctx = &dmxdevfilter->dev->dvr_vb2_ctx; | 458 | ctx = &dmxdevfilter->dev->dvr_vb2_ctx; |
450 | #endif | 459 | #endif |
451 | } | 460 | } |
452 | 461 | ||
453 | if (dvb_vb2_is_streaming(ctx)) { | 462 | if (dvb_vb2_is_streaming(ctx)) { |
454 | ret = dvb_vb2_fill_buffer(ctx, buffer1, buffer1_len); | 463 | ret = dvb_vb2_fill_buffer(ctx, buffer1, buffer1_len, |
464 | buffer_flags); | ||
455 | if (ret == buffer1_len) | 465 | if (ret == buffer1_len) |
456 | ret = dvb_vb2_fill_buffer(ctx, buffer2, buffer2_len); | 466 | ret = dvb_vb2_fill_buffer(ctx, buffer2, buffer2_len, |
467 | buffer_flags); | ||
457 | } else { | 468 | } else { |
458 | if (buffer->error) { | 469 | if (buffer->error) { |
459 | spin_unlock(&dmxdevfilter->dev->lock); | 470 | spin_unlock(&dmxdevfilter->dev->lock); |
@@ -802,6 +813,12 @@ static int dvb_demux_open(struct inode *inode, struct file *file) | |||
802 | mutex_init(&dmxdevfilter->mutex); | 813 | mutex_init(&dmxdevfilter->mutex); |
803 | file->private_data = dmxdevfilter; | 814 | file->private_data = dmxdevfilter; |
804 | 815 | ||
816 | #ifdef CONFIG_DVB_MMAP | ||
817 | dmxdev->may_do_mmap = 1; | ||
818 | #else | ||
819 | dmxdev->may_do_mmap = 0; | ||
820 | #endif | ||
821 | |||
805 | dvb_ringbuffer_init(&dmxdevfilter->buffer, NULL, 8192); | 822 | dvb_ringbuffer_init(&dmxdevfilter->buffer, NULL, 8192); |
806 | dvb_vb2_init(&dmxdevfilter->vb2_ctx, "demux_filter", | 823 | dvb_vb2_init(&dmxdevfilter->vb2_ctx, "demux_filter", |
807 | file->f_flags & O_NONBLOCK); | 824 | file->f_flags & O_NONBLOCK); |
@@ -1111,7 +1128,7 @@ static int dvb_demux_do_ioctl(struct file *file, | |||
1111 | mutex_unlock(&dmxdevfilter->mutex); | 1128 | mutex_unlock(&dmxdevfilter->mutex); |
1112 | break; | 1129 | break; |
1113 | 1130 | ||
1114 | #ifdef DVB_MMAP | 1131 | #ifdef CONFIG_DVB_MMAP |
1115 | case DMX_REQBUFS: | 1132 | case DMX_REQBUFS: |
1116 | if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { | 1133 | if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { |
1117 | mutex_unlock(&dmxdev->mutex); | 1134 | mutex_unlock(&dmxdev->mutex); |
@@ -1160,7 +1177,7 @@ static int dvb_demux_do_ioctl(struct file *file, | |||
1160 | break; | 1177 | break; |
1161 | #endif | 1178 | #endif |
1162 | default: | 1179 | default: |
1163 | ret = -EINVAL; | 1180 | ret = -ENOTTY; |
1164 | break; | 1181 | break; |
1165 | } | 1182 | } |
1166 | mutex_unlock(&dmxdev->mutex); | 1183 | mutex_unlock(&dmxdev->mutex); |
@@ -1199,13 +1216,16 @@ static __poll_t dvb_demux_poll(struct file *file, poll_table *wait) | |||
1199 | return mask; | 1216 | return mask; |
1200 | } | 1217 | } |
1201 | 1218 | ||
1202 | #ifdef DVB_MMAP | 1219 | #ifdef CONFIG_DVB_MMAP |
1203 | static int dvb_demux_mmap(struct file *file, struct vm_area_struct *vma) | 1220 | static int dvb_demux_mmap(struct file *file, struct vm_area_struct *vma) |
1204 | { | 1221 | { |
1205 | struct dmxdev_filter *dmxdevfilter = file->private_data; | 1222 | struct dmxdev_filter *dmxdevfilter = file->private_data; |
1206 | struct dmxdev *dmxdev = dmxdevfilter->dev; | 1223 | struct dmxdev *dmxdev = dmxdevfilter->dev; |
1207 | int ret; | 1224 | int ret; |
1208 | 1225 | ||
1226 | if (!dmxdev->may_do_mmap) | ||
1227 | return -ENOTTY; | ||
1228 | |||
1209 | if (mutex_lock_interruptible(&dmxdev->mutex)) | 1229 | if (mutex_lock_interruptible(&dmxdev->mutex)) |
1210 | return -ERESTARTSYS; | 1230 | return -ERESTARTSYS; |
1211 | 1231 | ||
@@ -1249,7 +1269,7 @@ static const struct file_operations dvb_demux_fops = { | |||
1249 | .release = dvb_demux_release, | 1269 | .release = dvb_demux_release, |
1250 | .poll = dvb_demux_poll, | 1270 | .poll = dvb_demux_poll, |
1251 | .llseek = default_llseek, | 1271 | .llseek = default_llseek, |
1252 | #ifdef DVB_MMAP | 1272 | #ifdef CONFIG_DVB_MMAP |
1253 | .mmap = dvb_demux_mmap, | 1273 | .mmap = dvb_demux_mmap, |
1254 | #endif | 1274 | #endif |
1255 | }; | 1275 | }; |
@@ -1280,7 +1300,7 @@ static int dvb_dvr_do_ioctl(struct file *file, | |||
1280 | ret = dvb_dvr_set_buffer_size(dmxdev, arg); | 1300 | ret = dvb_dvr_set_buffer_size(dmxdev, arg); |
1281 | break; | 1301 | break; |
1282 | 1302 | ||
1283 | #ifdef DVB_MMAP | 1303 | #ifdef CONFIG_DVB_MMAP |
1284 | case DMX_REQBUFS: | 1304 | case DMX_REQBUFS: |
1285 | ret = dvb_vb2_reqbufs(&dmxdev->dvr_vb2_ctx, parg); | 1305 | ret = dvb_vb2_reqbufs(&dmxdev->dvr_vb2_ctx, parg); |
1286 | break; | 1306 | break; |
@@ -1304,7 +1324,7 @@ static int dvb_dvr_do_ioctl(struct file *file, | |||
1304 | break; | 1324 | break; |
1305 | #endif | 1325 | #endif |
1306 | default: | 1326 | default: |
1307 | ret = -EINVAL; | 1327 | ret = -ENOTTY; |
1308 | break; | 1328 | break; |
1309 | } | 1329 | } |
1310 | mutex_unlock(&dmxdev->mutex); | 1330 | mutex_unlock(&dmxdev->mutex); |
@@ -1322,11 +1342,6 @@ static __poll_t dvb_dvr_poll(struct file *file, poll_table *wait) | |||
1322 | struct dvb_device *dvbdev = file->private_data; | 1342 | struct dvb_device *dvbdev = file->private_data; |
1323 | struct dmxdev *dmxdev = dvbdev->priv; | 1343 | struct dmxdev *dmxdev = dvbdev->priv; |
1324 | __poll_t mask = 0; | 1344 | __poll_t mask = 0; |
1325 | #ifndef DVB_MMAP | ||
1326 | bool need_ringbuffer = false; | ||
1327 | #else | ||
1328 | const bool need_ringbuffer = true; | ||
1329 | #endif | ||
1330 | 1345 | ||
1331 | dprintk("%s\n", __func__); | 1346 | dprintk("%s\n", __func__); |
1332 | 1347 | ||
@@ -1337,11 +1352,8 @@ static __poll_t dvb_dvr_poll(struct file *file, poll_table *wait) | |||
1337 | 1352 | ||
1338 | poll_wait(file, &dmxdev->dvr_buffer.queue, wait); | 1353 | poll_wait(file, &dmxdev->dvr_buffer.queue, wait); |
1339 | 1354 | ||
1340 | #ifndef DVB_MMAP | 1355 | if (((file->f_flags & O_ACCMODE) == O_RDONLY) || |
1341 | if ((file->f_flags & O_ACCMODE) == O_RDONLY) | 1356 | dmxdev->may_do_mmap) { |
1342 | need_ringbuffer = true; | ||
1343 | #endif | ||
1344 | if (need_ringbuffer) { | ||
1345 | if (dmxdev->dvr_buffer.error) | 1357 | if (dmxdev->dvr_buffer.error) |
1346 | mask |= (EPOLLIN | EPOLLRDNORM | EPOLLPRI | EPOLLERR); | 1358 | mask |= (EPOLLIN | EPOLLRDNORM | EPOLLPRI | EPOLLERR); |
1347 | 1359 | ||
@@ -1353,13 +1365,16 @@ static __poll_t dvb_dvr_poll(struct file *file, poll_table *wait) | |||
1353 | return mask; | 1365 | return mask; |
1354 | } | 1366 | } |
1355 | 1367 | ||
1356 | #ifdef DVB_MMAP | 1368 | #ifdef CONFIG_DVB_MMAP |
1357 | static int dvb_dvr_mmap(struct file *file, struct vm_area_struct *vma) | 1369 | static int dvb_dvr_mmap(struct file *file, struct vm_area_struct *vma) |
1358 | { | 1370 | { |
1359 | struct dvb_device *dvbdev = file->private_data; | 1371 | struct dvb_device *dvbdev = file->private_data; |
1360 | struct dmxdev *dmxdev = dvbdev->priv; | 1372 | struct dmxdev *dmxdev = dvbdev->priv; |
1361 | int ret; | 1373 | int ret; |
1362 | 1374 | ||
1375 | if (!dmxdev->may_do_mmap) | ||
1376 | return -ENOTTY; | ||
1377 | |||
1363 | if (dmxdev->exit) | 1378 | if (dmxdev->exit) |
1364 | return -ENODEV; | 1379 | return -ENODEV; |
1365 | 1380 | ||
@@ -1381,7 +1396,7 @@ static const struct file_operations dvb_dvr_fops = { | |||
1381 | .release = dvb_dvr_release, | 1396 | .release = dvb_dvr_release, |
1382 | .poll = dvb_dvr_poll, | 1397 | .poll = dvb_dvr_poll, |
1383 | .llseek = default_llseek, | 1398 | .llseek = default_llseek, |
1384 | #ifdef DVB_MMAP | 1399 | #ifdef CONFIG_DVB_MMAP |
1385 | .mmap = dvb_dvr_mmap, | 1400 | .mmap = dvb_dvr_mmap, |
1386 | #endif | 1401 | #endif |
1387 | }; | 1402 | }; |
diff --git a/drivers/media/dvb-core/dvb_demux.c b/drivers/media/dvb-core/dvb_demux.c index 210eed0269b0..f45091246bdc 100644 --- a/drivers/media/dvb-core/dvb_demux.c +++ b/drivers/media/dvb-core/dvb_demux.c | |||
@@ -55,6 +55,17 @@ MODULE_PARM_DESC(dvb_demux_feed_err_pkts, | |||
55 | dprintk(x); \ | 55 | dprintk(x); \ |
56 | } while (0) | 56 | } while (0) |
57 | 57 | ||
58 | #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG | ||
59 | # define dprintk_sect_loss(x...) dprintk(x) | ||
60 | #else | ||
61 | # define dprintk_sect_loss(x...) | ||
62 | #endif | ||
63 | |||
64 | #define set_buf_flags(__feed, __flag) \ | ||
65 | do { \ | ||
66 | (__feed)->buffer_flags |= (__flag); \ | ||
67 | } while (0) | ||
68 | |||
58 | /****************************************************************************** | 69 | /****************************************************************************** |
59 | * static inlined helper functions | 70 | * static inlined helper functions |
60 | ******************************************************************************/ | 71 | ******************************************************************************/ |
@@ -104,31 +115,30 @@ static inline int dvb_dmx_swfilter_payload(struct dvb_demux_feed *feed, | |||
104 | { | 115 | { |
105 | int count = payload(buf); | 116 | int count = payload(buf); |
106 | int p; | 117 | int p; |
107 | #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG | ||
108 | int ccok; | 118 | int ccok; |
109 | u8 cc; | 119 | u8 cc; |
110 | #endif | ||
111 | 120 | ||
112 | if (count == 0) | 121 | if (count == 0) |
113 | return -1; | 122 | return -1; |
114 | 123 | ||
115 | p = 188 - count; | 124 | p = 188 - count; |
116 | 125 | ||
117 | #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG | ||
118 | cc = buf[3] & 0x0f; | 126 | cc = buf[3] & 0x0f; |
119 | ccok = ((feed->cc + 1) & 0x0f) == cc; | 127 | ccok = ((feed->cc + 1) & 0x0f) == cc; |
120 | feed->cc = cc; | 128 | feed->cc = cc; |
121 | if (!ccok) | 129 | if (!ccok) { |
122 | dprintk("missed packet: %d instead of %d!\n", | 130 | set_buf_flags(feed, DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED); |
123 | cc, (feed->cc + 1) & 0x0f); | 131 | dprintk_sect_loss("missed packet: %d instead of %d!\n", |
124 | #endif | 132 | cc, (feed->cc + 1) & 0x0f); |
133 | } | ||
125 | 134 | ||
126 | if (buf[1] & 0x40) // PUSI ? | 135 | if (buf[1] & 0x40) // PUSI ? |
127 | feed->peslen = 0xfffa; | 136 | feed->peslen = 0xfffa; |
128 | 137 | ||
129 | feed->peslen += count; | 138 | feed->peslen += count; |
130 | 139 | ||
131 | return feed->cb.ts(&buf[p], count, NULL, 0, &feed->feed.ts); | 140 | return feed->cb.ts(&buf[p], count, NULL, 0, &feed->feed.ts, |
141 | &feed->buffer_flags); | ||
132 | } | 142 | } |
133 | 143 | ||
134 | static int dvb_dmx_swfilter_sectionfilter(struct dvb_demux_feed *feed, | 144 | static int dvb_dmx_swfilter_sectionfilter(struct dvb_demux_feed *feed, |
@@ -150,7 +160,7 @@ static int dvb_dmx_swfilter_sectionfilter(struct dvb_demux_feed *feed, | |||
150 | return 0; | 160 | return 0; |
151 | 161 | ||
152 | return feed->cb.sec(feed->feed.sec.secbuf, feed->feed.sec.seclen, | 162 | return feed->cb.sec(feed->feed.sec.secbuf, feed->feed.sec.seclen, |
153 | NULL, 0, &f->filter); | 163 | NULL, 0, &f->filter, &feed->buffer_flags); |
154 | } | 164 | } |
155 | 165 | ||
156 | static inline int dvb_dmx_swfilter_section_feed(struct dvb_demux_feed *feed) | 166 | static inline int dvb_dmx_swfilter_section_feed(struct dvb_demux_feed *feed) |
@@ -169,8 +179,10 @@ static inline int dvb_dmx_swfilter_section_feed(struct dvb_demux_feed *feed) | |||
169 | if (sec->check_crc) { | 179 | if (sec->check_crc) { |
170 | section_syntax_indicator = ((sec->secbuf[1] & 0x80) != 0); | 180 | section_syntax_indicator = ((sec->secbuf[1] & 0x80) != 0); |
171 | if (section_syntax_indicator && | 181 | if (section_syntax_indicator && |
172 | demux->check_crc32(feed, sec->secbuf, sec->seclen)) | 182 | demux->check_crc32(feed, sec->secbuf, sec->seclen)) { |
183 | set_buf_flags(feed, DMX_BUFFER_FLAG_HAD_CRC32_DISCARD); | ||
173 | return -1; | 184 | return -1; |
185 | } | ||
174 | } | 186 | } |
175 | 187 | ||
176 | do { | 188 | do { |
@@ -187,7 +199,6 @@ static void dvb_dmx_swfilter_section_new(struct dvb_demux_feed *feed) | |||
187 | { | 199 | { |
188 | struct dmx_section_feed *sec = &feed->feed.sec; | 200 | struct dmx_section_feed *sec = &feed->feed.sec; |
189 | 201 | ||
190 | #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG | ||
191 | if (sec->secbufp < sec->tsfeedp) { | 202 | if (sec->secbufp < sec->tsfeedp) { |
192 | int n = sec->tsfeedp - sec->secbufp; | 203 | int n = sec->tsfeedp - sec->secbufp; |
193 | 204 | ||
@@ -197,12 +208,13 @@ static void dvb_dmx_swfilter_section_new(struct dvb_demux_feed *feed) | |||
197 | * but just first and last. | 208 | * but just first and last. |
198 | */ | 209 | */ |
199 | if (sec->secbuf[0] != 0xff || sec->secbuf[n - 1] != 0xff) { | 210 | if (sec->secbuf[0] != 0xff || sec->secbuf[n - 1] != 0xff) { |
200 | dprintk("section ts padding loss: %d/%d\n", | 211 | set_buf_flags(feed, |
201 | n, sec->tsfeedp); | 212 | DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED); |
202 | dprintk("pad data: %*ph\n", n, sec->secbuf); | 213 | dprintk_sect_loss("section ts padding loss: %d/%d\n", |
214 | n, sec->tsfeedp); | ||
215 | dprintk_sect_loss("pad data: %*ph\n", n, sec->secbuf); | ||
203 | } | 216 | } |
204 | } | 217 | } |
205 | #endif | ||
206 | 218 | ||
207 | sec->tsfeedp = sec->secbufp = sec->seclen = 0; | 219 | sec->tsfeedp = sec->secbufp = sec->seclen = 0; |
208 | sec->secbuf = sec->secbuf_base; | 220 | sec->secbuf = sec->secbuf_base; |
@@ -237,11 +249,10 @@ static int dvb_dmx_swfilter_section_copy_dump(struct dvb_demux_feed *feed, | |||
237 | return 0; | 249 | return 0; |
238 | 250 | ||
239 | if (sec->tsfeedp + len > DMX_MAX_SECFEED_SIZE) { | 251 | if (sec->tsfeedp + len > DMX_MAX_SECFEED_SIZE) { |
240 | #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG | 252 | set_buf_flags(feed, DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED); |
241 | dprintk("section buffer full loss: %d/%d\n", | 253 | dprintk_sect_loss("section buffer full loss: %d/%d\n", |
242 | sec->tsfeedp + len - DMX_MAX_SECFEED_SIZE, | 254 | sec->tsfeedp + len - DMX_MAX_SECFEED_SIZE, |
243 | DMX_MAX_SECFEED_SIZE); | 255 | DMX_MAX_SECFEED_SIZE); |
244 | #endif | ||
245 | len = DMX_MAX_SECFEED_SIZE - sec->tsfeedp; | 256 | len = DMX_MAX_SECFEED_SIZE - sec->tsfeedp; |
246 | } | 257 | } |
247 | 258 | ||
@@ -269,12 +280,13 @@ static int dvb_dmx_swfilter_section_copy_dump(struct dvb_demux_feed *feed, | |||
269 | sec->seclen = seclen; | 280 | sec->seclen = seclen; |
270 | sec->crc_val = ~0; | 281 | sec->crc_val = ~0; |
271 | /* dump [secbuf .. secbuf+seclen) */ | 282 | /* dump [secbuf .. secbuf+seclen) */ |
272 | if (feed->pusi_seen) | 283 | if (feed->pusi_seen) { |
273 | dvb_dmx_swfilter_section_feed(feed); | 284 | dvb_dmx_swfilter_section_feed(feed); |
274 | #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG | 285 | } else { |
275 | else | 286 | set_buf_flags(feed, |
276 | dprintk("pusi not seen, discarding section data\n"); | 287 | DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED); |
277 | #endif | 288 | dprintk_sect_loss("pusi not seen, discarding section data\n"); |
289 | } | ||
278 | sec->secbufp += seclen; /* secbufp and secbuf moving together is */ | 290 | sec->secbufp += seclen; /* secbufp and secbuf moving together is */ |
279 | sec->secbuf += seclen; /* redundant but saves pointer arithmetic */ | 291 | sec->secbuf += seclen; /* redundant but saves pointer arithmetic */ |
280 | } | 292 | } |
@@ -307,18 +319,22 @@ static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed, | |||
307 | } | 319 | } |
308 | 320 | ||
309 | if (!ccok || dc_i) { | 321 | if (!ccok || dc_i) { |
310 | #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG | 322 | if (dc_i) { |
311 | if (dc_i) | 323 | set_buf_flags(feed, |
312 | dprintk("%d frame with disconnect indicator\n", | 324 | DMX_BUFFER_FLAG_DISCONTINUITY_INDICATOR); |
325 | dprintk_sect_loss("%d frame with disconnect indicator\n", | ||
313 | cc); | 326 | cc); |
314 | else | 327 | } else { |
315 | dprintk("discontinuity: %d instead of %d. %d bytes lost\n", | 328 | set_buf_flags(feed, |
329 | DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED); | ||
330 | dprintk_sect_loss("discontinuity: %d instead of %d. %d bytes lost\n", | ||
316 | cc, (feed->cc + 1) & 0x0f, count + 4); | 331 | cc, (feed->cc + 1) & 0x0f, count + 4); |
332 | } | ||
317 | /* | 333 | /* |
318 | * those bytes under sume circumstances will again be reported | 334 | * those bytes under some circumstances will again be reported |
319 | * in the following dvb_dmx_swfilter_section_new | 335 | * in the following dvb_dmx_swfilter_section_new |
320 | */ | 336 | */ |
321 | #endif | 337 | |
322 | /* | 338 | /* |
323 | * Discontinuity detected. Reset pusi_seen to | 339 | * Discontinuity detected. Reset pusi_seen to |
324 | * stop feeding of suspicious data until next PUSI=1 arrives | 340 | * stop feeding of suspicious data until next PUSI=1 arrives |
@@ -326,6 +342,7 @@ static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed, | |||
326 | * FIXME: does it make sense if the MPEG-TS is the one | 342 | * FIXME: does it make sense if the MPEG-TS is the one |
327 | * reporting discontinuity? | 343 | * reporting discontinuity? |
328 | */ | 344 | */ |
345 | |||
329 | feed->pusi_seen = false; | 346 | feed->pusi_seen = false; |
330 | dvb_dmx_swfilter_section_new(feed); | 347 | dvb_dmx_swfilter_section_new(feed); |
331 | } | 348 | } |
@@ -345,11 +362,11 @@ static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed, | |||
345 | dvb_dmx_swfilter_section_new(feed); | 362 | dvb_dmx_swfilter_section_new(feed); |
346 | dvb_dmx_swfilter_section_copy_dump(feed, after, | 363 | dvb_dmx_swfilter_section_copy_dump(feed, after, |
347 | after_len); | 364 | after_len); |
365 | } else if (count > 0) { | ||
366 | set_buf_flags(feed, | ||
367 | DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED); | ||
368 | dprintk_sect_loss("PUSI=1 but %d bytes lost\n", count); | ||
348 | } | 369 | } |
349 | #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG | ||
350 | else if (count > 0) | ||
351 | dprintk("PUSI=1 but %d bytes lost\n", count); | ||
352 | #endif | ||
353 | } else { | 370 | } else { |
354 | /* PUSI=0 (is not set), no section boundary */ | 371 | /* PUSI=0 (is not set), no section boundary */ |
355 | dvb_dmx_swfilter_section_copy_dump(feed, &buf[p], count); | 372 | dvb_dmx_swfilter_section_copy_dump(feed, &buf[p], count); |
@@ -369,7 +386,8 @@ static inline void dvb_dmx_swfilter_packet_type(struct dvb_demux_feed *feed, | |||
369 | if (feed->ts_type & TS_PAYLOAD_ONLY) | 386 | if (feed->ts_type & TS_PAYLOAD_ONLY) |
370 | dvb_dmx_swfilter_payload(feed, buf); | 387 | dvb_dmx_swfilter_payload(feed, buf); |
371 | else | 388 | else |
372 | feed->cb.ts(buf, 188, NULL, 0, &feed->feed.ts); | 389 | feed->cb.ts(buf, 188, NULL, 0, &feed->feed.ts, |
390 | &feed->buffer_flags); | ||
373 | } | 391 | } |
374 | /* Used only on full-featured devices */ | 392 | /* Used only on full-featured devices */ |
375 | if (feed->ts_type & TS_DECODER) | 393 | if (feed->ts_type & TS_DECODER) |
@@ -430,6 +448,11 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf) | |||
430 | } | 448 | } |
431 | 449 | ||
432 | if (buf[1] & 0x80) { | 450 | if (buf[1] & 0x80) { |
451 | list_for_each_entry(feed, &demux->feed_list, list_head) { | ||
452 | if ((feed->pid != pid) && (feed->pid != 0x2000)) | ||
453 | continue; | ||
454 | set_buf_flags(feed, DMX_BUFFER_FLAG_TEI); | ||
455 | } | ||
433 | dprintk_tscheck("TEI detected. PID=0x%x data1=0x%x\n", | 456 | dprintk_tscheck("TEI detected. PID=0x%x data1=0x%x\n", |
434 | pid, buf[1]); | 457 | pid, buf[1]); |
435 | /* data in this packet can't be trusted - drop it unless | 458 | /* data in this packet can't be trusted - drop it unless |
@@ -445,6 +468,13 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf) | |||
445 | (demux->cnt_storage[pid] + 1) & 0xf; | 468 | (demux->cnt_storage[pid] + 1) & 0xf; |
446 | 469 | ||
447 | if ((buf[3] & 0xf) != demux->cnt_storage[pid]) { | 470 | if ((buf[3] & 0xf) != demux->cnt_storage[pid]) { |
471 | list_for_each_entry(feed, &demux->feed_list, list_head) { | ||
472 | if ((feed->pid != pid) && (feed->pid != 0x2000)) | ||
473 | continue; | ||
474 | set_buf_flags(feed, | ||
475 | DMX_BUFFER_PKT_COUNTER_MISMATCH); | ||
476 | } | ||
477 | |||
448 | dprintk_tscheck("TS packet counter mismatch. PID=0x%x expected 0x%x got 0x%x\n", | 478 | dprintk_tscheck("TS packet counter mismatch. PID=0x%x expected 0x%x got 0x%x\n", |
449 | pid, demux->cnt_storage[pid], | 479 | pid, demux->cnt_storage[pid], |
450 | buf[3] & 0xf); | 480 | buf[3] & 0xf); |
@@ -466,7 +496,8 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf) | |||
466 | if (feed->pid == pid) | 496 | if (feed->pid == pid) |
467 | dvb_dmx_swfilter_packet_type(feed, buf); | 497 | dvb_dmx_swfilter_packet_type(feed, buf); |
468 | else if (feed->pid == 0x2000) | 498 | else if (feed->pid == 0x2000) |
469 | feed->cb.ts(buf, 188, NULL, 0, &feed->feed.ts); | 499 | feed->cb.ts(buf, 188, NULL, 0, &feed->feed.ts, |
500 | &feed->buffer_flags); | ||
470 | } | 501 | } |
471 | } | 502 | } |
472 | 503 | ||
@@ -585,7 +616,8 @@ void dvb_dmx_swfilter_raw(struct dvb_demux *demux, const u8 *buf, size_t count) | |||
585 | 616 | ||
586 | spin_lock_irqsave(&demux->lock, flags); | 617 | spin_lock_irqsave(&demux->lock, flags); |
587 | 618 | ||
588 | demux->feed->cb.ts(buf, count, NULL, 0, &demux->feed->feed.ts); | 619 | demux->feed->cb.ts(buf, count, NULL, 0, &demux->feed->feed.ts, |
620 | &demux->feed->buffer_flags); | ||
589 | 621 | ||
590 | spin_unlock_irqrestore(&demux->lock, flags); | 622 | spin_unlock_irqrestore(&demux->lock, flags); |
591 | } | 623 | } |
@@ -785,6 +817,7 @@ static int dvbdmx_allocate_ts_feed(struct dmx_demux *dmx, | |||
785 | feed->demux = demux; | 817 | feed->demux = demux; |
786 | feed->pid = 0xffff; | 818 | feed->pid = 0xffff; |
787 | feed->peslen = 0xfffa; | 819 | feed->peslen = 0xfffa; |
820 | feed->buffer_flags = 0; | ||
788 | 821 | ||
789 | (*ts_feed) = &feed->feed.ts; | 822 | (*ts_feed) = &feed->feed.ts; |
790 | (*ts_feed)->parent = dmx; | 823 | (*ts_feed)->parent = dmx; |
@@ -1042,6 +1075,7 @@ static int dvbdmx_allocate_section_feed(struct dmx_demux *demux, | |||
1042 | dvbdmxfeed->cb.sec = callback; | 1075 | dvbdmxfeed->cb.sec = callback; |
1043 | dvbdmxfeed->demux = dvbdmx; | 1076 | dvbdmxfeed->demux = dvbdmx; |
1044 | dvbdmxfeed->pid = 0xffff; | 1077 | dvbdmxfeed->pid = 0xffff; |
1078 | dvbdmxfeed->buffer_flags = 0; | ||
1045 | dvbdmxfeed->feed.sec.secbuf = dvbdmxfeed->feed.sec.secbuf_base; | 1079 | dvbdmxfeed->feed.sec.secbuf = dvbdmxfeed->feed.sec.secbuf_base; |
1046 | dvbdmxfeed->feed.sec.secbufp = dvbdmxfeed->feed.sec.seclen = 0; | 1080 | dvbdmxfeed->feed.sec.secbufp = dvbdmxfeed->feed.sec.seclen = 0; |
1047 | dvbdmxfeed->feed.sec.tsfeedp = 0; | 1081 | dvbdmxfeed->feed.sec.tsfeedp = 0; |
diff --git a/drivers/media/dvb-core/dvb_net.c b/drivers/media/dvb-core/dvb_net.c index b6c7eec863b9..ba39f9942e1d 100644 --- a/drivers/media/dvb-core/dvb_net.c +++ b/drivers/media/dvb-core/dvb_net.c | |||
@@ -883,7 +883,8 @@ static void dvb_net_ule(struct net_device *dev, const u8 *buf, size_t buf_len) | |||
883 | 883 | ||
884 | static int dvb_net_ts_callback(const u8 *buffer1, size_t buffer1_len, | 884 | static int dvb_net_ts_callback(const u8 *buffer1, size_t buffer1_len, |
885 | const u8 *buffer2, size_t buffer2_len, | 885 | const u8 *buffer2, size_t buffer2_len, |
886 | struct dmx_ts_feed *feed) | 886 | struct dmx_ts_feed *feed, |
887 | u32 *buffer_flags) | ||
887 | { | 888 | { |
888 | struct net_device *dev = feed->priv; | 889 | struct net_device *dev = feed->priv; |
889 | 890 | ||
@@ -992,7 +993,7 @@ static void dvb_net_sec(struct net_device *dev, | |||
992 | 993 | ||
993 | static int dvb_net_sec_callback(const u8 *buffer1, size_t buffer1_len, | 994 | static int dvb_net_sec_callback(const u8 *buffer1, size_t buffer1_len, |
994 | const u8 *buffer2, size_t buffer2_len, | 995 | const u8 *buffer2, size_t buffer2_len, |
995 | struct dmx_section_filter *filter) | 996 | struct dmx_section_filter *filter, u32 *buffer_flags) |
996 | { | 997 | { |
997 | struct net_device *dev = filter->priv; | 998 | struct net_device *dev = filter->priv; |
998 | 999 | ||
diff --git a/drivers/media/dvb-core/dvb_vb2.c b/drivers/media/dvb-core/dvb_vb2.c index 763145d74e83..b811adf88afa 100644 --- a/drivers/media/dvb-core/dvb_vb2.c +++ b/drivers/media/dvb-core/dvb_vb2.c | |||
@@ -256,7 +256,8 @@ int dvb_vb2_is_streaming(struct dvb_vb2_ctx *ctx) | |||
256 | } | 256 | } |
257 | 257 | ||
258 | int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx, | 258 | int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx, |
259 | const unsigned char *src, int len) | 259 | const unsigned char *src, int len, |
260 | enum dmx_buffer_flags *buffer_flags) | ||
260 | { | 261 | { |
261 | unsigned long flags = 0; | 262 | unsigned long flags = 0; |
262 | void *vbuf = NULL; | 263 | void *vbuf = NULL; |
@@ -264,15 +265,17 @@ int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx, | |||
264 | unsigned char *psrc = (unsigned char *)src; | 265 | unsigned char *psrc = (unsigned char *)src; |
265 | int ll = 0; | 266 | int ll = 0; |
266 | 267 | ||
267 | dprintk(3, "[%s] %d bytes are rcvd\n", ctx->name, len); | 268 | /* |
268 | if (!src) { | 269 | * normal case: This func is called twice from demux driver |
269 | dprintk(3, "[%s]:NULL pointer src\n", ctx->name); | 270 | * one with valid src pointer, second time with NULL pointer |
270 | /**normal case: This func is called twice from demux driver | 271 | */ |
271 | * once with valid src pointer, second time with NULL pointer | 272 | if (!src || !len) |
272 | */ | ||
273 | return 0; | 273 | return 0; |
274 | } | ||
275 | spin_lock_irqsave(&ctx->slock, flags); | 274 | spin_lock_irqsave(&ctx->slock, flags); |
275 | if (buffer_flags && *buffer_flags) { | ||
276 | ctx->flags |= *buffer_flags; | ||
277 | *buffer_flags = 0; | ||
278 | } | ||
276 | while (todo) { | 279 | while (todo) { |
277 | if (!ctx->buf) { | 280 | if (!ctx->buf) { |
278 | if (list_empty(&ctx->dvb_q)) { | 281 | if (list_empty(&ctx->dvb_q)) { |
@@ -395,6 +398,7 @@ int dvb_vb2_qbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b) | |||
395 | 398 | ||
396 | int dvb_vb2_dqbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b) | 399 | int dvb_vb2_dqbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b) |
397 | { | 400 | { |
401 | unsigned long flags; | ||
398 | int ret; | 402 | int ret; |
399 | 403 | ||
400 | ret = vb2_core_dqbuf(&ctx->vb_q, &b->index, b, ctx->nonblocking); | 404 | ret = vb2_core_dqbuf(&ctx->vb_q, &b->index, b, ctx->nonblocking); |
@@ -402,7 +406,16 @@ int dvb_vb2_dqbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b) | |||
402 | dprintk(1, "[%s] errno=%d\n", ctx->name, ret); | 406 | dprintk(1, "[%s] errno=%d\n", ctx->name, ret); |
403 | return ret; | 407 | return ret; |
404 | } | 408 | } |
405 | dprintk(5, "[%s] index=%d\n", ctx->name, b->index); | 409 | |
410 | spin_lock_irqsave(&ctx->slock, flags); | ||
411 | b->count = ctx->count++; | ||
412 | b->flags = ctx->flags; | ||
413 | ctx->flags = 0; | ||
414 | spin_unlock_irqrestore(&ctx->slock, flags); | ||
415 | |||
416 | dprintk(5, "[%s] index=%d, count=%d, flags=%d\n", | ||
417 | ctx->name, b->index, ctx->count, b->flags); | ||
418 | |||
406 | 419 | ||
407 | return 0; | 420 | return 0; |
408 | } | 421 | } |