1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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
84
85#include "cosa.h"
86
87
88#define COSA_MAX_ID_STRING 128
89
90
91#define COSA_MAX_NAME (sizeof("cosaXXXcXXX") + 1)
92
93
94
95struct channel_data {
96 int usage;
97 int num;
98 struct cosa_data *cosa;
99 int txsize;
100 char *txbuf;
101 char name[COSA_MAX_NAME];
102
103
104
105 char *(*setup_rx)(struct channel_data *channel, int size);
106
107 int (*rx_done)(struct channel_data *channel);
108
109 int (*tx_done)(struct channel_data *channel, int size);
110
111
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
120 struct net_device *netdev;
121 struct sk_buff *rx_skb, *tx_skb;
122};
123
124
125#define COSA_FW_RESET BIT(0)
126#define COSA_FW_DOWNLOAD BIT(1)
127#define COSA_FW_START BIT(2)
128
129struct cosa_data {
130 int num;
131 char name[COSA_MAX_NAME];
132 unsigned int datareg, statusreg;
133 unsigned short irq, dma;
134 unsigned short startaddr;
135 unsigned short busmaster;
136 int nchannels;
137 int driver_status;
138 int firmware_status;
139 unsigned long rxbitmap, txbitmap;
140 unsigned long rxtx;
141 int enabled;
142 int usage;
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;
149 char id_string[COSA_MAX_ID_STRING];
150 char *type;
151};
152
153
154
155
156
157
158
159
160
161static DEFINE_MUTEX(cosa_chardev_mutex);
162static int cosa_major = 117;
163
164
165
166
167
168#define CARD_MINOR_BITS 4
169
170
171
172
173
174#define MAX_CARDS 16
175
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
181
182
183
184
185#define TXBIT 0
186#define RXBIT 1
187#define IRQBIT 2
188
189#define COSA_MTU 2000
190
191#undef DEBUG_DATA
192#undef DEBUG_IRQS
193#undef DEBUG_IO
194
195#define TX_TIMEOUT (5 * HZ)
196
197
198static struct cosa_data cosa_cards[MAX_CARDS];
199static int nr_cards;
200
201#ifdef COSA_ISA_AUTOPROBE
202static int io[MAX_CARDS + 1] = {0x220, 0x228, 0x210, 0x218, 0,};
203
204static int dma[MAX_CARDS + 1] = {1, 7, 1, 7, 1, 7, 1, 7, 0,};
205#else
206static int io[MAX_CARDS + 1];
207static int dma[MAX_CARDS + 1];
208#endif
209
210static int irq[MAX_CARDS + 1] = {-1, -1, -1, -1, -1, -1, 0,};
211
212
213static struct class *cosa_class;
214
215#ifdef MODULE
216module_param_hw_array(io, int, ioport, NULL, 0);
217MODULE_PARM_DESC(io, "The I/O bases of the COSA or SRP cards");
218module_param_hw_array(irq, int, irq, NULL, 0);
219MODULE_PARM_DESC(irq, "The IRQ lines of the COSA or SRP cards");
220module_param_hw_array(dma, int, dma, NULL, 0);
221MODULE_PARM_DESC(dma, "The DMA channels of the COSA or SRP cards");
222
223MODULE_AUTHOR("Jan \"Yenya\" Kasprzak, <kas@fi.muni.cz>");
224MODULE_DESCRIPTION("Modular driver for the COSA or SRP synchronous card");
225MODULE_LICENSE("GPL");
226#endif
227
228
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
251static int cosa_probe(int ioaddr, int irq, int dma);
252
253
254static void cosa_enable_rx(struct channel_data *chan);
255static void cosa_disable_rx(struct channel_data *chan);
256static int cosa_start_tx(struct channel_data *channel, char *buf, int size);
257static void cosa_kick(struct cosa_data *cosa);
258static int cosa_dma_able(struct channel_data *chan, char *buf, int data);
259
260
261static int cosa_net_attach(struct net_device *dev, unsigned short encoding,
262 unsigned short parity);
263static int cosa_net_open(struct net_device *d);
264static int cosa_net_close(struct net_device *d);
265static void cosa_net_timeout(struct net_device *d, unsigned int txqueue);
266static netdev_tx_t cosa_net_tx(struct sk_buff *skb, struct net_device *d);
267static char *cosa_net_setup_rx(struct channel_data *channel, int size);
268static int cosa_net_rx_done(struct channel_data *channel);
269static int cosa_net_tx_done(struct channel_data *channel, int size);
270static int cosa_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
271
272
273static char *chrdev_setup_rx(struct channel_data *channel, int size);
274static int chrdev_rx_done(struct channel_data *channel);
275static int chrdev_tx_done(struct channel_data *channel, int size);
276static ssize_t cosa_read(struct file *file,
277 char __user *buf, size_t count, loff_t *ppos);
278static ssize_t cosa_write(struct file *file,
279 const char __user *buf, size_t count, loff_t *ppos);
280static unsigned int cosa_poll(struct file *file, poll_table *poll);
281static int cosa_open(struct inode *inode, struct file *file);
282static int cosa_release(struct inode *inode, struct file *file);
283static long cosa_chardev_ioctl(struct file *file, unsigned int cmd,
284 unsigned long arg);
285#ifdef COSA_FASYNC_WORKING
286static int cosa_fasync(struct inode *inode, struct file *file, int on);
287#endif
288
289static const struct file_operations cosa_fops = {
290 .owner = THIS_MODULE,
291 .llseek = no_llseek,
292 .read = cosa_read,
293 .write = cosa_write,
294 .poll = cosa_poll,
295 .unlocked_ioctl = cosa_chardev_ioctl,
296 .open = cosa_open,
297 .release = cosa_release,
298#ifdef COSA_FASYNC_WORKING
299 .fasync = cosa_fasync,
300#endif
301};
302
303
304static int cosa_start(struct cosa_data *cosa, int address);
305static int cosa_reset(struct cosa_data *cosa);
306static int cosa_download(struct cosa_data *cosa, void __user *a);
307static int cosa_readmem(struct cosa_data *cosa, void __user *a);
308
309
310static int download(struct cosa_data *cosa, const char __user *data, int addr, int len);
311static int startmicrocode(struct cosa_data *cosa, int address);
312static int readmem(struct cosa_data *cosa, char __user *data, int addr, int len);
313static int cosa_reset_and_read_id(struct cosa_data *cosa, char *id);
314
315
316static int get_wait_data(struct cosa_data *cosa);
317static int put_wait_data(struct cosa_data *cosa, int data);
318static int puthexnumber(struct cosa_data *cosa, int number);
319static void put_driver_status(struct cosa_data *cosa);
320static void put_driver_status_nolock(struct cosa_data *cosa);
321
322
323static irqreturn_t cosa_interrupt(int irq, void *cosa);
324
325
326#ifdef DEBUG_IO
327static void debug_data_in(struct cosa_data *cosa, int data);
328static void debug_data_out(struct cosa_data *cosa, int data);
329static void debug_data_cmd(struct cosa_data *cosa, int data);
330static void debug_status_in(struct cosa_data *cosa, int status);
331static void debug_status_out(struct cosa_data *cosa, int status);
332#endif
333
334static inline struct channel_data *dev_to_chan(struct net_device *dev)
335{
336 return (struct channel_data *)dev_to_hdlc(dev)->priv;
337}
338
339
340
341static int __init cosa_init(void)
342{
343 int i, err = 0;
344
345 if (cosa_major > 0) {
346 if (register_chrdev(cosa_major, "cosa", &cosa_fops)) {
347 pr_warn("unable to get major %d\n", cosa_major);
348 err = -EIO;
349 goto out;
350 }
351 } else {
352 cosa_major = register_chrdev(0, "cosa", &cosa_fops);
353 if (!cosa_major) {
354 pr_warn("unable to register chardev\n");
355 err = -EIO;
356 goto out;
357 }
358 }
359 for (i = 0; i < MAX_CARDS; i++)
360 cosa_cards[i].num = -1;
361 for (i = 0; io[i] != 0 && i < MAX_CARDS; i++)
362 cosa_probe(io[i], irq[i], dma[i]);
363 if (!nr_cards) {
364 pr_warn("no devices found\n");
365 unregister_chrdev(cosa_major, "cosa");
366 err = -ENODEV;
367 goto out;
368 }
369 cosa_class = class_create(THIS_MODULE, "cosa");
370 if (IS_ERR(cosa_class)) {
371 err = PTR_ERR(cosa_class);
372 goto out_chrdev;
373 }
374 for (i = 0; i < nr_cards; i++)
375 device_create(cosa_class, NULL, MKDEV(cosa_major, i), NULL,
376 "cosa%d", i);
377 err = 0;
378 goto out;
379
380out_chrdev:
381 unregister_chrdev(cosa_major, "cosa");
382out:
383 return err;
384}
385module_init(cosa_init);
386
387static void __exit cosa_exit(void)
388{
389 struct cosa_data *cosa;
390 int i;
391
392 for (i = 0; i < nr_cards; i++)
393 device_destroy(cosa_class, MKDEV(cosa_major, i));
394 class_destroy(cosa_class);
395
396 for (cosa = cosa_cards; nr_cards--; cosa++) {
397
398 for (i = 0; i < cosa->nchannels; i++) {
399
400 unregister_hdlc_device(cosa->chan[i].netdev);
401 free_netdev(cosa->chan[i].netdev);
402 }
403
404 kfree(cosa->chan);
405 kfree(cosa->bouncebuf);
406 free_irq(cosa->irq, cosa);
407 free_dma(cosa->dma);
408 release_region(cosa->datareg, is_8bit(cosa) ? 2 : 4);
409 }
410 unregister_chrdev(cosa_major, "cosa");
411}
412module_exit(cosa_exit);
413
414static const struct net_device_ops cosa_ops = {
415 .ndo_open = cosa_net_open,
416 .ndo_stop = cosa_net_close,
417 .ndo_start_xmit = hdlc_start_xmit,
418 .ndo_do_ioctl = cosa_net_ioctl,
419 .ndo_tx_timeout = cosa_net_timeout,
420};
421
422static int cosa_probe(int base, int irq, int dma)
423{
424 struct cosa_data *cosa = cosa_cards + nr_cards;
425 int i, err = 0;
426
427 memset(cosa, 0, sizeof(struct cosa_data));
428
429
430
431 if ((irq >= 0 && irq < 2) || irq > 15 || (irq < 10 && irq > 7)) {
432 pr_info("invalid IRQ %d\n", irq);
433 return -1;
434 }
435
436
437
438 if (base < 0x100 || base > 0x3ff || base & 0x7) {
439 pr_info("invalid I/O address 0x%x\n", base);
440 return -1;
441 }
442
443 if (dma < 0 || dma == 4 || dma > 7) {
444 pr_info("invalid DMA %d\n", dma);
445 return -1;
446 }
447
448
449
450 if (((base & 0x8) && dma < 4) || (!(base & 0x8) && dma > 3)) {
451 pr_info("8/16 bit base and DMA mismatch (base=0x%x, dma=%d)\n",
452 base, dma);
453 return -1;
454 }
455
456 cosa->dma = dma;
457 cosa->datareg = base;
458 cosa->statusreg = is_8bit(cosa) ? base + 1 : base + 2;
459 spin_lock_init(&cosa->lock);
460
461 if (!request_region(base, is_8bit(cosa) ? 2 : 4, "cosa"))
462 return -1;
463
464 if (cosa_reset_and_read_id(cosa, cosa->id_string) < 0) {
465 printk(KERN_DEBUG "probe at 0x%x failed.\n", base);
466 err = -1;
467 goto err_out;
468 }
469
470
471 if (!strncmp(cosa->id_string, "SRP", 3)) {
472 cosa->type = "srp";
473 } else if (!strncmp(cosa->id_string, "COSA", 4)) {
474 cosa->type = is_8bit(cosa) ? "cosa8" : "cosa16";
475 } else {
476
477#ifndef COSA_ISA_AUTOPROBE
478 pr_info("valid signature not found at 0x%x\n", base);
479#endif
480 err = -1;
481 goto err_out;
482 }
483
484 release_region(base, is_8bit(cosa) ? 2 : 4);
485 if (!request_region(base, is_8bit(cosa) ? 2 : 4, cosa->type)) {
486 printk(KERN_DEBUG "changing name at 0x%x failed.\n", base);
487 return -1;
488 }
489
490
491 if (irq < 0) {
492 unsigned long irqs;
493
494 irqs = probe_irq_on();
495
496
497
498
499
500 set_current_state(TASK_INTERRUPTIBLE);
501 cosa_putstatus(cosa, SR_TX_INT_ENA);
502 schedule_timeout(msecs_to_jiffies(300));
503 irq = probe_irq_off(irqs);
504
505 cosa_putstatus(cosa, 0);
506
507 cosa_getdata8(cosa);
508
509 if (irq < 0) {
510 pr_info("multiple interrupts obtained (%d, board at 0x%x)\n",
511 irq, cosa->datareg);
512 err = -1;
513 goto err_out;
514 }
515 if (irq == 0) {
516 pr_info("no interrupt obtained (board at 0x%x)\n",
517 cosa->datareg);
518
519 }
520 }
521
522 cosa->irq = irq;
523 cosa->num = nr_cards;
524 cosa->usage = 0;
525 cosa->nchannels = 2;
526
527 if (request_irq(cosa->irq, cosa_interrupt, 0, cosa->type, cosa)) {
528 err = -1;
529 goto err_out;
530 }
531 if (request_dma(cosa->dma, cosa->type)) {
532 err = -1;
533 goto err_out1;
534 }
535
536 cosa->bouncebuf = kmalloc(COSA_MTU, GFP_KERNEL | GFP_DMA);
537 if (!cosa->bouncebuf) {
538 err = -ENOMEM;
539 goto err_out2;
540 }
541 sprintf(cosa->name, "cosa%d", cosa->num);
542
543
544 cosa->chan = kcalloc(cosa->nchannels, sizeof(struct channel_data), GFP_KERNEL);
545 if (!cosa->chan) {
546 err = -ENOMEM;
547 goto err_out3;
548 }
549
550 for (i = 0; i < cosa->nchannels; i++) {
551 struct channel_data *chan = &cosa->chan[i];
552
553 chan->cosa = cosa;
554 chan->num = i;
555 sprintf(chan->name, "cosa%dc%d", chan->cosa->num, i);
556
557
558 mutex_init(&chan->rlock);
559 sema_init(&chan->wsem, 1);
560
561
562 chan->netdev = alloc_hdlcdev(chan);
563 if (!chan->netdev) {
564 pr_warn("%s: alloc_hdlcdev failed\n", chan->name);
565 err = -ENOMEM;
566 goto err_hdlcdev;
567 }
568 dev_to_hdlc(chan->netdev)->attach = cosa_net_attach;
569 dev_to_hdlc(chan->netdev)->xmit = cosa_net_tx;
570 chan->netdev->netdev_ops = &cosa_ops;
571 chan->netdev->watchdog_timeo = TX_TIMEOUT;
572 chan->netdev->base_addr = chan->cosa->datareg;
573 chan->netdev->irq = chan->cosa->irq;
574 chan->netdev->dma = chan->cosa->dma;
575 err = register_hdlc_device(chan->netdev);
576 if (err) {
577 netdev_warn(chan->netdev,
578 "register_hdlc_device() failed\n");
579 free_netdev(chan->netdev);
580 goto err_hdlcdev;
581 }
582 }
583
584 pr_info("cosa%d: %s (%s at 0x%x irq %d dma %d), %d channels\n",
585 cosa->num, cosa->id_string, cosa->type,
586 cosa->datareg, cosa->irq, cosa->dma, cosa->nchannels);
587
588 return nr_cards++;
589
590err_hdlcdev:
591 while (i-- > 0) {
592 unregister_hdlc_device(cosa->chan[i].netdev);
593 free_netdev(cosa->chan[i].netdev);
594 }
595 kfree(cosa->chan);
596err_out3:
597 kfree(cosa->bouncebuf);
598err_out2:
599 free_dma(cosa->dma);
600err_out1:
601 free_irq(cosa->irq, cosa);
602err_out:
603 release_region(cosa->datareg, is_8bit(cosa) ? 2 : 4);
604 pr_notice("cosa%d: allocating resources failed\n", cosa->num);
605 return err;
606}
607
608
609
610static int cosa_net_attach(struct net_device *dev, unsigned short encoding,
611 unsigned short parity)
612{
613 if (encoding == ENCODING_NRZ && parity == PARITY_CRC16_PR1_CCITT)
614 return 0;
615 return -EINVAL;
616}
617
618static int cosa_net_open(struct net_device *dev)
619{
620 struct channel_data *chan = dev_to_chan(dev);
621 int err;
622 unsigned long flags;
623
624 if (!(chan->cosa->firmware_status & COSA_FW_START)) {
625 pr_notice("%s: start the firmware first (status %d)\n",
626 chan->cosa->name, chan->cosa->firmware_status);
627 return -EPERM;
628 }
629 spin_lock_irqsave(&chan->cosa->lock, flags);
630 if (chan->usage != 0) {
631 pr_warn("%s: cosa_net_open called with usage count %d\n",
632 chan->name, chan->usage);
633 spin_unlock_irqrestore(&chan->cosa->lock, flags);
634 return -EBUSY;
635 }
636 chan->setup_rx = cosa_net_setup_rx;
637 chan->tx_done = cosa_net_tx_done;
638 chan->rx_done = cosa_net_rx_done;
639 chan->usage = -1;
640 chan->cosa->usage++;
641 spin_unlock_irqrestore(&chan->cosa->lock, flags);
642
643 err = hdlc_open(dev);
644 if (err) {
645 spin_lock_irqsave(&chan->cosa->lock, flags);
646 chan->usage = 0;
647 chan->cosa->usage--;
648 spin_unlock_irqrestore(&chan->cosa->lock, flags);
649 return err;
650 }
651
652 netif_start_queue(dev);
653 cosa_enable_rx(chan);
654 return 0;
655}
656
657static netdev_tx_t cosa_net_tx(struct sk_buff *skb,
658 struct net_device *dev)
659{
660 struct channel_data *chan = dev_to_chan(dev);
661
662 netif_stop_queue(dev);
663
664 chan->tx_skb = skb;
665 cosa_start_tx(chan, skb->data, skb->len);
666 return NETDEV_TX_OK;
667}
668
669static void cosa_net_timeout(struct net_device *dev, unsigned int txqueue)
670{
671 struct channel_data *chan = dev_to_chan(dev);
672
673 if (test_bit(RXBIT, &chan->cosa->rxtx)) {
674 chan->netdev->stats.rx_errors++;
675 chan->netdev->stats.rx_missed_errors++;
676 } else {
677 chan->netdev->stats.tx_errors++;
678 chan->netdev->stats.tx_aborted_errors++;
679 }
680 cosa_kick(chan->cosa);
681 if (chan->tx_skb) {
682 dev_kfree_skb(chan->tx_skb);
683 chan->tx_skb = NULL;
684 }
685 netif_wake_queue(dev);
686}
687
688static int cosa_net_close(struct net_device *dev)
689{
690 struct channel_data *chan = dev_to_chan(dev);
691 unsigned long flags;
692
693 netif_stop_queue(dev);
694 hdlc_close(dev);
695 cosa_disable_rx(chan);
696 spin_lock_irqsave(&chan->cosa->lock, flags);
697 if (chan->rx_skb) {
698 kfree_skb(chan->rx_skb);
699 chan->rx_skb = NULL;
700 }
701 if (chan->tx_skb) {
702 kfree_skb(chan->tx_skb);
703 chan->tx_skb = NULL;
704 }
705 chan->usage = 0;
706 chan->cosa->usage--;
707 spin_unlock_irqrestore(&chan->cosa->lock, flags);
708 return 0;
709}
710
711static char *cosa_net_setup_rx(struct channel_data *chan, int size)
712{
713
714
715
716 kfree_skb(chan->rx_skb);
717 chan->rx_skb = dev_alloc_skb(size);
718 if (!chan->rx_skb) {
719 pr_notice("%s: Memory squeeze, dropping packet\n", chan->name);
720 chan->netdev->stats.rx_dropped++;
721 return NULL;
722 }
723 netif_trans_update(chan->netdev);
724 return skb_put(chan->rx_skb, size);
725}
726
727static int cosa_net_rx_done(struct channel_data *chan)
728{
729 if (!chan->rx_skb) {
730 pr_warn("%s: rx_done with empty skb!\n", chan->name);
731 chan->netdev->stats.rx_errors++;
732 chan->netdev->stats.rx_frame_errors++;
733 return 0;
734 }
735 chan->rx_skb->protocol = hdlc_type_trans(chan->rx_skb, chan->netdev);
736 chan->rx_skb->dev = chan->netdev;
737 skb_reset_mac_header(chan->rx_skb);
738 chan->netdev->stats.rx_packets++;
739 chan->netdev->stats.rx_bytes += chan->cosa->rxsize;
740 netif_rx(chan->rx_skb);
741 chan->rx_skb = NULL;
742 return 0;
743}
744
745
746static int cosa_net_tx_done(struct channel_data *chan, int size)
747{
748 if (!chan->tx_skb) {
749 pr_warn("%s: tx_done with empty skb!\n", chan->name);
750 chan->netdev->stats.tx_errors++;
751 chan->netdev->stats.tx_aborted_errors++;
752 return 1;
753 }
754 dev_consume_skb_irq(chan->tx_skb);
755 chan->tx_skb = NULL;
756 chan->netdev->stats.tx_packets++;
757 chan->netdev->stats.tx_bytes += size;
758 netif_wake_queue(chan->netdev);
759 return 1;
760}
761
762
763
764static ssize_t cosa_read(struct file *file,
765 char __user *buf, size_t count, loff_t *ppos)
766{
767 DECLARE_WAITQUEUE(wait, current);
768 unsigned long flags;
769 struct channel_data *chan = file->private_data;
770 struct cosa_data *cosa = chan->cosa;
771 char *kbuf;
772
773 if (!(cosa->firmware_status & COSA_FW_START)) {
774 pr_notice("%s: start the firmware first (status %d)\n",
775 cosa->name, cosa->firmware_status);
776 return -EPERM;
777 }
778 if (mutex_lock_interruptible(&chan->rlock))
779 return -ERESTARTSYS;
780
781 chan->rxdata = kmalloc(COSA_MTU, GFP_DMA | GFP_KERNEL);
782 if (!chan->rxdata) {
783 mutex_unlock(&chan->rlock);
784 return -ENOMEM;
785 }
786
787 chan->rx_status = 0;
788 cosa_enable_rx(chan);
789 spin_lock_irqsave(&cosa->lock, flags);
790 add_wait_queue(&chan->rxwaitq, &wait);
791 while (!chan->rx_status) {
792 set_current_state(TASK_INTERRUPTIBLE);
793 spin_unlock_irqrestore(&cosa->lock, flags);
794 schedule();
795 spin_lock_irqsave(&cosa->lock, flags);
796 if (signal_pending(current) && chan->rx_status == 0) {
797 chan->rx_status = 1;
798 remove_wait_queue(&chan->rxwaitq, &wait);
799 __set_current_state(TASK_RUNNING);
800 spin_unlock_irqrestore(&cosa->lock, flags);
801 mutex_unlock(&chan->rlock);
802 return -ERESTARTSYS;
803 }
804 }
805 remove_wait_queue(&chan->rxwaitq, &wait);
806 __set_current_state(TASK_RUNNING);
807 kbuf = chan->rxdata;
808 count = chan->rxsize;
809 spin_unlock_irqrestore(&cosa->lock, flags);
810 mutex_unlock(&chan->rlock);
811
812 if (copy_to_user(buf, kbuf, count)) {
813 kfree(kbuf);
814 return -EFAULT;
815 }
816 kfree(kbuf);
817 return count;
818}
819
820static char *chrdev_setup_rx(struct channel_data *chan, int size)
821{
822
823 chan->rxsize = size;
824 return chan->rxdata;
825}
826
827static int chrdev_rx_done(struct channel_data *chan)
828{
829 if (chan->rx_status) {
830 kfree(chan->rxdata);
831 up(&chan->wsem);
832 }
833 chan->rx_status = 1;
834 wake_up_interruptible(&chan->rxwaitq);
835 return 1;
836}
837
838static ssize_t cosa_write(struct file *file,
839 const char __user *buf, size_t count, loff_t *ppos)
840{
841 DECLARE_WAITQUEUE(wait, current);
842 struct channel_data *chan = file->private_data;
843 struct cosa_data *cosa = chan->cosa;
844 unsigned long flags;
845 char *kbuf;
846
847 if (!(cosa->firmware_status & COSA_FW_START)) {
848 pr_notice("%s: start the firmware first (status %d)\n",
849 cosa->name, cosa->firmware_status);
850 return -EPERM;
851 }
852 if (down_interruptible(&chan->wsem))
853 return -ERESTARTSYS;
854
855 if (count > COSA_MTU)
856 count = COSA_MTU;
857
858
859 kbuf = kmalloc(count, GFP_KERNEL | GFP_DMA);
860 if (!kbuf) {
861 up(&chan->wsem);
862 return -ENOMEM;
863 }
864 if (copy_from_user(kbuf, buf, count)) {
865 up(&chan->wsem);
866 kfree(kbuf);
867 return -EFAULT;
868 }
869 chan->tx_status = 0;
870 cosa_start_tx(chan, kbuf, count);
871
872 spin_lock_irqsave(&cosa->lock, flags);
873 add_wait_queue(&chan->txwaitq, &wait);
874 while (!chan->tx_status) {
875 set_current_state(TASK_INTERRUPTIBLE);
876 spin_unlock_irqrestore(&cosa->lock, flags);
877 schedule();
878 spin_lock_irqsave(&cosa->lock, flags);
879 if (signal_pending(current) && chan->tx_status == 0) {
880 chan->tx_status = 1;
881 remove_wait_queue(&chan->txwaitq, &wait);
882 __set_current_state(TASK_RUNNING);
883 chan->tx_status = 1;
884 spin_unlock_irqrestore(&cosa->lock, flags);
885 up(&chan->wsem);
886 kfree(kbuf);
887 return -ERESTARTSYS;
888 }
889 }
890 remove_wait_queue(&chan->txwaitq, &wait);
891 __set_current_state(TASK_RUNNING);
892 up(&chan->wsem);
893 spin_unlock_irqrestore(&cosa->lock, flags);
894 kfree(kbuf);
895 return count;
896}
897
898static int chrdev_tx_done(struct channel_data *chan, int size)
899{
900 if (chan->tx_status) {
901 kfree(chan->txbuf);
902 up(&chan->wsem);
903 }
904 chan->tx_status = 1;
905 wake_up_interruptible(&chan->txwaitq);
906 return 1;
907}
908
909static __poll_t cosa_poll(struct file *file, poll_table *poll)
910{
911 pr_info("cosa_poll is here\n");
912 return 0;
913}
914
915static int cosa_open(struct inode *inode, struct file *file)
916{
917 struct cosa_data *cosa;
918 struct channel_data *chan;
919 unsigned long flags;
920 int n;
921 int ret = 0;
922
923 mutex_lock(&cosa_chardev_mutex);
924 n = iminor(file_inode(file)) >> CARD_MINOR_BITS;
925 if (n >= nr_cards) {
926 ret = -ENODEV;
927 goto out;
928 }
929 cosa = cosa_cards + n;
930
931 n = iminor(file_inode(file)) & ((1 << CARD_MINOR_BITS) - 1);
932 if (n >= cosa->nchannels) {
933 ret = -ENODEV;
934 goto out;
935 }
936 chan = cosa->chan + n;
937
938 file->private_data = chan;
939
940 spin_lock_irqsave(&cosa->lock, flags);
941
942 if (chan->usage < 0) {
943 spin_unlock_irqrestore(&cosa->lock, flags);
944 ret = -EBUSY;
945 goto out;
946 }
947 cosa->usage++;
948 chan->usage++;
949
950 chan->tx_done = chrdev_tx_done;
951 chan->setup_rx = chrdev_setup_rx;
952 chan->rx_done = chrdev_rx_done;
953 spin_unlock_irqrestore(&cosa->lock, flags);
954out:
955 mutex_unlock(&cosa_chardev_mutex);
956 return ret;
957}
958
959static int cosa_release(struct inode *inode, struct file *file)
960{
961 struct channel_data *channel = file->private_data;
962 struct cosa_data *cosa;
963 unsigned long flags;
964
965 cosa = channel->cosa;
966 spin_lock_irqsave(&cosa->lock, flags);
967 cosa->usage--;
968 channel->usage--;
969 spin_unlock_irqrestore(&cosa->lock, flags);
970 return 0;
971}
972
973#ifdef COSA_FASYNC_WORKING
974static struct fasync_struct *fasync[256] = { NULL, };
975
976
977static int cosa_fasync(struct inode *inode, struct file *file, int on)
978{
979 int port = iminor(inode);
980
981 return fasync_helper(inode, file, on, &fasync[port]);
982}
983#endif
984
985
986
987
988
989
990static inline int cosa_reset(struct cosa_data *cosa)
991{
992 char idstring[COSA_MAX_ID_STRING];
993
994 if (cosa->usage > 1)
995 pr_info("cosa%d: WARNING: reset requested with cosa->usage > 1 (%d). Odd things may happen.\n",
996 cosa->num, cosa->usage);
997 cosa->firmware_status &= ~(COSA_FW_RESET | COSA_FW_START);
998 if (cosa_reset_and_read_id(cosa, idstring) < 0) {
999 pr_notice("cosa%d: reset failed\n", cosa->num);
1000 return -EIO;
1001 }
1002 pr_info("cosa%d: resetting device: %s\n", cosa->num, idstring);
1003 cosa->firmware_status |= COSA_FW_RESET;
1004 return 0;
1005}
1006
1007
1008static inline int cosa_download(struct cosa_data *cosa, void __user *arg)
1009{
1010 struct cosa_download d;
1011 int i;
1012
1013 if (cosa->usage > 1)
1014 pr_info("%s: WARNING: download of microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n",
1015 cosa->name, cosa->usage);
1016 if (!(cosa->firmware_status & COSA_FW_RESET)) {
1017 pr_notice("%s: reset the card first (status %d)\n",
1018 cosa->name, cosa->firmware_status);
1019 return -EPERM;
1020 }
1021
1022 if (copy_from_user(&d, arg, sizeof(d)))
1023 return -EFAULT;
1024
1025 if (d.addr < 0 || d.addr > COSA_MAX_FIRMWARE_SIZE)
1026 return -EINVAL;
1027 if (d.len < 0 || d.len > COSA_MAX_FIRMWARE_SIZE)
1028 return -EINVAL;
1029
1030
1031 cosa->firmware_status &= ~(COSA_FW_RESET | COSA_FW_DOWNLOAD);
1032
1033 i = download(cosa, d.code, d.len, d.addr);
1034 if (i < 0) {
1035 pr_notice("cosa%d: microcode download failed: %d\n",
1036 cosa->num, i);
1037 return -EIO;
1038 }
1039 pr_info("cosa%d: downloading microcode - 0x%04x bytes at 0x%04x\n",
1040 cosa->num, d.len, d.addr);
1041 cosa->firmware_status |= COSA_FW_RESET | COSA_FW_DOWNLOAD;
1042 return 0;
1043}
1044
1045
1046static inline int cosa_readmem(struct cosa_data *cosa, void __user *arg)
1047{
1048 struct cosa_download d;
1049 int i;
1050
1051 if (cosa->usage > 1)
1052 pr_info("cosa%d: WARNING: readmem requested with cosa->usage > 1 (%d). Odd things may happen.\n",
1053 cosa->num, cosa->usage);
1054 if (!(cosa->firmware_status & COSA_FW_RESET)) {
1055 pr_notice("%s: reset the card first (status %d)\n",
1056 cosa->name, cosa->firmware_status);
1057 return -EPERM;
1058 }
1059
1060 if (copy_from_user(&d, arg, sizeof(d)))
1061 return -EFAULT;
1062
1063
1064 cosa->firmware_status &= ~COSA_FW_RESET;
1065
1066 i = readmem(cosa, d.code, d.len, d.addr);
1067 if (i < 0) {
1068 pr_notice("cosa%d: reading memory failed: %d\n", cosa->num, i);
1069 return -EIO;
1070 }
1071 pr_info("cosa%d: reading card memory - 0x%04x bytes at 0x%04x\n",
1072 cosa->num, d.len, d.addr);
1073 cosa->firmware_status |= COSA_FW_RESET;
1074 return 0;
1075}
1076
1077
1078static inline int cosa_start(struct cosa_data *cosa, int address)
1079{
1080 int i;
1081
1082 if (cosa->usage > 1)
1083 pr_info("cosa%d: WARNING: start microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n",
1084 cosa->num, cosa->usage);
1085
1086 if ((cosa->firmware_status & (COSA_FW_RESET | COSA_FW_DOWNLOAD))
1087 != (COSA_FW_RESET | COSA_FW_DOWNLOAD)) {
1088 pr_notice("%s: download the microcode and/or reset the card first (status %d)\n",
1089 cosa->name, cosa->firmware_status);
1090 return -EPERM;
1091 }
1092 cosa->firmware_status &= ~COSA_FW_RESET;
1093 i = startmicrocode(cosa, address);
1094 if (i < 0) {
1095 pr_notice("cosa%d: start microcode at 0x%04x failed: %d\n",
1096 cosa->num, address, i);
1097 return -EIO;
1098 }
1099 pr_info("cosa%d: starting microcode at 0x%04x\n", cosa->num, address);
1100 cosa->startaddr = address;
1101 cosa->firmware_status |= COSA_FW_START;
1102 return 0;
1103}
1104
1105
1106static inline int cosa_getidstr(struct cosa_data *cosa, char __user *string)
1107{
1108 int l = strlen(cosa->id_string) + 1;
1109
1110 if (copy_to_user(string, cosa->id_string, l))
1111 return -EFAULT;
1112 return l;
1113}
1114
1115
1116static inline int cosa_gettype(struct cosa_data *cosa, char __user *string)
1117{
1118 int l = strlen(cosa->type) + 1;
1119
1120 if (copy_to_user(string, cosa->type, l))
1121 return -EFAULT;
1122 return l;
1123}
1124
1125static int cosa_ioctl_common(struct cosa_data *cosa,
1126 struct channel_data *channel, unsigned int cmd,
1127 unsigned long arg)
1128{
1129 void __user *argp = (void __user *)arg;
1130
1131 switch (cmd) {
1132 case COSAIORSET:
1133 if (!capable(CAP_NET_ADMIN))
1134 return -EACCES;
1135 return cosa_reset(cosa);
1136 case COSAIOSTRT:
1137 if (!capable(CAP_SYS_RAWIO))
1138 return -EACCES;
1139 return cosa_start(cosa, arg);
1140 case COSAIODOWNLD:
1141 if (!capable(CAP_SYS_RAWIO))
1142 return -EACCES;
1143
1144 return cosa_download(cosa, argp);
1145 case COSAIORMEM:
1146 if (!capable(CAP_SYS_RAWIO))
1147 return -EACCES;
1148 return cosa_readmem(cosa, argp);
1149 case COSAIORTYPE:
1150 return cosa_gettype(cosa, argp);
1151 case COSAIORIDSTR:
1152 return cosa_getidstr(cosa, argp);
1153 case COSAIONRCARDS:
1154 return nr_cards;
1155 case COSAIONRCHANS:
1156 return cosa->nchannels;
1157 case COSAIOBMSET:
1158 if (!capable(CAP_SYS_RAWIO))
1159 return -EACCES;
1160 if (is_8bit(cosa))
1161 return -EINVAL;
1162 if (arg != COSA_BM_OFF && arg != COSA_BM_ON)
1163 return -EINVAL;
1164 cosa->busmaster = arg;
1165 return 0;
1166 case COSAIOBMGET:
1167 return cosa->busmaster;
1168 }
1169 return -ENOIOCTLCMD;
1170}
1171
1172static int cosa_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
1173{
1174 int rv;
1175 struct channel_data *chan = dev_to_chan(dev);
1176
1177 rv = cosa_ioctl_common(chan->cosa, chan, cmd,
1178 (unsigned long)ifr->ifr_data);
1179 if (rv != -ENOIOCTLCMD)
1180 return rv;
1181 return hdlc_ioctl(dev, ifr, cmd);
1182}
1183
1184static long cosa_chardev_ioctl(struct file *file, unsigned int cmd,
1185 unsigned long arg)
1186{
1187 struct channel_data *channel = file->private_data;
1188 struct cosa_data *cosa;
1189 long ret;
1190
1191 mutex_lock(&cosa_chardev_mutex);
1192 cosa = channel->cosa;
1193 ret = cosa_ioctl_common(cosa, channel, cmd, arg);
1194 mutex_unlock(&cosa_chardev_mutex);
1195 return ret;
1196}
1197
1198
1199
1200
1201
1202
1203static void cosa_enable_rx(struct channel_data *chan)
1204{
1205 struct cosa_data *cosa = chan->cosa;
1206
1207 if (!test_and_set_bit(chan->num, &cosa->rxbitmap))
1208 put_driver_status(cosa);
1209}
1210
1211static void cosa_disable_rx(struct channel_data *chan)
1212{
1213 struct cosa_data *cosa = chan->cosa;
1214
1215 if (test_and_clear_bit(chan->num, &cosa->rxbitmap))
1216 put_driver_status(cosa);
1217}
1218
1219
1220
1221
1222
1223
1224static int cosa_start_tx(struct channel_data *chan, char *buf, int len)
1225{
1226 struct cosa_data *cosa = chan->cosa;
1227 unsigned long flags;
1228#ifdef DEBUG_DATA
1229 int i;
1230
1231 pr_info("cosa%dc%d: starting tx(0x%x)",
1232 chan->cosa->num, chan->num, len);
1233 for (i = 0; i < len; i++)
1234 pr_cont(" %02x", buf[i]&0xff);
1235 pr_cont("\n");
1236#endif
1237 spin_lock_irqsave(&cosa->lock, flags);
1238 chan->txbuf = buf;
1239 chan->txsize = len;
1240 if (len > COSA_MTU)
1241 chan->txsize = COSA_MTU;
1242 spin_unlock_irqrestore(&cosa->lock, flags);
1243
1244
1245 set_bit(chan->num, &cosa->txbitmap);
1246 put_driver_status(cosa);
1247
1248 return 0;
1249}
1250
1251static void put_driver_status(struct cosa_data *cosa)
1252{
1253 unsigned long flags;
1254 int status;
1255
1256 spin_lock_irqsave(&cosa->lock, flags);
1257
1258 status = (cosa->rxbitmap ? DRIVER_RX_READY : 0)
1259 | (cosa->txbitmap ? DRIVER_TX_READY : 0)
1260 | (cosa->txbitmap ? ~(cosa->txbitmap << DRIVER_TXMAP_SHIFT)
1261 & DRIVER_TXMAP_MASK : 0);
1262 if (!cosa->rxtx) {
1263 if (cosa->rxbitmap | cosa->txbitmap) {
1264 if (!cosa->enabled) {
1265 cosa_putstatus(cosa, SR_RX_INT_ENA);
1266#ifdef DEBUG_IO
1267 debug_status_out(cosa, SR_RX_INT_ENA);
1268#endif
1269 cosa->enabled = 1;
1270 }
1271 } else if (cosa->enabled) {
1272 cosa->enabled = 0;
1273 cosa_putstatus(cosa, 0);
1274#ifdef DEBUG_IO
1275 debug_status_out(cosa, 0);
1276#endif
1277 }
1278 cosa_putdata8(cosa, status);
1279#ifdef DEBUG_IO
1280 debug_data_cmd(cosa, status);
1281#endif
1282 }
1283 spin_unlock_irqrestore(&cosa->lock, flags);
1284}
1285
1286static void put_driver_status_nolock(struct cosa_data *cosa)
1287{
1288 int status;
1289
1290 status = (cosa->rxbitmap ? DRIVER_RX_READY : 0)
1291 | (cosa->txbitmap ? DRIVER_TX_READY : 0)
1292 | (cosa->txbitmap ? ~(cosa->txbitmap << DRIVER_TXMAP_SHIFT)
1293 & DRIVER_TXMAP_MASK : 0);
1294
1295 if (cosa->rxbitmap | cosa->txbitmap) {
1296 cosa_putstatus(cosa, SR_RX_INT_ENA);
1297#ifdef DEBUG_IO
1298 debug_status_out(cosa, SR_RX_INT_ENA);
1299#endif
1300 cosa->enabled = 1;
1301 } else {
1302 cosa_putstatus(cosa, 0);
1303#ifdef DEBUG_IO
1304 debug_status_out(cosa, 0);
1305#endif
1306 cosa->enabled = 0;
1307 }
1308 cosa_putdata8(cosa, status);
1309#ifdef DEBUG_IO
1310 debug_data_cmd(cosa, status);
1311#endif
1312}
1313
1314
1315
1316
1317
1318static void cosa_kick(struct cosa_data *cosa)
1319{
1320 unsigned long flags, flags1;
1321 char *s = "(probably) IRQ";
1322
1323 if (test_bit(RXBIT, &cosa->rxtx))
1324 s = "RX DMA";
1325 if (test_bit(TXBIT, &cosa->rxtx))
1326 s = "TX DMA";
1327
1328 pr_info("%s: %s timeout - restarting\n", cosa->name, s);
1329 spin_lock_irqsave(&cosa->lock, flags);
1330 cosa->rxtx = 0;
1331
1332 flags1 = claim_dma_lock();
1333 disable_dma(cosa->dma);
1334 clear_dma_ff(cosa->dma);
1335 release_dma_lock(flags1);
1336
1337
1338 udelay(100);
1339 cosa_putstatus(cosa, 0);
1340 udelay(100);
1341 (void)cosa_getdata8(cosa);
1342 udelay(100);
1343 cosa_putdata8(cosa, 0);
1344 udelay(100);
1345 put_driver_status_nolock(cosa);
1346 spin_unlock_irqrestore(&cosa->lock, flags);
1347}
1348
1349
1350
1351
1352
1353static int cosa_dma_able(struct channel_data *chan, char *buf, int len)
1354{
1355 static int count;
1356 unsigned long b = (unsigned long)buf;
1357
1358 if (b + len >= MAX_DMA_ADDRESS)
1359 return 0;
1360 if ((b ^ (b + len)) & 0x10000) {
1361 if (count++ < 5)
1362 pr_info("%s: packet spanning a 64k boundary\n",
1363 chan->name);
1364 return 0;
1365 }
1366 return 1;
1367}
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378static int download(struct cosa_data *cosa, const char __user *microcode, int length, int address)
1379{
1380 int i;
1381
1382 if (put_wait_data(cosa, 'w') == -1)
1383 return -1;
1384 if ((i=get_wait_data(cosa)) != 'w') { printk("dnld: 0x%04x\n",i); return -2;}
1385 if (get_wait_data(cosa) != '=')
1386 return -3;
1387
1388 if (puthexnumber(cosa, address) < 0)
1389 return -4;
1390 if (put_wait_data(cosa, ' ') == -1)
1391 return -10;
1392 if (get_wait_data(cosa) != ' ')
1393 return -11;
1394 if (get_wait_data(cosa) != '=')
1395 return -12;
1396
1397 if (puthexnumber(cosa, address + length - 1) < 0)
1398 return -13;
1399 if (put_wait_data(cosa, ' ') == -1)
1400 return -18;
1401 if (get_wait_data(cosa) != ' ')
1402 return -19;
1403
1404 while (length--) {
1405 char c;
1406#ifndef SRP_DOWNLOAD_AT_BOOT
1407 if (get_user(c, microcode))
1408 return -23;
1409#else
1410 c = *microcode;
1411#endif
1412 if (put_wait_data(cosa, c) == -1)
1413 return -20;
1414 microcode++;
1415 }
1416
1417 if (get_wait_data(cosa) != '\r')
1418 return -21;
1419 if (get_wait_data(cosa) != '\n')
1420 return -22;
1421 if (get_wait_data(cosa) != '.')
1422 return -23;
1423#if 0
1424 printk(KERN_DEBUG "cosa%d: download completed.\n", cosa->num);
1425#endif
1426 return 0;
1427}
1428
1429
1430
1431
1432
1433static int startmicrocode(struct cosa_data *cosa, int address)
1434{
1435 if (put_wait_data(cosa, 'g') == -1)
1436 return -1;
1437 if (get_wait_data(cosa) != 'g')
1438 return -2;
1439 if (get_wait_data(cosa) != '=')
1440 return -3;
1441
1442 if (puthexnumber(cosa, address) < 0)
1443 return -4;
1444 if (put_wait_data(cosa, '\r') == -1)
1445 return -5;
1446
1447 if (get_wait_data(cosa) != '\r')
1448 return -6;
1449 if (get_wait_data(cosa) != '\r')
1450 return -7;
1451 if (get_wait_data(cosa) != '\n')
1452 return -8;
1453 if (get_wait_data(cosa) != '\r')
1454 return -9;
1455 if (get_wait_data(cosa) != '\n')
1456 return -10;
1457#if 0
1458 printk(KERN_DEBUG "cosa%d: microcode started\n", cosa->num);
1459#endif
1460 return 0;
1461}
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471static int readmem(struct cosa_data *cosa, char __user *microcode, int length, int address)
1472{
1473 if (put_wait_data(cosa, 'r') == -1)
1474 return -1;
1475 if ((get_wait_data(cosa)) != 'r')
1476 return -2;
1477 if ((get_wait_data(cosa)) != '=')
1478 return -3;
1479
1480 if (puthexnumber(cosa, address) < 0)
1481 return -4;
1482 if (put_wait_data(cosa, ' ') == -1)
1483 return -5;
1484 if (get_wait_data(cosa) != ' ')
1485 return -6;
1486 if (get_wait_data(cosa) != '=')
1487 return -7;
1488
1489 if (puthexnumber(cosa, address + length - 1) < 0)
1490 return -8;
1491 if (put_wait_data(cosa, ' ') == -1)
1492 return -9;
1493 if (get_wait_data(cosa) != ' ')
1494 return -10;
1495
1496 while (length--) {
1497 char c;
1498 int i;
1499
1500 i = get_wait_data(cosa);
1501 if (i == -1) {
1502 pr_info("0x%04x bytes remaining\n", length);
1503 return -11;
1504 }
1505 c = i;
1506#if 1
1507 if (put_user(c, microcode))
1508 return -23;
1509#else
1510 *microcode = c;
1511#endif
1512 microcode++;
1513 }
1514
1515 if (get_wait_data(cosa) != '\r')
1516 return -21;
1517 if (get_wait_data(cosa) != '\n')
1518 return -22;
1519 if (get_wait_data(cosa) != '.')
1520 return -23;
1521#if 0
1522 printk(KERN_DEBUG "cosa%d: readmem completed.\n", cosa->num);
1523#endif
1524 return 0;
1525}
1526
1527
1528
1529
1530static int cosa_reset_and_read_id(struct cosa_data *cosa, char *idstring)
1531{
1532 int i = 0, id = 0, prev = 0, curr = 0;
1533
1534
1535 cosa_putstatus(cosa, 0);
1536 cosa_getdata8(cosa);
1537 cosa_putstatus(cosa, SR_RST);
1538 msleep(500);
1539
1540 cosa_putstatus(cosa, 0);
1541
1542
1543
1544
1545
1546
1547
1548
1549 for (i = 0; i < COSA_MAX_ID_STRING - 1; i++, prev = curr) {
1550 curr = get_wait_data(cosa);
1551 if (curr == -1)
1552 return -1;
1553
1554 curr &= 0xff;
1555 if (curr != '\r' && curr != '\n' && curr != 0x2e)
1556 idstring[id++] = curr;
1557 if (curr == 0x2e && prev == '\n')
1558 break;
1559 }
1560
1561 idstring[id] = '\0';
1562 return id;
1563}
1564
1565
1566
1567
1568
1569
1570
1571static int get_wait_data(struct cosa_data *cosa)
1572{
1573 int retries = 1000;
1574
1575 while (--retries) {
1576
1577 if (cosa_getstatus(cosa) & SR_RX_RDY) {
1578 short r;
1579
1580 r = cosa_getdata8(cosa);
1581#if 0
1582 pr_info("get_wait_data returning after %d retries\n",
1583 999 - retries);
1584#endif
1585 return r;
1586 }
1587
1588 schedule_timeout_interruptible(1);
1589 }
1590 pr_info("timeout in get_wait_data (status 0x%x)\n",
1591 cosa_getstatus(cosa));
1592 return -1;
1593}
1594
1595
1596
1597
1598
1599static int put_wait_data(struct cosa_data *cosa, int data)
1600{
1601 int retries = 1000;
1602
1603 while (--retries) {
1604
1605 if (cosa_getstatus(cosa) & SR_TX_RDY) {
1606 cosa_putdata8(cosa, data);
1607#if 0
1608 pr_info("Putdata: %d retries\n", 999 - retries);
1609#endif
1610 return 0;
1611 }
1612#if 0
1613
1614 schedule_timeout_interruptible(1);
1615#endif
1616 }
1617 pr_info("cosa%d: timeout in put_wait_data (status 0x%x)\n",
1618 cosa->num, cosa_getstatus(cosa));
1619 return -1;
1620}
1621
1622
1623
1624
1625
1626
1627static int puthexnumber(struct cosa_data *cosa, int number)
1628{
1629 char temp[5];
1630 int i;
1631
1632
1633 sprintf(temp, "%04X", number);
1634 for (i = 0; i < 4; i++) {
1635 if (put_wait_data(cosa, temp[i]) == -1) {
1636 pr_notice("cosa%d: puthexnumber failed to write byte %d\n",
1637 cosa->num, i);
1638 return -1 - 2 * i;
1639 }
1640 if (get_wait_data(cosa) != temp[i]) {
1641 pr_notice("cosa%d: puthexhumber failed to read echo of byte %d\n",
1642 cosa->num, i);
1643 return -2 - 2 * i;
1644 }
1645 }
1646 return 0;
1647}
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680static inline void tx_interrupt(struct cosa_data *cosa, int status)
1681{
1682 unsigned long flags, flags1;
1683#ifdef DEBUG_IRQS
1684 pr_info("cosa%d: SR_DOWN_REQUEST status=0x%04x\n", cosa->num, status);
1685#endif
1686 spin_lock_irqsave(&cosa->lock, flags);
1687 set_bit(TXBIT, &cosa->rxtx);
1688 if (!test_bit(IRQBIT, &cosa->rxtx)) {
1689
1690 int i = 0;
1691
1692 if (!cosa->txbitmap) {
1693 pr_warn("%s: No channel wants data in TX IRQ. Expect DMA timeout.\n",
1694 cosa->name);
1695 put_driver_status_nolock(cosa);
1696 clear_bit(TXBIT, &cosa->rxtx);
1697 spin_unlock_irqrestore(&cosa->lock, flags);
1698 return;
1699 }
1700 while (1) {
1701 cosa->txchan++;
1702 i++;
1703 if (cosa->txchan >= cosa->nchannels)
1704 cosa->txchan = 0;
1705 if (!(cosa->txbitmap & (1 << cosa->txchan)))
1706 continue;
1707 if (~status &
1708 (1 << (cosa->txchan + DRIVER_TXMAP_SHIFT)))
1709 break;
1710
1711 if (i > cosa->nchannels) {
1712
1713#ifdef DEBUG_IRQS
1714 printk(KERN_DEBUG "%s: Forcing TX "
1715 "to not-ready channel %d\n",
1716 cosa->name, cosa->txchan);
1717#endif
1718 break;
1719 }
1720 }
1721
1722 cosa->txsize = cosa->chan[cosa->txchan].txsize;
1723 if (cosa_dma_able(cosa->chan + cosa->txchan,
1724 cosa->chan[cosa->txchan].txbuf,
1725 cosa->txsize)) {
1726 cosa->txbuf = cosa->chan[cosa->txchan].txbuf;
1727 } else {
1728 memcpy(cosa->bouncebuf, cosa->chan[cosa->txchan].txbuf,
1729 cosa->txsize);
1730 cosa->txbuf = cosa->bouncebuf;
1731 }
1732 }
1733
1734 if (is_8bit(cosa)) {
1735 if (!test_bit(IRQBIT, &cosa->rxtx)) {
1736 cosa_putstatus(cosa, SR_TX_INT_ENA);
1737 cosa_putdata8(cosa, ((cosa->txchan << 5) & 0xe0) |
1738 ((cosa->txsize >> 8) & 0x1f));
1739#ifdef DEBUG_IO
1740 debug_status_out(cosa, SR_TX_INT_ENA);
1741 debug_data_out(cosa, ((cosa->txchan << 5) & 0xe0) |
1742 ((cosa->txsize >> 8) & 0x1f));
1743 debug_data_in(cosa, cosa_getdata8(cosa));
1744#else
1745 cosa_getdata8(cosa);
1746#endif
1747 set_bit(IRQBIT, &cosa->rxtx);
1748 spin_unlock_irqrestore(&cosa->lock, flags);
1749 return;
1750 } else {
1751 clear_bit(IRQBIT, &cosa->rxtx);
1752 cosa_putstatus(cosa, 0);
1753 cosa_putdata8(cosa, cosa->txsize & 0xff);
1754#ifdef DEBUG_IO
1755 debug_status_out(cosa, 0);
1756 debug_data_out(cosa, cosa->txsize & 0xff);
1757#endif
1758 }
1759 } else {
1760 cosa_putstatus(cosa, SR_TX_INT_ENA);
1761 cosa_putdata16(cosa, ((cosa->txchan << 13) & 0xe000)
1762 | (cosa->txsize & 0x1fff));
1763#ifdef DEBUG_IO
1764 debug_status_out(cosa, SR_TX_INT_ENA);
1765 debug_data_out(cosa, ((cosa->txchan << 13) & 0xe000) |
1766 (cosa->txsize & 0x1fff));
1767 debug_data_in(cosa, cosa_getdata8(cosa));
1768 debug_status_out(cosa, 0);
1769#else
1770 cosa_getdata8(cosa);
1771#endif
1772 cosa_putstatus(cosa, 0);
1773 }
1774
1775 if (cosa->busmaster) {
1776 unsigned long addr = virt_to_bus(cosa->txbuf);
1777 int count = 0;
1778
1779 pr_info("busmaster IRQ\n");
1780 while (!(cosa_getstatus(cosa) & SR_TX_RDY)) {
1781 count++;
1782 udelay(10);
1783 if (count > 1000)
1784 break;
1785 }
1786 pr_info("status %x\n", cosa_getstatus(cosa));
1787 pr_info("ready after %d loops\n", count);
1788 cosa_putdata16(cosa, (addr >> 16) & 0xffff);
1789
1790 count = 0;
1791 while (!(cosa_getstatus(cosa) & SR_TX_RDY)) {
1792 count++;
1793 if (count > 1000)
1794 break;
1795 udelay(10);
1796 }
1797 pr_info("ready after %d loops\n", count);
1798 cosa_putdata16(cosa, addr & 0xffff);
1799 flags1 = claim_dma_lock();
1800 set_dma_mode(cosa->dma, DMA_MODE_CASCADE);
1801 enable_dma(cosa->dma);
1802 release_dma_lock(flags1);
1803 } else {
1804
1805 flags1 = claim_dma_lock();
1806 disable_dma(cosa->dma);
1807 clear_dma_ff(cosa->dma);
1808 set_dma_mode(cosa->dma, DMA_MODE_WRITE);
1809 set_dma_addr(cosa->dma, virt_to_bus(cosa->txbuf));
1810 set_dma_count(cosa->dma, cosa->txsize);
1811 enable_dma(cosa->dma);
1812 release_dma_lock(flags1);
1813 }
1814 cosa_putstatus(cosa, SR_TX_DMA_ENA | SR_USR_INT_ENA);
1815#ifdef DEBUG_IO
1816 debug_status_out(cosa, SR_TX_DMA_ENA | SR_USR_INT_ENA);
1817#endif
1818 spin_unlock_irqrestore(&cosa->lock, flags);
1819}
1820
1821static inline void rx_interrupt(struct cosa_data *cosa, int status)
1822{
1823 unsigned long flags;
1824#ifdef DEBUG_IRQS
1825 pr_info("cosa%d: SR_UP_REQUEST\n", cosa->num);
1826#endif
1827
1828 spin_lock_irqsave(&cosa->lock, flags);
1829 set_bit(RXBIT, &cosa->rxtx);
1830
1831 if (is_8bit(cosa)) {
1832 if (!test_bit(IRQBIT, &cosa->rxtx)) {
1833 set_bit(IRQBIT, &cosa->rxtx);
1834 put_driver_status_nolock(cosa);
1835 cosa->rxsize = cosa_getdata8(cosa) << 8;
1836#ifdef DEBUG_IO
1837 debug_data_in(cosa, cosa->rxsize >> 8);
1838#endif
1839 spin_unlock_irqrestore(&cosa->lock, flags);
1840 return;
1841 } else {
1842 clear_bit(IRQBIT, &cosa->rxtx);
1843 cosa->rxsize |= cosa_getdata8(cosa) & 0xff;
1844#ifdef DEBUG_IO
1845 debug_data_in(cosa, cosa->rxsize & 0xff);
1846#endif
1847#if 0
1848 pr_info("cosa%d: receive rxsize = (0x%04x)\n",
1849 cosa->num, cosa->rxsize);
1850#endif
1851 }
1852 } else {
1853 cosa->rxsize = cosa_getdata16(cosa);
1854#ifdef DEBUG_IO
1855 debug_data_in(cosa, cosa->rxsize);
1856#endif
1857#if 0
1858 pr_info("cosa%d: receive rxsize = (0x%04x)\n",
1859 cosa->num, cosa->rxsize);
1860#endif
1861 }
1862 if (((cosa->rxsize & 0xe000) >> 13) >= cosa->nchannels) {
1863 pr_warn("%s: rx for unknown channel (0x%04x)\n",
1864 cosa->name, cosa->rxsize);
1865 spin_unlock_irqrestore(&cosa->lock, flags);
1866 goto reject;
1867 }
1868 cosa->rxchan = cosa->chan + ((cosa->rxsize & 0xe000) >> 13);
1869 cosa->rxsize &= 0x1fff;
1870 spin_unlock_irqrestore(&cosa->lock, flags);
1871
1872 cosa->rxbuf = NULL;
1873 if (cosa->rxchan->setup_rx)
1874 cosa->rxbuf = cosa->rxchan->setup_rx(cosa->rxchan, cosa->rxsize);
1875
1876 if (!cosa->rxbuf) {
1877reject:
1878 pr_info("cosa%d: rejecting packet on channel %d\n",
1879 cosa->num, cosa->rxchan->num);
1880 cosa->rxbuf = cosa->bouncebuf;
1881 }
1882
1883
1884 flags = claim_dma_lock();
1885 disable_dma(cosa->dma);
1886 clear_dma_ff(cosa->dma);
1887 set_dma_mode(cosa->dma, DMA_MODE_READ);
1888 if (cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize & 0x1fff))
1889 set_dma_addr(cosa->dma, virt_to_bus(cosa->rxbuf));
1890 else
1891 set_dma_addr(cosa->dma, virt_to_bus(cosa->bouncebuf));
1892
1893 set_dma_count(cosa->dma, (cosa->rxsize & 0x1fff));
1894 enable_dma(cosa->dma);
1895 release_dma_lock(flags);
1896 spin_lock_irqsave(&cosa->lock, flags);
1897 cosa_putstatus(cosa, SR_RX_DMA_ENA | SR_USR_INT_ENA);
1898 if (!is_8bit(cosa) && (status & SR_TX_RDY))
1899 cosa_putdata8(cosa, DRIVER_RX_READY);
1900#ifdef DEBUG_IO
1901 debug_status_out(cosa, SR_RX_DMA_ENA | SR_USR_INT_ENA);
1902 if (!is_8bit(cosa) && (status & SR_TX_RDY))
1903 debug_data_cmd(cosa, DRIVER_RX_READY);
1904#endif
1905 spin_unlock_irqrestore(&cosa->lock, flags);
1906}
1907
1908static inline void eot_interrupt(struct cosa_data *cosa, int status)
1909{
1910 unsigned long flags, flags1;
1911
1912 spin_lock_irqsave(&cosa->lock, flags);
1913 flags1 = claim_dma_lock();
1914 disable_dma(cosa->dma);
1915 clear_dma_ff(cosa->dma);
1916 release_dma_lock(flags1);
1917 if (test_bit(TXBIT, &cosa->rxtx)) {
1918 struct channel_data *chan = cosa->chan + cosa->txchan;
1919
1920 if (chan->tx_done)
1921 if (chan->tx_done(chan, cosa->txsize))
1922 clear_bit(chan->num, &cosa->txbitmap);
1923 } else if (test_bit(RXBIT, &cosa->rxtx)) {
1924#ifdef DEBUG_DATA
1925 {
1926 int i;
1927
1928 pr_info("cosa%dc%d: done rx(0x%x)",
1929 cosa->num, cosa->rxchan->num, cosa->rxsize);
1930 for (i = 0; i < cosa->rxsize; i++)
1931 pr_cont(" %02x", cosa->rxbuf[i]&0xff);
1932 pr_cont("\n");
1933 }
1934#endif
1935
1936 if (cosa->rxbuf == cosa->bouncebuf)
1937 goto out;
1938 if (!cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize))
1939 memcpy(cosa->rxbuf, cosa->bouncebuf, cosa->rxsize);
1940 if (cosa->rxchan->rx_done)
1941 if (cosa->rxchan->rx_done(cosa->rxchan))
1942 clear_bit(cosa->rxchan->num, &cosa->rxbitmap);
1943 } else {
1944 pr_notice("cosa%d: unexpected EOT interrupt\n", cosa->num);
1945 }
1946
1947
1948
1949
1950
1951out:
1952 cosa->rxtx = 0;
1953 put_driver_status_nolock(cosa);
1954 spin_unlock_irqrestore(&cosa->lock, flags);
1955}
1956
1957static irqreturn_t cosa_interrupt(int irq, void *cosa_)
1958{
1959 unsigned status;
1960 int count = 0;
1961 struct cosa_data *cosa = cosa_;
1962again:
1963 status = cosa_getstatus(cosa);
1964#ifdef DEBUG_IRQS
1965 pr_info("cosa%d: got IRQ, status 0x%02x\n", cosa->num, status & 0xff);
1966#endif
1967#ifdef DEBUG_IO
1968 debug_status_in(cosa, status);
1969#endif
1970 switch (status & SR_CMD_FROM_SRP_MASK) {
1971 case SR_DOWN_REQUEST:
1972 tx_interrupt(cosa, status);
1973 break;
1974 case SR_UP_REQUEST:
1975 rx_interrupt(cosa, status);
1976 break;
1977 case SR_END_OF_TRANSFER:
1978 eot_interrupt(cosa, status);
1979 break;
1980 default:
1981
1982 if (count++ < 100) {
1983 udelay(100);
1984 goto again;
1985 }
1986 pr_info("cosa%d: unknown status 0x%02x in IRQ after %d retries\n",
1987 cosa->num, status & 0xff, count);
1988 }
1989#ifdef DEBUG_IRQS
1990 if (count)
1991 pr_info("%s: %d-times got unknown status in IRQ\n",
1992 cosa->name, count);
1993 else
1994 pr_info("%s: returning from IRQ\n", cosa->name);
1995#endif
1996 return IRQ_HANDLED;
1997}
1998
1999
2000
2001
2002
2003
2004
2005#ifdef DEBUG_IO
2006static void debug_status_in(struct cosa_data *cosa, int status)
2007{
2008 char *s;
2009
2010 switch (status & SR_CMD_FROM_SRP_MASK) {
2011 case SR_UP_REQUEST:
2012 s = "RX_REQ";
2013 break;
2014 case SR_DOWN_REQUEST:
2015 s = "TX_REQ";
2016 break;
2017 case SR_END_OF_TRANSFER:
2018 s = "ET_REQ";
2019 break;
2020 default:
2021 s = "NO_REQ";
2022 break;
2023 }
2024 pr_info("%s: IO: status -> 0x%02x (%s%s%s%s)\n",
2025 cosa->name,
2026 status,
2027 status & SR_USR_RQ ? "USR_RQ|" : "",
2028 status & SR_TX_RDY ? "TX_RDY|" : "",
2029 status & SR_RX_RDY ? "RX_RDY|" : "",
2030 s);
2031}
2032
2033static void debug_status_out(struct cosa_data *cosa, int status)
2034{
2035 pr_info("%s: IO: status <- 0x%02x (%s%s%s%s%s%s)\n",
2036 cosa->name,
2037 status,
2038 status & SR_RX_DMA_ENA ? "RXDMA|" : "!rxdma|",
2039 status & SR_TX_DMA_ENA ? "TXDMA|" : "!txdma|",
2040 status & SR_RST ? "RESET|" : "",
2041 status & SR_USR_INT_ENA ? "USRINT|" : "!usrint|",
2042 status & SR_TX_INT_ENA ? "TXINT|" : "!txint|",
2043 status & SR_RX_INT_ENA ? "RXINT" : "!rxint");
2044}
2045
2046static void debug_data_in(struct cosa_data *cosa, int data)
2047{
2048 pr_info("%s: IO: data -> 0x%04x\n", cosa->name, data);
2049}
2050
2051static void debug_data_out(struct cosa_data *cosa, int data)
2052{
2053 pr_info("%s: IO: data <- 0x%04x\n", cosa->name, data);
2054}
2055
2056static void debug_data_cmd(struct cosa_data *cosa, int data)
2057{
2058 pr_info("%s: IO: data <- 0x%04x (%s|%s)\n",
2059 cosa->name, data,
2060 data & SR_RDY_RCV ? "RX_RDY" : "!rx_rdy",
2061 data & SR_RDY_SND ? "TX_RDY" : "!tx_rdy");
2062}
2063#endif
2064
2065
2066