patch-2.3.13 linux/drivers/char/hfmodem/main.c
Next file: linux/drivers/char/hfmodem/modem.c
Previous file: linux/drivers/char/hfmodem/gentbl.c
Back to the patch index
Back to the overall index
- Lines: 735
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.3.12/linux/drivers/char/hfmodem/main.c
- Orig date:
Thu Jul 8 15:42:20 1999
diff -u --recursive --new-file v2.3.12/linux/drivers/char/hfmodem/main.c linux/drivers/char/hfmodem/main.c
@@ -1,734 +0,0 @@
-/*****************************************************************************/
-
-/*
- * main.c -- Linux soundcard HF FSK driver.
- *
- * Copyright (C) 1997 Thomas Sailer (sailer@ife.ee.ethz.ch)
- * Swiss Federal Institute of Technology (ETH), Electronics Lab
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * Command line options (insmod command line)
- *
- * History:
- * 0.1 15.04.97 Adapted from baycom.c and made network driver interface
- * 0.2 05.07.97 All floating point stuff thrown out due to Linus' rantings :)
- *
- */
-
-/*****************************************************************************/
-
-
-#include <linux/config.h> /* for CONFIG_HFMODEM_WSS and CONFIG_HFMODEM_SBC */
-#include <linux/module.h>
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/malloc.h>
-#include <linux/errno.h>
-#include <linux/miscdevice.h>
-#include <linux/ioport.h>
-#include <linux/hfmodem.h>
-
-#include <asm/io.h>
-#include <asm/segment.h>
-#include <asm/system.h>
-#include <asm/irq.h>
-#include <asm/dma.h>
-
-/* --------------------------------------------------------------------- */
-
-/*
- * currently this module is supposed to support both module styles, i.e.
- * the old one present up to about 2.1.9, and the new one functioning
- * starting with 2.1.21. The reason is I have a kit allowing to compile
- * this module also under 2.0.x which was requested by several people.
- * This will go in 2.2
- */
-#include <linux/version.h>
-
-#if LINUX_VERSION_CODE >= 0x20100
-#include <asm/uaccess.h>
-#else
-#include <linux/mm.h>
-
-#undef put_user
-#undef get_user
-
-#define put_user(x,ptr) ({ __put_user((unsigned long)(x),(ptr),sizeof(*(ptr))); 0; })
-#define get_user(x,ptr) ({ x = ((__typeof__(*(ptr)))__get_user((ptr),sizeof(*(ptr)))); 0; })
-
-extern inline int copy_from_user(void *to, const void *from, unsigned long n)
-{
- int i = verify_area(VERIFY_READ, from, n);
- if (i)
- return i;
- memcpy_fromfs(to, from, n);
- return 0;
-}
-
-extern inline int copy_to_user(void *to, const void *from, unsigned long n)
-{
- int i = verify_area(VERIFY_WRITE, to, n);
- if (i)
- return i;
- memcpy_tofs(to, from, n);
- return 0;
-}
-#endif
-
-#if LINUX_VERSION_CODE >= 0x20123
-#include <linux/init.h>
-#else
-#define __init
-#define __initdata
-#define __initfunc(x) x
-#endif
-
-/* --------------------------------------------------------------------- */
-
-/*static*/ const char hfmodem_drvname[] = "hfmodem";
-static const char hfmodem_drvinfo[] = KERN_INFO "hfmodem: (C) 1997 Thomas Sailer, HB9JNX/AE4WA\n"
-KERN_INFO "hfmodem: version 0.2 compiled " __TIME__ " " __DATE__ "\n";
-
-/* --------------------------------------------------------------------- */
-/*
- * currently we support only one device
- */
-
-struct hfmodem_state hfmodem_state[NR_DEVICE];
-
-/* --------------------------------------------------------------------- */
-/*
- * ===================== port checking routines ========================
- */
-
-
-#define UART_RBR(iobase) (iobase+0)
-#define UART_THR(iobase) (iobase+0)
-#define UART_IER(iobase) (iobase+1)
-#define UART_IIR(iobase) (iobase+2)
-#define UART_FCR(iobase) (iobase+2)
-#define UART_LCR(iobase) (iobase+3)
-#define UART_MCR(iobase) (iobase+4)
-#define UART_LSR(iobase) (iobase+5)
-#define UART_MSR(iobase) (iobase+6)
-#define UART_SCR(iobase) (iobase+7)
-#define UART_DLL(iobase) (iobase+0)
-#define UART_DLM(iobase) (iobase+1)
-
-#define SER_EXTENT 8
-
-#define LPT_DATA(iobase) (iobase+0)
-#define LPT_STATUS(iobase) (iobase+1)
-#define LPT_CONTROL(iobase) (iobase+2)
-#define LPT_IRQ_ENABLE 0x10
-
-#define MIDI_DATA(iobase) (iobase)
-#define MIDI_STATUS(iobase) (iobase+1)
-#define MIDI_READ_FULL 0x80 /* attention: negative logic!! */
-#define MIDI_WRITE_EMPTY 0x40 /* attention: negative logic!! */
-
-#define MIDI_EXTENT 2
-
-#define SP_SER 1
-#define SP_PAR 2
-#define SP_MIDI 4
-
-/* --------------------------------------------------------------------- */
-
-static void parptt_wakeup(void *handle)
-{
- struct hfmodem_state *dev = (struct hfmodem_state *)handle;
-
- printk(KERN_DEBUG "%s: parptt: why am I being woken up?\n", hfmodem_drvname);
- if (!parport_claim(dev->ptt_out.pardev))
- printk(KERN_DEBUG "%s: parptt: I'm broken.\n", hfmodem_drvname);
-}
-
-/* --------------------------------------------------------------------- */
-static int __init check_lpt(struct hfmodem_state *dev, unsigned int iobase)
-{
- struct parport *pp = parport_enumerate();
-
- while (pp && pp->base != iobase)
- pp = pp->next;
- if (!pp)
- return 0;
- if (!(dev->ptt_out.pardev = parport_register_device(pp, hfmodem_drvname, NULL, parptt_wakeup,
- NULL, PARPORT_DEV_EXCL, dev)))
- return 0;
- return 1;
-}
-
-/* --------------------------------------------------------------------- */
-
-enum uart { c_uart_unknown, c_uart_8250, c_uart_16450, c_uart_16550, c_uart_16550A };
-static const char *uart_str[] __initdata = { "unknown", "8250", "16450", "16550", "16550A" };
-
-static enum uart __init check_uart(unsigned int iobase)
-{
- unsigned char b1,b2,b3;
- enum uart u;
- enum uart uart_tab[] = { c_uart_16450, c_uart_unknown, c_uart_16550, c_uart_16550A };
-
- if (iobase <= 0 || iobase > 0x1000-SER_EXTENT)
- return c_uart_unknown;
- if (check_region(iobase, SER_EXTENT))
- return c_uart_unknown;
- b1 = inb(UART_MCR(iobase));
- outb(b1 | 0x10, UART_MCR(iobase)); /* loopback mode */
- b2 = inb(UART_MSR(iobase));
- outb(0x1a, UART_MCR(iobase));
- b3 = inb(UART_MSR(iobase)) & 0xf0;
- outb(b1, UART_MCR(iobase)); /* restore old values */
- outb(b2, UART_MSR(iobase));
- if (b3 != 0x90)
- return c_uart_unknown;
- inb(UART_RBR(iobase));
- inb(UART_RBR(iobase));
- outb(0x01, UART_FCR(iobase)); /* enable FIFOs */
- u = uart_tab[(inb(UART_IIR(iobase)) >> 6) & 3];
- if (u == c_uart_16450) {
- outb(0x5a, UART_SCR(iobase));
- b1 = inb(UART_SCR(iobase));
- outb(0xa5, UART_SCR(iobase));
- b2 = inb(UART_SCR(iobase));
- if ((b1 != 0x5a) || (b2 != 0xa5))
- u = c_uart_8250;
- }
- return u;
-}
-
-/* --------------------------------------------------------------------- */
-
-static int __init check_midi(unsigned int iobase)
-{
- unsigned long timeout;
- unsigned long flags;
- unsigned char b;
-
- if (iobase <= 0 || iobase > 0x1000-MIDI_EXTENT)
- return 0;
- if (check_region(iobase, MIDI_EXTENT))
- return 0;
- timeout = jiffies + (HZ / 100);
- while (inb(MIDI_STATUS(iobase)) & MIDI_WRITE_EMPTY)
- if ((signed)(jiffies - timeout) > 0)
- return 0;
- save_flags(flags);
- cli();
- outb(0xff, MIDI_DATA(iobase));
- b = inb(MIDI_STATUS(iobase));
- restore_flags(flags);
- if (!(b & MIDI_WRITE_EMPTY))
- return 0;
- while (inb(MIDI_STATUS(iobase)) & MIDI_WRITE_EMPTY)
- if ((signed)(jiffies - timeout) > 0)
- return 0;
- return 1;
-}
-
-/* --------------------------------------------------------------------- */
-
-static void output_status(struct hfmodem_state *dev, int ptt)
-{
- int dcd = 0;
-
- ptt = !!ptt;
- if (dev->ptt_out.flags & SP_SER) {
- outb(dcd | (ptt << 1), UART_MCR(dev->ptt_out.seriobase));
- outb(0x40 & (-ptt), UART_LCR(dev->ptt_out.seriobase));
- }
- if (dev->ptt_out.flags & SP_PAR) {
- outb(ptt | (dcd << 1), LPT_DATA(dev->ptt_out.pariobase));
- }
- if (dev->ptt_out.flags & SP_MIDI && ptt) {
- outb(0, MIDI_DATA(dev->ptt_out.midiiobase));
- }
-}
-
-/* --------------------------------------------------------------------- */
-
-static void __init output_check(struct hfmodem_state *dev)
-{
- enum uart u = c_uart_unknown;
-
- if (((u = check_uart(dev->ptt_out.seriobase))) != c_uart_unknown)
- printk(KERN_INFO "%s: PTT output: uart found at address 0x%x type %s\n",
- hfmodem_drvname, dev->ptt_out.seriobase, uart_str[u]);
- else {
- if (dev->ptt_out.seriobase > 0)
- printk(KERN_WARNING "%s: PTT output: no uart found at address 0x%x\n",
- hfmodem_drvname, dev->ptt_out.seriobase);
- dev->ptt_out.seriobase = 0;
- }
- if (check_lpt(dev, dev->ptt_out.pariobase))
- printk(KERN_INFO "%s: PTT output: parallel port found at address 0x%x\n",
- hfmodem_drvname, dev->ptt_out.pariobase);
- else {
- if (dev->ptt_out.pariobase > 0)
- printk(KERN_WARNING "%s: PTT output: no parallel port found at address 0x%x\n",
- hfmodem_drvname, dev->ptt_out.pariobase);
- dev->ptt_out.pariobase = 0;
- dev->ptt_out.pardev = NULL;
- }
- if (dev->ptt_out.midiiobase > 0 && dev->ptt_out.midiiobase <= 0x1000-MIDI_EXTENT &&
- check_midi(dev->ptt_out.midiiobase))
- printk(KERN_INFO "%s: PTT output: midi port found at address 0x%x\n",
- hfmodem_drvname, dev->ptt_out.midiiobase);
- else {
- if (dev->ptt_out.midiiobase > 0)
- printk(KERN_WARNING "%s: PTT output: no midi port found at address 0x%x\n",
- hfmodem_drvname, dev->ptt_out.midiiobase);
- dev->ptt_out.midiiobase = 0;
- }
-}
-
-/* --------------------------------------------------------------------- */
-
-static void output_open(struct hfmodem_state *dev)
-{
- dev->ptt_out.flags = 0;
- if (dev->ptt_out.seriobase > 0) {
- if (!check_region(dev->ptt_out.seriobase, SER_EXTENT)) {
- request_region(dev->ptt_out.seriobase, SER_EXTENT, "hfmodem ser ptt");
- dev->ptt_out.flags |= SP_SER;
- outb(0, UART_IER(dev->ptt_out.seriobase));
- /* 5 bits, 1 stop, no parity, no break, Div latch access */
- outb(0x80, UART_LCR(dev->ptt_out.seriobase));
- outb(0, UART_DLM(dev->ptt_out.seriobase));
- outb(1, UART_DLL(dev->ptt_out.seriobase)); /* as fast as possible */
- /* LCR and MCR set by output_status */
- } else
- printk(KERN_WARNING "%s: PTT output: serial port at 0x%x busy\n",
- hfmodem_drvname, dev->ptt_out.seriobase);
- }
- if (dev->ptt_out.pariobase > 0) {
- if (parport_claim(dev->ptt_out.pardev))
- printk(KERN_WARNING "%s: PTT output: parallel port at 0x%x busy\n",
- hfmodem_drvname, dev->ptt_out.pariobase);
- else
- dev->ptt_out.flags |= SP_PAR;
- }
- if (dev->ptt_out.midiiobase > 0) {
- if (!check_region(dev->ptt_out.midiiobase, MIDI_EXTENT)) {
- request_region(dev->ptt_out.midiiobase, MIDI_EXTENT, "hfmodem midi ptt");
- dev->ptt_out.flags |= SP_MIDI;
- } else
- printk(KERN_WARNING "%s: PTT output: midi port at 0x%x busy\n",
- hfmodem_drvname, dev->ptt_out.midiiobase);
- }
- output_status(dev, 0);
- printk(KERN_INFO "%s: PTT output:", hfmodem_drvname);
- if (dev->ptt_out.flags & SP_SER)
- printk(" serial interface at 0x%x", dev->ptt_out.seriobase);
- if (dev->ptt_out.flags & SP_PAR)
- printk(" parallel interface at 0x%x", dev->ptt_out.pariobase);
- if (dev->ptt_out.flags & SP_MIDI)
- printk(" mpu401 (midi) interface at 0x%x", dev->ptt_out.midiiobase);
- if (!dev->ptt_out.flags)
- printk(" none");
- printk("\n");
-}
-
-/* --------------------------------------------------------------------- */
-
-static void output_close(struct hfmodem_state *dev)
-{
- /* release regions used for PTT output */
- output_status(dev, 0);
- if (dev->ptt_out.flags & SP_SER)
- release_region(dev->ptt_out.seriobase, SER_EXTENT);
- if (dev->ptt_out.flags & SP_PAR)
- parport_release(dev->ptt_out.pardev);
- if (dev->ptt_out.flags & SP_MIDI)
- release_region(dev->ptt_out.midiiobase, MIDI_EXTENT);
- dev->ptt_out.flags = 0;
-}
-
-/* --------------------------------------------------------------------- */
-
-#define INC_SAMPLE (1000000/HFMODEM_SRATE)
-#define INC_FRAGMENT (HFMODEM_FRAGSAMPLES*1000000/HFMODEM_SRATE)
-#define SIZE (HFMODEM_FRAGSAMPLES*HFMODEM_NUMFRAGS)
-
-static void hfmodem_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
- struct hfmodem_state *dev = (struct hfmodem_state *)dev_id;
- unsigned int dmaptr;
- __s16 *s;
- unsigned int curfrag, nfrags;
- int i;
- hfmodem_time_t l1time;
-
- dmaptr = dev->scops->intack(dev);
- l1time = hfmodem_refclock_current(dev, ((SIZE+dmaptr-dev->dma.last_dmaptr) % SIZE) *
- INC_SAMPLE, 1);
- curfrag = (dev->dma.last_dmaptr = dmaptr) / HFMODEM_FRAGSAMPLES;
- l1time -= INC_SAMPLE * (SIZE+dmaptr-dev->dma.fragptr*HFMODEM_FRAGSAMPLES) % SIZE;
- sti();
- /*
- * handle receiving
- */
- if (dev->dma.ptt_frames <= 0) {
- while (dev->dma.fragptr != curfrag) {
- if (dev->dma.fragptr < HFMODEM_EXCESSFRAGS) {
- s = dev->dma.buf + SIZE + HFMODEM_FRAGSAMPLES * dev->dma.fragptr;
- memcpy(s, s - SIZE, HFMODEM_FRAGSIZE);
- } else
- s = dev->dma.buf + HFMODEM_FRAGSAMPLES * dev->dma.fragptr;
- if (dev->sbuf.kbuf && dev->sbuf.kptr && dev->sbuf.rem > 0) {
- i = HFMODEM_FRAGSAMPLES;
- if (i > dev->sbuf.rem)
- i = dev->sbuf.rem;
- memcpy(dev->sbuf.kptr, s, i * sizeof(s[0]));
- dev->sbuf.rem -= i;
- dev->sbuf.kptr += i;
- }
- hfmodem_input_samples(dev, l1time, INC_SAMPLE, s);
- l1time += INC_FRAGMENT;
- dev->dma.fragptr++;
- if (dev->dma.fragptr >= HFMODEM_NUMFRAGS)
- dev->dma.fragptr = 0;
- }
- /*
- * check for output
- */
- if (hfmodem_next_tx_event(dev, l1time) > (long)INC_FRAGMENT/2)
- goto int_return;
- /*
- * start output
- */
- output_status(dev, 1);
- dev->scops->prepare_output(dev);
- dev->dma.last_dmaptr = 0;
- /*
- * clock adjust
- */
- l1time = hfmodem_refclock_current(dev, 0, 0);
- /*
- * fill first two fragments
- */
- dev->dma.ptt_frames = 1;
- for (i = 0; i < 2 && i < HFMODEM_NUMFRAGS; i++)
- if (hfmodem_output_samples(dev, l1time+i*INC_FRAGMENT, INC_SAMPLE,
- dev->dma.buf+i*HFMODEM_FRAGSAMPLES))
- dev->dma.ptt_frames = i + 1;
- dev->dma.lastfrag = 0;
- dev->scops->trigger_output(dev);
- /*
- * finish already pending rx requests
- */
- hfmodem_finish_pending_rx_requests(dev);
- goto int_return;
- }
- /*
- * handle transmitting
- */
- nfrags = HFMODEM_NUMFRAGS + curfrag - dev->dma.lastfrag;
- dev->dma.lastfrag = curfrag;
- if (nfrags >= HFMODEM_NUMFRAGS)
- nfrags -= HFMODEM_NUMFRAGS;
- dev->dma.ptt_frames -= nfrags;
- if (dev->dma.ptt_frames < 0)
- dev->dma.ptt_frames = 0;
- while (dev->dma.ptt_frames < HFMODEM_NUMFRAGS && dev->dma.ptt_frames < 4 &&
- hfmodem_output_samples(dev, l1time+dev->dma.ptt_frames*INC_FRAGMENT,
- INC_SAMPLE, dev->dma.buf + HFMODEM_FRAGSAMPLES *
- ((curfrag + dev->dma.ptt_frames) % HFMODEM_NUMFRAGS)))
- dev->dma.ptt_frames++;
- if (dev->dma.ptt_frames > 0)
- goto int_return;
- /*
- * start receiving
- */
- output_status(dev, 0);
- dev->dma.last_dmaptr = 0;
- dev->dma.lastfrag = 0;
- dev->dma.fragptr = 0;
- dev->dma.ptt_frames = 0;
- dev->scops->prepare_input(dev);
- dev->scops->trigger_input(dev);
- hfmodem_refclock_current(dev, 0, 0); /* needed to reset the time difference */
-int_return:
- hfmodem_wakeup(dev);
-}
-
-/* --------------------------------------------------------------------- */
-
-static int hfmodem_close(struct inode *inode, struct file *file)
-{
- struct hfmodem_state *dev = &hfmodem_state[0];
-
- if (!dev->active)
- return -EPERM;
- dev->active = 0;
- dev->scops->stop(dev);
- free_irq(dev->io.irq, dev);
- disable_dma(dev->io.dma);
- free_dma(dev->io.dma);
- release_region(dev->io.base_addr, dev->scops->extent);
- kfree_s(dev->dma.buf, HFMODEM_FRAGSIZE * (HFMODEM_NUMFRAGS+HFMODEM_EXCESSFRAGS));
- hfmodem_clear_rq(dev);
- if (dev->sbuf.kbuf) {
- kfree_s(dev->sbuf.kbuf, dev->sbuf.size);
- dev->sbuf.kbuf = dev->sbuf.kptr = NULL;
- dev->sbuf.size = dev->sbuf.rem = 0;
- }
- output_close(dev);
- MOD_DEC_USE_COUNT;
- return 0;
-}
-
-/* --------------------------------------------------------------------- */
-
-static int hfmodem_open(struct inode *inode, struct file *file)
-{
- struct hfmodem_state *dev = &hfmodem_state[0];
-
- if (dev->active)
- return -EBUSY;
- if (!dev->scops)
- return -EPERM;
- /*
- * clear vars
- */
- memset(&dev->l1, 0, sizeof(dev->l1));
- dev->dma.last_dmaptr = 0;
- dev->dma.lastfrag = 0;
- dev->dma.fragptr = 0;
- dev->dma.ptt_frames = 0;
- /*
- * allocate memory
- */
- if (!(dev->dma.buf = kmalloc(HFMODEM_FRAGSIZE * (HFMODEM_NUMFRAGS+HFMODEM_EXCESSFRAGS), GFP_KERNEL | GFP_DMA)))
- return -ENOMEM;
- /*
- * allocate resources
- */
- if (request_dma(dev->io.dma, hfmodem_drvname)) {
- kfree_s(dev->dma.buf, HFMODEM_FRAGSIZE * (HFMODEM_NUMFRAGS+HFMODEM_EXCESSFRAGS));
- return -EBUSY;
- }
- if (request_irq(dev->io.irq, hfmodem_interrupt, SA_INTERRUPT, hfmodem_drvname, dev)) {
- free_dma(dev->io.dma);
- kfree_s(dev->dma.buf, HFMODEM_FRAGSIZE * (HFMODEM_NUMFRAGS+HFMODEM_EXCESSFRAGS));
- return -EBUSY;
- }
- request_region(dev->io.base_addr, dev->scops->extent, hfmodem_drvname);
-
- /* clear requests */
- dev->active++;
- MOD_INC_USE_COUNT;
- hfmodem_refclock_init(dev);
- output_open(dev);
- dev->scops->init(dev);
- dev->scops->prepare_input(dev);
- dev->scops->trigger_input(dev);
- return 0;
-}
-
-/* --------------------------------------------------------------------- */
-
-static struct file_operations hfmodem_fops = {
- NULL, /* hfmodem_seek */
- NULL, /* hfmodem_read */
- NULL, /* hfmodem_write */
- NULL, /* hfmodem_readdir */
-#if LINUX_VERSION_CODE >= 0x20100
- hfmodem_poll, /* hfmodem_poll */
-#else
- hfmodem_select, /* hfmodem_select */
-#endif
- hfmodem_ioctl, /* hfmodem_ioctl */
- NULL, /* hfmodem_mmap */
- hfmodem_open, /* hfmodem_open */
- NULL, /* flush */
- hfmodem_close, /* hfmodem_close */
- NULL, /* hfmodem_fsync */
- NULL, /* hfmodem_fasync */
- NULL, /* hfmodem_check_media_change */
- NULL /* hfmodem_revalidate */
-};
-
-/* --------------------------------------------------------------------- */
-
-static struct miscdevice hfmodem_device = {
- HFMODEM_MINOR, hfmodem_drvname, &hfmodem_fops
-};
-
-/* --------------------------------------------------------------------- */
-
-#ifdef MODULE
-
-/*
- * Command line parameters
- */
-
-static int hw = 0;
-static unsigned int iobase = 0x220;
-static unsigned int irq = 7;
-static unsigned int dma = 1;
-
-static unsigned int serio = 0;
-static unsigned int pario = 0;
-static unsigned int midiio = 0;
-
-#if LINUX_VERSION_CODE >= 0x20115
-
-MODULE_PARM(hw, "i");
-MODULE_PARM_DESC(hw, "hardware type: 0=SBC, 1=WSS");
-MODULE_PARM(iobase, "i");
-MODULE_PARM_DESC(iobase, "io base address");
-MODULE_PARM(irq, "i");
-MODULE_PARM_DESC(irq, "interrupt number");
-MODULE_PARM(dma, "i");
-MODULE_PARM_DESC(dma, "dma number (>=4 for SB16/32/64/etc, <=3 for the rest)");
-MODULE_PARM(serio, "i");
-MODULE_PARM_DESC(serio, "address of serial port to output PTT");
-MODULE_PARM(pario, "i");
-MODULE_PARM_DESC(pario, "address of parallel port to output PTT");
-MODULE_PARM(midiio, "i");
-MODULE_PARM_DESC(midiio, "address of midi (MPU401) port to output PTT");
-
-MODULE_AUTHOR("Thomas M. Sailer, sailer@ife.ee.ethz.ch, hb9jnx@hb9w.che.eu");
-MODULE_DESCRIPTION("HF FSK modem code");
-
-/* these are the module parameters from refclock.c */
-
-MODULE_PARM(scale_tvusec, "i");
-MODULE_PARM_DESC(scale_tvusec, "Scaling value for the tv_usec field (can be obta
-ined by refclock)");
-
-#ifdef __i386__
-MODULE_PARM(scale_rdtsc, "i");
-MODULE_PARM_DESC(scale_rdtsc, "Scaling value for the rdtsc counter (can be obtai
-ned by refclock)");
-MODULE_PARM(rdtsc_ok, "i");
-MODULE_PARM_DESC(rdtsc_ok, "Set to 0 to disable the use of the rdtsc instruction
-");
-#endif /* __i386__ */
-
-#endif
-
-int __init init_module(void)
-{
- int i;
-
- printk(hfmodem_drvinfo);
- memset(hfmodem_state, 0, sizeof(hfmodem_state));
- memset(hfmodem_correlator_cache, 0, sizeof(hfmodem_correlator_cache));
- hfmodem_state[0].io.base_addr = iobase;
- hfmodem_state[0].io.irq = irq;
- hfmodem_state[0].io.dma = dma;
- hfmodem_state[0].ptt_out.seriobase = serio;
- hfmodem_state[0].ptt_out.pariobase = pario;
- hfmodem_state[0].ptt_out.midiiobase = midiio;
- init_waitqueue_head(&hfmodem_state[0].wait);
- hfmodem_refclock_probe();
- output_check(&hfmodem_state[0]);
-#if defined(CONFIG_HFMODEM_WSS) && defined(CONFIG_HFMODEM_SBC)
- if (hw)
- i = hfmodem_wssprobe(&hfmodem_state[0]);
- else
- i = hfmodem_sbcprobe(&hfmodem_state[0]);
-#else
- i = -EINVAL;
-#ifdef CONFIG_HFMODEM_WSS
- i = hfmodem_wssprobe(&hfmodem_state[0]);
-#endif
-#ifdef CONFIG_HFMODEM_SBC
- i = hfmodem_sbcprobe(&hfmodem_state[0]);
-#endif
-#endif
- if (i)
- return i;
- if ((i = misc_register(&hfmodem_device))) {
- printk(KERN_ERR "%s: cannot register misc device\n", hfmodem_drvname);
- return i;
- }
- return 0;
-}
-
-void cleanup_module(void)
-{
- struct hfmodem_state *dev = &hfmodem_state[0];
-
- if (dev->ptt_out.pariobase > 0)
- parport_unregister_device(dev->ptt_out.pardev);
- misc_deregister(&hfmodem_device);
-}
-
-#else /* MODULE */
-/* --------------------------------------------------------------------- */
-
-static int hw = 0;
-
-void __init hfmodem_setup(char *str, int *ints)
-{
- if (ints[0] < 7) {
- printk(KERN_WARNING "%s: setup: too few parameters\n", hfmodem_drvname);
- return;
- }
- memset(hfmodem_state, 0, sizeof(hfmodem_state));
- memset(hfmodem_correlator_cache, 0, sizeof(hfmodem_correlator_cache));
- hw = ints[1];
- hfmodem_state[0].io.base_addr = ints[2];
- hfmodem_state[0].io.irq = ints[3];
- hfmodem_state[0].io.dma = ints[4];
- if (ints[0] >= 8)
- hfmodem_state[0].ptt_out.seriobase = ints[5];
- if (ints[0] >= 9)
- hfmodem_state[0].ptt_out.pariobase = ints[6];
- if (ints[0] >= 10)
- hfmodem_state[0].ptt_out.midiiobase = ints[7];
- hfmodem_refclock_setscale(ints[ints[0]-2], ints[ints[0]-1], ints[ints[0]]);
-}
-
-void __init hfmodem_init(void)
-{
- int i;
-
- printk(hfmodem_drvinfo);
- init_waitqueue_head(&hfmode_state[0].wait);
- hfmodem_refclock_probe();
- output_check(&hfmodem_state[0]);
-#if defined(CONFIG_HFMODEM_WSS) && defined(CONFIG_HFMODEM_SBC)
- if (hw)
- i = hfmodem_wssprobe(&hfmodem_state[0]);
- else
- i = hfmodem_sbcprobe(&hfmodem_state[0]);
-#else
- i = -EINVAL;
-#ifdef CONFIG_HFMODEM_WSS
- i = hfmodem_wssprobe(&hfmodem_state[0]);
-#endif
-#ifdef CONFIG_HFMODEM_SBC
- i = hfmodem_sbcprobe(&hfmodem_state[0]);
-#endif
-#endif
- if (i) {
- printk(KERN_ERR "%s: soundcard probe failed\n", hfmodem_drvname);
- return;
- }
- if ((i = misc_register(&hfmodem_device))) {
- printk(KERN_ERR "%s: cannot register misc device\n", hfmodem_drvname);
- return;
- }
-}
-
-/* --------------------------------------------------------------------- */
-#endif /* MODULE */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)