1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#define DEFINE_VARIABLE
16#include <linux/module.h>
17#include <asm/io.h>
18#include <linux/timer.h>
19#include <linux/interrupt.h>
20#include <linux/tty.h>
21#include <linux/tty_flip.h>
22#include <linux/mm.h>
23#include <linux/version.h>
24#include <asm/uaccess.h>
25#include "8253xctl.h"
26#include "8253x.h"
27#include <linux/pci.h>
28#include <linux/fs.h>
29
30#ifdef MODULE
31#undef XCONFIG_SERIAL_CONSOLE
32#endif
33
34
35static void sab8253x_flush_to_ldiscS(void *private_)
36
37
38{
39 struct tty_struct *tty = (struct tty_struct *) private_;
40 unsigned char *cp;
41 int count;
42 struct sab_port *port;
43 struct sk_buff *skb;
44
45 if(tty)
46 {
47 port = (struct sab_port *)tty->driver_data;
48 }
49 else
50 {
51 return;
52 }
53 if(port == NULL)
54 {
55 return;
56 }
57
58 if (test_bit(TTY_DONT_FLIP, &tty->flags))
59 {
60 queue_task(&tty->flip.tqueue, &tq_timer);
61 return;
62 }
63
64 port->DoingInterrupt = 1;
65 while(port->sab8253xc_rcvbuflist && (skb_queue_len(port->sab8253xc_rcvbuflist) > 0))
66 {
67 skb = skb_dequeue(port->sab8253xc_rcvbuflist);
68 count = skb->data_len;
69 cp = skb->data;
70 (*tty->ldisc.receive_buf)(tty, cp, 0, count);
71 dev_kfree_skb_any(skb);
72 }
73 port->DoingInterrupt = 0;
74}
75
76void sab8253x_flush_charsS(struct tty_struct *tty)
77{
78 struct sab_port *port = (struct sab_port *)tty->driver_data;
79
80 if (sab8253x_serial_paranoia_check(port, tty->device, "sab8253x_flush_chars"))
81 {
82 return;
83 }
84
85 if ((Sab8253xCountTransmit(port) <= 0) || tty->stopped || tty->hw_stopped)
86 {
87 return;
88 }
89
90 sab8253x_start_txS(port);
91}
92
93
94
95
96
97
98
99
100
101
102void sab8253x_stopS(struct tty_struct *tty)
103{
104 struct sab_port *port = (struct sab_port *)tty->driver_data;
105
106 if (sab8253x_serial_paranoia_check(port, tty->device, "sab8253x_stop"))
107 {
108 return;
109 }
110
111
112}
113
114void sab8253x_startS(struct tty_struct *tty)
115{
116 struct sab_port *port = (struct sab_port *)tty->driver_data;
117
118 if (sab8253x_serial_paranoia_check(port, tty->device, "sab8253x_start"))
119 {
120 return;
121 }
122 sab8253x_start_txS(port);
123}
124
125
126static void sab8253x_receive_charsS(struct sab_port *port,
127 union sab8253x_irq_status *stat)
128{
129 struct tty_struct *tty = port->tty;
130 unsigned char buf[32];
131 int free_fifo = 0;
132 int reset_fifo = 0;
133 int msg_done = 0;
134 int msg_bad = 0;
135 int count = 0;
136 int total_size = 0;
137 int rstatus = 0;
138 struct sk_buff *skb;
139
140
141
142 if((stat->images[ISR1_IDX] & SAB82532_ISR1_RDO) || (stat->images[ISR0_IDX] & SAB82532_ISR0_RFO) )
143 {
144 ++msg_bad;
145 ++free_fifo;
146 ++reset_fifo;
147 }
148 else
149 {
150 if (stat->images[ISR0_IDX] & SAB82532_ISR0_RPF)
151 {
152 count = port->recv_fifo_size;
153 ++free_fifo;
154 }
155
156 if (stat->images[ISR0_IDX] & SAB82532_ISR0_RME)
157 {
158 count = READB(port, rbcl);
159 count &= (port->recv_fifo_size - 1);
160 ++msg_done;
161 ++free_fifo;
162
163 total_size = READB(port, rbch);
164 if(total_size & SAB82532_RBCH_OV)
165 {
166 msg_bad++;
167 }
168
169 rstatus = READB(port, rsta);
170 if((rstatus & SAB82532_RSTA_VFR) == 0)
171 {
172 msg_bad++;
173 }
174 if(rstatus & SAB82532_RSTA_RDO)
175 {
176 msg_bad++;
177 }
178 if((rstatus & SAB82532_RSTA_CRC) == 0)
179 {
180 msg_bad++;
181 }
182 if(rstatus & SAB82532_RSTA_RAB)
183 {
184 msg_bad++;
185 }
186 }
187 }
188
189
190
191 (*port->readfifo)(port, buf, count);
192
193
194
195
196 if (free_fifo)
197 {
198 sab8253x_cec_wait(port);
199 WRITEB(port, cmdr, SAB82532_CMDR_RMC);
200 }
201
202 if(reset_fifo)
203 {
204 sab8253x_cec_wait(port);
205 WRITEB(port, cmdr, SAB82532_CMDR_RHR);
206 }
207
208 if(msg_bad)
209 {
210 port->msgbufindex = 0;
211 return;
212 }
213
214 memcpy(&port->msgbuf[port->msgbufindex], buf, count);
215 port->msgbufindex += count;
216
217#ifdef CONSOLE_SUPPORT
218 if (port->is_console)
219 {
220 wake_up(&keypress_wait);
221 }
222#endif
223
224 if(msg_done)
225 {
226
227 if(port->msgbufindex <= 3)
228 {
229 port->msgbufindex = 0;
230 return;
231 }
232
233 total_size = port->msgbufindex - 3;
234 port->msgbufindex = 0;
235
236
237
238 if (!tty)
239 {
240 return;
241 }
242 if(skb = dev_alloc_skb(total_size), skb)
243 {
244 memcpy(skb->data, &port->msgbuf[0], total_size);
245 skb->tail = (skb->data + total_size);
246 skb->data_len = total_size;
247 skb->len = total_size;
248 skb_queue_tail(port->sab8253xc_rcvbuflist, skb);
249 }
250 queue_task(&tty->flip.tqueue, &tq_timer);
251
252
253
254 }
255}
256
257
258static void sab8253x_check_statusS(struct sab_port *port,
259 union sab8253x_irq_status *stat)
260{
261 struct tty_struct *tty = port->tty;
262 int modem_change = 0;
263 mctlsig_t *sig;
264
265 if (!tty)
266 {
267 return;
268 }
269
270
271
272 sig = &port->dcd;
273 if (stat->images[sig->irq] & sig->irqmask)
274 {
275 sig->val = ISON(port,dcd);
276 port->icount.dcd++;
277 modem_change++;
278 }
279
280 sig = &port->cts;
281 if (stat->images[sig->irq] & sig->irqmask)
282 {
283 sig->val = ISON(port,cts);
284 port->icount.cts++;
285 modem_change++;
286 }
287
288 sig = &port->dsr;
289 if (stat->images[sig->irq] & sig->irqmask)
290 {
291 sig->val = ISON(port,dsr);
292 port->icount.dsr++;
293 modem_change++;
294 }
295 if (modem_change)
296 {
297 wake_up_interruptible(&port->delta_msr_wait);
298 }
299
300 sig = &port->dcd;
301 if ((port->flags & FLAG8253X_CHECK_CD) &&
302 (stat->images[sig->irq] & sig->irqmask))
303 {
304
305 if (sig->val)
306 {
307 wake_up_interruptible(&port->open_wait);
308 }
309 else if (!((port->flags & FLAG8253X_CALLOUT_ACTIVE) &&
310 (port->flags & FLAG8253X_CALLOUT_NOHUP)))
311 {
312#if 0
313 MOD_INC_USE_COUNT;
314 if (schedule_task(&port->tqueue_hangup) == 0)
315 {
316 MOD_DEC_USE_COUNT;
317 }
318#endif
319 }
320 }
321
322 sig = &port->cts;
323 if (port->flags & FLAG8253X_CTS_FLOW)
324 {
325 if (port->tty->hw_stopped)
326 {
327 if (sig->val)
328 {
329 port->tty->hw_stopped = 0;
330 sab8253x_sched_event(port, SAB8253X_EVENT_WRITE_WAKEUP);
331 sab8253x_start_txS(port);
332 }
333 }
334
335 else
336 {
337 if(!(getccr2configS(port) & SAB82532_CCR2_TOE))
338 {
339 if (!(sig->val))
340 {
341 port->tty->hw_stopped = 1;
342 }
343 }
344 }
345 }
346}
347
348
349
350
351
352static void sab8253x_change_speedS(struct sab_port *port)
353{
354 unsigned long flags,baud;
355 tcflag_t cflag;
356 u8 ccr2=0,ccr4=0,ebrg=0;
357 int i, bits;
358#ifdef DEBUGGING
359 printk("Change speed! ");
360#endif
361 if (!port->tty || !port->tty->termios)
362 {
363#ifdef DEBUGGING
364 printk("NOT!\n");
365#endif
366 return;
367 }
368
369#ifdef DEBUGGING
370 printk(" for real.\n");
371#endif
372
373 cflag = port->tty->termios->c_cflag;
374
375
376 switch (cflag & CSIZE)
377 {
378 case CS5:
379 bits = 7;
380 break;
381 case CS6:
382 bits = 8;
383 break;
384 case CS7:
385 bits = 9;
386 break;
387 default:
388 case CS8:
389 bits = 10;
390 break;
391 }
392
393 if (cflag & CSTOPB)
394 {
395 bits++;
396 }
397
398 if (cflag & PARENB)
399 {
400 bits++;
401 }
402
403
404 i = cflag & CBAUD;
405 switch(i)
406 {
407 case B0:
408 baud=0;
409 break;
410 case B50:
411 baud=100;
412 break;
413 case B75:
414 baud=150;
415 break;
416 case B110:
417 baud=220;
418 break;
419 case B134:
420 baud=269;
421 break;
422 case B150:
423 baud=300;
424 break;
425 case B200:
426 baud=400;
427 break;
428 case B300:
429 baud=600;
430 break;
431 case B600:
432 baud=1200;
433 break;
434 case B1200:
435 baud=2400;
436 break;
437 case B1800:
438 baud=3600;
439 break;
440 case B2400:
441 baud=4800;
442 break;
443 case B4800:
444 baud=9600;
445 break;
446 case B9600:
447 baud=19200;
448 break;
449 case B19200:
450 baud=38400;
451 break;
452 case B38400:
453 if(port->custspeed)
454 {
455 baud=port->custspeed<<1;
456 }
457 else
458 {
459 baud=76800;
460 }
461 break;
462 case B57600:
463 baud=115200;
464 break;
465#ifdef SKIPTHIS
466 case B76800:
467 baud=153600;
468 break;
469 case B153600:
470 baud=307200;
471 break;
472#endif
473 case B230400:
474 baud=460800;
475 break;
476 case B460800:
477 baud=921600;
478 break;
479 case B115200:
480 default:
481 baud=230400;
482 break;
483 }
484
485 if(!sab8253x_baud(port,baud,&ebrg,&ccr2,&ccr4,&(port->baud)))
486 {
487 printk("Aurora Warning. baudrate %ld could not be set! Using 115200",baud);
488 baud=230400;
489 sab8253x_baud(port,baud,&ebrg,&ccr2,&ccr4,&(port->baud));
490 }
491
492 if (port->baud)
493 port->timeout = (port->xmit_fifo_size * HZ * bits) / port->baud;
494 else
495 port->timeout = 0;
496 port->timeout += HZ / 50;
497
498
499 if (cflag & CRTSCTS)
500 port->flags |= FLAG8253X_CTS_FLOW;
501 else
502 port->flags &= ~(FLAG8253X_CTS_FLOW);
503
504 if (cflag & CLOCAL)
505 port->flags &= ~(FLAG8253X_CHECK_CD);
506 else
507 port->flags |= FLAG8253X_CHECK_CD;
508 if (port->tty)
509 port->tty->hw_stopped = 0;
510
511
512
513
514
515#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
516
517
518
519
520
521
522
523
524
525
526 if ((cflag & CREAD) == 0)
527 port->ignore_status_mask |= SAB82532_ISR0_RPF;
528
529 save_flags(flags);
530 cli();
531 sab8253x_cec_wait(port);
532
533 WRITEB(port, bgr, ebrg);
534 WRITEB(port, ccr2, READB(port, ccr2) & ~(0xc0));
535 WRITEB(port, ccr2, READB(port, ccr2) | ccr2);
536 WRITEB(port, ccr4, (READB(port,ccr4) & ~SAB82532_CCR4_EBRG) | ccr4);
537
538 if (port->flags & FLAG8253X_CTS_FLOW)
539 {
540 WRITEB(port, mode, READB(port,mode) & ~(SAB82532_MODE_RTS));
541 port->interrupt_mask1 &= ~(SAB82532_IMR1_CSC);
542 WRITEB(port, imr1, port->interrupt_mask1);
543 }
544 else
545 {
546 WRITEB(port, mode, READB(port,mode) | SAB82532_MODE_RTS);
547 port->interrupt_mask1 |= SAB82532_IMR1_CSC;
548 WRITEB(port, imr1, port->interrupt_mask1);
549 }
550 WRITEB(port, mode, READB(port, mode) | SAB82532_MODE_RAC);
551 restore_flags(flags);
552}
553
554void sab8253x_set_termiosS(struct tty_struct *tty,
555 struct termios *old_termios)
556{
557 struct sab_port *port = (struct sab_port *)tty->driver_data;
558
559 if((tty->termios->c_cflag == old_termios->c_cflag) &&
560 (RELEVANT_IFLAG(tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag)))
561 {
562 return;
563 }
564 if(!port)
565 {
566 return;
567 }
568 sab8253x_change_speedS(port);
569
570
571 if ((old_termios->c_cflag & CBAUD) &&
572 !(tty->termios->c_cflag & CBAUD))
573 {
574 LOWER(port,rts);
575 LOWER(port,dtr);
576 }
577
578
579 if (!(old_termios->c_cflag & CBAUD) &&
580 (tty->termios->c_cflag & CBAUD))
581 {
582 RAISE(port,dtr);
583 if (!tty->hw_stopped ||
584 !(tty->termios->c_cflag & CRTSCTS))
585 {
586 RAISE(port,rts);
587 }
588 }
589
590
591 if ((old_termios->c_cflag & CRTSCTS) &&
592 !(tty->termios->c_cflag & CRTSCTS))
593 {
594 tty->hw_stopped = 0;
595 sab8253x_startS(tty);
596 }
597}
598
599static int sab8253x_startupS(struct sab_port *port)
600{
601 unsigned long flags;
602 int retval = 0;
603
604 save_flags(flags); cli();
605
606 port->msgbufindex = 0;
607 port->xmit_buf = NULL;
608 port->buffergreedy = 0;
609
610 if (port->flags & FLAG8253X_INITIALIZED)
611 {
612 goto errout;
613 }
614
615 if (!port->regs)
616 {
617 if (port->tty)
618 {
619 set_bit(TTY_IO_ERROR, &port->tty->flags);
620 }
621 retval = -ENODEV;
622 goto errout;
623 }
624
625
626
627 sab8253x_init_lineS(port);
628
629#if 0
630 if (port->tty->termios->c_cflag & CBAUD)
631 {
632#endif
633
634 RAISE(port,rts);
635
636 RAISE(port,dtr);
637#if 0
638 }
639#endif
640
641
642
643
644 port->dcd.val=ISON(port,dcd);
645 port->cts.val=ISON(port,cts);
646 port->dsr.val=ISON(port,dsr);
647
648
649
650
651 port->interrupt_mask0 = SAB82532_IMR0_RFS | SAB82532_IMR0_PCE |
652 SAB82532_IMR0_PLLA | SAB82532_IMR0_RSC | SAB82532_IMR0_CDSC;
653
654
655
656 WRITEB(port,imr0,port->interrupt_mask0);
657 port->interrupt_mask1 = SAB82532_IMR1_EOP | SAB82532_IMR1_XMR |
658 SAB82532_IMR1_TIN | SAB82532_IMR1_XPR;
659 WRITEB(port, imr1, port->interrupt_mask1);
660 port->all_sent = 1;
661
662 if (port->tty)
663 {
664 clear_bit(TTY_IO_ERROR, &port->tty->flags);
665 }
666 port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
667
668
669
670
671 sab8253x_change_speedS(port);
672
673 port->flags |= FLAG8253X_INITIALIZED;
674 port->receive_chars = sab8253x_receive_charsS;
675 port->transmit_chars = sab8253x_transmit_charsS;
676 port->check_status = sab8253x_check_statusS;
677 port->receive_test = (SAB82532_ISR0_RME | SAB82532_ISR0_RFO | SAB82532_ISR0_RPF);
678 port->transmit_test = (SAB82532_ISR1_ALLS | SAB82532_ISR1_RDO | SAB82532_ISR1_XPR |
679 SAB82532_ISR1_XDU | SAB82532_ISR1_CSC);
680 port->check_status_test = (SAB82532_ISR1_CSC);
681
682
683
684
685 restore_flags(flags);
686 return 0;
687
688 errout:
689 restore_flags(flags);
690 return retval;
691}
692
693static void sab8253x_shutdownS(struct sab_port *port)
694{
695 unsigned long flags;
696
697 if (!(port->flags & FLAG8253X_INITIALIZED))
698 {
699 return;
700 }
701
702 save_flags(flags); cli();
703
704
705
706
707
708 wake_up_interruptible(&port->delta_msr_wait);
709
710 if (port->xmit_buf)
711 {
712 port->xmit_buf = 0;
713 }
714#ifdef XCONFIG_SERIAL_CONSOLE
715 if (port->is_console)
716 {
717 port->interrupt_mask0 =
718 SAB82532_IMR0_PERR | SAB82532_IMR0_FERR |
719
720 SAB82532_IMR0_PLLA | SAB82532_IMR0_CDSC;
721 WRITEB(port,imr0,port->interrupt_mask0);
722 port->interrupt_mask1 =
723 SAB82532_IMR1_BRKT | SAB82532_IMR1_ALLS |
724 SAB82532_IMR1_XOFF | SAB82532_IMR1_TIN |
725 SAB82532_IMR1_CSC | SAB82532_IMR1_XON |
726 SAB82532_IMR1_XPR;
727 WRITEB(port,imr1,port->interrupt_mask1);
728 if (port->tty)
729 {
730 set_bit(TTY_IO_ERROR, &port->tty->flags);
731 }
732 port->flags &= ~FLAG8253X_INITIALIZED;
733 restore_flags(flags);
734 return;
735 }
736#endif
737
738
739
740 port->interrupt_mask0 = 0xff;
741 WRITEB(port, imr0, port->interrupt_mask0);
742 port->interrupt_mask1 = 0xff;
743 WRITEB(port, imr1, port->interrupt_mask1);
744
745 if (!port->tty || (port->tty->termios->c_cflag & HUPCL))
746 {
747 LOWER(port,rts);
748 LOWER(port,dtr);
749 }
750
751
752 CLEAR_REG_BIT(port,mode,SAB82532_MODE_RAC);
753
754
755 CLEAR_REG_BIT(port,ccr0,SAB82532_CCR0_PU);
756
757 if (port->tty)
758 {
759 set_bit(TTY_IO_ERROR, &port->tty->flags);
760 }
761
762 port->flags &= ~FLAG8253X_INITIALIZED;
763 restore_flags(flags);
764}
765
766int sab8253x_writeS(struct tty_struct * tty, int from_user,
767 const unsigned char *buf, int count)
768{
769 struct sab_port *port = (struct sab_port *)tty->driver_data;
770 struct sk_buff *skb;
771 int truelength = 0;
772 int do_queue = 1;
773
774 if (sab8253x_serial_paranoia_check(port, tty->device, "sab8253x_write"))
775 {
776 return 0;
777 }
778
779 if(count == 0)
780 {
781 return 0;
782 }
783
784 if(port->active2.transmit == NULL)
785 {
786 return 0;
787 }
788
789 if((port->active2.transmit->Count & OWNER) == OWN_SAB)
790 {
791 sab8253x_start_txS(port);
792 return 0;
793 }
794
795#ifndef FREEININTERRUPT
796 skb = port->active2.transmit->HostVaddr;
797
798 if(port->buffergreedy == 0)
799 {
800 if((skb != NULL) ||
801 (port->active2.transmit->crcindex != 0))
802 {
803 register RING_DESCRIPTOR *freeme;
804
805 freeme = port->active2.transmit;
806 do
807 {
808 if((freeme->crcindex == 0) && (freeme->HostVaddr == NULL))
809 {
810 break;
811 }
812 if(freeme->HostVaddr)
813 {
814 skb_unlink((struct sk_buff*)freeme->HostVaddr);
815 dev_kfree_skb_any((struct sk_buff*)freeme->HostVaddr);
816 freeme->HostVaddr = NULL;
817 }
818 freeme->sendcrc = 0;
819 freeme->crcindex = 0;
820 freeme = (RING_DESCRIPTOR*) freeme->VNext;
821 }
822 while((freeme->Count & OWNER) != OWN_SAB);
823 }
824 skb = NULL;
825 }
826
827 if(skb != NULL)
828 {
829 truelength = (skb->end - skb->head);
830 if(truelength >= count)
831 {
832 skb->data = skb->head;
833 skb->tail = skb->head;
834 do_queue = 0;
835 }
836 else
837 {
838 skb_unlink(skb);
839 dev_kfree_skb_any(skb);
840 skb = NULL;
841 port->active2.transmit->HostVaddr = NULL;
842 }
843 }
844
845 port->active2.transmit->sendcrc = 0;
846 port->active2.transmit->crcindex = 0;
847#endif
848
849 if(skb == NULL)
850 {
851 if(port->DoingInterrupt)
852 {
853 skb = alloc_skb(count, GFP_ATOMIC);
854 }
855 else
856 {
857 skb = alloc_skb(count, GFP_KERNEL);
858 }
859 }
860
861 if(skb == NULL)
862 {
863 printk(KERN_ALERT "sab8253xs: no skbuffs available.\n");
864 return 0;
865 }
866 if(from_user)
867 {
868 copy_from_user(skb->data, buf, count);
869 }
870 else
871 {
872 memcpy(skb->data, buf, count);
873 }
874 skb->tail = (skb->data + count);
875 skb->data_len = count;
876 skb->len = count;
877
878 if(do_queue)
879 {
880 skb_queue_head(port->sab8253xbuflist, skb);
881 }
882
883 port->active2.transmit->HostVaddr = skb;
884 port->active2.transmit->sendcrc = 0;
885 port->active2.transmit->crcindex = 0;
886 port->active2.transmit->Count = (OWN_SAB|count);
887 port->active2.transmit = port->active2.transmit->VNext;
888
889 sab8253x_start_txS(port);
890 return count;
891}
892
893void sab8253x_throttleS(struct tty_struct * tty)
894{
895 struct sab_port *port = (struct sab_port *)tty->driver_data;
896
897 if (sab8253x_serial_paranoia_check(port, tty->device, "sab8253x_throttleS"))
898 {
899 return;
900 }
901
902 if (!tty)
903 {
904 return;
905 }
906
907 if (I_IXOFF(tty))
908 {
909 sab8253x_send_xcharS(tty, STOP_CHAR(tty));
910 }
911}
912
913void sab8253x_unthrottleS(struct tty_struct * tty)
914{
915 struct sab_port *port = (struct sab_port *)tty->driver_data;
916
917 if (sab8253x_serial_paranoia_check(port, tty->device, "sab8253x_unthrottle"))
918 {
919 return;
920 }
921
922 if (!tty)
923 {
924 return;
925 }
926
927 if (I_IXOFF(tty))
928 {
929 sab8253x_send_xcharS(tty, START_CHAR(tty));
930 }
931}
932
933void sab8253x_send_xcharS(struct tty_struct *tty, char ch)
934{
935 struct sab_port *port = (struct sab_port *)tty->driver_data;
936 unsigned long flags;
937 int stopped;
938 int hw_stopped;
939
940 if (sab8253x_serial_paranoia_check(port, tty->device, "sab8253x_send_xcharS"))
941 {
942 return;
943 }
944
945 if (!tty)
946 {
947 return;
948 }
949
950 if(port->sabnext2.transmit == NULL)
951 {
952 return;
953 }
954
955 save_flags(flags); cli();
956
957 if((port->sabnext2.transmit->Count & OWNER) == OWN_SAB)
958
959
960
961
962 {
963 port->sabnext2.transmit->sendcrc = 1;
964 port->sabnext2.transmit->crcindex = 3;
965 port->sabnext2.transmit->crc = (ch << 24);
966 restore_flags(flags);
967 }
968 else
969 {
970 restore_flags(flags);
971 sab8253x_writeS(tty, 0, &ch, 1);
972 }
973
974 stopped = tty->stopped;
975 hw_stopped = tty->hw_stopped;
976 tty->stopped = 0;
977 tty->hw_stopped = 0;
978
979 sab8253x_start_txS(port);
980
981 tty->stopped = stopped;
982 tty->hw_stopped = hw_stopped;
983}
984
985
986void sab8253x_breakS(struct tty_struct *tty, int break_state)
987{
988 struct sab_port *port = (struct sab_port *) tty->driver_data;
989
990 if (sab8253x_serial_paranoia_check(port, tty->device, "sab8253x_breakS"))
991 {
992 return;
993 }
994}
995
996void sab8253x_closeS(struct tty_struct *tty, struct file * filp)
997{
998 struct sab_port *port = (struct sab_port *)tty->driver_data;
999 unsigned long flags;
1000
1001 MOD_DEC_USE_COUNT;
1002 if (sab8253x_serial_paranoia_check(port, tty->device, "sab8253x_closeS"))
1003 {
1004 return;
1005 }
1006
1007 if(port->open_type == OPEN_SYNC_NET)
1008 {
1009 return;
1010 }
1011
1012 save_flags(flags); cli();
1013 --(port->count);
1014 if (tty_hung_up_p(filp))
1015 {
1016 if(port->count == 0)
1017
1018
1019 {
1020 port->open_type = OPEN_NOT;
1021 }
1022 else if(port->count < 0)
1023 {
1024 printk(KERN_ALERT "XX20: port->count went negative.\n");
1025 port->count = 0;
1026 port->open_type = OPEN_NOT;
1027 }
1028 restore_flags(flags);
1029 return;
1030 }
1031
1032#if 0
1033 if ((tty->count == 1) && (port->count != 0))
1034 {
1035
1036
1037
1038
1039
1040
1041
1042 printk("sab8253x_close: bad serial port count; tty->count is 1,"
1043 " port->count is %d\n", port->count);
1044 port->count = 0;
1045 }
1046#endif
1047
1048 if (port->count < 0)
1049 {
1050 printk(KERN_ALERT "sab8253x_close: bad serial port count for ttys%d: %d\n",
1051 port->line, port->count);
1052 port->count = 0;
1053 }
1054 if (port->count)
1055 {
1056 restore_flags(flags);
1057 return;
1058 }
1059 port->flags |= FLAG8253X_CLOSING;
1060
1061
1062
1063
1064
1065 if (port->flags & FLAG8253X_NORMAL_ACTIVE)
1066 {
1067 port->normal_termios = *tty->termios;
1068 }
1069 if (port->flags & FLAG8253X_CALLOUT_ACTIVE)
1070 {
1071 port->callout_termios = *tty->termios;
1072 }
1073
1074
1075
1076
1077 tty->closing = 1;
1078 if (port->closing_wait != SAB8253X_CLOSING_WAIT_NONE)
1079 {
1080 tty_wait_until_sent(tty, port->closing_wait);
1081 }
1082
1083
1084
1085
1086
1087
1088
1089#if 0
1090 port->interrupt_mask0 |= SAB82532_IMR0_TCD;
1091#endif
1092 WRITEB(port,imr0,port->interrupt_mask0);
1093
1094 CLEAR_REG_BIT(port, mode, SAB82532_MODE_RAC);
1095
1096 if (port->flags & FLAG8253X_INITIALIZED)
1097 {
1098
1099
1100
1101
1102
1103 sab8253x_wait_until_sent(tty, port->timeout);
1104 }
1105 sab8253x_shutdownS(port);
1106 Sab8253xCleanUpTransceiveN(port);
1107 if (tty->driver.flush_buffer)
1108 {
1109 tty->driver.flush_buffer(tty);
1110 }
1111 tty_ldisc_flush(tty);
1112 tty->closing = 0;
1113 port->event = 0;
1114 port->tty = 0;
1115 if (port->blocked_open)
1116 {
1117 if (port->close_delay)
1118 {
1119 current->state = TASK_INTERRUPTIBLE;
1120 schedule_timeout(port->close_delay);
1121 }
1122 wake_up_interruptible(&port->open_wait);
1123 }
1124 port->flags &= ~(FLAG8253X_NORMAL_ACTIVE|FLAG8253X_CALLOUT_ACTIVE|
1125 FLAG8253X_CLOSING);
1126 wake_up_interruptible(&port->close_wait);
1127 port->open_type = OPEN_NOT;
1128 restore_flags(flags);
1129}
1130
1131
1132void sab8253x_hangupS(struct tty_struct *tty)
1133{
1134 struct sab_port * port = (struct sab_port *)tty->driver_data;
1135
1136 if (sab8253x_serial_paranoia_check(port, tty->device, "sab8253x_hangupS"))
1137 {
1138 return;
1139 }
1140
1141#ifdef XCONFIG_SERIAL_CONSOLE
1142 if (port->is_console)
1143 {
1144 return;
1145 }
1146#endif
1147
1148 sab8253x_flush_buffer(tty);
1149 if(port)
1150 {
1151 sab8253x_shutdownS(port);
1152 Sab8253xCleanUpTransceiveN(port);
1153 port->event = 0;
1154 port->flags &= ~(FLAG8253X_NORMAL_ACTIVE|FLAG8253X_CALLOUT_ACTIVE);
1155 port->tty = 0;
1156 wake_up_interruptible(&port->open_wait);
1157 }
1158}
1159
1160int sab8253x_openS(struct tty_struct *tty, struct file * filp)
1161{
1162 struct sab_port *port;
1163 int retval, line;
1164 int counter;
1165 unsigned long flags;
1166
1167 MOD_INC_USE_COUNT;
1168 line = MINOR(tty->device) - tty->driver.minor_start;
1169
1170 for(counter = 0, port = AuraPortRoot;
1171 (counter < line) && (port != NULL);
1172 ++counter)
1173 {
1174 port = port->next;
1175 }
1176
1177 if (!port)
1178 {
1179 printk(KERN_ALERT "sab8253x_openS: can't find structure for line %d\n",
1180 line);
1181 return -ENODEV;
1182 }
1183
1184 save_flags(flags);
1185 cli();
1186
1187 if(port->tty == 0)
1188 {
1189 port->tty = tty;
1190 tty->flip.tqueue.routine = sab8253x_flush_to_ldiscS;
1191 }
1192 tty->driver_data = port;
1193
1194 if(port->function != FUNCTION_NR)
1195 {
1196 ++(port->count);
1197 restore_flags(flags);
1198 return -ENODEV;
1199 }
1200
1201 if(port->open_type == OPEN_SYNC_NET)
1202 {
1203 port->tty = NULL;
1204
1205 restore_flags(flags);
1206 return -EBUSY;
1207 }
1208
1209 restore_flags(flags);
1210
1211 if (sab8253x_serial_paranoia_check(port, tty->device, "sab8253x_openS"))
1212 {
1213 ++(port->count);
1214 return -ENODEV;
1215 }
1216
1217#ifdef DEBUG_OPEN
1218 printk("sab8253x_open %s%d, count = %d\n", tty->driver.name, port->line,
1219 port->count);
1220#endif
1221
1222
1223
1224
1225 if (tty_hung_up_p(filp) ||
1226 (port->flags & FLAG8253X_CLOSING))
1227 {
1228
1229 if (port->flags & FLAG8253X_CLOSING)
1230 {
1231 interruptible_sleep_on(&port->close_wait);
1232 }
1233#ifdef SERIAL_DO_RESTART
1234 ++(port->count);
1235 return ((port->flags & FLAG8253X_HUP_NOTIFY) ?
1236 -EAGAIN : -ERESTARTSYS);
1237#else
1238 ++(port->count);
1239 return -EAGAIN;
1240#endif
1241 }
1242
1243 if(port->flags & FLAG8253X_NORMAL_ACTIVE)
1244 {
1245 if(port->open_type == OPEN_ASYNC)
1246 {
1247 ++(port->count);
1248 return -EBUSY;
1249 }
1250 }
1251 if(port->open_type > OPEN_SYNC)
1252 {
1253 return -EBUSY;
1254 }
1255 if(Sab8253xSetUpLists(port))
1256 {
1257 ++(port->count);
1258 return -ENODEV;
1259 }
1260 if(Sab8253xInitDescriptors2(port, sab8253xs_listsize, sab8253xs_rbufsize))
1261 {
1262 ++(port->count);
1263 return -ENODEV;
1264 }
1265
1266 retval = sab8253x_startupS(port);
1267 if (retval)
1268 {
1269 ++(port->count);
1270 return retval;
1271 }
1272
1273 retval = sab8253x_block_til_ready(tty, filp, port);
1274 ++(port->count);
1275 if (retval)
1276 {
1277 return retval;
1278 }
1279
1280 port->tty = tty;
1281
1282 tty->flip.tqueue.routine = sab8253x_flush_to_ldiscS;
1283 if(Sab8253xSetUpLists(port))
1284 {
1285 return -ENODEV;
1286 }
1287 if(Sab8253xInitDescriptors2(port, sab8253xs_listsize, sab8253xs_rbufsize))
1288 {
1289 Sab8253xCleanUpTransceiveN(port);
1290
1291 return -ENODEV;
1292 }
1293
1294
1295
1296
1297 retval = sab8253x_startupS(port);
1298
1299 if (retval)
1300 {
1301 return retval;
1302 }
1303
1304 if ((port->count == 1) &&
1305 (port->flags & FLAG8253X_SPLIT_TERMIOS))
1306 {
1307 if (tty->driver.subtype == SERIAL_TYPE_NORMAL)
1308 {
1309 *tty->termios = port->normal_termios;
1310 }
1311 else
1312 {
1313 *tty->termios = port->callout_termios;
1314 }
1315 sab8253x_change_speedS(port);
1316 }
1317
1318
1319#ifdef XCONFIG_SERIAL_CONSOLE
1320 if (sab8253x_console.cflag && sab8253x_console.index == line)
1321 {
1322 tty->termios->c_cflag = sab8253x_console.cflag;
1323 sab8253x_console.cflag = 0;
1324 change_speed(port);
1325 }
1326#endif
1327
1328 port->session = current->session;
1329 port->pgrp = current->pgrp;
1330 port->open_type = OPEN_SYNC;
1331 return 0;
1332}
1333
1334
1335
1336
1337