v2.4.8 -> v2.4.8.1
[opensuse:kernel.git] / drivers / isdn / eicon / log.c
1    
2 /*
3  *
4  * Copyright (C) Eicon Technology Corporation, 2000.
5  *
6  * Eicon File Revision :    1.5  
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2, or (at your option)
11  * any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY 
15  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
16  * See the GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  *
22  */
23
24
25 /*
26  * Source file for diva log facility
27  */
28
29 #include "sys.h"
30 #include "idi.h"
31 #include "divas.h"
32 #include "adapter.h"
33 #include "divalog.h"
34
35 #include "uxio.h"
36
37 /*Counter to monitor number of messages */ 
38 static int m_count;
39  
40 #define     MAX_BUFFERED_MSGS   (1000)
41
42 /* Our Linked List Structure to hold message */
43 typedef struct klog_link{
44   klog_t klog;
45   struct klog_link *next;
46 }KNODE;
47
48 /* First & Last structures in list*/
49 KNODE *head;
50 KNODE *tail;
51
52 /* 
53  * retrieve message from FIFO buffer
54  * returns NULL if buffer empty
55  * otherwise returns pointer to entry 
56  */
57
58 char    *DivasLogFifoRead(void)
59
60 {
61         KNODE *old_head;
62
63         if(head==NULL) 
64         {
65                 /* Buffer Empty - No Messages */
66                 return NULL;    
67         }
68
69         m_count--;
70         /* Keep track of message to be read & increment to next message*/
71         old_head = head;
72         head = head->next;
73     /*Return ptr to Msg */      
74     return((char *)old_head);
75 }
76
77 /* 
78  * write message into FIFO buffer
79  */
80
81 void    DivasLogFifoWrite(char *entry, int length)
82
83 {
84     KNODE *new_klog;
85
86     if(head == NULL) 
87     {
88         /* No Entries in Log */
89         tail=NULL;
90         m_count=0;
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         /* Set head & tail to point to the new Msg Struct */
102         head=tail=new_klog;
103         tail->next=NULL;
104     }
105     else
106     {
107         new_klog=UxAlloc(sizeof(KNODE));
108         
109         if(new_klog==NULL)
110         {
111                 return;
112         }
113
114         m_count++;
115         memset(new_klog, 0, sizeof(KNODE));
116
117         /* Let last Msg Struct point to new Msg Struct & inc tail */
118         tail->next=new_klog;
119         tail=new_klog;
120         tail->next=NULL;
121     }
122
123     if (length > sizeof(klog_t))
124     {
125         length = sizeof(klog_t);
126     }
127
128     memcpy(&tail->klog, entry, length);
129
130     return;
131 }
132
133 /*
134  * DivaslogFifoEmpty:return TRUE if FIFO buffer is empty,otherwise FALSE
135  */
136 int DivasLogFifoEmpty(void)
137 {
138         return (m_count == 0);
139 }
140
141 /*
142  *DivasLogFifoFull:return TRUE if FIFO buffer is full,otherwise FALSE
143  */
144 int DivasLogFifoFull(void)
145 {
146         return (m_count == MAX_BUFFERED_MSGS);
147 }
148
149 /*
150  * generate an IDI log entry
151  */
152
153 void    DivasLogIdi(card_t *card, ENTITY *e, int request)
154
155 {
156         klog_t          klog;
157
158         memset(&klog, 0, sizeof(klog));
159
160         klog.time_stamp = UxTimeGet();
161
162         klog.length = sizeof(ENTITY) > sizeof(klog.buffer) ?
163                                                 sizeof(klog.buffer) : sizeof(ENTITY);
164
165         klog.card = (int) (card - DivasCards);
166
167         klog.type = request ? KLOG_IDI_REQ : KLOG_IDI_CALLBACK;
168         klog.code = 0;
169         memcpy(klog.buffer, e, klog.length);
170
171     /* send to the log driver and return */
172
173     DivasLogAdd(&klog, sizeof(klog));
174
175         return;
176 }