if (!demux->dmx.frontend)
                return -EINVAL;
 
-       if (dvb) {
+       if (dvb->frontend) {
                mutex_lock(&dvb->lock);
                dvb->start_count++;
                dprintk(1, "%s(), start_count: %d, stop_count: %d\n", __func__,
 
        dprintk(1, "%s()\n", __func__);
 
-       if (dvb) {
+       if (dvb->frontend) {
                cancel_work_sync(&dev->restart_streaming);
 
                mutex_lock(&dvb->lock);
                for (i = 0; i < URB_COUNT; i++)
                        kfree(dev->dig_transfer_buffer[i]);
        }
-
-
+       dvb->frontend = NULL;
 }
 
 /* All the DVB attach calls go here, this function get's modified
        if (ret < 0) {
                if (dvb->frontend->ops.release)
                        dvb->frontend->ops.release(dvb->frontend);
+               dvb->frontend = NULL;
                return ret;
        }
 
 {
        struct au0828_dvb *dvb = &dev->dvb;
 
-       if (dvb && dev->urb_streaming) {
+       if (dvb->frontend && dev->urb_streaming) {
                pr_info("stopping DVB\n");
 
                cancel_work_sync(&dev->restart_streaming);
 {
        struct au0828_dvb *dvb = &dev->dvb;
 
-       if (dvb && dev->urb_streaming) {
+       if (dvb->frontend && dev->urb_streaming) {
                pr_info("resuming DVB\n");
 
                au0828_set_frontend(dvb->frontend);