vserver 2.0 rc7
[linux-2.6.git] / drivers / media / dvb / dibusb / dvb-dibusb-dvb.c
index d7dd6e7..400b439 100644 (file)
@@ -22,46 +22,34 @@ static u32 urb_compl_count;
 void dibusb_urb_complete(struct urb *urb, struct pt_regs *ptregs)
 {
        struct usb_dibusb *dib = urb->context;
-       int ret;
 
        deb_ts("urb complete feedcount: %d, status: %d, length: %d\n",dib->feedcount,urb->status,
                        urb->actual_length);
 
        urb_compl_count++;
-       if (urb_compl_count % 500 == 0)
+       if (urb_compl_count % 1000 == 0)
                deb_info("%d urbs completed so far.\n",urb_compl_count);
 
        switch (urb->status) {
                case 0:         /* success */
                case -ETIMEDOUT:    /* NAK */
                        break;
-               case -ECONNRESET:   /* unlink */
+               case -ECONNRESET:   /* kill */
                case -ENOENT:
                case -ESHUTDOWN:
                        return;
                default:        /* error */
-                       warn("urb completition error %d.", urb->status);
+                       deb_ts("urb completition error %d.", urb->status);
+                       break;
        }
 
-       if (dib->feedcount > 0) {
-               deb_ts("URB return len: %d\n",urb->actual_length);
-               if (urb->actual_length % 188) 
-                       deb_ts("TS Packets: %d, %d\n", urb->actual_length/188,urb->actual_length % 188);
-
-               /* Francois recommends to drop not full-filled packets, even if they may 
-                * contain valid TS packets, at least for USB1.1
-                *
-                * if (urb->actual_length == dib->dibdev->parm->default_size && dib->dvb_is_ready) */
+       if (dib->feedcount > 0 && urb->actual_length > 0) {
                if (dib->init_state & DIBUSB_STATE_DVB)
                        dvb_dmx_swfilter(&dib->demux, (u8*) urb->transfer_buffer,urb->actual_length);
-               else
-                       deb_ts("URB dropped because of the " 
-                                       "actual_length or !dvb_is_ready (%d).\n",dib->init_state & DIBUSB_STATE_DVB);
        } else 
                deb_ts("URB dropped because of feedcount.\n");
 
-       ret = usb_submit_urb(urb,GFP_ATOMIC);
-       deb_ts("urb resubmitted, (%d)\n",ret);
+       usb_submit_urb(urb,GFP_ATOMIC);
 }
 
 static int dibusb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff) 
@@ -77,7 +65,6 @@ static int dibusb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
        /* 
         * stop feed before setting a new pid if there will be no pid anymore 
         */
-//     if ((dib->dibdev->parm->firmware_bug && dib->feedcount) || 
        if (newfeedcount == 0) {
                deb_ts("stop feeding\n");
                if (dib->xfer_ops.fifo_ctrl != NULL) {
@@ -86,23 +73,20 @@ static int dibusb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
                                return -ENODEV;
                        }
                }
+               dibusb_streaming(dib,0);
        }
        
        dib->feedcount = newfeedcount;
 
-       /* get a free pid from the list and activate it on the device
-        * specific pid_filter
-        */
-       if (dib->pid_parse)
-               dibusb_ctrl_pid(dib,dvbdmxfeed,onoff);
+       /* activate the pid on the device specific pid_filter */
+       deb_ts("setting pid: %5d %04x at index %d '%s'\n",dvbdmxfeed->pid,dvbdmxfeed->pid,dvbdmxfeed->index,onoff ? "on" : "off");
+       if (dib->pid_parse && dib->xfer_ops.pid_ctrl != NULL)
+               dib->xfer_ops.pid_ctrl(dib->fe,dvbdmxfeed->index,dvbdmxfeed->pid,onoff);
 
        /* 
-        * start the feed, either if there is the firmware bug or 
-        * if this was the first pid to set and there is still a pid for 
-        * reception.
+        * start the feed if this was the first pid to set and there is still a pid
+        * for reception.
         */
-       
-//     if ((dib->dibdev->parm->firmware_bug)
        if (dib->feedcount == onoff && dib->feedcount > 0) {
 
                deb_ts("controlling pid parser\n");
@@ -142,16 +126,12 @@ int dibusb_dvb_init(struct usb_dibusb *dib)
 
        urb_compl_count = 0;
 
-#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,4)
-    if ((ret = dvb_register_adapter(&dib->adapter, DRIVER_DESC)) < 0) {
-#else
-    if ((ret = dvb_register_adapter(&dib->adapter, DRIVER_DESC , 
+       if ((ret = dvb_register_adapter(&dib->adapter, DRIVER_DESC,
                        THIS_MODULE)) < 0) {
-#endif
                deb_info("dvb_register_adapter failed: error %d", ret);
                goto err;
        }
-       dib->adapter->priv = dib;
+       dib->adapter.priv = dib;
        
 /* i2c is done in dibusb_i2c_init */
        
@@ -171,18 +151,18 @@ int dibusb_dvb_init(struct usb_dibusb *dib)
        dib->dmxdev.filternum = dib->demux.filternum;
        dib->dmxdev.demux = &dib->demux.dmx;
        dib->dmxdev.capabilities = 0;
-       if ((ret = dvb_dmxdev_init(&dib->dmxdev, dib->adapter)) < 0) {
+       if ((ret = dvb_dmxdev_init(&dib->dmxdev, &dib->adapter)) < 0) {
                err("dvb_dmxdev_init failed: error %d",ret);
                goto err_dmx_dev;
        }
 
-       dvb_net_init(dib->adapter, &dib->dvb_net, &dib->demux.dmx);
+       dvb_net_init(&dib->adapter, &dib->dvb_net, &dib->demux.dmx);
 
        goto success;
 err_dmx_dev:
        dvb_dmx_release(&dib->demux);
 err_dmx:
-       dvb_unregister_adapter(dib->adapter);
+       dvb_unregister_adapter(&dib->adapter);
 err:
        return ret;
 success:
@@ -199,7 +179,7 @@ int dibusb_dvb_exit(struct usb_dibusb *dib)
                dib->demux.dmx.close(&dib->demux.dmx);
                dvb_dmxdev_release(&dib->dmxdev);
                dvb_dmx_release(&dib->demux);
-               dvb_unregister_adapter(dib->adapter);
+               dvb_unregister_adapter(&dib->adapter);
        }
        return 0;
 }