/* return pointer to next free buffer descriptor from core pool */
struct smscore_buffer_t* smscore_getbuffer(struct smscore_device_t *coredev)
/* return pointer to next free buffer descriptor from core pool */
struct smscore_buffer_t* smscore_getbuffer(struct smscore_device_t *coredev)
{
	struct smscore_buffer_t *cb = NULL;
	unsigned long flags;
	DEFINE_WAIT(wait);
	spin_lock_irqsave(&coredev->bufferslock, flags);
	prepare_to_wait(&coredev->buffer_mng_waitq, &wait, TASK_INTERRUPTIBLE);
	if (list_empty(&coredev->buffers))
		schedule();
	finish_wait(&coredev->buffer_mng_waitq, &wait);
	cb = (struct smscore_buffer_t *) coredev->buffers.next;
	list_del(&cb->entry);
	spin_unlock_irqrestore(&coredev->bufferslock, flags);
	return cb;
}