diff options
author | Wolfgang Rohdewald <wolfgang@rohdewald.de> | 2005-07-07 20:57:59 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-07 21:23:58 -0400 |
commit | ce18a223607b0e8cc9a8375abc64281a13ac423c (patch) | |
tree | 0c24eea6aae67bb7de1c4b2c2533437f09cc4fd1 /drivers/media/dvb/ttpci/av7110_av.c | |
parent | eef5764d6806e29a768a632abce113c15264c5d6 (diff) |
[PATCH] dvb: ttpci: more error handling for firmware communication
o propagate more errors back to caller or log them, mainly in
av7110.c and av7110_av.c
o fix error message in StartHWFilter
o do not StopHWFilter for handle 0xffff
Signed-off-by: Wolfgang Rohdewald <wolfgang@rohdewald.de>
Signed-off-by: Johannes Stezenbach <js@linuxtv.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/media/dvb/ttpci/av7110_av.c')
-rw-r--r-- | drivers/media/dvb/ttpci/av7110_av.c | 210 |
1 files changed, 124 insertions, 86 deletions
diff --git a/drivers/media/dvb/ttpci/av7110_av.c b/drivers/media/dvb/ttpci/av7110_av.c index 13c506ea0bbd..bbfad6def474 100644 --- a/drivers/media/dvb/ttpci/av7110_av.c +++ b/drivers/media/dvb/ttpci/av7110_av.c | |||
@@ -121,6 +121,7 @@ static int dvb_filter_pes2ts_cb(void *priv, unsigned char *data) | |||
121 | int av7110_av_start_record(struct av7110 *av7110, int av, | 121 | int av7110_av_start_record(struct av7110 *av7110, int av, |
122 | struct dvb_demux_feed *dvbdmxfeed) | 122 | struct dvb_demux_feed *dvbdmxfeed) |
123 | { | 123 | { |
124 | int ret = 0; | ||
124 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; | 125 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; |
125 | 126 | ||
126 | dprintk(2, "av7110:%p, , dvb_demux_feed:%p\n", av7110, dvbdmxfeed); | 127 | dprintk(2, "av7110:%p, , dvb_demux_feed:%p\n", av7110, dvbdmxfeed); |
@@ -137,7 +138,7 @@ int av7110_av_start_record(struct av7110 *av7110, int av, | |||
137 | dvbdmx->pesfilter[0]->pid, | 138 | dvbdmx->pesfilter[0]->pid, |
138 | dvb_filter_pes2ts_cb, | 139 | dvb_filter_pes2ts_cb, |
139 | (void *) dvbdmx->pesfilter[0]); | 140 | (void *) dvbdmx->pesfilter[0]); |
140 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); | 141 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); |
141 | break; | 142 | break; |
142 | 143 | ||
143 | case RP_VIDEO: | 144 | case RP_VIDEO: |
@@ -145,7 +146,7 @@ int av7110_av_start_record(struct av7110 *av7110, int av, | |||
145 | dvbdmx->pesfilter[1]->pid, | 146 | dvbdmx->pesfilter[1]->pid, |
146 | dvb_filter_pes2ts_cb, | 147 | dvb_filter_pes2ts_cb, |
147 | (void *) dvbdmx->pesfilter[1]); | 148 | (void *) dvbdmx->pesfilter[1]); |
148 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); | 149 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); |
149 | break; | 150 | break; |
150 | 151 | ||
151 | case RP_AV: | 152 | case RP_AV: |
@@ -157,14 +158,15 @@ int av7110_av_start_record(struct av7110 *av7110, int av, | |||
157 | dvbdmx->pesfilter[1]->pid, | 158 | dvbdmx->pesfilter[1]->pid, |
158 | dvb_filter_pes2ts_cb, | 159 | dvb_filter_pes2ts_cb, |
159 | (void *) dvbdmx->pesfilter[1]); | 160 | (void *) dvbdmx->pesfilter[1]); |
160 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0); | 161 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0); |
161 | break; | 162 | break; |
162 | } | 163 | } |
163 | return 0; | 164 | return ret; |
164 | } | 165 | } |
165 | 166 | ||
166 | int av7110_av_start_play(struct av7110 *av7110, int av) | 167 | int av7110_av_start_play(struct av7110 *av7110, int av) |
167 | { | 168 | { |
169 | int ret = 0; | ||
168 | dprintk(2, "av7110:%p, \n", av7110); | 170 | dprintk(2, "av7110:%p, \n", av7110); |
169 | 171 | ||
170 | if (av7110->rec_mode) | 172 | if (av7110->rec_mode) |
@@ -182,54 +184,57 @@ int av7110_av_start_play(struct av7110 *av7110, int av) | |||
182 | av7110->playing |= av; | 184 | av7110->playing |= av; |
183 | switch (av7110->playing) { | 185 | switch (av7110->playing) { |
184 | case RP_AUDIO: | 186 | case RP_AUDIO: |
185 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); | 187 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); |
186 | break; | 188 | break; |
187 | case RP_VIDEO: | 189 | case RP_VIDEO: |
188 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); | 190 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); |
189 | av7110->sinfo = 0; | 191 | av7110->sinfo = 0; |
190 | break; | 192 | break; |
191 | case RP_AV: | 193 | case RP_AV: |
192 | av7110->sinfo = 0; | 194 | av7110->sinfo = 0; |
193 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0); | 195 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0); |
194 | break; | 196 | break; |
195 | } | 197 | } |
196 | return av7110->playing; | 198 | if (!ret) |
199 | ret = av7110->playing; | ||
200 | return ret; | ||
197 | } | 201 | } |
198 | 202 | ||
199 | void av7110_av_stop(struct av7110 *av7110, int av) | 203 | int av7110_av_stop(struct av7110 *av7110, int av) |
200 | { | 204 | { |
205 | int ret = 0; | ||
201 | dprintk(2, "av7110:%p, \n", av7110); | 206 | dprintk(2, "av7110:%p, \n", av7110); |
202 | 207 | ||
203 | if (!(av7110->playing & av) && !(av7110->rec_mode & av)) | 208 | if (!(av7110->playing & av) && !(av7110->rec_mode & av)) |
204 | return; | 209 | return 0; |
205 | |||
206 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); | 210 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); |
207 | if (av7110->playing) { | 211 | if (av7110->playing) { |
208 | av7110->playing &= ~av; | 212 | av7110->playing &= ~av; |
209 | switch (av7110->playing) { | 213 | switch (av7110->playing) { |
210 | case RP_AUDIO: | 214 | case RP_AUDIO: |
211 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); | 215 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); |
212 | break; | 216 | break; |
213 | case RP_VIDEO: | 217 | case RP_VIDEO: |
214 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); | 218 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); |
215 | break; | 219 | break; |
216 | case RP_NONE: | 220 | case RP_NONE: |
217 | av7110_set_vidmode(av7110, av7110->vidmode); | 221 | ret = av7110_set_vidmode(av7110, av7110->vidmode); |
218 | break; | 222 | break; |
219 | } | 223 | } |
220 | } else { | 224 | } else { |
221 | av7110->rec_mode &= ~av; | 225 | av7110->rec_mode &= ~av; |
222 | switch (av7110->rec_mode) { | 226 | switch (av7110->rec_mode) { |
223 | case RP_AUDIO: | 227 | case RP_AUDIO: |
224 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); | 228 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); |
225 | break; | 229 | break; |
226 | case RP_VIDEO: | 230 | case RP_VIDEO: |
227 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); | 231 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); |
228 | break; | 232 | break; |
229 | case RP_NONE: | 233 | case RP_NONE: |
230 | break; | 234 | break; |
231 | } | 235 | } |
232 | } | 236 | } |
237 | return ret; | ||
233 | } | 238 | } |
234 | 239 | ||
235 | 240 | ||
@@ -317,19 +322,22 @@ int av7110_set_volume(struct av7110 *av7110, int volleft, int volright) | |||
317 | return 0; | 322 | return 0; |
318 | } | 323 | } |
319 | 324 | ||
320 | void av7110_set_vidmode(struct av7110 *av7110, int mode) | 325 | int av7110_set_vidmode(struct av7110 *av7110, int mode) |
321 | { | 326 | { |
327 | int ret; | ||
322 | dprintk(2, "av7110:%p, \n", av7110); | 328 | dprintk(2, "av7110:%p, \n", av7110); |
323 | 329 | ||
324 | av7110_fw_cmd(av7110, COMTYPE_ENCODER, LoadVidCode, 1, mode); | 330 | ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, LoadVidCode, 1, mode); |
325 | 331 | ||
326 | if (!av7110->playing) { | 332 | if (!ret && !av7110->playing) { |
327 | ChangePIDs(av7110, av7110->pids[DMX_PES_VIDEO], | 333 | ret = ChangePIDs(av7110, av7110->pids[DMX_PES_VIDEO], |
328 | av7110->pids[DMX_PES_AUDIO], | 334 | av7110->pids[DMX_PES_AUDIO], |
329 | av7110->pids[DMX_PES_TELETEXT], | 335 | av7110->pids[DMX_PES_TELETEXT], |
330 | 0, av7110->pids[DMX_PES_PCR]); | 336 | 0, av7110->pids[DMX_PES_PCR]); |
331 | av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0); | 337 | if (!ret) |
338 | ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0); | ||
332 | } | 339 | } |
340 | return ret; | ||
333 | } | 341 | } |
334 | 342 | ||
335 | 343 | ||
@@ -340,17 +348,18 @@ static int sw2mode[16] = { | |||
340 | VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, | 348 | VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, |
341 | }; | 349 | }; |
342 | 350 | ||
343 | static void get_video_format(struct av7110 *av7110, u8 *buf, int count) | 351 | static int get_video_format(struct av7110 *av7110, u8 *buf, int count) |
344 | { | 352 | { |
345 | int i; | 353 | int i; |
346 | int hsize, vsize; | 354 | int hsize, vsize; |
347 | int sw; | 355 | int sw; |
348 | u8 *p; | 356 | u8 *p; |
357 | int ret = 0; | ||
349 | 358 | ||
350 | dprintk(2, "av7110:%p, \n", av7110); | 359 | dprintk(2, "av7110:%p, \n", av7110); |
351 | 360 | ||
352 | if (av7110->sinfo) | 361 | if (av7110->sinfo) |
353 | return; | 362 | return 0; |
354 | for (i = 7; i < count - 10; i++) { | 363 | for (i = 7; i < count - 10; i++) { |
355 | p = buf + i; | 364 | p = buf + i; |
356 | if (p[0] || p[1] || p[2] != 0x01 || p[3] != 0xb3) | 365 | if (p[0] || p[1] || p[2] != 0x01 || p[3] != 0xb3) |
@@ -359,11 +368,14 @@ static void get_video_format(struct av7110 *av7110, u8 *buf, int count) | |||
359 | hsize = ((p[1] &0xF0) >> 4) | (p[0] << 4); | 368 | hsize = ((p[1] &0xF0) >> 4) | (p[0] << 4); |
360 | vsize = ((p[1] &0x0F) << 8) | (p[2]); | 369 | vsize = ((p[1] &0x0F) << 8) | (p[2]); |
361 | sw = (p[3] & 0x0F); | 370 | sw = (p[3] & 0x0F); |
362 | av7110_set_vidmode(av7110, sw2mode[sw]); | 371 | ret = av7110_set_vidmode(av7110, sw2mode[sw]); |
363 | dprintk(2, "playback %dx%d fr=%d\n", hsize, vsize, sw); | 372 | if (!ret) { |
364 | av7110->sinfo = 1; | 373 | dprintk(2, "playback %dx%d fr=%d\n", hsize, vsize, sw); |
374 | av7110->sinfo = 1; | ||
375 | } | ||
365 | break; | 376 | break; |
366 | } | 377 | } |
378 | return ret; | ||
367 | } | 379 | } |
368 | 380 | ||
369 | 381 | ||
@@ -974,7 +986,7 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
974 | unsigned long arg = (unsigned long) parg; | 986 | unsigned long arg = (unsigned long) parg; |
975 | int ret = 0; | 987 | int ret = 0; |
976 | 988 | ||
977 | dprintk(2, "av7110:%p, \n", av7110); | 989 | dprintk(1, "av7110:%p, cmd=%04x\n", av7110,cmd); |
978 | 990 | ||
979 | if ((file->f_flags & O_ACCMODE) == O_RDONLY) { | 991 | if ((file->f_flags & O_ACCMODE) == O_RDONLY) { |
980 | if ( cmd != VIDEO_GET_STATUS && cmd != VIDEO_GET_EVENT && | 992 | if ( cmd != VIDEO_GET_STATUS && cmd != VIDEO_GET_EVENT && |
@@ -987,49 +999,57 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
987 | case VIDEO_STOP: | 999 | case VIDEO_STOP: |
988 | av7110->videostate.play_state = VIDEO_STOPPED; | 1000 | av7110->videostate.play_state = VIDEO_STOPPED; |
989 | if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) | 1001 | if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) |
990 | av7110_av_stop(av7110, RP_VIDEO); | 1002 | ret = av7110_av_stop(av7110, RP_VIDEO); |
991 | else | 1003 | else |
992 | vidcom(av7110, VIDEO_CMD_STOP, | 1004 | ret = vidcom(av7110, VIDEO_CMD_STOP, |
993 | av7110->videostate.video_blank ? 0 : 1); | 1005 | av7110->videostate.video_blank ? 0 : 1); |
994 | av7110->trickmode = TRICK_NONE; | 1006 | if (!ret) |
1007 | av7110->trickmode = TRICK_NONE; | ||
995 | break; | 1008 | break; |
996 | 1009 | ||
997 | case VIDEO_PLAY: | 1010 | case VIDEO_PLAY: |
998 | av7110->trickmode = TRICK_NONE; | 1011 | av7110->trickmode = TRICK_NONE; |
999 | if (av7110->videostate.play_state == VIDEO_FREEZED) { | 1012 | if (av7110->videostate.play_state == VIDEO_FREEZED) { |
1000 | av7110->videostate.play_state = VIDEO_PLAYING; | 1013 | av7110->videostate.play_state = VIDEO_PLAYING; |
1001 | vidcom(av7110, VIDEO_CMD_PLAY, 0); | 1014 | ret = vidcom(av7110, VIDEO_CMD_PLAY, 0); |
1015 | if (ret) | ||
1016 | break; | ||
1002 | } | 1017 | } |
1003 | 1018 | ||
1004 | if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) { | 1019 | if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) { |
1005 | if (av7110->playing == RP_AV) { | 1020 | if (av7110->playing == RP_AV) { |
1006 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); | 1021 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); |
1022 | if (ret) | ||
1023 | break; | ||
1007 | av7110->playing &= ~RP_VIDEO; | 1024 | av7110->playing &= ~RP_VIDEO; |
1008 | } | 1025 | } |
1009 | av7110_av_start_play(av7110, RP_VIDEO); | 1026 | ret = av7110_av_start_play(av7110, RP_VIDEO); |
1010 | vidcom(av7110, VIDEO_CMD_PLAY, 0); | ||
1011 | } else { | ||
1012 | //av7110_av_stop(av7110, RP_VIDEO); | ||
1013 | vidcom(av7110, VIDEO_CMD_PLAY, 0); | ||
1014 | } | 1027 | } |
1015 | av7110->videostate.play_state = VIDEO_PLAYING; | 1028 | if (!ret) |
1029 | ret = vidcom(av7110, VIDEO_CMD_PLAY, 0); | ||
1030 | if (!ret) | ||
1031 | av7110->videostate.play_state = VIDEO_PLAYING; | ||
1016 | break; | 1032 | break; |
1017 | 1033 | ||
1018 | case VIDEO_FREEZE: | 1034 | case VIDEO_FREEZE: |
1019 | av7110->videostate.play_state = VIDEO_FREEZED; | 1035 | av7110->videostate.play_state = VIDEO_FREEZED; |
1020 | if (av7110->playing & RP_VIDEO) | 1036 | if (av7110->playing & RP_VIDEO) |
1021 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Pause, 0); | 1037 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Pause, 0); |
1022 | else | 1038 | else |
1023 | vidcom(av7110, VIDEO_CMD_FREEZE, 1); | 1039 | ret = vidcom(av7110, VIDEO_CMD_FREEZE, 1); |
1024 | av7110->trickmode = TRICK_FREEZE; | 1040 | if (!ret) |
1041 | av7110->trickmode = TRICK_FREEZE; | ||
1025 | break; | 1042 | break; |
1026 | 1043 | ||
1027 | case VIDEO_CONTINUE: | 1044 | case VIDEO_CONTINUE: |
1028 | if (av7110->playing & RP_VIDEO) | 1045 | if (av7110->playing & RP_VIDEO) |
1029 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Continue, 0); | 1046 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Continue, 0); |
1030 | vidcom(av7110, VIDEO_CMD_PLAY, 0); | 1047 | if (!ret) |
1031 | av7110->videostate.play_state = VIDEO_PLAYING; | 1048 | ret = vidcom(av7110, VIDEO_CMD_PLAY, 0); |
1032 | av7110->trickmode = TRICK_NONE; | 1049 | if (!ret) { |
1050 | av7110->videostate.play_state = VIDEO_PLAYING; | ||
1051 | av7110->trickmode = TRICK_NONE; | ||
1052 | } | ||
1033 | break; | 1053 | break; |
1034 | 1054 | ||
1035 | case VIDEO_SELECT_SOURCE: | 1055 | case VIDEO_SELECT_SOURCE: |
@@ -1045,7 +1065,7 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
1045 | break; | 1065 | break; |
1046 | 1066 | ||
1047 | case VIDEO_GET_EVENT: | 1067 | case VIDEO_GET_EVENT: |
1048 | ret=dvb_video_get_event(av7110, parg, file->f_flags); | 1068 | ret = dvb_video_get_event(av7110, parg, file->f_flags); |
1049 | break; | 1069 | break; |
1050 | 1070 | ||
1051 | case VIDEO_GET_SIZE: | 1071 | case VIDEO_GET_SIZE: |
@@ -1105,25 +1125,32 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
1105 | case VIDEO_FAST_FORWARD: | 1125 | case VIDEO_FAST_FORWARD: |
1106 | //note: arg is ignored by firmware | 1126 | //note: arg is ignored by firmware |
1107 | if (av7110->playing & RP_VIDEO) | 1127 | if (av7110->playing & RP_VIDEO) |
1108 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, | 1128 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, |
1109 | __Scan_I, 2, AV_PES, 0); | 1129 | __Scan_I, 2, AV_PES, 0); |
1110 | else | 1130 | else |
1111 | vidcom(av7110, VIDEO_CMD_FFWD, arg); | 1131 | ret = vidcom(av7110, VIDEO_CMD_FFWD, arg); |
1112 | av7110->trickmode = TRICK_FAST; | 1132 | if (!ret) { |
1113 | av7110->videostate.play_state = VIDEO_PLAYING; | 1133 | av7110->trickmode = TRICK_FAST; |
1134 | av7110->videostate.play_state = VIDEO_PLAYING; | ||
1135 | } | ||
1114 | break; | 1136 | break; |
1115 | 1137 | ||
1116 | case VIDEO_SLOWMOTION: | 1138 | case VIDEO_SLOWMOTION: |
1117 | if (av7110->playing&RP_VIDEO) { | 1139 | if (av7110->playing&RP_VIDEO) { |
1118 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0); | 1140 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0); |
1119 | vidcom(av7110, VIDEO_CMD_SLOW, arg); | 1141 | if (!ret) |
1142 | ret = vidcom(av7110, VIDEO_CMD_SLOW, arg); | ||
1120 | } else { | 1143 | } else { |
1121 | vidcom(av7110, VIDEO_CMD_PLAY, 0); | 1144 | ret = vidcom(av7110, VIDEO_CMD_PLAY, 0); |
1122 | vidcom(av7110, VIDEO_CMD_STOP, 0); | 1145 | if (!ret) |
1123 | vidcom(av7110, VIDEO_CMD_SLOW, arg); | 1146 | ret = vidcom(av7110, VIDEO_CMD_STOP, 0); |
1147 | if (!ret) | ||
1148 | ret = vidcom(av7110, VIDEO_CMD_SLOW, arg); | ||
1149 | } | ||
1150 | if (!ret) { | ||
1151 | av7110->trickmode = TRICK_SLOW; | ||
1152 | av7110->videostate.play_state = VIDEO_PLAYING; | ||
1124 | } | 1153 | } |
1125 | av7110->trickmode = TRICK_SLOW; | ||
1126 | av7110->videostate.play_state = VIDEO_PLAYING; | ||
1127 | break; | 1154 | break; |
1128 | 1155 | ||
1129 | case VIDEO_GET_CAPABILITIES: | 1156 | case VIDEO_GET_CAPABILITIES: |
@@ -1136,18 +1163,21 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
1136 | av7110_ipack_reset(&av7110->ipack[1]); | 1163 | av7110_ipack_reset(&av7110->ipack[1]); |
1137 | 1164 | ||
1138 | if (av7110->playing == RP_AV) { | 1165 | if (av7110->playing == RP_AV) { |
1139 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, | 1166 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, |
1140 | __Play, 2, AV_PES, 0); | 1167 | __Play, 2, AV_PES, 0); |
1168 | if (ret) | ||
1169 | break; | ||
1141 | if (av7110->trickmode == TRICK_FAST) | 1170 | if (av7110->trickmode == TRICK_FAST) |
1142 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, | 1171 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, |
1143 | __Scan_I, 2, AV_PES, 0); | 1172 | __Scan_I, 2, AV_PES, 0); |
1144 | if (av7110->trickmode == TRICK_SLOW) { | 1173 | if (av7110->trickmode == TRICK_SLOW) { |
1145 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, | 1174 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, |
1146 | __Slow, 2, 0, 0); | 1175 | __Slow, 2, 0, 0); |
1147 | vidcom(av7110, VIDEO_CMD_SLOW, arg); | 1176 | if (!ret) |
1177 | ret = vidcom(av7110, VIDEO_CMD_SLOW, arg); | ||
1148 | } | 1178 | } |
1149 | if (av7110->trickmode == TRICK_FREEZE) | 1179 | if (av7110->trickmode == TRICK_FREEZE) |
1150 | vidcom(av7110, VIDEO_CMD_STOP, 1); | 1180 | ret = vidcom(av7110, VIDEO_CMD_STOP, 1); |
1151 | } | 1181 | } |
1152 | break; | 1182 | break; |
1153 | 1183 | ||
@@ -1170,7 +1200,7 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1170 | unsigned long arg = (unsigned long) parg; | 1200 | unsigned long arg = (unsigned long) parg; |
1171 | int ret = 0; | 1201 | int ret = 0; |
1172 | 1202 | ||
1173 | dprintk(2, "av7110:%p, \n", av7110); | 1203 | dprintk(1, "av7110:%p, cmd=%04x\n", av7110,cmd); |
1174 | 1204 | ||
1175 | if (((file->f_flags & O_ACCMODE) == O_RDONLY) && | 1205 | if (((file->f_flags & O_ACCMODE) == O_RDONLY) && |
1176 | (cmd != AUDIO_GET_STATUS)) | 1206 | (cmd != AUDIO_GET_STATUS)) |
@@ -1179,28 +1209,32 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1179 | switch (cmd) { | 1209 | switch (cmd) { |
1180 | case AUDIO_STOP: | 1210 | case AUDIO_STOP: |
1181 | if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY) | 1211 | if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY) |
1182 | av7110_av_stop(av7110, RP_AUDIO); | 1212 | ret = av7110_av_stop(av7110, RP_AUDIO); |
1183 | else | 1213 | else |
1184 | audcom(av7110, AUDIO_CMD_MUTE); | 1214 | ret = audcom(av7110, AUDIO_CMD_MUTE); |
1185 | av7110->audiostate.play_state = AUDIO_STOPPED; | 1215 | if (!ret) |
1216 | av7110->audiostate.play_state = AUDIO_STOPPED; | ||
1186 | break; | 1217 | break; |
1187 | 1218 | ||
1188 | case AUDIO_PLAY: | 1219 | case AUDIO_PLAY: |
1189 | if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY) | 1220 | if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY) |
1190 | av7110_av_start_play(av7110, RP_AUDIO); | 1221 | ret = av7110_av_start_play(av7110, RP_AUDIO); |
1191 | audcom(av7110, AUDIO_CMD_UNMUTE); | 1222 | if (!ret) |
1192 | av7110->audiostate.play_state = AUDIO_PLAYING; | 1223 | ret = audcom(av7110, AUDIO_CMD_UNMUTE); |
1224 | if (!ret) | ||
1225 | av7110->audiostate.play_state = AUDIO_PLAYING; | ||
1193 | break; | 1226 | break; |
1194 | 1227 | ||
1195 | case AUDIO_PAUSE: | 1228 | case AUDIO_PAUSE: |
1196 | audcom(av7110, AUDIO_CMD_MUTE); | 1229 | ret = audcom(av7110, AUDIO_CMD_MUTE); |
1197 | av7110->audiostate.play_state = AUDIO_PAUSED; | 1230 | if (!ret) |
1231 | av7110->audiostate.play_state = AUDIO_PAUSED; | ||
1198 | break; | 1232 | break; |
1199 | 1233 | ||
1200 | case AUDIO_CONTINUE: | 1234 | case AUDIO_CONTINUE: |
1201 | if (av7110->audiostate.play_state == AUDIO_PAUSED) { | 1235 | if (av7110->audiostate.play_state == AUDIO_PAUSED) { |
1202 | av7110->audiostate.play_state = AUDIO_PLAYING; | 1236 | av7110->audiostate.play_state = AUDIO_PLAYING; |
1203 | audcom(av7110, AUDIO_CMD_UNMUTE | AUDIO_CMD_PCM16); | 1237 | ret = audcom(av7110, AUDIO_CMD_UNMUTE | AUDIO_CMD_PCM16); |
1204 | } | 1238 | } |
1205 | break; | 1239 | break; |
1206 | 1240 | ||
@@ -1210,14 +1244,15 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1210 | 1244 | ||
1211 | case AUDIO_SET_MUTE: | 1245 | case AUDIO_SET_MUTE: |
1212 | { | 1246 | { |
1213 | audcom(av7110, arg ? AUDIO_CMD_MUTE : AUDIO_CMD_UNMUTE); | 1247 | ret = audcom(av7110, arg ? AUDIO_CMD_MUTE : AUDIO_CMD_UNMUTE); |
1214 | av7110->audiostate.mute_state = (int) arg; | 1248 | if (!ret) |
1249 | av7110->audiostate.mute_state = (int) arg; | ||
1215 | break; | 1250 | break; |
1216 | } | 1251 | } |
1217 | 1252 | ||
1218 | case AUDIO_SET_AV_SYNC: | 1253 | case AUDIO_SET_AV_SYNC: |
1219 | av7110->audiostate.AV_sync_state = (int) arg; | 1254 | av7110->audiostate.AV_sync_state = (int) arg; |
1220 | audcom(av7110, arg ? AUDIO_CMD_SYNC_ON : AUDIO_CMD_SYNC_OFF); | 1255 | ret = audcom(av7110, arg ? AUDIO_CMD_SYNC_ON : AUDIO_CMD_SYNC_OFF); |
1221 | break; | 1256 | break; |
1222 | 1257 | ||
1223 | case AUDIO_SET_BYPASS_MODE: | 1258 | case AUDIO_SET_BYPASS_MODE: |
@@ -1229,21 +1264,24 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1229 | 1264 | ||
1230 | switch(av7110->audiostate.channel_select) { | 1265 | switch(av7110->audiostate.channel_select) { |
1231 | case AUDIO_STEREO: | 1266 | case AUDIO_STEREO: |
1232 | audcom(av7110, AUDIO_CMD_STEREO); | 1267 | ret = audcom(av7110, AUDIO_CMD_STEREO); |
1233 | if (av7110->adac_type == DVB_ADAC_CRYSTAL) | 1268 | if (!ret) |
1234 | i2c_writereg(av7110, 0x20, 0x02, 0x49); | 1269 | if (av7110->adac_type == DVB_ADAC_CRYSTAL) |
1270 | i2c_writereg(av7110, 0x20, 0x02, 0x49); | ||
1235 | break; | 1271 | break; |
1236 | 1272 | ||
1237 | case AUDIO_MONO_LEFT: | 1273 | case AUDIO_MONO_LEFT: |
1238 | audcom(av7110, AUDIO_CMD_MONO_L); | 1274 | ret = audcom(av7110, AUDIO_CMD_MONO_L); |
1239 | if (av7110->adac_type == DVB_ADAC_CRYSTAL) | 1275 | if (!ret) |
1240 | i2c_writereg(av7110, 0x20, 0x02, 0x4a); | 1276 | if (av7110->adac_type == DVB_ADAC_CRYSTAL) |
1277 | i2c_writereg(av7110, 0x20, 0x02, 0x4a); | ||
1241 | break; | 1278 | break; |
1242 | 1279 | ||
1243 | case AUDIO_MONO_RIGHT: | 1280 | case AUDIO_MONO_RIGHT: |
1244 | audcom(av7110, AUDIO_CMD_MONO_R); | 1281 | ret = audcom(av7110, AUDIO_CMD_MONO_R); |
1245 | if (av7110->adac_type == DVB_ADAC_CRYSTAL) | 1282 | if (!ret) |
1246 | i2c_writereg(av7110, 0x20, 0x02, 0x45); | 1283 | if (av7110->adac_type == DVB_ADAC_CRYSTAL) |
1284 | i2c_writereg(av7110, 0x20, 0x02, 0x45); | ||
1247 | break; | 1285 | break; |
1248 | 1286 | ||
1249 | default: | 1287 | default: |
@@ -1264,7 +1302,7 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1264 | dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout); | 1302 | dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout); |
1265 | av7110_ipack_reset(&av7110->ipack[0]); | 1303 | av7110_ipack_reset(&av7110->ipack[0]); |
1266 | if (av7110->playing == RP_AV) | 1304 | if (av7110->playing == RP_AV) |
1267 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, | 1305 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, |
1268 | __Play, 2, AV_PES, 0); | 1306 | __Play, 2, AV_PES, 0); |
1269 | break; | 1307 | break; |
1270 | case AUDIO_SET_ID: | 1308 | case AUDIO_SET_ID: |
@@ -1274,7 +1312,7 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1274 | { | 1312 | { |
1275 | struct audio_mixer *amix = (struct audio_mixer *)parg; | 1313 | struct audio_mixer *amix = (struct audio_mixer *)parg; |
1276 | 1314 | ||
1277 | av7110_set_volume(av7110, amix->volume_left, amix->volume_right); | 1315 | ret = av7110_set_volume(av7110, amix->volume_left, amix->volume_right); |
1278 | break; | 1316 | break; |
1279 | } | 1317 | } |
1280 | case AUDIO_SET_STREAMTYPE: | 1318 | case AUDIO_SET_STREAMTYPE: |