]> bbs.cooldavid.org Git - net-next-2.6.git/blob - drivers/char/rio/riotty.c
47fab7c3307302d3d0b553b61e8276a7e5be0824
[net-next-2.6.git] / drivers / char / rio / riotty.c
1 /*
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          : riotty.c
24 **      SID             : 1.3
25 **      Last Modified   : 11/6/98 10:33:47
26 **      Retrieved       : 11/6/98 10:33:50
27 **
28 **  ident @(#)riotty.c  1.3
29 **
30 ** -----------------------------------------------------------------------------
31 */
32
33 #define __EXPLICIT_DEF_H__
34
35 #include <linux/module.h>
36 #include <linux/sched.h>
37 #include <linux/slab.h>
38 #include <linux/errno.h>
39 #include <linux/tty.h>
40 #include <linux/string.h>
41 #include <asm/io.h>
42 #include <asm/system.h>
43 #include <asm/string.h>
44 #include <asm/uaccess.h>
45
46 #include <linux/termios.h>
47
48 #include <linux/serial.h>
49
50 #include <linux/generic_serial.h>
51
52
53 #include "linux_compat.h"
54 #include "rio_linux.h"
55 #include "pkt.h"
56 #include "daemon.h"
57 #include "rio.h"
58 #include "riospace.h"
59 #include "cmdpkt.h"
60 #include "map.h"
61 #include "rup.h"
62 #include "port.h"
63 #include "riodrvr.h"
64 #include "rioinfo.h"
65 #include "func.h"
66 #include "errors.h"
67 #include "pci.h"
68
69 #include "parmmap.h"
70 #include "unixrup.h"
71 #include "board.h"
72 #include "host.h"
73 #include "phb.h"
74 #include "link.h"
75 #include "cmdblk.h"
76 #include "route.h"
77 #include "cirrus.h"
78 #include "rioioctl.h"
79 #include "param.h"
80
81 static void RIOClearUp(struct Port *PortP);
82
83 /* Below belongs in func.h */
84 int RIOShortCommand(struct rio_info *p, struct Port *PortP, int command, int len, int arg);
85
86
87 extern struct rio_info *p;
88
89
90 int riotopen(struct tty_struct *tty, struct file *filp)
91 {
92         unsigned int SysPort;
93         int repeat_this = 250;
94         struct Port *PortP;     /* pointer to the port structure */
95         unsigned long flags;
96         int retval = 0;
97
98         func_enter();
99
100         /* Make sure driver_data is NULL in case the rio isn't booted jet. Else gs_close
101            is going to oops.
102          */
103         tty->driver_data = NULL;
104
105         SysPort = rio_minor(tty);
106
107         if (p->RIOFailed) {
108                 rio_dprintk(RIO_DEBUG_TTY, "System initialisation failed\n");
109                 func_exit();
110                 return -ENXIO;
111         }
112
113         rio_dprintk(RIO_DEBUG_TTY, "port open SysPort %d (mapped:%d)\n", SysPort, p->RIOPortp[SysPort]->Mapped);
114
115         /*
116          ** Validate that we have received a legitimate request.
117          ** Currently, just check that we are opening a port on
118          ** a host card that actually exists, and that the port
119          ** has been mapped onto a host.
120          */
121         if (SysPort >= RIO_PORTS) {     /* out of range ? */
122                 rio_dprintk(RIO_DEBUG_TTY, "Illegal port number %d\n", SysPort);
123                 func_exit();
124                 return -ENXIO;
125         }
126
127         /*
128          ** Grab pointer to the port stucture
129          */
130         PortP = p->RIOPortp[SysPort];   /* Get control struc */
131         rio_dprintk(RIO_DEBUG_TTY, "PortP: %p\n", PortP);
132         if (!PortP->Mapped) {   /* we aren't mapped yet! */
133                 /*
134                  ** The system doesn't know which RTA this port
135                  ** corresponds to.
136                  */
137                 rio_dprintk(RIO_DEBUG_TTY, "port not mapped into system\n");
138                 func_exit();
139                 return -ENXIO;
140         }
141
142         tty->driver_data = PortP;
143
144         PortP->gs.port.tty = tty;
145         PortP->gs.port.count++;
146
147         rio_dprintk(RIO_DEBUG_TTY, "%d bytes in tx buffer\n", PortP->gs.xmit_cnt);
148
149         retval = gs_init_port(&PortP->gs);
150         if (retval) {
151                 PortP->gs.port.count--;
152                 return -ENXIO;
153         }
154         /*
155          ** If the host hasn't been booted yet, then
156          ** fail
157          */
158         if ((PortP->HostP->Flags & RUN_STATE) != RC_RUNNING) {
159                 rio_dprintk(RIO_DEBUG_TTY, "Host not running\n");
160                 func_exit();
161                 return -ENXIO;
162         }
163
164         /*
165          ** If the RTA has not booted yet and the user has choosen to block
166          ** until the RTA is present then we must spin here waiting for
167          ** the RTA to boot.
168          */
169         /* I find the above code a bit hairy. I find the below code
170            easier to read and shorter. Now, if it works too that would
171            be great... -- REW 
172          */
173         rio_dprintk(RIO_DEBUG_TTY, "Checking if RTA has booted... \n");
174         while (!(PortP->HostP->Mapping[PortP->RupNum].Flags & RTA_BOOTED)) {
175                 if (!PortP->WaitUntilBooted) {
176                         rio_dprintk(RIO_DEBUG_TTY, "RTA never booted\n");
177                         func_exit();
178                         return -ENXIO;
179                 }
180
181                 /* Under Linux you'd normally use a wait instead of this
182                    busy-waiting. I'll stick with the old implementation for
183                    now. --REW
184                  */
185                 if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) {
186                         rio_dprintk(RIO_DEBUG_TTY, "RTA_wait_for_boot: EINTR in delay \n");
187                         func_exit();
188                         return -EINTR;
189                 }
190                 if (repeat_this-- <= 0) {
191                         rio_dprintk(RIO_DEBUG_TTY, "Waiting for RTA to boot timeout\n");
192                         func_exit();
193                         return -EIO;
194                 }
195         }
196         rio_dprintk(RIO_DEBUG_TTY, "RTA has been booted\n");
197         rio_spin_lock_irqsave(&PortP->portSem, flags);
198         if (p->RIOHalted) {
199                 goto bombout;
200         }
201
202         /*
203          ** If the port is in the final throws of being closed,
204          ** we should wait here (politely), waiting
205          ** for it to finish, so that it doesn't close us!
206          */
207         while ((PortP->State & RIO_CLOSING) && !p->RIOHalted) {
208                 rio_dprintk(RIO_DEBUG_TTY, "Waiting for RIO_CLOSING to go away\n");
209                 if (repeat_this-- <= 0) {
210                         rio_dprintk(RIO_DEBUG_TTY, "Waiting for not idle closed broken by signal\n");
211                         RIOPreemptiveCmd(p, PortP, RIOC_FCLOSE);
212                         retval = -EINTR;
213                         goto bombout;
214                 }
215                 rio_spin_unlock_irqrestore(&PortP->portSem, flags);
216                 if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) {
217                         rio_spin_lock_irqsave(&PortP->portSem, flags);
218                         retval = -EINTR;
219                         goto bombout;
220                 }
221                 rio_spin_lock_irqsave(&PortP->portSem, flags);
222         }
223
224         if (!PortP->Mapped) {
225                 rio_dprintk(RIO_DEBUG_TTY, "Port unmapped while closing!\n");
226                 rio_spin_unlock_irqrestore(&PortP->portSem, flags);
227                 retval = -ENXIO;
228                 func_exit();
229                 return retval;
230         }
231
232         if (p->RIOHalted) {
233                 goto bombout;
234         }
235
236 /*
237 ** 15.10.1998 ARG - ESIL 0761 part fix
238 ** RIO has it's own CTSFLOW and RTSFLOW flags in 'Config' in the port structure,
239 ** we need to make sure that the flags are clear when the port is opened.
240 */
241         /* Uh? Suppose I turn these on and then another process opens
242            the port again? The flags get cleared! Not good. -- REW */
243         if (!(PortP->State & (RIO_LOPEN | RIO_MOPEN))) {
244                 PortP->Config &= ~(RIO_CTSFLOW | RIO_RTSFLOW);
245         }
246
247         if (!(PortP->firstOpen)) {      /* First time ? */
248                 rio_dprintk(RIO_DEBUG_TTY, "First open for this port\n");
249
250
251                 PortP->firstOpen++;
252                 PortP->CookMode = 0;    /* XXX RIOCookMode(tp); */
253                 PortP->InUse = NOT_INUSE;
254
255                 /* Tentative fix for bug PR27. Didn't work. */
256                 /* PortP->gs.xmit_cnt = 0; */
257
258                 rio_spin_unlock_irqrestore(&PortP->portSem, flags);
259
260                 /* Someone explain to me why this delay/config is
261                    here. If I read the docs correctly the "open"
262                    command piggybacks the parameters immediately.
263                    -- REW */
264                 RIOParam(PortP, RIOC_OPEN, 1, OK_TO_SLEEP); /* Open the port */
265                 rio_spin_lock_irqsave(&PortP->portSem, flags);
266
267                 /*
268                  ** wait for the port to be not closed.
269                  */
270                 while (!(PortP->PortState & PORT_ISOPEN) && !p->RIOHalted) {
271                         rio_dprintk(RIO_DEBUG_TTY, "Waiting for PORT_ISOPEN-currently %x\n", PortP->PortState);
272                         rio_spin_unlock_irqrestore(&PortP->portSem, flags);
273                         if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) {
274                                 rio_dprintk(RIO_DEBUG_TTY, "Waiting for open to finish broken by signal\n");
275                                 RIOPreemptiveCmd(p, PortP, RIOC_FCLOSE);
276                                 func_exit();
277                                 return -EINTR;
278                         }
279                         rio_spin_lock_irqsave(&PortP->portSem, flags);
280                 }
281
282                 if (p->RIOHalted) {
283                         retval = -EIO;
284                       bombout:
285                         /*                    RIOClearUp( PortP ); */
286                         rio_spin_unlock_irqrestore(&PortP->portSem, flags);
287                         return retval;
288                 }
289                 rio_dprintk(RIO_DEBUG_TTY, "PORT_ISOPEN found\n");
290         }
291         rio_dprintk(RIO_DEBUG_TTY, "Modem - test for carrier\n");
292         /*
293          ** ACTION
294          ** insert test for carrier here. -- ???
295          ** I already see that test here. What's the deal? -- REW
296          */
297         if ((PortP->gs.port.tty->termios->c_cflag & CLOCAL) ||
298                         (PortP->ModemState & RIOC_MSVR1_CD)) {
299                 rio_dprintk(RIO_DEBUG_TTY, "open(%d) Modem carr on\n", SysPort);
300                 /*
301                    tp->tm.c_state |= CARR_ON;
302                    wakeup((caddr_t) &tp->tm.c_canq);
303                  */
304                 PortP->State |= RIO_CARR_ON;
305                 wake_up_interruptible(&PortP->gs.port.open_wait);
306         } else {        /* no carrier - wait for DCD */
307                         /*
308                    while (!(PortP->gs.port.tty->termios->c_state & CARR_ON) &&
309                    !(filp->f_flags & O_NONBLOCK) && !p->RIOHalted )
310                  */
311                 while (!(PortP->State & RIO_CARR_ON) && !(filp->f_flags & O_NONBLOCK) && !p->RIOHalted) {
312                                 rio_dprintk(RIO_DEBUG_TTY, "open(%d) sleeping for carr on\n", SysPort);
313                         /*
314                            PortP->gs.port.tty->termios->c_state |= WOPEN;
315                          */
316                         PortP->State |= RIO_WOPEN;
317                         rio_spin_unlock_irqrestore(&PortP->portSem, flags);
318                         if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) {
319                                 rio_spin_lock_irqsave(&PortP->portSem, flags);
320                                 /*
321                                  ** ACTION: verify that this is a good thing
322                                  ** to do here. -- ???
323                                  ** I think it's OK. -- REW
324                                  */
325                                 rio_dprintk(RIO_DEBUG_TTY, "open(%d) sleeping for carr broken by signal\n", SysPort);
326                                 RIOPreemptiveCmd(p, PortP, RIOC_FCLOSE);
327                                 /*
328                                    tp->tm.c_state &= ~WOPEN;
329                                  */
330                                 PortP->State &= ~RIO_WOPEN;
331                                 rio_spin_unlock_irqrestore(&PortP->portSem, flags);
332                                 func_exit();
333                                 return -EINTR;
334                         }
335                         rio_spin_lock_irqsave(&PortP->portSem, flags);
336                 }
337                 PortP->State &= ~RIO_WOPEN;
338         }
339         if (p->RIOHalted)
340                 goto bombout;
341         rio_dprintk(RIO_DEBUG_TTY, "Setting RIO_MOPEN\n");
342         PortP->State |= RIO_MOPEN;
343
344         if (p->RIOHalted)
345                 goto bombout;
346
347         rio_dprintk(RIO_DEBUG_TTY, "high level open done\n");
348
349         /*
350          ** Count opens for port statistics reporting
351          */
352         if (PortP->statsGather)
353                 PortP->opens++;
354
355         rio_spin_unlock_irqrestore(&PortP->portSem, flags);
356         rio_dprintk(RIO_DEBUG_TTY, "Returning from open\n");
357         func_exit();
358         return 0;
359 }
360
361 /*
362 ** RIOClose the port.
363 ** The operating system thinks that this is last close for the device.
364 ** As there are two interfaces to the port (Modem and tty), we need to
365 ** check that both are closed before we close the device.
366 */
367 int riotclose(void *ptr)
368 {
369         struct Port *PortP = ptr;       /* pointer to the port structure */
370         int deleted = 0;
371         int try = -1;           /* Disable the timeouts by setting them to -1 */
372         int repeat_this = -1;   /* Congrats to those having 15 years of
373                                    uptime! (You get to break the driver.) */
374         unsigned long end_time;
375         struct tty_struct *tty;
376         unsigned long flags;
377         int rv = 0;
378
379         rio_dprintk(RIO_DEBUG_TTY, "port close SysPort %d\n", PortP->PortNum);
380
381         /* PortP = p->RIOPortp[SysPort]; */
382         rio_dprintk(RIO_DEBUG_TTY, "Port is at address %p\n", PortP);
383         /* tp = PortP->TtyP; *//* Get tty */
384         tty = PortP->gs.port.tty;
385         rio_dprintk(RIO_DEBUG_TTY, "TTY is at address %p\n", tty);
386
387         if (PortP->gs.closing_wait)
388                 end_time = jiffies + PortP->gs.closing_wait;
389         else
390                 end_time = jiffies + MAX_SCHEDULE_TIMEOUT;
391
392         rio_spin_lock_irqsave(&PortP->portSem, flags);
393
394         /*
395          ** Setting this flag will make any process trying to open
396          ** this port block until we are complete closing it.
397          */
398         PortP->State |= RIO_CLOSING;
399
400         if ((PortP->State & RIO_DELETED)) {
401                 rio_dprintk(RIO_DEBUG_TTY, "Close on deleted RTA\n");
402                 deleted = 1;
403         }
404
405         if (p->RIOHalted) {
406                 RIOClearUp(PortP);
407                 rv = -EIO;
408                 goto close_end;
409         }
410
411         rio_dprintk(RIO_DEBUG_TTY, "Clear bits\n");
412         /*
413          ** clear the open bits for this device
414          */
415         PortP->State &= ~RIO_MOPEN;
416         PortP->State &= ~RIO_CARR_ON;
417         PortP->ModemState &= ~RIOC_MSVR1_CD;
418         /*
419          ** If the device was open as both a Modem and a tty line
420          ** then we need to wimp out here, as the port has not really
421          ** been finally closed (gee, whizz!) The test here uses the
422          ** bit for the OTHER mode of operation, to see if THAT is
423          ** still active!
424          */
425         if ((PortP->State & (RIO_LOPEN | RIO_MOPEN))) {
426                 /*
427                  ** The port is still open for the other task -
428                  ** return, pretending that we are still active.
429                  */
430                 rio_dprintk(RIO_DEBUG_TTY, "Channel %d still open !\n", PortP->PortNum);
431                 PortP->State &= ~RIO_CLOSING;
432                 if (PortP->firstOpen)
433                         PortP->firstOpen--;
434                 rio_spin_unlock_irqrestore(&PortP->portSem, flags);
435                 return -EIO;
436         }
437
438         rio_dprintk(RIO_DEBUG_TTY, "Closing down - everything must go!\n");
439
440         PortP->State &= ~RIO_DYNOROD;
441
442         /*
443          ** This is where we wait for the port
444          ** to drain down before closing. Bye-bye....
445          ** (We never meant to do this)
446          */
447         rio_dprintk(RIO_DEBUG_TTY, "Timeout 1 starts\n");
448
449         if (!deleted)
450                 while ((PortP->InUse != NOT_INUSE) && !p->RIOHalted && (PortP->TxBufferIn != PortP->TxBufferOut)) {
451                         if (repeat_this-- <= 0) {
452                                 rv = -EINTR;
453                                 rio_dprintk(RIO_DEBUG_TTY, "Waiting for not idle closed broken by signal\n");
454                                 RIOPreemptiveCmd(p, PortP, RIOC_FCLOSE);
455                                 goto close_end;
456                         }
457                         rio_dprintk(RIO_DEBUG_TTY, "Calling timeout to flush in closing\n");
458                         rio_spin_unlock_irqrestore(&PortP->portSem, flags);
459                         if (RIODelay_ni(PortP, HUNDRED_MS * 10) == RIO_FAIL) {
460                                 rio_dprintk(RIO_DEBUG_TTY, "RTA EINTR in delay \n");
461                                 rv = -EINTR;
462                                 rio_spin_lock_irqsave(&PortP->portSem, flags);
463                                 goto close_end;
464                         }
465                         rio_spin_lock_irqsave(&PortP->portSem, flags);
466                 }
467
468         PortP->TxBufferIn = PortP->TxBufferOut = 0;
469         repeat_this = 0xff;
470
471         PortP->InUse = 0;
472         if ((PortP->State & (RIO_LOPEN | RIO_MOPEN))) {
473                 /*
474                  ** The port has been re-opened for the other task -
475                  ** return, pretending that we are still active.
476                  */
477                 rio_dprintk(RIO_DEBUG_TTY, "Channel %d re-open!\n", PortP->PortNum);
478                 PortP->State &= ~RIO_CLOSING;
479                 rio_spin_unlock_irqrestore(&PortP->portSem, flags);
480                 if (PortP->firstOpen)
481                         PortP->firstOpen--;
482                 return -EIO;
483         }
484
485         if (p->RIOHalted) {
486                 RIOClearUp(PortP);
487                 goto close_end;
488         }
489
490         /* Can't call RIOShortCommand with the port locked. */
491         rio_spin_unlock_irqrestore(&PortP->portSem, flags);
492
493         if (RIOShortCommand(p, PortP, RIOC_CLOSE, 1, 0) == RIO_FAIL) {
494                 RIOPreemptiveCmd(p, PortP, RIOC_FCLOSE);
495                 rio_spin_lock_irqsave(&PortP->portSem, flags);
496                 goto close_end;
497         }
498
499         if (!deleted)
500                 while (try && (PortP->PortState & PORT_ISOPEN)) {
501                         try--;
502                         if (time_after(jiffies, end_time)) {
503                                 rio_dprintk(RIO_DEBUG_TTY, "Run out of tries - force the bugger shut!\n");
504                                 RIOPreemptiveCmd(p, PortP, RIOC_FCLOSE);
505                                 break;
506                         }
507                         rio_dprintk(RIO_DEBUG_TTY, "Close: PortState:ISOPEN is %d\n", PortP->PortState & PORT_ISOPEN);
508
509                         if (p->RIOHalted) {
510                                 RIOClearUp(PortP);
511                                 rio_spin_lock_irqsave(&PortP->portSem, flags);
512                                 goto close_end;
513                         }
514                         if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) {
515                                 rio_dprintk(RIO_DEBUG_TTY, "RTA EINTR in delay \n");
516                                 RIOPreemptiveCmd(p, PortP, RIOC_FCLOSE);
517                                 break;
518                         }
519                 }
520         rio_spin_lock_irqsave(&PortP->portSem, flags);
521         rio_dprintk(RIO_DEBUG_TTY, "Close: try was %d on completion\n", try);
522
523         /* RIOPreemptiveCmd(p, PortP, RIOC_FCLOSE); */
524
525 /*
526 ** 15.10.1998 ARG - ESIL 0761 part fix
527 ** RIO has it's own CTSFLOW and RTSFLOW flags in 'Config' in the port structure,** we need to make sure that the flags are clear when the port is opened.
528 */
529         PortP->Config &= ~(RIO_CTSFLOW | RIO_RTSFLOW);
530
531         /*
532          ** Count opens for port statistics reporting
533          */
534         if (PortP->statsGather)
535                 PortP->closes++;
536
537 close_end:
538         /* XXX: Why would a "DELETED" flag be reset here? I'd have
539            thought that a "deleted" flag means that the port was
540            permanently gone, but here we can make it reappear by it
541            being in close during the "deletion".
542          */
543         PortP->State &= ~(RIO_CLOSING | RIO_DELETED);
544         if (PortP->firstOpen)
545                 PortP->firstOpen--;
546         rio_spin_unlock_irqrestore(&PortP->portSem, flags);
547         rio_dprintk(RIO_DEBUG_TTY, "Return from close\n");
548         return rv;
549 }
550
551
552
553 static void RIOClearUp(struct Port *PortP)
554 {
555         rio_dprintk(RIO_DEBUG_TTY, "RIOHalted set\n");
556         PortP->Config = 0;      /* Direct semaphore */
557         PortP->PortState = 0;
558         PortP->firstOpen = 0;
559         PortP->FlushCmdBodge = 0;
560         PortP->ModemState = PortP->CookMode = 0;
561         PortP->Mapped = 0;
562         PortP->WflushFlag = 0;
563         PortP->MagicFlags = 0;
564         PortP->RxDataStart = 0;
565         PortP->TxBufferIn = 0;
566         PortP->TxBufferOut = 0;
567 }
568
569 /*
570 ** Put a command onto a port.
571 ** The PortPointer, command, length and arg are passed.
572 ** The len is the length *inclusive* of the command byte,
573 ** and so for a command that takes no data, len==1.
574 ** The arg is a single byte, and is only used if len==2.
575 ** Other values of len aren't allowed, and will cause
576 ** a panic.
577 */
578 int RIOShortCommand(struct rio_info *p, struct Port *PortP, int command, int len, int arg)
579 {
580         struct PKT __iomem *PacketP;
581         int retries = 20;       /* at 10 per second -> 2 seconds */
582         unsigned long flags;
583
584         rio_dprintk(RIO_DEBUG_TTY, "entering shortcommand.\n");
585
586         if (PortP->State & RIO_DELETED) {
587                 rio_dprintk(RIO_DEBUG_TTY, "Short command to deleted RTA ignored\n");
588                 return RIO_FAIL;
589         }
590         rio_spin_lock_irqsave(&PortP->portSem, flags);
591
592         /*
593          ** If the port is in use for pre-emptive command, then wait for it to
594          ** be free again.
595          */
596         while ((PortP->InUse != NOT_INUSE) && !p->RIOHalted) {
597                 rio_dprintk(RIO_DEBUG_TTY, "Waiting for not in use (%d)\n", retries);
598                 rio_spin_unlock_irqrestore(&PortP->portSem, flags);
599                 if (retries-- <= 0) {
600                         return RIO_FAIL;
601                 }
602                 if (RIODelay_ni(PortP, HUNDRED_MS) == RIO_FAIL) {
603                         return RIO_FAIL;
604                 }
605                 rio_spin_lock_irqsave(&PortP->portSem, flags);
606         }
607         if (PortP->State & RIO_DELETED) {
608                 rio_dprintk(RIO_DEBUG_TTY, "Short command to deleted RTA ignored\n");
609                 rio_spin_unlock_irqrestore(&PortP->portSem, flags);
610                 return RIO_FAIL;
611         }
612
613         while (!can_add_transmit(&PacketP, PortP) && !p->RIOHalted) {
614                 rio_dprintk(RIO_DEBUG_TTY, "Waiting to add short command to queue (%d)\n", retries);
615                 rio_spin_unlock_irqrestore(&PortP->portSem, flags);
616                 if (retries-- <= 0) {
617                         rio_dprintk(RIO_DEBUG_TTY, "out of tries. Failing\n");
618                         return RIO_FAIL;
619                 }
620                 if (RIODelay_ni(PortP, HUNDRED_MS) == RIO_FAIL) {
621                         return RIO_FAIL;
622                 }
623                 rio_spin_lock_irqsave(&PortP->portSem, flags);
624         }
625
626         if (p->RIOHalted) {
627                 rio_spin_unlock_irqrestore(&PortP->portSem, flags);
628                 return RIO_FAIL;
629         }
630
631         /*
632          ** set the command byte and the argument byte
633          */
634         writeb(command, &PacketP->data[0]);
635
636         if (len == 2)
637                 writeb(arg, &PacketP->data[1]);
638
639         /*
640          ** set the length of the packet and set the command bit.
641          */
642         writeb(PKT_CMD_BIT | len, &PacketP->len);
643
644         add_transmit(PortP);
645         /*
646          ** Count characters transmitted for port statistics reporting
647          */
648         if (PortP->statsGather)
649                 PortP->txchars += len;
650
651         rio_spin_unlock_irqrestore(&PortP->portSem, flags);
652         return p->RIOHalted ? RIO_FAIL : ~RIO_FAIL;
653 }
654
655