diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-01-10 06:48:50 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-01-10 19:35:31 -0500 |
commit | 990862a2f024296f27460306393de8f0cdab8997 (patch) | |
tree | e8bc467d130a57dd03428010db57794b49f0b964 /drivers | |
parent | db702a7af6c85d94ff32b6110b3646180f93f086 (diff) |
[media] cx231xx: fix device disconnect checks
The driver were using DEV_MISCONFIGURED on some places, and
DEV_DISCONNECTED on others. In a matter of fact, DEV_MISCONFIGURED
were set only during the usb disconnect callback, with
was confusing.
Also, the alsa driver never checks if the device is present,
before doing some dangerous things.
Remove DEV_MISCONFIGURED, replacing it by DEV_DISCONNECTED.
Also, fixes the other usecases for DEV_DISCONNECTED.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-audio.c | 20 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-cards.c | 5 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-dvb.c | 4 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-vbi.c | 2 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-video.c | 14 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx.h | 1 |
6 files changed, 29 insertions, 17 deletions
diff --git a/drivers/media/video/cx231xx/cx231xx-audio.c b/drivers/media/video/cx231xx/cx231xx-audio.c index 30d13c15739a..e5742a0e19a0 100644 --- a/drivers/media/video/cx231xx/cx231xx-audio.c +++ b/drivers/media/video/cx231xx/cx231xx-audio.c | |||
@@ -111,6 +111,9 @@ static void cx231xx_audio_isocirq(struct urb *urb) | |||
111 | struct snd_pcm_substream *substream; | 111 | struct snd_pcm_substream *substream; |
112 | struct snd_pcm_runtime *runtime; | 112 | struct snd_pcm_runtime *runtime; |
113 | 113 | ||
114 | if (dev->state & DEV_DISCONNECTED) | ||
115 | return; | ||
116 | |||
114 | switch (urb->status) { | 117 | switch (urb->status) { |
115 | case 0: /* success */ | 118 | case 0: /* success */ |
116 | case -ETIMEDOUT: /* NAK */ | 119 | case -ETIMEDOUT: /* NAK */ |
@@ -196,6 +199,9 @@ static void cx231xx_audio_bulkirq(struct urb *urb) | |||
196 | struct snd_pcm_substream *substream; | 199 | struct snd_pcm_substream *substream; |
197 | struct snd_pcm_runtime *runtime; | 200 | struct snd_pcm_runtime *runtime; |
198 | 201 | ||
202 | if (dev->state & DEV_DISCONNECTED) | ||
203 | return; | ||
204 | |||
199 | switch (urb->status) { | 205 | switch (urb->status) { |
200 | case 0: /* success */ | 206 | case 0: /* success */ |
201 | case -ETIMEDOUT: /* NAK */ | 207 | case -ETIMEDOUT: /* NAK */ |
@@ -273,6 +279,9 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev) | |||
273 | 279 | ||
274 | cx231xx_info("%s: Starting ISO AUDIO transfers\n", __func__); | 280 | cx231xx_info("%s: Starting ISO AUDIO transfers\n", __func__); |
275 | 281 | ||
282 | if (dev->state & DEV_DISCONNECTED) | ||
283 | return -ENODEV; | ||
284 | |||
276 | sb_size = CX231XX_ISO_NUM_AUDIO_PACKETS * dev->adev.max_pkt_size; | 285 | sb_size = CX231XX_ISO_NUM_AUDIO_PACKETS * dev->adev.max_pkt_size; |
277 | 286 | ||
278 | for (i = 0; i < CX231XX_AUDIO_BUFS; i++) { | 287 | for (i = 0; i < CX231XX_AUDIO_BUFS; i++) { |
@@ -331,6 +340,9 @@ static int cx231xx_init_audio_bulk(struct cx231xx *dev) | |||
331 | 340 | ||
332 | cx231xx_info("%s: Starting BULK AUDIO transfers\n", __func__); | 341 | cx231xx_info("%s: Starting BULK AUDIO transfers\n", __func__); |
333 | 342 | ||
343 | if (dev->state & DEV_DISCONNECTED) | ||
344 | return -ENODEV; | ||
345 | |||
334 | sb_size = CX231XX_NUM_AUDIO_PACKETS * dev->adev.max_pkt_size; | 346 | sb_size = CX231XX_NUM_AUDIO_PACKETS * dev->adev.max_pkt_size; |
335 | 347 | ||
336 | for (i = 0; i < CX231XX_AUDIO_BUFS; i++) { | 348 | for (i = 0; i < CX231XX_AUDIO_BUFS; i++) { |
@@ -432,6 +444,11 @@ static int snd_cx231xx_capture_open(struct snd_pcm_substream *substream) | |||
432 | return -ENODEV; | 444 | return -ENODEV; |
433 | } | 445 | } |
434 | 446 | ||
447 | if (dev->state & DEV_DISCONNECTED) { | ||
448 | cx231xx_errdev("Can't open. the device was removed.\n"); | ||
449 | return -ENODEV; | ||
450 | } | ||
451 | |||
435 | /* Sets volume, mute, etc */ | 452 | /* Sets volume, mute, etc */ |
436 | dev->mute = 0; | 453 | dev->mute = 0; |
437 | 454 | ||
@@ -571,6 +588,9 @@ static int snd_cx231xx_capture_trigger(struct snd_pcm_substream *substream, | |||
571 | struct cx231xx *dev = snd_pcm_substream_chip(substream); | 588 | struct cx231xx *dev = snd_pcm_substream_chip(substream); |
572 | int retval; | 589 | int retval; |
573 | 590 | ||
591 | if (dev->state & DEV_DISCONNECTED) | ||
592 | return -ENODEV; | ||
593 | |||
574 | spin_lock(&dev->adev.slock); | 594 | spin_lock(&dev->adev.slock); |
575 | switch (cmd) { | 595 | switch (cmd) { |
576 | case SNDRV_PCM_TRIGGER_START: | 596 | case SNDRV_PCM_TRIGGER_START: |
diff --git a/drivers/media/video/cx231xx/cx231xx-cards.c b/drivers/media/video/cx231xx/cx231xx-cards.c index 1f2fbbfebc76..7577e6e50136 100644 --- a/drivers/media/video/cx231xx/cx231xx-cards.c +++ b/drivers/media/video/cx231xx/cx231xx-cards.c | |||
@@ -1337,6 +1337,8 @@ static void cx231xx_usb_disconnect(struct usb_interface *interface) | |||
1337 | if (!dev->udev) | 1337 | if (!dev->udev) |
1338 | return; | 1338 | return; |
1339 | 1339 | ||
1340 | dev->state |= DEV_DISCONNECTED; | ||
1341 | |||
1340 | flush_request_modules(dev); | 1342 | flush_request_modules(dev); |
1341 | 1343 | ||
1342 | /* wait until all current v4l2 io is finished then deallocate | 1344 | /* wait until all current v4l2 io is finished then deallocate |
@@ -1354,16 +1356,13 @@ static void cx231xx_usb_disconnect(struct usb_interface *interface) | |||
1354 | /* Even having users, it is safe to remove the RC i2c driver */ | 1356 | /* Even having users, it is safe to remove the RC i2c driver */ |
1355 | cx231xx_ir_exit(dev); | 1357 | cx231xx_ir_exit(dev); |
1356 | 1358 | ||
1357 | dev->state |= DEV_MISCONFIGURED; | ||
1358 | if (dev->USE_ISO) | 1359 | if (dev->USE_ISO) |
1359 | cx231xx_uninit_isoc(dev); | 1360 | cx231xx_uninit_isoc(dev); |
1360 | else | 1361 | else |
1361 | cx231xx_uninit_bulk(dev); | 1362 | cx231xx_uninit_bulk(dev); |
1362 | dev->state |= DEV_DISCONNECTED; | ||
1363 | wake_up_interruptible(&dev->wait_frame); | 1363 | wake_up_interruptible(&dev->wait_frame); |
1364 | wake_up_interruptible(&dev->wait_stream); | 1364 | wake_up_interruptible(&dev->wait_stream); |
1365 | } else { | 1365 | } else { |
1366 | dev->state |= DEV_DISCONNECTED; | ||
1367 | } | 1366 | } |
1368 | 1367 | ||
1369 | cx231xx_close_extension(dev); | 1368 | cx231xx_close_extension(dev); |
diff --git a/drivers/media/video/cx231xx/cx231xx-dvb.c b/drivers/media/video/cx231xx/cx231xx-dvb.c index da9a4a0aab79..7c4e360ba9bc 100644 --- a/drivers/media/video/cx231xx/cx231xx-dvb.c +++ b/drivers/media/video/cx231xx/cx231xx-dvb.c | |||
@@ -196,7 +196,7 @@ static inline int dvb_isoc_copy(struct cx231xx *dev, struct urb *urb) | |||
196 | if (!dev) | 196 | if (!dev) |
197 | return 0; | 197 | return 0; |
198 | 198 | ||
199 | if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED)) | 199 | if (dev->state & DEV_DISCONNECTED) |
200 | return 0; | 200 | return 0; |
201 | 201 | ||
202 | if (urb->status < 0) { | 202 | if (urb->status < 0) { |
@@ -228,7 +228,7 @@ static inline int dvb_bulk_copy(struct cx231xx *dev, struct urb *urb) | |||
228 | if (!dev) | 228 | if (!dev) |
229 | return 0; | 229 | return 0; |
230 | 230 | ||
231 | if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED)) | 231 | if (dev->state & DEV_DISCONNECTED) |
232 | return 0; | 232 | return 0; |
233 | 233 | ||
234 | if (urb->status < 0) { | 234 | if (urb->status < 0) { |
diff --git a/drivers/media/video/cx231xx/cx231xx-vbi.c b/drivers/media/video/cx231xx/cx231xx-vbi.c index 1c7a4daafecf..9c5967e1d0c6 100644 --- a/drivers/media/video/cx231xx/cx231xx-vbi.c +++ b/drivers/media/video/cx231xx/cx231xx-vbi.c | |||
@@ -93,7 +93,7 @@ static inline int cx231xx_isoc_vbi_copy(struct cx231xx *dev, struct urb *urb) | |||
93 | if (!dev) | 93 | if (!dev) |
94 | return 0; | 94 | return 0; |
95 | 95 | ||
96 | if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED)) | 96 | if (dev->state & DEV_DISCONNECTED) |
97 | return 0; | 97 | return 0; |
98 | 98 | ||
99 | if (urb->status < 0) { | 99 | if (urb->status < 0) { |
diff --git a/drivers/media/video/cx231xx/cx231xx-video.c b/drivers/media/video/cx231xx/cx231xx-video.c index 6e81f970dc7d..829a41b0c9ef 100644 --- a/drivers/media/video/cx231xx/cx231xx-video.c +++ b/drivers/media/video/cx231xx/cx231xx-video.c | |||
@@ -337,7 +337,7 @@ static inline int cx231xx_isoc_copy(struct cx231xx *dev, struct urb *urb) | |||
337 | if (!dev) | 337 | if (!dev) |
338 | return 0; | 338 | return 0; |
339 | 339 | ||
340 | if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED)) | 340 | if (dev->state & DEV_DISCONNECTED) |
341 | return 0; | 341 | return 0; |
342 | 342 | ||
343 | if (urb->status < 0) { | 343 | if (urb->status < 0) { |
@@ -440,7 +440,7 @@ static inline int cx231xx_bulk_copy(struct cx231xx *dev, struct urb *urb) | |||
440 | if (!dev) | 440 | if (!dev) |
441 | return 0; | 441 | return 0; |
442 | 442 | ||
443 | if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED)) | 443 | if (dev->state & DEV_DISCONNECTED) |
444 | return 0; | 444 | return 0; |
445 | 445 | ||
446 | if (urb->status < 0) { | 446 | if (urb->status < 0) { |
@@ -1000,12 +1000,6 @@ static int check_dev(struct cx231xx *dev) | |||
1000 | cx231xx_errdev("v4l2 ioctl: device not present\n"); | 1000 | cx231xx_errdev("v4l2 ioctl: device not present\n"); |
1001 | return -ENODEV; | 1001 | return -ENODEV; |
1002 | } | 1002 | } |
1003 | |||
1004 | if (dev->state & DEV_MISCONFIGURED) { | ||
1005 | cx231xx_errdev("v4l2 ioctl: device is misconfigured; " | ||
1006 | "close and open it again\n"); | ||
1007 | return -EIO; | ||
1008 | } | ||
1009 | return 0; | 1003 | return 0; |
1010 | } | 1004 | } |
1011 | 1005 | ||
@@ -2347,7 +2341,8 @@ static int cx231xx_v4l2_close(struct file *filp) | |||
2347 | return 0; | 2341 | return 0; |
2348 | } | 2342 | } |
2349 | 2343 | ||
2350 | if (dev->users == 1) { | 2344 | dev->users--; |
2345 | if (!dev->users) { | ||
2351 | videobuf_stop(&fh->vb_vidq); | 2346 | videobuf_stop(&fh->vb_vidq); |
2352 | videobuf_mmap_free(&fh->vb_vidq); | 2347 | videobuf_mmap_free(&fh->vb_vidq); |
2353 | 2348 | ||
@@ -2374,7 +2369,6 @@ static int cx231xx_v4l2_close(struct file *filp) | |||
2374 | cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0); | 2369 | cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0); |
2375 | } | 2370 | } |
2376 | kfree(fh); | 2371 | kfree(fh); |
2377 | dev->users--; | ||
2378 | wake_up_interruptible_nr(&dev->open, 1); | 2372 | wake_up_interruptible_nr(&dev->open, 1); |
2379 | return 0; | 2373 | return 0; |
2380 | } | 2374 | } |
diff --git a/drivers/media/video/cx231xx/cx231xx.h b/drivers/media/video/cx231xx/cx231xx.h index 5d498a4112d7..e17447554a0d 100644 --- a/drivers/media/video/cx231xx/cx231xx.h +++ b/drivers/media/video/cx231xx/cx231xx.h | |||
@@ -377,7 +377,6 @@ struct cx231xx_board { | |||
377 | enum cx231xx_dev_state { | 377 | enum cx231xx_dev_state { |
378 | DEV_INITIALIZED = 0x01, | 378 | DEV_INITIALIZED = 0x01, |
379 | DEV_DISCONNECTED = 0x02, | 379 | DEV_DISCONNECTED = 0x02, |
380 | DEV_MISCONFIGURED = 0x04, | ||
381 | }; | 380 | }; |
382 | 381 | ||
383 | enum AFE_MODE { | 382 | enum AFE_MODE { |