Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / media / dvb / ttpci / av7110_ca.c
index 2d169d6..6079e88 100644 (file)
 #include <linux/byteorder/swabb.h>
 #include <linux/smp_lock.h>
 
-#define DEBUG_VARIABLE av7110_debug
-extern int av7110_debug;
-
-#include "dvb_i2c.h"
 #include "av7110.h"
 #include "av7110_hw.h"
-#include "dvb_functions.h"
+#include "av7110_ca.h"
 
 
 void CI_handle(struct av7110 *av7110, u8 *data, u16 len)
 {
-       DEB_EE(("av7110: %p\n", av7110));
+       dprintk(8, "av7110:%p\n",av7110);
 
        if (len < 3)
                return;
@@ -94,20 +90,32 @@ void ci_get_data(struct dvb_ringbuffer *cibuf, u8 *data, int len)
  * CI link layer file ops
  ******************************************************************************/
 
-int ci_ll_init(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf, int size)
+static int ci_ll_init(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf, int size)
 {
-       dvb_ringbuffer_init(cirbuf, vmalloc(size), size);
-       dvb_ringbuffer_init(ciwbuf, vmalloc(size), size);
+       struct dvb_ringbuffer *tab[] = { cirbuf, ciwbuf, NULL }, **p;
+       void *data;
+
+       for (p = tab; *p; p++) {
+               data = vmalloc(size);
+               if (!data) {
+                       while (p-- != tab) {
+                               vfree(p[0]->data);
+                               p[0]->data = NULL;
+                       }
+                       return -ENOMEM;
+               }
+               dvb_ringbuffer_init(*p, data, size);
+       }
        return 0;
 }
 
-void ci_ll_flush(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf)
+static void ci_ll_flush(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf)
 {
        dvb_ringbuffer_flush_spinlock_wakeup(cirbuf);
        dvb_ringbuffer_flush_spinlock_wakeup(ciwbuf);
 }
 
-void ci_ll_release(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf)
+static void ci_ll_release(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf)
 {
        vfree(cirbuf->data);
        cirbuf->data = NULL;
@@ -115,8 +123,8 @@ void ci_ll_release(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf)
        ciwbuf->data = NULL;
 }
 
-int ci_ll_reset(struct dvb_ringbuffer *cibuf, struct file *file,
-               int slots, ca_slot_info_t *slot)
+static int ci_ll_reset(struct dvb_ringbuffer *cibuf, struct file *file,
+                      int slots, ca_slot_info_t *slot)
 {
        int i;
        int len = 0;
@@ -212,7 +220,7 @@ static int dvb_ca_open(struct inode *inode, struct file *file)
        struct av7110 *av7110 = (struct av7110 *) dvbdev->priv;
        int err = dvb_generic_open(inode, file);
 
-       DEB_EE(("av7110: %p\n", av7110));
+       dprintk(8, "av7110:%p\n",av7110);
 
        if (err < 0)
                return err;
@@ -228,13 +236,16 @@ static unsigned int dvb_ca_poll (struct file *file, poll_table *wait)
        struct dvb_ringbuffer *wbuf = &av7110->ci_wbuffer;
        unsigned int mask = 0;
 
-       DEB_EE(("av7110: %p\n", av7110));
+       dprintk(8, "av7110:%p\n",av7110);
 
        poll_wait(file, &rbuf->queue, wait);
+       poll_wait(file, &wbuf->queue, wait);
+
        if (!dvb_ringbuffer_empty(rbuf))
-               mask |= POLLIN;
-       if (dvb_ringbuffer_avail(wbuf) > 1024)
-               mask |= POLLOUT;
+               mask |= (POLLIN | POLLRDNORM);
+
+       if (dvb_ringbuffer_free(wbuf) > 1024)
+               mask |= (POLLOUT | POLLWRNORM);
 
        return mask;
 }
@@ -246,7 +257,7 @@ static int dvb_ca_ioctl(struct inode *inode, struct file *file,
        struct av7110 *av7110 = (struct av7110 *) dvbdev->priv;
        unsigned long arg = (unsigned long) parg;
 
-       DEB_EE(("av7110: %p\n", av7110));
+       dprintk(8, "av7110:%p\n",av7110);
 
        switch (cmd) {
        case CA_RESET:
@@ -323,7 +334,7 @@ static ssize_t dvb_ca_write(struct file *file, const char __user *buf,
        struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
        struct av7110 *av7110 = (struct av7110 *) dvbdev->priv;
 
-       DEB_EE(("av7110: %p\n", av7110));
+       dprintk(8, "av7110:%p\n",av7110);
        return ci_ll_write(&av7110->ci_wbuffer, file, buf, count, ppos);
 }
 
@@ -333,7 +344,7 @@ static ssize_t dvb_ca_read(struct file *file, char __user *buf,
        struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
        struct av7110 *av7110 = (struct av7110 *) dvbdev->priv;
 
-       DEB_EE(("av7110: %p\n", av7110));
+       dprintk(8, "av7110:%p\n",av7110);
        return ci_ll_read(&av7110->ci_rbuffer, file, buf, count, ppos);
 }
 
@@ -360,7 +371,7 @@ static struct dvb_device dvbdev_ca = {
 
 int av7110_ca_register(struct av7110 *av7110)
 {
-       return dvb_register_device(av7110->dvb_adapter, &av7110->ca_dev,
+       return dvb_register_device(&av7110->dvb_adapter, &av7110->ca_dev,
                                   &dvbdev_ca, av7110, DVB_DEVICE_CA);
 }
 
@@ -369,9 +380,9 @@ void av7110_ca_unregister(struct av7110 *av7110)
        dvb_unregister_device(av7110->ca_dev);
 }
 
-void av7110_ca_init(struct av7110* av7110)
+int av7110_ca_init(struct av7110* av7110)
 {
-       ci_ll_init(&av7110->ci_rbuffer, &av7110->ci_wbuffer, 8192);
+       return ci_ll_init(&av7110->ci_rbuffer, &av7110->ci_wbuffer, 8192);
 }
 
 void av7110_ca_exit(struct av7110* av7110)