/** * unregisters sms client and returns all queued buffers * * @param dev pointer to the client context (smschar parameters block) * */ static void smschar_unregister_client(struct smschar_device_t *dev) { unsigned long flags; if (dev->coredev && dev->smsclient) { dev->cancel_waitq = 1; wake_up_interruptible(&dev->waitq); spin_lock_irqsave(&dev->lock, flags); while (!list_empty(&dev->pending_data)) { struct smscore_buffer_t *cb = (struct smscore_buffer_t *)dev->pending_data.next; list_del(&cb->entry); smscore_putbuffer(dev->coredev, cb); dev->pending_count--; } if (dev->currentcb) { smscore_putbuffer(dev->coredev, dev->currentcb); dev->currentcb = NULL; dev->pending_count--; } smscore_unregister_client(dev->smsclient); dev->smsclient = NULL; spin_unlock_irqrestore(&dev->lock, flags); } }
void smsnet_unregister_client(struct smsnet_client_t *client) { /* must be called under clientslock */ list_del(&client->entry); smscore_unregister_client(client->smsclient); kfree(client); }
static void smsdvb_unregister_client(struct smsdvb_client_t *client) { /* must be called under clientslock */ list_del(&client->entry); smscore_unregister_client(client->smsclient); dvb_unregister_frontend(&client->frontend); dvb_dmxdev_release(&client->dmxdev); dvb_dmx_release(&client->demux); dvb_unregister_adapter(&client->adapter); kfree(client); }