All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Frank Schäfer" <fschaefer.oss@googlemail.com>
To: mchehab@redhat.com
Cc: linux-media@vger.kernel.org, dheitmueller@kernellabs.com
Subject: Re: [RFC PATCH] em28xx: fix analog streaming with USB bulk transfers
Date: Wed, 09 Jan 2013 21:55:21 +0100	[thread overview]
Message-ID: <50EDD939.9070202@googlemail.com> (raw)
In-Reply-To: <1357764731-4999-1-git-send-email-fschaefer.oss@googlemail.com>

Am 09.01.2013 21:52, schrieb Frank Schäfer:
> With the conversion to videobuf2, some unnecessary calls of
> em28xx_set_alternate() have been removed. It is now called at analog streaming
> start only.
> This has unveiled a bug that causes USB bulk transfers to fail with all urbs
> having status -EVOERFLOW.
> The reason is, that for bulk transfers usb_set_interface() needs to be called
> even if the previous alt setting was the same (side note: bulk transfers seem
> to work only with alt=0).
> While it seems to be NOT necessary for isoc transfers, it's reasonable to just
> call usb_set_interface() unconditionally in em28xx_set_alternate().
> Also add a comment that explains the issue to prevent regressions in the future.

The problem is, that I would really like to understand why the old code
was working...
Maybe the reason is hidden somewhere in videobuf2 or it's a firmware
issue or i'm just too tired at the moment.

Regards,
Frank



>
> Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
> ---
>  drivers/media/usb/em28xx/em28xx-core.c |   43 ++++++++++++++++----------------
>  1 Datei geändert, 22 Zeilen hinzugefügt(+), 21 Zeilen entfernt(-)
>
> diff --git a/drivers/media/usb/em28xx/em28xx-core.c b/drivers/media/usb/em28xx/em28xx-core.c
> index 80f87bb..ce4f252 100644
> --- a/drivers/media/usb/em28xx/em28xx-core.c
> +++ b/drivers/media/usb/em28xx/em28xx-core.c
> @@ -811,12 +811,12 @@ int em28xx_resolution_set(struct em28xx *dev)
>  /* Set USB alternate setting for analog video */
>  int em28xx_set_alternate(struct em28xx *dev)
>  {
> -	int errCode, prev_alt = dev->alt;
> +	int errCode;
>  	int i;
>  	unsigned int min_pkt_size = dev->width * 2 + 4;
>  
>  	/* NOTE: for isoc transfers, only alt settings > 0 are allowed
> -		 for bulk transfers, use alt=0 as default value */
> +		 bulk transfers seem to work only with alt=0 ! */
>  	dev->alt = 0;
>  	if ((alt > 0) && (alt < dev->num_alt)) {
>  		em28xx_coredbg("alternate forced to %d\n", dev->alt);
> @@ -847,25 +847,26 @@ int em28xx_set_alternate(struct em28xx *dev)
>  	}
>  
>  set_alt:
> -	if (dev->alt != prev_alt) {
> -		if (dev->analog_xfer_bulk) {
> -			dev->max_pkt_size = 512; /* USB 2.0 spec */
> -			dev->packet_multiplier = EM28XX_BULK_PACKET_MULTIPLIER;
> -		} else { /* isoc */
> -			em28xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",
> -				       min_pkt_size, dev->alt);
> -			dev->max_pkt_size =
> -					  dev->alt_max_pkt_size_isoc[dev->alt];
> -			dev->packet_multiplier = EM28XX_NUM_ISOC_PACKETS;
> -		}
> -		em28xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n",
> -			       dev->alt, dev->max_pkt_size);
> -		errCode = usb_set_interface(dev->udev, 0, dev->alt);
> -		if (errCode < 0) {
> -			em28xx_errdev("cannot change alternate number to %d (error=%i)\n",
> -					dev->alt, errCode);
> -			return errCode;
> -		}
> +	/* NOTE: for bulk transfers, we need to call usb_set_interface()
> +	 * even if the previous settings were the same. Otherwise streaming
> +	 * fails with all urbs having status = -EOVERFLOW ! */
> +	if (dev->analog_xfer_bulk) {
> +		dev->max_pkt_size = 512; /* USB 2.0 spec */
> +		dev->packet_multiplier = EM28XX_BULK_PACKET_MULTIPLIER;
> +	} else { /* isoc */
> +		em28xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",
> +			       min_pkt_size, dev->alt);
> +		dev->max_pkt_size =
> +				  dev->alt_max_pkt_size_isoc[dev->alt];
> +		dev->packet_multiplier = EM28XX_NUM_ISOC_PACKETS;
> +	}
> +	em28xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n",
> +		       dev->alt, dev->max_pkt_size);
> +	errCode = usb_set_interface(dev->udev, 0, dev->alt);
> +	if (errCode < 0) {
> +		em28xx_errdev("cannot change alternate number to %d (error=%i)\n",
> +				dev->alt, errCode);
> +		return errCode;
>  	}
>  	return 0;
>  }


      reply	other threads:[~2013-01-09 20:54 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-09 20:52 [RFC PATCH] em28xx: fix analog streaming with USB bulk transfers Frank Schäfer
2013-01-09 20:55 ` Frank Schäfer [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50EDD939.9070202@googlemail.com \
    --to=fschaefer.oss@googlemail.com \
    --cc=dheitmueller@kernellabs.com \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.