Merge branch 'stable/for-linus-5.15' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / drivers / net / wan / cosa.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* $Id: cosa.c,v 1.31 2000/03/08 17:47:16 kas Exp $ */
3
4 /*  Copyright (C) 1995-1997  Jan "Yenya" Kasprzak <kas@fi.muni.cz>
5  *  Generic HDLC port Copyright (C) 2008 Krzysztof Halasa <khc@pm.waw.pl>
6  */
7
8 /* The driver for the SRP and COSA synchronous serial cards.
9  *
10  * HARDWARE INFO
11  *
12  * Both cards are developed at the Institute of Computer Science,
13  * Masaryk University (https://www.ics.muni.cz/). The hardware is
14  * developed by Jiri Novotny <novotny@ics.muni.cz>. More information
15  * and the photo of both cards is available at
16  * http://www.pavoucek.cz/cosa.html. The card documentation, firmwares
17  * and other goods can be downloaded from ftp://ftp.ics.muni.cz/pub/cosa/.
18  * For Linux-specific utilities, see below in the "Software info" section.
19  * If you want to order the card, contact Jiri Novotny.
20  *
21  * The SRP (serial port?, the Czech word "srp" means "sickle") card
22  * is a 2-port intelligent (with its own 8-bit CPU) synchronous serial card
23  * with V.24 interfaces up to 80kb/s each.
24  *
25  * The COSA (communication serial adapter?, the Czech word "kosa" means
26  * "scythe") is a next-generation sync/async board with two interfaces
27  * - currently any of V.24, X.21, V.35 and V.36 can be selected.
28  * It has a 16-bit SAB80166 CPU and can do up to 10 Mb/s per channel.
29  * The 8-channels version is in development.
30  *
31  * Both types have downloadable firmware and communicate via ISA DMA.
32  * COSA can be also a bus-mastering device.
33  *
34  * SOFTWARE INFO
35  *
36  * The homepage of the Linux driver is at https://www.fi.muni.cz/~kas/cosa/.
37  * The CVS tree of Linux driver can be viewed there, as well as the
38  * firmware binaries and user-space utilities for downloading the firmware
39  * into the card and setting up the card.
40  *
41  * The Linux driver (unlike the present *BSD drivers :-) can work even
42  * for the COSA and SRP in one computer and allows each channel to work
43  * in one of the two modes (character or network device).
44  *
45  * AUTHOR
46  *
47  * The Linux driver was written by Jan "Yenya" Kasprzak <kas@fi.muni.cz>.
48  *
49  * You can mail me bugfixes and even success reports. I am especially
50  * interested in the SMP and/or muliti-channel success/failure reports
51  * (I wonder if I did the locking properly :-).
52  *
53  * THE AUTHOR USED THE FOLLOWING SOURCES WHEN PROGRAMMING THE DRIVER
54  *
55  * The COSA/SRP NetBSD driver by Zdenek Salvet and Ivos Cernohlavek
56  * The skeleton.c by Donald Becker
57  * The SDL Riscom/N2 driver by Mike Natale
58  * The Comtrol Hostess SV11 driver by Alan Cox
59  * The Sync PPP/Cisco HDLC layer (syncppp.c) ported to Linux by Alan Cox
60  */
61
62 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
63
64 #include <linux/module.h>
65 #include <linux/kernel.h>
66 #include <linux/sched/signal.h>
67 #include <linux/slab.h>
68 #include <linux/poll.h>
69 #include <linux/fs.h>
70 #include <linux/interrupt.h>
71 #include <linux/delay.h>
72 #include <linux/hdlc.h>
73 #include <linux/errno.h>
74 #include <linux/ioport.h>
75 #include <linux/netdevice.h>
76 #include <linux/spinlock.h>
77 #include <linux/mutex.h>
78 #include <linux/device.h>
79 #include <asm/io.h>
80 #include <asm/dma.h>
81 #include <asm/byteorder.h>
82
83 #undef COSA_SLOW_IO     /* for testing purposes only */
84
85 #include "cosa.h"
86
87 /* Maximum length of the identification string. */
88 #define COSA_MAX_ID_STRING      128
89
90 /* Maximum length of the channel name */
91 #define COSA_MAX_NAME           (sizeof("cosaXXXcXXX") + 1)
92
93 /* Per-channel data structure */
94
95 struct channel_data {
96         int usage;      /* Usage count; >0 for chrdev, -1 for netdev */
97         int num;        /* Number of the channel */
98         struct cosa_data *cosa; /* Pointer to the per-card structure */
99         int txsize;     /* Size of transmitted data */
100         char *txbuf;    /* Transmit buffer */
101         char name[COSA_MAX_NAME];       /* channel name */
102
103         /* The HW layer interface */
104         /* routine called from the RX interrupt */
105         char *(*setup_rx)(struct channel_data *channel, int size);
106         /* routine called when the RX is done (from the EOT interrupt) */
107         int (*rx_done)(struct channel_data *channel);
108         /* routine called when the TX is done (from the EOT interrupt) */
109         int (*tx_done)(struct channel_data *channel, int size);
110
111         /* Character device parts */
112         struct mutex rlock;
113         struct semaphore wsem;
114         char *rxdata;
115         int rxsize;
116         wait_queue_head_t txwaitq, rxwaitq;
117         int tx_status, rx_status;
118
119         /* generic HDLC device parts */
120         struct net_device *netdev;
121         struct sk_buff *rx_skb, *tx_skb;
122 };
123
124 /* cosa->firmware_status bits */
125 #define COSA_FW_RESET           BIT(0)  /* Is the ROM monitor active? */
126 #define COSA_FW_DOWNLOAD        BIT(1)  /* Is the microcode downloaded? */
127 #define COSA_FW_START           BIT(2)  /* Is the microcode running? */
128
129 struct cosa_data {
130         int num;                        /* Card number */
131         char name[COSA_MAX_NAME];       /* Card name - e.g "cosa0" */
132         unsigned int datareg, statusreg;        /* I/O ports */
133         unsigned short irq, dma;        /* IRQ and DMA number */
134         unsigned short startaddr;       /* Firmware start address */
135         unsigned short busmaster;       /* Use busmastering? */
136         int nchannels;                  /* # of channels on this card */
137         int driver_status;              /* For communicating with firmware */
138         int firmware_status;            /* Downloaded, reseted, etc. */
139         unsigned long rxbitmap, txbitmap;/* Bitmap of channels who are willing to send/receive data */
140         unsigned long rxtx;             /* RX or TX in progress? */
141         int enabled;
142         int usage;                              /* usage count */
143         int txchan, txsize, rxsize;
144         struct channel_data *rxchan;
145         char *bouncebuf;
146         char *txbuf, *rxbuf;
147         struct channel_data *chan;
148         spinlock_t lock;        /* For exclusive operations on this structure */
149         char id_string[COSA_MAX_ID_STRING];     /* ROM monitor ID string */
150         char *type;                             /* card type */
151 };
152
153 /* Define this if you want all the possible ports to be autoprobed.
154  * It is here but it probably is not a good idea to use this.
155  */
156 /* #define COSA_ISA_AUTOPROBE   1*/
157
158 /* Character device major number. 117 was allocated for us.
159  * The value of 0 means to allocate a first free one.
160  */
161 static DEFINE_MUTEX(cosa_chardev_mutex);
162 static int cosa_major = 117;
163
164 /* Encoding of the minor numbers:
165  * The lowest CARD_MINOR_BITS bits means the channel on the single card,
166  * the highest bits means the card number.
167  */
168 #define CARD_MINOR_BITS 4       /* How many bits in minor number are reserved
169                                  * for the single card
170                                  */
171 /* The following depends on CARD_MINOR_BITS. Unfortunately, the "MODULE_STRING"
172  * macro doesn't like anything other than the raw number as an argument :-(
173  */
174 #define MAX_CARDS       16
175 /* #define MAX_CARDS    (1 << (8-CARD_MINOR_BITS)) */
176
177 #define DRIVER_RX_READY         0x0001
178 #define DRIVER_TX_READY         0x0002
179 #define DRIVER_TXMAP_SHIFT      2
180 #define DRIVER_TXMAP_MASK       0x0c    /* FIXME: 0xfc for 8-channel version */
181
182 /* for cosa->rxtx - indicates whether either transmit or receive is
183  * in progress. These values are mean number of the bit.
184  */
185 #define TXBIT 0
186 #define RXBIT 1
187 #define IRQBIT 2
188
189 #define COSA_MTU 2000   /* FIXME: I don't know this exactly */
190
191 #undef DEBUG_DATA //1   /* Dump the data read or written to the channel */
192 #undef DEBUG_IRQS //1   /* Print the message when the IRQ is received */
193 #undef DEBUG_IO   //1   /* Dump the I/O traffic */
194
195 #define TX_TIMEOUT      (5 * HZ)
196
197 /* Maybe the following should be allocated dynamically */
198 static struct cosa_data cosa_cards[MAX_CARDS];
199 static int nr_cards;
200
201 #ifdef COSA_ISA_AUTOPROBE
202 static int io[MAX_CARDS + 1]  = {0x220, 0x228, 0x210, 0x218, 0,};
203 /* NOTE: DMA is not autoprobed!!! */
204 static int dma[MAX_CARDS + 1] = {1, 7, 1, 7, 1, 7, 1, 7, 0,};
205 #else
206 static int io[MAX_CARDS + 1];
207 static int dma[MAX_CARDS + 1];
208 #endif
209 /* IRQ can be safely autoprobed */
210 static int irq[MAX_CARDS + 1] = {-1, -1, -1, -1, -1, -1, 0,};
211
212 /* for class stuff*/
213 static struct class *cosa_class;
214
215 #ifdef MODULE
216 module_param_hw_array(io, int, ioport, NULL, 0);
217 MODULE_PARM_DESC(io, "The I/O bases of the COSA or SRP cards");
218 module_param_hw_array(irq, int, irq, NULL, 0);
219 MODULE_PARM_DESC(irq, "The IRQ lines of the COSA or SRP cards");
220 module_param_hw_array(dma, int, dma, NULL, 0);
221 MODULE_PARM_DESC(dma, "The DMA channels of the COSA or SRP cards");
222
223 MODULE_AUTHOR("Jan \"Yenya\" Kasprzak, <kas@fi.muni.cz>");
224 MODULE_DESCRIPTION("Modular driver for the COSA or SRP synchronous card");
225 MODULE_LICENSE("GPL");
226 #endif
227
228 /* I use this mainly for testing purposes */
229 #ifdef COSA_SLOW_IO
230 #define cosa_outb outb_p
231 #define cosa_outw outw_p
232 #define cosa_inb  inb_p
233 #define cosa_inw  inw_p
234 #else
235 #define cosa_outb outb
236 #define cosa_outw outw
237 #define cosa_inb  inb
238 #define cosa_inw  inw
239 #endif
240
241 #define is_8bit(cosa)           (!((cosa)->datareg & 0x08))
242
243 #define cosa_getstatus(cosa)    (cosa_inb((cosa)->statusreg))
244 #define cosa_putstatus(cosa, stat)      (cosa_outb(stat, (cosa)->statusreg))
245 #define cosa_getdata16(cosa)    (cosa_inw((cosa)->datareg))
246 #define cosa_getdata8(cosa)     (cosa_inb((cosa)->datareg))
247 #define cosa_putdata16(cosa, dt)        (cosa_outw(dt, (cosa)->datareg))
248 #define cosa_putdata8(cosa, dt) (cosa_outb(dt, (cosa)->datareg))
249
250 /* Initialization stuff */
251 static int cosa_probe(int ioaddr, int irq, int dma);
252
253 /* HW interface */
254 static void cosa_enable_rx(struct channel_data *chan);
255 static void cosa_disable_rx(struct channel_data *chan);
256 static int cosa_start_tx(struct channel_data *channel, char *buf, int size);
257 static void cosa_kick(struct cosa_data *cosa);
258 static int cosa_dma_able(struct channel_data *chan, char *buf, int data);
259
260 /* Network device stuff */
261 static int cosa_net_attach(struct net_device *dev, unsigned short encoding,
262                            unsigned short parity);
263 static int cosa_net_open(struct net_device *d);
264 static int cosa_net_close(struct net_device *d);
265 static void cosa_net_timeout(struct net_device *d, unsigned int txqueue);
266 static netdev_tx_t cosa_net_tx(struct sk_buff *skb, struct net_device *d);
267 static char *cosa_net_setup_rx(struct channel_data *channel, int size);
268 static int cosa_net_rx_done(struct channel_data *channel);
269 static int cosa_net_tx_done(struct channel_data *channel, int size);
270
271 /* Character device */
272 static char *chrdev_setup_rx(struct channel_data *channel, int size);
273 static int chrdev_rx_done(struct channel_data *channel);
274 static int chrdev_tx_done(struct channel_data *channel, int size);
275 static ssize_t cosa_read(struct file *file,
276                          char __user *buf, size_t count, loff_t *ppos);
277 static ssize_t cosa_write(struct file *file,
278                           const char __user *buf, size_t count, loff_t *ppos);
279 static unsigned int cosa_poll(struct file *file, poll_table *poll);
280 static int cosa_open(struct inode *inode, struct file *file);
281 static int cosa_release(struct inode *inode, struct file *file);
282 static long cosa_chardev_ioctl(struct file *file, unsigned int cmd,
283                                unsigned long arg);
284 #ifdef COSA_FASYNC_WORKING
285 static int cosa_fasync(struct inode *inode, struct file *file, int on);
286 #endif
287
288 static const struct file_operations cosa_fops = {
289         .owner          = THIS_MODULE,
290         .llseek         = no_llseek,
291         .read           = cosa_read,
292         .write          = cosa_write,
293         .poll           = cosa_poll,
294         .unlocked_ioctl = cosa_chardev_ioctl,
295         .open           = cosa_open,
296         .release        = cosa_release,
297 #ifdef COSA_FASYNC_WORKING
298         .fasync         = cosa_fasync,
299 #endif
300 };
301
302 /* Ioctls */
303 static int cosa_start(struct cosa_data *cosa, int address);
304 static int cosa_reset(struct cosa_data *cosa);
305 static int cosa_download(struct cosa_data *cosa, void __user *a);
306 static int cosa_readmem(struct cosa_data *cosa, void __user *a);
307
308 /* COSA/SRP ROM monitor */
309 static int download(struct cosa_data *cosa, const char __user *data, int addr, int len);
310 static int startmicrocode(struct cosa_data *cosa, int address);
311 static int readmem(struct cosa_data *cosa, char __user *data, int addr, int len);
312 static int cosa_reset_and_read_id(struct cosa_data *cosa, char *id);
313
314 /* Auxiliary functions */
315 static int get_wait_data(struct cosa_data *cosa);
316 static int put_wait_data(struct cosa_data *cosa, int data);
317 static int puthexnumber(struct cosa_data *cosa, int number);
318 static void put_driver_status(struct cosa_data *cosa);
319 static void put_driver_status_nolock(struct cosa_data *cosa);
320
321 /* Interrupt handling */
322 static irqreturn_t cosa_interrupt(int irq, void *cosa);
323
324 /* I/O ops debugging */
325 #ifdef DEBUG_IO
326 static void debug_data_in(struct cosa_data *cosa, int data);
327 static void debug_data_out(struct cosa_data *cosa, int data);
328 static void debug_data_cmd(struct cosa_data *cosa, int data);
329 static void debug_status_in(struct cosa_data *cosa, int status);
330 static void debug_status_out(struct cosa_data *cosa, int status);
331 #endif
332
333 static inline struct channel_data *dev_to_chan(struct net_device *dev)
334 {
335         return (struct channel_data *)dev_to_hdlc(dev)->priv;
336 }
337
338 /* ---------- Initialization stuff ---------- */
339
340 static int __init cosa_init(void)
341 {
342         int i, err = 0;
343
344         if (cosa_major > 0) {
345                 if (register_chrdev(cosa_major, "cosa", &cosa_fops)) {
346                         pr_warn("unable to get major %d\n", cosa_major);
347                         err = -EIO;
348                         goto out;
349                 }
350         } else {
351                 cosa_major = register_chrdev(0, "cosa", &cosa_fops);
352                 if (!cosa_major) {
353                         pr_warn("unable to register chardev\n");
354                         err = -EIO;
355                         goto out;
356                 }
357         }
358         for (i = 0; i < MAX_CARDS; i++)
359                 cosa_cards[i].num = -1;
360         for (i = 0; io[i] != 0 && i < MAX_CARDS; i++)
361                 cosa_probe(io[i], irq[i], dma[i]);
362         if (!nr_cards) {
363                 pr_warn("no devices found\n");
364                 unregister_chrdev(cosa_major, "cosa");
365                 err = -ENODEV;
366                 goto out;
367         }
368         cosa_class = class_create(THIS_MODULE, "cosa");
369         if (IS_ERR(cosa_class)) {
370                 err = PTR_ERR(cosa_class);
371                 goto out_chrdev;
372         }
373         for (i = 0; i < nr_cards; i++)
374                 device_create(cosa_class, NULL, MKDEV(cosa_major, i), NULL,
375                               "cosa%d", i);
376         err = 0;
377         goto out;
378
379 out_chrdev:
380         unregister_chrdev(cosa_major, "cosa");
381 out:
382         return err;
383 }
384 module_init(cosa_init);
385
386 static void __exit cosa_exit(void)
387 {
388         struct cosa_data *cosa;
389         int i;
390
391         for (i = 0; i < nr_cards; i++)
392                 device_destroy(cosa_class, MKDEV(cosa_major, i));
393         class_destroy(cosa_class);
394
395         for (cosa = cosa_cards; nr_cards--; cosa++) {
396                 /* Clean up the per-channel data */
397                 for (i = 0; i < cosa->nchannels; i++) {
398                         /* Chardev driver has no alloc'd per-channel data */
399                         unregister_hdlc_device(cosa->chan[i].netdev);
400                         free_netdev(cosa->chan[i].netdev);
401                 }
402                 /* Clean up the per-card data */
403                 kfree(cosa->chan);
404                 kfree(cosa->bouncebuf);
405                 free_irq(cosa->irq, cosa);
406                 free_dma(cosa->dma);
407                 release_region(cosa->datareg, is_8bit(cosa) ? 2 : 4);
408         }
409         unregister_chrdev(cosa_major, "cosa");
410 }
411 module_exit(cosa_exit);
412
413 static const struct net_device_ops cosa_ops = {
414         .ndo_open       = cosa_net_open,
415         .ndo_stop       = cosa_net_close,
416         .ndo_start_xmit = hdlc_start_xmit,
417         .ndo_siocwandev = hdlc_ioctl,
418         .ndo_tx_timeout = cosa_net_timeout,
419 };
420
421 static int cosa_probe(int base, int irq, int dma)
422 {
423         struct cosa_data *cosa = cosa_cards + nr_cards;
424         int i, err = 0;
425
426         memset(cosa, 0, sizeof(struct cosa_data));
427
428         /* Checking validity of parameters: */
429         /* IRQ should be 2-7 or 10-15; negative IRQ means autoprobe */
430         if ((irq >= 0  && irq < 2) || irq > 15 || (irq < 10 && irq > 7)) {
431                 pr_info("invalid IRQ %d\n", irq);
432                 return -1;
433         }
434         /* I/O address should be between 0x100 and 0x3ff and should be
435          * multiple of 8.
436          */
437         if (base < 0x100 || base > 0x3ff || base & 0x7) {
438                 pr_info("invalid I/O address 0x%x\n", base);
439                 return -1;
440         }
441         /* DMA should be 0,1 or 3-7 */
442         if (dma < 0 || dma == 4 || dma > 7) {
443                 pr_info("invalid DMA %d\n", dma);
444                 return -1;
445         }
446         /* and finally, on 16-bit COSA DMA should be 4-7 and
447          * I/O base should not be multiple of 0x10
448          */
449         if (((base & 0x8) && dma < 4) || (!(base & 0x8) && dma > 3)) {
450                 pr_info("8/16 bit base and DMA mismatch (base=0x%x, dma=%d)\n",
451                         base, dma);
452                 return -1;
453         }
454
455         cosa->dma = dma;
456         cosa->datareg = base;
457         cosa->statusreg = is_8bit(cosa) ? base + 1 : base + 2;
458         spin_lock_init(&cosa->lock);
459
460         if (!request_region(base, is_8bit(cosa) ? 2 : 4, "cosa"))
461                 return -1;
462
463         if (cosa_reset_and_read_id(cosa, cosa->id_string) < 0) {
464                 printk(KERN_DEBUG "probe at 0x%x failed.\n", base);
465                 err = -1;
466                 goto err_out;
467         }
468
469         /* Test the validity of identification string */
470         if (!strncmp(cosa->id_string, "SRP", 3)) {
471                 cosa->type = "srp";
472         } else if (!strncmp(cosa->id_string, "COSA", 4)) {
473                 cosa->type = is_8bit(cosa) ? "cosa8" : "cosa16";
474         } else {
475 /* Print a warning only if we are not autoprobing */
476 #ifndef COSA_ISA_AUTOPROBE
477                 pr_info("valid signature not found at 0x%x\n", base);
478 #endif
479                 err = -1;
480                 goto err_out;
481         }
482         /* Update the name of the region now we know the type of card */
483         release_region(base, is_8bit(cosa) ? 2 : 4);
484         if (!request_region(base, is_8bit(cosa) ? 2 : 4, cosa->type)) {
485                 printk(KERN_DEBUG "changing name at 0x%x failed.\n", base);
486                 return -1;
487         }
488
489         /* Now do IRQ autoprobe */
490         if (irq < 0) {
491                 unsigned long irqs;
492 /*              pr_info("IRQ autoprobe\n"); */
493                 irqs = probe_irq_on();
494                 /* Enable interrupt on tx buffer empty (it sure is)
495                  * really sure ?
496                  * FIXME: When this code is not used as module, we should
497                  * probably call udelay() instead of the interruptible sleep.
498                  */
499                 set_current_state(TASK_INTERRUPTIBLE);
500                 cosa_putstatus(cosa, SR_TX_INT_ENA);
501                 schedule_timeout(msecs_to_jiffies(300));
502                 irq = probe_irq_off(irqs);
503                 /* Disable all IRQs from the card */
504                 cosa_putstatus(cosa, 0);
505                 /* Empty the received data register */
506                 cosa_getdata8(cosa);
507
508                 if (irq < 0) {
509                         pr_info("multiple interrupts obtained (%d, board at 0x%x)\n",
510                                 irq, cosa->datareg);
511                         err = -1;
512                         goto err_out;
513                 }
514                 if (irq == 0) {
515                         pr_info("no interrupt obtained (board at 0x%x)\n",
516                                 cosa->datareg);
517                 /*      return -1; */
518                 }
519         }
520
521         cosa->irq = irq;
522         cosa->num = nr_cards;
523         cosa->usage = 0;
524         cosa->nchannels = 2;    /* FIXME: how to determine this? */
525
526         if (request_irq(cosa->irq, cosa_interrupt, 0, cosa->type, cosa)) {
527                 err = -1;
528                 goto err_out;
529         }
530         if (request_dma(cosa->dma, cosa->type)) {
531                 err = -1;
532                 goto err_out1;
533         }
534
535         cosa->bouncebuf = kmalloc(COSA_MTU, GFP_KERNEL | GFP_DMA);
536         if (!cosa->bouncebuf) {
537                 err = -ENOMEM;
538                 goto err_out2;
539         }
540         sprintf(cosa->name, "cosa%d", cosa->num);
541
542         /* Initialize the per-channel data */
543         cosa->chan = kcalloc(cosa->nchannels, sizeof(struct channel_data), GFP_KERNEL);
544         if (!cosa->chan) {
545                 err = -ENOMEM;
546                 goto err_out3;
547         }
548
549         for (i = 0; i < cosa->nchannels; i++) {
550                 struct channel_data *chan = &cosa->chan[i];
551
552                 chan->cosa = cosa;
553                 chan->num = i;
554                 sprintf(chan->name, "cosa%dc%d", chan->cosa->num, i);
555
556                 /* Initialize the chardev data structures */
557                 mutex_init(&chan->rlock);
558                 sema_init(&chan->wsem, 1);
559
560                 /* Register the network interface */
561                 chan->netdev = alloc_hdlcdev(chan);
562                 if (!chan->netdev) {
563                         pr_warn("%s: alloc_hdlcdev failed\n", chan->name);
564                         err = -ENOMEM;
565                         goto err_hdlcdev;
566                 }
567                 dev_to_hdlc(chan->netdev)->attach = cosa_net_attach;
568                 dev_to_hdlc(chan->netdev)->xmit = cosa_net_tx;
569                 chan->netdev->netdev_ops = &cosa_ops;
570                 chan->netdev->watchdog_timeo = TX_TIMEOUT;
571                 chan->netdev->base_addr = chan->cosa->datareg;
572                 chan->netdev->irq = chan->cosa->irq;
573                 chan->netdev->dma = chan->cosa->dma;
574                 err = register_hdlc_device(chan->netdev);
575                 if (err) {
576                         netdev_warn(chan->netdev,
577                                     "register_hdlc_device() failed\n");
578                         free_netdev(chan->netdev);
579                         goto err_hdlcdev;
580                 }
581         }
582
583         pr_info("cosa%d: %s (%s at 0x%x irq %d dma %d), %d channels\n",
584                 cosa->num, cosa->id_string, cosa->type,
585                 cosa->datareg, cosa->irq, cosa->dma, cosa->nchannels);
586
587         return nr_cards++;
588
589 err_hdlcdev:
590         while (i-- > 0) {
591                 unregister_hdlc_device(cosa->chan[i].netdev);
592                 free_netdev(cosa->chan[i].netdev);
593         }
594         kfree(cosa->chan);
595 err_out3:
596         kfree(cosa->bouncebuf);
597 err_out2:
598         free_dma(cosa->dma);
599 err_out1:
600         free_irq(cosa->irq, cosa);
601 err_out:
602         release_region(cosa->datareg, is_8bit(cosa) ? 2 : 4);
603         pr_notice("cosa%d: allocating resources failed\n", cosa->num);
604         return err;
605 }
606
607 /*---------- network device ---------- */
608
609 static int cosa_net_attach(struct net_device *dev, unsigned short encoding,
610                            unsigned short parity)
611 {
612         if (encoding == ENCODING_NRZ && parity == PARITY_CRC16_PR1_CCITT)
613                 return 0;
614         return -EINVAL;
615 }
616
617 static int cosa_net_open(struct net_device *dev)
618 {
619         struct channel_data *chan = dev_to_chan(dev);
620         int err;
621         unsigned long flags;
622
623         if (!(chan->cosa->firmware_status & COSA_FW_START)) {
624                 pr_notice("%s: start the firmware first (status %d)\n",
625                           chan->cosa->name, chan->cosa->firmware_status);
626                 return -EPERM;
627         }
628         spin_lock_irqsave(&chan->cosa->lock, flags);
629         if (chan->usage != 0) {
630                 pr_warn("%s: cosa_net_open called with usage count %d\n",
631                         chan->name, chan->usage);
632                 spin_unlock_irqrestore(&chan->cosa->lock, flags);
633                 return -EBUSY;
634         }
635         chan->setup_rx = cosa_net_setup_rx;
636         chan->tx_done = cosa_net_tx_done;
637         chan->rx_done = cosa_net_rx_done;
638         chan->usage = -1;
639         chan->cosa->usage++;
640         spin_unlock_irqrestore(&chan->cosa->lock, flags);
641
642         err = hdlc_open(dev);
643         if (err) {
644                 spin_lock_irqsave(&chan->cosa->lock, flags);
645                 chan->usage = 0;
646                 chan->cosa->usage--;
647                 spin_unlock_irqrestore(&chan->cosa->lock, flags);
648                 return err;
649         }
650
651         netif_start_queue(dev);
652         cosa_enable_rx(chan);
653         return 0;
654 }
655
656 static netdev_tx_t cosa_net_tx(struct sk_buff *skb,
657                                struct net_device *dev)
658 {
659         struct channel_data *chan = dev_to_chan(dev);
660
661         netif_stop_queue(dev);
662
663         chan->tx_skb = skb;
664         cosa_start_tx(chan, skb->data, skb->len);
665         return NETDEV_TX_OK;
666 }
667
668 static void cosa_net_timeout(struct net_device *dev, unsigned int txqueue)
669 {
670         struct channel_data *chan = dev_to_chan(dev);
671
672         if (test_bit(RXBIT, &chan->cosa->rxtx)) {
673                 chan->netdev->stats.rx_errors++;
674                 chan->netdev->stats.rx_missed_errors++;
675         } else {
676                 chan->netdev->stats.tx_errors++;
677                 chan->netdev->stats.tx_aborted_errors++;
678         }
679         cosa_kick(chan->cosa);
680         if (chan->tx_skb) {
681                 dev_kfree_skb(chan->tx_skb);
682                 chan->tx_skb = NULL;
683         }
684         netif_wake_queue(dev);
685 }
686
687 static int cosa_net_close(struct net_device *dev)
688 {
689         struct channel_data *chan = dev_to_chan(dev);
690         unsigned long flags;
691
692         netif_stop_queue(dev);
693         hdlc_close(dev);
694         cosa_disable_rx(chan);
695         spin_lock_irqsave(&chan->cosa->lock, flags);
696         if (chan->rx_skb) {
697                 kfree_skb(chan->rx_skb);
698                 chan->rx_skb = NULL;
699         }
700         if (chan->tx_skb) {
701                 kfree_skb(chan->tx_skb);
702                 chan->tx_skb = NULL;
703         }
704         chan->usage = 0;
705         chan->cosa->usage--;
706         spin_unlock_irqrestore(&chan->cosa->lock, flags);
707         return 0;
708 }
709
710 static char *cosa_net_setup_rx(struct channel_data *chan, int size)
711 {
712         /* We can safely fall back to non-dma-able memory, because we have
713          * the cosa->bouncebuf pre-allocated.
714          */
715         kfree_skb(chan->rx_skb);
716         chan->rx_skb = dev_alloc_skb(size);
717         if (!chan->rx_skb) {
718                 pr_notice("%s: Memory squeeze, dropping packet\n", chan->name);
719                 chan->netdev->stats.rx_dropped++;
720                 return NULL;
721         }
722         netif_trans_update(chan->netdev);
723         return skb_put(chan->rx_skb, size);
724 }
725
726 static int cosa_net_rx_done(struct channel_data *chan)
727 {
728         if (!chan->rx_skb) {
729                 pr_warn("%s: rx_done with empty skb!\n", chan->name);
730                 chan->netdev->stats.rx_errors++;
731                 chan->netdev->stats.rx_frame_errors++;
732                 return 0;
733         }
734         chan->rx_skb->protocol = hdlc_type_trans(chan->rx_skb, chan->netdev);
735         chan->rx_skb->dev = chan->netdev;
736         skb_reset_mac_header(chan->rx_skb);
737         chan->netdev->stats.rx_packets++;
738         chan->netdev->stats.rx_bytes += chan->cosa->rxsize;
739         netif_rx(chan->rx_skb);
740         chan->rx_skb = NULL;
741         return 0;
742 }
743
744 /* ARGSUSED */
745 static int cosa_net_tx_done(struct channel_data *chan, int size)
746 {
747         if (!chan->tx_skb) {
748                 pr_warn("%s: tx_done with empty skb!\n", chan->name);
749                 chan->netdev->stats.tx_errors++;
750                 chan->netdev->stats.tx_aborted_errors++;
751                 return 1;
752         }
753         dev_consume_skb_irq(chan->tx_skb);
754         chan->tx_skb = NULL;
755         chan->netdev->stats.tx_packets++;
756         chan->netdev->stats.tx_bytes += size;
757         netif_wake_queue(chan->netdev);
758         return 1;
759 }
760
761 /*---------- Character device ---------- */
762
763 static ssize_t cosa_read(struct file *file,
764                          char __user *buf, size_t count, loff_t *ppos)
765 {
766         DECLARE_WAITQUEUE(wait, current);
767         unsigned long flags;
768         struct channel_data *chan = file->private_data;
769         struct cosa_data *cosa = chan->cosa;
770         char *kbuf;
771
772         if (!(cosa->firmware_status & COSA_FW_START)) {
773                 pr_notice("%s: start the firmware first (status %d)\n",
774                           cosa->name, cosa->firmware_status);
775                 return -EPERM;
776         }
777         if (mutex_lock_interruptible(&chan->rlock))
778                 return -ERESTARTSYS;
779
780         chan->rxdata = kmalloc(COSA_MTU, GFP_DMA | GFP_KERNEL);
781         if (!chan->rxdata) {
782                 mutex_unlock(&chan->rlock);
783                 return -ENOMEM;
784         }
785
786         chan->rx_status = 0;
787         cosa_enable_rx(chan);
788         spin_lock_irqsave(&cosa->lock, flags);
789         add_wait_queue(&chan->rxwaitq, &wait);
790         while (!chan->rx_status) {
791                 set_current_state(TASK_INTERRUPTIBLE);
792                 spin_unlock_irqrestore(&cosa->lock, flags);
793                 schedule();
794                 spin_lock_irqsave(&cosa->lock, flags);
795                 if (signal_pending(current) && chan->rx_status == 0) {
796                         chan->rx_status = 1;
797                         remove_wait_queue(&chan->rxwaitq, &wait);
798                         __set_current_state(TASK_RUNNING);
799                         spin_unlock_irqrestore(&cosa->lock, flags);
800                         mutex_unlock(&chan->rlock);
801                         return -ERESTARTSYS;
802                 }
803         }
804         remove_wait_queue(&chan->rxwaitq, &wait);
805         __set_current_state(TASK_RUNNING);
806         kbuf = chan->rxdata;
807         count = chan->rxsize;
808         spin_unlock_irqrestore(&cosa->lock, flags);
809         mutex_unlock(&chan->rlock);
810
811         if (copy_to_user(buf, kbuf, count)) {
812                 kfree(kbuf);
813                 return -EFAULT;
814         }
815         kfree(kbuf);
816         return count;
817 }
818
819 static char *chrdev_setup_rx(struct channel_data *chan, int size)
820 {
821         /* Expect size <= COSA_MTU */
822         chan->rxsize = size;
823         return chan->rxdata;
824 }
825
826 static int chrdev_rx_done(struct channel_data *chan)
827 {
828         if (chan->rx_status) { /* Reader has died */
829                 kfree(chan->rxdata);
830                 up(&chan->wsem);
831         }
832         chan->rx_status = 1;
833         wake_up_interruptible(&chan->rxwaitq);
834         return 1;
835 }
836
837 static ssize_t cosa_write(struct file *file,
838                           const char __user *buf, size_t count, loff_t *ppos)
839 {
840         DECLARE_WAITQUEUE(wait, current);
841         struct channel_data *chan = file->private_data;
842         struct cosa_data *cosa = chan->cosa;
843         unsigned long flags;
844         char *kbuf;
845
846         if (!(cosa->firmware_status & COSA_FW_START)) {
847                 pr_notice("%s: start the firmware first (status %d)\n",
848                           cosa->name, cosa->firmware_status);
849                 return -EPERM;
850         }
851         if (down_interruptible(&chan->wsem))
852                 return -ERESTARTSYS;
853
854         if (count > COSA_MTU)
855                 count = COSA_MTU;
856
857         /* Allocate the buffer */
858         kbuf = kmalloc(count, GFP_KERNEL | GFP_DMA);
859         if (!kbuf) {
860                 up(&chan->wsem);
861                 return -ENOMEM;
862         }
863         if (copy_from_user(kbuf, buf, count)) {
864                 up(&chan->wsem);
865                 kfree(kbuf);
866                 return -EFAULT;
867         }
868         chan->tx_status = 0;
869         cosa_start_tx(chan, kbuf, count);
870
871         spin_lock_irqsave(&cosa->lock, flags);
872         add_wait_queue(&chan->txwaitq, &wait);
873         while (!chan->tx_status) {
874                 set_current_state(TASK_INTERRUPTIBLE);
875                 spin_unlock_irqrestore(&cosa->lock, flags);
876                 schedule();
877                 spin_lock_irqsave(&cosa->lock, flags);
878                 if (signal_pending(current) && chan->tx_status == 0) {
879                         chan->tx_status = 1;
880                         remove_wait_queue(&chan->txwaitq, &wait);
881                         __set_current_state(TASK_RUNNING);
882                         chan->tx_status = 1;
883                         spin_unlock_irqrestore(&cosa->lock, flags);
884                         up(&chan->wsem);
885                         kfree(kbuf);
886                         return -ERESTARTSYS;
887                 }
888         }
889         remove_wait_queue(&chan->txwaitq, &wait);
890         __set_current_state(TASK_RUNNING);
891         up(&chan->wsem);
892         spin_unlock_irqrestore(&cosa->lock, flags);
893         kfree(kbuf);
894         return count;
895 }
896
897 static int chrdev_tx_done(struct channel_data *chan, int size)
898 {
899         if (chan->tx_status) { /* Writer was interrupted */
900                 kfree(chan->txbuf);
901                 up(&chan->wsem);
902         }
903         chan->tx_status = 1;
904         wake_up_interruptible(&chan->txwaitq);
905         return 1;
906 }
907
908 static __poll_t cosa_poll(struct file *file, poll_table *poll)
909 {
910         pr_info("cosa_poll is here\n");
911         return 0;
912 }
913
914 static int cosa_open(struct inode *inode, struct file *file)
915 {
916         struct cosa_data *cosa;
917         struct channel_data *chan;
918         unsigned long flags;
919         int n;
920         int ret = 0;
921
922         mutex_lock(&cosa_chardev_mutex);
923         n = iminor(file_inode(file)) >> CARD_MINOR_BITS;
924         if (n >= nr_cards) {
925                 ret = -ENODEV;
926                 goto out;
927         }
928         cosa = cosa_cards + n;
929
930         n = iminor(file_inode(file)) & ((1 << CARD_MINOR_BITS) - 1);
931         if (n >= cosa->nchannels) {
932                 ret = -ENODEV;
933                 goto out;
934         }
935         chan = cosa->chan + n;
936
937         file->private_data = chan;
938
939         spin_lock_irqsave(&cosa->lock, flags);
940
941         if (chan->usage < 0) { /* in netdev mode */
942                 spin_unlock_irqrestore(&cosa->lock, flags);
943                 ret = -EBUSY;
944                 goto out;
945         }
946         cosa->usage++;
947         chan->usage++;
948
949         chan->tx_done = chrdev_tx_done;
950         chan->setup_rx = chrdev_setup_rx;
951         chan->rx_done = chrdev_rx_done;
952         spin_unlock_irqrestore(&cosa->lock, flags);
953 out:
954         mutex_unlock(&cosa_chardev_mutex);
955         return ret;
956 }
957
958 static int cosa_release(struct inode *inode, struct file *file)
959 {
960         struct channel_data *channel = file->private_data;
961         struct cosa_data *cosa;
962         unsigned long flags;
963
964         cosa = channel->cosa;
965         spin_lock_irqsave(&cosa->lock, flags);
966         cosa->usage--;
967         channel->usage--;
968         spin_unlock_irqrestore(&cosa->lock, flags);
969         return 0;
970 }
971
972 #ifdef COSA_FASYNC_WORKING
973 static struct fasync_struct *fasync[256] = { NULL, };
974
975 /* To be done ... */
976 static int cosa_fasync(struct inode *inode, struct file *file, int on)
977 {
978         int port = iminor(inode);
979
980         return fasync_helper(inode, file, on, &fasync[port]);
981 }
982 #endif
983
984 /* ---------- Ioctls ---------- */
985
986 /* Ioctl subroutines can safely be made inline, because they are called
987  * only from cosa_ioctl().
988  */
989 static inline int cosa_reset(struct cosa_data *cosa)
990 {
991         char idstring[COSA_MAX_ID_STRING];
992
993         if (cosa->usage > 1)
994                 pr_info("cosa%d: WARNING: reset requested with cosa->usage > 1 (%d). Odd things may happen.\n",
995                         cosa->num, cosa->usage);
996         cosa->firmware_status &= ~(COSA_FW_RESET | COSA_FW_START);
997         if (cosa_reset_and_read_id(cosa, idstring) < 0) {
998                 pr_notice("cosa%d: reset failed\n", cosa->num);
999                 return -EIO;
1000         }
1001         pr_info("cosa%d: resetting device: %s\n", cosa->num, idstring);
1002         cosa->firmware_status |= COSA_FW_RESET;
1003         return 0;
1004 }
1005
1006 /* High-level function to download data into COSA memory. Calls download() */
1007 static inline int cosa_download(struct cosa_data *cosa, void __user *arg)
1008 {
1009         struct cosa_download d;
1010         int i;
1011
1012         if (cosa->usage > 1)
1013                 pr_info("%s: WARNING: download of microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n",
1014                         cosa->name, cosa->usage);
1015         if (!(cosa->firmware_status & COSA_FW_RESET)) {
1016                 pr_notice("%s: reset the card first (status %d)\n",
1017                           cosa->name, cosa->firmware_status);
1018                 return -EPERM;
1019         }
1020
1021         if (copy_from_user(&d, arg, sizeof(d)))
1022                 return -EFAULT;
1023
1024         if (d.addr < 0 || d.addr > COSA_MAX_FIRMWARE_SIZE)
1025                 return -EINVAL;
1026         if (d.len < 0 || d.len > COSA_MAX_FIRMWARE_SIZE)
1027                 return -EINVAL;
1028
1029         /* If something fails, force the user to reset the card */
1030         cosa->firmware_status &= ~(COSA_FW_RESET | COSA_FW_DOWNLOAD);
1031
1032         i = download(cosa, d.code, d.len, d.addr);
1033         if (i < 0) {
1034                 pr_notice("cosa%d: microcode download failed: %d\n",
1035                           cosa->num, i);
1036                 return -EIO;
1037         }
1038         pr_info("cosa%d: downloading microcode - 0x%04x bytes at 0x%04x\n",
1039                 cosa->num, d.len, d.addr);
1040         cosa->firmware_status |= COSA_FW_RESET | COSA_FW_DOWNLOAD;
1041         return 0;
1042 }
1043
1044 /* High-level function to read COSA memory. Calls readmem() */
1045 static inline int cosa_readmem(struct cosa_data *cosa, void __user *arg)
1046 {
1047         struct cosa_download d;
1048         int i;
1049
1050         if (cosa->usage > 1)
1051                 pr_info("cosa%d: WARNING: readmem requested with cosa->usage > 1 (%d). Odd things may happen.\n",
1052                         cosa->num, cosa->usage);
1053         if (!(cosa->firmware_status & COSA_FW_RESET)) {
1054                 pr_notice("%s: reset the card first (status %d)\n",
1055                           cosa->name, cosa->firmware_status);
1056                 return -EPERM;
1057         }
1058
1059         if (copy_from_user(&d, arg, sizeof(d)))
1060                 return -EFAULT;
1061
1062         /* If something fails, force the user to reset the card */
1063         cosa->firmware_status &= ~COSA_FW_RESET;
1064
1065         i = readmem(cosa, d.code, d.len, d.addr);
1066         if (i < 0) {
1067                 pr_notice("cosa%d: reading memory failed: %d\n", cosa->num, i);
1068                 return -EIO;
1069         }
1070         pr_info("cosa%d: reading card memory - 0x%04x bytes at 0x%04x\n",
1071                 cosa->num, d.len, d.addr);
1072         cosa->firmware_status |= COSA_FW_RESET;
1073         return 0;
1074 }
1075
1076 /* High-level function to start microcode. Calls startmicrocode(). */
1077 static inline int cosa_start(struct cosa_data *cosa, int address)
1078 {
1079         int i;
1080
1081         if (cosa->usage > 1)
1082                 pr_info("cosa%d: WARNING: start microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n",
1083                         cosa->num, cosa->usage);
1084
1085         if ((cosa->firmware_status & (COSA_FW_RESET | COSA_FW_DOWNLOAD))
1086                 != (COSA_FW_RESET | COSA_FW_DOWNLOAD)) {
1087                 pr_notice("%s: download the microcode and/or reset the card first (status %d)\n",
1088                           cosa->name, cosa->firmware_status);
1089                 return -EPERM;
1090         }
1091         cosa->firmware_status &= ~COSA_FW_RESET;
1092         i = startmicrocode(cosa, address);
1093         if (i < 0) {
1094                 pr_notice("cosa%d: start microcode at 0x%04x failed: %d\n",
1095                           cosa->num, address, i);
1096                 return -EIO;
1097         }
1098         pr_info("cosa%d: starting microcode at 0x%04x\n", cosa->num, address);
1099         cosa->startaddr = address;
1100         cosa->firmware_status |= COSA_FW_START;
1101         return 0;
1102 }
1103
1104 /* Buffer of size at least COSA_MAX_ID_STRING is expected */
1105 static inline int cosa_getidstr(struct cosa_data *cosa, char __user *string)
1106 {
1107         int l = strlen(cosa->id_string) + 1;
1108
1109         if (copy_to_user(string, cosa->id_string, l))
1110                 return -EFAULT;
1111         return l;
1112 }
1113
1114 /* Buffer of size at least COSA_MAX_ID_STRING is expected */
1115 static inline int cosa_gettype(struct cosa_data *cosa, char __user *string)
1116 {
1117         int l = strlen(cosa->type) + 1;
1118
1119         if (copy_to_user(string, cosa->type, l))
1120                 return -EFAULT;
1121         return l;
1122 }
1123
1124 static int cosa_ioctl_common(struct cosa_data *cosa,
1125                              struct channel_data *channel, unsigned int cmd,
1126                              unsigned long arg)
1127 {
1128         void __user *argp = (void __user *)arg;
1129
1130         switch (cmd) {
1131         case COSAIORSET:        /* Reset the device */
1132                 if (!capable(CAP_NET_ADMIN))
1133                         return -EACCES;
1134                 return cosa_reset(cosa);
1135         case COSAIOSTRT:        /* Start the firmware */
1136                 if (!capable(CAP_SYS_RAWIO))
1137                         return -EACCES;
1138                 return cosa_start(cosa, arg);
1139         case COSAIODOWNLD:      /* Download the firmware */
1140                 if (!capable(CAP_SYS_RAWIO))
1141                         return -EACCES;
1142
1143                 return cosa_download(cosa, argp);
1144         case COSAIORMEM:
1145                 if (!capable(CAP_SYS_RAWIO))
1146                         return -EACCES;
1147                 return cosa_readmem(cosa, argp);
1148         case COSAIORTYPE:
1149                 return cosa_gettype(cosa, argp);
1150         case COSAIORIDSTR:
1151                 return cosa_getidstr(cosa, argp);
1152         case COSAIONRCARDS:
1153                 return nr_cards;
1154         case COSAIONRCHANS:
1155                 return cosa->nchannels;
1156         case COSAIOBMSET:
1157                 if (!capable(CAP_SYS_RAWIO))
1158                         return -EACCES;
1159                 if (is_8bit(cosa))
1160                         return -EINVAL;
1161                 if (arg != COSA_BM_OFF && arg != COSA_BM_ON)
1162                         return -EINVAL;
1163                 cosa->busmaster = arg;
1164                 return 0;
1165         case COSAIOBMGET:
1166                 return cosa->busmaster;
1167         }
1168         return -ENOIOCTLCMD;
1169 }
1170
1171 static long cosa_chardev_ioctl(struct file *file, unsigned int cmd,
1172                                unsigned long arg)
1173 {
1174         struct channel_data *channel = file->private_data;
1175         struct cosa_data *cosa;
1176         long ret;
1177
1178         mutex_lock(&cosa_chardev_mutex);
1179         cosa = channel->cosa;
1180         ret = cosa_ioctl_common(cosa, channel, cmd, arg);
1181         mutex_unlock(&cosa_chardev_mutex);
1182         return ret;
1183 }
1184
1185 /*---------- HW layer interface ---------- */
1186
1187 /* The higher layer can bind itself to the HW layer by setting the callbacks
1188  * in the channel_data structure and by using these routines.
1189  */
1190 static void cosa_enable_rx(struct channel_data *chan)
1191 {
1192         struct cosa_data *cosa = chan->cosa;
1193
1194         if (!test_and_set_bit(chan->num, &cosa->rxbitmap))
1195                 put_driver_status(cosa);
1196 }
1197
1198 static void cosa_disable_rx(struct channel_data *chan)
1199 {
1200         struct cosa_data *cosa = chan->cosa;
1201
1202         if (test_and_clear_bit(chan->num, &cosa->rxbitmap))
1203                 put_driver_status(cosa);
1204 }
1205
1206 /* FIXME: This routine probably should check for cosa_start_tx() called when
1207  * the previous transmit is still unfinished. In this case the non-zero
1208  * return value should indicate to the caller that the queuing(sp?) up
1209  * the transmit has failed.
1210  */
1211 static int cosa_start_tx(struct channel_data *chan, char *buf, int len)
1212 {
1213         struct cosa_data *cosa = chan->cosa;
1214         unsigned long flags;
1215 #ifdef DEBUG_DATA
1216         int i;
1217
1218         pr_info("cosa%dc%d: starting tx(0x%x)",
1219                 chan->cosa->num, chan->num, len);
1220         for (i = 0; i < len; i++)
1221                 pr_cont(" %02x", buf[i]&0xff);
1222         pr_cont("\n");
1223 #endif
1224         spin_lock_irqsave(&cosa->lock, flags);
1225         chan->txbuf = buf;
1226         chan->txsize = len;
1227         if (len > COSA_MTU)
1228                 chan->txsize = COSA_MTU;
1229         spin_unlock_irqrestore(&cosa->lock, flags);
1230
1231         /* Tell the firmware we are ready */
1232         set_bit(chan->num, &cosa->txbitmap);
1233         put_driver_status(cosa);
1234
1235         return 0;
1236 }
1237
1238 static void put_driver_status(struct cosa_data *cosa)
1239 {
1240         unsigned long flags;
1241         int status;
1242
1243         spin_lock_irqsave(&cosa->lock, flags);
1244
1245         status = (cosa->rxbitmap ? DRIVER_RX_READY : 0)
1246                 | (cosa->txbitmap ? DRIVER_TX_READY : 0)
1247                 | (cosa->txbitmap ? ~(cosa->txbitmap << DRIVER_TXMAP_SHIFT)
1248                         & DRIVER_TXMAP_MASK : 0);
1249         if (!cosa->rxtx) {
1250                 if (cosa->rxbitmap | cosa->txbitmap) {
1251                         if (!cosa->enabled) {
1252                                 cosa_putstatus(cosa, SR_RX_INT_ENA);
1253 #ifdef DEBUG_IO
1254                                 debug_status_out(cosa, SR_RX_INT_ENA);
1255 #endif
1256                                 cosa->enabled = 1;
1257                         }
1258                 } else if (cosa->enabled) {
1259                         cosa->enabled = 0;
1260                         cosa_putstatus(cosa, 0);
1261 #ifdef DEBUG_IO
1262                         debug_status_out(cosa, 0);
1263 #endif
1264                 }
1265                 cosa_putdata8(cosa, status);
1266 #ifdef DEBUG_IO
1267                 debug_data_cmd(cosa, status);
1268 #endif
1269         }
1270         spin_unlock_irqrestore(&cosa->lock, flags);
1271 }
1272
1273 static void put_driver_status_nolock(struct cosa_data *cosa)
1274 {
1275         int status;
1276
1277         status = (cosa->rxbitmap ? DRIVER_RX_READY : 0)
1278                 | (cosa->txbitmap ? DRIVER_TX_READY : 0)
1279                 | (cosa->txbitmap ? ~(cosa->txbitmap << DRIVER_TXMAP_SHIFT)
1280                         & DRIVER_TXMAP_MASK : 0);
1281
1282         if (cosa->rxbitmap | cosa->txbitmap) {
1283                 cosa_putstatus(cosa, SR_RX_INT_ENA);
1284 #ifdef DEBUG_IO
1285                 debug_status_out(cosa, SR_RX_INT_ENA);
1286 #endif
1287                 cosa->enabled = 1;
1288         } else {
1289                 cosa_putstatus(cosa, 0);
1290 #ifdef DEBUG_IO
1291                 debug_status_out(cosa, 0);
1292 #endif
1293                 cosa->enabled = 0;
1294         }
1295         cosa_putdata8(cosa, status);
1296 #ifdef DEBUG_IO
1297         debug_data_cmd(cosa, status);
1298 #endif
1299 }
1300
1301 /* The "kickme" function: When the DMA times out, this is called to
1302  * clean up the driver status.
1303  * FIXME: Preliminary support, the interface is probably wrong.
1304  */
1305 static void cosa_kick(struct cosa_data *cosa)
1306 {
1307         unsigned long flags, flags1;
1308         char *s = "(probably) IRQ";
1309
1310         if (test_bit(RXBIT, &cosa->rxtx))
1311                 s = "RX DMA";
1312         if (test_bit(TXBIT, &cosa->rxtx))
1313                 s = "TX DMA";
1314
1315         pr_info("%s: %s timeout - restarting\n", cosa->name, s);
1316         spin_lock_irqsave(&cosa->lock, flags);
1317         cosa->rxtx = 0;
1318
1319         flags1 = claim_dma_lock();
1320         disable_dma(cosa->dma);
1321         clear_dma_ff(cosa->dma);
1322         release_dma_lock(flags1);
1323
1324         /* FIXME: Anything else? */
1325         udelay(100);
1326         cosa_putstatus(cosa, 0);
1327         udelay(100);
1328         (void)cosa_getdata8(cosa);
1329         udelay(100);
1330         cosa_putdata8(cosa, 0);
1331         udelay(100);
1332         put_driver_status_nolock(cosa);
1333         spin_unlock_irqrestore(&cosa->lock, flags);
1334 }
1335
1336 /* Check if the whole buffer is DMA-able. It means it is below the 16M of
1337  * physical memory and doesn't span the 64k boundary. For now it seems
1338  * SKB's never do this, but we'll check this anyway.
1339  */
1340 static int cosa_dma_able(struct channel_data *chan, char *buf, int len)
1341 {
1342         static int count;
1343         unsigned long b = (unsigned long)buf;
1344
1345         if (b + len >= MAX_DMA_ADDRESS)
1346                 return 0;
1347         if ((b ^ (b + len)) & 0x10000) {
1348                 if (count++ < 5)
1349                         pr_info("%s: packet spanning a 64k boundary\n",
1350                                 chan->name);
1351                 return 0;
1352         }
1353         return 1;
1354 }
1355
1356 /* ---------- The SRP/COSA ROM monitor functions ---------- */
1357
1358 /* Downloading SRP microcode: say "w" to SRP monitor, it answers by "w=",
1359  * drivers need to say 4-digit hex number meaning start address of the microcode
1360  * separated by a single space. Monitor replies by saying " =". Now driver
1361  * has to write 4-digit hex number meaning the last byte address ended
1362  * by a single space. Monitor has to reply with a space. Now the download
1363  * begins. After the download monitor replies with "\r\n." (CR LF dot).
1364  */
1365 static int download(struct cosa_data *cosa, const char __user *microcode, int length, int address)
1366 {
1367         int i;
1368
1369         if (put_wait_data(cosa, 'w') == -1)
1370                 return -1;
1371         if ((i=get_wait_data(cosa)) != 'w') { printk("dnld: 0x%04x\n",i); return -2;}
1372         if (get_wait_data(cosa) != '=')
1373                 return -3;
1374
1375         if (puthexnumber(cosa, address) < 0)
1376                 return -4;
1377         if (put_wait_data(cosa, ' ') == -1)
1378                 return -10;
1379         if (get_wait_data(cosa) != ' ')
1380                 return -11;
1381         if (get_wait_data(cosa) != '=')
1382                 return -12;
1383
1384         if (puthexnumber(cosa, address + length - 1) < 0)
1385                 return -13;
1386         if (put_wait_data(cosa, ' ') == -1)
1387                 return -18;
1388         if (get_wait_data(cosa) != ' ')
1389                 return -19;
1390
1391         while (length--) {
1392                 char c;
1393 #ifndef SRP_DOWNLOAD_AT_BOOT
1394                 if (get_user(c, microcode))
1395                         return -23; /* ??? */
1396 #else
1397                 c = *microcode;
1398 #endif
1399                 if (put_wait_data(cosa, c) == -1)
1400                         return -20;
1401                 microcode++;
1402         }
1403
1404         if (get_wait_data(cosa) != '\r')
1405                 return -21;
1406         if (get_wait_data(cosa) != '\n')
1407                 return -22;
1408         if (get_wait_data(cosa) != '.')
1409                 return -23;
1410 #if 0
1411         printk(KERN_DEBUG "cosa%d: download completed.\n", cosa->num);
1412 #endif
1413         return 0;
1414 }
1415
1416 /* Starting microcode is done via the "g" command of the SRP monitor.
1417  * The chat should be the following: "g" "g=" "<addr><CR>"
1418  * "<CR><CR><LF><CR><LF>".
1419  */
1420 static int startmicrocode(struct cosa_data *cosa, int address)
1421 {
1422         if (put_wait_data(cosa, 'g') == -1)
1423                 return -1;
1424         if (get_wait_data(cosa) != 'g')
1425                 return -2;
1426         if (get_wait_data(cosa) != '=')
1427                 return -3;
1428
1429         if (puthexnumber(cosa, address) < 0)
1430                 return -4;
1431         if (put_wait_data(cosa, '\r') == -1)
1432                 return -5;
1433
1434         if (get_wait_data(cosa) != '\r')
1435                 return -6;
1436         if (get_wait_data(cosa) != '\r')
1437                 return -7;
1438         if (get_wait_data(cosa) != '\n')
1439                 return -8;
1440         if (get_wait_data(cosa) != '\r')
1441                 return -9;
1442         if (get_wait_data(cosa) != '\n')
1443                 return -10;
1444 #if 0
1445         printk(KERN_DEBUG "cosa%d: microcode started\n", cosa->num);
1446 #endif
1447         return 0;
1448 }
1449
1450 /* Reading memory is done via the "r" command of the SRP monitor.
1451  * The chat is the following "r" "r=" "<addr> " " =" "<last_byte> " " "
1452  * Then driver can read the data and the conversation is finished
1453  * by SRP monitor sending "<CR><LF>." (dot at the end).
1454  *
1455  * This routine is not needed during the normal operation and serves
1456  * for debugging purposes only.
1457  */
1458 static int readmem(struct cosa_data *cosa, char __user *microcode, int length, int address)
1459 {
1460         if (put_wait_data(cosa, 'r') == -1)
1461                 return -1;
1462         if ((get_wait_data(cosa)) != 'r')
1463                 return -2;
1464         if ((get_wait_data(cosa)) != '=')
1465                 return -3;
1466
1467         if (puthexnumber(cosa, address) < 0)
1468                 return -4;
1469         if (put_wait_data(cosa, ' ') == -1)
1470                 return -5;
1471         if (get_wait_data(cosa) != ' ')
1472                 return -6;
1473         if (get_wait_data(cosa) != '=')
1474                 return -7;
1475
1476         if (puthexnumber(cosa, address + length - 1) < 0)
1477                 return -8;
1478         if (put_wait_data(cosa, ' ') == -1)
1479                 return -9;
1480         if (get_wait_data(cosa) != ' ')
1481                 return -10;
1482
1483         while (length--) {
1484                 char c;
1485                 int i;
1486
1487                 i = get_wait_data(cosa);
1488                 if (i == -1) {
1489                         pr_info("0x%04x bytes remaining\n", length);
1490                         return -11;
1491                 }
1492                 c = i;
1493 #if 1
1494                 if (put_user(c, microcode))
1495                         return -23; /* ??? */
1496 #else
1497                 *microcode = c;
1498 #endif
1499                 microcode++;
1500         }
1501
1502         if (get_wait_data(cosa) != '\r')
1503                 return -21;
1504         if (get_wait_data(cosa) != '\n')
1505                 return -22;
1506         if (get_wait_data(cosa) != '.')
1507                 return -23;
1508 #if 0
1509         printk(KERN_DEBUG "cosa%d: readmem completed.\n", cosa->num);
1510 #endif
1511         return 0;
1512 }
1513
1514 /* This function resets the device and reads the initial prompt
1515  * of the device's ROM monitor.
1516  */
1517 static int cosa_reset_and_read_id(struct cosa_data *cosa, char *idstring)
1518 {
1519         int i = 0, id = 0, prev = 0, curr = 0;
1520
1521         /* Reset the card ... */
1522         cosa_putstatus(cosa, 0);
1523         cosa_getdata8(cosa);
1524         cosa_putstatus(cosa, SR_RST);
1525         msleep(500);
1526         /* Disable all IRQs from the card */
1527         cosa_putstatus(cosa, 0);
1528
1529         /* Try to read the ID string. The card then prints out the
1530          * identification string ended by the "\n\x2e".
1531          *
1532          * The following loop is indexed through i (instead of id)
1533          * to avoid looping forever when for any reason
1534          * the port returns '\r', '\n' or '\x2e' permanently.
1535          */
1536         for (i = 0; i < COSA_MAX_ID_STRING - 1; i++, prev = curr) {
1537                 curr = get_wait_data(cosa);
1538                 if (curr == -1)
1539                         return -1;
1540
1541                 curr &= 0xff;
1542                 if (curr != '\r' && curr != '\n' && curr != 0x2e)
1543                         idstring[id++] = curr;
1544                 if (curr == 0x2e && prev == '\n')
1545                         break;
1546         }
1547         /* Perhaps we should fail when i==COSA_MAX_ID_STRING-1 ? */
1548         idstring[id] = '\0';
1549         return id;
1550 }
1551
1552 /* ---------- Auxiliary routines for COSA/SRP monitor ---------- */
1553
1554 /* This routine gets the data byte from the card waiting for the SR_RX_RDY
1555  * bit to be set in a loop. It should be used in the exceptional cases
1556  * only (for example when resetting the card or downloading the firmware.
1557  */
1558 static int get_wait_data(struct cosa_data *cosa)
1559 {
1560         int retries = 1000;
1561
1562         while (--retries) {
1563                 /* read data and return them */
1564                 if (cosa_getstatus(cosa) & SR_RX_RDY) {
1565                         short r;
1566
1567                         r = cosa_getdata8(cosa);
1568 #if 0
1569                         pr_info("get_wait_data returning after %d retries\n",
1570                                 999 - retries);
1571 #endif
1572                         return r;
1573                 }
1574                 /* sleep if not ready to read */
1575                 schedule_timeout_interruptible(1);
1576         }
1577         pr_info("timeout in get_wait_data (status 0x%x)\n",
1578                 cosa_getstatus(cosa));
1579         return -1;
1580 }
1581
1582 /* This routine puts the data byte to the card waiting for the SR_TX_RDY
1583  * bit to be set in a loop. It should be used in the exceptional cases
1584  * only (for example when resetting the card or downloading the firmware).
1585  */
1586 static int put_wait_data(struct cosa_data *cosa, int data)
1587 {
1588         int retries = 1000;
1589
1590         while (--retries) {
1591                 /* read data and return them */
1592                 if (cosa_getstatus(cosa) & SR_TX_RDY) {
1593                         cosa_putdata8(cosa, data);
1594 #if 0
1595                         pr_info("Putdata: %d retries\n", 999 - retries);
1596 #endif
1597                         return 0;
1598                 }
1599 #if 0
1600                 /* sleep if not ready to read */
1601                 schedule_timeout_interruptible(1);
1602 #endif
1603         }
1604         pr_info("cosa%d: timeout in put_wait_data (status 0x%x)\n",
1605                 cosa->num, cosa_getstatus(cosa));
1606         return -1;
1607 }
1608
1609 /* The following routine puts the hexadecimal number into the SRP monitor
1610  * and verifies the proper echo of the sent bytes. Returns 0 on success,
1611  * negative number on failure (-1,-3,-5,-7) means that put_wait_data() failed,
1612  * (-2,-4,-6,-8) means that reading echo failed.
1613  */
1614 static int puthexnumber(struct cosa_data *cosa, int number)
1615 {
1616         char temp[5];
1617         int i;
1618
1619         /* Well, I should probably replace this by something faster. */
1620         sprintf(temp, "%04X", number);
1621         for (i = 0; i < 4; i++) {
1622                 if (put_wait_data(cosa, temp[i]) == -1) {
1623                         pr_notice("cosa%d: puthexnumber failed to write byte %d\n",
1624                                   cosa->num, i);
1625                         return -1 - 2 * i;
1626                 }
1627                 if (get_wait_data(cosa) != temp[i]) {
1628                         pr_notice("cosa%d: puthexhumber failed to read echo of byte %d\n",
1629                                   cosa->num, i);
1630                         return -2 - 2 * i;
1631                 }
1632         }
1633         return 0;
1634 }
1635
1636 /* ---------- Interrupt routines ---------- */
1637
1638 /* There are three types of interrupt:
1639  * At the beginning of transmit - this handled is in tx_interrupt(),
1640  * at the beginning of receive - it is in rx_interrupt() and
1641  * at the end of transmit/receive - it is the eot_interrupt() function.
1642  * These functions are multiplexed by cosa_interrupt() according to the
1643  * COSA status byte. I have moved the rx/tx/eot interrupt handling into
1644  * separate functions to make it more readable. These functions are inline,
1645  * so there should be no overhead of function call.
1646  *
1647  * In the COSA bus-master mode, we need to tell the card the address of a
1648  * buffer. Unfortunately, COSA may be too slow for us, so we must busy-wait.
1649  * It's time to use the bottom half :-(
1650  */
1651
1652 /* Transmit interrupt routine - called when COSA is willing to obtain
1653  * data from the OS. The most tricky part of the routine is selection
1654  * of channel we (OS) want to send packet for. For SRP we should probably
1655  * use the round-robin approach. The newer COSA firmwares have a simple
1656  * flow-control - in the status word has bits 2 and 3 set to 1 means that the
1657  * channel 0 or 1 doesn't want to receive data.
1658  *
1659  * It seems there is a bug in COSA firmware (need to trace it further):
1660  * When the driver status says that the kernel has no more data for transmit
1661  * (e.g. at the end of TX DMA) and then the kernel changes its mind
1662  * (e.g. new packet is queued to hard_start_xmit()), the card issues
1663  * the TX interrupt but does not mark the channel as ready-to-transmit.
1664  * The fix seems to be to push the packet to COSA despite its request.
1665  * We first try to obey the card's opinion, and then fall back to forced TX.
1666  */
1667 static inline void tx_interrupt(struct cosa_data *cosa, int status)
1668 {
1669         unsigned long flags, flags1;
1670 #ifdef DEBUG_IRQS
1671         pr_info("cosa%d: SR_DOWN_REQUEST status=0x%04x\n", cosa->num, status);
1672 #endif
1673         spin_lock_irqsave(&cosa->lock, flags);
1674         set_bit(TXBIT, &cosa->rxtx);
1675         if (!test_bit(IRQBIT, &cosa->rxtx)) {
1676                 /* flow control, see the comment above */
1677                 int i = 0;
1678
1679                 if (!cosa->txbitmap) {
1680                         pr_warn("%s: No channel wants data in TX IRQ. Expect DMA timeout.\n",
1681                                 cosa->name);
1682                         put_driver_status_nolock(cosa);
1683                         clear_bit(TXBIT, &cosa->rxtx);
1684                         spin_unlock_irqrestore(&cosa->lock, flags);
1685                         return;
1686                 }
1687                 while (1) {
1688                         cosa->txchan++;
1689                         i++;
1690                         if (cosa->txchan >= cosa->nchannels)
1691                                 cosa->txchan = 0;
1692                         if (!(cosa->txbitmap & (1 << cosa->txchan)))
1693                                 continue;
1694                         if (~status &
1695                             (1 << (cosa->txchan + DRIVER_TXMAP_SHIFT)))
1696                                 break;
1697                         /* in second pass, accept first ready-to-TX channel */
1698                         if (i > cosa->nchannels) {
1699                                 /* Can be safely ignored */
1700 #ifdef DEBUG_IRQS
1701                                 printk(KERN_DEBUG "%s: Forcing TX "
1702                                         "to not-ready channel %d\n",
1703                                         cosa->name, cosa->txchan);
1704 #endif
1705                                 break;
1706                         }
1707                 }
1708
1709                 cosa->txsize = cosa->chan[cosa->txchan].txsize;
1710                 if (cosa_dma_able(cosa->chan + cosa->txchan,
1711                                   cosa->chan[cosa->txchan].txbuf,
1712                                   cosa->txsize)) {
1713                         cosa->txbuf = cosa->chan[cosa->txchan].txbuf;
1714                 } else {
1715                         memcpy(cosa->bouncebuf, cosa->chan[cosa->txchan].txbuf,
1716                                cosa->txsize);
1717                         cosa->txbuf = cosa->bouncebuf;
1718                 }
1719         }
1720
1721         if (is_8bit(cosa)) {
1722                 if (!test_bit(IRQBIT, &cosa->rxtx)) {
1723                         cosa_putstatus(cosa, SR_TX_INT_ENA);
1724                         cosa_putdata8(cosa, ((cosa->txchan << 5) & 0xe0) |
1725                                 ((cosa->txsize >> 8) & 0x1f));
1726 #ifdef DEBUG_IO
1727                         debug_status_out(cosa, SR_TX_INT_ENA);
1728                         debug_data_out(cosa, ((cosa->txchan << 5) & 0xe0) |
1729                                        ((cosa->txsize >> 8) & 0x1f));
1730                         debug_data_in(cosa, cosa_getdata8(cosa));
1731 #else
1732                         cosa_getdata8(cosa);
1733 #endif
1734                         set_bit(IRQBIT, &cosa->rxtx);
1735                         spin_unlock_irqrestore(&cosa->lock, flags);
1736                         return;
1737                 } else {
1738                         clear_bit(IRQBIT, &cosa->rxtx);
1739                         cosa_putstatus(cosa, 0);
1740                         cosa_putdata8(cosa, cosa->txsize & 0xff);
1741 #ifdef DEBUG_IO
1742                         debug_status_out(cosa, 0);
1743                         debug_data_out(cosa, cosa->txsize & 0xff);
1744 #endif
1745                 }
1746         } else {
1747                 cosa_putstatus(cosa, SR_TX_INT_ENA);
1748                 cosa_putdata16(cosa, ((cosa->txchan << 13) & 0xe000)
1749                         | (cosa->txsize & 0x1fff));
1750 #ifdef DEBUG_IO
1751                 debug_status_out(cosa, SR_TX_INT_ENA);
1752                 debug_data_out(cosa, ((cosa->txchan << 13) & 0xe000) |
1753                                (cosa->txsize & 0x1fff));
1754                 debug_data_in(cosa, cosa_getdata8(cosa));
1755                 debug_status_out(cosa, 0);
1756 #else
1757                 cosa_getdata8(cosa);
1758 #endif
1759                 cosa_putstatus(cosa, 0);
1760         }
1761
1762         if (cosa->busmaster) {
1763                 unsigned long addr = virt_to_bus(cosa->txbuf);
1764                 int count = 0;
1765
1766                 pr_info("busmaster IRQ\n");
1767                 while (!(cosa_getstatus(cosa) & SR_TX_RDY)) {
1768                         count++;
1769                         udelay(10);
1770                         if (count > 1000)
1771                                 break;
1772                 }
1773                 pr_info("status %x\n", cosa_getstatus(cosa));
1774                 pr_info("ready after %d loops\n", count);
1775                 cosa_putdata16(cosa, (addr >> 16) & 0xffff);
1776
1777                 count = 0;
1778                 while (!(cosa_getstatus(cosa) & SR_TX_RDY)) {
1779                         count++;
1780                         if (count > 1000)
1781                                 break;
1782                         udelay(10);
1783                 }
1784                 pr_info("ready after %d loops\n", count);
1785                 cosa_putdata16(cosa, addr & 0xffff);
1786                 flags1 = claim_dma_lock();
1787                 set_dma_mode(cosa->dma, DMA_MODE_CASCADE);
1788                 enable_dma(cosa->dma);
1789                 release_dma_lock(flags1);
1790         } else {
1791                 /* start the DMA */
1792                 flags1 = claim_dma_lock();
1793                 disable_dma(cosa->dma);
1794                 clear_dma_ff(cosa->dma);
1795                 set_dma_mode(cosa->dma, DMA_MODE_WRITE);
1796                 set_dma_addr(cosa->dma, virt_to_bus(cosa->txbuf));
1797                 set_dma_count(cosa->dma, cosa->txsize);
1798                 enable_dma(cosa->dma);
1799                 release_dma_lock(flags1);
1800         }
1801         cosa_putstatus(cosa, SR_TX_DMA_ENA | SR_USR_INT_ENA);
1802 #ifdef DEBUG_IO
1803         debug_status_out(cosa, SR_TX_DMA_ENA | SR_USR_INT_ENA);
1804 #endif
1805         spin_unlock_irqrestore(&cosa->lock, flags);
1806 }
1807
1808 static inline void rx_interrupt(struct cosa_data *cosa, int status)
1809 {
1810         unsigned long flags;
1811 #ifdef DEBUG_IRQS
1812         pr_info("cosa%d: SR_UP_REQUEST\n", cosa->num);
1813 #endif
1814
1815         spin_lock_irqsave(&cosa->lock, flags);
1816         set_bit(RXBIT, &cosa->rxtx);
1817
1818         if (is_8bit(cosa)) {
1819                 if (!test_bit(IRQBIT, &cosa->rxtx)) {
1820                         set_bit(IRQBIT, &cosa->rxtx);
1821                         put_driver_status_nolock(cosa);
1822                         cosa->rxsize = cosa_getdata8(cosa) << 8;
1823 #ifdef DEBUG_IO
1824                         debug_data_in(cosa, cosa->rxsize >> 8);
1825 #endif
1826                         spin_unlock_irqrestore(&cosa->lock, flags);
1827                         return;
1828                 } else {
1829                         clear_bit(IRQBIT, &cosa->rxtx);
1830                         cosa->rxsize |= cosa_getdata8(cosa) & 0xff;
1831 #ifdef DEBUG_IO
1832                         debug_data_in(cosa, cosa->rxsize & 0xff);
1833 #endif
1834 #if 0
1835                         pr_info("cosa%d: receive rxsize = (0x%04x)\n",
1836                                 cosa->num, cosa->rxsize);
1837 #endif
1838                 }
1839         } else {
1840                 cosa->rxsize = cosa_getdata16(cosa);
1841 #ifdef DEBUG_IO
1842                 debug_data_in(cosa, cosa->rxsize);
1843 #endif
1844 #if 0
1845                 pr_info("cosa%d: receive rxsize = (0x%04x)\n",
1846                         cosa->num, cosa->rxsize);
1847 #endif
1848         }
1849         if (((cosa->rxsize & 0xe000) >> 13) >= cosa->nchannels) {
1850                 pr_warn("%s: rx for unknown channel (0x%04x)\n",
1851                         cosa->name, cosa->rxsize);
1852                 spin_unlock_irqrestore(&cosa->lock, flags);
1853                 goto reject;
1854         }
1855         cosa->rxchan = cosa->chan + ((cosa->rxsize & 0xe000) >> 13);
1856         cosa->rxsize &= 0x1fff;
1857         spin_unlock_irqrestore(&cosa->lock, flags);
1858
1859         cosa->rxbuf = NULL;
1860         if (cosa->rxchan->setup_rx)
1861                 cosa->rxbuf = cosa->rxchan->setup_rx(cosa->rxchan, cosa->rxsize);
1862
1863         if (!cosa->rxbuf) {
1864 reject:         /* Reject the packet */
1865                 pr_info("cosa%d: rejecting packet on channel %d\n",
1866                         cosa->num, cosa->rxchan->num);
1867                 cosa->rxbuf = cosa->bouncebuf;
1868         }
1869
1870         /* start the DMA */
1871         flags = claim_dma_lock();
1872         disable_dma(cosa->dma);
1873         clear_dma_ff(cosa->dma);
1874         set_dma_mode(cosa->dma, DMA_MODE_READ);
1875         if (cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize & 0x1fff))
1876                 set_dma_addr(cosa->dma, virt_to_bus(cosa->rxbuf));
1877         else
1878                 set_dma_addr(cosa->dma, virt_to_bus(cosa->bouncebuf));
1879
1880         set_dma_count(cosa->dma, (cosa->rxsize & 0x1fff));
1881         enable_dma(cosa->dma);
1882         release_dma_lock(flags);
1883         spin_lock_irqsave(&cosa->lock, flags);
1884         cosa_putstatus(cosa, SR_RX_DMA_ENA | SR_USR_INT_ENA);
1885         if (!is_8bit(cosa) && (status & SR_TX_RDY))
1886                 cosa_putdata8(cosa, DRIVER_RX_READY);
1887 #ifdef DEBUG_IO
1888         debug_status_out(cosa, SR_RX_DMA_ENA | SR_USR_INT_ENA);
1889         if (!is_8bit(cosa) && (status & SR_TX_RDY))
1890                 debug_data_cmd(cosa, DRIVER_RX_READY);
1891 #endif
1892         spin_unlock_irqrestore(&cosa->lock, flags);
1893 }
1894
1895 static inline void eot_interrupt(struct cosa_data *cosa, int status)
1896 {
1897         unsigned long flags, flags1;
1898
1899         spin_lock_irqsave(&cosa->lock, flags);
1900         flags1 = claim_dma_lock();
1901         disable_dma(cosa->dma);
1902         clear_dma_ff(cosa->dma);
1903         release_dma_lock(flags1);
1904         if (test_bit(TXBIT, &cosa->rxtx)) {
1905                 struct channel_data *chan = cosa->chan + cosa->txchan;
1906
1907                 if (chan->tx_done)
1908                         if (chan->tx_done(chan, cosa->txsize))
1909                                 clear_bit(chan->num, &cosa->txbitmap);
1910         } else if (test_bit(RXBIT, &cosa->rxtx)) {
1911 #ifdef DEBUG_DATA
1912         {
1913                 int i;
1914
1915                 pr_info("cosa%dc%d: done rx(0x%x)",
1916                         cosa->num, cosa->rxchan->num, cosa->rxsize);
1917                 for (i = 0; i < cosa->rxsize; i++)
1918                         pr_cont(" %02x", cosa->rxbuf[i]&0xff);
1919                 pr_cont("\n");
1920         }
1921 #endif
1922                 /* Packet for unknown channel? */
1923                 if (cosa->rxbuf == cosa->bouncebuf)
1924                         goto out;
1925                 if (!cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize))
1926                         memcpy(cosa->rxbuf, cosa->bouncebuf, cosa->rxsize);
1927                 if (cosa->rxchan->rx_done)
1928                         if (cosa->rxchan->rx_done(cosa->rxchan))
1929                                 clear_bit(cosa->rxchan->num, &cosa->rxbitmap);
1930         } else {
1931                 pr_notice("cosa%d: unexpected EOT interrupt\n", cosa->num);
1932         }
1933         /* Clear the RXBIT, TXBIT and IRQBIT (the latest should be
1934          * cleared anyway). We should do it as soon as possible
1935          * so that we can tell the COSA we are done and to give it a time
1936          * for recovery.
1937          */
1938 out:
1939         cosa->rxtx = 0;
1940         put_driver_status_nolock(cosa);
1941         spin_unlock_irqrestore(&cosa->lock, flags);
1942 }
1943
1944 static irqreturn_t cosa_interrupt(int irq, void *cosa_)
1945 {
1946         unsigned status;
1947         int count = 0;
1948         struct cosa_data *cosa = cosa_;
1949 again:
1950         status = cosa_getstatus(cosa);
1951 #ifdef DEBUG_IRQS
1952         pr_info("cosa%d: got IRQ, status 0x%02x\n", cosa->num, status & 0xff);
1953 #endif
1954 #ifdef DEBUG_IO
1955         debug_status_in(cosa, status);
1956 #endif
1957         switch (status & SR_CMD_FROM_SRP_MASK) {
1958         case SR_DOWN_REQUEST:
1959                 tx_interrupt(cosa, status);
1960                 break;
1961         case SR_UP_REQUEST:
1962                 rx_interrupt(cosa, status);
1963                 break;
1964         case SR_END_OF_TRANSFER:
1965                 eot_interrupt(cosa, status);
1966                 break;
1967         default:
1968                 /* We may be too fast for SRP. Try to wait a bit more. */
1969                 if (count++ < 100) {
1970                         udelay(100);
1971                         goto again;
1972                 }
1973                 pr_info("cosa%d: unknown status 0x%02x in IRQ after %d retries\n",
1974                         cosa->num, status & 0xff, count);
1975         }
1976 #ifdef DEBUG_IRQS
1977         if (count)
1978                 pr_info("%s: %d-times got unknown status in IRQ\n",
1979                         cosa->name, count);
1980         else
1981                 pr_info("%s: returning from IRQ\n", cosa->name);
1982 #endif
1983         return IRQ_HANDLED;
1984 }
1985
1986 /* ---------- I/O debugging routines ---------- */
1987 /* These routines can be used to monitor COSA/SRP I/O and to printk()
1988  * the data being transferred on the data and status I/O port in a
1989  * readable way.
1990  */
1991
1992 #ifdef DEBUG_IO
1993 static void debug_status_in(struct cosa_data *cosa, int status)
1994 {
1995         char *s;
1996
1997         switch (status & SR_CMD_FROM_SRP_MASK) {
1998         case SR_UP_REQUEST:
1999                 s = "RX_REQ";
2000                 break;
2001         case SR_DOWN_REQUEST:
2002                 s = "TX_REQ";
2003                 break;
2004         case SR_END_OF_TRANSFER:
2005                 s = "ET_REQ";
2006                 break;
2007         default:
2008                 s = "NO_REQ";
2009                 break;
2010         }
2011         pr_info("%s: IO: status -> 0x%02x (%s%s%s%s)\n",
2012                 cosa->name,
2013                 status,
2014                 status & SR_USR_RQ ? "USR_RQ|" : "",
2015                 status & SR_TX_RDY ? "TX_RDY|" : "",
2016                 status & SR_RX_RDY ? "RX_RDY|" : "",
2017                 s);
2018 }
2019
2020 static void debug_status_out(struct cosa_data *cosa, int status)
2021 {
2022         pr_info("%s: IO: status <- 0x%02x (%s%s%s%s%s%s)\n",
2023                 cosa->name,
2024                 status,
2025                 status & SR_RX_DMA_ENA  ? "RXDMA|"  : "!rxdma|",
2026                 status & SR_TX_DMA_ENA  ? "TXDMA|"  : "!txdma|",
2027                 status & SR_RST         ? "RESET|"  : "",
2028                 status & SR_USR_INT_ENA ? "USRINT|" : "!usrint|",
2029                 status & SR_TX_INT_ENA  ? "TXINT|"  : "!txint|",
2030                 status & SR_RX_INT_ENA  ? "RXINT"   : "!rxint");
2031 }
2032
2033 static void debug_data_in(struct cosa_data *cosa, int data)
2034 {
2035         pr_info("%s: IO: data -> 0x%04x\n", cosa->name, data);
2036 }
2037
2038 static void debug_data_out(struct cosa_data *cosa, int data)
2039 {
2040         pr_info("%s: IO: data <- 0x%04x\n", cosa->name, data);
2041 }
2042
2043 static void debug_data_cmd(struct cosa_data *cosa, int data)
2044 {
2045         pr_info("%s: IO: data <- 0x%04x (%s|%s)\n",
2046                 cosa->name, data,
2047                 data & SR_RDY_RCV ? "RX_RDY" : "!rx_rdy",
2048                 data & SR_RDY_SND ? "TX_RDY" : "!tx_rdy");
2049 }
2050 #endif
2051
2052 /* EOF -- this file has not been truncated */