OSDN Git Service

media: bttv: Fixed oops error when capturing at yuv410p
authorSamuel Williams <sam8641@gmail.com>
Sun, 1 Apr 2018 15:00:27 +0000 (11:00 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Fri, 4 May 2018 19:27:31 +0000 (15:27 -0400)
When capturing at yuv410p, sg_next was called too many times when chroma is
false, eventually returning NULL. This patch does fix this for my hardware.

Signed-off-by: Samuel Williams <sam8641@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/pci/bt8xx/bttv-risc.c

index 3859dde..6a6be0b 100644 (file)
@@ -189,20 +189,21 @@ bttv_risc_planar(struct bttv *btv, struct btcx_riscmem *risc,
                                yoffset -= sg_dma_len(ysg);
                                ysg = sg_next(ysg);
                        }
-                       while (uoffset && uoffset >= sg_dma_len(usg)) {
-                               uoffset -= sg_dma_len(usg);
-                               usg = sg_next(usg);
-                       }
-                       while (voffset && voffset >= sg_dma_len(vsg)) {
-                               voffset -= sg_dma_len(vsg);
-                               vsg = sg_next(vsg);
-                       }
 
                        /* calculate max number of bytes we can write */
                        ylen = todo;
                        if (yoffset + ylen > sg_dma_len(ysg))
                                ylen = sg_dma_len(ysg) - yoffset;
                        if (chroma) {
+                               while (uoffset && uoffset >= sg_dma_len(usg)) {
+                                       uoffset -= sg_dma_len(usg);
+                                       usg = sg_next(usg);
+                               }
+                               while (voffset && voffset >= sg_dma_len(vsg)) {
+                                       voffset -= sg_dma_len(vsg);
+                                       vsg = sg_next(vsg);
+                               }
+
                                if (uoffset + (ylen>>hshift) > sg_dma_len(usg))
                                        ylen = (sg_dma_len(usg) - uoffset) << hshift;
                                if (voffset + (ylen>>hshift) > sg_dma_len(vsg))