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

Linux/Unix编程

开发平台:

Unix_Linux

  1.  * calculated on the fly, and irrelevant ports are skipped.
  2.  */
  3. for (brdnr = 0; (brdnr < stli_nrbrds); brdnr++) {
  4. brdp = stli_brds[brdnr];
  5. if (brdp == (stlibrd_t *) NULL)
  6. continue;
  7. if (brdp->state == 0)
  8. continue;
  9. maxoff = curoff + (brdp->nrports * MAXLINE);
  10. if (off >= maxoff) {
  11. curoff = maxoff;
  12. continue;
  13. }
  14. totalport = brdnr * STL_MAXPORTS;
  15. for (portnr = 0; (portnr < brdp->nrports); portnr++,
  16.     totalport++) {
  17. portp = brdp->ports[portnr];
  18. if (portp == (stliport_t *) NULL)
  19. continue;
  20. if (off >= (curoff += MAXLINE))
  21. continue;
  22. if ((pos - page + MAXLINE) > count)
  23. goto stli_readdone;
  24. pos += stli_portinfo(brdp, portp, totalport, pos);
  25. }
  26. }
  27. *eof = 1;
  28. stli_readdone:
  29. *start = page;
  30. return(pos - page);
  31. }
  32. /*****************************************************************************/
  33. /*
  34.  * Generic send command routine. This will send a message to the slave,
  35.  * of the specified type with the specified argument. Must be very
  36.  * careful of data that will be copied out from shared memory -
  37.  * containing command results. The command completion is all done from
  38.  * a poll routine that does not have user context. Therefore you cannot
  39.  * copy back directly into user space, or to the kernel stack of a
  40.  * process. This routine does not sleep, so can be called from anywhere.
  41.  */
  42. static void stli_sendcmd(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback)
  43. {
  44. volatile cdkhdr_t *hdrp;
  45. volatile cdkctrl_t *cp;
  46. volatile unsigned char *bits;
  47. unsigned long flags;
  48. #if DEBUG
  49. printk(KERN_DEBUG "stli_sendcmd(brdp=%x,portp=%x,cmd=%x,arg=%x,size=%d,"
  50. "copyback=%d)n", (int) brdp, (int) portp, (int) cmd,
  51. (int) arg, size, copyback);
  52. #endif
  53. save_flags(flags);
  54. cli();
  55. if (test_bit(ST_CMDING, &portp->state)) {
  56. printk(KERN_ERR "STALLION: command already busy, cmd=%x!n",
  57. (int) cmd);
  58. restore_flags(flags);
  59. return;
  60. }
  61. EBRDENABLE(brdp);
  62. cp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl;
  63. if (size > 0) {
  64. memcpy((void *) &(cp->args[0]), arg, size);
  65. if (copyback) {
  66. portp->argp = arg;
  67. portp->argsize = size;
  68. }
  69. }
  70. cp->status = 0;
  71. cp->cmd = cmd;
  72. hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
  73. bits = ((volatile unsigned char *) hdrp) + brdp->slaveoffset +
  74. portp->portidx;
  75. *bits |= portp->portbit;
  76. set_bit(ST_CMDING, &portp->state);
  77. EBRDDISABLE(brdp);
  78. restore_flags(flags);
  79. }
  80. /*****************************************************************************/
  81. /*
  82.  * Read data from shared memory. This assumes that the shared memory
  83.  * is enabled and that interrupts are off. Basically we just empty out
  84.  * the shared memory buffer into the tty buffer. Must be careful to
  85.  * handle the case where we fill up the tty buffer, but still have
  86.  * more chars to unload.
  87.  */
  88. static inline void stli_read(stlibrd_t *brdp, stliport_t *portp)
  89. {
  90. volatile cdkasyrq_t *rp;
  91. volatile char *shbuf;
  92. struct tty_struct *tty;
  93. unsigned int head, tail, size;
  94. unsigned int len, stlen;
  95. #if DEBUG
  96. printk(KERN_DEBUG "stli_read(brdp=%x,portp=%d)n",
  97. (int) brdp, (int) portp);
  98. #endif
  99. if (test_bit(ST_RXSTOP, &portp->state))
  100. return;
  101. tty = portp->tty;
  102. if (tty == (struct tty_struct *) NULL)
  103. return;
  104. rp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->rxq;
  105. head = (unsigned int) rp->head;
  106. if (head != ((unsigned int) rp->head))
  107. head = (unsigned int) rp->head;
  108. tail = (unsigned int) rp->tail;
  109. size = portp->rxsize;
  110. if (head >= tail) {
  111. len = head - tail;
  112. stlen = len;
  113. } else {
  114. len = size - (tail - head);
  115. stlen = size - tail;
  116. }
  117. len = MIN(len, (TTY_FLIPBUF_SIZE - tty->flip.count));
  118. shbuf = (volatile char *) EBRDGETMEMPTR(brdp, portp->rxoffset);
  119. while (len > 0) {
  120. stlen = MIN(len, stlen);
  121. memcpy(tty->flip.char_buf_ptr, (char *) (shbuf + tail), stlen);
  122. memset(tty->flip.flag_buf_ptr, 0, stlen);
  123. tty->flip.char_buf_ptr += stlen;
  124. tty->flip.flag_buf_ptr += stlen;
  125. tty->flip.count += stlen;
  126. len -= stlen;
  127. tail += stlen;
  128. if (tail >= size) {
  129. tail = 0;
  130. stlen = head;
  131. }
  132. }
  133. rp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->rxq;
  134. rp->tail = tail;
  135. if (head != tail)
  136. set_bit(ST_RXING, &portp->state);
  137. tty_schedule_flip(tty);
  138. }
  139. /*****************************************************************************/
  140. /*
  141.  * Set up and carry out any delayed commands. There is only a small set
  142.  * of slave commands that can be done "off-level". So it is not too
  143.  * difficult to deal with them here.
  144.  */
  145. static inline void stli_dodelaycmd(stliport_t *portp, volatile cdkctrl_t *cp)
  146. {
  147. int cmd;
  148. if (test_bit(ST_DOSIGS, &portp->state)) {
  149. if (test_bit(ST_DOFLUSHTX, &portp->state) &&
  150.     test_bit(ST_DOFLUSHRX, &portp->state))
  151. cmd = A_SETSIGNALSF;
  152. else if (test_bit(ST_DOFLUSHTX, &portp->state))
  153. cmd = A_SETSIGNALSFTX;
  154. else if (test_bit(ST_DOFLUSHRX, &portp->state))
  155. cmd = A_SETSIGNALSFRX;
  156. else
  157. cmd = A_SETSIGNALS;
  158. clear_bit(ST_DOFLUSHTX, &portp->state);
  159. clear_bit(ST_DOFLUSHRX, &portp->state);
  160. clear_bit(ST_DOSIGS, &portp->state);
  161. memcpy((void *) &(cp->args[0]), (void *) &portp->asig,
  162. sizeof(asysigs_t));
  163. cp->status = 0;
  164. cp->cmd = cmd;
  165. set_bit(ST_CMDING, &portp->state);
  166. } else if (test_bit(ST_DOFLUSHTX, &portp->state) ||
  167.     test_bit(ST_DOFLUSHRX, &portp->state)) {
  168. cmd = ((test_bit(ST_DOFLUSHTX, &portp->state)) ? FLUSHTX : 0);
  169. cmd |= ((test_bit(ST_DOFLUSHRX, &portp->state)) ? FLUSHRX : 0);
  170. clear_bit(ST_DOFLUSHTX, &portp->state);
  171. clear_bit(ST_DOFLUSHRX, &portp->state);
  172. memcpy((void *) &(cp->args[0]), (void *) &cmd, sizeof(int));
  173. cp->status = 0;
  174. cp->cmd = A_FLUSH;
  175. set_bit(ST_CMDING, &portp->state);
  176. }
  177. }
  178. /*****************************************************************************/
  179. /*
  180.  * Host command service checking. This handles commands or messages
  181.  * coming from the slave to the host. Must have board shared memory
  182.  * enabled and interrupts off when called. Notice that by servicing the
  183.  * read data last we don't need to change the shared memory pointer
  184.  * during processing (which is a slow IO operation).
  185.  * Return value indicates if this port is still awaiting actions from
  186.  * the slave (like open, command, or even TX data being sent). If 0
  187.  * then port is still busy, otherwise no longer busy.
  188.  */
  189. static inline int stli_hostcmd(stlibrd_t *brdp, stliport_t *portp)
  190. {
  191. volatile cdkasy_t *ap;
  192. volatile cdkctrl_t *cp;
  193. struct tty_struct *tty;
  194. asynotify_t nt;
  195. unsigned long oldsigs;
  196. int rc, donerx;
  197. #if DEBUG
  198. printk(KERN_DEBUG "stli_hostcmd(brdp=%x,channr=%d)n",
  199. (int) brdp, channr);
  200. #endif
  201. ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr);
  202. cp = &ap->ctrl;
  203. /*
  204.  * Check if we are waiting for an open completion message.
  205.  */
  206. if (test_bit(ST_OPENING, &portp->state)) {
  207. rc = (int) cp->openarg;
  208. if ((cp->open == 0) && (rc != 0)) {
  209. if (rc > 0)
  210. rc--;
  211. cp->openarg = 0;
  212. portp->rc = rc;
  213. clear_bit(ST_OPENING, &portp->state);
  214. wake_up_interruptible(&portp->raw_wait);
  215. }
  216. }
  217. /*
  218.  * Check if we are waiting for a close completion message.
  219.  */
  220. if (test_bit(ST_CLOSING, &portp->state)) {
  221. rc = (int) cp->closearg;
  222. if ((cp->close == 0) && (rc != 0)) {
  223. if (rc > 0)
  224. rc--;
  225. cp->closearg = 0;
  226. portp->rc = rc;
  227. clear_bit(ST_CLOSING, &portp->state);
  228. wake_up_interruptible(&portp->raw_wait);
  229. }
  230. }
  231. /*
  232.  * Check if we are waiting for a command completion message. We may
  233.  * need to copy out the command results associated with this command.
  234.  */
  235. if (test_bit(ST_CMDING, &portp->state)) {
  236. rc = cp->status;
  237. if ((cp->cmd == 0) && (rc != 0)) {
  238. if (rc > 0)
  239. rc--;
  240. if (portp->argp != (void *) NULL) {
  241. memcpy(portp->argp, (void *) &(cp->args[0]),
  242. portp->argsize);
  243. portp->argp = (void *) NULL;
  244. }
  245. cp->status = 0;
  246. portp->rc = rc;
  247. clear_bit(ST_CMDING, &portp->state);
  248. stli_dodelaycmd(portp, cp);
  249. wake_up_interruptible(&portp->raw_wait);
  250. }
  251. }
  252. /*
  253.  * Check for any notification messages ready. This includes lots of
  254.  * different types of events - RX chars ready, RX break received,
  255.  * TX data low or empty in the slave, modem signals changed state.
  256.  */
  257. donerx = 0;
  258. if (ap->notify) {
  259. nt = ap->changed;
  260. ap->notify = 0;
  261. tty = portp->tty;
  262. if (nt.signal & SG_DCD) {
  263. oldsigs = portp->sigs;
  264. portp->sigs = stli_mktiocm(nt.sigvalue);
  265. clear_bit(ST_GETSIGS, &portp->state);
  266. if ((portp->sigs & TIOCM_CD) &&
  267.     ((oldsigs & TIOCM_CD) == 0))
  268. wake_up_interruptible(&portp->open_wait);
  269. if ((oldsigs & TIOCM_CD) &&
  270.     ((portp->sigs & TIOCM_CD) == 0)) {
  271. if (portp->flags & ASYNC_CHECK_CD) {
  272. if (! ((portp->flags & ASYNC_CALLOUT_ACTIVE) &&
  273.     (portp->flags & ASYNC_CALLOUT_NOHUP))) {
  274. if (tty != (struct tty_struct *) NULL) {
  275. MOD_INC_USE_COUNT;
  276. if (schedule_task(&portp->tqhangup) == 0)
  277. MOD_DEC_USE_COUNT;
  278. }
  279. }
  280. }
  281. }
  282. }
  283. if (nt.data & DT_TXEMPTY)
  284. clear_bit(ST_TXBUSY, &portp->state);
  285. if (nt.data & (DT_TXEMPTY | DT_TXLOW)) {
  286. if (tty != (struct tty_struct *) NULL) {
  287. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  288.     tty->ldisc.write_wakeup) {
  289. (tty->ldisc.write_wakeup)(tty);
  290. EBRDENABLE(brdp);
  291. }
  292. wake_up_interruptible(&tty->write_wait);
  293. }
  294. }
  295. if ((nt.data & DT_RXBREAK) && (portp->rxmarkmsk & BRKINT)) {
  296. if (tty != (struct tty_struct *) NULL) {
  297. if (tty->flip.count < TTY_FLIPBUF_SIZE) {
  298. tty->flip.count++;
  299. *tty->flip.flag_buf_ptr++ = TTY_BREAK;
  300. *tty->flip.char_buf_ptr++ = 0;
  301. if (portp->flags & ASYNC_SAK) {
  302. do_SAK(tty);
  303. EBRDENABLE(brdp);
  304. }
  305. tty_schedule_flip(tty);
  306. }
  307. }
  308. }
  309. if (nt.data & DT_RXBUSY) {
  310. donerx++;
  311. stli_read(brdp, portp);
  312. }
  313. }
  314. /*
  315.  * It might seem odd that we are checking for more RX chars here.
  316.  * But, we need to handle the case where the tty buffer was previously
  317.  * filled, but we had more characters to pass up. The slave will not
  318.  * send any more RX notify messages until the RX buffer has been emptied.
  319.  * But it will leave the service bits on (since the buffer is not empty).
  320.  * So from here we can try to process more RX chars.
  321.  */
  322. if ((!donerx) && test_bit(ST_RXING, &portp->state)) {
  323. clear_bit(ST_RXING, &portp->state);
  324. stli_read(brdp, portp);
  325. }
  326. return((test_bit(ST_OPENING, &portp->state) ||
  327. test_bit(ST_CLOSING, &portp->state) ||
  328. test_bit(ST_CMDING, &portp->state) ||
  329. test_bit(ST_TXBUSY, &portp->state) ||
  330. test_bit(ST_RXING, &portp->state)) ? 0 : 1);
  331. }
  332. /*****************************************************************************/
  333. /*
  334.  * Service all ports on a particular board. Assumes that the boards
  335.  * shared memory is enabled, and that the page pointer is pointed
  336.  * at the cdk header structure.
  337.  */
  338. static inline void stli_brdpoll(stlibrd_t *brdp, volatile cdkhdr_t *hdrp)
  339. {
  340. stliport_t *portp;
  341. unsigned char hostbits[(STL_MAXCHANS / 8) + 1];
  342. unsigned char slavebits[(STL_MAXCHANS / 8) + 1];
  343. unsigned char *slavep;
  344. int bitpos, bitat, bitsize;
  345. int  channr, nrdevs, slavebitchange;
  346. bitsize = brdp->bitsize;
  347. nrdevs = brdp->nrdevs;
  348. /*
  349.  * Check if slave wants any service. Basically we try to do as
  350.  * little work as possible here. There are 2 levels of service
  351.  * bits. So if there is nothing to do we bail early. We check
  352.  * 8 service bits at a time in the inner loop, so we can bypass
  353.  * the lot if none of them want service.
  354.  */
  355. memcpy(&hostbits[0], (((unsigned char *) hdrp) + brdp->hostoffset),
  356. bitsize);
  357. memset(&slavebits[0], 0, bitsize);
  358. slavebitchange = 0;
  359. for (bitpos = 0; (bitpos < bitsize); bitpos++) {
  360. if (hostbits[bitpos] == 0)
  361. continue;
  362. channr = bitpos * 8;
  363. for (bitat = 0x1; (channr < nrdevs); channr++, bitat <<= 1) {
  364. if (hostbits[bitpos] & bitat) {
  365. portp = brdp->ports[(channr - 1)];
  366. if (stli_hostcmd(brdp, portp)) {
  367. slavebitchange++;
  368. slavebits[bitpos] |= bitat;
  369. }
  370. }
  371. }
  372. }
  373. /*
  374.  * If any of the ports are no longer busy then update them in the
  375.  * slave request bits. We need to do this after, since a host port
  376.  * service may initiate more slave requests.
  377.  */
  378. if (slavebitchange) {
  379. hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
  380. slavep = ((unsigned char *) hdrp) + brdp->slaveoffset;
  381. for (bitpos = 0; (bitpos < bitsize); bitpos++) {
  382. if (slavebits[bitpos])
  383. slavep[bitpos] &= ~slavebits[bitpos];
  384. }
  385. }
  386. }
  387. /*****************************************************************************/
  388. /*
  389.  * Driver poll routine. This routine polls the boards in use and passes
  390.  * messages back up to host when necessary. This is actually very
  391.  * CPU efficient, since we will always have the kernel poll clock, it
  392.  * adds only a few cycles when idle (since board service can be
  393.  * determined very easily), but when loaded generates no interrupts
  394.  * (with their expensive associated context change).
  395.  */
  396. static void stli_poll(unsigned long arg)
  397. {
  398. volatile cdkhdr_t *hdrp;
  399. stlibrd_t *brdp;
  400. int  brdnr;
  401. stli_timerlist.expires = STLI_TIMEOUT;
  402. add_timer(&stli_timerlist);
  403. /*
  404.  * Check each board and do any servicing required.
  405.  */
  406. for (brdnr = 0; (brdnr < stli_nrbrds); brdnr++) {
  407. brdp = stli_brds[brdnr];
  408. if (brdp == (stlibrd_t *) NULL)
  409. continue;
  410. if ((brdp->state & BST_STARTED) == 0)
  411. continue;
  412. EBRDENABLE(brdp);
  413. hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
  414. if (hdrp->hostreq)
  415. stli_brdpoll(brdp, hdrp);
  416. EBRDDISABLE(brdp);
  417. }
  418. }
  419. /*****************************************************************************/
  420. /*
  421.  * Translate the termios settings into the port setting structure of
  422.  * the slave.
  423.  */
  424. static void stli_mkasyport(stliport_t *portp, asyport_t *pp, struct termios *tiosp)
  425. {
  426. #if DEBUG
  427. printk(KERN_DEBUG "stli_mkasyport(portp=%x,pp=%x,tiosp=%d)n",
  428. (int) portp, (int) pp, (int) tiosp);
  429. #endif
  430. memset(pp, 0, sizeof(asyport_t));
  431. /*
  432.  * Start of by setting the baud, char size, parity and stop bit info.
  433.  */
  434. pp->baudout = tiosp->c_cflag & CBAUD;
  435. if (pp->baudout & CBAUDEX) {
  436. pp->baudout &= ~CBAUDEX;
  437. if ((pp->baudout < 1) || (pp->baudout > 4))
  438. tiosp->c_cflag &= ~CBAUDEX;
  439. else
  440. pp->baudout += 15;
  441. }
  442. pp->baudout = stli_baudrates[pp->baudout];
  443. if ((tiosp->c_cflag & CBAUD) == B38400) {
  444. if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
  445. pp->baudout = 57600;
  446. else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
  447. pp->baudout = 115200;
  448. else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
  449. pp->baudout = 230400;
  450. else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
  451. pp->baudout = 460800;
  452. else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
  453. pp->baudout = (portp->baud_base / portp->custom_divisor);
  454. }
  455. if (pp->baudout > STL_MAXBAUD)
  456. pp->baudout = STL_MAXBAUD;
  457. pp->baudin = pp->baudout;
  458. switch (tiosp->c_cflag & CSIZE) {
  459. case CS5:
  460. pp->csize = 5;
  461. break;
  462. case CS6:
  463. pp->csize = 6;
  464. break;
  465. case CS7:
  466. pp->csize = 7;
  467. break;
  468. default:
  469. pp->csize = 8;
  470. break;
  471. }
  472. if (tiosp->c_cflag & CSTOPB)
  473. pp->stopbs = PT_STOP2;
  474. else
  475. pp->stopbs = PT_STOP1;
  476. if (tiosp->c_cflag & PARENB) {
  477. if (tiosp->c_cflag & PARODD)
  478. pp->parity = PT_ODDPARITY;
  479. else
  480. pp->parity = PT_EVENPARITY;
  481. } else {
  482. pp->parity = PT_NOPARITY;
  483. }
  484. /*
  485.  * Set up any flow control options enabled.
  486.  */
  487. if (tiosp->c_iflag & IXON) {
  488. pp->flow |= F_IXON;
  489. if (tiosp->c_iflag & IXANY)
  490. pp->flow |= F_IXANY;
  491. }
  492. if (tiosp->c_cflag & CRTSCTS)
  493. pp->flow |= (F_RTSFLOW | F_CTSFLOW);
  494. pp->startin = tiosp->c_cc[VSTART];
  495. pp->stopin = tiosp->c_cc[VSTOP];
  496. pp->startout = tiosp->c_cc[VSTART];
  497. pp->stopout = tiosp->c_cc[VSTOP];
  498. /*
  499.  * Set up the RX char marking mask with those RX error types we must
  500.  * catch. We can get the slave to help us out a little here, it will
  501.  * ignore parity errors and breaks for us, and mark parity errors in
  502.  * the data stream.
  503.  */
  504. if (tiosp->c_iflag & IGNPAR)
  505. pp->iflag |= FI_IGNRXERRS;
  506. if (tiosp->c_iflag & IGNBRK)
  507. pp->iflag |= FI_IGNBREAK;
  508. portp->rxmarkmsk = 0;
  509. if (tiosp->c_iflag & (INPCK | PARMRK))
  510. pp->iflag |= FI_1MARKRXERRS;
  511. if (tiosp->c_iflag & BRKINT)
  512. portp->rxmarkmsk |= BRKINT;
  513. /*
  514.  * Set up clocal processing as required.
  515.  */
  516. if (tiosp->c_cflag & CLOCAL)
  517. portp->flags &= ~ASYNC_CHECK_CD;
  518. else
  519. portp->flags |= ASYNC_CHECK_CD;
  520. /*
  521.  * Transfer any persistent flags into the asyport structure.
  522.  */
  523. pp->pflag = (portp->pflag & 0xffff);
  524. pp->vmin = (portp->pflag & P_RXIMIN) ? 1 : 0;
  525. pp->vtime = (portp->pflag & P_RXITIME) ? 1 : 0;
  526. pp->cc[1] = (portp->pflag & P_RXTHOLD) ? 1 : 0;
  527. }
  528. /*****************************************************************************/
  529. /*
  530.  * Construct a slave signals structure for setting the DTR and RTS
  531.  * signals as specified.
  532.  */
  533. static void stli_mkasysigs(asysigs_t *sp, int dtr, int rts)
  534. {
  535. #if DEBUG
  536. printk(KERN_DEBUG "stli_mkasysigs(sp=%x,dtr=%d,rts=%d)n",
  537. (int) sp, dtr, rts);
  538. #endif
  539. memset(sp, 0, sizeof(asysigs_t));
  540. if (dtr >= 0) {
  541. sp->signal |= SG_DTR;
  542. sp->sigvalue |= ((dtr > 0) ? SG_DTR : 0);
  543. }
  544. if (rts >= 0) {
  545. sp->signal |= SG_RTS;
  546. sp->sigvalue |= ((rts > 0) ? SG_RTS : 0);
  547. }
  548. }
  549. /*****************************************************************************/
  550. /*
  551.  * Convert the signals returned from the slave into a local TIOCM type
  552.  * signals value. We keep them locally in TIOCM format.
  553.  */
  554. static long stli_mktiocm(unsigned long sigvalue)
  555. {
  556. long tiocm;
  557. #if DEBUG
  558. printk(KERN_DEBUG "stli_mktiocm(sigvalue=%x)n", (int) sigvalue);
  559. #endif
  560. tiocm = 0;
  561. tiocm |= ((sigvalue & SG_DCD) ? TIOCM_CD : 0);
  562. tiocm |= ((sigvalue & SG_CTS) ? TIOCM_CTS : 0);
  563. tiocm |= ((sigvalue & SG_RI) ? TIOCM_RI : 0);
  564. tiocm |= ((sigvalue & SG_DSR) ? TIOCM_DSR : 0);
  565. tiocm |= ((sigvalue & SG_DTR) ? TIOCM_DTR : 0);
  566. tiocm |= ((sigvalue & SG_RTS) ? TIOCM_RTS : 0);
  567. return(tiocm);
  568. }
  569. /*****************************************************************************/
  570. /*
  571.  * All panels and ports actually attached have been worked out. All
  572.  * we need to do here is set up the appropriate per port data structures.
  573.  */
  574. static inline int stli_initports(stlibrd_t *brdp)
  575. {
  576. stliport_t *portp;
  577. int i, panelnr, panelport;
  578. #if DEBUG
  579. printk(KERN_DEBUG "stli_initports(brdp=%x)n", (int) brdp);
  580. #endif
  581. for (i = 0, panelnr = 0, panelport = 0; (i < brdp->nrports); i++) {
  582. portp = (stliport_t *) stli_memalloc(sizeof(stliport_t));
  583. if (portp == (stliport_t *) NULL) {
  584. printk("STALLION: failed to allocate port structuren");
  585. continue;
  586. }
  587. memset(portp, 0, sizeof(stliport_t));
  588. portp->magic = STLI_PORTMAGIC;
  589. portp->portnr = i;
  590. portp->brdnr = brdp->brdnr;
  591. portp->panelnr = panelnr;
  592. portp->baud_base = STL_BAUDBASE;
  593. portp->close_delay = STL_CLOSEDELAY;
  594. portp->closing_wait = 30 * HZ;
  595. portp->tqhangup.routine = stli_dohangup;
  596. portp->tqhangup.data = portp;
  597. init_waitqueue_head(&portp->open_wait);
  598. init_waitqueue_head(&portp->close_wait);
  599. init_waitqueue_head(&portp->raw_wait);
  600. portp->normaltermios = stli_deftermios;
  601. portp->callouttermios = stli_deftermios;
  602. panelport++;
  603. if (panelport >= brdp->panels[panelnr]) {
  604. panelport = 0;
  605. panelnr++;
  606. }
  607. brdp->ports[i] = portp;
  608. }
  609. return(0);
  610. }
  611. /*****************************************************************************/
  612. /*
  613.  * All the following routines are board specific hardware operations.
  614.  */
  615. static void stli_ecpinit(stlibrd_t *brdp)
  616. {
  617. unsigned long memconf;
  618. #if DEBUG
  619. printk(KERN_DEBUG "stli_ecpinit(brdp=%d)n", (int) brdp);
  620. #endif
  621. outb(ECP_ATSTOP, (brdp->iobase + ECP_ATCONFR));
  622. udelay(10);
  623. outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR));
  624. udelay(100);
  625. memconf = (brdp->memaddr & ECP_ATADDRMASK) >> ECP_ATADDRSHFT;
  626. outb(memconf, (brdp->iobase + ECP_ATMEMAR));
  627. }
  628. /*****************************************************************************/
  629. static void stli_ecpenable(stlibrd_t *brdp)
  630. {
  631. #if DEBUG
  632. printk(KERN_DEBUG "stli_ecpenable(brdp=%x)n", (int) brdp);
  633. #endif
  634. outb(ECP_ATENABLE, (brdp->iobase + ECP_ATCONFR));
  635. }
  636. /*****************************************************************************/
  637. static void stli_ecpdisable(stlibrd_t *brdp)
  638. {
  639. #if DEBUG
  640. printk(KERN_DEBUG "stli_ecpdisable(brdp=%x)n", (int) brdp);
  641. #endif
  642. outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR));
  643. }
  644. /*****************************************************************************/
  645. static char *stli_ecpgetmemptr(stlibrd_t *brdp, unsigned long offset, int line)
  646. {
  647. void *ptr;
  648. unsigned char val;
  649. #if DEBUG
  650. printk(KERN_DEBUG "stli_ecpgetmemptr(brdp=%x,offset=%x)n", (int) brdp,
  651. (int) offset);
  652. #endif
  653. if (offset > brdp->memsize) {
  654. printk(KERN_ERR "STALLION: shared memory pointer=%x out of "
  655. "range at line=%d(%d), brd=%dn",
  656. (int) offset, line, __LINE__, brdp->brdnr);
  657. ptr = 0;
  658. val = 0;
  659. } else {
  660. ptr = brdp->membase + (offset % ECP_ATPAGESIZE);
  661. val = (unsigned char) (offset / ECP_ATPAGESIZE);
  662. }
  663. outb(val, (brdp->iobase + ECP_ATMEMPR));
  664. return(ptr);
  665. }
  666. /*****************************************************************************/
  667. static void stli_ecpreset(stlibrd_t *brdp)
  668. {
  669. #if DEBUG
  670. printk(KERN_DEBUG "stli_ecpreset(brdp=%x)n", (int) brdp);
  671. #endif
  672. outb(ECP_ATSTOP, (brdp->iobase + ECP_ATCONFR));
  673. udelay(10);
  674. outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR));
  675. udelay(500);
  676. }
  677. /*****************************************************************************/
  678. static void stli_ecpintr(stlibrd_t *brdp)
  679. {
  680. #if DEBUG
  681. printk(KERN_DEBUG "stli_ecpintr(brdp=%x)n", (int) brdp);
  682. #endif
  683. outb(0x1, brdp->iobase);
  684. }
  685. /*****************************************************************************/
  686. /*
  687.  * The following set of functions act on ECP EISA boards.
  688.  */
  689. static void stli_ecpeiinit(stlibrd_t *brdp)
  690. {
  691. unsigned long memconf;
  692. #if DEBUG
  693. printk(KERN_DEBUG "stli_ecpeiinit(brdp=%x)n", (int) brdp);
  694. #endif
  695. outb(0x1, (brdp->iobase + ECP_EIBRDENAB));
  696. outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR));
  697. udelay(10);
  698. outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR));
  699. udelay(500);
  700. memconf = (brdp->memaddr & ECP_EIADDRMASKL) >> ECP_EIADDRSHFTL;
  701. outb(memconf, (brdp->iobase + ECP_EIMEMARL));
  702. memconf = (brdp->memaddr & ECP_EIADDRMASKH) >> ECP_EIADDRSHFTH;
  703. outb(memconf, (brdp->iobase + ECP_EIMEMARH));
  704. }
  705. /*****************************************************************************/
  706. static void stli_ecpeienable(stlibrd_t *brdp)
  707. {
  708. outb(ECP_EIENABLE, (brdp->iobase + ECP_EICONFR));
  709. }
  710. /*****************************************************************************/
  711. static void stli_ecpeidisable(stlibrd_t *brdp)
  712. {
  713. outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR));
  714. }
  715. /*****************************************************************************/
  716. static char *stli_ecpeigetmemptr(stlibrd_t *brdp, unsigned long offset, int line)
  717. {
  718. void *ptr;
  719. unsigned char val;
  720. #if DEBUG
  721. printk(KERN_DEBUG "stli_ecpeigetmemptr(brdp=%x,offset=%x,line=%d)n",
  722. (int) brdp, (int) offset, line);
  723. #endif
  724. if (offset > brdp->memsize) {
  725. printk(KERN_ERR "STALLION: shared memory pointer=%x out of "
  726. "range at line=%d(%d), brd=%dn",
  727. (int) offset, line, __LINE__, brdp->brdnr);
  728. ptr = 0;
  729. val = 0;
  730. } else {
  731. ptr = brdp->membase + (offset % ECP_EIPAGESIZE);
  732. if (offset < ECP_EIPAGESIZE)
  733. val = ECP_EIENABLE;
  734. else
  735. val = ECP_EIENABLE | 0x40;
  736. }
  737. outb(val, (brdp->iobase + ECP_EICONFR));
  738. return(ptr);
  739. }
  740. /*****************************************************************************/
  741. static void stli_ecpeireset(stlibrd_t *brdp)
  742. {
  743. outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR));
  744. udelay(10);
  745. outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR));
  746. udelay(500);
  747. }
  748. /*****************************************************************************/
  749. /*
  750.  * The following set of functions act on ECP MCA boards.
  751.  */
  752. static void stli_ecpmcenable(stlibrd_t *brdp)
  753. {
  754. outb(ECP_MCENABLE, (brdp->iobase + ECP_MCCONFR));
  755. }
  756. /*****************************************************************************/
  757. static void stli_ecpmcdisable(stlibrd_t *brdp)
  758. {
  759. outb(ECP_MCDISABLE, (brdp->iobase + ECP_MCCONFR));
  760. }
  761. /*****************************************************************************/
  762. static char *stli_ecpmcgetmemptr(stlibrd_t *brdp, unsigned long offset, int line)
  763. {
  764. void *ptr;
  765. unsigned char val;
  766. if (offset > brdp->memsize) {
  767. printk(KERN_ERR "STALLION: shared memory pointer=%x out of "
  768. "range at line=%d(%d), brd=%dn",
  769. (int) offset, line, __LINE__, brdp->brdnr);
  770. ptr = 0;
  771. val = 0;
  772. } else {
  773. ptr = brdp->membase + (offset % ECP_MCPAGESIZE);
  774. val = ((unsigned char) (offset / ECP_MCPAGESIZE)) | ECP_MCENABLE;
  775. }
  776. outb(val, (brdp->iobase + ECP_MCCONFR));
  777. return(ptr);
  778. }
  779. /*****************************************************************************/
  780. static void stli_ecpmcreset(stlibrd_t *brdp)
  781. {
  782. outb(ECP_MCSTOP, (brdp->iobase + ECP_MCCONFR));
  783. udelay(10);
  784. outb(ECP_MCDISABLE, (brdp->iobase + ECP_MCCONFR));
  785. udelay(500);
  786. }
  787. /*****************************************************************************/
  788. /*
  789.  * The following set of functions act on ECP PCI boards.
  790.  */
  791. static void stli_ecppciinit(stlibrd_t *brdp)
  792. {
  793. #if DEBUG
  794. printk(KERN_DEBUG "stli_ecppciinit(brdp=%x)n", (int) brdp);
  795. #endif
  796. outb(ECP_PCISTOP, (brdp->iobase + ECP_PCICONFR));
  797. udelay(10);
  798. outb(0, (brdp->iobase + ECP_PCICONFR));
  799. udelay(500);
  800. }
  801. /*****************************************************************************/
  802. static char *stli_ecppcigetmemptr(stlibrd_t *brdp, unsigned long offset, int line)
  803. {
  804. void *ptr;
  805. unsigned char val;
  806. #if DEBUG
  807. printk(KERN_DEBUG "stli_ecppcigetmemptr(brdp=%x,offset=%x,line=%d)n",
  808. (int) brdp, (int) offset, line);
  809. #endif
  810. if (offset > brdp->memsize) {
  811. printk(KERN_ERR "STALLION: shared memory pointer=%x out of "
  812. "range at line=%d(%d), board=%dn",
  813. (int) offset, line, __LINE__, brdp->brdnr);
  814. ptr = 0;
  815. val = 0;
  816. } else {
  817. ptr = brdp->membase + (offset % ECP_PCIPAGESIZE);
  818. val = (offset / ECP_PCIPAGESIZE) << 1;
  819. }
  820. outb(val, (brdp->iobase + ECP_PCICONFR));
  821. return(ptr);
  822. }
  823. /*****************************************************************************/
  824. static void stli_ecppcireset(stlibrd_t *brdp)
  825. {
  826. outb(ECP_PCISTOP, (brdp->iobase + ECP_PCICONFR));
  827. udelay(10);
  828. outb(0, (brdp->iobase + ECP_PCICONFR));
  829. udelay(500);
  830. }
  831. /*****************************************************************************/
  832. /*
  833.  * The following routines act on ONboards.
  834.  */
  835. static void stli_onbinit(stlibrd_t *brdp)
  836. {
  837. unsigned long memconf;
  838. #if DEBUG
  839. printk(KERN_DEBUG "stli_onbinit(brdp=%d)n", (int) brdp);
  840. #endif
  841. outb(ONB_ATSTOP, (brdp->iobase + ONB_ATCONFR));
  842. udelay(10);
  843. outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR));
  844. mdelay(1000);
  845. memconf = (brdp->memaddr & ONB_ATADDRMASK) >> ONB_ATADDRSHFT;
  846. outb(memconf, (brdp->iobase + ONB_ATMEMAR));
  847. outb(0x1, brdp->iobase);
  848. mdelay(1);
  849. }
  850. /*****************************************************************************/
  851. static void stli_onbenable(stlibrd_t *brdp)
  852. {
  853. #if DEBUG
  854. printk(KERN_DEBUG "stli_onbenable(brdp=%x)n", (int) brdp);
  855. #endif
  856. outb((brdp->enabval | ONB_ATENABLE), (brdp->iobase + ONB_ATCONFR));
  857. }
  858. /*****************************************************************************/
  859. static void stli_onbdisable(stlibrd_t *brdp)
  860. {
  861. #if DEBUG
  862. printk(KERN_DEBUG "stli_onbdisable(brdp=%x)n", (int) brdp);
  863. #endif
  864. outb((brdp->enabval | ONB_ATDISABLE), (brdp->iobase + ONB_ATCONFR));
  865. }
  866. /*****************************************************************************/
  867. static char *stli_onbgetmemptr(stlibrd_t *brdp, unsigned long offset, int line)
  868. {
  869. void *ptr;
  870. #if DEBUG
  871. printk(KERN_DEBUG "stli_onbgetmemptr(brdp=%x,offset=%x)n", (int) brdp,
  872. (int) offset);
  873. #endif
  874. if (offset > brdp->memsize) {
  875. printk(KERN_ERR "STALLION: shared memory pointer=%x out of "
  876. "range at line=%d(%d), brd=%dn",
  877. (int) offset, line, __LINE__, brdp->brdnr);
  878. ptr = 0;
  879. } else {
  880. ptr = brdp->membase + (offset % ONB_ATPAGESIZE);
  881. }
  882. return(ptr);
  883. }
  884. /*****************************************************************************/
  885. static void stli_onbreset(stlibrd_t *brdp)
  886. {
  887. #if DEBUG
  888. printk(KERN_DEBUG "stli_onbreset(brdp=%x)n", (int) brdp);
  889. #endif
  890. outb(ONB_ATSTOP, (brdp->iobase + ONB_ATCONFR));
  891. udelay(10);
  892. outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR));
  893. mdelay(1000);
  894. }
  895. /*****************************************************************************/
  896. /*
  897.  * The following routines act on ONboard EISA.
  898.  */
  899. static void stli_onbeinit(stlibrd_t *brdp)
  900. {
  901. unsigned long memconf;
  902. #if DEBUG
  903. printk(KERN_DEBUG "stli_onbeinit(brdp=%d)n", (int) brdp);
  904. #endif
  905. outb(0x1, (brdp->iobase + ONB_EIBRDENAB));
  906. outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR));
  907. udelay(10);
  908. outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR));
  909. mdelay(1000);
  910. memconf = (brdp->memaddr & ONB_EIADDRMASKL) >> ONB_EIADDRSHFTL;
  911. outb(memconf, (brdp->iobase + ONB_EIMEMARL));
  912. memconf = (brdp->memaddr & ONB_EIADDRMASKH) >> ONB_EIADDRSHFTH;
  913. outb(memconf, (brdp->iobase + ONB_EIMEMARH));
  914. outb(0x1, brdp->iobase);
  915. mdelay(1);
  916. }
  917. /*****************************************************************************/
  918. static void stli_onbeenable(stlibrd_t *brdp)
  919. {
  920. #if DEBUG
  921. printk(KERN_DEBUG "stli_onbeenable(brdp=%x)n", (int) brdp);
  922. #endif
  923. outb(ONB_EIENABLE, (brdp->iobase + ONB_EICONFR));
  924. }
  925. /*****************************************************************************/
  926. static void stli_onbedisable(stlibrd_t *brdp)
  927. {
  928. #if DEBUG
  929. printk(KERN_DEBUG "stli_onbedisable(brdp=%x)n", (int) brdp);
  930. #endif
  931. outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR));
  932. }
  933. /*****************************************************************************/
  934. static char *stli_onbegetmemptr(stlibrd_t *brdp, unsigned long offset, int line)
  935. {
  936. void *ptr;
  937. unsigned char val;
  938. #if DEBUG
  939. printk(KERN_DEBUG "stli_onbegetmemptr(brdp=%x,offset=%x,line=%d)n",
  940. (int) brdp, (int) offset, line);
  941. #endif
  942. if (offset > brdp->memsize) {
  943. printk(KERN_ERR "STALLION: shared memory pointer=%x out of "
  944. "range at line=%d(%d), brd=%dn",
  945. (int) offset, line, __LINE__, brdp->brdnr);
  946. ptr = 0;
  947. val = 0;
  948. } else {
  949. ptr = brdp->membase + (offset % ONB_EIPAGESIZE);
  950. if (offset < ONB_EIPAGESIZE)
  951. val = ONB_EIENABLE;
  952. else
  953. val = ONB_EIENABLE | 0x40;
  954. }
  955. outb(val, (brdp->iobase + ONB_EICONFR));
  956. return(ptr);
  957. }
  958. /*****************************************************************************/
  959. static void stli_onbereset(stlibrd_t *brdp)
  960. {
  961. #if DEBUG
  962. printk(KERN_ERR "stli_onbereset(brdp=%x)n", (int) brdp);
  963. #endif
  964. outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR));
  965. udelay(10);
  966. outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR));
  967. mdelay(1000);
  968. }
  969. /*****************************************************************************/
  970. /*
  971.  * The following routines act on Brumby boards.
  972.  */
  973. static void stli_bbyinit(stlibrd_t *brdp)
  974. {
  975. #if DEBUG
  976. printk(KERN_ERR "stli_bbyinit(brdp=%d)n", (int) brdp);
  977. #endif
  978. outb(BBY_ATSTOP, (brdp->iobase + BBY_ATCONFR));
  979. udelay(10);
  980. outb(0, (brdp->iobase + BBY_ATCONFR));
  981. mdelay(1000);
  982. outb(0x1, brdp->iobase);
  983. mdelay(1);
  984. }
  985. /*****************************************************************************/
  986. static char *stli_bbygetmemptr(stlibrd_t *brdp, unsigned long offset, int line)
  987. {
  988. void *ptr;
  989. unsigned char val;
  990. #if DEBUG
  991. printk(KERN_ERR "stli_bbygetmemptr(brdp=%x,offset=%x)n", (int) brdp,
  992. (int) offset);
  993. #endif
  994. if (offset > brdp->memsize) {
  995. printk(KERN_ERR "STALLION: shared memory pointer=%x out of "
  996. "range at line=%d(%d), brd=%dn",
  997. (int) offset, line, __LINE__, brdp->brdnr);
  998. ptr = 0;
  999. val = 0;
  1000. } else {
  1001. ptr = brdp->membase + (offset % BBY_PAGESIZE);
  1002. val = (unsigned char) (offset / BBY_PAGESIZE);
  1003. }
  1004. outb(val, (brdp->iobase + BBY_ATCONFR));
  1005. return(ptr);
  1006. }
  1007. /*****************************************************************************/
  1008. static void stli_bbyreset(stlibrd_t *brdp)
  1009. {
  1010. #if DEBUG
  1011. printk(KERN_DEBUG "stli_bbyreset(brdp=%x)n", (int) brdp);
  1012. #endif
  1013. outb(BBY_ATSTOP, (brdp->iobase + BBY_ATCONFR));
  1014. udelay(10);
  1015. outb(0, (brdp->iobase + BBY_ATCONFR));
  1016. mdelay(1000);
  1017. }
  1018. /*****************************************************************************/
  1019. /*
  1020.  * The following routines act on original old Stallion boards.
  1021.  */
  1022. static void stli_stalinit(stlibrd_t *brdp)
  1023. {
  1024. #if DEBUG
  1025. printk(KERN_DEBUG "stli_stalinit(brdp=%d)n", (int) brdp);
  1026. #endif
  1027. outb(0x1, brdp->iobase);
  1028. mdelay(1000);
  1029. }
  1030. /*****************************************************************************/
  1031. static char *stli_stalgetmemptr(stlibrd_t *brdp, unsigned long offset, int line)
  1032. {
  1033. void *ptr;
  1034. #if DEBUG
  1035. printk(KERN_DEBUG "stli_stalgetmemptr(brdp=%x,offset=%x)n", (int) brdp,
  1036. (int) offset);
  1037. #endif
  1038. if (offset > brdp->memsize) {
  1039. printk(KERN_ERR "STALLION: shared memory pointer=%x out of "
  1040. "range at line=%d(%d), brd=%dn",
  1041. (int) offset, line, __LINE__, brdp->brdnr);
  1042. ptr = 0;
  1043. } else {
  1044. ptr = brdp->membase + (offset % STAL_PAGESIZE);
  1045. }
  1046. return(ptr);
  1047. }
  1048. /*****************************************************************************/
  1049. static void stli_stalreset(stlibrd_t *brdp)
  1050. {
  1051. volatile unsigned long *vecp;
  1052. #if DEBUG
  1053. printk(KERN_DEBUG "stli_stalreset(brdp=%x)n", (int) brdp);
  1054. #endif
  1055. vecp = (volatile unsigned long *) (brdp->membase + 0x30);
  1056. *vecp = 0xffff0000;
  1057. outb(0, brdp->iobase);
  1058. mdelay(1000);
  1059. }
  1060. /*****************************************************************************/
  1061. /*
  1062.  * Try to find an ECP board and initialize it. This handles only ECP
  1063.  * board types.
  1064.  */
  1065. static inline int stli_initecp(stlibrd_t *brdp)
  1066. {
  1067. cdkecpsig_t sig;
  1068. cdkecpsig_t *sigsp;
  1069. unsigned int status, nxtid;
  1070. char *name;
  1071. int panelnr, nrports;
  1072. #if DEBUG
  1073. printk(KERN_DEBUG "stli_initecp(brdp=%x)n", (int) brdp);
  1074. #endif
  1075. /*
  1076.  * Do a basic sanity check on the IO and memory addresses.
  1077.  */
  1078. if ((brdp->iobase == 0) || (brdp->memaddr == 0))
  1079. return(-ENODEV);
  1080. brdp->iosize = ECP_IOSIZE;
  1081. if (check_region(brdp->iobase, brdp->iosize))
  1082. printk(KERN_ERR "STALLION: Warning, board %d I/O address %x "
  1083. "conflicts with another devicen",
  1084. brdp->brdnr, brdp->iobase);
  1085. /*
  1086.  * Based on the specific board type setup the common vars to access
  1087.  * and enable shared memory. Set all board specific information now
  1088.  * as well.
  1089.  */
  1090. switch (brdp->brdtype) {
  1091. case BRD_ECP:
  1092. brdp->membase = (void *) brdp->memaddr;
  1093. brdp->memsize = ECP_MEMSIZE;
  1094. brdp->pagesize = ECP_ATPAGESIZE;
  1095. brdp->init = stli_ecpinit;
  1096. brdp->enable = stli_ecpenable;
  1097. brdp->reenable = stli_ecpenable;
  1098. brdp->disable = stli_ecpdisable;
  1099. brdp->getmemptr = stli_ecpgetmemptr;
  1100. brdp->intr = stli_ecpintr;
  1101. brdp->reset = stli_ecpreset;
  1102. name = "serial(EC8/64)";
  1103. break;
  1104. case BRD_ECPE:
  1105. brdp->membase = (void *) brdp->memaddr;
  1106. brdp->memsize = ECP_MEMSIZE;
  1107. brdp->pagesize = ECP_EIPAGESIZE;
  1108. brdp->init = stli_ecpeiinit;
  1109. brdp->enable = stli_ecpeienable;
  1110. brdp->reenable = stli_ecpeienable;
  1111. brdp->disable = stli_ecpeidisable;
  1112. brdp->getmemptr = stli_ecpeigetmemptr;
  1113. brdp->intr = stli_ecpintr;
  1114. brdp->reset = stli_ecpeireset;
  1115. name = "serial(EC8/64-EI)";
  1116. break;
  1117. case BRD_ECPMC:
  1118. brdp->membase = (void *) brdp->memaddr;
  1119. brdp->memsize = ECP_MEMSIZE;
  1120. brdp->pagesize = ECP_MCPAGESIZE;
  1121. brdp->init = NULL;
  1122. brdp->enable = stli_ecpmcenable;
  1123. brdp->reenable = stli_ecpmcenable;
  1124. brdp->disable = stli_ecpmcdisable;
  1125. brdp->getmemptr = stli_ecpmcgetmemptr;
  1126. brdp->intr = stli_ecpintr;
  1127. brdp->reset = stli_ecpmcreset;
  1128. name = "serial(EC8/64-MCA)";
  1129. break;
  1130. case BRD_ECPPCI:
  1131. brdp->membase = (void *) brdp->memaddr;
  1132. brdp->memsize = ECP_PCIMEMSIZE;
  1133. brdp->pagesize = ECP_PCIPAGESIZE;
  1134. brdp->init = stli_ecppciinit;
  1135. brdp->enable = NULL;
  1136. brdp->reenable = NULL;
  1137. brdp->disable = NULL;
  1138. brdp->getmemptr = stli_ecppcigetmemptr;
  1139. brdp->intr = stli_ecpintr;
  1140. brdp->reset = stli_ecppcireset;
  1141. name = "serial(EC/RA-PCI)";
  1142. break;
  1143. default:
  1144. return(-EINVAL);
  1145. }
  1146. /*
  1147.  * The per-board operations structure is all set up, so now let's go
  1148.  * and get the board operational. Firstly initialize board configuration
  1149.  * registers. Set the memory mapping info so we can get at the boards
  1150.  * shared memory.
  1151.  */
  1152. EBRDINIT(brdp);
  1153. brdp->membase = ioremap(brdp->memaddr, brdp->memsize);
  1154. if (brdp->membase == (void *) NULL)
  1155. return(-ENOMEM);
  1156. /*
  1157.  * Now that all specific code is set up, enable the shared memory and
  1158.  * look for the a signature area that will tell us exactly what board
  1159.  * this is, and what it is connected to it.
  1160.  */
  1161. EBRDENABLE(brdp);
  1162. sigsp = (cdkecpsig_t *) EBRDGETMEMPTR(brdp, CDK_SIGADDR);
  1163. memcpy(&sig, sigsp, sizeof(cdkecpsig_t));
  1164. EBRDDISABLE(brdp);
  1165. #if 0
  1166. printk("%s(%d): sig-> magic=%x rom=%x panel=%x,%x,%x,%x,%x,%x,%x,%xn",
  1167. __FILE__, __LINE__, (int) sig.magic, sig.romver, sig.panelid[0],
  1168. (int) sig.panelid[1], (int) sig.panelid[2],
  1169. (int) sig.panelid[3], (int) sig.panelid[4],
  1170. (int) sig.panelid[5], (int) sig.panelid[6],
  1171. (int) sig.panelid[7]);
  1172. #endif
  1173. if (sig.magic != ECP_MAGIC)
  1174. return(-ENODEV);
  1175. /*
  1176.  * Scan through the signature looking at the panels connected to the
  1177.  * board. Calculate the total number of ports as we go.
  1178.  */
  1179. for (panelnr = 0, nxtid = 0; (panelnr < STL_MAXPANELS); panelnr++) {
  1180. status = sig.panelid[nxtid];
  1181. if ((status & ECH_PNLIDMASK) != nxtid)
  1182. break;
  1183. brdp->panelids[panelnr] = status;
  1184. nrports = (status & ECH_PNL16PORT) ? 16 : 8;
  1185. if ((nrports == 16) && ((status & ECH_PNLXPID) == 0))
  1186. nxtid++;
  1187. brdp->panels[panelnr] = nrports;
  1188. brdp->nrports += nrports;
  1189. nxtid++;
  1190. brdp->nrpanels++;
  1191. }
  1192. request_region(brdp->iobase, brdp->iosize, name);
  1193. brdp->state |= BST_FOUND;
  1194. return(0);
  1195. }
  1196. /*****************************************************************************/
  1197. /*
  1198.  * Try to find an ONboard, Brumby or Stallion board and initialize it.
  1199.  * This handles only these board types.
  1200.  */
  1201. static inline int stli_initonb(stlibrd_t *brdp)
  1202. {
  1203. cdkonbsig_t sig;
  1204. cdkonbsig_t *sigsp;
  1205. char *name;
  1206. int i;
  1207. #if DEBUG
  1208. printk(KERN_DEBUG "stli_initonb(brdp=%x)n", (int) brdp);
  1209. #endif
  1210. /*
  1211.  * Do a basic sanity check on the IO and memory addresses.
  1212.  */
  1213. if ((brdp->iobase == 0) || (brdp->memaddr == 0))
  1214. return(-ENODEV);
  1215. brdp->iosize = ONB_IOSIZE;
  1216. if (check_region(brdp->iobase, brdp->iosize))
  1217. printk(KERN_ERR "STALLION: Warning, board %d I/O address %x "
  1218. "conflicts with another devicen",
  1219. brdp->brdnr, brdp->iobase);
  1220. /*
  1221.  * Based on the specific board type setup the common vars to access
  1222.  * and enable shared memory. Set all board specific information now
  1223.  * as well.
  1224.  */
  1225. switch (brdp->brdtype) {
  1226. case BRD_ONBOARD:
  1227. case BRD_ONBOARD32:
  1228. case BRD_ONBOARD2:
  1229. case BRD_ONBOARD2_32:
  1230. case BRD_ONBOARDRS:
  1231. brdp->membase = (void *) brdp->memaddr;
  1232. brdp->memsize = ONB_MEMSIZE;
  1233. brdp->pagesize = ONB_ATPAGESIZE;
  1234. brdp->init = stli_onbinit;
  1235. brdp->enable = stli_onbenable;
  1236. brdp->reenable = stli_onbenable;
  1237. brdp->disable = stli_onbdisable;
  1238. brdp->getmemptr = stli_onbgetmemptr;
  1239. brdp->intr = stli_ecpintr;
  1240. brdp->reset = stli_onbreset;
  1241. if (brdp->memaddr > 0x100000)
  1242. brdp->enabval = ONB_MEMENABHI;
  1243. else
  1244. brdp->enabval = ONB_MEMENABLO;
  1245. name = "serial(ONBoard)";
  1246. break;
  1247. case BRD_ONBOARDE:
  1248. brdp->membase = (void *) brdp->memaddr;
  1249. brdp->memsize = ONB_EIMEMSIZE;
  1250. brdp->pagesize = ONB_EIPAGESIZE;
  1251. brdp->init = stli_onbeinit;
  1252. brdp->enable = stli_onbeenable;
  1253. brdp->reenable = stli_onbeenable;
  1254. brdp->disable = stli_onbedisable;
  1255. brdp->getmemptr = stli_onbegetmemptr;
  1256. brdp->intr = stli_ecpintr;
  1257. brdp->reset = stli_onbereset;
  1258. name = "serial(ONBoard/E)";
  1259. break;
  1260. case BRD_BRUMBY4:
  1261. case BRD_BRUMBY8:
  1262. case BRD_BRUMBY16:
  1263. brdp->membase = (void *) brdp->memaddr;
  1264. brdp->memsize = BBY_MEMSIZE;
  1265. brdp->pagesize = BBY_PAGESIZE;
  1266. brdp->init = stli_bbyinit;
  1267. brdp->enable = NULL;
  1268. brdp->reenable = NULL;
  1269. brdp->disable = NULL;
  1270. brdp->getmemptr = stli_bbygetmemptr;
  1271. brdp->intr = stli_ecpintr;
  1272. brdp->reset = stli_bbyreset;
  1273. name = "serial(Brumby)";
  1274. break;
  1275. case BRD_STALLION:
  1276. brdp->membase = (void *) brdp->memaddr;
  1277. brdp->memsize = STAL_MEMSIZE;
  1278. brdp->pagesize = STAL_PAGESIZE;
  1279. brdp->init = stli_stalinit;
  1280. brdp->enable = NULL;
  1281. brdp->reenable = NULL;
  1282. brdp->disable = NULL;
  1283. brdp->getmemptr = stli_stalgetmemptr;
  1284. brdp->intr = stli_ecpintr;
  1285. brdp->reset = stli_stalreset;
  1286. name = "serial(Stallion)";
  1287. break;
  1288. default:
  1289. return(-EINVAL);
  1290. }
  1291. /*
  1292.  * The per-board operations structure is all set up, so now let's go
  1293.  * and get the board operational. Firstly initialize board configuration
  1294.  * registers. Set the memory mapping info so we can get at the boards
  1295.  * shared memory.
  1296.  */
  1297. EBRDINIT(brdp);
  1298. brdp->membase = ioremap(brdp->memaddr, brdp->memsize);
  1299. if (brdp->membase == (void *) NULL)
  1300. return(-ENOMEM);
  1301. /*
  1302.  * Now that all specific code is set up, enable the shared memory and
  1303.  * look for the a signature area that will tell us exactly what board
  1304.  * this is, and how many ports.
  1305.  */
  1306. EBRDENABLE(brdp);
  1307. sigsp = (cdkonbsig_t *) EBRDGETMEMPTR(brdp, CDK_SIGADDR);
  1308. memcpy(&sig, sigsp, sizeof(cdkonbsig_t));
  1309. EBRDDISABLE(brdp);
  1310. #if 0
  1311. printk("%s(%d): sig-> magic=%x:%x:%x:%x romver=%x amask=%x:%x:%xn",
  1312. __FILE__, __LINE__, sig.magic0, sig.magic1, sig.magic2,
  1313. sig.magic3, sig.romver, sig.amask0, sig.amask1, sig.amask2);
  1314. #endif
  1315. if ((sig.magic0 != ONB_MAGIC0) || (sig.magic1 != ONB_MAGIC1) ||
  1316.     (sig.magic2 != ONB_MAGIC2) || (sig.magic3 != ONB_MAGIC3))
  1317. return(-ENODEV);
  1318. /*
  1319.  * Scan through the signature alive mask and calculate how many ports
  1320.  * there are on this board.
  1321.  */
  1322. brdp->nrpanels = 1;
  1323. if (sig.amask1) {
  1324. brdp->nrports = 32;
  1325. } else {
  1326. for (i = 0; (i < 16); i++) {
  1327. if (((sig.amask0 << i) & 0x8000) == 0)
  1328. break;
  1329. }
  1330. brdp->nrports = i;
  1331. }
  1332. brdp->panels[0] = brdp->nrports;
  1333. request_region(brdp->iobase, brdp->iosize, name);
  1334. brdp->state |= BST_FOUND;
  1335. return(0);
  1336. }
  1337. /*****************************************************************************/
  1338. /*
  1339.  * Start up a running board. This routine is only called after the
  1340.  * code has been down loaded to the board and is operational. It will
  1341.  * read in the memory map, and get the show on the road...
  1342.  */
  1343. static int stli_startbrd(stlibrd_t *brdp)
  1344. {
  1345. volatile cdkhdr_t *hdrp;
  1346. volatile cdkmem_t *memp;
  1347. volatile cdkasy_t *ap;
  1348. unsigned long flags;
  1349. stliport_t *portp;
  1350. int portnr, nrdevs, i, rc;
  1351. #if DEBUG
  1352. printk(KERN_DEBUG "stli_startbrd(brdp=%x)n", (int) brdp);
  1353. #endif
  1354. rc = 0;
  1355. save_flags(flags);
  1356. cli();
  1357. EBRDENABLE(brdp);
  1358. hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
  1359. nrdevs = hdrp->nrdevs;
  1360. #if 0
  1361. printk("%s(%d): CDK version %d.%d.%d --> "
  1362. "nrdevs=%d memp=%x hostp=%x slavep=%xn",
  1363.  __FILE__, __LINE__, hdrp->ver_release, hdrp->ver_modification,
  1364.  hdrp->ver_fix, nrdevs, (int) hdrp->memp, (int) hdrp->hostp,
  1365.  (int) hdrp->slavep);
  1366. #endif
  1367. if (nrdevs < (brdp->nrports + 1)) {
  1368. printk(KERN_ERR "STALLION: slave failed to allocate memory for "
  1369. "all devices, devices=%dn", nrdevs);
  1370. brdp->nrports = nrdevs - 1;
  1371. }
  1372. brdp->nrdevs = nrdevs;
  1373. brdp->hostoffset = hdrp->hostp - CDK_CDKADDR;
  1374. brdp->slaveoffset = hdrp->slavep - CDK_CDKADDR;
  1375. brdp->bitsize = (nrdevs + 7) / 8;
  1376. memp = (volatile cdkmem_t *) hdrp->memp;
  1377. if (((unsigned long) memp) > brdp->memsize) {
  1378. printk(KERN_ERR "STALLION: corrupted shared memory region?n");
  1379. rc = -EIO;
  1380. goto stli_donestartup;
  1381. }
  1382. memp = (volatile cdkmem_t *) EBRDGETMEMPTR(brdp, (unsigned long) memp);
  1383. if (memp->dtype != TYP_ASYNCTRL) {
  1384. printk(KERN_ERR "STALLION: no slave control device foundn");
  1385. goto stli_donestartup;
  1386. }
  1387. memp++;
  1388. /*
  1389.  * Cycle through memory allocation of each port. We are guaranteed to
  1390.  * have all ports inside the first page of slave window, so no need to
  1391.  * change pages while reading memory map.
  1392.  */
  1393. for (i = 1, portnr = 0; (i < nrdevs); i++, portnr++, memp++) {
  1394. if (memp->dtype != TYP_ASYNC)
  1395. break;
  1396. portp = brdp->ports[portnr];
  1397. if (portp == (stliport_t *) NULL)
  1398. break;
  1399. portp->devnr = i;
  1400. portp->addr = memp->offset;
  1401. portp->reqbit = (unsigned char) (0x1 << (i * 8 / nrdevs));
  1402. portp->portidx = (unsigned char) (i / 8);
  1403. portp->portbit = (unsigned char) (0x1 << (i % 8));
  1404. }
  1405. hdrp->slavereq = 0xff;
  1406. /*
  1407.  * For each port setup a local copy of the RX and TX buffer offsets
  1408.  * and sizes. We do this separate from the above, because we need to
  1409.  * move the shared memory page...
  1410.  */
  1411. for (i = 1, portnr = 0; (i < nrdevs); i++, portnr++) {
  1412. portp = brdp->ports[portnr];
  1413. if (portp == (stliport_t *) NULL)
  1414. break;
  1415. if (portp->addr == 0)
  1416. break;
  1417. ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr);
  1418. if (ap != (volatile cdkasy_t *) NULL) {
  1419. portp->rxsize = ap->rxq.size;
  1420. portp->txsize = ap->txq.size;
  1421. portp->rxoffset = ap->rxq.offset;
  1422. portp->txoffset = ap->txq.offset;
  1423. }
  1424. }
  1425. stli_donestartup:
  1426. EBRDDISABLE(brdp);
  1427. restore_flags(flags);
  1428. if (rc == 0)
  1429. brdp->state |= BST_STARTED;
  1430. if (! stli_timeron) {
  1431. stli_timeron++;
  1432. stli_timerlist.expires = STLI_TIMEOUT;
  1433. add_timer(&stli_timerlist);
  1434. }
  1435. return(rc);
  1436. }
  1437. /*****************************************************************************/
  1438. /*
  1439.  * Probe and initialize the specified board.
  1440.  */
  1441. static int __init stli_brdinit(stlibrd_t *brdp)
  1442. {
  1443. #if DEBUG
  1444. printk(KERN_DEBUG "stli_brdinit(brdp=%x)n", (int) brdp);
  1445. #endif
  1446. stli_brds[brdp->brdnr] = brdp;
  1447. switch (brdp->brdtype) {
  1448. case BRD_ECP:
  1449. case BRD_ECPE:
  1450. case BRD_ECPMC:
  1451. case BRD_ECPPCI:
  1452. stli_initecp(brdp);
  1453. break;
  1454. case BRD_ONBOARD:
  1455. case BRD_ONBOARDE:
  1456. case BRD_ONBOARD2:
  1457. case BRD_ONBOARD32:
  1458. case BRD_ONBOARD2_32:
  1459. case BRD_ONBOARDRS:
  1460. case BRD_BRUMBY4:
  1461. case BRD_BRUMBY8:
  1462. case BRD_BRUMBY16:
  1463. case BRD_STALLION:
  1464. stli_initonb(brdp);
  1465. break;
  1466. case BRD_EASYIO:
  1467. case BRD_ECH:
  1468. case BRD_ECHMC:
  1469. case BRD_ECHPCI:
  1470. printk(KERN_ERR "STALLION: %s board type not supported in "
  1471. "this drivern", stli_brdnames[brdp->brdtype]);
  1472. return(ENODEV);
  1473. default:
  1474. printk(KERN_ERR "STALLION: board=%d is unknown board "
  1475. "type=%dn", brdp->brdnr, brdp->brdtype);
  1476. return(ENODEV);
  1477. }
  1478. if ((brdp->state & BST_FOUND) == 0) {
  1479. printk(KERN_ERR "STALLION: %s board not found, board=%d "
  1480. "io=%x mem=%xn",
  1481. stli_brdnames[brdp->brdtype], brdp->brdnr,
  1482. brdp->iobase, (int) brdp->memaddr);
  1483. return(ENODEV);
  1484. }
  1485. stli_initports(brdp);
  1486. printk(KERN_INFO "STALLION: %s found, board=%d io=%x mem=%x "
  1487. "nrpanels=%d nrports=%dn", stli_brdnames[brdp->brdtype],
  1488. brdp->brdnr, brdp->iobase, (int) brdp->memaddr,
  1489. brdp->nrpanels, brdp->nrports);
  1490. return(0);
  1491. }
  1492. /*****************************************************************************/
  1493. /*
  1494.  * Probe around trying to find where the EISA boards shared memory
  1495.  * might be. This is a bit if hack, but it is the best we can do.
  1496.  */
  1497. static inline int stli_eisamemprobe(stlibrd_t *brdp)
  1498. {
  1499. cdkecpsig_t ecpsig, *ecpsigp;
  1500. cdkonbsig_t onbsig, *onbsigp;
  1501. int i, foundit;
  1502. #if DEBUG
  1503. printk(KERN_DEBUG "stli_eisamemprobe(brdp=%x)n", (int) brdp);
  1504. #endif
  1505. /*
  1506.  * First up we reset the board, to get it into a known state. There
  1507.  * is only 2 board types here we need to worry about. Don;t use the
  1508.  * standard board init routine here, it programs up the shared
  1509.  * memory address, and we don't know it yet...
  1510.  */
  1511. if (brdp->brdtype == BRD_ECPE) {
  1512. outb(0x1, (brdp->iobase + ECP_EIBRDENAB));
  1513. outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR));
  1514. udelay(10);
  1515. outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR));
  1516. udelay(500);
  1517. stli_ecpeienable(brdp);
  1518. } else if (brdp->brdtype == BRD_ONBOARDE) {
  1519. outb(0x1, (brdp->iobase + ONB_EIBRDENAB));
  1520. outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR));
  1521. udelay(10);
  1522. outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR));
  1523. mdelay(100);
  1524. outb(0x1, brdp->iobase);
  1525. mdelay(1);
  1526. stli_onbeenable(brdp);
  1527. } else {
  1528. return(-ENODEV);
  1529. }
  1530. foundit = 0;
  1531. brdp->memsize = ECP_MEMSIZE;
  1532. /*
  1533.  * Board shared memory is enabled, so now we have a poke around and
  1534.  * see if we can find it.
  1535.  */
  1536. for (i = 0; (i < stli_eisamempsize); i++) {
  1537. brdp->memaddr = stli_eisamemprobeaddrs[i];
  1538. brdp->membase = (void *) brdp->memaddr;
  1539. brdp->membase = ioremap(brdp->memaddr, brdp->memsize);
  1540. if (brdp->membase == (void *) NULL)
  1541. continue;
  1542. if (brdp->brdtype == BRD_ECPE) {
  1543. ecpsigp = (cdkecpsig_t *) stli_ecpeigetmemptr(brdp,
  1544. CDK_SIGADDR, __LINE__);
  1545. memcpy(&ecpsig, ecpsigp, sizeof(cdkecpsig_t));
  1546. if (ecpsig.magic == ECP_MAGIC)
  1547. foundit = 1;
  1548. } else {
  1549. onbsigp = (cdkonbsig_t *) stli_onbegetmemptr(brdp,
  1550. CDK_SIGADDR, __LINE__);
  1551. memcpy(&onbsig, onbsigp, sizeof(cdkonbsig_t));
  1552. if ((onbsig.magic0 == ONB_MAGIC0) &&
  1553.     (onbsig.magic1 == ONB_MAGIC1) &&
  1554.     (onbsig.magic2 == ONB_MAGIC2) &&
  1555.     (onbsig.magic3 == ONB_MAGIC3))
  1556. foundit = 1;
  1557. }
  1558. iounmap(brdp->membase);
  1559. if (foundit)
  1560. break;
  1561. }
  1562. /*
  1563.  * Regardless of whether we found the shared memory or not we must
  1564.  * disable the region. After that return success or failure.
  1565.  */
  1566. if (brdp->brdtype == BRD_ECPE)
  1567. stli_ecpeidisable(brdp);
  1568. else
  1569. stli_onbedisable(brdp);
  1570. if (! foundit) {
  1571. brdp->memaddr = 0;
  1572. brdp->membase = 0;
  1573. printk(KERN_ERR "STALLION: failed to probe shared memory "
  1574. "region for %s in EISA slot=%dn",
  1575. stli_brdnames[brdp->brdtype], (brdp->iobase >> 12));
  1576. return(-ENODEV);
  1577. }
  1578. return(0);
  1579. }
  1580. /*****************************************************************************/
  1581. /*
  1582.  * Probe around and try to find any EISA boards in system. The biggest
  1583.  * problem here is finding out what memory address is associated with
  1584.  * an EISA board after it is found. The registers of the ECPE and
  1585.  * ONboardE are not readable - so we can't read them from there. We
  1586.  * don't have access to the EISA CMOS (or EISA BIOS) so we don't
  1587.  * actually have any way to find out the real value. The best we can
  1588.  * do is go probing around in the usual places hoping we can find it.
  1589.  */
  1590. static inline int stli_findeisabrds()
  1591. {
  1592. stlibrd_t *brdp;
  1593. unsigned int iobase, eid;
  1594. int i;
  1595. #if DEBUG
  1596. printk(KERN_DEBUG "stli_findeisabrds()n");
  1597. #endif
  1598. /*
  1599.  * Firstly check if this is an EISA system. Do this by probing for
  1600.  * the system board EISA ID. If this is not an EISA system then
  1601.  * don't bother going any further!
  1602.  */
  1603. outb(0xff, 0xc80);
  1604. if (inb(0xc80) == 0xff)
  1605. return(0);
  1606. /*
  1607.  * Looks like an EISA system, so go searching for EISA boards.
  1608.  */
  1609. for (iobase = 0x1000; (iobase <= 0xc000); iobase += 0x1000) {
  1610. outb(0xff, (iobase + 0xc80));
  1611. eid = inb(iobase + 0xc80);
  1612. eid |= inb(iobase + 0xc81) << 8;
  1613. if (eid != STL_EISAID)
  1614. continue;
  1615. /*
  1616.  * We have found a board. Need to check if this board was
  1617.  * statically configured already (just in case!).
  1618.  */
  1619. for (i = 0; (i < STL_MAXBRDS); i++) {
  1620. brdp = stli_brds[i];
  1621. if (brdp == (stlibrd_t *) NULL)
  1622. continue;
  1623. if (brdp->iobase == iobase)
  1624. break;
  1625. }
  1626. if (i < STL_MAXBRDS)
  1627. continue;
  1628. /*
  1629.  * We have found a Stallion board and it is not configured already.
  1630.  * Allocate a board structure and initialize it.
  1631.  */
  1632. if ((brdp = stli_allocbrd()) == (stlibrd_t *) NULL)
  1633. return(-ENOMEM);
  1634. if ((brdp->brdnr = stli_getbrdnr()) < 0)
  1635. return(-ENOMEM);
  1636. eid = inb(iobase + 0xc82);
  1637. if (eid == ECP_EISAID)
  1638. brdp->brdtype = BRD_ECPE;
  1639. else if (eid == ONB_EISAID)
  1640. brdp->brdtype = BRD_ONBOARDE;
  1641. else
  1642. brdp->brdtype = BRD_UNKNOWN;
  1643. brdp->iobase = iobase;
  1644. outb(0x1, (iobase + 0xc84));
  1645. if (stli_eisamemprobe(brdp))
  1646. outb(0, (iobase + 0xc84));
  1647. stli_brdinit(brdp);
  1648. }
  1649. return(0);
  1650. }
  1651. /*****************************************************************************/
  1652. /*
  1653.  * Find the next available board number that is free.
  1654.  */
  1655. static inline int stli_getbrdnr()
  1656. {
  1657. int i;
  1658. for (i = 0; (i < STL_MAXBRDS); i++) {
  1659. if (stli_brds[i] == (stlibrd_t *) NULL) {
  1660. if (i >= stli_nrbrds)
  1661. stli_nrbrds = i + 1;
  1662. return(i);
  1663. }
  1664. }
  1665. return(-1);
  1666. }
  1667. /*****************************************************************************/
  1668. #ifdef CONFIG_PCI
  1669. /*
  1670.  * We have a Stallion board. Allocate a board structure and
  1671.  * initialize it. Read its IO and MEMORY resources from PCI
  1672.  * configuration space.
  1673.  */
  1674. static inline int stli_initpcibrd(int brdtype, struct pci_dev *devp)
  1675. {
  1676. stlibrd_t *brdp;
  1677. #if DEBUG
  1678. printk(KERN_DEBUG "stli_initpcibrd(brdtype=%d,busnr=%x,devnr=%x)n",
  1679. brdtype, dev->bus->number, dev->devfn);
  1680. #endif
  1681. if (pci_enable_device(devp))
  1682. return(-EIO);
  1683. if ((brdp = stli_allocbrd()) == (stlibrd_t *) NULL)
  1684. return(-ENOMEM);
  1685. if ((brdp->brdnr = stli_getbrdnr()) < 0) {
  1686. printk(KERN_INFO "STALLION: too many boards found, "
  1687. "maximum supported %dn", STL_MAXBRDS);
  1688. return(0);
  1689. }
  1690. brdp->brdtype = brdtype;
  1691. #if DEBUG
  1692. printk(KERN_DEBUG "%s(%d): BAR[]=%lx,%lx,%lx,%lxn", __FILE__, __LINE__,
  1693. pci_resource_start(devp, 0),
  1694. pci_resource_start(devp, 1),
  1695. pci_resource_start(devp, 2),
  1696. pci_resource_start(devp, 3));
  1697. #endif
  1698. /*
  1699.  * We have all resources from the board, so lets setup the actual
  1700.  * board structure now.
  1701.  */
  1702. brdp->iobase = pci_resource_start(devp, 3);
  1703. brdp->memaddr = pci_resource_start(devp, 2);
  1704. stli_brdinit(brdp);
  1705. return(0);
  1706. }
  1707. /*****************************************************************************/
  1708. /*
  1709.  * Find all Stallion PCI boards that might be installed. Initialize each
  1710.  * one as it is found.
  1711.  */
  1712. static inline int stli_findpcibrds()
  1713. {
  1714. struct pci_dev *dev = NULL;
  1715. int rc;
  1716. #if DEBUG
  1717. printk("stli_findpcibrds()n");
  1718. #endif
  1719. if (! pci_present())
  1720. return(0);
  1721. while ((dev = pci_find_device(PCI_VENDOR_ID_STALLION,
  1722.     PCI_DEVICE_ID_ECRA, dev))) {
  1723. if ((rc = stli_initpcibrd(BRD_ECPPCI, dev)))
  1724. return(rc);
  1725. }
  1726. return(0);
  1727. }
  1728. #endif
  1729. /*****************************************************************************/
  1730. /*
  1731.  * Allocate a new board structure. Fill out the basic info in it.
  1732.  */
  1733. static stlibrd_t *stli_allocbrd()
  1734. {
  1735. stlibrd_t *brdp;
  1736. brdp = (stlibrd_t *) stli_memalloc(sizeof(stlibrd_t));
  1737. if (brdp == (stlibrd_t *) NULL) {
  1738. printk(KERN_ERR "STALLION: failed to allocate memory "
  1739. "(size=%d)n", sizeof(stlibrd_t));
  1740. return((stlibrd_t *) NULL);
  1741. }
  1742. memset(brdp, 0, sizeof(stlibrd_t));
  1743. brdp->magic = STLI_BOARDMAGIC;
  1744. return(brdp);
  1745. }
  1746. /*****************************************************************************/
  1747. /*
  1748.  * Scan through all the boards in the configuration and see what we
  1749.  * can find.
  1750.  */
  1751. static inline int stli_initbrds()
  1752. {
  1753. stlibrd_t *brdp, *nxtbrdp;
  1754. stlconf_t *confp;
  1755. int i, j;
  1756. #if DEBUG
  1757. printk(KERN_DEBUG "stli_initbrds()n");
  1758. #endif
  1759. if (stli_nrbrds > STL_MAXBRDS) {
  1760. printk(KERN_INFO "STALLION: too many boards in configuration "
  1761. "table, truncating to %dn", STL_MAXBRDS);
  1762. stli_nrbrds = STL_MAXBRDS;
  1763. }
  1764. /*
  1765.  * Firstly scan the list of static boards configured. Allocate
  1766.  * resources and initialize the boards as found. If this is a
  1767.  * module then let the module args override static configuration.
  1768.  */
  1769. for (i = 0; (i < stli_nrbrds); i++) {
  1770. confp = &stli_brdconf[i];
  1771. #ifdef MODULE
  1772. stli_parsebrd(confp, stli_brdsp[i]);
  1773. #endif
  1774. if ((brdp = stli_allocbrd()) == (stlibrd_t *) NULL)
  1775. return(-ENOMEM);
  1776. brdp->brdnr = i;
  1777. brdp->brdtype = confp->brdtype;
  1778. brdp->iobase = confp->ioaddr1;
  1779. brdp->memaddr = confp->memaddr;
  1780. stli_brdinit(brdp);
  1781. }
  1782. /*
  1783.  * Static configuration table done, so now use dynamic methods to
  1784.  * see if any more boards should be configured.
  1785.  */
  1786. #ifdef MODULE
  1787. stli_argbrds();
  1788. #endif
  1789. if (stli_eisaprobe)
  1790. stli_findeisabrds();
  1791. #ifdef CONFIG_PCI
  1792. stli_findpcibrds();
  1793. #endif
  1794. /*
  1795.  * All found boards are initialized. Now for a little optimization, if
  1796.  * no boards are sharing the "shared memory" regions then we can just
  1797.  * leave them all enabled. This is in fact the usual case.
  1798.  */
  1799. stli_shared = 0;
  1800. if (stli_nrbrds > 1) {
  1801. for (i = 0; (i < stli_nrbrds); i++) {
  1802. brdp = stli_brds[i];
  1803. if (brdp == (stlibrd_t *) NULL)
  1804. continue;
  1805. for (j = i + 1; (j < stli_nrbrds); j++) {
  1806. nxtbrdp = stli_brds[j];
  1807. if (nxtbrdp == (stlibrd_t *) NULL)
  1808. continue;
  1809. if ((brdp->membase >= nxtbrdp->membase) &&
  1810.     (brdp->membase <= (nxtbrdp->membase +
  1811.     nxtbrdp->memsize - 1))) {
  1812. stli_shared++;
  1813. break;
  1814. }
  1815. }
  1816. }
  1817. }
  1818. if (stli_shared == 0) {
  1819. for (i = 0; (i < stli_nrbrds); i++) {
  1820. brdp = stli_brds[i];
  1821. if (brdp == (stlibrd_t *) NULL)
  1822. continue;
  1823. if (brdp->state & BST_FOUND) {
  1824. EBRDENABLE(brdp);
  1825. brdp->enable = NULL;
  1826. brdp->disable = NULL;
  1827. }
  1828. }
  1829. }
  1830. return(0);
  1831. }
  1832. /*****************************************************************************/
  1833. /*
  1834.  * Code to handle an "staliomem" read operation. This device is the 
  1835.  * contents of the board shared memory. It is used for down loading
  1836.  * the slave image (and debugging :-)
  1837.  */
  1838. static ssize_t stli_memread(struct file *fp, char *buf, size_t count, loff_t *offp)
  1839. {
  1840. unsigned long flags;
  1841. void *memptr;
  1842. stlibrd_t *brdp;
  1843. int brdnr, size, n;
  1844. #if DEBUG
  1845. printk(KERN_DEBUG "stli_memread(fp=%x,buf=%x,count=%x,offp=%x)n",
  1846. (int) fp, (int) buf, count, (int) offp);
  1847. #endif
  1848. brdnr = MINOR(fp->f_dentry->d_inode->i_rdev);
  1849. if (brdnr >= stli_nrbrds)
  1850. return(-ENODEV);
  1851. brdp = stli_brds[brdnr];
  1852. if (brdp == (stlibrd_t *) NULL)
  1853. return(-ENODEV);
  1854. if (brdp->state == 0)
  1855. return(-ENODEV);
  1856. if (fp->f_pos >= brdp->memsize)
  1857. return(0);
  1858. size = MIN(count, (brdp->memsize - fp->f_pos));
  1859. save_flags(flags);
  1860. cli();
  1861. EBRDENABLE(brdp);
  1862. while (size > 0) {
  1863. memptr = (void *) EBRDGETMEMPTR(brdp, fp->f_pos);
  1864. n = MIN(size, (brdp->pagesize - (((unsigned long) fp->f_pos) % brdp->pagesize)));
  1865. if (copy_to_user(buf, memptr, n)) {
  1866. count = -EFAULT;
  1867. goto out;
  1868. }
  1869. fp->f_pos += n;
  1870. buf += n;
  1871. size -= n;
  1872. }
  1873. out:
  1874. EBRDDISABLE(brdp);
  1875. restore_flags(flags);
  1876. return(count);
  1877. }
  1878. /*****************************************************************************/
  1879. /*
  1880.  * Code to handle an "staliomem" write operation. This device is the 
  1881.  * contents of the board shared memory. It is used for down loading
  1882.  * the slave image (and debugging :-)
  1883.  */
  1884. static ssize_t stli_memwrite(struct file *fp, const char *buf, size_t count, loff_t *offp)
  1885. {
  1886. unsigned long flags;
  1887. void *memptr;
  1888. stlibrd_t *brdp;
  1889. char *chbuf;
  1890. int brdnr, size, n;
  1891. #if DEBUG
  1892. printk(KERN_DEBUG "stli_memwrite(fp=%x,buf=%x,count=%x,offp=%x)n",
  1893. (int) fp, (int) buf, count, (int) offp);
  1894. #endif
  1895. brdnr = MINOR(fp->f_dentry->d_inode->i_rdev);
  1896. if (brdnr >= stli_nrbrds)
  1897. return(-ENODEV);
  1898. brdp = stli_brds[brdnr];
  1899. if (brdp == (stlibrd_t *) NULL)
  1900. return(-ENODEV);
  1901. if (brdp->state == 0)
  1902. return(-ENODEV);
  1903. if (fp->f_pos >= brdp->memsize)
  1904. return(0);
  1905. chbuf = (char *) buf;
  1906. size = MIN(count, (brdp->memsize - fp->f_pos));
  1907. save_flags(flags);
  1908. cli();
  1909. EBRDENABLE(brdp);
  1910. while (size > 0) {
  1911. memptr = (void *) EBRDGETMEMPTR(brdp, fp->f_pos);
  1912. n = MIN(size, (brdp->pagesize - (((unsigned long) fp->f_pos) % brdp->pagesize)));
  1913. if (copy_from_user(memptr, chbuf, n)) {
  1914. count = -EFAULT;
  1915. goto out;
  1916. }
  1917. fp->f_pos += n;
  1918. chbuf += n;
  1919. size -= n;
  1920. }
  1921. out:
  1922. EBRDDISABLE(brdp);
  1923. restore_flags(flags);
  1924. return(count);
  1925. }
  1926. /*****************************************************************************/
  1927. /*
  1928.  * Return the board stats structure to user app.
  1929.  */
  1930. static int stli_getbrdstats(combrd_t *bp)
  1931. {
  1932. stlibrd_t *brdp;
  1933. int i;
  1934. if (copy_from_user(&stli_brdstats, bp, sizeof(combrd_t)))
  1935. return -EFAULT;
  1936. if (stli_brdstats.brd >= STL_MAXBRDS)
  1937. return(-ENODEV);
  1938. brdp = stli_brds[stli_brdstats.brd];
  1939. if (brdp == (stlibrd_t *) NULL)
  1940. return(-ENODEV);
  1941. memset(&stli_brdstats, 0, sizeof(combrd_t));
  1942. stli_brdstats.brd = brdp->brdnr;
  1943. stli_brdstats.type = brdp->brdtype;
  1944. stli_brdstats.hwid = 0;
  1945. stli_brdstats.state = brdp->state;
  1946. stli_brdstats.ioaddr = brdp->iobase;
  1947. stli_brdstats.memaddr = brdp->memaddr;
  1948. stli_brdstats.nrpanels = brdp->nrpanels;
  1949. stli_brdstats.nrports = brdp->nrports;
  1950. for (i = 0; (i < brdp->nrpanels); i++) {
  1951. stli_brdstats.panels[i].panel = i;
  1952. stli_brdstats.panels[i].hwid = brdp->panelids[i];
  1953. stli_brdstats.panels[i].nrports = brdp->panels[i];
  1954. }
  1955. if (copy_to_user(bp, &stli_brdstats, sizeof(combrd_t)))
  1956. return -EFAULT;
  1957. return(0);
  1958. }
  1959. /*****************************************************************************/
  1960. /*
  1961.  * Resolve the referenced port number into a port struct pointer.
  1962.  */
  1963. static stliport_t *stli_getport(int brdnr, int panelnr, int portnr)
  1964. {
  1965. stlibrd_t *brdp;
  1966. int i;
  1967. if ((brdnr < 0) || (brdnr >= STL_MAXBRDS))
  1968. return((stliport_t *) NULL);
  1969. brdp = stli_brds[brdnr];
  1970. if (brdp == (stlibrd_t *) NULL)
  1971. return((stliport_t *) NULL);
  1972. for (i = 0; (i < panelnr); i++)
  1973. portnr += brdp->panels[i];
  1974. if ((portnr < 0) || (portnr >= brdp->nrports))
  1975. return((stliport_t *) NULL);
  1976. return(brdp->ports[portnr]);
  1977. }
  1978. /*****************************************************************************/
  1979. /*
  1980.  * Return the port stats structure to user app. A NULL port struct
  1981.  * pointer passed in means that we need to find out from the app
  1982.  * what port to get stats for (used through board control device).
  1983.  */
  1984. static int stli_portcmdstats(stliport_t *portp)
  1985. {
  1986. unsigned long flags;
  1987. stlibrd_t *brdp;
  1988. int rc;
  1989. memset(&stli_comstats, 0, sizeof(comstats_t));
  1990. if (portp == (stliport_t *) NULL)
  1991. return(-ENODEV);
  1992. brdp = stli_brds[portp->brdnr];
  1993. if (brdp == (stlibrd_t *) NULL)
  1994. return(-ENODEV);
  1995. if (brdp->state & BST_STARTED) {
  1996. if ((rc = stli_cmdwait(brdp, portp, A_GETSTATS,
  1997.     &stli_cdkstats, sizeof(asystats_t), 1)) < 0)
  1998. return(rc);
  1999. } else {
  2000. memset(&stli_cdkstats, 0, sizeof(asystats_t));
  2001. }
  2002. stli_comstats.brd = portp->brdnr;
  2003. stli_comstats.panel = portp->panelnr;
  2004. stli_comstats.port = portp->portnr;
  2005. stli_comstats.state = portp->state;
  2006. stli_comstats.flags = portp->flags;
  2007. save_flags(flags);
  2008. cli();
  2009. if (portp->tty != (struct tty_struct *) NULL) {
  2010. if (portp->tty->driver_data == portp) {
  2011. stli_comstats.ttystate = portp->tty->flags;
  2012. stli_comstats.rxbuffered = portp->tty->flip.count;
  2013. if (portp->tty->termios != (struct termios *) NULL) {
  2014. stli_comstats.cflags = portp->tty->termios->c_cflag;
  2015. stli_comstats.iflags = portp->tty->termios->c_iflag;
  2016. stli_comstats.oflags = portp->tty->termios->c_oflag;
  2017. stli_comstats.lflags = portp->tty->termios->c_lflag;
  2018. }
  2019. }
  2020. }
  2021. restore_flags(flags);
  2022. stli_comstats.txtotal = stli_cdkstats.txchars;
  2023. stli_comstats.rxtotal = stli_cdkstats.rxchars + stli_cdkstats.ringover;
  2024. stli_comstats.txbuffered = stli_cdkstats.txringq;
  2025. stli_comstats.rxbuffered += stli_cdkstats.rxringq;
  2026. stli_comstats.rxoverrun = stli_cdkstats.overruns;
  2027. stli_comstats.rxparity = stli_cdkstats.parity;
  2028. stli_comstats.rxframing = stli_cdkstats.framing;
  2029. stli_comstats.rxlost = stli_cdkstats.ringover;
  2030. stli_comstats.rxbreaks = stli_cdkstats.rxbreaks;
  2031. stli_comstats.txbreaks = stli_cdkstats.txbreaks;
  2032. stli_comstats.txxon = stli_cdkstats.txstart;
  2033. stli_comstats.txxoff = stli_cdkstats.txstop;
  2034. stli_comstats.rxxon = stli_cdkstats.rxstart;
  2035. stli_comstats.rxxoff = stli_cdkstats.rxstop;
  2036. stli_comstats.rxrtsoff = stli_cdkstats.rtscnt / 2;
  2037. stli_comstats.rxrtson = stli_cdkstats.rtscnt - stli_comstats.rxrtsoff;
  2038. stli_comstats.modem = stli_cdkstats.dcdcnt;
  2039. stli_comstats.hwid = stli_cdkstats.hwid;
  2040. stli_comstats.signals = stli_mktiocm(stli_cdkstats.signals);
  2041. return(0);
  2042. }
  2043. /*****************************************************************************/
  2044. /*
  2045.  * Return the port stats structure to user app. A NULL port struct
  2046.  * pointer passed in means that we need to find out from the app
  2047.  * what port to get stats for (used through board control device).
  2048.  */
  2049. static int stli_getportstats(stliport_t *portp, comstats_t *cp)
  2050. {
  2051. stlibrd_t *brdp;
  2052. int rc;
  2053. if (portp == (stliport_t *) NULL) {
  2054. if (copy_from_user(&stli_comstats, cp, sizeof(comstats_t)))
  2055. return -EFAULT;
  2056. portp = stli_getport(stli_comstats.brd, stli_comstats.panel,
  2057. stli_comstats.port);
  2058. if (portp == (stliport_t *) NULL)
  2059. return(-ENODEV);
  2060. }
  2061. brdp = stli_brds[portp->brdnr];
  2062. if (brdp == (stlibrd_t *) NULL)
  2063. return(-ENODEV);
  2064. if ((rc = stli_portcmdstats(portp)) < 0)
  2065. return(rc);
  2066. return copy_to_user(cp, &stli_comstats, sizeof(comstats_t)) ?
  2067. -EFAULT : 0;
  2068. }
  2069. /*****************************************************************************/
  2070. /*
  2071.  * Clear the port stats structure. We also return it zeroed out...
  2072.  */
  2073. static int stli_clrportstats(stliport_t *portp, comstats_t *cp)
  2074. {
  2075. stlibrd_t *brdp;
  2076. int rc;
  2077. if (portp == (stliport_t *) NULL) {
  2078. if (copy_from_user(&stli_comstats, cp, sizeof(comstats_t)))
  2079. return -EFAULT;
  2080. portp = stli_getport(stli_comstats.brd, stli_comstats.panel,
  2081. stli_comstats.port);
  2082. if (portp == (stliport_t *) NULL)
  2083. return(-ENODEV);
  2084. }
  2085. brdp = stli_brds[portp->brdnr];
  2086. if (brdp == (stlibrd_t *) NULL)
  2087. return(-ENODEV);
  2088. if (brdp->state & BST_STARTED) {
  2089. if ((rc = stli_cmdwait(brdp, portp, A_CLEARSTATS, 0, 0, 0)) < 0)
  2090. return(rc);
  2091. }
  2092. memset(&stli_comstats, 0, sizeof(comstats_t));
  2093. stli_comstats.brd = portp->brdnr;
  2094. stli_comstats.panel = portp->panelnr;
  2095. stli_comstats.port = portp->portnr;
  2096. if (copy_to_user(cp, &stli_comstats, sizeof(comstats_t)))
  2097. return -EFAULT;
  2098. return(0);
  2099. }
  2100. /*****************************************************************************/
  2101. /*
  2102.  * Return the entire driver ports structure to a user app.
  2103.  */
  2104. static int stli_getportstruct(unsigned long arg)
  2105. {
  2106. stliport_t *portp;
  2107. if (copy_from_user(&stli_dummyport, (void *)arg, sizeof(stliport_t)))
  2108. return -EFAULT;
  2109. portp = stli_getport(stli_dummyport.brdnr, stli_dummyport.panelnr,
  2110.  stli_dummyport.portnr);
  2111. if (portp == (stliport_t *) NULL)
  2112. return(-ENODEV);
  2113. if (copy_to_user((void *) arg, portp, sizeof(stliport_t)))
  2114. return -EFAULT;
  2115. return(0);
  2116. }
  2117. /*****************************************************************************/
  2118. /*
  2119.  * Return the entire driver board structure to a user app.
  2120.  */
  2121. static int stli_getbrdstruct(unsigned long arg)
  2122. {
  2123. stlibrd_t *brdp;
  2124. if (copy_from_user(&stli_dummybrd, (void *)arg, sizeof(stlibrd_t)))
  2125. return -EFAULT;
  2126. if ((stli_dummybrd.brdnr < 0) || (stli_dummybrd.brdnr >= STL_MAXBRDS))
  2127. return(-ENODEV);
  2128. brdp = stli_brds[stli_dummybrd.brdnr];
  2129. if (brdp == (stlibrd_t *) NULL)
  2130. return(-ENODEV);
  2131. if (copy_to_user((void *) arg, brdp, sizeof(stlibrd_t)))
  2132. return -EFAULT;
  2133. return(0);
  2134. }
  2135. /*****************************************************************************/
  2136. /*
  2137.  * The "staliomem" device is also required to do some special operations on
  2138.  * the board. We need to be able to send an interrupt to the board,
  2139.  * reset it, and start/stop it.
  2140.  */
  2141. static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg)
  2142. {
  2143. stlibrd_t *brdp;
  2144. int brdnr, rc, done;
  2145. #if DEBUG
  2146. printk(KERN_DEBUG "stli_memioctl(ip=%x,fp=%x,cmd=%x,arg=%x)n",
  2147. (int) ip, (int) fp, cmd, (int) arg);
  2148. #endif
  2149. /*
  2150.  * First up handle the board independent ioctls.
  2151.  */
  2152. done = 0;
  2153. rc = 0;
  2154. switch (cmd) {
  2155. case COM_GETPORTSTATS:
  2156. rc = stli_getportstats((stliport_t *)NULL, (comstats_t *)arg);
  2157. done++;
  2158. break;
  2159. case COM_CLRPORTSTATS:
  2160. rc = stli_clrportstats((stliport_t *)NULL, (comstats_t *)arg);
  2161. done++;
  2162. break;
  2163. case COM_GETBRDSTATS:
  2164. rc = stli_getbrdstats((combrd_t *) arg);
  2165. done++;
  2166. break;
  2167. case COM_READPORT:
  2168. rc = stli_getportstruct(arg);
  2169. done++;
  2170. break;
  2171. case COM_READBOARD:
  2172. rc = stli_getbrdstruct(arg);
  2173. done++;
  2174. break;
  2175. }
  2176. if (done)
  2177. return(rc);
  2178. /*
  2179.  * Now handle the board specific ioctls. These all depend on the
  2180.  * minor number of the device they were called from.
  2181.  */
  2182. brdnr = MINOR(ip->i_rdev);
  2183. if (brdnr >= STL_MAXBRDS)
  2184. return(-ENODEV);
  2185. brdp = stli_brds[brdnr];
  2186. if (brdp == (stlibrd_t *) NULL)
  2187. return(-ENODEV);
  2188. if (brdp->state == 0)
  2189. return(-ENODEV);
  2190. switch (cmd) {
  2191. case STL_BINTR:
  2192. EBRDINTR(brdp);
  2193. break;
  2194. case STL_BSTART:
  2195. rc = stli_startbrd(brdp);
  2196. break;
  2197. case STL_BSTOP:
  2198. brdp->state &= ~BST_STARTED;
  2199. break;
  2200. case STL_BRESET:
  2201. brdp->state &= ~BST_STARTED;
  2202. EBRDRESET(brdp);
  2203. if (stli_shared == 0) {
  2204. if (brdp->reenable != NULL)
  2205. (* brdp->reenable)(brdp);
  2206. }
  2207. break;
  2208. default:
  2209. rc = -ENOIOCTLCMD;
  2210. break;
  2211. }
  2212. return(rc);
  2213. }
  2214. /*****************************************************************************/
  2215. int __init stli_init(void)
  2216. {
  2217. printk(KERN_INFO "%s: version %sn", stli_drvtitle, stli_drvversion);
  2218. stli_initbrds();
  2219. /*
  2220.  * Allocate a temporary write buffer.
  2221.  */
  2222. stli_tmpwritebuf = (char *) stli_memalloc(STLI_TXBUFSIZE);
  2223. if (stli_tmpwritebuf == (char *) NULL)
  2224. printk(KERN_ERR "STALLION: failed to allocate memory "
  2225. "(size=%d)n", STLI_TXBUFSIZE);
  2226. stli_txcookbuf = stli_memalloc(STLI_TXBUFSIZE);
  2227. if (stli_txcookbuf == (char *) NULL)
  2228. printk(KERN_ERR "STALLION: failed to allocate memory "
  2229. "(size=%d)n", STLI_TXBUFSIZE);
  2230. /*
  2231.  * Set up a character driver for the shared memory region. We need this
  2232.  * to down load the slave code image. Also it is a useful debugging tool.
  2233.  */
  2234. if (devfs_register_chrdev(STL_SIOMEMMAJOR, "staliomem", &stli_fsiomem))
  2235. printk(KERN_ERR "STALLION: failed to register serial memory "
  2236. "devicen");
  2237. devfs_handle = devfs_mk_dir (NULL, "staliomem", NULL);
  2238. devfs_register_series (devfs_handle, "%u", 4, DEVFS_FL_DEFAULT,
  2239.        STL_SIOMEMMAJOR, 0,
  2240.        S_IFCHR | S_IRUSR | S_IWUSR,
  2241.        &stli_fsiomem, NULL);
  2242. /*
  2243.  * Set up the tty driver structure and register us as a driver.
  2244.  * Also setup the callout tty device.
  2245.  */
  2246. memset(&stli_serial, 0, sizeof(struct tty_driver));
  2247. stli_serial.magic = TTY_DRIVER_MAGIC;
  2248. stli_serial.driver_name = stli_drvname;
  2249. stli_serial.name = stli_serialname;
  2250. stli_serial.major = STL_SERIALMAJOR;
  2251. stli_serial.minor_start = 0;
  2252. stli_serial.num = STL_MAXBRDS * STL_MAXPORTS;
  2253. stli_serial.type = TTY_DRIVER_TYPE_SERIAL;
  2254. stli_serial.subtype = STL_DRVTYPSERIAL;
  2255. stli_serial.init_termios = stli_deftermios;
  2256. stli_serial.flags = TTY_DRIVER_REAL_RAW;
  2257. stli_serial.refcount = &stli_refcount;
  2258. stli_serial.table = stli_ttys;
  2259. stli_serial.termios = stli_termios;
  2260. stli_serial.termios_locked = stli_termioslocked;
  2261. stli_serial.open = stli_open;
  2262. stli_serial.close = stli_close;
  2263. stli_serial.write = stli_write;
  2264. stli_serial.put_char = stli_putchar;
  2265. stli_serial.flush_chars = stli_flushchars;
  2266. stli_serial.write_room = stli_writeroom;
  2267. stli_serial.chars_in_buffer = stli_charsinbuffer;
  2268. stli_serial.ioctl = stli_ioctl;
  2269. stli_serial.set_termios = stli_settermios;
  2270. stli_serial.throttle = stli_throttle;
  2271. stli_serial.unthrottle = stli_unthrottle;
  2272. stli_serial.stop = stli_stop;
  2273. stli_serial.start = stli_start;
  2274. stli_serial.hangup = stli_hangup;
  2275. stli_serial.flush_buffer = stli_flushbuffer;
  2276. stli_serial.break_ctl = stli_breakctl;
  2277. stli_serial.wait_until_sent = stli_waituntilsent;
  2278. stli_serial.send_xchar = stli_sendxchar;
  2279. stli_serial.read_proc = stli_readproc;
  2280. stli_callout = stli_serial;
  2281. stli_callout.name = stli_calloutname;
  2282. stli_callout.major = STL_CALLOUTMAJOR;
  2283. stli_callout.subtype = STL_DRVTYPCALLOUT;
  2284. stli_callout.read_proc = 0;
  2285. if (tty_register_driver(&stli_serial))
  2286. printk(KERN_ERR "STALLION: failed to register serial drivern");
  2287. if (tty_register_driver(&stli_callout))
  2288. printk(KERN_ERR "STALLION: failed to register callout drivern");
  2289. return(0);
  2290. }
  2291. /*****************************************************************************/