2.1.21-patch_drivers_isdn-1

Keith Owens (kaos@ocs.com.au)
Wed, 15 Jan 1997 18:24:58 +1100


Based on some patches against 2.1.16 by Michael Galbraith, reworked for
2.1.21. No idea if the driver works, no hardware to test with but at
least it compiles!

diff -ur linux-2.1.21.orig/include/linux/isdn.h linux/include/linux/isdn.h
--- linux-2.1.21.orig/include/linux/isdn.h Sun Sep 1 02:01:49 1996
+++ linux/include/linux/isdn.h Wed Jan 15 14:24:08 1997
@@ -378,8 +378,8 @@
struct sk_buff *first_skb; /* Ptr to skb that triggers dialing */
struct sk_buff *sav_skb; /* Ptr to skb, rejected by LL-driver*/
/* Ptr to orig. header_cache_bind */
- void (*org_hcb)(struct hh_cache **, struct device *,
- unsigned short, __u32);
+ int (*org_hcb)(struct dst_entry *dst, struct dst_entry *neigh,
+ struct hh_cache *hh);
/* Ptr to orig. header_cache_update */
void (*org_hcu)(struct hh_cache *, struct device *,
unsigned char *);
diff -ur linux-2.1.21.orig/drivers/isdn/isdn_audio.c linux/drivers/isdn/isdn_audio.c
--- linux-2.1.21.orig/drivers/isdn/isdn_audio.c Fri Jun 7 23:02:40 1996
+++ linux/drivers/isdn/isdn_audio.c Wed Jan 15 12:55:26 1997
@@ -503,7 +503,6 @@
return;
}
result = (int *)skb_put(skb, sizeof(int) * NCOEFF);
- skb->free = 1;
skb->users = 0;
for (k = 0; k < NCOEFF; k++) {
sk = sk1 = sk2 = 0;
diff -ur linux-2.1.21.orig/drivers/isdn/isdn_common.c linux/drivers/isdn/isdn_common.c
--- linux-2.1.21.orig/drivers/isdn/isdn_common.c Fri Dec 27 21:03:22 1996
+++ linux/drivers/isdn/isdn_common.c Wed Jan 15 14:13:30 1997
@@ -117,9 +117,9 @@
*
*/

-#include <asm/uaccess.h>
#include <linux/config.h>
#include <linux/module.h>
+#include <asm/uaccess.h>
#include <linux/version.h>
#ifndef __GENKSYMS__ /* Don't want genksyms report unneeded structs */
#include <linux/isdn.h>
@@ -179,7 +179,6 @@

static __inline void isdn_trash_skb(struct sk_buff *skb, int rw)
{
- skb->free = 1;
kfree_skb(skb, rw);
}

@@ -308,7 +307,6 @@
if (isdn_net_rcv_skb(i, skb))
return;
/* No network-device found, deliver to tty or raw-channel */
- skb->free = 1;
if (skb->len) {
if ((midx = dev->m_idx[i])<0) {
/* if midx is invalid, drop packet */
@@ -756,9 +754,6 @@
ret = 0;
if (!(skb = skb_peek(&dev->drv[di]->rpqueue[channel])))
break;
- if (skb->lock)
- break;
- skb->lock = 1;
if (skb->users) {
/* users is the count of DLE's in
* this buff when in voice mode.
@@ -823,7 +818,6 @@
*/
if (fp)
*(fp - 1) = 0xff;
- skb->lock = 0;
skb = skb_dequeue(&dev->drv[di]->rpqueue[channel]);
isdn_trash_skb(skb, FREE_READ);
} else {
@@ -832,7 +826,6 @@
* but we pull off the data we got until now.
*/
skb_pull(skb,count_pull);
- skb->lock = 0;
}
dev->drv[di]->rcvcount[channel] -= count_put;
}
@@ -1836,7 +1829,6 @@
return 0;

skb_reserve(skb, dev->drv[drvidx]->interface->hl_hdrlen);
- skb->free = 1;

if (user) {
if(copy_from_user(skb_put(skb, len), buf, len)) {
diff -ur linux-2.1.21.orig/drivers/isdn/isdn_net.c linux/drivers/isdn/isdn_net.c
--- linux-2.1.21.orig/drivers/isdn/isdn_net.c Wed Oct 30 23:26:48 1996
+++ linux/drivers/isdn/isdn_net.c Wed Jan 15 12:55:27 1997
@@ -119,8 +119,7 @@
#endif

/* In ksyms.c, but why not in some .h ??? */
-extern int arp_find(unsigned char *, u32, struct device *, u32,
- struct sk_buff *);
+extern int arp_find(unsigned char *haddr, struct sk_buff *skb);

/* Prototypes */

@@ -755,7 +754,6 @@
return 0;
}
if (ret < 0) {
- skb->free = 1;
dev_kfree_skb(skb, FREE_WRITE);
lp->stats.tx_errors++;
clear_bit(0, (void *)&(ndev->tbusy));
@@ -1249,14 +1247,14 @@
/* We don't need to send arp, because we have point-to-point connections. */

static int
-isdn_net_rebuild_header(void *buff, struct device *dev, unsigned long dst,
- struct sk_buff *skb)
+isdn_net_rebuild_header(struct sk_buff *skb)
{
- isdn_net_local *lp = dev->priv;
+ struct device *dev = skb->dev;
+ isdn_net_local *lp = skb->dev->priv;
int ret = 0;

if (lp->p_encap == ISDN_NET_ENCAP_ETHER) {
- struct ethhdr *eth = (struct ethhdr *)buff;
+ struct ethhdr *eth = (struct ethhdr *)skb->data;

/*
* Only ARP/IP is currently supported
@@ -1273,7 +1271,7 @@
* Try to get ARP to resolve the header.
*/
#ifdef CONFIG_INET
- ret = arp_find(eth->h_dest, dst, dev, dev->pa_addr, skb)? 1 : 0;
+ ret = arp_find(eth->h_dest, skb) ? 1 : 0;
#endif
}
return ret;
@@ -1299,13 +1297,13 @@
}

ether_setup(ndev);
- lp->org_hcb = ndev->header_cache_bind;
+ lp->org_hcb = ndev->hard_header_cache;
lp->org_hcu = ndev->header_cache_update;

/* Setup the generic properties */

ndev->hard_header = NULL;
- ndev->header_cache_bind = NULL;
+ ndev->hard_header_cache = NULL;
ndev->header_cache_update = NULL;
ndev->mtu = 1500;
ndev->flags = IFF_NOARP;
@@ -2080,17 +2078,17 @@
if (cfg->p_encap != p->local.p_encap) {
if (cfg->p_encap == ISDN_NET_ENCAP_RAWIP) {
p->dev.hard_header = NULL;
- p->dev.header_cache_bind = NULL;
+ p->dev.hard_header_cache = NULL;
p->dev.header_cache_update = NULL;
p->dev.flags = IFF_NOARP;
} else {
p->dev.hard_header = isdn_net_header;
if (cfg->p_encap == ISDN_NET_ENCAP_ETHER) {
- p->dev.header_cache_bind = p->local.org_hcb;
+ p->dev.hard_header_cache = p->local.org_hcb;
p->dev.header_cache_update = p->local.org_hcu;
p->dev.flags = IFF_BROADCAST | IFF_MULTICAST;
} else {
- p->dev.header_cache_bind = NULL;
+ p->dev.hard_header_cache = NULL;
p->dev.header_cache_update = NULL;
p->dev.flags = IFF_NOARP;
}
diff -ur linux-2.1.21.orig/drivers/isdn/isdn_ppp.c linux/drivers/isdn/isdn_ppp.c
--- linux-2.1.21.orig/drivers/isdn/isdn_ppp.c Wed Oct 30 23:26:48 1996
+++ linux/drivers/isdn/isdn_ppp.c Wed Jan 15 14:28:04 1997
@@ -649,7 +649,6 @@
printk(KERN_WARNING "isdn_ppp_write: out of memory!\n");
return count;
}
- skb->free = 1;
copy_from_user(skb_put(skb, count), buf, count);
if(isdn_writebuf_skb_stub(lp->isdn_device,lp->isdn_channel,skb) != count) {
if(lp->sav_skb) {
@@ -713,7 +712,7 @@
is = ippp_table[lp->ppp_slot];

if(is->debug & 0x4)
- printk(KERN_DEBUG "recv skb, len: %ld\n",skb->len);
+ printk(KERN_DEBUG "recv skb, len: %d\n",skb->len);

if(net_dev->local.master) {
printk(KERN_WARNING "isdn_ppp_receice: net_dev != master\n");
@@ -723,8 +722,7 @@
if(skb->data[0] == 0xff && skb->data[1] == 0x03)
skb_pull(skb,2);
else if (is->pppcfg & SC_REJ_COMP_AC) {
- skb->free = 1;
- dev_kfree_skb(skb,0 /* FREE_READ */ );
+ dev_kfree_skb(skb, FREE_WRITE );
return; /* discard it silently */
}

@@ -818,8 +816,7 @@
if (!q) {
net_dev->ib.modify = 0;
printk(KERN_WARNING "ippp/MPPP: Bad! Can't alloc sq node!\n");
- skb->free = 1;
- dev_kfree_skb(skb, 0 /* FREE_READ */ );
+ dev_kfree_skb(skb, FREE_WRITE );
return; /* discard */
}
q->skb = skb;
@@ -893,7 +890,7 @@
}

if(is->debug & 0x10)
- printk(KERN_DEBUG "push, skb %ld %04x\n",skb->len,proto);
+ printk(KERN_DEBUG "push, skb %d %04x\n",skb->len,proto);

switch (proto) {
case PPP_IPX: /* untested */
@@ -910,8 +907,7 @@
if(slhc_remember(ippp_table[net_dev->local.ppp_slot]->slcomp, skb->data, skb->len) <= 0) {
printk(KERN_WARNING "isdn_ppp: received illegal VJC_UNCOMP frame!\n");
net_dev->local.stats.rx_dropped++;
- skb->free = 1;
- dev_kfree_skb(skb,0 /* FREE_READ */ );
+ dev_kfree_skb(skb, FREE_WRITE );
return;
}
#endif
@@ -931,12 +927,10 @@
int pkt_len;
skb = dev_alloc_skb(skb_old->len + 40);

- skb_old->free = 1;
-
if (!skb) {
printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
net_dev->local.stats.rx_dropped++;
- dev_kfree_skb(skb_old,0 /* FREE_READ */ );
+ dev_kfree_skb(skb_old, FREE_WRITE );
return;
}
skb->dev = dev;
@@ -945,10 +939,9 @@
skb->mac.raw = skb->data;
pkt_len = slhc_uncompress(ippp_table[net_dev->local.ppp_slot]->slcomp,
skb->data, skb_old->len);
- dev_kfree_skb(skb_old,0 /* FREE_READ */ );
+ dev_kfree_skb(skb_old, FREE_WRITE );
if(pkt_len < 0) {
- skb->free = 1;
- dev_kfree_skb(skb, 0 /* FREE_READ */ );
+ dev_kfree_skb(skb, FREE_WRITE );
lp->stats.rx_dropped++;
return;
}
@@ -958,15 +951,13 @@
#else
printk(KERN_INFO "isdn: Ooopsa .. VJ-Compression support not compiled into isdn driver.\n");
lp->stats.rx_dropped++;
- skb->free = 1;
- dev_kfree_skb(skb,0 /* FREE_READ */ );
+ dev_kfree_skb(skb, FREE_WRITE );
return;
#endif
break;
default:
isdn_ppp_fill_rq(skb->data, skb->len,proto, lp->ppp_slot); /* push data to pppd device */
- skb->free = 1;
- dev_kfree_skb(skb,0 /* FREE_READ */ );
+ dev_kfree_skb(skb, FREE_WRITE );
return;
}

@@ -1043,7 +1034,7 @@
*/

if(ipt->debug & 0x4)
- printk(KERN_DEBUG "xmit skb, len %ld\n",skb->len);
+ printk(KERN_DEBUG "xmit skb, len %d\n",skb->len);

#ifdef CONFIG_ISDN_PPP_VJ
if (ipts->pppcfg & SC_COMP_TCP) { /* ipts here? probably yes .. but this check again */
@@ -1055,7 +1046,6 @@
int pktlen;

new_skb->dev = skb->dev;
- new_skb->free = 1;
skb_put(new_skb,skb->len);
buf = skb->data;

@@ -1069,7 +1059,7 @@
skb = new_skb;
}
else {
- dev_kfree_skb(new_skb,0 /* FREE_WRITE */ );
+ dev_kfree_skb(new_skb, FREE_WRITE );
}

skb_trim(skb,pktlen);
@@ -1086,7 +1076,7 @@
#endif

if(ipt->debug & 0x24)
- printk(KERN_DEBUG "xmit2 skb, len %ld, proto %04x\n",skb->len,proto);
+ printk(KERN_DEBUG "xmit2 skb, len %d, proto %04x\n",skb->len,proto);

#ifdef CONFIG_ISDN_MPP
if (ipt->mpppcfg & SC_MP_PROT) {
@@ -1137,8 +1127,7 @@
while(q) {
struct sqqueue *qn = q->next;
if(q->skb) {
- q->skb->free = 1;
- dev_kfree_skb(q->skb,0 /* FREE_READ */ );
+ dev_kfree_skb(q->skb, FREE_WRITE );
}
kfree(q);
q = qn;
@@ -1151,8 +1140,7 @@
struct mpqueue *ql, *q = p->mp_last;
while (q) {
ql = q->next;
- q->skb->free = 1;
- dev_kfree_skb(q->skb,0 /* FREE_READ */ );
+ dev_kfree_skb(q->skb, FREE_WRITE );
kfree(q);
q = ql;
}
@@ -1321,8 +1309,7 @@
if (!(*skb)) {
while (q) {
struct mpqueue *ql = q->next;
- q->skb->free = 1;
- dev_kfree_skb(q->skb,0 /* FREE_READ */ );
+ dev_kfree_skb(q->skb, FREE_WRITE );
kfree(q);
q = ql;
}
@@ -1334,8 +1321,7 @@
struct mpqueue *ql = q->next;
memcpy((*skb)->data + cnt, q->skb->data, q->skb->len);
cnt += q->skb->len;
- q->skb->free = 1;
- dev_kfree_skb(q->skb,0 /* FREE_READ */ );
+ dev_kfree_skb(q->skb, FREE_WRITE );
kfree(q);
q = ql;
}
@@ -1368,8 +1354,7 @@
q->next->last = NULL;
while (q) {
ql = q->last;
- q->skb->free = 1;
- dev_kfree_skb(q->skb,0 /* FREE_READ */ );
+ dev_kfree_skb(q->skb, FREE_WRITE );
kfree(q);
#ifdef CONFIG_ISDN_PPP_VJ
toss = 1;
diff -ur linux-2.1.21.orig/drivers/isdn/isdn_tty.c linux/drivers/isdn/isdn_tty.c
--- linux-2.1.21.orig/drivers/isdn/isdn_tty.c Sat Nov 30 19:48:34 1996
+++ linux/drivers/isdn/isdn_tty.c Wed Jan 15 12:55:27 1997
@@ -184,7 +184,6 @@
if (info->emu.mdmreg[12] & 128)
tty->flip.flag_buf_ptr[len - 1] = 0xff;
queue_task_irq_off(&tty->flip.tqueue, &tq_timer);
- skb->free = 1;
kfree_skb(skb, FREE_READ);
return 1;
}
@@ -261,12 +260,10 @@
cli();
if (skb_queue_len(&info->xmit_queue))
while ((skb = skb_dequeue(&info->xmit_queue))) {
- skb->free = 1;
kfree_skb(skb, FREE_WRITE);
}
if (skb_queue_len(&info->dtmf_queue))
while ((skb = skb_dequeue(&info->dtmf_queue))) {
- skb->free = 1;
kfree_skb(skb, FREE_WRITE);
}
restore_flags(flags);
@@ -489,7 +486,6 @@
#ifdef CONFIG_ISDN_AUDIO
}
#endif
- skb->free = 1;
if (info->emu.mdmreg[13] & 2)
/* Add T.70 simplified header */
memcpy(skb_push(skb, 4), "\1\0\1\0", 4);
diff -ur linux-2.1.21.orig/drivers/isdn/pcbit/capi.c linux/drivers/isdn/pcbit/capi.c
--- linux-2.1.21.orig/drivers/isdn/pcbit/capi.c Sun Jun 30 03:36:22 1996
+++ linux/drivers/isdn/pcbit/capi.c Wed Jan 15 12:55:27 1997
@@ -147,8 +147,6 @@
return -1;
}

- (*skb)->free = 1;
-

*((ushort*) skb_put(*skb, 2) ) = chan->callref;
*(skb_put(*skb, 1)) = 0x01; /* ACCEPT_CALL */
@@ -170,8 +168,6 @@
return -1;
}

- (*skb)->free = 1;
-
*((ushort*) skb_put(*skb, 2) ) = chan->callref;

#ifdef DEBUG
@@ -200,8 +196,6 @@
return -1;
}

- (*skb)->free = 1;
-
*((ushort*) skb_put(*skb, 2) ) = chan->callref;

return 2;
@@ -222,8 +216,6 @@
return -1;
}

- (*skb)->free = 1;
-
*((ushort*) skb_put(*skb, 2) ) = chan->callref;

/* Layer2 protocol */
@@ -285,8 +277,6 @@
return -1;
}

- (*skb)->free = 1;
-
*((ushort*) skb_put(*skb, 2) ) = chan->callref;


@@ -338,8 +328,6 @@
return -1;
}

- (*skb)->free = 1;
-
*((ushort*) skb_put(*skb, 2) ) = chan->callref;

*(skb_put(*skb, 1)) = chan->layer2link;
@@ -357,8 +345,6 @@
return -1;
}

- (*skb)->free = 1;
-
*((ushort*) skb_put(*skb, 2) ) = callref;

*(skb_put(*skb, 1)) = 2; /* Cause.Length = 2; */
@@ -381,8 +367,6 @@
printk(KERN_WARNING "capi_disc_resp: alloc_skb failed\n");
return -1;
}
-
- (*skb)->free = 1;

*((ushort*) skb_put(*skb, 2)) = chan->callref;

diff -ur linux-2.1.21.orig/drivers/isdn/pcbit/drv.c linux/drivers/isdn/pcbit/drv.c
--- linux-2.1.21.orig/drivers/isdn/pcbit/drv.c Mon Nov 18 20:31:31 1996
+++ linux/drivers/isdn/pcbit/drv.c Wed Jan 15 12:55:27 1997
@@ -751,8 +751,6 @@
#endif
}

- skb->free = 1;
-
kfree_skb(skb, FREE_READ);

}
diff -ur linux-2.1.21.orig/drivers/isdn/pcbit/layer2.c linux/drivers/isdn/pcbit/layer2.c
--- linux-2.1.21.orig/drivers/isdn/pcbit/layer2.c Sun Jun 30 03:36:22 1996
+++ linux/drivers/isdn/pcbit/layer2.c Wed Jan 15 12:55:27 1997
@@ -120,11 +120,8 @@
frame->copied = 0;
frame->hdr_len = hdr_len;

- if (skb) {
+ if (skb)
frame->dt_len = skb->len - hdr_len;
- if (frame->dt_len == 0)
- skb->lock++;
- }
else
frame->dt_len = 0;

@@ -388,10 +385,8 @@
return;
#else
/* discard previous queued frame */
- if (dev->read_frame->skb) {
- dev->read_frame->skb->free = 1;
+ if (dev->read_frame->skb)
kfree_skb(dev->read_frame->skb, FREE_READ);
- }
kfree(dev->read_frame);
dev->read_frame = NULL;
#endif
@@ -683,10 +678,7 @@
if (dev->read_frame)
{
if (dev->read_frame->skb)
- {
- dev->read_frame->skb->free = 1;
kfree_skb(dev->read_frame->skb, FREE_READ);
- }
kfree(dev->read_frame);
dev->read_frame = NULL;
}
diff -ur linux-2.1.21.orig/drivers/isdn/pcbit/module.c linux/drivers/isdn/pcbit/module.c
--- linux-2.1.21.orig/drivers/isdn/pcbit/module.c Fri Dec 27 21:03:22 1996
+++ linux/drivers/isdn/pcbit/module.c Wed Jan 15 12:58:42 1997
@@ -22,8 +22,8 @@
#include <linux/isdnif.h>
#include "pcbit.h"

-int mem[MAX_PCBIT_CARDS] = {0, };
-int irq[MAX_PCBIT_CARDS] = {0, };
+static int mem[MAX_PCBIT_CARDS] = {0, };
+static int irq[MAX_PCBIT_CARDS] = {0, };

int num_boards;
struct pcbit_dev * dev_pcbit[MAX_PCBIT_CARDS] = {0, 0, 0, 0};
diff -ur linux-2.1.21.orig/drivers/isdn/teles/mod.c linux/drivers/isdn/teles/mod.c
--- linux-2.1.21.orig/drivers/isdn/teles/mod.c Fri Dec 27 21:03:22 1996
+++ linux/drivers/isdn/teles/mod.c Wed Jan 15 12:58:42 1997
@@ -20,7 +20,7 @@
unsigned int protocol;
} io_type;

-io_type io[] =
+static io_type io[] =
{
{0, 0, 0, 0},
{0, 0, 0, 0},