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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*****************************************************************************/
  2. /*
  3.  * stallion.c  -- stallion multiport serial driver.
  4.  *
  5.  * Copyright (C) 1996-1999  Stallion Technologies (support@stallion.oz.au).
  6.  * Copyright (C) 1994-1996  Greg Ungerer.
  7.  *
  8.  * This code is loosely based on the Linux serial driver, written by
  9.  * Linus Torvalds, Theodore T'so and others.
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * (at your option) any later version.
  15.  *
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24.  */
  25. /*****************************************************************************/
  26. #include <linux/config.h>
  27. #include <linux/module.h>
  28. #include <linux/version.h> /* for linux/stallion.h */
  29. #include <linux/slab.h>
  30. #include <linux/interrupt.h>
  31. #include <linux/tty.h>
  32. #include <linux/tty_flip.h>
  33. #include <linux/serial.h>
  34. #include <linux/cd1400.h>
  35. #include <linux/sc26198.h>
  36. #include <linux/comstats.h>
  37. #include <linux/stallion.h>
  38. #include <linux/ioport.h>
  39. #include <linux/init.h>
  40. #include <linux/smp_lock.h>
  41. #include <linux/devfs_fs_kernel.h>
  42. #include <asm/io.h>
  43. #include <asm/uaccess.h>
  44. #ifdef CONFIG_PCI
  45. #include <linux/pci.h>
  46. #endif
  47. /*****************************************************************************/
  48. /*
  49.  * Define different board types. Use the standard Stallion "assigned"
  50.  * board numbers. Boards supported in this driver are abbreviated as
  51.  * EIO = EasyIO and ECH = EasyConnection 8/32.
  52.  */
  53. #define BRD_EASYIO 20
  54. #define BRD_ECH 21
  55. #define BRD_ECHMC 22
  56. #define BRD_ECHPCI 26
  57. #define BRD_ECH64PCI 27
  58. #define BRD_EASYIOPCI 28
  59. /*
  60.  * Define a configuration structure to hold the board configuration.
  61.  * Need to set this up in the code (for now) with the boards that are
  62.  * to be configured into the system. This is what needs to be modified
  63.  * when adding/removing/modifying boards. Each line entry in the
  64.  * stl_brdconf[] array is a board. Each line contains io/irq/memory
  65.  * ranges for that board (as well as what type of board it is).
  66.  * Some examples:
  67.  * { BRD_EASYIO, 0x2a0, 0, 0, 10, 0 },
  68.  * This line would configure an EasyIO board (4 or 8, no difference),
  69.  * at io address 2a0 and irq 10.
  70.  * Another example:
  71.  * { BRD_ECH, 0x2a8, 0x280, 0, 12, 0 },
  72.  * This line will configure an EasyConnection 8/32 board at primary io
  73.  * address 2a8, secondary io address 280 and irq 12.
  74.  * Enter as many lines into this array as you want (only the first 4
  75.  * will actually be used!). Any combination of EasyIO and EasyConnection
  76.  * boards can be specified. EasyConnection 8/32 boards can share their
  77.  * secondary io addresses between each other.
  78.  *
  79.  * NOTE: there is no need to put any entries in this table for PCI
  80.  * boards. They will be found automatically by the driver - provided
  81.  * PCI BIOS32 support is compiled into the kernel.
  82.  */
  83. typedef struct {
  84. int brdtype;
  85. int ioaddr1;
  86. int ioaddr2;
  87. unsigned long memaddr;
  88. int irq;
  89. int irqtype;
  90. } stlconf_t;
  91. static stlconf_t stl_brdconf[] = {
  92. /*{ BRD_EASYIO, 0x2a0, 0, 0, 10, 0 },*/
  93. };
  94. static int stl_nrbrds = sizeof(stl_brdconf) / sizeof(stlconf_t);
  95. /*****************************************************************************/
  96. /*
  97.  * Define some important driver characteristics. Device major numbers
  98.  * allocated as per Linux Device Registry.
  99.  */
  100. #ifndef STL_SIOMEMMAJOR
  101. #define STL_SIOMEMMAJOR 28
  102. #endif
  103. #ifndef STL_SERIALMAJOR
  104. #define STL_SERIALMAJOR 24
  105. #endif
  106. #ifndef STL_CALLOUTMAJOR
  107. #define STL_CALLOUTMAJOR 25
  108. #endif
  109. #define STL_DRVTYPSERIAL 1
  110. #define STL_DRVTYPCALLOUT 2
  111. /*
  112.  * Set the TX buffer size. Bigger is better, but we don't want
  113.  * to chew too much memory with buffers!
  114.  */
  115. #define STL_TXBUFLOW 512
  116. #define STL_TXBUFSIZE 4096
  117. /*****************************************************************************/
  118. /*
  119.  * Define our local driver identity first. Set up stuff to deal with
  120.  * all the local structures required by a serial tty driver.
  121.  */
  122. static char *stl_drvtitle = "Stallion Multiport Serial Driver";
  123. static char *stl_drvname = "stallion";
  124. static char *stl_drvversion = "5.6.0";
  125. #ifdef CONFIG_DEVFS_FS
  126. static char *stl_serialname = "tts/E%d";
  127. static char *stl_calloutname = "cua/E%d";
  128. #else
  129. static char *stl_serialname = "ttyE";
  130. static char *stl_calloutname = "cue";
  131. #endif
  132. static struct tty_driver stl_serial;
  133. static struct tty_driver stl_callout;
  134. static struct tty_struct *stl_ttys[STL_MAXDEVS];
  135. static struct termios *stl_termios[STL_MAXDEVS];
  136. static struct termios *stl_termioslocked[STL_MAXDEVS];
  137. static int stl_refcount;
  138. /*
  139.  * We will need to allocate a temporary write buffer for chars that
  140.  * come direct from user space. The problem is that a copy from user
  141.  * space might cause a page fault (typically on a system that is
  142.  * swapping!). All ports will share one buffer - since if the system
  143.  * is already swapping a shared buffer won't make things any worse.
  144.  */
  145. static char *stl_tmpwritebuf;
  146. static DECLARE_MUTEX(stl_tmpwritesem);
  147. /*
  148.  * Define a local default termios struct. All ports will be created
  149.  * with this termios initially. Basically all it defines is a raw port
  150.  * at 9600, 8 data bits, 1 stop bit.
  151.  */
  152. static struct termios stl_deftermios = {
  153. c_cflag: (B9600 | CS8 | CREAD | HUPCL | CLOCAL),
  154. c_cc: INIT_C_CC,
  155. };
  156. /*
  157.  * Define global stats structures. Not used often, and can be
  158.  * re-used for each stats call.
  159.  */
  160. static comstats_t stl_comstats;
  161. static combrd_t stl_brdstats;
  162. static stlbrd_t stl_dummybrd;
  163. static stlport_t stl_dummyport;
  164. /*
  165.  * Define global place to put buffer overflow characters.
  166.  */
  167. static char stl_unwanted[SC26198_RXFIFOSIZE];
  168. /*****************************************************************************/
  169. static stlbrd_t *stl_brds[STL_MAXBRDS];
  170. /*
  171.  * Per board state flags. Used with the state field of the board struct.
  172.  * Not really much here!
  173.  */
  174. #define BRD_FOUND 0x1
  175. /*
  176.  * Define the port structure istate flags. These set of flags are
  177.  * modified at interrupt time - so setting and reseting them needs
  178.  * to be atomic. Use the bit clear/setting routines for this.
  179.  */
  180. #define ASYI_TXBUSY 1
  181. #define ASYI_TXLOW 2
  182. #define ASYI_DCDCHANGE 3
  183. #define ASYI_TXFLOWED 4
  184. /*
  185.  * Define an array of board names as printable strings. Handy for
  186.  * referencing boards when printing trace and stuff.
  187.  */
  188. static char *stl_brdnames[] = {
  189. (char *) NULL,
  190. (char *) NULL,
  191. (char *) NULL,
  192. (char *) NULL,
  193. (char *) NULL,
  194. (char *) NULL,
  195. (char *) NULL,
  196. (char *) NULL,
  197. (char *) NULL,
  198. (char *) NULL,
  199. (char *) NULL,
  200. (char *) NULL,
  201. (char *) NULL,
  202. (char *) NULL,
  203. (char *) NULL,
  204. (char *) NULL,
  205. (char *) NULL,
  206. (char *) NULL,
  207. (char *) NULL,
  208. (char *) NULL,
  209. "EasyIO",
  210. "EC8/32-AT",
  211. "EC8/32-MC",
  212. (char *) NULL,
  213. (char *) NULL,
  214. (char *) NULL,
  215. "EC8/32-PCI",
  216. "EC8/64-PCI",
  217. "EasyIO-PCI",
  218. };
  219. /*****************************************************************************/
  220. #ifdef MODULE
  221. /*
  222.  * Define some string labels for arguments passed from the module
  223.  * load line. These allow for easy board definitions, and easy
  224.  * modification of the io, memory and irq resoucres.
  225.  */
  226. static char *board0[4];
  227. static char *board1[4];
  228. static char *board2[4];
  229. static char *board3[4];
  230. static char **stl_brdsp[] = {
  231. (char **) &board0,
  232. (char **) &board1,
  233. (char **) &board2,
  234. (char **) &board3
  235. };
  236. /*
  237.  * Define a set of common board names, and types. This is used to
  238.  * parse any module arguments.
  239.  */
  240. typedef struct stlbrdtype {
  241. char *name;
  242. int type;
  243. } stlbrdtype_t;
  244. static stlbrdtype_t stl_brdstr[] = {
  245. { "easyio", BRD_EASYIO },
  246. { "eio", BRD_EASYIO },
  247. { "20", BRD_EASYIO },
  248. { "ec8/32", BRD_ECH },
  249. { "ec8/32-at", BRD_ECH },
  250. { "ec8/32-isa", BRD_ECH },
  251. { "ech", BRD_ECH },
  252. { "echat", BRD_ECH },
  253. { "21", BRD_ECH },
  254. { "ec8/32-mc", BRD_ECHMC },
  255. { "ec8/32-mca", BRD_ECHMC },
  256. { "echmc", BRD_ECHMC },
  257. { "echmca", BRD_ECHMC },
  258. { "22", BRD_ECHMC },
  259. { "ec8/32-pc", BRD_ECHPCI },
  260. { "ec8/32-pci", BRD_ECHPCI },
  261. { "26", BRD_ECHPCI },
  262. { "ec8/64-pc", BRD_ECH64PCI },
  263. { "ec8/64-pci", BRD_ECH64PCI },
  264. { "ech-pci", BRD_ECH64PCI },
  265. { "echpci", BRD_ECH64PCI },
  266. { "echpc", BRD_ECH64PCI },
  267. { "27", BRD_ECH64PCI },
  268. { "easyio-pc", BRD_EASYIOPCI },
  269. { "easyio-pci", BRD_EASYIOPCI },
  270. { "eio-pci", BRD_EASYIOPCI },
  271. { "eiopci", BRD_EASYIOPCI },
  272. { "28", BRD_EASYIOPCI },
  273. };
  274. /*
  275.  * Define the module agruments.
  276.  */
  277. MODULE_AUTHOR("Greg Ungerer");
  278. MODULE_DESCRIPTION("Stallion Multiport Serial Driver");
  279. MODULE_LICENSE("GPL");
  280. MODULE_PARM(board0, "1-4s");
  281. MODULE_PARM_DESC(board0, "Board 0 config -> name[,ioaddr[,ioaddr2][,irq]]");
  282. MODULE_PARM(board1, "1-4s");
  283. MODULE_PARM_DESC(board1, "Board 1 config -> name[,ioaddr[,ioaddr2][,irq]]");
  284. MODULE_PARM(board2, "1-4s");
  285. MODULE_PARM_DESC(board2, "Board 2 config -> name[,ioaddr[,ioaddr2][,irq]]");
  286. MODULE_PARM(board3, "1-4s");
  287. MODULE_PARM_DESC(board3, "Board 3 config -> name[,ioaddr[,ioaddr2][,irq]]");
  288. #endif
  289. /*****************************************************************************/
  290. /*
  291.  * Hardware ID bits for the EasyIO and ECH boards. These defines apply
  292.  * to the directly accessible io ports of these boards (not the uarts -
  293.  * they are in cd1400.h and sc26198.h).
  294.  */
  295. #define EIO_8PORTRS 0x04
  296. #define EIO_4PORTRS 0x05
  297. #define EIO_8PORTDI 0x00
  298. #define EIO_8PORTM 0x06
  299. #define EIO_MK3 0x03
  300. #define EIO_IDBITMASK 0x07
  301. #define EIO_BRDMASK 0xf0
  302. #define ID_BRD4 0x10
  303. #define ID_BRD8 0x20
  304. #define ID_BRD16 0x30
  305. #define EIO_INTRPEND 0x08
  306. #define EIO_INTEDGE 0x00
  307. #define EIO_INTLEVEL 0x08
  308. #define EIO_0WS 0x10
  309. #define ECH_ID 0xa0
  310. #define ECH_IDBITMASK 0xe0
  311. #define ECH_BRDENABLE 0x08
  312. #define ECH_BRDDISABLE 0x00
  313. #define ECH_INTENABLE 0x01
  314. #define ECH_INTDISABLE 0x00
  315. #define ECH_INTLEVEL 0x02
  316. #define ECH_INTEDGE 0x00
  317. #define ECH_INTRPEND 0x01
  318. #define ECH_BRDRESET 0x01
  319. #define ECHMC_INTENABLE 0x01
  320. #define ECHMC_BRDRESET 0x02
  321. #define ECH_PNLSTATUS 2
  322. #define ECH_PNL16PORT 0x20
  323. #define ECH_PNLIDMASK 0x07
  324. #define ECH_PNLXPID 0x40
  325. #define ECH_PNLINTRPEND 0x80
  326. #define ECH_ADDR2MASK 0x1e0
  327. /*
  328.  * Define the vector mapping bits for the programmable interrupt board
  329.  * hardware. These bits encode the interrupt for the board to use - it
  330.  * is software selectable (except the EIO-8M).
  331.  */
  332. static unsigned char stl_vecmap[] = {
  333. 0xff, 0xff, 0xff, 0x04, 0x06, 0x05, 0xff, 0x07,
  334. 0xff, 0xff, 0x00, 0x02, 0x01, 0xff, 0xff, 0x03
  335. };
  336. /*
  337.  * Set up enable and disable macros for the ECH boards. They require
  338.  * the secondary io address space to be activated and deactivated.
  339.  * This way all ECH boards can share their secondary io region.
  340.  * If this is an ECH-PCI board then also need to set the page pointer
  341.  * to point to the correct page.
  342.  */
  343. #define BRDENABLE(brdnr,pagenr)
  344. if (stl_brds[(brdnr)]->brdtype == BRD_ECH)
  345. outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDENABLE),
  346. stl_brds[(brdnr)]->ioctrl);
  347. else if (stl_brds[(brdnr)]->brdtype == BRD_ECHPCI)
  348. outb((pagenr), stl_brds[(brdnr)]->ioctrl);
  349. #define BRDDISABLE(brdnr)
  350. if (stl_brds[(brdnr)]->brdtype == BRD_ECH)
  351. outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDDISABLE),
  352. stl_brds[(brdnr)]->ioctrl);
  353. #define STL_CD1400MAXBAUD 230400
  354. #define STL_SC26198MAXBAUD 460800
  355. #define STL_BAUDBASE 115200
  356. #define STL_CLOSEDELAY (5 * HZ / 10)
  357. /*****************************************************************************/
  358. #ifdef CONFIG_PCI
  359. /*
  360.  * Define the Stallion PCI vendor and device IDs.
  361.  */
  362. #ifndef PCI_VENDOR_ID_STALLION
  363. #define PCI_VENDOR_ID_STALLION 0x124d
  364. #endif
  365. #ifndef PCI_DEVICE_ID_ECHPCI832
  366. #define PCI_DEVICE_ID_ECHPCI832 0x0000
  367. #endif
  368. #ifndef PCI_DEVICE_ID_ECHPCI864
  369. #define PCI_DEVICE_ID_ECHPCI864 0x0002
  370. #endif
  371. #ifndef PCI_DEVICE_ID_EIOPCI
  372. #define PCI_DEVICE_ID_EIOPCI 0x0003
  373. #endif
  374. /*
  375.  * Define structure to hold all Stallion PCI boards.
  376.  */
  377. typedef struct stlpcibrd {
  378. unsigned short vendid;
  379. unsigned short devid;
  380. int brdtype;
  381. } stlpcibrd_t;
  382. static stlpcibrd_t stl_pcibrds[] = {
  383. { PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI864, BRD_ECH64PCI },
  384. { PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_EIOPCI, BRD_EASYIOPCI },
  385. { PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI832, BRD_ECHPCI },
  386. { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87410, BRD_ECHPCI },
  387. };
  388. static int stl_nrpcibrds = sizeof(stl_pcibrds) / sizeof(stlpcibrd_t);
  389. #endif
  390. /*****************************************************************************/
  391. /*
  392.  * Define macros to extract a brd/port number from a minor number.
  393.  */
  394. #define MINOR2BRD(min) (((min) & 0xc0) >> 6)
  395. #define MINOR2PORT(min) ((min) & 0x3f)
  396. /*
  397.  * Define a baud rate table that converts termios baud rate selector
  398.  * into the actual baud rate value. All baud rate calculations are
  399.  * based on the actual baud rate required.
  400.  */
  401. static unsigned int stl_baudrates[] = {
  402. 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
  403. 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600
  404. };
  405. /*
  406.  * Define some handy local macros...
  407.  */
  408. #undef MIN
  409. #define MIN(a,b) (((a) <= (b)) ? (a) : (b))
  410. #undef TOLOWER
  411. #define TOLOWER(x) ((((x) >= 'A') && ((x) <= 'Z')) ? ((x) + 0x20) : (x))
  412. /*****************************************************************************/
  413. /*
  414.  * Declare all those functions in this driver!
  415.  */
  416. #ifdef MODULE
  417. int init_module(void);
  418. void cleanup_module(void);
  419. static void stl_argbrds(void);
  420. static int stl_parsebrd(stlconf_t *confp, char **argp);
  421. static unsigned long stl_atol(char *str);
  422. #endif
  423. int stl_init(void);
  424. static int stl_open(struct tty_struct *tty, struct file *filp);
  425. static void stl_close(struct tty_struct *tty, struct file *filp);
  426. static int stl_write(struct tty_struct *tty, int from_user, const unsigned char *buf, int count);
  427. static void stl_putchar(struct tty_struct *tty, unsigned char ch);
  428. static void stl_flushchars(struct tty_struct *tty);
  429. static int stl_writeroom(struct tty_struct *tty);
  430. static int stl_charsinbuffer(struct tty_struct *tty);
  431. static int stl_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg);
  432. static void stl_settermios(struct tty_struct *tty, struct termios *old);
  433. static void stl_throttle(struct tty_struct *tty);
  434. static void stl_unthrottle(struct tty_struct *tty);
  435. static void stl_stop(struct tty_struct *tty);
  436. static void stl_start(struct tty_struct *tty);
  437. static void stl_flushbuffer(struct tty_struct *tty);
  438. static void stl_breakctl(struct tty_struct *tty, int state);
  439. static void stl_waituntilsent(struct tty_struct *tty, int timeout);
  440. static void stl_sendxchar(struct tty_struct *tty, char ch);
  441. static void stl_hangup(struct tty_struct *tty);
  442. static int stl_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg);
  443. static int stl_portinfo(stlport_t *portp, int portnr, char *pos);
  444. static int stl_readproc(char *page, char **start, off_t off, int count, int *eof, void *data);
  445. static int stl_brdinit(stlbrd_t *brdp);
  446. static int stl_initports(stlbrd_t *brdp, stlpanel_t *panelp);
  447. static void stl_getserial(stlport_t *portp, struct serial_struct *sp);
  448. static int stl_setserial(stlport_t *portp, struct serial_struct *sp);
  449. static int stl_getbrdstats(combrd_t *bp);
  450. static int stl_getportstats(stlport_t *portp, comstats_t *cp);
  451. static int stl_clrportstats(stlport_t *portp, comstats_t *cp);
  452. static int stl_getportstruct(unsigned long arg);
  453. static int stl_getbrdstruct(unsigned long arg);
  454. static int stl_waitcarrier(stlport_t *portp, struct file *filp);
  455. static void stl_delay(int len);
  456. static void stl_intr(int irq, void *dev_id, struct pt_regs *regs);
  457. static void stl_eiointr(stlbrd_t *brdp);
  458. static void stl_echatintr(stlbrd_t *brdp);
  459. static void stl_echmcaintr(stlbrd_t *brdp);
  460. static void stl_echpciintr(stlbrd_t *brdp);
  461. static void stl_echpci64intr(stlbrd_t *brdp);
  462. static void stl_offintr(void *private);
  463. static void *stl_memalloc(int len);
  464. static stlbrd_t *stl_allocbrd(void);
  465. static stlport_t *stl_getport(int brdnr, int panelnr, int portnr);
  466. static inline int stl_initbrds(void);
  467. static inline int stl_initeio(stlbrd_t *brdp);
  468. static inline int stl_initech(stlbrd_t *brdp);
  469. static inline int stl_getbrdnr(void);
  470. #ifdef CONFIG_PCI
  471. static inline int stl_findpcibrds(void);
  472. static inline int stl_initpcibrd(int brdtype, struct pci_dev *devp);
  473. #endif
  474. /*
  475.  * CD1400 uart specific handling functions.
  476.  */
  477. static void stl_cd1400setreg(stlport_t *portp, int regnr, int value);
  478. static int stl_cd1400getreg(stlport_t *portp, int regnr);
  479. static int stl_cd1400updatereg(stlport_t *portp, int regnr, int value);
  480. static int stl_cd1400panelinit(stlbrd_t *brdp, stlpanel_t *panelp);
  481. static void stl_cd1400portinit(stlbrd_t *brdp, stlpanel_t *panelp, stlport_t *portp);
  482. static void stl_cd1400setport(stlport_t *portp, struct termios *tiosp);
  483. static int stl_cd1400getsignals(stlport_t *portp);
  484. static void stl_cd1400setsignals(stlport_t *portp, int dtr, int rts);
  485. static void stl_cd1400ccrwait(stlport_t *portp);
  486. static void stl_cd1400enablerxtx(stlport_t *portp, int rx, int tx);
  487. static void stl_cd1400startrxtx(stlport_t *portp, int rx, int tx);
  488. static void stl_cd1400disableintrs(stlport_t *portp);
  489. static void stl_cd1400sendbreak(stlport_t *portp, int len);
  490. static void stl_cd1400flowctrl(stlport_t *portp, int state);
  491. static void stl_cd1400sendflow(stlport_t *portp, int state);
  492. static void stl_cd1400flush(stlport_t *portp);
  493. static int stl_cd1400datastate(stlport_t *portp);
  494. static void stl_cd1400eiointr(stlpanel_t *panelp, unsigned int iobase);
  495. static void stl_cd1400echintr(stlpanel_t *panelp, unsigned int iobase);
  496. static void stl_cd1400txisr(stlpanel_t *panelp, int ioaddr);
  497. static void stl_cd1400rxisr(stlpanel_t *panelp, int ioaddr);
  498. static void stl_cd1400mdmisr(stlpanel_t *panelp, int ioaddr);
  499. static inline int stl_cd1400breakisr(stlport_t *portp, int ioaddr);
  500. /*
  501.  * SC26198 uart specific handling functions.
  502.  */
  503. static void stl_sc26198setreg(stlport_t *portp, int regnr, int value);
  504. static int stl_sc26198getreg(stlport_t *portp, int regnr);
  505. static int stl_sc26198updatereg(stlport_t *portp, int regnr, int value);
  506. static int stl_sc26198getglobreg(stlport_t *portp, int regnr);
  507. static int stl_sc26198panelinit(stlbrd_t *brdp, stlpanel_t *panelp);
  508. static void stl_sc26198portinit(stlbrd_t *brdp, stlpanel_t *panelp, stlport_t *portp);
  509. static void stl_sc26198setport(stlport_t *portp, struct termios *tiosp);
  510. static int stl_sc26198getsignals(stlport_t *portp);
  511. static void stl_sc26198setsignals(stlport_t *portp, int dtr, int rts);
  512. static void stl_sc26198enablerxtx(stlport_t *portp, int rx, int tx);
  513. static void stl_sc26198startrxtx(stlport_t *portp, int rx, int tx);
  514. static void stl_sc26198disableintrs(stlport_t *portp);
  515. static void stl_sc26198sendbreak(stlport_t *portp, int len);
  516. static void stl_sc26198flowctrl(stlport_t *portp, int state);
  517. static void stl_sc26198sendflow(stlport_t *portp, int state);
  518. static void stl_sc26198flush(stlport_t *portp);
  519. static int stl_sc26198datastate(stlport_t *portp);
  520. static void stl_sc26198wait(stlport_t *portp);
  521. static void stl_sc26198txunflow(stlport_t *portp, struct tty_struct *tty);
  522. static void stl_sc26198intr(stlpanel_t *panelp, unsigned int iobase);
  523. static void stl_sc26198txisr(stlport_t *port);
  524. static void stl_sc26198rxisr(stlport_t *port, unsigned int iack);
  525. static void stl_sc26198rxbadch(stlport_t *portp, unsigned char status, char ch);
  526. static void stl_sc26198rxbadchars(stlport_t *portp);
  527. static void stl_sc26198otherisr(stlport_t *port, unsigned int iack);
  528. /*****************************************************************************/
  529. /*
  530.  * Generic UART support structure.
  531.  */
  532. typedef struct uart {
  533. int (*panelinit)(stlbrd_t *brdp, stlpanel_t *panelp);
  534. void (*portinit)(stlbrd_t *brdp, stlpanel_t *panelp, stlport_t *portp);
  535. void (*setport)(stlport_t *portp, struct termios *tiosp);
  536. int (*getsignals)(stlport_t *portp);
  537. void (*setsignals)(stlport_t *portp, int dtr, int rts);
  538. void (*enablerxtx)(stlport_t *portp, int rx, int tx);
  539. void (*startrxtx)(stlport_t *portp, int rx, int tx);
  540. void (*disableintrs)(stlport_t *portp);
  541. void (*sendbreak)(stlport_t *portp, int len);
  542. void (*flowctrl)(stlport_t *portp, int state);
  543. void (*sendflow)(stlport_t *portp, int state);
  544. void (*flush)(stlport_t *portp);
  545. int (*datastate)(stlport_t *portp);
  546. void (*intr)(stlpanel_t *panelp, unsigned int iobase);
  547. } uart_t;
  548. /*
  549.  * Define some macros to make calling these functions nice and clean.
  550.  */
  551. #define stl_panelinit (* ((uart_t *) panelp->uartp)->panelinit)
  552. #define stl_portinit (* ((uart_t *) portp->uartp)->portinit)
  553. #define stl_setport (* ((uart_t *) portp->uartp)->setport)
  554. #define stl_getsignals (* ((uart_t *) portp->uartp)->getsignals)
  555. #define stl_setsignals (* ((uart_t *) portp->uartp)->setsignals)
  556. #define stl_enablerxtx (* ((uart_t *) portp->uartp)->enablerxtx)
  557. #define stl_startrxtx (* ((uart_t *) portp->uartp)->startrxtx)
  558. #define stl_disableintrs (* ((uart_t *) portp->uartp)->disableintrs)
  559. #define stl_sendbreak (* ((uart_t *) portp->uartp)->sendbreak)
  560. #define stl_flowctrl (* ((uart_t *) portp->uartp)->flowctrl)
  561. #define stl_sendflow (* ((uart_t *) portp->uartp)->sendflow)
  562. #define stl_flush (* ((uart_t *) portp->uartp)->flush)
  563. #define stl_datastate (* ((uart_t *) portp->uartp)->datastate)
  564. /*****************************************************************************/
  565. /*
  566.  * CD1400 UART specific data initialization.
  567.  */
  568. static uart_t stl_cd1400uart = {
  569. stl_cd1400panelinit,
  570. stl_cd1400portinit,
  571. stl_cd1400setport,
  572. stl_cd1400getsignals,
  573. stl_cd1400setsignals,
  574. stl_cd1400enablerxtx,
  575. stl_cd1400startrxtx,
  576. stl_cd1400disableintrs,
  577. stl_cd1400sendbreak,
  578. stl_cd1400flowctrl,
  579. stl_cd1400sendflow,
  580. stl_cd1400flush,
  581. stl_cd1400datastate,
  582. stl_cd1400eiointr
  583. };
  584. /*
  585.  * Define the offsets within the register bank of a cd1400 based panel.
  586.  * These io address offsets are common to the EasyIO board as well.
  587.  */
  588. #define EREG_ADDR 0
  589. #define EREG_DATA 4
  590. #define EREG_RXACK 5
  591. #define EREG_TXACK 6
  592. #define EREG_MDACK 7
  593. #define EREG_BANKSIZE 8
  594. #define CD1400_CLK 25000000
  595. #define CD1400_CLK8M 20000000
  596. /*
  597.  * Define the cd1400 baud rate clocks. These are used when calculating
  598.  * what clock and divisor to use for the required baud rate. Also
  599.  * define the maximum baud rate allowed, and the default base baud.
  600.  */
  601. static int stl_cd1400clkdivs[] = {
  602. CD1400_CLK0, CD1400_CLK1, CD1400_CLK2, CD1400_CLK3, CD1400_CLK4
  603. };
  604. /*****************************************************************************/
  605. /*
  606.  * SC26198 UART specific data initization.
  607.  */
  608. static uart_t stl_sc26198uart = {
  609. stl_sc26198panelinit,
  610. stl_sc26198portinit,
  611. stl_sc26198setport,
  612. stl_sc26198getsignals,
  613. stl_sc26198setsignals,
  614. stl_sc26198enablerxtx,
  615. stl_sc26198startrxtx,
  616. stl_sc26198disableintrs,
  617. stl_sc26198sendbreak,
  618. stl_sc26198flowctrl,
  619. stl_sc26198sendflow,
  620. stl_sc26198flush,
  621. stl_sc26198datastate,
  622. stl_sc26198intr
  623. };
  624. /*
  625.  * Define the offsets within the register bank of a sc26198 based panel.
  626.  */
  627. #define XP_DATA 0
  628. #define XP_ADDR 1
  629. #define XP_MODID 2
  630. #define XP_STATUS 2
  631. #define XP_IACK 3
  632. #define XP_BANKSIZE 4
  633. /*
  634.  * Define the sc26198 baud rate table. Offsets within the table
  635.  * represent the actual baud rate selector of sc26198 registers.
  636.  */
  637. static unsigned int sc26198_baudtable[] = {
  638. 50, 75, 150, 200, 300, 450, 600, 900, 1200, 1800, 2400, 3600,
  639. 4800, 7200, 9600, 14400, 19200, 28800, 38400, 57600, 115200,
  640. 230400, 460800, 921600
  641. };
  642. #define SC26198_NRBAUDS (sizeof(sc26198_baudtable) / sizeof(unsigned int))
  643. /*****************************************************************************/
  644. /*
  645.  * Define the driver info for a user level control device. Used mainly
  646.  * to get at port stats - only not using the port device itself.
  647.  */
  648. static struct file_operations stl_fsiomem = {
  649. owner: THIS_MODULE,
  650. ioctl: stl_memioctl,
  651. };
  652. /*****************************************************************************/
  653. static devfs_handle_t devfs_handle;
  654. #ifdef MODULE
  655. /*
  656.  * Loadable module initialization stuff.
  657.  */
  658. int init_module()
  659. {
  660. unsigned long flags;
  661. #if DEBUG
  662. printk("init_module()n");
  663. #endif
  664. save_flags(flags);
  665. cli();
  666. stl_init();
  667. restore_flags(flags);
  668. return(0);
  669. }
  670. /*****************************************************************************/
  671. void cleanup_module()
  672. {
  673. stlbrd_t *brdp;
  674. stlpanel_t *panelp;
  675. stlport_t *portp;
  676. unsigned long flags;
  677. int i, j, k;
  678. #if DEBUG
  679. printk("cleanup_module()n");
  680. #endif
  681. printk(KERN_INFO "Unloading %s: version %sn", stl_drvtitle,
  682. stl_drvversion);
  683. save_flags(flags);
  684. cli();
  685. /*
  686.  * Free up all allocated resources used by the ports. This includes
  687.  * memory and interrupts. As part of this process we will also do
  688.  * a hangup on every open port - to try to flush out any processes
  689.  * hanging onto ports.
  690.  */
  691. i = tty_unregister_driver(&stl_serial);
  692. j = tty_unregister_driver(&stl_callout);
  693. if (i || j) {
  694. printk("STALLION: failed to un-register tty driver, "
  695. "errno=%d,%dn", -i, -j);
  696. restore_flags(flags);
  697. return;
  698. }
  699. devfs_unregister (devfs_handle);
  700. if ((i = devfs_unregister_chrdev(STL_SIOMEMMAJOR, "staliomem")))
  701. printk("STALLION: failed to un-register serial memory device, "
  702. "errno=%dn", -i);
  703. if (stl_tmpwritebuf != (char *) NULL)
  704. kfree(stl_tmpwritebuf);
  705. for (i = 0; (i < stl_nrbrds); i++) {
  706. if ((brdp = stl_brds[i]) == (stlbrd_t *) NULL)
  707. continue;
  708. for (j = 0; (j < STL_MAXPANELS); j++) {
  709. panelp = brdp->panels[j];
  710. if (panelp == (stlpanel_t *) NULL)
  711. continue;
  712. for (k = 0; (k < STL_PORTSPERPANEL); k++) {
  713. portp = panelp->ports[k];
  714. if (portp == (stlport_t *) NULL)
  715. continue;
  716. if (portp->tty != (struct tty_struct *) NULL)
  717. stl_hangup(portp->tty);
  718. if (portp->tx.buf != (char *) NULL)
  719. kfree(portp->tx.buf);
  720. kfree(portp);
  721. }
  722. kfree(panelp);
  723. }
  724. free_irq(brdp->irq, brdp);
  725. release_region(brdp->ioaddr1, brdp->iosize1);
  726. if (brdp->iosize2 > 0)
  727. release_region(brdp->ioaddr2, brdp->iosize2);
  728. kfree(brdp);
  729. stl_brds[i] = (stlbrd_t *) NULL;
  730. }
  731. restore_flags(flags);
  732. }
  733. /*****************************************************************************/
  734. /*
  735.  * Check for any arguments passed in on the module load command line.
  736.  */
  737. static void stl_argbrds()
  738. {
  739. stlconf_t conf;
  740. stlbrd_t *brdp;
  741. int nrargs, i;
  742. #if DEBUG
  743. printk("stl_argbrds()n");
  744. #endif
  745. nrargs = sizeof(stl_brdsp) / sizeof(char **);
  746. for (i = stl_nrbrds; (i < nrargs); i++) {
  747. memset(&conf, 0, sizeof(conf));
  748. if (stl_parsebrd(&conf, stl_brdsp[i]) == 0)
  749. continue;
  750. if ((brdp = stl_allocbrd()) == (stlbrd_t *) NULL)
  751. continue;
  752. stl_nrbrds = i + 1;
  753. brdp->brdnr = i;
  754. brdp->brdtype = conf.brdtype;
  755. brdp->ioaddr1 = conf.ioaddr1;
  756. brdp->ioaddr2 = conf.ioaddr2;
  757. brdp->irq = conf.irq;
  758. brdp->irqtype = conf.irqtype;
  759. stl_brdinit(brdp);
  760. }
  761. }
  762. /*****************************************************************************/
  763. /*
  764.  * Convert an ascii string number into an unsigned long.
  765.  */
  766. static unsigned long stl_atol(char *str)
  767. {
  768. unsigned long val;
  769. int base, c;
  770. char *sp;
  771. val = 0;
  772. sp = str;
  773. if ((*sp == '0') && (*(sp+1) == 'x')) {
  774. base = 16;
  775. sp += 2;
  776. } else if (*sp == '0') {
  777. base = 8;
  778. sp++;
  779. } else {
  780. base = 10;
  781. }
  782. for (; (*sp != 0); sp++) {
  783. c = (*sp > '9') ? (TOLOWER(*sp) - 'a' + 10) : (*sp - '0');
  784. if ((c < 0) || (c >= base)) {
  785. printk("STALLION: invalid argument %sn", str);
  786. val = 0;
  787. break;
  788. }
  789. val = (val * base) + c;
  790. }
  791. return(val);
  792. }
  793. /*****************************************************************************/
  794. /*
  795.  * Parse the supplied argument string, into the board conf struct.
  796.  */
  797. static int stl_parsebrd(stlconf_t *confp, char **argp)
  798. {
  799. char *sp;
  800. int nrbrdnames, i;
  801. #if DEBUG
  802. printk("stl_parsebrd(confp=%x,argp=%x)n", (int) confp, (int) argp);
  803. #endif
  804. if ((argp[0] == (char *) NULL) || (*argp[0] == 0))
  805. return(0);
  806. for (sp = argp[0], i = 0; ((*sp != 0) && (i < 25)); sp++, i++)
  807. *sp = TOLOWER(*sp);
  808. nrbrdnames = sizeof(stl_brdstr) / sizeof(stlbrdtype_t);
  809. for (i = 0; (i < nrbrdnames); i++) {
  810. if (strcmp(stl_brdstr[i].name, argp[0]) == 0)
  811. break;
  812. }
  813. if (i >= nrbrdnames) {
  814. printk("STALLION: unknown board name, %s?n", argp[0]);
  815. return(0);
  816. }
  817. confp->brdtype = stl_brdstr[i].type;
  818. i = 1;
  819. if ((argp[i] != (char *) NULL) && (*argp[i] != 0))
  820. confp->ioaddr1 = stl_atol(argp[i]);
  821. i++;
  822. if (confp->brdtype == BRD_ECH) {
  823. if ((argp[i] != (char *) NULL) && (*argp[i] != 0))
  824. confp->ioaddr2 = stl_atol(argp[i]);
  825. i++;
  826. }
  827. if ((argp[i] != (char *) NULL) && (*argp[i] != 0))
  828. confp->irq = stl_atol(argp[i]);
  829. return(1);
  830. }
  831. #endif
  832. /*****************************************************************************/
  833. /*
  834.  * Local driver kernel memory allocation routine.
  835.  */
  836. static void *stl_memalloc(int len)
  837. {
  838. return((void *) kmalloc(len, GFP_KERNEL));
  839. }
  840. /*****************************************************************************/
  841. /*
  842.  * Allocate a new board structure. Fill out the basic info in it.
  843.  */
  844. static stlbrd_t *stl_allocbrd()
  845. {
  846. stlbrd_t *brdp;
  847. brdp = (stlbrd_t *) stl_memalloc(sizeof(stlbrd_t));
  848. if (brdp == (stlbrd_t *) NULL) {
  849. printk("STALLION: failed to allocate memory (size=%d)n",
  850. sizeof(stlbrd_t));
  851. return((stlbrd_t *) NULL);
  852. }
  853. memset(brdp, 0, sizeof(stlbrd_t));
  854. brdp->magic = STL_BOARDMAGIC;
  855. return(brdp);
  856. }
  857. /*****************************************************************************/
  858. static int stl_open(struct tty_struct *tty, struct file *filp)
  859. {
  860. stlport_t *portp;
  861. stlbrd_t *brdp;
  862. unsigned int minordev;
  863. int brdnr, panelnr, portnr, rc;
  864. #if DEBUG
  865. printk("stl_open(tty=%x,filp=%x): device=%xn", (int) tty,
  866. (int) filp, tty->device);
  867. #endif
  868. minordev = MINOR(tty->device);
  869. brdnr = MINOR2BRD(minordev);
  870. if (brdnr >= stl_nrbrds)
  871. return(-ENODEV);
  872. brdp = stl_brds[brdnr];
  873. if (brdp == (stlbrd_t *) NULL)
  874. return(-ENODEV);
  875. minordev = MINOR2PORT(minordev);
  876. for (portnr = -1, panelnr = 0; (panelnr < STL_MAXPANELS); panelnr++) {
  877. if (brdp->panels[panelnr] == (stlpanel_t *) NULL)
  878. break;
  879. if (minordev < brdp->panels[panelnr]->nrports) {
  880. portnr = minordev;
  881. break;
  882. }
  883. minordev -= brdp->panels[panelnr]->nrports;
  884. }
  885. if (portnr < 0)
  886. return(-ENODEV);
  887. portp = brdp->panels[panelnr]->ports[portnr];
  888. if (portp == (stlport_t *) NULL)
  889. return(-ENODEV);
  890. MOD_INC_USE_COUNT;
  891. /*
  892.  * On the first open of the device setup the port hardware, and
  893.  * initialize the per port data structure.
  894.  */
  895. portp->tty = tty;
  896. tty->driver_data = portp;
  897. portp->refcount++;
  898. if ((portp->flags & ASYNC_INITIALIZED) == 0) {
  899. if (portp->tx.buf == (char *) NULL) {
  900. portp->tx.buf = (char *) stl_memalloc(STL_TXBUFSIZE);
  901. if (portp->tx.buf == (char *) NULL)
  902. return(-ENOMEM);
  903. portp->tx.head = portp->tx.buf;
  904. portp->tx.tail = portp->tx.buf;
  905. }
  906. stl_setport(portp, tty->termios);
  907. portp->sigs = stl_getsignals(portp);
  908. stl_setsignals(portp, 1, 1);
  909. stl_enablerxtx(portp, 1, 1);
  910. stl_startrxtx(portp, 1, 0);
  911. clear_bit(TTY_IO_ERROR, &tty->flags);
  912. portp->flags |= ASYNC_INITIALIZED;
  913. }
  914. /*
  915.  * Check if this port is in the middle of closing. If so then wait
  916.  * until it is closed then return error status, based on flag settings.
  917.  * The sleep here does not need interrupt protection since the wakeup
  918.  * for it is done with the same context.
  919.  */
  920. if (portp->flags & ASYNC_CLOSING) {
  921. interruptible_sleep_on(&portp->close_wait);
  922. if (portp->flags & ASYNC_HUP_NOTIFY)
  923. return(-EAGAIN);
  924. return(-ERESTARTSYS);
  925. }
  926. /*
  927.  * Based on type of open being done check if it can overlap with any
  928.  * previous opens still in effect. If we are a normal serial device
  929.  * then also we might have to wait for carrier.
  930.  */
  931. if (tty->driver.subtype == STL_DRVTYPCALLOUT) {
  932. if (portp->flags & ASYNC_NORMAL_ACTIVE)
  933. return(-EBUSY);
  934. if (portp->flags & ASYNC_CALLOUT_ACTIVE) {
  935. if ((portp->flags & ASYNC_SESSION_LOCKOUT) &&
  936.     (portp->session != current->session))
  937. return(-EBUSY);
  938. if ((portp->flags & ASYNC_PGRP_LOCKOUT) &&
  939.     (portp->pgrp != current->pgrp))
  940. return(-EBUSY);
  941. }
  942. portp->flags |= ASYNC_CALLOUT_ACTIVE;
  943. } else {
  944. if (filp->f_flags & O_NONBLOCK) {
  945. if (portp->flags & ASYNC_CALLOUT_ACTIVE)
  946. return(-EBUSY);
  947. } else {
  948. if ((rc = stl_waitcarrier(portp, filp)) != 0)
  949. return(rc);
  950. }
  951. portp->flags |= ASYNC_NORMAL_ACTIVE;
  952. }
  953. if ((portp->refcount == 1) && (portp->flags & ASYNC_SPLIT_TERMIOS)) {
  954. if (tty->driver.subtype == STL_DRVTYPSERIAL)
  955. *tty->termios = portp->normaltermios;
  956. else
  957. *tty->termios = portp->callouttermios;
  958. stl_setport(portp, tty->termios);
  959. }
  960. portp->session = current->session;
  961. portp->pgrp = current->pgrp;
  962. return(0);
  963. }
  964. /*****************************************************************************/
  965. /*
  966.  * Possibly need to wait for carrier (DCD signal) to come high. Say
  967.  * maybe because if we are clocal then we don't need to wait...
  968.  */
  969. static int stl_waitcarrier(stlport_t *portp, struct file *filp)
  970. {
  971. unsigned long flags;
  972. int rc, doclocal;
  973. #if DEBUG
  974. printk("stl_waitcarrier(portp=%x,filp=%x)n", (int) portp, (int) filp);
  975. #endif
  976. rc = 0;
  977. doclocal = 0;
  978. if (portp->flags & ASYNC_CALLOUT_ACTIVE) {
  979. if (portp->normaltermios.c_cflag & CLOCAL)
  980. doclocal++;
  981. } else {
  982. if (portp->tty->termios->c_cflag & CLOCAL)
  983. doclocal++;
  984. }
  985. save_flags(flags);
  986. cli();
  987. portp->openwaitcnt++;
  988. if (! tty_hung_up_p(filp))
  989. portp->refcount--;
  990. for (;;) {
  991. if ((portp->flags & ASYNC_CALLOUT_ACTIVE) == 0)
  992. stl_setsignals(portp, 1, 1);
  993. if (tty_hung_up_p(filp) ||
  994.     ((portp->flags & ASYNC_INITIALIZED) == 0)) {
  995. if (portp->flags & ASYNC_HUP_NOTIFY)
  996. rc = -EBUSY;
  997. else
  998. rc = -ERESTARTSYS;
  999. break;
  1000. }
  1001. if (((portp->flags & ASYNC_CALLOUT_ACTIVE) == 0) &&
  1002.     ((portp->flags & ASYNC_CLOSING) == 0) &&
  1003.     (doclocal || (portp->sigs & TIOCM_CD))) {
  1004. break;
  1005. }
  1006. if (signal_pending(current)) {
  1007. rc = -ERESTARTSYS;
  1008. break;
  1009. }
  1010. interruptible_sleep_on(&portp->open_wait);
  1011. }
  1012. if (! tty_hung_up_p(filp))
  1013. portp->refcount++;
  1014. portp->openwaitcnt--;
  1015. restore_flags(flags);
  1016. return(rc);
  1017. }
  1018. /*****************************************************************************/
  1019. static void stl_close(struct tty_struct *tty, struct file *filp)
  1020. {
  1021. stlport_t *portp;
  1022. unsigned long flags;
  1023. #if DEBUG
  1024. printk("stl_close(tty=%x,filp=%x)n", (int) tty, (int) filp);
  1025. #endif
  1026. portp = tty->driver_data;
  1027. if (portp == (stlport_t *) NULL)
  1028. return;
  1029. save_flags(flags);
  1030. cli();
  1031. if (tty_hung_up_p(filp)) {
  1032. MOD_DEC_USE_COUNT;
  1033. restore_flags(flags);
  1034. return;
  1035. }
  1036. if ((tty->count == 1) && (portp->refcount != 1))
  1037. portp->refcount = 1;
  1038. if (portp->refcount-- > 1) {
  1039. MOD_DEC_USE_COUNT;
  1040. restore_flags(flags);
  1041. return;
  1042. }
  1043. portp->refcount = 0;
  1044. portp->flags |= ASYNC_CLOSING;
  1045. if (portp->flags & ASYNC_NORMAL_ACTIVE)
  1046. portp->normaltermios = *tty->termios;
  1047. if (portp->flags & ASYNC_CALLOUT_ACTIVE)
  1048. portp->callouttermios = *tty->termios;
  1049. /*
  1050.  * May want to wait for any data to drain before closing. The BUSY
  1051.  * flag keeps track of whether we are still sending or not - it is
  1052.  * very accurate for the cd1400, not quite so for the sc26198.
  1053.  * (The sc26198 has no "end-of-data" interrupt only empty FIFO)
  1054.  */
  1055. tty->closing = 1;
  1056. if (portp->closing_wait != ASYNC_CLOSING_WAIT_NONE)
  1057. tty_wait_until_sent(tty, portp->closing_wait);
  1058. stl_waituntilsent(tty, (HZ / 2));
  1059. portp->flags &= ~ASYNC_INITIALIZED;
  1060. stl_disableintrs(portp);
  1061. if (tty->termios->c_cflag & HUPCL)
  1062. stl_setsignals(portp, 0, 0);
  1063. stl_enablerxtx(portp, 0, 0);
  1064. stl_flushbuffer(tty);
  1065. portp->istate = 0;
  1066. if (portp->tx.buf != (char *) NULL) {
  1067. kfree(portp->tx.buf);
  1068. portp->tx.buf = (char *) NULL;
  1069. portp->tx.head = (char *) NULL;
  1070. portp->tx.tail = (char *) NULL;
  1071. }
  1072. set_bit(TTY_IO_ERROR, &tty->flags);
  1073. if (tty->ldisc.flush_buffer)
  1074. (tty->ldisc.flush_buffer)(tty);
  1075. tty->closing = 0;
  1076. portp->tty = (struct tty_struct *) NULL;
  1077. if (portp->openwaitcnt) {
  1078. if (portp->close_delay)
  1079. stl_delay(portp->close_delay);
  1080. wake_up_interruptible(&portp->open_wait);
  1081. }
  1082. portp->flags &= ~(ASYNC_CALLOUT_ACTIVE | ASYNC_NORMAL_ACTIVE |
  1083. ASYNC_CLOSING);
  1084. wake_up_interruptible(&portp->close_wait);
  1085. MOD_DEC_USE_COUNT;
  1086. restore_flags(flags);
  1087. }
  1088. /*****************************************************************************/
  1089. /*
  1090.  * Wait for a specified delay period, this is not a busy-loop. It will
  1091.  * give up the processor while waiting. Unfortunately this has some
  1092.  * rather intimate knowledge of the process management stuff.
  1093.  */
  1094. static void stl_delay(int len)
  1095. {
  1096. #if DEBUG
  1097. printk("stl_delay(len=%d)n", len);
  1098. #endif
  1099. if (len > 0) {
  1100. current->state = TASK_INTERRUPTIBLE;
  1101. schedule_timeout(len);
  1102. current->state = TASK_RUNNING;
  1103. }
  1104. }
  1105. /*****************************************************************************/
  1106. /*
  1107.  * Write routine. Take data and stuff it in to the TX ring queue.
  1108.  * If transmit interrupts are not running then start them.
  1109.  */
  1110. static int stl_write(struct tty_struct *tty, int from_user, const unsigned char *buf, int count)
  1111. {
  1112. stlport_t *portp;
  1113. unsigned int len, stlen;
  1114. unsigned char *chbuf;
  1115. char *head, *tail;
  1116. #if DEBUG
  1117. printk("stl_write(tty=%x,from_user=%d,buf=%x,count=%d)n",
  1118. (int) tty, from_user, (int) buf, count);
  1119. #endif
  1120. if ((tty == (struct tty_struct *) NULL) ||
  1121.     (stl_tmpwritebuf == (char *) NULL))
  1122. return(0);
  1123. portp = tty->driver_data;
  1124. if (portp == (stlport_t *) NULL)
  1125. return(0);
  1126. if (portp->tx.buf == (char *) NULL)
  1127. return(0);
  1128. /*
  1129.  * If copying direct from user space we must cater for page faults,
  1130.  * causing us to "sleep" here for a while. To handle this copy in all
  1131.  * the data we need now, into a local buffer. Then when we got it all
  1132.  * copy it into the TX buffer.
  1133.  */
  1134. chbuf = (unsigned char *) buf;
  1135. if (from_user) {
  1136. head = portp->tx.head;
  1137. tail = portp->tx.tail;
  1138. len = (head >= tail) ? (STL_TXBUFSIZE - (head - tail) - 1) :
  1139. (tail - head - 1);
  1140. count = MIN(len, count);
  1141. down(&stl_tmpwritesem);
  1142. copy_from_user(stl_tmpwritebuf, chbuf, count);
  1143. chbuf = &stl_tmpwritebuf[0];
  1144. }
  1145. head = portp->tx.head;
  1146. tail = portp->tx.tail;
  1147. if (head >= tail) {
  1148. len = STL_TXBUFSIZE - (head - tail) - 1;
  1149. stlen = STL_TXBUFSIZE - (head - portp->tx.buf);
  1150. } else {
  1151. len = tail - head - 1;
  1152. stlen = len;
  1153. }
  1154. len = MIN(len, count);
  1155. count = 0;
  1156. while (len > 0) {
  1157. stlen = MIN(len, stlen);
  1158. memcpy(head, chbuf, stlen);
  1159. len -= stlen;
  1160. chbuf += stlen;
  1161. count += stlen;
  1162. head += stlen;
  1163. if (head >= (portp->tx.buf + STL_TXBUFSIZE)) {
  1164. head = portp->tx.buf;
  1165. stlen = tail - head;
  1166. }
  1167. }
  1168. portp->tx.head = head;
  1169. clear_bit(ASYI_TXLOW, &portp->istate);
  1170. stl_startrxtx(portp, -1, 1);
  1171. if (from_user)
  1172. up(&stl_tmpwritesem);
  1173. return(count);
  1174. }
  1175. /*****************************************************************************/
  1176. static void stl_putchar(struct tty_struct *tty, unsigned char ch)
  1177. {
  1178. stlport_t *portp;
  1179. unsigned int len;
  1180. char *head, *tail;
  1181. #if DEBUG
  1182. printk("stl_putchar(tty=%x,ch=%x)n", (int) tty, (int) ch);
  1183. #endif
  1184. if (tty == (struct tty_struct *) NULL)
  1185. return;
  1186. portp = tty->driver_data;
  1187. if (portp == (stlport_t *) NULL)
  1188. return;
  1189. if (portp->tx.buf == (char *) NULL)
  1190. return;
  1191. head = portp->tx.head;
  1192. tail = portp->tx.tail;
  1193. len = (head >= tail) ? (STL_TXBUFSIZE - (head - tail)) : (tail - head);
  1194. len--;
  1195. if (len > 0) {
  1196. *head++ = ch;
  1197. if (head >= (portp->tx.buf + STL_TXBUFSIZE))
  1198. head = portp->tx.buf;
  1199. }
  1200. portp->tx.head = head;
  1201. }
  1202. /*****************************************************************************/
  1203. /*
  1204.  * If there are any characters in the buffer then make sure that TX
  1205.  * interrupts are on and get'em out. Normally used after the putchar
  1206.  * routine has been called.
  1207.  */
  1208. static void stl_flushchars(struct tty_struct *tty)
  1209. {
  1210. stlport_t *portp;
  1211. #if DEBUG
  1212. printk("stl_flushchars(tty=%x)n", (int) tty);
  1213. #endif
  1214. if (tty == (struct tty_struct *) NULL)
  1215. return;
  1216. portp = tty->driver_data;
  1217. if (portp == (stlport_t *) NULL)
  1218. return;
  1219. if (portp->tx.buf == (char *) NULL)
  1220. return;
  1221. #if 0
  1222. if (tty->stopped || tty->hw_stopped ||
  1223.     (portp->tx.head == portp->tx.tail))
  1224. return;
  1225. #endif
  1226. stl_startrxtx(portp, -1, 1);
  1227. }
  1228. /*****************************************************************************/
  1229. static int stl_writeroom(struct tty_struct *tty)
  1230. {
  1231. stlport_t *portp;
  1232. char *head, *tail;
  1233. #if DEBUG
  1234. printk("stl_writeroom(tty=%x)n", (int) tty);
  1235. #endif
  1236. if (tty == (struct tty_struct *) NULL)
  1237. return(0);
  1238. portp = tty->driver_data;
  1239. if (portp == (stlport_t *) NULL)
  1240. return(0);
  1241. if (portp->tx.buf == (char *) NULL)
  1242. return(0);
  1243. head = portp->tx.head;
  1244. tail = portp->tx.tail;
  1245. return((head >= tail) ? (STL_TXBUFSIZE - (head - tail) - 1) : (tail - head - 1));
  1246. }
  1247. /*****************************************************************************/
  1248. /*
  1249.  * Return number of chars in the TX buffer. Normally we would just
  1250.  * calculate the number of chars in the buffer and return that, but if
  1251.  * the buffer is empty and TX interrupts are still on then we return
  1252.  * that the buffer still has 1 char in it. This way whoever called us
  1253.  * will not think that ALL chars have drained - since the UART still
  1254.  * must have some chars in it (we are busy after all).
  1255.  */
  1256. static int stl_charsinbuffer(struct tty_struct *tty)
  1257. {
  1258. stlport_t *portp;
  1259. unsigned int size;
  1260. char *head, *tail;
  1261. #if DEBUG
  1262. printk("stl_charsinbuffer(tty=%x)n", (int) tty);
  1263. #endif
  1264. if (tty == (struct tty_struct *) NULL)
  1265. return(0);
  1266. portp = tty->driver_data;
  1267. if (portp == (stlport_t *) NULL)
  1268. return(0);
  1269. if (portp->tx.buf == (char *) NULL)
  1270. return(0);
  1271. head = portp->tx.head;
  1272. tail = portp->tx.tail;
  1273. size = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
  1274. if ((size == 0) && test_bit(ASYI_TXBUSY, &portp->istate))
  1275. size = 1;
  1276. return(size);
  1277. }
  1278. /*****************************************************************************/
  1279. /*
  1280.  * Generate the serial struct info.
  1281.  */
  1282. static void stl_getserial(stlport_t *portp, struct serial_struct *sp)
  1283. {
  1284. struct serial_struct sio;
  1285. stlbrd_t *brdp;
  1286. #if DEBUG
  1287. printk("stl_getserial(portp=%x,sp=%x)n", (int) portp, (int) sp);
  1288. #endif
  1289. memset(&sio, 0, sizeof(struct serial_struct));
  1290. sio.line = portp->portnr;
  1291. sio.port = portp->ioaddr;
  1292. sio.flags = portp->flags;
  1293. sio.baud_base = portp->baud_base;
  1294. sio.close_delay = portp->close_delay;
  1295. sio.closing_wait = portp->closing_wait;
  1296. sio.custom_divisor = portp->custom_divisor;
  1297. sio.hub6 = 0;
  1298. if (portp->uartp == &stl_cd1400uart) {
  1299. sio.type = PORT_CIRRUS;
  1300. sio.xmit_fifo_size = CD1400_TXFIFOSIZE;
  1301. } else {
  1302. sio.type = PORT_UNKNOWN;
  1303. sio.xmit_fifo_size = SC26198_TXFIFOSIZE;
  1304. }
  1305. brdp = stl_brds[portp->brdnr];
  1306. if (brdp != (stlbrd_t *) NULL)
  1307. sio.irq = brdp->irq;
  1308. copy_to_user(sp, &sio, sizeof(struct serial_struct));
  1309. }
  1310. /*****************************************************************************/
  1311. /*
  1312.  * Set port according to the serial struct info.
  1313.  * At this point we do not do any auto-configure stuff, so we will
  1314.  * just quietly ignore any requests to change irq, etc.
  1315.  */
  1316. static int stl_setserial(stlport_t *portp, struct serial_struct *sp)
  1317. {
  1318. struct serial_struct sio;
  1319. #if DEBUG
  1320. printk("stl_setserial(portp=%x,sp=%x)n", (int) portp, (int) sp);
  1321. #endif
  1322. if (copy_from_user(&sio, sp, sizeof(struct serial_struct)))
  1323. return -EFAULT;
  1324. if (!capable(CAP_SYS_ADMIN)) {
  1325. if ((sio.baud_base != portp->baud_base) ||
  1326.     (sio.close_delay != portp->close_delay) ||
  1327.     ((sio.flags & ~ASYNC_USR_MASK) !=
  1328.     (portp->flags & ~ASYNC_USR_MASK)))
  1329. return(-EPERM);
  1330. portp->flags = (portp->flags & ~ASYNC_USR_MASK) |
  1331. (sio.flags & ASYNC_USR_MASK);
  1332. portp->baud_base = sio.baud_base;
  1333. portp->close_delay = sio.close_delay;
  1334. portp->closing_wait = sio.closing_wait;
  1335. portp->custom_divisor = sio.custom_divisor;
  1336. stl_setport(portp, portp->tty->termios);
  1337. return(0);
  1338. }
  1339. /*****************************************************************************/
  1340. static int stl_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
  1341. {
  1342. stlport_t *portp;
  1343. unsigned int ival;
  1344. int rc;
  1345. #if DEBUG
  1346. printk("stl_ioctl(tty=%x,file=%x,cmd=%x,arg=%x)n",
  1347. (int) tty, (int) file, cmd, (int) arg);
  1348. #endif
  1349. if (tty == (struct tty_struct *) NULL)
  1350. return(-ENODEV);
  1351. portp = tty->driver_data;
  1352. if (portp == (stlport_t *) NULL)
  1353. return(-ENODEV);
  1354. if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
  1355.       (cmd != COM_GETPORTSTATS) && (cmd != COM_CLRPORTSTATS)) {
  1356. if (tty->flags & (1 << TTY_IO_ERROR))
  1357. return(-EIO);
  1358. }
  1359. rc = 0;
  1360. switch (cmd) {
  1361. case TIOCGSOFTCAR:
  1362. rc = put_user(((tty->termios->c_cflag & CLOCAL) ? 1 : 0),
  1363. (unsigned int *) arg);
  1364. break;
  1365. case TIOCSSOFTCAR:
  1366. if ((rc = verify_area(VERIFY_READ, (void *) arg,
  1367.     sizeof(int))) == 0) {
  1368. get_user(ival, (unsigned int *) arg);
  1369. tty->termios->c_cflag =
  1370. (tty->termios->c_cflag & ~CLOCAL) |
  1371. (ival ? CLOCAL : 0);
  1372. }
  1373. break;
  1374. case TIOCMGET:
  1375. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  1376.     sizeof(unsigned int))) == 0) {
  1377. ival = stl_getsignals(portp);
  1378. put_user(ival, (unsigned int *) arg);
  1379. }
  1380. break;
  1381. case TIOCMBIS:
  1382. if ((rc = verify_area(VERIFY_READ, (void *) arg,
  1383.     sizeof(unsigned int))) == 0) {
  1384. get_user(ival, (unsigned int *) arg);
  1385. stl_setsignals(portp, ((ival & TIOCM_DTR) ? 1 : -1),
  1386. ((ival & TIOCM_RTS) ? 1 : -1));
  1387. }
  1388. break;
  1389. case TIOCMBIC:
  1390. if ((rc = verify_area(VERIFY_READ, (void *) arg,
  1391.     sizeof(unsigned int))) == 0) {
  1392. get_user(ival, (unsigned int *) arg);
  1393. stl_setsignals(portp, ((ival & TIOCM_DTR) ? 0 : -1),
  1394. ((ival & TIOCM_RTS) ? 0 : -1));
  1395. }
  1396. break;
  1397. case TIOCMSET:
  1398. if ((rc = verify_area(VERIFY_READ, (void *) arg,
  1399.     sizeof(unsigned int))) == 0) {
  1400. get_user(ival, (unsigned int *) arg);
  1401. stl_setsignals(portp, ((ival & TIOCM_DTR) ? 1 : 0),
  1402. ((ival & TIOCM_RTS) ? 1 : 0));
  1403. }
  1404. break;
  1405. case TIOCGSERIAL:
  1406. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  1407.     sizeof(struct serial_struct))) == 0)
  1408. stl_getserial(portp, (struct serial_struct *) arg);
  1409. break;
  1410. case TIOCSSERIAL:
  1411. if ((rc = verify_area(VERIFY_READ, (void *) arg,
  1412.     sizeof(struct serial_struct))) == 0)
  1413. rc = stl_setserial(portp, (struct serial_struct *) arg);
  1414. break;
  1415. case COM_GETPORTSTATS:
  1416. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  1417.     sizeof(comstats_t))) == 0)
  1418. rc = stl_getportstats(portp, (comstats_t *) arg);
  1419. break;
  1420. case COM_CLRPORTSTATS:
  1421. if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
  1422.     sizeof(comstats_t))) == 0)
  1423. rc = stl_clrportstats(portp, (comstats_t *) arg);
  1424. break;
  1425. case TIOCSERCONFIG:
  1426. case TIOCSERGWILD:
  1427. case TIOCSERSWILD:
  1428. case TIOCSERGETLSR:
  1429. case TIOCSERGSTRUCT:
  1430. case TIOCSERGETMULTI:
  1431. case TIOCSERSETMULTI:
  1432. default:
  1433. rc = -ENOIOCTLCMD;
  1434. break;
  1435. }
  1436. return(rc);
  1437. }
  1438. /*****************************************************************************/
  1439. static void stl_settermios(struct tty_struct *tty, struct termios *old)
  1440. {
  1441. stlport_t *portp;
  1442. struct termios *tiosp;
  1443. #if DEBUG
  1444. printk("stl_settermios(tty=%x,old=%x)n", (int) tty, (int) old);
  1445. #endif
  1446. if (tty == (struct tty_struct *) NULL)
  1447. return;
  1448. portp = tty->driver_data;
  1449. if (portp == (stlport_t *) NULL)
  1450. return;
  1451. tiosp = tty->termios;
  1452. if ((tiosp->c_cflag == old->c_cflag) &&
  1453.     (tiosp->c_iflag == old->c_iflag))
  1454. return;
  1455. stl_setport(portp, tiosp);
  1456. stl_setsignals(portp, ((tiosp->c_cflag & (CBAUD & ~CBAUDEX)) ? 1 : 0),
  1457. -1);
  1458. if ((old->c_cflag & CRTSCTS) && ((tiosp->c_cflag & CRTSCTS) == 0)) {
  1459. tty->hw_stopped = 0;
  1460. stl_start(tty);
  1461. }
  1462. if (((old->c_cflag & CLOCAL) == 0) && (tiosp->c_cflag & CLOCAL))
  1463. wake_up_interruptible(&portp->open_wait);
  1464. }
  1465. /*****************************************************************************/
  1466. /*
  1467.  * Attempt to flow control who ever is sending us data. Based on termios
  1468.  * settings use software or/and hardware flow control.
  1469.  */
  1470. static void stl_throttle(struct tty_struct *tty)
  1471. {
  1472. stlport_t *portp;
  1473. #if DEBUG
  1474. printk("stl_throttle(tty=%x)n", (int) tty);
  1475. #endif
  1476. if (tty == (struct tty_struct *) NULL)
  1477. return;
  1478. portp = tty->driver_data;
  1479. if (portp == (stlport_t *) NULL)
  1480. return;
  1481. stl_flowctrl(portp, 0);
  1482. }
  1483. /*****************************************************************************/
  1484. /*
  1485.  * Unflow control the device sending us data...
  1486.  */
  1487. static void stl_unthrottle(struct tty_struct *tty)
  1488. {
  1489. stlport_t *portp;
  1490. #if DEBUG
  1491. printk("stl_unthrottle(tty=%x)n", (int) tty);
  1492. #endif
  1493. if (tty == (struct tty_struct *) NULL)
  1494. return;
  1495. portp = tty->driver_data;
  1496. if (portp == (stlport_t *) NULL)
  1497. return;
  1498. stl_flowctrl(portp, 1);
  1499. }
  1500. /*****************************************************************************/
  1501. /*
  1502.  * Stop the transmitter. Basically to do this we will just turn TX
  1503.  * interrupts off.
  1504.  */
  1505. static void stl_stop(struct tty_struct *tty)
  1506. {
  1507. stlport_t *portp;
  1508. #if DEBUG
  1509. printk("stl_stop(tty=%x)n", (int) tty);
  1510. #endif
  1511. if (tty == (struct tty_struct *) NULL)
  1512. return;
  1513. portp = tty->driver_data;
  1514. if (portp == (stlport_t *) NULL)
  1515. return;
  1516. stl_startrxtx(portp, -1, 0);
  1517. }
  1518. /*****************************************************************************/
  1519. /*
  1520.  * Start the transmitter again. Just turn TX interrupts back on.
  1521.  */
  1522. static void stl_start(struct tty_struct *tty)
  1523. {
  1524. stlport_t *portp;
  1525. #if DEBUG
  1526. printk("stl_start(tty=%x)n", (int) tty);
  1527. #endif
  1528. if (tty == (struct tty_struct *) NULL)
  1529. return;
  1530. portp = tty->driver_data;
  1531. if (portp == (stlport_t *) NULL)
  1532. return;
  1533. stl_startrxtx(portp, -1, 1);
  1534. }
  1535. /*****************************************************************************/
  1536. /*
  1537.  * Hangup this port. This is pretty much like closing the port, only
  1538.  * a little more brutal. No waiting for data to drain. Shutdown the
  1539.  * port and maybe drop signals.
  1540.  */
  1541. static void stl_hangup(struct tty_struct *tty)
  1542. {
  1543. stlport_t *portp;
  1544. #if DEBUG
  1545. printk("stl_hangup(tty=%x)n", (int) tty);
  1546. #endif
  1547. if (tty == (struct tty_struct *) NULL)
  1548. return;
  1549. portp = tty->driver_data;
  1550. if (portp == (stlport_t *) NULL)
  1551. return;
  1552. portp->flags &= ~ASYNC_INITIALIZED;
  1553. stl_disableintrs(portp);
  1554. if (tty->termios->c_cflag & HUPCL)
  1555. stl_setsignals(portp, 0, 0);
  1556. stl_enablerxtx(portp, 0, 0);
  1557. stl_flushbuffer(tty);
  1558. portp->istate = 0;
  1559. set_bit(TTY_IO_ERROR, &tty->flags);
  1560. if (portp->tx.buf != (char *) NULL) {
  1561. kfree(portp->tx.buf);
  1562. portp->tx.buf = (char *) NULL;
  1563. portp->tx.head = (char *) NULL;
  1564. portp->tx.tail = (char *) NULL;
  1565. }
  1566. portp->tty = (struct tty_struct *) NULL;
  1567. portp->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CALLOUT_ACTIVE);
  1568. portp->refcount = 0;
  1569. wake_up_interruptible(&portp->open_wait);
  1570. }
  1571. /*****************************************************************************/
  1572. static void stl_flushbuffer(struct tty_struct *tty)
  1573. {
  1574. stlport_t *portp;
  1575. #if DEBUG
  1576. printk("stl_flushbuffer(tty=%x)n", (int) tty);
  1577. #endif
  1578. if (tty == (struct tty_struct *) NULL)
  1579. return;
  1580. portp = tty->driver_data;
  1581. if (portp == (stlport_t *) NULL)
  1582. return;
  1583. stl_flush(portp);
  1584. wake_up_interruptible(&tty->write_wait);
  1585. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  1586.     tty->ldisc.write_wakeup)
  1587. (tty->ldisc.write_wakeup)(tty);
  1588. }
  1589. /*****************************************************************************/
  1590. static void stl_breakctl(struct tty_struct *tty, int state)
  1591. {
  1592. stlport_t *portp;
  1593. #if DEBUG
  1594. printk("stl_breakctl(tty=%x,state=%d)n", (int) tty, state);
  1595. #endif
  1596. if (tty == (struct tty_struct *) NULL)
  1597. return;
  1598. portp = tty->driver_data;
  1599. if (portp == (stlport_t *) NULL)
  1600. return;
  1601. stl_sendbreak(portp, ((state == -1) ? 1 : 2));
  1602. }
  1603. /*****************************************************************************/
  1604. static void stl_waituntilsent(struct tty_struct *tty, int timeout)
  1605. {
  1606. stlport_t *portp;
  1607. unsigned long tend;
  1608. #if DEBUG
  1609. printk("stl_waituntilsent(tty=%x,timeout=%d)n", (int) tty, timeout);
  1610. #endif
  1611. if (tty == (struct tty_struct *) NULL)
  1612. return;
  1613. portp = tty->driver_data;
  1614. if (portp == (stlport_t *) NULL)
  1615. return;
  1616. if (timeout == 0)
  1617. timeout = HZ;
  1618. tend = jiffies + timeout;
  1619. while (stl_datastate(portp)) {
  1620. if (signal_pending(current))
  1621. break;
  1622. stl_delay(2);
  1623. if (time_after_eq(jiffies, tend))
  1624. break;
  1625. }
  1626. }
  1627. /*****************************************************************************/
  1628. static void stl_sendxchar(struct tty_struct *tty, char ch)
  1629. {
  1630. stlport_t *portp;
  1631. #if DEBUG
  1632. printk("stl_sendxchar(tty=%x,ch=%x)n", (int) tty, ch);
  1633. #endif
  1634. if (tty == (struct tty_struct *) NULL)
  1635. return;
  1636. portp = tty->driver_data;
  1637. if (portp == (stlport_t *) NULL)
  1638. return;
  1639. if (ch == STOP_CHAR(tty))
  1640. stl_sendflow(portp, 0);
  1641. else if (ch == START_CHAR(tty))
  1642. stl_sendflow(portp, 1);
  1643. else
  1644. stl_putchar(tty, ch);
  1645. }
  1646. /*****************************************************************************/
  1647. #define MAXLINE 80
  1648. /*
  1649.  * Format info for a specified port. The line is deliberately limited
  1650.  * to 80 characters. (If it is too long it will be truncated, if too
  1651.  * short then padded with spaces).
  1652.  */
  1653. static int stl_portinfo(stlport_t *portp, int portnr, char *pos)
  1654. {
  1655. char *sp;
  1656. int sigs, cnt;
  1657. sp = pos;
  1658. sp += sprintf(sp, "%d: uart:%s tx:%d rx:%d",
  1659. portnr, (portp->hwid == 1) ? "SC26198" : "CD1400",
  1660. (int) portp->stats.txtotal, (int) portp->stats.rxtotal);
  1661. if (portp->stats.rxframing)
  1662. sp += sprintf(sp, " fe:%d", (int) portp->stats.rxframing);
  1663. if (portp->stats.rxparity)
  1664. sp += sprintf(sp, " pe:%d", (int) portp->stats.rxparity);
  1665. if (portp->stats.rxbreaks)
  1666. sp += sprintf(sp, " brk:%d", (int) portp->stats.rxbreaks);
  1667. if (portp->stats.rxoverrun)
  1668. sp += sprintf(sp, " oe:%d", (int) portp->stats.rxoverrun);
  1669. sigs = stl_getsignals(portp);
  1670. cnt = sprintf(sp, "%s%s%s%s%s ",
  1671. (sigs & TIOCM_RTS) ? "|RTS" : "",
  1672. (sigs & TIOCM_CTS) ? "|CTS" : "",
  1673. (sigs & TIOCM_DTR) ? "|DTR" : "",
  1674. (sigs & TIOCM_CD) ? "|DCD" : "",
  1675. (sigs & TIOCM_DSR) ? "|DSR" : "");
  1676. *sp = ' ';
  1677. sp += cnt;
  1678. for (cnt = (sp - pos); (cnt < (MAXLINE - 1)); cnt++)
  1679. *sp++ = ' ';
  1680. if (cnt >= MAXLINE)
  1681. pos[(MAXLINE - 2)] = '+';
  1682. pos[(MAXLINE - 1)] = 'n';
  1683. return(MAXLINE);
  1684. }
  1685. /*****************************************************************************/
  1686. /*
  1687.  * Port info, read from the /proc file system.
  1688.  */
  1689. static int stl_readproc(char *page, char **start, off_t off, int count, int *eof, void *data)
  1690. {
  1691. stlbrd_t *brdp;
  1692. stlpanel_t *panelp;
  1693. stlport_t *portp;
  1694. int brdnr, panelnr, portnr, totalport;
  1695. int curoff, maxoff;
  1696. char *pos;
  1697. #if DEBUG
  1698. printk("stl_readproc(page=%x,start=%x,off=%x,count=%d,eof=%x,"
  1699. "data=%xn", (int) page, (int) start, (int) off, count,
  1700. (int) eof, (int) data);
  1701. #endif
  1702. pos = page;
  1703. totalport = 0;
  1704. curoff = 0;
  1705. if (off == 0) {
  1706. pos += sprintf(pos, "%s: version %s", stl_drvtitle,
  1707. stl_drvversion);
  1708. while (pos < (page + MAXLINE - 1))
  1709. *pos++ = ' ';
  1710. *pos++ = 'n';
  1711. }
  1712. curoff =  MAXLINE;
  1713. /*
  1714.  * We scan through for each board, panel and port. The offset is
  1715.  * calculated on the fly, and irrelevant ports are skipped.
  1716.  */
  1717. for (brdnr = 0; (brdnr < stl_nrbrds); brdnr++) {
  1718. brdp = stl_brds[brdnr];
  1719. if (brdp == (stlbrd_t *) NULL)
  1720. continue;
  1721. if (brdp->state == 0)
  1722. continue;
  1723. maxoff = curoff + (brdp->nrports * MAXLINE);
  1724. if (off >= maxoff) {
  1725. curoff = maxoff;
  1726. continue;
  1727. }
  1728. totalport = brdnr * STL_MAXPORTS;
  1729. for (panelnr = 0; (panelnr < brdp->nrpanels); panelnr++) {
  1730. panelp = brdp->panels[panelnr];
  1731. if (panelp == (stlpanel_t *) NULL)
  1732. continue;
  1733. maxoff = curoff + (panelp->nrports * MAXLINE);
  1734. if (off >= maxoff) {
  1735. curoff = maxoff;
  1736. totalport += panelp->nrports;
  1737. continue;
  1738. }
  1739. for (portnr = 0; (portnr < panelp->nrports); portnr++,
  1740.     totalport++) {
  1741. portp = panelp->ports[portnr];
  1742. if (portp == (stlport_t *) NULL)
  1743. continue;
  1744. if (off >= (curoff += MAXLINE))
  1745. continue;
  1746. if ((pos - page + MAXLINE) > count)
  1747. goto stl_readdone;
  1748. pos += stl_portinfo(portp, totalport, pos);
  1749. }
  1750. }
  1751. }
  1752. *eof = 1;
  1753. stl_readdone:
  1754. *start = page;
  1755. return(pos - page);
  1756. }
  1757. /*****************************************************************************/
  1758. /*
  1759.  * All board interrupts are vectored through here first. This code then
  1760.  * calls off to the approrpriate board interrupt handlers.
  1761.  */
  1762. static void stl_intr(int irq, void *dev_id, struct pt_regs *regs)
  1763. {
  1764. stlbrd_t *brdp;
  1765. #if DEBUG
  1766. printk("stl_intr(irq=%d,regs=%x)n", irq, (int) regs);
  1767. #endif
  1768. brdp = (stlbrd_t *) dev_id;
  1769. (* brdp->isr)(brdp);
  1770. }
  1771. /*****************************************************************************/
  1772. /*
  1773.  * Interrupt service routine for EasyIO board types.
  1774.  */
  1775. static void stl_eiointr(stlbrd_t *brdp)
  1776. {
  1777. stlpanel_t *panelp;
  1778. unsigned int iobase;
  1779. panelp = brdp->panels[0];
  1780. iobase = panelp->iobase;
  1781. while (inb(brdp->iostatus) & EIO_INTRPEND)
  1782. (* panelp->isr)(panelp, iobase);
  1783. }
  1784. /*****************************************************************************/
  1785. /*
  1786.  * Interrupt service routine for ECH-AT board types.
  1787.  */
  1788. static void stl_echatintr(stlbrd_t *brdp)
  1789. {
  1790. stlpanel_t *panelp;
  1791. unsigned int ioaddr;
  1792. int bnknr;
  1793. outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
  1794. while (inb(brdp->iostatus) & ECH_INTRPEND) {
  1795. for (bnknr = 0; (bnknr < brdp->nrbnks); bnknr++) {
  1796. ioaddr = brdp->bnkstataddr[bnknr];
  1797. if (inb(ioaddr) & ECH_PNLINTRPEND) {
  1798. panelp = brdp->bnk2panel[bnknr];
  1799. (* panelp->isr)(panelp, (ioaddr & 0xfffc));
  1800. }
  1801. }
  1802. }
  1803. outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
  1804. }
  1805. /*****************************************************************************/
  1806. /*
  1807.  * Interrupt service routine for ECH-MCA board types.
  1808.  */
  1809. static void stl_echmcaintr(stlbrd_t *brdp)
  1810. {
  1811. stlpanel_t *panelp;
  1812. unsigned int ioaddr;
  1813. int bnknr;
  1814. while (inb(brdp->iostatus) & ECH_INTRPEND) {
  1815. for (bnknr = 0; (bnknr < brdp->nrbnks); bnknr++) {
  1816. ioaddr = brdp->bnkstataddr[bnknr];
  1817. if (inb(ioaddr) & ECH_PNLINTRPEND) {
  1818. panelp = brdp->bnk2panel[bnknr];
  1819. (* panelp->isr)(panelp, (ioaddr & 0xfffc));
  1820. }
  1821. }
  1822. }
  1823. }
  1824. /*****************************************************************************/
  1825. /*
  1826.  * Interrupt service routine for ECH-PCI board types.
  1827.  */
  1828. static void stl_echpciintr(stlbrd_t *brdp)
  1829. {
  1830. stlpanel_t *panelp;
  1831. unsigned int ioaddr;
  1832. int bnknr, recheck;
  1833. while (1) {
  1834. recheck = 0;
  1835. for (bnknr = 0; (bnknr < brdp->nrbnks); bnknr++) {
  1836. outb(brdp->bnkpageaddr[bnknr], brdp->ioctrl);
  1837. ioaddr = brdp->bnkstataddr[bnknr];
  1838. if (inb(ioaddr) & ECH_PNLINTRPEND) {
  1839. panelp = brdp->bnk2panel[bnknr];
  1840. (* panelp->isr)(panelp, (ioaddr & 0xfffc));
  1841. recheck++;
  1842. }
  1843. }
  1844. if (! recheck)
  1845. break;
  1846. }
  1847. }
  1848. /*****************************************************************************/
  1849. /*
  1850.  * Interrupt service routine for ECH-8/64-PCI board types.
  1851.  */
  1852. static void stl_echpci64intr(stlbrd_t *brdp)
  1853. {
  1854. stlpanel_t *panelp;
  1855. unsigned int ioaddr;
  1856. int bnknr;
  1857. while (inb(brdp->ioctrl) & 0x1) {
  1858. for (bnknr = 0; (bnknr < brdp->nrbnks); bnknr++) {
  1859. ioaddr = brdp->bnkstataddr[bnknr];
  1860. if (inb(ioaddr) & ECH_PNLINTRPEND) {
  1861. panelp = brdp->bnk2panel[bnknr];
  1862. (* panelp->isr)(panelp, (ioaddr & 0xfffc));
  1863. }
  1864. }
  1865. }
  1866. }
  1867. /*****************************************************************************/
  1868. /*
  1869.  * Service an off-level request for some channel.
  1870.  */
  1871. static void stl_offintr(void *private)
  1872. {
  1873. stlport_t *portp;
  1874. struct tty_struct *tty;
  1875. unsigned int oldsigs;
  1876. portp = private;
  1877. #if DEBUG
  1878. printk("stl_offintr(portp=%x)n", (int) portp);
  1879. #endif
  1880. if (portp == (stlport_t *) NULL)
  1881. goto out;
  1882. tty = portp->tty;
  1883. if (tty == (struct tty_struct *) NULL)
  1884. goto out;
  1885. lock_kernel();
  1886. if (test_bit(ASYI_TXLOW, &portp->istate)) {
  1887. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  1888.     tty->ldisc.write_wakeup)
  1889. (tty->ldisc.write_wakeup)(tty);
  1890. wake_up_interruptible(&tty->write_wait);
  1891. }
  1892. if (test_bit(ASYI_DCDCHANGE, &portp->istate)) {
  1893. clear_bit(ASYI_DCDCHANGE, &portp->istate);
  1894. oldsigs = portp->sigs;
  1895. portp->sigs = stl_getsignals(portp);
  1896. if ((portp->sigs & TIOCM_CD) && ((oldsigs & TIOCM_CD) == 0))
  1897. wake_up_interruptible(&portp->open_wait);
  1898. if ((oldsigs & TIOCM_CD) && ((portp->sigs & TIOCM_CD) == 0)) {
  1899. if (portp->flags & ASYNC_CHECK_CD) {
  1900. if (! ((portp->flags & ASYNC_CALLOUT_ACTIVE) &&
  1901.     (portp->flags & ASYNC_CALLOUT_NOHUP))) {
  1902. tty_hangup(tty); /* FIXME: module removal race here - AKPM */
  1903. }
  1904. }
  1905. }
  1906. }
  1907. unlock_kernel();
  1908. out:
  1909. MOD_DEC_USE_COUNT;
  1910. }
  1911. /*****************************************************************************/
  1912. /*
  1913.  * Initialize all the ports on a panel.
  1914.  */
  1915. static int __init stl_initports(stlbrd_t *brdp, stlpanel_t *panelp)
  1916. {
  1917. stlport_t *portp;
  1918. int chipmask, i;
  1919. #if DEBUG
  1920. printk("stl_initports(brdp=%x,panelp=%x)n", (int) brdp, (int) panelp);
  1921. #endif
  1922. chipmask = stl_panelinit(brdp, panelp);
  1923. /*
  1924.  * All UART's are initialized (if found!). Now go through and setup
  1925.  * each ports data structures.
  1926.  */
  1927. for (i = 0; (i < panelp->nrports); i++) {
  1928. portp = (stlport_t *) stl_memalloc(sizeof(stlport_t));
  1929. if (portp == (stlport_t *) NULL) {
  1930. printk("STALLION: failed to allocate memory "
  1931. "(size=%d)n", sizeof(stlport_t));
  1932. break;
  1933. }
  1934. memset(portp, 0, sizeof(stlport_t));
  1935. portp->magic = STL_PORTMAGIC;
  1936. portp->portnr = i;
  1937. portp->brdnr = panelp->brdnr;
  1938. portp->panelnr = panelp->panelnr;
  1939. portp->uartp = panelp->uartp;
  1940. portp->clk = brdp->clk;
  1941. portp->baud_base = STL_BAUDBASE;
  1942. portp->close_delay = STL_CLOSEDELAY;
  1943. portp->closing_wait = 30 * HZ;
  1944. portp->normaltermios = stl_deftermios;
  1945. portp->callouttermios = stl_deftermios;
  1946. portp->tqueue.routine = stl_offintr;
  1947. portp->tqueue.data = portp;
  1948. init_waitqueue_head(&portp->open_wait);
  1949. init_waitqueue_head(&portp->close_wait);
  1950. portp->stats.brd = portp->brdnr;
  1951. portp->stats.panel = portp->panelnr;
  1952. portp->stats.port = portp->portnr;
  1953. panelp->ports[i] = portp;
  1954. stl_portinit(brdp, panelp, portp);
  1955. }
  1956. return(0);
  1957. }
  1958. /*****************************************************************************/
  1959. /*
  1960.  * Try to find and initialize an EasyIO board.
  1961.  */
  1962. static inline int stl_initeio(stlbrd_t *brdp)
  1963. {
  1964. stlpanel_t *panelp;
  1965. unsigned int status;
  1966. char *name;
  1967. #if DEBUG
  1968. printk("stl_initeio(brdp=%x)n", (int) brdp);
  1969. #endif
  1970. brdp->ioctrl = brdp->ioaddr1 + 1;
  1971. brdp->iostatus = brdp->ioaddr1 + 2;
  1972. status = inb(brdp->iostatus);
  1973. if ((status & EIO_IDBITMASK) == EIO_MK3)
  1974. brdp->ioctrl++;
  1975. /*
  1976.  * Handle board specific stuff now. The real difference is PCI
  1977.  * or not PCI.
  1978.  */
  1979. if (brdp->brdtype == BRD_EASYIOPCI) {
  1980. brdp->iosize1 = 0x80;
  1981. brdp->iosize2 = 0x80;
  1982. name = "serial(EIO-PCI)";
  1983. outb(0x41, (brdp->ioaddr2 + 0x4c));
  1984. } else {
  1985. brdp->iosize1 = 8;
  1986. name = "serial(EIO)";
  1987. if ((brdp->irq < 0) || (brdp->irq > 15) ||
  1988.     (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
  1989. printk("STALLION: invalid irq=%d for brd=%dn",
  1990. brdp->irq, brdp->brdnr);
  1991. return(-EINVAL);
  1992. }
  1993. outb((stl_vecmap[brdp->irq] | EIO_0WS |
  1994. ((brdp->irqtype) ? EIO_INTLEVEL : EIO_INTEDGE)),
  1995. brdp->ioctrl);
  1996. }
  1997. if (check_region(brdp->ioaddr1, brdp->iosize1)) {
  1998. printk("STALLION: Warning, board %d I/O address %x conflicts "
  1999. "with another devicen", brdp->brdnr, brdp->ioaddr1);
  2000. }
  2001. if (brdp->iosize2 > 0) {
  2002. if (check_region(brdp->ioaddr2, brdp->iosize2)) {
  2003. printk("STALLION: Warning, board %d I/O address %x "
  2004. "conflicts with another devicen",
  2005. brdp->brdnr, brdp->ioaddr2);
  2006. }
  2007. }
  2008.  
  2009. /*
  2010.  * Everything looks OK, so let's go ahead and probe for the hardware.
  2011.  */
  2012. brdp->clk = CD1400_CLK;
  2013. brdp->isr = stl_eiointr;
  2014. switch (status & EIO_IDBITMASK) {
  2015. case EIO_8PORTM:
  2016. brdp->clk = CD1400_CLK8M;
  2017. /* fall thru */
  2018. case EIO_8PORTRS:
  2019. case EIO_8PORTDI:
  2020. brdp->nrports = 8;
  2021. break;
  2022. case EIO_4PORTRS:
  2023. brdp->nrports = 4;
  2024. break;
  2025. case EIO_MK3:
  2026. switch (status & EIO_BRDMASK) {
  2027. case ID_BRD4:
  2028. brdp->nrports = 4;
  2029. break;
  2030. case ID_BRD8:
  2031. brdp->nrports = 8;
  2032. break;
  2033. case ID_BRD16:
  2034. brdp->nrports = 16;
  2035. break;
  2036. default:
  2037. return(-ENODEV);
  2038. }
  2039. break;
  2040. default:
  2041. return(-ENODEV);
  2042. }
  2043. /*
  2044.  * We have verfied that the board is actually present, so now we
  2045.  * can complete the setup.
  2046.  */
  2047. request_region(brdp->ioaddr1, brdp->iosize1, name);
  2048. if (brdp->iosize2 > 0)
  2049. request_region(brdp->ioaddr2, brdp->iosize2, name);
  2050. panelp = (stlpanel_t *) stl_memalloc(sizeof(stlpanel_t));
  2051. if (panelp == (stlpanel_t *) NULL) {
  2052. printk("STALLION: failed to allocate memory (size=%d)n",
  2053. sizeof(stlpanel_t));
  2054. return(-ENOMEM);
  2055. }
  2056. memset(panelp, 0, sizeof(stlpanel_t));
  2057. panelp->magic = STL_PANELMAGIC;
  2058. panelp->brdnr = brdp->brdnr;
  2059. panelp->panelnr = 0;
  2060. panelp->nrports = brdp->nrports;
  2061. panelp->iobase = brdp->ioaddr1;
  2062. panelp->hwid = status;
  2063. if ((status & EIO_IDBITMASK) == EIO_MK3) {
  2064. panelp->uartp = (void *) &stl_sc26198uart;
  2065. panelp->isr = stl_sc26198intr;
  2066. } else {
  2067. panelp->uartp = (void *) &stl_cd1400uart;
  2068. panelp->isr = stl_cd1400eiointr;
  2069. }
  2070. brdp->panels[0] = panelp;
  2071. brdp->nrpanels = 1;
  2072. brdp->state |= BRD_FOUND;
  2073. brdp->hwid = status;
  2074. if (request_irq(brdp->irq, stl_intr, SA_SHIRQ, name, brdp) != 0) {
  2075. printk("STALLION: failed to register interrupt "
  2076.        "routine for %s irq=%dn", name, brdp->irq);
  2077. return -ENODEV;
  2078. }
  2079. return 0;
  2080. }
  2081. /*****************************************************************************/
  2082. /*
  2083.  * Try to find an ECH board and initialize it. This code is capable of
  2084.  * dealing with all types of ECH board.
  2085.  */
  2086. static int inline stl_initech(stlbrd_t *brdp)
  2087. {
  2088. stlpanel_t *panelp;
  2089. unsigned int status, nxtid, ioaddr, conflict;
  2090. int panelnr, banknr, i;
  2091. char *name;
  2092. #if DEBUG
  2093. printk("stl_initech(brdp=%x)n", (int) brdp);
  2094. #endif
  2095. status = 0;
  2096. conflict = 0;
  2097. /*
  2098.  * Set up the initial board register contents for boards. This varies a
  2099.  * bit between the different board types. So we need to handle each
  2100.  * separately. Also do a check that the supplied IRQ is good.
  2101.  */
  2102. switch (brdp->brdtype) {
  2103. case BRD_ECH:
  2104. brdp->isr = stl_echatintr;
  2105. brdp->ioctrl = brdp->ioaddr1 + 1;
  2106. brdp->iostatus = brdp->ioaddr1 + 1;
  2107. status = inb(brdp->iostatus);
  2108. if ((status & ECH_IDBITMASK) != ECH_ID)
  2109. return(-ENODEV);
  2110. if ((brdp->irq < 0) || (brdp->irq > 15) ||
  2111.     (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
  2112. printk("STALLION: invalid irq=%d for brd=%dn",
  2113. brdp->irq, brdp->brdnr);
  2114. return(-EINVAL);
  2115. }
  2116. status = ((brdp->ioaddr2 & ECH_ADDR2MASK) >> 1);
  2117. status |= (stl_vecmap[brdp->irq] << 1);
  2118. outb((status | ECH_BRDRESET), brdp->ioaddr1);
  2119. brdp->ioctrlval = ECH_INTENABLE |
  2120. ((brdp->irqtype) ? ECH_INTLEVEL : ECH_INTEDGE);
  2121. for (i = 0; (i < 10); i++)
  2122. outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
  2123. brdp->iosize1 = 2;
  2124. brdp->iosize2 = 32;
  2125. name = "serial(EC8/32)";
  2126. outb(status, brdp->ioaddr1);
  2127. break;
  2128. case BRD_ECHMC:
  2129. brdp->isr = stl_echmcaintr;
  2130. brdp->ioctrl = brdp->ioaddr1 + 0x20;
  2131. brdp->iostatus = brdp->ioctrl;
  2132. status = inb(brdp->iostatus);
  2133. if ((status & ECH_IDBITMASK) != ECH_ID)
  2134. return(-ENODEV);
  2135. if ((brdp->irq < 0) || (brdp->irq > 15) ||
  2136.     (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
  2137. printk("STALLION: invalid irq=%d for brd=%dn",
  2138. brdp->irq, brdp->brdnr);
  2139. return(-EINVAL);
  2140. }
  2141. outb(ECHMC_BRDRESET, brdp->ioctrl);
  2142. outb(ECHMC_INTENABLE, brdp->ioctrl);
  2143. brdp->iosize1 = 64;
  2144. name = "serial(EC8/32-MC)";
  2145. break;
  2146. case BRD_ECHPCI:
  2147. brdp->isr = stl_echpciintr;
  2148. brdp->ioctrl = brdp->ioaddr1 + 2;
  2149. brdp->iosize1 = 4;
  2150. brdp->iosize2 = 8;
  2151. name = "serial(EC8/32-PCI)";
  2152. break;
  2153. case BRD_ECH64PCI:
  2154. brdp->isr = stl_echpci64intr;
  2155. brdp->ioctrl = brdp->ioaddr2 + 0x40;
  2156. outb(0x43, (brdp->ioaddr1 + 0x4c));
  2157. brdp->iosize1 = 0x80;
  2158. brdp->iosize2 = 0x80;
  2159. name = "serial(EC8/64-PCI)";
  2160. break;
  2161. default:
  2162. printk("STALLION: unknown board type=%dn", brdp->brdtype);
  2163. return(-EINVAL);
  2164. break;
  2165. }
  2166. /*
  2167.  * Check boards for possible IO address conflicts. We won't actually
  2168.  * do anything about it here, just issue a warning...
  2169.  */
  2170. conflict = check_region(brdp->ioaddr1, brdp->iosize1) ?
  2171. brdp->ioaddr1 : 0;
  2172. if ((conflict == 0) && (brdp->iosize2 > 0))
  2173. conflict = check_region(brdp->ioaddr2, brdp->iosize2) ?
  2174. brdp->ioaddr2 : 0;
  2175. if (conflict) {
  2176. printk("STALLION: Warning, board %d I/O address %x conflicts "
  2177. "with another devicen", brdp->brdnr, conflict);
  2178. }
  2179. request_region(brdp->ioaddr1, brdp->iosize1, name);
  2180. if (brdp->iosize2 > 0)
  2181. request_region(brdp->ioaddr2, brdp->iosize2, name);
  2182. /*
  2183.  * Scan through the secondary io address space looking for panels.
  2184.  * As we find'em allocate and initialize panel structures for each.
  2185.  */
  2186. brdp->clk = CD1400_CLK;
  2187. brdp->hwid = status;
  2188. ioaddr = brdp->ioaddr2;
  2189. banknr = 0;
  2190. panelnr = 0;
  2191. nxtid = 0;
  2192. for (i = 0; (i < STL_MAXPANELS); i++) {
  2193. if (brdp->brdtype == BRD_ECHPCI) {
  2194. outb(nxtid, brdp->ioctrl);
  2195. ioaddr = brdp->ioaddr2;
  2196. }
  2197. status = inb(ioaddr + ECH_PNLSTATUS);
  2198. if ((status & ECH_PNLIDMASK) != nxtid)
  2199. break;
  2200. panelp = (stlpanel_t *) stl_memalloc(sizeof(stlpanel_t));
  2201. if (panelp == (stlpanel_t *) NULL) {
  2202. printk("STALLION: failed to allocate memory "
  2203. "(size=%d)n", sizeof(stlpanel_t));
  2204. break;
  2205. }
  2206. memset(panelp, 0, sizeof(stlpanel_t));
  2207. panelp->magic = STL_PANELMAGIC;
  2208. panelp->brdnr = brdp->brdnr;
  2209. panelp->panelnr = panelnr;
  2210. panelp->iobase = ioaddr;
  2211. panelp->pagenr = nxtid;
  2212. panelp->hwid = status;
  2213. brdp->bnk2panel[banknr] = panelp;
  2214. brdp->bnkpageaddr[banknr] = nxtid;
  2215. brdp->bnkstataddr[banknr++] = ioaddr + ECH_PNLSTATUS;
  2216. if (status & ECH_PNLXPID) {
  2217. panelp->uartp = (void *) &stl_sc26198uart;
  2218. panelp->isr = stl_sc26198intr;
  2219. if (status & ECH_PNL16PORT) {
  2220. panelp->nrports = 16;
  2221. brdp->bnk2panel[banknr] = panelp;
  2222. brdp->bnkpageaddr[banknr] = nxtid;
  2223. brdp->bnkstataddr[banknr++] = ioaddr + 4 +
  2224. ECH_PNLSTATUS;
  2225. } else {
  2226. panelp->nrports = 8;
  2227. }
  2228. } else {
  2229. panelp->uartp = (void *) &stl_cd1400uart;
  2230. panelp->isr = stl_cd1400echintr;
  2231. if (status & ECH_PNL16PORT) {
  2232. panelp->nrports = 16;
  2233. panelp->ackmask = 0x80;
  2234. if (brdp->brdtype != BRD_ECHPCI)
  2235. ioaddr += EREG_BANKSIZE;
  2236. brdp->bnk2panel[banknr] = panelp;
  2237. brdp->bnkpageaddr[banknr] = ++nxtid;
  2238. brdp->bnkstataddr[banknr++] = ioaddr +
  2239. ECH_PNLSTATUS;
  2240. } else {
  2241. panelp->nrports = 8;
  2242. panelp->ackmask = 0xc0;
  2243. }
  2244. }
  2245. nxtid++;
  2246. ioaddr += EREG_BANKSIZE;
  2247. brdp->nrports += panelp->nrports;
  2248. brdp->panels[panelnr++] = panelp;
  2249. if ((brdp->brdtype != BRD_ECHPCI) &&
  2250.     (ioaddr >= (brdp->ioaddr2 + brdp->iosize2)))
  2251. break;
  2252. }
  2253. brdp->nrpanels = panelnr;
  2254. brdp->nrbnks = banknr;
  2255. if (brdp->brdtype == BRD_ECH)
  2256. outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
  2257. brdp->state |= BRD_FOUND;
  2258. if (request_irq(brdp->irq, stl_intr, SA_SHIRQ, name, brdp) != 0) {
  2259. printk("STALLION: failed to register interrupt "
  2260.        "routine for %s irq=%dn", name, brdp->irq);
  2261. i = -ENODEV;
  2262. }
  2263. return(i);
  2264. }
  2265. /*****************************************************************************/
  2266. /*
  2267.  * Initialize and configure the specified board.