[linux-dvb] [PATCH] propagating more errors

Oliver Endriss o.endriss at gmx.de
Sat Jun 18 21:43:11 CEST 2005


Hi,

I finally managed to dig through your patch. You did a great job.
Hopefully the changed behaviour will not cause too much trouble.

Wolfgang Rohdewald wrote:
> diff -up dvb-cvs/dvb-kernel/linux/drivers/media/dvb/ttpci/av7110_av.c linux/drivers/media/dvb/ttpci/av7110_av.c
> ...
> @@ -974,7 +986,7 @@ static int dvb_video_ioctl(struct inode 
> ...
>  	case VIDEO_PLAY:
> ...
>  		if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) {
>  			if (av7110->playing == RP_AV) {
> -				av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0);
> +				ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0);
> +				if (ret)
> +					break;
>  				av7110->playing &= ~RP_VIDEO;
>  			}
> -			av7110_av_start_play(av7110, RP_VIDEO);
> -			vidcom(av7110, VIDEO_CMD_PLAY, 0);
> +			ret = av7110_av_start_play(av7110, RP_VIDEO);
> +			if (!ret)
> +				ret = vidcom(av7110, VIDEO_CMD_PLAY, 0);
>  		} else {
> -			//av7110_av_stop(av7110, RP_VIDEO);
> -			vidcom(av7110, VIDEO_CMD_PLAY, 0);
> +			// ret = av7110_av_stop(av7110, RP_VIDEO);
> +			if (!ret)
> +				ret = vidcom(av7110, VIDEO_CMD_PLAY, 0);
>  		}

@all:
Can we remove the commented-out code?
vidcom() is executed for 'if' and 'else', so the else clause can be
removed.



case VIDEO_CLEAR_BUFFER:
> @@ -1136,18 +1167,19 @@ static int dvb_video_ioctl(struct inode 
>  		av7110_ipack_reset(&av7110->ipack[1]);
>  
>  		if (av7110->playing == RP_AV) {
> -			av7110_fw_cmd(av7110, COMTYPE_REC_PLAY,
> +			ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY,
>  				      __Play, 2, AV_PES, 0);

Add something like
			if(ret)
				break;
here.

>  			if (av7110->trickmode == TRICK_FAST)
> -				av7110_fw_cmd(av7110, COMTYPE_REC_PLAY,
> +				ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY,
>  					      __Scan_I, 2, AV_PES, 0);
>  			if (av7110->trickmode == TRICK_SLOW) {
> ...





> diff -up dvb-cvs/dvb-kernel/linux/drivers/media/dvb/ttpci/av7110.c linux/drivers/media/dvb/ttpci/av7110.c
> ...
> @@ -856,10 +875,12 @@ static int StopHWFilter(struct dvb_demux
>  	dprintk(4, "%p\n", av7110);
>  
>  	handle = dvbdmxfilter->hw_handle;
> +	if (handle == 0xffff) /*   the filter has not really been started */
> +		return 0;

Hmm - is it normal to get here with handle==0xffff?
Wouldn't it be better to have a log entry as it was before?

> @@ -1119,18 +1166,16 @@ static int av7110_set_tone(struct dvb_fr
>  
>  	switch (tone) {
>  	case SEC_TONE_ON:
> -		Set22K(av7110, 1);
> +		return Set22K(av7110, 1);
>  		break;

You should remove the 'break' here.

>  	case SEC_TONE_OFF:
> -		Set22K(av7110, 0);
> +		return Set22K(av7110, 0);
>  		break;

ditto



av7110_fe_lock_fix() was (and is) broken. It would have never be retried
after -ERESTARTSYS. For a fix see below.

> -static void av7110_fe_lock_fix(struct av7110* av7110, fe_status_t status)
> +static int av7110_fe_lock_fix(struct av7110* av7110, fe_status_t status)
>  {
> +	int ret = 0;
>  	int synced = (status & FE_HAS_LOCK) ? 1 : 0;
>  
>  	av7110->fe_status = status;
>  
>  	if (av7110->fe_synced == synced)
> -		return;
> +		return 0;
>  
>  	av7110->fe_synced = synced;

Delete the line above, and move it to the end.

>  	if (av7110->playing)
> -		return;
> +		return 0;
>  
>  	if (down_interruptible(&av7110->pid_mutex))
> -		return;
> +		return -ERESTARTSYS;
>  
>  	if (av7110->fe_synced) {

replace by 'if (synced) {'

> -		SetPIDs(av7110, av7110->pids[DMX_PES_VIDEO],
> +		ret = SetPIDs(av7110, av7110->pids[DMX_PES_VIDEO],
>  			av7110->pids[DMX_PES_AUDIO],
>  			av7110->pids[DMX_PES_TELETEXT], 0,
>  			av7110->pids[DMX_PES_PCR]);
> -		av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0);
> +		if (!ret)
> +			ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0);
>  	} else {
> -		SetPIDs(av7110, 0, 0, 0, 0, 0);
> -		av7110_fw_cmd(av7110, COMTYPE_PID_FILTER, FlushTSQueue, 0);
> -		av7110_wait_msgstate(av7110, GPMQBusy);
> +		ret = SetPIDs(av7110, 0, 0, 0, 0, 0);
> +		if (!ret) {
> +			ret = av7110_fw_cmd(av7110, COMTYPE_PID_FILTER, FlushTSQueue, 0);
> +			if (!ret)
> +				ret = av7110_wait_msgstate(av7110, GPMQBusy);
> +		}
>  	}
>  

Add here:
	if (!ret)
		av7110->fe_synced = synced;

>  	up(&av7110->pid_mutex);
>
> +	return ret;
>  }





> diff -up dvb-cvs/dvb-kernel/linux/drivers/media/dvb/ttpci/av7110_hw.h linux/drivers/media/dvb/ttpci/av7110_hw.h
> --- dvb-cvs/dvb-kernel/linux/drivers/media/dvb/ttpci/av7110_hw.h	2005-04-24 00:46:40.000000000 +0200
> +++ linux/drivers/media/dvb/ttpci/av7110_hw.h	2005-06-18 00:30:09.000000000 +0200
> @@ -453,14 +453,14 @@ static inline void ARM_ClearIrq(struct a
>   * Firmware commands
>   ****************************************************************************/
>  
> -static inline int SendDAC(struct av7110 *av7110, u8 addr, u8 data)
> +static int inline SendDAC(struct av7110 *av7110, u8 addr, u8 data)

Hmm?

> -static inline void av7710_set_video_mode(struct av7110 *av7110, int mode)
> +static inline int av7710_set_video_mode(struct av7110 *av7110, int mode)
>
> ...
>
> -static inline void Set22K(struct av7110 *av7110, int state)
> +static int inline Set22K(struct av7110 *av7110, int state)

Either use 'inline int' or 'int inline'.

Imho we should keep the changes minimal.

Oliver

-- 
--------------------------------------------------------
VDR Remote Plugin available at
http://www.escape-edv.de/endriss/vdr/
--------------------------------------------------------




More information about the linux-dvb mailing list