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

嵌入式Linux

开发平台:

Unix_Linux

  1. ioaddr += EREG_BANKSIZE;
  2. brdp->nrports += panelp->nrports;
  3. brdp->panels[panelnr++] = panelp;
  4. if ((brdp->brdtype != BRD_ECHPCI) &&
  5.     (ioaddr >= (brdp->ioaddr2 + brdp->iosize2)))
  6. break;
  7. }
  8. brdp->nrpanels = panelnr;
  9. brdp->nrbnks = banknr;
  10. if (brdp->brdtype == BRD_ECH)
  11. outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
  12. brdp->state |= BRD_FOUND;
  13. i = stl_mapirq(brdp->irq, name);
  14. return(i);
  15. }
  16. /*****************************************************************************/
  17. /*
  18.  * Initialize and configure the specified board.
  19.  * Scan through all the boards in the configuration and see what we
  20.  * can find. Handle EIO and the ECH boards a little differently here
  21.  * since the initial search and setup is very different.
  22.  */
  23. static int __init stl_brdinit(stlbrd_t *brdp)
  24. {
  25. int i;
  26. #if DEBUG
  27. printk("stl_brdinit(brdp=%x)n", (int) brdp);
  28. #endif
  29. switch (brdp->brdtype) {
  30. case BRD_EASYIO:
  31. case BRD_EASYIOPCI:
  32. stl_initeio(brdp);
  33. break;
  34. case BRD_ECH:
  35. case BRD_ECHMC:
  36. case BRD_ECHPCI:
  37. case BRD_ECH64PCI:
  38. stl_initech(brdp);
  39. break;
  40. default:
  41. printk("STALLION: board=%d is unknown board type=%dn",
  42. brdp->brdnr, brdp->brdtype);
  43. return(ENODEV);
  44. }
  45. stl_brds[brdp->brdnr] = brdp;
  46. if ((brdp->state & BRD_FOUND) == 0) {
  47. printk("STALLION: %s board not found, board=%d io=%x irq=%dn",
  48. stl_brdnames[brdp->brdtype], brdp->brdnr,
  49. brdp->ioaddr1, brdp->irq);
  50. return(ENODEV);
  51. }
  52. for (i = 0; (i < STL_MAXPANELS); i++)
  53. if (brdp->panels[i] != (stlpanel_t *) NULL)
  54. stl_initports(brdp, brdp->panels[i]);
  55. printk("STALLION: %s found, board=%d io=%x irq=%d "
  56. "nrpanels=%d nrports=%dn", stl_brdnames[brdp->brdtype],
  57. brdp->brdnr, brdp->ioaddr1, brdp->irq, brdp->nrpanels,
  58. brdp->nrports);
  59. return(0);
  60. }
  61. /*****************************************************************************/
  62. /*
  63.  * Find the next available board number that is free.
  64.  */
  65. static inline int stl_getbrdnr()
  66. {
  67. int i;
  68. for (i = 0; (i < STL_MAXBRDS); i++) {
  69. if (stl_brds[i] == (stlbrd_t *) NULL) {
  70. if (i >= stl_nrbrds)
  71. stl_nrbrds = i + 1;
  72. return(i);
  73. }
  74. }
  75. return(-1);
  76. }
  77. /*****************************************************************************/
  78. #ifdef CONFIG_PCI
  79. /*
  80.  * We have a Stallion board. Allocate a board structure and
  81.  * initialize it. Read its IO and IRQ resources from PCI
  82.  * configuration space.
  83.  */
  84. static inline int stl_initpcibrd(int brdtype, struct pci_dev *devp)
  85. {
  86. stlbrd_t *brdp;
  87. #if DEBUG
  88. printk("stl_initpcibrd(brdtype=%d,busnr=%x,devnr=%x)n", brdtype,
  89. devp->bus->number, devp->devfn);
  90. #endif
  91. if (pci_enable_device(devp))
  92. return(-EIO);
  93. if ((brdp = stl_allocbrd()) == (stlbrd_t *) NULL)
  94. return(-ENOMEM);
  95. if ((brdp->brdnr = stl_getbrdnr()) < 0) {
  96. printk("STALLION: too many boards found, "
  97. "maximum supported %dn", STL_MAXBRDS);
  98. return(0);
  99. }
  100. brdp->brdtype = brdtype;
  101. /*
  102.  * Different Stallion boards use the BAR registers in different ways,
  103.  * so set up io addresses based on board type.
  104.  */
  105. #if DEBUG
  106. printk("%s(%d): BAR[]=%x,%x,%x,%x IRQ=%xn", __FILE__, __LINE__,
  107. pci_resource_start(devp, 0), pci_resource_start(devp, 1),
  108. pci_resource_start(devp, 2), pci_resource_start(devp, 3), devp->irq);
  109. #endif
  110. /*
  111.  * We have all resources from the board, so let's setup the actual
  112.  * board structure now.
  113.  */
  114. switch (brdtype) {
  115. case BRD_ECHPCI:
  116. brdp->ioaddr2 = pci_resource_start(devp, 0);
  117. brdp->ioaddr1 = pci_resource_start(devp, 1);
  118. break;
  119. case BRD_ECH64PCI:
  120. brdp->ioaddr2 = pci_resource_start(devp, 2);
  121. brdp->ioaddr1 = pci_resource_start(devp, 1);
  122. break;
  123. case BRD_EASYIOPCI:
  124. brdp->ioaddr1 = pci_resource_start(devp, 2);
  125. brdp->ioaddr2 = pci_resource_start(devp, 1);
  126. break;
  127. default:
  128. printk("STALLION: unknown PCI board type=%dn", brdtype);
  129. break;
  130. }
  131. brdp->irq = devp->irq;
  132. stl_brdinit(brdp);
  133. return(0);
  134. }
  135. /*****************************************************************************/
  136. /*
  137.  * Find all Stallion PCI boards that might be installed. Initialize each
  138.  * one as it is found.
  139.  */
  140. static inline int stl_findpcibrds()
  141. {
  142. struct pci_dev *dev = NULL;
  143. int i, rc;
  144. #if DEBUG
  145. printk("stl_findpcibrds()n");
  146. #endif
  147. if (! pci_present())
  148. return(0);
  149. for (i = 0; (i < stl_nrpcibrds); i++)
  150. while ((dev = pci_find_device(stl_pcibrds[i].vendid,
  151.     stl_pcibrds[i].devid, dev))) {
  152. /*
  153.  * Found a device on the PCI bus that has our vendor and
  154.  * device ID. Need to check now that it is really us.
  155.  */
  156. if ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE)
  157. continue;
  158. rc = stl_initpcibrd(stl_pcibrds[i].brdtype, dev);
  159. if (rc)
  160. return(rc);
  161. }
  162. return(0);
  163. }
  164. #endif
  165. /*****************************************************************************/
  166. /*
  167.  * Scan through all the boards in the configuration and see what we
  168.  * can find. Handle EIO and the ECH boards a little differently here
  169.  * since the initial search and setup is too different.
  170.  */
  171. static inline int stl_initbrds()
  172. {
  173. stlbrd_t *brdp;
  174. stlconf_t *confp;
  175. int i;
  176. #if DEBUG
  177. printk("stl_initbrds()n");
  178. #endif
  179. if (stl_nrbrds > STL_MAXBRDS) {
  180. printk("STALLION: too many boards in configuration table, "
  181. "truncating to %dn", STL_MAXBRDS);
  182. stl_nrbrds = STL_MAXBRDS;
  183. }
  184. /*
  185.  * Firstly scan the list of static boards configured. Allocate
  186.  * resources and initialize the boards as found.
  187.  */
  188. for (i = 0; (i < stl_nrbrds); i++) {
  189. confp = &stl_brdconf[i];
  190. #ifdef MODULE
  191. stl_parsebrd(confp, stl_brdsp[i]);
  192. #endif
  193. if ((brdp = stl_allocbrd()) == (stlbrd_t *) NULL)
  194. return(-ENOMEM);
  195. brdp->brdnr = i;
  196. brdp->brdtype = confp->brdtype;
  197. brdp->ioaddr1 = confp->ioaddr1;
  198. brdp->ioaddr2 = confp->ioaddr2;
  199. brdp->irq = confp->irq;
  200. brdp->irqtype = confp->irqtype;
  201. stl_brdinit(brdp);
  202. }
  203. /*
  204.  * Find any dynamically supported boards. That is via module load
  205.  * line options or auto-detected on the PCI bus.
  206.  */
  207. #ifdef MODULE
  208. stl_argbrds();
  209. #endif
  210. #ifdef CONFIG_PCI
  211. stl_findpcibrds();
  212. #endif
  213. return(0);
  214. }
  215. /*****************************************************************************/
  216. /*
  217.  * Return the board stats structure to user app.
  218.  */
  219. static int stl_getbrdstats(combrd_t *bp)
  220. {
  221. stlbrd_t *brdp;
  222. stlpanel_t *panelp;
  223. int i;
  224. copy_from_user(&stl_brdstats, bp, sizeof(combrd_t));
  225. if (stl_brdstats.brd >= STL_MAXBRDS)
  226. return(-ENODEV);
  227. brdp = stl_brds[stl_brdstats.brd];
  228. if (brdp == (stlbrd_t *) NULL)
  229. return(-ENODEV);
  230. memset(&stl_brdstats, 0, sizeof(combrd_t));
  231. stl_brdstats.brd = brdp->brdnr;
  232. stl_brdstats.type = brdp->brdtype;
  233. stl_brdstats.hwid = brdp->hwid;
  234. stl_brdstats.state = brdp->state;
  235. stl_brdstats.ioaddr = brdp->ioaddr1;
  236. stl_brdstats.ioaddr2 = brdp->ioaddr2;
  237. stl_brdstats.irq = brdp->irq;
  238. stl_brdstats.nrpanels = brdp->nrpanels;
  239. stl_brdstats.nrports = brdp->nrports;
  240. for (i = 0; (i < brdp->nrpanels); i++) {
  241. panelp = brdp->panels[i];
  242. stl_brdstats.panels[i].panel = i;
  243. stl_brdstats.panels[i].hwid = panelp->hwid;
  244. stl_brdstats.panels[i].nrports = panelp->nrports;
  245. }
  246. copy_to_user(bp, &stl_brdstats, sizeof(combrd_t));
  247. return(0);
  248. }
  249. /*****************************************************************************/
  250. /*
  251.  * Resolve the referenced port number into a port struct pointer.
  252.  */
  253. static stlport_t *stl_getport(int brdnr, int panelnr, int portnr)
  254. {
  255. stlbrd_t *brdp;
  256. stlpanel_t *panelp;
  257. if ((brdnr < 0) || (brdnr >= STL_MAXBRDS))
  258. return((stlport_t *) NULL);
  259. brdp = stl_brds[brdnr];
  260. if (brdp == (stlbrd_t *) NULL)
  261. return((stlport_t *) NULL);
  262. if ((panelnr < 0) || (panelnr >= brdp->nrpanels))
  263. return((stlport_t *) NULL);
  264. panelp = brdp->panels[panelnr];
  265. if (panelp == (stlpanel_t *) NULL)
  266. return((stlport_t *) NULL);
  267. if ((portnr < 0) || (portnr >= panelp->nrports))
  268. return((stlport_t *) NULL);
  269. return(panelp->ports[portnr]);
  270. }
  271. /*****************************************************************************/
  272. /*
  273.  * Return the port stats structure to user app. A NULL port struct
  274.  * pointer passed in means that we need to find out from the app
  275.  * what port to get stats for (used through board control device).
  276.  */
  277. static int stl_getportstats(stlport_t *portp, comstats_t *cp)
  278. {
  279. unsigned char *head, *tail;
  280. unsigned long flags;
  281. if (portp == (stlport_t *) NULL) {
  282. copy_from_user(&stl_comstats, cp, sizeof(comstats_t));
  283. portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
  284. stl_comstats.port);
  285. if (portp == (stlport_t *) NULL)
  286. return(-ENODEV);
  287. }
  288. portp->stats.state = portp->istate;
  289. portp->stats.flags = portp->flags;
  290. portp->stats.hwid = portp->hwid;
  291. portp->stats.ttystate = 0;
  292. portp->stats.cflags = 0;
  293. portp->stats.iflags = 0;
  294. portp->stats.oflags = 0;
  295. portp->stats.lflags = 0;
  296. portp->stats.rxbuffered = 0;
  297. save_flags(flags);
  298. cli();
  299. if (portp->tty != (struct tty_struct *) NULL) {
  300. if (portp->tty->driver_data == portp) {
  301. portp->stats.ttystate = portp->tty->flags;
  302. portp->stats.rxbuffered = portp->tty->flip.count;
  303. if (portp->tty->termios != (struct termios *) NULL) {
  304. portp->stats.cflags = portp->tty->termios->c_cflag;
  305. portp->stats.iflags = portp->tty->termios->c_iflag;
  306. portp->stats.oflags = portp->tty->termios->c_oflag;
  307. portp->stats.lflags = portp->tty->termios->c_lflag;
  308. }
  309. }
  310. }
  311. restore_flags(flags);
  312. head = portp->tx.head;
  313. tail = portp->tx.tail;
  314. portp->stats.txbuffered = ((head >= tail) ? (head - tail) :
  315. (STL_TXBUFSIZE - (tail - head)));
  316. portp->stats.signals = (unsigned long) stl_getsignals(portp);
  317. copy_to_user(cp, &portp->stats, sizeof(comstats_t));
  318. return(0);
  319. }
  320. /*****************************************************************************/
  321. /*
  322.  * Clear the port stats structure. We also return it zeroed out...
  323.  */
  324. static int stl_clrportstats(stlport_t *portp, comstats_t *cp)
  325. {
  326. if (portp == (stlport_t *) NULL) {
  327. copy_from_user(&stl_comstats, cp, sizeof(comstats_t));
  328. portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
  329. stl_comstats.port);
  330. if (portp == (stlport_t *) NULL)
  331. return(-ENODEV);
  332. }
  333. memset(&portp->stats, 0, sizeof(comstats_t));
  334. portp->stats.brd = portp->brdnr;
  335. portp->stats.panel = portp->panelnr;
  336. portp->stats.port = portp->portnr;
  337. copy_to_user(cp, &portp->stats, sizeof(comstats_t));
  338. return(0);
  339. }
  340. /*****************************************************************************/
  341. /*
  342.  * Return the entire driver ports structure to a user app.
  343.  */
  344. static int stl_getportstruct(unsigned long arg)
  345. {
  346. stlport_t *portp;
  347. copy_from_user(&stl_dummyport, (void *) arg, sizeof(stlport_t));
  348. portp = stl_getport(stl_dummyport.brdnr, stl_dummyport.panelnr,
  349.  stl_dummyport.portnr);
  350. if (portp == (stlport_t *) NULL)
  351. return(-ENODEV);
  352. copy_to_user((void *) arg, portp, sizeof(stlport_t));
  353. return(0);
  354. }
  355. /*****************************************************************************/
  356. /*
  357.  * Return the entire driver board structure to a user app.
  358.  */
  359. static int stl_getbrdstruct(unsigned long arg)
  360. {
  361. stlbrd_t *brdp;
  362. copy_from_user(&stl_dummybrd, (void *) arg, sizeof(stlbrd_t));
  363. if ((stl_dummybrd.brdnr < 0) || (stl_dummybrd.brdnr >= STL_MAXBRDS))
  364. return(-ENODEV);
  365. brdp = stl_brds[stl_dummybrd.brdnr];
  366. if (brdp == (stlbrd_t *) NULL)
  367. return(-ENODEV);
  368. copy_to_user((void *) arg, brdp, sizeof(stlbrd_t));
  369. return(0);
  370. }
  371. /*****************************************************************************/
  372. /*
  373.  * The "staliomem" device is also required to do some special operations
  374.  * on the board and/or ports. In this driver it is mostly used for stats
  375.  * collection.
  376.  */
  377. static int stl_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg)
  378. {
  379. int brdnr, rc;
  380. #if DEBUG
  381. printk("stl_memioctl(ip=%x,fp=%x,cmd=%x,arg=%x)n", (int) ip,
  382. (int) fp, cmd, (int) arg);
  383. #endif
  384. brdnr = MINOR(ip->i_rdev);
  385. if (brdnr >= STL_MAXBRDS)
  386. return(-ENODEV);
  387. rc = 0;
  388. switch (cmd) {
  389. case COM_GETPORTSTATS:
  390. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  391.     sizeof(comstats_t))) == 0)
  392. rc = stl_getportstats((stlport_t *) NULL,
  393. (comstats_t *) arg);
  394. break;
  395. case COM_CLRPORTSTATS:
  396. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  397.     sizeof(comstats_t))) == 0)
  398. rc = stl_clrportstats((stlport_t *) NULL,
  399. (comstats_t *) arg);
  400. break;
  401. case COM_GETBRDSTATS:
  402. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  403.     sizeof(combrd_t))) == 0)
  404. rc = stl_getbrdstats((combrd_t *) arg);
  405. break;
  406. case COM_READPORT:
  407. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  408.     sizeof(stlport_t))) == 0)
  409. rc = stl_getportstruct(arg);
  410. break;
  411. case COM_READBOARD:
  412. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  413.     sizeof(stlbrd_t))) == 0)
  414. rc = stl_getbrdstruct(arg);
  415. break;
  416. default:
  417. rc = -ENOIOCTLCMD;
  418. break;
  419. }
  420. return(rc);
  421. }
  422. /*****************************************************************************/
  423. int __init stl_init(void)
  424. {
  425. printk(KERN_INFO "%s: version %sn", stl_drvtitle, stl_drvversion);
  426. stl_initbrds();
  427. /*
  428.  * Allocate a temporary write buffer.
  429.  */
  430. stl_tmpwritebuf = (char *) stl_memalloc(STL_TXBUFSIZE);
  431. if (stl_tmpwritebuf == (char *) NULL)
  432. printk("STALLION: failed to allocate memory (size=%d)n",
  433. STL_TXBUFSIZE);
  434. /*
  435.  * Set up a character driver for per board stuff. This is mainly used
  436.  * to do stats ioctls on the ports.
  437.  */
  438. if (devfs_register_chrdev(STL_SIOMEMMAJOR, "staliomem", &stl_fsiomem))
  439. printk("STALLION: failed to register serial board devicen");
  440. devfs_handle = devfs_mk_dir (NULL, "staliomem", NULL);
  441. devfs_register_series (devfs_handle, "%u", 4, DEVFS_FL_DEFAULT,
  442.        STL_SIOMEMMAJOR, 0,
  443.        S_IFCHR | S_IRUSR | S_IWUSR,
  444.        &stl_fsiomem, NULL);
  445. /*
  446.  * Set up the tty driver structure and register us as a driver.
  447.  * Also setup the callout tty device.
  448.  */
  449. memset(&stl_serial, 0, sizeof(struct tty_driver));
  450. stl_serial.magic = TTY_DRIVER_MAGIC;
  451. stl_serial.driver_name = stl_drvname;
  452. stl_serial.name = stl_serialname;
  453. stl_serial.major = STL_SERIALMAJOR;
  454. stl_serial.minor_start = 0;
  455. stl_serial.num = STL_MAXBRDS * STL_MAXPORTS;
  456. stl_serial.type = TTY_DRIVER_TYPE_SERIAL;
  457. stl_serial.subtype = STL_DRVTYPSERIAL;
  458. stl_serial.init_termios = stl_deftermios;
  459. stl_serial.flags = TTY_DRIVER_REAL_RAW;
  460. stl_serial.refcount = &stl_refcount;
  461. stl_serial.table = stl_ttys;
  462. stl_serial.termios = stl_termios;
  463. stl_serial.termios_locked = stl_termioslocked;
  464. stl_serial.open = stl_open;
  465. stl_serial.close = stl_close;
  466. stl_serial.write = stl_write;
  467. stl_serial.put_char = stl_putchar;
  468. stl_serial.flush_chars = stl_flushchars;
  469. stl_serial.write_room = stl_writeroom;
  470. stl_serial.chars_in_buffer = stl_charsinbuffer;
  471. stl_serial.ioctl = stl_ioctl;
  472. stl_serial.set_termios = stl_settermios;
  473. stl_serial.throttle = stl_throttle;
  474. stl_serial.unthrottle = stl_unthrottle;
  475. stl_serial.stop = stl_stop;
  476. stl_serial.start = stl_start;
  477. stl_serial.hangup = stl_hangup;
  478. stl_serial.flush_buffer = stl_flushbuffer;
  479. stl_serial.break_ctl = stl_breakctl;
  480. stl_serial.wait_until_sent = stl_waituntilsent;
  481. stl_serial.send_xchar = stl_sendxchar;
  482. stl_serial.read_proc = stl_readproc;
  483. stl_callout = stl_serial;
  484. stl_callout.name = stl_calloutname;
  485. stl_callout.major = STL_CALLOUTMAJOR;
  486. stl_callout.subtype = STL_DRVTYPCALLOUT;
  487. stl_callout.read_proc = 0;
  488. if (tty_register_driver(&stl_serial))
  489. printk("STALLION: failed to register serial drivern");
  490. if (tty_register_driver(&stl_callout))
  491. printk("STALLION: failed to register callout drivern");
  492. return(0);
  493. }
  494. /*****************************************************************************/
  495. /*                       CD1400 HARDWARE FUNCTIONS                           */
  496. /*****************************************************************************/
  497. /*
  498.  * These functions get/set/update the registers of the cd1400 UARTs.
  499.  * Access to the cd1400 registers is via an address/data io port pair.
  500.  * (Maybe should make this inline...)
  501.  */
  502. static int stl_cd1400getreg(stlport_t *portp, int regnr)
  503. {
  504. outb((regnr + portp->uartaddr), portp->ioaddr);
  505. return(inb(portp->ioaddr + EREG_DATA));
  506. }
  507. static void stl_cd1400setreg(stlport_t *portp, int regnr, int value)
  508. {
  509. outb((regnr + portp->uartaddr), portp->ioaddr);
  510. outb(value, portp->ioaddr + EREG_DATA);
  511. }
  512. static int stl_cd1400updatereg(stlport_t *portp, int regnr, int value)
  513. {
  514. outb((regnr + portp->uartaddr), portp->ioaddr);
  515. if (inb(portp->ioaddr + EREG_DATA) != value) {
  516. outb(value, portp->ioaddr + EREG_DATA);
  517. return(1);
  518. }
  519. return(0);
  520. }
  521. /*****************************************************************************/
  522. /*
  523.  * Inbitialize the UARTs in a panel. We don't care what sort of board
  524.  * these ports are on - since the port io registers are almost
  525.  * identical when dealing with ports.
  526.  */
  527. static int stl_cd1400panelinit(stlbrd_t *brdp, stlpanel_t *panelp)
  528. {
  529. unsigned int gfrcr;
  530. int chipmask, i, j;
  531. int nrchips, uartaddr, ioaddr;
  532. #if DEBUG
  533. printk("stl_panelinit(brdp=%x,panelp=%x)n", (int) brdp, (int) panelp);
  534. #endif
  535. BRDENABLE(panelp->brdnr, panelp->pagenr);
  536. /*
  537.  * Check that each chip is present and started up OK.
  538.  */
  539. chipmask = 0;
  540. nrchips = panelp->nrports / CD1400_PORTS;
  541. for (i = 0; (i < nrchips); i++) {
  542. if (brdp->brdtype == BRD_ECHPCI) {
  543. outb((panelp->pagenr + (i >> 1)), brdp->ioctrl);
  544. ioaddr = panelp->iobase;
  545. } else {
  546. ioaddr = panelp->iobase + (EREG_BANKSIZE * (i >> 1));
  547. }
  548. uartaddr = (i & 0x01) ? 0x080 : 0;
  549. outb((GFRCR + uartaddr), ioaddr);
  550. outb(0, (ioaddr + EREG_DATA));
  551. outb((CCR + uartaddr), ioaddr);
  552. outb(CCR_RESETFULL, (ioaddr + EREG_DATA));
  553. outb(CCR_RESETFULL, (ioaddr + EREG_DATA));
  554. outb((GFRCR + uartaddr), ioaddr);
  555. for (j = 0; (j < CCR_MAXWAIT); j++) {
  556. if ((gfrcr = inb(ioaddr + EREG_DATA)) != 0)
  557. break;
  558. }
  559. if ((j >= CCR_MAXWAIT) || (gfrcr < 0x40) || (gfrcr > 0x60)) {
  560. printk("STALLION: cd1400 not responding, "
  561. "brd=%d panel=%d chip=%dn",
  562. panelp->brdnr, panelp->panelnr, i);
  563. continue;
  564. }
  565. chipmask |= (0x1 << i);
  566. outb((PPR + uartaddr), ioaddr);
  567. outb(PPR_SCALAR, (ioaddr + EREG_DATA));
  568. }
  569. BRDDISABLE(panelp->brdnr);
  570. return(chipmask);
  571. }
  572. /*****************************************************************************/
  573. /*
  574.  * Initialize hardware specific port registers.
  575.  */
  576. static void stl_cd1400portinit(stlbrd_t *brdp, stlpanel_t *panelp, stlport_t *portp)
  577. {
  578. #if DEBUG
  579. printk("stl_cd1400portinit(brdp=%x,panelp=%x,portp=%x)n",
  580. (int) brdp, (int) panelp, (int) portp);
  581. #endif
  582. if ((brdp == (stlbrd_t *) NULL) || (panelp == (stlpanel_t *) NULL) ||
  583.     (portp == (stlport_t *) NULL))
  584. return;
  585. portp->ioaddr = panelp->iobase + (((brdp->brdtype == BRD_ECHPCI) ||
  586. (portp->portnr < 8)) ? 0 : EREG_BANKSIZE);
  587. portp->uartaddr = (portp->portnr & 0x04) << 5;
  588. portp->pagenr = panelp->pagenr + (portp->portnr >> 3);
  589. BRDENABLE(portp->brdnr, portp->pagenr);
  590. stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
  591. stl_cd1400setreg(portp, LIVR, (portp->portnr << 3));
  592. portp->hwid = stl_cd1400getreg(portp, GFRCR);
  593. BRDDISABLE(portp->brdnr);
  594. }
  595. /*****************************************************************************/
  596. /*
  597.  * Wait for the command register to be ready. We will poll this,
  598.  * since it won't usually take too long to be ready.
  599.  */
  600. static void stl_cd1400ccrwait(stlport_t *portp)
  601. {
  602. int i;
  603. for (i = 0; (i < CCR_MAXWAIT); i++) {
  604. if (stl_cd1400getreg(portp, CCR) == 0) {
  605. return;
  606. }
  607. }
  608. printk("STALLION: cd1400 not responding, port=%d panel=%d brd=%dn",
  609. portp->portnr, portp->panelnr, portp->brdnr);
  610. }
  611. /*****************************************************************************/
  612. /*
  613.  * Set up the cd1400 registers for a port based on the termios port
  614.  * settings.
  615.  */
  616. static void stl_cd1400setport(stlport_t *portp, struct termios *tiosp)
  617. {
  618. stlbrd_t *brdp;
  619. unsigned long flags;
  620. unsigned int clkdiv, baudrate;
  621. unsigned char cor1, cor2, cor3;
  622. unsigned char cor4, cor5, ccr;
  623. unsigned char srer, sreron, sreroff;
  624. unsigned char mcor1, mcor2, rtpr;
  625. unsigned char clk, div;
  626. cor1 = 0;
  627. cor2 = 0;
  628. cor3 = 0;
  629. cor4 = 0;
  630. cor5 = 0;
  631. ccr = 0;
  632. rtpr = 0;
  633. clk = 0;
  634. div = 0;
  635. mcor1 = 0;
  636. mcor2 = 0;
  637. sreron = 0;
  638. sreroff = 0;
  639. brdp = stl_brds[portp->brdnr];
  640. if (brdp == (stlbrd_t *) NULL)
  641. return;
  642. /*
  643.  * Set up the RX char ignore mask with those RX error types we
  644.  * can ignore. We can get the cd1400 to help us out a little here,
  645.  * it will ignore parity errors and breaks for us.
  646.  */
  647. portp->rxignoremsk = 0;
  648. if (tiosp->c_iflag & IGNPAR) {
  649. portp->rxignoremsk |= (ST_PARITY | ST_FRAMING | ST_OVERRUN);
  650. cor1 |= COR1_PARIGNORE;
  651. }
  652. if (tiosp->c_iflag & IGNBRK) {
  653. portp->rxignoremsk |= ST_BREAK;
  654. cor4 |= COR4_IGNBRK;
  655. }
  656. portp->rxmarkmsk = ST_OVERRUN;
  657. if (tiosp->c_iflag & (INPCK | PARMRK))
  658. portp->rxmarkmsk |= (ST_PARITY | ST_FRAMING);
  659. if (tiosp->c_iflag & BRKINT)
  660. portp->rxmarkmsk |= ST_BREAK;
  661. /*
  662.  * Go through the char size, parity and stop bits and set all the
  663.  * option register appropriately.
  664.  */
  665. switch (tiosp->c_cflag & CSIZE) {
  666. case CS5:
  667. cor1 |= COR1_CHL5;
  668. break;
  669. case CS6:
  670. cor1 |= COR1_CHL6;
  671. break;
  672. case CS7:
  673. cor1 |= COR1_CHL7;
  674. break;
  675. default:
  676. cor1 |= COR1_CHL8;
  677. break;
  678. }
  679. if (tiosp->c_cflag & CSTOPB)
  680. cor1 |= COR1_STOP2;
  681. else
  682. cor1 |= COR1_STOP1;
  683. if (tiosp->c_cflag & PARENB) {
  684. if (tiosp->c_cflag & PARODD)
  685. cor1 |= (COR1_PARENB | COR1_PARODD);
  686. else
  687. cor1 |= (COR1_PARENB | COR1_PAREVEN);
  688. } else {
  689. cor1 |= COR1_PARNONE;
  690. }
  691. /*
  692.  * Set the RX FIFO threshold at 6 chars. This gives a bit of breathing
  693.  * space for hardware flow control and the like. This should be set to
  694.  * VMIN. Also here we will set the RX data timeout to 10ms - this should
  695.  * really be based on VTIME.
  696.  */
  697. cor3 |= FIFO_RXTHRESHOLD;
  698. rtpr = 2;
  699. /*
  700.  * Calculate the baud rate timers. For now we will just assume that
  701.  * the input and output baud are the same. Could have used a baud
  702.  * table here, but this way we can generate virtually any baud rate
  703.  * we like!
  704.  */
  705. baudrate = tiosp->c_cflag & CBAUD;
  706. if (baudrate & CBAUDEX) {
  707. baudrate &= ~CBAUDEX;
  708. if ((baudrate < 1) || (baudrate > 4))
  709. tiosp->c_cflag &= ~CBAUDEX;
  710. else
  711. baudrate += 15;
  712. }
  713. baudrate = stl_baudrates[baudrate];
  714. if ((tiosp->c_cflag & CBAUD) == B38400) {
  715. if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
  716. baudrate = 57600;
  717. else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
  718. baudrate = 115200;
  719. else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
  720. baudrate = 230400;
  721. else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
  722. baudrate = 460800;
  723. else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
  724. baudrate = (portp->baud_base / portp->custom_divisor);
  725. }
  726. if (baudrate > STL_CD1400MAXBAUD)
  727. baudrate = STL_CD1400MAXBAUD;
  728. if (baudrate > 0) {
  729. for (clk = 0; (clk < CD1400_NUMCLKS); clk++) {
  730. clkdiv = ((portp->clk / stl_cd1400clkdivs[clk]) / baudrate);
  731. if (clkdiv < 0x100)
  732. break;
  733. }
  734. div = (unsigned char) clkdiv;
  735. }
  736. /*
  737.  * Check what form of modem signaling is required and set it up.
  738.  */
  739. if ((tiosp->c_cflag & CLOCAL) == 0) {
  740. mcor1 |= MCOR1_DCD;
  741. mcor2 |= MCOR2_DCD;
  742. sreron |= SRER_MODEM;
  743. portp->flags |= ASYNC_CHECK_CD;
  744. } else {
  745. portp->flags &= ~ASYNC_CHECK_CD;
  746. }
  747. /*
  748.  * Setup cd1400 enhanced modes if we can. In particular we want to
  749.  * handle as much of the flow control as possible automatically. As
  750.  * well as saving a few CPU cycles it will also greatly improve flow
  751.  * control reliability.
  752.  */
  753. if (tiosp->c_iflag & IXON) {
  754. cor2 |= COR2_TXIBE;
  755. cor3 |= COR3_SCD12;
  756. if (tiosp->c_iflag & IXANY)
  757. cor2 |= COR2_IXM;
  758. }
  759. if (tiosp->c_cflag & CRTSCTS) {
  760. cor2 |= COR2_CTSAE;
  761. mcor1 |= FIFO_RTSTHRESHOLD;
  762. }
  763. /*
  764.  * All cd1400 register values calculated so go through and set
  765.  * them all up.
  766.  */
  767. #if DEBUG
  768. printk("SETPORT: portnr=%d panelnr=%d brdnr=%dn",
  769. portp->portnr, portp->panelnr, portp->brdnr);
  770. printk("    cor1=%x cor2=%x cor3=%x cor4=%x cor5=%xn",
  771. cor1, cor2, cor3, cor4, cor5);
  772. printk("    mcor1=%x mcor2=%x rtpr=%x sreron=%x sreroff=%xn",
  773. mcor1, mcor2, rtpr, sreron, sreroff);
  774. printk("    tcor=%x tbpr=%x rcor=%x rbpr=%xn", clk, div, clk, div);
  775. printk("    schr1=%x schr2=%x schr3=%x schr4=%xn",
  776. tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP],
  777. tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP]);
  778. #endif
  779. save_flags(flags);
  780. cli();
  781. BRDENABLE(portp->brdnr, portp->pagenr);
  782. stl_cd1400setreg(portp, CAR, (portp->portnr & 0x3));
  783. srer = stl_cd1400getreg(portp, SRER);
  784. stl_cd1400setreg(portp, SRER, 0);
  785. if (stl_cd1400updatereg(portp, COR1, cor1))
  786. ccr = 1;
  787. if (stl_cd1400updatereg(portp, COR2, cor2))
  788. ccr = 1;
  789. if (stl_cd1400updatereg(portp, COR3, cor3))
  790. ccr = 1;
  791. if (ccr) {
  792. stl_cd1400ccrwait(portp);
  793. stl_cd1400setreg(portp, CCR, CCR_CORCHANGE);
  794. }
  795. stl_cd1400setreg(portp, COR4, cor4);
  796. stl_cd1400setreg(portp, COR5, cor5);
  797. stl_cd1400setreg(portp, MCOR1, mcor1);
  798. stl_cd1400setreg(portp, MCOR2, mcor2);
  799. if (baudrate > 0) {
  800. stl_cd1400setreg(portp, TCOR, clk);
  801. stl_cd1400setreg(portp, TBPR, div);
  802. stl_cd1400setreg(portp, RCOR, clk);
  803. stl_cd1400setreg(portp, RBPR, div);
  804. }
  805. stl_cd1400setreg(portp, SCHR1, tiosp->c_cc[VSTART]);
  806. stl_cd1400setreg(portp, SCHR2, tiosp->c_cc[VSTOP]);
  807. stl_cd1400setreg(portp, SCHR3, tiosp->c_cc[VSTART]);
  808. stl_cd1400setreg(portp, SCHR4, tiosp->c_cc[VSTOP]);
  809. stl_cd1400setreg(portp, RTPR, rtpr);
  810. mcor1 = stl_cd1400getreg(portp, MSVR1);
  811. if (mcor1 & MSVR1_DCD)
  812. portp->sigs |= TIOCM_CD;
  813. else
  814. portp->sigs &= ~TIOCM_CD;
  815. stl_cd1400setreg(portp, SRER, ((srer & ~sreroff) | sreron));
  816. BRDDISABLE(portp->brdnr);
  817. restore_flags(flags);
  818. }
  819. /*****************************************************************************/
  820. /*
  821.  * Set the state of the DTR and RTS signals.
  822.  */
  823. static void stl_cd1400setsignals(stlport_t *portp, int dtr, int rts)
  824. {
  825. unsigned char msvr1, msvr2;
  826. unsigned long flags;
  827. #if DEBUG
  828. printk("stl_cd1400setsignals(portp=%x,dtr=%d,rts=%d)n",
  829. (int) portp, dtr, rts);
  830. #endif
  831. msvr1 = 0;
  832. msvr2 = 0;
  833. if (dtr > 0)
  834. msvr1 = MSVR1_DTR;
  835. if (rts > 0)
  836. msvr2 = MSVR2_RTS;
  837. save_flags(flags);
  838. cli();
  839. BRDENABLE(portp->brdnr, portp->pagenr);
  840. stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
  841. if (rts >= 0)
  842. stl_cd1400setreg(portp, MSVR2, msvr2);
  843. if (dtr >= 0)
  844. stl_cd1400setreg(portp, MSVR1, msvr1);
  845. BRDDISABLE(portp->brdnr);
  846. restore_flags(flags);
  847. }
  848. /*****************************************************************************/
  849. /*
  850.  * Return the state of the signals.
  851.  */
  852. static int stl_cd1400getsignals(stlport_t *portp)
  853. {
  854. unsigned char msvr1, msvr2;
  855. unsigned long flags;
  856. int sigs;
  857. #if DEBUG
  858. printk("stl_cd1400getsignals(portp=%x)n", (int) portp);
  859. #endif
  860. save_flags(flags);
  861. cli();
  862. BRDENABLE(portp->brdnr, portp->pagenr);
  863. stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
  864. msvr1 = stl_cd1400getreg(portp, MSVR1);
  865. msvr2 = stl_cd1400getreg(portp, MSVR2);
  866. BRDDISABLE(portp->brdnr);
  867. restore_flags(flags);
  868. sigs = 0;
  869. sigs |= (msvr1 & MSVR1_DCD) ? TIOCM_CD : 0;
  870. sigs |= (msvr1 & MSVR1_CTS) ? TIOCM_CTS : 0;
  871. sigs |= (msvr1 & MSVR1_DTR) ? TIOCM_DTR : 0;
  872. sigs |= (msvr2 & MSVR2_RTS) ? TIOCM_RTS : 0;
  873. #if 0
  874. sigs |= (msvr1 & MSVR1_RI) ? TIOCM_RI : 0;
  875. sigs |= (msvr1 & MSVR1_DSR) ? TIOCM_DSR : 0;
  876. #else
  877. sigs |= TIOCM_DSR;
  878. #endif
  879. return(sigs);
  880. }
  881. /*****************************************************************************/
  882. /*
  883.  * Enable/Disable the Transmitter and/or Receiver.
  884.  */
  885. static void stl_cd1400enablerxtx(stlport_t *portp, int rx, int tx)
  886. {
  887. unsigned char ccr;
  888. unsigned long flags;
  889. #if DEBUG
  890. printk("stl_cd1400enablerxtx(portp=%x,rx=%d,tx=%d)n",
  891. (int) portp, rx, tx);
  892. #endif
  893. ccr = 0;
  894. if (tx == 0)
  895. ccr |= CCR_TXDISABLE;
  896. else if (tx > 0)
  897. ccr |= CCR_TXENABLE;
  898. if (rx == 0)
  899. ccr |= CCR_RXDISABLE;
  900. else if (rx > 0)
  901. ccr |= CCR_RXENABLE;
  902. save_flags(flags);
  903. cli();
  904. BRDENABLE(portp->brdnr, portp->pagenr);
  905. stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
  906. stl_cd1400ccrwait(portp);
  907. stl_cd1400setreg(portp, CCR, ccr);
  908. stl_cd1400ccrwait(portp);
  909. BRDDISABLE(portp->brdnr);
  910. restore_flags(flags);
  911. }
  912. /*****************************************************************************/
  913. /*
  914.  * Start/stop the Transmitter and/or Receiver.
  915.  */
  916. static void stl_cd1400startrxtx(stlport_t *portp, int rx, int tx)
  917. {
  918. unsigned char sreron, sreroff;
  919. unsigned long flags;
  920. #if DEBUG
  921. printk("stl_cd1400startrxtx(portp=%x,rx=%d,tx=%d)n",
  922. (int) portp, rx, tx);
  923. #endif
  924. sreron = 0;
  925. sreroff = 0;
  926. if (tx == 0)
  927. sreroff |= (SRER_TXDATA | SRER_TXEMPTY);
  928. else if (tx == 1)
  929. sreron |= SRER_TXDATA;
  930. else if (tx >= 2)
  931. sreron |= SRER_TXEMPTY;
  932. if (rx == 0)
  933. sreroff |= SRER_RXDATA;
  934. else if (rx > 0)
  935. sreron |= SRER_RXDATA;
  936. save_flags(flags);
  937. cli();
  938. BRDENABLE(portp->brdnr, portp->pagenr);
  939. stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
  940. stl_cd1400setreg(portp, SRER,
  941. ((stl_cd1400getreg(portp, SRER) & ~sreroff) | sreron));
  942. BRDDISABLE(portp->brdnr);
  943. if (tx > 0)
  944. set_bit(ASYI_TXBUSY, &portp->istate);
  945. restore_flags(flags);
  946. }
  947. /*****************************************************************************/
  948. /*
  949.  * Disable all interrupts from this port.
  950.  */
  951. static void stl_cd1400disableintrs(stlport_t *portp)
  952. {
  953. unsigned long flags;
  954. #if DEBUG
  955. printk("stl_cd1400disableintrs(portp=%x)n", (int) portp);
  956. #endif
  957. save_flags(flags);
  958. cli();
  959. BRDENABLE(portp->brdnr, portp->pagenr);
  960. stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
  961. stl_cd1400setreg(portp, SRER, 0);
  962. BRDDISABLE(portp->brdnr);
  963. restore_flags(flags);
  964. }
  965. /*****************************************************************************/
  966. static void stl_cd1400sendbreak(stlport_t *portp, int len)
  967. {
  968. unsigned long flags;
  969. #if DEBUG
  970. printk("stl_cd1400sendbreak(portp=%x,len=%d)n", (int) portp, len);
  971. #endif
  972. save_flags(flags);
  973. cli();
  974. BRDENABLE(portp->brdnr, portp->pagenr);
  975. stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
  976. stl_cd1400setreg(portp, SRER,
  977. ((stl_cd1400getreg(portp, SRER) & ~SRER_TXDATA) |
  978. SRER_TXEMPTY));
  979. BRDDISABLE(portp->brdnr);
  980. portp->brklen = len;
  981. if (len == 1)
  982. portp->stats.txbreaks++;
  983. restore_flags(flags);
  984. }
  985. /*****************************************************************************/
  986. /*
  987.  * Take flow control actions...
  988.  */
  989. static void stl_cd1400flowctrl(stlport_t *portp, int state)
  990. {
  991. struct tty_struct *tty;
  992. unsigned long flags;
  993. #if DEBUG
  994. printk("stl_cd1400flowctrl(portp=%x,state=%x)n", (int) portp, state);
  995. #endif
  996. if (portp == (stlport_t *) NULL)
  997. return;
  998. tty = portp->tty;
  999. if (tty == (struct tty_struct *) NULL)
  1000. return;
  1001. save_flags(flags);
  1002. cli();
  1003. BRDENABLE(portp->brdnr, portp->pagenr);
  1004. stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
  1005. if (state) {
  1006. if (tty->termios->c_iflag & IXOFF) {
  1007. stl_cd1400ccrwait(portp);
  1008. stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
  1009. portp->stats.rxxon++;
  1010. stl_cd1400ccrwait(portp);
  1011. }
  1012. /*
  1013.  * Question: should we return RTS to what it was before? It may
  1014.  * have been set by an ioctl... Suppose not, since if you have
  1015.  * hardware flow control set then it is pretty silly to go and
  1016.  * set the RTS line by hand.
  1017.  */
  1018. if (tty->termios->c_cflag & CRTSCTS) {
  1019. stl_cd1400setreg(portp, MCOR1,
  1020. (stl_cd1400getreg(portp, MCOR1) |
  1021. FIFO_RTSTHRESHOLD));
  1022. stl_cd1400setreg(portp, MSVR2, MSVR2_RTS);
  1023. portp->stats.rxrtson++;
  1024. }
  1025. } else {
  1026. if (tty->termios->c_iflag & IXOFF) {
  1027. stl_cd1400ccrwait(portp);
  1028. stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
  1029. portp->stats.rxxoff++;
  1030. stl_cd1400ccrwait(portp);
  1031. }
  1032. if (tty->termios->c_cflag & CRTSCTS) {
  1033. stl_cd1400setreg(portp, MCOR1,
  1034. (stl_cd1400getreg(portp, MCOR1) & 0xf0));
  1035. stl_cd1400setreg(portp, MSVR2, 0);
  1036. portp->stats.rxrtsoff++;
  1037. }
  1038. }
  1039. BRDDISABLE(portp->brdnr);
  1040. restore_flags(flags);
  1041. }
  1042. /*****************************************************************************/
  1043. /*
  1044.  * Send a flow control character...
  1045.  */
  1046. static void stl_cd1400sendflow(stlport_t *portp, int state)
  1047. {
  1048. struct tty_struct *tty;
  1049. unsigned long flags;
  1050. #if DEBUG
  1051. printk("stl_cd1400sendflow(portp=%x,state=%x)n", (int) portp, state);
  1052. #endif
  1053. if (portp == (stlport_t *) NULL)
  1054. return;
  1055. tty = portp->tty;
  1056. if (tty == (struct tty_struct *) NULL)
  1057. return;
  1058. save_flags(flags);
  1059. cli();
  1060. BRDENABLE(portp->brdnr, portp->pagenr);
  1061. stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
  1062. if (state) {
  1063. stl_cd1400ccrwait(portp);
  1064. stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
  1065. portp->stats.rxxon++;
  1066. stl_cd1400ccrwait(portp);
  1067. } else {
  1068. stl_cd1400ccrwait(portp);
  1069. stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
  1070. portp->stats.rxxoff++;
  1071. stl_cd1400ccrwait(portp);
  1072. }
  1073. BRDDISABLE(portp->brdnr);
  1074. restore_flags(flags);
  1075. }
  1076. /*****************************************************************************/
  1077. static void stl_cd1400flush(stlport_t *portp)
  1078. {
  1079. unsigned long flags;
  1080. #if DEBUG
  1081. printk("stl_cd1400flush(portp=%x)n", (int) portp);
  1082. #endif
  1083. if (portp == (stlport_t *) NULL)
  1084. return;
  1085. save_flags(flags);
  1086. cli();
  1087. BRDENABLE(portp->brdnr, portp->pagenr);
  1088. stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
  1089. stl_cd1400ccrwait(portp);
  1090. stl_cd1400setreg(portp, CCR, CCR_TXFLUSHFIFO);
  1091. stl_cd1400ccrwait(portp);
  1092. portp->tx.tail = portp->tx.head;
  1093. BRDDISABLE(portp->brdnr);
  1094. restore_flags(flags);
  1095. }
  1096. /*****************************************************************************/
  1097. /*
  1098.  * Return the current state of data flow on this port. This is only
  1099.  * really interresting when determining if data has fully completed
  1100.  * transmission or not... This is easy for the cd1400, it accurately
  1101.  * maintains the busy port flag.
  1102.  */
  1103. static int stl_cd1400datastate(stlport_t *portp)
  1104. {
  1105. #if DEBUG
  1106. printk("stl_cd1400datastate(portp=%x)n", (int) portp);
  1107. #endif
  1108. if (portp == (stlport_t *) NULL)
  1109. return(0);
  1110. return(test_bit(ASYI_TXBUSY, &portp->istate) ? 1 : 0);
  1111. }
  1112. /*****************************************************************************/
  1113. /*
  1114.  * Interrupt service routine for cd1400 EasyIO boards.
  1115.  */
  1116. static void stl_cd1400eiointr(stlpanel_t *panelp, unsigned int iobase)
  1117. {
  1118. unsigned char svrtype;
  1119. #if DEBUG
  1120. printk("stl_cd1400eiointr(panelp=%x,iobase=%x)n",
  1121. (int) panelp, iobase);
  1122. #endif
  1123. outb(SVRR, iobase);
  1124. svrtype = inb(iobase + EREG_DATA);
  1125. if (panelp->nrports > 4) {
  1126. outb((SVRR + 0x80), iobase);
  1127. svrtype |= inb(iobase + EREG_DATA);
  1128. }
  1129. if (svrtype & SVRR_RX)
  1130. stl_cd1400rxisr(panelp, iobase);
  1131. else if (svrtype & SVRR_TX)
  1132. stl_cd1400txisr(panelp, iobase);
  1133. else if (svrtype & SVRR_MDM)
  1134. stl_cd1400mdmisr(panelp, iobase);
  1135. }
  1136. /*****************************************************************************/
  1137. /*
  1138.  * Interrupt service routine for cd1400 panels.
  1139.  */
  1140. static void stl_cd1400echintr(stlpanel_t *panelp, unsigned int iobase)
  1141. {
  1142. unsigned char svrtype;
  1143. #if DEBUG
  1144. printk("stl_cd1400echintr(panelp=%x,iobase=%x)n", (int) panelp,
  1145. iobase);
  1146. #endif
  1147. outb(SVRR, iobase);
  1148. svrtype = inb(iobase + EREG_DATA);
  1149. outb((SVRR + 0x80), iobase);
  1150. svrtype |= inb(iobase + EREG_DATA);
  1151. if (svrtype & SVRR_RX)
  1152. stl_cd1400rxisr(panelp, iobase);
  1153. else if (svrtype & SVRR_TX)
  1154. stl_cd1400txisr(panelp, iobase);
  1155. else if (svrtype & SVRR_MDM)
  1156. stl_cd1400mdmisr(panelp, iobase);
  1157. }
  1158. /*****************************************************************************/
  1159. /*
  1160.  * Unfortunately we need to handle breaks in the TX data stream, since
  1161.  * this is the only way to generate them on the cd1400.
  1162.  */
  1163. static inline int stl_cd1400breakisr(stlport_t *portp, int ioaddr)
  1164. {
  1165. if (portp->brklen == 1) {
  1166. outb((COR2 + portp->uartaddr), ioaddr);
  1167. outb((inb(ioaddr + EREG_DATA) | COR2_ETC),
  1168. (ioaddr + EREG_DATA));
  1169. outb((TDR + portp->uartaddr), ioaddr);
  1170. outb(ETC_CMD, (ioaddr + EREG_DATA));
  1171. outb(ETC_STARTBREAK, (ioaddr + EREG_DATA));
  1172. outb((SRER + portp->uartaddr), ioaddr);
  1173. outb((inb(ioaddr + EREG_DATA) & ~(SRER_TXDATA | SRER_TXEMPTY)),
  1174. (ioaddr + EREG_DATA));
  1175. return(1);
  1176. } else if (portp->brklen > 1) {
  1177. outb((TDR + portp->uartaddr), ioaddr);
  1178. outb(ETC_CMD, (ioaddr + EREG_DATA));
  1179. outb(ETC_STOPBREAK, (ioaddr + EREG_DATA));
  1180. portp->brklen = -1;
  1181. return(1);
  1182. } else {
  1183. outb((COR2 + portp->uartaddr), ioaddr);
  1184. outb((inb(ioaddr + EREG_DATA) & ~COR2_ETC),
  1185. (ioaddr + EREG_DATA));
  1186. portp->brklen = 0;
  1187. }
  1188. return(0);
  1189. }
  1190. /*****************************************************************************/
  1191. /*
  1192.  * Transmit interrupt handler. This has gotta be fast!  Handling TX
  1193.  * chars is pretty simple, stuff as many as possible from the TX buffer
  1194.  * into the cd1400 FIFO. Must also handle TX breaks here, since they
  1195.  * are embedded as commands in the data stream. Oh no, had to use a goto!
  1196.  * This could be optimized more, will do when I get time...
  1197.  * In practice it is possible that interrupts are enabled but that the
  1198.  * port has been hung up. Need to handle not having any TX buffer here,
  1199.  * this is done by using the side effect that head and tail will also
  1200.  * be NULL if the buffer has been freed.
  1201.  */
  1202. static void stl_cd1400txisr(stlpanel_t *panelp, int ioaddr)
  1203. {
  1204. stlport_t *portp;
  1205. int len, stlen;
  1206. char *head, *tail;
  1207. unsigned char ioack, srer;
  1208. #if DEBUG
  1209. printk("stl_cd1400txisr(panelp=%x,ioaddr=%x)n", (int) panelp, ioaddr);
  1210. #endif
  1211. ioack = inb(ioaddr + EREG_TXACK);
  1212. if (((ioack & panelp->ackmask) != 0) ||
  1213.     ((ioack & ACK_TYPMASK) != ACK_TYPTX)) {
  1214. printk("STALLION: bad TX interrupt ack value=%xn", ioack);
  1215. return;
  1216. }
  1217. portp = panelp->ports[(ioack >> 3)];
  1218. /*
  1219.  * Unfortunately we need to handle breaks in the data stream, since
  1220.  * this is the only way to generate them on the cd1400. Do it now if
  1221.  * a break is to be sent.
  1222.  */
  1223. if (portp->brklen != 0)
  1224. if (stl_cd1400breakisr(portp, ioaddr))
  1225. goto stl_txalldone;
  1226. head = portp->tx.head;
  1227. tail = portp->tx.tail;
  1228. len = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
  1229. if ((len == 0) || ((len < STL_TXBUFLOW) &&
  1230.     (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
  1231. set_bit(ASYI_TXLOW, &portp->istate);
  1232. MOD_INC_USE_COUNT;
  1233. if (schedule_task(&portp->tqueue) == 0)
  1234. MOD_DEC_USE_COUNT;
  1235. }
  1236. if (len == 0) {
  1237. outb((SRER + portp->uartaddr), ioaddr);
  1238. srer = inb(ioaddr + EREG_DATA);
  1239. if (srer & SRER_TXDATA) {
  1240. srer = (srer & ~SRER_TXDATA) | SRER_TXEMPTY;
  1241. } else {
  1242. srer &= ~(SRER_TXDATA | SRER_TXEMPTY);
  1243. clear_bit(ASYI_TXBUSY, &portp->istate);
  1244. }
  1245. outb(srer, (ioaddr + EREG_DATA));
  1246. } else {
  1247. len = MIN(len, CD1400_TXFIFOSIZE);
  1248. portp->stats.txtotal += len;
  1249. stlen = MIN(len, ((portp->tx.buf + STL_TXBUFSIZE) - tail));
  1250. outb((TDR + portp->uartaddr), ioaddr);
  1251. outsb((ioaddr + EREG_DATA), tail, stlen);
  1252. len -= stlen;
  1253. tail += stlen;
  1254. if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
  1255. tail = portp->tx.buf;
  1256. if (len > 0) {
  1257. outsb((ioaddr + EREG_DATA), tail, len);
  1258. tail += len;
  1259. }
  1260. portp->tx.tail = tail;
  1261. }
  1262. stl_txalldone:
  1263. outb((EOSRR + portp->uartaddr), ioaddr);
  1264. outb(0, (ioaddr + EREG_DATA));
  1265. }
  1266. /*****************************************************************************/
  1267. /*
  1268.  * Receive character interrupt handler. Determine if we have good chars
  1269.  * or bad chars and then process appropriately. Good chars are easy
  1270.  * just shove the lot into the RX buffer and set all status byte to 0.
  1271.  * If a bad RX char then process as required. This routine needs to be
  1272.  * fast!  In practice it is possible that we get an interrupt on a port
  1273.  * that is closed. This can happen on hangups - since they completely
  1274.  * shutdown a port not in user context. Need to handle this case.
  1275.  */
  1276. static void stl_cd1400rxisr(stlpanel_t *panelp, int ioaddr)
  1277. {
  1278. stlport_t *portp;
  1279. struct tty_struct *tty;
  1280. unsigned int ioack, len, buflen;
  1281. unsigned char status;
  1282. char ch;
  1283. #if DEBUG
  1284. printk("stl_cd1400rxisr(panelp=%x,ioaddr=%x)n", (int) panelp, ioaddr);
  1285. #endif
  1286. ioack = inb(ioaddr + EREG_RXACK);
  1287. if ((ioack & panelp->ackmask) != 0) {
  1288. printk("STALLION: bad RX interrupt ack value=%xn", ioack);
  1289. return;
  1290. }
  1291. portp = panelp->ports[(ioack >> 3)];
  1292. tty = portp->tty;
  1293. if ((ioack & ACK_TYPMASK) == ACK_TYPRXGOOD) {
  1294. outb((RDCR + portp->uartaddr), ioaddr);
  1295. len = inb(ioaddr + EREG_DATA);
  1296. if ((tty == (struct tty_struct *) NULL) ||
  1297.     (tty->flip.char_buf_ptr == (char *) NULL) ||
  1298.     ((buflen = TTY_FLIPBUF_SIZE - tty->flip.count) == 0)) {
  1299. len = MIN(len, sizeof(stl_unwanted));
  1300. outb((RDSR + portp->uartaddr), ioaddr);
  1301. insb((ioaddr + EREG_DATA), &stl_unwanted[0], len);
  1302. portp->stats.rxlost += len;
  1303. portp->stats.rxtotal += len;
  1304. } else {
  1305. len = MIN(len, buflen);
  1306. if (len > 0) {
  1307. outb((RDSR + portp->uartaddr), ioaddr);
  1308. insb((ioaddr + EREG_DATA), tty->flip.char_buf_ptr, len);
  1309. memset(tty->flip.flag_buf_ptr, 0, len);
  1310. tty->flip.flag_buf_ptr += len;
  1311. tty->flip.char_buf_ptr += len;
  1312. tty->flip.count += len;
  1313. tty_schedule_flip(tty);
  1314. portp->stats.rxtotal += len;
  1315. }
  1316. }
  1317. } else if ((ioack & ACK_TYPMASK) == ACK_TYPRXBAD) {
  1318. outb((RDSR + portp->uartaddr), ioaddr);
  1319. status = inb(ioaddr + EREG_DATA);
  1320. ch = inb(ioaddr + EREG_DATA);
  1321. if (status & ST_PARITY)
  1322. portp->stats.rxparity++;
  1323. if (status & ST_FRAMING)
  1324. portp->stats.rxframing++;
  1325. if (status & ST_OVERRUN)
  1326. portp->stats.rxoverrun++;
  1327. if (status & ST_BREAK)
  1328. portp->stats.rxbreaks++;
  1329. if (status & ST_SCHARMASK) {
  1330. if ((status & ST_SCHARMASK) == ST_SCHAR1)
  1331. portp->stats.txxon++;
  1332. if ((status & ST_SCHARMASK) == ST_SCHAR2)
  1333. portp->stats.txxoff++;
  1334. goto stl_rxalldone;
  1335. }
  1336. if ((tty != (struct tty_struct *) NULL) &&
  1337.     ((portp->rxignoremsk & status) == 0)) {
  1338. if (portp->rxmarkmsk & status) {
  1339. if (status & ST_BREAK) {
  1340. status = TTY_BREAK;
  1341. if (portp->flags & ASYNC_SAK) {
  1342. do_SAK(tty);
  1343. BRDENABLE(portp->brdnr, portp->pagenr);
  1344. }
  1345. } else if (status & ST_PARITY) {
  1346. status = TTY_PARITY;
  1347. } else if (status & ST_FRAMING) {
  1348. status = TTY_FRAME;
  1349. } else if(status & ST_OVERRUN) {
  1350. status = TTY_OVERRUN;
  1351. } else {
  1352. status = 0;
  1353. }
  1354. } else {
  1355. status = 0;
  1356. }
  1357. if (tty->flip.char_buf_ptr != (char *) NULL) {
  1358. if (tty->flip.count < TTY_FLIPBUF_SIZE) {
  1359. *tty->flip.flag_buf_ptr++ = status;
  1360. *tty->flip.char_buf_ptr++ = ch;
  1361. tty->flip.count++;
  1362. }
  1363. tty_schedule_flip(tty);
  1364. }
  1365. }
  1366. } else {
  1367. printk("STALLION: bad RX interrupt ack value=%xn", ioack);
  1368. return;
  1369. }
  1370. stl_rxalldone:
  1371. outb((EOSRR + portp->uartaddr), ioaddr);
  1372. outb(0, (ioaddr + EREG_DATA));
  1373. }
  1374. /*****************************************************************************/
  1375. /*
  1376.  * Modem interrupt handler. The is called when the modem signal line
  1377.  * (DCD) has changed state. Leave most of the work to the off-level
  1378.  * processing routine.
  1379.  */
  1380. static void stl_cd1400mdmisr(stlpanel_t *panelp, int ioaddr)
  1381. {
  1382. stlport_t *portp;
  1383. unsigned int ioack;
  1384. unsigned char misr;
  1385. #if DEBUG
  1386. printk("stl_cd1400mdmisr(panelp=%x)n", (int) panelp);
  1387. #endif
  1388. ioack = inb(ioaddr + EREG_MDACK);
  1389. if (((ioack & panelp->ackmask) != 0) ||
  1390.     ((ioack & ACK_TYPMASK) != ACK_TYPMDM)) {
  1391. printk("STALLION: bad MODEM interrupt ack value=%xn", ioack);
  1392. return;
  1393. }
  1394. portp = panelp->ports[(ioack >> 3)];
  1395. outb((MISR + portp->uartaddr), ioaddr);
  1396. misr = inb(ioaddr + EREG_DATA);
  1397. if (misr & MISR_DCD) {
  1398. set_bit(ASYI_DCDCHANGE, &portp->istate);
  1399. MOD_INC_USE_COUNT;
  1400. if (schedule_task(&portp->tqueue) == 0)
  1401. MOD_DEC_USE_COUNT;
  1402. portp->stats.modem++;
  1403. }
  1404. outb((EOSRR + portp->uartaddr), ioaddr);
  1405. outb(0, (ioaddr + EREG_DATA));
  1406. }
  1407. /*****************************************************************************/
  1408. /*                      SC26198 HARDWARE FUNCTIONS                           */
  1409. /*****************************************************************************/
  1410. /*
  1411.  * These functions get/set/update the registers of the sc26198 UARTs.
  1412.  * Access to the sc26198 registers is via an address/data io port pair.
  1413.  * (Maybe should make this inline...)
  1414.  */
  1415. static int stl_sc26198getreg(stlport_t *portp, int regnr)
  1416. {
  1417. outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
  1418. return(inb(portp->ioaddr + XP_DATA));
  1419. }
  1420. static void stl_sc26198setreg(stlport_t *portp, int regnr, int value)
  1421. {
  1422. outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
  1423. outb(value, (portp->ioaddr + XP_DATA));
  1424. }
  1425. static int stl_sc26198updatereg(stlport_t *portp, int regnr, int value)
  1426. {
  1427. outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
  1428. if (inb(portp->ioaddr + XP_DATA) != value) {
  1429. outb(value, (portp->ioaddr + XP_DATA));
  1430. return(1);
  1431. }
  1432. return(0);
  1433. }
  1434. /*****************************************************************************/
  1435. /*
  1436.  * Functions to get and set the sc26198 global registers.
  1437.  */
  1438. static int stl_sc26198getglobreg(stlport_t *portp, int regnr)
  1439. {
  1440. outb(regnr, (portp->ioaddr + XP_ADDR));
  1441. return(inb(portp->ioaddr + XP_DATA));
  1442. }
  1443. #if 0
  1444. static void stl_sc26198setglobreg(stlport_t *portp, int regnr, int value)
  1445. {
  1446. outb(regnr, (portp->ioaddr + XP_ADDR));
  1447. outb(value, (portp->ioaddr + XP_DATA));
  1448. }
  1449. #endif
  1450. /*****************************************************************************/
  1451. /*
  1452.  * Inbitialize the UARTs in a panel. We don't care what sort of board
  1453.  * these ports are on - since the port io registers are almost
  1454.  * identical when dealing with ports.
  1455.  */
  1456. static int stl_sc26198panelinit(stlbrd_t *brdp, stlpanel_t *panelp)
  1457. {
  1458. int chipmask, i;
  1459. int nrchips, ioaddr;
  1460. #if DEBUG
  1461. printk("stl_sc26198panelinit(brdp=%x,panelp=%x)n",
  1462. (int) brdp, (int) panelp);
  1463. #endif
  1464. BRDENABLE(panelp->brdnr, panelp->pagenr);
  1465. /*
  1466.  * Check that each chip is present and started up OK.
  1467.  */
  1468. chipmask = 0;
  1469. nrchips = (panelp->nrports + 4) / SC26198_PORTS;
  1470. if (brdp->brdtype == BRD_ECHPCI)
  1471. outb(panelp->pagenr, brdp->ioctrl);
  1472. for (i = 0; (i < nrchips); i++) {
  1473. ioaddr = panelp->iobase + (i * 4); 
  1474. outb(SCCR, (ioaddr + XP_ADDR));
  1475. outb(CR_RESETALL, (ioaddr + XP_DATA));
  1476. outb(TSTR, (ioaddr + XP_ADDR));
  1477. if (inb(ioaddr + XP_DATA) != 0) {
  1478. printk("STALLION: sc26198 not responding, "
  1479. "brd=%d panel=%d chip=%dn",
  1480. panelp->brdnr, panelp->panelnr, i);
  1481. continue;
  1482. }
  1483. chipmask |= (0x1 << i);
  1484. outb(GCCR, (ioaddr + XP_ADDR));
  1485. outb(GCCR_IVRTYPCHANACK, (ioaddr + XP_DATA));
  1486. outb(WDTRCR, (ioaddr + XP_ADDR));
  1487. outb(0xff, (ioaddr + XP_DATA));
  1488. }
  1489. BRDDISABLE(panelp->brdnr);
  1490. return(chipmask);
  1491. }
  1492. /*****************************************************************************/
  1493. /*
  1494.  * Initialize hardware specific port registers.
  1495.  */
  1496. static void stl_sc26198portinit(stlbrd_t *brdp, stlpanel_t *panelp, stlport_t *portp)
  1497. {
  1498. #if DEBUG
  1499. printk("stl_sc26198portinit(brdp=%x,panelp=%x,portp=%x)n",
  1500. (int) brdp, (int) panelp, (int) portp);
  1501. #endif
  1502. if ((brdp == (stlbrd_t *) NULL) || (panelp == (stlpanel_t *) NULL) ||
  1503.     (portp == (stlport_t *) NULL))
  1504. return;
  1505. portp->ioaddr = panelp->iobase + ((portp->portnr < 8) ? 0 : 4);
  1506. portp->uartaddr = (portp->portnr & 0x07) << 4;
  1507. portp->pagenr = panelp->pagenr;
  1508. portp->hwid = 0x1;
  1509. BRDENABLE(portp->brdnr, portp->pagenr);
  1510. stl_sc26198setreg(portp, IOPCR, IOPCR_SETSIGS);
  1511. BRDDISABLE(portp->brdnr);
  1512. }
  1513. /*****************************************************************************/
  1514. /*
  1515.  * Set up the sc26198 registers for a port based on the termios port
  1516.  * settings.
  1517.  */
  1518. static void stl_sc26198setport(stlport_t *portp, struct termios *tiosp)
  1519. {
  1520. stlbrd_t *brdp;
  1521. unsigned long flags;
  1522. unsigned int baudrate;
  1523. unsigned char mr0, mr1, mr2, clk;
  1524. unsigned char imron, imroff, iopr, ipr;
  1525. mr0 = 0;
  1526. mr1 = 0;
  1527. mr2 = 0;
  1528. clk = 0;
  1529. iopr = 0;
  1530. imron = 0;
  1531. imroff = 0;
  1532. brdp = stl_brds[portp->brdnr];
  1533. if (brdp == (stlbrd_t *) NULL)
  1534. return;
  1535. /*
  1536.  * Set up the RX char ignore mask with those RX error types we
  1537.  * can ignore.
  1538.  */
  1539. portp->rxignoremsk = 0;
  1540. if (tiosp->c_iflag & IGNPAR)
  1541. portp->rxignoremsk |= (SR_RXPARITY | SR_RXFRAMING |
  1542. SR_RXOVERRUN);
  1543. if (tiosp->c_iflag & IGNBRK)
  1544. portp->rxignoremsk |= SR_RXBREAK;
  1545. portp->rxmarkmsk = SR_RXOVERRUN;
  1546. if (tiosp->c_iflag & (INPCK | PARMRK))
  1547. portp->rxmarkmsk |= (SR_RXPARITY | SR_RXFRAMING);
  1548. if (tiosp->c_iflag & BRKINT)
  1549. portp->rxmarkmsk |= SR_RXBREAK;
  1550. /*
  1551.  * Go through the char size, parity and stop bits and set all the
  1552.  * option register appropriately.
  1553.  */
  1554. switch (tiosp->c_cflag & CSIZE) {
  1555. case CS5:
  1556. mr1 |= MR1_CS5;
  1557. break;
  1558. case CS6:
  1559. mr1 |= MR1_CS6;
  1560. break;
  1561. case CS7:
  1562. mr1 |= MR1_CS7;
  1563. break;
  1564. default:
  1565. mr1 |= MR1_CS8;
  1566. break;
  1567. }
  1568. if (tiosp->c_cflag & CSTOPB)
  1569. mr2 |= MR2_STOP2;
  1570. else
  1571. mr2 |= MR2_STOP1;
  1572. if (tiosp->c_cflag & PARENB) {
  1573. if (tiosp->c_cflag & PARODD)
  1574. mr1 |= (MR1_PARENB | MR1_PARODD);
  1575. else
  1576. mr1 |= (MR1_PARENB | MR1_PAREVEN);
  1577. } else {
  1578. mr1 |= MR1_PARNONE;
  1579. }
  1580. mr1 |= MR1_ERRBLOCK;
  1581. /*
  1582.  * Set the RX FIFO threshold at 8 chars. This gives a bit of breathing
  1583.  * space for hardware flow control and the like. This should be set to
  1584.  * VMIN.
  1585.  */
  1586. mr2 |= MR2_RXFIFOHALF;
  1587. /*
  1588.  * Calculate the baud rate timers. For now we will just assume that
  1589.  * the input and output baud are the same. The sc26198 has a fixed
  1590.  * baud rate table, so only discrete baud rates possible.
  1591.  */
  1592. baudrate = tiosp->c_cflag & CBAUD;
  1593. if (baudrate & CBAUDEX) {
  1594. baudrate &= ~CBAUDEX;
  1595. if ((baudrate < 1) || (baudrate > 4))
  1596. tiosp->c_cflag &= ~CBAUDEX;
  1597. else
  1598. baudrate += 15;
  1599. }
  1600. baudrate = stl_baudrates[baudrate];
  1601. if ((tiosp->c_cflag & CBAUD) == B38400) {
  1602. if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
  1603. baudrate = 57600;
  1604. else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
  1605. baudrate = 115200;
  1606. else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
  1607. baudrate = 230400;
  1608. else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
  1609. baudrate = 460800;
  1610. else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
  1611. baudrate = (portp->baud_base / portp->custom_divisor);
  1612. }
  1613. if (baudrate > STL_SC26198MAXBAUD)
  1614. baudrate = STL_SC26198MAXBAUD;
  1615. if (baudrate > 0) {
  1616. for (clk = 0; (clk < SC26198_NRBAUDS); clk++) {
  1617. if (baudrate <= sc26198_baudtable[clk])
  1618. break;
  1619. }
  1620. }
  1621. /*
  1622.  * Check what form of modem signaling is required and set it up.
  1623.  */
  1624. if (tiosp->c_cflag & CLOCAL) {
  1625. portp->flags &= ~ASYNC_CHECK_CD;
  1626. } else {
  1627. iopr |= IOPR_DCDCOS;
  1628. imron |= IR_IOPORT;
  1629. portp->flags |= ASYNC_CHECK_CD;
  1630. }
  1631. /*
  1632.  * Setup sc26198 enhanced modes if we can. In particular we want to
  1633.  * handle as much of the flow control as possible automatically. As
  1634.  * well as saving a few CPU cycles it will also greatly improve flow
  1635.  * control reliability.
  1636.  */
  1637. if (tiosp->c_iflag & IXON) {
  1638. mr0 |= MR0_SWFTX | MR0_SWFT;
  1639. imron |= IR_XONXOFF;
  1640. } else {
  1641. imroff |= IR_XONXOFF;
  1642. }
  1643. if (tiosp->c_iflag & IXOFF)
  1644. mr0 |= MR0_SWFRX;
  1645. if (tiosp->c_cflag & CRTSCTS) {
  1646. mr2 |= MR2_AUTOCTS;
  1647. mr1 |= MR1_AUTORTS;
  1648. }
  1649. /*
  1650.  * All sc26198 register values calculated so go through and set
  1651.  * them all up.
  1652.  */
  1653. #if DEBUG
  1654. printk("SETPORT: portnr=%d panelnr=%d brdnr=%dn",
  1655. portp->portnr, portp->panelnr, portp->brdnr);
  1656. printk("    mr0=%x mr1=%x mr2=%x clk=%xn", mr0, mr1, mr2, clk);
  1657. printk("    iopr=%x imron=%x imroff=%xn", iopr, imron, imroff);
  1658. printk("    schr1=%x schr2=%x schr3=%x schr4=%xn",
  1659. tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP],
  1660. tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP]);
  1661. #endif
  1662. save_flags(flags);
  1663. cli();
  1664. BRDENABLE(portp->brdnr, portp->pagenr);
  1665. stl_sc26198setreg(portp, IMR, 0);
  1666. stl_sc26198updatereg(portp, MR0, mr0);
  1667. stl_sc26198updatereg(portp, MR1, mr1);
  1668. stl_sc26198setreg(portp, SCCR, CR_RXERRBLOCK);
  1669. stl_sc26198updatereg(portp, MR2, mr2);
  1670. stl_sc26198updatereg(portp, IOPIOR,
  1671. ((stl_sc26198getreg(portp, IOPIOR) & ~IPR_CHANGEMASK) | iopr));
  1672. if (baudrate > 0) {
  1673. stl_sc26198setreg(portp, TXCSR, clk);
  1674. stl_sc26198setreg(portp, RXCSR, clk);
  1675. }
  1676. stl_sc26198setreg(portp, XONCR, tiosp->c_cc[VSTART]);
  1677. stl_sc26198setreg(portp, XOFFCR, tiosp->c_cc[VSTOP]);
  1678. ipr = stl_sc26198getreg(portp, IPR);
  1679. if (ipr & IPR_DCD)
  1680. portp->sigs &= ~TIOCM_CD;
  1681. else
  1682. portp->sigs |= TIOCM_CD;
  1683. portp->imr = (portp->imr & ~imroff) | imron;
  1684. stl_sc26198setreg(portp, IMR, portp->imr);
  1685. BRDDISABLE(portp->brdnr);
  1686. restore_flags(flags);
  1687. }
  1688. /*****************************************************************************/
  1689. /*
  1690.  * Set the state of the DTR and RTS signals.
  1691.  */
  1692. static void stl_sc26198setsignals(stlport_t *portp, int dtr, int rts)
  1693. {
  1694. unsigned char iopioron, iopioroff;
  1695. unsigned long flags;
  1696. #if DEBUG
  1697. printk("stl_sc26198setsignals(portp=%x,dtr=%d,rts=%d)n",
  1698. (int) portp, dtr, rts);
  1699. #endif
  1700. iopioron = 0;
  1701. iopioroff = 0;
  1702. if (dtr == 0)
  1703. iopioroff |= IPR_DTR;
  1704. else if (dtr > 0)
  1705. iopioron |= IPR_DTR;
  1706. if (rts == 0)
  1707. iopioroff |= IPR_RTS;
  1708. else if (rts > 0)
  1709. iopioron |= IPR_RTS;
  1710. save_flags(flags);
  1711. cli();
  1712. BRDENABLE(portp->brdnr, portp->pagenr);
  1713. stl_sc26198setreg(portp, IOPIOR,
  1714. ((stl_sc26198getreg(portp, IOPIOR) & ~iopioroff) | iopioron));
  1715. BRDDISABLE(portp->brdnr);
  1716. restore_flags(flags);
  1717. }
  1718. /*****************************************************************************/
  1719. /*
  1720.  * Return the state of the signals.
  1721.  */
  1722. static int stl_sc26198getsignals(stlport_t *portp)
  1723. {
  1724. unsigned char ipr;
  1725. unsigned long flags;
  1726. int sigs;
  1727. #if DEBUG
  1728. printk("stl_sc26198getsignals(portp=%x)n", (int) portp);
  1729. #endif
  1730. save_flags(flags);
  1731. cli();
  1732. BRDENABLE(portp->brdnr, portp->pagenr);
  1733. ipr = stl_sc26198getreg(portp, IPR);
  1734. BRDDISABLE(portp->brdnr);
  1735. restore_flags(flags);
  1736. sigs = 0;
  1737. sigs |= (ipr & IPR_DCD) ? 0 : TIOCM_CD;
  1738. sigs |= (ipr & IPR_CTS) ? 0 : TIOCM_CTS;
  1739. sigs |= (ipr & IPR_DTR) ? 0: TIOCM_DTR;
  1740. sigs |= (ipr & IPR_RTS) ? 0: TIOCM_RTS;
  1741. sigs |= TIOCM_DSR;
  1742. return(sigs);
  1743. }
  1744. /*****************************************************************************/
  1745. /*
  1746.  * Enable/Disable the Transmitter and/or Receiver.
  1747.  */
  1748. static void stl_sc26198enablerxtx(stlport_t *portp, int rx, int tx)
  1749. {
  1750. unsigned char ccr;
  1751. unsigned long flags;
  1752. #if DEBUG
  1753. printk("stl_sc26198enablerxtx(portp=%x,rx=%d,tx=%d)n",
  1754. (int) portp, rx, tx);
  1755. #endif
  1756. ccr = portp->crenable;
  1757. if (tx == 0)
  1758. ccr &= ~CR_TXENABLE;
  1759. else if (tx > 0)
  1760. ccr |= CR_TXENABLE;
  1761. if (rx == 0)
  1762. ccr &= ~CR_RXENABLE;
  1763. else if (rx > 0)
  1764. ccr |= CR_RXENABLE;
  1765. save_flags(flags);
  1766. cli();
  1767. BRDENABLE(portp->brdnr, portp->pagenr);
  1768. stl_sc26198setreg(portp, SCCR, ccr);
  1769. BRDDISABLE(portp->brdnr);
  1770. portp->crenable = ccr;
  1771. restore_flags(flags);
  1772. }
  1773. /*****************************************************************************/
  1774. /*
  1775.  * Start/stop the Transmitter and/or Receiver.
  1776.  */
  1777. static void stl_sc26198startrxtx(stlport_t *portp, int rx, int tx)
  1778. {
  1779. unsigned char imr;
  1780. unsigned long flags;
  1781. #if DEBUG
  1782. printk("stl_sc26198startrxtx(portp=%x,rx=%d,tx=%d)n",
  1783. (int) portp, rx, tx);
  1784. #endif
  1785. imr = portp->imr;
  1786. if (tx == 0)
  1787. imr &= ~IR_TXRDY;
  1788. else if (tx == 1)
  1789. imr |= IR_TXRDY;
  1790. if (rx == 0)
  1791. imr &= ~(IR_RXRDY | IR_RXBREAK | IR_RXWATCHDOG);
  1792. else if (rx > 0)
  1793. imr |= IR_RXRDY | IR_RXBREAK | IR_RXWATCHDOG;
  1794. save_flags(flags);
  1795. cli();
  1796. BRDENABLE(portp->brdnr, portp->pagenr);
  1797. stl_sc26198setreg(portp, IMR, imr);
  1798. BRDDISABLE(portp->brdnr);
  1799. portp->imr = imr;
  1800. if (tx > 0)
  1801. set_bit(ASYI_TXBUSY, &portp->istate);
  1802. restore_flags(flags);
  1803. }
  1804. /*****************************************************************************/
  1805. /*
  1806.  * Disable all interrupts from this port.
  1807.  */
  1808. static void stl_sc26198disableintrs(stlport_t *portp)
  1809. {
  1810. unsigned long flags;
  1811. #if DEBUG
  1812. printk("stl_sc26198disableintrs(portp=%x)n", (int) portp);
  1813. #endif
  1814. save_flags(flags);
  1815. cli();
  1816. BRDENABLE(portp->brdnr, portp->pagenr);
  1817. portp->imr = 0;
  1818. stl_sc26198setreg(portp, IMR, 0);
  1819. BRDDISABLE(portp->brdnr);
  1820. restore_flags(flags);
  1821. }
  1822. /*****************************************************************************/
  1823. static void stl_sc26198sendbreak(stlport_t *portp, int len)
  1824. {
  1825. unsigned long flags;
  1826. #if DEBUG
  1827. printk("stl_sc26198sendbreak(portp=%x,len=%d)n", (int) portp, len);
  1828. #endif
  1829. save_flags(flags);
  1830. cli();
  1831. BRDENABLE(portp->brdnr, portp->pagenr);
  1832. if (len == 1) {
  1833. stl_sc26198setreg(portp, SCCR, CR_TXSTARTBREAK);
  1834. portp->stats.txbreaks++;
  1835. } else {
  1836. stl_sc26198setreg(portp, SCCR, CR_TXSTOPBREAK);
  1837. }
  1838. BRDDISABLE(portp->brdnr);
  1839. restore_flags(flags);
  1840. }
  1841. /*****************************************************************************/
  1842. /*
  1843.  * Take flow control actions...
  1844.  */
  1845. static void stl_sc26198flowctrl(stlport_t *portp, int state)
  1846. {
  1847. struct tty_struct *tty;
  1848. unsigned long flags;
  1849. unsigned char mr0;
  1850. #if DEBUG
  1851. printk("stl_sc26198flowctrl(portp=%x,state=%x)n", (int) portp, state);
  1852. #endif
  1853. if (portp == (stlport_t *) NULL)
  1854. return;
  1855. tty = portp->tty;
  1856. if (tty == (struct tty_struct *) NULL)
  1857. return;
  1858. save_flags(flags);
  1859. cli();
  1860. BRDENABLE(portp->brdnr, portp->pagenr);
  1861. if (state) {
  1862. if (tty->termios->c_iflag & IXOFF) {
  1863. mr0 = stl_sc26198getreg(portp, MR0);
  1864. stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
  1865. stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
  1866. mr0 |= MR0_SWFRX;
  1867. portp->stats.rxxon++;
  1868. stl_sc26198wait(portp);
  1869. stl_sc26198setreg(portp, MR0, mr0);
  1870. }
  1871. /*
  1872.  * Question: should we return RTS to what it was before? It may
  1873.  * have been set by an ioctl... Suppose not, since if you have
  1874.  * hardware flow control set then it is pretty silly to go and
  1875.  * set the RTS line by hand.
  1876.  */
  1877. if (tty->termios->c_cflag & CRTSCTS) {
  1878. stl_sc26198setreg(portp, MR1,
  1879. (stl_sc26198getreg(portp, MR1) | MR1_AUTORTS));
  1880. stl_sc26198setreg(portp, IOPIOR,
  1881. (stl_sc26198getreg(portp, IOPIOR) | IOPR_RTS));
  1882. portp->stats.rxrtson++;
  1883. }
  1884. } else {
  1885. if (tty->termios->c_iflag & IXOFF) {
  1886. mr0 = stl_sc26198getreg(portp, MR0);
  1887. stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
  1888. stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
  1889. mr0 &= ~MR0_SWFRX;
  1890. portp->stats.rxxoff++;
  1891. stl_sc26198wait(portp);
  1892. stl_sc26198setreg(portp, MR0, mr0);
  1893. }
  1894. if (tty->termios->c_cflag & CRTSCTS) {
  1895. stl_sc26198setreg(portp, MR1,
  1896. (stl_sc26198getreg(portp, MR1) & ~MR1_AUTORTS));
  1897. stl_sc26198setreg(portp, IOPIOR,
  1898. (stl_sc26198getreg(portp, IOPIOR) & ~IOPR_RTS));
  1899. portp->stats.rxrtsoff++;
  1900. }
  1901. }
  1902. BRDDISABLE(portp->brdnr);
  1903. restore_flags(flags);
  1904. }
  1905. /*****************************************************************************/
  1906. /*
  1907.  * Send a flow control character.
  1908.  */
  1909. static void stl_sc26198sendflow(stlport_t *portp, int state)
  1910. {
  1911. struct tty_struct *tty;
  1912. unsigned long flags;
  1913. unsigned char mr0;
  1914. #if DEBUG
  1915. printk("stl_sc26198sendflow(portp=%x,state=%x)n", (int) portp, state);
  1916. #endif
  1917. if (portp == (stlport_t *) NULL)
  1918. return;
  1919. tty = portp->tty;
  1920. if (tty == (struct tty_struct *) NULL)
  1921. return;
  1922. save_flags(flags);
  1923. cli();
  1924. BRDENABLE(portp->brdnr, portp->pagenr);
  1925. if (state) {
  1926. mr0 = stl_sc26198getreg(portp, MR0);
  1927. stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
  1928. stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
  1929. mr0 |= MR0_SWFRX;
  1930. portp->stats.rxxon++;
  1931. stl_sc26198wait(portp);
  1932. stl_sc26198setreg(portp, MR0, mr0);
  1933. } else {
  1934. mr0 = stl_sc26198getreg(portp, MR0);
  1935. stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
  1936. stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
  1937. mr0 &= ~MR0_SWFRX;
  1938. portp->stats.rxxoff++;
  1939. stl_sc26198wait(portp);
  1940. stl_sc26198setreg(portp, MR0, mr0);
  1941. }
  1942. BRDDISABLE(portp->brdnr);
  1943. restore_flags(flags);
  1944. }
  1945. /*****************************************************************************/
  1946. static void stl_sc26198flush(stlport_t *portp)
  1947. {
  1948. unsigned long flags;
  1949. #if DEBUG
  1950. printk("stl_sc26198flush(portp=%x)n", (int) portp);
  1951. #endif
  1952. if (portp == (stlport_t *) NULL)
  1953. return;
  1954. save_flags(flags);
  1955. cli();
  1956. BRDENABLE(portp->brdnr, portp->pagenr);
  1957. stl_sc26198setreg(portp, SCCR, CR_TXRESET);
  1958. stl_sc26198setreg(portp, SCCR, portp->crenable);
  1959. BRDDISABLE(portp->brdnr);
  1960. portp->tx.tail = portp->tx.head;
  1961. restore_flags(flags);
  1962. }
  1963. /*****************************************************************************/
  1964. /*
  1965.  * Return the current state of data flow on this port. This is only
  1966.  * really interresting when determining if data has fully completed
  1967.  * transmission or not... The sc26198 interrupt scheme cannot
  1968.  * determine when all data has actually drained, so we need to
  1969.  * check the port statusy register to be sure.
  1970.  */
  1971. static int stl_sc26198datastate(stlport_t *portp)
  1972. {
  1973. unsigned long flags;
  1974. unsigned char sr;
  1975. #if DEBUG
  1976. printk("stl_sc26198datastate(portp=%x)n", (int) portp);
  1977. #endif
  1978. if (portp == (stlport_t *) NULL)
  1979. return(0);
  1980. if (test_bit(ASYI_TXBUSY, &portp->istate))
  1981. return(1);
  1982. save_flags(flags);
  1983. cli();
  1984. BRDENABLE(portp->brdnr, portp->pagenr);
  1985. sr = stl_sc26198getreg(portp, SR);
  1986. BRDDISABLE(portp->brdnr);
  1987. restore_flags(flags);
  1988. return((sr & SR_TXEMPTY) ? 0 : 1);
  1989. }
  1990. /*****************************************************************************/
  1991. /*
  1992.  * Delay for a small amount of time, to give the sc26198 a chance
  1993.  * to process a command...
  1994.  */
  1995. static void stl_sc26198wait(stlport_t *portp)
  1996. {
  1997. int i;
  1998. #if DEBUG
  1999. printk("stl_sc26198wait(portp=%x)n", (int) portp);
  2000. #endif
  2001. if (portp == (stlport_t *) NULL)
  2002. return;
  2003. for (i = 0; (i < 20); i++)
  2004. stl_sc26198getglobreg(portp, TSTR);
  2005. }
  2006. /*****************************************************************************/
  2007. /*
  2008.  * If we are TX flow controlled and in IXANY mode then we may
  2009.  * need to unflow control here. We gotta do this because of the
  2010.  * automatic flow control modes of the sc26198.
  2011.  */
  2012. static inline void stl_sc26198txunflow(stlport_t *portp, struct tty_struct *tty)
  2013. {
  2014. unsigned char mr0;
  2015. mr0 = stl_sc26198getreg(portp, MR0);
  2016. stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
  2017. stl_sc26198setreg(portp, SCCR, CR_HOSTXON);
  2018. stl_sc26198wait(portp);
  2019. stl_sc26198setreg(portp, MR0, mr0);
  2020. clear_bit(ASYI_TXFLOWED, &portp->istate);
  2021. }
  2022. /*****************************************************************************/
  2023. /*
  2024.  * Interrupt service routine for sc26198 panels.
  2025.  */
  2026. static void stl_sc26198intr(stlpanel_t *panelp, unsigned int iobase)
  2027. {
  2028. stlport_t *portp;
  2029. unsigned int iack;
  2030. /* 
  2031.  * Work around bug in sc26198 chip... Cannot have A6 address
  2032.  * line of UART high, else iack will be returned as 0.
  2033.  */
  2034. outb(0, (iobase + 1));
  2035. iack = inb(iobase + XP_IACK);
  2036. portp = panelp->ports[(iack & IVR_CHANMASK) + ((iobase & 0x4) << 1)];
  2037. if (iack & IVR_RXDATA)
  2038. stl_sc26198rxisr(portp, iack);
  2039. else if (iack & IVR_TXDATA)
  2040. stl_sc26198txisr(portp);
  2041. else
  2042. stl_sc26198otherisr(portp, iack);
  2043. }
  2044. /*****************************************************************************/
  2045. /*
  2046.  * Transmit interrupt handler. This has gotta be fast!  Handling TX
  2047.  * chars is pretty simple, stuff as many as possible from the TX buffer
  2048.  * into the sc26198 FIFO.
  2049.  * In practice it is possible that interrupts are enabled but that the
  2050.  * port has been hung up. Need to handle not having any TX buffer here,
  2051.  * this is done by using the side effect that head and tail will also
  2052.  * be NULL if the buffer has been freed.
  2053.  */
  2054. static void stl_sc26198txisr(stlport_t *portp)
  2055. {
  2056. unsigned int ioaddr;
  2057. unsigned char mr0;
  2058. int len, stlen;
  2059. char *head, *tail;
  2060. #if DEBUG
  2061. printk("stl_sc26198txisr(portp=%x)n", (int) portp);
  2062. #endif
  2063. ioaddr = portp->ioaddr;
  2064. head = portp->tx.head;
  2065. tail = portp->tx.tail;
  2066. len = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
  2067. if ((len == 0) || ((len < STL_TXBUFLOW) &&
  2068.     (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
  2069. set_bit(ASYI_TXLOW, &portp->istate);
  2070. MOD_INC_USE_COUNT;
  2071. if (schedule_task(&portp->tqueue) == 0)
  2072. MOD_DEC_USE_COUNT;
  2073. }
  2074. if (len == 0) {
  2075. outb((MR0 | portp->uartaddr), (ioaddr + XP_ADDR));
  2076. mr0 = inb(ioaddr + XP_DATA);
  2077. if ((mr0 & MR0_TXMASK) == MR0_TXEMPTY) {
  2078. portp->imr &= ~IR_TXRDY;
  2079. outb((IMR | portp->uartaddr), (ioaddr + XP_ADDR));
  2080. outb(portp->imr, (ioaddr + XP_DATA));
  2081. clear_bit(ASYI_TXBUSY, &portp->istate);
  2082. } else {
  2083. mr0 |= ((mr0 & ~MR0_TXMASK) | MR0_TXEMPTY);
  2084. outb(mr0, (ioaddr + XP_DATA));
  2085. }
  2086. } else {
  2087. len = MIN(len, SC26198_TXFIFOSIZE);
  2088. portp->stats.txtotal += len;
  2089. stlen = MIN(len, ((portp->tx.buf + STL_TXBUFSIZE) - tail));
  2090. outb(GTXFIFO, (ioaddr + XP_ADDR));
  2091. outsb((ioaddr + XP_DATA), tail, stlen);
  2092. len -= stlen;
  2093. tail += stlen;
  2094. if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
  2095. tail = portp->tx.buf;
  2096. if (len > 0) {
  2097. outsb((ioaddr + XP_DATA), tail, len);
  2098. tail += len;
  2099. }
  2100. portp->tx.tail = tail;
  2101. }
  2102. }
  2103. /*****************************************************************************/
  2104. /*
  2105.  * Receive character interrupt handler. Determine if we have good chars
  2106.  * or bad chars and then process appropriately. Good chars are easy
  2107.  * just shove the lot into the RX buffer and set all status byte to 0.
  2108.  * If a bad RX char then process as required. This routine needs to be
  2109.  * fast!  In practice it is possible that we get an interrupt on a port
  2110.  * that is closed. This can happen on hangups - since they completely
  2111.  * shutdown a port not in user context. Need to handle this case.
  2112.  */
  2113. static void stl_sc26198rxisr(stlport_t *portp, unsigned int iack)
  2114. {
  2115. struct tty_struct *tty;
  2116. unsigned int len, buflen, ioaddr;
  2117. #if DEBUG
  2118. printk("stl_sc26198rxisr(portp=%x,iack=%x)n", (int) portp, iack);
  2119. #endif
  2120. tty = portp->tty;
  2121. ioaddr = portp->ioaddr;
  2122. outb(GIBCR, (ioaddr + XP_ADDR));
  2123. len = inb(ioaddr + XP_DATA) + 1;
  2124. if ((iack & IVR_TYPEMASK) == IVR_RXDATA) {
  2125. if ((tty == (struct tty_struct *) NULL) ||
  2126.     (tty->flip.char_buf_ptr == (char *) NULL) ||
  2127.     ((buflen = TTY_FLIPBUF_SIZE - tty->flip.count) == 0)) {
  2128. len = MIN(len, sizeof(stl_unwanted));
  2129. outb(GRXFIFO, (ioaddr + XP_ADDR));
  2130. insb((ioaddr + XP_DATA), &stl_unwanted[0], len);
  2131. portp->stats.rxlost += len;
  2132. portp->stats.rxtotal += len;
  2133. } else {
  2134. len = MIN(len, buflen);
  2135. if (len > 0) {
  2136. outb(GRXFIFO, (ioaddr + XP_ADDR));
  2137. insb((ioaddr + XP_DATA), tty->flip.char_buf_ptr, len);
  2138. memset(tty->flip.flag_buf_ptr, 0, len);
  2139. tty->flip.flag_buf_ptr += len;
  2140. tty->flip.char_buf_ptr += len;
  2141. tty->flip.count += len;
  2142. tty_schedule_flip(tty);
  2143. portp->stats.rxtotal += len;
  2144. }
  2145. }
  2146. } else {
  2147. stl_sc26198rxbadchars(portp);
  2148. }
  2149. /*
  2150.  * If we are TX flow controlled and in IXANY mode then we may need
  2151.  * to unflow control here. We gotta do this because of the automatic
  2152.  * flow control modes of the sc26198.
  2153.  */
  2154. if (test_bit(ASYI_TXFLOWED, &portp->istate)) {
  2155. if ((tty != (struct tty_struct *) NULL) &&
  2156.     (tty->termios != (struct termios *) NULL) &&
  2157.     (tty->termios->c_iflag & IXANY)) {
  2158. stl_sc26198txunflow(portp, tty);
  2159. }
  2160. }
  2161. }
  2162. /*****************************************************************************/
  2163. /*
  2164.  * Process an RX bad character.
  2165.  */
  2166. static void inline stl_sc26198rxbadch(stlport_t *portp, unsigned char status, char ch)
  2167. {
  2168. struct tty_struct *tty;
  2169. unsigned int ioaddr;
  2170. tty = portp->tty;
  2171. ioaddr = portp->ioaddr;
  2172. if (status & SR_RXPARITY)
  2173. portp->stats.rxparity++;
  2174. if (status & SR_RXFRAMING)
  2175. portp->stats.rxframing++;
  2176. if (status & SR_RXOVERRUN)
  2177. portp->stats.rxoverrun++;
  2178. if (status & SR_RXBREAK)
  2179. portp->stats.rxbreaks++;
  2180. if ((tty != (struct tty_struct *) NULL) &&
  2181.     ((portp->rxignoremsk & status) == 0)) {
  2182. if (portp->rxmarkmsk & status) {
  2183. if (status & SR_RXBREAK) {
  2184. status = TTY_BREAK;
  2185. if (portp->flags & ASYNC_SAK) {
  2186. do_SAK(tty);
  2187. BRDENABLE(portp->brdnr, portp->pagenr);
  2188. }
  2189. } else if (status & SR_RXPARITY) {
  2190. status = TTY_PARITY;
  2191. } else if (status & SR_RXFRAMING) {
  2192. status = TTY_FRAME;
  2193. } else if(status & SR_RXOVERRUN) {
  2194. status = TTY_OVERRUN;
  2195. } else {
  2196. status = 0;
  2197. }
  2198. } else {
  2199. status = 0;
  2200. }
  2201. if (tty->flip.char_buf_ptr != (char *) NULL) {
  2202. if (tty->flip.count < TTY_FLIPBUF_SIZE) {
  2203. *tty->flip.flag_buf_ptr++ = status;
  2204. *tty->flip.char_buf_ptr++ = ch;
  2205. tty->flip.count++;
  2206. }
  2207. tty_schedule_flip(tty);
  2208. }
  2209. if (status == 0)
  2210. portp->stats.rxtotal++;
  2211. }
  2212. }
  2213. /*****************************************************************************/
  2214. /*
  2215.  * Process all characters in the RX FIFO of the UART. Check all char
  2216.  * status bytes as well, and process as required. We need to check
  2217.  * all bytes in the FIFO, in case some more enter the FIFO while we
  2218.  * are here. To get the exact character error type we need to switch
  2219.  * into CHAR error mode (that is why we need to make sure we empty
  2220.  * the FIFO).
  2221.  */
  2222. static void stl_sc26198rxbadchars(stlport_t *portp)
  2223. {
  2224. unsigned char status, mr1;
  2225. char ch;
  2226. /*
  2227.  * To get the precise error type for each character we must switch
  2228.  * back into CHAR error mode.
  2229.  */
  2230. mr1 = stl_sc26198getreg(portp, MR1);
  2231. stl_sc26198setreg(portp, MR1, (mr1 & ~MR1_ERRBLOCK));
  2232. while ((status = stl_sc26198getreg(portp, SR)) & SR_RXRDY) {
  2233. stl_sc26198setreg(portp, SCCR, CR_CLEARRXERR);
  2234. ch = stl_sc26198getreg(portp, RXFIFO);
  2235. stl_sc26198rxbadch(portp, status, ch);
  2236. }
  2237. /*
  2238.  * To get correct interrupt class we must switch back into BLOCK
  2239.  * error mode.
  2240.  */
  2241. stl_sc26198setreg(portp, MR1, mr1);
  2242. }
  2243. /*****************************************************************************/
  2244. /*
  2245.  * Other interrupt handler. This includes modem signals, flow
  2246.  * control actions, etc. Most stuff is left to off-level interrupt
  2247.  * processing time.
  2248.  */
  2249. static void stl_sc26198otherisr(stlport_t *portp, unsigned int iack)
  2250. {
  2251. unsigned char cir, ipr, xisr;
  2252. #if DEBUG
  2253. printk("stl_sc26198otherisr(portp=%x,iack=%x)n", (int) portp, iack);
  2254. #endif
  2255. cir = stl_sc26198getglobreg(portp, CIR);
  2256. switch (cir & CIR_SUBTYPEMASK) {
  2257. case CIR_SUBCOS:
  2258. ipr = stl_sc26198getreg(portp, IPR);
  2259. if (ipr & IPR_DCDCHANGE) {
  2260. set_bit(ASYI_DCDCHANGE, &portp->istate);
  2261. MOD_INC_USE_COUNT;
  2262. if (schedule_task(&portp->tqueue) == 0)
  2263. MOD_DEC_USE_COUNT;
  2264. portp->stats.modem++;
  2265. }
  2266. break;
  2267. case CIR_SUBXONXOFF:
  2268. xisr = stl_sc26198getreg(portp, XISR);
  2269. if (xisr & XISR_RXXONGOT) {
  2270. set_bit(ASYI_TXFLOWED, &portp->istate);
  2271. portp->stats.txxoff++;
  2272. }
  2273. if (xisr & XISR_RXXOFFGOT) {
  2274. clear_bit(ASYI_TXFLOWED, &portp->istate);
  2275. portp->stats.txxon++;
  2276. }
  2277. break;
  2278. case CIR_SUBBREAK:
  2279. stl_sc26198setreg(portp, SCCR, CR_BREAKRESET);
  2280. stl_sc26198rxbadchars(portp);
  2281. break;
  2282. default:
  2283. break;
  2284. }
  2285. }
  2286. /*****************************************************************************/