aurora.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:62k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: aurora.c,v 1.18.2.1 2002/02/04 22:37:43 davem Exp $
  2.  * linux/drivers/sbus/char/aurora.c -- Aurora multiport driver
  3.  *
  4.  * Copyright (c) 1999 by Oliver Aldulea (oli at bv dot ro)
  5.  *
  6.  * This code is based on the RISCom/8 multiport serial driver written
  7.  * by Dmitry Gorodchanin (pgmdsg@ibi.com), based on the Linux serial
  8.  * driver, written by Linus Torvalds, Theodore T'so and others.
  9.  * The Aurora multiport programming info was obtained mainly from the
  10.  * Cirrus Logic CD180 documentation (available on the web), and by
  11.  * doing heavy tests on the board. Many thanks to Eddie C. Dost for the
  12.  * help on the sbus interface.
  13.  *
  14.  * This program is free software; you can redistribute it and/or modify
  15.  * it under the terms of the GNU General Public License as published by
  16.  * the Free Software Foundation; either version 2 of the License, or
  17.  * (at your option) any later version.
  18.  *
  19.  * This program is distributed in the hope that it will be useful,
  20.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22.  * GNU General Public License for more details.
  23.  *
  24.  * You should have received a copy of the GNU General Public License
  25.  * along with this program; if not, write to the Free Software
  26.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  27.  *
  28.  * Revision 1.0
  29.  *
  30.  * This is the first public release.
  31.  *
  32.  * Most of the information you need is in the aurora.h file. Please
  33.  * read that file before reading this one.
  34.  *
  35.  * Several parts of the code do not have comments yet.
  36.  * 
  37.  * n.b.  The board can support 115.2 bit rates, but only on a few
  38.  * ports. The total badwidth of one chip (ports 0-7 or 8-15) is equal
  39.  * to OSC_FREQ div 16. In case of my board, each chip can take 6
  40.  * channels of 115.2 kbaud.  This information is not well-tested.
  41.  * 
  42.  * Fixed to use tty_get_baud_rate().
  43.  *   Theodore Ts'o <tytso@mit.edu>, 2001-Oct-12
  44.  */
  45. #include <linux/module.h>
  46. #include <linux/errno.h>
  47. #include <linux/sched.h>
  48. #ifdef AURORA_INT_DEBUG
  49. #include <linux/timer.h>
  50. #endif
  51. #include <linux/interrupt.h>
  52. #include <linux/tty.h>
  53. #include <linux/tty_flip.h>
  54. #include <linux/major.h>
  55. #include <linux/string.h>
  56. #include <linux/fcntl.h>
  57. #include <linux/mm.h>
  58. #include <linux/kernel.h>
  59. #include <linux/init.h>
  60. #include <linux/tqueue.h>
  61. #include <linux/delay.h>
  62. #include <asm/io.h>
  63. #include <asm/irq.h>
  64. #include <asm/oplib.h>
  65. #include <asm/system.h>
  66. #include <asm/segment.h>
  67. #include <asm/bitops.h>
  68. #include <asm/kdebug.h>
  69. #include <asm/sbus.h>
  70. #include <asm/uaccess.h>
  71. #include "aurora.h"
  72. #include "cd180.h"
  73. unsigned char irqs[4] = {
  74. 0, 0, 0, 0
  75. };
  76. #ifdef AURORA_INT_DEBUG
  77. int irqhit=0;
  78. #endif
  79. #ifndef MIN
  80. #define MIN(a,b) ((a) < (b) ? (a) : (b))
  81. #endif
  82. #define AURORA_TYPE_NORMAL 1
  83. static struct tty_driver aurora_driver;
  84. static struct Aurora_board aurora_board[AURORA_NBOARD] = {
  85. {0,},
  86. };
  87. static struct Aurora_port aurora_port[AURORA_TNPORTS] =  {
  88. { 0, },
  89. };
  90. /* no longer used. static struct Aurora_board * IRQ_to_board[16] = { NULL, } ;*/
  91. static unsigned char * tmp_buf = NULL;
  92. static DECLARE_MUTEX(tmp_buf_sem);
  93. static int    aurora_refcount = 0;
  94. static struct tty_struct * aurora_table[AURORA_TNPORTS] = { NULL, };
  95. static struct termios * aurora_termios[AURORA_TNPORTS] = { NULL, };
  96. static struct termios * aurora_termios_locked[AURORA_TNPORTS] = { NULL, };
  97. DECLARE_TASK_QUEUE(tq_aurora);
  98. static inline int aurora_paranoia_check(struct Aurora_port const * port,
  99.     kdev_t device, const char *routine)
  100. {
  101. #ifdef AURORA_PARANOIA_CHECK
  102. static const char *badmagic =
  103. KERN_DEBUG "aurora: Warning: bad aurora port magic number for device %s in %sn";
  104. static const char *badinfo =
  105. KERN_DEBUG "aurora: Warning: null aurora port for device %s in %sn";
  106. if (!port) {
  107. printk(badinfo, kdevname(device), routine);
  108. return 1;
  109. }
  110. if (port->magic != AURORA_MAGIC) {
  111. printk(badmagic, kdevname(device), routine);
  112. return 1;
  113. }
  114. #endif
  115. return 0;
  116. }
  117. /*
  118.  * 
  119.  *  Service functions for aurora driver.
  120.  * 
  121.  */
  122. /* Get board number from pointer */
  123. extern inline int board_No (struct Aurora_board const * bp)
  124. {
  125. return bp - aurora_board;
  126. }
  127. /* Get port number from pointer */
  128. extern inline int port_No (struct Aurora_port const * port)
  129. {
  130. return AURORA_PORT(port - aurora_port); 
  131. }
  132. /* Get pointer to board from pointer to port */
  133. extern inline struct Aurora_board * port_Board(struct Aurora_port const * port)
  134. {
  135. return &aurora_board[AURORA_BOARD(port - aurora_port)];
  136. }
  137. /* Wait for Channel Command Register ready */
  138. extern inline void aurora_wait_CCR(struct aurora_reg128 * r)
  139. {
  140. unsigned long delay;
  141. #ifdef AURORA_DEBUG
  142. printk("aurora_wait_CCRn");
  143. #endif
  144. /* FIXME: need something more descriptive than 100000 :) */
  145. for (delay = 100000; delay; delay--) 
  146. if (!sbus_readb(&r->r[CD180_CCR]))
  147. return;
  148. printk(KERN_DEBUG "aurora: Timeout waiting for CCR.n");
  149. }
  150. /*
  151.  *  aurora probe functions.
  152.  */
  153. /* Must be called with enabled interrupts */
  154. extern inline void aurora_long_delay(unsigned long delay)
  155. {
  156. unsigned long i;
  157. #ifdef AURORA_DEBUG
  158. printk("aurora_long_delay: startn");
  159. #endif
  160. for (i = jiffies + delay; time_before(jiffies, i); ) ;
  161. #ifdef AURORA_DEBUG
  162. printk("aurora_long_delay: endn");
  163. #endif
  164. }
  165. /* Reset and setup CD180 chip */
  166. static int aurora_init_CD180(struct Aurora_board * bp, int chip)
  167. {
  168. unsigned long flags;
  169. int id;
  170. #ifdef AURORA_DEBUG
  171. printk("aurora_init_CD180: start %d:%dn",
  172.        board_No(bp), chip);
  173. #endif
  174. save_flags(flags); cli();
  175. sbus_writeb(0, &bp->r[chip]->r[CD180_CAR]);
  176. sbus_writeb(0, &bp->r[chip]->r[CD180_GSVR]);
  177. /* Wait for CCR ready        */
  178. aurora_wait_CCR(bp->r[chip]);
  179. /* Reset CD180 chip          */
  180. sbus_writeb(CCR_HARDRESET, &bp->r[chip]->r[CD180_CCR]);
  181. udelay(1);
  182. sti();
  183. id=1000;
  184. while((--id) &&
  185.       (sbus_readb(&bp->r[chip]->r[CD180_GSVR])!=0xff))udelay(100);
  186. if(!id) {
  187. printk(KERN_ERR "aurora%d: Chip %d failed init.n",
  188.        board_No(bp), chip);
  189. restore_flags(flags);
  190. return(-1);
  191. }
  192. cli();
  193. sbus_writeb((board_No(bp)<<5)|((chip+1)<<3),
  194.     &bp->r[chip]->r[CD180_GSVR]); /* Set ID for this chip      */
  195. sbus_writeb(0x80|bp->ACK_MINT,
  196.     &bp->r[chip]->r[CD180_MSMR]); /* Prio for modem intr       */
  197. sbus_writeb(0x80|bp->ACK_TINT,
  198.     &bp->r[chip]->r[CD180_TSMR]); /* Prio for transmitter intr */
  199. sbus_writeb(0x80|bp->ACK_RINT,
  200.     &bp->r[chip]->r[CD180_RSMR]); /* Prio for receiver intr    */
  201. /* Setting up prescaler. We need 4 tick per 1 ms */
  202. sbus_writeb((bp->oscfreq/(1000000/AURORA_TPS)) >> 8,
  203.     &bp->r[chip]->r[CD180_PPRH]);
  204. sbus_writeb((bp->oscfreq/(1000000/AURORA_TPS)) & 0xff,
  205.     &bp->r[chip]->r[CD180_PPRL]);
  206. sbus_writeb(SRCR_AUTOPRI|SRCR_GLOBPRI,
  207.     &bp->r[chip]->r[CD180_SRCR]);
  208. id = sbus_readb(&bp->r[chip]->r[CD180_GFRCR]);
  209. printk(KERN_INFO "aurora%d: Chip %d id %02x: ",
  210.        board_No(bp), chip,id);
  211. if(sbus_readb(&bp->r[chip]->r[CD180_SRCR]) & 128) {
  212. switch (id) {
  213. case 0x82:printk("CL-CD1864 rev An");break;
  214. case 0x83:printk("CL-CD1865 rev An");break;
  215. case 0x84:printk("CL-CD1865 rev Bn");break;
  216. case 0x85:printk("CL-CD1865 rev Cn");break;
  217. default:printk("Unknown.n");
  218. };
  219. } else {
  220. switch (id) {
  221. case 0x81:printk("CL-CD180 rev Bn");break;
  222. case 0x82:printk("CL-CD180 rev Cn");break;
  223. default:printk("Unknown.n");
  224. };
  225. }
  226. restore_flags(flags);
  227. #ifdef AURORA_DEBUG
  228. printk("aurora_init_CD180: endn");
  229. #endif
  230. return 0;
  231. }
  232. static int valid_irq(unsigned char irq)
  233. {
  234. int i;
  235. for(i=0;i<TYPE_1_IRQS;i++)
  236. if (type_1_irq[i]==irq) return 1;
  237. return 0;
  238. }
  239. static void aurora_interrupt(int irq, void * dev_id, struct pt_regs * regs);
  240. /* Main probing routine, also sets irq. */
  241. static int aurora_probe(void)
  242. {
  243. struct sbus_bus *sbus;
  244. struct sbus_dev *sdev;
  245. int grrr;
  246. char buf[30];
  247. int bn = 0;
  248. struct Aurora_board *bp;
  249. for_each_sbus(sbus) {
  250. for_each_sbusdev(sdev, sbus) {
  251. /* printk("Try: %x %sn",sdev,sdev->prom_name);*/
  252. if (!strcmp(sdev->prom_name, "sio16")) {
  253. #ifdef AURORA_DEBUG
  254. printk(KERN_INFO "aurora: sio16 at %pn",sdev);
  255. #endif
  256. if((sdev->reg_addrs[0].reg_size!=1) &&
  257.    (sdev->reg_addrs[1].reg_size!=128) &&
  258.    (sdev->reg_addrs[2].reg_size!=128) &&
  259.    (sdev->reg_addrs[3].reg_size!=4)) {
  260.     printk(KERN_ERR "aurora%d: registers' sizes "
  261.        "do not match.n", bn);
  262.     break;
  263. }
  264. bp = &aurora_board[bn];
  265. bp->r0 = (struct aurora_reg1 *)
  266. sbus_ioremap(&sdev->resource[0], 0,
  267.      sdev->reg_addrs[0].reg_size,
  268.      "sio16");
  269. if (bp->r0 == NULL) {
  270. printk(KERN_ERR "aurora%d: can't map "
  271.        "reg_addrs[0]n", bn);
  272. break;
  273. }
  274. #ifdef AURORA_DEBUG
  275. printk("Map reg 0: %pn", bp->r0);
  276. #endif
  277. bp->r[0] = (struct aurora_reg128 *)
  278. sbus_ioremap(&sdev->resource[1], 0,
  279.      sdev->reg_addrs[1].reg_size,
  280.      "sio16");
  281. if (bp->r[0] == NULL) {
  282. printk(KERN_ERR "aurora%d: can't map "
  283.        "reg_addrs[1]n", bn);
  284. break;
  285. }
  286. #ifdef AURORA_DEBUG
  287. printk("Map reg 1: %pn", bp->r[0]);
  288. #endif
  289. bp->r[1] = (struct aurora_reg128 *)
  290. sbus_ioremap(&sdev->resource[2], 0,
  291.      sdev->reg_addrs[2].reg_size,
  292.      "sio16");
  293. if (bp->r[1] == NULL) {
  294. printk(KERN_ERR "aurora%d: can't map "
  295.        "reg_addrs[2]n", bn);
  296. break;
  297. }
  298. #ifdef AURORA_DEBUG
  299. printk("Map reg 2: %pn", bp->r[1]);
  300. #endif
  301. bp->r3 = (struct aurora_reg4 *)
  302. sbus_ioremap(&sdev->resource[3], 0,
  303.      sdev->reg_addrs[3].reg_size,
  304.      "sio16");
  305. if (bp->r3 == NULL) {
  306. printk(KERN_ERR "aurora%d: can't map "
  307.        "reg_addrs[3]n", bn);
  308. break;
  309. }
  310. #ifdef AURORA_DEBUG
  311. printk("Map reg 3: %pn", bp->r3);
  312. #endif
  313. /* Variables setup */
  314. bp->flags = 0;
  315. #ifdef AURORA_DEBUG
  316. grrr=prom_getint(sdev->prom_node,"intr");
  317. printk("intr pri %dn", grrr);
  318. #endif
  319. if ((bp->irq=irqs[bn]) && valid_irq(bp->irq) &&
  320.     !request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "sio16", bp)) {
  321. free_irq(bp->irq|0x30, bp);
  322. } else
  323. if ((bp->irq=prom_getint(sdev->prom_node, "bintr")) && valid_irq(bp->irq) &&
  324.     !request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "sio16", bp)) {
  325. free_irq(bp->irq|0x30, bp);
  326. } else
  327. if ((bp->irq=prom_getint(sdev->prom_node, "intr")) && valid_irq(bp->irq) &&
  328.     !request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "sio16", bp)) {
  329. free_irq(bp->irq|0x30, bp);
  330. } else
  331. for(grrr=0;grrr<TYPE_1_IRQS;grrr++) {
  332. if ((bp->irq=type_1_irq[grrr])&&!request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "sio16", bp)) {
  333. free_irq(bp->irq|0x30, bp);
  334. break;
  335. } else {
  336. printk(KERN_ERR "aurora%d: Could not get an irq for this board !!!n",bn);
  337. bp->flags=0xff;
  338. }
  339. }
  340. if(bp->flags==0xff)break;
  341. printk(KERN_INFO "aurora%d: irq %dn",bn,bp->irq&0x0f);
  342. buf[0]=0;
  343. grrr=prom_getproperty(sdev->prom_node,"dtr_rts",buf,sizeof(buf));
  344. if(!strcmp(buf,"swapped")){
  345. printk(KERN_INFO "aurora%d: Swapped DTR and RTSn",bn);
  346. bp->DTR=MSVR_RTS;
  347. bp->RTS=MSVR_DTR;
  348. bp->MSVDTR=CD180_MSVRTS;
  349. bp->MSVRTS=CD180_MSVDTR;
  350. bp->flags|=AURORA_BOARD_DTR_FLOW_OK;
  351. }else{
  352. #ifdef AURORA_FORCE_DTR_FLOW
  353. printk(KERN_INFO "aurora%d: Forcing swapped DTR-RTSn",bn);
  354. bp->DTR=MSVR_RTS;
  355. bp->RTS=MSVR_DTR;
  356. bp->MSVDTR=CD180_MSVRTS;
  357. bp->MSVRTS=CD180_MSVDTR;
  358. bp->flags|=AURORA_BOARD_DTR_FLOW_OK;
  359. #else
  360. printk(KERN_INFO "aurora%d: Normal DTR and RTSn",bn);
  361. bp->DTR=MSVR_DTR;
  362. bp->RTS=MSVR_RTS;
  363. bp->MSVDTR=CD180_MSVDTR;
  364. bp->MSVRTS=CD180_MSVRTS;
  365. #endif
  366. }
  367. bp->oscfreq=prom_getint(sdev->prom_node,"clk")*100;
  368. printk(KERN_INFO "aurora%d: Oscillator: %d Hzn",bn,bp->oscfreq);
  369. grrr=prom_getproperty(sdev->prom_node,"chip",buf,sizeof(buf));
  370. printk(KERN_INFO "aurora%d: Chips: %sn",bn,buf);
  371. grrr=prom_getproperty(sdev->prom_node,"manu",buf,sizeof(buf));
  372. printk(KERN_INFO "aurora%d: Manufacturer: %sn",bn,buf);
  373. grrr=prom_getproperty(sdev->prom_node,"model",buf,sizeof(buf));
  374. printk(KERN_INFO "aurora%d: Model: %sn",bn,buf);
  375. grrr=prom_getproperty(sdev->prom_node,"rev",buf,sizeof(buf));
  376. printk(KERN_INFO "aurora%d: Revision: %sn",bn,buf);
  377. grrr=prom_getproperty(sdev->prom_node,"mode",buf,sizeof(buf));
  378. printk(KERN_INFO "aurora%d: Mode: %sn",bn,buf);
  379. #ifdef MODULE
  380. bp->count=0;
  381. #endif
  382. bp->flags = AURORA_BOARD_PRESENT;
  383. /* hardware ack */
  384. bp->ACK_MINT=1;
  385. bp->ACK_TINT=2;
  386. bp->ACK_RINT=3;
  387. bn++;
  388. }
  389. }
  390. }
  391. return bn;
  392. }
  393. static void aurora_release_io_range(struct Aurora_board *bp)
  394. {
  395. sbus_iounmap((unsigned long)bp->r0, 1);
  396. sbus_iounmap((unsigned long)bp->r[0], 128);
  397. sbus_iounmap((unsigned long)bp->r[1], 128);
  398. sbus_iounmap((unsigned long)bp->r3, 4);
  399. }
  400. extern inline void aurora_mark_event(struct Aurora_port * port, int event)
  401. {
  402. #ifdef AURORA_DEBUG
  403. printk("aurora_mark_event: startn");
  404. #endif
  405. set_bit(event, &port->event);
  406. queue_task(&port->tqueue, &tq_aurora);
  407. mark_bh(AURORA_BH);
  408. #ifdef AURORA_DEBUG
  409. printk("aurora_mark_event: endn");
  410. #endif
  411. }
  412. static __inline__ struct Aurora_port * aurora_get_port(struct Aurora_board const * bp,
  413.        int chip,
  414.        unsigned char const *what)
  415. {
  416. unsigned char channel;
  417. struct Aurora_port * port;
  418. channel = ((chip << 3) |
  419.    ((sbus_readb(&bp->r[chip]->r[CD180_GSCR]) & GSCR_CHAN) >> GSCR_CHAN_OFF));
  420. port = &aurora_port[board_No(bp) * AURORA_NPORT * AURORA_NCD180 + channel];
  421. if (port->flags & ASYNC_INITIALIZED)
  422. return port;
  423. printk(KERN_DEBUG "aurora%d: %s interrupt from invalid port %dn",
  424.        board_No(bp), what, channel);
  425. return NULL;
  426. }
  427. static void aurora_receive_exc(struct Aurora_board const * bp, int chip)
  428. {
  429. struct Aurora_port *port;
  430. struct tty_struct *tty;
  431. unsigned char status;
  432. unsigned char ch;
  433. if (!(port = aurora_get_port(bp, chip, "Receive_x")))
  434. return;
  435. tty = port->tty;
  436. if (tty->flip.count >= TTY_FLIPBUF_SIZE)  {
  437. #ifdef AURORA_INTNORM
  438. printk("aurora%d: port %d: Working around flip buffer overflow.n",
  439.        board_No(bp), port_No(port));
  440. #endif
  441. return;
  442. }
  443. #ifdef AURORA_REPORT_OVERRUN
  444. status = sbus_readb(&bp->r[chip]->r[CD180_RCSR]);
  445. if (status & RCSR_OE)  {
  446. port->overrun++;
  447. #if 1
  448. printk("aurora%d: port %d: Overrun. Total %ld overruns.n",
  449.        board_No(bp), port_No(port), port->overrun);
  450. #endif
  451. }
  452. status &= port->mark_mask;
  453. #else
  454. status = sbus_readb(&bp->r[chip]->r[CD180_RCSR]) & port->mark_mask;
  455. #endif
  456. ch = sbus_readb(&bp->r[chip]->r[CD180_RDR]);
  457. if (!status)
  458. return;
  459. if (status & RCSR_TOUT)  {
  460. /* printk("aurora%d: port %d: Receiver timeout. Hardware problems ?n",
  461.        board_No(bp), port_No(port));*/
  462. return;
  463. } else if (status & RCSR_BREAK)  {
  464. printk(KERN_DEBUG "aurora%d: port %d: Handling break...n",
  465.        board_No(bp), port_No(port));
  466. *tty->flip.flag_buf_ptr++ = TTY_BREAK;
  467. if (port->flags & ASYNC_SAK)
  468. do_SAK(tty);
  469. } else if (status & RCSR_PE) 
  470. *tty->flip.flag_buf_ptr++ = TTY_PARITY;
  471. else if (status & RCSR_FE) 
  472. *tty->flip.flag_buf_ptr++ = TTY_FRAME;
  473.         else if (status & RCSR_OE)
  474. *tty->flip.flag_buf_ptr++ = TTY_OVERRUN;
  475. else
  476. *tty->flip.flag_buf_ptr++ = 0;
  477. *tty->flip.char_buf_ptr++ = ch;
  478. tty->flip.count++;
  479. queue_task(&tty->flip.tqueue, &tq_timer);
  480. }
  481. static void aurora_receive(struct Aurora_board const * bp, int chip)
  482. {
  483. struct Aurora_port *port;
  484. struct tty_struct *tty;
  485. unsigned char count,cnt;
  486. if (!(port = aurora_get_port(bp, chip, "Receive")))
  487. return;
  488. tty = port->tty;
  489. count = sbus_readb(&bp->r[chip]->r[CD180_RDCR]);
  490. #ifdef AURORA_REPORT_FIFO
  491. port->hits[count > 8 ? 9 : count]++;
  492. #endif
  493. while (count--)  {
  494. if (tty->flip.count >= TTY_FLIPBUF_SIZE)  {
  495. #ifdef AURORA_INTNORM
  496. printk("aurora%d: port %d: Working around flip buffer overflow.n",
  497.        board_No(bp), port_No(port));
  498. #endif
  499. break;
  500. }
  501. cnt = sbus_readb(&bp->r[chip]->r[CD180_RDR]);
  502. *tty->flip.char_buf_ptr++ = cnt;
  503. *tty->flip.flag_buf_ptr++ = 0;
  504. tty->flip.count++;
  505. }
  506. queue_task(&tty->flip.tqueue, &tq_timer);
  507. }
  508. static void aurora_transmit(struct Aurora_board const * bp, int chip)
  509. {
  510. struct Aurora_port *port;
  511. struct tty_struct *tty;
  512. unsigned char count;
  513. if (!(port = aurora_get_port(bp, chip, "Transmit")))
  514. return;
  515. tty = port->tty;
  516. if (port->SRER & SRER_TXEMPTY)  {
  517. /* FIFO drained */
  518. sbus_writeb(port_No(port) & 7,
  519.     &bp->r[chip]->r[CD180_CAR]);
  520. udelay(1);
  521. port->SRER &= ~SRER_TXEMPTY;
  522. sbus_writeb(port->SRER, &bp->r[chip]->r[CD180_SRER]);
  523. return;
  524. }
  525. if ((port->xmit_cnt <= 0 && !port->break_length)
  526.     || tty->stopped || tty->hw_stopped)  {
  527. sbus_writeb(port_No(port) & 7,
  528.     &bp->r[chip]->r[CD180_CAR]);
  529. udelay(1);
  530. port->SRER &= ~SRER_TXRDY;
  531. sbus_writeb(port->SRER,
  532.     &bp->r[chip]->r[CD180_SRER]);
  533. return;
  534. }
  535. if (port->break_length)  {
  536. if (port->break_length > 0)  {
  537. if (port->COR2 & COR2_ETC)  {
  538. sbus_writeb(CD180_C_ESC,
  539.     &bp->r[chip]->r[CD180_TDR]);
  540. sbus_writeb(CD180_C_SBRK,
  541.     &bp->r[chip]->r[CD180_TDR]);
  542. port->COR2 &= ~COR2_ETC;
  543. }
  544. count = MIN(port->break_length, 0xff);
  545. sbus_writeb(CD180_C_ESC,
  546.     &bp->r[chip]->r[CD180_TDR]);
  547. sbus_writeb(CD180_C_DELAY,
  548.     &bp->r[chip]->r[CD180_TDR]);
  549. sbus_writeb(count,
  550.     &bp->r[chip]->r[CD180_TDR]);
  551. if (!(port->break_length -= count))
  552. port->break_length--;
  553. } else  {
  554. sbus_writeb(CD180_C_ESC,
  555.     &bp->r[chip]->r[CD180_TDR]);
  556. sbus_writeb(CD180_C_EBRK,
  557.     &bp->r[chip]->r[CD180_TDR]);
  558. sbus_writeb(port->COR2,
  559.     &bp->r[chip]->r[CD180_COR2]);
  560. aurora_wait_CCR(bp->r[chip]);
  561. sbus_writeb(CCR_CORCHG2,
  562.     &bp->r[chip]->r[CD180_CCR]);
  563. port->break_length = 0;
  564. }
  565. return;
  566. }
  567. count = CD180_NFIFO;
  568. do {
  569. u8 byte = port->xmit_buf[port->xmit_tail++];
  570. sbus_writeb(byte, &bp->r[chip]->r[CD180_TDR]);
  571. port->xmit_tail = port->xmit_tail & (SERIAL_XMIT_SIZE-1);
  572. if (--port->xmit_cnt <= 0)
  573. break;
  574. } while (--count > 0);
  575. if (port->xmit_cnt <= 0)  {
  576. sbus_writeb(port_No(port) & 7,
  577.     &bp->r[chip]->r[CD180_CAR]);
  578. udelay(1);
  579. port->SRER &= ~SRER_TXRDY;
  580. sbus_writeb(port->SRER,
  581.     &bp->r[chip]->r[CD180_SRER]);
  582. }
  583. if (port->xmit_cnt <= port->wakeup_chars)
  584. aurora_mark_event(port, RS_EVENT_WRITE_WAKEUP);
  585. }
  586. static void aurora_check_modem(struct Aurora_board const * bp, int chip)
  587. {
  588. struct Aurora_port *port;
  589. struct tty_struct *tty;
  590. unsigned char mcr;
  591. if (!(port = aurora_get_port(bp, chip, "Modem")))
  592. return;
  593. tty = port->tty;
  594. mcr = sbus_readb(&bp->r[chip]->r[CD180_MCR]);
  595. if (mcr & MCR_CDCHG)  {
  596. if (sbus_readb(&bp->r[chip]->r[CD180_MSVR]) & MSVR_CD) 
  597. wake_up_interruptible(&port->open_wait);
  598. else if (!((port->flags & ASYNC_CALLOUT_ACTIVE) &&
  599.    (port->flags & ASYNC_CALLOUT_NOHUP))) {
  600. MOD_INC_USE_COUNT;
  601. if (schedule_task(&port->tqueue_hangup) == 0)
  602. MOD_DEC_USE_COUNT;
  603. }
  604. }
  605. /* We don't have such things yet. My aurora board has DTR and RTS swapped, but that doesn't count in this driver. Let's hope
  606.  * Aurora didn't made any boards with CTS or DSR broken...
  607.  */
  608. /* #ifdef AURORA_BRAIN_DAMAGED_CTS
  609. if (mcr & MCR_CTSCHG)  {
  610. if (aurora_in(bp, CD180_MSVR) & MSVR_CTS)  {
  611. tty->hw_stopped = 0;
  612. port->SRER |= SRER_TXRDY;
  613. if (port->xmit_cnt <= port->wakeup_chars)
  614. aurora_mark_event(port, RS_EVENT_WRITE_WAKEUP);
  615. } else  {
  616. tty->hw_stopped = 1;
  617. port->SRER &= ~SRER_TXRDY;
  618. }
  619. sbus_writeb(port->SRER, &bp->r[chip]->r[CD180_SRER]);
  620. }
  621. if (mcr & MCR_DSRCHG)  {
  622. if (aurora_in(bp, CD180_MSVR) & MSVR_DSR)  {
  623. tty->hw_stopped = 0;
  624. port->SRER |= SRER_TXRDY;
  625. if (port->xmit_cnt <= port->wakeup_chars)
  626. aurora_mark_event(port, RS_EVENT_WRITE_WAKEUP);
  627. } else  {
  628. tty->hw_stopped = 1;
  629. port->SRER &= ~SRER_TXRDY;
  630. }
  631. sbus_writeb(port->SRER, &bp->r[chip]->r[CD180_SRER]);
  632. }
  633. #endif AURORA_BRAIN_DAMAGED_CTS */
  634. /* Clear change bits */
  635. sbus_writeb(0, &bp->r[chip]->r[CD180_MCR]);
  636. }
  637. /* The main interrupt processing routine */
  638. static void aurora_interrupt(int irq, void * dev_id, struct pt_regs * regs)
  639. {
  640. unsigned char status;
  641. unsigned char ack,chip/*,chip_id*/;
  642. struct Aurora_board * bp = (struct Aurora_board *) dev_id;
  643. unsigned long loop = 0;
  644. #ifdef AURORA_INT_DEBUG
  645. printk("IRQ%d %dn",irq,++irqhit);
  646. #ifdef AURORA_FLOODPRO
  647. if (irqhit>=AURORA_FLOODPRO)
  648. sbus_writeb(8, &bp->r0->r);
  649. #endif
  650. #endif
  651. /* old bp = IRQ_to_board[irq&0x0f];*/
  652. if (!bp || !(bp->flags & AURORA_BOARD_ACTIVE))
  653. return;
  654. /* The while() below takes care of this.
  655. status = sbus_readb(&bp->r[0]->r[CD180_SRSR]);
  656. #ifdef AURORA_INT_DEBUG
  657. printk("mumu: %02xn", status);
  658. #endif
  659. if (!(status&SRSR_ANYINT))
  660. return; * Nobody has anything to say, so exit *
  661. */
  662. while ((loop++ < 48) &&
  663.        (status = sbus_readb(&bp->r[0]->r[CD180_SRSR]) & SRSR_ANYINT)){
  664. #ifdef AURORA_INT_DEBUG
  665. printk("SRSR: %02xn", status);
  666. #endif
  667. if (status & SRSR_REXT) {
  668. ack = sbus_readb(&bp->r3->r[bp->ACK_RINT]);
  669. #ifdef AURORA_INT_DEBUG
  670. printk("R-ACK %02xn", ack);
  671. #endif
  672. if ((ack >> 5) == board_No(bp)) {
  673. if ((chip=((ack>>3)&3)-1) < AURORA_NCD180) {
  674. if ((ack&GSVR_ITMASK)==GSVR_IT_RGD) {
  675. aurora_receive(bp,chip);
  676. sbus_writeb(0,
  677.  &bp->r[chip]->r[CD180_EOSRR]);
  678. } else if ((ack & GSVR_ITMASK) == GSVR_IT_REXC) {
  679. aurora_receive_exc(bp,chip);
  680. sbus_writeb(0,
  681.  &bp->r[chip]->r[CD180_EOSRR]);
  682. }
  683. }
  684. }
  685. } else if (status & SRSR_TEXT) {
  686. ack = sbus_readb(&bp->r3->r[bp->ACK_TINT]);
  687. #ifdef AURORA_INT_DEBUG
  688. printk("T-ACK %02xn", ack);
  689. #endif
  690. if ((ack >> 5) == board_No(bp)) {
  691. if ((chip=((ack>>3)&3)-1) < AURORA_NCD180) {
  692. if ((ack&GSVR_ITMASK)==GSVR_IT_TX) {
  693. aurora_transmit(bp,chip);
  694. sbus_writeb(0,
  695.  &bp->r[chip]->r[CD180_EOSRR]);
  696. }
  697. }
  698. }
  699. } else if (status & SRSR_MEXT) {
  700. ack = sbus_readb(&bp->r3->r[bp->ACK_MINT]);
  701. #ifdef AURORA_INT_DEBUG
  702. printk("M-ACK %02xn", ack);
  703. #endif
  704. if ((ack >> 5) == board_No(bp)) {
  705. if ((chip = ((ack>>3)&3)-1) < AURORA_NCD180) {
  706. if ((ack&GSVR_ITMASK)==GSVR_IT_MDM) {
  707. aurora_check_modem(bp,chip);
  708. sbus_writeb(0,
  709.  &bp->r[chip]->r[CD180_EOSRR]);
  710. }
  711. }
  712. }
  713. }
  714. }
  715. /* I guess this faster code can be used with CD1865, using AUROPRI and GLOBPRI. */
  716. #if 0
  717. while ((loop++ < 48)&&(status=bp->r[0]->r[CD180_SRSR]&SRSR_ANYINT)){
  718. #ifdef AURORA_INT_DEBUG
  719. printk("SRSR: %02xn",status);
  720. #endif
  721. ack = sbus_readb(&bp->r3->r[0]);
  722. #ifdef AURORA_INT_DEBUG
  723. printk("ACK: %02xn",ack);
  724. #endif
  725. if ((ack>>5)==board_No(bp)) {
  726. if ((chip=((ack>>3)&3)-1) < AURORA_NCD180) {
  727. ack&=GSVR_ITMASK;
  728. if (ack==GSVR_IT_RGD) {
  729. aurora_receive(bp,chip);
  730. sbus_writeb(0,
  731.     &bp->r[chip]->r[CD180_EOSRR]);
  732. } else if (ack==GSVR_IT_REXC) {
  733. aurora_receive_exc(bp,chip);
  734. sbus_writeb(0,
  735.     &bp->r[chip]->r[CD180_EOSRR]);
  736. } else if (ack==GSVR_IT_TX) {
  737. aurora_transmit(bp,chip);
  738. sbus_writeb(0,
  739.     &bp->r[chip]->r[CD180_EOSRR]);
  740. } else if (ack==GSVR_IT_MDM) {
  741. aurora_check_modem(bp,chip);
  742. sbus_writeb(0,
  743.     &bp->r[chip]->r[CD180_EOSRR]);
  744. }
  745. }
  746. }
  747. }
  748. #endif
  749. /* This is the old handling routine, used in riscom8 for only one CD180. I keep it here for reference. */
  750. #if 0
  751. for(chip=0;chip<AURORA_NCD180;chip++){
  752. chip_id=(board_No(bp)<<5)|((chip+1)<<3);
  753. loop=0;
  754. while ((loop++ < 1) &&
  755.        ((status = sbus_readb(&bp->r[chip]->r[CD180_SRSR])) &
  756. (SRSR_TEXT | SRSR_MEXT | SRSR_REXT))) {
  757. if (status & SRSR_REXT) {
  758. ack = sbus_readb(&bp->r3->r[bp->ACK_RINT]);
  759. if (ack == (chip_id | GSVR_IT_RGD)) {
  760. #ifdef AURORA_INTMSG
  761. printk("RX ACKn");
  762. #endif
  763. aurora_receive(bp,chip);
  764. } else if (ack == (chip_id | GSVR_IT_REXC)) {
  765. #ifdef AURORA_INTMSG
  766. printk("RXC ACKn");
  767. #endif
  768. aurora_receive_exc(bp,chip);
  769. } else {
  770. #ifdef AURORA_INTNORM
  771. printk("aurora%d-%d: Bad receive ack 0x%02x.n",
  772.        board_No(bp), chip, ack);
  773. #endif
  774. }
  775. } else if (status & SRSR_TEXT) {
  776. ack = sbus_readb(&bp->r3->r[bp->ACK_TINT]);
  777. if (ack == (chip_id | GSVR_IT_TX)){
  778. #ifdef AURORA_INTMSG
  779. printk("TX ACKn");
  780. #endif
  781. aurora_transmit(bp,chip);
  782. } else {
  783. #ifdef AURORA_INTNORM
  784. printk("aurora%d-%d: Bad transmit ack 0x%02x.n",
  785.        board_No(bp), chip, ack);
  786. #endif
  787. }
  788. } else  if (status & SRSR_MEXT)  {
  789. ack = sbus_readb(&bp->r3->r[bp->ACK_MINT]);
  790. if (ack == (chip_id | GSVR_IT_MDM)){
  791. #ifdef AURORA_INTMSG
  792. printk("MDM ACKn");
  793. #endif
  794. aurora_check_modem(bp,chip);
  795. } else {
  796. #ifdef AURORA_INTNORM
  797. printk("aurora%d-%d: Bad modem ack 0x%02x.n",
  798.        board_No(bp), chip, ack);
  799. #endif
  800. }
  801. }
  802. sbus_writeb(0, &bp->r[chip]->r[CD180_EOSRR]);
  803. }
  804. }
  805. #endif
  806. }
  807. #ifdef AURORA_INT_DEBUG
  808. static void aurora_timer (unsigned long ignored);
  809. static struct timer_list
  810. aurora_poll_timer = { NULL, NULL, 0, 0, aurora_timer };
  811. static void
  812. aurora_timer (unsigned long ignored)
  813. {
  814. unsigned long flags;
  815. int i;
  816. save_flags(flags); cli();
  817. printk("SRSR: %02x,%02x - ",
  818.        sbus_readb(&aurora_board[0].r[0]->r[CD180_SRSR]),
  819.        sbus_readb(&aurora_board[0].r[1]->r[CD180_SRSR]));
  820. for (i = 0; i < 4; i++) {
  821. udelay(1);
  822. printk("%02x ",
  823.        sbus_readb(&aurora_board[0].r3->r[i]));
  824. }
  825. printk("n");
  826. aurora_poll_timer.expires = jiffies + 300;
  827. add_timer (&aurora_poll_timer);
  828. restore_flags(flags);
  829. }
  830. #endif
  831. /*
  832.  *  Routines for open & close processing.
  833.  */
  834. /* Called with disabled interrupts */
  835. static int aurora_setup_board(struct Aurora_board * bp)
  836. {
  837. int error;
  838. #ifdef AURORA_ALLIRQ
  839. int i;
  840. for (i = 0; i < AURORA_ALLIRQ; i++) {
  841. error = request_irq(allirq[i]|0x30, aurora_interrupt, SA_SHIRQ,
  842.     "sio16", bp);
  843. if (error)
  844. printk(KERN_ERR "IRQ%d request error %dn",
  845.        allirq[i], error);
  846. }
  847. #else
  848. error = request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ,
  849.     "sio16", bp);
  850. if (error) {
  851. printk(KERN_ERR "IRQ request error %dn", error);
  852. return error;
  853. }
  854. #endif
  855. /* Board reset */
  856. sbus_writeb(0, &bp->r0->r);
  857. udelay(1);
  858. if (bp->flags & AURORA_BOARD_TYPE_2) {
  859. /* unknown yet */
  860. } else {
  861. sbus_writeb((AURORA_CFG_ENABLE_IO | AURORA_CFG_ENABLE_IRQ |
  862.      (((bp->irq)&0x0f)>>2)),
  863.     &bp->r0->r);
  864. }
  865. udelay(10000);
  866. if (aurora_init_CD180(bp,0))error=1;error=0;
  867. if (aurora_init_CD180(bp,1))error++;
  868. if (error == AURORA_NCD180) {
  869. printk(KERN_ERR "Both chips failed initialisation.n");
  870. return -EIO;
  871. }
  872. #ifdef AURORA_INT_DEBUG
  873. aurora_poll_timer.expires= jiffies + 1;
  874. add_timer(&aurora_poll_timer);
  875. #endif
  876. #ifdef AURORA_DEBUG
  877. printk("aurora_setup_board: endn");
  878. #endif
  879. return 0;
  880. }
  881. /* Called with disabled interrupts */
  882. static void aurora_shutdown_board(struct Aurora_board *bp)
  883. {
  884. int i;
  885. #ifdef AURORA_DEBUG
  886. printk("aurora_shutdown_board: startn");
  887. #endif
  888. #ifdef AURORA_INT_DEBUG
  889. del_timer(&aurora_poll_timer);
  890. #endif
  891. #ifdef AURORA_ALLIRQ
  892. for(i=0;i<AURORA_ALLIRQ;i++){
  893. free_irq(allirq[i]|0x30, bp);
  894. /* IRQ_to_board[allirq[i]&0xf] = NULL;*/
  895. }
  896. #else
  897. free_irq(bp->irq|0x30, bp);
  898. /* IRQ_to_board[bp->irq&0xf] = NULL;*/
  899. #endif
  900. /* Drop all DTR's */
  901. for(i=0;i<16;i++){
  902. sbus_writeb(i & 7, &bp->r[i>>3]->r[CD180_CAR]);
  903. udelay(1);
  904. sbus_writeb(0, &bp->r[i>>3]->r[CD180_MSVR]);
  905. udelay(1);
  906. }
  907. /* Board shutdown */
  908. sbus_writeb(0, &bp->r0->r);
  909. #ifdef AURORA_DEBUG
  910. printk("aurora_shutdown_board: endn");
  911. #endif
  912. }
  913. /* Setting up port characteristics. 
  914.  * Must be called with disabled interrupts
  915.  */
  916. static void aurora_change_speed(struct Aurora_board *bp, struct Aurora_port *port)
  917. {
  918. struct tty_struct *tty;
  919. unsigned long baud;
  920. long tmp;
  921. unsigned char cor1 = 0, cor3 = 0;
  922. unsigned char mcor1 = 0, mcor2 = 0,chip;
  923. #ifdef AURORA_DEBUG
  924. printk("aurora_change_speed: startn");
  925. #endif
  926. if (!(tty = port->tty) || !tty->termios)
  927. return;
  928. chip = AURORA_CD180(port_No(port));
  929. port->SRER  = 0;
  930. port->COR2 = 0;
  931. port->MSVR = MSVR_RTS|MSVR_DTR;
  932. baud = tty_get_baud_rate(tty);
  933. /* Select port on the board */
  934. sbus_writeb(port_No(port) & 7,
  935.     &bp->r[chip]->r[CD180_CAR]);
  936. udelay(1);
  937. if (!baud)  {
  938. /* Drop DTR & exit */
  939. port->MSVR &= ~(bp->DTR|bp->RTS);
  940. sbus_writeb(port->MSVR,
  941.     &bp->r[chip]->r[CD180_MSVR]);
  942. return;
  943. } else  {
  944. /* Set DTR on */
  945. port->MSVR |= bp->DTR;
  946. sbus_writeb(port->MSVR,
  947.     &bp->r[chip]->r[CD180_MSVR]);
  948. }
  949. /* Now we must calculate some speed dependant things. */
  950. /* Set baud rate for port. */
  951. tmp = (((bp->oscfreq + baud/2) / baud +
  952. CD180_TPC/2) / CD180_TPC);
  953. /* tmp = (bp->oscfreq/7)/baud;
  954. if((tmp%10)>4)tmp=tmp/10+1;else tmp=tmp/10;*/
  955. /* printk("Prescaler period: %dn",tmp);*/
  956. sbus_writeb((tmp >> 8) & 0xff,
  957.     &bp->r[chip]->r[CD180_RBPRH]);
  958. sbus_writeb((tmp >> 8) & 0xff,
  959.     &bp->r[chip]->r[CD180_TBPRH]);
  960. sbus_writeb(tmp & 0xff, &bp->r[chip]->r[CD180_RBPRL]);
  961. sbus_writeb(tmp & 0xff, &bp->r[chip]->r[CD180_TBPRL]);
  962. baud = (baud + 5) / 10;   /* Estimated CPS */
  963. /* Two timer ticks seems enough to wakeup something like SLIP driver */
  964. tmp = ((baud + HZ/2) / HZ) * 2 - CD180_NFIFO;
  965. port->wakeup_chars = (tmp < 0) ? 0 : ((tmp >= SERIAL_XMIT_SIZE) ?
  966.       SERIAL_XMIT_SIZE - 1 : tmp);
  967. /* Receiver timeout will be transmission time for 1.5 chars */
  968. tmp = (AURORA_TPS + AURORA_TPS/2 + baud/2) / baud;
  969. tmp = (tmp > 0xff) ? 0xff : tmp;
  970. sbus_writeb(tmp, &bp->r[chip]->r[CD180_RTPR]);
  971. switch (C_CSIZE(tty))  {
  972.  case CS5:
  973. cor1 |= COR1_5BITS;
  974. break;
  975.  case CS6:
  976. cor1 |= COR1_6BITS;
  977. break;
  978.  case CS7:
  979. cor1 |= COR1_7BITS;
  980. break;
  981.  case CS8:
  982. cor1 |= COR1_8BITS;
  983. break;
  984. }
  985. if (C_CSTOPB(tty)) 
  986. cor1 |= COR1_2SB;
  987. cor1 |= COR1_IGNORE;
  988. if (C_PARENB(tty))  {
  989. cor1 |= COR1_NORMPAR;
  990. if (C_PARODD(tty)) 
  991. cor1 |= COR1_ODDP;
  992. if (I_INPCK(tty)) 
  993. cor1 &= ~COR1_IGNORE;
  994. }
  995. /* Set marking of some errors */
  996. port->mark_mask = RCSR_OE | RCSR_TOUT;
  997. if (I_INPCK(tty)) 
  998. port->mark_mask |= RCSR_FE | RCSR_PE;
  999. if (I_BRKINT(tty) || I_PARMRK(tty)) 
  1000. port->mark_mask |= RCSR_BREAK;
  1001. if (I_IGNPAR(tty)) 
  1002. port->mark_mask &= ~(RCSR_FE | RCSR_PE);
  1003. if (I_IGNBRK(tty))  {
  1004. port->mark_mask &= ~RCSR_BREAK;
  1005. if (I_IGNPAR(tty)) 
  1006. /* Real raw mode. Ignore all */
  1007. port->mark_mask &= ~RCSR_OE;
  1008. }
  1009. /* Enable Hardware Flow Control */
  1010. if (C_CRTSCTS(tty))  {
  1011. /*#ifdef AURORA_BRAIN_DAMAGED_CTS
  1012. port->SRER |= SRER_DSR | SRER_CTS;
  1013. mcor1 |= MCOR1_DSRZD | MCOR1_CTSZD;
  1014. mcor2 |= MCOR2_DSROD | MCOR2_CTSOD;
  1015. tty->hw_stopped = !(aurora_in(bp, CD180_MSVR) & (MSVR_CTS|MSVR_DSR));
  1016. #else*/
  1017. port->COR2 |= COR2_CTSAE;
  1018. /*#endif*/
  1019. if (bp->flags&AURORA_BOARD_DTR_FLOW_OK) {
  1020. mcor1 |= AURORA_RXTH;
  1021. }
  1022. }
  1023. /* Enable Software Flow Control. FIXME: I'm not sure about this */
  1024. /* Some people reported that it works, but I still doubt */
  1025. if (I_IXON(tty))  {
  1026. port->COR2 |= COR2_TXIBE;
  1027. cor3 |= (COR3_FCT | COR3_SCDE);
  1028. if (I_IXANY(tty))
  1029. port->COR2 |= COR2_IXM;
  1030. sbus_writeb(START_CHAR(tty),
  1031.     &bp->r[chip]->r[CD180_SCHR1]);
  1032. sbus_writeb(STOP_CHAR(tty),
  1033.     &bp->r[chip]->r[CD180_SCHR2]);
  1034. sbus_writeb(START_CHAR(tty),
  1035.     &bp->r[chip]->r[CD180_SCHR3]);
  1036. sbus_writeb(STOP_CHAR(tty),
  1037.     &bp->r[chip]->r[CD180_SCHR4]);
  1038. }
  1039. if (!C_CLOCAL(tty))  {
  1040. /* Enable CD check */
  1041. port->SRER |= SRER_CD;
  1042. mcor1 |= MCOR1_CDZD;
  1043. mcor2 |= MCOR2_CDOD;
  1044. }
  1045. if (C_CREAD(tty)) 
  1046. /* Enable receiver */
  1047. port->SRER |= SRER_RXD;
  1048. /* Set input FIFO size (1-8 bytes) */
  1049. cor3 |= AURORA_RXFIFO; 
  1050. /* Setting up CD180 channel registers */
  1051. sbus_writeb(cor1, &bp->r[chip]->r[CD180_COR1]);
  1052. sbus_writeb(port->COR2, &bp->r[chip]->r[CD180_COR2]);
  1053. sbus_writeb(cor3, &bp->r[chip]->r[CD180_COR3]);
  1054. /* Make CD180 know about registers change */
  1055. aurora_wait_CCR(bp->r[chip]);
  1056. sbus_writeb(CCR_CORCHG1 | CCR_CORCHG2 | CCR_CORCHG3,
  1057.     &bp->r[chip]->r[CD180_CCR]);
  1058. /* Setting up modem option registers */
  1059. sbus_writeb(mcor1, &bp->r[chip]->r[CD180_MCOR1]);
  1060. sbus_writeb(mcor2, &bp->r[chip]->r[CD180_MCOR2]);
  1061. /* Enable CD180 transmitter & receiver */
  1062. aurora_wait_CCR(bp->r[chip]);
  1063. sbus_writeb(CCR_TXEN | CCR_RXEN, &bp->r[chip]->r[CD180_CCR]);
  1064. /* Enable interrupts */
  1065. sbus_writeb(port->SRER, &bp->r[chip]->r[CD180_SRER]);
  1066. /* And finally set RTS on */
  1067. sbus_writeb(port->MSVR, &bp->r[chip]->r[CD180_MSVR]);
  1068. #ifdef AURORA_DEBUG
  1069. printk("aurora_change_speed: endn");
  1070. #endif
  1071. }
  1072. /* Must be called with interrupts enabled */
  1073. static int aurora_setup_port(struct Aurora_board *bp, struct Aurora_port *port)
  1074. {
  1075. unsigned long flags;
  1076. #ifdef AURORA_DEBUG
  1077. printk("aurora_setup_port: start %dn",port_No(port));
  1078. #endif
  1079. if (port->flags & ASYNC_INITIALIZED)
  1080. return 0;
  1081. if (!port->xmit_buf) {
  1082. /* We may sleep in get_free_page() */
  1083. unsigned long tmp;
  1084. if (!(tmp = get_free_page(GFP_KERNEL)))
  1085. return -ENOMEM;
  1086.     
  1087. if (port->xmit_buf) {
  1088. free_page(tmp);
  1089. return -ERESTARTSYS;
  1090. }
  1091. port->xmit_buf = (unsigned char *) tmp;
  1092. }
  1093. save_flags(flags); cli();
  1094. if (port->tty) 
  1095. clear_bit(TTY_IO_ERROR, &port->tty->flags);
  1096. #ifdef MODULE
  1097. if (port->count == 1) {
  1098. MOD_INC_USE_COUNT;
  1099. if((++bp->count) == 1)
  1100. bp->flags |= AURORA_BOARD_ACTIVE;
  1101. }
  1102. #endif
  1103. port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
  1104. aurora_change_speed(bp, port);
  1105. port->flags |= ASYNC_INITIALIZED;
  1106. restore_flags(flags);
  1107. #ifdef AURORA_DEBUG
  1108. printk("aurora_setup_port: endn");
  1109. #endif
  1110. return 0;
  1111. }
  1112. /* Must be called with interrupts disabled */
  1113. static void aurora_shutdown_port(struct Aurora_board *bp, struct Aurora_port *port)
  1114. {
  1115. struct tty_struct *tty;
  1116. unsigned char chip;
  1117. #ifdef AURORA_DEBUG
  1118. printk("aurora_shutdown_port: startn");
  1119. #endif
  1120. if (!(port->flags & ASYNC_INITIALIZED)) 
  1121. return;
  1122. chip = AURORA_CD180(port_No(port));
  1123. #ifdef AURORA_REPORT_OVERRUN
  1124. printk("aurora%d: port %d: Total %ld overruns were detected.n",
  1125.        board_No(bp), port_No(port), port->overrun);
  1126. #endif
  1127. #ifdef AURORA_REPORT_FIFO
  1128. {
  1129. int i;
  1130. printk("aurora%d: port %d: FIFO hits [ ",
  1131.        board_No(bp), port_No(port));
  1132. for (i = 0; i < 10; i++)  {
  1133. printk("%ld ", port->hits[i]);
  1134. }
  1135. printk("].n");
  1136. }
  1137. #endif
  1138. if (port->xmit_buf)  {
  1139. free_page((unsigned long) port->xmit_buf);
  1140. port->xmit_buf = NULL;
  1141. }
  1142. if (!(tty = port->tty) || C_HUPCL(tty))  {
  1143. /* Drop DTR */
  1144. port->MSVR &= ~(bp->DTR|bp->RTS);
  1145. sbus_writeb(port->MSVR,
  1146.     &bp->r[chip]->r[CD180_MSVR]);
  1147. }
  1148.         /* Select port */
  1149. sbus_writeb(port_No(port) & 7,
  1150.     &bp->r[chip]->r[CD180_CAR]);
  1151. udelay(1);
  1152. /* Reset port */
  1153. aurora_wait_CCR(bp->r[chip]);
  1154. sbus_writeb(CCR_SOFTRESET, &bp->r[chip]->r[CD180_CCR]);
  1155. /* Disable all interrupts from this port */
  1156. port->SRER = 0;
  1157. sbus_writeb(port->SRER, &bp->r[chip]->r[CD180_SRER]);
  1158. if (tty)  
  1159. set_bit(TTY_IO_ERROR, &tty->flags);
  1160. port->flags &= ~ASYNC_INITIALIZED;
  1161. #ifdef MODULE
  1162. if (--bp->count < 0)  {
  1163. printk(KERN_DEBUG "aurora%d: aurora_shutdown_port: "
  1164.        "bad board count: %dn",
  1165.        board_No(bp), bp->count);
  1166. bp->count = 0;
  1167. }
  1168. MOD_DEC_USE_COUNT;
  1169. if (!bp->count)
  1170. bp->flags &= ~AURORA_BOARD_ACTIVE;
  1171. #endif
  1172. #ifdef AURORA_DEBUG
  1173. printk("aurora_shutdown_port: endn");
  1174. #endif
  1175. }
  1176. static int block_til_ready(struct tty_struct *tty, struct file * filp,
  1177.    struct Aurora_port *port)
  1178. {
  1179. DECLARE_WAITQUEUE(wait, current);
  1180. struct Aurora_board *bp = port_Board(port);
  1181. int    retval;
  1182. int    do_clocal = 0;
  1183. int    CD;
  1184. unsigned char chip;
  1185. #ifdef AURORA_DEBUG
  1186. printk("block_til_ready: startn");
  1187. #endif
  1188. chip = AURORA_CD180(port_No(port));
  1189. /* If the device is in the middle of being closed, then block
  1190.  * until it's done, and then try again.
  1191.  */
  1192. if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) {
  1193. interruptible_sleep_on(&port->close_wait);
  1194. if (port->flags & ASYNC_HUP_NOTIFY)
  1195. return -EAGAIN;
  1196. else
  1197. return -ERESTARTSYS;
  1198. }
  1199. /* If non-blocking mode is set, or the port is not enabled,
  1200.  * then make the check up front and then exit.
  1201.  */
  1202. if ((filp->f_flags & O_NONBLOCK) ||
  1203.     (tty->flags & (1 << TTY_IO_ERROR))) {
  1204. if (port->flags & ASYNC_CALLOUT_ACTIVE)
  1205. return -EBUSY;
  1206. port->flags |= ASYNC_NORMAL_ACTIVE;
  1207. return 0;
  1208. }
  1209. if (port->flags & ASYNC_CALLOUT_ACTIVE) {
  1210. if (port->normal_termios.c_cflag & CLOCAL) 
  1211. do_clocal = 1;
  1212. } else {
  1213. if (C_CLOCAL(tty))  
  1214. do_clocal = 1;
  1215. }
  1216. /* Block waiting for the carrier detect and the line to become
  1217.  * free (i.e., not in use by the callout).  While we are in
  1218.  * this loop, info->count is dropped by one, so that
  1219.  * rs_close() knows when to free things.  We restore it upon
  1220.  * exit, either normal or abnormal.
  1221.  */
  1222. retval = 0;
  1223. add_wait_queue(&port->open_wait, &wait);
  1224. cli();
  1225. if (!tty_hung_up_p(filp))
  1226. port->count--;
  1227. sti();
  1228. port->blocked_open++;
  1229. while (1) {
  1230. cli();
  1231. sbus_writeb(port_No(port) & 7,
  1232.     &bp->r[chip]->r[CD180_CAR]);
  1233. udelay(1);
  1234. CD = sbus_readb(&bp->r[chip]->r[CD180_MSVR]) & MSVR_CD;
  1235. if (!(port->flags & ASYNC_CALLOUT_ACTIVE))  {
  1236. port->MSVR=bp->RTS;
  1237. /* auto drops DTR */
  1238. sbus_writeb(port->MSVR,
  1239.     &bp->r[chip]->r[CD180_MSVR]);
  1240. }
  1241. sti();
  1242. set_current_state(TASK_INTERRUPTIBLE);
  1243. if (tty_hung_up_p(filp) ||
  1244.     !(port->flags & ASYNC_INITIALIZED)) {
  1245. if (port->flags & ASYNC_HUP_NOTIFY)
  1246. retval = -EAGAIN;
  1247. else
  1248. retval = -ERESTARTSYS;
  1249. break;
  1250. }
  1251. if (/*!(port->flags & ASYNC_CALLOUT_ACTIVE) &&*/
  1252.     !(port->flags & ASYNC_CLOSING) &&
  1253.     (do_clocal || CD))
  1254. break;
  1255. if (signal_pending(current)) {
  1256. retval = -ERESTARTSYS;
  1257. break;
  1258. }
  1259. schedule();
  1260. }
  1261. current->state = TASK_RUNNING;
  1262. remove_wait_queue(&port->open_wait, &wait);
  1263. if (!tty_hung_up_p(filp))
  1264. port->count++;
  1265. port->blocked_open--;
  1266. if (retval)
  1267. return retval;
  1268. port->flags |= ASYNC_NORMAL_ACTIVE;
  1269. #ifdef AURORA_DEBUG
  1270. printk("block_til_ready: endn");
  1271. #endif
  1272. return 0;
  1273. }
  1274. static int aurora_open(struct tty_struct * tty, struct file * filp)
  1275. {
  1276. int board;
  1277. int error;
  1278. struct Aurora_port * port;
  1279. struct Aurora_board * bp;
  1280. unsigned long flags;
  1281. #ifdef AURORA_DEBUG
  1282. printk("aurora_open: startn");
  1283. #endif
  1284. board = AURORA_BOARD(MINOR(tty->device));
  1285. if (board > AURORA_NBOARD ||
  1286.     !(aurora_board[board].flags & AURORA_BOARD_PRESENT)) {
  1287. #ifdef AURORA_DEBUG
  1288. printk("aurora_open: error board %d present %dn",
  1289.        board, aurora_board[board].flags & AURORA_BOARD_PRESENT);
  1290. #endif
  1291. return -ENODEV;
  1292. }
  1293. bp = &aurora_board[board];
  1294. port = aurora_port + board * AURORA_NPORT * AURORA_NCD180 + AURORA_PORT(MINOR(tty->device));
  1295. if (aurora_paranoia_check(port, tty->device, "aurora_open")) {
  1296. #ifdef AURORA_DEBUG
  1297. printk("aurora_open: error paranoia checkn");
  1298. #endif
  1299. return -ENODEV;
  1300. }
  1301. port->count++;
  1302. tty->driver_data = port;
  1303. port->tty = tty;
  1304. if ((error = aurora_setup_port(bp, port))) {
  1305. #ifdef AURORA_DEBUG
  1306. printk("aurora_open: error aurora_setup_port ret %dn",error);
  1307. #endif
  1308. return error;
  1309. }
  1310. if ((error = block_til_ready(tty, filp, port))) {
  1311. #ifdef AURORA_DEBUG
  1312. printk("aurora_open: error block_til_ready ret %dn",error);
  1313. #endif
  1314. return error;
  1315. }
  1316. if ((port->count == 1) && (port->flags & ASYNC_SPLIT_TERMIOS)) {
  1317. *tty->termios = port->normal_termios;
  1318. save_flags(flags); cli();
  1319. aurora_change_speed(bp, port);
  1320. restore_flags(flags);
  1321. }
  1322. port->session = current->session;
  1323. port->pgrp = current->pgrp;
  1324. #ifdef AURORA_DEBUG
  1325. printk("aurora_open: endn");
  1326. #endif
  1327. return 0;
  1328. }
  1329. static void aurora_close(struct tty_struct * tty, struct file * filp)
  1330. {
  1331. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1332. struct Aurora_board *bp;
  1333. unsigned long flags;
  1334. unsigned long timeout;
  1335. unsigned char chip;
  1336. #ifdef AURORA_DEBUG
  1337. printk("aurora_close: startn");
  1338. #endif
  1339. if (!port || aurora_paranoia_check(port, tty->device, "close"))
  1340. return;
  1341. chip = AURORA_CD180(port_No(port));
  1342. save_flags(flags); cli();
  1343. if (tty_hung_up_p(filp))  {
  1344. restore_flags(flags);
  1345. return;
  1346. }
  1347. bp = port_Board(port);
  1348. if ((tty->count == 1) && (port->count != 1))  {
  1349. printk(KERN_DEBUG "aurora%d: aurora_close: bad port count; "
  1350.        "tty->count is 1, port count is %dn",
  1351.        board_No(bp), port->count);
  1352. port->count = 1;
  1353. }
  1354. if (--port->count < 0)  {
  1355. printk(KERN_DEBUG "aurora%d: aurora_close: bad port "
  1356.        "count for tty%d: %dn",
  1357.        board_No(bp), port_No(port), port->count);
  1358. port->count = 0;
  1359. }
  1360. if (port->count)  {
  1361. restore_flags(flags);
  1362. return;
  1363. }
  1364. port->flags |= ASYNC_CLOSING;
  1365. /* Save the termios structure, since this port may have
  1366.  * separate termios for callout and dialin.
  1367.  */
  1368. if (port->flags & ASYNC_NORMAL_ACTIVE)
  1369. port->normal_termios = *tty->termios;
  1370. /* if (port->flags & ASYNC_CALLOUT_ACTIVE)
  1371. port->callout_termios = *tty->termios;*/
  1372. /* Now we wait for the transmit buffer to clear; and we notify 
  1373.  * the line discipline to only process XON/XOFF characters.
  1374.  */
  1375. tty->closing = 1;
  1376. if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE){
  1377. #ifdef AURORA_DEBUG
  1378. printk("aurora_close: waiting to flush...n");
  1379. #endif
  1380. tty_wait_until_sent(tty, port->closing_wait);
  1381. }
  1382. /* At this point we stop accepting input.  To do this, we
  1383.  * disable the receive line status interrupts, and tell the
  1384.  * interrupt driver to stop checking the data ready bit in the
  1385.  * line status register.
  1386.  */
  1387. port->SRER &= ~SRER_RXD;
  1388. if (port->flags & ASYNC_INITIALIZED) {
  1389. port->SRER &= ~SRER_TXRDY;
  1390. port->SRER |= SRER_TXEMPTY;
  1391. sbus_writeb(port_No(port) & 7,
  1392.     &bp->r[chip]->r[CD180_CAR]);
  1393. udelay(1);
  1394. sbus_writeb(port->SRER, &bp->r[chip]->r[CD180_SRER]);
  1395. /*
  1396.  * Before we drop DTR, make sure the UART transmitter
  1397.  * has completely drained; this is especially
  1398.  * important if there is a transmit FIFO!
  1399.  */
  1400. timeout = jiffies+HZ;
  1401. while(port->SRER & SRER_TXEMPTY)  {
  1402. current->state = TASK_INTERRUPTIBLE;
  1403. schedule_timeout(port->timeout);
  1404. if (time_after(jiffies, timeout))
  1405. break;
  1406. }
  1407. }
  1408. #ifdef AURORA_DEBUG
  1409. printk("aurora_close: shutdown_portn");
  1410. #endif
  1411. aurora_shutdown_port(bp, port);
  1412. if (tty->driver.flush_buffer)
  1413. tty->driver.flush_buffer(tty);
  1414. if (tty->ldisc.flush_buffer)
  1415. tty->ldisc.flush_buffer(tty);
  1416. tty->closing = 0;
  1417. port->event = 0;
  1418. port->tty = 0;
  1419. if (port->blocked_open) {
  1420. if (port->close_delay) {
  1421. current->state = TASK_INTERRUPTIBLE;
  1422. schedule_timeout(port->close_delay);
  1423. }
  1424. wake_up_interruptible(&port->open_wait);
  1425. }
  1426. port->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE|
  1427.  ASYNC_CLOSING);
  1428. wake_up_interruptible(&port->close_wait);
  1429. restore_flags(flags);
  1430. #ifdef AURORA_DEBUG
  1431. printk("aurora_close: endn");
  1432. #endif
  1433. }
  1434. static int aurora_write(struct tty_struct * tty, int from_user, 
  1435. const unsigned char *buf, int count)
  1436. {
  1437. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1438. struct Aurora_board *bp;
  1439. int c, total = 0;
  1440. unsigned long flags;
  1441. unsigned char chip;
  1442. #ifdef AURORA_DEBUG
  1443. printk("aurora_write: start %dn",count);
  1444. #endif
  1445. if (aurora_paranoia_check(port, tty->device, "aurora_write"))
  1446. return 0;
  1447. chip = AURORA_CD180(port_No(port));
  1448. bp = port_Board(port);
  1449. if (!tty || !port->xmit_buf || !tmp_buf)
  1450. return 0;
  1451. save_flags(flags);
  1452. if (from_user) {
  1453. down(&tmp_buf_sem);
  1454. while (1) {
  1455. c = MIN(count, MIN(SERIAL_XMIT_SIZE - port->xmit_cnt - 1,
  1456.    SERIAL_XMIT_SIZE - port->xmit_head));
  1457. if (c <= 0)
  1458. break;
  1459. c -= copy_from_user(tmp_buf, buf, c);
  1460. if (!c) {
  1461. if (!total)
  1462. total = -EFAULT;
  1463. break;
  1464. }
  1465. cli();
  1466. c = MIN(c, MIN(SERIAL_XMIT_SIZE - port->xmit_cnt - 1,
  1467.        SERIAL_XMIT_SIZE - port->xmit_head));
  1468. memcpy(port->xmit_buf + port->xmit_head, tmp_buf, c);
  1469. port->xmit_head = (port->xmit_head + c) & (SERIAL_XMIT_SIZE-1);
  1470. port->xmit_cnt += c;
  1471. restore_flags(flags);
  1472. buf += c;
  1473. count -= c;
  1474. total += c;
  1475. }
  1476. up(&tmp_buf_sem);
  1477. } else {
  1478. while (1) {
  1479. cli();
  1480. c = MIN(count, MIN(SERIAL_XMIT_SIZE - port->xmit_cnt - 1,
  1481.    SERIAL_XMIT_SIZE - port->xmit_head));
  1482. if (c <= 0) {
  1483. restore_flags(flags);
  1484. break;
  1485. }
  1486. memcpy(port->xmit_buf + port->xmit_head, buf, c);
  1487. port->xmit_head = (port->xmit_head + c) & (SERIAL_XMIT_SIZE-1);
  1488. port->xmit_cnt += c;
  1489. restore_flags(flags);
  1490. buf += c;
  1491. count -= c;
  1492. total += c;
  1493. }
  1494. }
  1495. cli();
  1496. if (port->xmit_cnt && !tty->stopped && !tty->hw_stopped &&
  1497.     !(port->SRER & SRER_TXRDY)) {
  1498. port->SRER |= SRER_TXRDY;
  1499. sbus_writeb(port_No(port) & 7,
  1500.     &bp->r[chip]->r[CD180_CAR]);
  1501. udelay(1);
  1502. sbus_writeb(port->SRER, &bp->r[chip]->r[CD180_SRER]);
  1503. }
  1504. restore_flags(flags);
  1505. #ifdef AURORA_DEBUG
  1506. printk("aurora_write: end %dn",total);
  1507. #endif
  1508. return total;
  1509. }
  1510. static void aurora_put_char(struct tty_struct * tty, unsigned char ch)
  1511. {
  1512. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1513. unsigned long flags;
  1514. #ifdef AURORA_DEBUG
  1515. printk("aurora_put_char: start %cn",ch);
  1516. #endif
  1517. if (aurora_paranoia_check(port, tty->device, "aurora_put_char"))
  1518. return;
  1519. if (!tty || !port->xmit_buf)
  1520. return;
  1521. save_flags(flags); cli();
  1522. if (port->xmit_cnt >= SERIAL_XMIT_SIZE - 1) {
  1523. restore_flags(flags);
  1524. return;
  1525. }
  1526. port->xmit_buf[port->xmit_head++] = ch;
  1527. port->xmit_head &= SERIAL_XMIT_SIZE - 1;
  1528. port->xmit_cnt++;
  1529. restore_flags(flags);
  1530. #ifdef AURORA_DEBUG
  1531. printk("aurora_put_char: endn");
  1532. #endif
  1533. }
  1534. static void aurora_flush_chars(struct tty_struct * tty)
  1535. {
  1536. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1537. unsigned long flags;
  1538. unsigned char chip;
  1539. /*#ifdef AURORA_DEBUG
  1540. printk("aurora_flush_chars: startn");
  1541. #endif*/
  1542. if (aurora_paranoia_check(port, tty->device, "aurora_flush_chars"))
  1543. return;
  1544. chip = AURORA_CD180(port_No(port));
  1545. if (port->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
  1546.     !port->xmit_buf)
  1547. return;
  1548. save_flags(flags); cli();
  1549. port->SRER |= SRER_TXRDY;
  1550. sbus_writeb(port_No(port) & 7,
  1551.     &port_Board(port)->r[chip]->r[CD180_CAR]);
  1552. udelay(1);
  1553. sbus_writeb(port->SRER,
  1554.     &port_Board(port)->r[chip]->r[CD180_SRER]);
  1555. restore_flags(flags);
  1556. /*#ifdef AURORA_DEBUG
  1557. printk("aurora_flush_chars: endn");
  1558. #endif*/
  1559. }
  1560. static int aurora_write_room(struct tty_struct * tty)
  1561. {
  1562. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1563. int ret;
  1564. #ifdef AURORA_DEBUG
  1565. printk("aurora_write_room: startn");
  1566. #endif
  1567. if (aurora_paranoia_check(port, tty->device, "aurora_write_room"))
  1568. return 0;
  1569. ret = SERIAL_XMIT_SIZE - port->xmit_cnt - 1;
  1570. if (ret < 0)
  1571. ret = 0;
  1572. #ifdef AURORA_DEBUG
  1573. printk("aurora_write_room: endn");
  1574. #endif
  1575. return ret;
  1576. }
  1577. static int aurora_chars_in_buffer(struct tty_struct *tty)
  1578. {
  1579. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1580. if (aurora_paranoia_check(port, tty->device, "aurora_chars_in_buffer"))
  1581. return 0;
  1582. return port->xmit_cnt;
  1583. }
  1584. static void aurora_flush_buffer(struct tty_struct *tty)
  1585. {
  1586. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1587. unsigned long flags;
  1588. #ifdef AURORA_DEBUG
  1589. printk("aurora_flush_buffer: startn");
  1590. #endif
  1591. if (aurora_paranoia_check(port, tty->device, "aurora_flush_buffer"))
  1592. return;
  1593. save_flags(flags); cli();
  1594. port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
  1595. restore_flags(flags);
  1596. wake_up_interruptible(&tty->write_wait);
  1597. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  1598.     tty->ldisc.write_wakeup)
  1599. (tty->ldisc.write_wakeup)(tty);
  1600. #ifdef AURORA_DEBUG
  1601. printk("aurora_flush_buffer: endn");
  1602. #endif
  1603. }
  1604. static int aurora_get_modem_info(struct Aurora_port * port, unsigned int *value)
  1605. {
  1606. struct Aurora_board * bp;
  1607. unsigned char status,chip;
  1608. unsigned int result;
  1609. unsigned long flags;
  1610. #ifdef AURORA_DEBUG
  1611. printk("aurora_get_modem_info: startn");
  1612. #endif
  1613. chip = AURORA_CD180(port_No(port));
  1614. bp = port_Board(port);
  1615. save_flags(flags); cli();
  1616. sbus_writeb(port_No(port) & 7, &bp->r[chip]->r[CD180_CAR]);
  1617. udelay(1);
  1618. status = sbus_readb(&bp->r[chip]->r[CD180_MSVR]);
  1619. result = 0/*bp->r[chip]->r[AURORA_RI] & (1u << port_No(port)) ? 0 : TIOCM_RNG*/;
  1620. restore_flags(flags);
  1621. result |= ((status & bp->RTS) ? TIOCM_RTS : 0)
  1622. | ((status & bp->DTR) ? TIOCM_DTR : 0)
  1623. | ((status & MSVR_CD)  ? TIOCM_CAR : 0)
  1624. | ((status & MSVR_DSR) ? TIOCM_DSR : 0)
  1625. | ((status & MSVR_CTS) ? TIOCM_CTS : 0);
  1626. put_user(result,(unsigned long *) value);
  1627. #ifdef AURORA_DEBUG
  1628. printk("aurora_get_modem_info: endn");
  1629. #endif
  1630. return 0;
  1631. }
  1632. static int aurora_set_modem_info(struct Aurora_port * port, unsigned int cmd,
  1633.  unsigned int *value)
  1634. {
  1635. unsigned int arg;
  1636. unsigned long flags;
  1637. struct Aurora_board *bp = port_Board(port);
  1638. unsigned char chip;
  1639. #ifdef AURORA_DEBUG
  1640. printk("aurora_set_modem_info: startn");
  1641. #endif
  1642. if (get_user(arg, value))
  1643. return -EFAULT;
  1644. chip = AURORA_CD180(port_No(port));
  1645. switch (cmd) {
  1646.  case TIOCMBIS: 
  1647. if (arg & TIOCM_RTS) 
  1648. port->MSVR |= bp->RTS;
  1649. if (arg & TIOCM_DTR)
  1650. port->MSVR |= bp->DTR;
  1651. break;
  1652. case TIOCMBIC:
  1653. if (arg & TIOCM_RTS)
  1654. port->MSVR &= ~bp->RTS;
  1655. if (arg & TIOCM_DTR)
  1656. port->MSVR &= ~bp->DTR;
  1657. break;
  1658. case TIOCMSET:
  1659. port->MSVR = (arg & TIOCM_RTS) ? (port->MSVR | bp->RTS) : 
  1660.          (port->MSVR & ~bp->RTS);
  1661. port->MSVR = (arg & TIOCM_DTR) ? (port->MSVR | bp->RTS) :
  1662.  (port->MSVR & ~bp->RTS);
  1663. break;
  1664.  default:
  1665. return -EINVAL;
  1666. };
  1667. save_flags(flags); cli();
  1668. sbus_writeb(port_No(port) & 7, &bp->r[chip]->r[CD180_CAR]);
  1669. udelay(1);
  1670. sbus_writeb(port->MSVR, &bp->r[chip]->r[CD180_MSVR]);
  1671. restore_flags(flags);
  1672. #ifdef AURORA_DEBUG
  1673. printk("aurora_set_modem_info: endn");
  1674. #endif
  1675. return 0;
  1676. }
  1677. static void aurora_send_break(struct Aurora_port * port, unsigned long length)
  1678. {
  1679. struct Aurora_board *bp = port_Board(port);
  1680. unsigned long flags;
  1681. unsigned char chip;
  1682. #ifdef AURORA_DEBUG
  1683. printk("aurora_send_break: startn");
  1684. #endif
  1685. chip = AURORA_CD180(port_No(port));
  1686. save_flags(flags); cli();
  1687. port->break_length = AURORA_TPS / HZ * length;
  1688. port->COR2 |= COR2_ETC;
  1689. port->SRER  |= SRER_TXRDY;
  1690. sbus_writeb(port_No(port) & 7, &bp->r[chip]->r[CD180_CAR]);
  1691. udelay(1);
  1692. sbus_writeb(port->COR2, &bp->r[chip]->r[CD180_COR2]);
  1693. sbus_writeb(port->SRER, &bp->r[chip]->r[CD180_SRER]);
  1694. aurora_wait_CCR(bp->r[chip]);
  1695. sbus_writeb(CCR_CORCHG2, &bp->r[chip]->r[CD180_CCR]);
  1696. aurora_wait_CCR(bp->r[chip]);
  1697. restore_flags(flags);
  1698. #ifdef AURORA_DEBUG
  1699. printk("aurora_send_break: endn");
  1700. #endif
  1701. }
  1702. static int aurora_set_serial_info(struct Aurora_port * port,
  1703.   struct serial_struct * newinfo)
  1704. {
  1705. struct serial_struct tmp;
  1706. struct Aurora_board *bp = port_Board(port);
  1707. int change_speed;
  1708. unsigned long flags;
  1709. #ifdef AURORA_DEBUG
  1710. printk("aurora_set_serial_info: startn");
  1711. #endif
  1712. if (copy_from_user(&tmp, newinfo, sizeof(tmp)))
  1713. return -EFAULT;
  1714. #if 0
  1715. if ((tmp.irq != bp->irq) ||
  1716.     (tmp.port != bp->base) ||
  1717.     (tmp.type != PORT_CIRRUS) ||
  1718.     (tmp.baud_base != (bp->oscfreq + CD180_TPC/2) / CD180_TPC) ||
  1719.     (tmp.custom_divisor != 0) ||
  1720.     (tmp.xmit_fifo_size != CD180_NFIFO) ||
  1721.     (tmp.flags & ~AURORA_LEGAL_FLAGS))
  1722. return -EINVAL;
  1723. #endif
  1724. change_speed = ((port->flags & ASYNC_SPD_MASK) !=
  1725. (tmp.flags & ASYNC_SPD_MASK));
  1726. if (!capable(CAP_SYS_ADMIN)) {
  1727. if ((tmp.close_delay != port->close_delay) ||
  1728.     (tmp.closing_wait != port->closing_wait) ||
  1729.     ((tmp.flags & ~ASYNC_USR_MASK) !=
  1730.      (port->flags & ~ASYNC_USR_MASK)))  
  1731. return -EPERM;
  1732. port->flags = ((port->flags & ~ASYNC_USR_MASK) |
  1733.        (tmp.flags & ASYNC_USR_MASK));
  1734. } else  {
  1735. port->flags = ((port->flags & ~ASYNC_FLAGS) |
  1736.        (tmp.flags & ASYNC_FLAGS));
  1737. port->close_delay = tmp.close_delay;
  1738. port->closing_wait = tmp.closing_wait;
  1739. }
  1740. if (change_speed)  {
  1741. save_flags(flags); cli();
  1742. aurora_change_speed(bp, port);
  1743. restore_flags(flags);
  1744. }
  1745. #ifdef AURORA_DEBUG
  1746. printk("aurora_set_serial_info: endn");
  1747. #endif
  1748. return 0;
  1749. }
  1750. extern int aurora_get_serial_info(struct Aurora_port * port,
  1751.   struct serial_struct * retinfo)
  1752. {
  1753. struct serial_struct tmp;
  1754. struct Aurora_board *bp = port_Board(port);
  1755. int error;
  1756. #ifdef AURORA_DEBUG
  1757. printk("aurora_get_serial_info: startn");
  1758. #endif
  1759. error = verify_area(VERIFY_WRITE, (void *) retinfo, sizeof(tmp));
  1760. if (error)
  1761. return error;
  1762. memset(&tmp, 0, sizeof(tmp));
  1763. tmp.type = PORT_CIRRUS;
  1764. tmp.line = port - aurora_port;
  1765. tmp.port = 0;
  1766. tmp.irq  = bp->irq;
  1767. tmp.flags = port->flags;
  1768. tmp.baud_base = (bp->oscfreq + CD180_TPC/2) / CD180_TPC;
  1769. tmp.close_delay = port->close_delay * HZ/100;
  1770. tmp.closing_wait = port->closing_wait * HZ/100;
  1771. tmp.xmit_fifo_size = CD180_NFIFO;
  1772. copy_to_user(retinfo, &tmp, sizeof(tmp));
  1773. #ifdef AURORA_DEBUG
  1774. printk("aurora_get_serial_info: endn");
  1775. #endif
  1776. return 0;
  1777. }
  1778. static int aurora_ioctl(struct tty_struct * tty, struct file * filp, 
  1779.     unsigned int cmd, unsigned long arg)
  1780.     
  1781. {
  1782. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1783. int retval;
  1784. #ifdef AURORA_DEBUG
  1785. printk("aurora_ioctl: startn");
  1786. #endif
  1787. if (aurora_paranoia_check(port, tty->device, "aurora_ioctl"))
  1788. return -ENODEV;
  1789. switch (cmd) {
  1790. case TCSBRK: /* SVID version: non-zero arg --> no break */
  1791. retval = tty_check_change(tty);
  1792. if (retval)
  1793. return retval;
  1794. tty_wait_until_sent(tty, 0);
  1795. if (!arg)
  1796. aurora_send_break(port, HZ/4); /* 1/4 second */
  1797. return 0;
  1798. case TCSBRKP: /* support for POSIX tcsendbreak() */
  1799. retval = tty_check_change(tty);
  1800. if (retval)
  1801. return retval;
  1802. tty_wait_until_sent(tty, 0);
  1803. aurora_send_break(port, arg ? arg*(HZ/10) : HZ/4);
  1804. return 0;
  1805. case TIOCGSOFTCAR:
  1806. return put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long *)arg);
  1807. case TIOCSSOFTCAR:
  1808. if (get_user(arg,(unsigned long *)arg))
  1809. return -EFAULT;
  1810. tty->termios->c_cflag =
  1811. ((tty->termios->c_cflag & ~CLOCAL) |
  1812.  (arg ? CLOCAL : 0));
  1813. return 0;
  1814. case TIOCMGET:
  1815. retval = verify_area(VERIFY_WRITE, (void *) arg,
  1816.     sizeof(unsigned int));
  1817. if (retval)
  1818. return retval;
  1819. return aurora_get_modem_info(port, (unsigned int *) arg);
  1820. case TIOCMBIS:
  1821. case TIOCMBIC:
  1822. case TIOCMSET:
  1823. return aurora_set_modem_info(port, cmd, (unsigned int *) arg);
  1824. case TIOCGSERIAL:
  1825. return aurora_get_serial_info(port, (struct serial_struct *) arg);
  1826. case TIOCSSERIAL:
  1827. return aurora_set_serial_info(port, (struct serial_struct *) arg);
  1828. default:
  1829. return -ENOIOCTLCMD;
  1830. };
  1831. #ifdef AURORA_DEBUG
  1832. printk("aurora_ioctl: endn");
  1833. #endif
  1834. return 0;
  1835. }
  1836. static void aurora_throttle(struct tty_struct * tty)
  1837. {
  1838. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1839. struct Aurora_board *bp;
  1840. unsigned long flags;
  1841. unsigned char chip;
  1842. #ifdef AURORA_DEBUG
  1843. printk("aurora_throttle: startn");
  1844. #endif
  1845. if (aurora_paranoia_check(port, tty->device, "aurora_throttle"))
  1846. return;
  1847. bp = port_Board(port);
  1848. chip = AURORA_CD180(port_No(port));
  1849. save_flags(flags); cli();
  1850. port->MSVR &= ~bp->RTS;
  1851. sbus_writeb(port_No(port) & 7, &bp->r[chip]->r[CD180_CAR]);
  1852. udelay(1);
  1853. if (I_IXOFF(tty))  {
  1854. aurora_wait_CCR(bp->r[chip]);
  1855. sbus_writeb(CCR_SSCH2, &bp->r[chip]->r[CD180_CCR]);
  1856. aurora_wait_CCR(bp->r[chip]);
  1857. }
  1858. sbus_writeb(port->MSVR, &bp->r[chip]->r[CD180_MSVR]);
  1859. restore_flags(flags);
  1860. #ifdef AURORA_DEBUG
  1861. printk("aurora_throttle: endn");
  1862. #endif
  1863. }
  1864. static void aurora_unthrottle(struct tty_struct * tty)
  1865. {
  1866. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1867. struct Aurora_board *bp;
  1868. unsigned long flags;
  1869. unsigned char chip;
  1870. #ifdef AURORA_DEBUG
  1871. printk("aurora_unthrottle: startn");
  1872. #endif
  1873. if (aurora_paranoia_check(port, tty->device, "aurora_unthrottle"))
  1874. return;
  1875. bp = port_Board(port);
  1876. chip = AURORA_CD180(port_No(port));
  1877. save_flags(flags); cli();
  1878. port->MSVR |= bp->RTS;
  1879. sbus_writeb(port_No(port) & 7,
  1880.     &bp->r[chip]->r[CD180_CAR]);
  1881. udelay(1);
  1882. if (I_IXOFF(tty))  {
  1883. aurora_wait_CCR(bp->r[chip]);
  1884. sbus_writeb(CCR_SSCH1,
  1885.     &bp->r[chip]->r[CD180_CCR]);
  1886. aurora_wait_CCR(bp->r[chip]);
  1887. }
  1888. sbus_writeb(port->MSVR, &bp->r[chip]->r[CD180_MSVR]);
  1889. restore_flags(flags);
  1890. #ifdef AURORA_DEBUG
  1891. printk("aurora_unthrottle: endn");
  1892. #endif
  1893. }
  1894. static void aurora_stop(struct tty_struct * tty)
  1895. {
  1896. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1897. struct Aurora_board *bp;
  1898. unsigned long flags;
  1899. unsigned char chip;
  1900. #ifdef AURORA_DEBUG
  1901. printk("aurora_stop: startn");
  1902. #endif
  1903. if (aurora_paranoia_check(port, tty->device, "aurora_stop"))
  1904. return;
  1905. bp = port_Board(port);
  1906. chip = AURORA_CD180(port_No(port));
  1907. save_flags(flags); cli();
  1908. port->SRER &= ~SRER_TXRDY;
  1909. sbus_writeb(port_No(port) & 7,
  1910.     &bp->r[chip]->r[CD180_CAR]);
  1911. udelay(1);
  1912. sbus_writeb(port->SRER,
  1913.     &bp->r[chip]->r[CD180_SRER]);
  1914. restore_flags(flags);
  1915. #ifdef AURORA_DEBUG
  1916. printk("aurora_stop: endn");
  1917. #endif
  1918. }
  1919. static void aurora_start(struct tty_struct * tty)
  1920. {
  1921. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1922. struct Aurora_board *bp;
  1923. unsigned long flags;
  1924. unsigned char chip;
  1925. #ifdef AURORA_DEBUG
  1926. printk("aurora_start: startn");
  1927. #endif
  1928. if (aurora_paranoia_check(port, tty->device, "aurora_start"))
  1929. return;
  1930. bp = port_Board(port);
  1931. chip = AURORA_CD180(port_No(port));
  1932. save_flags(flags); cli();
  1933. if (port->xmit_cnt && port->xmit_buf && !(port->SRER & SRER_TXRDY))  {
  1934. port->SRER |= SRER_TXRDY;
  1935. sbus_writeb(port_No(port) & 7,
  1936.     &bp->r[chip]->r[CD180_CAR]);
  1937. udelay(1);
  1938. sbus_writeb(port->SRER,
  1939.     &bp->r[chip]->r[CD180_SRER]);
  1940. }
  1941. restore_flags(flags);
  1942. #ifdef AURORA_DEBUG
  1943. printk("aurora_start: endn");
  1944. #endif
  1945. }
  1946. /*
  1947.  * This routine is called from the scheduler tqueue when the interrupt
  1948.  * routine has signalled that a hangup has occurred.  The path of
  1949.  * hangup processing is:
  1950.  *
  1951.  *  serial interrupt routine -> (scheduler tqueue) ->
  1952.  *  do_aurora_hangup() -> tty->hangup() -> aurora_hangup()
  1953.  * 
  1954.  */
  1955. static void do_aurora_hangup(void *private_)
  1956. {
  1957. struct Aurora_port *port = (struct Aurora_port *) private_;
  1958. struct tty_struct *tty;
  1959. #ifdef AURORA_DEBUG
  1960. printk("do_aurora_hangup: startn");
  1961. #endif
  1962. tty = port->tty;
  1963. if (tty != NULL) {
  1964. tty_hangup(tty); /* FIXME: module removal race - AKPM */
  1965. #ifdef AURORA_DEBUG
  1966. printk("do_aurora_hangup: endn");
  1967. #endif
  1968. }
  1969. MOD_DEC_USE_COUNT;
  1970. }
  1971. static void aurora_hangup(struct tty_struct * tty)
  1972. {
  1973. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1974. struct Aurora_board *bp;
  1975. #ifdef AURORA_DEBUG
  1976. printk("aurora_hangup: startn");
  1977. #endif
  1978. if (aurora_paranoia_check(port, tty->device, "aurora_hangup"))
  1979. return;
  1980. bp = port_Board(port);
  1981. aurora_shutdown_port(bp, port);
  1982. port->event = 0;
  1983. port->count = 0;
  1984. port->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE);
  1985. port->tty = 0;
  1986. wake_up_interruptible(&port->open_wait);
  1987. #ifdef AURORA_DEBUG
  1988. printk("aurora_hangup: endn");
  1989. #endif
  1990. }
  1991. static void aurora_set_termios(struct tty_struct * tty, struct termios * old_termios)
  1992. {
  1993. struct Aurora_port *port = (struct Aurora_port *) tty->driver_data;
  1994. unsigned long flags;
  1995. #ifdef AURORA_DEBUG
  1996. printk("aurora_set_termios: startn");
  1997. #endif
  1998. if (aurora_paranoia_check(port, tty->device, "aurora_set_termios"))
  1999. return;
  2000. if (tty->termios->c_cflag == old_termios->c_cflag &&
  2001.     tty->termios->c_iflag == old_termios->c_iflag)
  2002. return;
  2003. save_flags(flags); cli();
  2004. aurora_change_speed(port_Board(port), port);
  2005. restore_flags(flags);
  2006. if ((old_termios->c_cflag & CRTSCTS) &&
  2007.     !(tty->termios->c_cflag & CRTSCTS)) {
  2008. tty->hw_stopped = 0;
  2009. aurora_start(tty);
  2010. }
  2011. #ifdef AURORA_DEBUG
  2012. printk("aurora_set_termios: endn");
  2013. #endif
  2014. }
  2015. static void do_aurora_bh(void)
  2016. {
  2017.  run_task_queue(&tq_aurora);
  2018. }
  2019. static void do_softint(void *private_)
  2020. {
  2021. struct Aurora_port *port = (struct Aurora_port *) private_;
  2022. struct tty_struct *tty;
  2023. #ifdef AURORA_DEBUG
  2024. printk("do_softint: startn");
  2025. #endif
  2026. tty = port->tty;
  2027. if (tty == NULL)
  2028. return;
  2029. if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &port->event)) {
  2030. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  2031.     tty->ldisc.write_wakeup)
  2032. (tty->ldisc.write_wakeup)(tty);
  2033. wake_up_interruptible(&tty->write_wait);
  2034. }
  2035. #ifdef AURORA_DEBUG
  2036. printk("do_softint: endn");
  2037. #endif
  2038. }
  2039. static int aurora_init_drivers(void)
  2040. {
  2041. int error;
  2042. int i;
  2043. #ifdef AURORA_DEBUG
  2044. printk("aurora_init_drivers: startn");
  2045. #endif
  2046. tmp_buf = (unsigned char *) get_free_page(GFP_KERNEL);
  2047. if (tmp_buf == NULL) {
  2048. printk(KERN_ERR "aurora: Couldn't get free page.n");
  2049. return 1;
  2050. }
  2051. init_bh(AURORA_BH, do_aurora_bh);
  2052. /* memset(IRQ_to_board, 0, sizeof(IRQ_to_board));*/
  2053. memset(&aurora_driver, 0, sizeof(aurora_driver));
  2054. aurora_driver.magic = TTY_DRIVER_MAGIC;
  2055. aurora_driver.name = "ttyA";
  2056. aurora_driver.major = AURORA_MAJOR;
  2057. aurora_driver.num = AURORA_TNPORTS;
  2058. aurora_driver.type = TTY_DRIVER_TYPE_SERIAL;
  2059. aurora_driver.subtype = AURORA_TYPE_NORMAL;
  2060. aurora_driver.init_termios = tty_std_termios;
  2061. aurora_driver.init_termios.c_cflag =
  2062. B9600 | CS8 | CREAD | HUPCL | CLOCAL;
  2063. aurora_driver.flags = TTY_DRIVER_REAL_RAW;
  2064. aurora_driver.refcount = &aurora_refcount;
  2065. aurora_driver.table = aurora_table;
  2066. aurora_driver.termios = aurora_termios;
  2067. aurora_driver.termios_locked = aurora_termios_locked;
  2068. aurora_driver.open  = aurora_open;
  2069. aurora_driver.close = aurora_close;
  2070. aurora_driver.write = aurora_write;
  2071. aurora_driver.put_char = aurora_put_char;
  2072. aurora_driver.flush_chars = aurora_flush_chars;
  2073. aurora_driver.write_room = aurora_write_room;
  2074. aurora_driver.chars_in_buffer = aurora_chars_in_buffer;
  2075. aurora_driver.flush_buffer = aurora_flush_buffer;
  2076. aurora_driver.ioctl = aurora_ioctl;
  2077. aurora_driver.throttle = aurora_throttle;
  2078. aurora_driver.unthrottle = aurora_unthrottle;
  2079. aurora_driver.set_termios = aurora_set_termios;
  2080. aurora_driver.stop = aurora_stop;
  2081. aurora_driver.start = aurora_start;
  2082. aurora_driver.hangup = aurora_hangup;
  2083. error = tty_register_driver(&aurora_driver);
  2084. if (error) {
  2085. free_page((unsigned long) tmp_buf);
  2086. printk(KERN_ERR "aurora: Couldn't register aurora driver, error = %dn",
  2087.        error);
  2088. return 1;
  2089. }
  2090. memset(aurora_port, 0, sizeof(aurora_port));
  2091. for (i = 0; i < AURORA_TNPORTS; i++)  {
  2092. aurora_port[i].normal_termios  = aurora_driver.init_termios;
  2093. aurora_port[i].magic = AURORA_MAGIC;
  2094. aurora_port[i].tqueue.routine = do_softint;
  2095. aurora_port[i].tqueue.data = &aurora_port[i];
  2096. aurora_port[i].tqueue_hangup.routine = do_aurora_hangup;
  2097. aurora_port[i].tqueue_hangup.data = &aurora_port[i];
  2098. aurora_port[i].close_delay = 50 * HZ/100;
  2099. aurora_port[i].closing_wait = 3000 * HZ/100;
  2100. init_waitqueue_head(&aurora_port[i].open_wait);
  2101. init_waitqueue_head(&aurora_port[i].close_wait);
  2102. }
  2103. #ifdef AURORA_DEBUG
  2104. printk("aurora_init_drivers: endn");
  2105. #endif
  2106. return 0;
  2107. }
  2108. static void aurora_release_drivers(void)
  2109. {
  2110. #ifdef AURORA_DEBUG
  2111. printk("aurora_release_drivers: startn");
  2112. #endif
  2113. free_page((unsigned long)tmp_buf);
  2114. tty_unregister_driver(&aurora_driver);
  2115. #ifdef AURORA_DEBUG
  2116. printk("aurora_release_drivers: endn");
  2117. #endif
  2118. }
  2119. /*
  2120.  * Called at boot time.
  2121.  *
  2122.  * You can specify IO base for up to RC_NBOARD cards,
  2123.  * using line "riscom8=0xiobase1,0xiobase2,.." at LILO prompt.
  2124.  * Note that there will be no probing at default
  2125.  * addresses in this case.
  2126.  *
  2127.  */
  2128. void __init aurora_setup(char *str, int *ints)
  2129. {
  2130. int i;
  2131. for(i=0;(i<ints[0])&&(i<4);i++) {
  2132. if (ints[i+1]) irqs[i]=ints[i+1];
  2133. }
  2134. }
  2135. static int __init aurora_real_init(void)
  2136. {
  2137. int found;
  2138. int i;
  2139. printk(KERN_INFO "aurora: Driver starting.n");
  2140. if(aurora_init_drivers())
  2141. return -EIO;
  2142. found = aurora_probe();
  2143. if(!found) {
  2144. aurora_release_drivers();
  2145. printk(KERN_INFO "aurora: No Aurora Multiport boards detected.n");
  2146. return -EIO;
  2147. } else {
  2148. printk(KERN_INFO "aurora: %d boards found.n", found);
  2149. }
  2150. for (i = 0; i < found; i++) {
  2151. int ret = aurora_setup_board(&aurora_board[i]);
  2152. if (ret) {
  2153. #ifdef AURORA_DEBUG
  2154. printk(KERN_ERR "aurora_init: error aurora_setup_board ret %dn",
  2155.        ret);
  2156. #endif
  2157. return ret;
  2158. }
  2159. }
  2160. return 0;
  2161. }
  2162. int irq  = 0;
  2163. int irq1 = 0;
  2164. int irq2 = 0;
  2165. int irq3 = 0;
  2166. MODULE_PARM(irq , "i");
  2167. MODULE_PARM(irq1, "i");
  2168. MODULE_PARM(irq2, "i");
  2169. MODULE_PARM(irq3, "i");
  2170. static int __init aurora_init(void) 
  2171. {
  2172. if (irq ) irqs[0]=irq ;
  2173. if (irq1) irqs[1]=irq1;
  2174. if (irq2) irqs[2]=irq2;
  2175. if (irq3) irqs[3]=irq3;
  2176. return aurora_real_init();
  2177. }
  2178. static void __exit aurora_cleanup(void)
  2179. {
  2180. int i;
  2181. #ifdef AURORA_DEBUG
  2182. printk("cleanup_module: aurora_release_driversn");
  2183. #endif
  2184. aurora_release_drivers();
  2185. for (i = 0; i < AURORA_NBOARD; i++)
  2186. if (aurora_board[i].flags & AURORA_BOARD_PRESENT) {
  2187. aurora_shutdown_board(&aurora_board[i]);
  2188. aurora_release_io_range(&aurora_board[i]);
  2189. }
  2190. }
  2191. module_init(aurora_init);
  2192. module_exit(aurora_cleanup);
  2193. MODULE_LICENSE("GPL");