Path: blob/master/drivers/isdn/hardware/eicon/dqueue.c
15115 views
/* $Id: dqueue.c,v 1.5 2003/04/12 21:40:49 schindler Exp $1*2* Driver for Eicon DIVA Server ISDN cards.3* User Mode IDI Interface4*5* Copyright 2000-2003 by Armin Schindler ([email protected])6* Copyright 2000-2003 Cytronics & Melware ([email protected])7*8* This software may be used and distributed according to the terms9* of the GNU General Public License, incorporated herein by reference.10*/1112#include "platform.h"13#include "dqueue.h"1415int16diva_data_q_init(diva_um_idi_data_queue_t * q,17int max_length, int max_segments)18{19int i;2021q->max_length = max_length;22q->segments = max_segments;2324for (i = 0; i < q->segments; i++) {25q->data[i] = NULL;26q->length[i] = 0;27}28q->read = q->write = q->count = q->segment_pending = 0;2930for (i = 0; i < q->segments; i++) {31if (!(q->data[i] = diva_os_malloc(0, q->max_length))) {32diva_data_q_finit(q);33return (-1);34}35}3637return (0);38}3940int diva_data_q_finit(diva_um_idi_data_queue_t * q)41{42int i;4344for (i = 0; i < q->segments; i++) {45if (q->data[i]) {46diva_os_free(0, q->data[i]);47}48q->data[i] = NULL;49q->length[i] = 0;50}51q->read = q->write = q->count = q->segment_pending = 0;5253return (0);54}5556int diva_data_q_get_max_length(const diva_um_idi_data_queue_t * q)57{58return (q->max_length);59}6061void *diva_data_q_get_segment4write(diva_um_idi_data_queue_t * q)62{63if ((!q->segment_pending) && (q->count < q->segments)) {64q->segment_pending = 1;65return (q->data[q->write]);66}6768return NULL;69}7071void72diva_data_q_ack_segment4write(diva_um_idi_data_queue_t * q, int length)73{74if (q->segment_pending) {75q->length[q->write] = length;76q->count++;77q->write++;78if (q->write >= q->segments) {79q->write = 0;80}81q->segment_pending = 0;82}83}8485const void *diva_data_q_get_segment4read(const diva_um_idi_data_queue_t *86q)87{88if (q->count) {89return (q->data[q->read]);90}91return NULL;92}9394int diva_data_q_get_segment_length(const diva_um_idi_data_queue_t * q)95{96return (q->length[q->read]);97}9899void diva_data_q_ack_segment4read(diva_um_idi_data_queue_t * q)100{101if (q->count) {102q->length[q->read] = 0;103q->count--;104q->read++;105if (q->read >= q->segments) {106q->read = 0;107}108}109}110111112