remove /dev/mISDN ringbuffers; use queues instead

This commit is contained in:
Karsten Keil 2004-06-30 15:13:20 +00:00
parent 918caa4018
commit 62c911e0cd
5 changed files with 600 additions and 740 deletions

View File

@ -104,30 +104,30 @@ mISDNd(void *data)
test_and_set_bit(mISDN_TFLAGS_ACTIV, &hkt->Flags);
err = -EINVAL;
hhe=mISDN_HEADEXT_P(skb);
switch (hhe->what) {
switch (hhe->addr) {
case MGR_FUNCTION:
err=hhe->func.ctrl(hhe->data[0], hhe->prim, skb->data);
if (err) {
printk(KERN_WARNING "mISDNd: what(%x) prim(%x) failed err(%x)\n",
hhe->what, hhe->prim, err);
printk(KERN_WARNING "mISDNd: addr(%x) prim(%x) failed err(%x)\n",
hhe->addr, hhe->prim, err);
} else {
if (debug)
printk(KERN_DEBUG "mISDNd: what(%x) prim(%x) success\n",
hhe->what, hhe->prim);
printk(KERN_DEBUG "mISDNd: addr(%x) prim(%x) success\n",
hhe->addr, hhe->prim);
err--; /* to free skb */
}
break;
case MGR_QUEUEIF:
err = hhe->func.iff(hhe->data[0], skb);
if (err) {
printk(KERN_WARNING "mISDNd: what(%x) prim(%x) failed err(%x)\n",
hhe->what, hhe->prim, err);
printk(KERN_WARNING "mISDNd: addr(%x) prim(%x) failed err(%x)\n",
hhe->addr, hhe->prim, err);
}
break;
default:
int_error();
printk(KERN_WARNING "mISDNd: what(%x) prim(%x) unknown\n",
hhe->what, hhe->prim);
printk(KERN_WARNING "mISDNd: addr(%x) prim(%x) unknown\n",
hhe->addr, hhe->prim);
err = -EINVAL;
break;
}
@ -407,7 +407,7 @@ mgr_queue(void *data, u_int prim, struct sk_buff *skb)
{
mISDN_headext_t *hhe = mISDN_HEADEXT_P(skb);
hhe->what = prim;
hhe->addr = prim;
skb_queue_tail(&mISDN_thread.workq, skb);
wake_up_interruptible(&mISDN_thread.waitq);
return(0);
@ -426,7 +426,7 @@ set_stack_req(mISDNstack_t *st, mISDN_pid_t *pid)
skb = alloc_skb(sizeof(mISDN_pid_t) + pid->maxplen, GFP_ATOMIC);
hhe = mISDN_HEADEXT_P(skb);
hhe->prim = MGR_SETSTACK_NW | REQUEST;
hhe->what = MGR_FUNCTION;
hhe->addr = MGR_FUNCTION;
hhe->data[0] = st;
npid = (mISDN_pid_t *)skb_put(skb, sizeof(mISDN_pid_t));
if (pid->pbuf)

View File

@ -17,8 +17,6 @@
#define mISDN_MINOR_RAW_MIN 128
#define mISDN_MINOR_RAW_MAX 255
#define mISDN_DEVBUF_SIZE 8192
/* debugging */
#define DEBUG_CORE_FUNC 0x0001
#define DEBUG_DUMMY_FUNC 0x0002
@ -40,7 +38,7 @@ extern int free_device(mISDNdevice_t *dev);
extern struct list_head mISDN_stacklist;
extern struct list_head mISDN_instlist;
extern void get_stack_info(iframe_t *);
extern void get_stack_info(struct sk_buff *);
extern int get_stack_cnt(void);
extern mISDNstack_t *get_stack4id(u_int);
extern mISDNstack_t *new_stack(mISDNstack_t *, mISDNinstance_t *);

View File

@ -12,7 +12,8 @@ LIST_HEAD(mISDN_stacklist);
LIST_HEAD(mISDN_instlist);
int
get_stack_cnt(void) {
get_stack_cnt(void)
{
int cnt = 0;
mISDNstack_t *st;
@ -22,16 +23,19 @@ get_stack_cnt(void) {
}
void
get_stack_info(iframe_t *frm) {
mISDNstack_t *cst, *st;
stack_info_t *si;
mISDNlayer_t *lay;
get_stack_info(struct sk_buff *skb)
{
mISDN_head_t *hp;
mISDNstack_t *cst, *st;
stack_info_t *si;
mISDNlayer_t *lay;
st = get_stack4id(frm->addr);
hp = mISDN_HEAD_P(skb);
st = get_stack4id(hp->addr);
if (!st)
frm->len = 0;
hp->len = 0;
else {
si = (stack_info_t *)frm->data.p;
si = (stack_info_t *)skb->data;
memset(si, 0, sizeof(stack_info_t));
si->id = st->id;
si->extentions = st->extentions;
@ -53,10 +57,11 @@ get_stack_info(iframe_t *frm) {
si->child[si->childcnt] = cst->id;
si->childcnt++;
}
frm->len = sizeof(stack_info_t);
hp->len = sizeof(stack_info_t);
if (si->childcnt>2)
frm->len += (si->childcnt-2)*sizeof(int);
hp->len += (si->childcnt-2)*sizeof(int);
}
skb_put(skb, hp->len);
}
static int

File diff suppressed because it is too large Load Diff

View File

@ -18,6 +18,23 @@
* <8 bit subcommand>
*
*/
/*
* ABI Version 32 bit
*
* <16 bit> Major version
* - changed if any interface become backwards incompatible
*
* <16 bit> Minor version
* - changed if any interface is extended but backwards compatible
*
*/
#define MISDN_MAJOR_VERSION 1
#define MISDN_MINOR_VERSION 0
#define MISDN_VERSION ((MISDN_MAJOR_VERSION<<16) | MISDN_MINOR_VERSION)
#define MISDN_REVISION "$Revision$"
#define MISDN_DATE "$Date$"
/* SUBCOMMANDS */
#define REQUEST 0x80
@ -74,6 +91,7 @@
#define MGR_LOADFIRM 0x0ff000
#define MGR_LOGDATA 0x0ff100
#define MGR_DEBUGDATA 0x0ff200
#define MGR_VERSION 0x0fff00
/* layer 1 <-> hardware */
#define PH_SIGNAL 0x000100
@ -460,22 +478,12 @@
#define MAX_DATA_MEM 2080
#define MAX_HEADER_LEN 4
#define IFRAME_HEAD_SIZE 16
#define DEFAULT_PORT_QUEUELEN 256
#define PORT_SKB_RESERVE L3_EXTRA_SIZE
#define PORT_SKB_MINIMUM 128
/* structure for information exchange between layer/entity boundaries */
typedef struct _iframe {
u_int addr;
u_int prim;
int dinfo;
int len;
union {
u_char b[4];
void *p;
int i;
} data;
} iframe_t;
#define STATUS_INFO_L1 1
#define STATUS_INFO_L2 2
@ -520,7 +528,7 @@ typedef struct _stack_info {
int instcnt;
int inst[MAX_LAYER_NR +1];
int childcnt;
u_int child[30];
u_int child[2]; /* this is correct handled for PRI see get_stack_info() */
} stack_info_t;
typedef struct _layer_info {
@ -612,8 +620,10 @@ typedef int (lock_func_t)(void *, int);
typedef void (unlock_func_t)(void *);
typedef struct _mISDN_head {
u_int addr;
u_int prim;
int dinfo;
int len;
} mISDN_head_t;
#define mISDN_HEAD_P(s) ((mISDN_head_t *)&s->cb[0])
@ -621,10 +631,10 @@ typedef struct _mISDN_head {
#define mISDN_HEAD_DINFO(s) ((mISDN_head_t *)&s->cb[0])->dinfo
typedef struct _mISDN_headext {
u_int addr;
u_int prim;
int dinfo;
u_int what;
void *data[4];
void *data[3];
union {
ctrl_func_t *ctrl;
if_func_t *iff;
@ -634,6 +644,15 @@ typedef struct _mISDN_headext {
#define mISDN_HEADEXT_P(s) ((mISDN_headext_t *)&s->cb[0])
typedef struct _mISDN_headifrm {
u_int prim;
int dinfo;
int len;
u_int addr;
} mISDN_headifrm_t;
#define mISDN_HEADEXT_P(s) ((mISDN_headext_t *)&s->cb[0])
/* Basic struct of a mISDN component */
struct _mISDNobject {
struct list_head list;
@ -704,11 +723,8 @@ struct _mISDNport {
spinlock_t lock;
mISDNif_t pif;
u_long Flag;
int size;
int cnt;
u_char *buf;
u_char *ip;
u_char *op;
struct sk_buff_head queue;
u_int maxqlen;
};
/* the user interface to handle /dev/mISDN */