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