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

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 : rioparam.c
  24. ** SID : 1.3
  25. ** Last Modified : 11/6/98 10:33:45
  26. ** Retrieved : 11/6/98 10:33:50
  27. **
  28. **  ident @(#)rioparam.c 1.3
  29. **
  30. ** -----------------------------------------------------------------------------
  31. */
  32. #ifdef SCCS_LABELS
  33. static char *_rioparam_c_sccs_ = "@(#)rioparam.c 1.3";
  34. #endif
  35. #define __NO_VERSION__
  36. #include <linux/module.h>
  37. #include <linux/slab.h>
  38. #include <linux/errno.h>
  39. #include <linux/tty.h>
  40. #include <asm/io.h>
  41. #include <asm/system.h>
  42. #include <asm/string.h>
  43. #include <asm/semaphore.h>
  44. #include <asm/uaccess.h>
  45. #include <linux/termios.h>
  46. #include <linux/serial.h>
  47. #include <linux/compatmac.h>
  48. #include <linux/generic_serial.h>
  49. #include "linux_compat.h"
  50. #include "rio_linux.h"
  51. #include "typdef.h"
  52. #include "pkt.h"
  53. #include "daemon.h"
  54. #include "rio.h"
  55. #include "riospace.h"
  56. #include "top.h"
  57. #include "cmdpkt.h"
  58. #include "map.h"
  59. #include "riotypes.h"
  60. #include "rup.h"
  61. #include "port.h"
  62. #include "riodrvr.h"
  63. #include "rioinfo.h"
  64. #include "func.h"
  65. #include "errors.h"
  66. #include "pci.h"
  67. #include "parmmap.h"
  68. #include "unixrup.h"
  69. #include "board.h"
  70. #include "host.h"
  71. #include "error.h"
  72. #include "phb.h"
  73. #include "link.h"
  74. #include "cmdblk.h"
  75. #include "route.h"
  76. #include "control.h"
  77. #include "cirrus.h"
  78. #include "rioioctl.h"
  79. #include "param.h"
  80. #include "list.h"
  81. #include "sam.h"
  82. /*
  83. ** The Scam, based on email from jeremyr@bugs.specialix.co.uk....
  84. **
  85. ** To send a command on a particular port, you put a packet with the
  86. ** command bit set onto the port. The command bit is in the len field,
  87. ** and gets ORed in with the actual byte count.
  88. **
  89. ** When you send a packet with the command bit set, then the first
  90. ** data byte ( data[0] ) is interpretted as the command to execute.
  91. ** It also governs what data structure overlay should accompany the packet.
  92. ** Commands are defined in cirrus/cirrus.h
  93. **
  94. ** If you want the command to pre-emt data already on the queue for the
  95. ** port, set the pre-emptive bit in conjunction with the command bit.
  96. ** It is not defined what will happen if you set the preemptive bit
  97. ** on a packet that is NOT a command.
  98. **
  99. ** Pre-emptive commands should be queued at the head of the queue using
  100. ** add_start(), whereas normal commands and data are enqueued using
  101. ** add_end().
  102. **
  103. ** Most commands do not use the remaining bytes in the data array. The
  104. ** exceptions are OPEN MOPEN and CONFIG. (NB. As with the SI CONFIG and
  105. ** OPEN are currently analagous). With these three commands the following
  106. ** 11 data bytes are all used to pass config information such as baud rate etc.
  107. ** The fields are also defined in cirrus.h. Some contain straightforward
  108. ** information such as the transmit XON character. Two contain the transmit and
  109. ** receive baud rates respectively. For most baud rates there is a direct
  110. ** mapping between the rates defined in <sys/termio.h> and the byte in the
  111. ** packet. There are additional (non UNIX-standard) rates defined in
  112. ** /u/dos/rio/cirrus/h/brates.h.
  113. **
  114. ** The rest of the data fields contain approximations to the Cirrus registers
  115. ** that are used to program number of bits etc. Each registers bit fields is
  116. ** defined in cirrus.h.
  117. ** 
  118. ** NB. Only use those bits that are defined as being driver specific
  119. ** or common to the RTA and the driver.
  120. ** 
  121. ** All commands going from RTA->Host will be dealt with by the Host code - you
  122. ** will never see them. As with the SI there will be three fields to look out
  123. ** for in each phb (not yet defined - needs defining a.s.a.p).
  124. ** 
  125. ** modem_status - current state of handshake pins.
  126. **
  127. ** port_status  - current port status - equivalent to hi_stat for SI, indicates
  128. ** if port is IDLE_OPEN, IDLE_CLOSED etc.
  129. **
  130. ** break_status - bit X set if break has been received.
  131. ** 
  132. ** Happy hacking.
  133. ** 
  134. */
  135. /* 
  136. ** RIOParam is used to open or configure a port. You pass it a PortP,
  137. ** which will have a tty struct attached to it. You also pass a command,
  138. ** either OPEN or CONFIG. The port's setup is taken from the t_ fields
  139. ** of the tty struct inside the PortP, and the port is either opened
  140. ** or re-configured. You must also tell RIOParam if the device is a modem
  141. ** device or not (i.e. top bit of minor number set or clear - take special
  142. ** care when deciding on this!).
  143. ** RIOParam neither flushes nor waits for drain, and is NOT preemptive.
  144. **
  145. ** RIOParam assumes it will be called at splrio(), and also assumes
  146. ** that CookMode is set correctly in the port structure.
  147. **
  148. ** NB. for MPX
  149. ** tty lock must NOT have been previously acquired.
  150. */
  151. int
  152. RIOParam(PortP, cmd, Modem, SleepFlag)
  153. struct Port *PortP;
  154. int cmd;
  155. int Modem;
  156. int SleepFlag; 
  157. {
  158. register struct tty_struct *TtyP;
  159. int retval;
  160. register struct phb_param *phb_param_ptr;
  161. PKT *PacketP;
  162. int res;
  163. uchar Cor1=0, Cor2=0, Cor4=0, Cor5=0;
  164. uchar TxXon=0, TxXoff=0, RxXon=0, RxXoff=0;
  165. uchar LNext=0, TxBaud=0, RxBaud=0;
  166. int retries = 0xff;
  167. unsigned long flags;
  168. func_enter ();
  169. TtyP = PortP->gs.tty;
  170. rio_dprintk (RIO_DEBUG_PARAM, "RIOParam: Port:%d cmd:%d Modem:%d SleepFlag:%d Mapped: %d, tty=%pn",
  171.     PortP->PortNum, cmd, Modem, SleepFlag, PortP->Mapped, TtyP);
  172. if (!TtyP) {
  173.   rio_dprintk (RIO_DEBUG_PARAM, "Can't call rioparam with null tty.n");
  174.   func_exit ();
  175.   return RIO_FAIL;
  176. }
  177. rio_spin_lock_irqsave(&PortP->portSem, flags );
  178. if (cmd == OPEN) {
  179. /*
  180. ** If the port is set to store or lock the parameters, and it is
  181. ** paramed with OPEN, we want to restore the saved port termio, but
  182. ** only if StoredTermio has been saved, i.e. NOT 1st open after reboot.
  183. */
  184. #if 0
  185. if (PortP->FirstOpen) {
  186. PortP->StoredTty.iflag = TtyP->tm.c_iflag;
  187. PortP->StoredTty.oflag = TtyP->tm.c_oflag;
  188. PortP->StoredTty.cflag = TtyP->tm.c_cflag;
  189. PortP->StoredTty.lflag = TtyP->tm.c_lflag;
  190. PortP->StoredTty.line = TtyP->tm.c_line;
  191. for (i = 0; i < NCC + 5; i++)
  192. PortP->StoredTty.cc[i] = TtyP->tm.c_cc[i];
  193. PortP->FirstOpen = 0;
  194. }
  195. else if (PortP->Store || PortP->Lock) {
  196. rio_dprintk (RIO_DEBUG_PARAM, "OPEN: Restoring stored/locked paramsn");
  197. TtyP->tm.c_iflag = PortP->StoredTty.iflag;
  198. TtyP->tm.c_oflag = PortP->StoredTty.oflag;
  199. TtyP->tm.c_cflag = PortP->StoredTty.cflag;
  200. TtyP->tm.c_lflag = PortP->StoredTty.lflag;
  201. TtyP->tm.c_line = PortP->StoredTty.line;
  202. for (i = 0; i < NCC + 5; i++)
  203. TtyP->tm.c_cc[i] = PortP->StoredTty.cc[i];
  204. }
  205. #endif
  206. }
  207. /*
  208. ** wait for space
  209. */
  210. while ( !(res=can_add_transmit(&PacketP,PortP)) || 
  211. (PortP->InUse != NOT_INUSE) ) {
  212. if (retries -- <= 0) {
  213. break;
  214. }
  215. if ( PortP->InUse != NOT_INUSE ) {
  216. rio_dprintk (RIO_DEBUG_PARAM, "Port IN_USE for pre-emptive commandn");
  217. }
  218. if ( !res ) {
  219. rio_dprintk (RIO_DEBUG_PARAM, "Port has no space on transmit queuen");
  220. }
  221. if ( SleepFlag != OK_TO_SLEEP ) {
  222. rio_spin_unlock_irqrestore( &PortP->portSem, flags);
  223. func_exit();
  224. return RIO_FAIL;
  225. }
  226. rio_dprintk (RIO_DEBUG_PARAM, "wait for can_add_transmitn");
  227. rio_spin_unlock_irqrestore( &PortP->portSem, flags);
  228. retval = RIODelay(PortP, HUNDRED_MS);
  229. rio_spin_lock_irqsave( &PortP->portSem, flags);
  230. if (retval == RIO_FAIL) {
  231. rio_dprintk (RIO_DEBUG_PARAM, "wait for can_add_transmit broken by signaln");
  232. rio_spin_unlock_irqrestore( &PortP->portSem, flags);
  233. pseterr(EINTR);
  234. func_exit();
  235. return RIO_FAIL;
  236. }
  237. if ( PortP->State & RIO_DELETED ) {
  238. rio_spin_unlock_irqrestore( &PortP->portSem, flags);
  239. func_exit ();
  240. return RIO_SUCCESS;
  241. }
  242. }
  243. if (!res) {
  244. rio_spin_unlock_irqrestore( &PortP->portSem, flags);
  245. func_exit ();
  246. return RIO_FAIL;
  247. }
  248. rio_dprintk (RIO_DEBUG_PARAM, "can_add_transmit() returns %xn",res);
  249. rio_dprintk (RIO_DEBUG_PARAM, "Packet is 0x%xn",(int) PacketP);
  250. phb_param_ptr = (struct phb_param *)PacketP->data;
  251. #if 0
  252. /*
  253. ** COR 1
  254. */
  255. if ( TtyP->tm.c_iflag & INPCK ) {
  256. rio_dprintk (RIO_DEBUG_PARAM, "Parity checking on input enabledn");
  257. Cor1 |= COR1_INPCK;
  258. }
  259. #endif
  260. switch ( TtyP->termios->c_cflag & CSIZE ) {
  261. case CS5:
  262. {
  263. rio_dprintk (RIO_DEBUG_PARAM, "5 bit datan");
  264. Cor1 |= COR1_5BITS;
  265. break;
  266. }
  267. case CS6:
  268. {
  269. rio_dprintk (RIO_DEBUG_PARAM, "6 bit datan");
  270. Cor1 |= COR1_6BITS;
  271. break;
  272. }
  273. case CS7:
  274. {
  275. rio_dprintk (RIO_DEBUG_PARAM, "7 bit datan");
  276. Cor1 |= COR1_7BITS;
  277. break;
  278. }
  279. case CS8:
  280. {
  281. rio_dprintk (RIO_DEBUG_PARAM, "8 bit datan");
  282. Cor1 |= COR1_8BITS;
  283. break;
  284. }
  285. }
  286. if ( TtyP->termios->c_cflag & CSTOPB ) {
  287. rio_dprintk (RIO_DEBUG_PARAM, "2 stop bitsn");
  288. Cor1 |= COR1_2STOP;
  289. }
  290. else {
  291. rio_dprintk (RIO_DEBUG_PARAM, "1 stop bitn");
  292. Cor1 |= COR1_1STOP;
  293. }
  294. if ( TtyP->termios->c_cflag & PARENB ) {
  295. rio_dprintk (RIO_DEBUG_PARAM, "Enable parityn");
  296. Cor1 |= COR1_NORMAL;
  297. }
  298. else {
  299. rio_dprintk (RIO_DEBUG_PARAM, "Disable parityn");
  300. Cor1 |= COR1_NOP;
  301. }
  302. if ( TtyP->termios->c_cflag & PARODD ) {
  303. rio_dprintk (RIO_DEBUG_PARAM, "Odd parityn");
  304. Cor1 |= COR1_ODD;
  305. }
  306. else {
  307. rio_dprintk (RIO_DEBUG_PARAM, "Even parityn");
  308. Cor1 |= COR1_EVEN; 
  309. }
  310. /*
  311. ** COR 2
  312. */
  313. if ( TtyP->termios->c_iflag & IXON ) {
  314. rio_dprintk (RIO_DEBUG_PARAM, "Enable start/stop output controln");
  315. Cor2 |= COR2_IXON;
  316. }
  317. else {
  318. if ( PortP->Config & RIO_IXON ) {
  319. rio_dprintk (RIO_DEBUG_PARAM, "Force enable start/stop output controln");
  320. Cor2 |= COR2_IXON;
  321. }
  322. else
  323. rio_dprintk (RIO_DEBUG_PARAM, "IXON has been disabled.n");
  324. }
  325. if (TtyP->termios->c_iflag & IXANY) {
  326. if ( PortP->Config & RIO_IXANY ) {
  327. rio_dprintk (RIO_DEBUG_PARAM, "Enable any key to restart outputn");
  328. Cor2 |= COR2_IXANY;
  329. }
  330. else
  331. rio_dprintk (RIO_DEBUG_PARAM, "IXANY has been disabled due to sanity reasons.n");
  332. }
  333. if ( TtyP->termios->c_iflag & IXOFF ) {
  334. rio_dprintk (RIO_DEBUG_PARAM, "Enable start/stop input control 2n");
  335. Cor2 |= COR2_IXOFF;
  336. }
  337. if ( TtyP->termios->c_cflag & HUPCL ) {
  338. rio_dprintk (RIO_DEBUG_PARAM, "Hangup on last closen");
  339. Cor2 |= COR2_HUPCL;
  340. }
  341. if ( C_CRTSCTS (TtyP)) {
  342. rio_dprintk (RIO_DEBUG_PARAM, "Rx hardware flow control enabledn");
  343. Cor2 |= COR2_CTSFLOW;
  344. Cor2 |= COR2_RTSFLOW;
  345. } else {
  346. rio_dprintk (RIO_DEBUG_PARAM, "Rx hardware flow control disabledn");
  347. Cor2 &= ~COR2_CTSFLOW;
  348. Cor2 &= ~COR2_RTSFLOW;
  349. }
  350. if ( TtyP->termios->c_cflag & CLOCAL ) {
  351. rio_dprintk (RIO_DEBUG_PARAM, "Local linen");
  352. }
  353. else {
  354. rio_dprintk (RIO_DEBUG_PARAM, "Possible Modem linen");
  355. }
  356. /*
  357. ** COR 4 (there is no COR 3)
  358. */
  359. if ( TtyP->termios->c_iflag & IGNBRK ) {
  360. rio_dprintk (RIO_DEBUG_PARAM, "Ignore break conditionn");
  361. Cor4 |= COR4_IGNBRK;
  362. }
  363. if ( !(TtyP->termios->c_iflag & BRKINT) ) {
  364. rio_dprintk (RIO_DEBUG_PARAM, "Break generates NULL conditionn");
  365. Cor4 |= COR4_NBRKINT;
  366. } else {
  367. rio_dprintk (RIO_DEBUG_PARAM, "Interrupt on break conditionn");
  368. }
  369. if ( TtyP->termios->c_iflag & INLCR ) {
  370. rio_dprintk (RIO_DEBUG_PARAM, "Map newline to carriage return on inputn");
  371. Cor4 |= COR4_INLCR;
  372. }
  373. if ( TtyP->termios->c_iflag & IGNCR ) {
  374. rio_dprintk (RIO_DEBUG_PARAM, "Ignore carriage return on inputn");
  375. Cor4 |= COR4_IGNCR;
  376. }
  377. if ( TtyP->termios->c_iflag & ICRNL ) {
  378. rio_dprintk (RIO_DEBUG_PARAM, "Map carriage return to newline on inputn");
  379. Cor4 |= COR4_ICRNL;
  380. }
  381. if ( TtyP->termios->c_iflag & IGNPAR ) {
  382. rio_dprintk (RIO_DEBUG_PARAM, "Ignore characters with parity errorsn");
  383. Cor4 |= COR4_IGNPAR;
  384. }
  385. if ( TtyP->termios->c_iflag & PARMRK ) {
  386. rio_dprintk (RIO_DEBUG_PARAM, "Mark parity errorsn");
  387. Cor4 |= COR4_PARMRK;
  388. }
  389. /*
  390. ** Set the RAISEMOD flag to ensure that the modem lines are raised
  391. ** on reception of a config packet.
  392. ** The download code handles the zero baud condition.
  393. */
  394. Cor4 |= COR4_RAISEMOD;
  395. /*
  396. ** COR 5
  397. */
  398. Cor5 = COR5_CMOE;
  399. /*
  400. ** Set to monitor tbusy/tstop (or not).
  401. */
  402. if (PortP->MonitorTstate)
  403. Cor5 |= COR5_TSTATE_ON;
  404. else
  405. Cor5 |= COR5_TSTATE_OFF;
  406. /*
  407. ** Could set LNE here if you wanted LNext processing. SVR4 will use it.
  408. */
  409. if ( TtyP->termios->c_iflag & ISTRIP ) {
  410. rio_dprintk (RIO_DEBUG_PARAM, "Strip input charactersn");
  411. if (! (PortP->State & RIO_TRIAD_MODE)) {
  412. Cor5 |= COR5_ISTRIP;
  413. }
  414. }
  415. if ( TtyP->termios->c_oflag & ONLCR ) {
  416. rio_dprintk (RIO_DEBUG_PARAM, "Map newline to carriage-return, newline on outputn");
  417. if ( PortP->CookMode == COOK_MEDIUM )
  418. Cor5 |= COR5_ONLCR;
  419. }
  420. if ( TtyP->termios->c_oflag & OCRNL ) {
  421. rio_dprintk (RIO_DEBUG_PARAM, "Map carriage return to newline on outputn");
  422. if ( PortP->CookMode == COOK_MEDIUM )
  423. Cor5 |= COR5_OCRNL;
  424. }
  425. if ( ( TtyP->termios->c_oflag & TABDLY) == TAB3 ) {
  426. rio_dprintk (RIO_DEBUG_PARAM, "Tab delay 3 setn");
  427. if ( PortP->CookMode == COOK_MEDIUM )
  428. Cor5 |= COR5_TAB3;
  429. }
  430. /*
  431. ** Flow control bytes.
  432. */
  433. TxXon = TtyP->termios->c_cc[VSTART];
  434. TxXoff = TtyP->termios->c_cc[VSTOP];
  435. RxXon = TtyP->termios->c_cc[VSTART];
  436. RxXoff = TtyP->termios->c_cc[VSTOP];
  437. /*
  438. ** LNEXT byte
  439. */
  440. LNext = 0;
  441. /*
  442. ** Baud rate bytes
  443. */
  444. rio_dprintk (RIO_DEBUG_PARAM, "Mapping of rx/tx baud %x (%x)n", 
  445.      TtyP->termios->c_cflag, CBAUD);
  446. switch (TtyP->termios->c_cflag & CBAUD) {
  447. #define e(b) case B ## b : RxBaud = TxBaud = RIO_B ## b ;break
  448.   e(50);e(75);e(110);e(134);e(150);e(200);e(300);e(600);e(1200);
  449.   e(1800);e(2400);e(4800);e(9600);e(19200);e(38400);e(57600);
  450.   e(115200); /* e(230400);e(460800); e(921600);  */
  451. }
  452. /* XXX MIssing conversion table. XXX */
  453. /*   (TtyP->termios->c_cflag & V_CBAUD); */
  454. rio_dprintk (RIO_DEBUG_PARAM, "tx baud 0x%x, rx baud 0x%xn", TxBaud, RxBaud);
  455. /*
  456. ** Leftovers
  457. */
  458. if ( TtyP->termios->c_cflag & CREAD )
  459. rio_dprintk (RIO_DEBUG_PARAM, "Enable receivern");
  460. #ifdef RCV1EN
  461. if ( TtyP->termios->c_cflag & RCV1EN )
  462. rio_dprintk (RIO_DEBUG_PARAM, "RCV1EN (?)n");
  463. #endif
  464. #ifdef XMT1EN
  465. if ( TtyP->termios->c_cflag & XMT1EN )
  466. rio_dprintk (RIO_DEBUG_PARAM, "XMT1EN (?)n");
  467. #endif
  468. #if 0
  469. if ( TtyP->termios->c_cflag & LOBLK )
  470. rio_dprintk (RIO_DEBUG_PARAM, "LOBLK - JCL output blocks when not currentn");
  471. #endif
  472. if ( TtyP->termios->c_lflag & ISIG )
  473. rio_dprintk (RIO_DEBUG_PARAM, "Input character signal generating enabledn");
  474. if ( TtyP->termios->c_lflag & ICANON )
  475. rio_dprintk (RIO_DEBUG_PARAM, "Canonical input: erase and kill enabledn");
  476. if ( TtyP->termios->c_lflag & XCASE )
  477. rio_dprintk (RIO_DEBUG_PARAM, "Canonical upper/lower presentationn");
  478. if ( TtyP->termios->c_lflag & ECHO )
  479. rio_dprintk (RIO_DEBUG_PARAM, "Enable input echon");
  480. if ( TtyP->termios->c_lflag & ECHOE )
  481. rio_dprintk (RIO_DEBUG_PARAM, "Enable echo erasen");
  482. if ( TtyP->termios->c_lflag & ECHOK )
  483. rio_dprintk (RIO_DEBUG_PARAM, "Enable echo killn");
  484. if ( TtyP->termios->c_lflag & ECHONL )
  485. rio_dprintk (RIO_DEBUG_PARAM, "Enable echo newlinen");
  486. if ( TtyP->termios->c_lflag & NOFLSH )
  487. rio_dprintk (RIO_DEBUG_PARAM, "Disable flush after interrupt or quitn");
  488. #ifdef TOSTOP
  489. if ( TtyP->termios->c_lflag & TOSTOP )
  490. rio_dprintk (RIO_DEBUG_PARAM, "Send SIGTTOU for background outputn");
  491. #endif
  492. #ifdef XCLUDE
  493. if ( TtyP->termios->c_lflag & XCLUDE )
  494. rio_dprintk (RIO_DEBUG_PARAM, "Exclusive use of this linen");
  495. #endif
  496. if ( TtyP->termios->c_iflag & IUCLC )
  497. rio_dprintk (RIO_DEBUG_PARAM, "Map uppercase to lowercase on inputn");
  498. if ( TtyP->termios->c_oflag & OPOST )
  499. rio_dprintk (RIO_DEBUG_PARAM, "Enable output post-processingn");
  500. if ( TtyP->termios->c_oflag & OLCUC )
  501. rio_dprintk (RIO_DEBUG_PARAM, "Map lowercase to uppercase on outputn");
  502. if ( TtyP->termios->c_oflag & ONOCR )
  503. rio_dprintk (RIO_DEBUG_PARAM, "No carriage return output at column 0n");
  504. if ( TtyP->termios->c_oflag & ONLRET )
  505. rio_dprintk (RIO_DEBUG_PARAM, "Newline performs carriage return functionn");
  506. if ( TtyP->termios->c_oflag & OFILL )
  507. rio_dprintk (RIO_DEBUG_PARAM, "Use fill characters for delayn");
  508. if ( TtyP->termios->c_oflag & OFDEL )
  509. rio_dprintk (RIO_DEBUG_PARAM, "Fill character is DELn");
  510. if ( TtyP->termios->c_oflag & NLDLY )
  511. rio_dprintk (RIO_DEBUG_PARAM, "Newline delay setn");
  512. if ( TtyP->termios->c_oflag & CRDLY )
  513. rio_dprintk (RIO_DEBUG_PARAM, "Carriage return delay setn");
  514. if ( TtyP->termios->c_oflag & TABDLY )
  515. rio_dprintk (RIO_DEBUG_PARAM, "Tab delay setn");
  516. #if 0
  517. if ( TtyP->termios->c_oflag & BSDLY )
  518. rio_dprintk (RIO_DEBUG_PARAM, "Back-space delay setn");
  519. if ( TtyP->termios->c_oflag & VTDLY )
  520. rio_dprintk (RIO_DEBUG_PARAM, "Vertical tab delay setn");
  521. if ( TtyP->termios->c_oflag & FFDLY )
  522. rio_dprintk (RIO_DEBUG_PARAM, "Form-feed delay setn");
  523. #endif
  524. /*
  525. ** These things are kind of useful in a later life!
  526. */
  527. PortP->Cor2Copy = Cor2;
  528. if ( PortP->State & RIO_DELETED ) {
  529. rio_spin_unlock_irqrestore( &PortP->portSem, flags);
  530. func_exit ();
  531. return RIO_FAIL;
  532. }
  533. /*
  534. ** Actually write the info into the packet to be sent
  535. */
  536. WBYTE(phb_param_ptr->Cmd, cmd);
  537. WBYTE(phb_param_ptr->Cor1,  Cor1);
  538. WBYTE(phb_param_ptr->Cor2,  Cor2);
  539. WBYTE(phb_param_ptr->Cor4,  Cor4);
  540. WBYTE(phb_param_ptr->Cor5,  Cor5);
  541. WBYTE(phb_param_ptr->TxXon, TxXon);
  542. WBYTE(phb_param_ptr->RxXon, RxXon);
  543. WBYTE(phb_param_ptr->TxXoff, TxXoff);
  544. WBYTE(phb_param_ptr->RxXoff, RxXoff);
  545. WBYTE(phb_param_ptr->LNext, LNext);
  546. WBYTE(phb_param_ptr->TxBaud, TxBaud);
  547. WBYTE(phb_param_ptr->RxBaud, RxBaud);
  548. /*
  549. ** Set the length/command field
  550. */
  551. WBYTE(PacketP->len , 12 | PKT_CMD_BIT);
  552. /*
  553. ** The packet is formed - now, whack it off
  554. ** to its final destination:
  555. */
  556. add_transmit(PortP);
  557. /*
  558. ** Count characters transmitted for port statistics reporting
  559. */
  560. if (PortP->statsGather)
  561. PortP->txchars += 12;
  562. rio_spin_unlock_irqrestore( &PortP->portSem, flags);
  563. rio_dprintk (RIO_DEBUG_PARAM, "add_transmit returned.n");
  564. /*
  565. ** job done.
  566. */
  567. func_exit ();
  568. return RIO_SUCCESS;
  569. }
  570. /*
  571. ** We can add another packet to a transmit queue if the packet pointer pointed
  572. ** to by the TxAdd pointer has PKT_IN_USE clear in its address.
  573. */
  574. int
  575. can_add_transmit(PktP, PortP)
  576. PKT **PktP;
  577. struct Port *PortP; 
  578. {
  579. register PKT *tp;
  580. *PktP = tp = (PKT *)RIO_PTR(PortP->Caddr,RWORD(*PortP->TxAdd));
  581. return !((uint)tp & PKT_IN_USE);
  582. }
  583. /*
  584. ** To add a packet to the queue, you set the PKT_IN_USE bit in the address,
  585. ** and then move the TxAdd pointer along one position to point to the next
  586. ** packet pointer. You must wrap the pointer from the end back to the start.
  587. */
  588. void
  589. add_transmit(PortP)
  590. struct Port *PortP; 
  591. {
  592.   if (RWORD(*PortP->TxAdd) & PKT_IN_USE) {
  593.     rio_dprintk (RIO_DEBUG_PARAM, "add_transmit: Packet has been stolen!");
  594.   }
  595. WWORD( *(ushort *)PortP->TxAdd, RWORD(*PortP->TxAdd) | PKT_IN_USE);
  596. PortP->TxAdd = (PortP->TxAdd == PortP->TxEnd) ? PortP->TxStart : 
  597. PortP->TxAdd + 1;
  598. WWORD( PortP->PhbP->tx_add , RIO_OFF(PortP->Caddr,PortP->TxAdd) );
  599. }
  600. /****************************************
  601.  * Put a packet onto the end of the
  602.  * free list
  603.  ****************************************/
  604. void
  605. put_free_end(HostP, PktP)
  606. struct Host *HostP;
  607. PKT *PktP;
  608. {
  609. FREE_LIST *tmp_pointer;
  610. ushort old_end, new_end;
  611. unsigned long flags;
  612. rio_spin_lock_irqsave(&HostP->HostLock, flags);
  613.  /*************************************************
  614. * Put a packet back onto the back of the free list
  615. *
  616. ************************************************/
  617. rio_dprintk (RIO_DEBUG_PFE,  "put_free_end(PktP=%x)n",(int)PktP);
  618. if ((old_end=RWORD(HostP->ParmMapP->free_list_end)) != TPNULL) {
  619. new_end = RIO_OFF(HostP->Caddr,PktP);
  620. tmp_pointer = (FREE_LIST *)RIO_PTR(HostP->Caddr,old_end);
  621. WWORD(tmp_pointer->next , new_end );
  622. WWORD(((FREE_LIST *)PktP)->prev , old_end);
  623. WWORD(((FREE_LIST *)PktP)->next , TPNULL);
  624. WWORD(HostP->ParmMapP->free_list_end, new_end);
  625. }
  626. else { /* First packet on the free list this should never happen! */
  627. rio_dprintk (RIO_DEBUG_PFE, "put_free_end(): This should never happenn");
  628. WWORD(HostP->ParmMapP->free_list_end , RIO_OFF(HostP->Caddr,PktP));
  629. tmp_pointer = (FREE_LIST *)PktP;
  630. WWORD(tmp_pointer->prev , TPNULL);
  631. WWORD(tmp_pointer->next , TPNULL);
  632. }
  633. rio_dprintk (RIO_DEBUG_CMD, "Before unlock: %pn", &HostP->HostLock);
  634. rio_spin_unlock_irqrestore(&HostP->HostLock, flags);
  635. }
  636. /*
  637. ** can_remove_receive(PktP,P) returns non-zero if PKT_IN_USE is set
  638. ** for the next packet on the queue. It will also set PktP to point to the
  639. ** relevent packet, [having cleared the PKT_IN_USE bit]. If PKT_IN_USE is clear,
  640. ** then can_remove_receive() returns 0.
  641. */
  642. int
  643. can_remove_receive(PktP, PortP)
  644. PKT **PktP;
  645. struct Port *PortP;
  646. {
  647. if ( RWORD(*PortP->RxRemove) & PKT_IN_USE) {
  648. *PktP = (PKT *)RIO_PTR(PortP->Caddr,
  649. RWORD(*PortP->RxRemove) & ~PKT_IN_USE);
  650. return 1;
  651. }
  652. return 0;
  653. }
  654. /*
  655. ** To remove a packet from the receive queue you clear its PKT_IN_USE bit,
  656. ** and then bump the pointers. Once the pointers get to the end, they must
  657. ** be wrapped back to the start.
  658. */
  659. void
  660. remove_receive(PortP)
  661. struct Port *PortP; 
  662. {
  663. WWORD( *PortP->RxRemove, RWORD(*PortP->RxRemove) & ~PKT_IN_USE );
  664. PortP->RxRemove = (PortP->RxRemove == PortP->RxEnd) ? PortP->RxStart : 
  665. PortP->RxRemove + 1;
  666. WWORD( PortP->PhbP->rx_remove , RIO_OFF(PortP->Caddr, PortP->RxRemove) );
  667. }