V4L/DVB (11715): gspca - main: Set the number of packets per ISOC message.
authorJean-Francois Moine <moinejf@free.fr>
Sat, 25 Apr 2009 16:29:01 +0000 (13:29 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 16 Jun 2009 21:20:55 +0000 (18:20 -0300)
The number of packets per isochronous message may now be set by the subdrivers
(default value 32).

Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/gspca.c
drivers/media/video/gspca/gspca.h
drivers/media/video/gspca/sonixb.c
drivers/media/video/gspca/sonixj.c
drivers/media/video/gspca/vc032x.c

index ebeae6b..ae0e140 100644 (file)
@@ -513,9 +513,9 @@ static int create_urbs(struct gspca_dev *gspca_dev,
 
                /* See paragraph 5.9 / table 5-11 of the usb 2.0 spec. */
                psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3));
-               npkt = ISO_MAX_SIZE / psize;
-               if (npkt > ISO_MAX_PKT)
-                       npkt = ISO_MAX_PKT;
+               npkt = gspca_dev->cam.npkt;
+               if (npkt == 0)
+                       npkt = 32;              /* default value */
                bsize = psize * npkt;
                PDEBUG(D_STREAM,
                        "isoc %d pkts size %d = bsize:%d",
index 85bb0fe..bd1faff 100644 (file)
@@ -44,8 +44,6 @@ extern int gspca_debug;
 #define GSPCA_MAX_FRAMES 16    /* maximum number of video frame buffers */
 /* image transfers */
 #define MAX_NURBS 4            /* max number of URBs */
-#define ISO_MAX_PKT 32         /* max number of packets in an ISOC transfer */
-#define ISO_MAX_SIZE 0x8000    /* max size of one URB buffer (32 Kb) */
 
 /* device information - set at probe time */
 struct cam {
@@ -57,6 +55,8 @@ struct cam {
                                 * - when 0 and bulk_size != 0 means
                                 *   1 URB and submit done by subdriver */
        u8 bulk;                /* image transfer by 0:isoc / 1:bulk */
+       u8 npkt;                /* number of packets in an ISOC message
+                                * 0 is the default value: 32 packets */
        u32 input_flags;        /* value for ENUM_INPUT status flags */
 };
 
index 153d0a9..cf3af8d 100644 (file)
@@ -877,6 +877,8 @@ static int sd_config(struct gspca_dev *gspca_dev,
                cam->cam_mode = sif_mode;
                cam->nmodes = ARRAY_SIZE(sif_mode);
        }
+       cam->npkt = 36;                 /* 36 packets per ISOC message */
+
        sd->brightness = BRIGHTNESS_DEF;
        sd->gain = GAIN_DEF;
        sd->exposure = EXPOSURE_DEF;
index c72e19d..e58ac89 100644 (file)
@@ -1280,6 +1280,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
        cam = &gspca_dev->cam;
        cam->cam_mode = vga_mode;
        cam->nmodes = ARRAY_SIZE(vga_mode);
+       cam->npkt = 24;                 /* 24 packets per ISOC message */
 
        sd->bridge = id->driver_info >> 16;
        sd->sensor = id->driver_info >> 8;
index e4e933c..30872cd 100644 (file)
@@ -42,7 +42,7 @@ struct sd {
        char bridge;
 #define BRIDGE_VC0321 0
 #define BRIDGE_VC0323 1
-       char sensor;
+       u8 sensor;
 #define SENSOR_HV7131R 0
 #define SENSOR_MI0360 1
 #define SENSOR_MI1310_SOC 2
@@ -2453,6 +2453,17 @@ static int sd_config(struct gspca_dev *gspca_dev,
        struct usb_device *dev = gspca_dev->dev;
        struct cam *cam;
        int sensor;
+       static u8 npkt[] = {    /* number of packets per ISOC message */
+               64,             /* HV7131R 0 */
+               32,             /* MI0360 1 */
+               32,             /* MI1310_SOC 2 */
+               64,             /* MI1320 3 */
+               128,            /* MI1320_SOC 4 */
+               32,             /* OV7660 5 */
+               64,             /* OV7670 6 */
+               128,            /* PO1200 7 */
+               128,            /* PO3130NC 8 */
+       };
 
        cam = &gspca_dev->cam;
        sd->bridge = id->driver_info;
@@ -2515,6 +2526,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
                        break;
                }
        }
+       cam->npkt = npkt[sd->sensor];
 
        sd->hflip = HFLIP_DEF;
        sd->vflip = VFLIP_DEF;