blob: 34d8787557a1414237b4c6cb3286cb27271031f3 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2** -----------------------------------------------------------------------------
3**
4** Perle Specialix driver for Linux
5** Ported from existing RIO Driver for SCO sources.
6 *
7 * (C) 1990 - 2000 Specialix International Ltd., Byfleet, Surrey, UK.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22**
23** Module : riointr.c
24** SID : 1.2
25** Last Modified : 11/6/98 10:33:44
26** Retrieved : 11/6/98 10:33:49
27**
28** ident @(#)riointr.c 1.2
29**
30** -----------------------------------------------------------------------------
31*/
32#ifdef SCCS_LABELS
33static char *_riointr_c_sccs_ = "@(#)riointr.c 1.2";
34#endif
35
36
37#include <linux/module.h>
38#include <linux/slab.h>
39#include <linux/errno.h>
40#include <linux/tty.h>
Alan Cox33f0f882006-01-09 20:54:13 -080041#include <linux/tty_flip.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070042#include <asm/io.h>
43#include <asm/system.h>
44#include <asm/string.h>
45#include <asm/semaphore.h>
46#include <asm/uaccess.h>
47
48#include <linux/termios.h>
49#include <linux/serial.h>
50
51#include <linux/generic_serial.h>
52
53#include <linux/delay.h>
54
55#include "linux_compat.h"
56#include "rio_linux.h"
57#include "typdef.h"
58#include "pkt.h"
59#include "daemon.h"
60#include "rio.h"
61#include "riospace.h"
62#include "top.h"
63#include "cmdpkt.h"
64#include "map.h"
65#include "riotypes.h"
66#include "rup.h"
67#include "port.h"
68#include "riodrvr.h"
69#include "rioinfo.h"
70#include "func.h"
71#include "errors.h"
72#include "pci.h"
73
74#include "parmmap.h"
75#include "unixrup.h"
76#include "board.h"
77#include "host.h"
78#include "error.h"
79#include "phb.h"
80#include "link.h"
81#include "cmdblk.h"
82#include "route.h"
83#include "control.h"
84#include "cirrus.h"
85#include "rioioctl.h"
86
87
88static void RIOReceive(struct rio_info *, struct Port *);
89
90
Andrew Morton8d8706e2006-01-11 12:17:49 -080091static char *firstchars(char *p, int nch)
Linus Torvalds1da177e2005-04-16 15:20:36 -070092{
Andrew Morton8d8706e2006-01-11 12:17:49 -080093 static char buf[2][128];
94 static int t = 0;
95 t = !t;
96 memcpy(buf[t], p, nch);
97 buf[t][nch] = 0;
98 return buf[t];
Linus Torvalds1da177e2005-04-16 15:20:36 -070099}
100
101
102#define INCR( P, I ) ((P) = (((P)+(I)) & p->RIOBufferMask))
103/* Enable and start the transmission of packets */
Andrew Morton8d8706e2006-01-11 12:17:49 -0800104void RIOTxEnable(en)
105char *en;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106{
Andrew Morton8d8706e2006-01-11 12:17:49 -0800107 struct Port *PortP;
108 struct rio_info *p;
109 struct tty_struct *tty;
110 int c;
111 struct PKT *PacketP;
112 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113
Andrew Morton8d8706e2006-01-11 12:17:49 -0800114 PortP = (struct Port *) en;
115 p = (struct rio_info *) PortP->p;
116 tty = PortP->gs.tty;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700117
118
Andrew Morton8d8706e2006-01-11 12:17:49 -0800119 rio_dprintk(RIO_DEBUG_INTR, "tx port %d: %d chars queued.\n", PortP->PortNum, PortP->gs.xmit_cnt);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120
Andrew Morton8d8706e2006-01-11 12:17:49 -0800121 if (!PortP->gs.xmit_cnt)
122 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700123
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124
Andrew Morton8d8706e2006-01-11 12:17:49 -0800125 /* This routine is an order of magnitude simpler than the specialix
126 version. One of the disadvantages is that this version will send
127 an incomplete packet (usually 64 bytes instead of 72) once for
128 every 4k worth of data. Let's just say that this won't influence
129 performance significantly..... */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700130
Andrew Morton8d8706e2006-01-11 12:17:49 -0800131 rio_spin_lock_irqsave(&PortP->portSem, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132
Andrew Morton8d8706e2006-01-11 12:17:49 -0800133 while (can_add_transmit(&PacketP, PortP)) {
134 c = PortP->gs.xmit_cnt;
135 if (c > PKT_MAX_DATA_LEN)
136 c = PKT_MAX_DATA_LEN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700137
Andrew Morton8d8706e2006-01-11 12:17:49 -0800138 /* Don't copy past the end of the source buffer */
139 if (c > SERIAL_XMIT_SIZE - PortP->gs.xmit_tail)
140 c = SERIAL_XMIT_SIZE - PortP->gs.xmit_tail;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141
Andrew Morton8d8706e2006-01-11 12:17:49 -0800142 {
143 int t;
144 t = (c > 10) ? 10 : c;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145
Andrew Morton8d8706e2006-01-11 12:17:49 -0800146 rio_dprintk(RIO_DEBUG_INTR, "rio: tx port %d: copying %d chars: %s - %s\n", PortP->PortNum, c, firstchars(PortP->gs.xmit_buf + PortP->gs.xmit_tail, t), firstchars(PortP->gs.xmit_buf + PortP->gs.xmit_tail + c - t, t));
147 }
148 /* If for one reason or another, we can't copy more data,
149 we're done! */
150 if (c == 0)
151 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700152
Andrew Morton8d8706e2006-01-11 12:17:49 -0800153 rio_memcpy_toio(PortP->HostP->Caddr, (caddr_t) PacketP->data, PortP->gs.xmit_buf + PortP->gs.xmit_tail, c);
154 /* udelay (1); */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700155
Andrew Morton8d8706e2006-01-11 12:17:49 -0800156 writeb(c, &(PacketP->len));
157 if (!(PortP->State & RIO_DELETED)) {
158 add_transmit(PortP);
159 /*
160 ** Count chars tx'd for port statistics reporting
161 */
162 if (PortP->statsGather)
163 PortP->txchars += c;
164 }
165 PortP->gs.xmit_tail = (PortP->gs.xmit_tail + c) & (SERIAL_XMIT_SIZE - 1);
166 PortP->gs.xmit_cnt -= c;
167 }
168
169 rio_spin_unlock_irqrestore(&PortP->portSem, flags);
170
171 if (PortP->gs.xmit_cnt <= (PortP->gs.wakeup_chars + 2 * PKT_MAX_DATA_LEN)) {
172 rio_dprintk(RIO_DEBUG_INTR, "Waking up.... ldisc:%d (%d/%d)....", (int) (PortP->gs.tty->flags & (1 << TTY_DO_WRITE_WAKEUP)), PortP->gs.wakeup_chars, PortP->gs.xmit_cnt);
173 if ((PortP->gs.tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && PortP->gs.tty->ldisc.write_wakeup)
174 (PortP->gs.tty->ldisc.write_wakeup) (PortP->gs.tty);
175 rio_dprintk(RIO_DEBUG_INTR, "(%d/%d)\n", PortP->gs.wakeup_chars, PortP->gs.xmit_cnt);
176 wake_up_interruptible(&PortP->gs.tty->write_wait);
177 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178
179}
180
181
182/*
183** RIO Host Service routine. Does all the work traditionally associated with an
184** interrupt.
185*/
Andrew Morton8d8706e2006-01-11 12:17:49 -0800186static int RupIntr;
187static int RxIntr;
188static int TxIntr;
189void RIOServiceHost(p, HostP, From)
190struct rio_info *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700191struct Host *HostP;
Andrew Morton8d8706e2006-01-11 12:17:49 -0800192int From;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700193{
Andrew Morton8d8706e2006-01-11 12:17:49 -0800194 rio_spin_lock(&HostP->HostLock);
195 if ((HostP->Flags & RUN_STATE) != RC_RUNNING) {
196 static int t = 0;
197 rio_spin_unlock(&HostP->HostLock);
198 if ((t++ % 200) == 0)
199 rio_dprintk(RIO_DEBUG_INTR, "Interrupt but host not running. flags=%x.\n", (int) HostP->Flags);
200 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201 }
Andrew Morton8d8706e2006-01-11 12:17:49 -0800202 rio_spin_unlock(&HostP->HostLock);
203
204 if (RWORD(HostP->ParmMapP->rup_intr)) {
205 WWORD(HostP->ParmMapP->rup_intr, 0);
206 p->RIORupCount++;
207 RupIntr++;
208 rio_dprintk(RIO_DEBUG_INTR, "rio: RUP interrupt on host %d\n", HostP - p->RIOHosts);
209 RIOPollHostCommands(p, HostP);
210 }
211
212 if (RWORD(HostP->ParmMapP->rx_intr)) {
213 int port;
214
215 WWORD(HostP->ParmMapP->rx_intr, 0);
216 p->RIORxCount++;
217 RxIntr++;
218
219 rio_dprintk(RIO_DEBUG_INTR, "rio: RX interrupt on host %d\n", HostP - p->RIOHosts);
220 /*
221 ** Loop through every port. If the port is mapped into
222 ** the system ( i.e. has /dev/ttyXXXX associated ) then it is
223 ** worth checking. If the port isn't open, grab any packets
224 ** hanging on its receive queue and stuff them on the free
225 ** list; check for commands on the way.
226 */
227 for (port = p->RIOFirstPortsBooted; port < p->RIOLastPortsBooted + PORTS_PER_RTA; port++) {
228 struct Port *PortP = p->RIOPortp[port];
229 struct tty_struct *ttyP;
230 struct PKT *PacketP;
231
232 /*
233 ** not mapped in - most of the RIOPortp[] information
234 ** has not been set up!
235 ** Optimise: ports come in bundles of eight.
236 */
237 if (!PortP->Mapped) {
238 port += 7;
239 continue; /* with the next port */
240 }
241
242 /*
243 ** If the host board isn't THIS host board, check the next one.
244 ** optimise: ports come in bundles of eight.
245 */
246 if (PortP->HostP != HostP) {
247 port += 7;
248 continue;
249 }
250
251 /*
252 ** Let us see - is the port open? If not, then don't service it.
253 */
254 if (!(PortP->PortState & PORT_ISOPEN)) {
255 continue;
256 }
257
258 /*
259 ** find corresponding tty structure. The process of mapping
260 ** the ports puts these here.
261 */
262 ttyP = PortP->gs.tty;
263
264 /*
265 ** Lock the port before we begin working on it.
266 */
267 rio_spin_lock(&PortP->portSem);
268
269 /*
270 ** Process received data if there is any.
271 */
272 if (can_remove_receive(&PacketP, PortP))
273 RIOReceive(p, PortP);
274
275 /*
276 ** If there is no data left to be read from the port, and
277 ** it's handshake bit is set, then we must clear the handshake,
278 ** so that that downstream RTA is re-enabled.
279 */
280 if (!can_remove_receive(&PacketP, PortP) && (RWORD(PortP->PhbP->handshake) == PHB_HANDSHAKE_SET)) {
281 /*
282 ** MAGIC! ( Basically, handshake the RX buffer, so that
283 ** the RTAs upstream can be re-enabled. )
284 */
285 rio_dprintk(RIO_DEBUG_INTR, "Set RX handshake bit\n");
286 WWORD(PortP->PhbP->handshake, PHB_HANDSHAKE_SET | PHB_HANDSHAKE_RESET);
287 }
288 rio_spin_unlock(&PortP->portSem);
289 }
290 }
291
292 if (RWORD(HostP->ParmMapP->tx_intr)) {
293 int port;
294
295 WWORD(HostP->ParmMapP->tx_intr, 0);
296
297 p->RIOTxCount++;
298 TxIntr++;
299 rio_dprintk(RIO_DEBUG_INTR, "rio: TX interrupt on host %d\n", HostP - p->RIOHosts);
300
301 /*
302 ** Loop through every port.
303 ** If the port is mapped into the system ( i.e. has /dev/ttyXXXX
304 ** associated ) then it is worth checking.
305 */
306 for (port = p->RIOFirstPortsBooted; port < p->RIOLastPortsBooted + PORTS_PER_RTA; port++) {
307 struct Port *PortP = p->RIOPortp[port];
308 struct tty_struct *ttyP;
309 struct PKT *PacketP;
310
311 /*
312 ** not mapped in - most of the RIOPortp[] information
313 ** has not been set up!
314 */
315 if (!PortP->Mapped) {
316 port += 7;
317 continue; /* with the next port */
318 }
319
320 /*
321 ** If the host board isn't running, then its data structures
322 ** are no use to us - continue quietly.
323 */
324 if (PortP->HostP != HostP) {
325 port += 7;
326 continue; /* with the next port */
327 }
328
329 /*
330 ** Let us see - is the port open? If not, then don't service it.
331 */
332 if (!(PortP->PortState & PORT_ISOPEN)) {
333 continue;
334 }
335
336 rio_dprintk(RIO_DEBUG_INTR, "rio: Looking into port %d.\n", port);
337 /*
338 ** Lock the port before we begin working on it.
339 */
340 rio_spin_lock(&PortP->portSem);
341
342 /*
343 ** If we can't add anything to the transmit queue, then
344 ** we need do none of this processing.
345 */
346 if (!can_add_transmit(&PacketP, PortP)) {
347 rio_dprintk(RIO_DEBUG_INTR, "Can't add to port, so skipping.\n");
348 rio_spin_unlock(&PortP->portSem);
349 continue;
350 }
351
352 /*
353 ** find corresponding tty structure. The process of mapping
354 ** the ports puts these here.
355 */
356 ttyP = PortP->gs.tty;
357 /* If ttyP is NULL, the port is getting closed. Forget about it. */
358 if (!ttyP) {
359 rio_dprintk(RIO_DEBUG_INTR, "no tty, so skipping.\n");
360 rio_spin_unlock(&PortP->portSem);
361 continue;
362 }
363 /*
364 ** If there is more room available we start up the transmit
365 ** data process again. This can be direct I/O, if the cookmode
366 ** is set to COOK_RAW or COOK_MEDIUM, or will be a call to the
367 ** riotproc( T_OUTPUT ) if we are in COOK_WELL mode, to fetch
368 ** characters via the line discipline. We must always call
369 ** the line discipline,
370 ** so that user input characters can be echoed correctly.
371 **
372 ** ++++ Update +++++
373 ** With the advent of double buffering, we now see if
374 ** TxBufferOut-In is non-zero. If so, then we copy a packet
375 ** to the output place, and set it going. If this empties
376 ** the buffer, then we must issue a wakeup( ) on OUT.
377 ** If it frees space in the buffer then we must issue
378 ** a wakeup( ) on IN.
379 **
380 ** ++++ Extra! Extra! If PortP->WflushFlag is set, then we
381 ** have to send a WFLUSH command down the PHB, to mark the
382 ** end point of a WFLUSH. We also need to clear out any
383 ** data from the double buffer! ( note that WflushFlag is a
384 ** *count* of the number of WFLUSH commands outstanding! )
385 **
386 ** ++++ And there's more!
387 ** If an RTA is powered off, then on again, and rebooted,
388 ** whilst it has ports open, then we need to re-open the ports.
389 ** ( reasonable enough ). We can't do this when we spot the
390 ** re-boot, in interrupt time, because the queue is probably
391 ** full. So, when we come in here, we need to test if any
392 ** ports are in this condition, and re-open the port before
393 ** we try to send any more data to it. Now, the re-booted
394 ** RTA will be discarding packets from the PHB until it
395 ** receives this open packet, but don't worry tooo much
396 ** about that. The one thing that is interesting is the
397 ** combination of this effect and the WFLUSH effect!
398 */
399 /* For now don't handle RTA reboots. -- REW.
400 Reenabled. Otherwise RTA reboots didn't work. Duh. -- REW */
401 if (PortP->MagicFlags) {
402#if 1
403 if (PortP->MagicFlags & MAGIC_REBOOT) {
404 /*
405 ** well, the RTA has been rebooted, and there is room
406 ** on its queue to add the open packet that is required.
407 **
408 ** The messy part of this line is trying to decide if
409 ** we need to call the Param function as a tty or as
410 ** a modem.
411 ** DONT USE CLOCAL AS A TEST FOR THIS!
412 **
413 ** If we can't param the port, then move on to the
414 ** next port.
415 */
416 PortP->InUse = NOT_INUSE;
417
418 rio_spin_unlock(&PortP->portSem);
419 if (RIOParam(PortP, OPEN, ((PortP->Cor2Copy & (COR2_RTSFLOW | COR2_CTSFLOW)) == (COR2_RTSFLOW | COR2_CTSFLOW)) ? TRUE : FALSE, DONT_SLEEP) == RIO_FAIL) {
420 continue; /* with next port */
421 }
422 rio_spin_lock(&PortP->portSem);
423 PortP->MagicFlags &= ~MAGIC_REBOOT;
424 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425#endif
426
Andrew Morton8d8706e2006-01-11 12:17:49 -0800427 /*
428 ** As mentioned above, this is a tacky hack to cope
429 ** with WFLUSH
430 */
431 if (PortP->WflushFlag) {
432 rio_dprintk(RIO_DEBUG_INTR, "Want to WFLUSH mark this port\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433
Andrew Morton8d8706e2006-01-11 12:17:49 -0800434 if (PortP->InUse)
435 rio_dprintk(RIO_DEBUG_INTR, "FAILS - PORT IS IN USE\n");
436 }
437
438 while (PortP->WflushFlag && can_add_transmit(&PacketP, PortP) && (PortP->InUse == NOT_INUSE)) {
439 int p;
440 struct PktCmd *PktCmdP;
441
442 rio_dprintk(RIO_DEBUG_INTR, "Add WFLUSH marker to data queue\n");
443 /*
444 ** make it look just like a WFLUSH command
445 */
446 PktCmdP = (struct PktCmd *) &PacketP->data[0];
447
448 WBYTE(PktCmdP->Command, WFLUSH);
449
450 p = PortP->HostPort % (ushort) PORTS_PER_RTA;
451
452 /*
453 ** If second block of ports for 16 port RTA, add 8
454 ** to index 8-15.
455 */
456 if (PortP->SecondBlock)
457 p += PORTS_PER_RTA;
458
459 WBYTE(PktCmdP->PhbNum, p);
460
461 /*
462 ** to make debuggery easier
463 */
464 WBYTE(PacketP->data[2], 'W');
465 WBYTE(PacketP->data[3], 'F');
466 WBYTE(PacketP->data[4], 'L');
467 WBYTE(PacketP->data[5], 'U');
468 WBYTE(PacketP->data[6], 'S');
469 WBYTE(PacketP->data[7], 'H');
470 WBYTE(PacketP->data[8], ' ');
471 WBYTE(PacketP->data[9], '0' + PortP->WflushFlag);
472 WBYTE(PacketP->data[10], ' ');
473 WBYTE(PacketP->data[11], ' ');
474 WBYTE(PacketP->data[12], '\0');
475
476 /*
477 ** its two bytes long!
478 */
479 WBYTE(PacketP->len, PKT_CMD_BIT | 2);
480
481 /*
482 ** queue it!
483 */
484 if (!(PortP->State & RIO_DELETED)) {
485 add_transmit(PortP);
486 /*
487 ** Count chars tx'd for port statistics reporting
488 */
489 if (PortP->statsGather)
490 PortP->txchars += 2;
491 }
492
493 if (--(PortP->WflushFlag) == 0) {
494 PortP->MagicFlags &= ~MAGIC_FLUSH;
495 }
496
497 rio_dprintk(RIO_DEBUG_INTR, "Wflush count now stands at %d\n", PortP->WflushFlag);
498 }
499 if (PortP->MagicFlags & MORE_OUTPUT_EYGOR) {
500 if (PortP->MagicFlags & MAGIC_FLUSH) {
501 PortP->MagicFlags |= MORE_OUTPUT_EYGOR;
502 } else {
503 if (!can_add_transmit(&PacketP, PortP)) {
504 rio_spin_unlock(&PortP->portSem);
505 continue;
506 }
507 rio_spin_unlock(&PortP->portSem);
508 RIOTxEnable((char *) PortP);
509 rio_spin_lock(&PortP->portSem);
510 PortP->MagicFlags &= ~MORE_OUTPUT_EYGOR;
511 }
512 }
513 }
514
515
516 /*
517 ** If we can't add anything to the transmit queue, then
518 ** we need do none of the remaining processing.
519 */
520 if (!can_add_transmit(&PacketP, PortP)) {
521 rio_spin_unlock(&PortP->portSem);
522 continue;
523 }
524
525 rio_spin_unlock(&PortP->portSem);
526 RIOTxEnable((char *) PortP);
527 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529}
530
531/*
532** Routine for handling received data for clist drivers.
533** NB: Called with the tty locked. The spl from the lockb( ) is passed.
534** we return the ttySpl level that we re-locked at.
535*/
Andrew Morton8d8706e2006-01-11 12:17:49 -0800536static void RIOReceive(p, PortP)
537struct rio_info *p;
538struct Port *PortP;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539{
Andrew Morton8d8706e2006-01-11 12:17:49 -0800540 struct tty_struct *TtyP;
541 register ushort transCount;
542 struct PKT *PacketP;
543 register uint DataCnt;
544 uchar *ptr;
545 unsigned char *buf;
546 int copied = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547
Andrew Morton8d8706e2006-01-11 12:17:49 -0800548 static int intCount, RxIntCnt;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549
Andrew Morton8d8706e2006-01-11 12:17:49 -0800550 /*
551 ** The receive data process is to remove packets from the
552 ** PHB until there aren't any more or the current cblock
553 ** is full. When this occurs, there will be some left over
554 ** data in the packet, that we must do something with.
555 ** As we haven't unhooked the packet from the read list
556 ** yet, we can just leave the packet there, having first
557 ** made a note of how far we got. This means that we need
558 ** a pointer per port saying where we start taking the
559 ** data from - this will normally be zero, but when we
560 ** run out of space it will be set to the offset of the
561 ** next byte to copy from the packet data area. The packet
562 ** length field is decremented by the number of bytes that
563 ** we succesfully removed from the packet. When this reaches
564 ** zero, we reset the offset pointer to be zero, and free
565 ** the packet from the front of the queue.
566 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700567
Andrew Morton8d8706e2006-01-11 12:17:49 -0800568 intCount++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569
Andrew Morton8d8706e2006-01-11 12:17:49 -0800570 TtyP = PortP->gs.tty;
571 if (!TtyP) {
572 rio_dprintk(RIO_DEBUG_INTR, "RIOReceive: tty is null. \n");
573 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700574 }
Andrew Morton8d8706e2006-01-11 12:17:49 -0800575
576 if (PortP->State & RIO_THROTTLE_RX) {
577 rio_dprintk(RIO_DEBUG_INTR, "RIOReceive: Throttled. Can't handle more input.\n");
578 return;
579 }
580
581 if (PortP->State & RIO_DELETED) {
582 while (can_remove_receive(&PacketP, PortP)) {
583 remove_receive(PortP);
584 put_free_end(PortP->HostP, PacketP);
585 }
586 } else {
587 /*
588 ** loop, just so long as:
589 ** i ) there's some data ( i.e. can_remove_receive )
590 ** ii ) we haven't been blocked
591 ** iii ) there's somewhere to put the data
592 ** iv ) we haven't outstayed our welcome
593 */
594 transCount = 1;
595 while (can_remove_receive(&PacketP, PortP)
596 && transCount) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700597#ifdef STATS
Andrew Morton8d8706e2006-01-11 12:17:49 -0800598 PortP->Stat.RxIntCnt++;
599#endif /* STATS */
600 RxIntCnt++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700601
Andrew Morton8d8706e2006-01-11 12:17:49 -0800602 /*
603 ** check that it is not a command!
604 */
605 if (PacketP->len & PKT_CMD_BIT) {
606 rio_dprintk(RIO_DEBUG_INTR, "RIO: unexpected command packet received on PHB\n");
607 /* rio_dprint(RIO_DEBUG_INTR, (" sysport = %d\n", p->RIOPortp->PortNum)); */
608 rio_dprintk(RIO_DEBUG_INTR, " dest_unit = %d\n", PacketP->dest_unit);
609 rio_dprintk(RIO_DEBUG_INTR, " dest_port = %d\n", PacketP->dest_port);
610 rio_dprintk(RIO_DEBUG_INTR, " src_unit = %d\n", PacketP->src_unit);
611 rio_dprintk(RIO_DEBUG_INTR, " src_port = %d\n", PacketP->src_port);
612 rio_dprintk(RIO_DEBUG_INTR, " len = %d\n", PacketP->len);
613 rio_dprintk(RIO_DEBUG_INTR, " control = %d\n", PacketP->control);
614 rio_dprintk(RIO_DEBUG_INTR, " csum = %d\n", PacketP->csum);
615 rio_dprintk(RIO_DEBUG_INTR, " data bytes: ");
616 for (DataCnt = 0; DataCnt < PKT_MAX_DATA_LEN; DataCnt++)
617 rio_dprintk(RIO_DEBUG_INTR, "%d\n", PacketP->data[DataCnt]);
618 remove_receive(PortP);
619 put_free_end(PortP->HostP, PacketP);
620 continue; /* with next packet */
621 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700622
Andrew Morton8d8706e2006-01-11 12:17:49 -0800623 /*
624 ** How many characters can we move 'upstream' ?
625 **
626 ** Determine the minimum of the amount of data
627 ** available and the amount of space in which to
628 ** put it.
629 **
630 ** 1. Get the packet length by masking 'len'
631 ** for only the length bits.
632 ** 2. Available space is [buffer size] - [space used]
633 **
634 ** Transfer count is the minimum of packet length
635 ** and available space.
636 */
637
638 transCount = tty_buffer_request_room(TtyP, PacketP->len & PKT_LEN_MASK);
639 rio_dprintk(RIO_DEBUG_REC, "port %d: Copy %d bytes\n", PortP->PortNum, transCount);
640 /*
641 ** To use the following 'kkprintfs' for debugging - change the '#undef'
642 ** to '#define', (this is the only place ___DEBUG_IT___ occurs in the
643 ** driver).
644 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700645#undef ___DEBUG_IT___
646#ifdef ___DEBUG_IT___
Andrew Morton8d8706e2006-01-11 12:17:49 -0800647 kkprintf("I:%d R:%d P:%d Q:%d C:%d F:%x ", intCount, RxIntCnt, PortP->PortNum, TtyP->rxqueue.count, transCount, TtyP->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648#endif
Andrew Morton8d8706e2006-01-11 12:17:49 -0800649 ptr = (uchar *) PacketP->data + PortP->RxDataStart;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650
Andrew Morton8d8706e2006-01-11 12:17:49 -0800651 tty_prepare_flip_string(TtyP, &buf, transCount);
652 rio_memcpy_fromio(buf, ptr, transCount);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700653#ifdef STATS
Andrew Morton8d8706e2006-01-11 12:17:49 -0800654 /*
655 ** keep a count for statistical purposes
656 */
657 PortP->Stat.RxCharCnt += transCount;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658#endif
Andrew Morton8d8706e2006-01-11 12:17:49 -0800659 PortP->RxDataStart += transCount;
660 PacketP->len -= transCount;
661 copied += transCount;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662
663
664#ifdef ___DEBUG_IT___
Andrew Morton8d8706e2006-01-11 12:17:49 -0800665 kkprintf("T:%d L:%d\n", DataCnt, PacketP->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700666#endif
667
Andrew Morton8d8706e2006-01-11 12:17:49 -0800668 if (PacketP->len == 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669 /*
Andrew Morton8d8706e2006-01-11 12:17:49 -0800670 ** If we have emptied the packet, then we can
671 ** free it, and reset the start pointer for
672 ** the next packet.
673 */
674 remove_receive(PortP);
675 put_free_end(PortP->HostP, PacketP);
676 PortP->RxDataStart = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677#ifdef STATS
678 /*
Andrew Morton8d8706e2006-01-11 12:17:49 -0800679 ** more lies ( oops, I mean statistics )
680 */
681 PortP->Stat.RxPktCnt++;
682#endif /* STATS */
683 }
684 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685 }
Andrew Morton8d8706e2006-01-11 12:17:49 -0800686 if (copied) {
687 rio_dprintk(RIO_DEBUG_REC, "port %d: pushing tty flip buffer: %d total bytes copied.\n", PortP->PortNum, copied);
688 tty_flip_buffer_push(TtyP);
689 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690
Andrew Morton8d8706e2006-01-11 12:17:49 -0800691 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692}
693
694#ifdef FUTURE_RELEASE
695/*
696** The proc routine called by the line discipline to do the work for it.
697** The proc routine works hand in hand with the interrupt routine.
698*/
Andrew Morton8d8706e2006-01-11 12:17:49 -0800699int riotproc(p, tp, cmd, port)
700struct rio_info *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701register struct ttystatics *tp;
702int cmd;
Andrew Morton8d8706e2006-01-11 12:17:49 -0800703int port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704{
705 register struct Port *PortP;
706 int SysPort;
707 struct PKT *PacketP;
708
Andrew Morton8d8706e2006-01-11 12:17:49 -0800709 SysPort = port; /* Believe me, it works. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700710
Andrew Morton8d8706e2006-01-11 12:17:49 -0800711 if (SysPort < 0 || SysPort >= RIO_PORTS) {
712 rio_dprintk(RIO_DEBUG_INTR, "Illegal port %d derived from TTY in riotproc()\n", SysPort);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700713 return 0;
714 }
715 PortP = p->RIOPortp[SysPort];
716
Andrew Morton8d8706e2006-01-11 12:17:49 -0800717 if ((uint) PortP->PhbP < (uint) PortP->Caddr || (uint) PortP->PhbP >= (uint) PortP->Caddr + SIXTY_FOUR_K) {
718 rio_dprintk(RIO_DEBUG_INTR, "RIO: NULL or BAD PhbP on sys port %d in proc routine\n", SysPort);
719 rio_dprintk(RIO_DEBUG_INTR, " PortP = 0x%x\n", PortP);
720 rio_dprintk(RIO_DEBUG_INTR, " PortP->PhbP = 0x%x\n", PortP->PhbP);
721 rio_dprintk(RIO_DEBUG_INTR, " PortP->Caddr = 0x%x\n", PortP->PhbP);
722 rio_dprintk(RIO_DEBUG_INTR, " PortP->HostPort = 0x%x\n", PortP->HostPort);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723 return 0;
724 }
725
Andrew Morton8d8706e2006-01-11 12:17:49 -0800726 switch (cmd) {
727 case T_WFLUSH:
728 rio_dprintk(RIO_DEBUG_INTR, "T_WFLUSH\n");
729 /*
730 ** Because of the spooky way the RIO works, we don't need
731 ** to issue a flush command on any of the SET*F commands,
732 ** as that causes trouble with getty and login, which issue
733 ** these commands to incur a READ flush, and rely on the fact
734 ** that the line discipline does a wait for drain for them.
735 ** As the rio doesn't wait for drain, the write flush would
736 ** destroy the Password: prompt. This isn't very friendly, so
737 ** here we only issue a WFLUSH command if we are in the interrupt
738 ** routine, or we aren't executing a SET*F command.
739 */
740 if (PortP->HostP->InIntr || !PortP->FlushCmdBodge) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741 /*
Andrew Morton8d8706e2006-01-11 12:17:49 -0800742 ** form a wflush packet - 1 byte long, no data
743 */
744 if (PortP->State & RIO_DELETED) {
745 rio_dprintk(RIO_DEBUG_INTR, "WFLUSH on deleted RTA\n");
746 } else {
747 if (RIOPreemptiveCmd(p, PortP, WFLUSH) == RIO_FAIL) {
748 rio_dprintk(RIO_DEBUG_INTR, "T_WFLUSH Command failed\n");
749 } else
750 rio_dprintk(RIO_DEBUG_INTR, "T_WFLUSH Command\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751 }
752 /*
Andrew Morton8d8706e2006-01-11 12:17:49 -0800753 ** WFLUSH operation - flush the data!
754 */
755 PortP->TxBufferIn = PortP->TxBufferOut = 0;
756 } else {
757 rio_dprintk(RIO_DEBUG_INTR, "T_WFLUSH Command ignored\n");
758 }
759 /*
760 ** sort out the line discipline
761 */
762 if (PortP->CookMode == COOK_WELL)
763 goto start;
764 break;
765
766 case T_RESUME:
767 rio_dprintk(RIO_DEBUG_INTR, "T_RESUME\n");
768 /*
769 ** send pre-emptive resume packet
770 */
771 if (PortP->State & RIO_DELETED) {
772 rio_dprintk(RIO_DEBUG_INTR, "RESUME on deleted RTA\n");
773 } else {
774 if (RIOPreemptiveCmd(p, PortP, RESUME) == RIO_FAIL) {
775 rio_dprintk(RIO_DEBUG_INTR, "T_RESUME Command failed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776 }
Andrew Morton8d8706e2006-01-11 12:17:49 -0800777 }
778 /*
779 ** and re-start the sender software!
780 */
781 if (PortP->CookMode == COOK_WELL)
782 goto start;
783 break;
784
785 case T_TIME:
786 rio_dprintk(RIO_DEBUG_INTR, "T_TIME\n");
787 /*
788 ** T_TIME is called when xDLY is set in oflags and
789 ** the line discipline timeout has expired. It's
790 ** function in life is to clear the TIMEOUT flag
791 ** and to re-start output to the port.
792 */
793 /*
794 ** Fall through and re-start output
795 */
796 case T_OUTPUT:
797 start:
798 if (PortP->MagicFlags & MAGIC_FLUSH) {
799 PortP->MagicFlags |= MORE_OUTPUT_EYGOR;
800 return 0;
801 }
802 RIOTxEnable((char *) PortP);
803 PortP->MagicFlags &= ~MORE_OUTPUT_EYGOR;
804 /*rio_dprint(RIO_DEBUG_INTR, PortP,DBG_PROC,"T_OUTPUT finished\n"); */
805 break;
806
807 case T_SUSPEND:
808 rio_dprintk(RIO_DEBUG_INTR, "T_SUSPEND\n");
809 /*
810 ** send a suspend pre-emptive packet.
811 */
812 if (PortP->State & RIO_DELETED) {
813 rio_dprintk(RIO_DEBUG_INTR, "SUSPEND deleted RTA\n");
814 } else {
815 if (RIOPreemptiveCmd(p, PortP, SUSPEND) == RIO_FAIL) {
816 rio_dprintk(RIO_DEBUG_INTR, "T_SUSPEND Command failed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700817 }
Andrew Morton8d8706e2006-01-11 12:17:49 -0800818 }
819 /*
820 ** done!
821 */
822 break;
823
824 case T_BLOCK:
825 rio_dprintk(RIO_DEBUG_INTR, "T_BLOCK\n");
826 break;
827
828 case T_RFLUSH:
829 rio_dprintk(RIO_DEBUG_INTR, "T_RFLUSH\n");
830 if (PortP->State & RIO_DELETED) {
831 rio_dprintk(RIO_DEBUG_INTR, "RFLUSH on deleted RTA\n");
832 PortP->RxDataStart = 0;
833 } else {
834 if (RIOPreemptiveCmd(p, PortP, RFLUSH) == RIO_FAIL) {
835 rio_dprintk(RIO_DEBUG_INTR, "T_RFLUSH Command failed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700836 return 0;
837 }
Andrew Morton8d8706e2006-01-11 12:17:49 -0800838 PortP->RxDataStart = 0;
839 while (can_remove_receive(&PacketP, PortP)) {
840 remove_receive(PortP);
841 ShowPacket(DBG_PROC, PacketP);
842 put_free_end(PortP->HostP, PacketP);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700843 }
Andrew Morton8d8706e2006-01-11 12:17:49 -0800844 if (PortP->PhbP->handshake == PHB_HANDSHAKE_SET) {
845 /*
846 ** MAGIC!
847 */
848 rio_dprintk(RIO_DEBUG_INTR, "Set receive handshake bit\n");
849 PortP->PhbP->handshake |= PHB_HANDSHAKE_RESET;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850 }
Andrew Morton8d8706e2006-01-11 12:17:49 -0800851 }
852 break;
853 /* FALLTHROUGH */
854 case T_UNBLOCK:
855 rio_dprintk(RIO_DEBUG_INTR, "T_UNBLOCK\n");
856 /*
857 ** If there is any data to receive set a timeout to service it.
858 */
859 RIOReceive(p, PortP);
860 break;
861
862 case T_BREAK:
863 rio_dprintk(RIO_DEBUG_INTR, "T_BREAK\n");
864 /*
865 ** Send a break command. For Sys V
866 ** this is a timed break, so we
867 ** send a SBREAK[time] packet
868 */
869 /*
870 ** Build a BREAK command
871 */
872 if (PortP->State & RIO_DELETED) {
873 rio_dprintk(RIO_DEBUG_INTR, "BREAK on deleted RTA\n");
874 } else {
875 if (RIOShortCommand(PortP, SBREAK, 2, p->RIOConf.BreakInterval) == RIO_FAIL) {
876 rio_dprintk(RIO_DEBUG_INTR, "SBREAK RIOShortCommand failed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700877 }
Andrew Morton8d8706e2006-01-11 12:17:49 -0800878 }
879
880 /*
881 ** done!
882 */
883 break;
884
885 case T_INPUT:
886 rio_dprintk(RIO_DEBUG_INTR, "Proc T_INPUT called - I don't know what to do!\n");
887 break;
888 case T_PARM:
889 rio_dprintk(RIO_DEBUG_INTR, "Proc T_PARM called - I don't know what to do!\n");
890 break;
891
892 case T_SWTCH:
893 rio_dprintk(RIO_DEBUG_INTR, "Proc T_SWTCH called - I don't know what to do!\n");
894 break;
895
896 default:
897 rio_dprintk(RIO_DEBUG_INTR, "Proc UNKNOWN command %d\n", cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898 }
899 /*
Andrew Morton8d8706e2006-01-11 12:17:49 -0800900 ** T_OUTPUT returns without passing through this point!
901 */
902 /*rio_dprint(RIO_DEBUG_INTR, PortP,DBG_PROC,"riotproc done\n"); */
903 return (0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700904}
905#endif