/* $Id: divasproc.c,v 1.19.4.3 2005/01/31 12:22:20 armin Exp $
 *
 * Low level driver for Eicon DIVA Server ISDN cards.
 * /proc functions
 *
 * Copyright 2000-2003 by Armin Schindler (mac@melware.de)
 * Copyright 2000-2003 Cytronics & Melware (info@melware.de)
 *
 * This software may be used and distributed according to the terms
 * of the GNU General Public License, incorporated herein by reference.
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/poll.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/list.h>
#include <linux/uaccess.h>

#include "platform.h"
#include "debuglib.h"
#undef ID_MASK
#undef N_DATA
#include "pc.h"
#include "di_defs.h"
#include "divasync.h"
#include "di.h"
#include "io.h"
#include "xdi_msg.h"
#include "xdi_adapter.h"
#include "diva.h"
#include "diva_pci.h"


extern PISDN_ADAPTER IoAdapters[MAX_ADAPTER];
extern void divas_get_version(char *);
extern void diva_get_vserial_number(PISDN_ADAPTER IoAdapter, char *buf);

/*********************************************************
 ** Functions for /proc interface / File operations
 *********************************************************/

static char *divas_proc_name = "divas";
static char *adapter_dir_name = "adapter";
static char *info_proc_name = "info";
static char *grp_opt_proc_name = "group_optimization";
static char *d_l1_down_proc_name = "dynamic_l1_down";

/*
** "divas" entry
*/

extern struct proc_dir_entry *proc_net_eicon;
static struct proc_dir_entry *divas_proc_entry = NULL;

static ssize_t
divas_read(struct file *file, char __user *buf, size_t count, loff_t *off)
{
	int len = 0;
	int cadapter;
	char tmpbuf[80];
	char tmpser[16];

	if (*off)
		return 0;

	divas_get_version(tmpbuf);
	if (copy_to_user(buf + len, &tmpbuf, strlen(tmpbuf)))
		return -EFAULT;
	len += strlen(tmpbuf);

	for (cadapter = 0; cadapter < MAX_ADAPTER; cadapter++) {
		if (IoAdapters[cadapter]) {
			diva_get_vserial_number(IoAdapters[cadapter],
						tmpser);
			sprintf(tmpbuf,
				"%2d: %-30s Serial:%-10s IRQ:%2d\n",
				cadapter + 1,
				IoAdapters[cadapter]->Properties.Name,
				tmpser,
				IoAdapters[cadapter]->irq_info.irq_nr);
			if ((strlen(tmpbuf) + len) > count)
				break;
			if (copy_to_user
			    (buf + len, &tmpbuf,
			     strlen(tmpbuf))) return -EFAULT;
			len += strlen(tmpbuf);
		}
	}

	*off += len;
	return (len);
}

static ssize_t
divas_write(struct file *file, const char __user *buf, size_t count, loff_t *off)
{
	return (-ENODEV);
}

static __poll_t divas_poll(struct file *file, poll_table *wait)
{
	return (EPOLLERR);
}

static int divas_open(struct inode *inode, struct file *file)
{
	return nonseekable_open(inode, file);
}

static int divas_close(struct inode *inode, struct file *file)
{
	return (0);
}

static const struct file_operations divas_fops = {
	.owner   = THIS_MODULE,
	.llseek  = no_llseek,
	.read    = divas_read,
	.write   = divas_write,
	.poll    = divas_poll,
	.open    = divas_open,
	.release = divas_close
};

int create_divas_proc(void)
{
	divas_proc_entry = proc_create(divas_proc_name, S_IFREG | S_IRUGO,
				       proc_net_eicon, &divas_fops);
	if (!divas_proc_entry)
		return (0);

	return (1);
}

void remove_divas_proc(void)
{
	if (divas_proc_entry) {
		remove_proc_entry(divas_proc_name, proc_net_eicon);
		divas_proc_entry = NULL;
	}
}

static ssize_t grp_opt_proc_write(struct file *file, const char __user *buffer,
				  size_t count, loff_t *pos)
{
	diva_os_xdi_adapter_t *a = PDE_DATA(file_inode(file));
	PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];

	if ((count == 1) || (count == 2)) {
		char c;
		if (get_user(c, buffer))
			return -EFAULT;
		switch (c) {
		case '0':
			IoAdapter->capi_cfg.cfg_1 &=
				~DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON;
			break;
		case '1':
			IoAdapter->capi_cfg.cfg_1 |=
				DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON;
			break;
		default:
			return (-EINVAL);
		}
		return (count);
	}
	return (-EINVAL);
}

static ssize_t d_l1_down_proc_write(struct file *file, const char __user *buffer,
				    size_t count, loff_t *pos)
{
	diva_os_xdi_adapter_t *a = PDE_DATA(file_inode(file));
	PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];

	if ((count == 1) || (count == 2)) {
		char c;
		if (get_user(c, buffer))
			return -EFAULT;
		switch (c) {
		case '0':
			IoAdapter->capi_cfg.cfg_1 &=
				~DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON;
			break;
		case '1':
			IoAdapter->capi_cfg.cfg_1 |=
				DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON;
			break;
		default:
			return (-EINVAL);
		}
		return (count);
	}
	return (-EINVAL);
}

static int d_l1_down_proc_show(struct seq_file *m, void *v)
{
	diva_os_xdi_adapter_t *a = m->private;
	PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];

	seq_printf(m, "%s\n",
		   (IoAdapter->capi_cfg.
		    cfg_1 & DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON) ? "1" :
		   "0");
	return 0;
}

static int d_l1_down_proc_open(struct inode *inode, struct file *file)
{
	return single_open(file, d_l1_down_proc_show, PDE_DATA(inode));
}

static const struct file_operations d_l1_down_proc_fops = {
	.owner		= THIS_MODULE,
	.open		= d_l1_down_proc_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
	.write		= d_l1_down_proc_write,
};

static int grp_opt_proc_show(struct seq_file *m, void *v)
{
	diva_os_xdi_adapter_t *a = m->private;
	PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];

	seq_printf(m, "%s\n",
		   (IoAdapter->capi_cfg.
		    cfg_1 & DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON)
		   ? "1" : "0");
	return 0;
}

static int grp_opt_proc_open(struct inode *inode, struct file *file)
{
	return single_open(file, grp_opt_proc_show, PDE_DATA(inode));
}

static const struct file_operations grp_opt_proc_fops = {
	.owner		= THIS_MODULE,
	.open		= grp_opt_proc_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
	.write		= grp_opt_proc_write,
};

static ssize_t info_proc_write(struct file *file, const char __user *buffer,
			       size_t count, loff_t *pos)
{
	diva_os_xdi_adapter_t *a = PDE_DATA(file_inode(file));
	PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];
	char c[4];

	if (count <= 4)
		return -EINVAL;

	if (copy_from_user(c, buffer, 4))
		return -EFAULT;

	/* this is for test purposes only */
	if (!memcmp(c, "trap", 4)) {
		(*(IoAdapter->os_trap_nfy_Fnc)) (IoAdapter, IoAdapter->ANum);
		return (count);
	}
	return (-EINVAL);
}

static int info_proc_show(struct seq_file *m, void *v)
{
	int i = 0;
	char *p;
	char tmpser[16];
	diva_os_xdi_adapter_t *a = m->private;
	PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];

	seq_printf(m, "Name        : %s\n", IoAdapter->Properties.Name);
	seq_printf(m, "DSP state   : %08x\n", a->dsp_mask);
	seq_printf(m, "Channels    : %02d\n", IoAdapter->Properties.Channels);
	seq_printf(m, "E. max/used : %03d/%03d\n",
		   IoAdapter->e_max, IoAdapter->e_count);
	diva_get_vserial_number(IoAdapter, tmpser);
	seq_printf(m, "Serial      : %s\n", tmpser);
	seq_printf(m, "IRQ         : %d\n", IoAdapter->irq_info.irq_nr);
	seq_printf(m, "CardIndex   : %d\n", a->CardIndex);
	seq_printf(m, "CardOrdinal : %d\n", a->CardOrdinal);
	seq_printf(m, "Controller  : %d\n", a->controller);
	seq_printf(m, "Bus-Type    : %s\n",
		   (a->Bus ==
		    DIVAS_XDI_ADAPTER_BUS_ISA) ? "ISA" : "PCI");
	seq_printf(m, "Port-Name   : %s\n", a->port_name);
	if (a->Bus == DIVAS_XDI_ADAPTER_BUS_PCI) {
		seq_printf(m, "PCI-bus     : %d\n", a->resources.pci.bus);
		seq_printf(m, "PCI-func    : %d\n", a->resources.pci.func);
		for (i = 0; i < 8; i++) {
			if (a->resources.pci.bar[i]) {
				seq_printf(m,
					   "Mem / I/O %d : 0x%x / mapped : 0x%lx",
					   i, a->resources.pci.bar[i],
					   (unsigned long) a->resources.
					   pci.addr[i]);
				if (a->resources.pci.length[i]) {
					seq_printf(m,
						   " / length : %d",
						   a->resources.pci.
						   length[i]);
				}
				seq_putc(m, '\n');
			}
		}
	}
	if ((!a->xdi_adapter.port) &&
	    ((!a->xdi_adapter.ram) ||
	     (!a->xdi_adapter.reset)
	     || (!a->xdi_adapter.cfg))) {
		if (!IoAdapter->irq_info.irq_nr) {
			p = "slave";
		} else {
			p = "out of service";
		}
	} else if (a->xdi_adapter.trapped) {
		p = "trapped";
	} else if (a->xdi_adapter.Initialized) {
		p = "active";
	} else {
		p = "ready";
	}
	seq_printf(m, "State       : %s\n", p);

	return 0;
}

static int info_proc_open(struct inode *inode, struct file *file)
{
	return single_open(file, info_proc_show, PDE_DATA(inode));
}

static const struct file_operations info_proc_fops = {
	.owner		= THIS_MODULE,
	.open		= info_proc_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
	.write		= info_proc_write,
};

/*
** adapter proc init/de-init
*/

/* --------------------------------------------------------------------------
   Create adapter directory and files in proc file system
   -------------------------------------------------------------------------- */
int create_adapter_proc(diva_os_xdi_adapter_t *a)
{
	struct proc_dir_entry *de, *pe;
	char tmp[16];

	sprintf(tmp, "%s%d", adapter_dir_name, a->controller);
	if (!(de = proc_mkdir(tmp, proc_net_eicon)))
		return (0);
	a->proc_adapter_dir = (void *) de;

	pe = proc_create_data(info_proc_name, S_IRUGO | S_IWUSR, de,
			      &info_proc_fops, a);
	if (!pe)
		return (0);
	a->proc_info = (void *) pe;

	pe = proc_create_data(grp_opt_proc_name, S_IRUGO | S_IWUSR, de,
			      &grp_opt_proc_fops, a);
	if (pe)
		a->proc_grp_opt = (void *) pe;
	pe = proc_create_data(d_l1_down_proc_name, S_IRUGO | S_IWUSR, de,
			      &d_l1_down_proc_fops, a);
	if (pe)
		a->proc_d_l1_down = (void *) pe;

	DBG_TRC(("proc entry %s created", tmp));

	return (1);
}

/* --------------------------------------------------------------------------
   Remove adapter directory and files in proc file system
   -------------------------------------------------------------------------- */
void remove_adapter_proc(diva_os_xdi_adapter_t *a)
{
	char tmp[16];

	if (a->proc_adapter_dir) {
		if (a->proc_d_l1_down) {
			remove_proc_entry(d_l1_down_proc_name,
					  (struct proc_dir_entry *) a->proc_adapter_dir);
		}
		if (a->proc_grp_opt) {
			remove_proc_entry(grp_opt_proc_name,
					  (struct proc_dir_entry *) a->proc_adapter_dir);
		}
		if (a->proc_info) {
			remove_proc_entry(info_proc_name,
					  (struct proc_dir_entry *) a->proc_adapter_dir);
		}
		sprintf(tmp, "%s%d", adapter_dir_name, a->controller);
		remove_proc_entry(tmp, proc_net_eicon);
		DBG_TRC(("proc entry %s%d removed", adapter_dir_name,
			 a->controller));
	}
}
