Commit 6cc56834 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by David S. Miller

isdn: remove spellcaster driver

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: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2f7a791c
......@@ -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/
......
......@@ -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
......
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.
# 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
/* $Id: card.h,v 1.1.10.1 2001/09/23 22:24:59 kai Exp $
*
* Driver parameters for SpellCaster ISA ISDN adapters
*
* Copyright (C) 1996 SpellCaster Telecommunications Inc.
*
* This software may be used and distributed according to the terms
* of the GNU General Public License, incorporated herein by reference.
*
* For more information, please contact gpl-info@spellcast.com or write:
*
* SpellCaster Telecommunications Inc.
* 5621 Finch Avenue East, Unit #3
* Scarborough, Ontario Canada
* M1B 2T9
* +1 (416) 297-8565
* +1 (416) 297-6433 Facsimile
*/
#ifndef CARD_H
#define CARD_H
/*
* We need these if they're not already included
*/
#include <linux/timer.h>
#include <linux/time.h>
#include <linux/isdnif.h>
#include <linux/irqreturn.h>
#include "message.h"
#include "scioc.h"
/*
* Amount of time to wait for a reset to complete
*/
#define CHECKRESET_TIME msecs_to_jiffies(4000)
/*
* Amount of time between line status checks
*/
#define CHECKSTAT_TIME msecs_to_jiffies(8000)
/*
* The maximum amount of time to wait for a message response
* to arrive. Use exclusively by send_and_receive
*/
#define SAR_TIMEOUT msecs_to_jiffies(10000)
/*
* Macro to determine is a card id is valid
*/
#define IS_VALID_CARD(x) ((x >= 0) && (x <= cinst))
/*
* Per channel status and configuration
*/
typedef struct {
int l2_proto;
int l3_proto;
char dn[50];
unsigned long first_sendbuf; /* Offset of first send buffer */
unsigned int num_sendbufs; /* Number of send buffers */
unsigned int free_sendbufs; /* Number of free sendbufs */
unsigned int next_sendbuf; /* Next sequential buffer */
char eazlist[50]; /* Set with SETEAZ */
char sillist[50]; /* Set with SETSIL */
int eazclear; /* Don't accept calls if TRUE */
} bchan;
/*
* Everything you want to know about the adapter ...
*/
typedef struct {
int model;
int driverId; /* LL Id */
char devicename[20]; /* The device name */
isdn_if *card; /* ISDN4Linux structure */
bchan *channel; /* status of the B channels */
char nChannels; /* Number of channels */
unsigned int interrupt; /* Interrupt number */
int iobase; /* I/O Base address */
int ioport[MAX_IO_REGS]; /* Index to I/O ports */
int shmem_pgport; /* port for the exp mem page reg. */
int shmem_magic; /* adapter magic number */
unsigned int rambase; /* Shared RAM base address */
unsigned int ramsize; /* Size of shared memory */
RspMessage async_msg; /* Async response message */
int want_async_messages; /* Snoop the Q ? */
unsigned char seq_no; /* Next send seq. number */
struct timer_list reset_timer; /* Check reset timer */
struct timer_list stat_timer; /* Check startproc timer */
unsigned char nphystat; /* Latest PhyStat info */
unsigned char phystat; /* Last PhyStat info */
HWConfig_pl hwconfig; /* Hardware config info */
char load_ver[11]; /* CommManage Version string */
char proc_ver[11]; /* CommEngine Version */
int StartOnReset; /* Indicates startproc after reset */
int EngineUp; /* Indicates CommEngine Up */
int trace_mode; /* Indicate if tracing is on */
spinlock_t lock; /* local lock */
} board;
extern board *sc_adapter[];
extern int cinst;
void memcpy_toshmem(int card, void *dest, const void *src, size_t n);
void memcpy_fromshmem(int card, void *dest, const void *src, size_t n);
int get_card_from_id(int driver);
int indicate_status(int card, int event, ulong Channel, char *Data);
irqreturn_t interrupt_handler(int interrupt, void *cardptr);
int sndpkt(int devId, int channel, int ack, struct sk_buff *data);
void rcvpkt(int card, RspMessage *rcvmsg);
int command(isdn_ctrl *cmd);
int reset(int card);
int startproc(int card);
int send_and_receive(int card, unsigned int procid, unsigned char type,
unsigned char class, unsigned char code,
unsigned char link, unsigned char data_len,
unsigned char *data, RspMessage *mesgdata, int timeout);
void flushreadfifo(int card);
int sendmessage(int card, unsigned int procid, unsigned int type,
unsigned int class, unsigned int code, unsigned int link,
unsigned int data_len, unsigned int *data);
int receivemessage(int card, RspMessage *rspmsg);
int sc_ioctl(int card, scs_ioctl *data);
int setup_buffers(int card, int c);
void sc_check_reset(unsigned long data);
void check_phystat(unsigned long data);
#endif /* CARD_H */
/* $Id: command.c,v 1.4.10.1 2001/09/23 22:24:59 kai Exp $
*
* Copyright (C) 1996 SpellCaster Telecommunications Inc.
*
* This software may be used and distributed according to the terms
* of the GNU General Public License, incorporated herein by reference.
*
* For more information, please contact gpl-info@spellcast.com or write:
*
* SpellCaster Telecommunications Inc.
* 5621 Finch Avenue East, Unit #3
* Scarborough, Ontario Canada
* M1B 2T9
* +1 (416) 297-8565
* +1 (416) 297-6433 Facsimile
*/
#include <linux/module.h>
#include "includes.h" /* This must be first */
#include "hardware.h"
#include "message.h"
#include "card.h"
#include "scioc.h"
static int dial(int card, unsigned long channel, setup_parm setup);
static int hangup(int card, unsigned long channel);
static int answer(int card, unsigned long channel);
static int clreaz(int card, unsigned long channel);
static int seteaz(int card, unsigned long channel, char *);
static int setl2(int card, unsigned long arg);
static int setl3(int card, unsigned long arg);
static int acceptb(int card, unsigned long channel);
#ifdef DEBUG
/*
* Translate command codes to strings
*/
static char *commands[] = { "ISDN_CMD_IOCTL",
"ISDN_CMD_DIAL",
"ISDN_CMD_ACCEPTB",
"ISDN_CMD_ACCEPTB",
"ISDN_CMD_HANGUP",
"ISDN_CMD_CLREAZ",
"ISDN_CMD_SETEAZ",
NULL,
NULL,
NULL,
"ISDN_CMD_SETL2",
NULL,
"ISDN_CMD_SETL3",
NULL,
NULL,
NULL,
NULL,
NULL, };
/*
* Translates ISDN4Linux protocol codes to strings for debug messages
*/
static char *l3protos[] = { "ISDN_PROTO_L3_TRANS" };
static char *l2protos[] = { "ISDN_PROTO_L2_X75I",
"ISDN_PROTO_L2_X75UI",
"ISDN_PROTO_L2_X75BUI",
"ISDN_PROTO_L2_HDLC",
"ISDN_PROTO_L2_TRANS" };
#endif
int get_card_from_id(int driver)
{
int i;
for (i = 0; i < cinst; i++) {
if (sc_adapter[i]->driverId == driver)
return i;
}
return -ENODEV;
}
/*
* command
*/
int command(isdn_ctrl *cmd)
{
int card;
card = get_card_from_id(cmd->driver);
if (!IS_VALID_CARD(card)) {
pr_debug("Invalid param: %d is not a valid card id\n", card);
return -ENODEV;
}
/*
* Dispatch the command
*/
switch (cmd->command) {
case ISDN_CMD_IOCTL:
{
unsigned long cmdptr;
scs_ioctl ioc;
memcpy(&cmdptr, cmd->parm.num, sizeof(unsigned long));
if (copy_from_user(&ioc, (scs_ioctl __user *)cmdptr,
sizeof(scs_ioctl))) {
pr_debug("%s: Failed to verify user space 0x%lx\n",
sc_adapter[card]->devicename, cmdptr);
return -EFAULT;
}
return sc_ioctl(card, &ioc);
}
case ISDN_CMD_DIAL:
return dial(card, cmd->arg, cmd->parm.setup);
case ISDN_CMD_HANGUP:
return hangup(card, cmd->arg);
case ISDN_CMD_ACCEPTD:
return answer(card, cmd->arg);
case ISDN_CMD_ACCEPTB:
return acceptb(card, cmd->arg);
case ISDN_CMD_CLREAZ:
return clreaz(card, cmd->arg);
case ISDN_CMD_SETEAZ:
return seteaz(card, cmd->arg, cmd->parm.num);
case ISDN_CMD_SETL2:
return setl2(card, cmd->arg);
case ISDN_CMD_SETL3:
return setl3(card, cmd->arg);
default:
return -EINVAL;
}
return 0;
}
/*
* start the onboard firmware
*/
int startproc(int card)
{
int status;
if (!IS_VALID_CARD(card)) {
pr_debug("Invalid param: %d is not a valid card id\n", card);
return -ENODEV;
}
/*
* send start msg
*/
status = sendmessage(card, CMPID, cmReqType2,
cmReqClass0,
cmReqStartProc,
0, 0, NULL);
pr_debug("%s: Sent startProc\n", sc_adapter[card]->devicename);
return status;
}
/*
* Dials the number passed in
*/
static int dial(int card, unsigned long channel, setup_parm setup)
{
int status;
char Phone[48];
if (!IS_VALID_CARD(card)) {
pr_debug("Invalid param: %d is not a valid card id\n", card);
return -ENODEV;
}
/*extract ISDN number to dial from eaz/msn string*/
strcpy(Phone, setup.phone);
/*send the connection message*/
status = sendmessage(card, CEPID, ceReqTypePhy,
ceReqClass1,
ceReqPhyConnect,
(unsigned char)channel + 1,
strlen(Phone),
(unsigned int *)Phone);
pr_debug("%s: Dialing %s on channel %lu\n",
sc_adapter[card]->devicename, Phone, channel + 1);
return status;
}
/*
* Answer an incoming call
*/
static int answer(int card, unsigned long channel)
{
if (!IS_VALID_CARD(card)) {
pr_debug("Invalid param: %d is not a valid card id\n", card);
return -ENODEV;
}
if (setup_buffers(card, channel + 1)) {
hangup(card, channel + 1);
return -ENOBUFS;
}
indicate_status(card, ISDN_STAT_BCONN, channel, NULL);
pr_debug("%s: Answered incoming call on channel %lu\n",
sc_adapter[card]->devicename, channel + 1);
return 0;
}
/*
* Hangup up the call on specified channel
*/
static int hangup(int card, unsigned long channel)
{
int status;
if (!IS_VALID_CARD(card)) {
pr_debug("Invalid param: %d is not a valid card id\n", card);
return -ENODEV;
}
status = sendmessage(card, CEPID, ceReqTypePhy,
ceReqClass1,
ceReqPhyDisconnect,
(unsigned char)channel + 1,
0,
NULL);
pr_debug("%s: Sent HANGUP message to channel %lu\n",
sc_adapter[card]->devicename, channel + 1);
return status;
}
/*
* Set the layer 2 protocol (X.25, HDLC, Raw)
*/
static int setl2(int card, unsigned long arg)
{
int status = 0;
int protocol, channel;
if (!IS_VALID_CARD(card)) {
pr_debug("Invalid param: %d is not a valid card id\n", card);
return -ENODEV;
}
protocol = arg >> 8;
channel = arg & 0xff;
sc_adapter[card]->channel[channel].l2_proto = protocol;
/*
* check that the adapter is also set to the correct protocol
*/
pr_debug("%s: Sending GetFrameFormat for channel %d\n",
sc_adapter[card]->devicename, channel + 1);
status = sendmessage(card, CEPID, ceReqTypeCall,
ceReqClass0,
ceReqCallGetFrameFormat,
(unsigned char)channel + 1,
1,
(unsigned int *)protocol);
if (status)
return status;
return 0;
}
/*
* Set the layer 3 protocol
*/
static int setl3(int card, unsigned long channel)
{
int protocol = channel >> 8;
if (!IS_VALID_CARD(card)) {
pr_debug("Invalid param: %d is not a valid card id\n", card);
return -ENODEV;
}
sc_adapter[card]->channel[channel].l3_proto = protocol;
return 0;
}
static int acceptb(int card, unsigned long channel)
{
if (!IS_VALID_CARD(card)) {
pr_debug("Invalid param: %d is not a valid card id\n", card);
return -ENODEV;
}
if (setup_buffers(card, channel + 1))
{
hangup(card, channel + 1);
return -ENOBUFS;
}
pr_debug("%s: B-Channel connection accepted on channel %lu\n",
sc_adapter[card]->devicename, channel + 1);
indicate_status(card, ISDN_STAT_BCONN, channel, NULL);
return 0;
}
static int clreaz(int card, unsigned long arg)
{
if (!IS_VALID_CARD(card)) {
pr_debug("Invalid param: %d is not a valid card id\n", card);
return -ENODEV;
}
strcpy(sc_adapter[card]->channel[arg].eazlist, "");
sc_adapter[card]->channel[arg].eazclear = 1;
pr_debug("%s: EAZ List cleared for channel %lu\n",
sc_adapter[card]->devicename, arg + 1);
return 0;
}
static int seteaz(int card, unsigned long arg, char *num)
{
if (!IS_VALID_CARD(card)) {
pr_debug("Invalid param: %d is not a valid card id\n", card);
return -ENODEV;
}
strcpy(sc_adapter[card]->channel[arg].eazlist, num);
sc_adapter[card]->channel[arg].eazclear = 0;
pr_debug("%s: EAZ list for channel %lu set to: %s\n",
sc_adapter[card]->devicename, arg + 1,
sc_adapter[card]->channel[arg].eazlist);
return 0;
}
int reset(int card)
{
unsigned long flags;
if (!IS_VALID_CARD(card)) {
pr_debug("Invalid param: %d is not a valid card id\n", card);
return -ENODEV;
}
indicate_status(card, ISDN_STAT_STOP, 0, NULL);
if (sc_adapter[card]->EngineUp) {
del_timer(&sc_adapter[card]->stat_timer);
}
sc_adapter[card]->EngineUp = 0;
spin_lock_irqsave(&sc_adapter[card]->lock, flags);
init_timer(&sc_adapter[card]->reset_timer);
sc_adapter[card]->reset_timer.function = sc_check_reset;
sc_adapter[card]->reset_timer.data = card;
sc_adapter[card]->reset_timer.expires = jiffies + CHECKRESET_TIME;
add_timer(&sc_adapter[card]->reset_timer);
spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
outb(0x1, sc_adapter[card]->ioport[SFT_RESET]);
pr_debug("%s: Adapter Reset\n", sc_adapter[card]->devicename);
return 0;
}
void flushreadfifo(int card)
{
while (inb(sc_adapter[card]->ioport[FIFO_STATUS]) & RF_HAS_DATA)
inb(sc_adapter[card]->ioport[FIFO_READ]);
}
/* $Id: event.c,v 1.4.8.1 2001/09/23 22:24:59 kai Exp $
*
* Copyright (C) 1996 SpellCaster Telecommunications Inc.
*
* This software may be used and distributed according to the terms
* of the GNU General Public License, incorporated herein by reference.
*
* For more information, please contact gpl-info@spellcast.com or write:
*
* SpellCaster Telecommunications Inc.
* 5621 Finch Avenue East, Unit #3
* Scarborough, Ontario Canada
* M1B 2T9
* +1 (416) 297-8565
* +1 (416) 297-6433 Facsimile
*/
#include "includes.h"
#include "hardware.h"
#include "message.h"
#include "card.h"
#ifdef DEBUG
static char *events[] = { "ISDN_STAT_STAVAIL",
"ISDN_STAT_ICALL",
"ISDN_STAT_RUN",
"ISDN_STAT_STOP",
"ISDN_STAT_DCONN",
"ISDN_STAT_BCONN",
"ISDN_STAT_DHUP",
"ISDN_STAT_BHUP",
"ISDN_STAT_CINF",
"ISDN_STAT_LOAD",
"ISDN_STAT_UNLOAD",
"ISDN_STAT_BSENT",
"ISDN_STAT_NODCH",
"ISDN_STAT_ADDCH",
"ISDN_STAT_CAUSE" };
#endif
int indicate_status(int card, int event, ulong Channel, char *Data)
{
isdn_ctrl cmd;
#ifdef DEBUG
pr_debug("%s: Indicating event %s on Channel %d\n",
sc_adapter[card]->devicename, events[event - 256], Channel);
#endif
if (Data != NULL) {
pr_debug("%s: Event data: %s\n", sc_adapter[card]->devicename,
Data);
switch (event) {
case ISDN_STAT_BSENT:
memcpy(&cmd.parm.length, Data, sizeof(cmd.parm.length));
break;
case ISDN_STAT_ICALL:
memcpy(&cmd.parm.setup, Data, sizeof(cmd.parm.setup));
break;
default:
strlcpy(cmd.parm.num, Data, sizeof(cmd.parm.num));
}
}
cmd.command = event;
cmd.driver = sc_adapter[card]->driverId;
cmd.arg = Channel;
return sc_adapter[card]->card->statcallb(&cmd);
}
/*
* 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
/*
* 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>
This diff is collapsed.
/* $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.
*