patch-2.3.36 linux/include/linux/arcdevice.h
Next file: linux/include/linux/com20020.h
Previous file: linux/include/asm-sparc64/string.h
Back to the patch index
Back to the overall index
- Lines: 605
- Date:
Sun Jan 2 00:46:32 2000
- Orig file:
v2.3.35/linux/include/linux/arcdevice.h
- Orig date:
Wed Aug 18 11:38:46 1999
diff -u --recursive --new-file v2.3.35/linux/include/linux/arcdevice.h linux/include/linux/arcdevice.h
@@ -1,59 +1,35 @@
/*
- * INET An implementation of the TCP/IP protocol suite for the LINUX
- * operating system. NET is implemented using the BSD Socket
- * interface as the means of communication with the user level.
- *
- * Definitions for the ARCnet handlers.
- *
- * Version: $Id: arcdevice.h,v 1.3 1997/11/09 11:05:05 mj Exp $
- *
- * Authors: Avery Pennarun <apenwarr@bond.net>
- * David Woodhouse <dwmw2@cam.ac.uk>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
+ * INET An implementation of the TCP/IP protocol suite for the LINUX
+ * operating system. NET is implemented using the BSD Socket
+ * interface as the means of communication with the user level.
+ *
+ * Definitions used by the ARCnet driver.
+ *
+ * Authors: Avery Pennarun and David Woodhouse
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
*
*/
#ifndef _LINUX_ARCDEVICE_H
#define _LINUX_ARCDEVICE_H
-#include <linux/config.h>
+#include <asm/timex.h>
#include <linux/if_arcnet.h>
#ifdef __KERNEL__
-#define ARC_20020 1
-#define ARC_RIM_I 2
-#define ARC_90xx 3
-#define ARC_90xx_IO 4
-
-#define MAX_ARCNET_DEVS 8
-
-
-/* The card sends the reconfiguration signal when it loses the connection to
- * the rest of its network. It is a 'Hello, is anybody there?' cry. This
- * usually happens when a new computer on the network is powered on or when
- * the cable is broken.
- *
- * Define DETECT_RECONFIGS if you want to detect network reconfigurations.
- * Recons may be a real nuisance on a larger ARCnet network; if you are a
- * network administrator you probably would like to count them.
- * Reconfigurations will be recorded in stats.tx_carrier_errors (the last
- * field of the /proc/net/dev file).
- *
- * Define SHOW_RECONFIGS if you really want to see a log message whenever
- * a RECON occurs.
- */
-#define DETECT_RECONFIGS
-#undef SHOW_RECONFIGS
+#ifndef bool
+#define bool int
+#endif
-/* RECON_THRESHOLD is the maximum number of RECON messages to receive within
- * one minute before printing a "cabling problem" warning. You must have
- * DETECT_RECONFIGS enabled if you want to use this. The default value
- * should be fine.
+/*
+ * RECON_THRESHOLD is the maximum number of RECON messages to receive
+ * within one minute before printing a "cabling problem" warning. The
+ * default value should be fine.
*
* After that, a "cabling restored" message will be printed on the next IRQ
* if no RECON messages have been received for 10 seconds.
@@ -63,47 +39,43 @@
#define RECON_THRESHOLD 30
-/* Define this to the minimum "timeout" value. If a transmit takes longer
+/*
+ * Define this to the minimum "timeout" value. If a transmit takes longer
* than TX_TIMEOUT jiffies, Linux will abort the TX and retry. On a large
* network, or one with heavy network traffic, this timeout may need to be
* increased. The larger it is, though, the longer it will be between
- * necessary transmits - don't set this too large.
+ * necessary transmits - don't set this too high.
*/
-#define TX_TIMEOUT (20*HZ/100)
+#define TX_TIMEOUT (HZ * 200 / 1000)
-/* Display warnings about the driver being an ALPHA version.
- */
+/* Display warnings about the driver being an ALPHA version. */
#undef ALPHA_WARNING
-/* New debugging bitflags: each option can be enabled individually.
- *
- * These can be set while the driver is running by typing:
- * ifconfig arc0 down metric 1xxx HOSTNAME
- * where 1xxx is 1000 + the debug level you want
- * and HOSTNAME is your hostname/ip address
- * and then resetting your routes.
- *
- * An ioctl() should be used for this instead, someday.
- *
+/*
+ * Debugging bitflags: each option can be enabled individually.
+ *
* Note: only debug flags included in the ARCNET_DEBUG_MAX define will
* actually be available. GCC will (at least, GCC 2.7.0 will) notice
* lines using a BUGLVL not in ARCNET_DEBUG_MAX and automatically optimize
* them out.
*/
-#define D_NORMAL 1 /* important operational info */
-#define D_EXTRA 2 /* useful, but non-vital information */
-#define D_INIT 4 /* show init/probe messages */
-#define D_INIT_REASONS 8 /* show reasons for discarding probes */
+#define D_NORMAL 1 /* important operational info */
+#define D_EXTRA 2 /* useful, but non-vital information */
+#define D_INIT 4 /* show init/probe messages */
+#define D_INIT_REASONS 8 /* show reasons for discarding probes */
+#define D_RECON 32 /* print a message whenever token is lost */
+#define D_PROTO 64 /* debug auto-protocol support */
/* debug levels below give LOTS of output during normal operation! */
-#define D_DURING 16 /* trace operations (including irq's) */
-#define D_TX 32 /* show tx packets */
-#define D_RX 64 /* show rx packets */
-#define D_SKB 128 /* show skb's */
+#define D_DURING 128 /* trace operations (including irq's) */
+#define D_TX 256 /* show tx packets */
+#define D_RX 512 /* show rx packets */
+#define D_SKB 1024 /* show skb's */
+#define D_TIMING 2048 /* show time needed to copy buffers to card */
#ifndef ARCNET_DEBUG_MAX
-#define ARCNET_DEBUG_MAX (~0) /* enable ALL debug messages */
+#define ARCNET_DEBUG_MAX (~0) /* enable ALL debug messages */
#endif
#ifndef ARCNET_DEBUG
@@ -115,240 +87,248 @@
#define BUGLVL(x) if ((ARCNET_DEBUG_MAX)&arcnet_debug&(x))
#define BUGMSG2(x,msg,args...) do { BUGLVL(x) printk(msg, ## args); } while (0)
#define BUGMSG(x,msg,args...) \
- BUGMSG2(x,"%s%6s: " msg, \
- x==D_NORMAL ? KERN_WARNING : \
- x<=D_INIT_REASONS ? KERN_INFO : KERN_DEBUG , \
- dev->name , ## args)
-
-
-#define SETMASK AINTMASK(lp->intmask)
-
- /* Time needed to resetthe card - in jiffies. This works on my SMC
- * PC100. I can't find a reference that tells me just how long I
- * should wait.
- */
-#define RESETtime (HZ * 3 / 10) /* reset */
-
- /* these are the max/min lengths of packet data. (including
- * ClientData header)
- * note: packet sizes 250, 251, 252 are impossible (God knows why)
- * so exception packets become necessary.
- *
- * These numbers are compared with the length of the full packet,
- * including ClientData header.
- */
-#define MTU 253 /* normal packet max size */
-#define MinTU 257 /* extended packet min size */
-#define XMTU 508 /* extended packet max size */
-
- /* status/interrupt mask bit fields */
-#define TXFREEflag 0x01 /* transmitter available */
-#define TXACKflag 0x02 /* transmitted msg. ackd */
-#define RECONflag 0x04 /* system reconfigured */
-#define TESTflag 0x08 /* test flag */
-#define RESETflag 0x10 /* power-on-reset */
-#define RES1flag 0x20 /* reserved - usually set by jumper */
-#define RES2flag 0x40 /* reserved - usually set by jumper */
-#define NORXflag 0x80 /* receiver inhibited */
-
- /* Flags used for IO-mapped memory operations */
-#define AUTOINCflag 0x40 /* Increase location with each access */
-#define IOMAPflag 0x02 /* (for 90xx) Use IO mapped memory, not mmap */
-#define ENABLE16flag 0x80 /* (for 90xx) Enable 16-bit mode */
-
- /* in the command register, the following bits have these meanings:
- * 0-2 command
- * 3-4 page number (for enable rcv/xmt command)
- * 7 receive broadcasts
- */
-#define NOTXcmd 0x01 /* disable transmitter */
-#define NORXcmd 0x02 /* disable receiver */
-#define TXcmd 0x03 /* enable transmitter */
-#define RXcmd 0x04 /* enable receiver */
-#define CONFIGcmd 0x05 /* define configuration */
-#define CFLAGScmd 0x06 /* clear flags */
-#define TESTcmd 0x07 /* load test flags */
-
- /* flags for "clear flags" command */
-#define RESETclear 0x08 /* power-on-reset */
-#define CONFIGclear 0x10 /* system reconfigured */
-
- /* flags for "load test flags" command */
-#define TESTload 0x08 /* test flag (diagnostic) */
-
- /* byte deposited into first address of buffers on reset */
-#define TESTvalue 0321 /* that's octal for 0xD1 :) */
-
- /* for "enable receiver" command */
-#define RXbcasts 0x80 /* receive broadcasts */
-
- /* flags for "define configuration" command */
-#define NORMALconf 0x00 /* 1-249 byte packets */
-#define EXTconf 0x08 /* 250-504 byte packets */
-
- /* Starts receiving packets into recbuf.
- */
-#define EnableReceiver() ACOMMAND(RXcmd|(recbuf<<3)|RXbcasts)
+ BUGMSG2(x, "%s%6s: " msg, \
+ x==D_NORMAL ? KERN_WARNING \
+ : x < D_DURING ? KERN_INFO : KERN_DEBUG, \
+ dev->name , ## args)
+
+/* see how long a function call takes to run, expressed in CPU cycles */
+#define TIME(name, bytes, call) BUGLVL(D_TIMING) { \
+ cycles_t _x, _y; \
+ _x = get_cycles(); \
+ call; \
+ _y = get_cycles(); \
+ BUGMSG(D_TIMING, \
+ "%s: %d bytes in %lu cycles == " \
+ "%lu Kbytes/100Mcycle\n",\
+ name, bytes, _y - _x, \
+ 100000000 / 1024 * bytes / (_y - _x + 1));\
+ } \
+ else { \
+ call;\
+ }
+
+
+/*
+ * Time needed to reset the card - in ms (milliseconds). This works on my
+ * SMC PC100. I can't find a reference that tells me just how long I
+ * should wait.
+ */
+#define RESETtime (300)
+/*
+ * These are the max/min lengths of packet payload, not including the
+ * arc_hardware header, but definitely including the soft header.
+ *
+ * Note: packet sizes 254, 255, 256 are impossible because of the way
+ * ARCnet registers work That's why RFC1201 defines "exception" packets.
+ * In non-RFC1201 protocols, we have to just tack some extra bytes on the
+ * end.
+ */
+#define MTU 253 /* normal packet max size */
+#define MinTU 257 /* extended packet min size */
+#define XMTU 508 /* extended packet max size */
+
+/* status/interrupt mask bit fields */
+#define TXFREEflag 0x01 /* transmitter available */
+#define TXACKflag 0x02 /* transmitted msg. ackd */
+#define RECONflag 0x04 /* network reconfigured */
+#define TESTflag 0x08 /* test flag */
+#define RESETflag 0x10 /* power-on-reset */
+#define RES1flag 0x20 /* reserved - usually set by jumper */
+#define RES2flag 0x40 /* reserved - usually set by jumper */
+#define NORXflag 0x80 /* receiver inhibited */
+
+/* Flags used for IO-mapped memory operations */
+#define AUTOINCflag 0x40 /* Increase location with each access */
+#define IOMAPflag 0x02 /* (for 90xx) Use IO mapped memory, not mmap */
+#define ENABLE16flag 0x80 /* (for 90xx) Enable 16-bit mode */
+
+/* in the command register, the following bits have these meanings:
+ * 0-2 command
+ * 3-4 page number (for enable rcv/xmt command)
+ * 7 receive broadcasts
+ */
+#define NOTXcmd 0x01 /* disable transmitter */
+#define NORXcmd 0x02 /* disable receiver */
+#define TXcmd 0x03 /* enable transmitter */
+#define RXcmd 0x04 /* enable receiver */
+#define CONFIGcmd 0x05 /* define configuration */
+#define CFLAGScmd 0x06 /* clear flags */
+#define TESTcmd 0x07 /* load test flags */
+
+/* flags for "clear flags" command */
+#define RESETclear 0x08 /* power-on-reset */
+#define CONFIGclear 0x10 /* system reconfigured */
+
+/* flags for "load test flags" command */
+#define TESTload 0x08 /* test flag (diagnostic) */
+
+/* byte deposited into first address of buffers on reset */
+#define TESTvalue 0321 /* that's octal for 0xD1 :) */
+
+/* for "enable receiver" command */
+#define RXbcasts 0x80 /* receive broadcasts */
+
+/* flags for "define configuration" command */
+#define NORMALconf 0x00 /* 1-249 byte packets */
+#define EXTconf 0x08 /* 250-504 byte packets */
+
+
+/* information needed to define an encapsulation driver */
+struct ArcProto {
+ char suffix; /* a for RFC1201, e for ether-encap, etc. */
+ int mtu; /* largest possible packet */
+
+ void (*rx) (struct net_device * dev, int bufnum,
+ struct archdr * pkthdr, int length);
+ int (*build_header) (struct sk_buff * skb, unsigned short ethproto,
+ uint8_t daddr);
+
+ /* these functions return '1' if the skb can now be freed */
+ int (*prepare_tx) (struct net_device * dev, struct archdr * pkt, int length,
+ int bufnum);
+ int (*continue_tx) (struct net_device * dev, int bufnum);
+};
+extern struct ArcProto *arc_proto_map[256], *arc_proto_default, *arc_bcast_proto;
+extern struct ArcProto arc_proto_null;
-#define JIFFER(time) for (delayval=jiffies+time; time_before(jiffies,delayval);) ;
- /* a complete ARCnet packet */
-union ArcPacket
-{
- struct archdr hardheader; /* the hardware header */
- u_char raw[512]; /* raw packet info, incl ClientData */
+/*
+ * "Incoming" is information needed for each address that could be sending
+ * to us. Mostly for partially-received split packets.
+ */
+struct Incoming {
+ struct sk_buff *skb; /* packet data buffer */
+ uint16_t sequence; /* sequence number of assembly */
+ uint8_t lastpacket, /* number of last packet (from 1) */
+ numpackets; /* number of packets in split */
};
- /* the "client data" header - RFC1201 information
- * notice that this screws up if it's not an even number of bytes
- * <sigh>
- */
-struct ClientData
-{
- /* data that's NOT part of real packet - we MUST get rid of it before
- * actually sending!!
- */
- u_char saddr, /* Source address - needed for IPX */
- daddr; /* Destination address */
-
- /* data that IS part of real packet */
- u_char protocol_id, /* ARC_P_IP, ARC_P_ARP, etc */
- split_flag; /* for use with split packets */
- u_short sequence; /* sequence number */
+/* only needed for RFC1201 */
+struct Outgoing {
+ struct ArcProto *proto; /* protocol driver that owns this:
+ * if NULL, no packet is pending.
+ */
+ struct sk_buff *skb; /* buffer from upper levels */
+ struct archdr *pkt; /* a pointer into the skb */
+ uint16_t length, /* bytes total */
+ dataleft, /* bytes left */
+ segnum, /* segment being sent */
+ numsegs; /* number of segments */
};
-#define EXTRA_CLIENTDATA (sizeof(struct ClientData)-4)
- /* the "client data" header - RFC1051 information
- * this also screws up if it's not an even number of bytes
- * <sigh again>
- */
-struct S_ClientData
-{
- /* data that's NOT part of real packet - we MUST get rid of it before
- * actually sending!!
- */
- u_char saddr, /* Source address - needed for IPX */
- daddr, /* Destination address */
- junk; /* padding to make an even length */
-
- /* data that IS part of real packet */
- u_char protocol_id; /* ARC_P_IP, ARC_P_ARP, etc */
-};
-#define S_EXTRA_CLIENTDATA (sizeof(struct S_ClientData)-1)
+struct arcnet_local {
+ struct net_device_stats stats;
+ uint8_t config, /* current value of CONFIG register */
+ timeout, /* Extended timeout for COM20020 */
+ backplane, /* Backplane flag for COM20020 */
+ clock, /* COM20020 clock speed flag */
+ setup, /* Contents of setup register */
+ intmask; /* current value of INTMASK register */
+ uint8_t default_proto[256]; /* default encap to use for each host */
+ int cur_tx, /* buffer used by current transmit, or -1 */
+ next_tx, /* buffer where a packet is ready to send */
+ cur_rx; /* current receive buffer */
+ int lastload_dest, /* can last loaded packet be acked? */
+ lasttrans_dest; /* can last TX'd packet be acked? */
+ int basename_len; /* name length without suffix ('arc0e' -> 4) */
+
+ /*
+ * Buffer management: an ARCnet card has 4 x 512-byte buffers, each of
+ * which can be used for either sending or receiving. The new dynamic
+ * buffer management routines use a simple circular queue of available
+ * buffers, and take them as they're needed. This way, we simplify
+ * situations in which we (for example) want to pre-load a transmit
+ * buffer, or start receiving while we copy a received packet to
+ * memory.
+ *
+ * The rules: only the interrupt handler is allowed to _add_ buffers to
+ * the queue; thus, this doesn't require a lock. Both the interrupt
+ * handler and the transmit function will want to _remove_ buffers, so
+ * we need to handle the situation where they try to do it at the same
+ * time.
+ *
+ * If next_buf == first_free_buf, the queue is empty. Since there are
+ * only four possible buffers, the queue should never be full.
+ */
+ atomic_t buf_lock;
+ int buf_queue[5];
+ int next_buf, first_free_buf;
+
+ /* network "reconfiguration" handling */
+ time_t first_recon, /* time of "first" RECON message to count */
+ last_recon; /* time of most recent RECON */
+ int num_recons; /* number of RECONs between first and last. */
+ bool network_down; /* do we think the network is down? */
+
+ struct {
+ uint16_t sequence; /* sequence number (incs with each packet) */
+ uint16_t aborted_seq;
+
+ struct Incoming incoming[256]; /* one from each address */
+ } rfc1201;
+
+ /* really only used by rfc1201, but we'll pretend it's not */
+ struct Outgoing outgoing; /* packet currently being sent */
+
+ /* hardware-specific functions */
+ struct {
+ void (*command) (struct net_device * dev, int cmd);
+ int (*status) (struct net_device * dev);
+ void (*intmask) (struct net_device * dev, int mask);
+ bool (*reset) (struct net_device * dev, bool really_reset);
+ void (*open_close) (struct net_device * dev, bool open);
+ void (*open_close_ll) (struct net_device * dev, bool open);
+
+ void (*copy_to_card) (struct net_device * dev, int bufnum, int offset,
+ void *buf, int count);
+ void (*copy_from_card) (struct net_device * dev, int bufnum, int offset,
+ void *buf, int count);
+ } hw;
-/* "Incoming" is information needed for each address that could be sending
- * to us. Mostly for partially-received split packets.
- */
-struct Incoming
-{
- struct sk_buff *skb; /* packet data buffer */
- unsigned char lastpacket, /* number of last packet (from 1) */
- numpackets; /* number of packets in split */
- u_short sequence; /* sequence number of assembly */
+ void *mem_start; /* pointer to ioremap'ed MMIO */
};
-struct Outgoing
-{
- struct sk_buff *skb; /* buffer from upper levels */
- struct ClientData *hdr; /* clientdata of last packet */
- u_char *data; /* pointer to data in packet */
- short length, /* bytes total */
- dataleft, /* bytes left */
- segnum, /* segment being sent */
- numsegs, /* number of segments */
- seglen; /* length of segment */
-};
+#define ARCRESET(x) (lp->hw.reset(dev, (x)))
+#define ACOMMAND(x) (lp->hw.command(dev, (x)))
+#define ASTATUS() (lp->hw.status(dev))
+#define AINTMASK(x) (lp->hw.intmask(dev, (x)))
+#define ARCOPEN(x) (lp->hw.open_close(dev, (x)))
-struct arcnet_local {
- struct net_device_stats stats;
- u_short sequence; /* sequence number (incs with each packet) */
- u_short aborted_seq;
- u_char stationid, /* our 8-bit station address */
- recbuf, /* receive buffer # (0 or 1) */
- txbuf, /* transmit buffer # (2 or 3) */
- txready, /* buffer where a packet is ready to send */
- config, /* current value of CONFIG register */
- timeout, /* Extended timeout for COM20020 */
- backplane, /* Backplane flag for COM20020 */
- setup, /* Contents of setup register */
- intmask; /* current value of INTMASK register */
- short intx, /* in TX routine? */
- in_txhandler, /* in TX_IRQ handler? */
- sending, /* transmit in progress? */
- lastload_dest, /* can last loaded packet be acked? */
- lasttrans_dest; /* can last TX'd packet be acked? */
-
-#if defined(DETECT_RECONFIGS) && defined(RECON_THRESHOLD)
- time_t first_recon, /* time of "first" RECON message to count */
- last_recon; /* time of most recent RECON */
- int num_recons, /* number of RECONs between first and last. */
- network_down; /* do we think the network is down? */
-#endif
-
- struct timer_list timer; /* the timer interrupt struct */
- struct Incoming incoming[256]; /* one from each address */
- struct Outgoing outgoing; /* packet currently being sent */
-
- int card_type;
- char *card_type_str;
-
- void (*inthandler) (struct net_device *dev);
- int (*arcnet_reset) (struct net_device *dev, int reset_delay);
- void (*asetmask) (struct net_device *dev, u_char mask);
- void (*acommand) (struct net_device *dev, u_char command);
- u_char (*astatus) (struct net_device *dev);
- void (*en_dis_able_TX) (struct net_device *dev, int enable);
- void (*prepare_tx)(struct net_device *dev,u_char *hdr,int hdrlen,
- char *data,int length,int daddr,int exceptA, int offset);
- void (*openclose_device)(int open);
-
- struct net_device *adev; /* RFC1201 protocol device */
-
- /* These are last to ensure that the chipset drivers don't depend on the
- * CONFIG_ARCNET_ETH and CONFIG_ARCNET_1051 options.
- */
-
-#ifdef CONFIG_ARCNET_ETH
- struct net_device *edev; /* Ethernet-Encap device */
-#endif
-
-#ifdef CONFIG_ARCNET_1051
- struct net_device *sdev; /* RFC1051 protocol device */
-#endif
-};
-/* Functions exported by arcnet.c
- */
#if ARCNET_DEBUG_MAX & D_SKB
-extern void arcnet_dump_skb(struct net_device *dev,struct sk_buff *skb,
- char *desc);
+void arcnet_dump_skb(struct net_device *dev, struct sk_buff *skb, char *desc);
#else
#define arcnet_dump_skb(dev,skb,desc) ;
#endif
#if (ARCNET_DEBUG_MAX & D_RX) || (ARCNET_DEBUG_MAX & D_TX)
-extern void arcnet_dump_packet(struct net_device *dev,u_char *buffer,int ext,
- char *desc);
+void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc);
#else
-#define arcnet_dump_packet(dev,buffer,ext,desc) ;
+#define arcnet_dump_packet(dev, bufnum, desc) ;
#endif
-extern void arcnet_tx_done(struct net_device *dev, struct arcnet_local *lp);
-extern void arcnet_makename(char *device);
-extern void arcnet_interrupt(int irq,void *dev_id,struct pt_regs *regs);
-extern void arcnet_setup(struct net_device *dev);
-extern int arcnet_go_tx(struct net_device *dev,int enable_irq);
-extern void arcnetA_continue_tx(struct net_device *dev);
-extern void arcnet_rx(struct arcnet_local *lp, u_char *arcsoft, short length, int saddr, int daddr);
-extern void arcnet_use_count(int open);
+void arcnet_unregister_proto(struct ArcProto *proto);
+void arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+void arcdev_setup(struct net_device *dev);
+void arcnet_rx(struct net_device *dev, int bufnum);
+
+void arcnet_init(void);
+
+void arcnet_rfc1201_init(void);
+void arcnet_rfc1051_init(void);
+void arcnet_raw_init(void);
+
+int com90xx_probe(struct net_device *dev);
+void com20020pci_probe_all(void);
+#endif /* __KERNEL__ */
-#endif /* __KERNEL__ */
-#endif /* _LINUX_ARCDEVICE_H */
+#endif /* _LINUX_ARCDEVICE_H */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)