aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2010-10-26 10:18:59 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-12-29 05:16:30 -0500
commitbc46bae6373c87897959c7aa8fb9f6c4218695b8 (patch)
treeab265ddca38037de54d5b7c0c0ab6c4874a1ce3f /drivers
parent2661da47daefd4f22f9fdc7e9294a1cb9edf515b (diff)
[media] gspca_xirlink_cit: various usb bandwidth allocation improvements / fixes
The following usb bandwidth allocation changes were made to the ibm netcam pro code: - Don't restart negotiation at max packet size on stop0, as that gets called by gspca_main during negotiation. Move this to sd_isoc_init. - Don't ask for full bandwidth when running at 160x120, that does not need full bandwidth - Make minimum acceptable bandwidth depend upon resolution [mchehab@redhat.com: Fix CodingStyle problems at switch statements] Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/gspca/xirlink_cit.c53
1 files changed, 43 insertions, 10 deletions
diff --git a/drivers/media/video/gspca/xirlink_cit.c b/drivers/media/video/gspca/xirlink_cit.c
index 8715577bc2d8..daeda2cd9d09 100644
--- a/drivers/media/video/gspca/xirlink_cit.c
+++ b/drivers/media/video/gspca/xirlink_cit.c
@@ -2769,16 +2769,55 @@ static int sd_start(struct gspca_dev *gspca_dev)
2769 return 0; 2769 return 0;
2770} 2770}
2771 2771
2772static int sd_isoc_init(struct gspca_dev *gspca_dev)
2773{
2774 struct usb_host_interface *alt;
2775 int max_packet_size;
2776
2777 switch (gspca_dev->width) {
2778 case 160:
2779 max_packet_size = 450;
2780 break;
2781 case 176:
2782 max_packet_size = 600;
2783 break;
2784 default:
2785 max_packet_size = 1022;
2786 break;
2787 }
2788
2789 /* Start isoc bandwidth "negotiation" at max isoc bandwidth */
2790 alt = &gspca_dev->dev->config->intf_cache[0]->altsetting[1];
2791 alt->endpoint[0].desc.wMaxPacketSize = cpu_to_le16(max_packet_size);
2792
2793 return 0;
2794}
2795
2772static int sd_isoc_nego(struct gspca_dev *gspca_dev) 2796static int sd_isoc_nego(struct gspca_dev *gspca_dev)
2773{ 2797{
2774 int ret, packet_size; 2798 int ret, packet_size, min_packet_size;
2775 struct usb_host_interface *alt; 2799 struct usb_host_interface *alt;
2776 2800
2801 switch (gspca_dev->width) {
2802 case 160:
2803 min_packet_size = 200;
2804 break;
2805 case 176:
2806 min_packet_size = 266;
2807 break;
2808 default:
2809 min_packet_size = 400;
2810 break;
2811 }
2812
2777 alt = &gspca_dev->dev->config->intf_cache[0]->altsetting[1]; 2813 alt = &gspca_dev->dev->config->intf_cache[0]->altsetting[1];
2778 packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize); 2814 packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
2779 packet_size -= 100; 2815 if (packet_size <= min_packet_size)
2780 if (packet_size < 300)
2781 return -EIO; 2816 return -EIO;
2817
2818 packet_size -= 100;
2819 if (packet_size < min_packet_size)
2820 packet_size = min_packet_size;
2782 alt->endpoint[0].desc.wMaxPacketSize = cpu_to_le16(packet_size); 2821 alt->endpoint[0].desc.wMaxPacketSize = cpu_to_le16(packet_size);
2783 2822
2784 ret = usb_set_interface(gspca_dev->dev, gspca_dev->iface, 1); 2823 ret = usb_set_interface(gspca_dev->dev, gspca_dev->iface, 1);
@@ -2796,15 +2835,12 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
2796static void sd_stop0(struct gspca_dev *gspca_dev) 2835static void sd_stop0(struct gspca_dev *gspca_dev)
2797{ 2836{
2798 struct sd *sd = (struct sd *) gspca_dev; 2837 struct sd *sd = (struct sd *) gspca_dev;
2799 struct usb_host_interface *alt;
2800 2838
2801 /* We cannot use gspca_dev->present here as that is not set when 2839 /* We cannot use gspca_dev->present here as that is not set when
2802 sd_init gets called and we get called from sd_init */ 2840 sd_init gets called and we get called from sd_init */
2803 if (!gspca_dev->dev) 2841 if (!gspca_dev->dev)
2804 return; 2842 return;
2805 2843
2806 alt = &gspca_dev->dev->config->intf_cache[0]->altsetting[1];
2807
2808 switch (sd->model) { 2844 switch (sd->model) {
2809 case CIT_MODEL0: 2845 case CIT_MODEL0:
2810 /* HDG windows does this, but it causes the cams autogain to 2846 /* HDG windows does this, but it causes the cams autogain to
@@ -2859,10 +2895,6 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
2859 restarting the stream after this */ 2895 restarting the stream after this */
2860 /* cit_write_reg(gspca_dev, 0x0000, 0x0112); */ 2896 /* cit_write_reg(gspca_dev, 0x0000, 0x0112); */
2861 cit_write_reg(gspca_dev, 0x00c0, 0x0100); 2897 cit_write_reg(gspca_dev, 0x00c0, 0x0100);
2862
2863 /* Start isoc bandwidth "negotiation" at max isoc bandwith
2864 next stream start */
2865 alt->endpoint[0].desc.wMaxPacketSize = cpu_to_le16(1022);
2866 break; 2898 break;
2867 } 2899 }
2868} 2900}
@@ -3179,6 +3211,7 @@ static const struct sd_desc sd_desc_isoc_nego = {
3179 .config = sd_config, 3211 .config = sd_config,
3180 .init = sd_init, 3212 .init = sd_init,
3181 .start = sd_start, 3213 .start = sd_start,
3214 .isoc_init = sd_isoc_init,
3182 .isoc_nego = sd_isoc_nego, 3215 .isoc_nego = sd_isoc_nego,
3183 .stopN = sd_stopN, 3216 .stopN = sd_stopN,
3184 .stop0 = sd_stop0, 3217 .stop0 = sd_stop0,