mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-15 06:46:49 +07:00
a9a08845e9
This is the mindless scripted replacement of kernel use of POLL* variables as described by Al, done by this script: for V in IN OUT PRI ERR RDNORM RDBAND WRNORM WRBAND HUP RDHUP NVAL MSG; do L=`git grep -l -w POLL$V | grep -v '^t' | grep -v /um/ | grep -v '^sa' | grep -v '/poll.h$'|grep -v '^D'` for f in $L; do sed -i "-es/^\([^\"]*\)\(\<POLL$V\>\)/\\1E\\2/" $f; done done with de-mangling cleanups yet to come. NOTE! On almost all architectures, the EPOLL* constants have the same values as the POLL* constants do. But they keyword here is "almost". For various bad reasons they aren't the same, and epoll() doesn't actually work quite correctly in some cases due to this on Sparc et al. The next patch from Al will sort out the final differences, and we should be all done. Scripted-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
413 lines
10 KiB
C
413 lines
10 KiB
C
/* $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));
|
|
}
|
|
}
|