1 /*****************************************************************************/
 
   4  *    yam.c  -- YAM radio modem driver.
 
   6  *      Copyright (C) 1998 Frederic Rible F1OAT (frible@teaser.fr)
 
   7  *      Adapted from baycom.c driver written by Thomas Sailer (sailer@ife.ee.ethz.ch)
 
   9  *      This program is free software; you can redistribute it and/or modify
 
  10  *      it under the terms of the GNU General Public License as published by
 
  11  *      the Free Software Foundation; either version 2 of the License, or
 
  12  *      (at your option) any later version.
 
  14  *      This program is distributed in the hope that it will be useful,
 
  15  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  16  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  17  *      GNU General Public License for more details.
 
  19  *      You should have received a copy of the GNU General Public License
 
  20  *      along with this program; if not, write to the Free Software
 
  21  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
  23  *  Please note that the GPL allows you to use the driver, NOT the radio.
 
  24  *  In order to use the radio, you need a license from the communications
 
  25  *  authority of your country.
 
  29  *   0.0 F1OAT 06.06.98  Begin of work with baycom.c source code V 0.3
 
  30  *   0.1 F1OAT 07.06.98  Add timer polling routine for channel arbitration
 
  31  *   0.2 F6FBB 08.06.98  Added delay after FPGA programming
 
  32  *   0.3 F6FBB 29.07.98  Delayed PTT implementation for dupmode=2
 
  33  *   0.4 F6FBB 30.07.98  Added TxTail, Slottime and Persistance
 
  34  *   0.5 F6FBB 01.08.98  Shared IRQs, /proc/net and network statistics
 
  35  *   0.6 F6FBB 25.08.98  Added 1200Bds format
 
  36  *   0.7 F6FBB 12.09.98  Added to the kernel configuration
 
  37  *   0.8 F6FBB 14.10.98  Fixed slottime/persistence timing bug
 
  38  *       OK1ZIA 2.09.01  Fixed "kfree_skb on hard IRQ" 
 
  39  *                       using dev_kfree_skb_any(). (important in 2.4 kernel)
 
  43 /*****************************************************************************/
 
  45 #include <linux/config.h>
 
  46 #include <linux/module.h>
 
  47 #include <linux/types.h>
 
  48 #include <linux/net.h>
 
  51 #include <linux/slab.h>
 
  52 #include <linux/errno.h>
 
  53 #include <linux/bitops.h>
 
  55 #include <asm/system.h>
 
  56 #include <linux/interrupt.h>
 
  57 #include <linux/ioport.h>
 
  59 #include <linux/netdevice.h>
 
  60 #include <linux/if_arp.h>
 
  61 #include <linux/etherdevice.h>
 
  62 #include <linux/skbuff.h>
 
  65 #include <linux/kernel.h>
 
  66 #include <linux/proc_fs.h>
 
  67 #include <linux/seq_file.h>
 
  69 #include <asm/uaccess.h>
 
  70 #include <linux/init.h>
 
  72 #include <linux/yam.h>
 
  76 /* --------------------------------------------------------------------- */
 
  78 static const char yam_drvname[] = "yam";
 
  79 static char yam_drvinfo[] __initdata = KERN_INFO "YAM driver version 0.8 by F1OAT/F6FBB\n";
 
  81 /* --------------------------------------------------------------------- */
 
  87 #define YAM_MAGIC       0xF10A7654
 
  89 /* Transmitter states */
 
  98 #define YAM_MAX_FRAME   1024
 
 100 #define DEFAULT_BITRATE 9600                    /* bps */
 
 101 #define DEFAULT_HOLDD   10                      /* sec */
 
 102 #define DEFAULT_TXD     300                     /* ms */
 
 103 #define DEFAULT_TXTAIL  10                      /* ms */
 
 104 #define DEFAULT_SLOT    100                     /* ms */
 
 105 #define DEFAULT_PERS    64                      /* 0->255 */
 
 115         struct net_device *dev;
 
 119         struct net_device_stats stats;
 
 124         /* Parameters section */
 
 126         int txd;                                /* tx delay */
 
 127         int holdd;                              /* duplex ptt delay */
 
 128         int txtail;                             /* txtail delay */
 
 129         int slot;                               /* slottime */
 
 130         int pers;                               /* persistence */
 
 137         unsigned char tx_buf[YAM_MAX_FRAME];
 
 139         int tx_crcl, tx_crch;
 
 140         struct sk_buff_head send_queue;         /* Packets awaiting transmission */
 
 145         unsigned char rx_buf[YAM_MAX_FRAME];
 
 147         int rx_crcl, rx_crch;
 
 151         unsigned char bits[YAM_FPGA_SIZE];
 
 153         struct yam_mcs *next;
 
 156 static struct net_device *yam_devs[NR_PORTS];
 
 158 static struct yam_mcs *yam_data;
 
 160 static char ax25_bcast[7] =
 
 161 {'Q' << 1, 'S' << 1, 'T' << 1, ' ' << 1, ' ' << 1, ' ' << 1, '0' << 1};
 
 162 static char ax25_test[7] =
 
 163 {'L' << 1, 'I' << 1, 'N' << 1, 'U' << 1, 'X' << 1, ' ' << 1, '1' << 1};
 
 165 static DEFINE_TIMER(yam_timer, NULL, 0, 0);
 
 167 /* --------------------------------------------------------------------- */
 
 169 #define RBR(iobase)     (iobase+0)
 
 170 #define THR(iobase)     (iobase+0)
 
 171 #define IER(iobase)     (iobase+1)
 
 172 #define IIR(iobase)     (iobase+2)
 
 173 #define FCR(iobase)     (iobase+2)
 
 174 #define LCR(iobase)     (iobase+3)
 
 175 #define MCR(iobase)     (iobase+4)
 
 176 #define LSR(iobase)     (iobase+5)
 
 177 #define MSR(iobase)     (iobase+6)
 
 178 #define SCR(iobase)     (iobase+7)
 
 179 #define DLL(iobase)     (iobase+0)
 
 180 #define DLM(iobase)     (iobase+1)
 
 184 /* Interrupt Identification Register Bit Masks */
 
 190 #define IIR_TIMEOUT     12                      /* Fifo mode only */
 
 192 #define IIR_MASK        0x0F
 
 194 /* Interrupt Enable Register Bit Masks */
 
 195 #define IER_RX          1                       /* enable rx interrupt */
 
 196 #define IER_TX          2                       /* enable tx interrupt */
 
 197 #define IER_LSR         4                       /* enable line status interrupts */
 
 198 #define IER_MSR         8                       /* enable modem status interrupts */
 
 200 /* Modem Control Register Bit Masks */
 
 201 #define MCR_DTR         0x01                    /* DTR output */
 
 202 #define MCR_RTS         0x02                    /* RTS output */
 
 203 #define MCR_OUT1        0x04                    /* OUT1 output (not accessible in RS232) */
 
 204 #define MCR_OUT2        0x08                    /* Master Interrupt enable (must be set on PCs) */
 
 205 #define MCR_LOOP        0x10                    /* Loopback enable */
 
 207 /* Modem Status Register Bit Masks */
 
 208 #define MSR_DCTS        0x01                    /* Delta CTS input */
 
 209 #define MSR_DDSR        0x02                    /* Delta DSR */
 
 210 #define MSR_DRIN        0x04                    /* Delta RI */
 
 211 #define MSR_DDCD        0x08                    /* Delta DCD */
 
 212 #define MSR_CTS         0x10                    /* CTS input */
 
 213 #define MSR_DSR         0x20                    /* DSR input */
 
 214 #define MSR_RING        0x40                    /* RI  input */
 
 215 #define MSR_DCD         0x80                    /* DCD input */
 
 217 /* line status register bit mask */
 
 222 #define LSR_BREAK       0x10
 
 223 #define LSR_THRE        0x20
 
 224 #define LSR_TSRE        0x40
 
 226 /* Line Control Register Bit Masks */
 
 227 #define LCR_DLAB        0x80
 
 228 #define LCR_BREAK       0x40
 
 229 #define LCR_PZERO       0x28
 
 230 #define LCR_PEVEN       0x18
 
 231 #define LCR_PODD        0x08
 
 232 #define LCR_STOP1       0x00
 
 233 #define LCR_STOP2       0x04
 
 234 #define LCR_BIT5        0x00
 
 235 #define LCR_BIT6        0x02
 
 236 #define LCR_BIT7        0x01
 
 237 #define LCR_BIT8        0x03
 
 239 /* YAM Modem <-> UART Port mapping */
 
 241 #define TX_RDY          MSR_DCTS                /* transmitter ready to send */
 
 242 #define RX_DCD          MSR_DCD                 /* carrier detect */
 
 243 #define RX_FLAG         MSR_RING                /* hdlc flag received */
 
 244 #define FPGA_DONE       MSR_DSR                 /* FPGA is configured */
 
 245 #define PTT_ON          (MCR_RTS|MCR_OUT2)      /* activate PTT */
 
 246 #define PTT_OFF         (MCR_DTR|MCR_OUT2)      /* release PTT */
 
 248 #define ENABLE_RXINT    IER_RX                  /* enable uart rx interrupt during rx */
 
 249 #define ENABLE_TXINT    IER_MSR                 /* enable uart ms interrupt during tx */
 
 250 #define ENABLE_RTXINT   (IER_RX|IER_MSR)        /* full duplex operations */
 
 253 /*************************************************************************
 
 255 ************************************************************************/
 
 257 static const unsigned char chktabl[256] =
 
 258 {0x00, 0x89, 0x12, 0x9b, 0x24, 0xad, 0x36, 0xbf, 0x48, 0xc1, 0x5a, 0xd3, 0x6c, 0xe5, 0x7e,
 
 259  0xf7, 0x81, 0x08, 0x93, 0x1a, 0xa5, 0x2c, 0xb7, 0x3e, 0xc9, 0x40, 0xdb, 0x52, 0xed, 0x64,
 
 260  0xff, 0x76, 0x02, 0x8b, 0x10, 0x99, 0x26, 0xaf, 0x34, 0xbd, 0x4a, 0xc3, 0x58, 0xd1, 0x6e,
 
 261  0xe7, 0x7c, 0xf5, 0x83, 0x0a, 0x91, 0x18, 0xa7, 0x2e, 0xb5, 0x3c, 0xcb, 0x42, 0xd9, 0x50,
 
 262  0xef, 0x66, 0xfd, 0x74, 0x04, 0x8d, 0x16, 0x9f, 0x20, 0xa9, 0x32, 0xbb, 0x4c, 0xc5, 0x5e,
 
 263  0xd7, 0x68, 0xe1, 0x7a, 0xf3, 0x85, 0x0c, 0x97, 0x1e, 0xa1, 0x28, 0xb3, 0x3a, 0xcd, 0x44,
 
 264  0xdf, 0x56, 0xe9, 0x60, 0xfb, 0x72, 0x06, 0x8f, 0x14, 0x9d, 0x22, 0xab, 0x30, 0xb9, 0x4e,
 
 265  0xc7, 0x5c, 0xd5, 0x6a, 0xe3, 0x78, 0xf1, 0x87, 0x0e, 0x95, 0x1c, 0xa3, 0x2a, 0xb1, 0x38,
 
 266  0xcf, 0x46, 0xdd, 0x54, 0xeb, 0x62, 0xf9, 0x70, 0x08, 0x81, 0x1a, 0x93, 0x2c, 0xa5, 0x3e,
 
 267  0xb7, 0x40, 0xc9, 0x52, 0xdb, 0x64, 0xed, 0x76, 0xff, 0x89, 0x00, 0x9b, 0x12, 0xad, 0x24,
 
 268  0xbf, 0x36, 0xc1, 0x48, 0xd3, 0x5a, 0xe5, 0x6c, 0xf7, 0x7e, 0x0a, 0x83, 0x18, 0x91, 0x2e,
 
 269  0xa7, 0x3c, 0xb5, 0x42, 0xcb, 0x50, 0xd9, 0x66, 0xef, 0x74, 0xfd, 0x8b, 0x02, 0x99, 0x10,
 
 270  0xaf, 0x26, 0xbd, 0x34, 0xc3, 0x4a, 0xd1, 0x58, 0xe7, 0x6e, 0xf5, 0x7c, 0x0c, 0x85, 0x1e,
 
 271  0x97, 0x28, 0xa1, 0x3a, 0xb3, 0x44, 0xcd, 0x56, 0xdf, 0x60, 0xe9, 0x72, 0xfb, 0x8d, 0x04,
 
 272  0x9f, 0x16, 0xa9, 0x20, 0xbb, 0x32, 0xc5, 0x4c, 0xd7, 0x5e, 0xe1, 0x68, 0xf3, 0x7a, 0x0e,
 
 273  0x87, 0x1c, 0x95, 0x2a, 0xa3, 0x38, 0xb1, 0x46, 0xcf, 0x54, 0xdd, 0x62, 0xeb, 0x70, 0xf9,
 
 274  0x8f, 0x06, 0x9d, 0x14, 0xab, 0x22, 0xb9, 0x30, 0xc7, 0x4e, 0xd5, 0x5c, 0xe3, 0x6a, 0xf1,
 
 276 static const unsigned char chktabh[256] =
 
 277 {0x00, 0x11, 0x23, 0x32, 0x46, 0x57, 0x65, 0x74, 0x8c, 0x9d, 0xaf, 0xbe, 0xca, 0xdb, 0xe9,
 
 278  0xf8, 0x10, 0x01, 0x33, 0x22, 0x56, 0x47, 0x75, 0x64, 0x9c, 0x8d, 0xbf, 0xae, 0xda, 0xcb,
 
 279  0xf9, 0xe8, 0x21, 0x30, 0x02, 0x13, 0x67, 0x76, 0x44, 0x55, 0xad, 0xbc, 0x8e, 0x9f, 0xeb,
 
 280  0xfa, 0xc8, 0xd9, 0x31, 0x20, 0x12, 0x03, 0x77, 0x66, 0x54, 0x45, 0xbd, 0xac, 0x9e, 0x8f,
 
 281  0xfb, 0xea, 0xd8, 0xc9, 0x42, 0x53, 0x61, 0x70, 0x04, 0x15, 0x27, 0x36, 0xce, 0xdf, 0xed,
 
 282  0xfc, 0x88, 0x99, 0xab, 0xba, 0x52, 0x43, 0x71, 0x60, 0x14, 0x05, 0x37, 0x26, 0xde, 0xcf,
 
 283  0xfd, 0xec, 0x98, 0x89, 0xbb, 0xaa, 0x63, 0x72, 0x40, 0x51, 0x25, 0x34, 0x06, 0x17, 0xef,
 
 284  0xfe, 0xcc, 0xdd, 0xa9, 0xb8, 0x8a, 0x9b, 0x73, 0x62, 0x50, 0x41, 0x35, 0x24, 0x16, 0x07,
 
 285  0xff, 0xee, 0xdc, 0xcd, 0xb9, 0xa8, 0x9a, 0x8b, 0x84, 0x95, 0xa7, 0xb6, 0xc2, 0xd3, 0xe1,
 
 286  0xf0, 0x08, 0x19, 0x2b, 0x3a, 0x4e, 0x5f, 0x6d, 0x7c, 0x94, 0x85, 0xb7, 0xa6, 0xd2, 0xc3,
 
 287  0xf1, 0xe0, 0x18, 0x09, 0x3b, 0x2a, 0x5e, 0x4f, 0x7d, 0x6c, 0xa5, 0xb4, 0x86, 0x97, 0xe3,
 
 288  0xf2, 0xc0, 0xd1, 0x29, 0x38, 0x0a, 0x1b, 0x6f, 0x7e, 0x4c, 0x5d, 0xb5, 0xa4, 0x96, 0x87,
 
 289  0xf3, 0xe2, 0xd0, 0xc1, 0x39, 0x28, 0x1a, 0x0b, 0x7f, 0x6e, 0x5c, 0x4d, 0xc6, 0xd7, 0xe5,
 
 290  0xf4, 0x80, 0x91, 0xa3, 0xb2, 0x4a, 0x5b, 0x69, 0x78, 0x0c, 0x1d, 0x2f, 0x3e, 0xd6, 0xc7,
 
 291  0xf5, 0xe4, 0x90, 0x81, 0xb3, 0xa2, 0x5a, 0x4b, 0x79, 0x68, 0x1c, 0x0d, 0x3f, 0x2e, 0xe7,
 
 292  0xf6, 0xc4, 0xd5, 0xa1, 0xb0, 0x82, 0x93, 0x6b, 0x7a, 0x48, 0x59, 0x2d, 0x3c, 0x0e, 0x1f,
 
 293  0xf7, 0xe6, 0xd4, 0xc5, 0xb1, 0xa0, 0x92, 0x83, 0x7b, 0x6a, 0x58, 0x49, 0x3d, 0x2c, 0x1e,
 
 296 /*************************************************************************
 
 298 ************************************************************************/
 
 300 static void delay(int ms)
 
 302         unsigned long timeout = jiffies + ((ms * HZ) / 1000);
 
 303         while (time_before(jiffies, timeout))
 
 311 static void fpga_reset(int iobase)
 
 313         outb(0, IER(iobase));
 
 314         outb(LCR_DLAB | LCR_BIT5, LCR(iobase));
 
 315         outb(1, DLL(iobase));
 
 316         outb(0, DLM(iobase));
 
 318         outb(LCR_BIT5, LCR(iobase));
 
 321         /* turn off FPGA supply voltage */
 
 322         outb(MCR_OUT1 | MCR_OUT2, MCR(iobase));
 
 324         /* turn on FPGA supply voltage again */
 
 325         outb(MCR_DTR | MCR_RTS | MCR_OUT1 | MCR_OUT2, MCR(iobase));
 
 330  * send one byte to FPGA
 
 333 static int fpga_write(int iobase, unsigned char wrd)
 
 337         unsigned long timeout = jiffies + HZ / 10;
 
 339         for (k = 0; k < 8; k++) {
 
 340                 bit = (wrd & 0x80) ? (MCR_RTS | MCR_DTR) : MCR_DTR;
 
 341                 outb(bit | MCR_OUT1 | MCR_OUT2, MCR(iobase));
 
 343                 outb(0xfc, THR(iobase));
 
 344                 while ((inb(LSR(iobase)) & LSR_TSRE) == 0)
 
 345                         if (time_after(jiffies, timeout))
 
 352 static unsigned char *add_mcs(unsigned char *bits, int bitrate)
 
 356         /* If it already exists, replace the bit data */
 
 359                 if (p->bitrate == bitrate) {
 
 360                         memcpy(p->bits, bits, YAM_FPGA_SIZE);
 
 366         /* Allocate a new mcs */
 
 367         if ((p = kmalloc(sizeof(struct yam_mcs), GFP_KERNEL)) == NULL) {
 
 368                 printk(KERN_WARNING "YAM: no memory to allocate mcs\n");
 
 371         memcpy(p->bits, bits, YAM_FPGA_SIZE);
 
 372         p->bitrate = bitrate;
 
 379 static unsigned char *get_mcs(int bitrate)
 
 385                 if (p->bitrate == bitrate)
 
 390         /* Load predefined mcs data */
 
 393                 return add_mcs(bits_1200, bitrate);
 
 395                 return add_mcs(bits_9600, bitrate);
 
 400  * download bitstream to FPGA
 
 401  * data is contained in bits[] array in yam1200.h resp. yam9600.h
 
 404 static int fpga_download(int iobase, int bitrate)
 
 407         unsigned char *pbits;
 
 409         pbits = get_mcs(bitrate);
 
 414         for (i = 0; i < YAM_FPGA_SIZE; i++) {
 
 415                 if (fpga_write(iobase, pbits[i])) {
 
 416                         printk(KERN_ERR "yam: error in write cycle\n");
 
 417                         return -1;                      /* write... */
 
 421         fpga_write(iobase, 0xFF);
 
 422         rc = inb(MSR(iobase));          /* check DONE signal */
 
 424         /* Needed for some hardwares */
 
 427         return (rc & MSR_DSR) ? 0 : -1;
 
 431 /************************************************************************
 
 433 ************************************************************************/
 
 435 static void yam_set_uart(struct net_device *dev)
 
 437         struct yam_port *yp = netdev_priv(dev);
 
 438         int divisor = 115200 / yp->baudrate;
 
 440         outb(0, IER(dev->base_addr));
 
 441         outb(LCR_DLAB | LCR_BIT8, LCR(dev->base_addr));
 
 442         outb(divisor, DLL(dev->base_addr));
 
 443         outb(0, DLM(dev->base_addr));
 
 444         outb(LCR_BIT8, LCR(dev->base_addr));
 
 445         outb(PTT_OFF, MCR(dev->base_addr));
 
 446         outb(0x00, FCR(dev->base_addr));
 
 448         /* Flush pending irq */
 
 450         inb(RBR(dev->base_addr));
 
 451         inb(MSR(dev->base_addr));
 
 455         outb(ENABLE_RTXINT, IER(dev->base_addr));
 
 459 /* --------------------------------------------------------------------- */
 
 462         c_uart_unknown, c_uart_8250,
 
 463         c_uart_16450, c_uart_16550, c_uart_16550A
 
 466 static const char *uart_str[] =
 
 467 {"unknown", "8250", "16450", "16550", "16550A"};
 
 469 static enum uart yam_check_uart(unsigned int iobase)
 
 471         unsigned char b1, b2, b3;
 
 473         enum uart uart_tab[] =
 
 474         {c_uart_16450, c_uart_unknown, c_uart_16550, c_uart_16550A};
 
 476         b1 = inb(MCR(iobase));
 
 477         outb(b1 | 0x10, MCR(iobase));   /* loopback mode */
 
 478         b2 = inb(MSR(iobase));
 
 479         outb(0x1a, MCR(iobase));
 
 480         b3 = inb(MSR(iobase)) & 0xf0;
 
 481         outb(b1, MCR(iobase));          /* restore old values */
 
 482         outb(b2, MSR(iobase));
 
 484                 return c_uart_unknown;
 
 487         outb(0x01, FCR(iobase));        /* enable FIFOs */
 
 488         u = uart_tab[(inb(IIR(iobase)) >> 6) & 3];
 
 489         if (u == c_uart_16450) {
 
 490                 outb(0x5a, SCR(iobase));
 
 491                 b1 = inb(SCR(iobase));
 
 492                 outb(0xa5, SCR(iobase));
 
 493                 b2 = inb(SCR(iobase));
 
 494                 if ((b1 != 0x5a) || (b2 != 0xa5))
 
 500 /******************************************************************************
 
 502 ******************************************************************************/
 
 503 static inline void yam_rx_flag(struct net_device *dev, struct yam_port *yp)
 
 505         if (yp->dcd && yp->rx_len >= 3 && yp->rx_len < YAM_MAX_FRAME) {
 
 506                 int pkt_len = yp->rx_len - 2 + 1;       /* -CRC + kiss */
 
 509                 if ((yp->rx_crch & yp->rx_crcl) != 0xFF) {
 
 512                         if (!(skb = dev_alloc_skb(pkt_len))) {
 
 513                                 printk(KERN_WARNING "%s: memory squeeze, dropping packet\n", dev->name);
 
 514                                 ++yp->stats.rx_dropped;
 
 517                                 cp = skb_put(skb, pkt_len);
 
 518                                 *cp++ = 0;              /* KISS kludge */
 
 519                                 memcpy(cp, yp->rx_buf, pkt_len - 1);
 
 520                                 skb->protocol = ax25_type_trans(skb, dev);
 
 522                                 dev->last_rx = jiffies;
 
 523                                 ++yp->stats.rx_packets;
 
 532 static inline void yam_rx_byte(struct net_device *dev, struct yam_port *yp, unsigned char rxb)
 
 534         if (yp->rx_len < YAM_MAX_FRAME) {
 
 535                 unsigned char c = yp->rx_crcl;
 
 536                 yp->rx_crcl = (chktabl[c] ^ yp->rx_crch);
 
 537                 yp->rx_crch = (chktabh[c] ^ rxb);
 
 538                 yp->rx_buf[yp->rx_len++] = rxb;
 
 542 /********************************************************************************
 
 544 ********************************************************************************/
 
 546 static void ptt_on(struct net_device *dev)
 
 548         outb(PTT_ON, MCR(dev->base_addr));
 
 551 static void ptt_off(struct net_device *dev)
 
 553         outb(PTT_OFF, MCR(dev->base_addr));
 
 556 static int yam_send_packet(struct sk_buff *skb, struct net_device *dev)
 
 558         struct yam_port *yp = netdev_priv(dev);
 
 560         skb_queue_tail(&yp->send_queue, skb);
 
 561         dev->trans_start = jiffies;
 
 565 static void yam_start_tx(struct net_device *dev, struct yam_port *yp)
 
 567         if ((yp->tx_state == TX_TAIL) || (yp->txd == 0))
 
 570                 yp->tx_count = (yp->bitrate * yp->txd) / 8000;
 
 571         yp->tx_state = TX_HEAD;
 
 575 static unsigned short random_seed;
 
 577 static inline unsigned short random_num(void)
 
 579         random_seed = 28629 * random_seed + 157;
 
 583 static void yam_arbitrate(struct net_device *dev)
 
 585         struct yam_port *yp = netdev_priv(dev);
 
 587         if (yp->magic != YAM_MAGIC || yp->tx_state != TX_OFF ||
 
 588             skb_queue_empty(&yp->send_queue))
 
 590         /* tx_state is TX_OFF and there is data to send */
 
 593                 /* Full duplex mode, don't wait */
 
 594                 yam_start_tx(dev, yp);
 
 598                 /* DCD on, wait slotime ... */
 
 599                 yp->slotcnt = yp->slot / 10;
 
 602         /* Is slottime passed ? */
 
 603         if ((--yp->slotcnt) > 0)
 
 606         yp->slotcnt = yp->slot / 10;
 
 608         /* is random > persist ? */
 
 609         if ((random_num() % 256) > yp->pers)
 
 612         yam_start_tx(dev, yp);
 
 615 static void yam_dotimer(unsigned long dummy)
 
 619         for (i = 0; i < NR_PORTS; i++) {
 
 620                 struct net_device *dev = yam_devs[i];
 
 621                 if (dev && netif_running(dev))
 
 624         yam_timer.expires = jiffies + HZ / 100;
 
 625         add_timer(&yam_timer);
 
 628 static void yam_tx_byte(struct net_device *dev, struct yam_port *yp)
 
 631         unsigned char b, temp;
 
 633         switch (yp->tx_state) {
 
 637                 if (--yp->tx_count <= 0) {
 
 638                         if (!(skb = skb_dequeue(&yp->send_queue))) {
 
 640                                 yp->tx_state = TX_OFF;
 
 643                         yp->tx_state = TX_DATA;
 
 644                         if (skb->data[0] != 0) {
 
 645 /*                              do_kiss_params(s, skb->data, skb->len); */
 
 646                                 dev_kfree_skb_any(skb);
 
 649                         yp->tx_len = skb->len - 1;      /* strip KISS byte */
 
 650                         if (yp->tx_len >= YAM_MAX_FRAME || yp->tx_len < 2) {
 
 651                                 dev_kfree_skb_any(skb);
 
 654                         memcpy(yp->tx_buf, skb->data + 1, yp->tx_len);
 
 655                         dev_kfree_skb_any(skb);
 
 659                         yp->tx_state = TX_DATA;
 
 663                 b = yp->tx_buf[yp->tx_count++];
 
 664                 outb(b, THR(dev->base_addr));
 
 666                 yp->tx_crcl = chktabl[temp] ^ yp->tx_crch;
 
 667                 yp->tx_crch = chktabh[temp] ^ b;
 
 668                 if (yp->tx_count >= yp->tx_len) {
 
 669                         yp->tx_state = TX_CRC1;
 
 673                 yp->tx_crch = chktabl[yp->tx_crcl] ^ yp->tx_crch;
 
 674                 yp->tx_crcl = chktabh[yp->tx_crcl] ^ chktabl[yp->tx_crch] ^ 0xff;
 
 675                 outb(yp->tx_crcl, THR(dev->base_addr));
 
 676                 yp->tx_state = TX_CRC2;
 
 679                 outb(chktabh[yp->tx_crch] ^ 0xFF, THR(dev->base_addr));
 
 680                 if (skb_queue_empty(&yp->send_queue)) {
 
 681                         yp->tx_count = (yp->bitrate * yp->txtail) / 8000;
 
 682                         if (yp->dupmode == 2)
 
 683                                 yp->tx_count += (yp->bitrate * yp->holdd) / 8;
 
 684                         if (yp->tx_count == 0)
 
 686                         yp->tx_state = TX_TAIL;
 
 689                         yp->tx_state = TX_HEAD;
 
 691                 ++yp->stats.tx_packets;
 
 694                 if (--yp->tx_count <= 0) {
 
 695                         yp->tx_state = TX_OFF;
 
 702 /***********************************************************************************
 
 704 ************************************************************************************/
 
 706 static irqreturn_t yam_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 
 708         struct net_device *dev;
 
 715         for (i = 0; i < NR_PORTS; i++) {
 
 717                 yp = netdev_priv(dev);
 
 719                 if (!netif_running(dev))
 
 722                 while ((iir = IIR_MASK & inb(IIR(dev->base_addr))) != IIR_NOPEND) {
 
 723                         unsigned char msr = inb(MSR(dev->base_addr));
 
 724                         unsigned char lsr = inb(LSR(dev->base_addr));
 
 730                                 ++yp->stats.rx_fifo_errors;
 
 732                         yp->dcd = (msr & RX_DCD) ? 1 : 0;
 
 734                         if (--counter <= 0) {
 
 735                                 printk(KERN_ERR "%s: too many irq iir=%d\n",
 
 741                                 yam_tx_byte(dev, yp);
 
 745                                 rxb = inb(RBR(dev->base_addr));
 
 747                                         yam_rx_flag(dev, yp);
 
 749                                         yam_rx_byte(dev, yp, rxb);
 
 754         return IRQ_RETVAL(handled);
 
 757 #ifdef CONFIG_PROC_FS
 
 759 static void *yam_seq_start(struct seq_file *seq, loff_t *pos)
 
 761         return (*pos < NR_PORTS) ? yam_devs[*pos] : NULL;
 
 764 static void *yam_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 
 767         return (*pos < NR_PORTS) ? yam_devs[*pos] : NULL;
 
 770 static void yam_seq_stop(struct seq_file *seq, void *v)
 
 774 static int yam_seq_show(struct seq_file *seq, void *v)
 
 776         struct net_device *dev = v;
 
 777         const struct yam_port *yp = netdev_priv(dev);
 
 779         seq_printf(seq, "Device %s\n", dev->name);
 
 780         seq_printf(seq, "  Up       %d\n", netif_running(dev));
 
 781         seq_printf(seq, "  Speed    %u\n", yp->bitrate);
 
 782         seq_printf(seq, "  IoBase   0x%x\n", yp->iobase);
 
 783         seq_printf(seq, "  BaudRate %u\n", yp->baudrate);
 
 784         seq_printf(seq, "  IRQ      %u\n", yp->irq);
 
 785         seq_printf(seq, "  TxState  %u\n", yp->tx_state);
 
 786         seq_printf(seq, "  Duplex   %u\n", yp->dupmode);
 
 787         seq_printf(seq, "  HoldDly  %u\n", yp->holdd);
 
 788         seq_printf(seq, "  TxDelay  %u\n", yp->txd);
 
 789         seq_printf(seq, "  TxTail   %u\n", yp->txtail);
 
 790         seq_printf(seq, "  SlotTime %u\n", yp->slot);
 
 791         seq_printf(seq, "  Persist  %u\n", yp->pers);
 
 792         seq_printf(seq, "  TxFrames %lu\n", yp->stats.tx_packets);
 
 793         seq_printf(seq, "  RxFrames %lu\n", yp->stats.rx_packets);
 
 794         seq_printf(seq, "  TxInt    %u\n", yp->nb_mdint);
 
 795         seq_printf(seq, "  RxInt    %u\n", yp->nb_rxint);
 
 796         seq_printf(seq, "  RxOver   %lu\n", yp->stats.rx_fifo_errors);
 
 797         seq_printf(seq, "\n");
 
 801 static struct seq_operations yam_seqops = {
 
 802         .start = yam_seq_start,
 
 803         .next = yam_seq_next,
 
 804         .stop = yam_seq_stop,
 
 805         .show = yam_seq_show,
 
 808 static int yam_info_open(struct inode *inode, struct file *file)
 
 810         return seq_open(file, &yam_seqops);
 
 813 static struct file_operations yam_info_fops = {
 
 814         .owner = THIS_MODULE,
 
 815         .open = yam_info_open,
 
 818         .release = seq_release,
 
 824 /* --------------------------------------------------------------------- */
 
 826 static struct net_device_stats *yam_get_stats(struct net_device *dev)
 
 833         yp = netdev_priv(dev);
 
 834         if (yp->magic != YAM_MAGIC)
 
 838          * Get the current statistics.  This may be called with the
 
 839          * card open or closed. 
 
 844 /* --------------------------------------------------------------------- */
 
 846 static int yam_open(struct net_device *dev)
 
 848         struct yam_port *yp = netdev_priv(dev);
 
 853         printk(KERN_INFO "Trying %s at iobase 0x%lx irq %u\n", dev->name, dev->base_addr, dev->irq);
 
 855         if (!dev || !yp->bitrate)
 
 857         if (!dev->base_addr || dev->base_addr > 0x1000 - YAM_EXTENT ||
 
 858                 dev->irq < 2 || dev->irq > 15) {
 
 861         if (!request_region(dev->base_addr, YAM_EXTENT, dev->name))
 
 863                 printk(KERN_ERR "%s: cannot 0x%lx busy\n", dev->name, dev->base_addr);
 
 866         if ((u = yam_check_uart(dev->base_addr)) == c_uart_unknown) {
 
 867                 printk(KERN_ERR "%s: cannot find uart type\n", dev->name);
 
 869                 goto out_release_base;
 
 871         if (fpga_download(dev->base_addr, yp->bitrate)) {
 
 872                 printk(KERN_ERR "%s: cannot init FPGA\n", dev->name);
 
 874                 goto out_release_base;
 
 876         outb(0, IER(dev->base_addr));
 
 877         if (request_irq(dev->irq, yam_interrupt, SA_INTERRUPT | SA_SHIRQ, dev->name, dev)) {
 
 878                 printk(KERN_ERR "%s: irq %d busy\n", dev->name, dev->irq);
 
 880                 goto out_release_base;
 
 885         netif_start_queue(dev);
 
 887         yp->slotcnt = yp->slot / 10;
 
 889         /* Reset overruns for all ports - FPGA programming makes overruns */
 
 890         for (i = 0; i < NR_PORTS; i++) {
 
 891                 struct net_device *dev = yam_devs[i];
 
 892                 struct yam_port *yp = netdev_priv(dev);
 
 893                 inb(LSR(dev->base_addr));
 
 894                 yp->stats.rx_fifo_errors = 0;
 
 897         printk(KERN_INFO "%s at iobase 0x%lx irq %u uart %s\n", dev->name, dev->base_addr, dev->irq,
 
 902         release_region(dev->base_addr, YAM_EXTENT);
 
 906 /* --------------------------------------------------------------------- */
 
 908 static int yam_close(struct net_device *dev)
 
 911         struct yam_port *yp = netdev_priv(dev);
 
 919         outb(0, IER(dev->base_addr));
 
 920         outb(1, MCR(dev->base_addr));
 
 921         /* Remove IRQ handler if last */
 
 922         free_irq(dev->irq,dev);
 
 923         release_region(dev->base_addr, YAM_EXTENT);
 
 924         netif_stop_queue(dev);
 
 925         while ((skb = skb_dequeue(&yp->send_queue)))
 
 928         printk(KERN_INFO "%s: close yam at iobase 0x%lx irq %u\n",
 
 929                    yam_drvname, dev->base_addr, dev->irq);
 
 933 /* --------------------------------------------------------------------- */
 
 935 static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 
 937         struct yam_port *yp = netdev_priv(dev);
 
 938         struct yamdrv_ioctl_cfg yi;
 
 939         struct yamdrv_ioctl_mcs *ym;
 
 942         if (copy_from_user(&ioctl_cmd, ifr->ifr_data, sizeof(int)))
 
 945         if (yp->magic != YAM_MAGIC)
 
 948         if (!capable(CAP_NET_ADMIN))
 
 951         if (cmd != SIOCDEVPRIVATE)
 
 956         case SIOCYAMRESERVED:
 
 957                 return -EINVAL;                 /* unused */
 
 960                 if (netif_running(dev))
 
 961                         return -EINVAL;         /* Cannot change this parameter when up */
 
 962                 if ((ym = kmalloc(sizeof(struct yamdrv_ioctl_mcs), GFP_KERNEL)) == NULL)
 
 965                 if (copy_from_user(ym, ifr->ifr_data, sizeof(struct yamdrv_ioctl_mcs))) {
 
 969                 if (ym->bitrate > YAM_MAXBITRATE) {
 
 973                 add_mcs(ym->bits, ym->bitrate);
 
 978                 if (!capable(CAP_SYS_RAWIO))
 
 980                 if (copy_from_user(&yi, ifr->ifr_data, sizeof(struct yamdrv_ioctl_cfg)))
 
 983                 if ((yi.cfg.mask & YAM_IOBASE) && netif_running(dev))
 
 984                         return -EINVAL;         /* Cannot change this parameter when up */
 
 985                 if ((yi.cfg.mask & YAM_IRQ) && netif_running(dev))
 
 986                         return -EINVAL;         /* Cannot change this parameter when up */
 
 987                 if ((yi.cfg.mask & YAM_BITRATE) && netif_running(dev))
 
 988                         return -EINVAL;         /* Cannot change this parameter when up */
 
 989                 if ((yi.cfg.mask & YAM_BAUDRATE) && netif_running(dev))
 
 990                         return -EINVAL;         /* Cannot change this parameter when up */
 
 992                 if (yi.cfg.mask & YAM_IOBASE) {
 
 993                         yp->iobase = yi.cfg.iobase;
 
 994                         dev->base_addr = yi.cfg.iobase;
 
 996                 if (yi.cfg.mask & YAM_IRQ) {
 
 999                         yp->irq = yi.cfg.irq;
 
1000                         dev->irq = yi.cfg.irq;
 
1002                 if (yi.cfg.mask & YAM_BITRATE) {
 
1003                         if (yi.cfg.bitrate > YAM_MAXBITRATE)
 
1005                         yp->bitrate = yi.cfg.bitrate;
 
1007                 if (yi.cfg.mask & YAM_BAUDRATE) {
 
1008                         if (yi.cfg.baudrate > YAM_MAXBAUDRATE)
 
1010                         yp->baudrate = yi.cfg.baudrate;
 
1012                 if (yi.cfg.mask & YAM_MODE) {
 
1013                         if (yi.cfg.mode > YAM_MAXMODE)
 
1015                         yp->dupmode = yi.cfg.mode;
 
1017                 if (yi.cfg.mask & YAM_HOLDDLY) {
 
1018                         if (yi.cfg.holddly > YAM_MAXHOLDDLY)
 
1020                         yp->holdd = yi.cfg.holddly;
 
1022                 if (yi.cfg.mask & YAM_TXDELAY) {
 
1023                         if (yi.cfg.txdelay > YAM_MAXTXDELAY)
 
1025                         yp->txd = yi.cfg.txdelay;
 
1027                 if (yi.cfg.mask & YAM_TXTAIL) {
 
1028                         if (yi.cfg.txtail > YAM_MAXTXTAIL)
 
1030                         yp->txtail = yi.cfg.txtail;
 
1032                 if (yi.cfg.mask & YAM_PERSIST) {
 
1033                         if (yi.cfg.persist > YAM_MAXPERSIST)
 
1035                         yp->pers = yi.cfg.persist;
 
1037                 if (yi.cfg.mask & YAM_SLOTTIME) {
 
1038                         if (yi.cfg.slottime > YAM_MAXSLOTTIME)
 
1040                         yp->slot = yi.cfg.slottime;
 
1041                         yp->slotcnt = yp->slot / 10;
 
1046                 yi.cfg.mask = 0xffffffff;
 
1047                 yi.cfg.iobase = yp->iobase;
 
1048                 yi.cfg.irq = yp->irq;
 
1049                 yi.cfg.bitrate = yp->bitrate;
 
1050                 yi.cfg.baudrate = yp->baudrate;
 
1051                 yi.cfg.mode = yp->dupmode;
 
1052                 yi.cfg.txdelay = yp->txd;
 
1053                 yi.cfg.holddly = yp->holdd;
 
1054                 yi.cfg.txtail = yp->txtail;
 
1055                 yi.cfg.persist = yp->pers;
 
1056                 yi.cfg.slottime = yp->slot;
 
1057                 if (copy_to_user(ifr->ifr_data, &yi, sizeof(struct yamdrv_ioctl_cfg)))
 
1069 /* --------------------------------------------------------------------- */
 
1071 static int yam_set_mac_address(struct net_device *dev, void *addr)
 
1073         struct sockaddr *sa = (struct sockaddr *) addr;
 
1075         /* addr is an AX.25 shifted ASCII mac address */
 
1076         memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
 
1080 /* --------------------------------------------------------------------- */
 
1082 static void yam_setup(struct net_device *dev)
 
1084         struct yam_port *yp = netdev_priv(dev);
 
1086         yp->magic = YAM_MAGIC;
 
1087         yp->bitrate = DEFAULT_BITRATE;
 
1088         yp->baudrate = DEFAULT_BITRATE * 2;
 
1092         yp->holdd = DEFAULT_HOLDD;
 
1093         yp->txd = DEFAULT_TXD;
 
1094         yp->txtail = DEFAULT_TXTAIL;
 
1095         yp->slot = DEFAULT_SLOT;
 
1096         yp->pers = DEFAULT_PERS;
 
1099         dev->base_addr = yp->iobase;
 
1101         SET_MODULE_OWNER(dev);
 
1103         dev->open = yam_open;
 
1104         dev->stop = yam_close;
 
1105         dev->do_ioctl = yam_ioctl;
 
1106         dev->hard_start_xmit = yam_send_packet;
 
1107         dev->get_stats = yam_get_stats;
 
1109         skb_queue_head_init(&yp->send_queue);
 
1111         dev->hard_header = ax25_hard_header;
 
1112         dev->rebuild_header = ax25_rebuild_header;
 
1114         dev->set_mac_address = yam_set_mac_address;
 
1116         dev->type = ARPHRD_AX25;
 
1117         dev->hard_header_len = AX25_MAX_HEADER_LEN;
 
1118         dev->mtu = AX25_MTU;
 
1119         dev->addr_len = AX25_ADDR_LEN;
 
1120         memcpy(dev->broadcast, ax25_bcast, AX25_ADDR_LEN);
 
1121         memcpy(dev->dev_addr, ax25_test, AX25_ADDR_LEN);
 
1124 static int __init yam_init_driver(void)
 
1126         struct net_device *dev;
 
1128         char name[IFNAMSIZ];
 
1130         printk(yam_drvinfo);
 
1132         for (i = 0; i < NR_PORTS; i++) {
 
1133                 sprintf(name, "yam%d", i);
 
1135                 dev = alloc_netdev(sizeof(struct yam_port), name,
 
1138                         printk(KERN_ERR "yam: cannot allocate net device %s\n",
 
1144                 err = register_netdev(dev);
 
1146                         printk(KERN_WARNING "yam: cannot register net device %s\n", dev->name);
 
1153         yam_timer.function = yam_dotimer;
 
1154         yam_timer.expires = jiffies + HZ / 100;
 
1155         add_timer(&yam_timer);
 
1157         proc_net_fops_create("yam", S_IRUGO, &yam_info_fops);
 
1161                 unregister_netdev(yam_devs[i]);
 
1162                 free_netdev(yam_devs[i]);
 
1167 /* --------------------------------------------------------------------- */
 
1169 static void __exit yam_cleanup_driver(void)
 
1174         del_timer(&yam_timer);
 
1175         for (i = 0; i < NR_PORTS; i++) {
 
1176                 struct net_device *dev = yam_devs[i];
 
1178                         unregister_netdev(dev);
 
1185                 yam_data = yam_data->next;
 
1189         proc_net_remove("yam");
 
1192 /* --------------------------------------------------------------------- */
 
1194 MODULE_AUTHOR("Frederic Rible F1OAT frible@teaser.fr");
 
1195 MODULE_DESCRIPTION("Yam amateur radio modem driver");
 
1196 MODULE_LICENSE("GPL");
 
1198 module_init(yam_init_driver);
 
1199 module_exit(yam_cleanup_driver);
 
1201 /* --------------------------------------------------------------------- */