GNU Linux-libre 5.10.215-gnu1
[releases.git] / drivers / net / hamradio / dmascc.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Driver for high-speed SCC boards (those with DMA support)
4  * Copyright (C) 1997-2000 Klaus Kudielka
5  *
6  * S5SCC/DMA support by Janko Koleznik S52HI
7  */
8
9
10 #include <linux/module.h>
11 #include <linux/bitops.h>
12 #include <linux/delay.h>
13 #include <linux/errno.h>
14 #include <linux/if_arp.h>
15 #include <linux/in.h>
16 #include <linux/init.h>
17 #include <linux/interrupt.h>
18 #include <linux/ioport.h>
19 #include <linux/kernel.h>
20 #include <linux/mm.h>
21 #include <linux/netdevice.h>
22 #include <linux/slab.h>
23 #include <linux/rtnetlink.h>
24 #include <linux/sockios.h>
25 #include <linux/workqueue.h>
26 #include <linux/atomic.h>
27 #include <asm/dma.h>
28 #include <asm/io.h>
29 #include <asm/irq.h>
30 #include <linux/uaccess.h>
31 #include <net/ax25.h>
32 #include "z8530.h"
33
34
35 /* Number of buffers per channel */
36
37 #define NUM_TX_BUF      2       /* NUM_TX_BUF >= 1 (min. 2 recommended) */
38 #define NUM_RX_BUF      6       /* NUM_RX_BUF >= 1 (min. 2 recommended) */
39 #define BUF_SIZE        1576    /* BUF_SIZE >= mtu + hard_header_len */
40
41
42 /* Cards supported */
43
44 #define HW_PI           { "Ottawa PI", 0x300, 0x20, 0x10, 8, \
45                             0, 8, 1843200, 3686400 }
46 #define HW_PI2          { "Ottawa PI2", 0x300, 0x20, 0x10, 8, \
47                             0, 8, 3686400, 7372800 }
48 #define HW_TWIN         { "Gracilis PackeTwin", 0x200, 0x10, 0x10, 32, \
49                             0, 4, 6144000, 6144000 }
50 #define HW_S5           { "S5SCC/DMA", 0x200, 0x10, 0x10, 32, \
51                           0, 8, 4915200, 9830400 }
52
53 #define HARDWARE        { HW_PI, HW_PI2, HW_TWIN, HW_S5 }
54
55 #define TMR_0_HZ        25600   /* Frequency of timer 0 */
56
57 #define TYPE_PI         0
58 #define TYPE_PI2        1
59 #define TYPE_TWIN       2
60 #define TYPE_S5         3
61 #define NUM_TYPES       4
62
63 #define MAX_NUM_DEVS    32
64
65
66 /* SCC chips supported */
67
68 #define Z8530           0
69 #define Z85C30          1
70 #define Z85230          2
71
72 #define CHIPNAMES       { "Z8530", "Z85C30", "Z85230" }
73
74
75 /* I/O registers */
76
77 /* 8530 registers relative to card base */
78 #define SCCB_CMD        0x00
79 #define SCCB_DATA       0x01
80 #define SCCA_CMD        0x02
81 #define SCCA_DATA       0x03
82
83 /* 8253/8254 registers relative to card base */
84 #define TMR_CNT0        0x00
85 #define TMR_CNT1        0x01
86 #define TMR_CNT2        0x02
87 #define TMR_CTRL        0x03
88
89 /* Additional PI/PI2 registers relative to card base */
90 #define PI_DREQ_MASK    0x04
91
92 /* Additional PackeTwin registers relative to card base */
93 #define TWIN_INT_REG    0x08
94 #define TWIN_CLR_TMR1   0x09
95 #define TWIN_CLR_TMR2   0x0a
96 #define TWIN_SPARE_1    0x0b
97 #define TWIN_DMA_CFG    0x08
98 #define TWIN_SERIAL_CFG 0x09
99 #define TWIN_DMA_CLR_FF 0x0a
100 #define TWIN_SPARE_2    0x0b
101
102
103 /* PackeTwin I/O register values */
104
105 /* INT_REG */
106 #define TWIN_SCC_MSK       0x01
107 #define TWIN_TMR1_MSK      0x02
108 #define TWIN_TMR2_MSK      0x04
109 #define TWIN_INT_MSK       0x07
110
111 /* SERIAL_CFG */
112 #define TWIN_DTRA_ON       0x01
113 #define TWIN_DTRB_ON       0x02
114 #define TWIN_EXTCLKA       0x04
115 #define TWIN_EXTCLKB       0x08
116 #define TWIN_LOOPA_ON      0x10
117 #define TWIN_LOOPB_ON      0x20
118 #define TWIN_EI            0x80
119
120 /* DMA_CFG */
121 #define TWIN_DMA_HDX_T1    0x08
122 #define TWIN_DMA_HDX_R1    0x0a
123 #define TWIN_DMA_HDX_T3    0x14
124 #define TWIN_DMA_HDX_R3    0x16
125 #define TWIN_DMA_FDX_T3R1  0x1b
126 #define TWIN_DMA_FDX_T1R3  0x1d
127
128
129 /* Status values */
130
131 #define IDLE      0
132 #define TX_HEAD   1
133 #define TX_DATA   2
134 #define TX_PAUSE  3
135 #define TX_TAIL   4
136 #define RTS_OFF   5
137 #define WAIT      6
138 #define DCD_ON    7
139 #define RX_ON     8
140 #define DCD_OFF   9
141
142
143 /* Ioctls */
144
145 #define SIOCGSCCPARAM SIOCDEVPRIVATE
146 #define SIOCSSCCPARAM (SIOCDEVPRIVATE+1)
147
148
149 /* Data types */
150
151 struct scc_param {
152         int pclk_hz;            /* frequency of BRG input (don't change) */
153         int brg_tc;             /* BRG terminal count; BRG disabled if < 0 */
154         int nrzi;               /* 0 (nrz), 1 (nrzi) */
155         int clocks;             /* see dmascc_cfg documentation */
156         int txdelay;            /* [1/TMR_0_HZ] */
157         int txtimeout;          /* [1/HZ] */
158         int txtail;             /* [1/TMR_0_HZ] */
159         int waittime;           /* [1/TMR_0_HZ] */
160         int slottime;           /* [1/TMR_0_HZ] */
161         int persist;            /* 1 ... 256 */
162         int dma;                /* -1 (disable), 0, 1, 3 */
163         int txpause;            /* [1/TMR_0_HZ] */
164         int rtsoff;             /* [1/TMR_0_HZ] */
165         int dcdon;              /* [1/TMR_0_HZ] */
166         int dcdoff;             /* [1/TMR_0_HZ] */
167 };
168
169 struct scc_hardware {
170         char *name;
171         int io_region;
172         int io_delta;
173         int io_size;
174         int num_devs;
175         int scc_offset;
176         int tmr_offset;
177         int tmr_hz;
178         int pclk_hz;
179 };
180
181 struct scc_priv {
182         int type;
183         int chip;
184         struct net_device *dev;
185         struct scc_info *info;
186
187         int channel;
188         int card_base, scc_cmd, scc_data;
189         int tmr_cnt, tmr_ctrl, tmr_mode;
190         struct scc_param param;
191         char rx_buf[NUM_RX_BUF][BUF_SIZE];
192         int rx_len[NUM_RX_BUF];
193         int rx_ptr;
194         struct work_struct rx_work;
195         int rx_head, rx_tail, rx_count;
196         int rx_over;
197         char tx_buf[NUM_TX_BUF][BUF_SIZE];
198         int tx_len[NUM_TX_BUF];
199         int tx_ptr;
200         int tx_head, tx_tail, tx_count;
201         int state;
202         unsigned long tx_start;
203         int rr0;
204         spinlock_t *register_lock;      /* Per scc_info */
205         spinlock_t ring_lock;
206 };
207
208 struct scc_info {
209         int irq_used;
210         int twin_serial_cfg;
211         struct net_device *dev[2];
212         struct scc_priv priv[2];
213         struct scc_info *next;
214         spinlock_t register_lock;       /* Per device register lock */
215 };
216
217
218 /* Function declarations */
219 static int setup_adapter(int card_base, int type, int n) __init;
220
221 static void write_scc(struct scc_priv *priv, int reg, int val);
222 static void write_scc_data(struct scc_priv *priv, int val, int fast);
223 static int read_scc(struct scc_priv *priv, int reg);
224 static int read_scc_data(struct scc_priv *priv);
225
226 static int scc_open(struct net_device *dev);
227 static int scc_close(struct net_device *dev);
228 static int scc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
229 static int scc_send_packet(struct sk_buff *skb, struct net_device *dev);
230 static int scc_set_mac_address(struct net_device *dev, void *sa);
231
232 static inline void tx_on(struct scc_priv *priv);
233 static inline void rx_on(struct scc_priv *priv);
234 static inline void rx_off(struct scc_priv *priv);
235 static void start_timer(struct scc_priv *priv, int t, int r15);
236 static inline unsigned char random(void);
237
238 static inline void z8530_isr(struct scc_info *info);
239 static irqreturn_t scc_isr(int irq, void *dev_id);
240 static void rx_isr(struct scc_priv *priv);
241 static void special_condition(struct scc_priv *priv, int rc);
242 static void rx_bh(struct work_struct *);
243 static void tx_isr(struct scc_priv *priv);
244 static void es_isr(struct scc_priv *priv);
245 static void tm_isr(struct scc_priv *priv);
246
247
248 /* Initialization variables */
249
250 static int io[MAX_NUM_DEVS] __initdata = { 0, };
251
252 /* Beware! hw[] is also used in dmascc_exit(). */
253 static struct scc_hardware hw[NUM_TYPES] = HARDWARE;
254
255
256 /* Global variables */
257
258 static struct scc_info *first;
259 static unsigned long rand;
260
261
262 MODULE_AUTHOR("Klaus Kudielka");
263 MODULE_DESCRIPTION("Driver for high-speed SCC boards");
264 module_param_hw_array(io, int, ioport, NULL, 0);
265 MODULE_LICENSE("GPL");
266
267 static void __exit dmascc_exit(void)
268 {
269         int i;
270         struct scc_info *info;
271
272         while (first) {
273                 info = first;
274
275                 /* Unregister devices */
276                 for (i = 0; i < 2; i++)
277                         unregister_netdev(info->dev[i]);
278
279                 /* Reset board */
280                 if (info->priv[0].type == TYPE_TWIN)
281                         outb(0, info->dev[0]->base_addr + TWIN_SERIAL_CFG);
282                 write_scc(&info->priv[0], R9, FHWRES);
283                 release_region(info->dev[0]->base_addr,
284                                hw[info->priv[0].type].io_size);
285
286                 for (i = 0; i < 2; i++)
287                         free_netdev(info->dev[i]);
288
289                 /* Free memory */
290                 first = info->next;
291                 kfree(info);
292         }
293 }
294
295 static int __init dmascc_init(void)
296 {
297         int h, i, j, n;
298         int base[MAX_NUM_DEVS], tcmd[MAX_NUM_DEVS], t0[MAX_NUM_DEVS],
299             t1[MAX_NUM_DEVS];
300         unsigned t_val;
301         unsigned long time, start[MAX_NUM_DEVS], delay[MAX_NUM_DEVS],
302             counting[MAX_NUM_DEVS];
303
304         /* Initialize random number generator */
305         rand = jiffies;
306         /* Cards found = 0 */
307         n = 0;
308         /* Warning message */
309         if (!io[0])
310                 printk(KERN_INFO "dmascc: autoprobing (dangerous)\n");
311
312         /* Run autodetection for each card type */
313         for (h = 0; h < NUM_TYPES; h++) {
314
315                 if (io[0]) {
316                         /* User-specified I/O address regions */
317                         for (i = 0; i < hw[h].num_devs; i++)
318                                 base[i] = 0;
319                         for (i = 0; i < MAX_NUM_DEVS && io[i]; i++) {
320                                 j = (io[i] -
321                                      hw[h].io_region) / hw[h].io_delta;
322                                 if (j >= 0 && j < hw[h].num_devs &&
323                                     hw[h].io_region +
324                                     j * hw[h].io_delta == io[i]) {
325                                         base[j] = io[i];
326                                 }
327                         }
328                 } else {
329                         /* Default I/O address regions */
330                         for (i = 0; i < hw[h].num_devs; i++) {
331                                 base[i] =
332                                     hw[h].io_region + i * hw[h].io_delta;
333                         }
334                 }
335
336                 /* Check valid I/O address regions */
337                 for (i = 0; i < hw[h].num_devs; i++)
338                         if (base[i]) {
339                                 if (!request_region
340                                     (base[i], hw[h].io_size, "dmascc"))
341                                         base[i] = 0;
342                                 else {
343                                         tcmd[i] =
344                                             base[i] + hw[h].tmr_offset +
345                                             TMR_CTRL;
346                                         t0[i] =
347                                             base[i] + hw[h].tmr_offset +
348                                             TMR_CNT0;
349                                         t1[i] =
350                                             base[i] + hw[h].tmr_offset +
351                                             TMR_CNT1;
352                                 }
353                         }
354
355                 /* Start timers */
356                 for (i = 0; i < hw[h].num_devs; i++)
357                         if (base[i]) {
358                                 /* Timer 0: LSB+MSB, Mode 3, TMR_0_HZ */
359                                 outb(0x36, tcmd[i]);
360                                 outb((hw[h].tmr_hz / TMR_0_HZ) & 0xFF,
361                                      t0[i]);
362                                 outb((hw[h].tmr_hz / TMR_0_HZ) >> 8,
363                                      t0[i]);
364                                 /* Timer 1: LSB+MSB, Mode 0, HZ/10 */
365                                 outb(0x70, tcmd[i]);
366                                 outb((TMR_0_HZ / HZ * 10) & 0xFF, t1[i]);
367                                 outb((TMR_0_HZ / HZ * 10) >> 8, t1[i]);
368                                 start[i] = jiffies;
369                                 delay[i] = 0;
370                                 counting[i] = 1;
371                                 /* Timer 2: LSB+MSB, Mode 0 */
372                                 outb(0xb0, tcmd[i]);
373                         }
374                 time = jiffies;
375                 /* Wait until counter registers are loaded */
376                 udelay(2000000 / TMR_0_HZ);
377
378                 /* Timing loop */
379                 while (jiffies - time < 13) {
380                         for (i = 0; i < hw[h].num_devs; i++)
381                                 if (base[i] && counting[i]) {
382                                         /* Read back Timer 1: latch; read LSB; read MSB */
383                                         outb(0x40, tcmd[i]);
384                                         t_val =
385                                             inb(t1[i]) + (inb(t1[i]) << 8);
386                                         /* Also check whether counter did wrap */
387                                         if (t_val == 0 ||
388                                             t_val > TMR_0_HZ / HZ * 10)
389                                                 counting[i] = 0;
390                                         delay[i] = jiffies - start[i];
391                                 }
392                 }
393
394                 /* Evaluate measurements */
395                 for (i = 0; i < hw[h].num_devs; i++)
396                         if (base[i]) {
397                                 if ((delay[i] >= 9 && delay[i] <= 11) &&
398                                     /* Ok, we have found an adapter */
399                                     (setup_adapter(base[i], h, n) == 0))
400                                         n++;
401                                 else
402                                         release_region(base[i],
403                                                        hw[h].io_size);
404                         }
405
406         }                       /* NUM_TYPES */
407
408         /* If any adapter was successfully initialized, return ok */
409         if (n)
410                 return 0;
411
412         /* If no adapter found, return error */
413         printk(KERN_INFO "dmascc: no adapters found\n");
414         return -EIO;
415 }
416
417 module_init(dmascc_init);
418 module_exit(dmascc_exit);
419
420 static void __init dev_setup(struct net_device *dev)
421 {
422         dev->type = ARPHRD_AX25;
423         dev->hard_header_len = AX25_MAX_HEADER_LEN;
424         dev->mtu = 1500;
425         dev->addr_len = AX25_ADDR_LEN;
426         dev->tx_queue_len = 64;
427         memcpy(dev->broadcast, &ax25_bcast, AX25_ADDR_LEN);
428         memcpy(dev->dev_addr, &ax25_defaddr, AX25_ADDR_LEN);
429 }
430
431 static const struct net_device_ops scc_netdev_ops = {
432         .ndo_open = scc_open,
433         .ndo_stop = scc_close,
434         .ndo_start_xmit = scc_send_packet,
435         .ndo_do_ioctl = scc_ioctl,
436         .ndo_set_mac_address = scc_set_mac_address,
437 };
438
439 static int __init setup_adapter(int card_base, int type, int n)
440 {
441         int i, irq, chip, err;
442         struct scc_info *info;
443         struct net_device *dev;
444         struct scc_priv *priv;
445         unsigned long time;
446         unsigned int irqs;
447         int tmr_base = card_base + hw[type].tmr_offset;
448         int scc_base = card_base + hw[type].scc_offset;
449         char *chipnames[] = CHIPNAMES;
450
451         /* Initialize what is necessary for write_scc and write_scc_data */
452         info = kzalloc(sizeof(struct scc_info), GFP_KERNEL | GFP_DMA);
453         if (!info) {
454                 err = -ENOMEM;
455                 goto out;
456         }
457
458         info->dev[0] = alloc_netdev(0, "", NET_NAME_UNKNOWN, dev_setup);
459         if (!info->dev[0]) {
460                 printk(KERN_ERR "dmascc: "
461                        "could not allocate memory for %s at %#3x\n",
462                        hw[type].name, card_base);
463                 err = -ENOMEM;
464                 goto out1;
465         }
466
467         info->dev[1] = alloc_netdev(0, "", NET_NAME_UNKNOWN, dev_setup);
468         if (!info->dev[1]) {
469                 printk(KERN_ERR "dmascc: "
470                        "could not allocate memory for %s at %#3x\n",
471                        hw[type].name, card_base);
472                 err = -ENOMEM;
473                 goto out2;
474         }
475         spin_lock_init(&info->register_lock);
476
477         priv = &info->priv[0];
478         priv->type = type;
479         priv->card_base = card_base;
480         priv->scc_cmd = scc_base + SCCA_CMD;
481         priv->scc_data = scc_base + SCCA_DATA;
482         priv->register_lock = &info->register_lock;
483
484         /* Reset SCC */
485         write_scc(priv, R9, FHWRES | MIE | NV);
486
487         /* Determine type of chip by enabling SDLC/HDLC enhancements */
488         write_scc(priv, R15, SHDLCE);
489         if (!read_scc(priv, R15)) {
490                 /* WR7' not present. This is an ordinary Z8530 SCC. */
491                 chip = Z8530;
492         } else {
493                 /* Put one character in TX FIFO */
494                 write_scc_data(priv, 0, 0);
495                 if (read_scc(priv, R0) & Tx_BUF_EMP) {
496                         /* TX FIFO not full. This is a Z85230 ESCC with a 4-byte FIFO. */
497                         chip = Z85230;
498                 } else {
499                         /* TX FIFO full. This is a Z85C30 SCC with a 1-byte FIFO. */
500                         chip = Z85C30;
501                 }
502         }
503         write_scc(priv, R15, 0);
504
505         /* Start IRQ auto-detection */
506         irqs = probe_irq_on();
507
508         /* Enable interrupts */
509         if (type == TYPE_TWIN) {
510                 outb(0, card_base + TWIN_DMA_CFG);
511                 inb(card_base + TWIN_CLR_TMR1);
512                 inb(card_base + TWIN_CLR_TMR2);
513                 info->twin_serial_cfg = TWIN_EI;
514                 outb(info->twin_serial_cfg, card_base + TWIN_SERIAL_CFG);
515         } else {
516                 write_scc(priv, R15, CTSIE);
517                 write_scc(priv, R0, RES_EXT_INT);
518                 write_scc(priv, R1, EXT_INT_ENAB);
519         }
520
521         /* Start timer */
522         outb(1, tmr_base + TMR_CNT1);
523         outb(0, tmr_base + TMR_CNT1);
524
525         /* Wait and detect IRQ */
526         time = jiffies;
527         while (jiffies - time < 2 + HZ / TMR_0_HZ);
528         irq = probe_irq_off(irqs);
529
530         /* Clear pending interrupt, disable interrupts */
531         if (type == TYPE_TWIN) {
532                 inb(card_base + TWIN_CLR_TMR1);
533         } else {
534                 write_scc(priv, R1, 0);
535                 write_scc(priv, R15, 0);
536                 write_scc(priv, R0, RES_EXT_INT);
537         }
538
539         if (irq <= 0) {
540                 printk(KERN_ERR
541                        "dmascc: could not find irq of %s at %#3x (irq=%d)\n",
542                        hw[type].name, card_base, irq);
543                 err = -ENODEV;
544                 goto out3;
545         }
546
547         /* Set up data structures */
548         for (i = 0; i < 2; i++) {
549                 dev = info->dev[i];
550                 priv = &info->priv[i];
551                 priv->type = type;
552                 priv->chip = chip;
553                 priv->dev = dev;
554                 priv->info = info;
555                 priv->channel = i;
556                 spin_lock_init(&priv->ring_lock);
557                 priv->register_lock = &info->register_lock;
558                 priv->card_base = card_base;
559                 priv->scc_cmd = scc_base + (i ? SCCB_CMD : SCCA_CMD);
560                 priv->scc_data = scc_base + (i ? SCCB_DATA : SCCA_DATA);
561                 priv->tmr_cnt = tmr_base + (i ? TMR_CNT2 : TMR_CNT1);
562                 priv->tmr_ctrl = tmr_base + TMR_CTRL;
563                 priv->tmr_mode = i ? 0xb0 : 0x70;
564                 priv->param.pclk_hz = hw[type].pclk_hz;
565                 priv->param.brg_tc = -1;
566                 priv->param.clocks = TCTRxCP | RCRTxCP;
567                 priv->param.persist = 256;
568                 priv->param.dma = -1;
569                 INIT_WORK(&priv->rx_work, rx_bh);
570                 dev->ml_priv = priv;
571                 snprintf(dev->name, sizeof(dev->name), "dmascc%i", 2 * n + i);
572                 dev->base_addr = card_base;
573                 dev->irq = irq;
574                 dev->netdev_ops = &scc_netdev_ops;
575                 dev->header_ops = &ax25_header_ops;
576         }
577         if (register_netdev(info->dev[0])) {
578                 printk(KERN_ERR "dmascc: could not register %s\n",
579                        info->dev[0]->name);
580                 err = -ENODEV;
581                 goto out3;
582         }
583         if (register_netdev(info->dev[1])) {
584                 printk(KERN_ERR "dmascc: could not register %s\n",
585                        info->dev[1]->name);
586                 err = -ENODEV;
587                 goto out4;
588         }
589
590
591         info->next = first;
592         first = info;
593         printk(KERN_INFO "dmascc: found %s (%s) at %#3x, irq %d\n",
594                hw[type].name, chipnames[chip], card_base, irq);
595         return 0;
596
597       out4:
598         unregister_netdev(info->dev[0]);
599       out3:
600         if (info->priv[0].type == TYPE_TWIN)
601                 outb(0, info->dev[0]->base_addr + TWIN_SERIAL_CFG);
602         write_scc(&info->priv[0], R9, FHWRES);
603         free_netdev(info->dev[1]);
604       out2:
605         free_netdev(info->dev[0]);
606       out1:
607         kfree(info);
608       out:
609         return err;
610 }
611
612
613 /* Driver functions */
614
615 static void write_scc(struct scc_priv *priv, int reg, int val)
616 {
617         unsigned long flags;
618         switch (priv->type) {
619         case TYPE_S5:
620                 if (reg)
621                         outb(reg, priv->scc_cmd);
622                 outb(val, priv->scc_cmd);
623                 return;
624         case TYPE_TWIN:
625                 if (reg)
626                         outb_p(reg, priv->scc_cmd);
627                 outb_p(val, priv->scc_cmd);
628                 return;
629         default:
630                 spin_lock_irqsave(priv->register_lock, flags);
631                 outb_p(0, priv->card_base + PI_DREQ_MASK);
632                 if (reg)
633                         outb_p(reg, priv->scc_cmd);
634                 outb_p(val, priv->scc_cmd);
635                 outb(1, priv->card_base + PI_DREQ_MASK);
636                 spin_unlock_irqrestore(priv->register_lock, flags);
637                 return;
638         }
639 }
640
641
642 static void write_scc_data(struct scc_priv *priv, int val, int fast)
643 {
644         unsigned long flags;
645         switch (priv->type) {
646         case TYPE_S5:
647                 outb(val, priv->scc_data);
648                 return;
649         case TYPE_TWIN:
650                 outb_p(val, priv->scc_data);
651                 return;
652         default:
653                 if (fast)
654                         outb_p(val, priv->scc_data);
655                 else {
656                         spin_lock_irqsave(priv->register_lock, flags);
657                         outb_p(0, priv->card_base + PI_DREQ_MASK);
658                         outb_p(val, priv->scc_data);
659                         outb(1, priv->card_base + PI_DREQ_MASK);
660                         spin_unlock_irqrestore(priv->register_lock, flags);
661                 }
662                 return;
663         }
664 }
665
666
667 static int read_scc(struct scc_priv *priv, int reg)
668 {
669         int rc;
670         unsigned long flags;
671         switch (priv->type) {
672         case TYPE_S5:
673                 if (reg)
674                         outb(reg, priv->scc_cmd);
675                 return inb(priv->scc_cmd);
676         case TYPE_TWIN:
677                 if (reg)
678                         outb_p(reg, priv->scc_cmd);
679                 return inb_p(priv->scc_cmd);
680         default:
681                 spin_lock_irqsave(priv->register_lock, flags);
682                 outb_p(0, priv->card_base + PI_DREQ_MASK);
683                 if (reg)
684                         outb_p(reg, priv->scc_cmd);
685                 rc = inb_p(priv->scc_cmd);
686                 outb(1, priv->card_base + PI_DREQ_MASK);
687                 spin_unlock_irqrestore(priv->register_lock, flags);
688                 return rc;
689         }
690 }
691
692
693 static int read_scc_data(struct scc_priv *priv)
694 {
695         int rc;
696         unsigned long flags;
697         switch (priv->type) {
698         case TYPE_S5:
699                 return inb(priv->scc_data);
700         case TYPE_TWIN:
701                 return inb_p(priv->scc_data);
702         default:
703                 spin_lock_irqsave(priv->register_lock, flags);
704                 outb_p(0, priv->card_base + PI_DREQ_MASK);
705                 rc = inb_p(priv->scc_data);
706                 outb(1, priv->card_base + PI_DREQ_MASK);
707                 spin_unlock_irqrestore(priv->register_lock, flags);
708                 return rc;
709         }
710 }
711
712
713 static int scc_open(struct net_device *dev)
714 {
715         struct scc_priv *priv = dev->ml_priv;
716         struct scc_info *info = priv->info;
717         int card_base = priv->card_base;
718
719         /* Request IRQ if not already used by other channel */
720         if (!info->irq_used) {
721                 if (request_irq(dev->irq, scc_isr, 0, "dmascc", info)) {
722                         return -EAGAIN;
723                 }
724         }
725         info->irq_used++;
726
727         /* Request DMA if required */
728         if (priv->param.dma >= 0) {
729                 if (request_dma(priv->param.dma, "dmascc")) {
730                         if (--info->irq_used == 0)
731                                 free_irq(dev->irq, info);
732                         return -EAGAIN;
733                 } else {
734                         unsigned long flags = claim_dma_lock();
735                         clear_dma_ff(priv->param.dma);
736                         release_dma_lock(flags);
737                 }
738         }
739
740         /* Initialize local variables */
741         priv->rx_ptr = 0;
742         priv->rx_over = 0;
743         priv->rx_head = priv->rx_tail = priv->rx_count = 0;
744         priv->state = IDLE;
745         priv->tx_head = priv->tx_tail = priv->tx_count = 0;
746         priv->tx_ptr = 0;
747
748         /* Reset channel */
749         write_scc(priv, R9, (priv->channel ? CHRB : CHRA) | MIE | NV);
750         /* X1 clock, SDLC mode */
751         write_scc(priv, R4, SDLC | X1CLK);
752         /* DMA */
753         write_scc(priv, R1, EXT_INT_ENAB | WT_FN_RDYFN);
754         /* 8 bit RX char, RX disable */
755         write_scc(priv, R3, Rx8);
756         /* 8 bit TX char, TX disable */
757         write_scc(priv, R5, Tx8);
758         /* SDLC address field */
759         write_scc(priv, R6, 0);
760         /* SDLC flag */
761         write_scc(priv, R7, FLAG);
762         switch (priv->chip) {
763         case Z85C30:
764                 /* Select WR7' */
765                 write_scc(priv, R15, SHDLCE);
766                 /* Auto EOM reset */
767                 write_scc(priv, R7, AUTOEOM);
768                 write_scc(priv, R15, 0);
769                 break;
770         case Z85230:
771                 /* Select WR7' */
772                 write_scc(priv, R15, SHDLCE);
773                 /* The following bits are set (see 2.5.2.1):
774                    - Automatic EOM reset
775                    - Interrupt request if RX FIFO is half full
776                    This bit should be ignored in DMA mode (according to the
777                    documentation), but actually isn't. The receiver doesn't work if
778                    it is set. Thus, we have to clear it in DMA mode.
779                    - Interrupt/DMA request if TX FIFO is completely empty
780                    a) If set, the ESCC behaves as if it had no TX FIFO (Z85C30
781                    compatibility).
782                    b) If cleared, DMA requests may follow each other very quickly,
783                    filling up the TX FIFO.
784                    Advantage: TX works even in case of high bus latency.
785                    Disadvantage: Edge-triggered DMA request circuitry may miss
786                    a request. No more data is delivered, resulting
787                    in a TX FIFO underrun.
788                    Both PI2 and S5SCC/DMA seem to work fine with TXFIFOE cleared.
789                    The PackeTwin doesn't. I don't know about the PI, but let's
790                    assume it behaves like the PI2.
791                  */
792                 if (priv->param.dma >= 0) {
793                         if (priv->type == TYPE_TWIN)
794                                 write_scc(priv, R7, AUTOEOM | TXFIFOE);
795                         else
796                                 write_scc(priv, R7, AUTOEOM);
797                 } else {
798                         write_scc(priv, R7, AUTOEOM | RXFIFOH);
799                 }
800                 write_scc(priv, R15, 0);
801                 break;
802         }
803         /* Preset CRC, NRZ(I) encoding */
804         write_scc(priv, R10, CRCPS | (priv->param.nrzi ? NRZI : NRZ));
805
806         /* Configure baud rate generator */
807         if (priv->param.brg_tc >= 0) {
808                 /* Program BR generator */
809                 write_scc(priv, R12, priv->param.brg_tc & 0xFF);
810                 write_scc(priv, R13, (priv->param.brg_tc >> 8) & 0xFF);
811                 /* BRG source = SYS CLK; enable BRG; DTR REQ function (required by
812                    PackeTwin, not connected on the PI2); set DPLL source to BRG */
813                 write_scc(priv, R14, SSBR | DTRREQ | BRSRC | BRENABL);
814                 /* Enable DPLL */
815                 write_scc(priv, R14, SEARCH | DTRREQ | BRSRC | BRENABL);
816         } else {
817                 /* Disable BR generator */
818                 write_scc(priv, R14, DTRREQ | BRSRC);
819         }
820
821         /* Configure clocks */
822         if (priv->type == TYPE_TWIN) {
823                 /* Disable external TX clock receiver */
824                 outb((info->twin_serial_cfg &=
825                       ~(priv->channel ? TWIN_EXTCLKB : TWIN_EXTCLKA)),
826                      card_base + TWIN_SERIAL_CFG);
827         }
828         write_scc(priv, R11, priv->param.clocks);
829         if ((priv->type == TYPE_TWIN) && !(priv->param.clocks & TRxCOI)) {
830                 /* Enable external TX clock receiver */
831                 outb((info->twin_serial_cfg |=
832                       (priv->channel ? TWIN_EXTCLKB : TWIN_EXTCLKA)),
833                      card_base + TWIN_SERIAL_CFG);
834         }
835
836         /* Configure PackeTwin */
837         if (priv->type == TYPE_TWIN) {
838                 /* Assert DTR, enable interrupts */
839                 outb((info->twin_serial_cfg |= TWIN_EI |
840                       (priv->channel ? TWIN_DTRB_ON : TWIN_DTRA_ON)),
841                      card_base + TWIN_SERIAL_CFG);
842         }
843
844         /* Read current status */
845         priv->rr0 = read_scc(priv, R0);
846         /* Enable DCD interrupt */
847         write_scc(priv, R15, DCDIE);
848
849         netif_start_queue(dev);
850
851         return 0;
852 }
853
854
855 static int scc_close(struct net_device *dev)
856 {
857         struct scc_priv *priv = dev->ml_priv;
858         struct scc_info *info = priv->info;
859         int card_base = priv->card_base;
860
861         netif_stop_queue(dev);
862
863         if (priv->type == TYPE_TWIN) {
864                 /* Drop DTR */
865                 outb((info->twin_serial_cfg &=
866                       (priv->channel ? ~TWIN_DTRB_ON : ~TWIN_DTRA_ON)),
867                      card_base + TWIN_SERIAL_CFG);
868         }
869
870         /* Reset channel, free DMA and IRQ */
871         write_scc(priv, R9, (priv->channel ? CHRB : CHRA) | MIE | NV);
872         if (priv->param.dma >= 0) {
873                 if (priv->type == TYPE_TWIN)
874                         outb(0, card_base + TWIN_DMA_CFG);
875                 free_dma(priv->param.dma);
876         }
877         if (--info->irq_used == 0)
878                 free_irq(dev->irq, info);
879
880         return 0;
881 }
882
883
884 static int scc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
885 {
886         struct scc_priv *priv = dev->ml_priv;
887
888         switch (cmd) {
889         case SIOCGSCCPARAM:
890                 if (copy_to_user
891                     (ifr->ifr_data, &priv->param,
892                      sizeof(struct scc_param)))
893                         return -EFAULT;
894                 return 0;
895         case SIOCSSCCPARAM:
896                 if (!capable(CAP_NET_ADMIN))
897                         return -EPERM;
898                 if (netif_running(dev))
899                         return -EAGAIN;
900                 if (copy_from_user
901                     (&priv->param, ifr->ifr_data,
902                      sizeof(struct scc_param)))
903                         return -EFAULT;
904                 return 0;
905         default:
906                 return -EINVAL;
907         }
908 }
909
910
911 static int scc_send_packet(struct sk_buff *skb, struct net_device *dev)
912 {
913         struct scc_priv *priv = dev->ml_priv;
914         unsigned long flags;
915         int i;
916
917         if (skb->protocol == htons(ETH_P_IP))
918                 return ax25_ip_xmit(skb);
919
920         /* Temporarily stop the scheduler feeding us packets */
921         netif_stop_queue(dev);
922
923         /* Transfer data to DMA buffer */
924         i = priv->tx_head;
925         skb_copy_from_linear_data_offset(skb, 1, priv->tx_buf[i], skb->len - 1);
926         priv->tx_len[i] = skb->len - 1;
927
928         /* Clear interrupts while we touch our circular buffers */
929
930         spin_lock_irqsave(&priv->ring_lock, flags);
931         /* Move the ring buffer's head */
932         priv->tx_head = (i + 1) % NUM_TX_BUF;
933         priv->tx_count++;
934
935         /* If we just filled up the last buffer, leave queue stopped.
936            The higher layers must wait until we have a DMA buffer
937            to accept the data. */
938         if (priv->tx_count < NUM_TX_BUF)
939                 netif_wake_queue(dev);
940
941         /* Set new TX state */
942         if (priv->state == IDLE) {
943                 /* Assert RTS, start timer */
944                 priv->state = TX_HEAD;
945                 priv->tx_start = jiffies;
946                 write_scc(priv, R5, TxCRC_ENAB | RTS | TxENAB | Tx8);
947                 write_scc(priv, R15, 0);
948                 start_timer(priv, priv->param.txdelay, 0);
949         }
950
951         /* Turn interrupts back on and free buffer */
952         spin_unlock_irqrestore(&priv->ring_lock, flags);
953         dev_kfree_skb(skb);
954
955         return NETDEV_TX_OK;
956 }
957
958
959 static int scc_set_mac_address(struct net_device *dev, void *sa)
960 {
961         memcpy(dev->dev_addr, ((struct sockaddr *) sa)->sa_data,
962                dev->addr_len);
963         return 0;
964 }
965
966
967 static inline void tx_on(struct scc_priv *priv)
968 {
969         int i, n;
970         unsigned long flags;
971
972         if (priv->param.dma >= 0) {
973                 n = (priv->chip == Z85230) ? 3 : 1;
974                 /* Program DMA controller */
975                 flags = claim_dma_lock();
976                 set_dma_mode(priv->param.dma, DMA_MODE_WRITE);
977                 set_dma_addr(priv->param.dma,
978                              (int) priv->tx_buf[priv->tx_tail] + n);
979                 set_dma_count(priv->param.dma,
980                               priv->tx_len[priv->tx_tail] - n);
981                 release_dma_lock(flags);
982                 /* Enable TX underrun interrupt */
983                 write_scc(priv, R15, TxUIE);
984                 /* Configure DREQ */
985                 if (priv->type == TYPE_TWIN)
986                         outb((priv->param.dma ==
987                               1) ? TWIN_DMA_HDX_T1 : TWIN_DMA_HDX_T3,
988                              priv->card_base + TWIN_DMA_CFG);
989                 else
990                         write_scc(priv, R1,
991                                   EXT_INT_ENAB | WT_FN_RDYFN |
992                                   WT_RDY_ENAB);
993                 /* Write first byte(s) */
994                 spin_lock_irqsave(priv->register_lock, flags);
995                 for (i = 0; i < n; i++)
996                         write_scc_data(priv,
997                                        priv->tx_buf[priv->tx_tail][i], 1);
998                 enable_dma(priv->param.dma);
999                 spin_unlock_irqrestore(priv->register_lock, flags);
1000         } else {
1001                 write_scc(priv, R15, TxUIE);
1002                 write_scc(priv, R1,
1003                           EXT_INT_ENAB | WT_FN_RDYFN | TxINT_ENAB);
1004                 tx_isr(priv);
1005         }
1006         /* Reset EOM latch if we do not have the AUTOEOM feature */
1007         if (priv->chip == Z8530)
1008                 write_scc(priv, R0, RES_EOM_L);
1009 }
1010
1011
1012 static inline void rx_on(struct scc_priv *priv)
1013 {
1014         unsigned long flags;
1015
1016         /* Clear RX FIFO */
1017         while (read_scc(priv, R0) & Rx_CH_AV)
1018                 read_scc_data(priv);
1019         priv->rx_over = 0;
1020         if (priv->param.dma >= 0) {
1021                 /* Program DMA controller */
1022                 flags = claim_dma_lock();
1023                 set_dma_mode(priv->param.dma, DMA_MODE_READ);
1024                 set_dma_addr(priv->param.dma,
1025                              (int) priv->rx_buf[priv->rx_head]);
1026                 set_dma_count(priv->param.dma, BUF_SIZE);
1027                 release_dma_lock(flags);
1028                 enable_dma(priv->param.dma);
1029                 /* Configure PackeTwin DMA */
1030                 if (priv->type == TYPE_TWIN) {
1031                         outb((priv->param.dma ==
1032                               1) ? TWIN_DMA_HDX_R1 : TWIN_DMA_HDX_R3,
1033                              priv->card_base + TWIN_DMA_CFG);
1034                 }
1035                 /* Sp. cond. intr. only, ext int enable, RX DMA enable */
1036                 write_scc(priv, R1, EXT_INT_ENAB | INT_ERR_Rx |
1037                           WT_RDY_RT | WT_FN_RDYFN | WT_RDY_ENAB);
1038         } else {
1039                 /* Reset current frame */
1040                 priv->rx_ptr = 0;
1041                 /* Intr. on all Rx characters and Sp. cond., ext int enable */
1042                 write_scc(priv, R1, EXT_INT_ENAB | INT_ALL_Rx | WT_RDY_RT |
1043                           WT_FN_RDYFN);
1044         }
1045         write_scc(priv, R0, ERR_RES);
1046         write_scc(priv, R3, RxENABLE | Rx8 | RxCRC_ENAB);
1047 }
1048
1049
1050 static inline void rx_off(struct scc_priv *priv)
1051 {
1052         /* Disable receiver */
1053         write_scc(priv, R3, Rx8);
1054         /* Disable DREQ / RX interrupt */
1055         if (priv->param.dma >= 0 && priv->type == TYPE_TWIN)
1056                 outb(0, priv->card_base + TWIN_DMA_CFG);
1057         else
1058                 write_scc(priv, R1, EXT_INT_ENAB | WT_FN_RDYFN);
1059         /* Disable DMA */
1060         if (priv->param.dma >= 0)
1061                 disable_dma(priv->param.dma);
1062 }
1063
1064
1065 static void start_timer(struct scc_priv *priv, int t, int r15)
1066 {
1067         outb(priv->tmr_mode, priv->tmr_ctrl);
1068         if (t == 0) {
1069                 tm_isr(priv);
1070         } else if (t > 0) {
1071                 outb(t & 0xFF, priv->tmr_cnt);
1072                 outb((t >> 8) & 0xFF, priv->tmr_cnt);
1073                 if (priv->type != TYPE_TWIN) {
1074                         write_scc(priv, R15, r15 | CTSIE);
1075                         priv->rr0 |= CTS;
1076                 }
1077         }
1078 }
1079
1080
1081 static inline unsigned char random(void)
1082 {
1083         /* See "Numerical Recipes in C", second edition, p. 284 */
1084         rand = rand * 1664525L + 1013904223L;
1085         return (unsigned char) (rand >> 24);
1086 }
1087
1088 static inline void z8530_isr(struct scc_info *info)
1089 {
1090         int is, i = 100;
1091
1092         while ((is = read_scc(&info->priv[0], R3)) && i--) {
1093                 if (is & CHARxIP) {
1094                         rx_isr(&info->priv[0]);
1095                 } else if (is & CHATxIP) {
1096                         tx_isr(&info->priv[0]);
1097                 } else if (is & CHAEXT) {
1098                         es_isr(&info->priv[0]);
1099                 } else if (is & CHBRxIP) {
1100                         rx_isr(&info->priv[1]);
1101                 } else if (is & CHBTxIP) {
1102                         tx_isr(&info->priv[1]);
1103                 } else {
1104                         es_isr(&info->priv[1]);
1105                 }
1106                 write_scc(&info->priv[0], R0, RES_H_IUS);
1107                 i++;
1108         }
1109         if (i < 0) {
1110                 printk(KERN_ERR "dmascc: stuck in ISR with RR3=0x%02x.\n",
1111                        is);
1112         }
1113         /* Ok, no interrupts pending from this 8530. The INT line should
1114            be inactive now. */
1115 }
1116
1117
1118 static irqreturn_t scc_isr(int irq, void *dev_id)
1119 {
1120         struct scc_info *info = dev_id;
1121
1122         spin_lock(info->priv[0].register_lock);
1123         /* At this point interrupts are enabled, and the interrupt under service
1124            is already acknowledged, but masked off.
1125
1126            Interrupt processing: We loop until we know that the IRQ line is
1127            low. If another positive edge occurs afterwards during the ISR,
1128            another interrupt will be triggered by the interrupt controller
1129            as soon as the IRQ level is enabled again (see asm/irq.h).
1130
1131            Bottom-half handlers will be processed after scc_isr(). This is
1132            important, since we only have small ringbuffers and want new data
1133            to be fetched/delivered immediately. */
1134
1135         if (info->priv[0].type == TYPE_TWIN) {
1136                 int is, card_base = info->priv[0].card_base;
1137                 while ((is = ~inb(card_base + TWIN_INT_REG)) &
1138                        TWIN_INT_MSK) {
1139                         if (is & TWIN_SCC_MSK) {
1140                                 z8530_isr(info);
1141                         } else if (is & TWIN_TMR1_MSK) {
1142                                 inb(card_base + TWIN_CLR_TMR1);
1143                                 tm_isr(&info->priv[0]);
1144                         } else {
1145                                 inb(card_base + TWIN_CLR_TMR2);
1146                                 tm_isr(&info->priv[1]);
1147                         }
1148                 }
1149         } else
1150                 z8530_isr(info);
1151         spin_unlock(info->priv[0].register_lock);
1152         return IRQ_HANDLED;
1153 }
1154
1155
1156 static void rx_isr(struct scc_priv *priv)
1157 {
1158         if (priv->param.dma >= 0) {
1159                 /* Check special condition and perform error reset. See 2.4.7.5. */
1160                 special_condition(priv, read_scc(priv, R1));
1161                 write_scc(priv, R0, ERR_RES);
1162         } else {
1163                 /* Check special condition for each character. Error reset not necessary.
1164                    Same algorithm for SCC and ESCC. See 2.4.7.1 and 2.4.7.4. */
1165                 int rc;
1166                 while (read_scc(priv, R0) & Rx_CH_AV) {
1167                         rc = read_scc(priv, R1);
1168                         if (priv->rx_ptr < BUF_SIZE)
1169                                 priv->rx_buf[priv->rx_head][priv->
1170                                                             rx_ptr++] =
1171                                     read_scc_data(priv);
1172                         else {
1173                                 priv->rx_over = 2;
1174                                 read_scc_data(priv);
1175                         }
1176                         special_condition(priv, rc);
1177                 }
1178         }
1179 }
1180
1181
1182 static void special_condition(struct scc_priv *priv, int rc)
1183 {
1184         int cb;
1185         unsigned long flags;
1186
1187         /* See Figure 2-15. Only overrun and EOF need to be checked. */
1188
1189         if (rc & Rx_OVR) {
1190                 /* Receiver overrun */
1191                 priv->rx_over = 1;
1192                 if (priv->param.dma < 0)
1193                         write_scc(priv, R0, ERR_RES);
1194         } else if (rc & END_FR) {
1195                 /* End of frame. Get byte count */
1196                 if (priv->param.dma >= 0) {
1197                         flags = claim_dma_lock();
1198                         cb = BUF_SIZE - get_dma_residue(priv->param.dma) -
1199                             2;
1200                         release_dma_lock(flags);
1201                 } else {
1202                         cb = priv->rx_ptr - 2;
1203                 }
1204                 if (priv->rx_over) {
1205                         /* We had an overrun */
1206                         priv->dev->stats.rx_errors++;
1207                         if (priv->rx_over == 2)
1208                                 priv->dev->stats.rx_length_errors++;
1209                         else
1210                                 priv->dev->stats.rx_fifo_errors++;
1211                         priv->rx_over = 0;
1212                 } else if (rc & CRC_ERR) {
1213                         /* Count invalid CRC only if packet length >= minimum */
1214                         if (cb >= 15) {
1215                                 priv->dev->stats.rx_errors++;
1216                                 priv->dev->stats.rx_crc_errors++;
1217                         }
1218                 } else {
1219                         if (cb >= 15) {
1220                                 if (priv->rx_count < NUM_RX_BUF - 1) {
1221                                         /* Put good frame in FIFO */
1222                                         priv->rx_len[priv->rx_head] = cb;
1223                                         priv->rx_head =
1224                                             (priv->rx_head +
1225                                              1) % NUM_RX_BUF;
1226                                         priv->rx_count++;
1227                                         schedule_work(&priv->rx_work);
1228                                 } else {
1229                                         priv->dev->stats.rx_errors++;
1230                                         priv->dev->stats.rx_over_errors++;
1231                                 }
1232                         }
1233                 }
1234                 /* Get ready for new frame */
1235                 if (priv->param.dma >= 0) {
1236                         flags = claim_dma_lock();
1237                         set_dma_addr(priv->param.dma,
1238                                      (int) priv->rx_buf[priv->rx_head]);
1239                         set_dma_count(priv->param.dma, BUF_SIZE);
1240                         release_dma_lock(flags);
1241                 } else {
1242                         priv->rx_ptr = 0;
1243                 }
1244         }
1245 }
1246
1247
1248 static void rx_bh(struct work_struct *ugli_api)
1249 {
1250         struct scc_priv *priv = container_of(ugli_api, struct scc_priv, rx_work);
1251         int i = priv->rx_tail;
1252         int cb;
1253         unsigned long flags;
1254         struct sk_buff *skb;
1255         unsigned char *data;
1256
1257         spin_lock_irqsave(&priv->ring_lock, flags);
1258         while (priv->rx_count) {
1259                 spin_unlock_irqrestore(&priv->ring_lock, flags);
1260                 cb = priv->rx_len[i];
1261                 /* Allocate buffer */
1262                 skb = dev_alloc_skb(cb + 1);
1263                 if (skb == NULL) {
1264                         /* Drop packet */
1265                         priv->dev->stats.rx_dropped++;
1266                 } else {
1267                         /* Fill buffer */
1268                         data = skb_put(skb, cb + 1);
1269                         data[0] = 0;
1270                         memcpy(&data[1], priv->rx_buf[i], cb);
1271                         skb->protocol = ax25_type_trans(skb, priv->dev);
1272                         netif_rx(skb);
1273                         priv->dev->stats.rx_packets++;
1274                         priv->dev->stats.rx_bytes += cb;
1275                 }
1276                 spin_lock_irqsave(&priv->ring_lock, flags);
1277                 /* Move tail */
1278                 priv->rx_tail = i = (i + 1) % NUM_RX_BUF;
1279                 priv->rx_count--;
1280         }
1281         spin_unlock_irqrestore(&priv->ring_lock, flags);
1282 }
1283
1284
1285 static void tx_isr(struct scc_priv *priv)
1286 {
1287         int i = priv->tx_tail, p = priv->tx_ptr;
1288
1289         /* Suspend TX interrupts if we don't want to send anything.
1290            See Figure 2-22. */
1291         if (p == priv->tx_len[i]) {
1292                 write_scc(priv, R0, RES_Tx_P);
1293                 return;
1294         }
1295
1296         /* Write characters */
1297         while ((read_scc(priv, R0) & Tx_BUF_EMP) && p < priv->tx_len[i]) {
1298                 write_scc_data(priv, priv->tx_buf[i][p++], 0);
1299         }
1300
1301         /* Reset EOM latch of Z8530 */
1302         if (!priv->tx_ptr && p && priv->chip == Z8530)
1303                 write_scc(priv, R0, RES_EOM_L);
1304
1305         priv->tx_ptr = p;
1306 }
1307
1308
1309 static void es_isr(struct scc_priv *priv)
1310 {
1311         int i, rr0, drr0, res;
1312         unsigned long flags;
1313
1314         /* Read status, reset interrupt bit (open latches) */
1315         rr0 = read_scc(priv, R0);
1316         write_scc(priv, R0, RES_EXT_INT);
1317         drr0 = priv->rr0 ^ rr0;
1318         priv->rr0 = rr0;
1319
1320         /* Transmit underrun (2.4.9.6). We can't check the TxEOM flag, since
1321            it might have already been cleared again by AUTOEOM. */
1322         if (priv->state == TX_DATA) {
1323                 /* Get remaining bytes */
1324                 i = priv->tx_tail;
1325                 if (priv->param.dma >= 0) {
1326                         disable_dma(priv->param.dma);
1327                         flags = claim_dma_lock();
1328                         res = get_dma_residue(priv->param.dma);
1329                         release_dma_lock(flags);
1330                 } else {
1331                         res = priv->tx_len[i] - priv->tx_ptr;
1332                         priv->tx_ptr = 0;
1333                 }
1334                 /* Disable DREQ / TX interrupt */
1335                 if (priv->param.dma >= 0 && priv->type == TYPE_TWIN)
1336                         outb(0, priv->card_base + TWIN_DMA_CFG);
1337                 else
1338                         write_scc(priv, R1, EXT_INT_ENAB | WT_FN_RDYFN);
1339                 if (res) {
1340                         /* Update packet statistics */
1341                         priv->dev->stats.tx_errors++;
1342                         priv->dev->stats.tx_fifo_errors++;
1343                         /* Other underrun interrupts may already be waiting */
1344                         write_scc(priv, R0, RES_EXT_INT);
1345                         write_scc(priv, R0, RES_EXT_INT);
1346                 } else {
1347                         /* Update packet statistics */
1348                         priv->dev->stats.tx_packets++;
1349                         priv->dev->stats.tx_bytes += priv->tx_len[i];
1350                         /* Remove frame from FIFO */
1351                         priv->tx_tail = (i + 1) % NUM_TX_BUF;
1352                         priv->tx_count--;
1353                         /* Inform upper layers */
1354                         netif_wake_queue(priv->dev);
1355                 }
1356                 /* Switch state */
1357                 write_scc(priv, R15, 0);
1358                 if (priv->tx_count &&
1359                     (jiffies - priv->tx_start) < priv->param.txtimeout) {
1360                         priv->state = TX_PAUSE;
1361                         start_timer(priv, priv->param.txpause, 0);
1362                 } else {
1363                         priv->state = TX_TAIL;
1364                         start_timer(priv, priv->param.txtail, 0);
1365                 }
1366         }
1367
1368         /* DCD transition */
1369         if (drr0 & DCD) {
1370                 if (rr0 & DCD) {
1371                         switch (priv->state) {
1372                         case IDLE:
1373                         case WAIT:
1374                                 priv->state = DCD_ON;
1375                                 write_scc(priv, R15, 0);
1376                                 start_timer(priv, priv->param.dcdon, 0);
1377                         }
1378                 } else {
1379                         switch (priv->state) {
1380                         case RX_ON:
1381                                 rx_off(priv);
1382                                 priv->state = DCD_OFF;
1383                                 write_scc(priv, R15, 0);
1384                                 start_timer(priv, priv->param.dcdoff, 0);
1385                         }
1386                 }
1387         }
1388
1389         /* CTS transition */
1390         if ((drr0 & CTS) && (~rr0 & CTS) && priv->type != TYPE_TWIN)
1391                 tm_isr(priv);
1392
1393 }
1394
1395
1396 static void tm_isr(struct scc_priv *priv)
1397 {
1398         switch (priv->state) {
1399         case TX_HEAD:
1400         case TX_PAUSE:
1401                 tx_on(priv);
1402                 priv->state = TX_DATA;
1403                 break;
1404         case TX_TAIL:
1405                 write_scc(priv, R5, TxCRC_ENAB | Tx8);
1406                 priv->state = RTS_OFF;
1407                 if (priv->type != TYPE_TWIN)
1408                         write_scc(priv, R15, 0);
1409                 start_timer(priv, priv->param.rtsoff, 0);
1410                 break;
1411         case RTS_OFF:
1412                 write_scc(priv, R15, DCDIE);
1413                 priv->rr0 = read_scc(priv, R0);
1414                 if (priv->rr0 & DCD) {
1415                         priv->dev->stats.collisions++;
1416                         rx_on(priv);
1417                         priv->state = RX_ON;
1418                 } else {
1419                         priv->state = WAIT;
1420                         start_timer(priv, priv->param.waittime, DCDIE);
1421                 }
1422                 break;
1423         case WAIT:
1424                 if (priv->tx_count) {
1425                         priv->state = TX_HEAD;
1426                         priv->tx_start = jiffies;
1427                         write_scc(priv, R5,
1428                                   TxCRC_ENAB | RTS | TxENAB | Tx8);
1429                         write_scc(priv, R15, 0);
1430                         start_timer(priv, priv->param.txdelay, 0);
1431                 } else {
1432                         priv->state = IDLE;
1433                         if (priv->type != TYPE_TWIN)
1434                                 write_scc(priv, R15, DCDIE);
1435                 }
1436                 break;
1437         case DCD_ON:
1438         case DCD_OFF:
1439                 write_scc(priv, R15, DCDIE);
1440                 priv->rr0 = read_scc(priv, R0);
1441                 if (priv->rr0 & DCD) {
1442                         rx_on(priv);
1443                         priv->state = RX_ON;
1444                 } else {
1445                         priv->state = WAIT;
1446                         start_timer(priv,
1447                                     random() / priv->param.persist *
1448                                     priv->param.slottime, DCDIE);
1449                 }
1450                 break;
1451         }
1452 }