Message ID | 2948626.r4RdgunA3R@wuerfel |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Acked, as long nobody with this card speaks up. I never managed to get one of these cards. Am 30.11.2015 um 11:34 schrieb Arnd Bergmann: > The 'sc' ISDN driver relies on using readl() to access ISA I/O memory. > This has been deprecated and produced warnings since linux-2.3.23, > disabled by default since 2.4.10 and finally removed in 2.6.5. > > I found this because the compiling the driver for ARM produces > a warning: > > In file included from ../drivers/isdn/sc/includes.h:8:0, > from ../drivers/isdn/sc/init.c:13: > ../arch/arm/include/asm/io.h:115:21: note: expected 'const volatile void *' but argument is of type 'long unsigned int' > > It is pretty clear that this driver has not been used for a long time > and there is no point fixing it now, so let's remove it. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > There has been some discussion about removing all the ISA based ISDN > drivers in the past. I'm not trying to restart that discussion at the > moment, and I did not find the same bug in the other drivers, so > let's just remove this one for now. > > drivers/isdn/Makefile | 1 - > drivers/isdn/i4l/Kconfig | 2 - > drivers/isdn/sc/Kconfig | 8 - > drivers/isdn/sc/Makefile | 10 - > drivers/isdn/sc/card.h | 131 ---------- > drivers/isdn/sc/command.c | 363 --------------------------- > drivers/isdn/sc/event.c | 68 ------ > drivers/isdn/sc/hardware.h | 110 --------- > drivers/isdn/sc/includes.h | 16 -- > drivers/isdn/sc/init.c | 549 ----------------------------------------- > drivers/isdn/sc/interrupt.c | 247 ------------------- > drivers/isdn/sc/ioctl.c | 582 -------------------------------------------- > drivers/isdn/sc/message.c | 230 ----------------- > drivers/isdn/sc/message.h | 245 ------------------- > drivers/isdn/sc/packet.c | 204 ---------------- > drivers/isdn/sc/scioc.h | 110 --------- > drivers/isdn/sc/shmem.c | 138 ----------- > drivers/isdn/sc/timer.c | 122 ---------- > 18 files changed, 3136 deletions(-) > > diff --git a/drivers/isdn/Makefile b/drivers/isdn/Makefile > index f1f777570e8e..91c81965e7ca 100644 > --- a/drivers/isdn/Makefile > +++ b/drivers/isdn/Makefile > @@ -10,7 +10,6 @@ obj-$(CONFIG_ISDN_DIVERSION) += divert/ > obj-$(CONFIG_ISDN_DRV_HISAX) += hisax/ > obj-$(CONFIG_ISDN_DRV_ICN) += icn/ > obj-$(CONFIG_ISDN_DRV_PCBIT) += pcbit/ > -obj-$(CONFIG_ISDN_DRV_SC) += sc/ > obj-$(CONFIG_ISDN_DRV_LOOP) += isdnloop/ > obj-$(CONFIG_ISDN_DRV_ACT2000) += act2000/ > obj-$(CONFIG_HYSDN) += hysdn/ > diff --git a/drivers/isdn/i4l/Kconfig b/drivers/isdn/i4l/Kconfig > index 9c6650ea848e..f5b714cd7618 100644 > --- a/drivers/isdn/i4l/Kconfig > +++ b/drivers/isdn/i4l/Kconfig > @@ -130,8 +130,6 @@ source "drivers/isdn/icn/Kconfig" > > source "drivers/isdn/pcbit/Kconfig" > > -source "drivers/isdn/sc/Kconfig" > - > source "drivers/isdn/act2000/Kconfig" > > endmenu > diff --git a/drivers/isdn/sc/Kconfig b/drivers/isdn/sc/Kconfig > deleted file mode 100644 > index 7469863a7925..000000000000 > --- a/drivers/isdn/sc/Kconfig > +++ /dev/null > @@ -1,8 +0,0 @@ > -config ISDN_DRV_SC > - tristate "Spellcaster support" > - depends on ISA > - help > - This enables support for the Spellcaster BRI ISDN boards. This > - driver currently builds only in a modularized version. > - To build it, choose M here: the module will be called sc. > - See <file:Documentation/isdn/README.sc> for more information. > diff --git a/drivers/isdn/sc/Makefile b/drivers/isdn/sc/Makefile > deleted file mode 100644 > index 0f2b7d602ac0..000000000000 > --- a/drivers/isdn/sc/Makefile > +++ /dev/null > @@ -1,10 +0,0 @@ > -# Makefile for the sc ISDN device driver > - > -# Each configuration option enables a list of files. > - > -obj-$(CONFIG_ISDN_DRV_SC) += sc.o > - > -# Multipart objects. > - > -sc-y := shmem.o init.o packet.o command.o event.o \ > - ioctl.o interrupt.o message.o timer.o > diff --git a/drivers/isdn/sc/card.h b/drivers/isdn/sc/card.h > deleted file mode 100644 > index 3da69ee43da7..000000000000 > --- a/drivers/isdn/sc/card.h > +++ /dev/null > @@ -1,131 +0,0 @@ > -/* $Id: card.h,v 1.1.10.1 2001/09/23 22:24:59 kai Exp $ > - * > - * Driver parameters for SpellCaster ISA ISDN adapters > - * > - * Copyright (C) 1996 SpellCaster Telecommunications Inc. > - * > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - * For more information, please contact gpl-info@spellcast.com or write: > - * > - * SpellCaster Telecommunications Inc. > - * 5621 Finch Avenue East, Unit #3 > - * Scarborough, Ontario Canada > - * M1B 2T9 > - * +1 (416) 297-8565 > - * +1 (416) 297-6433 Facsimile > - */ > - > -#ifndef CARD_H > -#define CARD_H > - > -/* > - * We need these if they're not already included > - */ > -#include <linux/timer.h> > -#include <linux/time.h> > -#include <linux/isdnif.h> > -#include <linux/irqreturn.h> > -#include "message.h" > -#include "scioc.h" > - > -/* > - * Amount of time to wait for a reset to complete > - */ > -#define CHECKRESET_TIME msecs_to_jiffies(4000) > - > -/* > - * Amount of time between line status checks > - */ > -#define CHECKSTAT_TIME msecs_to_jiffies(8000) > - > -/* > - * The maximum amount of time to wait for a message response > - * to arrive. Use exclusively by send_and_receive > - */ > -#define SAR_TIMEOUT msecs_to_jiffies(10000) > - > -/* > - * Macro to determine is a card id is valid > - */ > -#define IS_VALID_CARD(x) ((x >= 0) && (x <= cinst)) > - > -/* > - * Per channel status and configuration > - */ > -typedef struct { > - int l2_proto; > - int l3_proto; > - char dn[50]; > - unsigned long first_sendbuf; /* Offset of first send buffer */ > - unsigned int num_sendbufs; /* Number of send buffers */ > - unsigned int free_sendbufs; /* Number of free sendbufs */ > - unsigned int next_sendbuf; /* Next sequential buffer */ > - char eazlist[50]; /* Set with SETEAZ */ > - char sillist[50]; /* Set with SETSIL */ > - int eazclear; /* Don't accept calls if TRUE */ > -} bchan; > - > -/* > - * Everything you want to know about the adapter ... > - */ > -typedef struct { > - int model; > - int driverId; /* LL Id */ > - char devicename[20]; /* The device name */ > - isdn_if *card; /* ISDN4Linux structure */ > - bchan *channel; /* status of the B channels */ > - char nChannels; /* Number of channels */ > - unsigned int interrupt; /* Interrupt number */ > - int iobase; /* I/O Base address */ > - int ioport[MAX_IO_REGS]; /* Index to I/O ports */ > - int shmem_pgport; /* port for the exp mem page reg. */ > - int shmem_magic; /* adapter magic number */ > - unsigned int rambase; /* Shared RAM base address */ > - unsigned int ramsize; /* Size of shared memory */ > - RspMessage async_msg; /* Async response message */ > - int want_async_messages; /* Snoop the Q ? */ > - unsigned char seq_no; /* Next send seq. number */ > - struct timer_list reset_timer; /* Check reset timer */ > - struct timer_list stat_timer; /* Check startproc timer */ > - unsigned char nphystat; /* Latest PhyStat info */ > - unsigned char phystat; /* Last PhyStat info */ > - HWConfig_pl hwconfig; /* Hardware config info */ > - char load_ver[11]; /* CommManage Version string */ > - char proc_ver[11]; /* CommEngine Version */ > - int StartOnReset; /* Indicates startproc after reset */ > - int EngineUp; /* Indicates CommEngine Up */ > - int trace_mode; /* Indicate if tracing is on */ > - spinlock_t lock; /* local lock */ > -} board; > - > - > -extern board *sc_adapter[]; > -extern int cinst; > - > -void memcpy_toshmem(int card, void *dest, const void *src, size_t n); > -void memcpy_fromshmem(int card, void *dest, const void *src, size_t n); > -int get_card_from_id(int driver); > -int indicate_status(int card, int event, ulong Channel, char *Data); > -irqreturn_t interrupt_handler(int interrupt, void *cardptr); > -int sndpkt(int devId, int channel, int ack, struct sk_buff *data); > -void rcvpkt(int card, RspMessage *rcvmsg); > -int command(isdn_ctrl *cmd); > -int reset(int card); > -int startproc(int card); > -int send_and_receive(int card, unsigned int procid, unsigned char type, > - unsigned char class, unsigned char code, > - unsigned char link, unsigned char data_len, > - unsigned char *data, RspMessage *mesgdata, int timeout); > -void flushreadfifo(int card); > -int sendmessage(int card, unsigned int procid, unsigned int type, > - unsigned int class, unsigned int code, unsigned int link, > - unsigned int data_len, unsigned int *data); > -int receivemessage(int card, RspMessage *rspmsg); > -int sc_ioctl(int card, scs_ioctl *data); > -int setup_buffers(int card, int c); > -void sc_check_reset(unsigned long data); > -void check_phystat(unsigned long data); > - > -#endif /* CARD_H */ > diff --git a/drivers/isdn/sc/command.c b/drivers/isdn/sc/command.c > deleted file mode 100644 > index 4a4e66152ce7..000000000000 > --- a/drivers/isdn/sc/command.c > +++ /dev/null > @@ -1,363 +0,0 @@ > -/* $Id: command.c,v 1.4.10.1 2001/09/23 22:24:59 kai Exp $ > - * > - * Copyright (C) 1996 SpellCaster Telecommunications Inc. > - * > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - * For more information, please contact gpl-info@spellcast.com or write: > - * > - * SpellCaster Telecommunications Inc. > - * 5621 Finch Avenue East, Unit #3 > - * Scarborough, Ontario Canada > - * M1B 2T9 > - * +1 (416) 297-8565 > - * +1 (416) 297-6433 Facsimile > - */ > - > -#include <linux/module.h> > -#include "includes.h" /* This must be first */ > -#include "hardware.h" > -#include "message.h" > -#include "card.h" > -#include "scioc.h" > - > -static int dial(int card, unsigned long channel, setup_parm setup); > -static int hangup(int card, unsigned long channel); > -static int answer(int card, unsigned long channel); > -static int clreaz(int card, unsigned long channel); > -static int seteaz(int card, unsigned long channel, char *); > -static int setl2(int card, unsigned long arg); > -static int setl3(int card, unsigned long arg); > -static int acceptb(int card, unsigned long channel); > - > -#ifdef DEBUG > -/* > - * Translate command codes to strings > - */ > -static char *commands[] = { "ISDN_CMD_IOCTL", > - "ISDN_CMD_DIAL", > - "ISDN_CMD_ACCEPTB", > - "ISDN_CMD_ACCEPTB", > - "ISDN_CMD_HANGUP", > - "ISDN_CMD_CLREAZ", > - "ISDN_CMD_SETEAZ", > - NULL, > - NULL, > - NULL, > - "ISDN_CMD_SETL2", > - NULL, > - "ISDN_CMD_SETL3", > - NULL, > - NULL, > - NULL, > - NULL, > - NULL, }; > - > -/* > - * Translates ISDN4Linux protocol codes to strings for debug messages > - */ > -static char *l3protos[] = { "ISDN_PROTO_L3_TRANS" }; > -static char *l2protos[] = { "ISDN_PROTO_L2_X75I", > - "ISDN_PROTO_L2_X75UI", > - "ISDN_PROTO_L2_X75BUI", > - "ISDN_PROTO_L2_HDLC", > - "ISDN_PROTO_L2_TRANS" }; > -#endif > - > -int get_card_from_id(int driver) > -{ > - int i; > - > - for (i = 0; i < cinst; i++) { > - if (sc_adapter[i]->driverId == driver) > - return i; > - } > - return -ENODEV; > -} > - > -/* > - * command > - */ > - > -int command(isdn_ctrl *cmd) > -{ > - int card; > - > - card = get_card_from_id(cmd->driver); > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - > - /* > - * Dispatch the command > - */ > - switch (cmd->command) { > - case ISDN_CMD_IOCTL: > - { > - unsigned long cmdptr; > - scs_ioctl ioc; > - > - memcpy(&cmdptr, cmd->parm.num, sizeof(unsigned long)); > - if (copy_from_user(&ioc, (scs_ioctl __user *)cmdptr, > - sizeof(scs_ioctl))) { > - pr_debug("%s: Failed to verify user space 0x%lx\n", > - sc_adapter[card]->devicename, cmdptr); > - return -EFAULT; > - } > - return sc_ioctl(card, &ioc); > - } > - case ISDN_CMD_DIAL: > - return dial(card, cmd->arg, cmd->parm.setup); > - case ISDN_CMD_HANGUP: > - return hangup(card, cmd->arg); > - case ISDN_CMD_ACCEPTD: > - return answer(card, cmd->arg); > - case ISDN_CMD_ACCEPTB: > - return acceptb(card, cmd->arg); > - case ISDN_CMD_CLREAZ: > - return clreaz(card, cmd->arg); > - case ISDN_CMD_SETEAZ: > - return seteaz(card, cmd->arg, cmd->parm.num); > - case ISDN_CMD_SETL2: > - return setl2(card, cmd->arg); > - case ISDN_CMD_SETL3: > - return setl3(card, cmd->arg); > - default: > - return -EINVAL; > - } > - return 0; > -} > - > -/* > - * start the onboard firmware > - */ > -int startproc(int card) > -{ > - int status; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - > - /* > - * send start msg > - */ > - status = sendmessage(card, CMPID, cmReqType2, > - cmReqClass0, > - cmReqStartProc, > - 0, 0, NULL); > - pr_debug("%s: Sent startProc\n", sc_adapter[card]->devicename); > - > - return status; > -} > - > - > -/* > - * Dials the number passed in > - */ > -static int dial(int card, unsigned long channel, setup_parm setup) > -{ > - int status; > - char Phone[48]; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - > - /*extract ISDN number to dial from eaz/msn string*/ > - strcpy(Phone, setup.phone); > - > - /*send the connection message*/ > - status = sendmessage(card, CEPID, ceReqTypePhy, > - ceReqClass1, > - ceReqPhyConnect, > - (unsigned char)channel + 1, > - strlen(Phone), > - (unsigned int *)Phone); > - > - pr_debug("%s: Dialing %s on channel %lu\n", > - sc_adapter[card]->devicename, Phone, channel + 1); > - > - return status; > -} > - > -/* > - * Answer an incoming call > - */ > -static int answer(int card, unsigned long channel) > -{ > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - > - if (setup_buffers(card, channel + 1)) { > - hangup(card, channel + 1); > - return -ENOBUFS; > - } > - > - indicate_status(card, ISDN_STAT_BCONN, channel, NULL); > - pr_debug("%s: Answered incoming call on channel %lu\n", > - sc_adapter[card]->devicename, channel + 1); > - return 0; > -} > - > -/* > - * Hangup up the call on specified channel > - */ > -static int hangup(int card, unsigned long channel) > -{ > - int status; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - > - status = sendmessage(card, CEPID, ceReqTypePhy, > - ceReqClass1, > - ceReqPhyDisconnect, > - (unsigned char)channel + 1, > - 0, > - NULL); > - pr_debug("%s: Sent HANGUP message to channel %lu\n", > - sc_adapter[card]->devicename, channel + 1); > - return status; > -} > - > -/* > - * Set the layer 2 protocol (X.25, HDLC, Raw) > - */ > -static int setl2(int card, unsigned long arg) > -{ > - int status = 0; > - int protocol, channel; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - protocol = arg >> 8; > - channel = arg & 0xff; > - sc_adapter[card]->channel[channel].l2_proto = protocol; > - > - /* > - * check that the adapter is also set to the correct protocol > - */ > - pr_debug("%s: Sending GetFrameFormat for channel %d\n", > - sc_adapter[card]->devicename, channel + 1); > - status = sendmessage(card, CEPID, ceReqTypeCall, > - ceReqClass0, > - ceReqCallGetFrameFormat, > - (unsigned char)channel + 1, > - 1, > - (unsigned int *)protocol); > - if (status) > - return status; > - return 0; > -} > - > -/* > - * Set the layer 3 protocol > - */ > -static int setl3(int card, unsigned long channel) > -{ > - int protocol = channel >> 8; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - > - sc_adapter[card]->channel[channel].l3_proto = protocol; > - return 0; > -} > - > -static int acceptb(int card, unsigned long channel) > -{ > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - > - if (setup_buffers(card, channel + 1)) > - { > - hangup(card, channel + 1); > - return -ENOBUFS; > - } > - > - pr_debug("%s: B-Channel connection accepted on channel %lu\n", > - sc_adapter[card]->devicename, channel + 1); > - indicate_status(card, ISDN_STAT_BCONN, channel, NULL); > - return 0; > -} > - > -static int clreaz(int card, unsigned long arg) > -{ > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - > - strcpy(sc_adapter[card]->channel[arg].eazlist, ""); > - sc_adapter[card]->channel[arg].eazclear = 1; > - pr_debug("%s: EAZ List cleared for channel %lu\n", > - sc_adapter[card]->devicename, arg + 1); > - return 0; > -} > - > -static int seteaz(int card, unsigned long arg, char *num) > -{ > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - > - strcpy(sc_adapter[card]->channel[arg].eazlist, num); > - sc_adapter[card]->channel[arg].eazclear = 0; > - pr_debug("%s: EAZ list for channel %lu set to: %s\n", > - sc_adapter[card]->devicename, arg + 1, > - sc_adapter[card]->channel[arg].eazlist); > - return 0; > -} > - > -int reset(int card) > -{ > - unsigned long flags; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - > - indicate_status(card, ISDN_STAT_STOP, 0, NULL); > - > - if (sc_adapter[card]->EngineUp) { > - del_timer(&sc_adapter[card]->stat_timer); > - } > - > - sc_adapter[card]->EngineUp = 0; > - > - spin_lock_irqsave(&sc_adapter[card]->lock, flags); > - init_timer(&sc_adapter[card]->reset_timer); > - sc_adapter[card]->reset_timer.function = sc_check_reset; > - sc_adapter[card]->reset_timer.data = card; > - sc_adapter[card]->reset_timer.expires = jiffies + CHECKRESET_TIME; > - add_timer(&sc_adapter[card]->reset_timer); > - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); > - > - outb(0x1, sc_adapter[card]->ioport[SFT_RESET]); > - > - pr_debug("%s: Adapter Reset\n", sc_adapter[card]->devicename); > - return 0; > -} > - > -void flushreadfifo(int card) > -{ > - while (inb(sc_adapter[card]->ioport[FIFO_STATUS]) & RF_HAS_DATA) > - inb(sc_adapter[card]->ioport[FIFO_READ]); > -} > diff --git a/drivers/isdn/sc/event.c b/drivers/isdn/sc/event.c > deleted file mode 100644 > index 833d96c2cf92..000000000000 > --- a/drivers/isdn/sc/event.c > +++ /dev/null > @@ -1,68 +0,0 @@ > -/* $Id: event.c,v 1.4.8.1 2001/09/23 22:24:59 kai Exp $ > - * > - * Copyright (C) 1996 SpellCaster Telecommunications Inc. > - * > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - * For more information, please contact gpl-info@spellcast.com or write: > - * > - * SpellCaster Telecommunications Inc. > - * 5621 Finch Avenue East, Unit #3 > - * Scarborough, Ontario Canada > - * M1B 2T9 > - * +1 (416) 297-8565 > - * +1 (416) 297-6433 Facsimile > - */ > - > -#include "includes.h" > -#include "hardware.h" > -#include "message.h" > -#include "card.h" > - > -#ifdef DEBUG > -static char *events[] = { "ISDN_STAT_STAVAIL", > - "ISDN_STAT_ICALL", > - "ISDN_STAT_RUN", > - "ISDN_STAT_STOP", > - "ISDN_STAT_DCONN", > - "ISDN_STAT_BCONN", > - "ISDN_STAT_DHUP", > - "ISDN_STAT_BHUP", > - "ISDN_STAT_CINF", > - "ISDN_STAT_LOAD", > - "ISDN_STAT_UNLOAD", > - "ISDN_STAT_BSENT", > - "ISDN_STAT_NODCH", > - "ISDN_STAT_ADDCH", > - "ISDN_STAT_CAUSE" }; > -#endif > - > -int indicate_status(int card, int event, ulong Channel, char *Data) > -{ > - isdn_ctrl cmd; > - > -#ifdef DEBUG > - pr_debug("%s: Indicating event %s on Channel %d\n", > - sc_adapter[card]->devicename, events[event - 256], Channel); > -#endif > - if (Data != NULL) { > - pr_debug("%s: Event data: %s\n", sc_adapter[card]->devicename, > - Data); > - switch (event) { > - case ISDN_STAT_BSENT: > - memcpy(&cmd.parm.length, Data, sizeof(cmd.parm.length)); > - break; > - case ISDN_STAT_ICALL: > - memcpy(&cmd.parm.setup, Data, sizeof(cmd.parm.setup)); > - break; > - default: > - strlcpy(cmd.parm.num, Data, sizeof(cmd.parm.num)); > - } > - } > - > - cmd.command = event; > - cmd.driver = sc_adapter[card]->driverId; > - cmd.arg = Channel; > - return sc_adapter[card]->card->statcallb(&cmd); > -} > diff --git a/drivers/isdn/sc/hardware.h b/drivers/isdn/sc/hardware.h > deleted file mode 100644 > index 81fbe78701f0..000000000000 > --- a/drivers/isdn/sc/hardware.h > +++ /dev/null > @@ -1,110 +0,0 @@ > -/* > - * Hardware specific macros, defines and structures > - * > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - */ > - > -#ifndef HARDWARE_H > -#define HARDWARE_H > - > -#include <asm/param.h> /* For HZ */ > - > -/* > - * General hardware parameters common to all ISA adapters > - */ > - > -#define MAX_CARDS 4 /* The maximum number of cards to > - control or probe for. */ > - > -#define SIGNATURE 0x87654321 /* Board reset signature */ > -#define SIG_OFFSET 0x1004 /* Where to find signature in shared RAM */ > -#define TRACE_OFFSET 0x1008 /* Trace enable word offset in shared RAM */ > -#define BUFFER_OFFSET 0x1800 /* Beginning of buffers */ > - > -/* I/O Port parameters */ > -#define IOBASE_MIN 0x180 /* Lowest I/O port address */ > -#define IOBASE_MAX 0x3C0 /* Highest I/O port address */ > -#define IOBASE_OFFSET 0x20 /* Inter-board I/O port gap used during > - probing */ > -#define FIFORD_OFFSET 0x0 > -#define FIFOWR_OFFSET 0x400 > -#define FIFOSTAT_OFFSET 0x1000 > -#define RESET_OFFSET 0x2800 > -#define PG0_OFFSET 0x3000 /* Offset from I/O Base for Page 0 register */ > -#define PG1_OFFSET 0x3400 /* Offset from I/O Base for Page 1 register */ > -#define PG2_OFFSET 0x3800 /* Offset from I/O Base for Page 2 register */ > -#define PG3_OFFSET 0x3C00 /* Offset from I/O Base for Page 3 register */ > - > -#define FIFO_READ 0 /* FIFO Read register */ > -#define FIFO_WRITE 1 /* FIFO Write rgister */ > -#define LO_ADDR_PTR 2 /* Extended RAM Low Addr Pointer */ > -#define HI_ADDR_PTR 3 /* Extended RAM High Addr Pointer */ > -#define NOT_USED_1 4 > -#define FIFO_STATUS 5 /* FIFO Status Register */ > -#define NOT_USED_2 6 > -#define MEM_OFFSET 7 > -#define SFT_RESET 10 /* Reset Register */ > -#define EXP_BASE 11 /* Shared RAM Base address */ > -#define EXP_PAGE0 12 /* Shared RAM Page0 register */ > -#define EXP_PAGE1 13 /* Shared RAM Page1 register */ > -#define EXP_PAGE2 14 /* Shared RAM Page2 register */ > -#define EXP_PAGE3 15 /* Shared RAM Page3 register */ > -#define IRQ_SELECT 16 /* IRQ selection register */ > -#define MAX_IO_REGS 17 /* Total number of I/O ports */ > - > -/* FIFO register values */ > -#define RF_HAS_DATA 0x01 /* fifo has data */ > -#define RF_QUART_FULL 0x02 /* fifo quarter full */ > -#define RF_HALF_FULL 0x04 /* fifo half full */ > -#define RF_NOT_FULL 0x08 /* fifo not full */ > -#define WF_HAS_DATA 0x10 /* fifo has data */ > -#define WF_QUART_FULL 0x20 /* fifo quarter full */ > -#define WF_HALF_FULL 0x40 /* fifo half full */ > -#define WF_NOT_FULL 0x80 /* fifo not full */ > - > -/* Shared RAM parameters */ > -#define SRAM_MIN 0xC0000 /* Lowest host shared RAM address */ > -#define SRAM_MAX 0xEFFFF /* Highest host shared RAM address */ > -#define SRAM_PAGESIZE 0x4000 /* Size of one RAM page (16K) */ > - > -/* Shared RAM buffer parameters */ > -#define BUFFER_SIZE 0x800 /* The size of a buffer in bytes */ > -#define BUFFER_BASE BUFFER_OFFSET /* Offset from start of shared RAM > - where buffer start */ > -#define BUFFERS_MAX 16 /* Maximum number of send/receive > - buffers per channel */ > -#define HDLC_PROTO 0x01 /* Frame Format for Layer 2 */ > - > -#define BRI_BOARD 0 > -#define POTS_BOARD 1 > -#define PRI_BOARD 2 > - > -/* > - * Specific hardware parameters for the DataCommute/BRI > - */ > -#define BRI_CHANNELS 2 /* Number of B channels */ > -#define BRI_BASEPG_VAL 0x98 > -#define BRI_MAGIC 0x60000 /* Magic Number */ > -#define BRI_MEMSIZE 0x10000 /* Amount of RAM (64K) */ > -#define BRI_PARTNO "72-029" > -#define BRI_FEATURES ISDN_FEATURE_L2_HDLC | ISDN_FEATURE_L3_TRANS; > -/* > - * Specific hardware parameters for the DataCommute/PRI > - */ > -#define PRI_CHANNELS 23 /* Number of B channels */ > -#define PRI_BASEPG_VAL 0x88 > -#define PRI_MAGIC 0x20000 /* Magic Number */ > -#define PRI_MEMSIZE 0x100000 /* Amount of RAM (1M) */ > -#define PRI_PARTNO "72-030" > -#define PRI_FEATURES ISDN_FEATURE_L2_HDLC | ISDN_FEATURE_L3_TRANS; > - > -/* > - * Some handy macros > - */ > - > -/* Determine if a channel number is valid for the adapter */ > -#define IS_VALID_CHANNEL(y, x) ((x > 0) && (x <= sc_adapter[y]->channels)) > - > -#endif > diff --git a/drivers/isdn/sc/includes.h b/drivers/isdn/sc/includes.h > deleted file mode 100644 > index 4766e5b77378..000000000000 > --- a/drivers/isdn/sc/includes.h > +++ /dev/null > @@ -1,16 +0,0 @@ > -/* > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - */ > - > -#include <linux/errno.h> > -#include <asm/io.h> > -#include <linux/delay.h> > -#include <linux/kernel.h> > -#include <linux/slab.h> > -#include <linux/mm.h> > -#include <linux/ioport.h> > -#include <linux/timer.h> > -#include <linux/wait.h> > -#include <linux/isdnif.h> > diff --git a/drivers/isdn/sc/init.c b/drivers/isdn/sc/init.c > deleted file mode 100644 > index 3597ef47b28a..000000000000 > --- a/drivers/isdn/sc/init.c > +++ /dev/null > @@ -1,549 +0,0 @@ > -/* > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - */ > - > -#include <linux/module.h> > -#include <linux/init.h> > -#include <linux/interrupt.h> > -#include <linux/delay.h> > -#include <linux/sched.h> > -#include <linux/slab.h> > -#include "includes.h" > -#include "hardware.h" > -#include "card.h" > - > -MODULE_DESCRIPTION("ISDN4Linux: Driver for Spellcaster card"); > -MODULE_AUTHOR("Spellcaster Telecommunications Inc."); > -MODULE_LICENSE("GPL"); > - > -board *sc_adapter[MAX_CARDS]; > -int cinst; > - > -static char devname[] = "scX"; > -static const char version[] = "2.0b1"; > - > -static const char *boardname[] = { "DataCommute/BRI", "DataCommute/PRI", "TeleCommute/BRI" }; > - > -/* insmod set parameters */ > -static unsigned int io[] = {0, 0, 0, 0}; > -static unsigned char irq[] = {0, 0, 0, 0}; > -static unsigned long ram[] = {0, 0, 0, 0}; > -static bool do_reset; > - > -module_param_array(io, int, NULL, 0); > -module_param_array(irq, byte, NULL, 0); > -module_param_array(ram, long, NULL, 0); > -module_param(do_reset, bool, 0); > - > -static int identify_board(unsigned long, unsigned int); > - > -static int __init sc_init(void) > -{ > - int b = -1; > - int i, j; > - int status = -ENODEV; > - > - unsigned long memsize = 0; > - unsigned long features = 0; > - isdn_if *interface; > - unsigned char channels; > - unsigned char pgport; > - unsigned long magic; > - int model; > - int last_base = IOBASE_MIN; > - int probe_exhasted = 0; > - > -#ifdef MODULE > - pr_info("SpellCaster ISA ISDN Adapter Driver rev. %s Loaded\n", version); > -#else > - pr_info("SpellCaster ISA ISDN Adapter Driver rev. %s\n", version); > -#endif > - pr_info("Copyright (C) 1996 SpellCaster Telecommunications Inc.\n"); > - > - while (b++ < MAX_CARDS - 1) { > - pr_debug("Probing for adapter #%d\n", b); > - /* > - * Initialize reusable variables > - */ > - model = -1; > - magic = 0; > - channels = 0; > - pgport = 0; > - > - /* > - * See if we should probe for IO base > - */ > - pr_debug("I/O Base for board %d is 0x%x, %s probe\n", b, io[b], > - io[b] == 0 ? "will" : "won't"); > - if (io[b]) { > - /* > - * No, I/O Base has been provided > - */ > - for (i = 0; i < MAX_IO_REGS - 1; i++) { > - if (!request_region(io[b] + i * 0x400, 1, "sc test")) { > - pr_debug("request_region for 0x%x failed\n", io[b] + i * 0x400); > - io[b] = 0; > - break; > - } else > - release_region(io[b] + i * 0x400, 1); > - } > - > - /* > - * Confirm the I/O Address with a test > - */ > - if (io[b] == 0) { > - pr_debug("I/O Address invalid.\n"); > - continue; > - } > - > - outb(0x18, io[b] + 0x400 * EXP_PAGE0); > - if (inb(io[b] + 0x400 * EXP_PAGE0) != 0x18) { > - pr_debug("I/O Base 0x%x fails test\n", > - io[b] + 0x400 * EXP_PAGE0); > - continue; > - } > - } else { > - /* > - * Yes, probe for I/O Base > - */ > - if (probe_exhasted) { > - pr_debug("All probe addresses exhausted, skipping\n"); > - continue; > - } > - pr_debug("Probing for I/O...\n"); > - for (i = last_base; i <= IOBASE_MAX; i += IOBASE_OFFSET) { > - int found_io = 1; > - if (i == IOBASE_MAX) { > - probe_exhasted = 1; /* No more addresses to probe */ > - pr_debug("End of Probes\n"); > - } > - last_base = i + IOBASE_OFFSET; > - pr_debug(" checking 0x%x...", i); > - for (j = 0; j < MAX_IO_REGS - 1; j++) { > - if (!request_region(i + j * 0x400, 1, "sc test")) { > - pr_debug("Failed\n"); > - found_io = 0; > - break; > - } else > - release_region(i + j * 0x400, 1); > - } > - > - if (found_io) { > - io[b] = i; > - outb(0x18, io[b] + 0x400 * EXP_PAGE0); > - if (inb(io[b] + 0x400 * EXP_PAGE0) != 0x18) { > - pr_debug("Failed by test\n"); > - continue; > - } > - pr_debug("Passed\n"); > - break; > - } > - } > - if (probe_exhasted) { > - continue; > - } > - } > - > - /* > - * See if we should probe for shared RAM > - */ > - if (do_reset) { > - pr_debug("Doing a SAFE probe reset\n"); > - outb(0xFF, io[b] + RESET_OFFSET); > - msleep_interruptible(10000); > - } > - pr_debug("RAM Base for board %d is 0x%lx, %s probe\n", b, > - ram[b], ram[b] == 0 ? "will" : "won't"); > - > - if (ram[b]) { > - /* > - * No, the RAM base has been provided > - * Just look for a signature and ID the > - * board model > - */ > - if (request_region(ram[b], SRAM_PAGESIZE, "sc test")) { > - pr_debug("request_region for RAM base 0x%lx succeeded\n", ram[b]); > - model = identify_board(ram[b], io[b]); > - release_region(ram[b], SRAM_PAGESIZE); > - } > - } else { > - /* > - * Yes, probe for free RAM and look for > - * a signature and id the board model > - */ > - for (i = SRAM_MIN; i < SRAM_MAX; i += SRAM_PAGESIZE) { > - pr_debug("Checking RAM address 0x%x...\n", i); > - if (request_region(i, SRAM_PAGESIZE, "sc test")) { > - pr_debug(" request_region succeeded\n"); > - model = identify_board(i, io[b]); > - release_region(i, SRAM_PAGESIZE); > - if (model >= 0) { > - pr_debug(" Identified a %s\n", > - boardname[model]); > - ram[b] = i; > - break; > - } > - pr_debug(" Unidentified or inaccessible\n"); > - continue; > - } > - pr_debug(" request failed\n"); > - } > - } > - /* > - * See if we found free RAM and the board model > - */ > - if (!ram[b] || model < 0) { > - /* > - * Nope, there was no place in RAM for the > - * board, or it couldn't be identified > - */ > - pr_debug("Failed to find an adapter at 0x%lx\n", ram[b]); > - continue; > - } > - > - /* > - * Set the board's magic number, memory size and page register > - */ > - switch (model) { > - case PRI_BOARD: > - channels = 23; > - magic = 0x20000; > - memsize = 0x100000; > - features = PRI_FEATURES; > - break; > - > - case BRI_BOARD: > - case POTS_BOARD: > - channels = 2; > - magic = 0x60000; > - memsize = 0x10000; > - features = BRI_FEATURES; > - break; > - } > - switch (ram[b] >> 12 & 0x0F) { > - case 0x0: > - pr_debug("RAM Page register set to EXP_PAGE0\n"); > - pgport = EXP_PAGE0; > - break; > - > - case 0x4: > - pr_debug("RAM Page register set to EXP_PAGE1\n"); > - pgport = EXP_PAGE1; > - break; > - > - case 0x8: > - pr_debug("RAM Page register set to EXP_PAGE2\n"); > - pgport = EXP_PAGE2; > - break; > - > - case 0xC: > - pr_debug("RAM Page register set to EXP_PAGE3\n"); > - pgport = EXP_PAGE3; > - break; > - > - default: > - pr_debug("RAM base address doesn't fall on 16K boundary\n"); > - continue; > - } > - > - pr_debug("current IRQ: %d b: %d\n", irq[b], b); > - > - /* > - * Make sure we got an IRQ > - */ > - if (!irq[b]) { > - /* > - * No interrupt could be used > - */ > - pr_debug("Failed to acquire an IRQ line\n"); > - continue; > - } > - > - /* > - * Horray! We found a board, Make sure we can register > - * it with ISDN4Linux > - */ > - interface = kzalloc(sizeof(isdn_if), GFP_KERNEL); > - if (interface == NULL) { > - /* > - * Oops, can't malloc isdn_if > - */ > - continue; > - } > - > - interface->owner = THIS_MODULE; > - interface->hl_hdrlen = 0; > - interface->channels = channels; > - interface->maxbufsize = BUFFER_SIZE; > - interface->features = features; > - interface->writebuf_skb = sndpkt; > - interface->writecmd = NULL; > - interface->command = command; > - strcpy(interface->id, devname); > - interface->id[2] = '0' + cinst; > - > - /* > - * Allocate the board structure > - */ > - sc_adapter[cinst] = kzalloc(sizeof(board), GFP_KERNEL); > - if (sc_adapter[cinst] == NULL) { > - /* > - * Oops, can't alloc memory for the board > - */ > - kfree(interface); > - continue; > - } > - spin_lock_init(&sc_adapter[cinst]->lock); > - > - if (!register_isdn(interface)) { > - /* > - * Oops, couldn't register for some reason > - */ > - kfree(interface); > - kfree(sc_adapter[cinst]); > - continue; > - } > - > - sc_adapter[cinst]->card = interface; > - sc_adapter[cinst]->driverId = interface->channels; > - strcpy(sc_adapter[cinst]->devicename, interface->id); > - sc_adapter[cinst]->nChannels = channels; > - sc_adapter[cinst]->ramsize = memsize; > - sc_adapter[cinst]->shmem_magic = magic; > - sc_adapter[cinst]->shmem_pgport = pgport; > - sc_adapter[cinst]->StartOnReset = 1; > - > - /* > - * Allocate channels status structures > - */ > - sc_adapter[cinst]->channel = kzalloc(sizeof(bchan) * channels, GFP_KERNEL); > - if (sc_adapter[cinst]->channel == NULL) { > - /* > - * Oops, can't alloc memory for the channels > - */ > - indicate_status(cinst, ISDN_STAT_UNLOAD, 0, NULL); /* Fix me */ > - kfree(interface); > - kfree(sc_adapter[cinst]); > - continue; > - } > - > - /* > - * Lock down the hardware resources > - */ > - sc_adapter[cinst]->interrupt = irq[b]; > - if (request_irq(sc_adapter[cinst]->interrupt, interrupt_handler, > - 0, interface->id, > - (void *)(unsigned long) cinst)) { > - kfree(sc_adapter[cinst]->channel); > - indicate_status(cinst, ISDN_STAT_UNLOAD, 0, NULL); /* Fix me */ > - kfree(interface); > - kfree(sc_adapter[cinst]); > - continue; > - > - } > - sc_adapter[cinst]->iobase = io[b]; > - for (i = 0; i < MAX_IO_REGS - 1; i++) { > - sc_adapter[cinst]->ioport[i] = io[b] + i * 0x400; > - request_region(sc_adapter[cinst]->ioport[i], 1, > - interface->id); > - pr_debug("Requesting I/O Port %#x\n", > - sc_adapter[cinst]->ioport[i]); > - } > - sc_adapter[cinst]->ioport[IRQ_SELECT] = io[b] + 0x2; > - request_region(sc_adapter[cinst]->ioport[IRQ_SELECT], 1, > - interface->id); > - pr_debug("Requesting I/O Port %#x\n", > - sc_adapter[cinst]->ioport[IRQ_SELECT]); > - sc_adapter[cinst]->rambase = ram[b]; > - request_region(sc_adapter[cinst]->rambase, SRAM_PAGESIZE, > - interface->id); > - > - pr_info(" %s (%d) - %s %d channels IRQ %d, I/O Base 0x%x, RAM Base 0x%lx\n", > - sc_adapter[cinst]->devicename, > - sc_adapter[cinst]->driverId, > - boardname[model], channels, irq[b], io[b], ram[b]); > - > - /* > - * reset the adapter to put things in motion > - */ > - reset(cinst); > - > - cinst++; > - status = 0; > - } > - if (status) > - pr_info("Failed to find any adapters, driver unloaded\n"); > - return status; > -} > - > -static void __exit sc_exit(void) > -{ > - int i, j; > - > - for (i = 0; i < cinst; i++) { > - pr_debug("Cleaning up after adapter %d\n", i); > - /* > - * kill the timers > - */ > - del_timer_sync(&(sc_adapter[i]->reset_timer)); > - del_timer_sync(&(sc_adapter[i]->stat_timer)); > - > - /* > - * Tell I4L we're toast > - */ > - indicate_status(i, ISDN_STAT_STOP, 0, NULL); > - indicate_status(i, ISDN_STAT_UNLOAD, 0, NULL); > - > - /* > - * Release shared RAM > - */ > - release_region(sc_adapter[i]->rambase, SRAM_PAGESIZE); > - > - /* > - * Release the IRQ > - */ > - free_irq(sc_adapter[i]->interrupt, NULL); > - > - /* > - * Reset for a clean start > - */ > - outb(0xFF, sc_adapter[i]->ioport[SFT_RESET]); > - > - /* > - * Release the I/O Port regions > - */ > - for (j = 0; j < MAX_IO_REGS - 1; j++) { > - release_region(sc_adapter[i]->ioport[j], 1); > - pr_debug("Releasing I/O Port %#x\n", > - sc_adapter[i]->ioport[j]); > - } > - release_region(sc_adapter[i]->ioport[IRQ_SELECT], 1); > - pr_debug("Releasing I/O Port %#x\n", > - sc_adapter[i]->ioport[IRQ_SELECT]); > - > - /* > - * Release any memory we alloced > - */ > - kfree(sc_adapter[i]->channel); > - kfree(sc_adapter[i]->card); > - kfree(sc_adapter[i]); > - } > - pr_info("SpellCaster ISA ISDN Adapter Driver Unloaded.\n"); > -} > - > -static int identify_board(unsigned long rambase, unsigned int iobase) > -{ > - unsigned int pgport; > - unsigned long sig; > - DualPortMemory *dpm; > - RspMessage rcvmsg; > - ReqMessage sndmsg; > - HWConfig_pl hwci; > - int x; > - > - pr_debug("Attempting to identify adapter @ 0x%lx io 0x%x\n", > - rambase, iobase); > - > - /* > - * Enable the base pointer > - */ > - outb(rambase >> 12, iobase + 0x2c00); > - > - switch (rambase >> 12 & 0x0F) { > - case 0x0: > - pgport = iobase + PG0_OFFSET; > - pr_debug("Page Register offset is 0x%x\n", PG0_OFFSET); > - break; > - > - case 0x4: > - pgport = iobase + PG1_OFFSET; > - pr_debug("Page Register offset is 0x%x\n", PG1_OFFSET); > - break; > - > - case 0x8: > - pgport = iobase + PG2_OFFSET; > - pr_debug("Page Register offset is 0x%x\n", PG2_OFFSET); > - break; > - > - case 0xC: > - pgport = iobase + PG3_OFFSET; > - pr_debug("Page Register offset is 0x%x\n", PG3_OFFSET); > - break; > - default: > - pr_debug("Invalid rambase 0x%lx\n", rambase); > - return -1; > - } > - > - /* > - * Try to identify a PRI card > - */ > - outb(PRI_BASEPG_VAL, pgport); > - msleep_interruptible(1000); > - sig = readl(rambase + SIG_OFFSET); > - pr_debug("Looking for a signature, got 0x%lx\n", sig); > - if (sig == SIGNATURE) > - return PRI_BOARD; > - > - /* > - * Try to identify a PRI card > - */ > - outb(BRI_BASEPG_VAL, pgport); > - msleep_interruptible(1000); > - sig = readl(rambase + SIG_OFFSET); > - pr_debug("Looking for a signature, got 0x%lx\n", sig); > - if (sig == SIGNATURE) > - return BRI_BOARD; > - > - return -1; > - > - /* > - * Try to spot a card > - */ > - sig = readl(rambase + SIG_OFFSET); > - pr_debug("Looking for a signature, got 0x%lx\n", sig); > - if (sig != SIGNATURE) > - return -1; > - > - dpm = (DualPortMemory *) rambase; > - > - memset(&sndmsg, 0, MSG_LEN); > - sndmsg.msg_byte_cnt = 3; > - sndmsg.type = cmReqType1; > - sndmsg.class = cmReqClass0; > - sndmsg.code = cmReqHWConfig; > - memcpy_toio(&(dpm->req_queue[dpm->req_head++]), &sndmsg, MSG_LEN); > - outb(0, iobase + 0x400); > - pr_debug("Sent HWConfig message\n"); > - /* > - * Wait for the response > - */ > - x = 0; > - while ((inb(iobase + FIFOSTAT_OFFSET) & RF_HAS_DATA) && x < 100) { > - schedule_timeout_interruptible(1); > - x++; > - } > - if (x == 100) { > - pr_debug("Timeout waiting for response\n"); > - return -1; > - } > - > - memcpy_fromio(&rcvmsg, &(dpm->rsp_queue[dpm->rsp_tail]), MSG_LEN); > - pr_debug("Got HWConfig response, status = 0x%x\n", rcvmsg.rsp_status); > - memcpy(&hwci, &(rcvmsg.msg_data.HWCresponse), sizeof(HWConfig_pl)); > - pr_debug("Hardware Config: Interface: %s, RAM Size: %ld, Serial: %s\n" > - " Part: %s, Rev: %s\n", > - hwci.st_u_sense ? "S/T" : "U", hwci.ram_size, > - hwci.serial_no, hwci.part_no, hwci.rev_no); > - > - if (!strncmp(PRI_PARTNO, hwci.part_no, 6)) > - return PRI_BOARD; > - if (!strncmp(BRI_PARTNO, hwci.part_no, 6)) > - return BRI_BOARD; > - > - return -1; > -} > - > -module_init(sc_init); > -module_exit(sc_exit); > diff --git a/drivers/isdn/sc/interrupt.c b/drivers/isdn/sc/interrupt.c > deleted file mode 100644 > index e80cc76bc314..000000000000 > --- a/drivers/isdn/sc/interrupt.c > +++ /dev/null > @@ -1,247 +0,0 @@ > -/* $Id: interrupt.c,v 1.4.8.3 2001/09/23 22:24:59 kai Exp $ > - * > - * Copyright (C) 1996 SpellCaster Telecommunications Inc. > - * > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - * For more information, please contact gpl-info@spellcast.com or write: > - * > - * SpellCaster Telecommunications Inc. > - * 5621 Finch Avenue East, Unit #3 > - * Scarborough, Ontario Canada > - * M1B 2T9 > - * +1 (416) 297-8565 > - * +1 (416) 297-6433 Facsimile > - */ > - > -#include "includes.h" > -#include "hardware.h" > -#include "message.h" > -#include "card.h" > -#include <linux/interrupt.h> > - > -/* > - * > - */ > -irqreturn_t interrupt_handler(int dummy, void *card_inst) > -{ > - > - RspMessage rcvmsg; > - int channel; > - int card = (int)(unsigned long) card_inst; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return IRQ_NONE; > - } > - > - pr_debug("%s: Entered Interrupt handler\n", > - sc_adapter[card]->devicename); > - > - /* > - * Pull all of the waiting messages off the response queue > - */ > - while (!receivemessage(card, &rcvmsg)) { > - /* > - * Push the message to the adapter structure for > - * send_and_receive to snoop > - */ > - if (sc_adapter[card]->want_async_messages) > - memcpy(&(sc_adapter[card]->async_msg), > - &rcvmsg, sizeof(RspMessage)); > - > - channel = (unsigned int) rcvmsg.phy_link_no; > - > - /* > - * Trap Invalid request messages > - */ > - if (IS_CM_MESSAGE(rcvmsg, 0, 0, Invalid)) { > - pr_debug("%s: Invalid request Message, rsp_status = %d\n", > - sc_adapter[card]->devicename, > - rcvmsg.rsp_status); > - break; > - } > - > - /* > - * Check for a linkRead message > - */ > - if (IS_CE_MESSAGE(rcvmsg, Lnk, 1, Read)) > - { > - pr_debug("%s: Received packet 0x%x bytes long at 0x%lx\n", > - sc_adapter[card]->devicename, > - rcvmsg.msg_data.response.msg_len, > - rcvmsg.msg_data.response.buff_offset); > - rcvpkt(card, &rcvmsg); > - continue; > - > - } > - > - /* > - * Handle a write acknoledgement > - */ > - if (IS_CE_MESSAGE(rcvmsg, Lnk, 1, Write)) { > - pr_debug("%s: Packet Send ACK on channel %d\n", > - sc_adapter[card]->devicename, > - rcvmsg.phy_link_no); > - sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].free_sendbufs++; > - continue; > - } > - > - /* > - * Handle a connection message > - */ > - if (IS_CE_MESSAGE(rcvmsg, Phy, 1, Connect)) > - { > - unsigned int callid; > - setup_parm setup; > - pr_debug("%s: Connect message: line %d: status %d: cause 0x%x\n", > - sc_adapter[card]->devicename, > - rcvmsg.phy_link_no, > - rcvmsg.rsp_status, > - rcvmsg.msg_data.byte_array[2]); > - > - memcpy(&callid, rcvmsg.msg_data.byte_array, sizeof(int)); > - if (callid >= 0x8000 && callid <= 0xFFFF) > - { > - pr_debug("%s: Got Dial-Out Rsp\n", > - sc_adapter[card]->devicename); > - indicate_status(card, ISDN_STAT_DCONN, > - (unsigned long)rcvmsg.phy_link_no - 1, NULL); > - > - } > - else if (callid >= 0x0000 && callid <= 0x7FFF) > - { > - int len; > - > - pr_debug("%s: Got Incoming Call\n", > - sc_adapter[card]->devicename); > - len = strlcpy(setup.phone, &(rcvmsg.msg_data.byte_array[4]), > - sizeof(setup.phone)); > - if (len >= sizeof(setup.phone)) > - continue; > - len = strlcpy(setup.eazmsn, > - sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].dn, > - sizeof(setup.eazmsn)); > - if (len >= sizeof(setup.eazmsn)) > - continue; > - setup.si1 = 7; > - setup.si2 = 0; > - setup.plan = 0; > - setup.screen = 0; > - > - indicate_status(card, ISDN_STAT_ICALL, (unsigned long)rcvmsg.phy_link_no - 1, (char *)&setup); > - indicate_status(card, ISDN_STAT_DCONN, (unsigned long)rcvmsg.phy_link_no - 1, NULL); > - } > - continue; > - } > - > - /* > - * Handle a disconnection message > - */ > - if (IS_CE_MESSAGE(rcvmsg, Phy, 1, Disconnect)) > - { > - pr_debug("%s: disconnect message: line %d: status %d: cause 0x%x\n", > - sc_adapter[card]->devicename, > - rcvmsg.phy_link_no, > - rcvmsg.rsp_status, > - rcvmsg.msg_data.byte_array[2]); > - > - indicate_status(card, ISDN_STAT_BHUP, (unsigned long)rcvmsg.phy_link_no - 1, NULL); > - indicate_status(card, ISDN_STAT_DHUP, (unsigned long)rcvmsg.phy_link_no - 1, NULL); > - continue; > - > - } > - > - /* > - * Handle a startProc engine up message > - */ > - if (IS_CM_MESSAGE(rcvmsg, 5, 0, MiscEngineUp)) { > - pr_debug("%s: Received EngineUp message\n", > - sc_adapter[card]->devicename); > - sc_adapter[card]->EngineUp = 1; > - sendmessage(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetMyNumber, 1, 0, NULL); > - sendmessage(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetMyNumber, 2, 0, NULL); > - init_timer(&sc_adapter[card]->stat_timer); > - sc_adapter[card]->stat_timer.function = check_phystat; > - sc_adapter[card]->stat_timer.data = card; > - sc_adapter[card]->stat_timer.expires = jiffies + CHECKSTAT_TIME; > - add_timer(&sc_adapter[card]->stat_timer); > - continue; > - } > - > - /* > - * Start proc response > - */ > - if (IS_CM_MESSAGE(rcvmsg, 2, 0, StartProc)) { > - pr_debug("%s: StartProc Response Status %d\n", > - sc_adapter[card]->devicename, > - rcvmsg.rsp_status); > - continue; > - } > - > - /* > - * Handle a GetMyNumber Rsp > - */ > - if (IS_CE_MESSAGE(rcvmsg, Call, 0, GetMyNumber)) { > - strlcpy(sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].dn, > - rcvmsg.msg_data.byte_array, > - sizeof(rcvmsg.msg_data.byte_array)); > - continue; > - } > - > - /* > - * PhyStatus response > - */ > - if (IS_CE_MESSAGE(rcvmsg, Phy, 2, Status)) { > - unsigned int b1stat, b2stat; > - > - /* > - * Covert the message data to the adapter->phystat code > - */ > - b1stat = (unsigned int) rcvmsg.msg_data.byte_array[0]; > - b2stat = (unsigned int) rcvmsg.msg_data.byte_array[1]; > - > - sc_adapter[card]->nphystat = (b2stat >> 8) | b1stat; /* endian?? */ > - pr_debug("%s: PhyStat is 0x%2x\n", > - sc_adapter[card]->devicename, > - sc_adapter[card]->nphystat); > - continue; > - } > - > - > - /* > - * Handle a GetFramFormat > - */ > - if (IS_CE_MESSAGE(rcvmsg, Call, 0, GetFrameFormat)) { > - if (rcvmsg.msg_data.byte_array[0] != HDLC_PROTO) { > - unsigned int proto = HDLC_PROTO; > - /* > - * Set board format to HDLC if it wasn't already > - */ > - pr_debug("%s: current frame format: 0x%x, will change to HDLC\n", > - sc_adapter[card]->devicename, > - rcvmsg.msg_data.byte_array[0]); > - sendmessage(card, CEPID, ceReqTypeCall, > - ceReqClass0, > - ceReqCallSetFrameFormat, > - (unsigned char)channel + 1, > - 1, &proto); > - } > - continue; > - } > - > - /* > - * Hmm... > - */ > - pr_debug("%s: Received unhandled message (%d,%d,%d) link %d\n", > - sc_adapter[card]->devicename, > - rcvmsg.type, rcvmsg.class, rcvmsg.code, > - rcvmsg.phy_link_no); > - > - } /* while */ > - > - pr_debug("%s: Exiting Interrupt Handler\n", > - sc_adapter[card]->devicename); > - return IRQ_HANDLED; > -} > diff --git a/drivers/isdn/sc/ioctl.c b/drivers/isdn/sc/ioctl.c > deleted file mode 100644 > index e63983aa1d27..000000000000 > --- a/drivers/isdn/sc/ioctl.c > +++ /dev/null > @@ -1,582 +0,0 @@ > -/* > - * Copyright (C) 1996 SpellCaster Telecommunications Inc. > - * > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - */ > - > -#include "includes.h" > -#include "hardware.h" > -#include "message.h" > -#include "card.h" > -#include "scioc.h" > - > -static int GetStatus(int card, boardInfo *); > - > -/* > - * Process private IOCTL messages (typically from scctrl) > - */ > -int sc_ioctl(int card, scs_ioctl *data) > -{ > - int status; > - RspMessage *rcvmsg; > - char *spid; > - char *dn; > - char switchtype; > - char speed; > - > - rcvmsg = kmalloc(sizeof(RspMessage), GFP_KERNEL); > - if (!rcvmsg) > - return -ENOMEM; > - > - switch (data->command) { > - case SCIOCRESET: /* Perform a hard reset of the adapter */ > - { > - pr_debug("%s: SCIOCRESET: ioctl received\n", > - sc_adapter[card]->devicename); > - sc_adapter[card]->StartOnReset = 0; > - kfree(rcvmsg); > - return reset(card); > - } > - > - case SCIOCLOAD: > - { > - char *srec; > - > - srec = kmalloc(SCIOC_SRECSIZE, GFP_KERNEL); > - if (!srec) { > - kfree(rcvmsg); > - return -ENOMEM; > - } > - pr_debug("%s: SCIOLOAD: ioctl received\n", > - sc_adapter[card]->devicename); > - if (sc_adapter[card]->EngineUp) { > - pr_debug("%s: SCIOCLOAD: command failed, LoadProc while engine running.\n", > - sc_adapter[card]->devicename); > - kfree(rcvmsg); > - kfree(srec); > - return -1; > - } > - > - /* > - * Get the SRec from user space > - */ > - if (copy_from_user(srec, data->dataptr, SCIOC_SRECSIZE)) { > - kfree(rcvmsg); > - kfree(srec); > - return -EFAULT; > - } > - > - status = send_and_receive(card, CMPID, cmReqType2, cmReqClass0, cmReqLoadProc, > - 0, SCIOC_SRECSIZE, srec, rcvmsg, SAR_TIMEOUT); > - kfree(rcvmsg); > - kfree(srec); > - > - if (status) { > - pr_debug("%s: SCIOCLOAD: command failed, status = %d\n", > - sc_adapter[card]->devicename, status); > - return -1; > - } > - else { > - pr_debug("%s: SCIOCLOAD: command successful\n", > - sc_adapter[card]->devicename); > - return 0; > - } > - } > - > - case SCIOCSTART: > - { > - kfree(rcvmsg); > - pr_debug("%s: SCIOSTART: ioctl received\n", > - sc_adapter[card]->devicename); > - if (sc_adapter[card]->EngineUp) { > - pr_debug("%s: SCIOCSTART: command failed, engine already running.\n", > - sc_adapter[card]->devicename); > - return -1; > - } > - > - sc_adapter[card]->StartOnReset = 1; > - startproc(card); > - return 0; > - } > - > - case SCIOCSETSWITCH: > - { > - pr_debug("%s: SCIOSETSWITCH: ioctl received\n", > - sc_adapter[card]->devicename); > - > - /* > - * Get the switch type from user space > - */ > - if (copy_from_user(&switchtype, data->dataptr, sizeof(char))) { > - kfree(rcvmsg); > - return -EFAULT; > - } > - > - pr_debug("%s: SCIOCSETSWITCH: setting switch type to %d\n", > - sc_adapter[card]->devicename, > - switchtype); > - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallSetSwitchType, > - 0, sizeof(char), &switchtype, rcvmsg, SAR_TIMEOUT); > - if (!status && !(rcvmsg->rsp_status)) { > - pr_debug("%s: SCIOCSETSWITCH: command successful\n", > - sc_adapter[card]->devicename); > - kfree(rcvmsg); > - return 0; > - } > - else { > - pr_debug("%s: SCIOCSETSWITCH: command failed (status = %d)\n", > - sc_adapter[card]->devicename, status); > - kfree(rcvmsg); > - return status; > - } > - } > - > - case SCIOCGETSWITCH: > - { > - pr_debug("%s: SCIOGETSWITCH: ioctl received\n", > - sc_adapter[card]->devicename); > - > - /* > - * Get the switch type from the board > - */ > - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, > - ceReqCallGetSwitchType, 0, 0, NULL, rcvmsg, SAR_TIMEOUT); > - if (!status && !(rcvmsg->rsp_status)) { > - pr_debug("%s: SCIOCGETSWITCH: command successful\n", > - sc_adapter[card]->devicename); > - } > - else { > - pr_debug("%s: SCIOCGETSWITCH: command failed (status = %d)\n", > - sc_adapter[card]->devicename, status); > - kfree(rcvmsg); > - return status; > - } > - > - switchtype = rcvmsg->msg_data.byte_array[0]; > - > - /* > - * Package the switch type and send to user space > - */ > - if (copy_to_user(data->dataptr, &switchtype, > - sizeof(char))) { > - kfree(rcvmsg); > - return -EFAULT; > - } > - > - kfree(rcvmsg); > - return 0; > - } > - > - case SCIOCGETSPID: > - { > - pr_debug("%s: SCIOGETSPID: ioctl received\n", > - sc_adapter[card]->devicename); > - > - spid = kzalloc(SCIOC_SPIDSIZE, GFP_KERNEL); > - if (!spid) { > - kfree(rcvmsg); > - return -ENOMEM; > - } > - /* > - * Get the spid from the board > - */ > - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetSPID, > - data->channel, 0, NULL, rcvmsg, SAR_TIMEOUT); > - if (!status) { > - pr_debug("%s: SCIOCGETSPID: command successful\n", > - sc_adapter[card]->devicename); > - } else { > - pr_debug("%s: SCIOCGETSPID: command failed (status = %d)\n", > - sc_adapter[card]->devicename, status); > - kfree(spid); > - kfree(rcvmsg); > - return status; > - } > - strlcpy(spid, rcvmsg->msg_data.byte_array, SCIOC_SPIDSIZE); > - > - /* > - * Package the switch type and send to user space > - */ > - if (copy_to_user(data->dataptr, spid, SCIOC_SPIDSIZE)) { > - kfree(spid); > - kfree(rcvmsg); > - return -EFAULT; > - } > - > - kfree(spid); > - kfree(rcvmsg); > - return 0; > - } > - > - case SCIOCSETSPID: > - { > - pr_debug("%s: DCBIOSETSPID: ioctl received\n", > - sc_adapter[card]->devicename); > - > - /* > - * Get the spid from user space > - */ > - spid = memdup_user(data->dataptr, SCIOC_SPIDSIZE); > - if (IS_ERR(spid)) { > - kfree(rcvmsg); > - return PTR_ERR(spid); > - } > - > - pr_debug("%s: SCIOCSETSPID: setting channel %d spid to %s\n", > - sc_adapter[card]->devicename, data->channel, spid); > - status = send_and_receive(card, CEPID, ceReqTypeCall, > - ceReqClass0, ceReqCallSetSPID, data->channel, > - strlen(spid), spid, rcvmsg, SAR_TIMEOUT); > - if (!status && !(rcvmsg->rsp_status)) { > - pr_debug("%s: SCIOCSETSPID: command successful\n", > - sc_adapter[card]->devicename); > - kfree(rcvmsg); > - kfree(spid); > - return 0; > - } > - else { > - pr_debug("%s: SCIOCSETSPID: command failed (status = %d)\n", > - sc_adapter[card]->devicename, status); > - kfree(rcvmsg); > - kfree(spid); > - return status; > - } > - } > - > - case SCIOCGETDN: > - { > - pr_debug("%s: SCIOGETDN: ioctl received\n", > - sc_adapter[card]->devicename); > - > - /* > - * Get the dn from the board > - */ > - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetMyNumber, > - data->channel, 0, NULL, rcvmsg, SAR_TIMEOUT); > - if (!status) { > - pr_debug("%s: SCIOCGETDN: command successful\n", > - sc_adapter[card]->devicename); > - } > - else { > - pr_debug("%s: SCIOCGETDN: command failed (status = %d)\n", > - sc_adapter[card]->devicename, status); > - kfree(rcvmsg); > - return status; > - } > - > - dn = kzalloc(SCIOC_DNSIZE, GFP_KERNEL); > - if (!dn) { > - kfree(rcvmsg); > - return -ENOMEM; > - } > - strlcpy(dn, rcvmsg->msg_data.byte_array, SCIOC_DNSIZE); > - kfree(rcvmsg); > - > - /* > - * Package the dn and send to user space > - */ > - if (copy_to_user(data->dataptr, dn, SCIOC_DNSIZE)) { > - kfree(dn); > - return -EFAULT; > - } > - kfree(dn); > - return 0; > - } > - > - case SCIOCSETDN: > - { > - pr_debug("%s: SCIOSETDN: ioctl received\n", > - sc_adapter[card]->devicename); > - > - /* > - * Get the spid from user space > - */ > - dn = memdup_user(data->dataptr, SCIOC_DNSIZE); > - if (IS_ERR(dn)) { > - kfree(rcvmsg); > - return PTR_ERR(dn); > - } > - > - pr_debug("%s: SCIOCSETDN: setting channel %d dn to %s\n", > - sc_adapter[card]->devicename, data->channel, dn); > - status = send_and_receive(card, CEPID, ceReqTypeCall, > - ceReqClass0, ceReqCallSetMyNumber, data->channel, > - strlen(dn), dn, rcvmsg, SAR_TIMEOUT); > - if (!status && !(rcvmsg->rsp_status)) { > - pr_debug("%s: SCIOCSETDN: command successful\n", > - sc_adapter[card]->devicename); > - kfree(rcvmsg); > - kfree(dn); > - return 0; > - } > - else { > - pr_debug("%s: SCIOCSETDN: command failed (status = %d)\n", > - sc_adapter[card]->devicename, status); > - kfree(rcvmsg); > - kfree(dn); > - return status; > - } > - } > - > - case SCIOCTRACE: > - > - pr_debug("%s: SCIOTRACE: ioctl received\n", > - sc_adapter[card]->devicename); > -/* sc_adapter[card]->trace = !sc_adapter[card]->trace; > - pr_debug("%s: SCIOCTRACE: tracing turned %s\n", > - sc_adapter[card]->devicename, > - sc_adapter[card]->trace ? "ON" : "OFF"); */ > - break; > - > - case SCIOCSTAT: > - { > - boardInfo *bi; > - > - pr_debug("%s: SCIOSTAT: ioctl received\n", > - sc_adapter[card]->devicename); > - > - bi = kzalloc(sizeof(boardInfo), GFP_KERNEL); > - if (!bi) { > - kfree(rcvmsg); > - return -ENOMEM; > - } > - > - kfree(rcvmsg); > - GetStatus(card, bi); > - > - if (copy_to_user(data->dataptr, bi, sizeof(boardInfo))) { > - kfree(bi); > - return -EFAULT; > - } > - > - kfree(bi); > - return 0; > - } > - > - case SCIOCGETSPEED: > - { > - pr_debug("%s: SCIOGETSPEED: ioctl received\n", > - sc_adapter[card]->devicename); > - > - /* > - * Get the speed from the board > - */ > - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, > - ceReqCallGetCallType, data->channel, 0, NULL, rcvmsg, SAR_TIMEOUT); > - if (!status && !(rcvmsg->rsp_status)) { > - pr_debug("%s: SCIOCGETSPEED: command successful\n", > - sc_adapter[card]->devicename); > - } > - else { > - pr_debug("%s: SCIOCGETSPEED: command failed (status = %d)\n", > - sc_adapter[card]->devicename, status); > - kfree(rcvmsg); > - return status; > - } > - > - speed = rcvmsg->msg_data.byte_array[0]; > - > - kfree(rcvmsg); > - > - /* > - * Package the switch type and send to user space > - */ > - > - if (copy_to_user(data->dataptr, &speed, sizeof(char))) > - return -EFAULT; > - > - return 0; > - } > - > - case SCIOCSETSPEED: > - pr_debug("%s: SCIOCSETSPEED: ioctl received\n", > - sc_adapter[card]->devicename); > - break; > - > - case SCIOCLOOPTST: > - pr_debug("%s: SCIOCLOOPTST: ioctl received\n", > - sc_adapter[card]->devicename); > - break; > - > - default: > - kfree(rcvmsg); > - return -1; > - } > - > - kfree(rcvmsg); > - return 0; > -} > - > -static int GetStatus(int card, boardInfo *bi) > -{ > - RspMessage rcvmsg; > - int i, status; > - > - /* > - * Fill in some of the basic info about the board > - */ > - bi->modelid = sc_adapter[card]->model; > - strcpy(bi->serial_no, sc_adapter[card]->hwconfig.serial_no); > - strcpy(bi->part_no, sc_adapter[card]->hwconfig.part_no); > - bi->iobase = sc_adapter[card]->iobase; > - bi->rambase = sc_adapter[card]->rambase; > - bi->irq = sc_adapter[card]->interrupt; > - bi->ramsize = sc_adapter[card]->hwconfig.ram_size; > - bi->interface = sc_adapter[card]->hwconfig.st_u_sense; > - strcpy(bi->load_ver, sc_adapter[card]->load_ver); > - strcpy(bi->proc_ver, sc_adapter[card]->proc_ver); > - > - /* > - * Get the current PhyStats and LnkStats > - */ > - status = send_and_receive(card, CEPID, ceReqTypePhy, ceReqClass2, > - ceReqPhyStatus, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT); > - if (!status) { > - if (sc_adapter[card]->model < PRI_BOARD) { > - bi->l1_status = rcvmsg.msg_data.byte_array[2]; > - for (i = 0; i < BRI_CHANNELS; i++) > - bi->status.bristats[i].phy_stat = > - rcvmsg.msg_data.byte_array[i]; > - } > - else { > - bi->l1_status = rcvmsg.msg_data.byte_array[0]; > - bi->l2_status = rcvmsg.msg_data.byte_array[1]; > - for (i = 0; i < PRI_CHANNELS; i++) > - bi->status.pristats[i].phy_stat = > - rcvmsg.msg_data.byte_array[i + 2]; > - } > - } > - > - /* > - * Get the call types for each channel > - */ > - for (i = 0; i < sc_adapter[card]->nChannels; i++) { > - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, > - ceReqCallGetCallType, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT); > - if (!status) { > - if (sc_adapter[card]->model == PRI_BOARD) { > - bi->status.pristats[i].call_type = > - rcvmsg.msg_data.byte_array[0]; > - } > - else { > - bi->status.bristats[i].call_type = > - rcvmsg.msg_data.byte_array[0]; > - } > - } > - } > - > - /* > - * If PRI, get the call states and service states for each channel > - */ > - if (sc_adapter[card]->model == PRI_BOARD) { > - /* > - * Get the call states > - */ > - status = send_and_receive(card, CEPID, ceReqTypeStat, ceReqClass2, > - ceReqPhyChCallState, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT); > - if (!status) { > - for (i = 0; i < PRI_CHANNELS; i++) > - bi->status.pristats[i].call_state = > - rcvmsg.msg_data.byte_array[i]; > - } > - > - /* > - * Get the service states > - */ > - status = send_and_receive(card, CEPID, ceReqTypeStat, ceReqClass2, > - ceReqPhyChServState, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT); > - if (!status) { > - for (i = 0; i < PRI_CHANNELS; i++) > - bi->status.pristats[i].serv_state = > - rcvmsg.msg_data.byte_array[i]; > - } > - > - /* > - * Get the link stats for the channels > - */ > - for (i = 1; i <= PRI_CHANNELS; i++) { > - status = send_and_receive(card, CEPID, ceReqTypeLnk, ceReqClass0, > - ceReqLnkGetStats, i, 0, NULL, &rcvmsg, SAR_TIMEOUT); > - if (!status) { > - bi->status.pristats[i - 1].link_stats.tx_good = > - (unsigned long)rcvmsg.msg_data.byte_array[0]; > - bi->status.pristats[i - 1].link_stats.tx_bad = > - (unsigned long)rcvmsg.msg_data.byte_array[4]; > - bi->status.pristats[i - 1].link_stats.rx_good = > - (unsigned long)rcvmsg.msg_data.byte_array[8]; > - bi->status.pristats[i - 1].link_stats.rx_bad = > - (unsigned long)rcvmsg.msg_data.byte_array[12]; > - } > - } > - > - /* > - * Link stats for the D channel > - */ > - status = send_and_receive(card, CEPID, ceReqTypeLnk, ceReqClass0, > - ceReqLnkGetStats, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT); > - if (!status) { > - bi->dch_stats.tx_good = (unsigned long)rcvmsg.msg_data.byte_array[0]; > - bi->dch_stats.tx_bad = (unsigned long)rcvmsg.msg_data.byte_array[4]; > - bi->dch_stats.rx_good = (unsigned long)rcvmsg.msg_data.byte_array[8]; > - bi->dch_stats.rx_bad = (unsigned long)rcvmsg.msg_data.byte_array[12]; > - } > - > - return 0; > - } > - > - /* > - * If BRI or POTS, Get SPID, DN and call types for each channel > - */ > - > - /* > - * Get the link stats for the channels > - */ > - status = send_and_receive(card, CEPID, ceReqTypeLnk, ceReqClass0, > - ceReqLnkGetStats, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT); > - if (!status) { > - bi->dch_stats.tx_good = (unsigned long)rcvmsg.msg_data.byte_array[0]; > - bi->dch_stats.tx_bad = (unsigned long)rcvmsg.msg_data.byte_array[4]; > - bi->dch_stats.rx_good = (unsigned long)rcvmsg.msg_data.byte_array[8]; > - bi->dch_stats.rx_bad = (unsigned long)rcvmsg.msg_data.byte_array[12]; > - bi->status.bristats[0].link_stats.tx_good = > - (unsigned long)rcvmsg.msg_data.byte_array[16]; > - bi->status.bristats[0].link_stats.tx_bad = > - (unsigned long)rcvmsg.msg_data.byte_array[20]; > - bi->status.bristats[0].link_stats.rx_good = > - (unsigned long)rcvmsg.msg_data.byte_array[24]; > - bi->status.bristats[0].link_stats.rx_bad = > - (unsigned long)rcvmsg.msg_data.byte_array[28]; > - bi->status.bristats[1].link_stats.tx_good = > - (unsigned long)rcvmsg.msg_data.byte_array[32]; > - bi->status.bristats[1].link_stats.tx_bad = > - (unsigned long)rcvmsg.msg_data.byte_array[36]; > - bi->status.bristats[1].link_stats.rx_good = > - (unsigned long)rcvmsg.msg_data.byte_array[40]; > - bi->status.bristats[1].link_stats.rx_bad = > - (unsigned long)rcvmsg.msg_data.byte_array[44]; > - } > - > - /* > - * Get the SPIDs > - */ > - for (i = 0; i < BRI_CHANNELS; i++) { > - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, > - ceReqCallGetSPID, i + 1, 0, NULL, &rcvmsg, SAR_TIMEOUT); > - if (!status) > - strcpy(bi->status.bristats[i].spid, rcvmsg.msg_data.byte_array); > - } > - > - /* > - * Get the DNs > - */ > - for (i = 0; i < BRI_CHANNELS; i++) { > - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, > - ceReqCallGetMyNumber, i + 1, 0, NULL, &rcvmsg, SAR_TIMEOUT); > - if (!status) > - strcpy(bi->status.bristats[i].dn, rcvmsg.msg_data.byte_array); > - } > - > - return 0; > -} > diff --git a/drivers/isdn/sc/message.c b/drivers/isdn/sc/message.c > deleted file mode 100644 > index 9679a1902b32..000000000000 > --- a/drivers/isdn/sc/message.c > +++ /dev/null > @@ -1,230 +0,0 @@ > -/* $Id: message.c,v 1.5.8.2 2001/09/23 22:24:59 kai Exp $ > - * > - * functions for sending and receiving control messages > - * > - * Copyright (C) 1996 SpellCaster Telecommunications Inc. > - * > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - * For more information, please contact gpl-info@spellcast.com or write: > - * > - * SpellCaster Telecommunications Inc. > - * 5621 Finch Avenue East, Unit #3 > - * Scarborough, Ontario Canada > - * M1B 2T9 > - * +1 (416) 297-8565 > - * +1 (416) 297-6433 Facsimile > - */ > -#include <linux/sched.h> > -#include "includes.h" > -#include "hardware.h" > -#include "message.h" > -#include "card.h" > - > -/* > - * receive a message from the board > - */ > -int receivemessage(int card, RspMessage *rspmsg) > -{ > - DualPortMemory *dpm; > - unsigned long flags; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -EINVAL; > - } > - > - pr_debug("%s: Entered receivemessage\n", > - sc_adapter[card]->devicename); > - > - /* > - * See if there are messages waiting > - */ > - if (inb(sc_adapter[card]->ioport[FIFO_STATUS]) & RF_HAS_DATA) { > - /* > - * Map in the DPM to the base page and copy the message > - */ > - spin_lock_irqsave(&sc_adapter[card]->lock, flags); > - outb((sc_adapter[card]->shmem_magic >> 14) | 0x80, > - sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); > - dpm = (DualPortMemory *) sc_adapter[card]->rambase; > - memcpy_fromio(rspmsg, &(dpm->rsp_queue[dpm->rsp_tail]), > - MSG_LEN); > - dpm->rsp_tail = (dpm->rsp_tail + 1) % MAX_MESSAGES; > - inb(sc_adapter[card]->ioport[FIFO_READ]); > - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); > - /* > - * Tell the board that the message is received > - */ > - pr_debug("%s: Received Message seq:%d pid:%d time:%d cmd:%d " > - "cnt:%d (type,class,code):(%d,%d,%d) " > - "link:%d stat:0x%x\n", > - sc_adapter[card]->devicename, > - rspmsg->sequence_no, > - rspmsg->process_id, > - rspmsg->time_stamp, > - rspmsg->cmd_sequence_no, > - rspmsg->msg_byte_cnt, > - rspmsg->type, > - rspmsg->class, > - rspmsg->code, > - rspmsg->phy_link_no, > - rspmsg->rsp_status); > - > - return 0; > - } > - return -ENOMSG; > -} > - > -/* > - * send a message to the board > - */ > -int sendmessage(int card, > - unsigned int procid, > - unsigned int type, > - unsigned int class, > - unsigned int code, > - unsigned int link, > - unsigned int data_len, > - unsigned int *data) > -{ > - DualPortMemory *dpm; > - ReqMessage sndmsg; > - unsigned long flags; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -EINVAL; > - } > - > - /* > - * Make sure we only send CEPID messages when the engine is up > - * and CMPID messages when it is down > - */ > - if (sc_adapter[card]->EngineUp && procid == CMPID) { > - pr_debug("%s: Attempt to send CM message with engine up\n", > - sc_adapter[card]->devicename); > - return -ESRCH; > - } > - > - if (!sc_adapter[card]->EngineUp && procid == CEPID) { > - pr_debug("%s: Attempt to send CE message with engine down\n", > - sc_adapter[card]->devicename); > - return -ESRCH; > - } > - > - memset(&sndmsg, 0, MSG_LEN); > - sndmsg.msg_byte_cnt = 4; > - sndmsg.type = type; > - sndmsg.class = class; > - sndmsg.code = code; > - sndmsg.phy_link_no = link; > - > - if (data_len > 0) { > - if (data_len > MSG_DATA_LEN) > - data_len = MSG_DATA_LEN; > - memcpy(&(sndmsg.msg_data), data, data_len); > - sndmsg.msg_byte_cnt = data_len + 8; > - } > - > - sndmsg.process_id = procid; > - sndmsg.sequence_no = sc_adapter[card]->seq_no++ % 256; > - > - /* > - * wait for an empty slot in the queue > - */ > - while (!(inb(sc_adapter[card]->ioport[FIFO_STATUS]) & WF_NOT_FULL)) > - udelay(1); > - > - /* > - * Disable interrupts and map in shared memory > - */ > - spin_lock_irqsave(&sc_adapter[card]->lock, flags); > - outb((sc_adapter[card]->shmem_magic >> 14) | 0x80, > - sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); > - dpm = (DualPortMemory *) sc_adapter[card]->rambase; /* Fix me */ > - memcpy_toio(&(dpm->req_queue[dpm->req_head]), &sndmsg, MSG_LEN); > - dpm->req_head = (dpm->req_head + 1) % MAX_MESSAGES; > - outb(sndmsg.sequence_no, sc_adapter[card]->ioport[FIFO_WRITE]); > - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); > - > - pr_debug("%s: Sent Message seq:%d pid:%d time:%d " > - "cnt:%d (type,class,code):(%d,%d,%d) " > - "link:%d\n ", > - sc_adapter[card]->devicename, > - sndmsg.sequence_no, > - sndmsg.process_id, > - sndmsg.time_stamp, > - sndmsg.msg_byte_cnt, > - sndmsg.type, > - sndmsg.class, > - sndmsg.code, > - sndmsg.phy_link_no); > - > - return 0; > -} > - > -int send_and_receive(int card, > - unsigned int procid, > - unsigned char type, > - unsigned char class, > - unsigned char code, > - unsigned char link, > - unsigned char data_len, > - unsigned char *data, > - RspMessage *mesgdata, > - int timeout) > -{ > - int retval; > - int tries; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return -EINVAL; > - } > - > - sc_adapter[card]->want_async_messages = 1; > - retval = sendmessage(card, procid, type, class, code, link, > - data_len, (unsigned int *) data); > - > - if (retval) { > - pr_debug("%s: SendMessage failed in SAR\n", > - sc_adapter[card]->devicename); > - sc_adapter[card]->want_async_messages = 0; > - return -EIO; > - } > - > - tries = 0; > - /* wait for the response */ > - while (tries < timeout) { > - schedule_timeout_interruptible(1); > - > - pr_debug("SAR waiting..\n"); > - > - /* > - * See if we got our message back > - */ > - if ((sc_adapter[card]->async_msg.type == type) && > - (sc_adapter[card]->async_msg.class == class) && > - (sc_adapter[card]->async_msg.code == code) && > - (sc_adapter[card]->async_msg.phy_link_no == link)) { > - > - /* > - * Got it! > - */ > - pr_debug("%s: Got ASYNC message\n", > - sc_adapter[card]->devicename); > - memcpy(mesgdata, &(sc_adapter[card]->async_msg), > - sizeof(RspMessage)); > - sc_adapter[card]->want_async_messages = 0; > - return 0; > - } > - > - tries++; > - } > - > - pr_debug("%s: SAR message timeout\n", sc_adapter[card]->devicename); > - sc_adapter[card]->want_async_messages = 0; > - return -ETIME; > -} > diff --git a/drivers/isdn/sc/message.h b/drivers/isdn/sc/message.h > deleted file mode 100644 > index 5e6f4a5c15f8..000000000000 > --- a/drivers/isdn/sc/message.h > +++ /dev/null > @@ -1,245 +0,0 @@ > -/* $Id: message.h,v 1.1.10.1 2001/09/23 22:24:59 kai Exp $ > - * > - * Copyright (C) 1996 SpellCaster Telecommunications Inc. > - * > - * structures, macros and defines useful for sending > - * messages to the adapter > - * > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - * For more information, please contact gpl-info@spellcast.com or write: > - * > - * SpellCaster Telecommunications Inc. > - * 5621 Finch Avenue East, Unit #3 > - * Scarborough, Ontario Canada > - * M1B 2T9 > - * +1 (416) 297-8565 > - * +1 (416) 297-6433 Facsimile > - */ > - > -/* > - * Board message macros, defines and structures > - */ > - > -#ifndef MESSAGE_H > -#define MESSAGE_H > - > -#define MAX_MESSAGES 32 /* Maximum messages that can be > - queued */ > -#define MSG_DATA_LEN 48 /* Maximum size of message payload */ > -#define MSG_LEN 64 /* Size of a message */ > -#define CMPID 0 /* Loader message process ID */ > -#define CEPID 64 /* Firmware message process ID */ > - > -/* > - * Macro to determine if a message is a loader message > - */ > -#define IS_CM_MESSAGE(mesg, tx, cx, dx) \ > - ((mesg.type == cmRspType##tx) \ > - && (mesg.class == cmRspClass##cx) \ > - && (mesg.code == cmRsp##dx)) > - > -/* > - * Macro to determine if a message is a firmware message > - */ > -#define IS_CE_MESSAGE(mesg, tx, cx, dx) \ > - ((mesg.type == ceRspType##tx) \ > - && (mesg.class == ceRspClass##cx) \ > - && (mesg.code == ceRsp##tx##dx)) > - > -/* > - * Loader Request and Response Messages > - */ > - > -/* message types */ > -#define cmReqType1 1 > -#define cmReqType2 2 > -#define cmRspType0 0 > -#define cmRspType1 1 > -#define cmRspType2 2 > -#define cmRspType5 5 > - > -/* message classes */ > -#define cmReqClass0 0 > -#define cmRspClass0 0 > - > -/* message codes */ > -#define cmReqHWConfig 1 /* 1,0,1 */ > -#define cmReqMsgLpbk 2 /* 1,0,2 */ > -#define cmReqVersion 3 /* 1,0,3 */ > -#define cmReqLoadProc 1 /* 2,0,1 */ > -#define cmReqStartProc 2 /* 2,0,2 */ > -#define cmReqReadMem 6 /* 2,0,6 */ > -#define cmRspHWConfig cmReqHWConfig > -#define cmRspMsgLpbk cmReqMsgLpbk > -#define cmRspVersion cmReqVersion > -#define cmRspLoadProc cmReqLoadProc > -#define cmRspStartProc cmReqStartProc > -#define cmRspReadMem cmReqReadMem > -#define cmRspMiscEngineUp 1 /* 5,0,1 */ > -#define cmRspInvalid 0 /* 0,0,0 */ > - > - > -/* > - * Firmware Request and Response Messages > - */ > - > -/* message types */ > -#define ceReqTypePhy 1 > -#define ceReqTypeLnk 2 > -#define ceReqTypeCall 3 > -#define ceReqTypeStat 1 > -#define ceRspTypeErr 0 > -#define ceRspTypePhy ceReqTypePhy > -#define ceRspTypeLnk ceReqTypeLnk > -#define ceRspTypeCall ceReqTypeCall > -#define ceRspTypeStat ceReqTypeStat > - > -/* message classes */ > -#define ceReqClass0 0 > -#define ceReqClass1 1 > -#define ceReqClass2 2 > -#define ceReqClass3 3 > -#define ceRspClass0 ceReqClass0 > -#define ceRspClass1 ceReqClass1 > -#define ceRspClass2 ceReqClass2 > -#define ceRspClass3 ceReqClass3 > - > -/* message codes (B) = BRI only, (P) = PRI only, (V) = POTS only */ > -#define ceReqPhyProcInfo 1 /* 1,0,1 */ > -#define ceReqPhyConnect 1 /* 1,1,1 */ > -#define ceReqPhyDisconnect 2 /* 1,1,2 */ > -#define ceReqPhySetParams 3 /* 1,1,3 (P) */ > -#define ceReqPhyGetParams 4 /* 1,1,4 (P) */ > -#define ceReqPhyStatus 1 /* 1,2,1 */ > -#define ceReqPhyAcfaStatus 2 /* 1,2,2 (P) */ > -#define ceReqPhyChCallState 3 /* 1,2,3 (P) */ > -#define ceReqPhyChServState 4 /* 1,2,4 (P) */ > -#define ceReqPhyRLoopBack 1 /* 1,3,1 */ > -#define ceRspPhyProcInfo ceReqPhyProcInfo > -#define ceRspPhyConnect ceReqPhyConnect > -#define ceRspPhyDisconnect ceReqPhyDisconnect > -#define ceRspPhySetParams ceReqPhySetParams > -#define ceRspPhyGetParams ceReqPhyGetParams > -#define ceRspPhyStatus ceReqPhyStatus > -#define ceRspPhyAcfaStatus ceReqPhyAcfaStatus > -#define ceRspPhyChCallState ceReqPhyChCallState > -#define ceRspPhyChServState ceReqPhyChServState > -#define ceRspPhyRLoopBack ceReqphyRLoopBack > -#define ceReqLnkSetParam 1 /* 2,0,1 */ > -#define ceReqLnkGetParam 2 /* 2,0,2 */ > -#define ceReqLnkGetStats 3 /* 2,0,3 */ > -#define ceReqLnkWrite 1 /* 2,1,1 */ > -#define ceReqLnkRead 2 /* 2,1,2 */ > -#define ceReqLnkFlush 3 /* 2,1,3 */ > -#define ceReqLnkWrBufTrc 4 /* 2,1,4 */ > -#define ceReqLnkRdBufTrc 5 /* 2,1,5 */ > -#define ceRspLnkSetParam ceReqLnkSetParam > -#define ceRspLnkGetParam ceReqLnkGetParam > -#define ceRspLnkGetStats ceReqLnkGetStats > -#define ceRspLnkWrite ceReqLnkWrite > -#define ceRspLnkRead ceReqLnkRead > -#define ceRspLnkFlush ceReqLnkFlush > -#define ceRspLnkWrBufTrc ceReqLnkWrBufTrc > -#define ceRspLnkRdBufTrc ceReqLnkRdBufTrc > -#define ceReqCallSetSwitchType 1 /* 3,0,1 */ > -#define ceReqCallGetSwitchType 2 /* 3,0,2 */ > -#define ceReqCallSetFrameFormat 3 /* 3,0,3 */ > -#define ceReqCallGetFrameFormat 4 /* 3,0,4 */ > -#define ceReqCallSetCallType 5 /* 3,0,5 */ > -#define ceReqCallGetCallType 6 /* 3,0,6 */ > -#define ceReqCallSetSPID 7 /* 3,0,7 (!P) */ > -#define ceReqCallGetSPID 8 /* 3,0,8 (!P) */ > -#define ceReqCallSetMyNumber 9 /* 3,0,9 (!P) */ > -#define ceReqCallGetMyNumber 10 /* 3,0,10 (!P) */ > -#define ceRspCallSetSwitchType ceReqCallSetSwitchType > -#define ceRspCallGetSwitchType ceReqCallSetSwitchType > -#define ceRspCallSetFrameFormat ceReqCallSetFrameFormat > -#define ceRspCallGetFrameFormat ceReqCallGetFrameFormat > -#define ceRspCallSetCallType ceReqCallSetCallType > -#define ceRspCallGetCallType ceReqCallGetCallType > -#define ceRspCallSetSPID ceReqCallSetSPID > -#define ceRspCallGetSPID ceReqCallGetSPID > -#define ceRspCallSetMyNumber ceReqCallSetMyNumber > -#define ceRspCallGetMyNumber ceReqCallGetMyNumber > -#define ceRspStatAcfaStatus 2 > -#define ceRspStat > -#define ceRspErrError 0 /* 0,0,0 */ > - > -/* > - * Call Types > - */ > -#define CALLTYPE_64K 0 > -#define CALLTYPE_56K 1 > -#define CALLTYPE_SPEECH 2 > -#define CALLTYPE_31KHZ 3 > - > -/* > - * Link Level data contains a pointer to and the length of > - * a buffer in shared RAM. Used by LnkRead and LnkWrite message > - * types. Part of RspMsgStruct and ReqMsgStruct. > - */ > -typedef struct { > - unsigned long buff_offset; > - unsigned short msg_len; > -} LLData; > - > - > -/* > - * Message payload template for an HWConfig message > - */ > -typedef struct { > - char st_u_sense; > - char powr_sense; > - char sply_sense; > - unsigned char asic_id; > - long ram_size; > - char serial_no[13]; > - char part_no[13]; > - char rev_no[2]; > -} HWConfig_pl; > - > -/* > - * A Message > - */ > -struct message { > - unsigned char sequence_no; > - unsigned char process_id; > - unsigned char time_stamp; > - unsigned char cmd_sequence_no; /* Rsp messages only */ > - unsigned char reserved1[3]; > - unsigned char msg_byte_cnt; > - unsigned char type; > - unsigned char class; > - unsigned char code; > - unsigned char phy_link_no; > - unsigned char rsp_status; /* Rsp messages only */ > - unsigned char reseved2[3]; > - union { > - unsigned char byte_array[MSG_DATA_LEN]; > - LLData response; > - HWConfig_pl HWCresponse; > - } msg_data; > -}; > - > -typedef struct message ReqMessage; /* Request message */ > -typedef struct message RspMessage; /* Response message */ > - > -/* > - * The first 5010 bytes of shared memory contain the message queues, > - * indexes and other data. This structure is its template > - */ > -typedef struct { > - volatile ReqMessage req_queue[MAX_MESSAGES]; > - volatile RspMessage rsp_queue[MAX_MESSAGES]; > - volatile unsigned char req_head; > - volatile unsigned char req_tail; > - volatile unsigned char rsp_head; > - volatile unsigned char rsp_tail; > - volatile unsigned long signature; > - volatile unsigned long trace_enable; > - volatile unsigned char reserved[4]; > -} DualPortMemory; > - > -#endif > diff --git a/drivers/isdn/sc/packet.c b/drivers/isdn/sc/packet.c > deleted file mode 100644 > index 2446957085e0..000000000000 > --- a/drivers/isdn/sc/packet.c > +++ /dev/null > @@ -1,204 +0,0 @@ > -/* $Id: packet.c,v 1.5.8.1 2001/09/23 22:24:59 kai Exp $ > - * > - * Copyright (C) 1996 SpellCaster Telecommunications Inc. > - * > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - * For more information, please contact gpl-info@spellcast.com or write: > - * > - * SpellCaster Telecommunications Inc. > - * 5621 Finch Avenue East, Unit #3 > - * Scarborough, Ontario Canada > - * M1B 2T9 > - * +1 (416) 297-8565 > - * +1 (416) 297-6433 Facsimile > - */ > - > -#include "includes.h" > -#include "hardware.h" > -#include "message.h" > -#include "card.h" > - > -int sndpkt(int devId, int channel, int ack, struct sk_buff *data) > -{ > - LLData ReqLnkWrite; > - int status; > - int card; > - unsigned long len; > - > - card = get_card_from_id(devId); > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - > - pr_debug("%s: sndpkt: frst = 0x%lx nxt = %d f = %d n = %d\n", > - sc_adapter[card]->devicename, > - sc_adapter[card]->channel[channel].first_sendbuf, > - sc_adapter[card]->channel[channel].next_sendbuf, > - sc_adapter[card]->channel[channel].free_sendbufs, > - sc_adapter[card]->channel[channel].num_sendbufs); > - > - if (!sc_adapter[card]->channel[channel].free_sendbufs) { > - pr_debug("%s: out of TX buffers\n", > - sc_adapter[card]->devicename); > - return -EINVAL; > - } > - > - if (data->len > BUFFER_SIZE) { > - pr_debug("%s: data overflows buffer size (data > buffer)\n", > - sc_adapter[card]->devicename); > - return -EINVAL; > - } > - > - ReqLnkWrite.buff_offset = sc_adapter[card]->channel[channel].next_sendbuf * > - BUFFER_SIZE + sc_adapter[card]->channel[channel].first_sendbuf; > - ReqLnkWrite.msg_len = data->len; /* sk_buff size */ > - pr_debug("%s: writing %d bytes to buffer offset 0x%lx\n", > - sc_adapter[card]->devicename, > - ReqLnkWrite.msg_len, ReqLnkWrite.buff_offset); > - memcpy_toshmem(card, (char *)ReqLnkWrite.buff_offset, data->data, ReqLnkWrite.msg_len); > - > - /* > - * sendmessage > - */ > - pr_debug("%s: sndpkt size=%d, buf_offset=0x%lx buf_indx=%d\n", > - sc_adapter[card]->devicename, > - ReqLnkWrite.msg_len, ReqLnkWrite.buff_offset, > - sc_adapter[card]->channel[channel].next_sendbuf); > - > - status = sendmessage(card, CEPID, ceReqTypeLnk, ceReqClass1, ceReqLnkWrite, > - channel + 1, sizeof(LLData), (unsigned int *)&ReqLnkWrite); > - len = data->len; > - if (status) { > - pr_debug("%s: failed to send packet, status = %d\n", > - sc_adapter[card]->devicename, status); > - return -1; > - } > - else { > - sc_adapter[card]->channel[channel].free_sendbufs--; > - sc_adapter[card]->channel[channel].next_sendbuf = > - ++sc_adapter[card]->channel[channel].next_sendbuf == > - sc_adapter[card]->channel[channel].num_sendbufs ? 0 : > - sc_adapter[card]->channel[channel].next_sendbuf; > - pr_debug("%s: packet sent successfully\n", sc_adapter[card]->devicename); > - dev_kfree_skb(data); > - indicate_status(card, ISDN_STAT_BSENT, channel, (char *)&len); > - } > - return len; > -} > - > -void rcvpkt(int card, RspMessage *rcvmsg) > -{ > - LLData newll; > - struct sk_buff *skb; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("invalid param: %d is not a valid card id\n", card); > - return; > - } > - > - switch (rcvmsg->rsp_status) { > - case 0x01: > - case 0x02: > - case 0x70: > - pr_debug("%s: error status code: 0x%x\n", > - sc_adapter[card]->devicename, rcvmsg->rsp_status); > - return; > - case 0x00: > - if (!(skb = dev_alloc_skb(rcvmsg->msg_data.response.msg_len))) { > - printk(KERN_WARNING "%s: rcvpkt out of memory, dropping packet\n", > - sc_adapter[card]->devicename); > - return; > - } > - skb_put(skb, rcvmsg->msg_data.response.msg_len); > - pr_debug("%s: getting data from offset: 0x%lx\n", > - sc_adapter[card]->devicename, > - rcvmsg->msg_data.response.buff_offset); > - memcpy_fromshmem(card, > - skb_put(skb, rcvmsg->msg_data.response.msg_len), > - (char *)rcvmsg->msg_data.response.buff_offset, > - rcvmsg->msg_data.response.msg_len); > - sc_adapter[card]->card->rcvcallb_skb(sc_adapter[card]->driverId, > - rcvmsg->phy_link_no - 1, skb); > - > - case 0x03: > - /* > - * Recycle the buffer > - */ > - pr_debug("%s: buffer size : %d\n", > - sc_adapter[card]->devicename, BUFFER_SIZE); > -/* memset_shmem(card, rcvmsg->msg_data.response.buff_offset, 0, BUFFER_SIZE); */ > - newll.buff_offset = rcvmsg->msg_data.response.buff_offset; > - newll.msg_len = BUFFER_SIZE; > - pr_debug("%s: recycled buffer at offset 0x%lx size %d\n", > - sc_adapter[card]->devicename, > - newll.buff_offset, newll.msg_len); > - sendmessage(card, CEPID, ceReqTypeLnk, ceReqClass1, ceReqLnkRead, > - rcvmsg->phy_link_no, sizeof(LLData), (unsigned int *)&newll); > - } > - > -} > - > -int setup_buffers(int card, int c) > -{ > - unsigned int nBuffers, i, cBase; > - unsigned int buffer_size; > - LLData RcvBuffOffset; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("invalid param: %d is not a valid card id\n", card); > - return -ENODEV; > - } > - > - /* > - * Calculate the buffer offsets (send/recv/send/recv) > - */ > - pr_debug("%s: setting up channel buffer space in shared RAM\n", > - sc_adapter[card]->devicename); > - buffer_size = BUFFER_SIZE; > - nBuffers = ((sc_adapter[card]->ramsize - BUFFER_BASE) / buffer_size) / 2; > - nBuffers = nBuffers > BUFFERS_MAX ? BUFFERS_MAX : nBuffers; > - pr_debug("%s: calculating buffer space: %d buffers, %d big\n", > - sc_adapter[card]->devicename, > - nBuffers, buffer_size); > - if (nBuffers < 2) { > - pr_debug("%s: not enough buffer space\n", > - sc_adapter[card]->devicename); > - return -1; > - } > - cBase = (nBuffers * buffer_size) * (c - 1); > - pr_debug("%s: channel buffer offset from shared RAM: 0x%x\n", > - sc_adapter[card]->devicename, cBase); > - sc_adapter[card]->channel[c - 1].first_sendbuf = BUFFER_BASE + cBase; > - sc_adapter[card]->channel[c - 1].num_sendbufs = nBuffers / 2; > - sc_adapter[card]->channel[c - 1].free_sendbufs = nBuffers / 2; > - sc_adapter[card]->channel[c - 1].next_sendbuf = 0; > - pr_debug("%s: send buffer setup complete: first=0x%lx n=%d f=%d, nxt=%d\n", > - sc_adapter[card]->devicename, > - sc_adapter[card]->channel[c - 1].first_sendbuf, > - sc_adapter[card]->channel[c - 1].num_sendbufs, > - sc_adapter[card]->channel[c - 1].free_sendbufs, > - sc_adapter[card]->channel[c - 1].next_sendbuf); > - > - /* > - * Prep the receive buffers > - */ > - pr_debug("%s: adding %d RecvBuffers:\n", > - sc_adapter[card]->devicename, nBuffers / 2); > - for (i = 0; i < nBuffers / 2; i++) { > - RcvBuffOffset.buff_offset = > - ((sc_adapter[card]->channel[c - 1].first_sendbuf + > - (nBuffers / 2) * buffer_size) + (buffer_size * i)); > - RcvBuffOffset.msg_len = buffer_size; > - pr_debug("%s: adding RcvBuffer #%d offset=0x%lx sz=%d bufsz:%d\n", > - sc_adapter[card]->devicename, > - i + 1, RcvBuffOffset.buff_offset, > - RcvBuffOffset.msg_len, buffer_size); > - sendmessage(card, CEPID, ceReqTypeLnk, ceReqClass1, ceReqLnkRead, > - c, sizeof(LLData), (unsigned int *)&RcvBuffOffset); > - } > - return 0; > -} > diff --git a/drivers/isdn/sc/scioc.h b/drivers/isdn/sc/scioc.h > deleted file mode 100644 > index a50e143779e7..000000000000 > --- a/drivers/isdn/sc/scioc.h > +++ /dev/null > @@ -1,110 +0,0 @@ > -#ifndef __ISDN_SC_SCIOC_H__ > -#define __ISDN_SC_SCIOC_H__ > - > -/* > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - */ > - > -/* > - * IOCTL Command Codes > - */ > -#define SCIOCLOAD 0x01 /* Load a firmware record */ > -#define SCIOCRESET 0x02 /* Perform hard reset */ > -#define SCIOCDEBUG 0x03 /* Set debug level */ > -#define SCIOCREV 0x04 /* Get driver revision(s) */ > -#define SCIOCSTART 0x05 /* Start the firmware */ > -#define SCIOCGETSWITCH 0x06 /* Get switch type */ > -#define SCIOCSETSWITCH 0x07 /* Set switch type */ > -#define SCIOCGETSPID 0x08 /* Get channel SPID */ > -#define SCIOCSETSPID 0x09 /* Set channel SPID */ > -#define SCIOCGETDN 0x0A /* Get channel DN */ > -#define SCIOCSETDN 0x0B /* Set channel DN */ > -#define SCIOCTRACE 0x0C /* Toggle trace mode */ > -#define SCIOCSTAT 0x0D /* Get line status */ > -#define SCIOCGETSPEED 0x0E /* Set channel speed */ > -#define SCIOCSETSPEED 0x0F /* Set channel speed */ > -#define SCIOCLOOPTST 0x10 /* Perform loopback test */ > - > -typedef struct { > - int device; > - int channel; > - unsigned long command; > - void __user *dataptr; > -} scs_ioctl; > - > -/* Size of strings */ > -#define SCIOC_SPIDSIZE 49 > -#define SCIOC_DNSIZE SCIOC_SPIDSIZE > -#define SCIOC_REVSIZE SCIOC_SPIDSIZE > -#define SCIOC_SRECSIZE 49 > - > -typedef struct { > - unsigned long tx_good; > - unsigned long tx_bad; > - unsigned long rx_good; > - unsigned long rx_bad; > -} ChLinkStats; > - > -typedef struct { > - char spid[49]; > - char dn[49]; > - char call_type; > - char phy_stat; > - ChLinkStats link_stats; > -} BRIStat; > - > -typedef BRIStat POTStat; > - > -typedef struct { > - char call_type; > - char call_state; > - char serv_state; > - char phy_stat; > - ChLinkStats link_stats; > -} PRIStat; > - > -typedef char PRIInfo; > -typedef char BRIInfo; > -typedef char POTInfo; > - > - > -typedef struct { > - char acfa_nos; > - char acfa_ais; > - char acfa_los; > - char acfa_rra; > - char acfa_slpp; > - char acfa_slpn; > - char acfa_fsrf; > -} ACFAStat; > - > -typedef struct { > - unsigned char modelid; > - char serial_no[13]; > - char part_no[13]; > - char load_ver[11]; > - char proc_ver[11]; > - int iobase; > - long rambase; > - char irq; > - long ramsize; > - char interface; > - char switch_type; > - char l1_status; > - char l2_status; > - ChLinkStats dch_stats; > - ACFAStat AcfaStats; > - union { > - PRIStat pristats[23]; > - BRIStat bristats[2]; > - POTStat potsstats[2]; > - } status; > - union { > - PRIInfo priinfo; > - BRIInfo briinfo; > - POTInfo potsinfo; > - } info; > -} boardInfo; > - > -#endif /* __ISDN_SC_SCIOC_H__ */ > diff --git a/drivers/isdn/sc/shmem.c b/drivers/isdn/sc/shmem.c > deleted file mode 100644 > index d24506ceb6e8..000000000000 > --- a/drivers/isdn/sc/shmem.c > +++ /dev/null > @@ -1,138 +0,0 @@ > -/* $Id: shmem.c,v 1.2.10.1 2001/09/23 22:24:59 kai Exp $ > - * > - * Copyright (C) 1996 SpellCaster Telecommunications Inc. > - * > - * Card functions implementing ISDN4Linux functionality > - * > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - * For more information, please contact gpl-info@spellcast.com or write: > - * > - * SpellCaster Telecommunications Inc. > - * 5621 Finch Avenue East, Unit #3 > - * Scarborough, Ontario Canada > - * M1B 2T9 > - * +1 (416) 297-8565 > - * +1 (416) 297-6433 Facsimile > - */ > - > -#include "includes.h" /* This must be first */ > -#include "hardware.h" > -#include "card.h" > - > -/* > - * > - */ > -void memcpy_toshmem(int card, void *dest, const void *src, size_t n) > -{ > - unsigned long flags; > - unsigned char ch; > - unsigned long dest_rem = ((unsigned long) dest) % 0x4000; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return; > - } > - > - if (n > SRAM_PAGESIZE) > - return; > - > - /* > - * determine the page to load from the address > - */ > - ch = (unsigned long) dest / SRAM_PAGESIZE; > - pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch); > - /* > - * Block interrupts and load the page > - */ > - spin_lock_irqsave(&sc_adapter[card]->lock, flags); > - > - outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80, > - sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); > - memcpy_toio((void __iomem *)(sc_adapter[card]->rambase + dest_rem), src, n); > - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); > - pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename, > - ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80); > - pr_debug("%s: copying %zu bytes from %#lx to %#lx\n", > - sc_adapter[card]->devicename, n, > - (unsigned long) src, > - sc_adapter[card]->rambase + ((unsigned long) dest % 0x4000)); > -} > - > -/* > - * Reverse of above > - */ > -void memcpy_fromshmem(int card, void *dest, const void *src, size_t n) > -{ > - unsigned long flags; > - unsigned char ch; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return; > - } > - > - if (n > SRAM_PAGESIZE) { > - return; > - } > - > - /* > - * determine the page to load from the address > - */ > - ch = (unsigned long) src / SRAM_PAGESIZE; > - pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch); > - > - > - /* > - * Block interrupts and load the page > - */ > - spin_lock_irqsave(&sc_adapter[card]->lock, flags); > - > - outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80, > - sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); > - memcpy_fromio(dest, (void *)(sc_adapter[card]->rambase + > - ((unsigned long) src % 0x4000)), n); > - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); > - pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename, > - ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80); > -/* pr_debug("%s: copying %d bytes from %#x to %#x\n", > - sc_adapter[card]->devicename, n, > - sc_adapter[card]->rambase + ((unsigned long) src %0x4000), (unsigned long) dest); */ > -} > - > -#if 0 > -void memset_shmem(int card, void *dest, int c, size_t n) > -{ > - unsigned long flags; > - unsigned char ch; > - > - if (!IS_VALID_CARD(card)) { > - pr_debug("Invalid param: %d is not a valid card id\n", card); > - return; > - } > - > - if (n > SRAM_PAGESIZE) { > - return; > - } > - > - /* > - * determine the page to load from the address > - */ > - ch = (unsigned long) dest / SRAM_PAGESIZE; > - pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch); > - > - /* > - * Block interrupts and load the page > - */ > - spin_lock_irqsave(&sc_adapter[card]->lock, flags); > - > - outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80, > - sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); > - memset_io(sc_adapter[card]->rambase + > - ((unsigned long) dest % 0x4000), c, n); > - pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename, > - ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80); > - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); > -} > -#endif /* 0 */ > diff --git a/drivers/isdn/sc/timer.c b/drivers/isdn/sc/timer.c > deleted file mode 100644 > index 6fbac2230d7e..000000000000 > --- a/drivers/isdn/sc/timer.c > +++ /dev/null > @@ -1,122 +0,0 @@ > -/* $Id: timer.c,v 1.3.6.1 2001/09/23 22:24:59 kai Exp $ > - * > - * Copyright (C) 1996 SpellCaster Telecommunications Inc. > - * > - * This software may be used and distributed according to the terms > - * of the GNU General Public License, incorporated herein by reference. > - * > - * For more information, please contact gpl-info@spellcast.com or write: > - * > - * SpellCaster Telecommunications Inc. > - * 5621 Finch Avenue East, Unit #3 > - * Scarborough, Ontario Canada > - * M1B 2T9 > - * +1 (416) 297-8565 > - * +1 (416) 297-6433 Facsimile > - */ > - > -#include "includes.h" > -#include "hardware.h" > -#include "message.h" > -#include "card.h" > - > - > -/* > - * Write the proper values into the I/O ports following a reset > - */ > -static void setup_ports(int card) > -{ > - > - outb((sc_adapter[card]->rambase >> 12), sc_adapter[card]->ioport[EXP_BASE]); > - > - /* And the IRQ */ > - outb((sc_adapter[card]->interrupt | 0x80), > - sc_adapter[card]->ioport[IRQ_SELECT]); > -} > - > -/* > - * Timed function to check the status of a previous reset > - * Must be very fast as this function runs in the context of > - * an interrupt handler. > - * > - * Setup the ioports for the board that were cleared by the reset. > - * Then, check to see if the signate has been set. Next, set the > - * signature to a known value and issue a startproc if needed. > - */ > -void sc_check_reset(unsigned long data) > -{ > - unsigned long flags; > - unsigned long sig; > - int card = (unsigned int) data; > - > - pr_debug("%s: check_timer timer called\n", > - sc_adapter[card]->devicename); > - > - /* Setup the io ports */ > - setup_ports(card); > - > - spin_lock_irqsave(&sc_adapter[card]->lock, flags); > - outb(sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport], > - (sc_adapter[card]->shmem_magic >> 14) | 0x80); > - sig = (unsigned long) *((unsigned long *)(sc_adapter[card]->rambase + SIG_OFFSET)); > - > - /* check the signature */ > - if (sig == SIGNATURE) { > - flushreadfifo(card); > - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); > - /* See if we need to do a startproc */ > - if (sc_adapter[card]->StartOnReset) > - startproc(card); > - } else { > - pr_debug("%s: No signature yet, waiting another %lu jiffies.\n", > - sc_adapter[card]->devicename, CHECKRESET_TIME); > - mod_timer(&sc_adapter[card]->reset_timer, jiffies + CHECKRESET_TIME); > - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); > - } > -} > - > -/* > - * Timed function to check the status of a previous reset > - * Must be very fast as this function runs in the context of > - * an interrupt handler. > - * > - * Send check sc_adapter->phystat to see if the channels are up > - * If they are, tell ISDN4Linux that the board is up. If not, > - * tell IADN4Linux that it is up. Always reset the timer to > - * fire again (endless loop). > - */ > -void check_phystat(unsigned long data) > -{ > - unsigned long flags; > - int card = (unsigned int) data; > - > - pr_debug("%s: Checking status...\n", sc_adapter[card]->devicename); > - /* > - * check the results of the last PhyStat and change only if > - * has changed drastically > - */ > - if (sc_adapter[card]->nphystat && !sc_adapter[card]->phystat) { /* All is well */ > - pr_debug("PhyStat transition to RUN\n"); > - pr_info("%s: Switch contacted, transmitter enabled\n", > - sc_adapter[card]->devicename); > - indicate_status(card, ISDN_STAT_RUN, 0, NULL); > - } > - else if (!sc_adapter[card]->nphystat && sc_adapter[card]->phystat) { /* All is not well */ > - pr_debug("PhyStat transition to STOP\n"); > - pr_info("%s: Switch connection lost, transmitter disabled\n", > - sc_adapter[card]->devicename); > - > - indicate_status(card, ISDN_STAT_STOP, 0, NULL); > - } > - > - sc_adapter[card]->phystat = sc_adapter[card]->nphystat; > - > - /* Reinitialize the timer */ > - spin_lock_irqsave(&sc_adapter[card]->lock, flags); > - mod_timer(&sc_adapter[card]->stat_timer, jiffies + CHECKSTAT_TIME); > - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); > - > - /* Send a new cePhyStatus message */ > - sendmessage(card, CEPID, ceReqTypePhy, ceReqClass2, > - ceReqPhyStatus, 0, 0, NULL); > -} > > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Arnd Bergmann <arnd@arndb.de> Date: Mon, 30 Nov 2015 11:34:09 +0100 > The 'sc' ISDN driver relies on using readl() to access ISA I/O memory. > This has been deprecated and produced warnings since linux-2.3.23, > disabled by default since 2.4.10 and finally removed in 2.6.5. > > I found this because the compiling the driver for ARM produces > a warning: > > In file included from ../drivers/isdn/sc/includes.h:8:0, > from ../drivers/isdn/sc/init.c:13: > ../arch/arm/include/asm/io.h:115:21: note: expected 'const volatile void *' but argument is of type 'long unsigned int' > > It is pretty clear that this driver has not been used for a long time > and there is no point fixing it now, so let's remove it. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > There has been some discussion about removing all the ISA based ISDN > drivers in the past. I'm not trying to restart that discussion at the > moment, and I did not find the same bug in the other drivers, so > let's just remove this one for now. Applied to net-next, we can resurrect+fix this driver if someone actually uses it. Thanks Arnd. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/isdn/Makefile b/drivers/isdn/Makefile index f1f777570e8e..91c81965e7ca 100644 --- a/drivers/isdn/Makefile +++ b/drivers/isdn/Makefile @@ -10,7 +10,6 @@ obj-$(CONFIG_ISDN_DIVERSION) += divert/ obj-$(CONFIG_ISDN_DRV_HISAX) += hisax/ obj-$(CONFIG_ISDN_DRV_ICN) += icn/ obj-$(CONFIG_ISDN_DRV_PCBIT) += pcbit/ -obj-$(CONFIG_ISDN_DRV_SC) += sc/ obj-$(CONFIG_ISDN_DRV_LOOP) += isdnloop/ obj-$(CONFIG_ISDN_DRV_ACT2000) += act2000/ obj-$(CONFIG_HYSDN) += hysdn/ diff --git a/drivers/isdn/i4l/Kconfig b/drivers/isdn/i4l/Kconfig index 9c6650ea848e..f5b714cd7618 100644 --- a/drivers/isdn/i4l/Kconfig +++ b/drivers/isdn/i4l/Kconfig @@ -130,8 +130,6 @@ source "drivers/isdn/icn/Kconfig" source "drivers/isdn/pcbit/Kconfig" -source "drivers/isdn/sc/Kconfig" - source "drivers/isdn/act2000/Kconfig" endmenu diff --git a/drivers/isdn/sc/Kconfig b/drivers/isdn/sc/Kconfig deleted file mode 100644 index 7469863a7925..000000000000 --- a/drivers/isdn/sc/Kconfig +++ /dev/null @@ -1,8 +0,0 @@ -config ISDN_DRV_SC - tristate "Spellcaster support" - depends on ISA - help - This enables support for the Spellcaster BRI ISDN boards. This - driver currently builds only in a modularized version. - To build it, choose M here: the module will be called sc. - See <file:Documentation/isdn/README.sc> for more information. diff --git a/drivers/isdn/sc/Makefile b/drivers/isdn/sc/Makefile deleted file mode 100644 index 0f2b7d602ac0..000000000000 --- a/drivers/isdn/sc/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# Makefile for the sc ISDN device driver - -# Each configuration option enables a list of files. - -obj-$(CONFIG_ISDN_DRV_SC) += sc.o - -# Multipart objects. - -sc-y := shmem.o init.o packet.o command.o event.o \ - ioctl.o interrupt.o message.o timer.o diff --git a/drivers/isdn/sc/card.h b/drivers/isdn/sc/card.h deleted file mode 100644 index 3da69ee43da7..000000000000 --- a/drivers/isdn/sc/card.h +++ /dev/null @@ -1,131 +0,0 @@ -/* $Id: card.h,v 1.1.10.1 2001/09/23 22:24:59 kai Exp $ - * - * Driver parameters for SpellCaster ISA ISDN adapters - * - * Copyright (C) 1996 SpellCaster Telecommunications Inc. - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - * For more information, please contact gpl-info@spellcast.com or write: - * - * SpellCaster Telecommunications Inc. - * 5621 Finch Avenue East, Unit #3 - * Scarborough, Ontario Canada - * M1B 2T9 - * +1 (416) 297-8565 - * +1 (416) 297-6433 Facsimile - */ - -#ifndef CARD_H -#define CARD_H - -/* - * We need these if they're not already included - */ -#include <linux/timer.h> -#include <linux/time.h> -#include <linux/isdnif.h> -#include <linux/irqreturn.h> -#include "message.h" -#include "scioc.h" - -/* - * Amount of time to wait for a reset to complete - */ -#define CHECKRESET_TIME msecs_to_jiffies(4000) - -/* - * Amount of time between line status checks - */ -#define CHECKSTAT_TIME msecs_to_jiffies(8000) - -/* - * The maximum amount of time to wait for a message response - * to arrive. Use exclusively by send_and_receive - */ -#define SAR_TIMEOUT msecs_to_jiffies(10000) - -/* - * Macro to determine is a card id is valid - */ -#define IS_VALID_CARD(x) ((x >= 0) && (x <= cinst)) - -/* - * Per channel status and configuration - */ -typedef struct { - int l2_proto; - int l3_proto; - char dn[50]; - unsigned long first_sendbuf; /* Offset of first send buffer */ - unsigned int num_sendbufs; /* Number of send buffers */ - unsigned int free_sendbufs; /* Number of free sendbufs */ - unsigned int next_sendbuf; /* Next sequential buffer */ - char eazlist[50]; /* Set with SETEAZ */ - char sillist[50]; /* Set with SETSIL */ - int eazclear; /* Don't accept calls if TRUE */ -} bchan; - -/* - * Everything you want to know about the adapter ... - */ -typedef struct { - int model; - int driverId; /* LL Id */ - char devicename[20]; /* The device name */ - isdn_if *card; /* ISDN4Linux structure */ - bchan *channel; /* status of the B channels */ - char nChannels; /* Number of channels */ - unsigned int interrupt; /* Interrupt number */ - int iobase; /* I/O Base address */ - int ioport[MAX_IO_REGS]; /* Index to I/O ports */ - int shmem_pgport; /* port for the exp mem page reg. */ - int shmem_magic; /* adapter magic number */ - unsigned int rambase; /* Shared RAM base address */ - unsigned int ramsize; /* Size of shared memory */ - RspMessage async_msg; /* Async response message */ - int want_async_messages; /* Snoop the Q ? */ - unsigned char seq_no; /* Next send seq. number */ - struct timer_list reset_timer; /* Check reset timer */ - struct timer_list stat_timer; /* Check startproc timer */ - unsigned char nphystat; /* Latest PhyStat info */ - unsigned char phystat; /* Last PhyStat info */ - HWConfig_pl hwconfig; /* Hardware config info */ - char load_ver[11]; /* CommManage Version string */ - char proc_ver[11]; /* CommEngine Version */ - int StartOnReset; /* Indicates startproc after reset */ - int EngineUp; /* Indicates CommEngine Up */ - int trace_mode; /* Indicate if tracing is on */ - spinlock_t lock; /* local lock */ -} board; - - -extern board *sc_adapter[]; -extern int cinst; - -void memcpy_toshmem(int card, void *dest, const void *src, size_t n); -void memcpy_fromshmem(int card, void *dest, const void *src, size_t n); -int get_card_from_id(int driver); -int indicate_status(int card, int event, ulong Channel, char *Data); -irqreturn_t interrupt_handler(int interrupt, void *cardptr); -int sndpkt(int devId, int channel, int ack, struct sk_buff *data); -void rcvpkt(int card, RspMessage *rcvmsg); -int command(isdn_ctrl *cmd); -int reset(int card); -int startproc(int card); -int send_and_receive(int card, unsigned int procid, unsigned char type, - unsigned char class, unsigned char code, - unsigned char link, unsigned char data_len, - unsigned char *data, RspMessage *mesgdata, int timeout); -void flushreadfifo(int card); -int sendmessage(int card, unsigned int procid, unsigned int type, - unsigned int class, unsigned int code, unsigned int link, - unsigned int data_len, unsigned int *data); -int receivemessage(int card, RspMessage *rspmsg); -int sc_ioctl(int card, scs_ioctl *data); -int setup_buffers(int card, int c); -void sc_check_reset(unsigned long data); -void check_phystat(unsigned long data); - -#endif /* CARD_H */ diff --git a/drivers/isdn/sc/command.c b/drivers/isdn/sc/command.c deleted file mode 100644 index 4a4e66152ce7..000000000000 --- a/drivers/isdn/sc/command.c +++ /dev/null @@ -1,363 +0,0 @@ -/* $Id: command.c,v 1.4.10.1 2001/09/23 22:24:59 kai Exp $ - * - * Copyright (C) 1996 SpellCaster Telecommunications Inc. - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - * For more information, please contact gpl-info@spellcast.com or write: - * - * SpellCaster Telecommunications Inc. - * 5621 Finch Avenue East, Unit #3 - * Scarborough, Ontario Canada - * M1B 2T9 - * +1 (416) 297-8565 - * +1 (416) 297-6433 Facsimile - */ - -#include <linux/module.h> -#include "includes.h" /* This must be first */ -#include "hardware.h" -#include "message.h" -#include "card.h" -#include "scioc.h" - -static int dial(int card, unsigned long channel, setup_parm setup); -static int hangup(int card, unsigned long channel); -static int answer(int card, unsigned long channel); -static int clreaz(int card, unsigned long channel); -static int seteaz(int card, unsigned long channel, char *); -static int setl2(int card, unsigned long arg); -static int setl3(int card, unsigned long arg); -static int acceptb(int card, unsigned long channel); - -#ifdef DEBUG -/* - * Translate command codes to strings - */ -static char *commands[] = { "ISDN_CMD_IOCTL", - "ISDN_CMD_DIAL", - "ISDN_CMD_ACCEPTB", - "ISDN_CMD_ACCEPTB", - "ISDN_CMD_HANGUP", - "ISDN_CMD_CLREAZ", - "ISDN_CMD_SETEAZ", - NULL, - NULL, - NULL, - "ISDN_CMD_SETL2", - NULL, - "ISDN_CMD_SETL3", - NULL, - NULL, - NULL, - NULL, - NULL, }; - -/* - * Translates ISDN4Linux protocol codes to strings for debug messages - */ -static char *l3protos[] = { "ISDN_PROTO_L3_TRANS" }; -static char *l2protos[] = { "ISDN_PROTO_L2_X75I", - "ISDN_PROTO_L2_X75UI", - "ISDN_PROTO_L2_X75BUI", - "ISDN_PROTO_L2_HDLC", - "ISDN_PROTO_L2_TRANS" }; -#endif - -int get_card_from_id(int driver) -{ - int i; - - for (i = 0; i < cinst; i++) { - if (sc_adapter[i]->driverId == driver) - return i; - } - return -ENODEV; -} - -/* - * command - */ - -int command(isdn_ctrl *cmd) -{ - int card; - - card = get_card_from_id(cmd->driver); - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - - /* - * Dispatch the command - */ - switch (cmd->command) { - case ISDN_CMD_IOCTL: - { - unsigned long cmdptr; - scs_ioctl ioc; - - memcpy(&cmdptr, cmd->parm.num, sizeof(unsigned long)); - if (copy_from_user(&ioc, (scs_ioctl __user *)cmdptr, - sizeof(scs_ioctl))) { - pr_debug("%s: Failed to verify user space 0x%lx\n", - sc_adapter[card]->devicename, cmdptr); - return -EFAULT; - } - return sc_ioctl(card, &ioc); - } - case ISDN_CMD_DIAL: - return dial(card, cmd->arg, cmd->parm.setup); - case ISDN_CMD_HANGUP: - return hangup(card, cmd->arg); - case ISDN_CMD_ACCEPTD: - return answer(card, cmd->arg); - case ISDN_CMD_ACCEPTB: - return acceptb(card, cmd->arg); - case ISDN_CMD_CLREAZ: - return clreaz(card, cmd->arg); - case ISDN_CMD_SETEAZ: - return seteaz(card, cmd->arg, cmd->parm.num); - case ISDN_CMD_SETL2: - return setl2(card, cmd->arg); - case ISDN_CMD_SETL3: - return setl3(card, cmd->arg); - default: - return -EINVAL; - } - return 0; -} - -/* - * start the onboard firmware - */ -int startproc(int card) -{ - int status; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - - /* - * send start msg - */ - status = sendmessage(card, CMPID, cmReqType2, - cmReqClass0, - cmReqStartProc, - 0, 0, NULL); - pr_debug("%s: Sent startProc\n", sc_adapter[card]->devicename); - - return status; -} - - -/* - * Dials the number passed in - */ -static int dial(int card, unsigned long channel, setup_parm setup) -{ - int status; - char Phone[48]; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - - /*extract ISDN number to dial from eaz/msn string*/ - strcpy(Phone, setup.phone); - - /*send the connection message*/ - status = sendmessage(card, CEPID, ceReqTypePhy, - ceReqClass1, - ceReqPhyConnect, - (unsigned char)channel + 1, - strlen(Phone), - (unsigned int *)Phone); - - pr_debug("%s: Dialing %s on channel %lu\n", - sc_adapter[card]->devicename, Phone, channel + 1); - - return status; -} - -/* - * Answer an incoming call - */ -static int answer(int card, unsigned long channel) -{ - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - - if (setup_buffers(card, channel + 1)) { - hangup(card, channel + 1); - return -ENOBUFS; - } - - indicate_status(card, ISDN_STAT_BCONN, channel, NULL); - pr_debug("%s: Answered incoming call on channel %lu\n", - sc_adapter[card]->devicename, channel + 1); - return 0; -} - -/* - * Hangup up the call on specified channel - */ -static int hangup(int card, unsigned long channel) -{ - int status; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - - status = sendmessage(card, CEPID, ceReqTypePhy, - ceReqClass1, - ceReqPhyDisconnect, - (unsigned char)channel + 1, - 0, - NULL); - pr_debug("%s: Sent HANGUP message to channel %lu\n", - sc_adapter[card]->devicename, channel + 1); - return status; -} - -/* - * Set the layer 2 protocol (X.25, HDLC, Raw) - */ -static int setl2(int card, unsigned long arg) -{ - int status = 0; - int protocol, channel; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - protocol = arg >> 8; - channel = arg & 0xff; - sc_adapter[card]->channel[channel].l2_proto = protocol; - - /* - * check that the adapter is also set to the correct protocol - */ - pr_debug("%s: Sending GetFrameFormat for channel %d\n", - sc_adapter[card]->devicename, channel + 1); - status = sendmessage(card, CEPID, ceReqTypeCall, - ceReqClass0, - ceReqCallGetFrameFormat, - (unsigned char)channel + 1, - 1, - (unsigned int *)protocol); - if (status) - return status; - return 0; -} - -/* - * Set the layer 3 protocol - */ -static int setl3(int card, unsigned long channel) -{ - int protocol = channel >> 8; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - - sc_adapter[card]->channel[channel].l3_proto = protocol; - return 0; -} - -static int acceptb(int card, unsigned long channel) -{ - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - - if (setup_buffers(card, channel + 1)) - { - hangup(card, channel + 1); - return -ENOBUFS; - } - - pr_debug("%s: B-Channel connection accepted on channel %lu\n", - sc_adapter[card]->devicename, channel + 1); - indicate_status(card, ISDN_STAT_BCONN, channel, NULL); - return 0; -} - -static int clreaz(int card, unsigned long arg) -{ - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - - strcpy(sc_adapter[card]->channel[arg].eazlist, ""); - sc_adapter[card]->channel[arg].eazclear = 1; - pr_debug("%s: EAZ List cleared for channel %lu\n", - sc_adapter[card]->devicename, arg + 1); - return 0; -} - -static int seteaz(int card, unsigned long arg, char *num) -{ - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - - strcpy(sc_adapter[card]->channel[arg].eazlist, num); - sc_adapter[card]->channel[arg].eazclear = 0; - pr_debug("%s: EAZ list for channel %lu set to: %s\n", - sc_adapter[card]->devicename, arg + 1, - sc_adapter[card]->channel[arg].eazlist); - return 0; -} - -int reset(int card) -{ - unsigned long flags; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - - indicate_status(card, ISDN_STAT_STOP, 0, NULL); - - if (sc_adapter[card]->EngineUp) { - del_timer(&sc_adapter[card]->stat_timer); - } - - sc_adapter[card]->EngineUp = 0; - - spin_lock_irqsave(&sc_adapter[card]->lock, flags); - init_timer(&sc_adapter[card]->reset_timer); - sc_adapter[card]->reset_timer.function = sc_check_reset; - sc_adapter[card]->reset_timer.data = card; - sc_adapter[card]->reset_timer.expires = jiffies + CHECKRESET_TIME; - add_timer(&sc_adapter[card]->reset_timer); - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); - - outb(0x1, sc_adapter[card]->ioport[SFT_RESET]); - - pr_debug("%s: Adapter Reset\n", sc_adapter[card]->devicename); - return 0; -} - -void flushreadfifo(int card) -{ - while (inb(sc_adapter[card]->ioport[FIFO_STATUS]) & RF_HAS_DATA) - inb(sc_adapter[card]->ioport[FIFO_READ]); -} diff --git a/drivers/isdn/sc/event.c b/drivers/isdn/sc/event.c deleted file mode 100644 index 833d96c2cf92..000000000000 --- a/drivers/isdn/sc/event.c +++ /dev/null @@ -1,68 +0,0 @@ -/* $Id: event.c,v 1.4.8.1 2001/09/23 22:24:59 kai Exp $ - * - * Copyright (C) 1996 SpellCaster Telecommunications Inc. - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - * For more information, please contact gpl-info@spellcast.com or write: - * - * SpellCaster Telecommunications Inc. - * 5621 Finch Avenue East, Unit #3 - * Scarborough, Ontario Canada - * M1B 2T9 - * +1 (416) 297-8565 - * +1 (416) 297-6433 Facsimile - */ - -#include "includes.h" -#include "hardware.h" -#include "message.h" -#include "card.h" - -#ifdef DEBUG -static char *events[] = { "ISDN_STAT_STAVAIL", - "ISDN_STAT_ICALL", - "ISDN_STAT_RUN", - "ISDN_STAT_STOP", - "ISDN_STAT_DCONN", - "ISDN_STAT_BCONN", - "ISDN_STAT_DHUP", - "ISDN_STAT_BHUP", - "ISDN_STAT_CINF", - "ISDN_STAT_LOAD", - "ISDN_STAT_UNLOAD", - "ISDN_STAT_BSENT", - "ISDN_STAT_NODCH", - "ISDN_STAT_ADDCH", - "ISDN_STAT_CAUSE" }; -#endif - -int indicate_status(int card, int event, ulong Channel, char *Data) -{ - isdn_ctrl cmd; - -#ifdef DEBUG - pr_debug("%s: Indicating event %s on Channel %d\n", - sc_adapter[card]->devicename, events[event - 256], Channel); -#endif - if (Data != NULL) { - pr_debug("%s: Event data: %s\n", sc_adapter[card]->devicename, - Data); - switch (event) { - case ISDN_STAT_BSENT: - memcpy(&cmd.parm.length, Data, sizeof(cmd.parm.length)); - break; - case ISDN_STAT_ICALL: - memcpy(&cmd.parm.setup, Data, sizeof(cmd.parm.setup)); - break; - default: - strlcpy(cmd.parm.num, Data, sizeof(cmd.parm.num)); - } - } - - cmd.command = event; - cmd.driver = sc_adapter[card]->driverId; - cmd.arg = Channel; - return sc_adapter[card]->card->statcallb(&cmd); -} diff --git a/drivers/isdn/sc/hardware.h b/drivers/isdn/sc/hardware.h deleted file mode 100644 index 81fbe78701f0..000000000000 --- a/drivers/isdn/sc/hardware.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Hardware specific macros, defines and structures - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - */ - -#ifndef HARDWARE_H -#define HARDWARE_H - -#include <asm/param.h> /* For HZ */ - -/* - * General hardware parameters common to all ISA adapters - */ - -#define MAX_CARDS 4 /* The maximum number of cards to - control or probe for. */ - -#define SIGNATURE 0x87654321 /* Board reset signature */ -#define SIG_OFFSET 0x1004 /* Where to find signature in shared RAM */ -#define TRACE_OFFSET 0x1008 /* Trace enable word offset in shared RAM */ -#define BUFFER_OFFSET 0x1800 /* Beginning of buffers */ - -/* I/O Port parameters */ -#define IOBASE_MIN 0x180 /* Lowest I/O port address */ -#define IOBASE_MAX 0x3C0 /* Highest I/O port address */ -#define IOBASE_OFFSET 0x20 /* Inter-board I/O port gap used during - probing */ -#define FIFORD_OFFSET 0x0 -#define FIFOWR_OFFSET 0x400 -#define FIFOSTAT_OFFSET 0x1000 -#define RESET_OFFSET 0x2800 -#define PG0_OFFSET 0x3000 /* Offset from I/O Base for Page 0 register */ -#define PG1_OFFSET 0x3400 /* Offset from I/O Base for Page 1 register */ -#define PG2_OFFSET 0x3800 /* Offset from I/O Base for Page 2 register */ -#define PG3_OFFSET 0x3C00 /* Offset from I/O Base for Page 3 register */ - -#define FIFO_READ 0 /* FIFO Read register */ -#define FIFO_WRITE 1 /* FIFO Write rgister */ -#define LO_ADDR_PTR 2 /* Extended RAM Low Addr Pointer */ -#define HI_ADDR_PTR 3 /* Extended RAM High Addr Pointer */ -#define NOT_USED_1 4 -#define FIFO_STATUS 5 /* FIFO Status Register */ -#define NOT_USED_2 6 -#define MEM_OFFSET 7 -#define SFT_RESET 10 /* Reset Register */ -#define EXP_BASE 11 /* Shared RAM Base address */ -#define EXP_PAGE0 12 /* Shared RAM Page0 register */ -#define EXP_PAGE1 13 /* Shared RAM Page1 register */ -#define EXP_PAGE2 14 /* Shared RAM Page2 register */ -#define EXP_PAGE3 15 /* Shared RAM Page3 register */ -#define IRQ_SELECT 16 /* IRQ selection register */ -#define MAX_IO_REGS 17 /* Total number of I/O ports */ - -/* FIFO register values */ -#define RF_HAS_DATA 0x01 /* fifo has data */ -#define RF_QUART_FULL 0x02 /* fifo quarter full */ -#define RF_HALF_FULL 0x04 /* fifo half full */ -#define RF_NOT_FULL 0x08 /* fifo not full */ -#define WF_HAS_DATA 0x10 /* fifo has data */ -#define WF_QUART_FULL 0x20 /* fifo quarter full */ -#define WF_HALF_FULL 0x40 /* fifo half full */ -#define WF_NOT_FULL 0x80 /* fifo not full */ - -/* Shared RAM parameters */ -#define SRAM_MIN 0xC0000 /* Lowest host shared RAM address */ -#define SRAM_MAX 0xEFFFF /* Highest host shared RAM address */ -#define SRAM_PAGESIZE 0x4000 /* Size of one RAM page (16K) */ - -/* Shared RAM buffer parameters */ -#define BUFFER_SIZE 0x800 /* The size of a buffer in bytes */ -#define BUFFER_BASE BUFFER_OFFSET /* Offset from start of shared RAM - where buffer start */ -#define BUFFERS_MAX 16 /* Maximum number of send/receive - buffers per channel */ -#define HDLC_PROTO 0x01 /* Frame Format for Layer 2 */ - -#define BRI_BOARD 0 -#define POTS_BOARD 1 -#define PRI_BOARD 2 - -/* - * Specific hardware parameters for the DataCommute/BRI - */ -#define BRI_CHANNELS 2 /* Number of B channels */ -#define BRI_BASEPG_VAL 0x98 -#define BRI_MAGIC 0x60000 /* Magic Number */ -#define BRI_MEMSIZE 0x10000 /* Amount of RAM (64K) */ -#define BRI_PARTNO "72-029" -#define BRI_FEATURES ISDN_FEATURE_L2_HDLC | ISDN_FEATURE_L3_TRANS; -/* - * Specific hardware parameters for the DataCommute/PRI - */ -#define PRI_CHANNELS 23 /* Number of B channels */ -#define PRI_BASEPG_VAL 0x88 -#define PRI_MAGIC 0x20000 /* Magic Number */ -#define PRI_MEMSIZE 0x100000 /* Amount of RAM (1M) */ -#define PRI_PARTNO "72-030" -#define PRI_FEATURES ISDN_FEATURE_L2_HDLC | ISDN_FEATURE_L3_TRANS; - -/* - * Some handy macros - */ - -/* Determine if a channel number is valid for the adapter */ -#define IS_VALID_CHANNEL(y, x) ((x > 0) && (x <= sc_adapter[y]->channels)) - -#endif diff --git a/drivers/isdn/sc/includes.h b/drivers/isdn/sc/includes.h deleted file mode 100644 index 4766e5b77378..000000000000 --- a/drivers/isdn/sc/includes.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - */ - -#include <linux/errno.h> -#include <asm/io.h> -#include <linux/delay.h> -#include <linux/kernel.h> -#include <linux/slab.h> -#include <linux/mm.h> -#include <linux/ioport.h> -#include <linux/timer.h> -#include <linux/wait.h> -#include <linux/isdnif.h> diff --git a/drivers/isdn/sc/init.c b/drivers/isdn/sc/init.c deleted file mode 100644 index 3597ef47b28a..000000000000 --- a/drivers/isdn/sc/init.c +++ /dev/null @@ -1,549 +0,0 @@ -/* - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/interrupt.h> -#include <linux/delay.h> -#include <linux/sched.h> -#include <linux/slab.h> -#include "includes.h" -#include "hardware.h" -#include "card.h" - -MODULE_DESCRIPTION("ISDN4Linux: Driver for Spellcaster card"); -MODULE_AUTHOR("Spellcaster Telecommunications Inc."); -MODULE_LICENSE("GPL"); - -board *sc_adapter[MAX_CARDS]; -int cinst; - -static char devname[] = "scX"; -static const char version[] = "2.0b1"; - -static const char *boardname[] = { "DataCommute/BRI", "DataCommute/PRI", "TeleCommute/BRI" }; - -/* insmod set parameters */ -static unsigned int io[] = {0, 0, 0, 0}; -static unsigned char irq[] = {0, 0, 0, 0}; -static unsigned long ram[] = {0, 0, 0, 0}; -static bool do_reset; - -module_param_array(io, int, NULL, 0); -module_param_array(irq, byte, NULL, 0); -module_param_array(ram, long, NULL, 0); -module_param(do_reset, bool, 0); - -static int identify_board(unsigned long, unsigned int); - -static int __init sc_init(void) -{ - int b = -1; - int i, j; - int status = -ENODEV; - - unsigned long memsize = 0; - unsigned long features = 0; - isdn_if *interface; - unsigned char channels; - unsigned char pgport; - unsigned long magic; - int model; - int last_base = IOBASE_MIN; - int probe_exhasted = 0; - -#ifdef MODULE - pr_info("SpellCaster ISA ISDN Adapter Driver rev. %s Loaded\n", version); -#else - pr_info("SpellCaster ISA ISDN Adapter Driver rev. %s\n", version); -#endif - pr_info("Copyright (C) 1996 SpellCaster Telecommunications Inc.\n"); - - while (b++ < MAX_CARDS - 1) { - pr_debug("Probing for adapter #%d\n", b); - /* - * Initialize reusable variables - */ - model = -1; - magic = 0; - channels = 0; - pgport = 0; - - /* - * See if we should probe for IO base - */ - pr_debug("I/O Base for board %d is 0x%x, %s probe\n", b, io[b], - io[b] == 0 ? "will" : "won't"); - if (io[b]) { - /* - * No, I/O Base has been provided - */ - for (i = 0; i < MAX_IO_REGS - 1; i++) { - if (!request_region(io[b] + i * 0x400, 1, "sc test")) { - pr_debug("request_region for 0x%x failed\n", io[b] + i * 0x400); - io[b] = 0; - break; - } else - release_region(io[b] + i * 0x400, 1); - } - - /* - * Confirm the I/O Address with a test - */ - if (io[b] == 0) { - pr_debug("I/O Address invalid.\n"); - continue; - } - - outb(0x18, io[b] + 0x400 * EXP_PAGE0); - if (inb(io[b] + 0x400 * EXP_PAGE0) != 0x18) { - pr_debug("I/O Base 0x%x fails test\n", - io[b] + 0x400 * EXP_PAGE0); - continue; - } - } else { - /* - * Yes, probe for I/O Base - */ - if (probe_exhasted) { - pr_debug("All probe addresses exhausted, skipping\n"); - continue; - } - pr_debug("Probing for I/O...\n"); - for (i = last_base; i <= IOBASE_MAX; i += IOBASE_OFFSET) { - int found_io = 1; - if (i == IOBASE_MAX) { - probe_exhasted = 1; /* No more addresses to probe */ - pr_debug("End of Probes\n"); - } - last_base = i + IOBASE_OFFSET; - pr_debug(" checking 0x%x...", i); - for (j = 0; j < MAX_IO_REGS - 1; j++) { - if (!request_region(i + j * 0x400, 1, "sc test")) { - pr_debug("Failed\n"); - found_io = 0; - break; - } else - release_region(i + j * 0x400, 1); - } - - if (found_io) { - io[b] = i; - outb(0x18, io[b] + 0x400 * EXP_PAGE0); - if (inb(io[b] + 0x400 * EXP_PAGE0) != 0x18) { - pr_debug("Failed by test\n"); - continue; - } - pr_debug("Passed\n"); - break; - } - } - if (probe_exhasted) { - continue; - } - } - - /* - * See if we should probe for shared RAM - */ - if (do_reset) { - pr_debug("Doing a SAFE probe reset\n"); - outb(0xFF, io[b] + RESET_OFFSET); - msleep_interruptible(10000); - } - pr_debug("RAM Base for board %d is 0x%lx, %s probe\n", b, - ram[b], ram[b] == 0 ? "will" : "won't"); - - if (ram[b]) { - /* - * No, the RAM base has been provided - * Just look for a signature and ID the - * board model - */ - if (request_region(ram[b], SRAM_PAGESIZE, "sc test")) { - pr_debug("request_region for RAM base 0x%lx succeeded\n", ram[b]); - model = identify_board(ram[b], io[b]); - release_region(ram[b], SRAM_PAGESIZE); - } - } else { - /* - * Yes, probe for free RAM and look for - * a signature and id the board model - */ - for (i = SRAM_MIN; i < SRAM_MAX; i += SRAM_PAGESIZE) { - pr_debug("Checking RAM address 0x%x...\n", i); - if (request_region(i, SRAM_PAGESIZE, "sc test")) { - pr_debug(" request_region succeeded\n"); - model = identify_board(i, io[b]); - release_region(i, SRAM_PAGESIZE); - if (model >= 0) { - pr_debug(" Identified a %s\n", - boardname[model]); - ram[b] = i; - break; - } - pr_debug(" Unidentified or inaccessible\n"); - continue; - } - pr_debug(" request failed\n"); - } - } - /* - * See if we found free RAM and the board model - */ - if (!ram[b] || model < 0) { - /* - * Nope, there was no place in RAM for the - * board, or it couldn't be identified - */ - pr_debug("Failed to find an adapter at 0x%lx\n", ram[b]); - continue; - } - - /* - * Set the board's magic number, memory size and page register - */ - switch (model) { - case PRI_BOARD: - channels = 23; - magic = 0x20000; - memsize = 0x100000; - features = PRI_FEATURES; - break; - - case BRI_BOARD: - case POTS_BOARD: - channels = 2; - magic = 0x60000; - memsize = 0x10000; - features = BRI_FEATURES; - break; - } - switch (ram[b] >> 12 & 0x0F) { - case 0x0: - pr_debug("RAM Page register set to EXP_PAGE0\n"); - pgport = EXP_PAGE0; - break; - - case 0x4: - pr_debug("RAM Page register set to EXP_PAGE1\n"); - pgport = EXP_PAGE1; - break; - - case 0x8: - pr_debug("RAM Page register set to EXP_PAGE2\n"); - pgport = EXP_PAGE2; - break; - - case 0xC: - pr_debug("RAM Page register set to EXP_PAGE3\n"); - pgport = EXP_PAGE3; - break; - - default: - pr_debug("RAM base address doesn't fall on 16K boundary\n"); - continue; - } - - pr_debug("current IRQ: %d b: %d\n", irq[b], b); - - /* - * Make sure we got an IRQ - */ - if (!irq[b]) { - /* - * No interrupt could be used - */ - pr_debug("Failed to acquire an IRQ line\n"); - continue; - } - - /* - * Horray! We found a board, Make sure we can register - * it with ISDN4Linux - */ - interface = kzalloc(sizeof(isdn_if), GFP_KERNEL); - if (interface == NULL) { - /* - * Oops, can't malloc isdn_if - */ - continue; - } - - interface->owner = THIS_MODULE; - interface->hl_hdrlen = 0; - interface->channels = channels; - interface->maxbufsize = BUFFER_SIZE; - interface->features = features; - interface->writebuf_skb = sndpkt; - interface->writecmd = NULL; - interface->command = command; - strcpy(interface->id, devname); - interface->id[2] = '0' + cinst; - - /* - * Allocate the board structure - */ - sc_adapter[cinst] = kzalloc(sizeof(board), GFP_KERNEL); - if (sc_adapter[cinst] == NULL) { - /* - * Oops, can't alloc memory for the board - */ - kfree(interface); - continue; - } - spin_lock_init(&sc_adapter[cinst]->lock); - - if (!register_isdn(interface)) { - /* - * Oops, couldn't register for some reason - */ - kfree(interface); - kfree(sc_adapter[cinst]); - continue; - } - - sc_adapter[cinst]->card = interface; - sc_adapter[cinst]->driverId = interface->channels; - strcpy(sc_adapter[cinst]->devicename, interface->id); - sc_adapter[cinst]->nChannels = channels; - sc_adapter[cinst]->ramsize = memsize; - sc_adapter[cinst]->shmem_magic = magic; - sc_adapter[cinst]->shmem_pgport = pgport; - sc_adapter[cinst]->StartOnReset = 1; - - /* - * Allocate channels status structures - */ - sc_adapter[cinst]->channel = kzalloc(sizeof(bchan) * channels, GFP_KERNEL); - if (sc_adapter[cinst]->channel == NULL) { - /* - * Oops, can't alloc memory for the channels - */ - indicate_status(cinst, ISDN_STAT_UNLOAD, 0, NULL); /* Fix me */ - kfree(interface); - kfree(sc_adapter[cinst]); - continue; - } - - /* - * Lock down the hardware resources - */ - sc_adapter[cinst]->interrupt = irq[b]; - if (request_irq(sc_adapter[cinst]->interrupt, interrupt_handler, - 0, interface->id, - (void *)(unsigned long) cinst)) { - kfree(sc_adapter[cinst]->channel); - indicate_status(cinst, ISDN_STAT_UNLOAD, 0, NULL); /* Fix me */ - kfree(interface); - kfree(sc_adapter[cinst]); - continue; - - } - sc_adapter[cinst]->iobase = io[b]; - for (i = 0; i < MAX_IO_REGS - 1; i++) { - sc_adapter[cinst]->ioport[i] = io[b] + i * 0x400; - request_region(sc_adapter[cinst]->ioport[i], 1, - interface->id); - pr_debug("Requesting I/O Port %#x\n", - sc_adapter[cinst]->ioport[i]); - } - sc_adapter[cinst]->ioport[IRQ_SELECT] = io[b] + 0x2; - request_region(sc_adapter[cinst]->ioport[IRQ_SELECT], 1, - interface->id); - pr_debug("Requesting I/O Port %#x\n", - sc_adapter[cinst]->ioport[IRQ_SELECT]); - sc_adapter[cinst]->rambase = ram[b]; - request_region(sc_adapter[cinst]->rambase, SRAM_PAGESIZE, - interface->id); - - pr_info(" %s (%d) - %s %d channels IRQ %d, I/O Base 0x%x, RAM Base 0x%lx\n", - sc_adapter[cinst]->devicename, - sc_adapter[cinst]->driverId, - boardname[model], channels, irq[b], io[b], ram[b]); - - /* - * reset the adapter to put things in motion - */ - reset(cinst); - - cinst++; - status = 0; - } - if (status) - pr_info("Failed to find any adapters, driver unloaded\n"); - return status; -} - -static void __exit sc_exit(void) -{ - int i, j; - - for (i = 0; i < cinst; i++) { - pr_debug("Cleaning up after adapter %d\n", i); - /* - * kill the timers - */ - del_timer_sync(&(sc_adapter[i]->reset_timer)); - del_timer_sync(&(sc_adapter[i]->stat_timer)); - - /* - * Tell I4L we're toast - */ - indicate_status(i, ISDN_STAT_STOP, 0, NULL); - indicate_status(i, ISDN_STAT_UNLOAD, 0, NULL); - - /* - * Release shared RAM - */ - release_region(sc_adapter[i]->rambase, SRAM_PAGESIZE); - - /* - * Release the IRQ - */ - free_irq(sc_adapter[i]->interrupt, NULL); - - /* - * Reset for a clean start - */ - outb(0xFF, sc_adapter[i]->ioport[SFT_RESET]); - - /* - * Release the I/O Port regions - */ - for (j = 0; j < MAX_IO_REGS - 1; j++) { - release_region(sc_adapter[i]->ioport[j], 1); - pr_debug("Releasing I/O Port %#x\n", - sc_adapter[i]->ioport[j]); - } - release_region(sc_adapter[i]->ioport[IRQ_SELECT], 1); - pr_debug("Releasing I/O Port %#x\n", - sc_adapter[i]->ioport[IRQ_SELECT]); - - /* - * Release any memory we alloced - */ - kfree(sc_adapter[i]->channel); - kfree(sc_adapter[i]->card); - kfree(sc_adapter[i]); - } - pr_info("SpellCaster ISA ISDN Adapter Driver Unloaded.\n"); -} - -static int identify_board(unsigned long rambase, unsigned int iobase) -{ - unsigned int pgport; - unsigned long sig; - DualPortMemory *dpm; - RspMessage rcvmsg; - ReqMessage sndmsg; - HWConfig_pl hwci; - int x; - - pr_debug("Attempting to identify adapter @ 0x%lx io 0x%x\n", - rambase, iobase); - - /* - * Enable the base pointer - */ - outb(rambase >> 12, iobase + 0x2c00); - - switch (rambase >> 12 & 0x0F) { - case 0x0: - pgport = iobase + PG0_OFFSET; - pr_debug("Page Register offset is 0x%x\n", PG0_OFFSET); - break; - - case 0x4: - pgport = iobase + PG1_OFFSET; - pr_debug("Page Register offset is 0x%x\n", PG1_OFFSET); - break; - - case 0x8: - pgport = iobase + PG2_OFFSET; - pr_debug("Page Register offset is 0x%x\n", PG2_OFFSET); - break; - - case 0xC: - pgport = iobase + PG3_OFFSET; - pr_debug("Page Register offset is 0x%x\n", PG3_OFFSET); - break; - default: - pr_debug("Invalid rambase 0x%lx\n", rambase); - return -1; - } - - /* - * Try to identify a PRI card - */ - outb(PRI_BASEPG_VAL, pgport); - msleep_interruptible(1000); - sig = readl(rambase + SIG_OFFSET); - pr_debug("Looking for a signature, got 0x%lx\n", sig); - if (sig == SIGNATURE) - return PRI_BOARD; - - /* - * Try to identify a PRI card - */ - outb(BRI_BASEPG_VAL, pgport); - msleep_interruptible(1000); - sig = readl(rambase + SIG_OFFSET); - pr_debug("Looking for a signature, got 0x%lx\n", sig); - if (sig == SIGNATURE) - return BRI_BOARD; - - return -1; - - /* - * Try to spot a card - */ - sig = readl(rambase + SIG_OFFSET); - pr_debug("Looking for a signature, got 0x%lx\n", sig); - if (sig != SIGNATURE) - return -1; - - dpm = (DualPortMemory *) rambase; - - memset(&sndmsg, 0, MSG_LEN); - sndmsg.msg_byte_cnt = 3; - sndmsg.type = cmReqType1; - sndmsg.class = cmReqClass0; - sndmsg.code = cmReqHWConfig; - memcpy_toio(&(dpm->req_queue[dpm->req_head++]), &sndmsg, MSG_LEN); - outb(0, iobase + 0x400); - pr_debug("Sent HWConfig message\n"); - /* - * Wait for the response - */ - x = 0; - while ((inb(iobase + FIFOSTAT_OFFSET) & RF_HAS_DATA) && x < 100) { - schedule_timeout_interruptible(1); - x++; - } - if (x == 100) { - pr_debug("Timeout waiting for response\n"); - return -1; - } - - memcpy_fromio(&rcvmsg, &(dpm->rsp_queue[dpm->rsp_tail]), MSG_LEN); - pr_debug("Got HWConfig response, status = 0x%x\n", rcvmsg.rsp_status); - memcpy(&hwci, &(rcvmsg.msg_data.HWCresponse), sizeof(HWConfig_pl)); - pr_debug("Hardware Config: Interface: %s, RAM Size: %ld, Serial: %s\n" - " Part: %s, Rev: %s\n", - hwci.st_u_sense ? "S/T" : "U", hwci.ram_size, - hwci.serial_no, hwci.part_no, hwci.rev_no); - - if (!strncmp(PRI_PARTNO, hwci.part_no, 6)) - return PRI_BOARD; - if (!strncmp(BRI_PARTNO, hwci.part_no, 6)) - return BRI_BOARD; - - return -1; -} - -module_init(sc_init); -module_exit(sc_exit); diff --git a/drivers/isdn/sc/interrupt.c b/drivers/isdn/sc/interrupt.c deleted file mode 100644 index e80cc76bc314..000000000000 --- a/drivers/isdn/sc/interrupt.c +++ /dev/null @@ -1,247 +0,0 @@ -/* $Id: interrupt.c,v 1.4.8.3 2001/09/23 22:24:59 kai Exp $ - * - * Copyright (C) 1996 SpellCaster Telecommunications Inc. - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - * For more information, please contact gpl-info@spellcast.com or write: - * - * SpellCaster Telecommunications Inc. - * 5621 Finch Avenue East, Unit #3 - * Scarborough, Ontario Canada - * M1B 2T9 - * +1 (416) 297-8565 - * +1 (416) 297-6433 Facsimile - */ - -#include "includes.h" -#include "hardware.h" -#include "message.h" -#include "card.h" -#include <linux/interrupt.h> - -/* - * - */ -irqreturn_t interrupt_handler(int dummy, void *card_inst) -{ - - RspMessage rcvmsg; - int channel; - int card = (int)(unsigned long) card_inst; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return IRQ_NONE; - } - - pr_debug("%s: Entered Interrupt handler\n", - sc_adapter[card]->devicename); - - /* - * Pull all of the waiting messages off the response queue - */ - while (!receivemessage(card, &rcvmsg)) { - /* - * Push the message to the adapter structure for - * send_and_receive to snoop - */ - if (sc_adapter[card]->want_async_messages) - memcpy(&(sc_adapter[card]->async_msg), - &rcvmsg, sizeof(RspMessage)); - - channel = (unsigned int) rcvmsg.phy_link_no; - - /* - * Trap Invalid request messages - */ - if (IS_CM_MESSAGE(rcvmsg, 0, 0, Invalid)) { - pr_debug("%s: Invalid request Message, rsp_status = %d\n", - sc_adapter[card]->devicename, - rcvmsg.rsp_status); - break; - } - - /* - * Check for a linkRead message - */ - if (IS_CE_MESSAGE(rcvmsg, Lnk, 1, Read)) - { - pr_debug("%s: Received packet 0x%x bytes long at 0x%lx\n", - sc_adapter[card]->devicename, - rcvmsg.msg_data.response.msg_len, - rcvmsg.msg_data.response.buff_offset); - rcvpkt(card, &rcvmsg); - continue; - - } - - /* - * Handle a write acknoledgement - */ - if (IS_CE_MESSAGE(rcvmsg, Lnk, 1, Write)) { - pr_debug("%s: Packet Send ACK on channel %d\n", - sc_adapter[card]->devicename, - rcvmsg.phy_link_no); - sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].free_sendbufs++; - continue; - } - - /* - * Handle a connection message - */ - if (IS_CE_MESSAGE(rcvmsg, Phy, 1, Connect)) - { - unsigned int callid; - setup_parm setup; - pr_debug("%s: Connect message: line %d: status %d: cause 0x%x\n", - sc_adapter[card]->devicename, - rcvmsg.phy_link_no, - rcvmsg.rsp_status, - rcvmsg.msg_data.byte_array[2]); - - memcpy(&callid, rcvmsg.msg_data.byte_array, sizeof(int)); - if (callid >= 0x8000 && callid <= 0xFFFF) - { - pr_debug("%s: Got Dial-Out Rsp\n", - sc_adapter[card]->devicename); - indicate_status(card, ISDN_STAT_DCONN, - (unsigned long)rcvmsg.phy_link_no - 1, NULL); - - } - else if (callid >= 0x0000 && callid <= 0x7FFF) - { - int len; - - pr_debug("%s: Got Incoming Call\n", - sc_adapter[card]->devicename); - len = strlcpy(setup.phone, &(rcvmsg.msg_data.byte_array[4]), - sizeof(setup.phone)); - if (len >= sizeof(setup.phone)) - continue; - len = strlcpy(setup.eazmsn, - sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].dn, - sizeof(setup.eazmsn)); - if (len >= sizeof(setup.eazmsn)) - continue; - setup.si1 = 7; - setup.si2 = 0; - setup.plan = 0; - setup.screen = 0; - - indicate_status(card, ISDN_STAT_ICALL, (unsigned long)rcvmsg.phy_link_no - 1, (char *)&setup); - indicate_status(card, ISDN_STAT_DCONN, (unsigned long)rcvmsg.phy_link_no - 1, NULL); - } - continue; - } - - /* - * Handle a disconnection message - */ - if (IS_CE_MESSAGE(rcvmsg, Phy, 1, Disconnect)) - { - pr_debug("%s: disconnect message: line %d: status %d: cause 0x%x\n", - sc_adapter[card]->devicename, - rcvmsg.phy_link_no, - rcvmsg.rsp_status, - rcvmsg.msg_data.byte_array[2]); - - indicate_status(card, ISDN_STAT_BHUP, (unsigned long)rcvmsg.phy_link_no - 1, NULL); - indicate_status(card, ISDN_STAT_DHUP, (unsigned long)rcvmsg.phy_link_no - 1, NULL); - continue; - - } - - /* - * Handle a startProc engine up message - */ - if (IS_CM_MESSAGE(rcvmsg, 5, 0, MiscEngineUp)) { - pr_debug("%s: Received EngineUp message\n", - sc_adapter[card]->devicename); - sc_adapter[card]->EngineUp = 1; - sendmessage(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetMyNumber, 1, 0, NULL); - sendmessage(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetMyNumber, 2, 0, NULL); - init_timer(&sc_adapter[card]->stat_timer); - sc_adapter[card]->stat_timer.function = check_phystat; - sc_adapter[card]->stat_timer.data = card; - sc_adapter[card]->stat_timer.expires = jiffies + CHECKSTAT_TIME; - add_timer(&sc_adapter[card]->stat_timer); - continue; - } - - /* - * Start proc response - */ - if (IS_CM_MESSAGE(rcvmsg, 2, 0, StartProc)) { - pr_debug("%s: StartProc Response Status %d\n", - sc_adapter[card]->devicename, - rcvmsg.rsp_status); - continue; - } - - /* - * Handle a GetMyNumber Rsp - */ - if (IS_CE_MESSAGE(rcvmsg, Call, 0, GetMyNumber)) { - strlcpy(sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].dn, - rcvmsg.msg_data.byte_array, - sizeof(rcvmsg.msg_data.byte_array)); - continue; - } - - /* - * PhyStatus response - */ - if (IS_CE_MESSAGE(rcvmsg, Phy, 2, Status)) { - unsigned int b1stat, b2stat; - - /* - * Covert the message data to the adapter->phystat code - */ - b1stat = (unsigned int) rcvmsg.msg_data.byte_array[0]; - b2stat = (unsigned int) rcvmsg.msg_data.byte_array[1]; - - sc_adapter[card]->nphystat = (b2stat >> 8) | b1stat; /* endian?? */ - pr_debug("%s: PhyStat is 0x%2x\n", - sc_adapter[card]->devicename, - sc_adapter[card]->nphystat); - continue; - } - - - /* - * Handle a GetFramFormat - */ - if (IS_CE_MESSAGE(rcvmsg, Call, 0, GetFrameFormat)) { - if (rcvmsg.msg_data.byte_array[0] != HDLC_PROTO) { - unsigned int proto = HDLC_PROTO; - /* - * Set board format to HDLC if it wasn't already - */ - pr_debug("%s: current frame format: 0x%x, will change to HDLC\n", - sc_adapter[card]->devicename, - rcvmsg.msg_data.byte_array[0]); - sendmessage(card, CEPID, ceReqTypeCall, - ceReqClass0, - ceReqCallSetFrameFormat, - (unsigned char)channel + 1, - 1, &proto); - } - continue; - } - - /* - * Hmm... - */ - pr_debug("%s: Received unhandled message (%d,%d,%d) link %d\n", - sc_adapter[card]->devicename, - rcvmsg.type, rcvmsg.class, rcvmsg.code, - rcvmsg.phy_link_no); - - } /* while */ - - pr_debug("%s: Exiting Interrupt Handler\n", - sc_adapter[card]->devicename); - return IRQ_HANDLED; -} diff --git a/drivers/isdn/sc/ioctl.c b/drivers/isdn/sc/ioctl.c deleted file mode 100644 index e63983aa1d27..000000000000 --- a/drivers/isdn/sc/ioctl.c +++ /dev/null @@ -1,582 +0,0 @@ -/* - * Copyright (C) 1996 SpellCaster Telecommunications Inc. - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - */ - -#include "includes.h" -#include "hardware.h" -#include "message.h" -#include "card.h" -#include "scioc.h" - -static int GetStatus(int card, boardInfo *); - -/* - * Process private IOCTL messages (typically from scctrl) - */ -int sc_ioctl(int card, scs_ioctl *data) -{ - int status; - RspMessage *rcvmsg; - char *spid; - char *dn; - char switchtype; - char speed; - - rcvmsg = kmalloc(sizeof(RspMessage), GFP_KERNEL); - if (!rcvmsg) - return -ENOMEM; - - switch (data->command) { - case SCIOCRESET: /* Perform a hard reset of the adapter */ - { - pr_debug("%s: SCIOCRESET: ioctl received\n", - sc_adapter[card]->devicename); - sc_adapter[card]->StartOnReset = 0; - kfree(rcvmsg); - return reset(card); - } - - case SCIOCLOAD: - { - char *srec; - - srec = kmalloc(SCIOC_SRECSIZE, GFP_KERNEL); - if (!srec) { - kfree(rcvmsg); - return -ENOMEM; - } - pr_debug("%s: SCIOLOAD: ioctl received\n", - sc_adapter[card]->devicename); - if (sc_adapter[card]->EngineUp) { - pr_debug("%s: SCIOCLOAD: command failed, LoadProc while engine running.\n", - sc_adapter[card]->devicename); - kfree(rcvmsg); - kfree(srec); - return -1; - } - - /* - * Get the SRec from user space - */ - if (copy_from_user(srec, data->dataptr, SCIOC_SRECSIZE)) { - kfree(rcvmsg); - kfree(srec); - return -EFAULT; - } - - status = send_and_receive(card, CMPID, cmReqType2, cmReqClass0, cmReqLoadProc, - 0, SCIOC_SRECSIZE, srec, rcvmsg, SAR_TIMEOUT); - kfree(rcvmsg); - kfree(srec); - - if (status) { - pr_debug("%s: SCIOCLOAD: command failed, status = %d\n", - sc_adapter[card]->devicename, status); - return -1; - } - else { - pr_debug("%s: SCIOCLOAD: command successful\n", - sc_adapter[card]->devicename); - return 0; - } - } - - case SCIOCSTART: - { - kfree(rcvmsg); - pr_debug("%s: SCIOSTART: ioctl received\n", - sc_adapter[card]->devicename); - if (sc_adapter[card]->EngineUp) { - pr_debug("%s: SCIOCSTART: command failed, engine already running.\n", - sc_adapter[card]->devicename); - return -1; - } - - sc_adapter[card]->StartOnReset = 1; - startproc(card); - return 0; - } - - case SCIOCSETSWITCH: - { - pr_debug("%s: SCIOSETSWITCH: ioctl received\n", - sc_adapter[card]->devicename); - - /* - * Get the switch type from user space - */ - if (copy_from_user(&switchtype, data->dataptr, sizeof(char))) { - kfree(rcvmsg); - return -EFAULT; - } - - pr_debug("%s: SCIOCSETSWITCH: setting switch type to %d\n", - sc_adapter[card]->devicename, - switchtype); - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallSetSwitchType, - 0, sizeof(char), &switchtype, rcvmsg, SAR_TIMEOUT); - if (!status && !(rcvmsg->rsp_status)) { - pr_debug("%s: SCIOCSETSWITCH: command successful\n", - sc_adapter[card]->devicename); - kfree(rcvmsg); - return 0; - } - else { - pr_debug("%s: SCIOCSETSWITCH: command failed (status = %d)\n", - sc_adapter[card]->devicename, status); - kfree(rcvmsg); - return status; - } - } - - case SCIOCGETSWITCH: - { - pr_debug("%s: SCIOGETSWITCH: ioctl received\n", - sc_adapter[card]->devicename); - - /* - * Get the switch type from the board - */ - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, - ceReqCallGetSwitchType, 0, 0, NULL, rcvmsg, SAR_TIMEOUT); - if (!status && !(rcvmsg->rsp_status)) { - pr_debug("%s: SCIOCGETSWITCH: command successful\n", - sc_adapter[card]->devicename); - } - else { - pr_debug("%s: SCIOCGETSWITCH: command failed (status = %d)\n", - sc_adapter[card]->devicename, status); - kfree(rcvmsg); - return status; - } - - switchtype = rcvmsg->msg_data.byte_array[0]; - - /* - * Package the switch type and send to user space - */ - if (copy_to_user(data->dataptr, &switchtype, - sizeof(char))) { - kfree(rcvmsg); - return -EFAULT; - } - - kfree(rcvmsg); - return 0; - } - - case SCIOCGETSPID: - { - pr_debug("%s: SCIOGETSPID: ioctl received\n", - sc_adapter[card]->devicename); - - spid = kzalloc(SCIOC_SPIDSIZE, GFP_KERNEL); - if (!spid) { - kfree(rcvmsg); - return -ENOMEM; - } - /* - * Get the spid from the board - */ - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetSPID, - data->channel, 0, NULL, rcvmsg, SAR_TIMEOUT); - if (!status) { - pr_debug("%s: SCIOCGETSPID: command successful\n", - sc_adapter[card]->devicename); - } else { - pr_debug("%s: SCIOCGETSPID: command failed (status = %d)\n", - sc_adapter[card]->devicename, status); - kfree(spid); - kfree(rcvmsg); - return status; - } - strlcpy(spid, rcvmsg->msg_data.byte_array, SCIOC_SPIDSIZE); - - /* - * Package the switch type and send to user space - */ - if (copy_to_user(data->dataptr, spid, SCIOC_SPIDSIZE)) { - kfree(spid); - kfree(rcvmsg); - return -EFAULT; - } - - kfree(spid); - kfree(rcvmsg); - return 0; - } - - case SCIOCSETSPID: - { - pr_debug("%s: DCBIOSETSPID: ioctl received\n", - sc_adapter[card]->devicename); - - /* - * Get the spid from user space - */ - spid = memdup_user(data->dataptr, SCIOC_SPIDSIZE); - if (IS_ERR(spid)) { - kfree(rcvmsg); - return PTR_ERR(spid); - } - - pr_debug("%s: SCIOCSETSPID: setting channel %d spid to %s\n", - sc_adapter[card]->devicename, data->channel, spid); - status = send_and_receive(card, CEPID, ceReqTypeCall, - ceReqClass0, ceReqCallSetSPID, data->channel, - strlen(spid), spid, rcvmsg, SAR_TIMEOUT); - if (!status && !(rcvmsg->rsp_status)) { - pr_debug("%s: SCIOCSETSPID: command successful\n", - sc_adapter[card]->devicename); - kfree(rcvmsg); - kfree(spid); - return 0; - } - else { - pr_debug("%s: SCIOCSETSPID: command failed (status = %d)\n", - sc_adapter[card]->devicename, status); - kfree(rcvmsg); - kfree(spid); - return status; - } - } - - case SCIOCGETDN: - { - pr_debug("%s: SCIOGETDN: ioctl received\n", - sc_adapter[card]->devicename); - - /* - * Get the dn from the board - */ - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetMyNumber, - data->channel, 0, NULL, rcvmsg, SAR_TIMEOUT); - if (!status) { - pr_debug("%s: SCIOCGETDN: command successful\n", - sc_adapter[card]->devicename); - } - else { - pr_debug("%s: SCIOCGETDN: command failed (status = %d)\n", - sc_adapter[card]->devicename, status); - kfree(rcvmsg); - return status; - } - - dn = kzalloc(SCIOC_DNSIZE, GFP_KERNEL); - if (!dn) { - kfree(rcvmsg); - return -ENOMEM; - } - strlcpy(dn, rcvmsg->msg_data.byte_array, SCIOC_DNSIZE); - kfree(rcvmsg); - - /* - * Package the dn and send to user space - */ - if (copy_to_user(data->dataptr, dn, SCIOC_DNSIZE)) { - kfree(dn); - return -EFAULT; - } - kfree(dn); - return 0; - } - - case SCIOCSETDN: - { - pr_debug("%s: SCIOSETDN: ioctl received\n", - sc_adapter[card]->devicename); - - /* - * Get the spid from user space - */ - dn = memdup_user(data->dataptr, SCIOC_DNSIZE); - if (IS_ERR(dn)) { - kfree(rcvmsg); - return PTR_ERR(dn); - } - - pr_debug("%s: SCIOCSETDN: setting channel %d dn to %s\n", - sc_adapter[card]->devicename, data->channel, dn); - status = send_and_receive(card, CEPID, ceReqTypeCall, - ceReqClass0, ceReqCallSetMyNumber, data->channel, - strlen(dn), dn, rcvmsg, SAR_TIMEOUT); - if (!status && !(rcvmsg->rsp_status)) { - pr_debug("%s: SCIOCSETDN: command successful\n", - sc_adapter[card]->devicename); - kfree(rcvmsg); - kfree(dn); - return 0; - } - else { - pr_debug("%s: SCIOCSETDN: command failed (status = %d)\n", - sc_adapter[card]->devicename, status); - kfree(rcvmsg); - kfree(dn); - return status; - } - } - - case SCIOCTRACE: - - pr_debug("%s: SCIOTRACE: ioctl received\n", - sc_adapter[card]->devicename); -/* sc_adapter[card]->trace = !sc_adapter[card]->trace; - pr_debug("%s: SCIOCTRACE: tracing turned %s\n", - sc_adapter[card]->devicename, - sc_adapter[card]->trace ? "ON" : "OFF"); */ - break; - - case SCIOCSTAT: - { - boardInfo *bi; - - pr_debug("%s: SCIOSTAT: ioctl received\n", - sc_adapter[card]->devicename); - - bi = kzalloc(sizeof(boardInfo), GFP_KERNEL); - if (!bi) { - kfree(rcvmsg); - return -ENOMEM; - } - - kfree(rcvmsg); - GetStatus(card, bi); - - if (copy_to_user(data->dataptr, bi, sizeof(boardInfo))) { - kfree(bi); - return -EFAULT; - } - - kfree(bi); - return 0; - } - - case SCIOCGETSPEED: - { - pr_debug("%s: SCIOGETSPEED: ioctl received\n", - sc_adapter[card]->devicename); - - /* - * Get the speed from the board - */ - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, - ceReqCallGetCallType, data->channel, 0, NULL, rcvmsg, SAR_TIMEOUT); - if (!status && !(rcvmsg->rsp_status)) { - pr_debug("%s: SCIOCGETSPEED: command successful\n", - sc_adapter[card]->devicename); - } - else { - pr_debug("%s: SCIOCGETSPEED: command failed (status = %d)\n", - sc_adapter[card]->devicename, status); - kfree(rcvmsg); - return status; - } - - speed = rcvmsg->msg_data.byte_array[0]; - - kfree(rcvmsg); - - /* - * Package the switch type and send to user space - */ - - if (copy_to_user(data->dataptr, &speed, sizeof(char))) - return -EFAULT; - - return 0; - } - - case SCIOCSETSPEED: - pr_debug("%s: SCIOCSETSPEED: ioctl received\n", - sc_adapter[card]->devicename); - break; - - case SCIOCLOOPTST: - pr_debug("%s: SCIOCLOOPTST: ioctl received\n", - sc_adapter[card]->devicename); - break; - - default: - kfree(rcvmsg); - return -1; - } - - kfree(rcvmsg); - return 0; -} - -static int GetStatus(int card, boardInfo *bi) -{ - RspMessage rcvmsg; - int i, status; - - /* - * Fill in some of the basic info about the board - */ - bi->modelid = sc_adapter[card]->model; - strcpy(bi->serial_no, sc_adapter[card]->hwconfig.serial_no); - strcpy(bi->part_no, sc_adapter[card]->hwconfig.part_no); - bi->iobase = sc_adapter[card]->iobase; - bi->rambase = sc_adapter[card]->rambase; - bi->irq = sc_adapter[card]->interrupt; - bi->ramsize = sc_adapter[card]->hwconfig.ram_size; - bi->interface = sc_adapter[card]->hwconfig.st_u_sense; - strcpy(bi->load_ver, sc_adapter[card]->load_ver); - strcpy(bi->proc_ver, sc_adapter[card]->proc_ver); - - /* - * Get the current PhyStats and LnkStats - */ - status = send_and_receive(card, CEPID, ceReqTypePhy, ceReqClass2, - ceReqPhyStatus, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT); - if (!status) { - if (sc_adapter[card]->model < PRI_BOARD) { - bi->l1_status = rcvmsg.msg_data.byte_array[2]; - for (i = 0; i < BRI_CHANNELS; i++) - bi->status.bristats[i].phy_stat = - rcvmsg.msg_data.byte_array[i]; - } - else { - bi->l1_status = rcvmsg.msg_data.byte_array[0]; - bi->l2_status = rcvmsg.msg_data.byte_array[1]; - for (i = 0; i < PRI_CHANNELS; i++) - bi->status.pristats[i].phy_stat = - rcvmsg.msg_data.byte_array[i + 2]; - } - } - - /* - * Get the call types for each channel - */ - for (i = 0; i < sc_adapter[card]->nChannels; i++) { - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, - ceReqCallGetCallType, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT); - if (!status) { - if (sc_adapter[card]->model == PRI_BOARD) { - bi->status.pristats[i].call_type = - rcvmsg.msg_data.byte_array[0]; - } - else { - bi->status.bristats[i].call_type = - rcvmsg.msg_data.byte_array[0]; - } - } - } - - /* - * If PRI, get the call states and service states for each channel - */ - if (sc_adapter[card]->model == PRI_BOARD) { - /* - * Get the call states - */ - status = send_and_receive(card, CEPID, ceReqTypeStat, ceReqClass2, - ceReqPhyChCallState, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT); - if (!status) { - for (i = 0; i < PRI_CHANNELS; i++) - bi->status.pristats[i].call_state = - rcvmsg.msg_data.byte_array[i]; - } - - /* - * Get the service states - */ - status = send_and_receive(card, CEPID, ceReqTypeStat, ceReqClass2, - ceReqPhyChServState, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT); - if (!status) { - for (i = 0; i < PRI_CHANNELS; i++) - bi->status.pristats[i].serv_state = - rcvmsg.msg_data.byte_array[i]; - } - - /* - * Get the link stats for the channels - */ - for (i = 1; i <= PRI_CHANNELS; i++) { - status = send_and_receive(card, CEPID, ceReqTypeLnk, ceReqClass0, - ceReqLnkGetStats, i, 0, NULL, &rcvmsg, SAR_TIMEOUT); - if (!status) { - bi->status.pristats[i - 1].link_stats.tx_good = - (unsigned long)rcvmsg.msg_data.byte_array[0]; - bi->status.pristats[i - 1].link_stats.tx_bad = - (unsigned long)rcvmsg.msg_data.byte_array[4]; - bi->status.pristats[i - 1].link_stats.rx_good = - (unsigned long)rcvmsg.msg_data.byte_array[8]; - bi->status.pristats[i - 1].link_stats.rx_bad = - (unsigned long)rcvmsg.msg_data.byte_array[12]; - } - } - - /* - * Link stats for the D channel - */ - status = send_and_receive(card, CEPID, ceReqTypeLnk, ceReqClass0, - ceReqLnkGetStats, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT); - if (!status) { - bi->dch_stats.tx_good = (unsigned long)rcvmsg.msg_data.byte_array[0]; - bi->dch_stats.tx_bad = (unsigned long)rcvmsg.msg_data.byte_array[4]; - bi->dch_stats.rx_good = (unsigned long)rcvmsg.msg_data.byte_array[8]; - bi->dch_stats.rx_bad = (unsigned long)rcvmsg.msg_data.byte_array[12]; - } - - return 0; - } - - /* - * If BRI or POTS, Get SPID, DN and call types for each channel - */ - - /* - * Get the link stats for the channels - */ - status = send_and_receive(card, CEPID, ceReqTypeLnk, ceReqClass0, - ceReqLnkGetStats, 0, 0, NULL, &rcvmsg, SAR_TIMEOUT); - if (!status) { - bi->dch_stats.tx_good = (unsigned long)rcvmsg.msg_data.byte_array[0]; - bi->dch_stats.tx_bad = (unsigned long)rcvmsg.msg_data.byte_array[4]; - bi->dch_stats.rx_good = (unsigned long)rcvmsg.msg_data.byte_array[8]; - bi->dch_stats.rx_bad = (unsigned long)rcvmsg.msg_data.byte_array[12]; - bi->status.bristats[0].link_stats.tx_good = - (unsigned long)rcvmsg.msg_data.byte_array[16]; - bi->status.bristats[0].link_stats.tx_bad = - (unsigned long)rcvmsg.msg_data.byte_array[20]; - bi->status.bristats[0].link_stats.rx_good = - (unsigned long)rcvmsg.msg_data.byte_array[24]; - bi->status.bristats[0].link_stats.rx_bad = - (unsigned long)rcvmsg.msg_data.byte_array[28]; - bi->status.bristats[1].link_stats.tx_good = - (unsigned long)rcvmsg.msg_data.byte_array[32]; - bi->status.bristats[1].link_stats.tx_bad = - (unsigned long)rcvmsg.msg_data.byte_array[36]; - bi->status.bristats[1].link_stats.rx_good = - (unsigned long)rcvmsg.msg_data.byte_array[40]; - bi->status.bristats[1].link_stats.rx_bad = - (unsigned long)rcvmsg.msg_data.byte_array[44]; - } - - /* - * Get the SPIDs - */ - for (i = 0; i < BRI_CHANNELS; i++) { - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, - ceReqCallGetSPID, i + 1, 0, NULL, &rcvmsg, SAR_TIMEOUT); - if (!status) - strcpy(bi->status.bristats[i].spid, rcvmsg.msg_data.byte_array); - } - - /* - * Get the DNs - */ - for (i = 0; i < BRI_CHANNELS; i++) { - status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, - ceReqCallGetMyNumber, i + 1, 0, NULL, &rcvmsg, SAR_TIMEOUT); - if (!status) - strcpy(bi->status.bristats[i].dn, rcvmsg.msg_data.byte_array); - } - - return 0; -} diff --git a/drivers/isdn/sc/message.c b/drivers/isdn/sc/message.c deleted file mode 100644 index 9679a1902b32..000000000000 --- a/drivers/isdn/sc/message.c +++ /dev/null @@ -1,230 +0,0 @@ -/* $Id: message.c,v 1.5.8.2 2001/09/23 22:24:59 kai Exp $ - * - * functions for sending and receiving control messages - * - * Copyright (C) 1996 SpellCaster Telecommunications Inc. - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - * For more information, please contact gpl-info@spellcast.com or write: - * - * SpellCaster Telecommunications Inc. - * 5621 Finch Avenue East, Unit #3 - * Scarborough, Ontario Canada - * M1B 2T9 - * +1 (416) 297-8565 - * +1 (416) 297-6433 Facsimile - */ -#include <linux/sched.h> -#include "includes.h" -#include "hardware.h" -#include "message.h" -#include "card.h" - -/* - * receive a message from the board - */ -int receivemessage(int card, RspMessage *rspmsg) -{ - DualPortMemory *dpm; - unsigned long flags; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -EINVAL; - } - - pr_debug("%s: Entered receivemessage\n", - sc_adapter[card]->devicename); - - /* - * See if there are messages waiting - */ - if (inb(sc_adapter[card]->ioport[FIFO_STATUS]) & RF_HAS_DATA) { - /* - * Map in the DPM to the base page and copy the message - */ - spin_lock_irqsave(&sc_adapter[card]->lock, flags); - outb((sc_adapter[card]->shmem_magic >> 14) | 0x80, - sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); - dpm = (DualPortMemory *) sc_adapter[card]->rambase; - memcpy_fromio(rspmsg, &(dpm->rsp_queue[dpm->rsp_tail]), - MSG_LEN); - dpm->rsp_tail = (dpm->rsp_tail + 1) % MAX_MESSAGES; - inb(sc_adapter[card]->ioport[FIFO_READ]); - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); - /* - * Tell the board that the message is received - */ - pr_debug("%s: Received Message seq:%d pid:%d time:%d cmd:%d " - "cnt:%d (type,class,code):(%d,%d,%d) " - "link:%d stat:0x%x\n", - sc_adapter[card]->devicename, - rspmsg->sequence_no, - rspmsg->process_id, - rspmsg->time_stamp, - rspmsg->cmd_sequence_no, - rspmsg->msg_byte_cnt, - rspmsg->type, - rspmsg->class, - rspmsg->code, - rspmsg->phy_link_no, - rspmsg->rsp_status); - - return 0; - } - return -ENOMSG; -} - -/* - * send a message to the board - */ -int sendmessage(int card, - unsigned int procid, - unsigned int type, - unsigned int class, - unsigned int code, - unsigned int link, - unsigned int data_len, - unsigned int *data) -{ - DualPortMemory *dpm; - ReqMessage sndmsg; - unsigned long flags; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -EINVAL; - } - - /* - * Make sure we only send CEPID messages when the engine is up - * and CMPID messages when it is down - */ - if (sc_adapter[card]->EngineUp && procid == CMPID) { - pr_debug("%s: Attempt to send CM message with engine up\n", - sc_adapter[card]->devicename); - return -ESRCH; - } - - if (!sc_adapter[card]->EngineUp && procid == CEPID) { - pr_debug("%s: Attempt to send CE message with engine down\n", - sc_adapter[card]->devicename); - return -ESRCH; - } - - memset(&sndmsg, 0, MSG_LEN); - sndmsg.msg_byte_cnt = 4; - sndmsg.type = type; - sndmsg.class = class; - sndmsg.code = code; - sndmsg.phy_link_no = link; - - if (data_len > 0) { - if (data_len > MSG_DATA_LEN) - data_len = MSG_DATA_LEN; - memcpy(&(sndmsg.msg_data), data, data_len); - sndmsg.msg_byte_cnt = data_len + 8; - } - - sndmsg.process_id = procid; - sndmsg.sequence_no = sc_adapter[card]->seq_no++ % 256; - - /* - * wait for an empty slot in the queue - */ - while (!(inb(sc_adapter[card]->ioport[FIFO_STATUS]) & WF_NOT_FULL)) - udelay(1); - - /* - * Disable interrupts and map in shared memory - */ - spin_lock_irqsave(&sc_adapter[card]->lock, flags); - outb((sc_adapter[card]->shmem_magic >> 14) | 0x80, - sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); - dpm = (DualPortMemory *) sc_adapter[card]->rambase; /* Fix me */ - memcpy_toio(&(dpm->req_queue[dpm->req_head]), &sndmsg, MSG_LEN); - dpm->req_head = (dpm->req_head + 1) % MAX_MESSAGES; - outb(sndmsg.sequence_no, sc_adapter[card]->ioport[FIFO_WRITE]); - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); - - pr_debug("%s: Sent Message seq:%d pid:%d time:%d " - "cnt:%d (type,class,code):(%d,%d,%d) " - "link:%d\n ", - sc_adapter[card]->devicename, - sndmsg.sequence_no, - sndmsg.process_id, - sndmsg.time_stamp, - sndmsg.msg_byte_cnt, - sndmsg.type, - sndmsg.class, - sndmsg.code, - sndmsg.phy_link_no); - - return 0; -} - -int send_and_receive(int card, - unsigned int procid, - unsigned char type, - unsigned char class, - unsigned char code, - unsigned char link, - unsigned char data_len, - unsigned char *data, - RspMessage *mesgdata, - int timeout) -{ - int retval; - int tries; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return -EINVAL; - } - - sc_adapter[card]->want_async_messages = 1; - retval = sendmessage(card, procid, type, class, code, link, - data_len, (unsigned int *) data); - - if (retval) { - pr_debug("%s: SendMessage failed in SAR\n", - sc_adapter[card]->devicename); - sc_adapter[card]->want_async_messages = 0; - return -EIO; - } - - tries = 0; - /* wait for the response */ - while (tries < timeout) { - schedule_timeout_interruptible(1); - - pr_debug("SAR waiting..\n"); - - /* - * See if we got our message back - */ - if ((sc_adapter[card]->async_msg.type == type) && - (sc_adapter[card]->async_msg.class == class) && - (sc_adapter[card]->async_msg.code == code) && - (sc_adapter[card]->async_msg.phy_link_no == link)) { - - /* - * Got it! - */ - pr_debug("%s: Got ASYNC message\n", - sc_adapter[card]->devicename); - memcpy(mesgdata, &(sc_adapter[card]->async_msg), - sizeof(RspMessage)); - sc_adapter[card]->want_async_messages = 0; - return 0; - } - - tries++; - } - - pr_debug("%s: SAR message timeout\n", sc_adapter[card]->devicename); - sc_adapter[card]->want_async_messages = 0; - return -ETIME; -} diff --git a/drivers/isdn/sc/message.h b/drivers/isdn/sc/message.h deleted file mode 100644 index 5e6f4a5c15f8..000000000000 --- a/drivers/isdn/sc/message.h +++ /dev/null @@ -1,245 +0,0 @@ -/* $Id: message.h,v 1.1.10.1 2001/09/23 22:24:59 kai Exp $ - * - * Copyright (C) 1996 SpellCaster Telecommunications Inc. - * - * structures, macros and defines useful for sending - * messages to the adapter - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - * For more information, please contact gpl-info@spellcast.com or write: - * - * SpellCaster Telecommunications Inc. - * 5621 Finch Avenue East, Unit #3 - * Scarborough, Ontario Canada - * M1B 2T9 - * +1 (416) 297-8565 - * +1 (416) 297-6433 Facsimile - */ - -/* - * Board message macros, defines and structures - */ - -#ifndef MESSAGE_H -#define MESSAGE_H - -#define MAX_MESSAGES 32 /* Maximum messages that can be - queued */ -#define MSG_DATA_LEN 48 /* Maximum size of message payload */ -#define MSG_LEN 64 /* Size of a message */ -#define CMPID 0 /* Loader message process ID */ -#define CEPID 64 /* Firmware message process ID */ - -/* - * Macro to determine if a message is a loader message - */ -#define IS_CM_MESSAGE(mesg, tx, cx, dx) \ - ((mesg.type == cmRspType##tx) \ - && (mesg.class == cmRspClass##cx) \ - && (mesg.code == cmRsp##dx)) - -/* - * Macro to determine if a message is a firmware message - */ -#define IS_CE_MESSAGE(mesg, tx, cx, dx) \ - ((mesg.type == ceRspType##tx) \ - && (mesg.class == ceRspClass##cx) \ - && (mesg.code == ceRsp##tx##dx)) - -/* - * Loader Request and Response Messages - */ - -/* message types */ -#define cmReqType1 1 -#define cmReqType2 2 -#define cmRspType0 0 -#define cmRspType1 1 -#define cmRspType2 2 -#define cmRspType5 5 - -/* message classes */ -#define cmReqClass0 0 -#define cmRspClass0 0 - -/* message codes */ -#define cmReqHWConfig 1 /* 1,0,1 */ -#define cmReqMsgLpbk 2 /* 1,0,2 */ -#define cmReqVersion 3 /* 1,0,3 */ -#define cmReqLoadProc 1 /* 2,0,1 */ -#define cmReqStartProc 2 /* 2,0,2 */ -#define cmReqReadMem 6 /* 2,0,6 */ -#define cmRspHWConfig cmReqHWConfig -#define cmRspMsgLpbk cmReqMsgLpbk -#define cmRspVersion cmReqVersion -#define cmRspLoadProc cmReqLoadProc -#define cmRspStartProc cmReqStartProc -#define cmRspReadMem cmReqReadMem -#define cmRspMiscEngineUp 1 /* 5,0,1 */ -#define cmRspInvalid 0 /* 0,0,0 */ - - -/* - * Firmware Request and Response Messages - */ - -/* message types */ -#define ceReqTypePhy 1 -#define ceReqTypeLnk 2 -#define ceReqTypeCall 3 -#define ceReqTypeStat 1 -#define ceRspTypeErr 0 -#define ceRspTypePhy ceReqTypePhy -#define ceRspTypeLnk ceReqTypeLnk -#define ceRspTypeCall ceReqTypeCall -#define ceRspTypeStat ceReqTypeStat - -/* message classes */ -#define ceReqClass0 0 -#define ceReqClass1 1 -#define ceReqClass2 2 -#define ceReqClass3 3 -#define ceRspClass0 ceReqClass0 -#define ceRspClass1 ceReqClass1 -#define ceRspClass2 ceReqClass2 -#define ceRspClass3 ceReqClass3 - -/* message codes (B) = BRI only, (P) = PRI only, (V) = POTS only */ -#define ceReqPhyProcInfo 1 /* 1,0,1 */ -#define ceReqPhyConnect 1 /* 1,1,1 */ -#define ceReqPhyDisconnect 2 /* 1,1,2 */ -#define ceReqPhySetParams 3 /* 1,1,3 (P) */ -#define ceReqPhyGetParams 4 /* 1,1,4 (P) */ -#define ceReqPhyStatus 1 /* 1,2,1 */ -#define ceReqPhyAcfaStatus 2 /* 1,2,2 (P) */ -#define ceReqPhyChCallState 3 /* 1,2,3 (P) */ -#define ceReqPhyChServState 4 /* 1,2,4 (P) */ -#define ceReqPhyRLoopBack 1 /* 1,3,1 */ -#define ceRspPhyProcInfo ceReqPhyProcInfo -#define ceRspPhyConnect ceReqPhyConnect -#define ceRspPhyDisconnect ceReqPhyDisconnect -#define ceRspPhySetParams ceReqPhySetParams -#define ceRspPhyGetParams ceReqPhyGetParams -#define ceRspPhyStatus ceReqPhyStatus -#define ceRspPhyAcfaStatus ceReqPhyAcfaStatus -#define ceRspPhyChCallState ceReqPhyChCallState -#define ceRspPhyChServState ceReqPhyChServState -#define ceRspPhyRLoopBack ceReqphyRLoopBack -#define ceReqLnkSetParam 1 /* 2,0,1 */ -#define ceReqLnkGetParam 2 /* 2,0,2 */ -#define ceReqLnkGetStats 3 /* 2,0,3 */ -#define ceReqLnkWrite 1 /* 2,1,1 */ -#define ceReqLnkRead 2 /* 2,1,2 */ -#define ceReqLnkFlush 3 /* 2,1,3 */ -#define ceReqLnkWrBufTrc 4 /* 2,1,4 */ -#define ceReqLnkRdBufTrc 5 /* 2,1,5 */ -#define ceRspLnkSetParam ceReqLnkSetParam -#define ceRspLnkGetParam ceReqLnkGetParam -#define ceRspLnkGetStats ceReqLnkGetStats -#define ceRspLnkWrite ceReqLnkWrite -#define ceRspLnkRead ceReqLnkRead -#define ceRspLnkFlush ceReqLnkFlush -#define ceRspLnkWrBufTrc ceReqLnkWrBufTrc -#define ceRspLnkRdBufTrc ceReqLnkRdBufTrc -#define ceReqCallSetSwitchType 1 /* 3,0,1 */ -#define ceReqCallGetSwitchType 2 /* 3,0,2 */ -#define ceReqCallSetFrameFormat 3 /* 3,0,3 */ -#define ceReqCallGetFrameFormat 4 /* 3,0,4 */ -#define ceReqCallSetCallType 5 /* 3,0,5 */ -#define ceReqCallGetCallType 6 /* 3,0,6 */ -#define ceReqCallSetSPID 7 /* 3,0,7 (!P) */ -#define ceReqCallGetSPID 8 /* 3,0,8 (!P) */ -#define ceReqCallSetMyNumber 9 /* 3,0,9 (!P) */ -#define ceReqCallGetMyNumber 10 /* 3,0,10 (!P) */ -#define ceRspCallSetSwitchType ceReqCallSetSwitchType -#define ceRspCallGetSwitchType ceReqCallSetSwitchType -#define ceRspCallSetFrameFormat ceReqCallSetFrameFormat -#define ceRspCallGetFrameFormat ceReqCallGetFrameFormat -#define ceRspCallSetCallType ceReqCallSetCallType -#define ceRspCallGetCallType ceReqCallGetCallType -#define ceRspCallSetSPID ceReqCallSetSPID -#define ceRspCallGetSPID ceReqCallGetSPID -#define ceRspCallSetMyNumber ceReqCallSetMyNumber -#define ceRspCallGetMyNumber ceReqCallGetMyNumber -#define ceRspStatAcfaStatus 2 -#define ceRspStat -#define ceRspErrError 0 /* 0,0,0 */ - -/* - * Call Types - */ -#define CALLTYPE_64K 0 -#define CALLTYPE_56K 1 -#define CALLTYPE_SPEECH 2 -#define CALLTYPE_31KHZ 3 - -/* - * Link Level data contains a pointer to and the length of - * a buffer in shared RAM. Used by LnkRead and LnkWrite message - * types. Part of RspMsgStruct and ReqMsgStruct. - */ -typedef struct { - unsigned long buff_offset; - unsigned short msg_len; -} LLData; - - -/* - * Message payload template for an HWConfig message - */ -typedef struct { - char st_u_sense; - char powr_sense; - char sply_sense; - unsigned char asic_id; - long ram_size; - char serial_no[13]; - char part_no[13]; - char rev_no[2]; -} HWConfig_pl; - -/* - * A Message - */ -struct message { - unsigned char sequence_no; - unsigned char process_id; - unsigned char time_stamp; - unsigned char cmd_sequence_no; /* Rsp messages only */ - unsigned char reserved1[3]; - unsigned char msg_byte_cnt; - unsigned char type; - unsigned char class; - unsigned char code; - unsigned char phy_link_no; - unsigned char rsp_status; /* Rsp messages only */ - unsigned char reseved2[3]; - union { - unsigned char byte_array[MSG_DATA_LEN]; - LLData response; - HWConfig_pl HWCresponse; - } msg_data; -}; - -typedef struct message ReqMessage; /* Request message */ -typedef struct message RspMessage; /* Response message */ - -/* - * The first 5010 bytes of shared memory contain the message queues, - * indexes and other data. This structure is its template - */ -typedef struct { - volatile ReqMessage req_queue[MAX_MESSAGES]; - volatile RspMessage rsp_queue[MAX_MESSAGES]; - volatile unsigned char req_head; - volatile unsigned char req_tail; - volatile unsigned char rsp_head; - volatile unsigned char rsp_tail; - volatile unsigned long signature; - volatile unsigned long trace_enable; - volatile unsigned char reserved[4]; -} DualPortMemory; - -#endif diff --git a/drivers/isdn/sc/packet.c b/drivers/isdn/sc/packet.c deleted file mode 100644 index 2446957085e0..000000000000 --- a/drivers/isdn/sc/packet.c +++ /dev/null @@ -1,204 +0,0 @@ -/* $Id: packet.c,v 1.5.8.1 2001/09/23 22:24:59 kai Exp $ - * - * Copyright (C) 1996 SpellCaster Telecommunications Inc. - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - * For more information, please contact gpl-info@spellcast.com or write: - * - * SpellCaster Telecommunications Inc. - * 5621 Finch Avenue East, Unit #3 - * Scarborough, Ontario Canada - * M1B 2T9 - * +1 (416) 297-8565 - * +1 (416) 297-6433 Facsimile - */ - -#include "includes.h" -#include "hardware.h" -#include "message.h" -#include "card.h" - -int sndpkt(int devId, int channel, int ack, struct sk_buff *data) -{ - LLData ReqLnkWrite; - int status; - int card; - unsigned long len; - - card = get_card_from_id(devId); - - if (!IS_VALID_CARD(card)) { - pr_debug("invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - - pr_debug("%s: sndpkt: frst = 0x%lx nxt = %d f = %d n = %d\n", - sc_adapter[card]->devicename, - sc_adapter[card]->channel[channel].first_sendbuf, - sc_adapter[card]->channel[channel].next_sendbuf, - sc_adapter[card]->channel[channel].free_sendbufs, - sc_adapter[card]->channel[channel].num_sendbufs); - - if (!sc_adapter[card]->channel[channel].free_sendbufs) { - pr_debug("%s: out of TX buffers\n", - sc_adapter[card]->devicename); - return -EINVAL; - } - - if (data->len > BUFFER_SIZE) { - pr_debug("%s: data overflows buffer size (data > buffer)\n", - sc_adapter[card]->devicename); - return -EINVAL; - } - - ReqLnkWrite.buff_offset = sc_adapter[card]->channel[channel].next_sendbuf * - BUFFER_SIZE + sc_adapter[card]->channel[channel].first_sendbuf; - ReqLnkWrite.msg_len = data->len; /* sk_buff size */ - pr_debug("%s: writing %d bytes to buffer offset 0x%lx\n", - sc_adapter[card]->devicename, - ReqLnkWrite.msg_len, ReqLnkWrite.buff_offset); - memcpy_toshmem(card, (char *)ReqLnkWrite.buff_offset, data->data, ReqLnkWrite.msg_len); - - /* - * sendmessage - */ - pr_debug("%s: sndpkt size=%d, buf_offset=0x%lx buf_indx=%d\n", - sc_adapter[card]->devicename, - ReqLnkWrite.msg_len, ReqLnkWrite.buff_offset, - sc_adapter[card]->channel[channel].next_sendbuf); - - status = sendmessage(card, CEPID, ceReqTypeLnk, ceReqClass1, ceReqLnkWrite, - channel + 1, sizeof(LLData), (unsigned int *)&ReqLnkWrite); - len = data->len; - if (status) { - pr_debug("%s: failed to send packet, status = %d\n", - sc_adapter[card]->devicename, status); - return -1; - } - else { - sc_adapter[card]->channel[channel].free_sendbufs--; - sc_adapter[card]->channel[channel].next_sendbuf = - ++sc_adapter[card]->channel[channel].next_sendbuf == - sc_adapter[card]->channel[channel].num_sendbufs ? 0 : - sc_adapter[card]->channel[channel].next_sendbuf; - pr_debug("%s: packet sent successfully\n", sc_adapter[card]->devicename); - dev_kfree_skb(data); - indicate_status(card, ISDN_STAT_BSENT, channel, (char *)&len); - } - return len; -} - -void rcvpkt(int card, RspMessage *rcvmsg) -{ - LLData newll; - struct sk_buff *skb; - - if (!IS_VALID_CARD(card)) { - pr_debug("invalid param: %d is not a valid card id\n", card); - return; - } - - switch (rcvmsg->rsp_status) { - case 0x01: - case 0x02: - case 0x70: - pr_debug("%s: error status code: 0x%x\n", - sc_adapter[card]->devicename, rcvmsg->rsp_status); - return; - case 0x00: - if (!(skb = dev_alloc_skb(rcvmsg->msg_data.response.msg_len))) { - printk(KERN_WARNING "%s: rcvpkt out of memory, dropping packet\n", - sc_adapter[card]->devicename); - return; - } - skb_put(skb, rcvmsg->msg_data.response.msg_len); - pr_debug("%s: getting data from offset: 0x%lx\n", - sc_adapter[card]->devicename, - rcvmsg->msg_data.response.buff_offset); - memcpy_fromshmem(card, - skb_put(skb, rcvmsg->msg_data.response.msg_len), - (char *)rcvmsg->msg_data.response.buff_offset, - rcvmsg->msg_data.response.msg_len); - sc_adapter[card]->card->rcvcallb_skb(sc_adapter[card]->driverId, - rcvmsg->phy_link_no - 1, skb); - - case 0x03: - /* - * Recycle the buffer - */ - pr_debug("%s: buffer size : %d\n", - sc_adapter[card]->devicename, BUFFER_SIZE); -/* memset_shmem(card, rcvmsg->msg_data.response.buff_offset, 0, BUFFER_SIZE); */ - newll.buff_offset = rcvmsg->msg_data.response.buff_offset; - newll.msg_len = BUFFER_SIZE; - pr_debug("%s: recycled buffer at offset 0x%lx size %d\n", - sc_adapter[card]->devicename, - newll.buff_offset, newll.msg_len); - sendmessage(card, CEPID, ceReqTypeLnk, ceReqClass1, ceReqLnkRead, - rcvmsg->phy_link_no, sizeof(LLData), (unsigned int *)&newll); - } - -} - -int setup_buffers(int card, int c) -{ - unsigned int nBuffers, i, cBase; - unsigned int buffer_size; - LLData RcvBuffOffset; - - if (!IS_VALID_CARD(card)) { - pr_debug("invalid param: %d is not a valid card id\n", card); - return -ENODEV; - } - - /* - * Calculate the buffer offsets (send/recv/send/recv) - */ - pr_debug("%s: setting up channel buffer space in shared RAM\n", - sc_adapter[card]->devicename); - buffer_size = BUFFER_SIZE; - nBuffers = ((sc_adapter[card]->ramsize - BUFFER_BASE) / buffer_size) / 2; - nBuffers = nBuffers > BUFFERS_MAX ? BUFFERS_MAX : nBuffers; - pr_debug("%s: calculating buffer space: %d buffers, %d big\n", - sc_adapter[card]->devicename, - nBuffers, buffer_size); - if (nBuffers < 2) { - pr_debug("%s: not enough buffer space\n", - sc_adapter[card]->devicename); - return -1; - } - cBase = (nBuffers * buffer_size) * (c - 1); - pr_debug("%s: channel buffer offset from shared RAM: 0x%x\n", - sc_adapter[card]->devicename, cBase); - sc_adapter[card]->channel[c - 1].first_sendbuf = BUFFER_BASE + cBase; - sc_adapter[card]->channel[c - 1].num_sendbufs = nBuffers / 2; - sc_adapter[card]->channel[c - 1].free_sendbufs = nBuffers / 2; - sc_adapter[card]->channel[c - 1].next_sendbuf = 0; - pr_debug("%s: send buffer setup complete: first=0x%lx n=%d f=%d, nxt=%d\n", - sc_adapter[card]->devicename, - sc_adapter[card]->channel[c - 1].first_sendbuf, - sc_adapter[card]->channel[c - 1].num_sendbufs, - sc_adapter[card]->channel[c - 1].free_sendbufs, - sc_adapter[card]->channel[c - 1].next_sendbuf); - - /* - * Prep the receive buffers - */ - pr_debug("%s: adding %d RecvBuffers:\n", - sc_adapter[card]->devicename, nBuffers / 2); - for (i = 0; i < nBuffers / 2; i++) { - RcvBuffOffset.buff_offset = - ((sc_adapter[card]->channel[c - 1].first_sendbuf + - (nBuffers / 2) * buffer_size) + (buffer_size * i)); - RcvBuffOffset.msg_len = buffer_size; - pr_debug("%s: adding RcvBuffer #%d offset=0x%lx sz=%d bufsz:%d\n", - sc_adapter[card]->devicename, - i + 1, RcvBuffOffset.buff_offset, - RcvBuffOffset.msg_len, buffer_size); - sendmessage(card, CEPID, ceReqTypeLnk, ceReqClass1, ceReqLnkRead, - c, sizeof(LLData), (unsigned int *)&RcvBuffOffset); - } - return 0; -} diff --git a/drivers/isdn/sc/scioc.h b/drivers/isdn/sc/scioc.h deleted file mode 100644 index a50e143779e7..000000000000 --- a/drivers/isdn/sc/scioc.h +++ /dev/null @@ -1,110 +0,0 @@ -#ifndef __ISDN_SC_SCIOC_H__ -#define __ISDN_SC_SCIOC_H__ - -/* - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - */ - -/* - * IOCTL Command Codes - */ -#define SCIOCLOAD 0x01 /* Load a firmware record */ -#define SCIOCRESET 0x02 /* Perform hard reset */ -#define SCIOCDEBUG 0x03 /* Set debug level */ -#define SCIOCREV 0x04 /* Get driver revision(s) */ -#define SCIOCSTART 0x05 /* Start the firmware */ -#define SCIOCGETSWITCH 0x06 /* Get switch type */ -#define SCIOCSETSWITCH 0x07 /* Set switch type */ -#define SCIOCGETSPID 0x08 /* Get channel SPID */ -#define SCIOCSETSPID 0x09 /* Set channel SPID */ -#define SCIOCGETDN 0x0A /* Get channel DN */ -#define SCIOCSETDN 0x0B /* Set channel DN */ -#define SCIOCTRACE 0x0C /* Toggle trace mode */ -#define SCIOCSTAT 0x0D /* Get line status */ -#define SCIOCGETSPEED 0x0E /* Set channel speed */ -#define SCIOCSETSPEED 0x0F /* Set channel speed */ -#define SCIOCLOOPTST 0x10 /* Perform loopback test */ - -typedef struct { - int device; - int channel; - unsigned long command; - void __user *dataptr; -} scs_ioctl; - -/* Size of strings */ -#define SCIOC_SPIDSIZE 49 -#define SCIOC_DNSIZE SCIOC_SPIDSIZE -#define SCIOC_REVSIZE SCIOC_SPIDSIZE -#define SCIOC_SRECSIZE 49 - -typedef struct { - unsigned long tx_good; - unsigned long tx_bad; - unsigned long rx_good; - unsigned long rx_bad; -} ChLinkStats; - -typedef struct { - char spid[49]; - char dn[49]; - char call_type; - char phy_stat; - ChLinkStats link_stats; -} BRIStat; - -typedef BRIStat POTStat; - -typedef struct { - char call_type; - char call_state; - char serv_state; - char phy_stat; - ChLinkStats link_stats; -} PRIStat; - -typedef char PRIInfo; -typedef char BRIInfo; -typedef char POTInfo; - - -typedef struct { - char acfa_nos; - char acfa_ais; - char acfa_los; - char acfa_rra; - char acfa_slpp; - char acfa_slpn; - char acfa_fsrf; -} ACFAStat; - -typedef struct { - unsigned char modelid; - char serial_no[13]; - char part_no[13]; - char load_ver[11]; - char proc_ver[11]; - int iobase; - long rambase; - char irq; - long ramsize; - char interface; - char switch_type; - char l1_status; - char l2_status; - ChLinkStats dch_stats; - ACFAStat AcfaStats; - union { - PRIStat pristats[23]; - BRIStat bristats[2]; - POTStat potsstats[2]; - } status; - union { - PRIInfo priinfo; - BRIInfo briinfo; - POTInfo potsinfo; - } info; -} boardInfo; - -#endif /* __ISDN_SC_SCIOC_H__ */ diff --git a/drivers/isdn/sc/shmem.c b/drivers/isdn/sc/shmem.c deleted file mode 100644 index d24506ceb6e8..000000000000 --- a/drivers/isdn/sc/shmem.c +++ /dev/null @@ -1,138 +0,0 @@ -/* $Id: shmem.c,v 1.2.10.1 2001/09/23 22:24:59 kai Exp $ - * - * Copyright (C) 1996 SpellCaster Telecommunications Inc. - * - * Card functions implementing ISDN4Linux functionality - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - * For more information, please contact gpl-info@spellcast.com or write: - * - * SpellCaster Telecommunications Inc. - * 5621 Finch Avenue East, Unit #3 - * Scarborough, Ontario Canada - * M1B 2T9 - * +1 (416) 297-8565 - * +1 (416) 297-6433 Facsimile - */ - -#include "includes.h" /* This must be first */ -#include "hardware.h" -#include "card.h" - -/* - * - */ -void memcpy_toshmem(int card, void *dest, const void *src, size_t n) -{ - unsigned long flags; - unsigned char ch; - unsigned long dest_rem = ((unsigned long) dest) % 0x4000; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return; - } - - if (n > SRAM_PAGESIZE) - return; - - /* - * determine the page to load from the address - */ - ch = (unsigned long) dest / SRAM_PAGESIZE; - pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch); - /* - * Block interrupts and load the page - */ - spin_lock_irqsave(&sc_adapter[card]->lock, flags); - - outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80, - sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); - memcpy_toio((void __iomem *)(sc_adapter[card]->rambase + dest_rem), src, n); - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); - pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename, - ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80); - pr_debug("%s: copying %zu bytes from %#lx to %#lx\n", - sc_adapter[card]->devicename, n, - (unsigned long) src, - sc_adapter[card]->rambase + ((unsigned long) dest % 0x4000)); -} - -/* - * Reverse of above - */ -void memcpy_fromshmem(int card, void *dest, const void *src, size_t n) -{ - unsigned long flags; - unsigned char ch; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return; - } - - if (n > SRAM_PAGESIZE) { - return; - } - - /* - * determine the page to load from the address - */ - ch = (unsigned long) src / SRAM_PAGESIZE; - pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch); - - - /* - * Block interrupts and load the page - */ - spin_lock_irqsave(&sc_adapter[card]->lock, flags); - - outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80, - sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); - memcpy_fromio(dest, (void *)(sc_adapter[card]->rambase + - ((unsigned long) src % 0x4000)), n); - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); - pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename, - ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80); -/* pr_debug("%s: copying %d bytes from %#x to %#x\n", - sc_adapter[card]->devicename, n, - sc_adapter[card]->rambase + ((unsigned long) src %0x4000), (unsigned long) dest); */ -} - -#if 0 -void memset_shmem(int card, void *dest, int c, size_t n) -{ - unsigned long flags; - unsigned char ch; - - if (!IS_VALID_CARD(card)) { - pr_debug("Invalid param: %d is not a valid card id\n", card); - return; - } - - if (n > SRAM_PAGESIZE) { - return; - } - - /* - * determine the page to load from the address - */ - ch = (unsigned long) dest / SRAM_PAGESIZE; - pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch); - - /* - * Block interrupts and load the page - */ - spin_lock_irqsave(&sc_adapter[card]->lock, flags); - - outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80, - sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); - memset_io(sc_adapter[card]->rambase + - ((unsigned long) dest % 0x4000), c, n); - pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename, - ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80); - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); -} -#endif /* 0 */ diff --git a/drivers/isdn/sc/timer.c b/drivers/isdn/sc/timer.c deleted file mode 100644 index 6fbac2230d7e..000000000000 --- a/drivers/isdn/sc/timer.c +++ /dev/null @@ -1,122 +0,0 @@ -/* $Id: timer.c,v 1.3.6.1 2001/09/23 22:24:59 kai Exp $ - * - * Copyright (C) 1996 SpellCaster Telecommunications Inc. - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - * For more information, please contact gpl-info@spellcast.com or write: - * - * SpellCaster Telecommunications Inc. - * 5621 Finch Avenue East, Unit #3 - * Scarborough, Ontario Canada - * M1B 2T9 - * +1 (416) 297-8565 - * +1 (416) 297-6433 Facsimile - */ - -#include "includes.h" -#include "hardware.h" -#include "message.h" -#include "card.h" - - -/* - * Write the proper values into the I/O ports following a reset - */ -static void setup_ports(int card) -{ - - outb((sc_adapter[card]->rambase >> 12), sc_adapter[card]->ioport[EXP_BASE]); - - /* And the IRQ */ - outb((sc_adapter[card]->interrupt | 0x80), - sc_adapter[card]->ioport[IRQ_SELECT]); -} - -/* - * Timed function to check the status of a previous reset - * Must be very fast as this function runs in the context of - * an interrupt handler. - * - * Setup the ioports for the board that were cleared by the reset. - * Then, check to see if the signate has been set. Next, set the - * signature to a known value and issue a startproc if needed. - */ -void sc_check_reset(unsigned long data) -{ - unsigned long flags; - unsigned long sig; - int card = (unsigned int) data; - - pr_debug("%s: check_timer timer called\n", - sc_adapter[card]->devicename); - - /* Setup the io ports */ - setup_ports(card); - - spin_lock_irqsave(&sc_adapter[card]->lock, flags); - outb(sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport], - (sc_adapter[card]->shmem_magic >> 14) | 0x80); - sig = (unsigned long) *((unsigned long *)(sc_adapter[card]->rambase + SIG_OFFSET)); - - /* check the signature */ - if (sig == SIGNATURE) { - flushreadfifo(card); - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); - /* See if we need to do a startproc */ - if (sc_adapter[card]->StartOnReset) - startproc(card); - } else { - pr_debug("%s: No signature yet, waiting another %lu jiffies.\n", - sc_adapter[card]->devicename, CHECKRESET_TIME); - mod_timer(&sc_adapter[card]->reset_timer, jiffies + CHECKRESET_TIME); - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); - } -} - -/* - * Timed function to check the status of a previous reset - * Must be very fast as this function runs in the context of - * an interrupt handler. - * - * Send check sc_adapter->phystat to see if the channels are up - * If they are, tell ISDN4Linux that the board is up. If not, - * tell IADN4Linux that it is up. Always reset the timer to - * fire again (endless loop). - */ -void check_phystat(unsigned long data) -{ - unsigned long flags; - int card = (unsigned int) data; - - pr_debug("%s: Checking status...\n", sc_adapter[card]->devicename); - /* - * check the results of the last PhyStat and change only if - * has changed drastically - */ - if (sc_adapter[card]->nphystat && !sc_adapter[card]->phystat) { /* All is well */ - pr_debug("PhyStat transition to RUN\n"); - pr_info("%s: Switch contacted, transmitter enabled\n", - sc_adapter[card]->devicename); - indicate_status(card, ISDN_STAT_RUN, 0, NULL); - } - else if (!sc_adapter[card]->nphystat && sc_adapter[card]->phystat) { /* All is not well */ - pr_debug("PhyStat transition to STOP\n"); - pr_info("%s: Switch connection lost, transmitter disabled\n", - sc_adapter[card]->devicename); - - indicate_status(card, ISDN_STAT_STOP, 0, NULL); - } - - sc_adapter[card]->phystat = sc_adapter[card]->nphystat; - - /* Reinitialize the timer */ - spin_lock_irqsave(&sc_adapter[card]->lock, flags); - mod_timer(&sc_adapter[card]->stat_timer, jiffies + CHECKSTAT_TIME); - spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); - - /* Send a new cePhyStatus message */ - sendmessage(card, CEPID, ceReqTypePhy, ceReqClass2, - ceReqPhyStatus, 0, 0, NULL); -}
The 'sc' ISDN driver relies on using readl() to access ISA I/O memory. This has been deprecated and produced warnings since linux-2.3.23, disabled by default since 2.4.10 and finally removed in 2.6.5. I found this because the compiling the driver for ARM produces a warning: In file included from ../drivers/isdn/sc/includes.h:8:0, from ../drivers/isdn/sc/init.c:13: ../arch/arm/include/asm/io.h:115:21: note: expected 'const volatile void *' but argument is of type 'long unsigned int' It is pretty clear that this driver has not been used for a long time and there is no point fixing it now, so let's remove it. Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- There has been some discussion about removing all the ISA based ISDN drivers in the past. I'm not trying to restart that discussion at the moment, and I did not find the same bug in the other drivers, so let's just remove this one for now. drivers/isdn/Makefile | 1 - drivers/isdn/i4l/Kconfig | 2 - drivers/isdn/sc/Kconfig | 8 - drivers/isdn/sc/Makefile | 10 - drivers/isdn/sc/card.h | 131 ---------- drivers/isdn/sc/command.c | 363 --------------------------- drivers/isdn/sc/event.c | 68 ------ drivers/isdn/sc/hardware.h | 110 --------- drivers/isdn/sc/includes.h | 16 -- drivers/isdn/sc/init.c | 549 ----------------------------------------- drivers/isdn/sc/interrupt.c | 247 ------------------- drivers/isdn/sc/ioctl.c | 582 -------------------------------------------- drivers/isdn/sc/message.c | 230 ----------------- drivers/isdn/sc/message.h | 245 ------------------- drivers/isdn/sc/packet.c | 204 ---------------- drivers/isdn/sc/scioc.h | 110 --------- drivers/isdn/sc/shmem.c | 138 ----------- drivers/isdn/sc/timer.c | 122 ---------- 18 files changed, 3136 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html