summaryrefslogtreecommitdiffstats
path: root/drivers/net/hamradio
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1998-03-17 22:05:47 +0000
committerRalf Baechle <ralf@linux-mips.org>1998-03-17 22:05:47 +0000
commit27cfca1ec98e91261b1a5355d10a8996464b63af (patch)
tree8e895a53e372fa682b4c0a585b9377d67ed70d0e /drivers/net/hamradio
parent6a76fb7214c477ccf6582bd79c5b4ccc4f9c41b1 (diff)
Look Ma' what I found on my harddisk ...
o New faster syscalls for 2.1.x, too o Upgrade to 2.1.89. Don't try to run this. It's flaky as hell. But feel free to debug ...
Diffstat (limited to 'drivers/net/hamradio')
-rw-r--r--drivers/net/hamradio/.cvsignore1
-rw-r--r--drivers/net/hamradio/Config.in80
-rw-r--r--drivers/net/hamradio/Makefile8
-rw-r--r--drivers/net/hamradio/baycom_par.c8
-rw-r--r--drivers/net/hamradio/baycom_ser_fdx.c2
-rw-r--r--drivers/net/hamradio/baycom_ser_hdx.c2
-rw-r--r--drivers/net/hamradio/bpqether.c24
-rw-r--r--drivers/net/hamradio/dmascc.c137
-rw-r--r--drivers/net/hamradio/hdlcdrv.c8
-rw-r--r--drivers/net/hamradio/mkiss.c2
-rw-r--r--drivers/net/hamradio/pi2.c8
-rw-r--r--drivers/net/hamradio/pt.c6
-rw-r--r--drivers/net/hamradio/scc.c59
-rw-r--r--drivers/net/hamradio/soundmodem/.cvsignore1
-rw-r--r--drivers/net/hamradio/soundmodem/gentbl.c12
-rw-r--r--drivers/net/hamradio/soundmodem/sm.c2
16 files changed, 203 insertions, 157 deletions
diff --git a/drivers/net/hamradio/.cvsignore b/drivers/net/hamradio/.cvsignore
index 4671378ae..857dd22e9 100644
--- a/drivers/net/hamradio/.cvsignore
+++ b/drivers/net/hamradio/.cvsignore
@@ -1 +1,2 @@
.depend
+.*.flags
diff --git a/drivers/net/hamradio/Config.in b/drivers/net/hamradio/Config.in
index 85434e502..c0719608a 100644
--- a/drivers/net/hamradio/Config.in
+++ b/drivers/net/hamradio/Config.in
@@ -1,61 +1,27 @@
-#
-# Amateur Radio protocols and AX.25 device configuration
-#
-# 19971130 Now in an own category to make correct compilation of the
-# AX.25 stuff easier...
-# Joerg Reuter DL1BKE <jreuter@poboxes.com>
+comment 'AX.25 network device drivers'
-mainmenu_option next_comment
-comment 'Amateur Radio support'
-bool 'Amateur Radio support' CONFIG_HAMRADIO
-
-if [ "$CONFIG_HAMRADIO" != "n" ] ; then
- if [ "$CONFIG_NET" != "n" ] ; then
- comment 'Packet Radio protocols'
- tristate 'Amateur Radio AX.25 Level 2 protocol' CONFIG_AX25
- if [ "$CONFIG_AX25" != "n" ]; then
- bool ' AX.25 DAMA Slave support' CONFIG_AX25_DAMA_SLAVE
-# bool ' AX.25 DAMA Master support' CONFIG_AX25_DAMA_MASTER
- dep_tristate ' Amateur Radio NET/ROM protocol' CONFIG_NETROM $CONFIG_AX25
- dep_tristate ' Amateur Radio X.25 PLP (Rose)' CONFIG_ROSE $CONFIG_AX25
- fi
-
- if [ "$CONFIG_AX25" != "n" ]; then
- comment 'AX.25 network device drivers'
- tristate 'Serial port KISS driver' CONFIG_MKISS
-# tristate 'Serial port 6PACK driver' CONFIG_6PACK
- tristate 'BPQ Ethernet driver' CONFIG_BPQETHER
-
- tristate 'High-speed (DMA) SCC driver for AX.25' CONFIG_DMASCC $CONFIG_AX25
- tristate 'Z8530 SCC driver' CONFIG_SCC
- if [ "$CONFIG_SCC" != "n" ]; then
- bool ' additional delay for PA0HZP OptoSCC compatible boards' CONFIG_SCC_DELAY
- bool ' support for TRX that feedback the tx signal to rx' CONFIG_SCC_TRXECHO
- fi
+dep_tristate 'Serial port KISS driver' CONFIG_MKISS $CONFIG_AX25
+# dep_tristate 'Serial port 6PACK driver' CONFIG_6PACK $CONFIG_AX25
+dep_tristate 'BPQ Ethernet driver' CONFIG_BPQETHER $CONFIG_AX25
- tristate 'BAYCOM ser12 fullduplex driver for AX.25' CONFIG_BAYCOM_SER_FDX
- tristate 'BAYCOM ser12 halfduplex driver for AX.25' CONFIG_BAYCOM_SER_HDX
- tristate 'BAYCOM picpar and par96 driver for AX.25' CONFIG_BAYCOM_PAR
-
- tristate 'Soundcard modem driver' CONFIG_SOUNDMODEM
- if [ "$CONFIG_SOUNDMODEM" != "n" ]; then
- bool ' soundmodem support for Soundblaster and compatible cards' CONFIG_SOUNDMODEM_SBC
- bool ' soundmodem support for WSS and Crystal cards' CONFIG_SOUNDMODEM_WSS
- bool ' soundmodem support for 1200 baud AFSK modulation' CONFIG_SOUNDMODEM_AFSK1200
- bool ' soundmodem support for 2400 baud AFSK modulation (7.3728MHz crystal)' CONFIG_SOUNDMODEM_AFSK2400_7
- bool ' soundmodem support for 2400 baud AFSK modulation (8MHz crystal)' CONFIG_SOUNDMODEM_AFSK2400_8
- bool ' soundmodem support for 4800 baud HAPN-1 modulation' CONFIG_SOUNDMODEM_HAPN4800
- bool ' soundmodem support for 9600 baud FSK G3RUH modulation' CONFIG_SOUNDMODEM_FSK9600
- fi
- fi
- fi
-
- comment 'Misc. hamradio protocols'
- tristate 'Shortwave radio modem driver' CONFIG_HFMODEM
- if [ "$CONFIG_HFMODEM" != "n" ]; then
- bool ' HFmodem support for Soundblaster and compatible cards' CONFIG_HFMODEM_SBC
- bool ' HFmodem support for WSS and Crystal cards' CONFIG_HFMODEM_WSS
- fi
+dep_tristate 'High-speed (DMA) SCC driver for AX.25' CONFIG_DMASCC $CONFIG_AX25
+dep_tristate 'Z8530 SCC driver' CONFIG_SCC $CONFIG_AX25
+if [ "$CONFIG_SCC" != "n" ]; then
+ bool ' additional delay for PA0HZP OptoSCC compatible boards' CONFIG_SCC_DELAY
+ bool ' support for TRX that feedback the tx signal to rx' CONFIG_SCC_TRXECHO
fi
+
+dep_tristate 'BAYCOM ser12 fullduplex driver for AX.25' CONFIG_BAYCOM_SER_FDX $CONFIG_AX25
+dep_tristate 'BAYCOM ser12 halfduplex driver for AX.25' CONFIG_BAYCOM_SER_HDX $CONFIG_AX25
+dep_tristate 'BAYCOM picpar and par96 driver for AX.25' CONFIG_BAYCOM_PAR $CONFIG_AX25
-endmenu
+dep_tristate 'Soundcard modem driver' CONFIG_SOUNDMODEM $CONFIG_AX25
+if [ "$CONFIG_SOUNDMODEM" != "n" ]; then
+ bool ' soundmodem support for Soundblaster and compatible cards' CONFIG_SOUNDMODEM_SBC
+ bool ' soundmodem support for WSS and Crystal cards' CONFIG_SOUNDMODEM_WSS
+ bool ' soundmodem support for 1200 baud AFSK modulation' CONFIG_SOUNDMODEM_AFSK1200
+ bool ' soundmodem support for 2400 baud AFSK modulation (7.3728MHz crystal)' CONFIG_SOUNDMODEM_AFSK2400_7
+ bool ' soundmodem support for 2400 baud AFSK modulation (8MHz crystal)' CONFIG_SOUNDMODEM_AFSK2400_8
+ bool ' soundmodem support for 4800 baud HAPN-1 modulation' CONFIG_SOUNDMODEM_HAPN4800
+ bool ' soundmodem support for 9600 baud FSK G3RUH modulation' CONFIG_SOUNDMODEM_FSK9600
+fi
diff --git a/drivers/net/hamradio/Makefile b/drivers/net/hamradio/Makefile
index 349371dd0..c247cee79 100644
--- a/drivers/net/hamradio/Makefile
+++ b/drivers/net/hamradio/Makefile
@@ -21,6 +21,14 @@ MOD_LIST_NAME := HAM_MODULES
CONFIG_HDLCDRV_BUILTIN :=
CONFIG_HDLCDRV_MODULE :=
+ifeq ($(CONFIG_DMASCC),y)
+L_OBJS += dmascc.o
+else
+ ifeq ($(CONFIG_DMASCC),m)
+ M_OBJS += dmascc.o
+ endif
+endif
+
ifeq ($(CONFIG_SCC),y)
L_OBJS += scc.o
else
diff --git a/drivers/net/hamradio/baycom_par.c b/drivers/net/hamradio/baycom_par.c
index 0b470e2f3..25fcd137e 100644
--- a/drivers/net/hamradio/baycom_par.c
+++ b/drivers/net/hamradio/baycom_par.c
@@ -392,18 +392,18 @@ static int par96_open(struct device *dev)
return -ENXIO;
}
if (pp->irq < 0) {
- printk(KERN_ERR "baycom_par: parport at 0x%x has no irq\n", pp->base);
+ printk(KERN_ERR "baycom_par: parport at 0x%lx has no irq\n", pp->base);
return -ENXIO;
}
memset(&bc->modem, 0, sizeof(bc->modem));
bc->hdrv.par.bitrate = 9600;
if (!(bc->pdev = parport_register_device(pp, dev->name, par96_preempt, par96_wakeup,
par96_interrupt, PARPORT_DEV_LURK, dev))) {
- printk(KERN_ERR "baycom_par: cannot register parport at 0x%x\n", pp->base);
+ printk(KERN_ERR "baycom_par: cannot register parport at 0x%lx\n", pp->base);
return -ENXIO;
}
if (parport_claim(bc->pdev)) {
- printk(KERN_ERR "baycom_par: parport at 0x%x busy\n", pp->base);
+ printk(KERN_ERR "baycom_par: parport at 0x%lx busy\n", pp->base);
parport_unregister_device(bc->pdev);
return -EBUSY;
}
@@ -502,7 +502,7 @@ static int baycom_ioctl(struct device *dev, struct ifreq *ifr,
return 0;
case HDLCDRVCTL_SETMODE:
- if (!suser() || dev->start)
+ if (dev->start || !suser())
return -EACCES;
hi->data.modename[sizeof(hi->data.modename)-1] = '\0';
return baycom_setmode(bc, hi->data.modename);
diff --git a/drivers/net/hamradio/baycom_ser_fdx.c b/drivers/net/hamradio/baycom_ser_fdx.c
index 9005356d3..b70e4efde 100644
--- a/drivers/net/hamradio/baycom_ser_fdx.c
+++ b/drivers/net/hamradio/baycom_ser_fdx.c
@@ -587,7 +587,7 @@ static int baycom_ioctl(struct device *dev, struct ifreq *ifr,
return 0;
case HDLCDRVCTL_SETMODE:
- if (!suser() || dev->start)
+ if (dev->start || !suser())
return -EACCES;
hi->data.modename[sizeof(hi->data.modename)-1] = '\0';
return baycom_setmode(bc, hi->data.modename);
diff --git a/drivers/net/hamradio/baycom_ser_hdx.c b/drivers/net/hamradio/baycom_ser_hdx.c
index e3d7ac998..f1024658d 100644
--- a/drivers/net/hamradio/baycom_ser_hdx.c
+++ b/drivers/net/hamradio/baycom_ser_hdx.c
@@ -626,7 +626,7 @@ static int baycom_ioctl(struct device *dev, struct ifreq *ifr,
return 0;
case HDLCDRVCTL_SETMODE:
- if (!suser() || dev->start)
+ if (dev->start || !suser())
return -EACCES;
hi->data.modename[sizeof(hi->data.modename)-1] = '\0';
return baycom_setmode(bc, hi->data.modename);
diff --git a/drivers/net/hamradio/bpqether.c b/drivers/net/hamradio/bpqether.c
index 54d63121e..fcc9ed7cc 100644
--- a/drivers/net/hamradio/bpqether.c
+++ b/drivers/net/hamradio/bpqether.c
@@ -51,6 +51,7 @@
* call.
* Fixed to match Linux networking
* changes - 2.1.15.
+ * BPQ 004 Joerg(DL1BKE) Fixed to not lock up on ifconfig.
*/
#include <linux/config.h>
@@ -78,6 +79,7 @@
#include <linux/firewall.h>
#include <linux/module.h>
#include <linux/init.h>
+#include <linux/rtnetlink.h>
#include <net/ip.h>
#include <net/arp.h>
@@ -186,7 +188,11 @@ static int bpq_check_devices(struct device *dev)
if (&bpq->axdev == dev)
result = 1;
- unregister_netdev(&bpq->axdev);
+ /* We should be locked, call
+ * unregister_netdevice directly
+ */
+
+ unregister_netdevice(&bpq->axdev);
kfree(bpq);
}
@@ -217,7 +223,7 @@ static int bpq_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *
dev = bpq_get_ax25_dev(dev);
if (dev == NULL || dev->start == 0) {
- kfree_skb(skb, FREE_READ);
+ kfree_skb(skb);
return 0;
}
@@ -230,7 +236,7 @@ static int bpq_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *
if (!(bpq->acpt_addr[0] & 0x01) && memcmp(eth->h_source, bpq->acpt_addr, ETH_ALEN)) {
printk(KERN_DEBUG "bpqether: wrong dest %s\n", bpq_print_ethaddr(eth->h_source));
- kfree_skb(skb, FREE_READ);
+ kfree_skb(skb);
return 0;
}
@@ -271,7 +277,7 @@ static int bpq_xmit(struct sk_buff *skb, struct device *dev)
*/
if (!dev->start) {
bpq_check_devices(dev);
- kfree_skb(skb, FREE_WRITE);
+ kfree_skb(skb);
return -ENODEV;
}
@@ -285,14 +291,14 @@ static int bpq_xmit(struct sk_buff *skb, struct device *dev)
if (skb_headroom(skb) < AX25_BPQ_HEADER_LEN) { /* Ough! */
if ((newskb = skb_realloc_headroom(skb, AX25_BPQ_HEADER_LEN)) == NULL) {
printk(KERN_WARNING "bpqether: out of memory\n");
- kfree_skb(skb, FREE_WRITE);
+ kfree_skb(skb);
return -ENOMEM;
}
if (skb->sk != NULL)
skb_set_owner_w(newskb, skb->sk);
- kfree_skb(skb, FREE_WRITE);
+ kfree_skb(skb);
skb = newskb;
}
@@ -307,7 +313,7 @@ static int bpq_xmit(struct sk_buff *skb, struct device *dev)
if ((dev = bpq_get_ether_dev(dev)) == NULL) {
bpq->stats.tx_dropped++;
- kfree_skb(skb, FREE_WRITE);
+ kfree_skb(skb);
return -ENODEV;
}
@@ -531,7 +537,9 @@ static int bpq_new_device(struct device *dev)
dev->name = buf;
dev->init = bpq_dev_init;
- if (register_netdev(dev) != 0) {
+ /* We should be locked, call register_netdevice() directly. */
+
+ if (register_netdevice(dev) != 0) {
kfree(bpq);
return -EIO;
}
diff --git a/drivers/net/hamradio/dmascc.c b/drivers/net/hamradio/dmascc.c
index 33b473d32..c07f90249 100644
--- a/drivers/net/hamradio/dmascc.c
+++ b/drivers/net/hamradio/dmascc.c
@@ -1,5 +1,5 @@
/*
- * $Id: dmascc.c,v 1.2 1997/12/02 16:49:49 oe1kib Exp $
+ * $Id: dmascc.c,v 1.2.1.3 1997/12/19 13:40:15 oe1kib Exp $
*
* Driver for high-speed SCC boards (those with DMA support)
* Copyright (C) 1997 Klaus Kudielka
@@ -21,11 +21,11 @@
#include <linux/module.h>
+#include <linux/delay.h>
#include <linux/dmascc.h>
#include <linux/errno.h>
#include <linux/if_arp.h>
#include <linux/in.h>
-#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/kernel.h>
@@ -40,12 +40,55 @@
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/segment.h>
-#include <asm/uaccess.h>
#include <net/ax25.h>
-#include <stdio.h>
#include "z8530.h"
+/* Linux 2.0 compatibility */
+
+#if LINUX_VERSION_CODE < 0x20100
+
+
+#define __init
+#define __initdata
+#define __initfunc(x) x
+
+#define MODULE_AUTHOR(x)
+#define MODULE_DESCRIPTION(x)
+#define MODULE_PARM(x,y)
+
+#define copy_to_user(x,y,z) memcpy_tofs(x,y,z)
+#define copy_from_user(x,y,z) memcpy_fromfs(x,y,z)
+#define test_and_set_bit(x,y) set_bit(x,y)
+#define register_netdevice(x) register_netdev(x)
+#define unregister_netdevice(x) unregister_netdev(x)
+
+static int dmascc_dev_init(struct device *dev)
+{
+ return 0;
+}
+
+static void dev_init_buffers(struct device *dev)
+{
+ int i;
+
+ for (i = 0; i < DEV_NUMBUFFS; i++)
+ skb_queue_head_init(&dev->buffs[i]);
+}
+
+
+#else
+
+
+#include <linux/init.h>
+#include <asm/uaccess.h>
+
+#define dmascc_dev_init NULL
+
+
+#endif
+
+
/* Number of buffers per channel */
#define NUM_TX_BUF 2 /* NUM_TX_BUF >= 1 (2 recommended) */
@@ -89,7 +132,7 @@
#define SCCA_CMD 0x02
#define SCCA_DATA 0x03
-/* 8254 registers relative to card base */
+/* 8253/8254 registers relative to card base */
#define TMR_CNT0 0x00
#define TMR_CNT1 0x01
#define TMR_CNT2 0x02
@@ -265,7 +308,7 @@ void cleanup_module(void)
/* Unregister devices */
for (i = 0; i < 2; i++) {
if (info->dev[i].name)
- unregister_netdev(&info->dev[i]);
+ unregister_netdevice(&info->dev[i]);
}
/* Reset board */
@@ -301,14 +344,19 @@ __initfunc(void dmascc_setup(char *str, int *ints))
__initfunc(int dmascc_init(void))
{
- int h, i, j, n, base[MAX_NUM_DEVS], tcmd, t0, t1, status;
- unsigned long time, start[MAX_NUM_DEVS], stop[MAX_NUM_DEVS];
+ int h, i, j, n;
+ int base[MAX_NUM_DEVS], tcmd[MAX_NUM_DEVS], t0[MAX_NUM_DEVS],
+ t1[MAX_NUM_DEVS];
+ unsigned t_val;
+ unsigned long time, start[MAX_NUM_DEVS], delay[MAX_NUM_DEVS],
+ counting[MAX_NUM_DEVS];
/* Initialize random number generator */
rand = jiffies;
-
/* Cards found = 0 */
n = 0;
+ /* Warning message */
+ if (!io[0]) printk("dmascc: autoprobing (dangerous)\n");
/* Run autodetection for each card type */
for (h = 0; h < NUM_TYPES; h++) {
@@ -320,63 +368,66 @@ __initfunc(int dmascc_init(void))
j = (io[i] - hw[h].io_region) / hw[h].io_delta;
if (j >= 0 &&
j < hw[h].num_devs &&
- hw[h].io_region + j * hw[h].io_delta == io[i])
+ hw[h].io_region + j * hw[h].io_delta == io[i]) {
base[j] = io[i];
+ }
}
} else {
/* Default I/O address regions */
- for (i = 0; i < hw[h].num_devs; i++)
+ for (i = 0; i < hw[h].num_devs; i++) {
base[i] = hw[h].io_region + i * hw[h].io_delta;
+ }
}
/* Check valid I/O address regions */
for (i = 0; i < hw[h].num_devs; i++)
- if (base[i] && check_region(base[i], hw[h].io_size))
- base[i] = 0;
+ if (base[i])
+ if (check_region(base[i], hw[h].io_size))
+ base[i] = 0;
+ else {
+ tcmd[i] = base[i] + hw[h].tmr_offset + TMR_CTRL;
+ t0[i] = base[i] + hw[h].tmr_offset + TMR_CNT0;
+ t1[i] = base[i] + hw[h].tmr_offset + TMR_CNT1;
+ }
/* Start timers */
for (i = 0; i < hw[h].num_devs; i++)
if (base[i]) {
- tcmd = base[i] + hw[h].tmr_offset + TMR_CTRL;
- t0 = base[i] + hw[h].tmr_offset + TMR_CNT0;
- t1 = base[i] + hw[h].tmr_offset + TMR_CNT1;
/* Timer 0: LSB+MSB, Mode 3, TMR_0_HZ */
- outb_p(0x36, tcmd);
- outb_p((hw[h].tmr_hz/TMR_0_HZ) & 0xFF, t0);
- outb_p((hw[h].tmr_hz/TMR_0_HZ) >> 8, t0);
+ outb_p(0x36, tcmd[i]);
+ outb_p((hw[h].tmr_hz/TMR_0_HZ) & 0xFF, t0[i]);
+ outb_p((hw[h].tmr_hz/TMR_0_HZ) >> 8, t0[i]);
/* Timer 1: LSB+MSB, Mode 0, HZ/10 */
- outb_p(0x70, tcmd);
- outb_p((TMR_0_HZ/HZ*10) & 0xFF, t1);
- outb_p((TMR_0_HZ/HZ*10) >> 8, t1);
+ outb_p(0x70, tcmd[i]);
+ outb_p((TMR_0_HZ/HZ*10) & 0xFF, t1[i]);
+ outb_p((TMR_0_HZ/HZ*10) >> 8, t1[i]);
+ start[i] = jiffies;
+ delay[i] = 0;
+ counting[i] = 1;
/* Timer 2: LSB+MSB, Mode 0 */
- outb_p(0xb0, tcmd);
+ outb_p(0xb0, tcmd[i]);
}
-
- /* Initialize start values in case we miss the null count bit */
time = jiffies;
- for (i = 0; i < hw[h].num_devs; i++) start[i] = time;
+ /* Wait until counter registers are loaded */
+ udelay(2000000/TMR_0_HZ);
/* Timing loop */
- while (jiffies - time < 12) {
+ while (jiffies - time < 13) {
for (i = 0; i < hw[h].num_devs; i++)
- if (base[i]) {
- /* Read back Timer 1: Status */
- outb_p(0xE4, base[i] + hw[h].tmr_offset + TMR_CTRL);
- status = inb_p(base[i] + hw[h].tmr_offset + TMR_CNT1);
- if ((status & 0x3F) != 0x30) base[i] = 0;
- if (status & 0x40) start[i] = jiffies;
- if (~status & 0x80) stop[i] = jiffies;
+ if (base[i] && counting[i]) {
+ /* Read back Timer 1: latch; read LSB; read MSB */
+ outb_p(0x40, tcmd[i]);
+ t_val = inb_p(t1[i]) + (inb_p(t1[i]) << 8);
+ /* Also check whether counter did wrap */
+ if (t_val == 0 || t_val > TMR_0_HZ/HZ*10) counting[i] = 0;
+ delay[i] = jiffies - start[i];
}
}
/* Evaluate measurements */
for (i = 0; i < hw[h].num_devs; i++)
if (base[i]) {
- time = stop[i] - start[i];
- if (time < 9 || time > 11)
- /* The time expired doesn't match */
- base[i] = 0;
- else {
+ if (delay[i] >= 9 && delay[i] <= 11) {
/* Ok, we have found an adapter */
if (setup_adapter(base[i], h, n) == 0)
n++;
@@ -523,6 +574,7 @@ __initfunc(int setup_adapter(int io, int h, int n))
dev->hard_header = ax25_encapsulate;
dev->rebuild_header = ax25_rebuild_header;
dev->set_mac_address = scc_set_mac_address;
+ dev->init = dmascc_dev_init;
dev->type = ARPHRD_AX25;
dev->hard_header_len = 73;
dev->mtu = 1500;
@@ -530,9 +582,8 @@ __initfunc(int setup_adapter(int io, int h, int n))
dev->tx_queue_len = 64;
memcpy(dev->broadcast, ax25_broadcast, 7);
memcpy(dev->dev_addr, ax25_test, 7);
- dev->flags = 0;
dev_init_buffers(dev);
- if (register_netdev(dev)) {
+ if (register_netdevice(dev)) {
printk("dmascc: could not register %s\n", dev->name);
dev->name = NULL;
}
@@ -749,7 +800,7 @@ static int scc_send_packet(struct sk_buff *skb, struct device *dev)
/* Block a timer-based transmit from overlapping */
if (test_and_set_bit(0, (void *) &priv->tx_sem) != 0) {
atomic_inc((void *) &priv->stats.tx_dropped);
- dev_kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb);
return 0;
}
@@ -785,7 +836,7 @@ static int scc_send_packet(struct sk_buff *skb, struct device *dev)
restore_flags(flags);
- dev_kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb);
priv->tx_sem = 0;
return 0;
diff --git a/drivers/net/hamradio/hdlcdrv.c b/drivers/net/hamradio/hdlcdrv.c
index 148ed14f4..f4fb73844 100644
--- a/drivers/net/hamradio/hdlcdrv.c
+++ b/drivers/net/hamradio/hdlcdrv.c
@@ -446,18 +446,18 @@ void hdlcdrv_transmitter(struct device *dev, struct hdlcdrv_state *s)
}
if (skb->data[0] != 0) {
do_kiss_params(s, skb->data, skb->len);
- dev_kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb);
break;
}
pkt_len = skb->len-1; /* strip KISS byte */
if (pkt_len >= HDLCDRV_MAXFLEN || pkt_len < 2) {
s->hdlctx.tx_state = 0;
s->hdlctx.numflags = 1;
- dev_kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb);
break;
}
memcpy(s->hdlctx.buffer, skb->data+1, pkt_len);
- dev_kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb);
s->hdlctx.bp = s->hdlctx.buffer;
append_crc_ccitt(s->hdlctx.buffer, pkt_len);
s->hdlctx.len = pkt_len+2; /* the appended CRC */
@@ -681,7 +681,7 @@ static int hdlcdrv_close(struct device *dev)
i = s->ops->close(dev);
/* Free any buffers left in the hardware transmit queue */
while ((skb = skb_dequeue(&s->send_queue)))
- dev_kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb);
return i;
}
diff --git a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c
index 562a27681..21cdbf5c6 100644
--- a/drivers/net/hamradio/mkiss.c
+++ b/drivers/net/hamradio/mkiss.c
@@ -420,7 +420,7 @@ static int ax_xmit(struct sk_buff *skb, struct device *dev)
if (tmp_ax != NULL)
ax_lock(tmp_ax);
ax_encaps(ax, skb->data, skb->len);
- kfree_skb(skb, FREE_WRITE);
+ kfree_skb(skb);
}
return 0;
diff --git a/drivers/net/hamradio/pi2.c b/drivers/net/hamradio/pi2.c
index 3eb3a9223..8de325175 100644
--- a/drivers/net/hamradio/pi2.c
+++ b/drivers/net/hamradio/pi2.c
@@ -408,7 +408,7 @@ static void a_exint(struct pi_local *lp)
}
switch (lp->tstate) {
case ACTIVE:
- kfree_skb(lp->sndbuf, FREE_WRITE);
+ kfree_skb(lp->sndbuf);
lp->sndbuf = NULL;
lp->tstate = FLAGOUT;
tdelay(lp, lp->squeldelay);
@@ -726,7 +726,7 @@ static void b_txint(struct pi_local *lp)
/* stuffing a char satisfies Interrupt condition */
} else {
/* No more to send */
- kfree_skb(lp->sndbuf, FREE_WRITE);
+ kfree_skb(lp->sndbuf);
lp->sndbuf = NULL;
if ((rdscc(lp->cardbase, cmd, R0) & 0x40)) {
/* Did we underrun? */
@@ -778,7 +778,7 @@ static void b_exint(struct pi_local *lp)
switch (lp->tstate) {
case ACTIVE: /* Unexpected underrun */
- kfree_skb(lp->sndbuf, FREE_WRITE);
+ kfree_skb(lp->sndbuf);
lp->sndbuf = NULL;
wrtscc(lp->cardbase, cmd, R0, SEND_ABORT);
lp->tstate = FLAGOUT;
@@ -1553,7 +1553,7 @@ static int pi_close(struct device *dev)
/* Free any buffers left in the hardware transmit queue */
while ((ptr = skb_dequeue(&lp->sndq)) != NULL)
- kfree_skb(ptr, FREE_WRITE);
+ kfree_skb(ptr);
restore_flags(flags);
diff --git a/drivers/net/hamradio/pt.c b/drivers/net/hamradio/pt.c
index 11bef1d6f..86ed83d3b 100644
--- a/drivers/net/hamradio/pt.c
+++ b/drivers/net/hamradio/pt.c
@@ -967,7 +967,7 @@ static int pt_close(struct device *dev)
/* Free any buffers left in the hardware transmit queue */
while ((ptr = skb_dequeue(&lp->sndq)) != NULL)
- kfree_skb(ptr, FREE_WRITE);
+ kfree_skb(ptr);
restore_flags(flags);
@@ -1185,7 +1185,7 @@ static void pt_txisr(struct pt_local *lp)
/* stuffing a char satisfies interrupt condition */
} else {
/* No more to send */
- kfree_skb(lp->sndbuf, FREE_WRITE);
+ kfree_skb(lp->sndbuf);
lp->sndbuf = NULL;
if ((rdscc(lp->cardbase, cmd, R0) & TxEOM))
{
@@ -1540,7 +1540,7 @@ static void pt_exisr(struct pt_local *lp)
#ifdef PT_DEBUG
printk(KERN_DEBUG "PT: exisr(): unexpected underrun detected.\n");
#endif
- kfree_skb(lp->sndbuf, FREE_WRITE);
+ kfree_skb(lp->sndbuf);
lp->sndbuf = NULL;
if (!lp->dmachan)
{
diff --git a/drivers/net/hamradio/scc.c b/drivers/net/hamradio/scc.c
index 1665d2b2b..736d6b26b 100644
--- a/drivers/net/hamradio/scc.c
+++ b/drivers/net/hamradio/scc.c
@@ -1,4 +1,4 @@
-#define RCS_ID "$Id: scc.c,v 1.71 1997/11/29 19:59:20 jreuter Exp jreuter $"
+#define RCS_ID "$Id: scc.c,v 1.73 1998/01/29 17:38:51 jreuter Exp jreuter $"
#define VERSION "3.0"
#define BANNER "Z8530 SCC driver version "VERSION".dl1bke (experimental) by DL1BKE\n"
@@ -6,6 +6,9 @@
/*
* Please use z8530drv-utils-3.0 with this version.
* ------------------
+ *
+ * You can find a subset of the documentation in
+ * linux/Documentation/networking/z8530drv.txt.
*/
/*
@@ -16,7 +19,7 @@
********************************************************************
- Copyright (c) 1993, 1997 Joerg Reuter DL1BKE
+ Copyright (c) 1993, 1998 Joerg Reuter DL1BKE
portions (c) 1993 Guido ten Dolle PE1NNZ
@@ -89,7 +92,8 @@
970108 - Fixed the remaining problems.
970402 - Hopefully fixed the problems with the new *_timer()
routines, added calibration code.
- 971012 - made SCC_DELAY a CONFIG option, added CONFIG_SCC_TRXECHO
+ 971012 - Made SCC_DELAY a CONFIG option, added CONFIG_SCC_TRXECHO
+ 980129 - Small fix to avoid lock-up on initialization
Thanks to all who contributed to this driver with ideas and bug
reports!
@@ -166,10 +170,7 @@
#include <asm/uaccess.h>
#include <asm/bitops.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <time.h>
+#include <linux/ctype.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
@@ -198,7 +199,7 @@ static void scc_key_trx (struct scc_channel *scc, char tx);
static void scc_isr(int irq, void *dev_id, struct pt_regs *regs);
static void scc_init_timer(struct scc_channel *scc);
-static int scc_net_setup(struct scc_channel *scc, unsigned char *name);
+static int scc_net_setup(struct scc_channel *scc, unsigned char *name, int addev);
static int scc_net_init(struct device *dev);
static int scc_net_open(struct device *dev);
static int scc_net_close(struct device *dev);
@@ -323,12 +324,12 @@ extern __inline__ void scc_discard_buffers(struct scc_channel *scc)
if (scc->tx_buff != NULL)
{
- dev_kfree_skb(scc->tx_buff, FREE_WRITE);
+ dev_kfree_skb(scc->tx_buff);
scc->tx_buff = NULL;
}
while (skb_queue_len(&scc->tx_queue))
- dev_kfree_skb(skb_dequeue(&scc->tx_queue), FREE_WRITE);
+ dev_kfree_skb(skb_dequeue(&scc->tx_queue));
restore_flags(flags);
}
@@ -371,7 +372,7 @@ extern __inline__ void flush_rx_FIFO(struct scc_channel *scc)
if(scc->rx_buff != NULL) /* did we receive something? */
{
scc->stat.rxerrs++; /* then count it as an error */
- kfree_skb(scc->rx_buff, FREE_READ);
+ kfree_skb(scc->rx_buff);
scc->rx_buff = NULL;
}
}
@@ -405,7 +406,7 @@ extern __inline__ void scc_txint(struct scc_channel *scc)
if (skb->len == 0) /* Paranoia... */
{
- dev_kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb);
scc->tx_buff = NULL;
scc_tx_done(scc);
Outb(scc->ctrl, RES_Tx_P);
@@ -431,7 +432,7 @@ extern __inline__ void scc_txint(struct scc_channel *scc)
{
Outb(scc->ctrl, RES_Tx_P); /* reset pending int */
cl(scc, R10, ABUNDER); /* send CRC */
- dev_kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb);
scc->tx_buff = NULL;
scc->stat.tx_state = TXS_NEWFRAME; /* next frame... */
return;
@@ -512,7 +513,7 @@ extern __inline__ void scc_exint(struct scc_channel *scc)
if (scc->tx_buff != NULL)
{
- dev_kfree_skb(scc->tx_buff, FREE_WRITE);
+ dev_kfree_skb(scc->tx_buff);
scc->tx_buff = NULL;
}
@@ -562,7 +563,7 @@ extern __inline__ void scc_rxint(struct scc_channel *scc)
#ifdef notdef
printk(KERN_DEBUG "z8530drv: oops, scc_rxint() received huge frame...\n");
#endif
- kfree_skb(skb, FREE_READ);
+ kfree_skb(skb);
scc->rx_buff = NULL;
Inb(scc->data);
or(scc, R3, ENT_HM);
@@ -592,7 +593,7 @@ extern __inline__ void scc_spint(struct scc_channel *scc)
or(scc,R3,ENT_HM); /* enter hunt mode for next flag */
if (skb != NULL)
- kfree_skb(skb, FREE_READ);
+ kfree_skb(skb);
scc->rx_buff = NULL;
}
@@ -608,7 +609,7 @@ extern __inline__ void scc_spint(struct scc_channel *scc)
scc->rx_buff = NULL;
scc->stat.rxframes++;
} else { /* a bad frame */
- kfree_skb(skb, FREE_READ);
+ kfree_skb(skb);
scc->rx_buff = NULL;
scc->stat.rxerrs++;
}
@@ -1532,7 +1533,7 @@ static void z8530_init(void)
* Allocate device structure, err, instance, and register driver
*/
-static int scc_net_setup(struct scc_channel *scc, unsigned char *name)
+static int scc_net_setup(struct scc_channel *scc, unsigned char *name, int addev)
{
unsigned char *buf;
struct device *dev;
@@ -1556,11 +1557,11 @@ static int scc_net_setup(struct scc_channel *scc, unsigned char *name)
dev->name = buf;
dev->init = scc_net_init;
- if (register_netdev(dev) != 0)
+ if ((addev? register_netdevice(dev) : register_netdev(dev)) != 0)
{
kfree(dev);
- return -EIO;
- }
+ return -EIO;
+ }
return 0;
}
@@ -1670,7 +1671,7 @@ static void scc_net_rx(struct scc_channel *scc, struct sk_buff *skb)
{
if (skb->len == 0)
{
- kfree_skb(skb, FREE_READ);
+ kfree_skb(skb);
return;
}
@@ -1694,14 +1695,14 @@ static int scc_net_tx(struct sk_buff *skb, struct device *dev)
if (scc == NULL || scc->magic != SCC_MAGIC || dev->tbusy)
{
- dev_kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb);
return 0;
}
if (skb->len > scc->stat.bufsize || skb->len < 2)
{
scc->dev_stat.tx_dropped++; /* bogus frame */
- dev_kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb);
return 0;
}
@@ -1714,7 +1715,7 @@ static int scc_net_tx(struct sk_buff *skb, struct device *dev)
if (kisscmd)
{
scc_set_param(scc, kisscmd, *skb->data);
- dev_kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb);
return 0;
}
@@ -1725,7 +1726,7 @@ static int scc_net_tx(struct sk_buff *skb, struct device *dev)
{
struct sk_buff *skb_del;
skb_del = __skb_dequeue(&scc->tx_queue);
- dev_kfree_skb(skb_del, FREE_WRITE);
+ dev_kfree_skb(skb_del);
}
__skb_queue_tail(&scc->tx_queue, skb);
@@ -1871,7 +1872,7 @@ static int scc_net_ioctl(struct device *dev, struct ifreq *ifr, int cmd)
request_region(SCC_Info[2*Nchips+chan].ctrl, 1, "scc ctrl");
request_region(SCC_Info[2*Nchips+chan].data, 1, "scc data");
if (Nchips+chan != 0)
- scc_net_setup(&SCC_Info[2*Nchips+chan], device_name);
+ scc_net_setup(&SCC_Info[2*Nchips+chan], device_name, 1);
}
}
@@ -2181,7 +2182,7 @@ __initfunc(int scc_init (void))
sprintf(devname,"%s0", SCC_DriverName);
- result = scc_net_setup(SCC_Info, devname);
+ result = scc_net_setup(SCC_Info, devname, 0);
if (result)
{
printk(KERN_ERR "z8530drv: cannot initialize module\n");
@@ -2206,7 +2207,7 @@ int init_module(void)
result = scc_init();
if (result == 0)
- printk(KERN_INFO "Copyright 1993,1997 Joerg Reuter DL1BKE (jreuter@poboxes.com)\n");
+ printk(KERN_INFO "Copyright 1993,1998 Joerg Reuter DL1BKE (jreuter@poboxes.com)\n");
return result;
}
diff --git a/drivers/net/hamradio/soundmodem/.cvsignore b/drivers/net/hamradio/soundmodem/.cvsignore
deleted file mode 100644
index 4671378ae..000000000
--- a/drivers/net/hamradio/soundmodem/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-.depend
diff --git a/drivers/net/hamradio/soundmodem/gentbl.c b/drivers/net/hamradio/soundmodem/gentbl.c
index d1dce6687..4750c18ee 100644
--- a/drivers/net/hamradio/soundmodem/gentbl.c
+++ b/drivers/net/hamradio/soundmodem/gentbl.c
@@ -200,7 +200,9 @@ static void gentbl_fsk9600(FILE *f)
? "\n\t" : "");
}
}
+#ifdef VERBOSE
fprintf(stderr, "fsk9600: txfilt4: min = %f; max = %f\n", min, max);
+#endif
fprintf(f, "\n};\n\n");
min = max = 0;
memset(c, 0, sizeof(c));
@@ -233,7 +235,9 @@ static void gentbl_fsk9600(FILE *f)
? "\n\t" : "");
}
}
+#ifdef VERBOSE
fprintf(stderr, "fsk9600: txfilt5: min = %f; max = %f\n", min, max);
+#endif
fprintf(f, "\n};\n\n");
}
@@ -466,7 +470,9 @@ static void gentbl_hapn4800(FILE *f)
? "\n\t" : "");
}
}
+#ifdef VERBOSE
fprintf(stderr, "hapn4800: txfilt8: min = %f; max = %f\n", min, max);
+#endif
fprintf(f, "\n};\n\n");
min = max = 0;
memset(c, 0, sizeof(c));
@@ -493,7 +499,9 @@ static void gentbl_hapn4800(FILE *f)
? "\n\t" : "");
}
}
+#ifdef VERBOSE
fprintf(stderr, "hapn4800: txfilt10: min = %f; max = %f\n", min, max);
+#endif
fprintf(f, "\n};\n\n");
/*
* secondly generate tables for the PM transmitter modulator
@@ -524,7 +532,9 @@ static void gentbl_hapn4800(FILE *f)
? "\n\t" : "");
}
}
+#ifdef VERBOSE
fprintf(stderr, "hapn4800: txfiltpm8: min = %f; max = %f\n", min, max);
+#endif
fprintf(f, "\n};\n\n");
min = max = 0;
memset(c, 0, sizeof(c));
@@ -552,7 +562,9 @@ static void gentbl_hapn4800(FILE *f)
? "\n\t" : "");
}
}
+#ifdef VERBOSE
fprintf(stderr, "hapn4800: txfiltpm10: min = %f; max = %f\n", min, max);
+#endif
fprintf(f, "\n};\n\n");
}
diff --git a/drivers/net/hamradio/soundmodem/sm.c b/drivers/net/hamradio/soundmodem/sm.c
index 171aecfc7..3423807ac 100644
--- a/drivers/net/hamradio/soundmodem/sm.c
+++ b/drivers/net/hamradio/soundmodem/sm.c
@@ -592,7 +592,7 @@ static int sm_ioctl(struct device *dev, struct ifreq *ifr,
return 0;
case HDLCDRVCTL_SETMODE:
- if (!suser() || dev->start)
+ if (dev->start || !suser())
return -EACCES;
hi->data.modename[sizeof(hi->data.modename)-1] = '\0';
return sethw(dev, sm, hi->data.modename);