diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1998-03-17 22:05:47 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1998-03-17 22:05:47 +0000 |
commit | 27cfca1ec98e91261b1a5355d10a8996464b63af (patch) | |
tree | 8e895a53e372fa682b4c0a585b9377d67ed70d0e /drivers/net/hamradio | |
parent | 6a76fb7214c477ccf6582bd79c5b4ccc4f9c41b1 (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/.cvsignore | 1 | ||||
-rw-r--r-- | drivers/net/hamradio/Config.in | 80 | ||||
-rw-r--r-- | drivers/net/hamradio/Makefile | 8 | ||||
-rw-r--r-- | drivers/net/hamradio/baycom_par.c | 8 | ||||
-rw-r--r-- | drivers/net/hamradio/baycom_ser_fdx.c | 2 | ||||
-rw-r--r-- | drivers/net/hamradio/baycom_ser_hdx.c | 2 | ||||
-rw-r--r-- | drivers/net/hamradio/bpqether.c | 24 | ||||
-rw-r--r-- | drivers/net/hamradio/dmascc.c | 137 | ||||
-rw-r--r-- | drivers/net/hamradio/hdlcdrv.c | 8 | ||||
-rw-r--r-- | drivers/net/hamradio/mkiss.c | 2 | ||||
-rw-r--r-- | drivers/net/hamradio/pi2.c | 8 | ||||
-rw-r--r-- | drivers/net/hamradio/pt.c | 6 | ||||
-rw-r--r-- | drivers/net/hamradio/scc.c | 59 | ||||
-rw-r--r-- | drivers/net/hamradio/soundmodem/.cvsignore | 1 | ||||
-rw-r--r-- | drivers/net/hamradio/soundmodem/gentbl.c | 12 | ||||
-rw-r--r-- | drivers/net/hamradio/soundmodem/sm.c | 2 |
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); |