diff options
author | Oliver Neukum <oliver@neukum.org> | 2007-12-03 04:48:43 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-01-25 16:03:14 -0500 |
commit | 863c86dd7e014e645207fd16f4e06bc223567984 (patch) | |
tree | 4752de2502e68baed104a871cd6078c8cea26f72 /drivers/media/radio | |
parent | e1ba33df0cbc6a7ab339dc093f37825775b9caca (diff) |
V4L/DVB (6732): dsbr100 violates DMA coherency rules
Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/radio')
-rw-r--r-- | drivers/media/radio/dsbr100.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/media/radio/dsbr100.c b/drivers/media/radio/dsbr100.c index 3bd07f7e3774..36c0e3651502 100644 --- a/drivers/media/radio/dsbr100.c +++ b/drivers/media/radio/dsbr100.c | |||
@@ -33,6 +33,9 @@ | |||
33 | 33 | ||
34 | History: | 34 | History: |
35 | 35 | ||
36 | Version 0.43: | ||
37 | Oliver Neukum: avoided DMA coherency issue | ||
38 | |||
36 | Version 0.42: | 39 | Version 0.42: |
37 | Converted dsbr100 to use video_ioctl2 | 40 | Converted dsbr100 to use video_ioctl2 |
38 | by Douglas Landgraf <dougsland@gmail.com> | 41 | by Douglas Landgraf <dougsland@gmail.com> |
@@ -135,7 +138,7 @@ module_param(radio_nr, int, 0); | |||
135 | struct dsbr100_device { | 138 | struct dsbr100_device { |
136 | struct usb_device *usbdev; | 139 | struct usb_device *usbdev; |
137 | struct video_device *videodev; | 140 | struct video_device *videodev; |
138 | unsigned char transfer_buffer[TB_LEN]; | 141 | u8 *transfer_buffer; |
139 | int curfreq; | 142 | int curfreq; |
140 | int stereo; | 143 | int stereo; |
141 | int users; | 144 | int users; |
@@ -237,10 +240,7 @@ static void dsbr100_getstat(struct dsbr100_device *radio) | |||
237 | /* handle unplugging of the device, release data structures | 240 | /* handle unplugging of the device, release data structures |
238 | if nothing keeps us from doing it. If something is still | 241 | if nothing keeps us from doing it. If something is still |
239 | keeping us busy, the release callback of v4l will take care | 242 | keeping us busy, the release callback of v4l will take care |
240 | of releasing it. stv680.c does not relase its private | 243 | of releasing it. */ |
241 | data, so I don't do this here either. Checking out the | ||
242 | code I'd expect I better did that, but if there's a memory | ||
243 | leak here it's tiny (~50 bytes per disconnect) */ | ||
244 | static void usb_dsbr100_disconnect(struct usb_interface *intf) | 244 | static void usb_dsbr100_disconnect(struct usb_interface *intf) |
245 | { | 245 | { |
246 | struct dsbr100_device *radio = usb_get_intfdata(intf); | 246 | struct dsbr100_device *radio = usb_get_intfdata(intf); |
@@ -250,6 +250,7 @@ static void usb_dsbr100_disconnect(struct usb_interface *intf) | |||
250 | video_unregister_device(radio->videodev); | 250 | video_unregister_device(radio->videodev); |
251 | radio->videodev = NULL; | 251 | radio->videodev = NULL; |
252 | if (radio->users) { | 252 | if (radio->users) { |
253 | kfree(radio->transfer_buffer); | ||
253 | kfree(radio); | 254 | kfree(radio); |
254 | } else { | 255 | } else { |
255 | radio->removed = 1; | 256 | radio->removed = 1; |
@@ -425,6 +426,7 @@ static int usb_dsbr100_close(struct inode *inode, struct file *file) | |||
425 | return -ENODEV; | 426 | return -ENODEV; |
426 | radio->users = 0; | 427 | radio->users = 0; |
427 | if (radio->removed) { | 428 | if (radio->removed) { |
429 | kfree(radio->transfer_buffer); | ||
428 | kfree(radio); | 430 | kfree(radio); |
429 | } | 431 | } |
430 | return 0; | 432 | return 0; |
@@ -471,7 +473,12 @@ static int usb_dsbr100_probe(struct usb_interface *intf, | |||
471 | 473 | ||
472 | if (!(radio = kmalloc(sizeof(struct dsbr100_device), GFP_KERNEL))) | 474 | if (!(radio = kmalloc(sizeof(struct dsbr100_device), GFP_KERNEL))) |
473 | return -ENOMEM; | 475 | return -ENOMEM; |
476 | if (!(radio->transfer_buffer = kmalloc(TB_LEN, GFP_KERNEL))) { | ||
477 | kfree(radio); | ||
478 | return -ENOMEM; | ||
479 | } | ||
474 | if (!(radio->videodev = video_device_alloc())) { | 480 | if (!(radio->videodev = video_device_alloc())) { |
481 | kfree(radio->transfer_buffer); | ||
475 | kfree(radio); | 482 | kfree(radio); |
476 | return -ENOMEM; | 483 | return -ENOMEM; |
477 | } | 484 | } |
@@ -485,6 +492,7 @@ static int usb_dsbr100_probe(struct usb_interface *intf, | |||
485 | if (video_register_device(radio->videodev, VFL_TYPE_RADIO,radio_nr)) { | 492 | if (video_register_device(radio->videodev, VFL_TYPE_RADIO,radio_nr)) { |
486 | warn("Could not register video device"); | 493 | warn("Could not register video device"); |
487 | video_device_release(radio->videodev); | 494 | video_device_release(radio->videodev); |
495 | kfree(radio->transfer_buffer); | ||
488 | kfree(radio); | 496 | kfree(radio); |
489 | return -EIO; | 497 | return -EIO; |
490 | } | 498 | } |