import of upstream 2.4.34.4 from kernel.org
[linux-2.4.git] / drivers / isdn / eicon / log.c
1 /*
2  * Source file for diva log facility
3  *
4  * Copyright (C) Eicon Technology Corporation, 2000.
5  *
6  * Eicon File Revision :    1.5  
7  *
8  * This software may be used and distributed according to the terms
9  * of the GNU General Public License, incorporated herein by reference.
10  *
11  */
12
13 #include "sys.h"
14 #include "idi.h"
15 #include "divas.h"
16 #include "adapter.h"
17 #include "divalog.h"
18
19 #include "uxio.h"
20
21 /*Counter to monitor number of messages */ 
22 static int m_count;
23  
24 #define     MAX_BUFFERED_MSGS   (1000)
25
26 /* Our Linked List Structure to hold message */
27 typedef struct klog_link{
28   klog_t klog;
29   struct klog_link *next;
30 }KNODE;
31
32 /* First & Last structures in list*/
33 KNODE *head;
34 KNODE *tail;
35
36 /* 
37  * retrieve message from FIFO buffer
38  * returns NULL if buffer empty
39  * otherwise returns pointer to entry 
40  */
41
42 char    *DivasLogFifoRead(void)
43
44 {
45         KNODE *old_head;
46
47         if(head==NULL) 
48         {
49                 /* Buffer Empty - No Messages */
50                 return NULL;    
51         }
52
53         m_count--;
54         /* Keep track of message to be read & increment to next message*/
55         old_head = head;
56         head = head->next;
57     /*Return ptr to Msg */      
58     return((char *)old_head);
59 }
60
61 /* 
62  * write message into FIFO buffer
63  */
64
65 void    DivasLogFifoWrite(char *entry, int length)
66
67 {
68     KNODE *new_klog;
69
70     if(head == NULL) 
71     {
72         /* No Entries in Log */
73         tail=NULL;
74         m_count=0;
75         new_klog=UxAlloc(sizeof(KNODE));
76
77         if(new_klog==NULL)
78         {
79                 return;
80         }
81
82         m_count++;
83         memset(new_klog, 0, sizeof(KNODE));
84
85         /* Set head & tail to point to the new Msg Struct */
86         head=tail=new_klog;
87         tail->next=NULL;
88     }
89     else
90     {
91         new_klog=UxAlloc(sizeof(KNODE));
92         
93         if(new_klog==NULL)
94         {
95                 return;
96         }
97
98         m_count++;
99         memset(new_klog, 0, sizeof(KNODE));
100
101         /* Let last Msg Struct point to new Msg Struct & inc tail */
102         tail->next=new_klog;
103         tail=new_klog;
104         tail->next=NULL;
105     }
106
107     if (length > sizeof(klog_t))
108     {
109         length = sizeof(klog_t);
110     }
111
112     memcpy(&tail->klog, entry, length);
113
114     return;
115 }
116
117 /*
118  * DivaslogFifoEmpty:return TRUE if FIFO buffer is empty,otherwise FALSE
119  */
120 int DivasLogFifoEmpty(void)
121 {
122         return (m_count == 0);
123 }
124
125 /*
126  *DivasLogFifoFull:return TRUE if FIFO buffer is full,otherwise FALSE
127  */
128 int DivasLogFifoFull(void)
129 {
130         return (m_count == MAX_BUFFERED_MSGS);
131 }
132
133 /*
134  * generate an IDI log entry
135  */
136
137 void    DivasLogIdi(card_t *card, ENTITY *e, int request)
138
139 {
140         klog_t          klog;
141
142         memset(&klog, 0, sizeof(klog));
143
144         klog.time_stamp = UxTimeGet();
145
146         klog.length = sizeof(ENTITY) > sizeof(klog.buffer) ?
147                                                 sizeof(klog.buffer) : sizeof(ENTITY);
148
149         klog.card = (int) (card - DivasCards);
150
151         klog.type = request ? KLOG_IDI_REQ : KLOG_IDI_CALLBACK;
152         klog.code = 0;
153         memcpy(klog.buffer, e, klog.length);
154
155     /* send to the log driver and return */
156
157     DivasLogAdd(&klog, sizeof(klog));
158
159         return;
160 }