From patchwork Mon Mar 22 09:50:59 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Repplinger X-Patchwork-Id: 87392 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o2MAGNHS022650 for ; Mon, 22 Mar 2010 10:16:23 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753615Ab0CVKQW (ORCPT ); Mon, 22 Mar 2010 06:16:22 -0400 Received: from www49.your-server.de ([213.133.104.49]:43977 "EHLO www49.your-server.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753012Ab0CVKQU (ORCPT ); Mon, 22 Mar 2010 06:16:20 -0400 X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Mon, 22 Mar 2010 10:16:24 +0000 (UTC) X-Greylist: delayed 1512 seconds by postgrey-1.27 at vger.kernel.org; Mon, 22 Mar 2010 06:16:20 EDT Received: from [188.107.127.143] (helo=[192.168.1.32]) by www49.your-server.de with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.69) (envelope-from ) id 1NteHq-0002Cp-C5 for linux-media@vger.kernel.org; Mon, 22 Mar 2010 10:51:06 +0100 Message-ID: <4BA73D83.1010002@motama.com> Date: Mon, 22 Mar 2010 10:50:59 +0100 From: Michael Repplinger User-Agent: Thunderbird 2.0.0.23 (X11/20090817) MIME-Version: 1.0 To: linux-media@vger.kernel.org Subject: Questions to ngene/dvb_frontend driver [Original email was "Problems with ngene based DVB cards (Digital Devices Cine S2 Dual DVB-S2 , Mystique SaTiX S2 Dual)"] X-Authenticated-Sender: repplinger_smtp@motama.com X-Virus-Scanned: Clear (ClamAV 0.95.3/10604/Mon Mar 22 03:14:56 2010) Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org Index: linux/drivers/media/dvb/ngene/ngene-core.c =================================================================== --- linux/drivers/media/dvb/ngene/ngene-core.c (revision 1) +++ linux/drivers/media/dvb/ngene/ngene-core.c (revision 5) @@ -90,6 +90,8 @@ { struct ngene *dev = (struct ngene *)data; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + while (dev->EventQueueReadIndex != dev->EventQueueWriteIndex) { struct EVENT_BUFFER Event = dev->EventQueue[dev->EventQueueReadIndex]; @@ -117,6 +119,8 @@ struct ngene_channel *chan = (struct ngene_channel *)data; struct SBufferHeader *Cur = chan->nextBuffer; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + spin_lock_irq(&chan->state_lock); while (Cur->ngeneBuffer.SR.Flags & 0x80) { @@ -211,6 +215,8 @@ u32 i = MAX_STREAM; u8 *tmpCmdDoneByte; + dprintk (KERN_DEBUG DEVICE_NAME ">: %s IRQ %i\n", __func__, irq); + if (dev->BootFirmware) { icounts = ngreadl(NGENE_INT_COUNTS); if (icounts != dev->icounts) { @@ -220,6 +226,10 @@ dev->icounts = icounts; rc = IRQ_HANDLED; } + if ( rc != IRQ_HANDLED ) { + dprintk("Unhandled IRQ %i occured\n", irq); + } + dprintk (KERN_DEBUG DEVICE_NAME "<: %s Return dev->BootFirmware \n", __func__); return rc; } @@ -260,7 +270,12 @@ dev->EventBuffer->EventStatus &= ~0x80; tasklet_schedule(&dev->event_tasklet); rc = IRQ_HANDLED; - } + } else { + if( i == 0) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s IRQ handler does not execute any method \n", __func__); + } + } + while (i > 0) { i--; @@ -278,6 +293,8 @@ } spin_unlock(&dev->channel[i].state_lock); } + + dprintk (KERN_DEBUG DEVICE_NAME "< : %s return IRQ_HANDLED \n", __func__); /* Request might have been processed by a previous call. */ return IRQ_HANDLED; @@ -291,6 +308,8 @@ { u8 buf[8], *b; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + ngcpyfrom(buf, HOST_TO_NGENE, 8); printk(KERN_ERR "host_to_ngene (%04x): %02x %02x %02x %02x %02x %02x %02x %02x\n", HOST_TO_NGENE, buf[0], buf[1], buf[2], buf[3], @@ -315,6 +334,8 @@ int ret; u8 *tmpCmdDoneByte; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + dev->cmd_done = 0; if (com->cmd.hdr.Opcode == CMD_FWLOAD_PREPARE) { @@ -394,6 +415,8 @@ { int result; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + down(&dev->cmd_mutex); result = ngene_command_mutex(dev, com); up(&dev->cmd_mutex); @@ -419,6 +442,8 @@ { struct ngene_command com; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + com.cmd.hdr.Opcode = CMD_I2C_READ; com.cmd.hdr.Length = outlen + 3; com.cmd.I2CRead.Device = adr << 1; @@ -446,6 +471,8 @@ { struct ngene_command com; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + #if 0 /* Probing by writing 0 bytes does not work */ if (!outlen) @@ -475,6 +502,8 @@ u32 cleft; struct ngene_command com; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + com.cmd.hdr.Opcode = CMD_FWLOAD_PREPARE; com.cmd.hdr.Length = 0; com.in_len = 0; @@ -583,6 +612,8 @@ { struct ngene_command com; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + com.cmd.hdr.Opcode = CMD_CONFIGURE_BUFFER; com.cmd.hdr.Length = 1; com.cmd.ConfigureBuffers.config = config; @@ -598,6 +629,8 @@ { struct ngene_command com; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + com.cmd.hdr.Opcode = CMD_CONFIGURE_FREE_BUFFER; com.cmd.hdr.Length = 6; memcpy(&com.cmd.ConfigureBuffers.config, config, 6); @@ -614,6 +647,8 @@ { struct ngene_command com; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + com.cmd.hdr.Opcode = CMD_SET_GPIO_PIN; com.cmd.hdr.Length = 1; com.cmd.SetGpioPin.select = select | (level << 7); @@ -708,6 +743,8 @@ { u32 *ptr = Buffer; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + memset(Buffer, 0xff, Length); while (Length > 0) { if (Flags & DF_SWAP32) @@ -735,6 +772,8 @@ { u8 val; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + do { msleep(1); spin_lock_irq(&chan->state_lock); @@ -747,6 +786,8 @@ { struct SBufferHeader *Cur = chan->nextBuffer; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + do { memset(&Cur->ngeneBuffer.SR, 0, sizeof(Cur->ngeneBuffer.SR)); if (chan->mode & NGENE_IO_TSOUT) @@ -784,6 +825,8 @@ u16 BsSPI = ((stream & 1) ? 0x9800 : 0x9700); u16 BsSDO = 0x9B00; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + /* down(&dev->stream_mutex); */ while (down_trylock(&dev->stream_mutex)) { printk(KERN_INFO DEVICE_NAME ": SC locked\n"); @@ -954,6 +997,8 @@ static void ngene_i2c_set_bus(struct ngene *dev, int bus) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + if (!(dev->card_info->i2c_access & 2)) return; if (dev->i2c_current_bus == bus) @@ -980,28 +1025,46 @@ (struct ngene_channel *)i2c_get_adapdata(adapter); struct ngene *dev = chan->dev; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + down(&dev->i2c_switch_mutex); + dprintk (KERN_DEBUG DEVICE_NAME ": > ngene_i2x_set_bus \n"); ngene_i2c_set_bus(dev, chan->number); + dprintk (KERN_DEBUG DEVICE_NAME ": < ngene_i2x_set_bus \n"); - if (num == 2 && msg[1].flags & I2C_M_RD && !(msg[0].flags & I2C_M_RD)) + if (num == 2 && msg[1].flags & I2C_M_RD && !(msg[0].flags & I2C_M_RD)) { + dprintk (KERN_DEBUG DEVICE_NAME "> : num = 2 ngene_command_i2c_read \n"); if (!ngene_command_i2c_read(dev, msg[0].addr, msg[0].buf, msg[0].len, - msg[1].buf, msg[1].len, 0)) - goto done; + msg[1].buf, msg[1].len, 0)) { + dprintk (KERN_DEBUG DEVICE_NAME "<: ngene_command_i2c_read> ngene_i2x_set_bus \n"); + goto done; + } + } - if (num == 1 && !(msg[0].flags & I2C_M_RD)) + if (num == 1 && !(msg[0].flags & I2C_M_RD)) { + dprintk (KERN_DEBUG DEVICE_NAME ": num = 1 ngene_command_i2c_write \n"); if (!ngene_command_i2c_write(dev, msg[0].addr, - msg[0].buf, msg[0].len)) + msg[0].buf, msg[0].len)) { + dprintk (KERN_DEBUG DEVICE_NAME ": num = 1 ngene_command_i2c_write \n"); goto done; - if (num == 1 && (msg[0].flags & I2C_M_RD)) + } + } + if (num == 1 && (msg[0].flags & I2C_M_RD)) { + dprintk (KERN_DEBUG DEVICE_NAME ">: read num = 1 ngene_command_i2c_write \n"); if (!ngene_command_i2c_read(dev, msg[0].addr, NULL, 0, - msg[0].buf, msg[0].len, 0)) + msg[0].buf, msg[0].len, 0)) { + dprintk (KERN_DEBUG DEVICE_NAME "<: read num = 1 ngene_command_i2c_write \n"); goto done; + } + } up(&dev->i2c_switch_mutex); + dprintk (KERN_DEBUG DEVICE_NAME ": %s failed \n", __func__); return -EIO; done: + dprintk (KERN_DEBUG DEVICE_NAME ": %s succeeded \n", __func__); up(&dev->i2c_switch_mutex); return num; } @@ -1042,6 +1105,8 @@ static u32 ngene_i2c_functionality(struct i2c_adapter *adap) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + return I2C_FUNC_SMBUS_EMUL; } @@ -1062,6 +1127,8 @@ { struct i2c_adapter *adap = &(dev->channel[dev_nr].i2c_adapter); + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + i2c_set_adapdata(adap, &(dev->channel[dev_nr])); #ifdef I2C_CLASS_TV_DIGITAL adap->class = I2C_CLASS_TV_DIGITAL | I2C_CLASS_TV_ANALOG; @@ -1739,6 +1806,8 @@ static void swap_buffer(u32 *p, u32 len) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + while (len) { *p = swab32(*p); p++; @@ -1783,6 +1852,8 @@ { struct ngene_channel *chan = priv; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + #if 0 printk(KERN_INFO DEVICE_NAME ": tsin %08x %02x %02x %02x %02x\n", len, ((u8 *) buf)[512 * 188], ((u8 *) buf)[0], @@ -1805,6 +1876,8 @@ struct ngene *dev = chan->dev; u32 alen; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + alen = dvb_ringbuffer_avail(&dev->tsout_rbuf); alen -= alen % 188; @@ -1837,6 +1910,8 @@ struct ngene *dev = chan->dev; int ret; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + /* printk(KERN_INFO DEVICE_NAME ": st %d\n", state); msleep(100); @@ -1910,6 +1985,8 @@ { struct dvb_demux *dvbdmx = dvbdmxfeed->demux; struct ngene_channel *chan = dvbdmx->priv; + + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); #if 0 struct ngene *dev = chan->dev; @@ -1952,6 +2029,8 @@ { struct dvb_demux *dvbdmx = dvbdmxfeed->demux; struct ngene_channel *chan = dvbdmx->priv; + + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); #if 0 struct ngene *dev = chan->dev; @@ -2220,6 +2299,8 @@ int (*stop_feed)(struct dvb_demux_feed *), void *priv) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + dvbdemux->priv = priv; dvbdemux->filternum = 256; @@ -2241,6 +2322,8 @@ { int ret; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + dmxdev->filternum = 256; dmxdev->demux = &dvbdemux->dmx; dmxdev->capabilities = 0; @@ -2348,6 +2431,8 @@ struct SBufferHeader *Cur = rb->Head; u32 j; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + if (!Cur) return; @@ -2379,6 +2464,8 @@ int j; struct SBufferHeader *Cur = tb->Head; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + if (!rb->Head) return; free_ringbuffer(dev, rb); @@ -2395,6 +2482,8 @@ u32 i; struct ngene_channel *chan; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + for (i = STREAM_VIDEOIN1; i < MAX_STREAM; i++) { chan = &dev->channel[i]; free_idlebuffer(dev, &chan->TSIdleBuffer, &chan->TSRingBuffer); @@ -2430,6 +2519,8 @@ u64 PARingBufferNext; struct SBufferHeader *Cur, *Next; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + descr->Head = NULL; descr->MemSize = 0; descr->PAHead = 0; @@ -2489,6 +2580,8 @@ struct SBufferHeader *Cur; void *SCListMem; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + if (SCListMemSize < 4096) SCListMemSize = 4096; @@ -2594,6 +2687,9 @@ /* Point to first buffer entry */ struct SBufferHeader *Cur = pRingBuffer->Head; int i; + + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + /* Loop thru all buffer and set Buffer 2 pointers to TSIdlebuffer */ for (i = 0; i < n; i++) { Cur->Buffer2 = pIdleBuffer->Head->Buffer1; @@ -2716,6 +2812,8 @@ { int status = 0, i; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + dev->FWInterfaceBuffer = pci_alloc_consistent(dev->pci_dev, 4096, &dev->PAFWInterfaceBuffer); if (!dev->FWInterfaceBuffer) @@ -2805,6 +2903,8 @@ static void ngene_release_buffers(struct ngene *dev) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + if (dev->iomem) iounmap(dev->iomem); free_common_buffers(dev); @@ -2816,6 +2916,8 @@ static int ngene_get_buffers(struct ngene *dev) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + if (AllocCommonBuffers(dev)) return -ENOMEM; if (dev->card_info->io_type[4] & NGENE_IO_TSOUT) { @@ -2849,6 +2951,8 @@ { int i; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + tasklet_init(&dev->event_tasklet, event_tasklet, (unsigned long)dev); memset_io(dev->iomem + 0xc000, 0x00, 0x220); @@ -2878,6 +2982,8 @@ char *fw_name; int err, version; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + version = dev->card_info->fw_version; switch (version) { @@ -2922,6 +3028,8 @@ static void ngene_stop(struct ngene *dev) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + down(&dev->cmd_mutex); i2c_del_adapter(&(dev->channel[0].i2c_adapter)); i2c_del_adapter(&(dev->channel[1].i2c_adapter)); @@ -2940,6 +3048,8 @@ int stat; int i; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + pci_set_master(dev->pci_dev); ngene_init(dev); @@ -3452,6 +3562,8 @@ chan->dev->card_info->tuner_config[chan->number]; struct stv6110x_devctl *ctl; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + ctl = dvb_attach(stv6110x_attach, chan->fe, tunerconf, &chan->i2c_adapter); if (ctl == NULL) { @@ -3569,6 +3681,8 @@ struct stv090x_config *feconf = (struct stv090x_config *) chan->dev->card_info->fe_config[chan->number]; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + chan->fe = dvb_attach(stv090x_attach, feconf, &chan->i2c_adapter, @@ -3600,6 +3714,8 @@ struct ngene_info *ni = dev->card_info; int io = ni->io_type[chan->number]; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + #ifdef COMMAND_TIMEOUT_WORKAROUND if (chan->running) set_transfer(chan, 0); @@ -3652,6 +3768,8 @@ struct ngene_info *ni = dev->card_info; int io = ni->io_type[nr]; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + tasklet_init(&chan->demux_tasklet, demux_tasklet, (unsigned long)chan); chan->users = 0; chan->type = io; @@ -3741,6 +3859,8 @@ { int i, j; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + for (i = 0; i < MAX_STREAM; i++) { if (init_channel(&dev->channel[i]) < 0) { for (j = i - 1; j >= 0; j--) @@ -3760,6 +3880,8 @@ struct ngene *dev = (struct ngene *)pci_get_drvdata(pdev); int i; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + tasklet_kill(&dev->event_tasklet); for (i = MAX_STREAM - 1; i >= 0; i--) release_channel(&dev->channel[i]); @@ -3775,6 +3897,8 @@ struct ngene *dev; int stat = 0; + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + if (pci_enable_device(pci_dev) < 0) return -ENODEV; @@ -4306,6 +4430,8 @@ static pci_ers_result_t ngene_error_detected(struct pci_dev *dev, enum pci_channel_state state) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + printk(KERN_ERR DEVICE_NAME ": PCI error\n"); if (state == pci_channel_io_perm_failure) return PCI_ERS_RESULT_DISCONNECT; @@ -4316,6 +4442,8 @@ static pci_ers_result_t ngene_link_reset(struct pci_dev *dev) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + printk(KERN_INFO DEVICE_NAME ": link reset\n"); return 0; } @@ -4328,6 +4456,8 @@ static void ngene_resume(struct pci_dev *dev) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + printk(KERN_INFO DEVICE_NAME ": resume\n"); } @@ -4353,6 +4483,8 @@ static __init int module_init_ngene(void) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + printk(KERN_INFO "nGene PCIE bridge driver, Copyright (C) 2005-2007 Micronas\n"); #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 15) @@ -4364,6 +4496,8 @@ static __exit void module_exit_ngene(void) { + dprintk (KERN_DEBUG DEVICE_NAME ": %s\n", __func__); + pci_unregister_driver(&ngene_pci_driver); } Index: linux/drivers/media/dvb/dvb-core/dvb_frontend.c =================================================================== --- linux/drivers/media/dvb/dvb-core/dvb_frontend.c (revision 1) +++ linux/drivers/media/dvb/dvb-core/dvb_frontend.c (revision 5) @@ -404,6 +404,7 @@ if (fe->ops.read_status) fe->ops.read_status(fe, &s); if (s != fepriv->status) { + dprintk("dvb_frontend_swzigzag add_event frontend status"); dvb_frontend_add_event(fe, s); fepriv->status = s; } @@ -473,6 +474,7 @@ if (retval < 0) { return; } else if (retval) { + dprintk(" OK, if we've run out of trials at the fast speed. -> Slow speed \n"); /* OK, if we've run out of trials at the fast speed. * Drop back to slow for the _next_ attempt */ fepriv->state = FESTATE_SEARCHING_SLOW; @@ -634,24 +636,35 @@ */ if (fepriv->algo_status & DVBFE_ALGO_SEARCH_AGAIN) { if (fe->ops.search) { - fepriv->algo_status = fe->ops.search(fe, &fepriv->parameters); + dprintk(">search, status\n"); /* We did do a search as was requested, the flags are * now unset as well and has the flags wrt to search. */ + fepriv->algo_status = fe->ops.search(fe, &fepriv->parameters); + dprintk("algo_status &= ~DVBFE_ALGO_SEARCH_AGAIN; } } /* Track the carrier if the search was successful */ if (fepriv->algo_status == DVBFE_ALGO_SEARCH_SUCCESS) { - if (fe->ops.track) + if (fe->ops.track) { + dprintk(">track, status\n"); fe->ops.track(fe, &fepriv->parameters); + dprintk("algo_status |= DVBFE_ALGO_SEARCH_AGAIN; fepriv->delay = HZ / 2; } - fe->ops.read_status(fe, &s); + + dprintk(">read status, status\n"); + fe->ops.read_status(fe, &s); + dprintk("status) { + dprintk("dvb_frontend_thread, status\n"); dvb_frontend_add_event(fe, s); /* update event list */ fepriv->status = s; if (!(s & FE_HAS_LOCK)) { @@ -1506,23 +1519,34 @@ if (fepriv->exit) return -ENODEV; + dprintk(" not fepriv->exit %s (%d)\n", __func__, _IOC_NR(cmd)); + if ((file->f_flags & O_ACCMODE) == O_RDONLY && (_IOC_DIR(cmd) != _IOC_READ || cmd == FE_GET_EVENT || cmd == FE_DISEQC_RECV_SLAVE_REPLY)) return -EPERM; + dprintk(" >down interruptable %s (%d)\n", __func__, _IOC_NR(cmd)); if (down_interruptible (&fepriv->sem)) return -ERESTARTSYS; + dprintk(" dtv_property_cache.state = DTV_UNDEFINED; err = dvb_frontend_ioctl_legacy(inode, file, cmd, parg); } + dprintk("> up %s (%d)\n", __func__, _IOC_NR(cmd)); + up(&fepriv->sem); - return err; + dprintk("algo_status |= DVBFE_ALGO_SEARCH_AGAIN; dvb_frontend_wakeup(fe); + dprintk("dvb_frontend_add_event, before wakeup"); dvb_frontend_add_event(fe, 0); fepriv->status = 0; err = 0; @@ -2018,17 +2043,24 @@ if ((file->f_flags & O_ACCMODE) != O_RDONLY) fepriv->release_jiffies = jiffies; - ret = dvb_generic_release (inode, file); + ret = dvb_generic_release (inode, file); if (dvbdev->users == -1) { if (fepriv->exit == 1) { + dprintk (" >Internal cleanup when closin DVB device %s\n", __func__); fops_put(file->f_op); file->f_op = NULL; wake_up(&dvbdev->wait_queue); + dprintk (" ops.ts_bus_ctrl) + if (fe->ops.ts_bus_ctrl) { + dprintk (" >Invoke fe->ops.ts_bus_ctrl %s\n", __func__); fe->ops.ts_bus_ctrl(fe, 0); - } + dprintk (" >Invoke fe->ops.ts_bus_ctrl %s\n", __func__); + } + } else { + dprintk (" !NOT Close DVB device %s\n", __func__); + } return ret; }