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 <a...@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-i...@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-i...@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-i...@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-i...@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-i...@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-i...@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-i...@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-i...@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-i...@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 linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to