riotty.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:37k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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. #ifdef SCCS_LABELS
  33. static char *_riotty_c_sccs_ = "@(#)riotty.c 1.3";
  34. #endif
  35. #define __EXPLICIT_DEF_H__
  36. #define __NO_VERSION__
  37. #include <linux/module.h>
  38. #include <linux/slab.h>
  39. #include <linux/errno.h>
  40. #include <linux/tty.h>
  41. #include <asm/io.h>
  42. #include <asm/system.h>
  43. #include <asm/string.h>
  44. #include <asm/semaphore.h>
  45. #include <asm/uaccess.h>
  46. #include <linux/termios.h>
  47. #include <linux/serial.h>
  48. #include <linux/compatmac.h>
  49. #include <linux/generic_serial.h>
  50. #include "linux_compat.h"
  51. #include "rio_linux.h"
  52. #include "typdef.h"
  53. #include "pkt.h"
  54. #include "daemon.h"
  55. #include "rio.h"
  56. #include "riospace.h"
  57. #include "top.h"
  58. #include "cmdpkt.h"
  59. #include "map.h"
  60. #include "riotypes.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. #include "parmmap.h"
  69. #include "unixrup.h"
  70. #include "board.h"
  71. #include "host.h"
  72. #include "error.h"
  73. #include "phb.h"
  74. #include "link.h"
  75. #include "cmdblk.h"
  76. #include "route.h"
  77. #include "control.h"
  78. #include "cirrus.h"
  79. #include "rioioctl.h"
  80. #include "param.h"
  81. #include "list.h"
  82. #include "sam.h"
  83. #if 0
  84. static void ttyseth_pv(struct Port *, struct ttystatics *, 
  85. struct termios *sg, int);
  86. #endif
  87. static void RIOClearUp(struct Port *PortP);
  88. int RIOShortCommand(struct rio_info *p, struct Port *PortP, 
  89.    int command, int len, int arg);
  90. extern int conv_vb[]; /* now defined in ttymgr.c */
  91. extern int conv_bv[]; /* now defined in ttymgr.c */
  92.  
  93. /*
  94. ** 16.09.1998 ARG - Fix to build riotty.k.o for Modular Kernel Support
  95. **
  96. ** ep.def.h is necessary for Modular Kernel Support
  97. ** DO NOT place any kernel 'extern's after this line
  98. ** or this source file will not build riotty.k.o
  99. */
  100. #ifdef uLYNX
  101. #include <ep.def.h>
  102. #endif
  103. #ifdef NEED_THIS2
  104. static struct old_sgttyb 
  105. default_sg = 
  106. B19200, B19200, /* input and output speed */ 
  107. 'H' - '@', /* erase char */ 
  108. -1, /* 2nd erase char */ 
  109. 'U' - '@', /* kill char */ 
  110. ECHO | CRMOD, /* mode */ 
  111. 'C' - '@', /* interrupt character */ 
  112. '\' - '@', /* quit char */ 
  113. 'Q' - '@', /* start char */
  114. 'S' - '@', /* stop char */ 
  115. 'D' - '@', /* EOF */
  116. -1, /* brk */
  117. (LCRTBS | LCRTERA | LCRTKIL | LCTLECH), /* local mode word */ 
  118. 'Z' - '@', /* process stop */
  119. 'Y' - '@', /* delayed stop */
  120. 'R' - '@', /* reprint line */ 
  121. 'O' - '@', /* flush output */
  122. 'W' - '@', /* word erase */
  123. 'V' - '@' /* literal next char */
  124. };
  125. #endif
  126. extern struct rio_info *p;
  127. extern void rio_inc_mod_count (void);
  128. int
  129. riotopen(struct tty_struct * tty, struct file * filp)
  130. {
  131. register uint SysPort;
  132. int Modem;
  133. int repeat_this = 250;
  134. struct Port *PortP;  /* pointer to the port structure */
  135. unsigned long flags;
  136. int retval = 0;
  137. func_enter ();
  138. /* Make sure driver_data is NULL in case the rio isn't booted jet. Else gs_close
  139.    is going to oops.
  140. */
  141. tty->driver_data = NULL;
  142.         
  143. SysPort = rio_minor (tty->device);
  144. Modem   = rio_ismodem (tty->device);
  145. if ( p->RIOFailed ) {
  146. rio_dprintk (RIO_DEBUG_TTY, "System initialisation failedn");
  147. pseterr(ENXIO);
  148. func_exit ();
  149. return -ENXIO;
  150. }
  151. rio_dprintk (RIO_DEBUG_TTY, "port open SysPort %d (%s) (mapped:%d)n",
  152.        SysPort,  Modem ? "Modem" : "tty",
  153.    p->RIOPortp[SysPort]->Mapped);
  154. /*
  155. ** Validate that we have received a legitimate request.
  156. ** Currently, just check that we are opening a port on
  157. ** a host card that actually exists, and that the port
  158. ** has been mapped onto a host.
  159. */
  160. if (SysPort >= RIO_PORTS) { /* out of range ? */
  161. rio_dprintk (RIO_DEBUG_TTY, "Illegal port number %dn",SysPort);
  162. pseterr(ENXIO);
  163. func_exit();
  164. return -ENXIO;
  165. }
  166. /*
  167. ** Grab pointer to the port stucture
  168. */
  169. PortP = p->RIOPortp[SysPort]; /* Get control struc */
  170. rio_dprintk (RIO_DEBUG_TTY, "PortP: %pn", PortP);
  171. if ( !PortP->Mapped ) { /* we aren't mapped yet! */
  172. /*
  173. ** The system doesn't know which RTA this port
  174. ** corresponds to.
  175. */
  176. rio_dprintk (RIO_DEBUG_TTY, "port not mapped into systemn");
  177. func_exit ();
  178. pseterr(ENXIO);
  179. return -ENXIO;
  180. }
  181. tty->driver_data = PortP;
  182. PortP->gs.tty = tty;
  183. if (!PortP->gs.count)
  184. rio_inc_mod_count ();
  185. PortP->gs.count++;
  186. rio_dprintk (RIO_DEBUG_TTY, "%d bytes in tx buffern",
  187.    PortP->gs.xmit_cnt);
  188. retval = gs_init_port (&PortP->gs);
  189. if (retval) {
  190. PortP->gs.count--;
  191. if (PortP->gs.count)
  192. rio_dec_mod_count ();
  193. return -ENXIO;
  194. }
  195. /*
  196. ** If the host hasn't been booted yet, then 
  197. ** fail
  198. */
  199. if ( (PortP->HostP->Flags & RUN_STATE) != RC_RUNNING ) {
  200. rio_dprintk (RIO_DEBUG_TTY, "Host not runningn");
  201. pseterr(ENXIO);
  202. func_exit ();
  203. return -ENXIO;
  204. }
  205. /*
  206. ** If the RTA has not booted yet and the user has choosen to block
  207. ** until the RTA is present then we must spin here waiting for
  208. ** the RTA to boot.
  209. */
  210. #if 0
  211. if (!(PortP->HostP->Mapping[PortP->RupNum].Flags & RTA_BOOTED)) {
  212. if (PortP->WaitUntilBooted) {
  213. rio_dprintk (RIO_DEBUG_TTY, "Waiting for RTA to bootn");
  214. do {
  215. if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) {
  216. rio_dprintk (RIO_DEBUG_TTY, "RTA EINTR in delay n");
  217. func_exit ();
  218. return -EINTR;
  219. }
  220. if (repeat_this -- <= 0) {
  221. rio_dprintk (RIO_DEBUG_TTY, "Waiting for RTA to boot timeoutn");
  222. RIOPreemptiveCmd(p, PortP, FCLOSE ); 
  223. pseterr(EINTR);
  224. func_exit ();
  225. return -EIO;
  226. }
  227. } while(!(PortP->HostP->Mapping[PortP->RupNum].Flags & RTA_BOOTED));
  228. rio_dprintk (RIO_DEBUG_TTY, "RTA has been bootedn");
  229. } else {
  230. rio_dprintk (RIO_DEBUG_TTY, "RTA never bootedn");
  231. pseterr(ENXIO);
  232. func_exit ();
  233. return 0;
  234. }
  235. }
  236. #else
  237. /* I find the above code a bit hairy. I find the below code
  238.            easier to read and shorter. Now, if it works too that would
  239.    be great... -- REW 
  240. */
  241. rio_dprintk (RIO_DEBUG_TTY, "Checking if RTA has booted... n");
  242. while (!(PortP->HostP->Mapping[PortP->RupNum].Flags & RTA_BOOTED)) {
  243.   if (!PortP->WaitUntilBooted) {
  244.     rio_dprintk (RIO_DEBUG_TTY, "RTA never bootedn");
  245.     func_exit ();
  246.     return -ENXIO;
  247.   }
  248.   /* Under Linux you'd normally use a wait instead of this
  249.      busy-waiting. I'll stick with the old implementation for
  250.      now. --REW 
  251.   */
  252.   if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) {
  253.     rio_dprintk (RIO_DEBUG_TTY, "RTA_wait_for_boot: EINTR in delay n");
  254.     func_exit ();
  255.     return -EINTR;
  256.   }
  257.   if (repeat_this -- <= 0) {
  258.     rio_dprintk (RIO_DEBUG_TTY, "Waiting for RTA to boot timeoutn");
  259.     func_exit ();
  260.     return -EIO;
  261.   }
  262. }
  263. rio_dprintk (RIO_DEBUG_TTY, "RTA has been bootedn");
  264. #endif
  265. #if 0
  266. tp =  PortP->TtyP; /* get tty struct */
  267. #endif
  268. rio_spin_lock_irqsave(&PortP->portSem, flags);
  269. if ( p->RIOHalted ) {
  270. goto bombout;
  271. }
  272. #if 0
  273. retval = gs_init_port(&PortP->gs);
  274. if (retval){
  275. func_exit ();
  276. return retval;
  277. }
  278. #endif
  279. /*
  280. ** If the port is in the final throws of being closed,
  281. ** we should wait here (politely), waiting
  282. ** for it to finish, so that it doesn't close us!
  283. */
  284. while ( (PortP->State & RIO_CLOSING) && !p->RIOHalted ) {
  285. rio_dprintk (RIO_DEBUG_TTY, "Waiting for RIO_CLOSING to go awayn");
  286. if (repeat_this -- <= 0) {
  287. rio_dprintk (RIO_DEBUG_TTY, "Waiting for not idle closed broken by signaln");
  288. RIOPreemptiveCmd(p, PortP, FCLOSE ); 
  289. retval = -EINTR;
  290. goto bombout;
  291. }
  292. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  293. if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) {
  294. rio_spin_lock_irqsave(&PortP->portSem, flags); 
  295. retval = -EINTR;
  296. goto bombout;
  297. }
  298. rio_spin_lock_irqsave(&PortP->portSem, flags); 
  299. }
  300. if ( !PortP->Mapped ) {
  301. rio_dprintk (RIO_DEBUG_TTY, "Port unmapped while closing!n");
  302. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  303. retval = -ENXIO;
  304. func_exit ();
  305. return retval;
  306. }
  307. if ( p->RIOHalted ) {
  308. goto bombout;
  309. }
  310. /*
  311. ** 15.10.1998 ARG - ESIL 0761 part fix
  312. ** RIO has it's own CTSFLOW and RTSFLOW flags in 'Config' in the port structure,
  313. ** we need to make sure that the flags are clear when the port is opened.
  314. */
  315. /* Uh? Suppose I turn these on and then another process opens
  316.    the port again? The flags get cleared! Not good. -- REW */
  317. if ( !(PortP->State & (RIO_LOPEN | RIO_MOPEN)) ) {
  318. PortP->Config &= ~(RIO_CTSFLOW|RIO_RTSFLOW);
  319. }
  320. if (!(PortP->firstOpen)) { /* First time ? */
  321. rio_dprintk (RIO_DEBUG_TTY, "First open for this portn");
  322. PortP->firstOpen++;
  323. PortP->CookMode = 0; /* XXX RIOCookMode(tp); */
  324. PortP->InUse = NOT_INUSE;
  325. /* Tentative fix for bug PR27. Didn't work. */
  326. /* PortP->gs.xmit_cnt = 0; */
  327. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  328. #ifdef NEED_THIS
  329. ttyseth(PortP, tp, (struct old_sgttyb *)&default_sg);
  330. #endif
  331. /* Someone explain to me why this delay/config is
  332.                    here. If I read the docs correctly the "open"
  333.                    command piggybacks the parameters immediately. 
  334.    -- REW */
  335. RIOParam(PortP,OPEN,Modem,OK_TO_SLEEP); /* Open the port */
  336. #if 0
  337. /* This delay of 1 second was annoying. I removed it. -- REW */
  338. RIODelay(PortP, HUNDRED_MS*10);
  339. RIOParam(PortP,CONFIG,Modem,OK_TO_SLEEP); /* Config the port */
  340. #endif
  341. rio_spin_lock_irqsave(&PortP->portSem, flags);
  342. /*
  343. ** wait for the port to be not closed.
  344. */
  345. while ( !(PortP->PortState & PORT_ISOPEN) && !p->RIOHalted ) {
  346. rio_dprintk (RIO_DEBUG_TTY, "Waiting for PORT_ISOPEN-currently %xn",PortP->PortState);
  347. /*
  348. ** 15.10.1998 ARG - ESIL 0759
  349. ** (Part) fix for port being trashed when opened whilst RTA "disconnected"
  350. ** Take out the limited wait - now wait for ever or until user
  351. ** bangs us out.
  352. **
  353. if (repeat_this -- <= 0) {
  354. rio_dprint(RIO_DEBUG_TTY, ("Waiting for open to finish timed out.n"));
  355. RIOPreemptiveCmd(p, PortP, FCLOSE ); 
  356. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  357. return -EINTR;
  358. }
  359. **
  360. */
  361. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  362. if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) {
  363. rio_dprintk (RIO_DEBUG_TTY, "Waiting for open to finish broken by signaln");
  364. RIOPreemptiveCmd(p, PortP, FCLOSE );
  365. func_exit ();
  366. return -EINTR;
  367. }
  368. rio_spin_lock_irqsave(&PortP->portSem, flags);
  369. }
  370. if ( p->RIOHalted ) {
  371.   retval = -EIO;
  372. bombout:
  373.   /*  RIOClearUp( PortP ); */
  374. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  375. return retval;
  376. }
  377. rio_dprintk (RIO_DEBUG_TTY, "PORT_ISOPEN foundn");
  378. }
  379. #ifdef MODEM_SUPPORT 
  380. if (Modem) {
  381. rio_dprintk (RIO_DEBUG_TTY, "Modem - test for carriern");
  382. /*
  383. ** ACTION
  384. ** insert test for carrier here. -- ???
  385. ** I already see that test here. What's the deal? -- REW
  386. */
  387. if ((PortP->gs.tty->termios->c_cflag & CLOCAL) || (PortP->ModemState & MSVR1_CD))
  388. {
  389. rio_dprintk (RIO_DEBUG_TTY, "open(%d) Modem carr onn", SysPort);
  390. /*
  391. tp->tm.c_state |= CARR_ON;
  392. wakeup((caddr_t) &tp->tm.c_canq);
  393. */
  394. PortP->State |= RIO_CARR_ON;
  395. wake_up_interruptible (&PortP->gs.open_wait);
  396. }
  397. else /* no carrier - wait for DCD */
  398. {
  399.   /*
  400. while (!(PortP->gs.tty->termios->c_state & CARR_ON) && 
  401.        !(filp->f_flags & O_NONBLOCK) && !p->RIOHalted )
  402.   */
  403. while (!(PortP->State & RIO_CARR_ON) && 
  404.        !(filp->f_flags & O_NONBLOCK) && !p->RIOHalted ) {
  405. rio_dprintk (RIO_DEBUG_TTY, "open(%d) sleeping for carr onn",SysPort);
  406. /*
  407. PortP->gs.tty->termios->c_state |= WOPEN;
  408. */
  409. PortP->State |= RIO_WOPEN;
  410. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  411. if (RIODelay (PortP, HUNDRED_MS) == RIO_FAIL)
  412. #if 0
  413. if ( sleep((caddr_t)&tp->tm.c_canqo, TTIPRI|PCATCH))
  414. #endif
  415. {
  416. /*
  417. ** ACTION: verify that this is a good thing
  418. ** to do here. -- ???
  419. ** I think it's OK. -- REW
  420. */
  421. rio_dprintk (RIO_DEBUG_TTY, "open(%d) sleeping for carr broken by signaln",
  422.        SysPort);
  423. RIOPreemptiveCmd( p, PortP, FCLOSE );
  424. /*
  425. tp->tm.c_state &= ~WOPEN;
  426. */
  427. PortP->State &= ~RIO_WOPEN;
  428. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  429. func_exit ();
  430. return -EINTR;
  431. }
  432. }
  433. PortP->State &= ~RIO_WOPEN;
  434. }
  435. if ( p->RIOHalted )
  436. goto bombout;
  437. rio_dprintk (RIO_DEBUG_TTY, "Setting RIO_MOPENn");
  438. PortP->State |= RIO_MOPEN;
  439. }
  440. else
  441. #endif
  442. {
  443. /*
  444. ** ACTION
  445. ** Direct line open - force carrier (will probably mean
  446. ** that sleeping Modem line fubar)
  447. */
  448. PortP->State |= RIO_LOPEN;
  449. }
  450. if ( p->RIOHalted ) {
  451. goto bombout;
  452. }
  453. rio_dprintk (RIO_DEBUG_TTY, "high level open donen");
  454. #ifdef STATS
  455. PortP->Stat.OpenCnt++;
  456. #endif
  457. /*
  458. ** Count opens for port statistics reporting
  459. */
  460. if (PortP->statsGather)
  461. PortP->opens++;
  462. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  463. rio_dprintk (RIO_DEBUG_TTY, "Returning from openn");
  464. func_exit ();
  465. return 0;
  466. }
  467. /*
  468. ** RIOClose the port.
  469. ** The operating system thinks that this is last close for the device.
  470. ** As there are two interfaces to the port (Modem and tty), we need to
  471. ** check that both are closed before we close the device.
  472. */ 
  473. int
  474. riotclose(void  *ptr)
  475. {
  476. #if 0
  477. register uint SysPort = dev;
  478. struct ttystatics *tp; /* pointer to our ttystruct */
  479. #endif
  480. struct Port *PortP =ptr; /* pointer to the port structure */
  481. int deleted = 0;
  482. int try = -1; /* Disable the timeouts by setting them to -1 */
  483. int repeat_this = -1; /* Congrats to those having 15 years of 
  484.      uptime! (You get to break the driver.) */
  485. long end_time;
  486. struct tty_struct * tty;
  487. unsigned long flags;
  488. int Modem;
  489. int rv =0;
  490. rio_dprintk (RIO_DEBUG_TTY, "port close SysPort %dn",PortP->PortNum);
  491. /* PortP = p->RIOPortp[SysPort]; */
  492. rio_dprintk (RIO_DEBUG_TTY, "Port is at address 0x%xn",(int)PortP);
  493. /* tp = PortP->TtyP;*/ /* Get tty */
  494. tty = PortP->gs.tty;
  495. rio_dprintk (RIO_DEBUG_TTY, "TTY is at address 0x%xn",(int)tty);
  496. if (PortP->gs.closing_wait) 
  497. end_time = jiffies + PortP->gs.closing_wait;
  498. else 
  499. end_time = jiffies + MAX_SCHEDULE_TIMEOUT;
  500. Modem = rio_ismodem(tty->device);
  501. #if 0
  502. /* What F.CKING cache? Even then, a higly idle multiprocessor,
  503.    system with large caches this won't work . Better find out when 
  504.    this doesn't work asap, and fix the cause.  -- REW */
  505. RIODelay(PortP, HUNDRED_MS*10); /* To flush the cache */
  506. #endif
  507. rio_spin_lock_irqsave(&PortP->portSem, flags);
  508. /*
  509. ** Setting this flag will make any process trying to open
  510. ** this port block until we are complete closing it.
  511. */
  512. PortP->State |= RIO_CLOSING;
  513. if ( (PortP->State & RIO_DELETED) ) {
  514. rio_dprintk (RIO_DEBUG_TTY, "Close on deleted RTAn");
  515. deleted = 1;
  516. }
  517. if ( p->RIOHalted ) {
  518. RIOClearUp( PortP );
  519. rv = -EIO;
  520. goto close_end;
  521. }
  522. rio_dprintk (RIO_DEBUG_TTY, "Clear bitsn");
  523. /*
  524. ** clear the open bits for this device
  525. */
  526. PortP->State &= (Modem ? ~RIO_MOPEN : ~RIO_LOPEN);
  527. PortP->State &= ~RIO_CARR_ON;
  528. PortP->ModemState &= ~MSVR1_CD;
  529. /*
  530. ** If the device was open as both a Modem and a tty line
  531. ** then we need to wimp out here, as the port has not really
  532. ** been finally closed (gee, whizz!) The test here uses the
  533. ** bit for the OTHER mode of operation, to see if THAT is
  534. ** still active!
  535. */
  536. if ( (PortP->State & (RIO_LOPEN|RIO_MOPEN)) ) {
  537. /*
  538. ** The port is still open for the other task -
  539. ** return, pretending that we are still active.
  540. */
  541. rio_dprintk (RIO_DEBUG_TTY, "Channel %d still open !n",PortP->PortNum);
  542. PortP->State &= ~RIO_CLOSING;
  543. if (PortP->firstOpen)
  544. PortP->firstOpen--;
  545. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  546. return -EIO;
  547. }
  548. rio_dprintk (RIO_DEBUG_TTY, "Closing down - everything must go!n");
  549. PortP->State &= ~RIO_DYNOROD;
  550. /*
  551. ** This is where we wait for the port
  552. ** to drain down before closing. Bye-bye....
  553. ** (We never meant to do this)
  554. */
  555. rio_dprintk (RIO_DEBUG_TTY, "Timeout 1 startsn");
  556. if (!deleted)
  557. while ( (PortP->InUse != NOT_INUSE) && !p->RIOHalted && 
  558. (PortP->TxBufferIn != PortP->TxBufferOut) ) {
  559. cprintf("Need to flush the ttyportn");
  560. if (repeat_this -- <= 0) {
  561. rv = -EINTR;
  562. rio_dprintk (RIO_DEBUG_TTY, "Waiting for not idle closed broken by signaln");
  563. RIOPreemptiveCmd(p, PortP, FCLOSE ); 
  564. goto close_end;
  565. }
  566. rio_dprintk (RIO_DEBUG_TTY, "Calling timeout to flush in closingn");
  567. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  568. if (RIODelay_ni(PortP, HUNDRED_MS*10) == RIO_FAIL) {
  569. rio_dprintk (RIO_DEBUG_TTY, "RTA EINTR in delay n");
  570. rv = -EINTR;
  571. rio_spin_lock_irqsave(&PortP->portSem, flags);
  572. goto close_end;
  573. }
  574. rio_spin_lock_irqsave(&PortP->portSem, flags);
  575. }
  576. PortP->TxBufferIn = PortP->TxBufferOut = 0;
  577. repeat_this = 0xff;
  578. PortP->InUse = 0;
  579. if ( (PortP->State & (RIO_LOPEN|RIO_MOPEN)) ) {
  580. /*
  581. ** The port has been re-opened for the other task -
  582. ** return, pretending that we are still active.
  583. */
  584. rio_dprintk (RIO_DEBUG_TTY, "Channel %d re-open!n", PortP->PortNum);
  585. PortP->State &= ~RIO_CLOSING;
  586. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  587. if (PortP->firstOpen)
  588. PortP->firstOpen--;
  589. return -EIO;
  590. }
  591. if ( p->RIOHalted ) {
  592. RIOClearUp( PortP );
  593. goto close_end;
  594. }
  595. /* Can't call RIOShortCommand with the port locked. */
  596. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  597. if (RIOShortCommand(p, PortP, CLOSE, 1, 0) == RIO_FAIL) {
  598.   RIOPreemptiveCmd(p, PortP,FCLOSE);
  599.   goto close_end;
  600. }
  601. if (!deleted)
  602.   while (try && (PortP->PortState & PORT_ISOPEN)) {
  603.         try--;
  604. if (time_after (jiffies, end_time)) {
  605.   rio_dprintk (RIO_DEBUG_TTY, "Run out of tries - force the bugger shut!n" );
  606.   RIOPreemptiveCmd(p, PortP,FCLOSE);
  607.   break;
  608. }
  609. rio_dprintk (RIO_DEBUG_TTY, "Close: PortState:ISOPEN is %dn", 
  610.    PortP->PortState & PORT_ISOPEN);
  611. if ( p->RIOHalted ) {
  612. RIOClearUp( PortP );
  613. goto close_end;
  614. }
  615. if (RIODelay(PortP, HUNDRED_MS) == RIO_FAIL) {
  616. rio_dprintk (RIO_DEBUG_TTY, "RTA EINTR in delay n");
  617. RIOPreemptiveCmd(p, PortP,FCLOSE);
  618. break;
  619. }
  620. }
  621. rio_spin_lock_irqsave(&PortP->portSem, flags);
  622. rio_dprintk (RIO_DEBUG_TTY, "Close: try was %d on completionn", try );
  623.  
  624. /* RIOPreemptiveCmd(p, PortP, FCLOSE); */
  625. /*
  626. ** 15.10.1998 ARG - ESIL 0761 part fix
  627. ** 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.
  628. */
  629. PortP->Config &= ~(RIO_CTSFLOW|RIO_RTSFLOW);
  630. #ifdef STATS
  631. PortP->Stat.CloseCnt++;
  632. #endif
  633. /*
  634. ** Count opens for port statistics reporting
  635. */
  636. if (PortP->statsGather)
  637. PortP->closes++;
  638. close_end:
  639. /* XXX: Why would a "DELETED" flag be reset here? I'd have
  640.    thought that a "deleted" flag means that the port was
  641.    permanently gone, but here we can make it reappear by it
  642.    being in close during the "deletion".
  643. */
  644. PortP->State &= ~(RIO_CLOSING|RIO_DELETED);
  645. if (PortP->firstOpen)
  646. PortP->firstOpen--;
  647. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  648. rio_dprintk (RIO_DEBUG_TTY, "Return from closen");
  649. return rv;
  650. }
  651. /*
  652. ** decide if we need to use the line discipline.
  653. ** This routine can return one of three values:
  654. ** COOK_RAW if no processing has to be done by the line discipline or the card
  655. ** COOK_WELL if the line discipline must be used to do the processing
  656. ** COOK_MEDIUM if the card can do all the processing necessary.
  657. */
  658. int
  659. RIOCookMode(struct ttystatics *tp)
  660. {
  661. /*
  662. ** We cant handle tm.c_mstate != 0 on SCO
  663. ** We cant handle mapping
  664. ** We cant handle non-ttwrite line disc.
  665. ** We cant handle lflag XCASE
  666. ** We can handle oflag OPOST & (OCRNL, ONLCR, TAB3)
  667. */
  668. #ifdef CHECK
  669. CheckTtyP( tp );
  670. #endif
  671. if (!(tp->tm.c_oflag & OPOST)) /* No post processing */
  672. return COOK_RAW; /* Raw mode o/p */
  673. if ( tp->tm.c_lflag & XCASE )
  674. return COOK_WELL; /* Use line disc */
  675. if (tp->tm.c_oflag & ~(OPOST | ONLCR | OCRNL | TAB3 ) )
  676. return COOK_WELL; /* Use line disc for strange modes */
  677. if ( tp->tm.c_oflag == OPOST ) /* If only OPOST is set, do RAW */
  678. return COOK_RAW;
  679. /*
  680. ** So, we need to output process!
  681. */
  682. return COOK_MEDIUM;
  683. }
  684. static void
  685. RIOClearUp(PortP)
  686. struct Port *PortP;
  687. {
  688. rio_dprintk (RIO_DEBUG_TTY, "RIOHalted setn");
  689. PortP->Config = 0;   /* Direct semaphore */
  690. PortP->PortState = 0;
  691. PortP->firstOpen = 0;
  692. PortP->FlushCmdBodge = 0;
  693. PortP->ModemState = PortP->CookMode = 0;
  694. PortP->Mapped = 0;
  695. PortP->WflushFlag = 0;
  696. PortP->MagicFlags = 0;
  697. PortP->RxDataStart = 0;
  698. PortP->TxBufferIn = 0;
  699. PortP->TxBufferOut = 0;
  700. }
  701. /*
  702. ** Put a command onto a port.
  703. ** The PortPointer, command, length and arg are passed.
  704. ** The len is the length *inclusive* of the command byte,
  705. ** and so for a command that takes no data, len==1.
  706. ** The arg is a single byte, and is only used if len==2.
  707. ** Other values of len aren't allowed, and will cause
  708. ** a panic.
  709. */
  710. int RIOShortCommand(struct rio_info *p, struct Port *PortP,
  711. int command, int len, int arg)
  712. {
  713. PKT *PacketP;
  714. int retries = 20; /* at 10 per second -> 2 seconds */
  715. unsigned long flags;
  716. rio_dprintk (RIO_DEBUG_TTY, "entering shortcommand.n");
  717. #ifdef CHECK
  718. CheckPortP( PortP );
  719. if ( len < 1 || len > 2 )
  720. cprintf(("STUPID LENGTH %dn",len));
  721. #endif
  722. if ( PortP->State & RIO_DELETED ) {
  723. rio_dprintk (RIO_DEBUG_TTY, "Short command to deleted RTA ignoredn");
  724. return RIO_FAIL;
  725. }
  726. rio_spin_lock_irqsave(&PortP->portSem, flags);
  727. /*
  728. ** If the port is in use for pre-emptive command, then wait for it to 
  729. ** be free again.
  730. */
  731. while ( (PortP->InUse != NOT_INUSE) && !p->RIOHalted ) {
  732. rio_dprintk (RIO_DEBUG_TTY, "Waiting for not in use (%d)n", 
  733.    retries);
  734. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  735. if (retries-- <= 0) {
  736. return RIO_FAIL;
  737. }
  738. if (RIODelay_ni(PortP, HUNDRED_MS) == RIO_FAIL) {
  739. return RIO_FAIL;
  740. }
  741. rio_spin_lock_irqsave(&PortP->portSem, flags);
  742. }
  743. if ( PortP->State & RIO_DELETED ) {
  744. rio_dprintk (RIO_DEBUG_TTY, "Short command to deleted RTA ignoredn");
  745. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  746. return RIO_FAIL;
  747. }
  748. while ( !can_add_transmit(&PacketP,PortP) && !p->RIOHalted ) {
  749. rio_dprintk (RIO_DEBUG_TTY, "Waiting to add short command to queue (%d)n", retries);
  750. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  751. if (retries-- <= 0) {
  752.   rio_dprintk (RIO_DEBUG_TTY, "out of tries. Failingn");
  753. return RIO_FAIL;
  754. }
  755. if ( RIODelay_ni(PortP, HUNDRED_MS)==RIO_FAIL ) {
  756. return RIO_FAIL;
  757. }
  758. rio_spin_lock_irqsave(&PortP->portSem, flags);
  759. }
  760. if ( p->RIOHalted ) {
  761. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  762. return RIO_FAIL;
  763. }
  764. /*
  765. ** set the command byte and the argument byte
  766. */
  767. WBYTE(PacketP->data[0] , command);
  768. if ( len==2 )
  769. WBYTE(PacketP->data[1] , arg);
  770. /*
  771. ** set the length of the packet and set the command bit.
  772. */
  773. WBYTE(PacketP->len , PKT_CMD_BIT | len);
  774. add_transmit(PortP);
  775. /*
  776. ** Count characters transmitted for port statistics reporting
  777. */
  778. if (PortP->statsGather)
  779. PortP->txchars += len;
  780. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  781. return p->RIOHalted ? RIO_FAIL : ~RIO_FAIL;
  782. }
  783. #if 0
  784. /*
  785. ** This is an ioctl interface. This is the twentieth century. You know what
  786. ** its all about.
  787. */
  788. int
  789. riotioctl(p, dev, cmd, arg)
  790. struct rio_info * p;
  791. dev_t dev;
  792. register int cmd;
  793. register caddr_t arg;
  794. {
  795. register struct Port *PortP;
  796. register struct ttystatics *tp;
  797. int current;
  798. int ParamSemIncremented = 0;
  799. int old_oflag, old_cflag, old_iflag, changed, oldcook;
  800. int i;
  801. unsigned char sio_regs[5]; /* Here be magic */
  802. short vpix_cflag;
  803. short divisor;
  804. int baud;
  805. uint SysPort = dev;
  806. int Modem = rio_ismodem(dev);
  807. int ioctl_processed;
  808. rio_dprintk (RIO_DEBUG_TTY, "port ioctl SysPort %d command 0x%x argument 0x%x %sn",
  809. SysPort, cmd, arg, Modem?"Modem":"tty") ;
  810. if ( SysPort >= RIO_PORTS ) {
  811. rio_dprintk (RIO_DEBUG_TTY, "Bad port number %dn", SysPort);
  812. return -ENXIO;
  813. }
  814. PortP = p->RIOPortp[SysPort];
  815. tp = PortP->TtyP;
  816. rio_spin_lock_irqsave(&PortP->portSem, flags);
  817. #ifdef STATS
  818. PortP->Stat.IoctlCnt++;
  819. #endif
  820. if ( PortP->State & RIO_DELETED ) {
  821. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  822. return -EIO;
  823. }
  824. if ( p->RIOHalted ) {
  825. RIOClearUp( PortP );
  826. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  827. return -EIO;
  828. }
  829. /*
  830. ** Count ioctls for port statistics reporting
  831. */
  832. if (PortP->statsGather)
  833. PortP->ioctls++;
  834. /*
  835. ** Specialix RIO Ioctl calls
  836. */
  837. switch (cmd) {
  838. case TCRIOTRIAD:
  839. if ( arg )
  840. PortP->State |= RIO_TRIAD_MODE;
  841. else
  842. PortP->State &= ~RIO_TRIAD_MODE;
  843. /*
  844. ** Normally, when istrip is set on a port, a config is
  845. ** sent to the RTA instructing the CD1400 to do the
  846. ** stripping. In TRIAD mode, the interrupt receive routine
  847. ** must do the stripping instead, since it has to detect
  848. ** an 8 bit function key sequence. If istrip is set with
  849. ** TRIAD mode on(off), and 8 bit data is being read by
  850. ** the port, the user then turns TRIAD mode off(on), the RTA
  851. ** must be reconfigured (not) to do the stripping.
  852. ** Hence we call RIOParam here.
  853. */
  854. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  855. RIOParam(PortP,CONFIG,Modem,OK_TO_SLEEP);
  856. return 0;
  857. case TCRIOTSTATE:
  858. rio_dprintk (RIO_DEBUG_TTY, "tbusy/tstop monitoring %sabledn",
  859.   arg ? "en" : "dis");
  860. /* MonitorTstate = 0 ;*/
  861. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  862. RIOParam(PortP, CONFIG, Modem, OK_TO_SLEEP);
  863. return 0;
  864. case TCRIOSTATE: /* current state of Modem input pins */
  865. rio_dprintk (RIO_DEBUG_TTY, "TCRIOSTATEn");
  866. if (RIOPreemptiveCmd(p, PortP, MGET) == RIO_FAIL)
  867. rio_dprintk (RIO_DEBUG_TTY, "TCRIOSTATE command failedn");
  868. PortP->State |= RIO_BUSY;
  869. current = PortP->ModemState;
  870. if ( copyout((caddr_t)&current, (int)arg,
  871. sizeof(current))==COPYFAIL ) {
  872. rio_dprintk (RIO_DEBUG_TTY, "Copyout failedn");
  873. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  874. pseterr(EFAULT);
  875. }
  876. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  877. return 0;
  878. case TCRIOMBIS: /* Set modem lines */
  879. case TCRIOMBIC: /* Clear modem lines */
  880. rio_dprintk (RIO_DEBUG_TTY, "TCRIOMBIS/TCRIOMBICn");
  881. if (cmd == TCRIOMBIS) {
  882. uint state;
  883. state = (uint)arg;
  884. PortP->ModemState |= (ushort)state;
  885. PortP->ModemLines = (ulong) arg;
  886. if (RIOPreemptiveCmd(p, PortP, MBIS) == RIO_FAIL)
  887. rio_dprintk (RIO_DEBUG_TTY, 
  888.  "TCRIOMBIS command failedn");
  889. }
  890. else {
  891. uint state;
  892. state = (uint)arg;
  893. PortP->ModemState &= ~(ushort)state;
  894. PortP->ModemLines = (ulong) arg;
  895. if (RIOPreemptiveCmd(p, PortP, MBIC) == RIO_FAIL)
  896. rio_dprintk (RIO_DEBUG_TTY, "TCRIOMBIC command failedn");
  897. }
  898. PortP->State |= RIO_BUSY;
  899. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  900. return 0;
  901. case TCRIOXPON: /* set Xprint ON string */
  902. rio_dprintk (RIO_DEBUG_TTY, "TCRIOXPONn");
  903. if ( copyin((int)arg, (caddr_t)PortP->Xprint.XpOn,
  904. MAX_XP_CTRL_LEN)==COPYFAIL ) {
  905. rio_dprintk (RIO_DEBUG_TTY, "Copyin failedn");
  906. PortP->Xprint.XpOn[0] = '';
  907. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  908. pseterr(EFAULT);
  909. }
  910. PortP->Xprint.XpOn[MAX_XP_CTRL_LEN-1] = '';
  911. PortP->Xprint.XpLen = RIOStrlen(PortP->Xprint.XpOn)+
  912. RIOStrlen(PortP->Xprint.XpOff);
  913. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  914. return 0;
  915. case TCRIOXPOFF: /* set Xprint OFF string */
  916. rio_dprintk (RIO_DEBUG_TTY, "TCRIOXPOFFn");
  917. if ( copyin( (int)arg, (caddr_t)PortP->Xprint.XpOff,
  918. MAX_XP_CTRL_LEN)==COPYFAIL ) {
  919. rio_dprintk (RIO_DEBUG_TTY, "Copyin failedn");
  920. PortP->Xprint.XpOff[0] = '';
  921. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  922. pseterr(EFAULT);
  923. }
  924. PortP->Xprint.XpOff[MAX_XP_CTRL_LEN-1] = '';
  925. PortP->Xprint.XpLen = RIOStrlen(PortP->Xprint.XpOn)+
  926. RIOStrlen(PortP->Xprint.XpOff);
  927. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  928. return 0;
  929. case TCRIOXPCPS: /* set Xprint CPS string */
  930. rio_dprintk (RIO_DEBUG_TTY, "TCRIOXPCPSn");
  931. if ( (uint)arg > p->RIOConf.MaxXpCps || 
  932. (uint)arg < p->RIOConf.MinXpCps ) {
  933. rio_dprintk (RIO_DEBUG_TTY, "%d CPS out of rangen",arg);
  934. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  935. pseterr(EINVAL);
  936. return 0;
  937. }
  938. PortP->Xprint.XpCps = (uint)arg;
  939. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  940. return 0;
  941. case TCRIOXPRINT:
  942. rio_dprintk (RIO_DEBUG_TTY, "TCRIOXPRINTn");
  943. if ( copyout((caddr_t)&PortP->Xprint, (int)arg,
  944. sizeof(struct Xprint))==COPYFAIL ) {
  945.         rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  946. pseterr(EFAULT);
  947. }
  948. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  949. return 0;
  950. case TCRIOIXANYON:
  951. rio_dprintk (RIO_DEBUG_TTY, "TCRIOIXANYONn");
  952. PortP->Config |= RIO_IXANY;
  953. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  954. return 0;
  955. case TCRIOIXANYOFF:
  956. rio_dprintk (RIO_DEBUG_TTY, "TCRIOIXANYOFFn");
  957. PortP->Config &= ~RIO_IXANY;
  958. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  959. return 0;
  960. case TCRIOIXONON:
  961. rio_dprintk (RIO_DEBUG_TTY, "TCRIOIXONONn");
  962. PortP->Config |= RIO_IXON;
  963. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  964. return 0;
  965. case TCRIOIXONOFF:
  966. rio_dprintk (RIO_DEBUG_TTY, "TCRIOIXONOFFn");
  967. PortP->Config &= ~RIO_IXON;
  968. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  969. return 0;
  970. /*
  971. ** 15.10.1998 ARG - ESIL 0761 part fix
  972. ** Added support for CTS and RTS flow control ioctls :
  973. */
  974. case TCRIOCTSFLOWEN:
  975. rio_dprintk (RIO_DEBUG_TTY, "TCRIOCTSFLOWENn");
  976. PortP->Config |= RIO_CTSFLOW;
  977. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  978. RIOParam(PortP,CONFIG,Modem,OK_TO_SLEEP);
  979. return 0;
  980. case TCRIOCTSFLOWDIS:
  981. rio_dprintk (RIO_DEBUG_TTY, "TCRIOCTSFLOWDISn");
  982. PortP->Config &= ~RIO_CTSFLOW;
  983. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  984. RIOParam(PortP,CONFIG,Modem,OK_TO_SLEEP);
  985. return 0;
  986. case TCRIORTSFLOWEN:
  987. rio_dprintk (RIO_DEBUG_TTY, "TCRIORTSFLOWENn");
  988. PortP->Config |= RIO_RTSFLOW;
  989. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  990. RIOParam(PortP,CONFIG,Modem,OK_TO_SLEEP);
  991. return 0;
  992. case TCRIORTSFLOWDIS:
  993. rio_dprintk (RIO_DEBUG_TTY, "TCRIORTSFLOWDISn");
  994. PortP->Config &= ~RIO_RTSFLOW;
  995. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  996. RIOParam(PortP,CONFIG,Modem,OK_TO_SLEEP);
  997. return 0;
  998. /* end ESIL 0761 part fix */
  999. }
  1000. /* Lynx IOCTLS */
  1001. switch (cmd) {
  1002. case TIOCSETP:
  1003. case TIOCSETN:
  1004. case OTIOCSETP:
  1005. case OTIOCSETN:
  1006. ioctl_processed++;
  1007. ttyseth(PortP, tp, (struct old_sgttyb *)arg);
  1008. break;
  1009. case TCSETA:
  1010. case TCSETAW:
  1011. case TCSETAF:
  1012. ioctl_processed++;
  1013. rio_dprintk (RIO_DEBUG_TTY, "NON POSIX ioctln");
  1014. ttyseth_pv(PortP, tp, (struct termios *)arg, 0);
  1015. break;
  1016. case TCSETAP: /* posix tcsetattr() */
  1017. case TCSETAWP: /* posix tcsetattr() */
  1018. case TCSETAFP: /* posix tcsetattr() */
  1019. rio_dprintk (RIO_DEBUG_TTY, "NON POSIX SYSV ioctln");
  1020. ttyseth_pv(PortP, tp, (struct termios *)arg, 1);
  1021. ioctl_processed++;
  1022. break;
  1023. }
  1024. /*
  1025. ** If its any of the commands that require the port to be in the
  1026. ** non-busy state wait until all output has drained 
  1027. */
  1028. if (!ioctl_processed)
  1029. switch(cmd) {
  1030. case TCSETAW:
  1031. case TCSETAF:
  1032. case TCSETA:
  1033. case TCSBRK:
  1034. #define OLD_POSIX ('x' << 8)
  1035. #define OLD_POSIX_SETA (OLD_POSIX | 2)
  1036. #define OLD_POSIX_SETAW (OLD_POSIX | 3)
  1037. #define OLD_POSIX_SETAF (OLD_POSIX | 4)
  1038. #define NEW_POSIX (('i' << 24) | ('X' << 16))
  1039. #define NEW_POSIX_SETA (NEW_POSIX | 2)
  1040. #define NEW_POSIX_SETAW (NEW_POSIX | 3)
  1041. #define NEW_POSIX_SETAF (NEW_POSIX | 4)
  1042. case OLD_POSIX_SETA:
  1043. case OLD_POSIX_SETAW:
  1044. case OLD_POSIX_SETAF:
  1045. case NEW_POSIX_SETA:
  1046. case NEW_POSIX_SETAW:
  1047. case NEW_POSIX_SETAF:
  1048. #ifdef TIOCSETP
  1049. case TIOCSETP:
  1050. #endif
  1051. case TIOCSETD:
  1052. case TIOCSETN:
  1053. rio_dprintk (RIO_DEBUG_TTY, "wait for non-BUSY, semaphore setn");
  1054. /*
  1055. ** Wait for drain here, at least as far as the double buffer
  1056. ** being empty.
  1057. */
  1058. /* XXX Does the above comment mean that this has
  1059.    still to be implemented? -- REW */
  1060. /* XXX Is the locking OK together with locking
  1061.                            in txenable? (Deadlock?) -- REW */
  1062. RIOTxEnable((char *)PortP);
  1063. break;
  1064. default:
  1065. break;
  1066. }
  1067. old_cflag = tp->tm.c_cflag;
  1068. old_iflag = tp->tm.c_iflag;
  1069. old_oflag = tp->tm.c_oflag;
  1070. oldcook = PortP->CookMode;
  1071. if ( p->RIOHalted ) {
  1072. RIOClearUp( PortP );
  1073. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  1074. pseterr(EIO);
  1075. return 0;
  1076. }
  1077. PortP->FlushCmdBodge = 0;
  1078. /*
  1079. ** If the port is locked, and it is reconfigured, we want
  1080. ** to restore the state of the tty structure so the change is NOT
  1081. ** made.
  1082. */
  1083. if (PortP->Lock) {
  1084. tp->tm.c_iflag = PortP->StoredTty.iflag;
  1085. tp->tm.c_oflag = PortP->StoredTty.oflag;
  1086. tp->tm.c_cflag = PortP->StoredTty.cflag;
  1087. tp->tm.c_lflag = PortP->StoredTty.lflag;
  1088. tp->tm.c_line = PortP->StoredTty.line;
  1089. for (i = 0; i < NCC + 1; i++)
  1090. tp->tm.c_cc[i] = PortP->StoredTty.cc[i];
  1091. }
  1092. else {
  1093. /*
  1094. ** If the port is set to store the parameters, and it is
  1095. ** reconfigured, we want to save the current tty struct so it
  1096. ** may be restored on the next open.
  1097. */
  1098. if (PortP->Store) {
  1099. PortP->StoredTty.iflag = tp->tm.c_iflag;
  1100. PortP->StoredTty.oflag = tp->tm.c_oflag;
  1101. PortP->StoredTty.cflag = tp->tm.c_cflag;
  1102. PortP->StoredTty.lflag = tp->tm.c_lflag;
  1103. PortP->StoredTty.line = tp->tm.c_line;
  1104. for (i = 0; i < NCC + 1; i++)
  1105. PortP->StoredTty.cc[i] = tp->tm.c_cc[i];
  1106. }
  1107. }
  1108. changed = (tp->tm.c_cflag != old_cflag) ||
  1109. (tp->tm.c_iflag != old_iflag) ||
  1110. (tp->tm.c_oflag != old_oflag);
  1111. PortP->CookMode = RIOCookMode(tp); /* Set new cooking mode */
  1112. rio_dprintk (RIO_DEBUG_TTY, "RIOIoctl changed %d newcook %d oldcook %dn",
  1113. changed,PortP->CookMode,oldcook);
  1114. #ifdef MODEM_SUPPORT
  1115. /*
  1116. ** kludge to force CARR_ON if CLOCAL set
  1117. */
  1118. if ((tp->tm.c_cflag & CLOCAL) || (PortP->ModemState & MSVR1_CD)) {
  1119. tp->tm.c_state |= CARR_ON;
  1120. wakeup ((caddr_t)&tp->tm.c_canq);
  1121. }
  1122. #endif
  1123. if ( p->RIOHalted ) {
  1124. RIOClearUp( PortP );
  1125. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  1126. pseterr(EIO);
  1127. return 0;
  1128. }
  1129. /*
  1130. ** Re-configure if modes or cooking have changed
  1131. */
  1132. if (changed || oldcook != PortP->CookMode || (ioctl_processed)) {
  1133. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  1134. rio_dprintk (RIO_DEBUG_TTY, "Ioctl changing the PORT settingsn");
  1135. RIOParam(PortP,CONFIG,Modem,OK_TO_SLEEP);
  1136. rio_spin_lock_irqsave(&PortP->portSem, flags);
  1137. }
  1138. if (p->RIOHalted) {
  1139. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  1140. RIOClearUp( PortP );
  1141. pseterr(EIO);
  1142. return 0;
  1143. }
  1144. rio_spin_unlock_irqrestore(&PortP->portSem, flags);
  1145. return 0;
  1146. }
  1147. /*
  1148. ttyseth -- set hardware dependant tty settings
  1149. */
  1150. void
  1151. ttyseth(PortP, s, sg)
  1152. struct Port * PortP;
  1153. struct ttystatics * s;
  1154. struct old_sgttyb *sg;
  1155. {
  1156. struct old_sgttyb * tsg;
  1157. struct termios *tp = &s->tm;
  1158. tsg = &s->sg;
  1159. if (sg->sg_flags & (EVENP|ODDP))  {
  1160. tp->c_cflag &= PARENB;
  1161. if (sg->sg_flags & EVENP) {
  1162. if (sg->sg_flags & ODDP) {
  1163. tp->c_cflag &= V_CS7;
  1164. tp->c_cflag &= ~PARENB;
  1165. }
  1166. else {
  1167. tp->c_cflag &= V_CS7;
  1168. tp->c_cflag &= PARENB;
  1169. tp->c_cflag &= PARODD;
  1170. }
  1171. }
  1172. else if (sg->sg_flags & ODDP) {
  1173. tp->c_cflag &= V_CS7;
  1174. tp->c_cflag &= PARENB;
  1175. tp->c_cflag &= PARODD;
  1176. }
  1177. else {
  1178. tp->c_cflag &= V_CS7;
  1179. tp->c_cflag &= PARENB;
  1180. }
  1181. }
  1182. /*
  1183.  * Use ispeed as the desired speed.  Most implementations don't handle 
  1184.  * separate input and output speeds very well. If the RIO handles this, 
  1185.  * I will have to use separate sets of flags to store them in the 
  1186.  * Port structure.
  1187.  */
  1188. if ( !sg->sg_ospeed )
  1189. sg->sg_ospeed = sg->sg_ispeed;
  1190. else
  1191. sg->sg_ispeed = sg->sg_ospeed;
  1192. if (sg->sg_ispeed > V_EXTB ) 
  1193. sg->sg_ispeed = V_EXTB;
  1194. if (sg->sg_ispeed < V_B0)
  1195. sg->sg_ispeed = V_B0;
  1196. *tsg = *sg;
  1197.    tp->c_cflag = (tp->c_cflag & ~V_CBAUD) | conv_bv[(int)sg->sg_ispeed];
  1198. }
  1199. /*
  1200. ttyseth_pv -- set hardware dependant tty settings using either the
  1201. POSIX termios structure or the System V termio structure.
  1202. sysv = 0 => (POSIX):  struct termios *sg
  1203. sysv != 0 => (System V): struct termio *sg
  1204. */
  1205. static void
  1206. ttyseth_pv(PortP, s, sg, sysv)
  1207. struct Port *PortP;
  1208. struct ttystatics *s;
  1209. struct termios *sg;
  1210. int sysv;
  1211. {
  1212.     int speed;
  1213.     unsigned char csize;
  1214.     unsigned char cread;
  1215.     unsigned int lcr_flags;
  1216.     int ps;
  1217.  
  1218.     if (sysv) {
  1219.         /* sg points to a System V termio structure */
  1220.         csize = ((struct termio *)sg)->c_cflag & CSIZE;
  1221.         cread = ((struct termio *)sg)->c_cflag & CREAD;
  1222.         speed = conv_vb[((struct termio *)sg)->c_cflag & V_CBAUD];
  1223.     }
  1224.     else {
  1225.         /* sg points to a POSIX termios structure */
  1226.         csize = sg->c_cflag & CSIZE;
  1227.         cread = sg->c_cflag & CREAD;
  1228.         speed = conv_vb[sg->c_cflag & V_CBAUD];
  1229.     }
  1230.     if (s->sg.sg_ispeed != speed || s->sg.sg_ospeed != speed) {
  1231.         s->sg.sg_ispeed = speed;
  1232.         s->sg.sg_ospeed = speed;
  1233.         s->tm.c_cflag = (s->tm.c_cflag & ~V_CBAUD) |
  1234.                          conv_bv[(int)s->sg.sg_ispeed];
  1235.     }
  1236. }
  1237. #endif