Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=863c86dd7e014e645207fd16f4e06bc223567984
Commit:     863c86dd7e014e645207fd16f4e06bc223567984
Parent:     e1ba33df0cbc6a7ab339dc093f37825775b9caca
Author:     Oliver Neukum <[EMAIL PROTECTED]>
AuthorDate: Mon Dec 3 06:48:43 2007 -0300
Committer:  Mauro Carvalho Chehab <[EMAIL PROTECTED]>
CommitDate: Fri Jan 25 19:03:14 2008 -0200

    V4L/DVB (6732): dsbr100 violates DMA coherency rules
    
    Signed-off-by: Oliver Neukum <[EMAIL PROTECTED]>
    Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>
---
 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 3bd07f7..36c0e36 100644
--- a/drivers/media/radio/dsbr100.c
+++ b/drivers/media/radio/dsbr100.c
@@ -33,6 +33,9 @@
 
  History:
 
+ Version 0.43:
+       Oliver Neukum: avoided DMA coherency issue
+
  Version 0.42:
        Converted dsbr100 to use video_ioctl2
        by Douglas Landgraf <[EMAIL PROTECTED]>
@@ -135,7 +138,7 @@ module_param(radio_nr, int, 0);
 struct dsbr100_device {
        struct usb_device *usbdev;
        struct video_device *videodev;
-       unsigned char transfer_buffer[TB_LEN];
+       u8 *transfer_buffer;
        int curfreq;
        int stereo;
        int users;
@@ -237,10 +240,7 @@ static void dsbr100_getstat(struct dsbr100_device *radio)
 /* handle unplugging of the device, release data structures
 if nothing keeps us from doing it.  If something is still
 keeping us busy, the release callback of v4l will take care
-of releasing it.  stv680.c does not relase its private
-data, so I don't do this here either.  Checking out the
-code I'd expect I better did that, but if there's a memory
-leak here it's tiny (~50 bytes per disconnect) */
+of releasing it. */
 static void usb_dsbr100_disconnect(struct usb_interface *intf)
 {
        struct dsbr100_device *radio = usb_get_intfdata(intf);
@@ -250,6 +250,7 @@ static void usb_dsbr100_disconnect(struct usb_interface 
*intf)
                video_unregister_device(radio->videodev);
                radio->videodev = NULL;
                if (radio->users) {
+                       kfree(radio->transfer_buffer);
                        kfree(radio);
                } else {
                        radio->removed = 1;
@@ -425,6 +426,7 @@ static int usb_dsbr100_close(struct inode *inode, struct 
file *file)
                return -ENODEV;
        radio->users = 0;
        if (radio->removed) {
+               kfree(radio->transfer_buffer);
                kfree(radio);
        }
        return 0;
@@ -471,7 +473,12 @@ static int usb_dsbr100_probe(struct usb_interface *intf,
 
        if (!(radio = kmalloc(sizeof(struct dsbr100_device), GFP_KERNEL)))
                return -ENOMEM;
+       if (!(radio->transfer_buffer = kmalloc(TB_LEN, GFP_KERNEL))) {
+               kfree(radio);
+               return -ENOMEM;
+       }
        if (!(radio->videodev = video_device_alloc())) {
+               kfree(radio->transfer_buffer);
                kfree(radio);
                return -ENOMEM;
        }
@@ -485,6 +492,7 @@ static int usb_dsbr100_probe(struct usb_interface *intf,
        if (video_register_device(radio->videodev, VFL_TYPE_RADIO,radio_nr)) {
                warn("Could not register video device");
                video_device_release(radio->videodev);
+               kfree(radio->transfer_buffer);
                kfree(radio);
                return -EIO;
        }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to