1 /*****************************************************************************/
4 * hdlcdrv.c -- HDLC packet radio network driver.
6 * Copyright (C) 1996-1998 Thomas Sailer (sailer@ife.ee.ethz.ch)
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 * Please note that the GPL allows you to use the driver, NOT the radio.
23 * In order to use the radio, you need a license from the communications
24 * authority of your country.
26 * The driver was derived from Donald Beckers skeleton.c
27 * Written 1993-94 by Donald Becker.
30 * 0.1 21.09.96 Started
31 * 18.10.96 Changed to new user space access routines
32 * (copy_{to,from}_user)
33 * 0.2 21.11.96 various small changes
34 * 0.3 03.03.97 fixed (hopefully) IP not working with ax.25 as a module
35 * 0.4 16.04.97 init code/data tagged
36 * 0.5 30.07.97 made HDLC buffers bigger (solves a problem with the
38 * 0.6 05.04.98 add spinlocks
41 /*****************************************************************************/
43 #include <linux/config.h>
44 #include <linux/version.h>
45 #include <linux/module.h>
46 #include <linux/types.h>
47 #include <linux/net.h>
50 #include <linux/malloc.h>
51 #include <linux/errno.h>
52 #include <linux/init.h>
53 #include <asm/bitops.h>
54 #include <asm/uaccess.h>
56 #include <linux/netdevice.h>
57 #include <linux/if_arp.h>
58 #include <linux/etherdevice.h>
59 #include <linux/skbuff.h>
60 #include <linux/hdlcdrv.h>
61 /* prototypes for ax25_encapsulate and ax25_rebuild_header */
64 /* make genksyms happy */
66 #include <linux/udp.h>
67 #include <linux/tcp.h>
69 /* --------------------------------------------------------------------- */
72 * The name of the card. Is used for messages and in the requests for
73 * io regions, irqs and dma channels
76 static char ax25_bcast
[AX25_ADDR_LEN
] =
77 {'Q' << 1, 'S' << 1, 'T' << 1, ' ' << 1, ' ' << 1, ' ' << 1, '0' << 1};
78 static char ax25_nocall
[AX25_ADDR_LEN
] =
79 {'L' << 1, 'I' << 1, 'N' << 1, 'U' << 1, 'X' << 1, ' ' << 1, '1' << 1};
81 /* --------------------------------------------------------------------- */
85 /* --------------------------------------------------------------------- */
87 #define PARAM_TXDELAY 1
88 #define PARAM_PERSIST 2
89 #define PARAM_SLOTTIME 3
90 #define PARAM_TXTAIL 4
91 #define PARAM_FULLDUP 5
92 #define PARAM_HARDWARE 6
93 #define PARAM_RETURN 255
95 /* --------------------------------------------------------------------- */
97 #define min(a, b) (((a) < (b)) ? (a) : (b))
98 #define max(a, b) (((a) > (b)) ? (a) : (b))
100 /* --------------------------------------------------------------------- */
102 * the CRC routines are stolen from WAMPES
106 static const unsigned short crc_ccitt_table
[] = {
107 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
108 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
109 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
110 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
111 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
112 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
113 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
114 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
115 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
116 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
117 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
118 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
119 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
120 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
121 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
122 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
123 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
124 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
125 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
126 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
127 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
128 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
129 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
130 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
131 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
132 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
133 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
134 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
135 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
136 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
137 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
138 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
141 /*---------------------------------------------------------------------------*/
143 static inline void append_crc_ccitt(unsigned char *buffer
, int len
)
145 unsigned int crc
= 0xffff;
148 crc
= (crc
>> 8) ^ crc_ccitt_table
[(crc
^ *buffer
++) & 0xff];
151 *buffer
++ = crc
>> 8;
154 /*---------------------------------------------------------------------------*/
156 static inline int check_crc_ccitt(const unsigned char *buf
, int cnt
)
158 unsigned int crc
= 0xffff;
160 for (; cnt
> 0; cnt
--)
161 crc
= (crc
>> 8) ^ crc_ccitt_table
[(crc
^ *buf
++) & 0xff];
162 return (crc
& 0xffff) == 0xf0b8;
165 /*---------------------------------------------------------------------------*/
168 static int calc_crc_ccitt(const unsigned char *buf
, int cnt
)
170 unsigned int crc
= 0xffff;
172 for (; cnt
> 0; cnt
--)
173 crc
= (crc
>> 8) ^ crc_ccitt_table
[(crc
^ *buf
++) & 0xff];
175 return (crc
& 0xffff);
179 /* ---------------------------------------------------------------------- */
181 #define tenms_to_2flags(s,tenms) ((tenms * s->par.bitrate) / 100 / 16)
183 /* ---------------------------------------------------------------------- */
188 static int hdlc_rx_add_bytes(struct hdlcdrv_state
*s
, unsigned int bits
,
193 while (s
->hdlcrx
.rx_state
&& num
>= 8) {
194 if (s
->hdlcrx
.len
>= sizeof(s
->hdlcrx
.buffer
)) {
195 s
->hdlcrx
.rx_state
= 0;
198 *s
->hdlcrx
.bp
++ = bits
>> (32-num
);
206 static void hdlc_rx_flag(struct device
*dev
, struct hdlcdrv_state
*s
)
212 if (s
->hdlcrx
.len
< 4)
214 if (!check_crc_ccitt(s
->hdlcrx
.buffer
, s
->hdlcrx
.len
))
216 pkt_len
= s
->hdlcrx
.len
- 2 + 1; /* KISS kludge */
217 if (!(skb
= dev_alloc_skb(pkt_len
))) {
218 printk("%s: memory squeeze, dropping packet\n",
220 s
->stats
.rx_dropped
++;
224 cp
= skb_put(skb
, pkt_len
);
225 *cp
++ = 0; /* KISS kludge */
226 memcpy(cp
, s
->hdlcrx
.buffer
, pkt_len
- 1);
227 skb
->protocol
= htons(ETH_P_AX25
);
228 skb
->mac
.raw
= skb
->data
;
230 s
->stats
.rx_packets
++;
233 void hdlcdrv_receiver(struct device
*dev
, struct hdlcdrv_state
*s
)
236 unsigned int mask1
, mask2
, mask3
, mask4
, mask5
, mask6
, word
;
238 if (!s
|| s
->magic
!= HDLCDRV_MAGIC
)
240 if (test_and_set_bit(0, &s
->hdlcrx
.in_hdlc_rx
))
243 while (!hdlcdrv_hbuf_empty(&s
->hdlcrx
.hbuf
)) {
244 word
= hdlcdrv_hbuf_get(&s
->hdlcrx
.hbuf
);
247 hdlcdrv_add_bitbuffer_word(&s
->bitbuf_hdlc
, word
);
248 #endif /* HDLCDRV_DEBUG */
249 s
->hdlcrx
.bitstream
>>= 16;
250 s
->hdlcrx
.bitstream
|= word
<< 16;
251 s
->hdlcrx
.bitbuf
>>= 16;
252 s
->hdlcrx
.bitbuf
|= word
<< 16;
253 s
->hdlcrx
.numbits
+= 16;
254 for(i
= 15, mask1
= 0x1fc00, mask2
= 0x1fe00, mask3
= 0x0fc00,
255 mask4
= 0x1f800, mask5
= 0xf800, mask6
= 0xffff;
257 i
--, mask1
<<= 1, mask2
<<= 1, mask3
<<= 1, mask4
<<= 1,
258 mask5
<<= 1, mask6
= (mask6
<< 1) | 1) {
259 if ((s
->hdlcrx
.bitstream
& mask1
) == mask1
)
260 s
->hdlcrx
.rx_state
= 0; /* abort received */
261 else if ((s
->hdlcrx
.bitstream
& mask2
) == mask3
) {
263 if (s
->hdlcrx
.rx_state
) {
264 hdlc_rx_add_bytes(s
, s
->hdlcrx
.bitbuf
268 hdlc_rx_flag(dev
, s
);
271 s
->hdlcrx
.bp
= s
->hdlcrx
.buffer
;
272 s
->hdlcrx
.rx_state
= 1;
273 s
->hdlcrx
.numbits
= i
;
274 } else if ((s
->hdlcrx
.bitstream
& mask4
) == mask5
) {
277 s
->hdlcrx
.bitbuf
= (s
->hdlcrx
.bitbuf
& (~mask6
)) |
278 ((s
->hdlcrx
.bitbuf
& mask6
) << 1);
281 s
->hdlcrx
.numbits
-= hdlc_rx_add_bytes(s
, s
->hdlcrx
.bitbuf
,
284 clear_bit(0, &s
->hdlcrx
.in_hdlc_rx
);
287 /* ---------------------------------------------------------------------- */
289 static void inline do_kiss_params(struct hdlcdrv_state
*s
,
290 unsigned char *data
, unsigned long len
)
294 #define PKP(a,b) printk(KERN_INFO "%s: channel params: " a "\n", s->ifname, b)
295 #else /* KISS_VERBOSE */
297 #endif /* KISS_VERBOSE */
303 s
->ch_params
.tx_delay
= data
[1];
304 PKP("TX delay = %ums", 10 * s
->ch_params
.tx_delay
);
307 s
->ch_params
.ppersist
= data
[1];
308 PKP("p persistence = %u", s
->ch_params
.ppersist
);
311 s
->ch_params
.slottime
= data
[1];
312 PKP("slot time = %ums", s
->ch_params
.slottime
);
315 s
->ch_params
.tx_tail
= data
[1];
316 PKP("TX tail = %ums", s
->ch_params
.tx_tail
);
319 s
->ch_params
.fulldup
= !!data
[1];
320 PKP("%s duplex", s
->ch_params
.fulldup
? "full" : "half");
328 /* ---------------------------------------------------------------------- */
330 void hdlcdrv_transmitter(struct device
*dev
, struct hdlcdrv_state
*s
)
332 unsigned int mask1
, mask2
, mask3
;
337 if (!s
|| s
->magic
!= HDLCDRV_MAGIC
)
339 if (test_and_set_bit(0, &s
->hdlctx
.in_hdlc_tx
))
342 if (s
->hdlctx
.numbits
>= 16) {
343 if (hdlcdrv_hbuf_full(&s
->hdlctx
.hbuf
)) {
344 clear_bit(0, &s
->hdlctx
.in_hdlc_tx
);
347 hdlcdrv_hbuf_put(&s
->hdlctx
.hbuf
, s
->hdlctx
.bitbuf
);
348 s
->hdlctx
.bitbuf
>>= 16;
349 s
->hdlctx
.numbits
-= 16;
351 switch (s
->hdlctx
.tx_state
) {
353 clear_bit(0, &s
->hdlctx
.in_hdlc_tx
);
357 if (s
->hdlctx
.numflags
) {
358 s
->hdlctx
.numflags
--;
360 0x7e7e << s
->hdlctx
.numbits
;
361 s
->hdlctx
.numbits
+= 16;
364 if (s
->hdlctx
.tx_state
== 1) {
365 clear_bit(0, &s
->hdlctx
.in_hdlc_tx
);
368 if (!(skb
= skb_dequeue(&s
->send_queue
))) {
369 int flgs
= tenms_to_2flags
370 (s
, s
->ch_params
.tx_tail
);
373 s
->hdlctx
.tx_state
= 1;
374 s
->hdlctx
.numflags
= flgs
;
377 if (skb
->data
[0] != 0) {
378 do_kiss_params(s
, skb
->data
, skb
->len
);
382 pkt_len
= skb
->len
-1; /* strip KISS byte */
383 if (pkt_len
>= HDLCDRV_MAXFLEN
|| pkt_len
< 2) {
384 s
->hdlctx
.tx_state
= 0;
385 s
->hdlctx
.numflags
= 1;
389 memcpy(s
->hdlctx
.buffer
, skb
->data
+1, pkt_len
);
391 s
->hdlctx
.bp
= s
->hdlctx
.buffer
;
392 append_crc_ccitt(s
->hdlctx
.buffer
, pkt_len
);
393 s
->hdlctx
.len
= pkt_len
+2; /* the appended CRC */
394 s
->hdlctx
.tx_state
= 2;
395 s
->hdlctx
.bitstream
= 0;
396 s
->stats
.tx_packets
++;
399 if (!s
->hdlctx
.len
) {
400 s
->hdlctx
.tx_state
= 0;
401 s
->hdlctx
.numflags
= 1;
405 s
->hdlctx
.bitbuf
|= *s
->hdlctx
.bp
<<
407 s
->hdlctx
.bitstream
>>= 8;
408 s
->hdlctx
.bitstream
|= (*s
->hdlctx
.bp
++) << 16;
411 mask3
= 0xffffffff >> (31-s
->hdlctx
.numbits
);
412 s
->hdlctx
.numbits
+= 8;
413 for(i
= 0; i
< 8; i
++, mask1
<<= 1, mask2
<<= 1,
414 mask3
= (mask3
<< 1) | 1) {
415 if ((s
->hdlctx
.bitstream
& mask1
) != mask1
)
417 s
->hdlctx
.bitstream
&= ~mask2
;
419 (s
->hdlctx
.bitbuf
& mask3
) |
423 mask3
= (mask3
<< 1) | 1;
430 /* ---------------------------------------------------------------------- */
432 static void start_tx(struct device
*dev
, struct hdlcdrv_state
*s
)
434 s
->hdlctx
.tx_state
= 0;
435 s
->hdlctx
.numflags
= tenms_to_2flags(s
, s
->ch_params
.tx_delay
);
436 s
->hdlctx
.bitbuf
= s
->hdlctx
.bitstream
= s
->hdlctx
.numbits
= 0;
437 hdlcdrv_transmitter(dev
, s
);
442 /* ---------------------------------------------------------------------- */
444 static unsigned short random_seed
;
446 static inline unsigned short random_num(void)
448 random_seed
= 28629 * random_seed
+ 157;
452 /* ---------------------------------------------------------------------- */
454 void hdlcdrv_arbitrate(struct device
*dev
, struct hdlcdrv_state
*s
)
456 if (!s
|| s
->magic
!= HDLCDRV_MAGIC
|| s
->hdlctx
.ptt
||
457 skb_queue_empty(&s
->send_queue
))
459 if (s
->ch_params
.fulldup
) {
464 s
->hdlctx
.slotcnt
= s
->ch_params
.slottime
;
467 if ((--s
->hdlctx
.slotcnt
) > 0)
469 s
->hdlctx
.slotcnt
= s
->ch_params
.slottime
;
470 if ((random_num() % 256) > s
->ch_params
.ppersist
)
475 /* --------------------------------------------------------------------- */
477 * ===================== network driver interface =========================
480 static inline int hdlcdrv_paranoia_check(struct device
*dev
,
483 if (!dev
|| !dev
->priv
||
484 ((struct hdlcdrv_state
*)dev
->priv
)->magic
!= HDLCDRV_MAGIC
) {
485 printk(KERN_ERR
"hdlcdrv: bad magic number for hdlcdrv_state "
486 "struct in routine %s\n", routine
);
492 /* --------------------------------------------------------------------- */
494 static int hdlcdrv_send_packet(struct sk_buff
*skb
, struct device
*dev
)
496 struct hdlcdrv_state
*sm
;
498 if (hdlcdrv_paranoia_check(dev
, "hdlcdrv_send_packet"))
500 sm
= (struct hdlcdrv_state
*)dev
->priv
;
501 skb_queue_tail(&sm
->send_queue
, skb
);
502 dev
->trans_start
= jiffies
;
506 /* --------------------------------------------------------------------- */
508 static int hdlcdrv_set_mac_address(struct device
*dev
, void *addr
)
510 struct sockaddr
*sa
= (struct sockaddr
*)addr
;
512 /* addr is an AX.25 shifted ASCII mac address */
513 memcpy(dev
->dev_addr
, sa
->sa_data
, dev
->addr_len
);
517 /* --------------------------------------------------------------------- */
519 #if LINUX_VERSION_CODE >= 0x20119
520 static struct net_device_stats
*hdlcdrv_get_stats(struct device
*dev
)
522 static struct enet_statistics
*hdlcdrv_get_stats(struct device
*dev
)
525 struct hdlcdrv_state
*sm
;
527 if (hdlcdrv_paranoia_check(dev
, "hdlcdrv_get_stats"))
529 sm
= (struct hdlcdrv_state
*)dev
->priv
;
531 * Get the current statistics. This may be called with the
532 * card open or closed.
537 /* --------------------------------------------------------------------- */
539 * Open/initialize the board. This is called (in the current kernel)
540 * sometime after booting when the 'ifconfig' program is run.
542 * This routine should set everything up anew at each open, even
543 * registers that "should" only need to be set once at boot, so that
544 * there is non-reboot way to recover if something goes wrong.
547 static int hdlcdrv_open(struct device
*dev
)
549 struct hdlcdrv_state
*s
;
552 if (hdlcdrv_paranoia_check(dev
, "hdlcdrv_open"))
554 s
= (struct hdlcdrv_state
*)dev
->priv
;
558 if (!s
->ops
|| !s
->ops
->open
)
563 * initialise some variables
565 s
->hdlcrx
.hbuf
.rd
= s
->hdlcrx
.hbuf
.wr
= 0;
566 s
->hdlcrx
.in_hdlc_rx
= 0;
567 s
->hdlcrx
.rx_state
= 0;
569 s
->hdlctx
.hbuf
.rd
= s
->hdlctx
.hbuf
.wr
= 0;
570 s
->hdlctx
.in_hdlc_tx
= 0;
571 s
->hdlctx
.tx_state
= 1;
572 s
->hdlctx
.numflags
= 0;
573 s
->hdlctx
.bitstream
= s
->hdlctx
.bitbuf
= s
->hdlctx
.numbits
= 0;
575 s
->hdlctx
.slotcnt
= s
->ch_params
.slottime
;
576 s
->hdlctx
.calibrate
= 0;
578 i
= s
->ops
->open(dev
);
590 /* --------------------------------------------------------------------- */
592 * The inverse routine to hdlcdrv_open().
595 static int hdlcdrv_close(struct device
*dev
)
597 struct hdlcdrv_state
*s
;
601 if (hdlcdrv_paranoia_check(dev
, "hdlcdrv_close"))
603 s
= (struct hdlcdrv_state
*)dev
->priv
;
610 if (s
->ops
&& s
->ops
->close
)
611 i
= s
->ops
->close(dev
);
612 /* Free any buffers left in the hardware transmit queue */
613 while ((skb
= skb_dequeue(&s
->send_queue
)))
618 /* --------------------------------------------------------------------- */
620 static int hdlcdrv_ioctl(struct device
*dev
, struct ifreq
*ifr
, int cmd
)
622 struct hdlcdrv_state
*s
;
623 struct hdlcdrv_ioctl bi
;
625 if (hdlcdrv_paranoia_check(dev
, "hdlcdrv_ioctl"))
627 s
= (struct hdlcdrv_state
*)dev
->priv
;
629 if (cmd
!= SIOCDEVPRIVATE
) {
630 if (s
->ops
&& s
->ops
->ioctl
)
631 return s
->ops
->ioctl(dev
, ifr
, &bi
, cmd
);
634 if (copy_from_user(&bi
, ifr
->ifr_data
, sizeof(bi
)))
639 if (s
->ops
&& s
->ops
->ioctl
)
640 return s
->ops
->ioctl(dev
, ifr
, &bi
, cmd
);
643 case HDLCDRVCTL_GETCHANNELPAR
:
644 bi
.data
.cp
.tx_delay
= s
->ch_params
.tx_delay
;
645 bi
.data
.cp
.tx_tail
= s
->ch_params
.tx_tail
;
646 bi
.data
.cp
.slottime
= s
->ch_params
.slottime
;
647 bi
.data
.cp
.ppersist
= s
->ch_params
.ppersist
;
648 bi
.data
.cp
.fulldup
= s
->ch_params
.fulldup
;
651 case HDLCDRVCTL_SETCHANNELPAR
:
654 s
->ch_params
.tx_delay
= bi
.data
.cp
.tx_delay
;
655 s
->ch_params
.tx_tail
= bi
.data
.cp
.tx_tail
;
656 s
->ch_params
.slottime
= bi
.data
.cp
.slottime
;
657 s
->ch_params
.ppersist
= bi
.data
.cp
.ppersist
;
658 s
->ch_params
.fulldup
= bi
.data
.cp
.fulldup
;
659 s
->hdlctx
.slotcnt
= 1;
662 case HDLCDRVCTL_GETMODEMPAR
:
663 bi
.data
.mp
.iobase
= dev
->base_addr
;
664 bi
.data
.mp
.irq
= dev
->irq
;
665 bi
.data
.mp
.dma
= dev
->dma
;
666 bi
.data
.mp
.dma2
= s
->ptt_out
.dma2
;
667 bi
.data
.mp
.seriobase
= s
->ptt_out
.seriobase
;
668 bi
.data
.mp
.pariobase
= s
->ptt_out
.pariobase
;
669 bi
.data
.mp
.midiiobase
= s
->ptt_out
.midiiobase
;
672 case HDLCDRVCTL_SETMODEMPAR
:
673 if ((!suser()) || dev
->start
)
675 dev
->base_addr
= bi
.data
.mp
.iobase
;
676 dev
->irq
= bi
.data
.mp
.irq
;
677 dev
->dma
= bi
.data
.mp
.dma
;
678 s
->ptt_out
.dma2
= bi
.data
.mp
.dma2
;
679 s
->ptt_out
.seriobase
= bi
.data
.mp
.seriobase
;
680 s
->ptt_out
.pariobase
= bi
.data
.mp
.pariobase
;
681 s
->ptt_out
.midiiobase
= bi
.data
.mp
.midiiobase
;
684 case HDLCDRVCTL_GETSTAT
:
685 bi
.data
.cs
.ptt
= hdlcdrv_ptt(s
);
686 bi
.data
.cs
.dcd
= s
->hdlcrx
.dcd
;
687 bi
.data
.cs
.ptt_keyed
= s
->ptt_keyed
;
688 bi
.data
.cs
.tx_packets
= s
->stats
.tx_packets
;
689 bi
.data
.cs
.tx_errors
= s
->stats
.tx_errors
;
690 bi
.data
.cs
.rx_packets
= s
->stats
.rx_packets
;
691 bi
.data
.cs
.rx_errors
= s
->stats
.rx_errors
;
694 case HDLCDRVCTL_OLDGETSTAT
:
695 bi
.data
.ocs
.ptt
= hdlcdrv_ptt(s
);
696 bi
.data
.ocs
.dcd
= s
->hdlcrx
.dcd
;
697 bi
.data
.ocs
.ptt_keyed
= s
->ptt_keyed
;
698 #if LINUX_VERSION_CODE < 0x20100
699 bi
.data
.ocs
.stats
= s
->stats
;
703 case HDLCDRVCTL_CALIBRATE
:
704 s
->hdlctx
.calibrate
= bi
.data
.calibrate
* s
->par
.bitrate
/ 16;
707 case HDLCDRVCTL_GETSAMPLES
:
708 #ifndef HDLCDRV_DEBUG
710 #else /* HDLCDRV_DEBUG */
711 if (s
->bitbuf_channel
.rd
== s
->bitbuf_channel
.wr
)
714 s
->bitbuf_channel
.buffer
[s
->bitbuf_channel
.rd
];
715 s
->bitbuf_channel
.rd
= (s
->bitbuf_channel
.rd
+1) %
716 sizeof(s
->bitbuf_channel
.buffer
);
718 #endif /* HDLCDRV_DEBUG */
720 case HDLCDRVCTL_GETBITS
:
721 #ifndef HDLCDRV_DEBUG
723 #else /* HDLCDRV_DEBUG */
724 if (s
->bitbuf_hdlc
.rd
== s
->bitbuf_hdlc
.wr
)
727 s
->bitbuf_hdlc
.buffer
[s
->bitbuf_hdlc
.rd
];
728 s
->bitbuf_hdlc
.rd
= (s
->bitbuf_hdlc
.rd
+1) %
729 sizeof(s
->bitbuf_hdlc
.buffer
);
731 #endif /* HDLCDRV_DEBUG */
733 case HDLCDRVCTL_DRIVERNAME
:
734 if (s
->ops
&& s
->ops
->drvname
) {
735 strncpy(bi
.data
.drivername
, s
->ops
->drvname
,
736 sizeof(bi
.data
.drivername
));
739 bi
.data
.drivername
[0] = '\0';
743 if (copy_to_user(ifr
->ifr_data
, &bi
, sizeof(bi
)))
749 /* --------------------------------------------------------------------- */
752 * Check for a network adaptor of this type, and return '0' if one exists.
753 * If dev->base_addr == 0, probe all likely locations.
754 * If dev->base_addr == 1, always return failure.
755 * If dev->base_addr == 2, allocate space for the device and return success
756 * (detachable devices only).
758 static int hdlcdrv_probe(struct device
*dev
)
760 const struct hdlcdrv_channel_params dflt_ch_params
= {
763 struct hdlcdrv_state
*s
;
768 * not a real probe! only initialize data structures
770 s
= (struct hdlcdrv_state
*)dev
->priv
;
772 * initialize the hdlcdrv_state struct
774 s
->ch_params
= dflt_ch_params
;
777 spin_lock_init(&s
->hdlcrx
.hbuf
.lock
);
778 s
->hdlcrx
.hbuf
.rd
= s
->hdlcrx
.hbuf
.wr
= 0;
779 s
->hdlcrx
.in_hdlc_rx
= 0;
780 s
->hdlcrx
.rx_state
= 0;
782 spin_lock_init(&s
->hdlctx
.hbuf
.lock
);
783 s
->hdlctx
.hbuf
.rd
= s
->hdlctx
.hbuf
.wr
= 0;
784 s
->hdlctx
.in_hdlc_tx
= 0;
785 s
->hdlctx
.tx_state
= 1;
786 s
->hdlctx
.numflags
= 0;
787 s
->hdlctx
.bitstream
= s
->hdlctx
.bitbuf
= s
->hdlctx
.numbits
= 0;
789 s
->hdlctx
.slotcnt
= s
->ch_params
.slottime
;
790 s
->hdlctx
.calibrate
= 0;
793 s
->bitbuf_channel
.rd
= s
->bitbuf_channel
.wr
= 0;
794 s
->bitbuf_channel
.shreg
= 0x80;
796 s
->bitbuf_hdlc
.rd
= s
->bitbuf_hdlc
.wr
= 0;
797 s
->bitbuf_hdlc
.shreg
= 0x80;
798 #endif /* HDLCDRV_DEBUG */
801 * initialize the device struct
803 dev
->open
= hdlcdrv_open
;
804 dev
->stop
= hdlcdrv_close
;
805 dev
->do_ioctl
= hdlcdrv_ioctl
;
806 dev
->hard_start_xmit
= hdlcdrv_send_packet
;
807 dev
->get_stats
= hdlcdrv_get_stats
;
809 /* Fill in the fields of the device structure */
811 dev_init_buffers(dev
);
813 skb_queue_head_init(&s
->send_queue
);
815 #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
816 dev
->hard_header
= ax25_encapsulate
;
817 dev
->rebuild_header
= ax25_rebuild_header
;
818 #else /* CONFIG_AX25 || CONFIG_AX25_MODULE */
819 dev
->hard_header
= NULL
;
820 dev
->rebuild_header
= NULL
;
821 #endif /* CONFIG_AX25 || CONFIG_AX25_MODULE */
822 dev
->set_mac_address
= hdlcdrv_set_mac_address
;
824 dev
->type
= ARPHRD_AX25
; /* AF_AX25 device */
825 dev
->hard_header_len
= AX25_MAX_HEADER_LEN
+ AX25_BPQ_HEADER_LEN
;
826 dev
->mtu
= AX25_DEF_PACLEN
; /* eth_mtu is the default */
827 dev
->addr_len
= AX25_ADDR_LEN
; /* sizeof an ax.25 address */
828 memcpy(dev
->broadcast
, ax25_bcast
, AX25_ADDR_LEN
);
829 memcpy(dev
->dev_addr
, ax25_nocall
, AX25_ADDR_LEN
);
831 /* New style flags */
837 /* --------------------------------------------------------------------- */
839 int hdlcdrv_register_hdlcdrv(struct device
*dev
, const struct hdlcdrv_ops
*ops
,
840 unsigned int privsize
, char *ifname
,
841 unsigned int baseaddr
, unsigned int irq
,
844 struct hdlcdrv_state
*s
;
848 if (privsize
< sizeof(struct hdlcdrv_state
))
849 privsize
= sizeof(struct hdlcdrv_state
);
850 memset(dev
, 0, sizeof(struct device
));
851 if (!(s
= dev
->priv
= kmalloc(privsize
, GFP_KERNEL
)))
854 * initialize part of the hdlcdrv_state struct
856 memset(s
, 0, privsize
);
857 s
->magic
= HDLCDRV_MAGIC
;
858 strncpy(s
->ifname
, ifname
, sizeof(s
->ifname
));
861 * initialize part of the device struct
863 dev
->name
= s
->ifname
;
865 dev
->init
= hdlcdrv_probe
;
868 dev
->base_addr
= baseaddr
;
871 if (register_netdev(dev
)) {
872 printk(KERN_WARNING
"hdlcdrv: cannot register net "
873 "device %s\n", s
->ifname
);
881 /* --------------------------------------------------------------------- */
883 int hdlcdrv_unregister_hdlcdrv(struct device
*dev
)
885 struct hdlcdrv_state
*s
;
889 if (!(s
= (struct hdlcdrv_state
*)dev
->priv
))
891 if (s
->magic
!= HDLCDRV_MAGIC
)
893 if (dev
->start
&& s
->ops
->close
)
895 unregister_netdev(dev
);
901 /* --------------------------------------------------------------------- */
903 #if LINUX_VERSION_CODE >= 0x20115
905 EXPORT_SYMBOL(hdlcdrv_receiver
);
906 EXPORT_SYMBOL(hdlcdrv_transmitter
);
907 EXPORT_SYMBOL(hdlcdrv_arbitrate
);
908 EXPORT_SYMBOL(hdlcdrv_register_hdlcdrv
);
909 EXPORT_SYMBOL(hdlcdrv_unregister_hdlcdrv
);
913 static struct symbol_table hdlcdrv_syms
= {
914 #include <linux/symtab_begin.h>
916 X(hdlcdrv_transmitter
),
917 X(hdlcdrv_arbitrate
),
918 X(hdlcdrv_register_hdlcdrv
),
919 X(hdlcdrv_unregister_hdlcdrv
),
920 #include <linux/symtab_end.h>
925 /* --------------------------------------------------------------------- */
929 #if LINUX_VERSION_CODE >= 0x20115
931 MODULE_AUTHOR("Thomas M. Sailer, sailer@ife.ee.ethz.ch, hb9jnx@hb9w.che.eu");
932 MODULE_DESCRIPTION("Packet Radio network interface HDLC encoder/decoder");
936 /* --------------------------------------------------------------------- */
938 int __init
init_module(void)
940 printk(KERN_INFO
"hdlcdrv: (C) 1996 Thomas Sailer HB9JNX/AE4WA\n");
941 printk(KERN_INFO
"hdlcdrv: version 0.6 compiled " __TIME__
" " __DATE__
"\n");
942 #if LINUX_VERSION_CODE < 0x20115
943 register_symtab(&hdlcdrv_syms
);
948 /* --------------------------------------------------------------------- */
950 void cleanup_module(void)
952 printk(KERN_INFO
"hdlcdrv: cleanup\n");
956 /* --------------------------------------------------------------------- */