diff options
author | Hans de Goede <hdegoede@redhat.com> | 2010-10-26 10:18:59 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-12-29 05:16:30 -0500 |
commit | bc46bae6373c87897959c7aa8fb9f6c4218695b8 (patch) | |
tree | ab265ddca38037de54d5b7c0c0ab6c4874a1ce3f /drivers | |
parent | 2661da47daefd4f22f9fdc7e9294a1cb9edf515b (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.c | 53 |
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 | ||
2772 | static 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 | |||
2772 | static int sd_isoc_nego(struct gspca_dev *gspca_dev) | 2796 | static 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) | |||
2796 | static void sd_stop0(struct gspca_dev *gspca_dev) | 2835 | static 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, |