Hans Verkuil wrote:
> > Here's my observation:  There was no good reason for q_full to stay
> > empty for so long (> 5 seconds), just because data was sitting queued
> > in q_io.  It was as if data stopped being moved from the encoder to
> > buffers and into q_full.  What is both fortunate and unfortunate is
> > that draining q_full and q_io, seems to restart the transfers from
> > the encoder.
> >

> > So to test these hypotheses, I'll have to gain some understanding of
> > the new mailbox protocol and the Memory Descriptor List stuff and do
> > some testing with the fix to cx18_v4l2_enc_poll() backed out.
> 
> Look for 'CX18_CPU_DE_SET_MDL' in cx18-fileops.c: this is where the 
> processed buffer is returned to the firmware so that it can be used 
> again. Based on your description I was wondering whether in some cases 
> all or most buffers are in use and the firmware will just stop 
> capturing due to a lack of available buffers.

Argh.  I'm giving up on hunting this down for now.  Here are my
observations and speculations with the return value of
cx18_v4l2_enc_poll() does not depend on q_io.length:

a) The most buffers I've ever seen in use in the driver are 1 in q_io
and 10 in q_full.  That was when then encoder decided to give the driver
10 buffers all at once.  (What good is q_io anyway in the cx18 driver?
It seems like a lot of book keeping just to store the 1 partially read
buffer.  Would pushing a partially read buffer back on the head of
q_full be that hard?)

b) I can always get the transfer from the encoder to stall.

c) stopping the capture, reloading all the MDLs and restarting the
capture doesn't make transfers from the encoder work again.

d) a common sequence of failure looked like the following, with the
encoder sending a small (2048 bytes) buffer, the driver returning 2 MDLs
very close together, and then the encoder sending only one more buffer:

Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: open_id: 7  stream type 
= 0
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x21d9bd80 prev 0x21d9ba00 buffers 61 length 2031616 bytesused 0
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x21d9ba80 prev 0x21d9ba80 buffers 1 length 32768 bytesused 2048
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: stream q_io    next 
0x21d9ba40 prev 0x21d9ba40 buffers 1 length 32768 bytesused 30720
Mar  8 19:27:09 palomino kernel: cx180 file: Encoder poll
Mar  8 19:27:09 palomino kernel: cx180 file: Post poll_wait
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x21d9bd80 prev 0x21d9ba00 buffers 61 length 2031616 bytesused 0
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x21d9ba80 prev 0x21d9ba80 buffers 1 length 32768 bytesused 2048
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: stream q_io    next 
0x21d9ba40 prev 0x21d9ba40 buffers 1 length 32768 bytesused 30720
Mar  8 19:27:09 palomino kernel: cx180 file: read 4096 bytes from encoder MPEG
Mar  8 19:27:09 palomino kernel: cx180 file: read 4096 from encoder MPEG, got 
4096
...
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: open_id: 7  stream type 
= 0
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Mar  8 19:27:09 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x21d9bd80 prev 0x21d9ba00 buffers 61 length 2031616 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x21d9ba80 prev 0x21d9ba80 buffers 1 length 32768 bytesused 2048
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io    next 
0x21d9ba40 prev 0x21d9ba40 buffers 1 length 32768 bytesused 6144
Mar  8 19:27:10 palomino kernel: cx180 file: Encoder poll
Mar  8 19:27:10 palomino kernel: cx180 file: Post poll_wait
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x21d9bd80 prev 0x21d9ba00 buffers 61 length 2031616 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x21d9ba80 prev 0x21d9ba80 buffers 1 length 32768 bytesused 2048
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io    next 
0x21d9ba40 prev 0x21d9ba40 buffers 1 length 32768 bytesused 6144
Mar  8 19:27:10 palomino kernel: cx180 file: read 4096 bytes from encoder MPEG
Mar  8 19:27:10 palomino kernel: cx180 file: read 4096 from encoder MPEG, got 
4096
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: open_id: 7  stream type 
= 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x21d9bd80 prev 0x21d9ba00 buffers 61 length 2031616 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x21d9ba80 prev 0x21d9ba80 buffers 1 length 32768 bytesused 2048
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io    next 
0x21d9ba40 prev 0x21d9ba40 buffers 1 length 32768 bytesused 2048
Mar  8 19:27:10 palomino kernel: cx180 file: Encoder poll
Mar  8 19:27:10 palomino kernel: cx180 file: Post poll_wait
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x21d9bd80 prev 0x21d9ba00 buffers 61 length 2031616 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x21d9ba80 prev 0x21d9ba80 buffers 1 length 32768 bytesused 2048
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io    next 
0x21d9ba40 prev 0x21d9ba40 buffers 1 length 32768 bytesused 2048
Mar  8 19:27:10 palomino kernel: cx180 file: read 4096 bytes from encoder MPEG
Mar  8 19:27:10 palomino kernel: cx180 api: CX18_CPU_DE_SET_MDL
Mar  8 19:27:10 palomino kernel: cx180 api: req: 0x000035ab  args: 0x00000001 
0x00dc0cc8 0x00000001 0x00000003 0x00008000 
Mar  8 19:27:10 palomino kernel: cx180 api: ack: 0x000035ab  args: 0x00000001 
0x00dc0cc8 0x00000001 0x00000003 0x00008000 0x00000000 error: 0x00000000
Mar  8 19:27:10 palomino kernel: cx180 api: CX18_CPU_DE_SET_MDL
Mar  8 19:27:10 palomino kernel: cx180 api: req: 0x000035ac  args: 0x00000001 
0x00dc0cd0 0x00000001 0x00000004 0x00008000 
Mar  8 19:27:10 palomino kernel: cx180 api: ack: 0x000035ac  args: 0x00000001 
0x00dc0cd0 0x00000001 0x00000004 0x00008000 0x00000000 error: 0x00000000
Mar  8 19:27:10 palomino kernel: cx180 file: read 4096 from encoder MPEG, got 
4096
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: open_id: 7  stream type 
= 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x21d9bd80 prev 0x21d9ba80 buffers 63 length 2097152 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0xa440208 prev 0xa440208 buffers 0 length 0 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io    next 
0xa440228 prev 0xa440228 buffers 0 length 0 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: Encoder poll
Mar  8 19:27:10 palomino kernel: cx180 file: Post poll_wait
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x21d9bd80 prev 0x21d9ba80 buffers 63 length 2097152 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0xa440208 prev 0xa440208 buffers 0 length 0 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io    next 
0xa440228 prev 0xa440228 buffers 0 length 0 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: open_id: 7  stream type 
= 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x21d9bd80 prev 0x21d9ba80 buffers 62 length 2064384 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x21d9bac0 prev 0x21d9bac0 buffers 1 length 32768 bytesused 26624
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io    next 
0xa440228 prev 0xa440228 buffers 0 length 0 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: Encoder poll
Mar  8 19:27:10 palomino kernel: cx180 file: Post poll_wait
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x21d9bd80 prev 0x21d9ba80 buffers 62 length 2064384 bytesused 0
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x21d9bac0 prev 0x21d9bac0 buffers 1 length 32768 bytesused 26624
Mar  8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io    next 
0xa440228 prev 0xa440228 buffers 0 length 0 bytesused 0
...
Mar  8 19:27:13 palomino kernel: cx180 file: enc_poll: open_id: 7  stream type 
= 0
Mar  8 19:27:13 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Mar  8 19:27:13 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Mar  8 19:27:13 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x21d9bd80 prev 0x21d9ba80 buffers 62 length 2064384 bytesused 0
Mar  8 19:27:13 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0xa440208 prev 0xa440208 buffers 0 length 0 bytesused 0
Mar  8 19:27:13 palomino kernel: cx180 file: enc_poll: stream q_io    next 
0x21d9bac0 prev 0x21d9bac0 buffers 1 length 32768 bytesused 22528
Mar  8 19:27:13 palomino kernel: cx180 file: Encoder poll
Mar  8 19:27:13 palomino kernel: cx180 file: Post poll_wait
Mar  8 19:27:13 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Mar  8 19:27:13 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Mar  8 19:27:13 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x21d9bd80 prev 0x21d9ba80 buffers 62 length 2064384 bytesused 0
Mar  8 19:27:13 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0xa440208 prev 0xa440208 buffers 0 length 0 bytesused 0
Mar  8 19:27:13 palomino kernel: cx180 file: enc_poll: stream q_io    next 
0x21d9bac0 prev 0x21d9bac0 buffers 1 length 32768 bytesused 22528
Mar  8 19:27:13 palomino kernel: cx18-0 info: close stopping capture
Mar  8 19:27:13 palomino kernel: cx18-0 info: close stopping embedded VBI 
capture


I changed the cx18_read() function to exit the loop and return once it
had returned 1 MDL to the encoder, but the problem still persisted.  In
this case the short buffer in at least one trial was 4096 bytes.


e) I don't know what to make of it all without some specific commands to
query the encoder's status, use of MDLs, and timeouts.  I could take a
closer look at the MDL acks and the irqs and irq acks, but I'm not that
motivated at this point.  The driver/encoder transfer performance is
good enough for me for now with the return value logic of the
cx18_v4l2_enc_poll() function fixed. 


Regards,
Andy


_______________________________________________
ivtv-devel mailing list
[email protected]
http://ivtvdriver.org/mailman/listinfo/ivtv-devel

Reply via email to