~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/arcdevice.h

Version: ~ [ linux-5.2-rc1 ] ~ [ linux-5.1.2 ] ~ [ linux-5.0.16 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.43 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.119 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.176 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.179 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.139 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.67 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.39.4 ] ~ [ linux-2.6.38.8 ] ~ [ linux-2.6.37.6 ] ~ [ linux-2.6.36.4 ] ~ [ linux-2.6.35.14 ] ~ [ linux-2.6.34.15 ] ~ [ linux-2.6.33.20 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * INET         An implementation of the TCP/IP protocol suite for the LINUX
  3  *              operating system.  NET  is implemented using the  BSD Socket
  4  *              interface as the means of communication with the user level.
  5  *
  6  *              Definitions used by the ARCnet driver.
  7  *
  8  * Authors:     Avery Pennarun and David Woodhouse
  9  *
 10  *              This program is free software; you can redistribute it and/or
 11  *              modify it under the terms of the GNU General Public License
 12  *              as published by the Free Software Foundation; either version
 13  *              2 of the License, or (at your option) any later version.
 14  *
 15  */
 16 #ifndef _LINUX_ARCDEVICE_H
 17 #define _LINUX_ARCDEVICE_H
 18 
 19 #include <asm/timex.h>
 20 #include <linux/if_arcnet.h>
 21 
 22 #ifdef __KERNEL__
 23 
 24 #ifndef bool
 25 #define bool int
 26 #endif
 27 
 28 /*
 29  * RECON_THRESHOLD is the maximum number of RECON messages to receive
 30  * within one minute before printing a "cabling problem" warning. The
 31  * default value should be fine.
 32  *
 33  * After that, a "cabling restored" message will be printed on the next IRQ
 34  * if no RECON messages have been received for 10 seconds.
 35  *
 36  * Do not define RECON_THRESHOLD at all if you want to disable this feature.
 37  */
 38 #define RECON_THRESHOLD 30
 39 
 40 
 41 /*
 42  * Define this to the minimum "timeout" value.  If a transmit takes longer
 43  * than TX_TIMEOUT jiffies, Linux will abort the TX and retry.  On a large
 44  * network, or one with heavy network traffic, this timeout may need to be
 45  * increased.  The larger it is, though, the longer it will be between
 46  * necessary transmits - don't set this too high.
 47  */
 48 #define TX_TIMEOUT (HZ * 200 / 1000)
 49 
 50 
 51 /* Display warnings about the driver being an ALPHA version. */
 52 #undef ALPHA_WARNING
 53 
 54 
 55 /*
 56  * Debugging bitflags: each option can be enabled individually.
 57  * 
 58  * Note: only debug flags included in the ARCNET_DEBUG_MAX define will
 59  *   actually be available.  GCC will (at least, GCC 2.7.0 will) notice
 60  *   lines using a BUGLVL not in ARCNET_DEBUG_MAX and automatically optimize
 61  *   them out.
 62  */
 63 #define D_NORMAL        1       /* important operational info             */
 64 #define D_EXTRA         2       /* useful, but non-vital information      */
 65 #define D_INIT          4       /* show init/probe messages               */
 66 #define D_INIT_REASONS  8       /* show reasons for discarding probes     */
 67 #define D_RECON         32      /* print a message whenever token is lost */
 68 #define D_PROTO         64      /* debug auto-protocol support            */
 69 /* debug levels below give LOTS of output during normal operation! */
 70 #define D_DURING        128     /* trace operations (including irq's)     */
 71 #define D_TX            256     /* show tx packets                        */
 72 #define D_RX            512     /* show rx packets                        */
 73 #define D_SKB           1024    /* show skb's                             */
 74 #define D_SKB_SIZE      2048    /* show skb sizes                         */
 75 #define D_TIMING        4096    /* show time needed to copy buffers to card */
 76 #define D_DEBUG         8192    /* Very detailed debug line for line */
 77 
 78 #ifndef ARCNET_DEBUG_MAX
 79 #define ARCNET_DEBUG_MAX (127)  /* change to ~0 if you want detailed debugging */
 80 #endif
 81 
 82 #ifndef ARCNET_DEBUG
 83 #define ARCNET_DEBUG (D_NORMAL|D_EXTRA)
 84 #endif
 85 extern int arcnet_debug;
 86 
 87 /* macros to simplify debug checking */
 88 #define BUGLVL(x) if ((ARCNET_DEBUG_MAX)&arcnet_debug&(x))
 89 #define BUGMSG2(x,msg,args...) do { BUGLVL(x) printk(msg, ## args); } while (0)
 90 #define BUGMSG(x,msg,args...) \
 91         BUGMSG2(x, "%s%6s: " msg, \
 92             x==D_NORMAL ? KERN_WARNING \
 93                         : x < D_DURING ? KERN_INFO : KERN_DEBUG, \
 94             dev->name , ## args)
 95 
 96 /* see how long a function call takes to run, expressed in CPU cycles */
 97 #define TIME(name, bytes, call) BUGLVL(D_TIMING) { \
 98             unsigned long _x, _y; \
 99             _x = get_cycles(); \
100             call; \
101             _y = get_cycles(); \
102             BUGMSG(D_TIMING, \
103                "%s: %d bytes in %lu cycles == " \
104                "%lu Kbytes/100Mcycle\n",\
105                    name, bytes, _y - _x, \
106                    100000000 / 1024 * bytes / (_y - _x + 1));\
107         } \
108         else { \
109                     call;\
110         }
111 
112 
113 /*
114  * Time needed to reset the card - in ms (milliseconds).  This works on my
115  * SMC PC100.  I can't find a reference that tells me just how long I
116  * should wait.
117  */
118 #define RESETtime (300)
119 
120 /*
121  * These are the max/min lengths of packet payload, not including the
122  * arc_hardware header, but definitely including the soft header.
123  *
124  * Note: packet sizes 254, 255, 256 are impossible because of the way
125  * ARCnet registers work  That's why RFC1201 defines "exception" packets.
126  * In non-RFC1201 protocols, we have to just tack some extra bytes on the
127  * end.
128  */
129 #define MTU     253             /* normal packet max size */
130 #define MinTU   257             /* extended packet min size */
131 #define XMTU    508             /* extended packet max size */
132 
133 /* status/interrupt mask bit fields */
134 #define TXFREEflag      0x01    /* transmitter available */
135 #define TXACKflag       0x02    /* transmitted msg. ackd */
136 #define RECONflag       0x04    /* network reconfigured */
137 #define TESTflag        0x08    /* test flag */
138 #define EXCNAKflag      0x08    /* excesive nak flag */
139 #define RESETflag       0x10    /* power-on-reset */
140 #define RES1flag        0x20    /* reserved - usually set by jumper */
141 #define RES2flag        0x40    /* reserved - usually set by jumper */
142 #define NORXflag        0x80    /* receiver inhibited */
143 
144 /* Flags used for IO-mapped memory operations */
145 #define AUTOINCflag     0x40    /* Increase location with each access */
146 #define IOMAPflag       0x02    /* (for 90xx) Use IO mapped memory, not mmap */
147 #define ENABLE16flag    0x80    /* (for 90xx) Enable 16-bit mode */
148 
149 /* in the command register, the following bits have these meanings:
150  *                0-2     command
151  *                3-4     page number (for enable rcv/xmt command)
152  *                 7      receive broadcasts
153  */
154 #define NOTXcmd         0x01    /* disable transmitter */
155 #define NORXcmd         0x02    /* disable receiver */
156 #define TXcmd           0x03    /* enable transmitter */
157 #define RXcmd           0x04    /* enable receiver */
158 #define CONFIGcmd       0x05    /* define configuration */
159 #define CFLAGScmd       0x06    /* clear flags */
160 #define TESTcmd         0x07    /* load test flags */
161 
162 /* flags for "clear flags" command */
163 #define RESETclear      0x08    /* power-on-reset */
164 #define CONFIGclear     0x10    /* system reconfigured */
165 
166 #define EXCNAKclear     0x0E    /* Clear and acknowledge the excive nak bit */
167 
168 /* flags for "load test flags" command */
169 #define TESTload        0x08    /* test flag (diagnostic) */
170 
171 /* byte deposited into first address of buffers on reset */
172 #define TESTvalue       0321    /* that's octal for 0xD1 :) */
173 
174 /* for "enable receiver" command */
175 #define RXbcasts        0x80    /* receive broadcasts */
176 
177 /* flags for "define configuration" command */
178 #define NORMALconf      0x00    /* 1-249 byte packets */
179 #define EXTconf         0x08    /* 250-504 byte packets */
180 
181 /* card feature flags, set during auto-detection.
182  * (currently only used by com20020pci)
183  */
184 #define ARC_IS_5MBIT    1   /* card default speed is 5MBit */
185 #define ARC_CAN_10MBIT  2   /* card uses COM20022, supporting 10MBit,
186                                  but default is 2.5MBit. */
187 
188 
189 /* information needed to define an encapsulation driver */
190 struct ArcProto {
191         char suffix;            /* a for RFC1201, e for ether-encap, etc. */
192         int mtu;                /* largest possible packet */
193         int is_ip;              /* This is a ip plugin - not a raw thing */
194 
195         void (*rx) (struct net_device * dev, int bufnum,
196                     struct archdr * pkthdr, int length);
197         int (*build_header) (struct sk_buff * skb, struct net_device *dev,
198                              unsigned short ethproto, uint8_t daddr);
199 
200         /* these functions return '1' if the skb can now be freed */
201         int (*prepare_tx) (struct net_device * dev, struct archdr * pkt, int length,
202                            int bufnum);
203         int (*continue_tx) (struct net_device * dev, int bufnum);
204         int (*ack_tx) (struct net_device * dev, int acked);
205 };
206 
207 extern struct ArcProto *arc_proto_map[256], *arc_proto_default,
208         *arc_bcast_proto, *arc_raw_proto;
209 
210 
211 /*
212  * "Incoming" is information needed for each address that could be sending
213  * to us.  Mostly for partially-received split packets.
214  */
215 struct Incoming {
216         struct sk_buff *skb;    /* packet data buffer             */
217         __be16 sequence;        /* sequence number of assembly    */
218         uint8_t lastpacket,     /* number of last packet (from 1) */
219                 numpackets;     /* number of packets in split     */
220 };
221 
222 
223 /* only needed for RFC1201 */
224 struct Outgoing {
225         struct ArcProto *proto; /* protocol driver that owns this:
226                                  *   if NULL, no packet is pending.
227                                  */
228         struct sk_buff *skb;    /* buffer from upper levels */
229         struct archdr *pkt;     /* a pointer into the skb */
230         uint16_t length,        /* bytes total */
231                 dataleft,       /* bytes left */
232                 segnum,         /* segment being sent */
233                 numsegs;        /* number of segments */
234 };
235 
236 
237 struct arcnet_local {
238         uint8_t config,         /* current value of CONFIG register */
239                 timeout,        /* Extended timeout for COM20020 */
240                 backplane,      /* Backplane flag for COM20020 */
241                 clockp,         /* COM20020 clock divider */
242                 clockm,         /* COM20020 clock multiplier flag */
243                 setup,          /* Contents of setup1 register */
244                 setup2,         /* Contents of setup2 register */
245                 intmask;        /* current value of INTMASK register */
246         uint8_t default_proto[256];     /* default encap to use for each host */
247         int     cur_tx,         /* buffer used by current transmit, or -1 */
248                 next_tx,        /* buffer where a packet is ready to send */
249                 cur_rx;         /* current receive buffer */
250         int     lastload_dest,  /* can last loaded packet be acked? */
251                 lasttrans_dest; /* can last TX'd packet be acked? */
252         int     timed_out;      /* need to process TX timeout and drop packet */
253         unsigned long last_timeout;     /* time of last reported timeout */
254         char *card_name;        /* card ident string */
255         int card_flags;         /* special card features */
256 
257 
258         /* On preemtive and SMB a lock is needed */
259         spinlock_t lock;
260 
261         /*
262          * Buffer management: an ARCnet card has 4 x 512-byte buffers, each of
263          * which can be used for either sending or receiving.  The new dynamic
264          * buffer management routines use a simple circular queue of available
265          * buffers, and take them as they're needed.  This way, we simplify
266          * situations in which we (for example) want to pre-load a transmit
267          * buffer, or start receiving while we copy a received packet to
268          * memory.
269          * 
270          * The rules: only the interrupt handler is allowed to _add_ buffers to
271          * the queue; thus, this doesn't require a lock.  Both the interrupt
272          * handler and the transmit function will want to _remove_ buffers, so
273          * we need to handle the situation where they try to do it at the same
274          * time.
275          * 
276          * If next_buf == first_free_buf, the queue is empty.  Since there are
277          * only four possible buffers, the queue should never be full.
278          */
279         atomic_t buf_lock;
280         int buf_queue[5];
281         int next_buf, first_free_buf;
282 
283         /* network "reconfiguration" handling */
284         unsigned long first_recon; /* time of "first" RECON message to count */
285         unsigned long last_recon;  /* time of most recent RECON */
286         int num_recons;         /* number of RECONs between first and last. */
287         bool network_down;      /* do we think the network is down? */
288 
289         bool excnak_pending;    /* We just got an excesive nak interrupt */
290 
291         struct {
292                 uint16_t sequence;      /* sequence number (incs with each packet) */
293                 __be16 aborted_seq;
294 
295                 struct Incoming incoming[256];  /* one from each address */
296         } rfc1201;
297 
298         /* really only used by rfc1201, but we'll pretend it's not */
299         struct Outgoing outgoing;       /* packet currently being sent */
300 
301         /* hardware-specific functions */
302         struct {
303                 struct module *owner;
304                 void (*command) (struct net_device * dev, int cmd);
305                 int (*status) (struct net_device * dev);
306                 void (*intmask) (struct net_device * dev, int mask);
307                 bool (*reset) (struct net_device * dev, bool really_reset);
308                 void (*open) (struct net_device * dev);
309                 void (*close) (struct net_device * dev);
310 
311                 void (*copy_to_card) (struct net_device * dev, int bufnum, int offset,
312                                       void *buf, int count);
313                 void (*copy_from_card) (struct net_device * dev, int bufnum, int offset,
314                                         void *buf, int count);
315         } hw;
316 
317         void __iomem *mem_start;        /* pointer to ioremap'ed MMIO */
318 };
319 
320 
321 #define ARCRESET(x)  (lp->hw.reset(dev, (x)))
322 #define ACOMMAND(x)  (lp->hw.command(dev, (x)))
323 #define ASTATUS()    (lp->hw.status(dev))
324 #define AINTMASK(x)  (lp->hw.intmask(dev, (x)))
325 
326 
327 
328 #if ARCNET_DEBUG_MAX & D_SKB
329 void arcnet_dump_skb(struct net_device *dev, struct sk_buff *skb, char *desc);
330 #else
331 #define arcnet_dump_skb(dev,skb,desc) ;
332 #endif
333 
334 void arcnet_unregister_proto(struct ArcProto *proto);
335 irqreturn_t arcnet_interrupt(int irq, void *dev_id);
336 struct net_device *alloc_arcdev(const char *name);
337 
338 int arcnet_open(struct net_device *dev);
339 int arcnet_close(struct net_device *dev);
340 netdev_tx_t arcnet_send_packet(struct sk_buff *skb,
341                                      struct net_device *dev);
342 void arcnet_timeout(struct net_device *dev);
343 
344 #endif                          /* __KERNEL__ */
345 #endif                          /* _LINUX_ARCDEVICE_H */
346 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp