All of lore.kernel.org
 help / color / mirror / Atom feed
From: poma <pomidorabelisima@gmail.com>
To: Antti Palosaari <crope@iki.fi>
Cc: linux-media@vger.kernel.org, Hin-Tak Leung <htl10@users.sourceforge.net>
Subject: Re: [PATCH] rtl28xxu: correct usb_clear_halt() usage
Date: Sat, 01 Sep 2012 17:35:51 +0200	[thread overview]
Message-ID: <50422B57.60701@gmail.com> (raw)
In-Reply-To: <1346507683-3621-1-git-send-email-crope@iki.fi>

On 09/01/2012 03:54 PM, Antti Palosaari wrote:
> It is not allowed to call usb_clear_halt() after urbs are submitted.
> That causes oops sometimes. Move whole streaming_ctrl() logic to
> power_ctrl() in order to avoid wrong usb_clear_halt() use. Also,
> configuring streaming endpoint in streaming_ctrl() sounds like a
> little bit wrong as it is aimed for control stream gate.
> 
> Reported-by: Hin-Tak Leung <htl10@users.sourceforge.net>
> Signed-off-by: Antti Palosaari <crope@iki.fi>
> ---
>  drivers/media/usb/dvb-usb-v2/rtl28xxu.c | 55 +++++++++++++++------------------
>  1 file changed, 25 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
> index e29fca2..7d11c5d 100644
> --- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
> +++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
> @@ -825,37 +825,10 @@ err:
>  	return ret;
>  }
>  
> -static int rtl28xxu_streaming_ctrl(struct dvb_frontend *fe , int onoff)
> -{
> -	int ret;
> -	u8 buf[2];
> -	struct dvb_usb_device *d = fe_to_d(fe);
> -
> -	dev_dbg(&d->udev->dev, "%s: onoff=%d\n", __func__, onoff);
> -
> -	if (onoff) {
> -		buf[0] = 0x00;
> -		buf[1] = 0x00;
> -		usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x81));
> -	} else {
> -		buf[0] = 0x10; /* stall EPA */
> -		buf[1] = 0x02; /* reset EPA */
> -	}
> -
> -	ret = rtl28xx_wr_regs(d, USB_EPA_CTL, buf, 2);
> -	if (ret)
> -		goto err;
> -
> -	return ret;
> -err:
> -	dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret);
> -	return ret;
> -}
> -
>  static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
>  {
>  	int ret;
> -	u8 gpio, sys0;
> +	u8 gpio, sys0, epa_ctl[2];
>  
>  	dev_dbg(&d->udev->dev, "%s: onoff=%d\n", __func__, onoff);
>  
> @@ -878,11 +851,15 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
>  		gpio |= 0x04; /* GPIO2 = 1, LED on */
>  		sys0 = sys0 & 0x0f;
>  		sys0 |= 0xe0;
> +		epa_ctl[0] = 0x00; /* clear stall */
> +		epa_ctl[1] = 0x00; /* clear reset */
>  	} else {
>  		gpio &= (~0x01); /* GPIO0 = 0 */
>  		gpio |= 0x10; /* GPIO4 = 1 */
>  		gpio &= (~0x04); /* GPIO2 = 1, LED off */
>  		sys0 = sys0 & (~0xc0);
> +		epa_ctl[0] = 0x10; /* set stall */
> +		epa_ctl[1] = 0x02; /* set reset */
>  	}
>  
>  	dev_dbg(&d->udev->dev, "%s: WR SYS0=%02x GPIO_OUT_VAL=%02x\n", __func__,
> @@ -898,6 +875,14 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
>  	if (ret)
>  		goto err;
>  
> +	/* streaming EP: stall & reset */
> +	ret = rtl28xx_wr_regs(d, USB_EPA_CTL, epa_ctl, 2);
> +	if (ret)
> +		goto err;
> +
> +	if (onoff)
> +		usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x81));
> +
>  	return ret;
>  err:
>  	dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret);
> @@ -972,6 +957,14 @@ static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
>  			goto err;
>  
>  
> +		/* streaming EP: clear stall & reset */
> +		ret = rtl28xx_wr_regs(d, USB_EPA_CTL, "\x00\x00", 2);
> +		if (ret)
> +			goto err;
> +
> +		ret = usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x81));
> +		if (ret)
> +			goto err;
>  	} else {
>  		/* demod_ctl_1 */
>  		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1, &val);
> @@ -1006,6 +999,10 @@ static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
>  		if (ret)
>  			goto err;
>  
> +		/* streaming EP: set stall & reset */
> +		ret = rtl28xx_wr_regs(d, USB_EPA_CTL, "\x10\x02", 2);
> +		if (ret)
> +			goto err;
>  	}
>  
>  	return ret;
> @@ -1182,7 +1179,6 @@ static const struct dvb_usb_device_properties rtl2831u_props = {
>  	.tuner_attach = rtl2831u_tuner_attach,
>  	.init = rtl28xxu_init,
>  	.get_rc_config = rtl2831u_get_rc_config,
> -	.streaming_ctrl = rtl28xxu_streaming_ctrl,
>  
>  	.num_adapters = 1,
>  	.adapter = {
> @@ -1204,7 +1200,6 @@ static const struct dvb_usb_device_properties rtl2832u_props = {
>  	.tuner_attach = rtl2832u_tuner_attach,
>  	.init = rtl28xxu_init,
>  	.get_rc_config = rtl2832u_get_rc_config,
> -	.streaming_ctrl = rtl28xxu_streaming_ctrl,
>  
>  	.num_adapters = 1,
>  	.adapter = {
> 

OK, after patching with this one from http://goo.gl/5wtpT there is no
OOPS, but this happened[1][2]:
1. mythtv-setup version: fixes/0.25 [v0.25.2-3-gf0e2ad8-dirty]:
…
   E  DVBChan(1:/dev/dvb/adapter0/frontend0): Getting Frontend
uncorrected block count failed.
eno: Operation not supported (95)
2012-09-01 17:08:20.577044 W  DVBSM(/dev/dvb/adapter0/frontend0): Cannot
count Uncorrected Blocks
eno: Operation not supported (95)
…
2. tzap/femon:
…
status 1f | signal 2f2f | snr 00f2 | ber 0000001e | unc 00000033 |
FE_HAS_LOCK
status 1f | signal 2f2f | snr 00f3 | ber 0000000b | unc 00000033 |
FE_HAS_LOCK
status 1f | signal 2f2f | snr 00f1 | ber 00000000 | unc 00000033 |
FE_HAS_LOCK
…
…
Problem retrieving frontend information: Operation not supported
status SCVYL | signal  18% | snr   0% | ber 19 | unc 1 | FE_HAS_LOCK
Problem retrieving frontend information: Operation not supported
status SCVYL | signal  18% | snr   0% | ber 7 | unc 1 | FE_HAS_LOCK
Problem retrieving frontend information: Operation not supported
status SCVYL | signal  18% | snr   0% | ber 54 | unc 1 | FE_HAS_LOCK
…

Cheers,
poma



  reply	other threads:[~2012-09-01 15:35 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-01 13:54 [PATCH] rtl28xxu: correct usb_clear_halt() usage Antti Palosaari
2012-09-01 15:35 ` poma [this message]
2012-09-01 15:48   ` Antti Palosaari
2012-09-01 17:37     ` poma
2012-09-01 22:58       ` poma
2012-09-01 23:28         ` Antti Palosaari

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=50422B57.60701@gmail.com \
    --to=pomidorabelisima@gmail.com \
    --cc=crope@iki.fi \
    --cc=htl10@users.sourceforge.net \
    --cc=linux-media@vger.kernel.org \
    /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.