patch-2.2.19 linux/drivers/isdn/eicon/xlog.c
Next file: linux/drivers/isdn/hisax/Makefile
Previous file: linux/drivers/isdn/eicon/uxio.h
Back to the patch index
Back to the overall index
- Lines: 181
- Date:
Sun Mar 25 11:37:32 2001
- Orig file:
v2.2.18/drivers/isdn/eicon/xlog.c
- Orig date:
Wed Dec 31 19:00:00 1969
diff -u --new-file --recursive --exclude-from /usr/src/exclude v2.2.18/drivers/isdn/eicon/xlog.c linux/drivers/isdn/eicon/xlog.c
@@ -0,0 +1,180 @@
+
+/*
+ *
+ * Copyright (C) Eicon Technology Corporation, 2000.
+ *
+ * Eicon File Revision : 1.2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+
+/*
+ * Unix Eicon active card driver
+ * XLOG related functions
+ */
+
+#include "sys.h"
+#include "idi.h"
+#include "pc.h"
+#include "pc_maint.h"
+#include "divalog.h"
+
+#include "adapter.h"
+#include "uxio.h"
+
+/*
+ * convert/copy XLOG info into a KLOG entry
+ */
+
+static
+void xlog_to_klog(byte *b, int size, int card_num)
+
+{
+ typedef struct
+ {
+ word code;
+ word time_hi;
+ word time_lo;
+ word xcode;
+ byte data[2];
+ } card_xlog_t;
+
+ card_xlog_t *x;
+
+ klog_t klog;
+
+ x = (card_xlog_t *) b;
+
+ bzero(&klog, sizeof(klog));
+
+ klog.time_stamp = (dword) x->time_hi;
+ klog.time_stamp = (klog.time_stamp << 16) | (dword) x->time_lo;
+
+ klog.length = size > sizeof(klog.buffer) ? sizeof(klog.buffer) : size;
+
+ klog.card = card_num;
+ if (x->code == 1)
+ {
+ klog.type = KLOG_XTXT_MSG;
+ klog.code = 0;
+ bcopy(&x->xcode, klog.buffer, klog.length);
+ }
+ else if (x->code == 2)
+ {
+ klog.type = KLOG_XLOG_MSG;
+ klog.code = x->xcode;
+ bcopy(&x->data, klog.buffer, klog.length);
+ }
+ else
+ {
+ char *c; int i;
+ klog.type = KLOG_TEXT_MSG;
+ klog.code = 0;
+ c = "divas: invalid xlog message code from card";
+ i = 0;
+ while (*c)
+ {
+ klog.buffer[i] = *c;
+ c++;
+ i++;
+ }
+ klog.buffer[i] = *c;
+ }
+
+ /* send to the log driver and return */
+
+ DivasLogAdd(&klog, sizeof(klog));
+
+ return;
+}
+
+/*
+ * send an XLOG request down to specified card
+ * if response available from previous request then read it
+ * if not then just send down new request, ready for next time
+ */
+
+void DivasXlogReq(int card_num)
+
+{
+ card_t *card;
+ ADAPTER *a;
+
+ if ((card_num < 0) || (card_num > DivasCardNext))
+ {
+ DPRINTF(("xlog: invalid card number"));
+ return;
+ }
+
+ card = &DivasCards[card_num];
+
+ if (DivasXlogRetrieve(card))
+ {
+ return;
+ }
+
+ /* send down request for next time */
+
+ a = &card->a;
+
+ a->ram_out(a, (word *) (card->xlog_offset + 1), 0);
+ a->ram_out(a, (word *) (dword) (card->xlog_offset), DO_LOG);
+
+ return;
+}
+
+/*
+ * retrieve XLOG request from specified card
+ * returns non-zero if new request sent to card
+ */
+
+int DivasXlogRetrieve(card_t *card)
+
+{
+ ADAPTER *a;
+ struct mi_pc_maint pcm;
+
+ a = &card->a;
+
+ /* get status of last request */
+
+ pcm.rc = a->ram_in(a, (word *)(card->xlog_offset + 1));
+
+ /* if nothing there from previous request, send down a new one */
+
+ if (pcm.rc == OK)
+ {
+ /* read in response */
+
+ a->ram_in_buffer(a, (word *) (dword) card->xlog_offset, &pcm, sizeof(pcm));
+
+ xlog_to_klog((byte *) &pcm.data, sizeof(pcm.data),
+ (int) (card - DivasCards));
+ }
+
+ /* if any response received from card, re-send request */
+
+ if (pcm.rc)
+ {
+ a->ram_out(a, (word *) (card->xlog_offset + 1), 0);
+ a->ram_out(a, (word *) (dword) (card->xlog_offset), DO_LOG);
+
+ return 1;
+ }
+
+ return 0;
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)